diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90 index 695d39a4d512f4fa48d0137b495279e39f1f62de..cd57a04d474a3de665c0b01f4bd2f5d574e7a0ea 100644 --- a/src/MNH/ini_deep_convection.f90 +++ b/src/MNH/ini_deep_convection.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -109,33 +109,23 @@ END MODULE MODI_INI_DEEP_CONVECTION !! for a correct restart this variable has to be writen in FM file !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 14/02/2019: move UPCASE function to tools.f90 +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CH_AEROSOL, ONLY: CAERONAMES -USE MODD_CH_M9_n, ONLY: CNAMES -USE MODD_CONVPAR -USE MODD_DUST, ONLY: CDUSTNAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES use modd_field, only: tfieldmetadata, tfieldlist, TYPEREAL -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES USE MODD_IO, ONLY: TFILEDATA -USE MODD_LG, ONLY: CLGNAMES -USE MODD_NSV, ONLY: NSV, NSV_USER, NSV_CHEMBEG, NSV_CHEMEND, NSV_C2R2BEG, NSV_C2R2END, & - NSV_LGBEG, NSV_LGEND, NSV_LNOXBEG, NSV_LNOXEND, & - NSV_DSTBEG, NSV_DSTEND, NSV_AERBEG, NSV_AEREND, & - NSV_SLTBEG, NSV_SLTEND, NSV_PPBEG, NSV_PPEND, & - NSV_C1R3BEG, NSV_C1R3END, NSV_ELECBEG, NSV_ELECEND -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_SALT, ONLY: CSALTNAMES +USE MODD_NSV, ONLY: NSV, NSV_USER, TSVLIST, & + NSV_AERDEPBEG, NSV_CHICBEG, NSV_CSBEG, NSV_DSTDEPBEG, & + NSV_LIMA_BEG, NSV_PPBEG, NSV_SLTDEPBEG, NSV_SNWBEG, & + NSV_AERDEPEND, NSV_CHICEND, NSV_CSEND, NSV_DSTDEPEND, & + NSV_LIMA_END, NSV_PPEND, NSV_SLTDEPEND, NSV_SNWEND USE MODD_TIME ! use mode_field, only: Find_field_id_from_mnhname USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_TOOLS, ONLY: UPCASE ! IMPLICIT NONE ! @@ -183,6 +173,8 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PCG_TOTAL_NUMBER ! Total number of CG INTEGER :: IID INTEGER :: IRESP INTEGER :: JSV ! number of tracers +LOGICAL :: GOLDFILEFORMAT +LOGICAL :: GREAD TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- @@ -196,6 +188,11 @@ TYPE(TFIELDMETADATA) :: TZFIELD !* 2. INITIALIZE CONVECTIVE TENDENCIES ! -------------------------------- ! +!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available +GOLDFILEFORMAT = ( TPINIFILE%NMNHVERSION(1) < 5 & + .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) & + .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) + PUMFCONV(:,:,:) = 0.0 PDMFCONV(:,:,:) = 0.0 PMFCONV(:,:,:) = 0.0 ! warning, restart may be incorrect @@ -258,8 +255,8 @@ ELSE END IF ! ! - SELECT CASE(HGETSVCONV) - CASE('READ') + GETSVCONV: SELECT CASE(HGETSVCONV) + CASE('READ') GETSVCONV TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for ini_deep_convection', & !Temporary name to ease identification CUNITS = 's-1', & @@ -269,73 +266,39 @@ ELSE NDIMS = 3, & LTIMEDEP = .TRUE. ) ! - DO JSV = 1, NSV_USER - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) + DO JSV = 1, NSV + GREAD = .TRUE. + + IF ( GOLDFILEFORMAT ) THEN + IF ( ( JSV >= 1 .AND. JSV <= NSV_USER ) .OR. & + ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) ) THEN + WRITE( TZFIELD%CMNHNAME, '( A7, I3.3 )' ) 'DSVCONV', JSV + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + ELSE IF ( ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) .OR. & + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) .OR. & + ( JSV >= NSV_CHICBEG .AND. JSV <= NSV_CHICEND ) .OR. & + ( JSV >= NSV_AERDEPBEG .AND. JSV <= NSV_AERDEPEND ) .OR. & + ( JSV >= NSV_DSTDEPBEG .AND. JSV <= NSV_DSTDEPEND ) .OR. & + ( JSV >= NSV_SLTDEPBEG .AND. JSV <= NSV_SLTDEPEND ) .OR. & + ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND ) ) THEN + PDSVCONV(:,:,:,JSV) = 0.0 + GREAD = .FALSE. !This variable was not written in pre-5.5.1 files + ELSE + TZFIELD%CMNHNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME ) + TZFIELD%CLONGNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME ) + END IF + ELSE + TZFIELD%CMNHNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME ) + TZFIELD%CLONGNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME ) + END IF + WRITE( TZFIELD%CCOMMENT, '( A, I3.3 )' )'X_Y_Z_DSVCONV', JSV + IF ( GREAD ) CALL IO_Field_read( TPINIFILE, TZFIELD, PDSVCONV(:,:,:,JSV) ) END DO - DO JSV = NSV_C2R2BEG, NSV_C2R2END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_C1R3BEG, NSV_C1R3END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_ELECBEG, NSV_ELECEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_CHEMBEG, NSV_CHEMEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_AERBEG, NSV_AEREND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - TZFIELD%CMNHNAME = 'DSVCONV_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_DSTBEG, NSV_DSTEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_SLTBEG, NSV_SLTEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_LGBEG, NSV_LGEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_PPBEG, NSV_PPEND - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - END SELECT + + CASE('INIT') GETSVCONV + PDSVCONV(:,:,:,:) = 0.0 + + END SELECT GETSVCONV ! ! END IF diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90 index 2d30bdde091ce44a8390135ce48bd16a5f95722d..c45c5066668507555fa6263373ae1c2af7af38d3 100644 --- a/src/MNH/ini_lb.f90 +++ b/src/MNH/ini_lb.f90 @@ -131,35 +131,29 @@ SUBROUTINE INI_LB(TPINIFILE,OLSOURCE,KSV, & !! J.Escobar : 27/04/2016 : bug , test only on ANY(HGETSVM({{1:KSV}})=='READ' !! J.-P. Pinty 09/02/16 Add LIMA that is LBC for CCN and IFN !! M.Leriche 09/02/16 Treat gas and aq. chemicals separately -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 13/02/2019: initialize PLBXSVM and PLBYSVM in all cases -! P. Wautelet 14/02/2019: move UPCASE function to tools.f90 -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! S. Bielli 02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! -USE MODD_CH_AEROSOL -USE MODD_CH_M9_n, ONLY: CNAMES, CICNAMES -USE MODD_CTURB -USE MODD_CONF -USE MODD_DUST -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -use modd_field, only: tfieldmetadata, TYPELOG, TYPEREAL -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES +USE MODD_CTURB, ONLY: XTKEMIN +USE MODD_CONF, ONLY: LCPL_AROME +use modd_field, only: NMNHDIM_UNKNOWN, tfieldmetadata, TYPELOG, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_LG, ONLY: CLGNAMES -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NSV -USE MODD_PARAMETERS, ONLY: JPHEXT, NMNHNAMELGTMAX +USE MODD_NSV, ONLY: NSV, NSV_CS, NSV_CSBEG, NSV_CSEND, NSV_LIMA_BEG, NSV_LIMA_END, & +#ifdef MNH_FOREFIRE + NSV_FF, NSV_FFBEG, NSV_FFEND, & +#endif + NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE, NSV_PP, NSV_PPBEG, NSV_PPEND, & + NSV_SNWBEG, NSV_SNWEND, NSV_USER, TSVLIST +USE MODD_PARAMETERS, ONLY: JPHEXT, JPSVNAMELGTMAX, NLONGNAMELGTMAX, NMNHNAMELGTMAX USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IFN -USE MODD_PARAM_n -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_SALT ! USE MODE_IO_FIELD_READ, only: IO_Field_read, IO_Field_read_lb USE MODE_MSG -USE MODE_TOOLS, ONLY: UPCASE ! IMPLICIT NONE ! @@ -221,15 +215,16 @@ INTEGER :: JSV,JRR ! Loop index for MOIST AND ! additional scalar variables INTEGER :: IRR ! counter for moist variables INTEGER :: IRESP -INTEGER :: ILUOUT ! Logical unit number associated with TLUOUT LOGICAL :: GHORELAX_UVWTH ! switch for the horizontal relaxation for U,V,W,TH in the FM file LOGICAL :: GHORELAX_TKE ! switch for the horizontal relaxation for tke in the FM file LOGICAL :: GHORELAX_R, GHORELAX_SV ! switch for the horizontal relaxation ! for moist and scalar variables +LOGICAL :: GOLDFILEFORMAT CHARACTER (LEN= LEN(HGETRVM)), DIMENSION (7) :: YGETRXM ! Arrays with the get indicators ! for the moist variables CHARACTER (LEN=1), DIMENSION (7) :: YC ! array with the prefix of the moist variables -CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE +CHARACTER(LEN=NLONGNAMELGTMAX) :: YLONGNAME_BASE TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! @@ -246,7 +241,10 @@ ENDIF !* 1. SOME INITIALIZATIONS ! -------------------- ! -ILUOUT = TLUOUT%NLU +!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available +GOLDFILEFORMAT = ( TPINIFILE%NMNHVERSION(1) < 5 & + .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) & + .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) ! ! !------------------------------------------------------------------------------- @@ -283,37 +281,14 @@ ELSE IL3DYV=2 + 2*JPHEXT ! 4 ENDIF ! -IF (KSIZELBXU_ll/= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBXUM',IL3DXU,IRIMXU,PLBXUM) -END IF - -IF ( KSIZELBX_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBXVM',IL3DX,IRIMX,PLBXVM) -ENDIF - -IF ( KSIZELBX_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBXWM',IL3DX,IRIMX,PLBXWM) -END IF - -IF ( KSIZELBY_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBYUM',IL3DY,IRIMY,PLBYUM) -END IF - -IF ( KSIZELBYV_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBYVM',IL3DYV,IRIMYV,PLBYVM) -END IF - -IF (KSIZELBY_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBYWM',IL3DY,IRIMY,PLBYWM) -END IF - -IF (KSIZELBX_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBXTHM',IL3DX,IRIMX,PLBXTHM) -END IF - -IF ( KSIZELBY_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBYTHM',IL3DY,IRIMY,PLBYTHM) -END IF +IF ( KSIZELBXU_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXUM', IL3DXU, IRIMXU, PLBXUM ) +IF ( KSIZELBX_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXVM', IL3DX, IRIMX, PLBXVM ) +IF ( KSIZELBX_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXWM', IL3DX, IRIMX, PLBXWM ) +IF ( KSIZELBY_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYUM', IL3DY, IRIMY, PLBYUM ) +IF ( KSIZELBYV_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYVM', IL3DYV, IRIMYV, PLBYVM ) +IF ( KSIZELBY_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYWM', IL3DY, IRIMY, PLBYWM ) +IF ( KSIZELBX_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXTHM', IL3DX, IRIMX, PLBXTHM ) +IF ( KSIZELBY_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYTHM', IL3DY, IRIMY, PLBYTHM ) ! !* 2.3 LB-TKE ! @@ -321,11 +296,10 @@ SELECT CASE(HGETTKEM) CASE('READ') IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN IF (PRESENT(PLBXTKEMM).AND.PRESENT(PLBYTKEMM)) THEN - WRITE ( ILUOUT,*) 'LBXTKES AND LBYTKES WILL BE INITIALIZED TO 0' + CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'LBXTKES and LBYTKE are initialized to PLBXTKEMM and PLBYTKEMM' ) PLBXTKEM(:,:,:) = PLBXTKEMM(:,:,:) PLBYTKEM(:,:,:) = PLBYTKEMM(:,:,:) ELSE -!callabortstop CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize LBXTKES and LBYTKES') ENDIF ELSE @@ -431,9 +405,8 @@ IF(KSIZELBXR_ll > 0 ) THEN IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN IF (PRESENT(PLBXRMM)) THEN PLBXRM(:,:,:,IRR)=PLBXRMM(:,:,:,IRR) - WRITE(ILUOUT,*) 'PLBXRS will be initialized to 0 for LBXR'//YC(JRR)//'M' + CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBXRM is initialized to PLBXRMM for LBXR'//YC(JRR)//'M' ) ELSE - !callabortstop CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBXRM for LBXR'//YC(JRR)//'M') ENDIF ELSE @@ -449,9 +422,8 @@ IF(KSIZELBXR_ll > 0 ) THEN IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN IF (PRESENT(PLBYRMM)) THEN PLBYRM(:,:,:,IRR)=PLBYRMM(:,:,:,IRR) - WRITE(ILUOUT,*) 'PLBYRS will be initialized to 0 for LBYR'//YC(JRR)//'M' + CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBYRM is initialized to PLBYRMM for LBYR'//YC(JRR)//'M' ) ELSE - !callabortstop CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBYRM for LBYR'//YC(JRR)//'M') ENDIF ELSE @@ -472,1121 +444,216 @@ END IF ! !* 2.6 LB-Scalar Variables ! -PLBXSVM(:,:,:,:) = 0. -PLBYSVM(:,:,:,:) = 0. -! IF (KSV > 0) THEN IF (ANY(HGETSVM(1:KSV)=='READ')) THEN - TZFIELD%CMNHNAME = 'HORELAX_SV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HORELAX_SV' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%CLBTYPE = 'NONE' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPELOG - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_read(TPINIFILE,TZFIELD,GHORELAX_SV) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HORELAX_SV', & + CSTDNAME = '', & + CLONGNAME = 'HORELAX_SV', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + CLBTYPE = 'NONE', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) + CALL IO_Field_read( TPINIFILE, TZFIELD, GHORELAX_SV ) + IF ( GHORELAX_SV ) THEN - IRIMX=(KSIZELBXSV_ll-2*JPHEXT)/2 + IRIMX=(KSIZELBXSV_ll-2*JPHEXT)/2 IRIMY=(KSIZELBYSV_ll-2*JPHEXT)/2 IL3DX=2*ILBSIZEX+2*JPHEXT IL3DY=2*ILBSIZEY+2*JPHEXT ELSE IRIMX=0 IRIMY=0 - IL3DX=2*JPHEXT !2 - IL3DY=2*JPHEXT !2 + IL3DX=2*JPHEXT + IL3DY=2*JPHEXT END IF END IF END IF -! User scalar variables -IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1, NSV_USER - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBXSVM',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'PLXYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBYSVM',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! C2R2 scalar variables -IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG, NSV_C2R2END - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'C2R2 PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C2R2 PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'C2R2 PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C2R2 PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! C1R3 scalar variables -IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG, NSV_C1R3END - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'C1R3 PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C1R3 PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'C1R3 PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C1R3 PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -! LIMA: CCN and IFN scalar variables -! -IF (CCLOUD=='LIMA' ) THEN - DO JSV = NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_FREE + NMOD_CCN - 1 - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - TZFIELD = TSVLIST(JSV) - TZFIELD%CDIR = '' - YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) - - IF ( KSIZELBXSV_ll /= 0 .AND. SIZE(PLBXSVM,1) /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) - - IF ( TPINIFILE%NMNHVERSION(1) < 5 & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN - CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) - END IF - - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - TZFIELD%CLBTYPE = 'LBX' - - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'CCN PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize CCN PLBXSVM') - ENDIF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 .AND. SIZE(PLBYSVM,1) /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - IF ( TPINIFILE%NMNHVERSION(1) < 5 & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN - CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) - END IF +! Scalar variables +DO JSV = 1, NSV + SELECT CASE( HGETSVM(JSV) ) + CASE ( 'READ' ) + TZFIELD = TSVLIST(JSV) + TZFIELD%CDIR = '' + TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN + YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) + YLONGNAME_BASE = TRIM( TZFIELD%CLONGNAME ) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - TZFIELD%CLBTYPE = 'LBY' + IF ( KSIZELBXSV_ll /= 0 .AND. SIZE( PLBXSVM, 1 ) /= 0 ) THEN + TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE ) - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'CCN PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize CCN PLBYSVM') - ENDIF + !Some variables were written with an other name in MesoNH < 5.5.1 + IF ( GOLDFILEFORMAT ) THEN + IF ( JSV >= 1 .AND. JSV <= NSV_USER ) THEN + WRITE( TZFIELD%CMNHNAME, '( A6, I3.3 )' ) 'LBXSVM',JSV + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) + ELSE IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN + CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME ) + TZFIELD%CSTDNAME = '' + ELSE IF ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) THEN + TZFIELD%CMNHNAME = 'LBX_PP' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBX_PP' + IF ( JSV == NSV_PPBEG .AND. NSV_PP > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.5.1) for LBX_PP scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBX_PP variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBX_PP''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) + END IF +#ifdef MNH_FOREFIRE + ELSE IF ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) THEN + TZFIELD%CMNHNAME = 'LBX_FF' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBX_FF' + IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.5.1) for LBX_FF scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBX_FF variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBX_FF''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) + END IF +#endif + ELSE IF ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) THEN + TZFIELD%CMNHNAME = 'LBX_CS' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBX_CS' + IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.5.1) for LBX_CS scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBX_CS variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBX_CS''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) + END IF END IF END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO - ! - DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - TZFIELD = TSVLIST(JSV) - TZFIELD%CDIR = '' - YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) - IF ( KSIZELBXSV_ll /= 0 .AND. SIZE(PLBXSVM,1) /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) '2_Y_Z_', 'LBXSVM', JSV + TZFIELD%CLBTYPE = 'LBX' - IF ( TPINIFILE%NMNHVERSION(1) < 5 & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN - CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) - END IF - - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - TZFIELD%CLBTYPE = 'LBX' + CALL IO_Field_read_lb( TPINIFILE, TZFIELD, IL3DX, IRIMX, PLBXSVM(:,:,:,JSV), IRESP ) - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'IFN PLBXSVM will be initialized to 0' + IF ( IRESP /= 0 ) THEN + IF ( PRESENT( PLBXSVMM ) ) THEN + PLBXSVM(:,:,:,JSV) = PLBXSVMM(:,:,:,JSV) + CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBXSVM is initialized to PLBXSVMM for ' // TRIM( YMNHNAME_BASE ) ) + ELSE + IF ( GOLDFILEFORMAT .AND. JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN + !In pre 5.5.1 files, only CCN_FREE and IFN_FREE LIMA scalar variables were available (for LIMA scalar variables) + IF ( JSV >= NSV_LIMA_CCN_FREE .AND. JSV <= (NSV_LIMA_CCN_FREE+NMOD_CCN-1) ) THEN + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA CCN_FREE PLBXSVM' ) + ELSE IF ( JSV >= NSV_LIMA_IFN_FREE .AND. JSV <= (NSV_LIMA_IFN_FREE+NMOD_IFN-1) ) THEN + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA IFN_FREE PLBXSVM' ) + ELSE + PLBXSVM(:,:,:,JSV) = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) + END IF + ELSE IF ( ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. & +#ifdef MNH_FOREFIRE + ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. & +#endif + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) .OR. & + ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND .AND. GOLDFILEFORMAT ) ) THEN !Snow was not written in <5.5.1 + PLBXSVM(:,:,:,JSV) = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN') - ENDIF + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize PLBXSVM for ' // TRIM( YMNHNAME_BASE ) ) + END IF END IF END IF - ! - IF (KSIZELBYSV_ll /= 0 .AND. SIZE(PLBYSVM,1) /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - - IF ( TPINIFILE%NMNHVERSION(1) < 5 & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN - CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) - END IF + END IF - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - TZFIELD%CLBTYPE = 'LBY' + IF ( KSIZELBYSV_ll /= 0 .AND. SIZE( PLBYSVM, 1 ) /= 0 ) THEN + TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE ) - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'IFN PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN') - ENDIF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! ELEC scalar variables -IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG, NSV_ELECEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'ELEC PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ELEC PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'ELEC PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ELEC PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Chemical gas phase scalar variables -IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHGSBEG, NSV_CHGSEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Chemical PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize gas phase chemical PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Chemical PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize gas phase chemical PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Chemical aqueous phase scalar variables -IF (NSV_CHACEND>=NSV_CHACBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHACBEG, NSV_CHACEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Chemical PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aqueous phase chemical PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Chemical PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aqueous phase chemical PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Chemical ice phase scalar variables -IF (NSV_CHICEND>=NSV_CHICBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHICBEG, NSV_CHICEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Ice phase chemical PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ice phase chemical PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Ice phase chemical PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ice phase chemical PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Orilam aerosol scalar variables -IF (NSV_AEREND>=NSV_AERBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERBEG, NSV_AEREND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Aerosol PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Aerosol PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Orilam aerosols moist scalar variables -IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERDEPBEG, NSV_AERDEPEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Aerosol PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Aerosol PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Dust scalar variables -IF (NSV_DSTEND>=NSV_DSTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTBEG, NSV_DSTEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Dust PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Dust PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTDEPBEG, NSV_DSTDEPEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Dust Desposition PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Dust Depoistion PLBYSVM will be initialized to 0' - ELSE - WRITE(ILUOUT,*) 'Pb to initialize dust PLBYSVM ' -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Sea salt scalar variables -IF (NSV_SLTEND>=NSV_SLTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTBEG, NSV_SLTEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Sea Salt PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize sea salt PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Sea Salt PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize sea salt PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Passive pollutant variables -IF (NSV_PPEND>=NSV_PPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_PPBEG, NSV_PPEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_PP' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Passive pollutant PLBXSVM will be initialized to 0' - ELSE - PLBXSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'Passive pollutant PLBXSVM will be initialized to 0' - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_PP' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Passive pollutant PLBYSVM will be initialized to 0' - ELSE - PLBYSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'Passive pollutant PLBYSVM will be initialized to 0' - ENDIF + !Some variables were written with an other name in MesoNH < 5.5.1 + IF ( GOLDFILEFORMAT ) THEN + IF ( JSV >= 1 .AND. JSV <= NSV_USER ) THEN + WRITE( TZFIELD%CMNHNAME, '( A6, I3.3 )' ) 'LBYSVM',JSV + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) + ELSE IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN + CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME ) + TZFIELD%CSTDNAME = '' + ELSE IF ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) THEN + TZFIELD%CMNHNAME = 'LBY_PP' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBY_PP' + IF ( JSV == NSV_PPBEG .AND. NSV_PP > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.5.1) for LBY_PP scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBY_PP variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBY_PP''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF #ifdef MNH_FOREFIRE -! ForeFire scalar variables -IF (NSV_FFEND>=NSV_FFBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FFBEG, NSV_FFEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_FF' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - WRITE(ILUOUT,*) 'ForeFire LBX_FF ', IRESP - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'ForeFire pollutant PLBXSVM will be initialized to 0' - ELSE - PLBXSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'ForeFire pollutant PLBXSVM will be initialized to 0' - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_FF' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'ForeFire scalar variable PLBYSVM will be initialized to 0' - ELSE - PLBYSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'ForeFire scalar variable PLBYSVM will be initialized to 0' - ENDIF + ELSE IF ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) THEN + TZFIELD%CMNHNAME = 'LBY_FF' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBY_FF' + IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.5.1) for LBY_FF scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBY_FF variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBY_FF''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF #endif -! Conditional sampling variables -IF (NSV_CSEND>=NSV_CSBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG, NSV_CSEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_CS' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Conditional sampling LBXSVM will be initialized to 0' - ELSE - PLBXSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'Conditional sampling PLBXSVM will be initialized to 0' - ENDIF + ELSE IF ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) THEN + TZFIELD%CMNHNAME = 'LBY_CS' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBY_CS' + IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.5.1) for LBY_CS scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBY_CS variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBY_CS''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) END IF END IF END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_CS' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Conditional sampling PLBYSVM will be initialized to 0' - ELSE - PLBYSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'Conditional sampling PLBYSVM will be initialized to 0' - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Linox scalar variables -IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LNOXBEG, NSV_LNOXEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Linox PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize linox PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Linox PLBYSVM will be initialized to 0' - ELSE -!calla bortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize linox PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Lagrangian variables -IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG, NSV_LGEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'lagrangian PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize lagrangian PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'lagrangian PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize lagrangian PLBYSVM') - ENDIF + WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) 'X_2_Z_', 'LBYSVM', JSV + TZFIELD%CLBTYPE = 'LBY' + + CALL IO_Field_read_lb( TPINIFILE, TZFIELD, IL3DY, IRIMY, PLBYSVM(:,:,:,JSV), IRESP ) + + IF ( IRESP /= 0 ) THEN + IF ( PRESENT( PLBYSVMM ) ) THEN + PLBYSVM(:,:,:,JSV) = PLBYSVMM(:,:,:,JSV) + CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBYSVM is initialized to PLBYSVMM for ' // TRIM( YMNHNAME_BASE ) ) + ELSE + IF ( GOLDFILEFORMAT .AND. JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN + !In pre 5.5.1 files, only CCN_FREE and IFN_FREE LIMA scalar variables were available (for LIMA scalar variables) + IF ( JSV >= NSV_LIMA_CCN_FREE .AND. JSV <= (NSV_LIMA_CCN_FREE+NMOD_CCN-1) ) THEN + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA CCN_FREE PLBYSVM' ) + ELSE IF ( JSV >= NSV_LIMA_IFN_FREE .AND. JSV <= (NSV_LIMA_IFN_FREE+NMOD_IFN-1) ) THEN + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA IFN_FREE PLBYSVM' ) + ELSE + PLBYSVM(:,:,:,JSV) = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBYSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) + END IF + ELSE IF ( ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. & +#ifdef MNH_FOREFIRE + ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. & +#endif + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) .OR. & + ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND .AND. GOLDFILEFORMAT ) ) THEN !Snow was not written in <5.5.1 + PLBYSVM(:,:,:,JSV) = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBYSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) + ELSE + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize PLBYSVM for ' // TRIM( YMNHNAME_BASE ) ) END IF END IF END IF - ! - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF + END IF + + CASE( 'INIT' ) + IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. + IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. + END SELECT +END DO !------------------------------------------------------------------------------- ! !* 3. COMPUTE THE LB SOURCES @@ -1645,9 +712,10 @@ ENDIF ! CONTAINS - SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME ) + SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME, YLONGNAME ) CHARACTER(LEN=*), INTENT(INOUT) :: YMNHNAME + CHARACTER(LEN=*), INTENT(INOUT) :: YLONGNAME INTEGER :: IPOS INTEGER :: JI @@ -1666,6 +734,8 @@ CONTAINS YMNHNAME(JI:JI) = ' ' END DO + YLONGNAME = TRIM( YMNHNAME ) + END SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN END SUBROUTINE INI_LB diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90 index 21642620971a94e1c95256cb2739ce03f1e31b20..2e9702b85ea4cbd506b6aa0cf522c9376c3b1f9c 100644 --- a/src/MNH/ini_prog_var.f90 +++ b/src/MNH/ini_prog_var.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -36,8 +36,6 @@ END MODULE MODI_INI_PROG_VAR !! EXTERNAL !! -------- !! -!! Routine PGDFILTER : to filter a 2D field. -!! Module MODI_PGDFILTER !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -99,42 +97,39 @@ END MODULE MODI_INI_PROG_VAR ! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv ! P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv ! P. Wautelet 10/03/2021: use scalar variable names for dust and salt +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! ! -USE MODD_CH_AEROSOL -USE MODD_CH_M9_n, ONLY: NEQ, CNAMES -USE MODD_CH_MNHC_n, ONLY: LUSECHEM, LUSECHAQ, LUSECHIC, LCH_PH -USE MODD_CONF -USE MODD_CONF_n -USE MODD_DIM_n -USE MODD_DUST -USE MODD_DYN_n -use modd_field, only: TFIELDMETADATA, TYPEREAL -USE MODD_FIELD_n +USE MODD_CH_M9_n, ONLY: NEQ +USE MODD_CH_MNHC_n, ONLY: LUSECHEM +USE MODD_CONF, ONLY: NVERB +USE MODD_CONF_n, ONLY: NRR +USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll +USE MODD_DYN_n, ONLY: LHORELAX_SV, LHORELAX_TKE, NRIMX, NRIMY, & + NSIZELBXSV_ll, NSIZELBYSV_ll, NSIZELBXTKE_ll, NSIZELBYTKE_ll +use modd_field, only: TFIELDMETADATA +USE MODD_FIELD_n, ONLY: XRT, XSIGS, XSRCT, XSVT, XTKET, XWT USE MODD_IO, ONLY: TFILEDATA -USE MODD_LSFIELD_n -USE MODD_LUNIT +USE MODD_LSFIELD_n, ONLY: XLBXSVM, XLBYSVM, XLBXTKEM, XLBYTKEM USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NSV -USE MODD_PARAM_n -USE MODD_PARAMETERS -USE MODD_SALT -USE MODD_TURB_n +USE MODD_NSV, ONLY: NSV, NSV_AERBEG, NSV_AEREND, NSV_AERDEPBEG, NSV_AERDEPEND, NSV_CHEMBEG, NSV_CHEMEND, & + NSV_DSTBEG, NSV_DSTEND, NSV_DSTDEPBEG, NSV_DSTDEPEND, NSV_SLTBEG, NSV_SLTEND, & + NSV_SLTDEPBEG, NSV_SLTDEPEND, TSVLIST +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_n, ONLY: CTURB ! USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_IO_FILE, ONLY: IO_File_close, IO_File_open USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list -USE MODE_MODELN_HANDLER +USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX USE MODE_MSG -USE MODE_POS +USE MODE_POS, ONLY: POSNAM use mode_tools_ll, only: GET_INDICE_ll ! -USE MODI_PGDFILTER -! USE MODN_CH_ORILAM USE MODN_DUST USE MODN_SALT @@ -213,7 +208,6 @@ END IF !* 3. PASSIVE SCALAR ! -------------- ! -ALLOCATE(XSVT(0,0,0,0)) IF(PRESENT(HCHEMFILE)) THEN WRITE(ILUOUT,*) 'Routine INI_PROG_VAR: CHEMical species read in ',TRIM(HCHEMFILE) ! Read dimensions in chem file and checks with output file @@ -266,25 +260,18 @@ IF(PRESENT(HCHEMFILE)) THEN LSLTPRES=.FALSE. CALL POSNAM(ILUDES,'NAM_SALT',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SALT) - ! initialise NSV_* variables ENDIF + + ! initialise NSV_* variables CALL INI_NSV(IMI) ALLOCATE(XSVT(IIU,IJU,IKU,NSV)) - - ! Read scalars in chem file + + ! Read scalars in chem file IF (.NOT.LDUST) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHEMBEG,NSV_CHEMEND - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + DO JSV = NSV_CHEMBEG, NSV_CHEMEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE @@ -298,18 +285,10 @@ IF(PRESENT(HCHEMFILE)) THEN END IF IF (LORILAM) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_AERBEG,NSV_AEREND - TZFIELD%CMNHNAME = TRIM(CAERONAMES(JSV-NSV_AERBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE @@ -318,18 +297,10 @@ IF(PRESENT(HCHEMFILE)) THEN END DO ! JSV ! IF (LDEPOS_AER(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND - TZFIELD%CMNHNAME = TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE @@ -340,18 +311,10 @@ IF(PRESENT(HCHEMFILE)) THEN END IF ! lorilam IF (LDUST) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_DSTBEG, NSV_DSTEND - TZFIELD%CMNHNAME = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR',TRIM(TZFIELD%CMNHNAME)//' not found in the CHEM file '//TRIM(HCHEMFILE)) @@ -359,18 +322,10 @@ IF(PRESENT(HCHEMFILE)) THEN END DO ! JSV IF (LDEPOS_DST(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND - TZFIELD%CMNHNAME = TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE @@ -381,18 +336,10 @@ IF(PRESENT(HCHEMFILE)) THEN END IF ! LDUST IF (LSALT) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_SLTBEG, NSV_SLTEND - TZFIELD%CMNHNAME = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR',TRIM(TZFIELD%CMNHNAME)//' not found in the CHEM file '//TRIM(HCHEMFILE)) @@ -400,18 +347,10 @@ IF(PRESENT(HCHEMFILE)) THEN END DO ! JSV ! IF (LDEPOS_SLT(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND - TZFIELD%CMNHNAME = TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE diff --git a/src/MNH/paspol.f90 b/src/MNH/paspol.f90 index 7287cb0b4124a86bea399abaf67b9db2bc81f8fb..af5da06658860e8f4f327f6f0e2052e4821546ce 100644 --- a/src/MNH/paspol.f90 +++ b/src/MNH/paspol.f90 @@ -579,7 +579,7 @@ END DO !* 3.4 Ecriture conditionnelle. ! IF ( tpfile%lopened ) THEN - TZFIELD = TFIELDMetaDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for paspol', & !Temporary name to ease identification CSTDNAME = '', & CUNITS = 'm-3', & diff --git a/src/MNH/read_cams_data_netcdf_case.f90 b/src/MNH/read_cams_data_netcdf_case.f90 index 89ab3518c9bb0b4ad0152fdc980b49cd1d630355..a4023d0917c837950a915e822d7b6ddcdc99c86e 100644 --- a/src/MNH/read_cams_data_netcdf_case.f90 +++ b/src/MNH/read_cams_data_netcdf_case.f90 @@ -88,8 +88,8 @@ END MODULE MODI_READ_CAMS_DATA_NETCDF_CASE !------------ ! USE MODD_CH_AEROSOL, ONLY: CORGANIC, NCARB, NSOA, NSP, LORILAM,& - JPMODE, LVARSIGI, LVARSIGJ,CAERONAMES -USE MODD_CH_M9_n, ONLY: NEQ , CNAMES + JPMODE, LVARSIGI, LVARSIGJ +USE MODD_CH_M9_n, ONLY: NEQ USE MODD_CH_MNHC_n, ONLY: LUSECHEM,LUSECHAQ,LUSECHIC,LCH_PH USE MODD_CONF USE MODD_CONF_n diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index 4f40512544ce67621915080d64b8d49cf89b1945..34a20049a6758d3c453f7d4d41355e1f06aadc64 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -247,56 +247,48 @@ END MODULE MODI_READ_FIELD !! C.Lac 10/16 CEN4TH with RKC4 + Correction on RK loop !! 09/2017 Q.Rodier add LTEND_UV_FRC !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! V. Vionnet 07/17 add blowing snow scheme -!! P. Wautelet 01/2019 corrected intent of PDUM,PDVM,PDWM (OUT->INOUT) +! V. Vionnet 07/17: add blowing snow scheme +! P. Wautelet 01/2019: corrected intent of PDUM,PDVM,PDWM (OUT->INOUT) ! P. Wautelet 13/02/2019: removed PPABSM and PTSTEP dummy arguments (bugfix: PPABSM was intent(OUT)) -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! S. Bielli 02/2019: Sea salt : significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 14/03/2019: correct ZWS when variable not present in file ! M. Leriche 10/06/2019: in restart case read all immersion modes for LIMA -!! B. Vie 06/2020: Add prognostic supersaturation for LIMA -!! F. Auguste 02/2021: add fields necessary for IBM -!! T. Nagel 02/2021: add fields necessary for turbulence recycling -!! J.L. Redelsperger 03/2021: add necessary variables for Ocean LES case +! B. Vie 06/2020: Add prognostic supersaturation for LIMA +! F. Auguste 02/2021: add fields necessary for IBM +! T. Nagel 02/2021: add fields necessary for turbulence recycling +! JL. Redelsperger 03/2021: add necessary variables for Ocean LES case +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_2D_FRC -USE MODD_ADV_n -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -USE MODD_CH_AEROSOL -USE MODD_CH_M9_n, ONLY: CNAMES, CICNAMES -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST -USE MODD_CTURB -USE MODD_DUST +USE MODD_2D_FRC, ONLY: L2D_ADV_FRC, L2D_REL_FRC +USE MODD_ADV_n, ONLY: CTEMP_SCHEME, LSPLIT_CFL +USE MODD_BLOWSNOW_n, ONLY: XSNWCANO +USE MODD_CONF, ONLY: CCONF, CPROGRAM, L1D, LFORCING, NVERB +USE MODD_CONF_n, ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT +USE MODD_CST, ONLY: XALPW, XBETAW, XCPD, XGAMW, XMD, XMV, XP00, XRD +USE MODD_CTURB, ONLY: XTKEMIN USE MODD_DYN_n, ONLY: LOCEAN -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -use modd_field, only: tfieldmetadata, tfieldlist, TYPEDATE, TYPEREAL,TYPELOG,TYPEINT +use modd_field, only: tfieldmetadata, tfieldlist, TYPEDATE, TYPEREAL, TYPELOG, TYPEINT USE MODD_FIELD_n, only: XZWS_DEFAULT -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -#endif USE MODD_IBM_PARAM_n, ONLY: LIBM -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES USE MODD_IO, ONLY: TFILEDATA -USE MODD_LATZ_EDFLX -USE MODD_LG, ONLY: CLGNAMES +USE MODD_LATZ_EDFLX, ONLY: LTH_FLX, LUV_FLX USE MODD_LUNIT_N, ONLY: TLUOUT -USE MODD_NSV -USE MODD_OCEANH +USE MODD_NSV, ONLY: NSV, NSV_C2R2BEG, NSV_C2R2END, NSV_CSBEG, NSV_CSEND, & +#ifdef MNH_FOREFIRE + NSV_FFBEG, NSV_FFEND, & +#endif + NSV_PPBEG, NSV_PPEND, NSV_SNW, NSV_USER, TSVLIST +USE MODD_OCEANH, ONLY: NFRCLT, NINFRT, XSSOLA_T, XSSUFL_T, XSSTFL_T, XSSVFL_T USE MODD_PARAM_C2R2, ONLY: LSUPSAT -! +USE MODD_PARAMETERS, ONLY: XUNDEF USE MODD_PARAM_n, ONLY: CSCONV -USE MODD_PASPOL -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_RECYCL_PARAM_n +USE MODD_RECYCL_PARAM_n, ONLY: LRECYCLE, LRECYCLN, LRECYCLS, LRECYCLW, NR_COUNT USE MODD_REF, ONLY: LCOUPLES -USE MODD_SALT -USE MODD_TIME ! for type DATE_TIME +USE MODD_TIME, ONLY: DATE_TIME ! use mode_field, only: Find_field_id_from_mnhname USE MODE_IO_FIELD_READ, only: IO_Field_read @@ -418,7 +410,9 @@ INTEGER :: IIUP,IJUP ! size of working window arrays INTEGER :: JT ! loop index LOGICAL :: GLSOURCE ! switch for the source term (for ini_ls and ini_lb) LOGICAL :: ZLRECYCL ! switch if turbulence recycling is activated +LOGICAL :: GOLDFILEFORMAT CHARACTER(LEN=3) :: YFRC ! To mark the different forcing dates +CHARACTER(LEN=3) :: YNUM3 CHARACTER(LEN=15) :: YVAL REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK ! to compute supersaturation TYPE(TFIELDMETADATA) :: TZFIELD @@ -431,6 +425,10 @@ TYPE(TFIELDMETADATA) :: TZFIELD GLSOURCE=.FALSE. ZWORK = 0.0 ! +!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available +GOLDFILEFORMAT = ( TPINIFILE%NMNHVERSION(1) < 5 & + .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) & + .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) !------------------------------------------------------------------------------- ! !* 2. READ PROGNOSTIC VARIABLES @@ -811,477 +809,83 @@ ENDIF ! ISV= SIZE(PSVT,4) ! -IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1, NSV_USER ! initialize according to the get indicators - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') +DO JSV = 1, NSV ! initialize according to the get indicators + SELECT CASE( HGETSVT(JSV) ) + CASE ('READ') + TZFIELD = TSVLIST(JSV) + + IF ( GOLDFILEFORMAT .AND. & + ( ( JSV >= 1 .AND. JSV <= NSV_USER ) .OR. & + ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. & +#ifdef MNH_FOREFIRE + ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. & +#endif + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) ) ) THEN + !Some variables were written with an other name in MesoNH < 5.5.1 WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CSTDNAME = '' TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG,NSV_C2R2END - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') + ELSE + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + END IF + + CALL IO_Field_read( TPINIFILE, TZFIELD, PSVT(:,:,:,JSV), IRESP ) + + IF ( IRESP /= 0 ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PSVT set to 0 for ' // TRIM( TZFIELD%CMNHNAME ) ) PSVT(:,:,:,JSV) = 0. - IF (LSUPSAT .AND. (HGETRVT == 'READ') ) THEN + END IF + + CASE ('INIT') + PSVT(:,:,:,JSV) = 0. + + IF ( JSV == NSV_C2R2END ) THEN + IF ( LSUPSAT .AND. (HGETRVT == 'READ') ) THEN ZWORK(:,:,:) = (PPABST(:,:,:)/XP00 )**(XRD/XCPD) ZWORK(:,:,:) = PTHT(:,:,:)*ZWORK(:,:,:) - ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*ALOG(ZWORK(:,:,:))) + ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*LOG(ZWORK(:,:,:))) !rvsat ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:)) - ZWORK(:,:,:) = PRT(:,:,:,1)/ZWORK(:,:,:) + ZWORK(:,:,:) = PRT(:,:,:,IDX_RVT)/ZWORK(:,:,:) PSVT(:,:,:,NSV_C2R2END ) = ZWORK(:,:,:) END IF - END SELECT - END DO -END IF -! -IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG,NSV_C1R3END - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -! LIMA variables -! -DO JSV = NSV_LIMA_BEG, NSV_LIMA_END - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. + END IF + END SELECT END DO -! -IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN - TZFIELD%CUNITS = 'C m-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - ELSE - TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)' - END IF - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppbv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHGSBEG,NSV_CHGSEND - CNAMES(JSV-NSV_CHGSBEG+1) = UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)) - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHGSBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_CHACEND>=NSV_CHACBEG) THEN - TZFIELD%CSTDNAME = '' - !PW TODO: check units - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHACBEG,NSV_CHACEND - CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1) = UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1)) - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3,A4)')'X_Y_Z_','CHAQ',JSV,' (M)' - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) -!***ATTENTION: BUG ? field written with a M suffix, read with a T suffix - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_CHICEND>=NSV_CHICBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHICBEG,NSV_CHICEND - CICNAMES(JSV-NSV_CHICBEG+1) = UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)) - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_SLTEND>=NSV_SLTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTBEG,NSV_SLTEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_SLTDEPEND>=NSV_SLTDEPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_DSTEND>=NSV_DSTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTBEG,NSV_DSTEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_AEREND>=NSV_AERBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERBEG,NSV_AEREND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_PPEND>=NSV_PPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_PPBEG,NSV_PPEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg kg-1' - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV),IRESP) - IF (IRESP/=0) THEN - PSVT(:,:,:,JSV) = 0. - END IF - ! - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1 - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1 - TZFIELD%CUNITS = 'm-3' - CALL IO_Field_read(TPINIFILE,TZFIELD,PATC(:,:,:,JSV-NSV_PPBEG+1),IRESP) - IF (IRESP/=0) THEN - PATC(:,:,:,JSV-NSV_PPBEG+1) = 0. - ENDIF - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. + +DO JSV = NSV_PPBEG, NSV_PPEND + SELECT CASE( HGETSVT(JSV) ) + CASE ('READ') + WRITE( YNUM3, '( I3.3 )' ) JSV + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ATC' // YNUM3, & + CSTDNAME = '', & + CLONGNAME = 'ATC' // YNUM3, & + CCOMMENT = 'X_Y_Z_ATC' // YNUM3, & + CUNITS = 'm-3', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + CALL IO_Field_read( TPINIFILE, TZFIELD, PATC(:,:,:,JSV-NSV_PPBEG+1), IRESP ) + + IF ( IRESP /= 0 ) THEN PATC(:,:,:,JSV-NSV_PPBEG+1) = 0. - END SELECT - END DO -END IF -! -#ifdef MNH_FOREFIRE -IF (NSV_FFEND>=NSV_FFBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FFBEG,NSV_FFEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV),IRESP) - IF (IRESP /= 0) THEN - PSVT(:,:,:,JSV) = 0. - END IF - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -#endif -! -IF (NSV_CSEND>=NSV_CSBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG,NSV_CSEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV),IRESP) - IF (IRESP /= 0) THEN - PSVT(:,:,:,JSV) = 0. - END IF - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppb' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = 'LINOXT' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)') 'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_SNWEND>=NSV_SNWBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - DO JSV = NSV_SNWBEG,NSV_SNWEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CSNOWNAMES(JSV-NSV_SNWBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)') 'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -IF (NSV_SNW>=1) THEN + ENDIF + + CASE ('INIT') + PATC(:,:,:,JSV-NSV_PPBEG+1) = 0. + + END SELECT +END DO + +IF ( NSV_SNW >= 1 ) THEN TZFIELD%CSTDNAME = '' TZFIELD%CUNITS = 'kg kg-1' TZFIELD%CDIR = 'XY' @@ -1289,20 +893,18 @@ IF (NSV_SNW>=1) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 2 TZFIELD%LTIMEDEP = .TRUE. - DO JSV = 1,NSV_SNW + DO JSV = 1, NSV_SNW SELECT CASE(HGETSVT(JSV)) CASE ('READ') - WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV + WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A6,A8,I3.3)') 'X_Y_Z_','SNOWCANO',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,XSNWCANO(:,:,JSV)) + CALL IO_Field_read( TPINIFILE, TZFIELD, XSNWCANO(:,:,JSV) ) CASE ('INIT') XSNWCANO(:,:,JSV) = 0. END SELECT END DO - END IF - ! IF (CCONF == 'RESTA') THEN IF (CTEMP_SCHEME/='LEFR') THEN diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90 index a36f754677fe08f348be9d5624852f6352805271..993f0ebd32726023a91b4f504902fe3b3a08c265 100644 --- a/src/MNH/spawn_field2.f90 +++ b/src/MNH/spawn_field2.f90 @@ -152,39 +152,31 @@ END MODULE MODI_SPAWN_FIELD2 !! 29/04/2016 (J.Escobar) bug in use of ZSVT_C in SET_LSFIELD_1WAY_ll !! Modification 01/2016 (JP Pinty) Add LIMA !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Modification 05/03/2018 (J.Escobar) bypass gridnesting special case KD(X/Y)RATIO == 1 not parallelized -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! J. Escobar 05/03/2018: bypass gridnesting special case KD(X/Y)RATIO == 1 not parallelized +! S. Bielli S. 02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 14/03/2019: correct ZWS when variable not present in file -!! B. Vie 06/2020 Add prognostic supersaturation for LIMA +! B. Vie 06/2020: Add prognostic supersaturation for LIMA ! P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_2D_FRC -USE MODD_ADVFRC_n -USE MODD_BIKHARDT_n -USE MODD_CH_AEROSOL, ONLY: CAERONAMES -USE MODD_CH_M9_n, ONLY: CNAMES, CICNAMES -USE MODD_CONF -USE MODD_CST +USE MODD_2D_FRC, ONLY: L2D_ADV_FRC, L2D_REL_FRC +USE MODD_ADVFRC_n, ONLY: ADVFRC_MODEL +USE MODD_BIKHARDT_N, ONLY: XBFX1, XBFX2, XBFX3, XBFX4, XBFY1, XBFY2, XBFY3, XBFY4, & + XBMX1, XBMX2, XBMX3, XBMX4, XBMY1, XBMY2, XBMY3, XBMY4 +USE MODD_CST, ONLY: XCPD, XP00, XRD, XRV USE MODD_CONF_n, ONLY: CONF_MODEL -USE MODD_DUST, ONLY: CDUSTNAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_FIELD_n, ONLY: FIELD_MODEL, XZWS_DEFAULT USE MODD_IO, ONLY: TFILEDATA -USE MODD_LATZ_EDFLX +USE MODD_LATZ_EDFLX, ONLY: LTH_FLX, LUV_FLX USE MODD_LBC_n, ONLY: LBC_MODEL -USE MODD_LG, ONLY: CLGNAMES -USE MODD_LUNIT_n, ONLY: LUNIT_MODEL,TLUOUT -USE MODD_NSV -USE MODD_REF_n, ONLY: REF_MODEL -USE MODD_PARAMETERS -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_RELFRC_n -USE MODD_SALT, ONLY: CSALTNAMES +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_NSV, ONLY: NSV, NSV_CSBEG, NSV_CSEND, NSV_PPBEG, NSV_PPEND, NSV_USER, TSVLIST +USE MODD_RELFRC_n, ONLY: RELFRC_MODEL USE MODD_SPAWN ! use mode_bikhardt @@ -194,7 +186,6 @@ USE MODE_MSG USE MODE_MODELN_HANDLER USE MODE_MPPDB USE MODE_THERMO -USE MODE_TOOLS, ONLY: UPCASE ! IMPLICIT NONE ! @@ -265,6 +256,7 @@ INTEGER :: IMI, JI,KI INTEGER :: IDIMX_C, IDIMY_C INTEGER :: IINFO_ll !$ +LOGICAL :: GOLDFILEFORMAT ! Arrays for reading fields of input SON 1 file REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2D @@ -273,6 +265,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPABST1,ZHUT1 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRT1 LOGICAL :: GUSERV ! +CHARACTER(LEN=3) :: YNUM3 CHARACTER(LEN=15) :: YVAL TYPE(TFIELDMETADATA) :: TZFIELD ! @@ -284,6 +277,13 @@ TYPE(TFIELDMETADATA) :: TZFIELD IMI = GET_CURRENT_MODEL_INDEX() CALL GOTO_MODEL(2) CALL GO_TOMODEL_ll(2, IINFO_ll) + +IF (PRESENT(TPSONFILE)) THEN + !If TPSONFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available + GOLDFILEFORMAT = ( TPSONFILE%NMNHVERSION(1) < 5 & + .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) < 5 ) & + .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) == 5 .AND. TPSONFILE%NMNHVERSION(3) < 1 ) ) +END IF ! !* 1.0 recovers logical unit number of output listing ! @@ -834,327 +834,51 @@ IF (PRESENT(TPSONFILE)) THEN ! ! Scalar variables ! - IF (NSV /= 0) THEN - ! User scalar variables - IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1, NSV_USER ! Users Scalar Variables - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! microphysical C2R2 scheme scalar variables - IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG,NSV_C2R2END - TZFIELD%CMNHNAME = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! LIMA variables - ! - DO JSV = NSV_LIMA_BEG, NSV_LIMA_END - TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF ( IRESP == 0 ) PSVT(KIB2:KIE2, KJB2:KJE2, :, JSV) = ZWORK3D(KIB1:KIE1, KJB1:KJE1, :) - END DO - ! - ! ELEC Scalar Variables - ! - IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - TZFIELD%CMNHNAME = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN - TZFIELD%CUNITS = 'C m-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - ELSE - TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)' - END IF - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Chemical Scalar Variables - ! - IF (NSV_CHEMEND>=NSV_CHEMBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHEMBEG,NSV_CHEMEND - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Ice phase chemical Scalar Variables - ! - IF (NSV_CHICEND>=NSV_CHICBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHICBEG,NSV_CHICEND - CICNAMES(JSV-NSV_CHICBEG+1) = UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)) - TZFIELD%CMNHNAME = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Orilam Scalar Variables - ! - IF (NSV_AEREND>=NSV_AERBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERBEG,NSV_AEREND - TZFIELD%CMNHNAME = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Dust Scalar Variables - ! - IF (NSV_DSTEND>=NSV_DSTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTBEG,NSV_DSTEND - TZFIELD%CMNHNAME = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Sea Salt Scalar Variables - ! - IF (NSV_SLTEND>=NSV_SLTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTBEG,NSV_SLTEND - TZFIELD%CMNHNAME = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! LG Scalar Variables - ! - IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - TZFIELD%CMNHNAME = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! LNOx Scalar Variables - ! -!PW:TODO/bug1?: LINOX or LINOXT? -!PW:TODO/bug2?: Same name of variable in a loop! - IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' !PW: TODO: not sure (depends if LINOX or LINOXT) - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - TZFIELD%CMNHNAME = 'LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Passive scalar variables - ! - IF (NSV_PPEND>=NSV_PPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_PPBEG,NSV_PPEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF + DO JSV = 1, NSV + TZFIELD = TSVLIST(JSV) + IF ( GOLDFILEFORMAT .AND. & + ( ( JSV >= 1 .AND. JSV <= NSV_USER ) .OR. & + ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. & #ifdef MNH_FOREFIRE - ! - ! ForeFire variables - ! - IF (NSV_FFEND>=NSV_FFBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FFBEG,NSV_FFEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF + ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. & #endif - ! - ! Passive scalar variables - ! - IF (NSV_CSEND>=NSV_CSBEG) THEN + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) ) ) THEN + !Some variables were written with an other name in MesoNH < 5.5.1 + WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG,NSV_CSEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO + TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) + ELSE + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' END IF - ! - ! Passive scalar variables - ! - IF (NSV_PP>=1) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1,NSV_PP - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1 - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1 - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PATC(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF -#ifdef MNH_FOREFIRE - ! - ! ForeFire variables - ! - IF (NSV_FF>=1) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1,NSV_FF - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_FFBEG-1 - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_FFBEG-1 - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PATC(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF -#endif - END IF + + CALL IO_Field_read( TPSONFILE, TZFIELD, ZWORK3D, IRESP ) + + IF( IRESP == 0 ) PSVT(KIB2:KIE2, KJB2:KJE2, :, JSV) = ZWORK3D(KIB1:KIE1, KJB1:KJE1, :) + END DO + ! + ! Passive scalar variables + ! + DO JSV = NSV_PPBEG, NSV_PPEND + WRITE( YNUM3, '( I3.3 )' ) JSV + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ATC' // YNUM3, & + CSTDNAME = '', & + CLONGNAME = 'ATC' // YNUM3, & + CCOMMENT = 'X_Y_Z_ATC' // YNUM3, & + CUNITS = 'm-3', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + CALL IO_Field_read( TPSONFILE, TZFIELD, ZWORK3D, IRESP ) + + IF( IRESP == 0 ) PATC(KIB2:KIE2, KJB2:KJE2, :, JSV-NSV_PPBEG+1) = ZWORK3D(KIB1:KIE1, KJB1:KJE1, :) + END DO ! ! Secondary pronostic variables ! diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index a8dc25cb4964fa80b436fbc16c173c260fe86a99..f957e9f773ae4e7322f6196eda1fe6f9a66df72a 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -71,37 +71,24 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON ! P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro) ! P. Wautelet 11/03/2021: budgets: remove ptrajx/y/z optional dummy arguments of Write_diachro ! P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST +USE MODD_CST, ONLY: XRV USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT -USE MODD_PARAMETERS +USE MODD_PARAMETERS, ONLY: XUNDEF ! USE MODD_AIRCRAFT_BALLOON -USE MODD_CH_M9_n, ONLY: CNAMES -USE MODD_CH_AEROSOL, ONLY: CAERONAMES, LORILAM, NSP, NCARB, NSOA, & - JPMODE, JP_AER_BC, JP_AER_OC, JP_AER_DST, & - JP_AER_H2O, JP_AER_SO4, JP_AER_NO3, & - JP_AER_NH3, JP_AER_SOA1, JP_AER_SOA2, & - JP_AER_SOA3, JP_AER_SOA4, JP_AER_SOA5, & - JP_AER_SOA6, JP_AER_SOA7, JP_AER_SOA8, & - JP_AER_SOA9, JP_AER_SOA10 -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -USE MODD_LG, ONLY: CLGNAMES -USE MODD_DUST, ONLY: CDUSTNAMES, LDUST, NMODE_DST -USE MODD_SALT, ONLY: CSALTNAMES -USE MODD_NSV -USE MODD_DIAG_IN_RUN -! -USE MODE_MODELN_HANDLER -USE MODE_DUST_PSD +USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend, & + nsv_lima_beg, nsv_lima_end +USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN +! USE MODE_AERO_PSD +USE MODE_DUST_PSD +USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX use mode_msg use mode_write_diachro, only: Write_diachro ! @@ -404,72 +391,21 @@ IF (LDIAG_IN_RUN) THEN ENDIF ! IF (SIZE(TPFLYER%SV,2)>=1) THEN - ! User scalar variables - DO JSV = 1,NSV_USER - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A2,I3.3)') 'Sv',JSV - YUNIT (JPROC) = 'kg kg-1' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) - END DO - ! microphysical C2R2 scheme scalar variables - DO JSV = NSV_C2R2BEG,NSV_C2R2END - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - YUNIT (JPROC) = 'm-3' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) - END DO - ! microphysical C3R5 scheme additional scalar variables - DO JSV = NSV_C1R3BEG,NSV_C1R3END - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - YUNIT (JPROC) = 'm-3' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) - END DO -! LIMA variables - DO JSV=NSV_LIMA_BEG,NSV_LIMA_END - JPROC = JPROC+1 + ! Scalar variables + DO JSV = 1, NSV + JPROC = JPROC + 1 YTITLE(JPROC) = TRIM( TSVLIST(JSV)%CMNHNAME ) - YUNIT(JPROC) = TRIM( TSVLIST(JSV)%CUNITS ) - YCOMMENT(JPROC) = ' ' - - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) - END DO - ! electrical scalar variables - DO JSV = NSV_ELECBEG,NSV_ELECEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - YUNIT (JPROC) = 'C' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) - END DO - ! chemical scalar variables - DO JSV = NSV_CHEMBEG,NSV_CHEMEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CNAMES(JSV-NSV_CHEMBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9 - END DO - ! LiNOX passive tracer - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A5)') 'LiNOx' - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9 - END DO - ! aerosol scalar variables - DO JSV = NSV_AERBEG,NSV_AEREND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CAERONAMES(JSV-NSV_AERBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9 + YCOMMENT(JPROC) = '' + IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN + YUNIT(JPROC) = 'ppb' + ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb + ELSE + YUNIT(JPROC) = TRIM( TSVLIST(JSV)%CUNITS ) + ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) + END IF END DO + IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN ALLOCATE (ZSV(1,1,size(tpflyer%tpdates),NSV_AER)) @@ -485,7 +421,7 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR) ENDDO ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) ) & - / ( 1. + ZRHO(1,1,:) ) + / ( 1. + ZRHO(1,1,:) ) ELSE ZRHO(1,1,:) = TPFLYER%TH(:) ENDIF @@ -623,19 +559,12 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN WRITE(YTITLE(JPROC),'(A4,I1)')'MDUST',JSV YUNIT (JPROC) = 'ug m-3' WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS DUST AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_DST,JSV) + ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_DST,JSV) ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG,ZPTOTA) + DEALLOCATE (ZSV,ZRHO) + DEALLOCATE (ZN0,ZRG,ZSIG,ZPTOTA) END IF -! dust scalar variables - DO JSV = NSV_DSTBEG,NSV_DSTEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9 - END DO + IF ((LDUST).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN ALLOCATE (ZSV(1,1,size(tpflyer%tpdates),NSV_DST)) ALLOCATE (ZRHO(1,1,size(tpflyer%tpdates))) @@ -649,7 +578,7 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR) ENDDO ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) ) & - / ( 1. + ZRHO(1,1,:) ) + / ( 1. + ZRHO(1,1,:) ) ELSE ZRHO(1,1,:) = TPFLYER%TH(:) ENDIF @@ -676,17 +605,9 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV) ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) + DEALLOCATE (ZSV,ZRHO) + DEALLOCATE (ZN0,ZRG,ZSIG) END IF - ! sea salt scalar variables - DO JSV = NSV_SLTBEG,NSV_SLTEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9 - END DO ENDIF ! IF (SIZE(TPFLYER%TSRAD)>0) THEN diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90 index 1051579a1398fa49c74c2963fb96fce04e0b4236..23cec11a885bdf6ed99dc18b9fc0c55605a52b21 100644 --- a/src/MNH/write_lbn.f90 +++ b/src/MNH/write_lbn.f90 @@ -78,50 +78,38 @@ END MODULE MODI_WRITE_LB_n ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! S. Bielli 02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 10/03/2021: use scalar variable names for dust and salt +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_DIM_n -USE MODD_DYN_n -USE MODD_CONF_n +USE MODD_CH_AEROSOL, ONLY: JP_CH_CO, LAERINIT, LDEPOS_AER, LORILAM, NSP +USE MODD_CONF, ONLY: CPROGRAM +USE MODD_CONF_n, ONLY: LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG, LUSERH, NRR +USE MODD_DUST, ONLY: LDEPOS_DST, LDSTINIT, LDSTPRES, LDUST +USE MODD_DYN_n, ONLY: LHORELAX_RV, LHORELAX_RC, LHORELAX_RR, LHORELAX_RI, LHORELAX_RS, & + LHORELAX_RG, LHORELAX_RH, LHORELAX_SV, LHORELAX_TKE, LHORELAX_UVWTH, & + NRIMX, NRIMY, & + NSIZELBX_ll, NSIZELBXR_ll, NSIZELBXSV_ll, NSIZELBXTKE_ll, NSIZELBXU_ll, & + NSIZELBY_ll, NSIZELBYR_ll, NSIZELBYSV_ll, NSIZELBYTKE_ll, NSIZELBYV_ll +use modd_field, only: tfieldmetadata, NMNHDIM_UNKNOWN, TYPELOG, TYPEREAL +USE MODD_GRID_n, ONLY: XZZ +USE MODD_IO, ONLY: TFILEDATA USE MODD_LSFIELD_n -USE MODD_LUNIT_n -USE MODD_PARAM_n -USE MODD_TURB_n USE MODD_NSV -USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IFN -USE MODD_PARAM_n -! +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT, NLONGNAMELGTMAX, NMNHNAMELGTMAX +USE MODD_PARAM_n, ONLY: CTURB +USE MODD_REF, ONLY: XRHODREFZ +USE MODD_SALT, ONLY: LDEPOS_SLT, LSALT, LSLTINIT, LSLTPRES + USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Field_write_lb -USE MODE_ll -USE MODE_MSG -USE MODE_MODELN_HANDLER -USE MODE_TOOLS, ONLY: UPCASE -! -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_CH_M9_n, ONLY: CNAMES, CICNAMES -USE MODD_LG, ONLY: CLGNAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -USE MODD_CH_AEROSOL -USE MODD_CH_AERO_n +USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX + USE MODI_CH_AER_REALLFI_n -USE MODD_CONF -USE MODD_REF, ONLY : XRHODREFZ -USE MODD_CONF, ONLY : CPROGRAM -USE MODD_GRID_n, ONLY : XZZ -USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT -USE MODD_DUST -USE MODD_SALT USE MODI_DUSTLFI_n USE MODI_SALTLFI_n -USE MODD_PARAMETERS, ONLY: JPHEXT, NMNHNAMELGTMAX -USE MODD_IO, ONLY: TFILEDATA -use modd_field, only: tfieldmetadata, NMNHDIM_UNKNOWN, TYPELOG, TYPEREAL -! -! + IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -130,45 +118,36 @@ TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics ! !* 0.2 Declarations of local variables ! -INTEGER :: ILUOUT ! logical unit -! INTEGER :: IRR ! Index for moist variables INTEGER :: JRR,JSV ! loop index for moist and scalar variables ! LOGICAL :: GHORELAX_R, GHORELAX_SV ! global hor. relax. informations -INTEGER :: IRIMX,IRIMY ! size of the RIM zone CHARACTER (LEN=1), DIMENSION (7) :: YC ! array with the prefix of the moist variables LOGICAL, DIMENSION (7) :: GUSER ! array with the use indicator of the moist variables REAL, DIMENSION(SIZE(XLBXSVM, 1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)) :: ZRHODREFX REAL, DIMENSION(SIZE(XLBYSVM, 1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)) :: ZRHODREFY INTEGER :: JK INTEGER :: IMI ! Current model index -INTEGER :: I INTEGER :: ILBX,ILBY INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE -INTEGER :: IIU, IJU, IKU REAL, DIMENSION(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)) :: ZLBXZZ REAL, DIMENSION(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)) :: ZLBYZZ -CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE +CHARACTER(LEN=NLONGNAMELGTMAX) :: YLONGNAME_BASE TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 1. SOME INITIALIZATIONS ! -------------------- ! -ILUOUT = TLUOUT%NLU -! IMI = GET_CURRENT_MODEL_INDEX() IIB=JPHEXT+1 IIE=SIZE(XZZ,1)-JPHEXT -IIU=SIZE(XZZ,1) IJB=JPHEXT+1 IJE=SIZE(XZZ,2)-JPHEXT -IJU=SIZE(XZZ,2) IKB=JPVEXT+1 IKE=SIZE(XZZ,3)-JPVEXT -IKU=SIZE(XZZ,3) ! ! 2. WRITE THE DIMENSION OF LB FIELDS ! -------------------------------- @@ -229,13 +208,14 @@ IF (NRR >=1) THEN YC(:)=(/"V","C","R","I","S","G","H"/) IRR=0 ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CUNITS = 'kg kg-1', & + CDIR = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + ! Loop on moist variables DO JRR=1,7 IF (GUSER(JRR)) THEN @@ -278,589 +258,99 @@ IF (NSV >=1) THEN NTYPE = TYPELOG, & NDIMS = 0, & LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,GHORELAX_SV) -! - IRIMX =(NSIZELBXSV_ll-2*JPHEXT)/2 - IRIMY =(NSIZELBYSV_ll-2*JPHEXT)/2 - IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1,NSV_USER - IF(NSIZELBXSV_ll /= 0) THEN - WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBXSVM',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBYSVM',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ! - IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG,NSV_C2R2END - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ! - IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG,NSV_C1R3END - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF + CALL IO_Field_write( TPFILE, TZFIELD, GHORELAX_SV ) + + IF ( LORILAM .OR. LDUST .OR. LSALT ) THEN + DO JK = 1, SIZE( XLBXSVM, 3 ) + ZRHODREFX(:,:,JK) = XRHODREFZ(JK) END DO + DO JK = 1, SIZE( XLBYSVM, 3 ) + ZRHODREFY(:,:,JK) = XRHODREFZ(JK) + ENDDO END IF -! -! LIMA: CCN and IFN scalar variables -! - IF (CCLOUD=='LIMA' ) THEN - DO JSV = NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1 - TZFIELD = TSVLIST(JSV) - TZFIELD%CDIR = '' - TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN - YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) - ! - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) - TZFIELD%CLONGNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) - WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) '2_Y_Z_', 'LBXSVM', JSV - TZFIELD%CLBTYPE = 'LBX' - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - TZFIELD%CLONGNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) 'X_2_Z_', 'LBYSVM', JSV - TZFIELD%CLBTYPE = 'LBY' - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - ! - DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 - TZFIELD = TSVLIST(JSV) - TZFIELD%CDIR = '' - TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN - YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) - ! - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) - TZFIELD%CLONGNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) - WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) '2_Y_Z_', 'LBXSVM', JSV - TZFIELD%CLBTYPE = 'LBX' - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - TZFIELD%CLONGNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) 'X_2_Z_', 'LBYSVM', JSV - TZFIELD%CLBTYPE = 'LBY' - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO + + IF ( LORILAM ) THEN + IF ( NSIZELBXSV_ll /= 0 ) XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX( XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0. ) + IF ( NSIZELBYSV_ll /= 0 ) XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX( XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0. ) + IF ( LDEPOS_AER(IMI) .AND. ( NSIZELBXSV_ll /= 0 ) ) & + XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX( XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0. ) + IF ( LDEPOS_AER(IMI) .AND. ( NSIZELBYSV_ll /= 0 ) ) & + XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX( XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0. ) + IF ( LAERINIT ) THEN ! GRIBEX CASE (aerosols initialization) + IF ( ( NSIZELBXSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSP > 1 ) ) & + CALL CH_AER_REALLFI_n( XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND), XLBXSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), ZRHODREFX ) + IF ( ( NSIZELBYSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSP > 1 ) ) & + CALL CH_AER_REALLFI_n( XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND), XLBYSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), ZRHODREFY ) + END IF END IF -! -! ELEC -! - IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO + + IF ( LDUST ) THEN + IF ( NSIZELBXSV_ll /= 0 ) XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX( XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0. ) + IF ( NSIZELBYSV_ll /= 0 ) XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX( XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0. ) + IF ( LDEPOS_DST(IMI) .AND. ( NSIZELBXSV_ll /= 0 ) ) & + XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX( XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0. ) + IF ( LDEPOS_DST(IMI) .AND. ( NSIZELBYSV_ll /= 0 ) ) & + XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX( XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0. ) + IF ( LDSTINIT .OR. LDSTPRES ) THEN ! GRIBEX case (dust initialization) + IF ( ( NSIZELBXSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_DST > 1 ) ) & + CALL DUSTLFI_n( XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFX ) + IF ( ( NSIZELBYSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_DST > 1 ) ) & + CALL DUSTLFI_n( XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY ) + END IF END IF - ! - ! - IF (LORILAM) THEN - DO JK=1,SIZE(XLBXSVM,3) - ZRHODREFX(:,:,JK) = XRHODREFZ(JK) - ZRHODREFY(:,:,JK) = XRHODREFZ(JK) - ENDDO - ! - IF (NSIZELBXSV_ll /= 0) & - XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0.) - IF (NSIZELBYSV_ll /= 0) & - XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0.) - IF (LDEPOS_AER(IMI).AND.(NSIZELBXSV_ll /= 0)) & - XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX(XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0.) - IF (LDEPOS_AER(IMI).AND.(NSIZELBYSV_ll /= 0)) & - XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX(XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0.) - IF (LAERINIT) THEN ! GRIBEX CASE (aerosols initialization) - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSP > 1)) & - CALL CH_AER_REALLFI_n(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBXSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFX) - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSP > 1)) & - CALL CH_AER_REALLFI_n(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBYSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFY) - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSP > 1)) & - CALL CH_AER_REALLFI_n(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBXSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFX) - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSP > 1)) & - CALL CH_AER_REALLFI_n(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBYSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFY) + + IF ( LSALT ) THEN + IF ( SIZE( ZLBXZZ ) > 0 ) THEN + ILBX = SIZE( ZLBXZZ, 1 ) / 2 - 1 + ZLBXZZ(1:ILBX+1,:,:) = XZZ(IIB-1:IIB-1+ILBX,:,:) + ZLBXZZ(ILBX+2:2*ILBX+2,:,:) = XZZ(IIE+1-ILBX:IIE+1,:,:) + ENDIF + IF ( SIZE( ZLBYZZ ) > 0 ) THEN + ILBY = SIZE( ZLBYZZ, 2 ) / 2 - 1 + ZLBYZZ(:,1:ILBY+1,:) = XZZ(:,IJB-1:IJB-1+ILBY,:) + ZLBYZZ(:,ILBY+2:2*ILBY+2,:) = XZZ(:,IJE+1-ILBY:IJE+1,:) + ENDIF + IF ( NSIZELBXSV_ll /= 0 ) XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX( XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0. ) + IF ( NSIZELBYSV_ll /= 0 ) XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX( XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0. ) + IF ( LDEPOS_SLT(IMI) .AND. ( NSIZELBXSV_ll /= 0 ) ) & + XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX( XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0. ) + IF ( LDEPOS_SLT(IMI) .AND. ( NSIZELBYSV_ll /= 0 ) ) & + XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX( XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0. ) + IF ( LSLTINIT .OR. LSLTPRES ) THEN ! GRIBEX case (dust initialization) + IF ( ( NSIZELBXSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_SLT > 1 ) ) & + CALL SALTLFI_n( XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ ) + IF ( ( NSIZELBYSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_SLT > 1 ) ) & + CALL SALTLFI_n( XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ ) END IF - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERBEG,NSV_AEREND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - ! - IF (LDEPOS_AER(IMI)) THEN - DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF END IF - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHEMBEG,NSV_CHEMEND + + DO JSV = 1, NSV + TZFIELD = TSVLIST(JSV) + TZFIELD%CDIR = '' + TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN + YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) + YLONGNAME_BASE = TRIM( TZFIELD%CLONGNAME ) + IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' + TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE ) WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - ! - DO JSV = NSV_CHICBEG,NSV_CHICEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) + CALL IO_Field_write_lb( TPFILE, TZFIELD, NSIZELBXSV_ll, XLBXSVM(:,:,:,JSV) ) END IF - ! + IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' + TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE ) +!PW: TODO: comment a adapter (a la lecture aussi) WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - ! - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) + CALL IO_Field_write_lb( TPFILE, TZFIELD, NSIZELBYSV_ll, XLBYSVM(:,:,:,JSV) ) END IF END DO - ! - IF (LDUST) THEN - DO JK=1,size(XLBXSVM,3) - ZRHODREFX(:,:,JK) = XRHODREFZ(JK) - ENDDO - DO JK=1,size(XLBYSVM,3) - ZRHODREFY(:,:,JK) = XRHODREFZ(JK) - ENDDO - IF (NSIZELBXSV_ll /= 0) & - XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.) - IF (NSIZELBYSV_ll /= 0) & - XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.) - IF (LDEPOS_DST(IMI).AND.(NSIZELBXSV_ll /= 0)) & - XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX(XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0.) - IF (LDEPOS_DST(IMI).AND.(NSIZELBYSV_ll /= 0)) & - XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX(XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0.) - IF ((LDSTINIT).OR.(LDSTPRES)) THEN ! GRIBEX case (dust initialization) - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_DST > 1)) THEN - CALL DUSTLFI_n(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFX) - END IF - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_DST > 1)) THEN - CALL DUSTLFI_n(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY) - END IF - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1)) & - CALL DUSTLFI_n(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFX) - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1)) & - CALL DUSTLFI_n(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY) - END IF - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTBEG,NSV_DSTEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - IF (LDEPOS_DST(IMI)) THEN - DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ENDIF - ! - IF (LSALT) THEN - DO JK=1,size(XLBXSVM,3) - ZRHODREFX(:,:,JK) = XRHODREFZ(JK) - ENDDO - DO JK=1,size(XLBYSVM,3) - ZRHODREFY(:,:,JK) = XRHODREFZ(JK) - ENDDO - IIU = SIZE(XZZ,1) - IJU = SIZE(XZZ,2) - IKU = SIZE(XZZ,3) - IF (SIZE(ZLBXZZ) .NE. 0 ) THEN - ILBX=SIZE(ZLBXZZ,1)/2-1 - ZLBXZZ(1:ILBX+1,:,:) = XZZ(IIB-1:IIB-1+ILBX,:,:) - ZLBXZZ(ILBX+2:2*ILBX+2,:,:) = XZZ(IIE+1-ILBX:IIE+1,:,:) - ENDIF - IF (SIZE(ZLBYZZ) .NE. 0 ) THEN - ILBY=SIZE(ZLBYZZ,2)/2-1 - ZLBYZZ(:,1:ILBY+1,:) = XZZ(:,IJB-1:IJB-1+ILBY,:) - ZLBYZZ(:,ILBY+2:2*ILBY+2,:) = XZZ(:,IJE+1-ILBY:IJE+1,:) - ENDIF - IF (NSIZELBXSV_ll /= 0) & - XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0.) - IF (NSIZELBYSV_ll /= 0) & - XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0.) - IF (LDEPOS_SLT(IMI).AND.(NSIZELBXSV_ll /= 0)) & - XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX(XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0.) - IF (LDEPOS_SLT(IMI).AND.(NSIZELBYSV_ll /= 0)) & - XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX(XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0.) - IF ((LSLTINIT).OR.(LSLTPRES)) THEN ! GRIBEX case (dust initialization) - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ) - END IF - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ) - END IF - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ) - END IF - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ) - END IF - END IF - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTBEG,NSV_SLTEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - IF (LDEPOS_SLT(IMI)) THEN - DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ENDIF - ! - ! lagrangian variables - IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF -! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ! passive pollutants - IF (NSV_PPEND>=NSV_PPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_PPBEG,NSV_PPEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_PP' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_PP' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ! conditional sampling - IF (NSV_CSEND>=NSV_CSBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG,NSV_CSEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_CS' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_CS' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF -#ifdef MNH_FOREFIRE - ! ForeFire scalar variables - IF (NSV_FFEND>=NSV_FFBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FFBEG,NSV_FFEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_FF' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_FF' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF -#endif END IF ! !------------------------------------------------------------------------------- ! ! -END SUBROUTINE WRITE_LB_n +END SUBROUTINE WRITE_LB_n diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index 70c104339ad6c10e365cb0712b75dca0d528e2e6..a14c099e66da32835771f770310cd2664e6da1b0 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -145,115 +145,99 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG ! P. Wautelet 08/02/2019: minor bug: compute ZWORK36 only when needed ! S Bielli 02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 18/03/2020: remove ICE2 option -! B. Vie 06/2020 Add prognostic supersaturation for LIMA +! B. Vie 06/2020: Add prognostic supersaturation for LIMA ! P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL ! J.L Redelsperger 03/2021 Adding OCEAN LES Case and Autocoupled O-A LES +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_DIM_n -USE MODD_CONF -USE MODD_CONF_n -use modd_field, only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL -USE MODD_GRID -USE MODD_GRID_n -USE MODD_IO, ONLY : TFILEDATA -USE MODD_METRICS_n -USE MODD_TIME -USE MODD_TIME_n -USE MODD_DYN_n -USE MODD_FIELD_n -USE MODD_GR_FIELD_n -USE MODD_LSFIELD_n -USE MODD_PARAM_n -USE MODD_CURVCOR_n -USE MODD_REF -USE MODD_REF_n -USE MODD_LUNIT, ONLY : TLUOUT0 -USE MODD_LUNIT_n -USE MODD_TURB_n -USE MODD_RADIATIONS_n -USE MODD_FRC -USE MODD_PRECIP_n -USE MODD_CST -USE MODD_CLOUDPAR -USE MODD_DEEP_CONVECTION_n -USE MODD_PARAM_KAFR_n -USE MODD_NESTING -USE MODD_PARAMETERS +USE MODD_BLOWSNOW, ONLY: LBLOWSNOW, NBLOWSNOW3D +USE MODD_BLOWSNOW_n, ONLY: XSNWSUBL3D +USE MODD_CH_AERO_n, ONLY: XN3D, XRG3D, XSIG3D +USE MODD_CH_AEROSOL +USE MODD_CH_M9_n, ONLY: NEQAQ +USE MODD_CH_MNHC_n, ONLY: LCH_CONV_LINOX, LUSECHEM, XRTMIN_AQ +USE MODD_CONDSAMP, ONLY: LCONDSAMP +USE MODD_CONF, ONLY: CBIBUSER, CEQNSYS, CPROGRAM, L1D, L2D, LCARTESIAN, LFORCING, LPACK, LTHINSHELL, NBUGFIX, NMASDEV +USE MODD_CONF_n, ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT, & + LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG, LUSERH, & + LUSECI, NRR, NRRI, NRRL +USE MODD_CST, ONLY: XALPI, XAVOGADRO, XBETAI, XCI, XCL, XCPD, XCPV, XG, XGAMI, XLSTT, XLVTT, & + XMD, XMV, XP00, XPI, XRADIUS, XRHOLW, XRD, XRV, XTT +USE MODD_CSTS_DUST, ONLY: XDENSITY_DUST, XM3TOUM3, XMOLARWEIGHT_DUST +USE MODD_CURVCOR_n, ONLY: XCORIOZ +USE MODD_DEEP_CONVECTION_n, ONLY: XCG_RATE, XCG_TOTAL_NUMBER, XIC_RATE, XIC_TOTAL_NUMBER, XPACCONV, XPRCONV, XPRSCONV USE MODD_DIAG_FLAG +USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX +USE MODD_DUST, ONLY: LDEPOS_DST, LDUST, NMODE_DST +USE MODD_DYN_n, ONLY: LOCEAN +use modd_field, only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL +USE MODD_FIELD_n, ONLY: XCIT, XCLDFR, XPABSM, XPABST, XRT, XSIGS, XSRCT, XSVT, XTHT, XTKET, XUT, XVT, XWT, XZWS +USE MODD_FRC, ONLY: NFRC, XGXTHFRC, XGYTHFRC, XPGROUNDFRC, XRVFRC, XTENDRVFRC, XTENDTHFRC, XTHFRC, XUFRC, XVFRC, XWFRC +USE MODD_GRID, ONLY: XBETA, XLAT0, XLATORI, XLON0, XLONORI, XRPK +USE MODD_GRID_n, only: LSLEVE, XLAT, XLEN1, XLEN2, XLON, XZS, XXHAT, XYHAT, XZHAT, XZSMT, XZTOP, XZZ +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LSFIELD_n, ONLY: XLSRVM, XLSTHM, XLSUM, XLSVM, XLSWM +USE MODD_LUNIT, ONLY: TLUOUT0 +USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ +USE MODD_MPIF +USE MODD_NESTING, ONLY: NDXRATIO_ALL, NDYRATIO_ALL, NXOR_ALL, NYOR_ALL USE MODD_NSV -USE MODD_CH_M9_n, ONLY : CNAMES, NEQAQ -USE MODD_RAIN_C2R2_DESCR, ONLY : C2R2NAMES -USE MODD_ICE_C1R3_DESCR, ONLY : C1R3NAMES -USE MODD_ELEC_DESCR, ONLY : CELECNAMES -USE MODD_RAIN_C2R2_KHKO_PARAM -USE MODD_ICE_C1R3_PARAM -USE MODD_PARAM_ICE, ONLY : LSEDIC -USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM,& - LSCAV, LHHONI, LAERO_MASS, & - LLIMA_DIAG, & - NSPECIE, XMDIAM_IFN, XSIGMA_IFN, ZFRAC=>XFRAC,& - XR_MEAN_CCN, XLOGSIG_CCN -USE MODD_PARAM_LIMA_WARM, ONLY : CLIMA_WARM_CONC, CAERO_MASS -USE MODD_PARAM_LIMA_COLD, ONLY : CLIMA_COLD_CONC -USE MODD_LG, ONLY : CLGNAMES -USE MODD_PASPOL, ONLY : LPASPOL -USE MODD_CONDSAMP, ONLY : LCONDSAMP -! -USE MODD_DIAG_FLAG -USE MODD_RADAR, ONLY: XLAT_RAD,XELEV,& - XSTEP_RAD,NBRAD,NBELEV,NBAZIM,NBSTEPMAX,& - NCURV_INTERPOL,LATT,LCART_RAD,NPTS_H,NPTS_V,XGRID,& - LREFR,LDNDZ,NMAX,CNAME_RAD,NDIFF,& - XLON_RAD,XALT_RAD,XLAM_RAD,XDT_RAD,LWBSCS,LWREFL -use modd_precision, only: MNHREAL_MPI -! -USE MODI_RADAR_SIMULATOR -! -USE MODD_DUST -USE MODD_CSTS_DUST -USE MODD_SALT -USE MODD_BLOWSNOW -USE MODD_CH_AEROSOL -USE MODD_CH_AERO_n -USE MODD_CH_MNHC_n -USE MODE_DUST_PSD -USE MODE_SALT_PSD -USE MODE_BLOWSNOW_PSD -USE MODE_AERO_PSD +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT, XUNDEF +USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_CONC +USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM, & + LSCAV, LLIMA_DIAG +USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_CONC, CAERO_MASS +USE MODD_PARAM_n, ONLY: CCLOUD, CDCONV, CELEC, CSURF, CTURB +USE MODD_PASPOL, ONLY: LPASPOL +USE MODD_PRECIP_n, ONLY: XACDEP, XACPRC, XACPRG, XACPRH, XACPRR, XACPRS, XEVAP3D, & + XINDEP, XINPRC, XINPRG, XINPRH, XINPRR, XINPRR3D, XINPRS +use modd_precision, only: MNHREAL_MPI +USE MODD_RADAR, ONLY: CNAME_RAD, LATT, LCART_RAD, LDNDZ, LREFR, LWBSCS, LWREFL, & + NBAZIM, NBELEV, NBRAD, NBSTEPMAX, NCURV_INTERPOL, NDIFF, NMAX, NPTS_H, NPTS_V, & + XALT_RAD, XDT_RAD, XELEV, XGRID, XLAM_RAD, XLAT_RAD, XLON_RAD, XSTEP_RAD +USE MODD_REF, ONLY: LBOUSS, LCOUPLES, XEXNTOP, XEXNTOPO, XRHODREFZ, XRHODREFZO, XTHVREFZ, XTHVREFZO +USE MODD_REF_n, ONLY: XEXNREF, XRHODREF, XTHVREF +USE MODD_SALT, ONLY: LDEPOS_SLT, LSALT, NMODE_SLT +USE MODD_TIME, ONLY: TDTEXP, TDTSEG +USE MODD_TIME_n, ONLY: TDTCUR, TDTMOD +USE MODD_TURB_n, only: CTOM, XBL_DEPTH +USE MODD_VAR_ll, ONLY: NMNH_COMM_WORLD + +USE MODE_AERO_PSD, ONLY: PPP2AERO +USE MODE_BLOWSNOW_PSD, ONLY: PPP2SNOW +USE MODE_DUST_PSD, ONLY: PPP2DUST +use mode_field, only: Find_field_id_from_mnhname +use MODE_GATHER_ll, only: GATHERALL_FIELD_ll +USE MODE_GRIDPROJ, ONLY: SM_LATLON +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FILE, only: IO_File_close, IO_File_open +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list +USE MODE_MODELN_HANDLER, only: GET_CURRENT_MODEL_INDEX +use mode_msg +USE MODE_SALT_PSD, ONLY: PPP2SALT +USE MODE_THERMO, ONLY: QSAT, SM_FOES +USE MODE_TOOLS, ONLY: UPCASE +USE MODE_TOOLS_ll, ONLY: GET_DIM_EXT_ll, GET_INDICE_ll + +USE MODI_CALCSOUND +USE MODI_CLUSTERING +USE MODI_COMPUTE_MEAN_PRECIP +USE MODI_CONTRAV +USE MODI_GPS_ZENITH USE MODI_GRADIENT_M -USE MODI_GRADIENT_W USE MODI_GRADIENT_U USE MODI_GRADIENT_V -USE MODI_SHUMAN -USE MODI_RADAR_RAIN_ICE +USE MODI_GRADIENT_W USE MODI_INI_RADAR -USE MODI_COMPUTE_MEAN_PRECIP -USE MODI_UV_TO_ZONAL_AND_MERID -USE MODI_CALCSOUND -USE MODI_FREE_ATM_PROFILE -USE MODI_GPS_ZENITH -USE MODI_CONTRAV -! -use mode_field, only: Find_field_id_from_mnhname -USE MODE_GRIDPROJ -USE MODE_GATHER_ll -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_ll -use mode_msg -USE MODE_THERMO -USE MODE_TOOLS, ONLY: UPCASE -USE MODE_MODELN_HANDLER USE MODI_LIDAR -USE MODI_CLUSTERING -! -USE MODD_MPIF -USE MODD_VAR_ll +USE MODI_RADAR_RAIN_ICE +USE MODI_RADAR_SIMULATOR +USE MODI_SHUMAN +USE MODI_UV_TO_ZONAL_AND_MERID ! IMPLICIT NONE ! @@ -303,8 +287,8 @@ INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK1 integer :: ICURR,INBOUT,IERR ! REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NSP+NCARB+NSOA,JPMODE):: ZPTOTA -REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NMODE_DST*2):: ZSDSTDEP -REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NMODE_SLT*2):: ZSSLTDEP +REAL,DIMENSION(:,:,:,:), POINTER :: ZSDSTDEP +REAL,DIMENSION(:,:,:,:), POINTER :: ZSSLTDEP REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZSIG_DST, ZRG_DST, ZN0_DST REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZSIG_SLT, ZRG_SLT, ZN0_SLT REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZBET_SNW, ZRG_SNW @@ -1011,7 +995,7 @@ IF (LVAR_MRW .OR. LLIMA_DIAG) THEN ! TZFIELD%CMNHNAME = 'VRC' TZFIELD%CLONGNAME = 'VRC' - TZFIELD%CUNITS = '1' !vol/vol + TZFIELD%CUNITS = 'ppv' !vol/vol TZFIELD%CCOMMENT = 'X_Y_Z_VRC (vol/vol)' CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RCT)*XRHODREF(:,:,:)/1.E3) END IF @@ -1024,7 +1008,7 @@ IF (LVAR_MRW .OR. LLIMA_DIAG) THEN ! TZFIELD%CMNHNAME = 'VRR' TZFIELD%CLONGNAME = 'VRR' - TZFIELD%CUNITS = '1' !vol/vol + TZFIELD%CUNITS = 'ppv' !vol/vol TZFIELD%CCOMMENT = 'X_Y_Z_VRR (vol/vol)' CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RRT)*XRHODREF(:,:,:)/1.E3) END IF @@ -1068,76 +1052,52 @@ END IF ! User scalar variables ! individually in the file IF (LVAR_MRSV) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for scalar variables', & !Temporary name to ease identification - CSTDNAME = '', & - CUNITS = 'g kg-1', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! DO JSV = 1,NSV_USER - WRITE(TZFIELD%CMNHNAME,'(A4,I3.3)')'MRSV',JSV + TZFIELD = TSVLIST(JSV) + WRITE( TZFIELD%CMNHNAME, '( A4, I3.3 )' ) 'MRSV', JSV TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','MRSV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E3) + TZFIELD%CUNITS = 'g kg-1' + WRITE( TZFIELD%CCOMMENT, '( A, I3.3 )' ) 'Mixing Ratio for user Scalar Variable', JSV + CALL IO_Field_write( TPFILE, TZFIELD, XSVT(:,:,:,JSV) * 1.E3 ) END DO END IF ! microphysical C2R2 scheme scalar variables IF(LVAR_MRW) THEN - IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG,NSV_C2R2END - TZFIELD%CMNHNAME = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - IF (JSV < NSV_C2R2END) THEN - TZFIELD%CUNITS = 'cm-3' - ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6 - ELSE - TZFIELD%CUNITS = 'l-1' - ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-3 - END IF - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','MRSV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END DO - END IF + DO JSV = NSV_C2R2BEG,NSV_C2R2END + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + IF (JSV < NSV_C2R2END) THEN + TZFIELD%CUNITS = 'cm-3' + ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6 + ELSE + TZFIELD%CUNITS = 'l-1' + ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-3 + END IF + WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','MRSV',JSV + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) + END DO ! microphysical C3R5 scheme additional scalar variables - IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' + DO JSV = NSV_C1R3BEG,NSV_C1R3END + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' TZFIELD%CUNITS = 'l-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG,NSV_C1R3END - TZFIELD%CMNHNAME = TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E-3) - END DO - END IF + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E-3) + END DO END IF ! ! microphysical LIMA scheme scalar variables ! IF (LLIMA_DIAG) THEN IF (NSV_LIMA_END>=NSV_LIMA_BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic LIMA diag', & !Temporary name to ease identification + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END IF ! DO JSV = NSV_LIMA_BEG,NSV_LIMA_END @@ -1192,7 +1152,7 @@ IF (LLIMA_DIAG) THEN TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(5))//'T' END IF ! -! Supersaturation +! Supersaturation IF (JSV .EQ. NSV_LIMA_SPRO) THEN TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(5))//'T' END IF @@ -1235,36 +1195,127 @@ IF (LLIMA_DIAG) THEN END IF ! END IF +IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN + DO JSV = NSV_ELECBEG,NSV_ELECEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + IF ( JSV > NSV_ELECBEG .AND. JSV < NSV_ELECEND ) THEN + TZFIELD%CUNITS = 'C m-3' + WRITE( TZFIELD%CCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV + ELSE + TZFIELD%CUNITS = 'm-3' + WRITE( TZFIELD%CCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/m3)' + END IF + ZWORK31(:,:,:)=XSVT(:,:,:,JSV) * XRHODREF(:,:,:) ! C/kg --> C/m3 + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) + END DO +END IF +! +! Lagrangian variables +IF (LTRAJ) THEN + DO JSV = NSV_LGBEG, NSV_LGEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + WRITE(TZFIELD%CCOMMENT,'(A6,A20,I3.3,A4)')'X_Y_Z_','Lagrangian variable ',JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) + END DO + + ! X coordinate + DO JK=1,IKU + DO JJ=1,IJU + DO JI=1,IIU-1 + ZWORK31(JI,JJ,JK)=0.5*(XXHAT(JI)+XXHAT(JI+1)) + END DO + ZWORK31(IIU,JJ,JK)=2.*ZWORK31(IIU-1,JJ,JK) - ZWORK31(IIU-2,JJ,JK) + END DO + END DO + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'X', & + CSTDNAME = '', & + CLONGNAME = 'X', & + CUNITS = 'km', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_X coordinate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31*1e-3) + + ! Y coordinate + DO JK=1,IKU + DO JI=1,IIU + DO JJ=1,IJU-1 + ZWORK31(JI,JJ,JK)=0.5*(XYHAT(JJ)+XYHAT(JJ+1)) + END DO + ZWORK31(JI,IJU,JK)=2.*ZWORK31(JI,IJU-1,JK) - ZWORK31(JI,IJU-2,JK) + END DO + END DO + + TZFIELD%CMNHNAME = 'Y' + TZFIELD%CLONGNAME = 'Y' + TZFIELD%CCOMMENT = 'X_Y_Z_Y coordinate' + + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31*1e-3) +END IF +! +! Passive polluant scalar variables +IF (LPASPOL) THEN + ALLOCATE(ZRHOT( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3))) + ALLOCATE(ZTMP( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3))) +! +!* Density +! + ZRHOT(:,:,:)=XPABST(:,:,:)/(XRD*XTHT(:,:,:)*((XPABST(:,:,:)/XP00)**(XRD/XCPD))) +! +!* Conversion g/m3. ! -! chemical scalar variables in gas phase ppbv + ZRHOT(:,:,:)=ZRHOT(:,:,:)*1000.0 + ! + DO JSV = NSV_PPBEG, NSV_PPEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + TZFIELD%CUNITS = 'g m-3' + + ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV)*ZRHOT(:,:,:) ) + CALL IO_Field_write(TPFILE,TZFIELD,ZTMP) + END DO + + DEALLOCATE(ZTMP) + DEALLOCATE(ZRHOT) +END IF +! Conditional sampling variables +IF (LCONDSAMP) THEN + DO JSV = NSV_CSBEG, NSV_CSEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) + END DO +END IF +! chemical scalar variables in gas phase ppb IF (LCHEMDIAG) THEN DO JSV = NSV_CHGSBEG,NSV_CHGSEND - TZFIELD%CMNHNAME = TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))//'T' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ppb' - TZFIELD%CDIR = 'XY' + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + TZFIELD%CUNITS = 'ppb' WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) END DO END IF IF (LCHAQDIAG) THEN !aqueous concentration in M - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1 - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! ZWORK31(:,:,:)=0. DO JSV = NSV_CHACBEG, NSV_CHACBEG-1+NEQAQ/2 !cloud water - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + TZFIELD%CUNITS = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1 WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHAQ',JSV WHERE(((XRT(:,:,:,2)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ) ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,2)) @@ -1274,8 +1325,10 @@ IF (LCHAQDIAG) THEN !aqueous concentration in M ! ZWORK31(:,:,:)=0. DO JSV = NSV_CHACBEG+NEQAQ/2, NSV_CHACEND !rain water - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + TZFIELD%CUNITS = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1 WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHAQ',JSV WHERE(((XRT(:,:,:,3)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ) ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,3)) @@ -1293,325 +1346,226 @@ IF (LCHAQDIAG) THEN !aqueous concentration in M ! CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! END DO END IF - -! Passive polluant scalar variables -IF (LPASPOL) THEN - ALLOCATE(ZRHOT( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3))) - ALLOCATE(ZTMP( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3))) -! -!* Density -! - ZRHOT(:,:,:)=XPABST(:,:,:)/(XRD*XTHT(:,:,:)*((XPABST(:,:,:)/XP00)**(XRD/XCPD))) -! -!* Conversion g/m3. -! - ZRHOT(:,:,:)=ZRHOT(:,:,:)*1000.0 +! Aerosol +IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN + DO JSV = NSV_AERBEG, NSV_AEREND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','AERO',JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) + END DO ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'g m-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + IF (.NOT.(ASSOCIATED(XN3D))) & + ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) + IF (.NOT.(ASSOCIATED(XRG3D))) & + ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) + IF (.NOT.(ASSOCIATED(XSIG3D))) & + ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) ! - DO JSV = 1,NSV_PP - ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV+NSV_PPBEG-1)*ZRHOT(:,:,:) ) - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'PPT',JSV + CALL PPP2AERO(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND), XRHODREF, & + PSIG3D=XSIG3D, PRG3D=XRG3D, PN3D=XN3D, PCTOTA=ZPTOTA) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for aerosol modes', & + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + DO JJ=1,JPMODE + WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'RGA',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,ZTMP) - END DO - DEALLOCATE(ZTMP) - DEALLOCATE(ZRHOT) -END IF -! Conditional sampling variables -IF (LCONDSAMP) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG,NSV_CSEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'CST',JSV + TZFIELD%CUNITS = 'um' + WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'RG (nb) AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,XRG3D(:,:,:,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'RGAM',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - END DO -END IF -! -! Blowing snow variables -! -IF(LBLOWSNOW) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SNWSUBL3D', & - CSTDNAME = '', & - CLONGNAME = 'SNWSUBL3D', & - CUNITS = 'kg m-3 s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_INstantaneous 3D Drifting snow sublimation flux', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XSNWSUBL3D(:,:,:)) - ! - ZWORK21(:,:) = 0. - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+XSNWSUBL3D(:,:,JK) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW*3600*24 - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'COL_SNWSUBL', & - CSTDNAME = '', & - CLONGNAME = 'COL_SNWSUBL', & - CUNITS = 'mm day-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Column Sublimation Rate (mmSWE/day)', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:)) - ! - IF(.NOT.ALLOCATED(ZBET_SNW)) & - ALLOCATE(ZBET_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3))) - IF(.NOT.ALLOCATED(ZRG_SNW)) & - ALLOCATE(ZRG_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3))) - IF(.NOT.ALLOCATED(ZMA_SNW)) & - ALLOCATE(ZMA_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3),NBLOWSNOW3D)) - ! - CALL PPP2SNOW(XSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND),XRHODREF,& - PBET3D=ZBET_SNW, PRG3D=ZRG_SNW, PM3D=ZMA_SNW) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SNWRGA', & - CSTDNAME = '', & - CLONGNAME = 'SNWRGA', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'RG (mean) SNOW', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SNW(:,:,:)) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SNWBETA', & - CSTDNAME = '', & - CLONGNAME = 'SNWBETA', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'BETA SNOW', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZBET_SNW(:,:,:)) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SNWNOA', & - CSTDNAME = '', & - CLONGNAME = 'SNWNOA', & - CUNITS = 'm-3', & - CDIR = 'XY', & - CCOMMENT = 'NUM CONC SNOW (#/m3)', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,1)) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SNWMASS', & - CSTDNAME = '', & - CLONGNAME = 'SNWMASS', & - CUNITS = 'kg m-3', & - CDIR = 'XY', & - CCOMMENT = 'MASS CONC SNOW', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,2)) - ! - ZWORK21(:,:) = 0. - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+ZMA_SNW(:,:,JK,2) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THDS', & - CSTDNAME = '', & - CLONGNAME = 'THDS', & - CUNITS = 'mm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_THickness of Drifting Snow (mm SWE)', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:)) -END IF -! Lagrangian variables -IF (LTRAJ) THEN - TZFIELD%CSTDNAME = '' - !PW TODO: check units - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - TZFIELD%CMNHNAME = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T' + TZFIELD%CUNITS = 'um' + WRITE(TZFIELD%CCOMMENT,'(A20,I1)')'RG (m) AEROSOL MODE ',JJ + ZWORK31(:,:,:)=XRG3D(:,:,:,JJ) / (EXP(-3.*(LOG(XSIG3D(:,:,:,JJ)))**2)) + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) + ! + WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'N0A',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A20,I3.3,A4)')'X_Y_Z_','Lagrangian variable ',JSV,' (M)' - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - END DO - ! X coordinate - DO JK=1,IKU - DO JJ=1,IJU - DO JI=1,IIU-1 - ZWORK31(JI,JJ,JK)=0.5*(XXHAT(JI)+XXHAT(JI+1)) - END DO - ZWORK31(IIU,JJ,JK)=2.*ZWORK31(IIU-1,JJ,JK) - ZWORK31(IIU-2,JJ,JK) - END DO - END DO - TZFIELD%CMNHNAME = 'X' - TZFIELD%CLONGNAME = 'X' - TZFIELD%CCOMMENT = 'X_Y_Z_X coordinate' - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! Y coordinate - DO JK=1,IKU - DO JI=1,IIU - DO JJ=1,IJU-1 - ZWORK31(JI,JJ,JK)=0.5*(XYHAT(JJ)+XYHAT(JJ+1)) - END DO - ZWORK31(JI,IJU,JK)=2.*ZWORK31(JI,IJU-1,JK) - ZWORK31(JI,IJU-2,JK) - END DO - END DO - TZFIELD%CMNHNAME = 'Y' - TZFIELD%CLONGNAME = 'Y' - TZFIELD%CCOMMENT = 'X_Y_Z_Y coordinate' - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -END IF -! linox scalar variables -IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN - DO JSV = NSV_LNOXBEG,NSV_LNOXEND -!PW:BUG?: same name for all variables - TZFIELD%CMNHNAME = 'LINOXT' - TZFIELD%CSTDNAME = '' + TZFIELD%CUNITS = 'cm-3' + WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,XN3D(:,:,:,JJ)*1.E-6) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SIGA',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ppb' - TZFIELD%CDIR = 'XY' - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','LNOX',JSV - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) - END DO -END IF -IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - TZFIELD%CMNHNAME = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T' + TZFIELD%CUNITS = '1' + WRITE(TZFIELD%CCOMMENT,'(A19,I1)')'SIGMA AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,XSIG3D(:,:,:,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MSO4',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN - TZFIELD%CUNITS = 'C m-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - ELSE - TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)' + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS SO4 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SO4,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNO3',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NO3 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NO3,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNH3',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NH3 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NH3,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MH2O',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS H2O AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_H2O,JJ)) + ! + IF (NSOA .EQ. 10) THEN + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA1',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA1,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA2',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA2,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA3',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA3,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA4',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA4,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA5',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA5,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA6',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA6,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA7',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA7,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA8',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA8,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA9',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA9,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'MSOA10',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA10,JJ)) END IF - ZWORK31(:,:,:)=XSVT(:,:,:,JSV) * XRHODREF(:,:,:) ! C/kg --> C/m3 - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END DO + ! + WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MOC',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS OC AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_OC,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MBC',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS BC AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_BC,JJ)) + ENDDO END IF -! Sea Salt variables -IF (LSALT) THEN - IF(.NOT.ALLOCATED(ZSIG_SLT)) & - ALLOCATE(ZSIG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) - IF(.NOT.ALLOCATED(ZRG_SLT)) & - ALLOCATE(ZRG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) - IF(.NOT.ALLOCATED(ZN0_SLT)) & - ALLOCATE(ZN0_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CUNITS = 'ppb' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. +! Dust variables +IF (LDUST) THEN + IF(.NOT.ALLOCATED(ZSIG_DST)) & + ALLOCATE(ZSIG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) + IF(.NOT.ALLOCATED(ZRG_DST)) & + ALLOCATE(ZRG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) + IF(.NOT.ALLOCATED(ZN0_DST)) & + ALLOCATE(ZN0_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) ! - DO JSV = NSV_SLTBEG,NSV_SLTEND - TZFIELD%CMNHNAME = TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','SALT',JSV + DO JSV = NSV_DSTBEG, NSV_DSTEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','DUST',JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) END DO ! - CALL PPP2SALT(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND),XRHODREF,& - PSIG3D=ZSIG_SLT, PRG3D=ZRG_SLT, PN3D=ZN0_SLT) - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JJ=1,NMODE_SLT - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTRGA',JJ + CALL PPP2DUST(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND),XRHODREF,& + PSIG3D=ZSIG_DST, PRG3D=ZRG_DST, PN3D=ZN0_DST) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for dust modes', & + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + DO JJ=1,NMODE_DST + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTRGA',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) SALT MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SLT(:,:,:,JJ)) + WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) DUST MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZRG_DST(:,:,:,JJ)) ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTRGAM',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTRGAM',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) SALT MODE ',JJ - ZWORK31(:,:,:)=ZRG_SLT(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_SLT(:,:,:,JJ)))**2)) + WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) DUST MODE ',JJ + ZWORK31(:,:,:)=ZRG_DST(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_DST(:,:,:,JJ)))**2)) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTN0A',JJ + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTN0A',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 SALT MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZN0_SLT(:,:,:,JJ)) + WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 DUST MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZN0_DST(:,:,:,JJ)) ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTSIGA',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTSIGA',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = '1' - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA SALT MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_SLT(:,:,:,JJ)) - !SALT MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SLTMSS',JJ + WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA DUST MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_DST(:,:,:,JJ)) + !DUST MASS CONCENTRATION + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'DSTMSS',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'ug m-3' WRITE(TZFIELD%CCOMMENT,'(A14,I1)')'MASSCONC MODE ',JJ - ZWORK31(:,:,:)= ZN0_SLT(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) + ZWORK31(:,:,:)= ZN0_DST(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug + * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - !SALT BURDEN (g/m2) + !DUST BURDEN (g/m2) ZWORK21(:,:)=0.0 DO JK=IKB,IKE ZWORK31(:,:,JK) = ZWORK31(:,:,JK) *(XZZ(:,:,JK+1)-XZZ(:,:,JK)) & @@ -1624,7 +1578,7 @@ IF (LSALT) THEN ENDDO ENDDO ENDDO - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTBRDN',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTBRDN',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'g m-2' WRITE(TZFIELD%CCOMMENT,'(A6,I1)')'BURDEN',JJ @@ -1634,33 +1588,35 @@ IF (LSALT) THEN TZFIELD%NDIMS = 3 ENDDO END IF -IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN - ! - ZSSLTDEP=XSVT(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) +IF (LDUST.AND.LDEPOS_DST(IMI)) THEN + DO JSV = NSV_DSTBEG, NSV_DSTEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_DUSTDEP', JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) + END DO ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppb' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + ZSDSTDEP => XSVT(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) ! - DO JSV = 1,NSV_SLTDEP - TZFIELD%CMNHNAME = TRIM(UPCASE(CDESLTNAMES(JSV)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','SALTDEP',JSV - CALL IO_Field_write(TPFILE,TZFIELD,ZSSLTDEP(:,:,:,JSV)*1.E9) - END DO + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for dustdep modes', & + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! - DO JJ=1,NMODE_SLT + DO JJ=1,NMODE_DST ! FOR CLOUDS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ TZFIELD%CUNITS = 'm-3' ! CLOUD: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ) &!==>molec_{aer}/molec_{air} + ZWORK31(:,:,:) = ZSDSTDEP(:,:,:,JJ) &!==>molec_{aer}/molec_{air} *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} /XDENSITY_DUST &!==>m3_{aer}/m3_{air} @@ -1668,45 +1624,45 @@ IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN /(XPI*4./3.) !==>um3_{aer}/m3_{air} !==>volume 3rd moment !CLOUD: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:) = ZWORK31(:,:,:)/ & - ((ZRG_SLT(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2)) + ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & + ((ZRG_DST(:,:,:,JJ)**3)* & + EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2)) !CLOUD: RETURN TO CONCENTRATION #/m3 ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & - (XAVOGADRO*XRHODREF(:,:,:)) + (XAVOGADRO*XRHODREF(:,:,:)) !CLOUD: Get number concentration (#/molec_{air}==>#/m3) - ZWORK31(:,:,:)= & - ZWORK31(:,:,:) & !#/molec_{air} - * XAVOGADRO & !==>#/mole - / XMD & !==>#/kg_{air} - * XRHODREF(:,:,:) !==>#/m3 + ZWORK31(:,:,:)= & + ZWORK31(:,:,:) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * XRHODREF(:,:,:) !==>#/m3 CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! CLOUD: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ TZFIELD%CUNITS = 'ug m-3' ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) + * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! FOR RAIN DROPS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ+NMODE_SLT + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ+NMODE_DST TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_SLT + WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_DST TZFIELD%CUNITS = 'm-3' ! RAIN: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ+NMODE_SLT) &!==>molec_{aer}/molec_{air} - *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} - *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} - /XDENSITY_DUST &!==>m3_{aer}/m3_{air} - *XM3TOUM3 &!==>um3_{aer}/m3_{air} - /(XPI*4./3.) !==>um3_{aer}/m3_{air} - !==>volume 3rd moment + ZWORK31(:,:,:)=ZSDSTDEP(:,:,:,JJ+NMODE_DST) &!==>molec_{aer}/molec_{air} + *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} + *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} + *(1.d0/XDENSITY_DUST) &!==>m3_{aer}/m3_{air} + *XM3TOUM3 &!==>um3_{aer}/m3_{air} + /(XPI*4./3.) !==>um3_{aer}/m3_{air} + !==>volume 3rd moment !RAIN: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & - ((ZRG_SLT(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2)) + ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & + ((ZRG_DST(:,:,:,JJ)**3)* & + EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2)) !RAIN: RETURN TO CONCENTRATION #/m3 ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & (XAVOGADRO*XRHODREF(:,:,:)) @@ -1718,78 +1674,84 @@ IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN * XRHODREF(:,:,:) !==>#/m3 CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! RAIN: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ+NMODE_SLT + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ+NMODE_DST TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_SLT + WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_DST TZFIELD%CUNITS = 'ug m-3' ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) + * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END DO + + ZSDSTDEP => NULL() ! END IF -! Dust variables -IF (LDUST) THEN - IF(.NOT.ALLOCATED(ZSIG_DST)) & - ALLOCATE(ZSIG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) - IF(.NOT.ALLOCATED(ZRG_DST)) & - ALLOCATE(ZRG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) - IF(.NOT.ALLOCATED(ZN0_DST)) & - ALLOCATE(ZN0_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppb' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. +! Sea Salt variables +IF (LSALT) THEN + IF(.NOT.ALLOCATED(ZSIG_SLT)) & + ALLOCATE(ZSIG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) + IF(.NOT.ALLOCATED(ZRG_SLT)) & + ALLOCATE(ZRG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) + IF(.NOT.ALLOCATED(ZN0_SLT)) & + ALLOCATE(ZN0_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) ! - DO JSV = NSV_DSTBEG,NSV_DSTEND - TZFIELD%CMNHNAME = TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','DUST',JSV + DO JSV = NSV_SLTBEG, NSV_SLTEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALT', JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) END DO ! - CALL PPP2DUST(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND),XRHODREF,& - PSIG3D=ZSIG_DST, PRG3D=ZRG_DST, PN3D=ZN0_DST) - DO JJ=1,NMODE_DST - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTRGA',JJ + CALL PPP2SALT(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND),XRHODREF,& + PSIG3D=ZSIG_SLT, PRG3D=ZRG_SLT, PN3D=ZN0_SLT) + ! + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for salt modes', & + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + ! + DO JJ=1,NMODE_SLT + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTRGA',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) DUST MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZRG_DST(:,:,:,JJ)) + WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) SALT MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SLT(:,:,:,JJ)) ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTRGAM',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTRGAM',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) DUST MODE ',JJ - ZWORK31(:,:,:)=ZRG_DST(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_DST(:,:,:,JJ)))**2)) + WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) SALT MODE ',JJ + ZWORK31(:,:,:)=ZRG_SLT(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_SLT(:,:,:,JJ)))**2)) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTN0A',JJ + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTN0A',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 DUST MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZN0_DST(:,:,:,JJ)) + WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 SALT MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZN0_SLT(:,:,:,JJ)) ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTSIGA',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTSIGA',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = '1' - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA DUST MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_DST(:,:,:,JJ)) - !DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'DSTMSS',JJ + WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA SALT MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_SLT(:,:,:,JJ)) + !SALT MASS CONCENTRATION + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SLTMSS',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'ug m-3' WRITE(TZFIELD%CCOMMENT,'(A14,I1)')'MASSCONC MODE ',JJ - ZWORK31(:,:,:)= ZN0_DST(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) + ZWORK31(:,:,:)= ZN0_SLT(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug + * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - !DUST BURDEN (g/m2) + !SALT BURDEN (g/m2) ZWORK21(:,:)=0.0 DO JK=IKB,IKE ZWORK31(:,:,JK) = ZWORK31(:,:,JK) *(XZZ(:,:,JK+1)-XZZ(:,:,JK)) & @@ -1802,7 +1764,7 @@ IF (LDUST) THEN ENDDO ENDDO ENDDO - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTBRDN',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTBRDN',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'g m-2' WRITE(TZFIELD%CCOMMENT,'(A6,I1)')'BURDEN',JJ @@ -1812,33 +1774,36 @@ IF (LDUST) THEN TZFIELD%NDIMS = 3 ENDDO END IF -IF (LDUST.AND.LDEPOS_DST(IMI)) THEN +IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN ! - ZSDSTDEP=XSVT(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) + DO JSV = NSV_SLTDEPBEG, NSV_SLTDEPEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALTDEP', JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) + END DO ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppb' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + ZSSLTDEP => XSVT(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) ! - DO JSV = 1,NSV_DSTDEP - TZFIELD%CMNHNAME = TRIM(UPCASE(CDEDSTNAMES(JSV)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','DUSTDEP',JSV - CALL IO_Field_write(TPFILE,TZFIELD,ZSDSTDEP(:,:,:,JSV)*1.E9) - END DO + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for saltdep modes', & + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! - DO JJ=1,NMODE_DST + DO JJ=1,NMODE_SLT ! FOR CLOUDS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ TZFIELD%CUNITS = 'm-3' ! CLOUD: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:) = ZSDSTDEP(:,:,:,JJ) &!==>molec_{aer}/molec_{air} + ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ) &!==>molec_{aer}/molec_{air} *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} /XDENSITY_DUST &!==>m3_{aer}/m3_{air} @@ -1846,45 +1811,45 @@ IF (LDUST.AND.LDEPOS_DST(IMI)) THEN /(XPI*4./3.) !==>um3_{aer}/m3_{air} !==>volume 3rd moment !CLOUD: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & - ((ZRG_DST(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2)) + ZWORK31(:,:,:) = ZWORK31(:,:,:)/ & + ((ZRG_SLT(:,:,:,JJ)**3)* & + EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2)) !CLOUD: RETURN TO CONCENTRATION #/m3 ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & - (XAVOGADRO*XRHODREF(:,:,:)) + (XAVOGADRO*XRHODREF(:,:,:)) !CLOUD: Get number concentration (#/molec_{air}==>#/m3) - ZWORK31(:,:,:)= & - ZWORK31(:,:,:) & !#/molec_{air} - * XAVOGADRO & !==>#/mole - / XMD & !==>#/kg_{air} - * XRHODREF(:,:,:) !==>#/m3 + ZWORK31(:,:,:)= & + ZWORK31(:,:,:) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * XRHODREF(:,:,:) !==>#/m3 CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! CLOUD: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ TZFIELD%CUNITS = 'ug m-3' ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) + * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! FOR RAIN DROPS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ+NMODE_DST + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ+NMODE_SLT TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_DST + WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_SLT TZFIELD%CUNITS = 'm-3' ! RAIN: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:)=ZSDSTDEP(:,:,:,JJ+NMODE_DST) &!==>molec_{aer}/molec_{air} - *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} - *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} - *(1.d0/XDENSITY_DUST) &!==>m3_{aer}/m3_{air} - *XM3TOUM3 &!==>um3_{aer}/m3_{air} - /(XPI*4./3.) !==>um3_{aer}/m3_{air} - !==>volume 3rd moment + ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ+NMODE_SLT) &!==>molec_{aer}/molec_{air} + *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} + *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} + /XDENSITY_DUST &!==>m3_{aer}/m3_{air} + *XM3TOUM3 &!==>um3_{aer}/m3_{air} + /(XPI*4./3.) !==>um3_{aer}/m3_{air} + !==>volume 3rd moment !RAIN: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & - ((ZRG_DST(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2)) + ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & + ((ZRG_SLT(:,:,:,JJ)**3)* & + EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2)) !RAIN: RETURN TO CONCENTRATION #/m3 ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & (XAVOGADRO*XRHODREF(:,:,:)) @@ -1896,167 +1861,147 @@ IF (LDUST.AND.LDEPOS_DST(IMI)) THEN * XRHODREF(:,:,:) !==>#/m3 CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! RAIN: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ+NMODE_DST + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ+NMODE_SLT TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_DST + WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_SLT TZFIELD%CUNITS = 'ug m-3' ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) + * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END DO + + ZSSLTDEP => NULL() ! END IF -! Aerosol -IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppb' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. +! +! Blowing snow variables +! +IF(LBLOWSNOW) THEN + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SNWSUBL3D', & + CSTDNAME = '', & + CLONGNAME = 'SNWSUBL3D', & + CUNITS = 'kg m-3 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous 3D Drifting snow sublimation flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,XSNWSUBL3D(:,:,:)) ! - DO JSV = NSV_AERBEG,NSV_AEREND - TZFIELD%CMNHNAME = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','AERO',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) + ZWORK21(:,:) = 0. + DO JK = IKB,IKE + ZWORK21(:,:) = ZWORK21(:,:)+XSNWSUBL3D(:,:,JK) * & + (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW*3600*24 END DO + ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit ! - IF (.NOT.(ASSOCIATED(XN3D))) & - ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XRG3D))) & - ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XSIG3D))) & - ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'COL_SNWSUBL', & + CSTDNAME = '', & + CLONGNAME = 'COL_SNWSUBL', & + CUNITS = 'mm day-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Column Sublimation Rate (mmSWE/day)', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:)) ! - CALL PPP2AERO(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND), XRHODREF, & - PSIG3D=XSIG3D, PRG3D=XRG3D, PN3D=XN3D, PCTOTA=ZPTOTA) - DO JJ=1,JPMODE - TZFIELD%CMNHNAME = 'RGA' - TZFIELD%CLONGNAME = 'RGA' - TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'RG (nb) AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,XRG3D(:,:,:,JJ)) - ! - TZFIELD%CMNHNAME = 'RGAM' - TZFIELD%CLONGNAME = 'RGAM' - TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A20,I1)')'RG (m) AEROSOL MODE ',JJ - ZWORK31(:,:,:)=XRG3D(:,:,:,JJ) / (EXP(-3.*(LOG(XSIG3D(:,:,:,JJ)))**2)) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! - WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'N0A',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'cm-3' - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,XN3D(:,:,:,JJ)*1.E-6) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SIGA',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '1' - WRITE(TZFIELD%CCOMMENT,'(A19,I1)')'SIGMA AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,XSIG3D(:,:,:,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MSO4',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS SO4 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SO4,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNO3',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NO3 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NO3,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNH3',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NH3 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NH3,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MH2O',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS H2O AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_H2O,JJ)) - ! - IF (NSOA .EQ. 10) THEN - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA1',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA1,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA2',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA2,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA3',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA3,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA4',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA4,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA5',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA5,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA6',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA6,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA7',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA7,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA8',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA8,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA9',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA9,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'MSOA10',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA10,JJ)) - END IF - ! - WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MOC',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS OC AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_OC,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MBC',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS BC AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_BC,JJ)) - ENDDO + IF(.NOT.ALLOCATED(ZBET_SNW)) & + ALLOCATE(ZBET_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3))) + IF(.NOT.ALLOCATED(ZRG_SNW)) & + ALLOCATE(ZRG_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3))) + IF(.NOT.ALLOCATED(ZMA_SNW)) & + ALLOCATE(ZMA_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3),NBLOWSNOW3D)) + ! + CALL PPP2SNOW(XSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND),XRHODREF,& + PBET3D=ZBET_SNW, PRG3D=ZRG_SNW, PM3D=ZMA_SNW) + ! + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SNWRGA', & + CSTDNAME = '', & + CLONGNAME = 'SNWRGA', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'RG (mean) SNOW', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SNW(:,:,:)) + ! + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SNWBETA', & + CSTDNAME = '', & + CLONGNAME = 'SNWBETA', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'BETA SNOW', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZBET_SNW(:,:,:)) + ! + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SNWNOA', & + CSTDNAME = '', & + CLONGNAME = 'SNWNOA', & + CUNITS = 'm-3', & + CDIR = 'XY', & + CCOMMENT = 'NUM CONC SNOW (#/m3)', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,1)) + ! + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SNWMASS', & + CSTDNAME = '', & + CLONGNAME = 'SNWMASS', & + CUNITS = 'kg m-3', & + CDIR = 'XY', & + CCOMMENT = 'MASS CONC SNOW', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,2)) + ! + ZWORK21(:,:) = 0. + DO JK = IKB,IKE + ZWORK21(:,:) = ZWORK21(:,:)+ZMA_SNW(:,:,JK,2) * & + (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW + END DO + ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THDS', & + CSTDNAME = '', & + CLONGNAME = 'THDS', & + CUNITS = 'mm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_THickness of Drifting Snow (mm SWE)', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:)) +END IF +! linox scalar variables +IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN + DO JSV = NSV_LNOXBEG, NSV_LNOXEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_LNOX', JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) + END DO END IF ! !* Large Scale variables @@ -3422,7 +3367,7 @@ IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN !large-scale model IF (LMEAN_PR .AND. LUSERR) THEN TZFIELD = TFIELDMETADATA( & - CSTDNAME = 'generic LS_ACTOPR', & !Temporary name to ease identification + CMNHNAME = 'generic LS_ACTOPR', & !Temporary name to ease identification CUNITS = 'mm', & CDIR = 'XY', & CCOMMENT = 'X_Y_Large Scale ACccumulated TOtal Precipitation Rate', & @@ -4221,12 +4166,6 @@ ELSEIF (CBLTOP == 'RICHA') THEN ! DEALLOCATE(ZRIB,ZSHMIX) ENDIF - ! used before 5-3-1 version - ! - !ZGAMREF=3.5E-3 ! K/m - !ZWORK31(:,:,1:IKU-1)=0.5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU)) - !ZWORK31(:,:,IKU)=2.*ZWORK31(:,:,IKU-1)-ZWORK31(:,:,IKU-2) - !CALL FREE_ATM_PROFILE(ZTHETAV,ZWORK31,XZS,XZSMT,ZGAMREF,ZWORK32,ZWORK33) ! IF (ALLOCATED(ZTHETAV)) DEALLOCATE(ZTHETAV) ! diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index 72c472fc49504a74fa47dd44e2328d83d00bd235..fe258339c24f28ce5f521bd18685baccdd86b2d8 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -90,65 +90,53 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! J.-P. Chaboureau 07/2018 bug fix on XEMIS when calling CALL_RTTOVxx !! J.-P. Chaboureau 09/04/2021 add the call to RTTOV13 +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODE_ll -USE MODD_CST -use modd_field, only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS -USE MODD_CONF_n -USE MODD_CONF -USE MODD_DEEP_CONVECTION_n -USE MODD_DIM_n -USE MODD_FIELD_n -USE MODD_GRID_n -USE MODD_LUNIT_n -USE MODD_PARAM_n -USE MODD_PARAM_KAFR_n -USE MODD_PARAM_RAD_n -USE MODD_RADIATIONS_n -USE MODD_TIME_n -USE MODD_TURB_n -USE MODD_REF_n, ONLY: XRHODREF -USE MODD_DIAG_FLAG -USE MODD_NSV, ONLY : NSV,NSV_USER,NSV_C2R2BEG,NSV_C2R2END, & - NSV_C1R3BEG, NSV_C1R3END,NSV_ELECBEG,NSV_ELECEND, & - NSV_CHEMBEG, NSV_CHEMEND,NSV_LGBEG, NSV_LGEND -USE MODD_CH_M9_n, ONLY: CNAMES -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -USE MODD_LG, ONLY: CLGNAMES -USE MODD_DUST, ONLY: LDUST -USE MODD_SALT, ONLY: LSALT -USE MODD_CH_AEROSOL, ONLY: LORILAM -USE MODD_CH_MNHC_n -USE MODD_CH_BUDGET_n -USE MODD_CH_PRODLOSSTOT_n +USE MODD_CH_AEROSOL, ONLY: LORILAM +USE MODD_CH_BUDGET_n, ONLY: CNAMES_BUDGET, NEQ_BUDGET, XTCHEM USE MODD_CH_FLX_n, ONLY: XCHFLX -USE MODD_RAD_TRANSF -USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_ZON10M,XCURRENT_MER10M, & - XCURRENT_SFCO2,XCURRENT_SWD, XCURRENT_LWD, & - XCURRENT_SWU, XCURRENT_LWU -! -USE MODD_DYN_n -USE MODD_CURVCOR_n -USE MODD_METRICS_n -USE MODD_DIAG_BLANK -USE MODI_PINTER -USE MODI_ZINTER -USE MODI_GRADIENT_M -USE MODI_GRADIENT_W -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_UV -! -USE MODI_SHUMAN -USE MODE_NEIGHBORAVG +USE MODD_CH_PRODLOSSTOT_n, ONLY: CNAMES_PRODLOSST, NEQ_PLT, XLOSS, XPROD +USE MODD_CST, ONLY: XCPD, XP00, XRD, XTT +USE MODD_CURVCOR_n, ONLY: XCORIOZ +USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_ZON10M, XCURRENT_MER10M, & + XCURRENT_SFCO2, XCURRENT_SWD, XCURRENT_LWD, & + XCURRENT_SWU, XCURRENT_LWU +USE MODD_DUST, ONLY: LDUST +use modd_field, only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_CONF, ONLY: LCARTESIAN +USE MODD_CONF_n, ONLY: LUSERC, LUSERI, NRR +USE MODD_DEEP_CONVECTION_n, ONLY: NCLBASCONV, NCLTOPCONV, XCAPE, XDMFCONV, XDRCCONV, XDRICONV, XDRVCONV, & + XDTHCONV, XDSVCONV, XMFCONV, XPRLFLXCONV, XPRSFLXCONV, XUMFCONV +USE MODD_DIAG_FLAG, ONLY: CRAD_SAT, LCHEMDIAG, LCLD_COV, LCOARSE, LISOAL, LISOPR, LISOTH, LRAD_SUBG_COND, & + NCONV_KF, NDXCOARSE, NRAD_3D, NRTTOVINFO, XISOAL, XISOPR, XISOTH +USE MODD_FIELD_n, ONLY: XCLDFR, XPABST, XSIGS, XTHT, XTKET, XRT, XUT, XVT, XWT +USE MODD_GRID_n, ONLY: XZHAT, XZZ +USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ +USE MODD_NSV, ONLY: NSV, NSV_CHEMBEG, NSV_CHEMEND, TSVLIST +USE MODD_PARAMETERS, ONLY: JPVEXT, NUNDEF, XUNDEF +USE MODD_PARAM_KAFR_n, ONLY: LCHTRANS +USE MODD_PARAM_n, ONLY: CRAD, CSURF +USE MODD_PARAM_RAD_n, only: NRAD_COLNBR +USE MODD_RADIATIONS_N, ONLY: NCLEARCOL_TM1, NDLON, NFLEV, NSTATM, & + XAER, XAZIM, XCCO2, XDIR_ALB, XDIRFLASWD, XDIRSRFSWD, XDTHRAD, XEMIS, & + XFLALWD, XSCA_ALB, XSCAFLASWD, XSTATM, XTSRAD, XZENITH +USE MODD_RAD_TRANSF, ONLY: JPGEOST +USE MODD_REF_n, ONLY: XRHODREF +USE MODD_SALT, ONLY: LSALT +USE MODD_TIME_n, ONLY: TDTCUR +USE MODD_TURB_n, ONLY: LSIGMAS, LSUBG_COND, VSIGQSAT + +use mode_field, only: Find_field_id_from_mnhname +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_MSG +USE MODE_NEIGHBORAVG, ONLY: BLOCKAVG, MOVINGAVG +USE MODE_TOOLS_LL, ONLY: GET_INDICE_ll + #ifdef MNH_RTTOV_8 USE MODI_CALL_RTTOV8 #endif @@ -158,14 +146,18 @@ USE MODI_CALL_RTTOV11 #ifdef MNH_RTTOV_13 USE MODI_CALL_RTTOV13 #endif +USE MODI_GET_SURF_UNDEF +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_UV +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_PINTER +USE MODI_SHUMAN USE MODI_RADTR_SATEL USE MODI_UV_TO_ZONAL_AND_MERID -! -use mode_field, only: Find_field_id_from_mnhname -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -! -USE MODI_GET_SURF_UNDEF -! +USE MODI_ZINTER + IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -246,7 +238,6 @@ ZTEMP(:,:,:)=XTHT(:,:,:)*(XPABST(:,:,:)/ XP00) **(XRD/XCPD) !* Diagnostic variables related to deep convection ! IF (NCONV_KF >= 0) THEN -! CALL IO_Field_write(TPFILE,'CAPE',XCAPE) ! ! top height (km) of convective clouds @@ -288,121 +279,35 @@ IF (NCONV_KF >= 0) THEN NDIMS = 2, & LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) -! END IF + IF (NCONV_KF >= 1) THEN -! CALL IO_Field_write(TPFILE,'DTHCONV',XDTHCONV) CALL IO_Field_write(TPFILE,'DRVCONV',XDRVCONV) CALL IO_Field_write(TPFILE,'DRCCONV',XDRCCONV) CALL IO_Field_write(TPFILE,'DRICONV',XDRICONV) -! +! IF ( LCHTRANS .AND. NSV > 0 ) THEN - ! User scalar variables - IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1, NSV_USER - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A2,I3.3,A20)')'X_Y_Z_','SV',JSV,' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - ! microphysical C2R2 scheme scalar variables - IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG, NSV_C2R2END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - ! microphysical C3R5 scheme additional scalar variables - IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG,NSV_C1R3END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - ! electrical scalar variables - IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - ! chemical scalar variables - IF (NSV_CHEMEND>=NSV_CHEMBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHEMBEG, NSV_CHEMEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - ! lagrangian variables - IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF + ! scalar variables are recorded + ! individually in the file + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for DSVCONV', & !Temporary name to ease identification + CUNITS = 's-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + DO JSV = 1, NSV + TZFIELD%CMNHNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME ) + TZFIELD%CLONGNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME ) + TZFIELD%CCOMMENT = 'Convective tendency for ' // TRIM( TSVLIST(JSV)%CMNHNAME ) + CALL IO_Field_write( TPFILE, TZFIELD, XDSVCONV(:,:,:,JSV) ) + END DO END IF -! END IF + IF (NCONV_KF >= 2) THEN CALL IO_Field_write(TPFILE,'PRLFLXCONV',XPRLFLXCONV) CALL IO_Field_write(TPFILE,'PRSFLXCONV',XPRSFLXCONV) @@ -762,22 +667,20 @@ END IF ! !------------------------------------------------------------------------------- ! Net surface gaseous fluxes -!print*,'LCHEMDIAG, NSV_CHEMBEG, NSV_CHEMEND=',& -!LCHEMDIAG, NSV_CHEMBEG, NSV_CHEMEND - IF (LCHEMDIAG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppb m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for net chemical flux', & !Temporary name to ease identification + CUNITS = 'ppb m s-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! DO JSV = NSV_CHEMBEG, NSV_CHEMEND - TZFIELD%CMNHNAME = 'FLX_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A,A)')'X_Y_Z_',TRIM(CNAMES(JSV-NSV_CHEMBEG+1)),' Net chemical flux' + TZFIELD%CMNHNAME = 'FLX_' // TRIM( TSVLIST(JSV)%CMNHNAME ) + TZFIELD%CLONGNAME = 'FLX_' // TRIM( TSVLIST(JSV)%CLONGNAME ) + WRITE(TZFIELD%CCOMMENT,'(A6,A,A)')'X_Y_Z_',TRIM( TSVLIST(JSV)%CMNHNAME ),' Net chemical flux' CALL IO_Field_write(TPFILE,TZFIELD,XCHFLX(:,:,JSV-NSV_CHEMBEG+1) * 1E9) END DO END IF @@ -1575,14 +1478,15 @@ END IF ! ------------------------------- ! IF (NEQ_BUDGET>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - ! - TZFIELD%CUNITS = 'ppv s-1' - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 4 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for CNAMES_BUDGET', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = 'ppv s-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 4, & + LTIMEDEP = .TRUE. ) ! DO JSV = 1, NEQ_BUDGET TZFIELD%CMNHNAME = TRIM(CNAMES_BUDGET(JSV))//'_BUDGET' @@ -1591,9 +1495,15 @@ IF (NEQ_BUDGET>0) THEN CALL IO_Field_write(TPFILE,TZFIELD,XTCHEM(JSV)%XB_REAC(:,:,:,:)) END DO ! - TZFIELD%CUNITS = '' - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 1 + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for reaction list', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 1, & + LTIMEDEP = .TRUE. ) ! DO JSV=1, NEQ_BUDGET TZFIELD%CMNHNAME = TRIM(CNAMES_BUDGET(JSV))//'_CHREACLIST' @@ -1606,13 +1516,15 @@ END IF ! ! chemical prod/loss terms IF (NEQ_PLT>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for CNAMES_PRODLOSST', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = 'ppv s-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! DO JSV = 1, NEQ_PLT TZFIELD%CMNHNAME = TRIM(CNAMES_PRODLOSST(JSV))//'_PROD' diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index a6e257254e49c4d8e41a0418d07390c6c308bb60..1a6694ce0a36402f5c39a0b899f8701148f8475b 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -153,14 +153,12 @@ END MODULE MODI_WRITE_LFIFM_n !! M.Tomasini 06/12 2D west african monsoon: nesting for ADV forcing writing !! Pialat/Tulet 15/02/2012 add ForeFire variables !! J. Escobar Mars 2014 , missing YDIR="XY" in 1.6 for tendencies fields -!! J.escobar & M.Leriche 23/06/2014 Pb with JSA increment versus ini_nsv order initialization !! P. Tulet Nov 2014 accumulated moles of aqueous species that fall at the surface !! M.Faivre 2014 !! C.Lac Dec.2014 writing past wind fields for centred advection !! J.-P. Pinty Jan 2015 add LNOx and flash map diagnostics !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! P. Tulet & M. Leriche Nov 2015 add mean pH value in the rain at the surface -!! J.escobar 04/08/2015 suit Pb with writ_lfin JSA increment , modif in ini_nsv to have good order initialization !! Modification 01/2016 (JP Pinty) Add LIMA !! M.Mazoyer 04/16 : Add supersaturation fields ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O @@ -180,115 +178,105 @@ END MODULE MODI_WRITE_LFIFM_n ! P. Wautelet 10/03/2021: use scalar variable names for dust and salt ! P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL ! J.L. Redelsperger 03/2021: add OCEAN and auto-coupled O-A LES cases +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_DIM_n +USE MODD_2D_FRC +USE MODD_ADVFRC_n +USE MODD_ADV_n, ONLY: CUVW_ADV_SCHEME, XRTKEMS, CTEMP_SCHEME, LSPLIT_CFL +USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER +USE MODD_BLOWSNOW +USE MODD_BLOWSNOW_n +USE MODD_CH_AEROSOL +USE MODD_CH_M9_n +USE MODD_CH_MNHC_n, ONLY: LUSECHEM,LCH_CONV_LINOX, & + LUSECHAQ,LUSECHIC,LCH_PH, XCH_PHINIT +USE MODD_CH_PH_n +USE MODD_CLOUDPAR +USE MODD_CONDSAMP USE MODD_CONF USE MODD_CONF_n -use modd_field, only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL -USE MODD_GRID -USE MODD_GRID_n -USE MODD_TIME -USE MODD_TIME_n -USE MODD_FIELD_n -USE MODD_MEAN_FIELD_n +USE MODD_CST +USE MODD_DEEP_CONVECTION_n +USE MODD_DEF_EDDY_FLUX_n +USE MODD_DEF_EDDYUV_FLUX_n +USE MODD_DIM_n USE MODD_DUMMY_GR_FIELD_n -USE MODD_LSFIELD_n +USE MODD_DUST USE MODD_DYN_n -USE MODD_PARAM_n -USE MODD_REF -USE MODD_LUNIT_n -USE MODD_TURB_n -USE MODD_RADIATIONS_n, ONLY : XDTHRAD, NCLEARCOL_TM1, XFLALWD, & - XZENITH, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD, & - XDIRSRFSWD, XSCAFLASWD, XDIRFLASWD, XAZIM -USE MODD_REF_n, ONLY : XRHODREF -USE MODD_FRC -USE MODD_PRECIP_n +USE MODD_ELEC_DESCR, ONLY: LLNOX_EXPLICIT +USE MODD_ELEC_FLASH USE MODD_ELEC_n -USE MODD_CST -USE MODD_CLOUDPAR -USE MODD_DEEP_CONVECTION_n -USE MODD_PARAM_KAFR_n -USE MODD_NESTING -USE MODD_PARAMETERS +USE MODD_EOL_ADNR +USE MODD_EOL_ALM +USE MODD_EOL_MAIN +USE MODD_EOL_SHARED_IO +USE MODD_FIELD_n +use modd_field, only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL +#ifdef MNH_FOREFIRE +USE MODD_FOREFIRE +#endif +USE MODD_FRC USE MODD_GR_FIELD_n -USE MODD_CH_MNHC_n, ONLY: LUSECHEM,LCH_CONV_LINOX, & - LUSECHAQ,LUSECHIC,LCH_PH, XCH_PHINIT -USE MODD_CH_PH_n -USE MODD_CH_M9_n -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES, LLNOX_EXPLICIT -USE MODD_LG, ONLY: CLGNAMES -USE MODD_NSV -USE MODD_AIRCRAFT_BALLOON +USE MODD_GRID +USE MODD_GRID_n USE MODD_HURR_CONF, ONLY: LFILTERING,CFILTERING,NDIAG_FILT USE MODD_HURR_FIELD_n -USE MODD_PREP_REAL, ONLY: CDUMMY_2D, XDUMMY_2D -USE MODD_DUST -USE MODD_SALT +USE MODD_IBM_LSF, ONLY: LIBM_LSF +USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_LS +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LATZ_EDFLX +USE MODD_LIMA_PRECIP_SCAVENGING_n +USE MODD_LSFIELD_n +USE MODD_LUNIT_n +USE MODD_MEAN_FIELD_n +USE MODD_NESTING +USE MODD_NSV USE MODD_OCEANH +USE MODD_PARAM_C2R2, ONLY: LSUPSAT +USE MODD_PARAMETERS +USE MODD_PARAM_KAFR_n, ONLY: LCHTRANS +USE MODD_PARAM_LIMA, ONLY: LSCAV, LAERO_MASS +USE MODD_PARAM_n USE MODD_PASPOL -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -#endif -USE MODD_CONDSAMP -USE MODD_CH_AEROSOL -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n USE MODD_PAST_FIELD_n -USE MODD_ADV_n, ONLY: CUVW_ADV_SCHEME,XRTKEMS,CTEMP_SCHEME,LSPLIT_CFL -USE MODD_ELEC_FLASH -! -USE MODD_PARAM_LIMA, ONLY: LSCAV, LAERO_MASS -USE MODD_LIMA_PRECIP_SCAVENGING_n -! -USE MODE_IO_FILE, only: IO_File_close -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -USE MODE_ll -USE MODD_IO, ONLY: TFILEDATA +USE MODD_PRECIP_n +USE MODD_PREP_REAL, ONLY: CDUMMY_2D, XDUMMY_2D +USE MODD_RADIATIONS_n, ONLY : XDTHRAD, NCLEARCOL_TM1, XFLALWD, & + XZENITH, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD, & + XDIRSRFSWD, XSCAFLASWD, XDIRFLASWD, XAZIM +USE MODD_RECYCL_PARAM_n +USE MODD_REF +USE MODD_REF_n, ONLY : XRHODREF +USE MODD_RELFRC_n +USE MODD_SALT +USE MODD_TIME +USE MODD_TIME_n +USE MODD_TURB_n + +USE MODE_EXTRAPOL use mode_field, only: Find_field_id_from_mnhname USE MODE_GATHER_ll USE MODE_GRIDPROJ -USE MODE_MSG +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FILE, only: IO_File_close +USE MODE_ll USE MODE_MODELN_HANDLER +USE MODE_MPPDB +USE MODE_MSG USE MODE_TOOLS, ONLY: UPCASE -! -USE MODI_WRITE_LB_n -USE MODI_WRITE_BALLOON_n -USE MODI_DUSTLFI_n -USE MODI_SALTLFI_n + USE MODI_CH_AER_REALLFI_n -USE MODI_SALT_FILTER USE MODI_DUST_FILTER -! -!20131128 -USE MODE_MPPDB -USE MODE_EXTRAPOL -! Modif Eddy fluxes -USE MODD_DEF_EDDY_FLUX_n ! Ajout PP -USE MODD_DEF_EDDYUV_FLUX_n ! Ajout PP -USE MODD_LATZ_EDFLX ! Ajout PP -! -USE MODD_2D_FRC ! Ajout PP -USE MODD_ADVFRC_n ! Modif PP ADV FRC -USE MODD_RELFRC_n -! -USE MODD_PARAM_C2R2 -! -USE MODD_EOL_MAIN -USE MODD_EOL_SHARED_IO -USE MODD_EOL_ADNR -USE MODD_EOL_ALM -! -USE MODD_RECYCL_PARAM_n -USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_LS -USE MODD_IBM_LSF, ONLY: LIBM_LSF -! +USE MODI_DUSTLFI_n +USE MODI_SALT_FILTER +USE MODI_SALTLFI_n +USE MODI_WRITE_BALLOON_n +USE MODI_WRITE_LB_n + IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -303,9 +291,7 @@ INTEGER :: IRESP ! IRESP : return-code if a problem appears !in LFI subroutines at the open of the file ! INTEGER :: JSV ! loop index for scalar variables -INTEGER :: JSA ! beginning of chemical-aerosol variables - -! +! CHARACTER(LEN=3) :: YFRC ! to mark the time of the forcing INTEGER :: JT ! loop index ! @@ -320,15 +306,11 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! Position y in the conformal ! plane (array on the complete domain) INTEGER :: IMI ! Current model index ! -INTEGER :: ICH_NBR ! to write number and names of scalar -INTEGER,DIMENSION(:),ALLOCATABLE :: ICH_NAMES !(chem+aero+dust) variables -CHARACTER(LEN=NMNHNAMELGTMAX),DIMENSION(:),ALLOCATABLE :: YDSTNAMES,YCHNAMES, YSLTNAMES -INTEGER :: ILREC,ILENG !in NSV.DIM and NSV.TITRE INTEGER :: INFO_ll -INTEGER :: IKRAD INTEGER :: JI,JJ,JK ! loop index INTEGER :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds ! +INTEGER :: IDX INTEGER :: IID TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- @@ -338,6 +320,8 @@ TYPE(TFIELDMETADATA) :: TZFIELD IMI = GET_CURRENT_MODEL_INDEX() ! ILUOUT=TLUOUT%NLU + +IDX = 1 ! ALLOCATE(ZWORK2D(SIZE(XTHT,1),SIZE(XTHT,2))) ALLOCATE(ZWORK3D(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) @@ -902,75 +886,45 @@ IF (NRR >=1) THEN IF (LUSERH) CALL IO_Field_write(TPFILE,'RHT',XRT(:,:,:,IDX_RHT)) END IF ! -IF (NSV >=1) THEN - JSA=0 - ! User scalar variables - IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1,NSV_USER - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO +IF (NSV >= 1 ) THEN + ! aerosol scalar variables + IF ( LORILAM ) THEN + IF ((CPROGRAM == 'REAL ').AND.(NSV_AER > 1).AND.(IMI==1).AND.(LAERINIT)) & + CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), XRHODREF) + IF ((CPROGRAM == 'IDEAL ').AND.(NSV_AER > 1).AND.(IMI==1)) & + CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), XRHODREF) END IF - ! microphysical C2R2 scheme scalar variables - IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG,NSV_C2R2END - TZFIELD%CMNHNAME = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO + + ! dust scalar variables + IF ( LDUST ) THEN + IF ((CPROGRAM == 'REAL ').AND.(NSV_DST > 1).AND.(IMI==1).AND.(LDSTINIT)) & + CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) + IF ((CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1).AND.(IMI==1)) & + CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) + !At this point, we have the tracer array in order of importance, i.e. + !if mode 2 is most important it will occupy place 1-3 of XSVT + CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) END IF - ! microphysical C3R5 scheme additional scalar variables - IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG,NSV_C1R3END - TZFIELD%CMNHNAME = TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO + + ! sea salt scalar variables + IF ( LSALT ) THEN + IF ((CPROGRAM == 'REAL ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT)) & + CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ) + IF ((CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1).AND.(IMI==1)) & + CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ) + !At this point, we have the tracer array in order of importance, i.e. + !if mode 2 is most important it will occupy place 1-3 of XSVT + CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF) END IF -! -! microphysical LIMA variables -! - DO JSV = NSV_LIMA_BEG, NSV_LIMA_END + !Store all scalar variables + DO JSV = 1, NSV TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) -! - JSA=JSA+1 END DO -! + IF (LSCAV .AND. LAERO_MASS) THEN IF (ASSOCIATED(XINPAP)) THEN IF (SIZE(XINPAP) /= 0 ) THEN @@ -995,33 +949,8 @@ IF (NSV >=1) THEN END IF END IF END IF -! -! + ! electrical scalar variables - IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - TZFIELD%CMNHNAME = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN - TZFIELD%CUNITS = 'C m-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - ELSE - TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)' - END IF - ZWORK3D(:,:,:) = XSVT(:,:,:,JSV) * XRHODREF(:,:,:) ! C/kg --> C/m3 - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) - JSA=JSA+1 - END DO - END IF - ! IF (CELEC /= 'NONE') THEN CALL IO_Field_write(TPFILE,'EFIELDU',XEFIELDU) CALL IO_Field_write(TPFILE,'EFIELDV',XEFIELDV) @@ -1067,57 +996,6 @@ IF (NSV >=1) THEN CALL IO_Field_write(TPFILE,'AREA_IC', NMAP_2DAREA_IC) CALL IO_Field_write(TPFILE,'FLASH_3DCG',NMAP_3DCG) CALL IO_Field_write(TPFILE,'FLASH_3DIC',NMAP_3DIC) - ! - IF (LLNOX_EXPLICIT) THEN - TZFIELD%CMNHNAME = 'LINOX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'mol mol-1' - TZFIELD%CDIR = 'XY' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,NSV_LNOXEND)) - JSA=JSA+1 - END IF - END IF - ! lagrangian variables - IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - TZFIELD%CMNHNAME = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO - END IF - ! Passive scalar variables - IF (LPASPOL) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_PPBEG,NSV_PPEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO END IF ! IF ( ((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. (.NOT. LSUPSAT)) THEN @@ -1129,131 +1007,18 @@ IF (NSV >=1) THEN CALL IO_Field_write(TPFILE,'NPRO', XNPRO(:,:,:)) END IF ! -#ifdef MNH_FOREFIRE - ! ForeFire scalar variables - IF ( LFOREFIRE ) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FFBEG,NSV_FFEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO - END IF -#endif -! Blowing snow variables - IF (LBLOWSNOW) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - DO JSV = NSV_SNWBEG,NSV_SNWEND - TZFIELD%CMNHNAME=TRIM(CSNOWNAMES(JSV-NSV_SNWBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - DO JSV = 1,(NSV_SNW) - WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A8,I3.3)')'X_Y_Z_','SNOWCANO',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSNWCANO(:,:,JSV)) - JSA=JSA+1 - END DO - ENDIF - ! Conditional sampling variables - IF (LCONDSAMP) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG,NSV_CSEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO - ! - END IF - ! number of chemical variables (chem+aero+dust) - ICH_NBR = 0 - IF (LUSECHEM) ICH_NBR = ICH_NBR +NSV_CHEMEND-NSV_CHEMBEG+1 - IF (LUSECHIC) ICH_NBR = ICH_NBR +NSV_CHICEND-NSV_CHICBEG+1 - IF (.NOT.LUSECHEM.AND.LCH_CONV_LINOX) ICH_NBR = ICH_NBR + & - NSV_LNOXEND-NSV_LNOXBEG+1 - IF (LORILAM) ICH_NBR = ICH_NBR +NSV_AEREND -NSV_AERBEG+1 - IF (LDUST) ICH_NBR = ICH_NBR +NSV_DSTEND -NSV_DSTBEG+1 - IF (LDEPOS_DST(IMI)) ICH_NBR = ICH_NBR +NSV_DSTDEPEND -NSV_DSTDEPBEG+1 - IF (LDEPOS_SLT(IMI)) ICH_NBR = ICH_NBR +NSV_SLTDEPEND -NSV_SLTDEPBEG+1 - IF (LDEPOS_AER(IMI)) ICH_NBR = ICH_NBR +NSV_AERDEPEND -NSV_AERDEPBEG+1 - IF (LSALT) ICH_NBR = ICH_NBR +NSV_SLTEND -NSV_SLTBEG+1 - IF (ICH_NBR /=0) ALLOCATE(YCHNAMES(ICH_NBR)) - ! chemical scalar variables IF (LUSECHEM) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHEMBEG,NSV_CHEMEND - TZFIELD%CMNHNAME = TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ppv' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - ! - YCHNAMES(JSV-JSA)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) ! without T - END DO - ! - IF (LUSECHIC) THEN - DO JSV = NSV_CHICBEG,NSV_CHICEND - TZFIELD%CMNHNAME = TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ppv' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - ! - YCHNAMES(JSV-JSA)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) ! without M - END DO - ENDIF IF (LUSECHAQ.AND.NRR>=3) THEN ! accumulated moles of aqueous species that fall at the surface (mol/m2) - TZFIELD%NDIMS = 2 - DO JSV = NSV_CHACBEG+NSV_CHAC/2,NSV_CHACEND - TZFIELD%CMNHNAME = 'ACPR_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + DO JSV = NSV_CHACBEG + NSV_CHAC / 2, NSV_CHACEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = 'ACPR_' // TRIM( TZFIELD%CMNHNAME ) + TZFIELD%CLONGNAME = 'ACPR_' // TRIM( TZFIELD%CLONGNAME ) TZFIELD%CUNITS = 'mol m-2' TZFIELD%CCOMMENT = 'X_Y_Accumulated moles of aqueous species at the surface' + TZFIELD%NDIMS = 2 ZWORK2D(:,:) = XACPRAQ(:,:,JSV-NSV_CHACBEG-NSV_CHAC/2+1) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D) END DO - TZFIELD%NDIMS = 3 END IF IF (LUSECHAQ.AND.LCH_PH) THEN ! pH values in cloud CALL IO_Field_write(TPFILE,'PHC',XPHC) @@ -1262,7 +1027,7 @@ IF (NSV >=1) THEN ! compute mean pH in accumulated surface water !ZWORK2D(:,:) = 10**(-XCH_PHINIT) WHERE (XACPRR > 0.) - ZWORK2D(:,:) = XACPHR(:,:) *1E3 / XACPRR(:,:) ! moles of H+ / l of water + ZWORK2D(:,:) = XACPHR(:,:) *1E3 / XACPRR(:,:) ! moles of H+ / l of water ELSE WHERE ZWORK2D(:,:) = XUNDEF END WHERE @@ -1278,173 +1043,16 @@ IF (NSV >=1) THEN TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 2 + TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D) ENDIF ENDIF - ELSE IF (LCH_CONV_LINOX) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - TZFIELD%CMNHNAME = 'LINOXT' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)') 'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - YCHNAMES(JSV-JSA)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO - ENDIF - ! aerosol scalar variables - IF (LORILAM) THEN - IF ((CPROGRAM == 'REAL ').AND.(NSV_AER > 1).AND.(IMI==1).AND.(LAERINIT)) & - CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), XRHODREF) - IF ((CPROGRAM == 'IDEAL ').AND.(NSV_AER > 1).AND.(IMI==1)) & - CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), XRHODREF) - IF (NSV_AEREND>=NSV_AERBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERBEG,NSV_AEREND - TZFIELD%CMNHNAME = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_AERBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AERBEG ',JSV - IF (JSV==NSV_AEREND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AEREND ',JSV - YCHNAMES(JSV-JSA)= TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO - END IF - IF (LDEPOS_AER(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND - TZFIELD%CMNHNAME = TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_AERDEPBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AERDEPBEG ',JSV - IF (JSV==NSV_AERDEPEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AERDEPEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on aq dust scalar variables - ENDIF - END IF - ! dust scalar variables - IF (LDUST) THEN - IF ((CPROGRAM == 'REAL ').AND.(NSV_DST > 1).AND.(IMI==1).AND.(LDSTINIT)) & - CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) - IF ((CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1).AND.(IMI==1)) & - CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) - !At this point, we have the tracer array in order of importance, i.e. - !if mode 2 is most important it will occupy place 1-3 of XSVT - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) - DO JSV = NSV_DSTBEG,NSV_DSTEND - TZFIELD%CMNHNAME = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_DSTBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTBEG ',JSV - IF (JSV==NSV_DSTEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on dust scalar variables - - IF (LDEPOS_DST(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND - TZFIELD%CMNHNAME = TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_DSTDEPBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTDEPBEG ',JSV - IF (JSV==NSV_DSTDEPEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTDEPEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on aq dust scalar variables - ENDIF ENDIF - ! sea salt scalar variables - IF (LSALT) THEN - IF ((CPROGRAM == 'REAL ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT)) & - CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ) - IF ((CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1).AND.(IMI==1)) & - CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ) - !At this point, we have the tracer array in order of importance, i.e. - !if mode 2 is most important it will occupy place 1-3 of XSVT - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF) - DO JSV = NSV_SLTBEG,NSV_SLTEND - TZFIELD%CMNHNAME = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_SLTBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTBEG ',JSV - IF (JSV==NSV_SLTEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on sea salt scalar variables - - IF (LDEPOS_SLT(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND - TZFIELD%CMNHNAME = TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_SLTDEPBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTDEPBEG ',JSV - IF (JSV==NSV_SLTDEPEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTDEPEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on aq dust scalar variables - ENDIF - ENDIF ! - DO JSV=1,ICH_NBR - WRITE(ILUOUT,*)JSV,TRIM(YCHNAMES(JSV)) - END DO TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'NSV.DIM', & + CMNHNAME = 'NSVCHEM', & CSTDNAME = '', & - CLONGNAME = 'NSV.DIM', & + CLONGNAME = 'NSVCHEM', & CUNITS = '', & CDIR = '--', & CCOMMENT = 'Number of chemical variables', & @@ -1452,52 +1060,24 @@ IF (NSV >=1) THEN NTYPE = TYPEINT, & NDIMS = 0, & LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ICH_NBR) - ! - IF (ICH_NBR/=0) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'NSV.TITRE', & - CSTDNAME = '', & - CLONGNAME = 'NSV.TITRE', & - CUNITS = '', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 0, & - NTYPE = TYPEINT, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - ILREC=LEN(YCHNAMES(1)) - ILENG=ILREC*ICH_NBR - ALLOCATE(ICH_NAMES(ILENG)) - DO JSV = 1,ICH_NBR - DO JT = 1,ILREC - ICH_NAMES(ILREC*(JSV-1)+JT) = ICHAR(YCHNAMES(JSV)(JT:JT)) - ENDDO - ENDDO - CALL IO_Field_write(TPFILE,TZFIELD,ICH_NAMES) - DEALLOCATE(YCHNAMES,ICH_NAMES) - END IF + CALL IO_Field_write(TPFILE,TZFIELD,NSV_CHEM_LIST) ! - ! lagrangian variables - IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - TZFIELD%CMNHNAME = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - END DO + IF ( NSV_CHEM_LIST > 0 ) THEN + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SV_CHEM_LIST', & + CSTDNAME = '', & + CLONGNAME = 'SV_CHEM_LIST', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'List of chemical variables', & + NGRID = 0, & + NTYPE = TYPECHAR, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) + CALL IO_Field_write(TPFILE,TZFIELD,CSV_CHEM_LIST) END IF END IF ! -! CALL IO_Field_write(TPFILE,'LSUM', XLSUM) CALL IO_Field_write(TPFILE,'LSVM', XLSVM) CALL IO_Field_write(TPFILE,'LSWM', XLSWM) @@ -1676,95 +1256,20 @@ IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN IF ( LCHTRANS .AND. NSV > 0 ) THEN ! scalar variables are recorded ! individually in the file - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1, NSV_USER - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_C2R2BEG, NSV_C2R2END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_C1R3BEG, NSV_C1R3END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_ELECBEG, NSV_ELECEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_PPBEG, NSV_PPEND - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO -#ifdef MNH_FOREFIRE - IF (LFOREFIRE) THEN - DO JSV = NSV_FFBEG, NSV_FFEND - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF -#endif - IF (LUSECHEM) THEN - DO JSV = NSV_CHEMBEG, NSV_CHEMEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - IF (LORILAM) THEN - DO JSV = NSV_AERBEG, NSV_AEREND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF -! linox scalar variables - ELSE IF (LCH_CONV_LINOX) THEN - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - TZFIELD%CMNHNAME = 'DSVCONV_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - DO JSV = NSV_LGBEG, NSV_LGEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_DSTBEG, NSV_DSTEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_SLTBEG, NSV_SLTEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for DSVCONV', & !Temporary name to ease identification + CUNITS = 's-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + DO JSV = 1, NSV + TZFIELD%CMNHNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME ) + TZFIELD%CLONGNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME ) + TZFIELD%CCOMMENT = 'Convective tendency for ' // TRIM( TSVLIST(JSV)%CMNHNAME ) + CALL IO_Field_write( TPFILE, TZFIELD, XDSVCONV(:,:,:,JSV) ) END DO END IF ! @@ -2366,11 +1871,11 @@ IF ( CPROGRAM=='REAL ' ) THEN NDIMS = 2, & LTIMEDEP = .TRUE. ) ! - DO JSA=1,SIZE(XDUMMY_2D,3) - TZFIELD%CMNHNAME = ADJUSTL(CDUMMY_2D(JSA)) + DO JI = 1, SIZE( XDUMMY_2D, 3 ) + TZFIELD%CMNHNAME = ADJUSTL(CDUMMY_2D(JI)) TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XDUMMY_2D(:,:,JSA)) + CALL IO_Field_write(TPFILE,TZFIELD,XDUMMY_2D(:,:,JI)) END DO END IF ! diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index 0b8eb5a791fdee7e48266546140eb8d9007bc85a..cb9dc945a871d87b4f5777bb1dc6f8bd463472a9 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -10,7 +10,6 @@ ! G. Delautier 2016: LIMA ! C. Lac 10/2016: add visibility diagnostics for fog ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! J. Escobar 16/08/2018: From Pierre & Maud , correction use CNAMES(JSV-NSV_CHEMBEG+1) ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! P. Wautelet 09/10/2020: Write_diachro: use new datatype tpfields ! P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro) @@ -19,6 +18,7 @@ ! M. Taufour 07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE ! P. Wautelet 01/09/2021: fix: correct vertical dimension for ALT and W ! P. Wautelet 19/11/2021: bugfix in units for LIMA variables +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !----------------------------------------------------------------- ! ########################### MODULE MODE_WRITE_PROFILER_n @@ -84,24 +84,18 @@ SUBROUTINE PROFILER_DIACHRO_n( TPDIAFILE, KI ) use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & tbudiachrometadata USE MODD_DIAG_IN_RUN, only: LDIAG_IN_RUN -USE MODD_DUST, ONLY: CDUSTNAMES, LDUST, NMODE_DST -USE MODD_CH_AEROSOL, ONLY: CAERONAMES, LORILAM, JPMODE -USE MODD_CH_M9_n, ONLY: CNAMES +USE MODD_DUST, ONLY: LDUST, NMODE_DST +USE MODD_CH_AEROSOL, ONLY: LORILAM, JPMODE USE MODD_CST, ONLY: XRV -USE MODD_ELEC_DESCR, ONLY: CELECNAMES use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_PROFILER_TIME, NMNHDIM_PROFILER_PROC, NMNHDIM_UNUSED, & tfieldmetadata_base, TYPEREAL -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES USE MODD_IO, ONLY: TFILEDATA -USE MODD_LG, ONLY: CLGNAMES -USE MODD_NSV +USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend USE MODD_PARAMETERS, ONLY: XUNDEF USE MODD_PARAM_n, ONLY: CRAD -USE MODD_PROFILER_n +USE MODD_PROFILER_n, ONLY: tprofiler USE MODD_RADIATIONS_n, ONLY: NAER -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_SALT, ONLY: CSALTNAMES, LSALT -USE MODD_TYPE_PROFILER +USE MODD_SALT, ONLY: LSALT ! USE MODE_AERO_PSD USE MODE_DUST_PSD @@ -112,7 +106,6 @@ INTEGER, INTENT(IN) :: KI ! !* 0.2 declaration of local variables for diachro ! -character(len=NCOMMENTLGTMAX) :: ycomment character(len=NMNHNAMELGTMAX) :: yname character(len=NUNITLGTMAX) :: yunits CHARACTER(LEN=:), allocatable :: YGROUP ! group title @@ -125,6 +118,8 @@ INTEGER :: JSV ! loop counter integer :: ji integer :: irr !Number of moist variables REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO +REAL, DIMENSION(:,:,:), TARGET, ALLOCATABLE :: ZWORK +REAL, DIMENSION(:,:,:), POINTER :: ZDATA REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG type(tbudiachrometadata) :: tzbudiachro type(tfieldmetadata_base), dimension(:), allocatable :: tzfields @@ -133,7 +128,9 @@ type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! IF (TPROFILER%X(KI)==XUNDEF) RETURN IF (TPROFILER%Y(KI)==XUNDEF) RETURN -! + +ZDATA => Null() + IKU = SIZE(TPROFILER%W,2) !Number of vertical levels ! !IPROC is too large (not a big problem) due to the separation between vertical profiles and point values @@ -193,40 +190,22 @@ if ( Size( tprofiler%tke, 1 ) > 0 ) & call Add_profile( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tprofiler%tke ) if ( Size( tprofiler%sv, 4 ) > 0 ) then - ! User scalar variables - do jsv = 1, nsv_user - Write ( yname, fmt = '( a2, i3.3 )' ) 'Sv', jsv - call Add_profile( yname, '', 'kg kg-1', tprofiler%sv(:,:,:,jsv) ) - end do - ! Passive pollutant scalar variables - do jsv = nsv_ppbeg, nsv_ppend - Write ( yname, fmt = '( a2, i3.3 )' ) 'Sv', jsv - call Add_profile( yname, '', '1', tprofiler%sv(:,:,:,jsv) ) - end do - ! microphysical C2R2 scheme scalar variables - do jsv = nsv_ppbeg, nsv_ppend - call Add_profile( Trim( c2r2names(jsv - nsv_c2r2beg + 1) ), '', 'm-3', tprofiler%sv(:,:,:,jsv) ) - end do - ! microphysical C3R5 scheme additional scalar variables - do jsv = nsv_c1r3beg, nsv_c1r3end - call Add_profile( Trim( c1r3names(jsv - nsv_c1r3beg + 1) ), '', 'm-3', tprofiler%sv(:,:,:,jsv) ) - end do - ! LIMA variables - do jsv = nsv_lima_beg, nsv_lima_end - yname = Trim( tsvlist(jsv)%cmnhname ) - yunits = Trim( tsvlist(jsv)%cunits ) - ycomment = '' - call Add_profile( yname, ycomment, yunits, tprofiler%sv(:,:,:,jsv) ) - end do - ! electrical scalar variables - do jsv = nsv_elecbeg, nsv_elecend - call Add_profile( Trim( celecnames(jsv - nsv_elecbeg + 1) ), '', 'C', tprofiler%sv(:,:,:,jsv) ) - end do - ! chemical scalar variables - do jsv = nsv_chembeg, nsv_chemend - Write( ycomment, '( a5, a3, i3.3 )' ) 'T(s) ', 'SVT', jsv - call Add_profile( Trim( cnames(jsv - nsv_chembeg + 1) ), ycomment, 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 ) + ! Scalar variables + Allocate( zwork, mold = tprofiler%sv(:,:,:,1) ) + do jsv = 1, nsv + if ( Trim( tsvlist(jsv)%cunits ) == 'ppv' ) then + yunits = 'ppb' + zwork = tprofiler%sv(:,:,:,jsv) * 1.e9 !*1e9 for conversion ppv->ppb + zdata => zwork + else + yunits = Trim( tsvlist(jsv)%cunits ) + zdata => tprofiler%sv(:,:,:,jsv) + end if + call Add_profile( tsvlist(jsv)%cmnhname, '', yunits, zdata ) + zdata => Null() end do + Deallocate( zwork ) + IF ( LORILAM .AND. .NOT.(ANY(TPROFILER%P(:,:,KI) == 0.)) ) THEN ALLOCATE (ZSV (1,iku,size(tprofiler%tpdates),NSV_AER)) ALLOCATE (ZRHO(1,iku,size(tprofiler%tpdates))) @@ -284,10 +263,6 @@ if ( Size( tprofiler%sv, 4 ) > 0 ) then DEALLOCATE (ZSV,ZRHO) DEALLOCATE (ZN0,ZRG,ZSIG) END IF - ! dust scalar variables - do jsv = nsv_dstbeg, nsv_dstend - call Add_profile( Trim( cdustnames(jsv - nsv_dstbeg + 1) ), '', 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 ) - end do IF ((LDUST).AND. .NOT.(ANY(TPROFILER%P(:,:,KI) == 0.))) THEN ALLOCATE (ZSV (1,iku,size(tprofiler%tpdates),NSV_DST)) ALLOCATE (ZRHO(1,iku,size(tprofiler%tpdates))) @@ -345,10 +320,6 @@ if ( Size( tprofiler%sv, 4 ) > 0 ) then DEALLOCATE (ZSV,ZRHO) DEALLOCATE (ZN0,ZRG,ZSIG) END IF - ! sea salt scalar variables - do jsv = nsv_sltbeg, nsv_sltend - call Add_profile( Trim( csaltnames(jsv - nsv_sltbeg + 1) ), '', 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 ) - end do if ( ldust .or. lorilam .or. lsalt ) then do jsv = 1, naer Write( yname, '( a, i1 )' ) 'AEREXT', jsv @@ -592,7 +563,7 @@ jproc = jproc + 1 if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more profiles than expected' ) -ctitle(jproc) = Trim( htitle) +ctitle(jproc) = Trim( htitle ) ccomment(jproc) = Trim( hcomment ) cunit(jproc) = Trim( hunits ) diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 972805565d248f7aa0d309cb3ed69d0aa07431c7..8d6d36ec605dc6dbf7ff3d9af174390c236a16f6 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -60,33 +60,22 @@ END MODULE MODI_WRITE_STATION_n ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! P. Wautelet 09/10/2020: Write_diachro: use new datatype tpfields ! P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro) +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! +USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD use MODD_BUDGET, ONLY: tbudiachrometadata -USE MODD_CH_M9_n, ONLY: CNAMES -USE MODD_CH_AEROSOL, ONLY: CAERONAMES, LORILAM, JPMODE -USE MODD_CONF -USE MODD_CST -USE MODD_DIAG_IN_RUN -USE MODD_DIM_n -USE MODD_DUST, ONLY: CDUSTNAMES, LDUST, NMODE_DST -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -USE MODD_GRID_n -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES +USE MODD_CONF, ONLY: LCARTESIAN +USE MODD_CST, ONLY: XRV USE MODD_IO, ONLY: TFILEDATA -USE MODD_LG, ONLY: CLGNAMES -USE MODD_LUNIT -USE MODD_NSV -USE MODD_PARAMETERS +USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, & + nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend USE MODD_PARAM_n, ONLY: CRAD, CSURF -USE MODD_PASPOL -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_SALT, ONLY: CSALTNAMES, LSALT, NMODE_SLT -USE MODD_STATION_n -USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD +USE MODD_PARAMETERS, ONLY: XUNDEF +USE MODD_STATION_n, only: NUMBSTAT, STATION, TSTATION ! USE MODE_AERO_PSD USE MODE_DUST_PSD @@ -408,72 +397,19 @@ IF (SIZE(TSTATION%TKE,1)>0) THEN ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%TKE(:,II) END IF ! -! -IF (LPASPOL) THEN - JSV=1 - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A2,I3.3)') 'Sv',JSV - YUNIT (JPROC) = 'kg kg-1' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) -ENDIF -! IF (SIZE(TSTATION%SV,3)>=1) THEN - ! User scalar variables - DO JSV = 1,NSV_USER - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A2,I3.3)') 'Sv',JSV - YUNIT (JPROC) = 'kg kg-1' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) - END DO - ! microphysical C2R2 scheme scalar variables - DO JSV = NSV_C2R2BEG,NSV_C2R2END - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - YUNIT (JPROC) = 'm-3' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) - END DO - ! microphysical C3R5 scheme additional scalar variables - DO JSV = NSV_C1R3BEG,NSV_C1R3END - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - YUNIT (JPROC) = 'm-3' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) - END DO - ! electrical scalar variables - DO JSV = NSV_ELECBEG,NSV_ELECEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - YUNIT (JPROC) = 'C' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) - END DO - ! chemical scalar variables - DO JSV = NSV_CHEMBEG,NSV_CHEMEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CNAMES(JSV-NSV_CHEMBEG+1)) - YUNIT (JPROC) = 'ppb' - WRITE(YCOMMENT (JPROC),'(A5,A3,I3.3)') 'T(s) ','SVT',JSV - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) * 1.E9 - END DO - ! LiNOX passive tracer - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A5)') 'LiNOx' - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) * 1.E9 - END DO - ! aerosol scalar variables - DO JSV = NSV_AERBEG,NSV_AEREND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CAERONAMES(JSV-NSV_AERBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) *1.E9 + ! Scalar variables + DO JSV = 1, NSV + JPROC = JPROC + 1 + YTITLE(JPROC) = TRIM( TSVLIST(JSV)%CMNHNAME ) + YCOMMENT(JPROC) = '' + IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN + YUNIT(JPROC) = 'ppb' + ZWORK6(1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) * 1.e9 !*1e9 for conversion ppv->ppb + ELSE + YUNIT(JPROC) = TRIM( TSVLIST(JSV)%CUNITS ) + ZWORK6(1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) + END IF END DO IF ((LORILAM).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN @@ -490,15 +426,14 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR) ENDDO ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) ) & - / ( 1. + ZRHO(1,1,:) ) + / ( 1. + ZRHO(1,1,:) ) ELSE ZRHO(1,1,:) = TSTATION%TH(:,II) ENDIF ZRHO(1,1,:) = TSTATION%P(:,II) / & (XRD *ZRHO(1,1,:) *((TSTATION%P(:,II)/XP00)**(XRD/XCPD)) ) - - CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0,PCTOTA=ZPTOTA) + CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0,PCTOTA=ZPTOTA) DO JSV=1,JPMODE ! mean radius @@ -611,19 +546,12 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN WRITE(YCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JSV ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA10,JSV) END IF - ENDDO + ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) + DEALLOCATE (ZSV,ZRHO) + DEALLOCATE (ZN0,ZRG,ZSIG) END IF - ! dust scalar variables - DO JSV = NSV_DSTBEG,NSV_DSTEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) *1.E9 - END DO + IF ((LDUST).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN ALLOCATE (ZSV(1,1,SIZE(tstation%tpdates),NSV_DST)) ALLOCATE (ZRHO(1,1,SIZE(tstation%tpdates))) @@ -637,7 +565,7 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR) ENDDO ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) ) & - / ( 1. + ZRHO(1,1,:) ) + / ( 1. + ZRHO(1,1,:) ) ELSE ZRHO(1,1,:) = TSTATION%TH(:,II) ENDIF @@ -664,19 +592,10 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV) ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) + DEALLOCATE (ZSV,ZRHO) + DEALLOCATE (ZN0,ZRG,ZSIG) END IF - ! sea salt scalar variables - DO JSV = NSV_SLTBEG,NSV_SLTEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) *1.E9 - END DO -ENDIF -! + IF ((LSALT).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN ALLOCATE (ZSV(1,1,SIZE(tstation%tpdates),NSV_SLT)) ALLOCATE (ZRHO(1,1,SIZE(tstation%tpdates))) @@ -720,6 +639,7 @@ ENDIF DEALLOCATE (ZSV,ZRHO) DEALLOCATE (ZN0,ZRG,ZSIG) END IF +END IF IF (ANY(TSTATION%TSRAD(:,:)/=XUNDEF)) THEN JPROC = JPROC+1