From 23dbb4dee886c9de84afc0b2975448ca982466f7 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 10 Mar 2021 11:50:16 +0100 Subject: [PATCH] Philippe 10/03/2021: use scalar variable names for dust and salt --- src/MNH/ini_prog_var.f90 | 87 +++---------- src/MNH/write_lbn.f90 | 275 ++++++++++----------------------------- src/MNH/write_lfin.f90 | 213 +++++++----------------------- 3 files changed, 136 insertions(+), 439 deletions(-) diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90 index 62b6ee923..1f099672e 100644 --- a/src/MNH/ini_prog_var.f90 +++ b/src/MNH/ini_prog_var.f90 @@ -98,6 +98,7 @@ END MODULE MODI_INI_PROG_VAR ! P. Wautelet 09/03/2021: simplify allocation of scalar variable names ! 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 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -347,40 +348,16 @@ IF(PRESENT(HCHEMFILE)) THEN TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. ! - IMOMENTS = INT(NSV_DSTEND - NSV_DSTBEG+1)/NMODE_DST - IF (IMOMENTS == 1) THEN - DO JMODE=1, NMODE_DST - !Index from which names are picked - ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + 2 - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + 1 & !Number of moments in this mode - + (NSV_DSTBEG -1) !Previous list of tracers - TZFIELD%CMNHNAME = TRIM(YPDUST_INI(ISV_NAME_IDX))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) - IF (IRESP/=0) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR',TRIM(TZFIELD%CMNHNAME)//' not found in the CHEM file '//TRIM(HCHEMFILE)) - END IF !IRESP - END DO !JMOD - ELSE ! IMOMENTS diff 1 - DO JMODE=1,NMODE_DST - DO JMOM=1,IMOMENTS - ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + JMOM - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + JMOM & !Number of moments in this mode - + (NSV_DSTBEG -1) !Previous list of tracers - TZFIELD%CMNHNAME = TRIM(YPDUST_INI(ISV_NAME_IDX))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) - IF (IRESP/=0) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR',TRIM(TZFIELD%CMNHNAME)//& - ' not found in the CHEM file '//TRIM(HCHEMFILE)) - END IF !IRESP - END DO ! JMOM - END DO !JMOD - END IF !if IMOMENTS + 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(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)) + END IF !IRESP + END DO ! JSV + IF (LDEPOS_DST(IMI)) THEN TZFIELD%CSTDNAME = '' TZFIELD%CUNITS = 'ppp' @@ -412,39 +389,15 @@ IF(PRESENT(HCHEMFILE)) THEN TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. ! - IMOMENTS = INT(NSV_SLTEND - NSV_SLTBEG+1)/NMODE_SLT - IF (IMOMENTS == 1) THEN - DO JMODE=1, NMODE_SLT - !Index from which names are picked - ISV_NAME_IDX = (JPSALTORDER(JMODE) - 1)*3 + 2 - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + 1 & !Number of moments in this mode - + (NSV_SLTBEG -1) !Previous list of tracers - TZFIELD%CMNHNAME = TRIM(YPSALT_INI(ISV_NAME_IDX))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) - IF (IRESP/=0) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR',TRIM(TZFIELD%CMNHNAME)//' not found in the CHEM file '//TRIM(HCHEMFILE)) - END IF !IRESP - END DO !JMOD - ELSE ! IMOMENTS - DO JMODE=1,NMODE_SLT - DO JMOM=1,IMOMENTS - ISV_NAME_IDX = (JPSALTORDER(JMODE) - 1)*3 + JMOM - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + JMOM & !Number of moments in this mode - + (NSV_SLTBEG -1) !Previous list of tracers - TZFIELD%CMNHNAME = TRIM(YPSALT_INI(ISV_NAME_IDX))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) - IF (IRESP/=0) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR',TRIM(TZFIELD%CMNHNAME)//' not found in the CHEM file '//TRIM(HCHEMFILE)) - END IF !IRESP - END DO ! JMOM - END DO !JMOD - END IF !if IMOMENTS + 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(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)) + END IF !IRESP + END DO ! JSV ! IF (LDEPOS_SLT(IMI)) THEN TZFIELD%CSTDNAME = '' diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90 index eb49412fa..dc3fd036f 100644 --- a/src/MNH/write_lbn.f90 +++ b/src/MNH/write_lbn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1998-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1998-2021 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -75,8 +75,9 @@ END MODULE MODI_WRITE_LB_n !! P. Tulet 09/14 modif SALT !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! J.-P. Pinty 09/02/16 Add LIMA that is LBC for CCN and IFN -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! 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 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -143,8 +144,6 @@ LOGICAL, DIMENSION (7) :: GUSER ! array with the use indicator of the 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 -! Integers, counters for dust modes -INTEGER :: JMOM, IMOMENTS, JMODE, ISV_NAME_IDX INTEGER :: IMI ! Current model index CHARACTER(LEN=2) :: INDICE ! to index CCN and IFN fields of LIMA scheme INTEGER :: I @@ -611,123 +610,51 @@ IF (NSV >=1) THEN CALL DUSTLFI_n(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY) END IF ! - IF ((CPROGRAM == 'REAL ').OR. (CPROGRAM == 'IDEAL ')) THEN - ! In this case CDUSTNAMES is not allocated. We will use YPDUST_INI, - !but remember that this variable does not follow JPDUSTORDER - IMOMENTS = INT(NSV_DSTEND - NSV_DSTBEG + 1)/NMODE_DST - !Should equal 3 at this point - IF (IMOMENTS > 3) THEN - WRITE(YMSG,*) 'number of DST moments must be 3',NSV_DSTBEG, NSV_DSTEND,NMODE_DST,IMOMENTS - CALL PRINT_MSG(NVERB_FATAL,'GEN','WRITE_LB_n',YMSG) - END IF ! Test IMOMENTS - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - IF (IMOMENTS == 1) THEN - DO JMODE=1, NMODE_DST - !Index from which names are picked - ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + 2 - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + 1 & !Number of moments in this mode - + (NSV_DSTBEG -1) !Previous list of tracers - - IF(NSIZELBXSV_ll /= 0) THEN !Check on border points in X direction - TZFIELD%CMNHNAME = 'LBX_'//TRIM(YPDUST_INI(ISV_NAME_IDX)) - 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)) - ENDIF !Check on border points in X direction - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(YPDUST_INI(ISV_NAME_IDX)) - 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)) - ENDIF !Check on points in Y direction - ENDDO ! Loop on mode - ELSE ! valeur IMOMENTS =/ 1 - DO JMODE=1,NMODE_DST - DO JMOM=1,IMOMENTS - ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + JMOM - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + JMOM & !Number of moments in this mode - + (NSV_DSTBEG -1) - ! - IF(NSIZELBXSV_ll /= 0) THEN !Check on border points in X direction - TZFIELD%CMNHNAME = 'LBX_'//TRIM(YPDUST_INI(ISV_NAME_IDX)) - 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)) - ENDIF !Check on border points in X direction - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(YPDUST_INI(ISV_NAME_IDX)) - 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)) - ENDIF !Check on points in Y direction - ENDDO ! Loop on moments - ENDDO ! Loop on modes - END IF ! valeur IMOMENTS - - ELSE ! Test CPROGRAM - ! We are in the subprogram MESONH, CDUSTNAMES are allocated and are - !in the same order as the variables in XSVM (i.e. following JPDUSTORDER) - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD%CSTDNAME = '' + TZFIELD%CUNITS = 'ppp' + TZFIELD%CDIR = '' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + ! + DO JSV = NSV_DSTBEG,NSV_DSTEND + IF(NSIZELBXSV_ll /= 0) THEN + TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CLBTYPE = 'LBX' + WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV + CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) + END IF ! - DO JSV = NSV_DSTBEG,NSV_DSTEND + 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(CDUSTNAMES(JSV-NSV_DSTBEG+1)) + 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 + END IF ! IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) + 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 - 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 - END IF - ENDIF + END IF + ENDIF ! IF (LSALT) THEN DO JK=1,size(XLBXSVM,3) @@ -772,120 +699,50 @@ IF (NSV >=1) THEN END IF END IF ! - IF ((CPROGRAM == 'REAL ').OR. (CPROGRAM == 'IDEAL ')) THEN - ! In this case CSALTNAMES is not allocated. We will use YPSALT_INI, - !but remember that this variable does not follow JPSALTORDER - IMOMENTS = INT(NSV_SLTEND - NSV_SLTBEG + 1)/NMODE_SLT - !Should equal 3 at this point - IF (IMOMENTS > 3) THEN - WRITE(YMSG,*) 'number of SLT moments must be 3',NSV_SLTBEG, NSV_SLTEND,NMODE_SLT,IMOMENTS - CALL PRINT_MSG(NVERB_FATAL,'GEN','WRITE_LB_n',YMSG) - END IF ! Test IMOMENTS - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - IF (IMOMENTS == 1) THEN - DO JMODE=1, NMODE_SLT - !Index from which names are picked - ISV_NAME_IDX = (JPSALTORDER(JMODE) - 1)*3 + 2 - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + 1 & !Number of moments in this mode - + (NSV_SLTBEG -1) !Previous list of tracers - - IF(NSIZELBXSV_ll /= 0) THEN !Check on border points in X direction - TZFIELD%CMNHNAME = 'LBX_'//TRIM(YPSALT_INI(ISV_NAME_IDX)) - 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)) - ENDIF !Check on border points in X direction - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(YPSALT_INI(ISV_NAME_IDX)) - 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)) - ENDIF !Check on points in Y direction - ENDDO ! Loop on mode - ELSE ! valeur IMOMENTS =/ 1 - DO JMODE=1,NMODE_SLT - DO JMOM=1,IMOMENTS - ISV_NAME_IDX = (JPSALTORDER(JMODE) - 1)*3 + JMOM - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + JMOM & !Number of moments in this mode - + (NSV_SLTBEG -1) - - IF(NSIZELBXSV_ll /= 0) THEN !Check on border points in X direction - TZFIELD%CMNHNAME = 'LBX_'//TRIM(YPSALT_INI(ISV_NAME_IDX)) - 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)) - ENDIF !Check on border points in X direction - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(YPSALT_INI(ISV_NAME_IDX)) - 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)) - ENDIF !Check on points in Y direction - ENDDO ! Loop on moments - ENDDO ! Loop on modes - END IF ! valeur IMOMENTS - ELSE ! Test CPROGRAM - ! We are in the subprogram MESONH, CSALTNAMES are allocated and are - !in the same order as the variables in XSVM (i.e. following JPSALTORDER) - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD%CSTDNAME = '' + TZFIELD%CUNITS = 'ppp' + TZFIELD%CDIR = '' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + ! + DO JSV = NSV_SLTBEG,NSV_SLTEND + IF(NSIZELBXSV_ll /= 0) THEN + TZFIELD%CMNHNAME = 'LBX_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CLBTYPE = 'LBX' + WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV + CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) + END IF ! - DO JSV = NSV_SLTBEG,NSV_SLTEND + 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(CSALTNAMES(JSV-NSV_SLTBEG+1)) + 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 + END IF ! IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) + 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 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 - END IF + END IF ENDIF ! ! lagrangian variables diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index eabe11f28..c84b0606a 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -163,16 +163,17 @@ END MODULE MODI_WRITE_LFIFM_n !! 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 11/07/2016 removed MNH_NCWRIT define -!! JP Chaboureau 27/11/2017 add wind tendency forcing -!! 02/2018 Q.Libois move Diagnostic related to the radiations in radiations.f90 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! V. Vionnet 07/2017, add blowing snow variables -!! P.Wautelet 11/01/2019: bug correction in write XBL_DEPTH->XSBL_DEPTH -!! C.Lac 18/02/2019: add rain fraction as an output field -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 11/07/2016: remove MNH_NCWRIT define +! V. Vionnet 07/2017: add blowing snow variables +! JP Chaboureau 27/11/2017: add wind tendency forcing +! Q. Libois 02/2018: move Diagnostic related to the radiations in radiations.f90 +! P. Wautelet 11/01/2019: bug correction in write XBL_DEPTH->XSBL_DEPTH +! C. Lac 18/02/2019: add rain fraction as an output field +! S. Bielli 02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Tulet 02/2020: correction for dust and sea salts +! P. Wautelet 10/03/2021: use scalar variable names for dust and salt !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -295,8 +296,6 @@ INTEGER :: JSA ! beginning of chemical-aerosol variables CHARACTER(LEN=3) :: YFRC ! to mark the time of the forcing INTEGER :: JT ! loop index ! -INTEGER :: JMOM, IMOMENTS, JMODE, ISV_NAME_IDX ! dust modes -! REAL,DIMENSION(:,:), ALLOCATABLE :: ZWORK2D ! Working array REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D ! Working array ! @@ -1159,82 +1158,25 @@ IF (NSV >=1) THEN 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 - IF ((CPROGRAM == 'REAL ').AND.((LDSTINIT).OR.(LDSTPRES)).OR.& - (CPROGRAM == 'IDEAL ') ) THEN - ! In this case CDUSTNAMES is not allocated. We will use YPDUST_INI, - !but remember that this variable does not follow JPDUSTORDER - IMOMENTS = INT(NSV_DSTEND - NSV_DSTBEG+1)/NMODE_DST - !Should equal 3 at this point - IF (IMOMENTS > 3) THEN - WRITE(ILUOUT,*) 'Error in write_lfin: number of moments must be less or equal to 3' - WRITE(ILUOUT,*) NSV_DSTBEG, NSV_DSTEND,NMODE_DST,IMOMENTS - call Print_msg( NVERB_FATAL, 'GEN', 'WRITE_LFIFM_n', 'number of moments must be less or equal to 3' ) - END IF ! Test IMOMENTS - ALLOCATE(YDSTNAMES(NSV_DSTEND - NSV_DSTBEG+1)) - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - IF (IMOMENTS == 1) THEN - DO JMODE=1, NMODE_DST - ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + 2 - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + 1 & !Number of moments in this mode - + (NSV_DSTBEG -1) !Previous list of tracers - TZFIELD%CMNHNAME = TRIM(YPDUST_INI(ISV_NAME_IDX))//'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)) - YDSTNAMES((JMODE-1)*IMOMENTS+1)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on mode - ELSE - DO JMODE=1,NMODE_DST - DO JMOM=1,IMOMENTS - ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + JMOM - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + JMOM & !Number of moments in this mode - + (NSV_DSTBEG -1) - TZFIELD%CMNHNAME = TRIM(YPDUST_INI(ISV_NAME_IDX))//'T' !The refererence which will be written to file - 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)) - YDSTNAMES((JMODE-1)*IMOMENTS+JMOM)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on moment - END DO ! loop on mode - END IF ! Valeur IMOMENTS -! - DO JSV = NSV_DSTBEG,NSV_DSTEND - YCHNAMES(JSV-JSA) = YDSTNAMES(JSV-NSV_DSTBEG+1) - END DO - DEALLOCATE(YDSTNAMES) - ELSE - ! We are in the subprogram MESONH, CDUSTNAMES are allocated and are - !in the same order as the variables in XSVT (i.e. following JPDUSTORDER) - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) - DO JSV = NSV_DSTBEG,NSV_DSTEND - TZFIELD%CMNHNAME = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_DSTBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTBEG ',JSV - IF (JSV==NSV_DSTEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on dust scalar variables - END IF + TZFIELD%CSTDNAME = '' + TZFIELD%CUNITS = 'ppp' + TZFIELD%CDIR = 'XY' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + ! + CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) + DO JSV = NSV_DSTBEG,NSV_DSTEND + TZFIELD%CMNHNAME = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) + IF (JSV==NSV_DSTBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTBEG ',JSV + IF (JSV==NSV_DSTEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTEND ',JSV + YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) + END DO ! Loop on dust scalar variables + IF (LDEPOS_DST(IMI)) THEN TZFIELD%CSTDNAME = '' TZFIELD%CUNITS = 'ppp' @@ -1252,9 +1194,9 @@ IF (NSV >=1) THEN 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 + END DO ! Loop on aq dust scalar variables ENDIF - ENDIF + ENDIF ! sea salt scalar variables IF (LSALT) THEN IF ((CPROGRAM == 'REAL ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT)) & @@ -1263,80 +1205,25 @@ IF (NSV >=1) THEN 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 - IF (((CPROGRAM == 'REAL ').AND.(LSLTINIT)).OR.& - (CPROGRAM == 'IDEAL ') ) THEN - ! In this case CSALTNAMES is not allocated. We will use YPSALT_INI, - !but remember that this variable does not follow JPSALTORDER - IMOMENTS = INT(NSV_SLTEND - NSV_SLTBEG+1)/NMODE_SLT - !Should equal 3 at this point - IF (IMOMENTS .NE. 3) THEN - WRITE(ILUOUT,*) 'Error in write_lfin: number of moments must be equal to 3' - WRITE(ILUOUT,*) NSV_SLTBEG, NSV_SLTEND,NMODE_SLT,IMOMENTS - call Print_msg( NVERB_FATAL, 'GEN', 'WRITE_LFIFM_n', 'number of moments must be equal to 3' ) - END IF - ALLOCATE(YSLTNAMES(NSV_SLTEND - NSV_SLTBEG+1)) - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. -! - IF (IMOMENTS == 1) THEN - DO JMODE=1, NMODE_SLT - ISV_NAME_IDX = (JPSALTORDER(JMODE) - 1)*3 + 2 - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + 1 & !Number of moments in this mode - + (NSV_SLTBEG -1) !Previous list of tracers - TZFIELD%CMNHNAME = TRIM(YPSALT_INI(ISV_NAME_IDX))//'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)) - YSLTNAMES((JMODE-1)*IMOMENTS+1)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on mode - ELSE - DO JMODE=1, NMODE_SLT - DO JMOM = 1, IMOMENTS - ISV_NAME_IDX = (JPSALTORDER(JMODE) - 1)*IMOMENTS + JMOM - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + JMOM & !Number of moments in this mode - + (NSV_SLTBEG -1) - TZFIELD%CMNHNAME = TRIM(YPSALT_INI(ISV_NAME_IDX))//'T' !The refererence which will be written to file - 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)) - YSLTNAMES((JMODE-1)*IMOMENTS+JMOM)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on moment - END DO ! loop on mode - END IF ! IMOMENTS - ! - DO JSV = NSV_SLTBEG,NSV_SLTEND - YCHNAMES(JSV-JSA) = YSLTNAMES(JSV-NSV_SLTBEG+1) - END DO - DEALLOCATE(YSLTNAMES) - ELSE - ! We are in the subprogram MESONH, CSALTNAMES are allocated and are - !in the same order as the variables in XSVT (i.e. following JPSALTORDER) - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF) - DO JSV = NSV_SLTBEG,NSV_SLTEND - TZFIELD%CMNHNAME = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_SLTBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTBEG ',JSV - IF (JSV==NSV_SLTEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on sea salt scalar variables - END IF + TZFIELD%CSTDNAME = '' + TZFIELD%CUNITS = 'ppp' + TZFIELD%CDIR = 'XY' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + ! + CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF) + DO JSV = NSV_SLTBEG,NSV_SLTEND + TZFIELD%CMNHNAME = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) + IF (JSV==NSV_SLTBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTBEG ',JSV + IF (JSV==NSV_SLTEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTEND ',JSV + YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) + END DO ! Loop on sea salt scalar variables + IF (LDEPOS_SLT(IMI)) THEN TZFIELD%CSTDNAME = '' TZFIELD%CUNITS = 'ppp' -- GitLab