diff --git a/conf/profile_mesonh.ihm b/conf/profile_mesonh.ihm index 32b64a983dcc575372ec0ce3c7d9468ea8703be5..74bcb1f6d5887136a68edb09031c584fbe1d8bb5 100755 --- a/conf/profile_mesonh.ihm +++ b/conf/profile_mesonh.ihm @@ -1,5 +1,5 @@ #!/bin/bash -#MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +#MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier #MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence #MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt #MNH_LIC for details. version 1. @@ -171,8 +171,7 @@ export VARTTY=\`tty\` # # Variable depending on \$ARCH # -[ -f \${SRC_MESONH}/conf/conf_\${ARCH} ] && . \${SRC_MESONH}/conf/conf_\${ARCH} - +[ ! -f \${SRC_MESONH}/conf/conf_\${ARCH} ] || . \${SRC_MESONH}/conf/conf_\${ARCH} # # Optional Environnement variable/Module Env # diff --git a/src/LIB/MPIvide/mpivide.c b/src/LIB/MPIvide/mpivide.c index eebe91b71a8e3178634fb98688f9118c8325037b..70139b5ea4fee4020ce6986207fbb66b924f8a0a 100644 --- a/src/LIB/MPIvide/mpivide.c +++ b/src/LIB/MPIvide/mpivide.c @@ -1,11 +1,12 @@ /* -MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt MNH_LIC for details. version 1. */ /* Modifications : P. Wautelet 19/11/2021: add function findtypesize + improve/add support for 32 and 64 bits variables + add mpi_reduce + J. Escobar 22/09/2022: add MPI_Sendrecv */ #include <stdio.h> @@ -158,6 +159,20 @@ int *__ierr; *__ierr = 0; } +#pragma weak mpi_sendrecv__ = mpi_sendrecv +#pragma weak mpi_sendrecv_ = mpi_sendrecv +void mpi_sendrecv(void *sendbuf, int *sendcounts, int *sendtype, int *dest , int *sendtag , + void *recvbuf, int *recvcounts, int *recvtype, int *source, int *recvtag , + int *comm, int *__ierr) +{ + int size; + + disppass("sendrecv"); + size = findtypesize(*sendtype); + memcpy(recvbuf, sendbuf, (*recvcounts)*size); + + *__ierr = 0; +} #pragma weak mpi_alltoallv__ = mpi_alltoallv #pragma weak mpi_alltoallv_ = mpi_alltoallv diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 index 7a763a67522b523f8c5ddee29f6449c4b89e3697..5a387ac24a205b5977d6801463847c8e880b7ca1 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 @@ -19,6 +19,7 @@ ! P. Wautelet 04/12/2020: add IO_Field_create and IO_Ndimlist_reduce subroutines ! P. Wautelet 07/12/2020: add support for partial write of fields (optional argument: koffset, not all subroutines, no LFI spport) ! P. Wautelet 14/01/2021: add IO_Field_write_byname_N4 and IO_Field_write_byfield_N4 subroutines +! P. Wautelet 07/04/2023: correct IO_Field_user_write examples !----------------------------------------------------------------- #define MNH_SCALARS_IN_SPLITFILES 0 @@ -3049,6 +3050,7 @@ end subroutine IO_Ndimlist_reduce ! CALL IO_Format_write_select(TPFILE,GLFI,GNC4) ! +!PW: transferer ce traitement LFI dans les subroutines LFI (en creer 1 pour les HFIELD) IF(GLFI) THEN ILE=LEN(HFIELD) IP=SIZE(HFIELD) @@ -4223,9 +4225,10 @@ END DO END SUBROUTINE IO_Fieldlist_write -SUBROUTINE IO_Field_user_write(TPOUTPUT) +SUBROUTINE IO_Field_user_write( TPOUTPUT ) ! #if 0 +! IMPORTANT: uncomment the previous line (set to '#if 1') if you want to use the next lines USE MODD_DYN_n, ONLY: XTSTEP USE MODD_FIELD_n, ONLY: XUT, XVT, XRT, XTHT, XSVT USE MODD_PARAMETERS, ONLY: JPVEXT @@ -4239,86 +4242,93 @@ TYPE(TOUTBAK), INTENT(IN) :: TPOUTPUT !Output structure TYPE(TFIELDMETADATA) :: TZFIELD ! #if 0 -INTEGER :: IKB +! IMPORTANT: uncomment the previous line (set to '#if 1') if you want to use the next lines ! +INTEGER :: IKB + IKB=JPVEXT+1 -! -TZFIELD%CMNHNAME = 'UTLOW' -TZFIELD%CSTDNAME = 'x_wind' -TZFIELD%CLONGNAME = '' -TZFIELD%CUNITS = 'm s-1' -TZFIELD%CDIR = 'XY' -TZFIELD%CCOMMENT = 'X_Y_Z_U component of wind at lowest physical level' -TZFIELD%NGRID = 2 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 2 -TZFIELD%LTIMEDEP = .TRUE. -CALL IO_Field_write(TPOUTPUT%TFILE,TZFIELD,XUT(:,:,IKB)) -! -TZFIELD%CMNHNAME = 'VTLOW' -TZFIELD%CSTDNAME = 'y_wind' -TZFIELD%CLONGNAME = '' -TZFIELD%CUNITS = 'm s-1' -TZFIELD%CDIR = 'XY' -TZFIELD%CCOMMENT = 'X_Y_Z_V component of wind at lowest physical level' -TZFIELD%NGRID = 3 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 2 -TZFIELD%LTIMEDEP = .TRUE. -CALL IO_Field_write(TPOUTPUT%TFILE,TZFIELD,XVT(:,:,IKB)) -! -TZFIELD%CMNHNAME = 'THTLOW' -TZFIELD%CSTDNAME = 'air_potential_temperature' -TZFIELD%CLONGNAME = '' -TZFIELD%CUNITS = 'K' -TZFIELD%CDIR = 'XY' -TZFIELD%CCOMMENT = 'X_Y_Z_potential temperature at lowest physical level' -TZFIELD%NGRID = 1 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 2 -TZFIELD%LTIMEDEP = .TRUE. -CALL IO_Field_write(TPOUTPUT%TFILE,TZFIELD,XTHT(:,:,IKB)) -! -TZFIELD%CMNHNAME = 'RVTLOW' -!TZFIELD%CSTDNAME = 'humidity_mixing_ratio' !ratio of the mass of water vapor to the mass of dry air -TZFIELD%CSTDNAME = 'specific_humidity' !mass fraction of water vapor in (moist) air -TZFIELD%CLONGNAME = '' -TZFIELD%CUNITS = 'kg kg-1' -TZFIELD%CDIR = 'XY' -TZFIELD%CCOMMENT = 'X_Y_Z_Vapor mixing Ratio at lowest physical level' -TZFIELD%NGRID = 1 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 2 -TZFIELD%LTIMEDEP = .TRUE. -CALL IO_Field_write(TPOUTPUT%TFILE,TZFIELD,XRT(:,:,IKB,1)) -! -TZFIELD%CMNHNAME = 'ACPRRSTEP' -TZFIELD%CSTDNAME = 'rainfall_amount' -TZFIELD%CLONGNAME = '' -TZFIELD%CUNITS = 'kg m-2' -TZFIELD%CDIR = '' -TZFIELD%CCOMMENT = 'X_Y_ACcumulated Precipitation Rain Rate during timestep' -TZFIELD%NGRID = 1 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 2 -TZFIELD%LTIMEDEP = .TRUE. + +TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UTLOW', & + CLONGNAME = '', & + CSTDNAME = 'x_wind', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X-component of wind at lowest physical level', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) +CALL IO_Field_write( TPOUTPUT%TFILE, TZFIELD, XUT(:,:,IKB) ) + +TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VTLOW', & + CLONGNAME = '', & + CSTDNAME = 'y_wind', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Y-component of wind at lowest physical level', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) +CALL IO_Field_write( TPOUTPUT%TFILE, TZFIELD, XVT(:,:,IKB) ) + +TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THTLOW', & + CLONGNAME = '', & + CSTDNAME = 'air_potential_temperature', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'potential temperature at lowest physical level', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) +CALL IO_Field_write( TPOUTPUT%TFILE, TZFIELD, XTHT(:,:,IKB) ) + +TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RVTLOW', & + CLONGNAME = '', & + ! CSTDNAME = 'humidity_mixing_ratio', & !ratio of the mass of water vapor to the mass of dry air + CSTDNAME = 'specific_humidity', & !mass fraction of water vapor in (moist) air + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'Vapor mixing Ratio at lowest physical level', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) +CALL IO_Field_write( TPOUTPUT%TFILE, TZFIELD, XRT(:,:,IKB,1) ) + +TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ACPRRSTEP', & + CLONGNAME = '', & + CSTDNAME = 'rainfall_amount', & + CUNITS = 'kg m-2', & + CDIR = 'XY', & + CCOMMENT = 'ACcumulated Precipitation Rain Rate during timestep', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) !XACPRR is multiplied by 1000. to convert from m to kg m-2 (water density is assumed to be 1000 kg m-3) -CALL IO_Field_write(TPOUTPUT%TFILE,TZFIELD,XINPRR*XTSTEP*1.0E3) -! -TZFIELD%CMNHNAME = 'SVT001' -TZFIELD%CSTDNAME = 'concentration in scalar variable' -TZFIELD%CLONGNAME = '' -TZFIELD%CUNITS = 'kg kg-1' -TZFIELD%CDIR = 'XY' -TZFIELD%CCOMMENT = 'X_Y_Z_concentration in scalar variable' -TZFIELD%NGRID = 1 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 3 -TZFIELD%LTIMEDEP = .TRUE. -CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TZFIELD,XSVT(:,:,:,1)) -! +CALL IO_Field_write( TPOUTPUT%TFILE, TZFIELD, XINPRR*XTSTEP*1.0E3 ) + +TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SVT001', & + CLONGNAME = 'SVT001', & + CSTDNAME = '', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'concentration in scalar variable', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) +CALL IO_Field_write( TPOUTPUT%TFILE, TZFIELD, XSVT(:,:,:,1) ) #endif -! + END SUBROUTINE IO_Field_user_write END MODULE MODE_IO_FIELD_WRITE diff --git a/src/MNH/aer_clim_surf.f90 b/src/MNH/aer_clim_surf.f90 new file mode 100644 index 0000000000000000000000000000000000000000..fc6af75afd9161afa3aa13837be8b4c9b700e258 --- /dev/null +++ b/src/MNH/aer_clim_surf.f90 @@ -0,0 +1,182 @@ +!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ########################## + MODULE MODI_AER_CLIM_SURF +! ########################## +! +INTERFACE +! + SUBROUTINE AER_CLIM_SURF( PLAT, PLON, PAESEA, PAELAN, PAEURB, PAEDES ) +! +REAL, DIMENSION(:,:), INTENT(IN) :: PLAT, PLON ! arrays of latitude-longitude +! +REAL, DIMENSION (:), INTENT(OUT) :: PAESEA, PAELAN, PAEURB, PAEDES +! +END SUBROUTINE AER_CLIM_SURF +! +END INTERFACE +! +END MODULE MODI_AER_CLIM_SURF +! +! +! ################################################################### + SUBROUTINE AER_CLIM_SURF(PLAT, PLON, PAESEA, PAELAN, PAEURB, PAEDES ) +! ################################################################### +! +!!**** *INI_RADIATIONS * - initialisation for ECMWF radiation scheme in the MesoNH framework +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. Masson : extract the Aerosol initialization by surface types from ini_radiation_ecmwf.f90 routine +!! +!! MODIFICATIONS +!! ------------- +!! Original 03/2023 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!MESO-NH modules +! +USE MODE_ll +USE MODD_CONF, ONLY : LCARTESIAN +USE MODD_PARAM_n, ONLY : CSURF +! +USE MODI_MNHGET_SURF_PARAM_n +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:,:), INTENT(IN) :: PLAT, PLON ! arrays of latitude-longitude +! +REAL, DIMENSION (:), INTENT(OUT) :: PAESEA, PAELAN, PAEURB, PAEDES +! +! +!* 0.2 declarations of local variables +! +INTEGER :: JI, JJ, IIJ ! loop index +! +INTEGER :: IIB ! I index value of the first inner mass point +INTEGER :: IJB ! J index value of the first inner mass point +INTEGER :: IIE ! I index value of the last inner mass point +INTEGER :: IJE ! J index value of the last inner mass point +INTEGER :: IIU ! array size for the first index +INTEGER :: IJU ! array size for the second index +! +REAL, DIMENSION(:,:),ALLOCATABLE :: ZLON ! longitude +! +! Variables for aerosols and ozone climatologies set up +LOGICAL, DIMENSION (:,:),ALLOCATABLE :: GAFRICA, GASIA, GAUSTRALIA +REAL, DIMENSION (:,:), ALLOCATABLE :: ZDESERT ! desert fraction +REAL, DIMENSION (:,:), ALLOCATABLE :: ZSEA ! sea fraction +REAL, DIMENSION (:,:), ALLOCATABLE :: ZTOWN ! town fraction +REAL, DIMENSION (:,:), ALLOCATABLE :: ZBARE ! bare soil fraction +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +!* 0.1 INITIALIZATIONS +! +! +!* 0.2 COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS +! +CALL GET_DIM_EXT_ll ('B',IIU,IJU) +! +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +! +!------------------------------------------------------------------------------- +! +!* 7. INITIALIZES THE ECMWF RADIATION PACKAGE +! ------------------------------------------------ +! +! AEROSOLS from SURFACE FRACTIONS +! + !* deserts are only considered over Africa, southern Asia, Australia + !* longitude between -180 and 180 for geographical tests + ! Only bare soil fractions larger than 0.5 are supposed to contribute to + ! desert aerosols + ! + ALLOCATE(ZSEA (IIU,IJU)) + ALLOCATE(ZTOWN (IIU,IJU)) + ALLOCATE(ZBARE (IIU,IJU)) + IF (CSURF=='EXTE') THEN + CALL MNHGET_SURF_PARAM_n(PSEA=ZSEA,PTOWN=ZTOWN,PBARE=ZBARE) + ELSE + ZSEA (:,:) = 1. + ZTOWN(:,:) = 0. + ZBARE(:,:) = 0. + END IF + + + ALLOCATE(ZDESERT (IIU,IJU)) + ZDESERT(:,:) = 0. + + IF (.NOT.LCARTESIAN) THEN + !* deserts are only considered over Africa, southern Asia, Australia + ALLOCATE(ZLON (IIU,IJU)) + ALLOCATE(GAFRICA (IIU,IJU)) + ALLOCATE(GASIA (IIU,IJU)) + ALLOCATE(GAUSTRALIA(IIU,IJU)) + !* longitude between -180 and 180 for geographical tests + ZLON = PLON(:,:) - NINT(PLON/360.)*360. + GAFRICA (:,:) = PLAT(:,:) > -36.086389 .AND. PLAT(:,:) < 36.010556 & + .AND. ZLON(:,:) > -73.18 .AND. ZLON(:,:) < 34.158611 + GASIA (:,:) = PLAT(:,:) > 4.358056 .AND. PLAT(:,:) < 55.335278 & + .AND. ZLON(:,:) > -123.157778 .AND. ZLON(:,:) <-34.285556 + GAUSTRALIA(:,:) = PLAT(:,:) > -39.561389 .AND. PLAT(:,:) < -10.251667 & + .AND. ZLON(:,:) > -155.041944 .AND. ZLON(:,:) < -111.405556 + ! + ! Only bare soil fractions larger than 0.5 are supposed to contribute to + ! desert aerosols + ! + WHERE (GAFRICA(:,:) .OR. GASIA(:,:) .OR. GAUSTRALIA(:,:)) & + ZDESERT(:,:) = MAX( 2.*(ZBARE(:,:)-0.5) , 0.) + ! + ! + ELSE + ! + ZDESERT(:,:) = MAX( 2.*(ZBARE(:,:)-0.5) , 0.) + ! + ENDIF + ! + !* fills sea, town, desert and land surface covers for aerosols distributions + DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + PAESEA(IIJ) = ZSEA(JI,JJ) + PAEURB(IIJ) = ZTOWN(JI,JJ) + PAEDES(IIJ) = ZDESERT(JI,JJ) + PAELAN(IIJ) = MAX( 1.- PAESEA(IIJ) - PAEURB(IIJ) - PAEDES(IIJ) , 0.) + END DO + END DO + IF (ALLOCATED(ZLON)) DEALLOCATE(ZLON) + IF (ALLOCATED(GAFRICA)) DEALLOCATE(GAFRICA) + IF (ALLOCATED(GASIA)) DEALLOCATE(GASIA) + IF (ALLOCATED(GAUSTRALIA)) DEALLOCATE(GAUSTRALIA) + IF (ALLOCATED(ZDESERT)) DEALLOCATE(ZDESERT) + +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE AER_CLIM_SURF diff --git a/src/MNH/aer_monitorn.f90 b/src/MNH/aer_monitorn.f90 index 22d5f69a9b8e052d1f28a46fe8a2d524a9e5913c..ec800306eab3ece233568cc174bb489d21e5799f 100644 --- a/src/MNH/aer_monitorn.f90 +++ b/src/MNH/aer_monitorn.f90 @@ -347,8 +347,6 @@ SELECT CASE (CCLOUD) XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,2), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,3), & - ZRCS(IIB:IIE,IJB:IJE,IKB:IKE), & - ZRRS(IIB:IIE,IJB:IJE,IKB:IKE), & ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & XTHT(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & @@ -366,8 +364,6 @@ SELECT CASE (CCLOUD) XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,2), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,3), & - ZRCS(IIB:IIE,IJB:IJE,IKB:IKE), & - ZRRS(IIB:IIE,IJB:IJE,IKB:IKE), & ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & XTHT(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & @@ -385,8 +381,6 @@ CASE ('LIMA') XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,2), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,3), & - ZRCS(IIB:IIE,IJB:IJE,IKB:IKE), & - ZRRS(IIB:IIE,IJB:IJE,IKB:IKE), & ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & XTHT(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & @@ -537,8 +531,6 @@ SELECT CASE (CCLOUD) XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,2), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,3), & - ZRCS(IIB:IIE,IJB:IJE,IKB:IKE), & - ZRRS(IIB:IIE,IJB:IJE,IKB:IKE), & ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & XTHT(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & @@ -556,8 +548,6 @@ SELECT CASE (CCLOUD) XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,2), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,3), & - ZRCS(IIB:IIE,IJB:IJE,IKB:IKE), & - ZRRS(IIB:IIE,IJB:IJE,IKB:IKE), & ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & XTHT(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & @@ -574,8 +564,6 @@ SELECT CASE (CCLOUD) XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,2), & XRT(IIB:IIE,IJB:IJE,IKB:IKE,3), & - ZRCS(IIB:IIE,IJB:IJE,IKB:IKE), & - ZRRS(IIB:IIE,IJB:IJE,IKB:IKE), & ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & XTHT(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & diff --git a/src/MNH/aer_wet_dep_kmt_warm.f90 b/src/MNH/aer_wet_dep_kmt_warm.f90 index 40083c0c1e3c9336156114b3148db8d5f8f99354..d0ebbdfff6edd447323c9d85a65c73b6aad43aef 100644 --- a/src/MNH/aer_wet_dep_kmt_warm.f90 +++ b/src/MNH/aer_wet_dep_kmt_warm.f90 @@ -12,7 +12,7 @@ INTERFACE !! SUBROUTINE AER_WET_DEP_KMT_WARM(KSPLITR, PTSTEP, PZZ, PRHODREF, & PRCT, PRRT, & - PRCS, PRRS, PSVT, PTHT, & + PSVT, PTHT, & PPABST, PRGAER, PEVAP3D, KMODE, & PDENSITY_AER, PMASSMIN, PSEA, PTOWN, & PCCT, PCRT ) @@ -30,8 +30,6 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Tracer m.r. at t ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS ! Cloud water conc derived from source term -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS ! Rain water conc derifed from source term REAL, DIMENSION(:,:,:), INTENT(IN) :: PEVAP3D ! Instantaneous 3D Rain Evaporation flux (KG/KG/S) ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT !Potential temp @@ -53,7 +51,7 @@ END MODULE MODI_AER_WET_DEP_KMT_WARM ! ############################################################### SUBROUTINE AER_WET_DEP_KMT_WARM (KSPLITR, PTSTEP, PZZ, & PRHODREF, PRCT, PRRT, & - PRCS, PRRS, PSVT, PTHT, & + PSVT, PTHT, & PPABST, PRGAER, PEVAP3D, KMODE, & PDENSITY_AER, PMASSMIN, PSEA, PTOWN, & PCCT, PCRT ) @@ -123,14 +121,16 @@ END MODULE MODI_AER_WET_DEP_KMT_WARM ! ------------ ! USE MODD_CST -USE MODD_RAIN_ICE_PARAM +USE MODD_RAIN_ICE_PARAM, ONLY : YEXCACCR=>XEXCACCR, XFSEDC, XFCACCR,& + XEXSEDR, XCRIAUTC, XFSEDR, XTIMAUTC,& + YFCACCR => XFCACCR !++th++ 10/05/17 USE MODD_RAIN_ICE_DESCR, ONLY : YRTMIN => XRTMIN, YCEXVT => XCEXVT, & XCONC_LAND, XCONC_SEA, XCONC_URBAN, & XNUC2, XALPHAC2, XNUC, XALPHAC, & YLBC => XLBC, XLBEXC, & XCCR, & - YLBR => XLBR, YLBEXR => XLBEXR + YLBR => XLBR, YLBEXR => XLBEXR !--th-- USE MODD_PRECIP_n USE MODI_AER_VELGRAV @@ -145,7 +145,8 @@ USE MODD_PARAM_LIMA_WARM, ONLY : WLBR => XLBR, WLBEXR => XLBEXR, & ! fo WLBC => XLBC, & XACCR1, XACCR2, XACCR3, XACCR4, XACCR5, & ! for XACCR_RLARGE1, XACCR_RLARGE2, & ! accr. - XACCR_RSMALL1, XACCR_RSMALL2 + XACCR_RSMALL1, XACCR_RSMALL2, & + WEXCACCR=>XEXCACCR, WFCACCR=>XFCACCR USE MODD_PARAM_n, ONLY: CCLOUD !--th-- @@ -165,8 +166,6 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Tracer m.r. at t ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS ! Cloud water m.r. from source term -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS ! Rain water m.r. from source term REAL, DIMENSION(:,:,:), INTENT(IN) :: PEVAP3D ! Instantaneous 3D Rain Evaporation flux (KG/KG/S) ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Potential temp @@ -263,7 +262,7 @@ INTEGER :: IKE REAL, DIMENSION(:), ALLOCATABLE :: KRTMIN REAL :: KCEXVT, KLBR, KLBEXR, KLBC, ZLBEXC REAL, DIMENSION(2) :: ZXLBC -REAL :: ZEXSEDR, ZDR +REAL :: ZEXSEDR, ZDR, ZEXCACCR, ZFCACCR ! !------------------------------------------------------------------------------- ! @@ -282,6 +281,8 @@ CASE('ICE3') KLBEXR = YLBEXR ZXLBC(:) = YLBC(:) ZLBEXC = XLBEXC + ZEXCACCR = YEXCACCR + ZFCACCR = YFCACCR CASE('LIMA') ALLOCATE(KRTMIN(SIZE(WRTMIN))) KRTMIN = WRTMIN @@ -291,6 +292,8 @@ CASE('LIMA') KLBC = WLBC ZLBEXC = 1.0 / 3.0 ZDR = 0.8 + ZEXCACCR = WEXCACCR + ZFCACCR = WFCACCR END SELECT !--cb-- ! @@ -361,9 +364,7 @@ CALL AER_WET_DEP_KMT_ICE_WARM ! CALL AER_WET_DEP_KMT_EVAP ! -!++cb++ DEALLOCATE(KRTMIN) -!--cb-- ! !------------------------------------------------------------------------------- ! @@ -396,12 +397,10 @@ INTEGER :: JKAQ ! counter for chemistry GCLOUD(:,:,:) = .FALSE. ! IF (PRESENT(PCCT)) THEN ! case KHKO, C2R2, C3R5, LIMA (2-moment schemes) - GCLOUD(:,:,:) = PRCS(:,:,:) > KRTMIN(2) .AND. PCCT(:,:,:) > XCTMIN(2) + GCLOUD(:,:,:) = PRCT(:,:,:) > KRTMIN(2) .AND. PCCT(:,:,:) > XCTMIN(2) ELSE ! Case ICE3, REVE, KESS, ... (1-moment schemes) - GCLOUD(:,:,:) = PRCS(:,:,:) > KRTMIN(2) + GCLOUD(:,:,:) = PRCT(:,:,:) > KRTMIN(2) END IF -!--cb-- -!--th-- ICLOUD = COUNTJV( GCLOUD(:,:,:),I1C(:),I2C(:),I3C(:)) IF( ICLOUD >= 1 ) THEN @@ -437,7 +436,7 @@ IF( ICLOUD >= 1 ) THEN ZTHT(JL) = PTHT(I1C(JL),I2C(JL),I3C(JL)) ZRC(JL) = ZRAY(I1C(JL),I2C(JL),I3C(JL)) ZPABST(JL) = PPABST(I1C(JL),I2C(JL),I3C(JL)) - ZRCT(JL) = PRCS(I1C(JL),I2C(JL),I3C(JL)) + ZRCT(JL) = PRCT(I1C(JL),I2C(JL),I3C(JL)) ZRHODREF(JL) = PRHODREF(I1C(JL),I2C(JL),I3C(JL)) ZMASSMIN(JL,:) = PMASSMIN(I1C(JL),I2C(JL),I3C(JL),:) ZWLBDC(JL) = ZLBC(I1C(JL),I2C(JL),I3C(JL)) @@ -711,7 +710,7 @@ DO JN = 1 , KSPLITR ZSVT(JL,KMODE*2+JKAQ) = PSVT(IR1(JL),IR2(JL),IR3(JL),KMODE*2+JKAQ) END DO ! - IF (PRESENT(PCRT)) ZCRT(JL) = PCRT(IR1(JL),IR2(JL),IR2(JL)) + IF (PRESENT(PCRT)) ZCRT(JL) = PCRT(IR1(JL),IR2(JL),IR3(JL)) ZRRT(JL) = PRRT(IR1(JL),IR2(JL),IR3(JL)) ZRHODREF(JL) = PRHODREF(IR1(JL),IR2(JL),IR3(JL)) ENDDO @@ -803,10 +802,12 @@ ZZRCT(:,:,:) = MAX(ZZRCT(:,:,:), KRTMIN(2)/2.) IF (PRESENT(PCRT)) THEN ! 2-moment schemes ! ! from lima_warm_coal.f90 (AUTO) - ZLBDC3(:,:,:) = XMNH_HUGE + ZLBDC3(:,:,:) = 1E40 + ! ZLBDC3(:,:,:) = XMNH_HUGE ZLBDC(:,:,:) = 1.E15 WHERE (ZZRCT(:,:,:) > KRTMIN(2) .AND. PCCT(:,:,:) > XCTMIN(2)) - ZLBDC3(:,:,:) = KLBC * PCCT(:,:,:) / PRCT(:,:,:) + ZLBDC3(:,:,:) = KLBC * PCCT(:,:,:) / ZZRCT(:,:,:) + ! ZLBDC3(:,:,:) = KLBC * PCCT(:,:,:) / PRCT(:,:,:) ZLBDC(:,:,:) = ZLBDC3(:,:,:)**ZLBEXC END WHERE ! @@ -814,14 +815,14 @@ IF (PRESENT(PCRT)) THEN ! 2-moment schemes WHERE (ZZRCT(:,:,:) > KRTMIN(2)) ZZW3(:,:,:) = MAX(0.0, XLAUTR*PRHODREF(:,:,:)*ZZRCT(:,:,:)* & (XAUTO1/ZLBDC3(:,:,:)**4-XLAUTR_THRESHOLD)) ! L - ZZW4(:,:,:) = MIN(PRCS(:,:,:), MAX(0.0, XITAUTR*ZZW3(:,:,:)*ZZRCT(:,:,:)* & + ZZW4(:,:,:) = MIN(PRCT(:,:,:), MAX(0.0, XITAUTR*ZZW3(:,:,:)*ZZRCT(:,:,:)* & (XAUTO2/ZLBDC3(:,:,:)-XITAUTR_THRESHOLD))) ! L/tau END WHERE ! ELSE ! 1-moment scheme ! - WHERE ((ZZRCT(:,:,:) > KRTMIN(2)) .AND. (PRCS(:,:,:) > 0.0)) - ZZW4(:,:,:) = MIN(PRCS(:,:,:), XTIMAUTC* & + WHERE ((ZZRCT(:,:,:) > KRTMIN(2)) .AND. (PRCT(:,:,:) > 0.0)) + ZZW4(:,:,:) = MIN(PRCT(:,:,:), XTIMAUTC* & MAX((ZZRCT(:,:,:)-XCRIAUTC/PRHODREF(:,:,:)), 0.0)) END WHERE ! @@ -853,12 +854,14 @@ IF (PRESENT(PCRT)) THEN ! 2-moment schemes ! from lima_warm_coal.f90 (ACCR) ZLBDR3(:,:,:) = 1.E30 ZLBDR(:,:,:) = 1.E10 + + WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3)) ZLBDAR(:,:,:) = KLBR * (PRHODREF(:,:,:) * PRRT(:,:,:))**KLBEXR ZLBDR3(:,:,:) = KLBR * PCRT(:,:,:) / PRRT(:,:,:) ZLBDR(:,:,:) = ZLBDR3(:,:,:)**KLBEXR - ZZW4(:,:,:) = MIN(PRCS(:,:,:), XFCACCR * ZZRCT(:,:,:) & - * ZLBDAR(:,:,:)**XEXCACCR & + ZZW4(:,:,:) = MIN(PRCT(:,:,:), ZFCACCR * ZZRCT(:,:,:) & + * ZLBDAR(:,:,:)**ZEXCACCR & * PRHODREF(:,:,:)**(-KCEXVT) ) ZDIM(:,:,:) = XACCR1 / ZLBDAR(:,:,:) END WHERE @@ -871,7 +874,7 @@ IF (PRESENT(PCRT)) THEN ! 2-moment schemes ZZW5(:,:,:) = ZLBDC3(:,:,:) / ZLBDR3(:,:,:) ZZW1(:,:,:) = (PCCT(:,:,:) * PCRT(:,:,:) / ZLBDC3(:,:,:)**2) * PRHODREF(:,:,:) ZZW4(:,:,:) = MIN(ZZW1(:,:,:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZZW5(:,:,:)), & - PRCS(:,:,:)) + PRCT(:,:,:)) END WHERE ! Accretion for D < 100 10-6 m WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3) .AND. & @@ -881,17 +884,17 @@ IF (PRESENT(PCRT)) THEN ! 2-moment schemes ZZW5(:,:,:) = (ZLBDC3(:,:,:) / ZLBDR3(:,:,:))**2 ZZW1(:,:,:) = (PCCT(:,:,:) * PCRT(:,:,:) / ZLBDC3(:,:,:)**3) * PRHODREF(:,:,:) ZZW4(:,:,:) = MIN(ZZW1(:,:,:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZZW5(:,:,:)), & - PRCS(:,:,:)) + PRCT(:,:,:)) END WHERE ! ELSE ! 1-moment schemes ! ZLBDR(:,:,:) = 0.0 WHERE ((ZZRCT(:,:,:) > KRTMIN(2)) .AND. (PRRT(:,:,:) > KRTMIN(3)) & - .AND. (PRCS(:,:,:) > 0.0)) + .AND. (PRCT(:,:,:) > 0.0)) ZLBDR(:,:,:) = KLBR * (PRHODREF(:,:,:) * PRRT(:,:,:))**KLBEXR - ZZW4(:,:,:) = MIN(PRCS(:,:,:), XFCACCR * ZZRCT(:,:,:) & - * ZLBDR(:,:,:)**XEXCACCR & + ZZW4(:,:,:) = MIN(PRCT(:,:,:), ZFCACCR * ZZRCT(:,:,:) & + * ZLBDR(:,:,:)**ZEXCACCR & * PRHODREF(:,:,:)**(-KCEXVT) ) END WHERE END IF @@ -960,7 +963,7 @@ ZWEVAP(:,:,:) = MAX(ZWEVAP(:,:,:), 0.0) ! no partial cloud evaporation at this stage ! ZMASK(:,:,:) = 0. -WHERE(PRCS(:,:,:) .LT. KRTMIN(2)) +WHERE(PRCT(:,:,:) .LT. KRTMIN(2)) ZMASK(:,:,:) = 1. END WHERE ! diff --git a/src/MNH/aerocamsn.f90 b/src/MNH/aerocamsn.f90 index b3ceb1d48989bf77722b0996b3845d3735e14c80..3b7dc1cd7e87b856e1ff4401412e68b43ee00074 100644 --- a/src/MNH/aerocamsn.f90 +++ b/src/MNH/aerocamsn.f90 @@ -52,6 +52,7 @@ END MODULE MODI_AEROCAMS_n !! USE MODE_AERO_PSD +USE MODD_CH_AEROSOL !! IMPLICIT NONE !! @@ -72,7 +73,14 @@ INTEGER :: JN DO JN =1,SIZE(PSV, 4) PSV(:,:,:,JN) = PSV(:,:,:,JN) * 1E9 / PRHODREF(:,:,:) + !print*, CAERONAMES(JN),' =',MINVAL(PSV(:,:,:,JN)), MAXVAL(PSV(:,:,:,JN)) ENDDO +PSV(:,:,:,JP_CH_BCi) = MAX(PSV(:,:,:,JP_CH_BCi), 1E-4) +PSV(:,:,:,JP_CH_BCj) = MAX(PSV(:,:,:,JP_CH_BCj), 1E-3) +PSV(:,:,:,JP_CH_OCi) = MAX(PSV(:,:,:,JP_CH_OCi), 1E-4) +PSV(:,:,:,JP_CH_OCj) = MAX(PSV(:,:,:,JP_CH_OCj), 1E-3) +PSV(:,:,:,JP_CH_DSTi) = MAX(PSV(:,:,:,JP_CH_DSTi), 1E-4) +PSV(:,:,:,JP_CH_DSTj) = MAX(PSV(:,:,:,JP_CH_DSTj), 1E-3) ! Compute moment from aerosol mass and conversion SV aerosols variables into ppv diff --git a/src/MNH/aerozon.f90 b/src/MNH/aerozon.f90 index b2e6b6c9f9ee75dcde79d6a0e985c75c1a35b0d8..899da024a9c03abead81a9be0afbd17cf4848c02 100644 --- a/src/MNH/aerozon.f90 +++ b/src/MNH/aerozon.f90 @@ -167,6 +167,7 @@ USE MODE_ll USE MODI_SHUMAN USE MODI_INI_RADCONF USE MODI_INI_HOR_AERCLIM +USE MODI_AER_CLIM_SURF USE MODI_SUECOZC USE MODI_RADOZC USE MODI_SUAERV @@ -232,7 +233,7 @@ REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZEXNT ! Exner functio ! ! Variables for aerosols and ozone climatologies set up -REAL, DIMENSION (:,:), ALLOCATABLE :: ZPAVE, ZWORK_GRID +REAL, DIMENSION (:,:), ALLOCATABLE :: ZWORK_GRID REAL, DIMENSION (:), ALLOCATABLE :: ZAESEA, ZAELAN, ZAEURB, ZAEDES ! REAL(KIND=JPRB), DIMENSION (:,:), ALLOCATABLE :: ZT_HL @@ -326,7 +327,6 @@ PCORSOL = 1.00011+0.034221*COS(ZAD) +0.001280*SIN(ZAD) & !* 8.1 set up for grid dependant quantitites (from initial state) ! ALLOCATE (ZPRES_HL(KDLON,KFLEV+1)) -ALLOCATE (ZPAVE(KDLON,KFLEV)) ALLOCATE (ZETAH(KDLON,KFLEV+1)) ALLOCATE (ZT_HL(KDLON,KFLEV+1)) ALLOCATE (ZGEMU(KDLON)) @@ -381,10 +381,6 @@ DO JKRAD=1, KFLEV+1 END DO DEALLOCATE(ZWORK_GRID) ! -DO JKRAD=1,KFLEV - ZPAVE(:,JKRAD)=0.5*(ZPRES_HL(:,JKRAD)+ZPRES_HL(:,JKRAD+1)) -END DO -! !coo geographique ! IF(.NOT.LCARTESIAN) THEN @@ -440,11 +436,16 @@ IF(HAER /= 'NONE') THEN ! ! AEROSOLS ECMWF climatologies ! - IF ( HAER == 'TEGE' ) THEN + IF ( HAER == 'TEGE' .OR. HAER=='TANR' ) THEN CALL INI_HOR_AERCLIM (HAER,IIB,IIE,IJB,IJE,KDLON,ZYMD,ZHOURS, & PLAT,PLON,ZAESEA,ZAELAN,ZAEURB,ZAEDES ) END IF + ! + IF( HAER =='SURF') THEN ! + CALL AER_CLIM_SURF(PLAT, PLON, ZAESEA, ZAELAN, ZAEURB, ZAEDES ) + END IF + ! ! ! 8.3.2 vertical ditributions (standard profiles derived from Tanre) ! @@ -468,6 +469,18 @@ IF(HAER /= 'NONE') THEN ! modification of initial ECMWF maximum optical thickness ! for aerosols classes in case of HAER=SURF ! note : these variables belongs to yoeaerd module +! +! modification of initial ECMWF maximum optical thickness +! for aerosols classes in case of HAER=SURF +! note : these variables belongs to yoeaerd module +! + IF ( HAER =='SURF') THEN + RCAEOPS = 0.001 ! Sea instead 0.02 to agree with TEGEN + RCAEOPL = 0.05 ! Land (continental) + RCAEOPU = 0.3 ! Urban zone + RCAEOPD = 0.5 ! Desert + END IF + ! ! final aerosol profiles on mnh grid ! @@ -516,9 +529,7 @@ DO JJ=IJB,IJE END DO ! ! -! DEALLOCATE (ZPRES_HL) -DEALLOCATE (ZPAVE) DEALLOCATE (ZT_HL) DEALLOCATE (ZETAH) DEALLOCATE (ZGEMU) diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index aae1d60926375bb97c3a7d58994ecd789aadad9f..1d03d38a3302f389102f31c53f9881b483849ac3 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -921,7 +921,7 @@ END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2 SUBROUTINE FLYER_RECORD_DATA( ) USE MODD_CST, ONLY: XCPD, XLAM_CRAD, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XTT -USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN, XCURRENT_TKE_DISS +USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_TKE_DISS USE MODD_GRID, ONLY: XBETA, XLON0, XRPK USE MODD_NSV, ONLY: NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI USE MODD_PARAMETERS, ONLY: JPVEXT @@ -1349,7 +1349,7 @@ END IF ! end LOOP ICE3 TPFLYER%XWZ (ISTORE,:) = FLYER_INTERPZ(ZWM(:,:,:)) IF (SIZE(PTKE)>0) TPFLYER%XTKE (ISTORE) = FLYER_INTERP(PTKE) IF (SIZE(PTS) >0) TPFLYER%XTSRAD(ISTORE) = FLYER_INTERP_2D(PTS) -IF (LDIAG_IN_RUN) TPFLYER%XTKE_DISS(ISTORE) = FLYER_INTERP(XCURRENT_TKE_DISS) +TPFLYER%XTKE_DISS(ISTORE) = FLYER_INTERP(XCURRENT_TKE_DISS) TPFLYER%XZS(ISTORE) = FLYER_INTERP_2D(PZ(:,:,1+JPVEXT)) TPFLYER%XTHW_FLUX(ISTORE) = FLYER_INTERP(ZTHW_FLUX) TPFLYER%XRCW_FLUX(ISTORE) = FLYER_INTERP(ZRCW_FLUX) diff --git a/src/MNH/budget.f90 b/src/MNH/budget.f90 index d453e9aabeea1d1c242f800c82e1560c3c58b545..140fd9147c4b75ed03c153c0588bbc48160882fc 100644 --- a/src/MNH/budget.f90 +++ b/src/MNH/budget.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -141,7 +141,7 @@ subroutine Budget_store_end( tpbudget, hsource, pvars ) call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_store_end', hbudget ) - if ( lcheck ) call Mppdb_check3d( pvars, 'BUD_INI::' // hbudget, precision ) + if ( lcheck ) call Mppdb_check3d( pvars, 'BUD_END::' // hbudget, precision ) if ( lles_call ) then if ( hsource /= tpbudget%clessource ) & @@ -240,7 +240,10 @@ end subroutine Budget_store_end subroutine Budget_store_add( tpbudget, hsource, pvars ) - use modd_les, only: lles_call + use modd_conf, only: lcheck + use modd_les, only: lles_call + + use mode_mppdb use modi_les_budget, only: Les_budget @@ -248,10 +251,15 @@ subroutine Budget_store_add( tpbudget, hsource, pvars ) character(len=*), intent(in) :: hsource ! Name of the source term real, dimension(:,:,:), intent(in) :: pvars ! Current value to be stored + character(len=:), allocatable :: hbudget integer :: iid ! Reference number of the current source term integer :: igroup ! Number of the group where to store the source term - call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_store_add', trim( tpbudget%cname )//':'//trim( hsource ) ) + hbudget = trim( tpbudget%cname )//':'//trim( hsource ) + + call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_store_add', hbudget ) + + if ( lcheck ) call Mppdb_check3d( pvars, 'BUD_ADD::' // hbudget, precision ) if ( tpbudget%ntmpstoresource /= 0 ) & call Print_msg( NVERB_ERROR, 'BUD', 'Budget_store_add', 'inside a Budget_store_init/Budget_store_end zone' ) diff --git a/src/MNH/ch_aer_coag.f90 b/src/MNH/ch_aer_coag.f90 index 87a97af5cb13d02cfe303f8e431a97330568cfb0..4e50174f9f637fed1dac8a6c648e773e8cfb21b4 100644 --- a/src/MNH/ch_aer_coag.f90 +++ b/src/MNH/ch_aer_coag.f90 @@ -14,15 +14,15 @@ !! INTERFACE !! -SUBROUTINE CH_AER_COAG(PM, PSIG0, PRG0, PN0,PDMINTRA,PDMINTER,PTGAS,PMU,& - PLAMBDA,PRHOP0) +SUBROUTINE CH_AER_COAG(PM,PLNSIG,PRG,PN,PDMINTRA,PDMINTER,& + PTEMP,PMU,PLAMBDA,PRHOP ) IMPLICIT NONE -REAL, DIMENSION(:,:), INTENT(INOUT) :: PM,PRHOP0 +REAL, DIMENSION(:,:), INTENT(INOUT) :: PM,PRHOP REAL, DIMENSION(:), INTENT(INOUT) :: PLAMBDA, PMU REAL, DIMENSION(:,:), INTENT(INOUT) :: PDMINTRA REAL, DIMENSION(:,:), INTENT(INOUT) :: PDMINTER -REAL, DIMENSION(:),INTENT(IN) :: PTGAS -REAL, DIMENSION(:,:), INTENT(IN) :: PSIG0, PRG0, PN0 +REAL, DIMENSION(:), INTENT(IN) :: PTEMP +REAL, DIMENSION(:,:), INTENT(IN) :: PLNSIG, PRG, PN END SUBROUTINE CH_AER_COAG !! END INTERFACE @@ -30,59 +30,43 @@ END INTERFACE END MODULE MODI_CH_AER_COAG !! !! ############################################# - SUBROUTINE CH_AER_COAG(PM, PSIG0, PRG0, PN0,PDMINTRA,PDMINTER,PTGAS,PMU,& - PLAMBDA,PRHOP0) + SUBROUTINE CH_AER_COAG(PM,PLNSIG,PRG,PN,PDMINTRA,PDMINTER,& + PTEMP,PMU,PLAMBDA,PRHOP ) !! ############################################# !! !! PURPOSE !! ------- -!! -!! compute the terms due to Brownian, turbulent and Gravitational -!! coagulation: +!! Compute the terms due to Brownian, turbulent and gravitational +!! coagulation: !! a set of arrays are used to evaluate the double integral -!! REFERENCE -!! --------- -!! none +!! Based on Whitby et al. 1991 : Appendix H !! -!! AUTHOR -!! ------ -!! Vincent Crassier (LA) +!! METHOD +!! ------ +!! * Arrays of numerical evaluation of coagulation terms +!! in the free-molecule regime (computed from the ESMAP code) +!! ZINTRA - Intamodal coagulation, mode i,j 0th and 6th Moment +!! ZINTER0I - Intermodal coagulation, mode i, 0th Moment +!! ZINTER3I - Intermodal coagulation, mode i, 3rd Moment +!! ZINTER6I - Intermodal coagulation, mode i, 6th Moment +!! ZINTER6J - Intermodal coagulation, mode j, 6th Moment !! -!! MODIFICATIONS -!! ------------- -!***************************************************************** -! * Arrays of numerical evaluation of coagulation terms -! in the free-molecule regime (computed from the ESMAP code) -! -! ZINTRA - Intamodal coagulation, mode i,j 0th and 6th Moment -! -! ZINTER0I - Intermodal coagulation, mode i, 0th Moment -! ZINTER3I - Intermodal coagulation, mode i, 3rd Moment -! ZINTER6I - Intermodal coagulation, mode i, 6th Moment -! ZINTER6J - Intermodal coagulation, mode j, 6th Moment -! -! * Variables used during the coefficients evaluation -! ZXI(i) - Variables values at the array nodes -! ZXINT(i) - Variables values where the interpolation -! is to be made -! -! intramodal coagulation -! -! ZXINTRAMIN - Minimal value of ln(sigma) -! ZXINTRAMAX - Maximal value of ln(sigma) -! ZDXINTRA - Step of ln(sigma) in the array -! -! intermodal coagulation -! -! ZXINTERMIN(i) - Minimal value of the variable i -! ZXINTERMAX(i) - Maximal value of the variable i -! ZDXINTER(i) - Step of the variable i in the arrays -! -! i=1 - ln(sigmaj) -! i=2 - ln(sigmai) -! i=3 - ln((ZR=Rgj/Rgi)**2) -! -!*************************************************************** +!! * Variables used during the coefficients evaluation +!! ZXINT(i) - Variables values where the interpolation +!! is to be made +!! +!! * intramodal coagulation terms +!! ZXINTRAMIN - Minimal value of ln(sigma) +!! ZXINTRAMAX - Maximal value of ln(sigma) +!! ZDXINTRA - Step of ln(sigma) in the array +!! +!! * intermodal coagulation terms: +!! ZXINTERMIN(i) - Minimal value of the variable i +!! ZXINTERMAX(i) - Maximal value of the variable i +!! ZDXINTER(i) - Step of the variable i in the arrays +!! i=1 - ln(sigmaj) +!! i=2 - ln(sigmai) +!! i=3 - ln((ZR=Rgj/Rgi)**2) !! !! EXTERNAL !! ------- @@ -90,336 +74,261 @@ END MODULE MODI_CH_AER_COAG !! IMPLICIT ARGUMENTS !! ------------------ !! -USE MODD_CH_AEROSOL -USE MODD_CST, ONLY : & - XPI & !Definition of pi - ,XBOLTZ ! Boltzman constant +!! REFERENCE +!! --------- +!! none !! +!! AUTHOR +!! ------ +!! Vincent Crassier (LA) +!! +!! MODIFICATIONS +!! ------------- +!! October 2018 J. Pianezze - Add comments, cleaning and debug +!! + move mode merging into ch_aer_driver +!! +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CH_AEROSOL +USE MODD_CST, ONLY : XPI, XBOLTZ +USE MODD_CONF, ONLY : NVERB +! IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PM,PRHOP0 +REAL, DIMENSION(:,:), INTENT(INOUT) :: PM,PRHOP REAL, DIMENSION(:), INTENT(INOUT) :: PLAMBDA, PMU REAL, DIMENSION(:,:), INTENT(INOUT) :: PDMINTRA REAL, DIMENSION(:,:), INTENT(INOUT) :: PDMINTER -REAL, DIMENSION(:),INTENT(IN) :: PTGAS -REAL, DIMENSION(:,:), INTENT(IN) :: PSIG0, PRG0, PN0 +REAL, DIMENSION(:), INTENT(IN) :: PTEMP +REAL, DIMENSION(:,:), INTENT(IN) :: PLNSIG, PRG, PN ! !* 0.2 Declarations of local variables ! -INTEGER :: JI,JJ +INTEGER :: JI,JJ ! -REAL :: ZTURBDS ! Rate of dissipation of kinetic energy per unit mass (m2/s3) +REAL, DIMENSION(SIZE(PM,1)) :: ZKFM,ZKNC +REAL, DIMENSION(SIZE(PM,1)) :: ZR,ZR2,ZR4 +REAL, DIMENSION(SIZE(PM,1)) :: ZRM,ZRM2,ZRM3 +REAL, DIMENSION(SIZE(PM,1)) :: ZKNG +REAL, DIMENSION(SIZE(PM,1)) :: ZAI,ZKNGI,ZAJ,ZKNGJ +REAL, DIMENSION(SIZE(PM,1)) :: ZINTRA0NC,ZINTRA0FM,ZINTRA0 +REAL, DIMENSION(SIZE(PM,1)) :: ZINTRA6NC,ZINTRA6FM,ZINTRA6 +REAL, DIMENSION(SIZE(PM,1)) :: ZINTERNC,ZINTERFM,ZINTER +REAL, DIMENSION(SIZE(PM,1)) :: ZAPPROX ! -REAL, DIMENSION(SIZE(PM,1)) :: ZKFM,ZKNC -!REAL, DIMENSION(SIZE(PM,1)) :: ZKTURB,ZKGRAV,ZR3,ZRM4 -REAL, DIMENSION(SIZE(PM,1)) :: ZR,ZR2,ZR4 -REAL, DIMENSION(SIZE(PM,1)) :: ZRM,ZRM2,ZRM3 -REAL, DIMENSION(SIZE(PM,1)) :: ZKNG -REAL, DIMENSION(SIZE(PM,1)) :: ZAI,ZKNGI,ZAJ,ZKNGJ -REAL, DIMENSION(SIZE(PM,1)) :: ZINTRA0NC,ZINTRA0FM,ZINTRA0 -REAL, DIMENSION(SIZE(PM,1)) :: ZINTRA3NC,ZINTRA3FM,ZINTRA3 -REAL, DIMENSION(SIZE(PM,1)) :: ZINTRA6NC,ZINTRA6FM,ZINTRA6 -REAL, DIMENSION(SIZE(PM,1)) :: ZINTERNC,ZINTERFM,ZINTER -REAL, DIMENSION(SIZE(PM,1)) :: ZAPPROX +REAL, DIMENSION(SIZE(PM,1)) :: ZRGJ, ZRGI, ZRG ! -REAL, DIMENSION(SIZE(PM,1)) :: ZA,ZB,ZC,ZD -REAL, DIMENSION(SIZE(PM,1)) :: ZRGJ, ZRGI, ZRG +REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG01,ZESG04,ZESG05,ZESG08,ZESG09 +REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG12,ZESG16 +REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG20,ZESG24,ZESG25,ZESG28 +REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG32,ZESG36 +REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG49 +REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG52 +REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG64 +REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG81,ZESG85 +REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG100,ZESG121,ZESG144,ZESG169,ZESG196 +REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG256 +REAL, DIMENSION(SIZE(PM,1)) :: ZRB0,ZRB6 +REAL, DIMENSION(SIZE(PM,1)) :: ZRES ! -REAL, DIMENSION(SIZE(PM,1)) :: ZERF0,ZPHI0,ZXi,ZSOL -REAL, DIMENSION(SIZE(PM,1)) :: ZERF3,ZPHI3 -REAL, DIMENSION(SIZE(PM,1)) :: ZERF6,ZPHI6 -REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZINVSIG,ZLNDG +!------------------------------------------------------------------------------- ! -REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG01,ZESG04,ZESG05,ZESG08,ZESG09 -REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG12,ZESG16 -REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG20,ZESG24,ZESG25,ZESG28 -REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG32,ZESG36 -REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG49 -REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG52 -REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG64 -REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG81,ZESG85 -REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG100,ZESG121,ZESG144,ZESG169,ZESG196 -REAL, DIMENSION(SIZE(PM,1),JPMODE) :: ZESG256 -REAL, DIMENSION(SIZE(PM,1)) :: ZRB0,ZRB6 -REAL, DIMENSION(SIZE(PM,1)) :: ZRES -!-------------------------------------------------------------------------------! -ZTURBDS=0.001 -ZKNC(:)=2.*XBOLTZ*PTGAS(:)/(3.*PMU(:)) +!* 1. INITIALIZATION +! -------------- ! -PDMINTRA(:,:)=0. -PDMINTER(:,:)=0. +PDMINTRA(:,:) = 0.0 +PDMINTER(:,:) = 0.0 ! -!**************************************************************** -! Initialisation des variables utilisees dans le calcul des -! coefficients de coagulation -!**************************************************************** - -ZESG01(:,:) = exp(0.125*PSIG0(:,1:JPMODE)**2) -ZESG04(:,:) = ZESG01(:,:) ** 4 -ZESG05(:,:) = ZESG04(:,:) * ZESG01(:,:) -ZESG08(:,:) = ZESG04(:,:) * ZESG04(:,:) -ZESG09(:,:) = ZESG04(:,:) * ZESG05(:,:) -ZESG12(:,:) = ZESG04(:,:) * ZESG04(:,:) * ZESG04(:,:) -ZESG16(:,:) = ZESG08(:,:) * ZESG08(:,:) -ZESG20(:,:) = ZESG16(:,:) * ZESG04(:,:) -ZESG24(:,:) = ZESG12(:,:) * ZESG12(:,:) -ZESG25(:,:) = ZESG16(:,:) * ZESG09(:,:) -ZESG28(:,:) = ZESG20(:,:) * ZESG08(:,:) -ZESG32(:,:) = ZESG16(:,:) * ZESG16(:,:) -ZESG36(:,:) = ZESG16(:,:) * ZESG20(:,:) -ZESG49(:,:) = ZESG25(:,:) * ZESG20(:,:) * ZESG04(:,:) -ZESG52(:,:) = ZESG16(:,:) * ZESG36(:,:) -ZESG64(:,:) = ZESG32(:,:) * ZESG32(:,:) -ZESG81(:,:) = ZESG49(:,:) * ZESG32(:,:) -ZESG85(:,:) = ZESG64(:,:) * ZESG20(:,:) * ZESG01(:,:) -ZESG100(:,:) = ZESG36(:,:) * ZESG64(:,:) -ZESG121(:,:) = ZESG85(:,:) * ZESG36(:,:) -ZESG144(:,:) = ZESG100(:,:) * ZESG36(:,:) * ZESG08(:,:) -ZESG169(:,:) = ZESG144(:,:) * ZESG25(:,:) -ZESG196(:,:) = ZESG144(:,:) * ZESG52(:,:) +ZKNC(:) = 2.*XBOLTZ*PTEMP(:)/(3.*PMU(:)) +! +! Compute coagulation coefficients : Whitby et al. 1991 : Appendix H +! +ZESG01 (:,:) = EXP(0.125*PLNSIG(:,:)**2) +ZESG04 (:,:) = ZESG01 (:,:) ** 4 +ZESG05 (:,:) = ZESG04 (:,:) * ZESG01 (:,:) +ZESG08 (:,:) = ZESG04 (:,:) * ZESG04 (:,:) +ZESG09 (:,:) = ZESG04 (:,:) * ZESG05 (:,:) +ZESG12 (:,:) = ZESG04 (:,:) * ZESG04 (:,:) * ZESG04(:,:) +ZESG16 (:,:) = ZESG08 (:,:) * ZESG08 (:,:) +ZESG20 (:,:) = ZESG16 (:,:) * ZESG04 (:,:) +ZESG24 (:,:) = ZESG12 (:,:) * ZESG12 (:,:) +ZESG25 (:,:) = ZESG16 (:,:) * ZESG09 (:,:) +ZESG28 (:,:) = ZESG20 (:,:) * ZESG08 (:,:) +ZESG32 (:,:) = ZESG16 (:,:) * ZESG16 (:,:) +ZESG36 (:,:) = ZESG16 (:,:) * ZESG20 (:,:) +ZESG49 (:,:) = ZESG25 (:,:) * ZESG20 (:,:) * ZESG04(:,:) +ZESG52 (:,:) = ZESG16 (:,:) * ZESG36 (:,:) +ZESG64 (:,:) = ZESG32 (:,:) * ZESG32 (:,:) +ZESG81 (:,:) = ZESG49 (:,:) * ZESG32 (:,:) +ZESG85 (:,:) = ZESG64 (:,:) * ZESG20 (:,:) * ZESG01(:,:) +ZESG100(:,:) = ZESG36 (:,:) * ZESG64 (:,:) +ZESG121(:,:) = ZESG85 (:,:) * ZESG36 (:,:) +ZESG144(:,:) = ZESG100(:,:) * ZESG36 (:,:) * ZESG08(:,:) +ZESG169(:,:) = ZESG144(:,:) * ZESG25 (:,:) +ZESG196(:,:) = ZESG144(:,:) * ZESG52 (:,:) ZESG256(:,:) = ZESG144(:,:) * ZESG100(:,:) * ZESG12(:,:) - -!*************************************************************** -! Transfert de moments entre les modes i et j -!*************************************************************** - -ZINVSIG(:,:)=1./PSIG0(:,1:JPMODE)**2 -ZLNDG(:,:)=log(2.*PRG0(:,1:JPMODE)) - -ZA(:)=0.5*(ZINVSIG(:,1)-ZINVSIG(:,2)) -ZD(:) = 0. -ZXi(:)= 0. - -WHERE (ABS(ZA(:)) > 1E-4) - ZB(:)=ZINVSIG(:,2)*ZLNDG(:,2)-ZINVSIG(:,1)*ZLNDG(:,1) - ZC(:)=0.5*(ZINVSIG(:,1)*ZLNDG(:,1)**2-ZINVSIG(:,2)*ZLNDG(:,2)**2) - & - &log((PN0(:,1)*PSIG0(:,2))/(PN0(:,2)*PSIG0(:,1))) - - ZD(:)=ZB(:)**2-4.*ZA(:)*ZC(:) - - ZSOL(:)=(-ZB(:)+sqrt(ABS(ZD(:))))/(2.*ZA(:)) - WHERE (ZSOL(:) < 5.E+2) - ZSOL(:)=exp(ZSOL(:))/2. - ZXi(:)=log(ZSOL(:)/PRG0(:,1))/(sqrt(2.)*PSIG0(:,1)) - ENDWHERE -ENDWHERE - -!********************************************************************* -! calculate the intramodal moment coefficients (log-normal model) -!********************************************************************* - -do JI=1,JPMODE - - ZKFM(:)=sqrt(3.*XBOLTZ*PTGAS(:)/PRHOP0(:,JI))*1.e-3 - !ZKTURB(:)=sqrt(XPI*ZTURBDS*PMU(:)/(120.*PRHOP0(:,JI)))*1.e-18 - !ZKGRAV(:)=1.5/4.*0.544*XPI*PRHOP0(:,JI)/PMU(:)*1.e-24 -!************************************************************* -! calculate ZVG,ln2(sigma) and sigma -! (log-normal model) -!************************************************************* - - ZRG(:)=PRG0(:,JI) - ZKNG(:)=PLAMBDA(:)/ZRG(:) - ZAI(:)=1.392*ZKNG(:)**0.0783 - -!*********************** -! Brownian Coagulation -!*********************** - - ZRB0(:)=0.8 - ZRB6(:)=ZRB0 - - ZINTRA0FM(:)=ZKFM(:)*ZRB0(:)*sqrt(2.*ZRG(:))*(ZESG01(:,JI)+ZESG25(:,JI)+2.*ZESG05(:,JI)) - ZINTRA3FM(:)=ZKFM(:)*ZRB0(:)*sqrt(ZRG(:))**7*sqrt(2.)*(ZESG49(:,JI)+ZESG36(:,JI)*ZESG01(:,JI)+& - &2.*ZESG25(:,JI)*ZESG04(:,JI)+ZESG09(:,JI)*ZESG16(:,JI)+ZESG100(:,JI)*ZESG09(:,JI)+& - &2.*ZESG64(:,JI)*ZESG01(:,JI)) - ZINTRA6FM(:)=ZKFM(:)*ZRB6(:)*sqrt(ZRG(:))**13*sqrt(2.)*ZESG85(:,JI)*& - (1.+2.*ZESG04(:,JI)+ZESG24(:,JI)) - ZINTRA0NC(:)=ZKNC(:)*(1.+ZESG08(:,JI)+ZAI(:)*ZKNG(:)*(ZESG20(:,JI)+ZESG04(:,JI))) - ZINTRA3NC(:)=ZKNC(:)*ZRG(:)**3*(2.*ZESG36(:,JI)+ZAI(:)*ZKNG(:)*(ZESG16(:,JI)+ZESG04(:,JI)*ZESG04(:,JI)+& - &ZESG36(:,JI)*ZESG04(:,JI)+ZESG64(:,JI)*ZESG16(:,JI))+ZESG16(:,JI)*ZESG04(:,JI)+& - &ZESG64(:,JI)*ZESG04(:,JI)) - ZINTRA6NC(:)=2.*ZKNC(:)*(ZRG(:))**6*ZESG52(:,JI)*(ZESG20(:,JI)+ZESG28(:,JI)+ZAI(:)*ZKNG(:)*(1.+ZESG16(:,JI))) - ZINTRA0(:)=ZINTRA0FM(:)*(ZINTRA0NC(:)/(ZINTRA0FM(:)+ZINTRA0NC(:))) - ZINTRA3(:)=ZINTRA3FM(:)*(ZINTRA3NC(:)/(ZINTRA3FM(:)+ZINTRA3NC(:))) - ZINTRA6(:)=ZINTRA6FM(:)*(ZINTRA6NC(:)/(ZINTRA6FM(:)+ZINTRA6NC(:))) - - PDMINTRA(:,NM0(JI))=ZINTRA0(:) - PDMINTRA(:,NM3(JI))=ZINTRA3(:) - PDMINTRA(:,NM6(JI))=ZINTRA6(:) - !print*,'PDMINTRA(:,NM0(',JI,') =',MINVAL(PDMINTRA(:,NM0(JI))), MAXVAL(PDMINTRA(:,NM0(JI))) - !print*,'PDMINTRA(:,NM3(',JI,') =',MINVAL(PDMINTRA(:,NM3(JI))), MAXVAL(PDMINTRA(:,NM3(JI))) - !print*,'PDMINTRA(:,NM6(',JI,') =',MINVAL(PDMINTRA(:,NM6(JI))), MAXVAL(PDMINTRA(:,NM6(JI))) - -enddo -!print*,'==============================' -!print*,'==============================' - -WHERE (ZD(:) > 0. .AND. ZXi(:) > (6.*PSIG0(:,1)/sqrt(2.))) - -! transfert du moment d'ordre 0 (nombre) -!************************************** - - ZERF0(:)=sqrt(1.-exp(-4.*(ZXi(:))**2/XPI)) - ZPHI0(:)=0.5*(1.+ZERF0(:)) - -! transfert du moment d'ordre 3 (masse) -!************************************** - - ZERF3(:)=sqrt(1.-exp(-4.*(ZXi(:)-3.*PSIG0(:,1)/sqrt(2.))**2/XPI)) - ZPHI3(:)=0.5*(1.+ZERF3(:)) - -! transfert du moment d'ordre 6 (dispersion) -!************************************** - - ZERF6(:)=sqrt(1.-exp(-4.*(ZXi(:)-6.*PSIG0(:,1)/sqrt(2.))**2/XPI)) - ZPHI6(:)=0.5*(1.+ZERF6(:)) - - PDMINTRA(:,NM0(2))=PDMINTRA(:,NM0(2))-(1.-ZPHI0(:)**2)*PDMINTRA(:,NM0(1))*(PM(:,NM0(1))/PM(:,NM0(2)))**2 - PDMINTRA(:,NM0(1))=(2.-ZPHI0(:)**2)*PDMINTRA(:,NM0(1)) - - PDMINTRA(:,NM3(2))=PDMINTRA(:,NM3(1))*(1.-ZPHI0(:)*ZPHI3(:))*PM(:,NM0(1))**2 - PDMINTRA(:,NM3(1))=PDMINTRA(:,NM3(1))*(ZPHI0(:)*ZPHI3(:)-1.)*PM(:,NM0(1))**2 - - ZKFM(:)=sqrt(3.*XBOLTZ*PTGAS(:)/PRHOP0(:,1))*1.e-3 - ZRG(:)=PRG0(:,1) - ZKNG(:)=PLAMBDA(:)/ZRG(:) - ZAI(:)=1.392*ZKNG(:)**0.0783 - - ZINTRA6FM(:)=ZKFM(:)*sqrt(2.)*sqrt(ZRG(:))**13*(ZESG169(:,1)+ZESG144(:,1)*ZESG01(:,1)+& - 2.*ZESG121(:,1)*ZESG04(:,1)+ZESG81(:,1)*ZESG16(:,1)+& - ZESG256(:,1)*ZESG09(:,1)+ZESG196(:,1)*ZESG01(:,1)) - - ZINTRA6NC(:)=ZKNC(:)*(ZRG(:))**6*(2.*ZESG144(:,1)+ZAI(:)*ZKNG(:)*(ZESG100(:,1)+& - ZESG64(:,1)*ZESG04(:,1))+ZAI(:)*ZKNG(:)*(ZESG144(:,1)*ZESG04(:,1)+& - ZESG196(:,1)*ZESG16(:,1))+ZESG100(:,1)*ZESG04(:,1)+& - ZESG196(:,1)*ZESG04(:,1)) - - ZINTRA6(:)=ZINTRA6FM(:)*(ZINTRA6NC(:)/(ZINTRA6FM(:)+ZINTRA6NC(:))) - - PDMINTRA(:,NM6(2))=PDMINTRA(:,NM6(2))+(PDMINTRA(:,NM6(1))*(1.-ZPHI3(:)**2)+ZINTRA6(:)*(1.-ZPHI0(:)*ZPHI6(:)))& - &*(PM(:,NM0(1))/PM(:,NM0(2)))**2 - - PDMINTRA(:,NM6(1))=PDMINTRA(:,NM6(1))*(ZPHI3(:)**2)+ZINTRA6(:)*(ZPHI0(:)*ZPHI6(:)-1.) - -ELSEWHERE - - PDMINTRA(:,NM3(1))=0. - PDMINTRA(:,NM3(2))=0. - - -ENDWHERE - -do JI=1,JPMODE -!print*,'2.-ZPHI0(:)**2 =',MINVAL(2.-ZPHI0(:)**2), MAXVAL(2.-ZPHI0(:)**2) -! print*,'apres corr PDMINTRA(:,NM0(',JI,') =',MINVAL(PDMINTRA(:,NM0(JI))), MAXVAL(PDMINTRA(:,NM0(JI))) -! print*,'apres corr PDMINTRA(:,NM3(',JI,') =',MINVAL(PDMINTRA(:,NM3(JI))), MAXVAL(PDMINTRA(:,NM3(JI))) -! print*,'apres corr PDMINTRA(:,NM6(',JI,') =',MINVAL(PDMINTRA(:,NM6(JI))), MAXVAL(PDMINTRA(:,NM6(JI))) - enddo - -!********************************************************************* -! calculate the intermodal moment coefficients (log-normal model) -!********************************************************************* - -do JI=1,(JPMODE-1) - do JJ=(JI+1),JPMODE - - ZRGI(:)=PRG0(:,JI) - ZKNGI(:)=PLAMBDA(:)/ZRGI(:) - ZAI(:)=1.392*ZKNGI(:)**0.0783 - - ZRGJ(:)=PRG0(:,JJ) - ZKNGJ(:)=PLAMBDA(:)/ZRGJ(:) - ZAJ(:)=1.392*ZKNGJ(:)**0.0783 - - ZR(:)=sqrt(ZRGJ(:)/ZRGI(:)) - ZR2(:)=ZR(:)*ZR(:) - !ZR3(:)=ZR(:)*ZR2(:) - ZR4(:)=ZR2(:)*ZR2(:) - ZRM(:)=1./ZR(:) - ZRM2(:)=ZRM(:)*ZRM(:) - ZRM3(:)=ZRM(:)*ZRM2(:) - !ZRM4(:)=ZRM2(:)*ZRM2(:) - -!********************** -! Brownian Coagulation -!********************** - - ZRES(:)=0.9 - - ZAPPROX(:)=sqrt(2.*ZRGI(:))*(ZESG01(:,JI)+ZR(:)*ZESG01(:,JJ)+2.*ZR2(:)*ZESG01(:,JI)*ZESG04(:,JJ)& - +ZR4(:)*ZESG09(:,JI)*ZESG16(:,JJ)+ZRM3(:)*ZESG16(:,JI)*ZESG09(:,JJ)+& - 2.*ZRM(:)*ZESG04(:,JI)*ZESG01(:,JJ)) +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE INTRA-MODAL COAGULATION TERMS +! ------------------------------------- +! +DO JI=1,JPMODE + ! + !* 2.0 INITIALIZATION + ! -------------- + ! + ZRG(:) = PRG(:,JI) + ZKNG(:) = PLAMBDA(:)/ZRG(:) + ZAI(:) = 1.392*ZKNG(:)**0.0783 + ZKFM(:) = SQRT(3.*XBOLTZ*PTEMP(:)/PRHOP(:,JI))*1.E-3 + ! + ZRB0(:) = 0.8 + ZRB6(:) = ZRB0 + ! + !* 2.1 FREE-MOLECULE REGIME (KN > 10) + ! ------------------------------ + ! + ZINTRA0FM(:) = ZKFM(:) * ZRB0(:) * SQRT(2.*ZRG(:)) * & + & (ZESG01(:,JI)+ZESG25(:,JI)+2.*ZESG05(:,JI)) + ZINTRA6FM(:) = ZKFM(:)*ZRB6(:)*sqrt(ZRG(:))**13*sqrt(2.)*ZESG85(:,JI) * & + & (1.+2.*ZESG04(:,JI)+ZESG24(:,JI)) + ! + !* 2.2 NEAR-CONTINUUM (KN < 0.1) + ! ------------------------- + ! + ZINTRA0NC(:) = ZKNC(:)*(1.+ZESG08(:,JI)+ZAI(:)*ZKNG(:)*(ZESG20(:,JI)+ZESG04(:,JI))) + ZINTRA6NC(:) = 2.*ZKNC(:)*(ZRG(:))**6*ZESG52(:,JI)*(ZESG20(:,JI)+ZESG28(:,JI)+& + ZAI(:)*ZKNG(:)*(1.+ZESG16(:,JI))) + ! + !* 2.3 HARMONIC MEAN + ! ------------- + ! + ZINTRA0(:) = ZINTRA0FM(:)*(ZINTRA0NC(:) / (ZINTRA0FM(:)+ZINTRA0NC(:))) + ZINTRA6(:) = ZINTRA6FM(:)*(ZINTRA6NC(:) / (ZINTRA6FM(:)+ZINTRA6NC(:))) + ! + PDMINTRA(:,NM0(JI)) = - ZINTRA0(:) * PM(:,NM0(JI))**2.0 + PDMINTRA(:,NM3(JI)) = 0.0 + PDMINTRA(:,NM6(JI)) = ZINTRA6(:) * PM(:,NM0(JI))**2.0 + ! +ENDDO +! +!------------------------------------------------------------------------------- +! +!* 3. COMPUTE INTER-MODAL COAGULATION TERMS +! ------------------------------------- +! +! JPMODE = 2 +! donc : +! - JI = 1 +! - JJ = 2 +! +DO JI=1,(JPMODE-1) + DO JJ=(JI+1),JPMODE + ! + ZRGI (:) = PRG(:,JI) + ZKNGI(:) = PLAMBDA(:)/ZRGI(:) + ZAI (:) = 1.392*ZKNGI(:)**0.0783 + ! + ZRGJ (:) = PRG(:,JJ) + ZKNGJ(:) = PLAMBDA(:)/ZRGJ(:) + ZAJ (:) = 1.392*ZKNGJ(:)**0.0783 + ! + ZR (:) = SQRT(ZRGJ(:)/ZRGI(:)) + ZR2 (:) = ZR(:)*ZR(:) + ZR4 (:) = ZR2(:)*ZR2(:) + ZRM (:) = 1./ZR(:) + ZRM2(:) = ZRM(:)*ZRM(:) + ZRM3(:) = ZRM(:)*ZRM2(:) + ! + ! + ! * 3.1 Free-Molecule Regime (Kn > 10) : appendix H.2.2.1 - Whitby et al. 1991 + ! ---------------------------------------------------------------------- + ! + ZRES(:)=0.9 + ! + ! moment 0 + ! + ZAPPROX(:)=sqrt(2.*ZRGI(:))*(ZESG01(:,JI)+ZR(:)*ZESG01(:,JJ)+2.*ZR2(:)*ZESG01(:,JI)*ZESG04(:,JJ)& + +ZR4(:)*ZESG09(:,JI)*ZESG16(:,JJ)+ZRM3(:)*ZESG16(:,JI)*ZESG09(:,JJ)+& + 2.*ZRM(:)*ZESG04(:,JI)*ZESG01(:,JJ)) - ZINTERFM(:)=ZKFM(:)*ZRES(:)*ZAPPROX(:) + ZINTERFM(:)=ZKFM(:)*ZRES(:)*ZAPPROX(:) - ZAPPROX(:)=2.+ZAI(:)*ZKNGI(:)*(ZESG04(:,JI)+ZR2(:)*ZESG16(:,JI)*ZESG04(:,JJ))+& + ZAPPROX(:)=2.+ZAI(:)*ZKNGI(:)*(ZESG04(:,JI)+ZR2(:)*ZESG16(:,JI)*ZESG04(:,JJ))+& ZAJ(:)*ZKNGJ(:)*(ZESG04(:,JJ)+ZRM2(:)*ZESG16(:,JJ)*ZESG04(:,JI))+& (ZR2(:)+ZRM2(:))*(ZESG04(:,JI)*ZESG04(:,JJ)) - ZINTERNC(:)=ZKNC(:)*ZAPPROX(:) + ZINTERNC(:)=ZKNC(:)*ZAPPROX(:) - ZINTER(:)=ZINTERNC(:)*(ZINTERFM(:)/(ZINTERNC(:)+ZINTERFM(:))) + ZINTER(:)=ZINTERNC(:)*(ZINTERFM(:)/(ZINTERNC(:)+ZINTERFM(:))) - PDMINTER(:,NM0(JI))=PM(:,NM0(JJ))*ZINTER(:) - PDMINTER(:,NM0(JJ))=-PM(:,NM0(JJ))*ZINTER(:) - - ZAPPROX(:)=sqrt(2.)*sqrt(ZRGI(:))**7*(ZESG49(:,JI)+ZR(:)*ZESG36(:,JI)*ZESG01(:,JJ)+2.*ZR2(:)*& + PDMINTER(:,NM0(JI))=-PM(:,NM0(JI))*PM(:,NM0(JJ))*ZINTER(:) + PDMINTER(:,NM0(JJ))= 0.0 + ! + ! moment 3 + ! + ZAPPROX(:)=sqrt(2.)*sqrt(ZRGI(:))**7*(ZESG49(:,JI)+ZR(:)*ZESG36(:,JI)*ZESG01(:,JJ)+2.*ZR2(:)*& ZESG25(:,JI)*ZESG04(:,JJ)+ZR4(:)*ZESG09(:,JI)*ZESG16(:,JJ)+ZRM3(:)*& ZESG100(:,JI)*ZESG09(:,JJ)+2.*ZRM(:)*ZESG64(:,JI)*ZESG01(:,JJ)) - ZINTERFM(:)=ZKFM(:)*ZRES(:)*ZAPPROX(:) + ZINTERFM(:)=ZKFM(:)*ZRES(:)*ZAPPROX(:) - ZAPPROX(:)=(2.*ZESG36(:,JI)+ZAI(:)*ZKNGI(:)*(ZESG16(:,JI)+ZR2(:)*ZESG04(:,JI)*ZESG04(:,JJ))+& - ZAJ(:)*ZKNGJ(:)*(ZESG36(:,JI)*ZESG04(:,JJ)+ZRM2(:)*ZESG16(:,JJ)*ZESG64(:,JI))+& - ZR2(:)*ZESG16(:,JI)*ZESG04(:,JJ)+ZRM2(:)*ZESG64(:,JI)*ZESG04(:,JJ))*(ZRGI(:))**3 + ZAPPROX(:)=(2.*ZESG36(:,JI)+ZAI(:)*ZKNGI(:)*(ZESG16(:,JI)+ZR2(:)*ZESG04(:,JI)*ZESG04(:,JJ))+& + ZAJ(:)*ZKNGJ(:)*(ZESG36(:,JI)*ZESG04(:,JJ)+ZRM2(:)*ZESG16(:,JJ)*ZESG64(:,JI))+& + ZR2(:)*ZESG16(:,JI)*ZESG04(:,JJ)+ZRM2(:)*ZESG64(:,JI)*ZESG04(:,JJ))*(ZRGI(:))**3 - ZINTERNC(:)=ZKNC(:)*ZAPPROX(:) + ZINTERNC(:)=ZKNC(:)*ZAPPROX(:) - ZINTER(:)=ZINTERNC(:)*(ZINTERFM(:)/(ZINTERNC(:)+ZINTERFM(:))) + ZINTER(:)=ZINTERNC(:)*(ZINTERFM(:)/(ZINTERNC(:)+ZINTERFM(:))) - PDMINTER(:,NM3(JI))=-PM(:,NM0(JI))*PM(:,NM0(JJ))*ZINTER(:) - PDMINTER(:,NM3(JJ))=PM(:,NM0(JI))*PM(:,NM0(JJ))*ZINTER(:) + PDMINTER(:,NM3(JI))=-PM(:,NM0(JI))*PM(:,NM0(JJ))*ZINTER(:) + PDMINTER(:,NM3(JJ))=-PDMINTER(:,NM3(JI)) + + ! moment 6 - ZAPPROX(:)=sqrt(2.)*sqrt(ZRGI(:))**13*(ZESG169(:,JI)+ZR(:)*ZESG144(:,JI)*ZESG01(:,JJ)+& - 2.*ZR2(:)*ZESG121(:,JI)*ZESG04(:,JJ)+ZR4(:)*ZESG81(:,JI)*ZESG16(:,JJ)+& - ZRM3(:)*ZESG256(:,JI)*ZESG09(:,JJ)+2*ZRM(:)*ZESG196(:,JI)*ZESG01(:,JJ)) + ZAPPROX(:)=sqrt(2.)*sqrt(ZRGI(:))**13*(ZESG169(:,JI)+ZR(:)*ZESG144(:,JI)*ZESG01(:,JJ)+& + 2.*ZR2(:)*ZESG121(:,JI)*ZESG04(:,JJ)+ZR4(:)*ZESG81(:,JI)*ZESG16(:,JJ)+& + ZRM3(:)*ZESG256(:,JI)*ZESG09(:,JJ)+2*ZRM(:)*ZESG196(:,JI)*ZESG01(:,JJ)) - ZINTERFM(:)=ZKFM(:)*ZRES(:)*ZAPPROX(:) + ZINTERFM(:)=ZKFM(:)*ZRES(:)*ZAPPROX(:) - ZAPPROX(:)=(ZRGI(:))**6*(2.*ZESG144(:,JI)+ZAI(:)*ZKNGI(:)*(ZESG100(:,JI)+& + ZAPPROX(:)=(ZRGI(:))**6*(2.*ZESG144(:,JI)+ZAI(:)*ZKNGI(:)*(ZESG100(:,JI)+& ZR2(:)*ZESG64(:,JI)*ZESG04(:,JJ))+ZAJ(:)*ZKNGJ(:)*(ZESG144(:,JI)*ZESG04(:,JJ)+& ZRM2(:)*ZESG196(:,JI)*ZESG16(:,JJ))+ZR2(:)*ZESG100(:,JI)*ZESG04(:,JJ)+& ZRM2(:)*ZESG196(:,JI)*ZESG04(:,JJ)) - ZINTERNC(:)=ZKNC(:)*ZAPPROX(:) + ZINTERNC(:)=ZKNC(:)*ZAPPROX(:) - ZINTER(:)=ZINTERNC(:)*(ZINTERFM(:)/(ZINTERNC(:)+ZINTERFM(:))) + ZINTER(:)=ZINTERNC(:)*(ZINTERFM(:)/(ZINTERNC(:)+ZINTERFM(:))) - PDMINTER(:,NM6(JI))=-PM(:,NM0(JI))*PM(:,NM0(JJ))*ZINTER(:) - PDMINTER(:,NM6(JJ))=PM(:,NM0(JI))*PM(:,NM0(JJ))*ZINTER(:) + PDMINTER(:,NM6(JI))=-PM(:,NM0(JI))*PM(:,NM0(JJ))*ZINTER(:) - ZAPPROX(:)=sqrt(2.)*sqrt(ZRGI(:))**7*sqrt(ZRGJ(:))**6*(ZESG49(:,JI)*& + ZAPPROX(:)=sqrt(2.)*sqrt(ZRGI(:))**7*sqrt(ZRGJ(:))**6*(ZESG49(:,JI)*& ZESG36(:,JJ)+ZR(:)*ZESG36(:,JI)*ZESG49(:,JJ)+2.*ZR2(:)*ZESG25(:,JI)*& ZESG64(:,JJ)+ZR4(:)*ZESG09(:,JI)*ZESG100(:,JJ)+ZRM3(:)*ZESG100(:,JI)*& ZESG09(:,JJ)+2.*ZRM(:)*ZESG64(:,JI)*ZESG25(:,JJ)) - ZINTERFM(:)=ZKFM(:)*ZRES(:)*ZAPPROX(:) + ZINTERFM(:)=ZKFM(:)*ZRES(:)*ZAPPROX(:) - ZAPPROX(:)=(ZRGI(:))**3*(ZRGJ(:))**3*(2.*ZESG36(:,JI)*ZESG36(:,JJ)+& + ZAPPROX(:)=(ZRGI(:))**3*(ZRGJ(:))**3*(2.*ZESG36(:,JI)*ZESG36(:,JJ)+& ZAI(:)*ZKNGI(:)*(ZESG16(:,JI)*ZESG16(:,JJ)+ZR2(:)*ZESG04(:,JI)*ZESG64(:,JJ))+& ZAJ(:)*ZKNGJ(:)*(ZESG36(:,JI)*ZESG16(:,JJ)+ZRM2(:)*ZESG64(:,JI)*ZESG04(:,JJ))+& ZR2(:)*ZESG16(:,JI)*ZESG64(:,JJ)+ZRM2(:)*ZESG64(:,JI)*ZESG16(:,JJ)) - ZINTERNC(:)=ZKNC(:)*ZAPPROX(:) + ZINTERNC(:)=ZKNC(:)*ZAPPROX(:) - ZINTER(:)=ZINTERNC(:)*(ZINTERFM(:)/(ZINTERNC(:)+ZINTERFM(:))) + ZINTER(:)=ZINTERNC(:)*(ZINTERFM(:)/(ZINTERNC(:)+ZINTERFM(:))) - PDMINTER(:,NM6(JJ))=PDMINTER(:,NM6(JJ))+2.*PM(:,NM0(JI))*PM(:,NM0(JJ))*ZINTER(:) + PDMINTER(:,NM6(JJ))=-PDMINTER(:,NM6(JI))+2.*PM(:,NM0(JI))*PM(:,NM0(JJ))*ZINTER(:) - enddo -enddo + ENDDO +ENDDO END SUBROUTINE CH_AER_COAG diff --git a/src/MNH/ch_aer_depos.f90 b/src/MNH/ch_aer_depos.f90 index cf5659aa332d24dec88b471aae1fd4ae678c0ac7..37ca0645fe6e357302967318c408f59e0c2469a3 100644 --- a/src/MNH/ch_aer_depos.f90 +++ b/src/MNH/ch_aer_depos.f90 @@ -116,12 +116,12 @@ END IF !Get minimum values possible ZPMIN(1) = XN0IMIN ZRGMIN = ZINIRADIUSI -ZPMIN(2) = ZPMIN(1) * (ZRGMIN**3)*EXP(4.5 * LOG(XSIGIMIN)**2) -ZPMIN(3) = ZPMIN(1) * (ZRGMIN**6)*EXP(18. * LOG(XSIGIMIN)**2) +ZPMIN(2) = ZPMIN(1) * (ZRGMIN**3)*EXP(4.5 * LOG(XINISIGI)**2) +ZPMIN(3) = ZPMIN(1) * (ZRGMIN**6)*EXP(18. * LOG(XINISIGI)**2) ZPMIN(4) = XN0JMIN ZRGMIN = ZINIRADIUSJ -ZPMIN(5) = ZPMIN(4) * (ZRGMIN**3)*EXP(4.5 * LOG(XSIGJMIN)**2) -ZPMIN(6) = ZPMIN(4) * (ZRGMIN**6)*EXP(18. * LOG(XSIGJMIN)**2) +ZPMIN(5) = ZPMIN(4) * (ZRGMIN**3)*EXP(4.5 * LOG(XINISIGJ)**2) +ZPMIN(6) = ZPMIN(4) * (ZRGMIN**6)*EXP(18. * LOG(XINISIGJ)**2) ! ! CALL PPP2AERO(ZSVT, PRHODREF, & @@ -167,15 +167,15 @@ SELECT CASE (CCLOUD) CASE ('KESS','REVE','ICE3','ICE4') ! One moment cloud scheme CALL AER_WET_DEP_KMT_WARM (NSPLITR, PTSTEP, PZZ, PRHODREF, & - PRT(:,:,:,2), PRT(:,:,:,3), ZRCS, & - ZRRS, ZSVAER, PTHT, PPABST, ZRG, & + PRT(:,:,:,2), PRT(:,:,:,3), & + ZSVAER, PTHT, PPABST, ZRG, & PEVAP3D, JPMODE,ZRHOP, ZMASSMIN, & PSEA=ZSEA, PTOWN=ZTOWN) CASE ('KHKO','C2R2','C3R5') ! Two moment cloud scheme CALL AER_WET_DEP_KMT_WARM (NSPLITR, PTSTEP, PZZ, PRHODREF, & - PRT(:,:,:,2), PRT(:,:,:,3), ZRCS, & - ZRRS, ZSVAER, PTHT, PPABST, ZRG, & + PRT(:,:,:,2), PRT(:,:,:,3), & + ZSVAER, PTHT, PPABST, ZRG, & PEVAP3D, JPMODE,ZRHOP, ZMASSMIN, & PSEA=ZSEA, PTOWN=ZTOWN, & PCCT=PSVT(:,:,:,NSV_C2R2BEG+1), & @@ -183,8 +183,8 @@ SELECT CASE (CCLOUD) CASE ('LIMA') ! Two moment cloud scheme CALL AER_WET_DEP_KMT_WARM (NSPLITR, PTSTEP, PZZ, PRHODREF, & - PRT(:,:,:,2), PRT(:,:,:,3), ZRCS, & - ZRRS, ZSVAER, PTHT, PPABST, ZRG, & + PRT(:,:,:,2), PRT(:,:,:,3), & + ZSVAER, PTHT, PPABST, ZRG, & PEVAP3D, JPMODE,ZRHOP, ZMASSMIN, & PSEA=ZSEA, PTOWN=ZTOWN, & PCCT=PSVT(:,:,:,NSV_LIMA_NC), & diff --git a/src/MNH/ch_aer_eqm_initn.f90 b/src/MNH/ch_aer_eqm_initn.f90 index 0759d63cebf4fb9ecacb825551b4dc67bb1bec1e..d9b1a77621153cfe89c0d5365b9c2b267761147a 100644 --- a/src/MNH/ch_aer_eqm_initn.f90 +++ b/src/MNH/ch_aer_eqm_initn.f90 @@ -403,16 +403,16 @@ XSVMIN(NSV_AERBEG:NSV_AEREND) = XMNH_TINY XSVMIN(NSV_CHEMBEG-1+JP_CH_CO) = 1E-10 ! For i mode ZRHODREFMIN = MAX_ll( PRHODREF(:,:,:), IINFO_ll) -ZMASS = XN0IMIN * ((ZMINRGI**3)*EXP(4.5 * (LOG(XSIGIMIN))**2)) -ZM6MIN = XN0IMIN * ((ZMINRGI**6)*EXP(18. * (LOG(XSIGIMIN))**2)) +ZMASS = XN0IMIN * ((ZMINRGI**3)*EXP(4.5 * (LOG(XINISIGI))**2)) +ZM6MIN = XN0IMIN * ((ZMINRGI**6)*EXP(18. * (LOG(XINISIGI))**2)) XSVMIN(NSV_AERBEG-1+JP_CH_BCi) = 0.5*ZMASS * XFAC(JP_AER_BC) * 6.0221367E+11/(ZDEN2MOL*12.*ZRHODREFMIN) XSVMIN(NSV_AERBEG-1+JP_CH_OCi) = 0.5*ZMASS * XFAC(JP_AER_OC) * 6.0221367E+11/(ZDEN2MOL*12.*ZRHODREFMIN) XSVMIN(NSV_AERBEG-1+JP_CH_M0i) = XN0IMIN * 1E-6 / (ZDEN2MOL*ZRHODREFMIN) IF (LVARSIGI) XSVMIN(NSV_AERBEG-1+JP_CH_M6i) = ZM6MIN / (ZDEN2MOL*ZRHODREFMIN) ! ! For j mode -ZMASS = XN0JMIN * ((ZMINRGJ**3)*EXP(4.5 * (LOG(XSIGJMIN))**2)) -ZM6MIN = XN0JMIN * ((ZMINRGJ**6)*EXP(18. * (LOG(XSIGJMIN))**2)) +ZMASS = XN0JMIN * ((ZMINRGJ**3)*EXP(4.5 * (LOG(XINISIGJ))**2)) +ZM6MIN = XN0JMIN * ((ZMINRGJ**6)*EXP(18. * (LOG(XINISIGJ))**2)) XSVMIN(NSV_AERBEG-1+JP_CH_BCj) = 0.5*ZMASS * XFAC(JP_AER_BC) * 6.0221367E+11/(ZDEN2MOL*12.*ZRHODREFMIN) XSVMIN(NSV_AERBEG-1+JP_CH_OCj) = 0.5*ZMASS * XFAC(JP_AER_OC) * 6.0221367E+11/(ZDEN2MOL*12.*ZRHODREFMIN) XSVMIN(NSV_AERBEG-1+JP_CH_M0j) = XN0JMIN * 1E-6 / (ZDEN2MOL*ZRHODREFMIN) diff --git a/src/MNH/ch_aer_reallfin.f90 b/src/MNH/ch_aer_reallfin.f90 index 505f3acfae89b18fac882c45bc4a2fe83b953ac0..101835c6c8a9ce8afeef7ffa24f52c4a1aaa3b8b 100644 --- a/src/MNH/ch_aer_reallfin.f90 +++ b/src/MNH/ch_aer_reallfin.f90 @@ -134,7 +134,7 @@ ZRHOI(:) = 1.8e3 ZRHOI(JP_AER_H2O) = 1.0e3 ! water ZRHOI(JP_AER_DST) = XDENSITY_DUST ! -PSV(:,:,:,:) = MAX(PSV(:,:,:,:), 0.) +PSV(:,:,:,:) = MAX(PSV(:,:,:,:), 1E-20) PCO(:,:,:) = MAX(PCO(:,:,:), 10.E-9*PRHODREF(:,:,:)) ! ! Special treatment for BC and OC (link to CO gaseous concentration) @@ -310,6 +310,7 @@ DO JN=1,JPMODE ! ZRG(:,:,:,JN)=(ZM(:,:,:,NM3(JN))/ZN(:,:,:,JN))**(1./3.)*EXP(-1.5*ZSIGMA(:,:,:)) ! + ENDDO ! !conversion into ppv diff --git a/src/MNH/ch_aer_trans.f90 b/src/MNH/ch_aer_trans.f90 index d8844d117baa87b4a65456a4af08737169242bb2..400ccec1f6e4b79c458fe1a55b8502cb8d3180f7 100644 --- a/src/MNH/ch_aer_trans.f90 +++ b/src/MNH/ch_aer_trans.f90 @@ -95,16 +95,16 @@ CHARACTER(LEN=10), INTENT(IN) :: HSCHEME ! !* 0.2 declarations local variables ! -INTEGER :: JJ, JN ! loop counter +INTEGER :: JJ, JN, II ! loop counter ! variables for the aerosol module ! REAL, DIMENSION(SIZE(PM,1)) :: ZSIGMA REAL, DIMENSION(SIZE(PM,1)) :: ZSUM REAL, SAVE, DIMENSION(JPIN) :: ZPMIN LOGICAL, SAVE :: GPHYSLIM = .TRUE. ! flag -REAL :: ZRGMIN +REAL, SAVE :: ZRGMIN REAL, PARAMETER :: ZCSTAVOG=6.0221367E+11 -REAL :: ZINIRADIUSI, ZINIRADIUSJ +REAL, SAVE :: ZINIRADIUSI, ZINIRADIUSJ ! @@ -128,13 +128,13 @@ END IF ZPMIN(1) = XN0IMIN ZRGMIN = ZINIRADIUSI -ZPMIN(2) = ZPMIN(1) * (ZRGMIN**3)*EXP(4.5 * LOG(XSIGIMIN)**2) -ZPMIN(3) = ZPMIN(1) * (ZRGMIN**6)*EXP(18. * LOG(XSIGIMIN)**2) +ZPMIN(2) = ZPMIN(1) * (ZRGMIN**3)*EXP(4.5 * LOG(XINISIGI)**2) +ZPMIN(3) = ZPMIN(1) * (ZRGMIN**6)*EXP(18. * LOG(XINISIGI)**2) ZPMIN(4) = XN0JMIN ZRGMIN = ZINIRADIUSJ -ZPMIN(5) = ZPMIN(4) * (ZRGMIN**3)*EXP(4.5 * LOG(XSIGJMIN)**2) -ZPMIN(6) = ZPMIN(4) * (ZRGMIN**6)*EXP(18. * LOG(XSIGJMIN)**2) +ZPMIN(5) = ZPMIN(4) * (ZRGMIN**3)*EXP(4.5 * LOG(XINISIGJ)**2) +ZPMIN(6) = ZPMIN(4) * (ZRGMIN**6)*EXP(18. * LOG(XINISIGJ)**2) END IF @@ -768,6 +768,8 @@ END IF ! !* 1.n transfer moment 0 from gas to aerosol variable ! +!print*,'aer_trans N0i =',MINVAL(PAERO(:,JP_CH_M0i)), MAXVAL(PAERO(:,JP_CH_M0i)) +!print*,'aer_trans N0j =',MINVAL(PAERO(:,JP_CH_M0j)), MAXVAL(PAERO(:,JP_CH_M0j)) PM(:,1) = MAX(PAERO(:,JP_CH_M0i) * 1E+6, XMNH_TINY) ! convert from 1/cc to 1/m3 PM(:,4) = MAX(PAERO(:,JP_CH_M0j) * 1E+6, XMNH_TINY) ! convert from 1/cc to 1/m3 @@ -892,7 +894,7 @@ PMASK(:,JN) = 1. END WHERE ENDDO - + ELSE ! !* 2. TRANSFER FROM AEROSOL TO GAS MODULE diff --git a/src/MNH/ch_aer_wetdepn.f90 b/src/MNH/ch_aer_wetdepn.f90 index b1041d55d5171b6a39b85289f99ee1b09a47536b..dd051acd8e62e7409f874285fe408355fa6c0793 100644 --- a/src/MNH/ch_aer_wetdepn.f90 +++ b/src/MNH/ch_aer_wetdepn.f90 @@ -99,12 +99,12 @@ END IF !Get minimum values possible ZPMIN(1) = XN0IMIN ZRGMIN = ZINIRADIUSI -ZPMIN(2) = ZPMIN(1) * (ZRGMIN**3)*EXP(4.5 * LOG(XSIGIMIN)**2) -ZPMIN(3) = ZPMIN(1) * (ZRGMIN**6)*EXP(18. * LOG(XSIGIMIN)**2) +ZPMIN(2) = ZPMIN(1) * (ZRGMIN**3)*EXP(4.5 * LOG(XINISIGI)**2) +ZPMIN(3) = ZPMIN(1) * (ZRGMIN**6)*EXP(18. * LOG(XINISIGI)**2) ZPMIN(4) = XN0JMIN ZRGMIN = ZINIRADIUSJ -ZPMIN(5) = ZPMIN(4) * (ZRGMIN**3)*EXP(4.5 * LOG(XSIGJMIN)**2) -ZPMIN(6) = ZPMIN(4) * (ZRGMIN**6)*EXP(18. * LOG(XSIGJMIN)**2) +ZPMIN(5) = ZPMIN(4) * (ZRGMIN**3)*EXP(4.5 * LOG(XINISIGJ)**2) +ZPMIN(6) = ZPMIN(4) * (ZRGMIN**6)*EXP(18. * LOG(XINISIGJ)**2) ! CALL PPP2AERO(PSVT, PRHODREF, PSIG3D=ZSIG, PRG3D=ZRG, PM3D=ZPMOLD) CALL PPP2AERO(PCWETDEP, PRHODREF, PSIG3D=ZSIGN, PRG3D=ZRGN, PM3D=ZPM) diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index 46f371a703455f83a7f484899861f3b303aaeac8..0f7fc499d4b281047049a20134b712873ad84286 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -1103,7 +1103,7 @@ LCH_PH = .FALSE. LCH_RET_ICE = .FALSE. XCH_PHINIT = 5.2 XRTMIN_AQ = 5.e-8 -CCHEM_INPUT_FILE = 'EXSEG1.nam' +CCHEM_INPUT_FILE = 'MNHC.input' CCH_TDISCRETIZATION = 'SPLIT' NCH_SUBSTEPS = 1 LCH_TUV_ONLINE = .FALSE. @@ -1183,8 +1183,8 @@ LHETEROSO4 = .FALSE. ! switch to active sulfates heteronegeous ! production LSEDIMAERO = .FALSE. ! switch to active aerosol sedimentation LAERINIT = .FALSE. ! switch to initialize aerosol in arome -CMINERAL = "NONE" ! mineral equilibrium scheme -CORGANIC = "NONE" ! mineral equilibrium scheme +CMINERAL = "EQSAM" ! mineral equilibrium scheme +CORGANIC = "MPMPO" ! mineral equilibrium scheme CNUCLEATION = "NONE" ! sulfates nucleation scheme LDEPOS_AER(:) = .FALSE. diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90 index d4d86db4fe7339f2c28c12880c00d712781f180e..d161d13b027d1164ddebdb9f14e3281b7e15a3e2 100644 --- a/src/MNH/diag.f90 +++ b/src/MNH/diag.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1999-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1999-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -403,33 +403,24 @@ CALL IO_File_open(TZNMLFILE) ILUNAM = TZNMLFILE%NLU ! ! -CALL POSNAM(ILUNAM,'NAM_DIAG',GFOUND) -IF (GFOUND) THEN - READ(UNIT=ILUNAM,NML=NAM_DIAG) -END IF +CALL POSNAM( TZNMLFILE, 'NAM_DIAG', GFOUND ) +IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_DIAG) ! -CALL POSNAM(ILUNAM,'NAM_DIAG_BLANK',GFOUND) -IF (GFOUND) THEN - READ(UNIT=ILUNAM,NML=NAM_DIAG_BLANK) -END IF +CALL POSNAM( TZNMLFILE, 'NAM_DIAG_BLANK', GFOUND ) +IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_DIAG_BLANK) ! -CALL POSNAM(ILUNAM,'NAM_DIAG_FILE',GFOUND) -IF (GFOUND) THEN - READ(UNIT=ILUNAM,NML=NAM_DIAG_FILE) -END IF +CALL POSNAM( TZNMLFILE, 'NAM_DIAG_FILE', GFOUND ) +IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_DIAG_FILE) +! +CALL POSNAM( TZNMLFILE, 'NAM_STO_FILE', GFOUND ) +IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_STO_FILE) +! +CALL POSNAM( TZNMLFILE, 'NAM_CONFZ', GFOUND ) +IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFZ) +! +CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND ) +IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFIO) ! -CALL POSNAM(ILUNAM,'NAM_STO_FILE',GFOUND) -IF (GFOUND) THEN - READ(UNIT=ILUNAM,NML=NAM_STO_FILE) -END IF -CALL POSNAM(ILUNAM,'NAM_CONFZ',GFOUND) -IF (GFOUND) THEN - READ(UNIT=ILUNAM,NML=NAM_CONFZ) -END IF -CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND) -IF (GFOUND) THEN - READ(UNIT=ILUNAM,NML=NAM_CONFIO) -END IF CALL IO_Config_set() ! CALL IO_File_close(TZNMLFILE) diff --git a/src/MNH/dustcamsn.f90 b/src/MNH/dustcamsn.f90 index 33966adfd96f0d7b3e6d5684f374c77cc7721e38..94732c05c0006a92918710c24f4e1a329ebb660d 100644 --- a/src/MNH/dustcamsn.f90 +++ b/src/MNH/dustcamsn.f90 @@ -125,13 +125,12 @@ DO JN = 1, NMODE_DST ZMMIN(IM3(JN)) = XN0MIN(IMODEIDX) * (ZRGMIN**3)*EXP(4.5 * LOG(ZINISIGMA(JN))**2) ZMMIN(IM6(JN)) = XN0MIN(IMODEIDX) * (ZRGMIN**6)*EXP(18. * LOG(ZINISIGMA(JN))**2) - IF (JPDUSTORDER(JN) == 1) ZMASS(:,:,:,JN) = PMASSCAMS(:,:,:,1) ! fin mode - IF (JPDUSTORDER(JN) == 2) ZMASS(:,:,:,JN) = PMASSCAMS(:,:,:,2) ! median mode - IF (JPDUSTORDER(JN) == 3) ZMASS(:,:,:,JN) = PMASSCAMS(:,:,:,3) ! large mode + IF (JPDUSTORDER(JN) == 1) ZMASS(:,:,:,JN) = MAX(PMASSCAMS(:,:,:,1), 1E-16) ! fin mode + IF (JPDUSTORDER(JN) == 2) ZMASS(:,:,:,JN) = MAX(PMASSCAMS(:,:,:,2), 1E-15) ! median mode + IF (JPDUSTORDER(JN) == 3) ZMASS(:,:,:,JN) = MAX(PMASSCAMS(:,:,:,3), 1E-15) ! large mode ENDDO -ZMASS(:,:,:,:) = MAX(ZMASS(:,:,:,:), 1E-40) ! ! ZRHOI = XDENSITY_DUST !1.8e3 !++changed alfgr @@ -158,14 +157,14 @@ DO JN = 1, NMODE_DST (ZINIRADIUS(JN)**3) * & EXP(4.5*LOG(ZINISIGMA(JN))**2) - ZM(:,:,:,IM3(JN)) = MAX(ZMMIN(IM3(JN)), ZM(:,:,:,IM3(JN))) +! ZM(:,:,:,IM3(JN)) = MAX(ZMMIN(IM3(JN)), ZM(:,:,:,IM3(JN))) ! !* 1.3 calculate moment 6 from m0, RG and SIG ! ZM(:,:,:,IM6(JN))= ZM(:,:,:,IM0(JN)) * ((ZINIRADIUS(JN)**6) * & EXP(18.*(LOG(ZINISIGMA(JN)))**2)) ! - ZM(:,:,:,IM6(JN)) = MAX(ZMMIN(IM6(JN)), ZM(:,:,:,IM6(JN))) +! ZM(:,:,:,IM6(JN)) = MAX(ZMMIN(IM6(JN)), ZM(:,:,:,IM6(JN))) ! !* 1.4 output concentration ! diff --git a/src/MNH/end_diag_in_run.f90 b/src/MNH/end_diag_in_run.f90 index 61405af363c8688e00877d1e7b5e1334eb17c292..2fd13009abc5141a9bde3f418243aae5b49db82f 100644 --- a/src/MNH/end_diag_in_run.f90 +++ b/src/MNH/end_diag_in_run.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2003-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 profiler 2006/10/24 10:07:27 -!----------------------------------------------------------------- ! ######################### MODULE MODI_END_DIAG_IN_RUN ! ######################### @@ -83,8 +78,8 @@ DEALLOCATE(XCURRENT_LWD )! incoming longwave at the surface DEALLOCATE(XCURRENT_LWU )! outcoming longwave at the surface DEALLOCATE(XCURRENT_SWD )! incoming Shortwave at the surface DEALLOCATE(XCURRENT_SWU )! outcoming Shortwave at the surface -IF(ALLOCATED(XCURRENT_SWDIR)) DEALLOCATE(XCURRENT_SWDIR )! incoming Shortwave direct at the surface -IF(ALLOCATED(XCURRENT_SWDIFF))DEALLOCATE(XCURRENT_SWDIFF)! incoming Shortwave diffuse at the surface +DEALLOCATE(XCURRENT_SWDIR )! incoming Shortwave direct at the surface +DEALLOCATE(XCURRENT_SWDIFF)! incoming Shortwave diffuse at the surface DEALLOCATE(XCURRENT_T2M )! temperature at 2m DEALLOCATE(XCURRENT_Q2M )! humidity at 2m DEALLOCATE(XCURRENT_HU2M )! humidity at 2m @@ -94,7 +89,7 @@ DEALLOCATE(XCURRENT_DSTAOD)! dust aerosol optical depth DEALLOCATE(XCURRENT_SFCO2 ) ! CO2 Surface flux DEALLOCATE(XCURRENT_TKE_DISS) ! Tke dissipation rate DEALLOCATE(XCURRENT_SLTAOD) ! Salt aerosol optical depth -DEALLOCATE(XCURRENT_ZWS ) ! Significant height of waves +! DEALLOCATE(XCURRENT_ZWS ) ! Significant height of waves ! !------------------------------------------------------------------------------- diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index d7e5c3e0b058b419fc5ebc97411584813973d69d..268c13525d352148695d4dccf1bba5e48ece49fd 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -135,98 +135,95 @@ END MODULE MODI_GROUND_PARAM_n !* 0. DECLARATIONS ! ------------ ! -! +USE MODD_ALLPROFILER_n, ONLY: LDIAG_SURFRAD_PROF +USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD_STAT +USE MODD_ARGSLIST_ll, ONLY: LIST_ll +USE MODD_BLOWSNOW, ONLY: LBLOWSNOW, NBLOWSNOW_2D, YPBLOWSNOW_2D +USE MODD_BLOWSNOW_n, ONLY: XRSNWCANOS +USE MODD_BUDGET, ONLY: LBUDGET_TH, LBUDGET_RV, NBUDGET_RV, NBUDGET_TH, TBUDGETS +USE MODD_CH_AEROSOL, ONLY: LORILAM +USE MODD_CH_FLX_n, ONLY: XCHFLX +USE MODD_CH_MNHC_n, ONLY: LUSECHEM +USE MODD_CONF, ONLY: CPROGRAM, LCARTESIAN, NHALO +USE MODD_COUPLING_LEVELS_n +USE MODD_CONF_n, ONLY: NRR +USE MODD_CST, ONLY: XP00, XCPD, XRD, XRV, XRHOLW, XDAY, XPI, XMD, XAVOGADRO +USE MODD_CSTS_DUST, ONLY: XMOLARWEIGHT_DUST +USE MODD_CSTS_SALT, ONLY: XMOLARWEIGHT_SALT +USE MODD_DEEP_CONVECTION_n, ONLY: XPRCONV, XPRSCONV +USE MODD_DRAGBLDG_n, ONLY : LFLUXBLDG +USE MODD_DIAG_FLAG, ONLY: LCHEMDIAG +USE MODD_DIAG_IN_RUN +USE MODD_DIM_n, ONLY: NKMAX +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_DUST, ONLY: LDUST +USE MODD_DYN_n, ONLY: XTSTEP +USE MODD_FIELD_n, ONLY: XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS, XRTHS, XRRS +USE MODD_FIRE_n, ONLY: XLSPHI, XBMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMIGNITION, XFMFUELTYPE, & + XFIRETAU, XFLUXPARAMH, XFLUXPARAMW, XFIRERW, XFMASE, XFMAWC, XFMWALKIG, & + XFMFLUXHDH, XFMFLUXHDW, XFMHWS, XFMWINDU, XFMWINDV, XFMWINDW, XGRADLSPHIX, & + XGRADLSPHIY, XFIREWIND, XFMGRADOROX, XFMGRADOROY +USE MODD_GRID, ONLY: XLON0, XRPK, XBETA +USE MODD_GRID_n, ONLY: XLON, XZZ, XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & + XCOSSLOPE, XSINSLOPE, XZS +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZZ +USE MODD_MNH_SURFEX_n, ONLY: YSURF_CUR +USE MODD_NSV, ONLY: CSV, NSV, NSV_AERBEG, NSV_AEREND, NSV_CHEMBEG, NSV_CHEMEND, NSV_DSTBEG, NSV_DSTEND, & + NSV_SLTBEG, NSV_SLTEND, NSV_SNWBEG, NSV_SNWEND +USE MODD_PARAM_C2R2, ONLY: LSEDC +USE MODD_PREP_SNOW, ONLY: NIMPUR +USE MODD_PARAMETERS, ONLY: JPVEXT +USE MODD_PARAM_ICE, ONLY: LSEDIC +USE MODD_PARAM_LIMA, ONLY: MSEDC=>LSEDC +USE MODD_PARAM_n, ONLY: CDCONV, CCLOUD, CRAD +USE MODD_PRECIP_n, ONLY: XINPRC, XINPRR, XINPRS, XINPRG, XINPRH +USE MODD_PRECISION, ONLY: MNHTIME +USE MODD_PROFILER_n, ONLY: LPROFILER +USE MODD_RADIATIONS_n, ONLY: XFLALWD, XCCO2, XTSIDER, & + XSW_BANDS, XDIRSRFSWD, XSCAFLASWD, & + XZENITH, XAZIM, XAER, XSWU, XLWU +USE MODD_REF_n, ONLY: XEXNREF, XRHODREF, XRHODJ +USE MODD_SALT, ONLY: LSALT +USE MODD_STATION_n, ONLY: LSTATION +USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF +USE MODD_TIME, ONLY: TDTSEG +USE MODD_TIME_n, ONLY: TDTCUR #ifdef CPLOASIS -USE MODI_GET_HALO -USE MODI_MNH_OASIS_RECV -USE MODI_MNH_OASIS_SEND -USE MODD_SFX_OASIS, ONLY : LOASIS -USE MODD_DYN, ONLY : XSEGLEN -USE MODD_DYN_n, ONLY : DYN_MODEL +USE MODD_SFX_OASIS, ONLY: LOASIS +USE MODD_DYN, ONLY: XSEGLEN +USE MODD_DYN_n, ONLY: DYN_MODEL #endif -! -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_BUDGET, ONLY: LBUDGET_TH, LBUDGET_RV, NBUDGET_RV, NBUDGET_TH,TBUDGETS -USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT, BUDGET_STORE_END -USE MODD_CST, ONLY : XP00, XCPD, XRD, XRV,XRHOLW, XDAY, XPI, XLVTT, XMD, XAVOGADRO -USE MODD_DIMPHYEX, ONLY : DIMPHYEX_t -USE MODD_PARAMETERS, ONLY : JPVEXT -USE MODD_DYN_n, ONLY : XTSTEP -USE MODD_CH_MNHC_n, ONLY : LUSECHEM -USE MODD_FIELD_n, ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS, XRTHS, XRRS -USE MODD_FIRE_n, ONLY : XLSPHI, XBMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMIGNITION, XFMFUELTYPE, & - XFIRETAU, XFLUXPARAMH, XFLUXPARAMW, XFIRERW, XFMASE, XFMAWC, XFMWALKIG, & - XFMFLUXHDH, XFMFLUXHDW, XFMHWS, XFMWINDU, XFMWINDV, XFMWINDW, XGRADLSPHIX, & - XGRADLSPHIY, XFIREWIND, XFMGRADOROX, XFMGRADOROY -USE MODD_METRICS_n, ONLY : XDXX, XDYY, XDZZ -USE MODD_DIM_n, ONLY : NKMAX -USE MODD_GRID_n, ONLY : XLON, XZZ, XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & - XCOSSLOPE, XSINSLOPE, XZS -USE MODD_REF_n, ONLY : XEXNREF, XRHODREF, XRHODJ -USE MODD_CONF_n, ONLY : NRR -USE MODD_PARAM_n, ONLY : CDCONV,CCLOUD, CRAD -USE MODD_PRECIP_n, ONLY : XINPRC, XINPRR, XINPRS, XINPRG, XINPRH -USE MODD_DEEP_CONVECTION_n, ONLY : XPRCONV, XPRSCONV -USE MODD_CONF, ONLY : LCARTESIAN, CPROGRAM -USE MODD_TIME_n, ONLY : TDTCUR -USE MODD_RADIATIONS_n, ONLY : XFLALWD, XCCO2, XTSIDER, & - XSW_BANDS, XDIRSRFSWD, XSCAFLASWD, & - XZENITH, XAZIM, XAER, XSWU, XLWU -USE MODD_NSV -USE MODD_GRID, ONLY : XLON0, XRPK, XBETA -USE MODD_PARAM_ICE, ONLY : LSEDIC -USE MODD_PARAM_C2R2, ONLY : LSEDC -USE MODD_PREP_SNOW, ONLY : NIMPUR -USE MODD_DIAG_IN_RUN -USE MODD_DUST, ONLY : LDUST -USE MODD_SALT, ONLY : LSALT -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -USE MODD_CH_AEROSOL, ONLY : LORILAM -USE MODD_CSTS_DUST, ONLY : XMOLARWEIGHT_DUST -USE MODD_CSTS_SALT, ONLY : XMOLARWEIGHT_SALT -USE MODD_CH_FLX_n, ONLY : XCHFLX -USE MODD_DIAG_FLAG, ONLY : LCHEMDIAG -USE MODD_DRAGBLDG_n, ONLY : LFLUXBLDG -USE MODD_COUPLING_LEVELS_n -USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF -USE MODD_PRECISION, ONLY: MNHTIME -! -USE MODI_NORMAL_INTERPOL -USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND -USE MODI_SHUMAN -USE MODI_MNHGET_SURF_PARAM_n -USE MODI_COUPLING_SURF_ATM_n -USE MODI_DIAG_SURF_ATM_n -USE MODD_MNH_SURFEX_n -! -USE MODE_DATETIME -USE MODE_ll -USE MODD_ARGSLIST_ll, ONLY : LIST_ll #ifdef MNH_FOREFIRE -!** MODULES FOR FOREFIRE **! USE MODD_FOREFIRE USE MODD_FOREFIRE_n -USE MODI_COUPLING_FOREFIRE_n #endif -! -USE MODD_TIME_n -USE MODD_TIME -! -USE MODD_PARAM_LIMA, ONLY : MSEDC=>LSEDC -! -USE MODD_FIRE_n -USE MODD_FIELD + +USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT, BUDGET_STORE_END +USE MODE_DATETIME USE MODE_FIRE_MODEL -USE MODD_CONF, ONLY : NVERB, NHALO -USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 +USE MODE_ll +USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_MSG -USE MODD_IO, ONLY: TFILEDATA +USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND + +USE MODI_COUPLING_SURF_ATM_n +USE MODI_DIAG_SURF_ATM_n +USE MODI_MNHGET_SURF_PARAM_n +USE MODI_NORMAL_INTERPOL +USE MODI_SHUMAN +#ifdef CPLOASIS +USE MODI_GET_HALO +USE MODI_MNH_OASIS_RECV +USE MODI_MNH_OASIS_SEND +#endif +#ifdef MNH_FOREFIRE +USE MODI_COUPLING_FOREFIRE_n +#endif ! IMPLICIT NONE ! -! -! !* 0.1 declarations of arguments ! !* surface fluxes @@ -435,8 +432,9 @@ CHARACTER(LEN=6) :: YJSV CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: YSV_SURF ! name of the scalar variables ! sent to SURFEX ! -REAL :: ZTIMEC -INTEGER :: ILUOUT ! logical unit +LOGICAL :: GSTATPROF_SURF ! TRUE if station or profiler need to write surface or radiation data +REAL :: ZTIMEC +INTEGER :: ILUOUT ! logical unit ! ! New variables for coupling at several levels ! @@ -503,6 +501,8 @@ ALLOCATE(ZALFA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) ALLOCATE(ZU2D(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) ALLOCATE(ZV2D(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) ! +GSTATPROF_SURF = ( LPROFILER .AND. LDIAG_SURFRAD_PROF ) .OR. ( LSTATION .AND. LDIAG_SURFRAD_STAT ) +! !------------------------------------------------------------------------------- ! !* 1. CONVERSION OF THE ATMOSPHERIC VARIABLES @@ -824,11 +824,15 @@ IF (LOASIS) THEN END IF #endif ! -IF (CPROGRAM=='DIAG ' .OR. LDIAG_IN_RUN) THEN - CALL DIAG_SURF_ATM_n(YSURF_CUR,'MESONH') - CALL MNHGET_SURF_PARAM_n(PRN=ZP_RN,PH=ZP_H,PLE=ZP_LE,PLEI=ZP_LEI, & - PGFLUX=ZP_GFLUX,PT2M=ZP_T2M,PQ2M=ZP_Q2M,PHU2M=ZP_HU2M, & - PZON10M=ZP_ZON10M,PMER10M=ZP_MER10M ) +IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN + CALL DIAG_SURF_ATM_n( YSURF_CUR, 'MESONH' ) + IF ( CPROGRAM == 'DIAG' ) THEN + CALL MNHGET_SURF_PARAM_n(PZON10M=ZP_ZON10M, PMER10M=ZP_MER10M) + ELSE + CALL MNHGET_SURF_PARAM_n( PRN=ZP_RN, PH=ZP_H, PLE=ZP_LE, PLEI=ZP_LEI, & + PGFLUX=ZP_GFLUX, PT2M=ZP_T2M, PQ2M=ZP_Q2M, PHU2M=ZP_HU2M, & + PZON10M=ZP_ZON10M, PMER10M=ZP_MER10M) + END IF END IF ! ! Transform 1D output fields into 2D: @@ -1173,51 +1177,58 @@ CALL CLEANLIST_ll(TZFIELDSURF_ll) ! ----------- ! ! -IF (LDIAG_IN_RUN) THEN - ! +IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN XCURRENT_SFCO2(:,:) = ZSFCO2(:,:) - XCURRENT_DSTAOD(:,:)=0.0 - XCURRENT_SLTAOD(:,:)=0.0 - IF (CRAD/='NONE') THEN - XCURRENT_LWD (:,:) = XFLALWD(:,:) - XCURRENT_SWD (:,:) = SUM(XDIRSRFSWD(:,:,:)+XSCAFLASWD(:,:,:),DIM=3) - XCURRENT_LWU (:,:) = XLWU(:,:,IKB) - XCURRENT_SWU (:,:) = XSWU(:,:,IKB) - XCURRENT_SWDIR(:,:) = SUM(XDIRSRFSWD,DIM=3) - XCURRENT_SWDIFF(:,:) = SUM(XSCAFLASWD(:,:,:),DIM=3) - DO JK=IKB,IKE - IKRAD = JK - 1 - DO JJ=IJB,IJE - DO JI=IIB,IIE - XCURRENT_DSTAOD(JI,JJ)=XCURRENT_DSTAOD(JI,JJ)+XAER(JI,JJ,IKRAD,3) - XCURRENT_SLTAOD(JI,JJ)=XCURRENT_SLTAOD(JI,JJ)+XAER(JI,JJ,IKRAD,2) - ENDDO - ENDDO - ENDDO + IF ( CRAD /= 'NONE' ) THEN + XCURRENT_LWD (:,:) = XFLALWD(:,:) + XCURRENT_SWD (:,:) = SUM( XDIRSRFSWD(:,:,:) + XSCAFLASWD(:,:,:), DIM=3 ) + XCURRENT_LWU (:,:) = XLWU(:,:,IKB) + XCURRENT_SWU (:,:) = XSWU(:,:,IKB) + IF ( GSTATPROF_SURF ) THEN + XCURRENT_SWDIR(:,:) = SUM( XDIRSRFSWD(:,:,:), DIM=3 ) + XCURRENT_SWDIFF(:,:) = SUM( XSCAFLASWD(:,:,:), DIM=3 ) + XCURRENT_DSTAOD(:,:) = 0.0 + XCURRENT_SLTAOD(:,:) = 0.0 + DO JK=IKB,IKE + IKRAD = JK - 1 + DO JJ = IJB, IJE + DO JI = IIB, IIE + XCURRENT_DSTAOD(JI,JJ) = XCURRENT_DSTAOD(JI,JJ) + XAER(JI,JJ,IKRAD,3) + XCURRENT_SLTAOD(JI,JJ) = XCURRENT_SLTAOD(JI,JJ) + XAER(JI,JJ,IKRAD,2) + END DO + END DO + END DO + END IF END IF - ! NULLIFY(TZFIELDSURF_ll) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_RN, 'GROUND_PARAM_n::XCURRENT_RN' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_H, 'GROUND_PARAM_n::XCURRENT_H' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LE, 'GROUND_PARAM_n::XCURRENT_LE' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LEI, 'GROUND_PARAM_n::XCURRENT_LEI' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_GFLUX, 'GROUND_PARAM_n::XCURRENT_GFLUX' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWD, 'GROUND_PARAM_n::XCURRENT_SWD' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWU, 'GROUND_PARAM_n::XCURRENT_SWU' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWD, 'GROUND_PARAM_n::XCURRENT_LWD' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWU, 'GROUND_PARAM_n::XCURRENT_LWU' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIR, 'GROUND_PARAM_n::XCURRENT_SWDIR' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIFF, 'GROUND_PARAM_n::XCURRENT_SWDIFF' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_T2M, 'GROUND_PARAM_n::XCURRENT_T2M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_Q2M, 'GROUND_PARAM_n::XCURRENT_Q2M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_HU2M, 'GROUND_PARAM_n::XCURRENT_HU2M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZON10M, 'GROUND_PARAM_n::XCURRENT_ZON10M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_MER10M, 'GROUND_PARAM_n::XCURRENT_MER10M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_DSTAOD, 'GROUND_PARAM_n::XCURRENT_DSTAOD' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SLTAOD, 'GROUND_PARAM_n::XCURRENT_SLTAOD' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZWS, 'GROUND_PARAM_n::XCURRENT_ZWS' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SFCO2, 'GROUND_PARAM_n::XCURRENT_SFCO2' ) - ! + + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SFCO2, 'GROUND_PARAM_n::XCURRENT_SFCO2' ) + IF ( CRAD /= 'NONE' ) THEN + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWD, 'GROUND_PARAM_n::XCURRENT_LWD' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWD, 'GROUND_PARAM_n::XCURRENT_SWD' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWU, 'GROUND_PARAM_n::XCURRENT_LWU' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWU, 'GROUND_PARAM_n::XCURRENT_SWU' ) + IF ( GSTATPROF_SURF ) THEN + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIR, 'GROUND_PARAM_n::XCURRENT_SWDIR' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIFF, 'GROUND_PARAM_n::XCURRENT_SWDIFF' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_DSTAOD, 'GROUND_PARAM_n::XCURRENT_DSTAOD' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SLTAOD, 'GROUND_PARAM_n::XCURRENT_SLTAOD' ) + END IF + END IF + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZON10M, 'GROUND_PARAM_n::XCURRENT_ZON10M' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_MER10M, 'GROUND_PARAM_n::XCURRENT_MER10M' ) + IF ( GSTATPROF_SURF ) THEN + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_RN, 'GROUND_PARAM_n::XCURRENT_RN' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_H, 'GROUND_PARAM_n::XCURRENT_H' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LE, 'GROUND_PARAM_n::XCURRENT_LE' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LEI, 'GROUND_PARAM_n::XCURRENT_LEI' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_GFLUX, 'GROUND_PARAM_n::XCURRENT_GFLUX' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_T2M, 'GROUND_PARAM_n::XCURRENT_T2M' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_Q2M, 'GROUND_PARAM_n::XCURRENT_Q2M' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_HU2M, 'GROUND_PARAM_n::XCURRENT_HU2M' ) + END IF + ! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZWS, 'GROUND_PARAM_n::XCURRENT_ZWS' ) + CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll) CALL CLEANLIST_ll(TZFIELDSURF_ll) ! @@ -1292,16 +1303,20 @@ ALLOCATE(ZP_TSURF (KDIM1D)) ALLOCATE(ZP_Z0 (KDIM1D)) ALLOCATE(ZP_Z0H (KDIM1D)) ALLOCATE(ZP_QSURF (KDIM1D)) -ALLOCATE(ZP_RN (KDIM1D)) -ALLOCATE(ZP_H (KDIM1D)) -ALLOCATE(ZP_LE (KDIM1D)) -ALLOCATE(ZP_LEI (KDIM1D)) -ALLOCATE(ZP_GFLUX (KDIM1D)) -ALLOCATE(ZP_T2M (KDIM1D)) -ALLOCATE(ZP_Q2M (KDIM1D)) -ALLOCATE(ZP_HU2M (KDIM1D)) -ALLOCATE(ZP_ZON10M (KDIM1D)) -ALLOCATE(ZP_MER10M (KDIM1D)) +IF ( GSTATPROF_SURF ) THEN + ALLOCATE(ZP_RN (KDIM1D)) + ALLOCATE(ZP_H (KDIM1D)) + ALLOCATE(ZP_LE (KDIM1D)) + ALLOCATE(ZP_LEI (KDIM1D)) + ALLOCATE(ZP_GFLUX (KDIM1D)) + ALLOCATE(ZP_T2M (KDIM1D)) + ALLOCATE(ZP_Q2M (KDIM1D)) + ALLOCATE(ZP_HU2M (KDIM1D)) +END IF +IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN + ALLOCATE(ZP_ZON10M (KDIM1D)) + ALLOCATE(ZP_MER10M (KDIM1D)) +END IF ! !* explicit coupling only ALLOCATE(ZP_PEW_A_COEF (KDIM1D)) @@ -1440,7 +1455,7 @@ IF(LBLOWSNOW) THEN END DO END IF ! -IF (LDIAG_IN_RUN) THEN +IF ( GSTATPROF_SURF ) THEN XCURRENT_RN (IIB:IIE,IJB:IJE) = RESHAPE(ZP_RN(:), ISHAPE_2) XCURRENT_H (IIB:IIE,IJB:IJE) = RESHAPE(ZP_H (:), ISHAPE_2) XCURRENT_LE (IIB:IIE,IJB:IJE) = RESHAPE(ZP_LE(:), ISHAPE_2) @@ -1449,10 +1464,12 @@ IF (LDIAG_IN_RUN) THEN XCURRENT_T2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_T2M(:), ISHAPE_2) XCURRENT_Q2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_Q2M(:), ISHAPE_2) XCURRENT_HU2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_HU2M(:), ISHAPE_2) +END IF +IF ( GSTATPROF_SURF .OR. CPROGRAM == 'DIAG' ) THEN XCURRENT_ZON10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZON10M(:), ISHAPE_2) XCURRENT_MER10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_MER10M(:), ISHAPE_2) - XCURRENT_ZWS (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZWS(:), ISHAPE_2) -ENDIF + ! XCURRENT_ZWS (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZWS(:), ISHAPE_2) +END IF ! DO JLAYER=1,SIZE(PDIR_ALB,3) PDIR_ALB(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_DIR_ALB(:,JLAYER), ISHAPE_2) @@ -1498,16 +1515,20 @@ DEALLOCATE(ZP_TSRAD ) DEALLOCATE(ZP_DIR_ALB ) DEALLOCATE(ZP_SCA_ALB ) DEALLOCATE(ZP_EMIS ) -DEALLOCATE(ZP_RN ) -DEALLOCATE(ZP_H ) -DEALLOCATE(ZP_LE ) -DEALLOCATE(ZP_LEI ) -DEALLOCATE(ZP_GFLUX ) -DEALLOCATE(ZP_T2M ) -DEALLOCATE(ZP_Q2M ) -DEALLOCATE(ZP_HU2M ) -DEALLOCATE(ZP_ZON10M ) -DEALLOCATE(ZP_MER10M ) +IF ( GSTATPROF_SURF ) THEN + DEALLOCATE(ZP_RN ) + DEALLOCATE(ZP_H ) + DEALLOCATE(ZP_LE ) + DEALLOCATE(ZP_LEI ) + DEALLOCATE(ZP_GFLUX ) + DEALLOCATE(ZP_T2M ) + DEALLOCATE(ZP_Q2M ) + DEALLOCATE(ZP_HU2M ) +END IF +IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN + DEALLOCATE(ZP_ZON10M ) + DEALLOCATE(ZP_MER10M ) +END IF DEALLOCATE(ZP_PEW_A_COEF ) DEALLOCATE(ZP_PEW_B_COEF ) diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90 index 331df58cf9ea2e50738f7fdbc9bcaf73816c0bd3..530cb390cf71f355a423fdbc836e950f34577a16 100644 --- a/src/MNH/ini_aircraft.f90 +++ b/src/MNH/ini_aircraft.f90 @@ -199,6 +199,15 @@ DO JI = 1, NAIRCRAFTS ! Read CSV data (trajectory) CALL AIRCRAFT_CSV_READ( TZAIRCRAFT, CFILE(JI) ) + IF ( TZAIRCRAFT%LALTDEF ) THEN + ! Print a warning if pressures seem too high (> 2000 hPa) + IF ( ANY( TZAIRCRAFT%XPOSP > 2.E5 ) ) THEN + CMNHMSG(1) = TRIM( TZAIRCRAFT%CTITLE ) // ': pressure values seem too high' + CMNHMSG(2) = 'check that they are given in hPa and not Pa' + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_AIRCRAFT', OLOCAL = .TRUE. ) + END IF + END IF + END DO IF ( NAIRCRAFTS > 0 ) CALL AIRCRAFTS_NML_DEALLOCATE() @@ -223,10 +232,13 @@ CHARACTER(LEN=*), INTENT(IN) :: HFILE !Name of the CSV file with the aircr CHARACTER(LEN=NMAXLINELGT) :: YSTRING INTEGER :: ILU ! logical unit of the file +INTEGER :: ILINESREAD ! Number of lines read and treated (the 1st one is skipped) INTEGER :: JI REAL :: ZLAT, ZLON, ZALT REAL :: ZTIME +ILINESREAD = 0 + ! Open file OPEN( NEWUNIT = ILU, FILE = HFILE, FORM = 'formatted' ) @@ -235,6 +247,7 @@ READ( ILU, END = 101, FMT = '(A)' ) YSTRING ! Reading of header (skip it) DO JI = 1, TPAIRCRAFT%NPOS ! Read aircraft position READ( ILU, END = 101, FMT = '(A)' ) YSTRING + ILINESREAD = ILINESREAD + 1 READ( YSTRING, * ) ZTIME, ZLAT, ZLON, ZALT @@ -252,7 +265,7 @@ END DO CLOSE( ILU ) -IF ( JI < TPAIRCRAFT%NPOS ) & +IF ( ILINESREAD < TPAIRCRAFT%NPOS ) & CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_CSV_READ', 'Data not found in file ' // TRIM( HFILE ), OLOCAL = .TRUE. ) TPAIRCRAFT%TLAND = TPAIRCRAFT%TLAUNCH + TPAIRCRAFT%XPOSTIME(TPAIRCRAFT%NPOS) diff --git a/src/MNH/ini_diag_in_run.f90 b/src/MNH/ini_diag_in_run.f90 index 6f39e805a357747f41972243e967fbdbd58700e1..0910a61e66cd9469930d7b6f132a1a5db18898f5 100644 --- a/src/MNH/ini_diag_in_run.f90 +++ b/src/MNH/ini_diag_in_run.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2003-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2003-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -31,7 +31,7 @@ END MODULE MODI_INI_DIAG_IN_RUN ! ############################################################### ! ! -!!**** *INI_DIAG_IN_RUN* - +!!**** *INI_DIAG_IN_RUN* - !! !! PURPOSE !! ------- @@ -39,7 +39,7 @@ END MODULE MODI_INI_DIAG_IN_RUN ! !!** METHOD !! ------ -!! +!! !! !! EXTERNAL !! -------- @@ -65,10 +65,13 @@ END MODULE MODI_INI_DIAG_IN_RUN !* 0. DECLARATIONS ! ------------ ! -USE MODD_CONF, ONLY : CPROGRAM +USE MODD_ALLPROFILER_n, ONLY: LDIAG_SURFRAD_PROF +USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD_STAT +USE MODD_CONF, ONLY: CPROGRAM USE MODD_DIAG_IN_RUN -USE MODD_PARAMETERS, ONLY : XUNDEF -USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF +USE MODD_PARAMETERS, ONLY: XUNDEF +USE MODD_PARAM_n, ONLY: CRAD +USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF ! IMPLICIT NONE ! @@ -84,36 +87,90 @@ LOGICAL, INTENT(IN) :: OPROFILER! flag for profiler ! !------------------------------------------------------------------------------- ! -IF (OFLYER .OR. OSTATION .OR. OPROFILER .OR. CPROGRAM=='DIAG ') THEN +! LDIAG_IN_RUN is only used for XCURRENT_TKE_DISS (computed in turbulence) +IF ( OFLYER .OR. OPROFILER ) THEN LDIAG_IN_RUN = .TRUE. + ALLOCATE( XCURRENT_TKE_DISS(KIU,KJU,KKU) ) ! Tke dissipation rate + XCURRENT_TKE_DISS = XUNDEF ELSE LDIAG_IN_RUN = .FALSE. + ALLOCATE( XCURRENT_TKE_DISS(0,0,0) ) ! Tke dissipation rate END IF -! -IF (LDIAG_IN_RUN) THEN + +IF ( CPROGRAM == 'DIAG' ) THEN + IF ( CRAD /= 'NONE' ) THEN + ALLOCATE(XCURRENT_LWD (KIU,KJU))! incoming longwave at the surface + ALLOCATE(XCURRENT_LWU (KIU,KJU))! outcoming longwave at the surface + ALLOCATE(XCURRENT_SWD (KIU,KJU))! incoming Shortwave at the surface + ALLOCATE(XCURRENT_SWU (KIU,KJU))! outcoming Shortwave at the surface + ELSE + ALLOCATE(XCURRENT_LWD (0,0))! incoming longwave at the surface + ALLOCATE(XCURRENT_LWU (0,0))! outcoming longwave at the surface + ALLOCATE(XCURRENT_SWD (0,0))! incoming Shortwave at the surface + ALLOCATE(XCURRENT_SWU (0,0))! outcoming Shortwave at the surface + END IF + + ALLOCATE(XCURRENT_ZON10M(KIU,KJU))! zonal wind at 10m + ALLOCATE(XCURRENT_MER10M(KIU,KJU))! meridian wind at 10m + + ALLOCATE(XCURRENT_SFCO2 (KIU,KJU))! CO2 Surface flux + + ALLOCATE(XCURRENT_RN (0,0))! net radiation + ALLOCATE(XCURRENT_H (0,0))! sensible heat flux + ALLOCATE(XCURRENT_LE (0,0))! Total latent heat flux + ALLOCATE(XCURRENT_LEI (0,0))! Solid latent heat flux + ALLOCATE(XCURRENT_GFLUX (0,0))! ground flux + ALLOCATE(XCURRENT_SWDIR (0,0))! incoming Shortwave direct at the surface + ALLOCATE(XCURRENT_SWDIFF(0,0))! incoming Shortwave diffuse at the surface + ALLOCATE(XCURRENT_T2M (0,0))! temperature at 2m + ALLOCATE(XCURRENT_Q2M (0,0))! humidity at 2m + ALLOCATE(XCURRENT_HU2M (0,0))! humidity at 2m + ALLOCATE(XCURRENT_DSTAOD(0,0))! dust aerosol optical depth + ALLOCATE(XCURRENT_SLTAOD(0,0))! Salt aerosol optical depth + ! ALLOCATE(XCURRENT_ZWS(0,0))! Significant height of waves + + XCURRENT_LWD = XUNDEF + XCURRENT_LWU = XUNDEF + XCURRENT_SWD = XUNDEF + XCURRENT_SWU = XUNDEF + + XCURRENT_ZON10M = XUNDEF_SFX + XCURRENT_MER10M = XUNDEF_SFX + + XCURRENT_SFCO2 = XUNDEF_SFX +ELSE IF ( ( OPROFILER .AND. LDIAG_SURFRAD_PROF ) .OR. ( OSTATION .AND. LDIAG_SURFRAD_STAT ) ) THEN ALLOCATE(XCURRENT_RN (KIU,KJU))! net radiation ALLOCATE(XCURRENT_H (KIU,KJU))! sensible heat flux ALLOCATE(XCURRENT_LE (KIU,KJU))! Total latent heat flux - ALLOCATE(XCURRENT_LEI (KIU,KJU))! Solid latent heat flux + ALLOCATE(XCURRENT_LEI (KIU,KJU))! Solid latent heat flux ALLOCATE(XCURRENT_GFLUX (KIU,KJU))! ground flux - ALLOCATE(XCURRENT_LWD (KIU,KJU))! incoming longwave at the surface - ALLOCATE(XCURRENT_LWU (KIU,KJU))! outcoming longwave at the surface - ALLOCATE(XCURRENT_SWD (KIU,KJU))! incoming Shortwave at the surface - ALLOCATE(XCURRENT_SWU (KIU,KJU))! outcoming Shortwave at the surface - ALLOCATE(XCURRENT_SWDIR (KIU,KJU))! incoming Shortwave direct at the surface - ALLOCATE(XCURRENT_SWDIFF(KIU,KJU))! incoming Shortwave diffuse at the surface + IF ( CRAD /= 'NONE' ) THEN + ALLOCATE(XCURRENT_LWD (KIU,KJU))! incoming longwave at the surface + ALLOCATE(XCURRENT_LWU (KIU,KJU))! outcoming longwave at the surface + ALLOCATE(XCURRENT_SWD (KIU,KJU))! incoming Shortwave at the surface + ALLOCATE(XCURRENT_SWU (KIU,KJU))! outcoming Shortwave at the surface + ALLOCATE(XCURRENT_SWDIR (KIU,KJU))! incoming Shortwave direct at the surface + ALLOCATE(XCURRENT_SWDIFF(KIU,KJU))! incoming Shortwave diffuse at the surface + ALLOCATE(XCURRENT_DSTAOD(KIU,KJU))! dust aerosol optical depth + ALLOCATE(XCURRENT_SLTAOD(KIU,KJU))! Salt aerosol optical depth + ELSE + ALLOCATE(XCURRENT_LWD (0,0))! incoming longwave at the surface + ALLOCATE(XCURRENT_LWU (0,0))! outcoming longwave at the surface + ALLOCATE(XCURRENT_SWD (0,0))! incoming Shortwave at the surface + ALLOCATE(XCURRENT_SWU (0,0))! outcoming Shortwave at the surface + ALLOCATE(XCURRENT_SWDIR (0,0))! incoming Shortwave direct at the surface + ALLOCATE(XCURRENT_SWDIFF(0,0))! incoming Shortwave diffuse at the surface + ALLOCATE(XCURRENT_DSTAOD(0,0))! dust aerosol optical depth + ALLOCATE(XCURRENT_SLTAOD(0,0))! Salt aerosol optical depth + END IF ALLOCATE(XCURRENT_T2M (KIU,KJU))! temperature at 2m ALLOCATE(XCURRENT_Q2M (KIU,KJU))! humidity at 2m - ALLOCATE(XCURRENT_HU2M (KIU,KJU))! humidity at 2m + ALLOCATE(XCURRENT_HU2M (KIU,KJU))! humidity at 2m ALLOCATE(XCURRENT_ZON10M(KIU,KJU))! zonal wind at 10m ALLOCATE(XCURRENT_MER10M(KIU,KJU))! meridian wind at 10m - ALLOCATE(XCURRENT_DSTAOD(KIU,KJU))! dust aerosol optical depth ALLOCATE(XCURRENT_SFCO2 (KIU,KJU))! CO2 Surface flux - ALLOCATE(XCURRENT_TKE_DISS(KIU,KJU,KKU)) ! Tke dissipation rate - ALLOCATE(XCURRENT_SLTAOD(KIU,KJU))! Salt aerosol optical depth - ALLOCATE(XCURRENT_ZWS(KIU,KJU)) ! Significant height of waves - ! - ! + ! ALLOCATE(XCURRENT_ZWS(KIU,KJU)) ! Significant height of waves + XCURRENT_RN = XUNDEF_SFX XCURRENT_H = XUNDEF_SFX XCURRENT_LE = XUNDEF_SFX @@ -124,39 +181,37 @@ IF (LDIAG_IN_RUN) THEN XCURRENT_SWD = XUNDEF XCURRENT_SWU = XUNDEF XCURRENT_SWDIR = XUNDEF - XCURRENT_SWDIFF= XUNDEF + XCURRENT_SWDIFF= XUNDEF XCURRENT_T2M = XUNDEF_SFX XCURRENT_Q2M = XUNDEF_SFX XCURRENT_HU2M = XUNDEF_SFX XCURRENT_ZON10M= XUNDEF_SFX XCURRENT_MER10M= XUNDEF_SFX XCURRENT_DSTAOD= XUNDEF - XCURRENT_SFCO2 = XUNDEF_SFX - XCURRENT_TKE_DISS = XUNDEF XCURRENT_SLTAOD= XUNDEF - XCURRENT_ZWS = XUNDEF_SFX + XCURRENT_SFCO2 = XUNDEF_SFX + ! XCURRENT_ZWS = XUNDEF_SFX ELSE ALLOCATE(XCURRENT_RN (0,0))! net radiation ALLOCATE(XCURRENT_H (0,0))! sensible heat flux ALLOCATE(XCURRENT_LE (0,0))! Total latent heat flux - ALLOCATE(XCURRENT_LEI (0,0))! Solid latent heat flux + ALLOCATE(XCURRENT_LEI (0,0))! Solid latent heat flux ALLOCATE(XCURRENT_GFLUX (0,0))! ground flux ALLOCATE(XCURRENT_LWD (0,0))! incoming longwave at the surface ALLOCATE(XCURRENT_LWU (0,0))! outcoming longwave at the surface ALLOCATE(XCURRENT_SWD (0,0))! incoming Shortwave at the surface ALLOCATE(XCURRENT_SWU (0,0))! outcoming Shortwave at the surface ALLOCATE(XCURRENT_SWDIR (0,0))! incoming Shortwave direct at the surface - ALLOCATE(XCURRENT_SWDIFF(0,0))! incoming Shortwave diffuse at the surface + ALLOCATE(XCURRENT_SWDIFF(0,0))! incoming Shortwave diffuse at the surface ALLOCATE(XCURRENT_T2M (0,0))! temperature at 2m ALLOCATE(XCURRENT_Q2M (0,0))! humidity at 2m ALLOCATE(XCURRENT_HU2M (0,0))! humidity at 2m ALLOCATE(XCURRENT_ZON10M(0,0))! zonal wind at 10m ALLOCATE(XCURRENT_MER10M(0,0))! meridian wind at 10m ALLOCATE(XCURRENT_DSTAOD(0,0))! dust aerosol optical depth - ALLOCATE(XCURRENT_SFCO2 (0,0))! CO2 Surface flux - ALLOCATE(XCURRENT_TKE_DISS(0,0,0)) ! Tke dissipation rate ALLOCATE(XCURRENT_SLTAOD(0,0))! Salt aerosol optical depth - ALLOCATE(XCURRENT_ZWS(0,0))! Significant height of waves + ALLOCATE(XCURRENT_SFCO2 (0,0))! CO2 Surface flux + ! ALLOCATE(XCURRENT_ZWS(0,0))! Significant height of waves END IF ! !------------------------------------------------------------------------------- diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index d94ee1e6dba8abcac90d18e2b7d9a8ef865eba6a..1858fc125280cb873eee8576e2eb561063cd75a5 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -526,9 +526,6 @@ INTEGER :: IIU_B,IJU_B INTEGER :: IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll ! REAL, DIMENSION(:,:), ALLOCATABLE :: ZCO2 ! CO2 concentration near the surface -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSEA ! sea fraction -REAL, DIMENSION(:,:), ALLOCATABLE :: ZTOWN ! town fraction -REAL, DIMENSION(:,:), ALLOCATABLE :: ZBARE ! bare soil fraction ! REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIR_ALB ! direct albedo REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSCA_ALB ! diffuse albedo @@ -2652,17 +2649,6 @@ IF (CRAD == 'ECMW') THEN !* get cover mask for aerosols ! IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG ') THEN - ALLOCATE(ZSEA(IIU,IJU)) - ALLOCATE(ZTOWN(IIU,IJU)) - ALLOCATE(ZBARE(IIU,IJU)) - IF (CSURF=='EXTE') THEN - CALL GOTO_SURFEX(KMI) - CALL MNHGET_SURF_PARAM_n(PSEA=ZSEA,PTOWN=ZTOWN,PBARE=ZBARE) - ELSE - ZSEA (:,:) = 1. - ZTOWN(:,:) = 0. - ZBARE(:,:) = 0. - END IF ! IF ( CAOP=='EXPL' .AND. LDUST .AND. KMI==1) THEN ALLOCATE( XEXT_COEFF_WVL_LKT_DUST( NMAX_RADIUS_LKT_DUST, NMAX_SIGMA_LKT_DUST, NMAX_WVL_SW_DUST ) ) @@ -2680,9 +2666,8 @@ IF (CRAD == 'ECMW') THEN ! CALL INI_RADIATIONS_ECMWF (XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP, & CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB_OLD,CAER,NAER,NSTATM, & - XSTATM,ZSEA,ZTOWN,ZBARE,XOZON, XAER,XDST_WL, LSUBG_COND ) + XSTATM, XOZON, XAER,XDST_WL, LSUBG_COND ) ! - DEALLOCATE(ZSEA,ZTOWN,ZBARE) ALLOCATE (XAER_CLIM(SIZE(XAER,1),SIZE(XAER,2),SIZE(XAER,3),SIZE(XAER,4))) XAER_CLIM(:,:,:,:) =XAER(:,:,:,:) ! @@ -2693,23 +2678,11 @@ ELSE IF (CRAD == 'ECRA') THEN !* get cover mask for aerosols ! IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG ') THEN - ALLOCATE(ZSEA(IIU,IJU)) - ALLOCATE(ZTOWN(IIU,IJU)) - ALLOCATE(ZBARE(IIU,IJU)) - IF (CSURF=='EXTE') THEN - CALL GOTO_SURFEX(KMI) - CALL MNHGET_SURF_PARAM_n(PSEA=ZSEA,PTOWN=ZTOWN,PBARE=ZBARE) - ELSE - ZSEA (:,:) = 1. - ZTOWN(:,:) = 0. - ZBARE(:,:) = 0. - END IF ! CALL INI_RADIATIONS_ECRAD (XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP, & CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB_OLD,CAER,NAER,NSTATM, & - XSTATM,ZSEA,ZTOWN,ZBARE,XOZON, XAER,XDST_WL, LSUBG_COND ) + XSTATM, XOZON, XAER,XDST_WL, LSUBG_COND ) - DEALLOCATE(ZSEA,ZTOWN,ZBARE) ALLOCATE (XAER_CLIM(SIZE(XAER,1),SIZE(XAER,2),SIZE(XAER,3),SIZE(XAER,4))) XAER_CLIM(:,:,:,:) = XAER(:,:,:,:) ! diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90 index 1864623ffbe8bd132b556b841d5c1f3a6840e8bd..f0d7cc6879cb71e19e23774b8cd5b442a6567a07 100644 --- a/src/MNH/ini_prog_var.f90 +++ b/src/MNH/ini_prog_var.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -249,19 +249,19 @@ IF(PRESENT(HCHEMFILE)) THEN END IF ! IIMAX LUSECHEM = .TRUE. IF (LORILAM) THEN - CALL POSNAM(ILUDES,'NAM_CH_ORILAM',GFOUND,ILUOUT) + CALL POSNAM(TZCHEMFILE, 'NAM_CH_ORILAM', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CH_ORILAM) ENDIF IF (LDUST) THEN LDSTINIT=.TRUE. LDSTPRES=.FALSE. - CALL POSNAM(ILUDES,'NAM_DUST',GFOUND,ILUOUT) + CALL POSNAM(TZCHEMFILE, 'NAM_DUST', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_DUST) ENDIF IF (LSALT) THEN LSLTINIT=.TRUE. LSLTPRES=.FALSE. - CALL POSNAM(ILUDES,'NAM_SALT',GFOUND,ILUOUT) + CALL POSNAM(TZCHEMFILE, 'NAM_SALT', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SALT) ENDIF diff --git a/src/MNH/ini_radiations_ecmwf.f90 b/src/MNH/ini_radiations_ecmwf.f90 index e8f11de28487376225ce40d9803858ab0ba1308d..73aa70d072869c00657eda7dbd1264212b3981a9 100644 --- a/src/MNH/ini_radiations_ecmwf.f90 +++ b/src/MNH/ini_radiations_ecmwf.f90 @@ -12,7 +12,7 @@ INTERFACE SUBROUTINE INI_RADIATIONS_ECMWF( & PZHAT, PPABST, PTHT, PTSRAD, PLAT, PLON, TPDTCUR, TPDTEXP, & HLW, KDLON, KFLEV, KFLUX, KRAD, KSWB, HAER, KAER, KSTATM, & - PSTATM, PSEA, PTOWN, PBARE, POZON, PAER, PDST_WL, OSUBG_COND ) + PSTATM, POZON, PAER, PDST_WL, OSUBG_COND ) ! USE MODD_TYPE_DATE ! @@ -23,9 +23,6 @@ REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! height level without orography REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST! pressure REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT !Temperature REAL, DIMENSION(:,:), INTENT(IN) :: PTSRAD ! surface radiative temperature -REAL, DIMENSION (:,:), INTENT(IN) :: PSEA ! sea fraction -REAL, DIMENSION (:,:), INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION (:,:), INTENT(IN) :: PBARE ! bare soil fraction REAL, DIMENSION(:,:), INTENT(IN) :: PLAT, PLON ! arrays of latitude-longitude ! TYPE (DATE_TIME), INTENT(IN) :: TPDTCUR ! Current date and time @@ -61,7 +58,7 @@ END MODULE MODI_INI_RADIATIONS_ECMWF SUBROUTINE INI_RADIATIONS_ECMWF( & PZHAT, PPABST, PTHT, PTSRAD, PLAT, PLON, TPDTCUR, TPDTEXP, & HLW, KDLON, KFLEV, KFLUX, KRAD, KSWB, HAER, KAER, KSTATM, & - PSTATM, PSEA, PTOWN, PBARE, POZON, PAER, PDST_WL, OSUBG_COND ) + PSTATM, POZON, PAER, PDST_WL, OSUBG_COND ) ! ################################################################### ! !!**** *INI_RADIATIONS * - initialisation for ECMWF radiation scheme in the MesoNH framework @@ -181,10 +178,6 @@ END MODULE MODI_INI_RADIATIONS_ECMWF !ECMWF radiation scheme specific modules ! USE OYOMCST, ONLY: RTT -USE PARKIND1, ONLY: JPRB -USE YOEAERD, ONLY: RCAEOPS, RCAEOPL, RCAEOPU, RCAEOPD, RCTRBGA, & - RCVOBGA, RCSTBGA, RCTRPT, RCAEADM, RCAEROS, & - RCAEADK USE YOETHF, ONLY: RTICE ! !MESO-NH modules @@ -205,7 +198,7 @@ USE MODE_ll USE MODE_REPRO_SUM USE MODE_SALTOPT ! -USE MODI_INI_HOR_AERCLIM +USE MODI_AEROZON USE MODI_INI_RADCONF USE MODI_INI_STAND_ATM USE MODI_RADAER @@ -224,9 +217,6 @@ REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! height level without orography REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST! pressure REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT !Temperature REAL, DIMENSION(:,:), INTENT(IN) :: PTSRAD ! surface radiative temperature -REAL, DIMENSION (:,:), INTENT(IN) :: PSEA ! sea fraction -REAL, DIMENSION (:,:), INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION (:,:), INTENT(IN) :: PBARE ! bare soil fraction REAL, DIMENSION(:,:), INTENT(IN) :: PLAT, PLON ! arrays of latitude-longitude ! TYPE (DATE_TIME), INTENT(IN) :: TPDTCUR ! Current date and time @@ -258,11 +248,8 @@ LOGICAL :: GWINTER ! .T. when WINTERtime LOGICAL :: GSEASON ! .T. when SUMMERtime in the northern hemisphere or ! when WINTERtime in the southern hemisphere ! -INTEGER :: JI, JJ, JK, JK1, JKRAD,IIJ,JL ! loop index -! INTEGER :: IIB ! I index value of the first inner mass point INTEGER :: IJB ! J index value of the first inner mass point -INTEGER :: IKB ! K index value of the first inner mass point INTEGER :: IIE ! I index value of the last inner mass point INTEGER :: IJE ! J index value of the last inner mass point INTEGER :: IKE ! K index value of the last inner mass point @@ -275,7 +262,6 @@ REAL :: ZLATMEAN ! MEAN LATitude in the domain REAL :: ZLAT_TROPICAL ! TROPIQUE LATitude REAL :: ZLAT_POLAR ! POLAR circle LATitude ! -REAL, DIMENSION(:,:),ALLOCATABLE :: ZLON ! longitude REAL, DIMENSION(SIZE(PSTATM,1)) :: ZZSTAT ! half level altitudes of standard atm. ! INTEGER :: IINFO_ll ! return code of parallel routine @@ -283,20 +269,8 @@ INTEGER :: IIMAX_ll,IJMAX_ll ! Number of points of ! Global physical domain ! in the x and y directions ! -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZEXNT ! Exner function -! ! Variables for aerosols and ozone climatologies set up -REAL, DIMENSION (:), ALLOCATABLE :: ZAESEA, ZAELAN, ZAEURB, ZAEDES -REAL(KIND=JPRB), DIMENSION (:), ALLOCATABLE :: ZAESEA_RAD, ZAELAN_RAD, ZAEURB_RAD, ZAEDES_RAD -LOGICAL, DIMENSION (:,:),ALLOCATABLE :: GAFRICA, GASIA, GAUSTRALIA -REAL, DIMENSION (:,:), ALLOCATABLE :: ZDESERT ! desert fraction -REAL, DIMENSION (:,:), ALLOCATABLE :: ZPAVE, ZWORK_GRID -REAL(KIND=JPRB), DIMENSION (:,:,:), ALLOCATABLE :: ZAER -REAL(KIND=JPRB), DIMENSION (:,:), ALLOCATABLE :: ZPRES_HL,ZT_HL,ZOZON -REAL(KIND=JPRB), DIMENSION (:,:), ALLOCATABLE :: ZCVDAES, ZCVDAEL, ZCVDAEU, ZCVDAED,ZETAH -REAL(KIND=JPRB), DIMENSION (:), ALLOCATABLE :: ZGEMU -REAL, DIMENSION(:), ALLOCATABLE :: ZAECOV_SEA, ZAECOV_URB, ZAECOV_LAN, ZAECOV_DES -INTEGER :: ZYMD, ZHOURS ! date for climatology initialisation +REAL :: ZSINDEL,ZCOSDEL,ZTSIDER,ZCORSOL ! astronomical parameters not used here ! !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- @@ -310,7 +284,6 @@ CALL GET_DIM_EXT_ll ('B',IIU,IJU) IKU = SIZE(PTHT,3) ! CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB = 1 + JPVEXT IKE = IKU - JPVEXT ! ! size of global physical domain @@ -430,272 +403,25 @@ CALL INI_RADCONF (HLW,KSWB,OSUBG_COND) !* 8. INITIALIZE RADIATIVELY ACTIVE COMPOUNDS (3D FIELDS) ! ------------------------------------------------------ ! -!* 8.1 set up for grid dependant quantitites (from initial state) -! -ALLOCATE (ZPRES_HL(KDLON,KFLEV+1)) -ALLOCATE (ZPAVE(KDLON,KFLEV)) -ALLOCATE (ZETAH(KDLON,KFLEV+1)) -ALLOCATE (ZT_HL(KDLON,KFLEV+1)) -ALLOCATE (ZGEMU(KDLON)) -ZT_HL(:,:) = 273. -! -ZEXNT(:,:,:)= ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) -! -DO JK=IKB,IKE+1 - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZPRES_HL(IIJ,JKRAD) = XP00 * (0.5*(ZEXNT(JI,JJ,JK)+ZEXNT(JI,JJ,JK-1)))**(XCPD/XRD) - ZT_HL(IIJ,JKRAD) = 0.5*(PTHT(JI,JJ,JK)*ZEXNT(JI,JJ,JK)+PTHT(JI,JJ,JK-1)*ZEXNT(JI,JJ,JK-1)) - END DO - END DO -END DO -! -! Surface temperature at the first level -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZT_HL(IIJ,1) = PTSRAD(JI,JJ) - END DO -END DO -WHERE (ZT_HL(:,:) == 0.) - ZT_HL(:,:) = 273. -ENDWHERE -! -! Standard atmosphere extension -!* begining at ikup+1 level allows to use a model domain higher than 50km -! -IKUP = IKE-JPVEXT+1 -! -DO JK=IKUP+1,KFLEV+1 - JK1 = (KSTATM-1)+(JK-IKUP) - ZPRES_HL(:,JK) = PSTATM(JK1,2)*100.0 - ZT_HL(:,JK) = PSTATM(JK1,3) -END DO -! -! vertical grid inversion for compatibility with ECMWF routines -! -ALLOCATE (ZWORK_GRID(SIZE(ZPRES_HL,1),KFLEV+1)) -! -!half level pressure -! -ZWORK_GRID(:,:)=ZPRES_HL(:,:) -DO JKRAD=1, KFLEV+1 - JK1=(KFLEV+1)+1-JKRAD - ZPRES_HL(:,JKRAD) = ZWORK_GRID(:,JK1) -END DO -! -!half level temperature -! -ZWORK_GRID(:,:)=ZT_HL(:,:) -DO JKRAD=1, KFLEV+1 - JK1=(KFLEV+1)+1-JKRAD - ZT_HL(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -DEALLOCATE(ZWORK_GRID) -! -DO JKRAD=1,KFLEV - ZPAVE(:,JKRAD)=0.5*(ZPRES_HL(:,JKRAD)+ZPRES_HL(:,JKRAD+1)) -END DO -! -!coo geographique -! -IF(.NOT.LCARTESIAN) THEN - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZGEMU(IIJ) = SIN ( PLAT(JI,JJ) * XPI/180) - END DO - END DO -ELSE - ZGEMU(:) = SIN ( XLAT0 * XPI/180) -END IF -! -!* 8.2 OZONE climatology -! -ALLOCATE (ZOZON(KDLON,KFLEV)) -! -IF (LFIX_DAT ) THEN ! Ajout PP - ZYMD = TPDTEXP%nyear * 1E4 + TPDTEXP%nmonth * 1E2 + TPDTEXP%nday - ZHOURS = INT(TPDTEXP%xtime / 60.) -ELSE - ZYMD = TPDTCUR%nyear * 1E4 + TPDTCUR%nmonth * 1E2 + TPDTCUR%nday - ZHOURS = INT(TPDTCUR%xtime / 60.) -END IF -! -! Fortuin langematz climatology loading -! -CALL SUECOZC ( ZYMD , ZHOURS ) -! -! Interpolation on the simulation domain -! -CALL RADOZC ( 1 , KDLON, KDLON , 1, KFLEV, 1 ,& - KDLON ,0,ZPRES_HL, ZGEMU, & - ZOZON ) -! -!* 8.3 AEROSOLS climatogy -! -ALLOCATE (ZAER(KDLON, KFLEV,KAER)) -! -IF(HAER /= 'NONE') THEN -! -! 8.3.1 horizontal ditributions +!* 8.1 Aerosols and Ozone climatologies ! - ALLOCATE (ZAESEA(KDLON)) - ALLOCATE (ZAELAN(KDLON)) - ALLOCATE (ZAEURB(KDLON)) - ALLOCATE (ZAEDES(KDLON)) - - ALLOCATE (ZAESEA_RAD(KDLON)) - ALLOCATE (ZAELAN_RAD(KDLON)) - ALLOCATE (ZAEURB_RAD(KDLON)) - ALLOCATE (ZAEDES_RAD(KDLON)) -! -! AEROSOLS ECMWF climatologies -! - IF ( HAER =='TANR' .OR. HAER == 'TEGE' ) THEN - CALL INI_HOR_AERCLIM (HAER,IIB,IIE,IJB,IJE,KDLON,ZYMD,ZHOURS, & - PLAT,PLON,ZAESEA,ZAELAN,ZAEURB,ZAEDES ) - END IF -! -! AEROSOLS from SURFACE FRACTIONS -! - IF( HAER =='SURF') THEN +ALLOCATE (POZON(IIU,IJU,KFLEV)) +ALLOCATE (PAER(IIU,IJU,KFLEV,KAER)) ! - !* deserts are only considered over Africa, southern Asia, Australia - !* longitude between -180 and 180 for geographical tests - ! Only bare soil fractions larger than 0.5 are supposed to contribute to - ! desert aerosols - ! - ALLOCATE(ZDESERT (IIU,IJU)) - ZDESERT(:,:) = 0. - - IF (.NOT.LCARTESIAN) THEN - !* deserts are only considered over Africa, southern Asia, Australia - ALLOCATE(ZLON (IIU,IJU)) - ALLOCATE(GAFRICA (IIU,IJU)) - ALLOCATE(GASIA (IIU,IJU)) - ALLOCATE(GAUSTRALIA(IIU,IJU)) - !* longitude between -180 and 180 for geographical tests - ZLON = PLON(:,:) - NINT(PLON/360.)*360. - GAFRICA (:,:) = PLAT(:,:) > -36.086389 .AND. PLAT(:,:) < 36.010556 & - .AND. ZLON(:,:) > -73.18 .AND. ZLON(:,:) < 34.158611 - GASIA (:,:) = PLAT(:,:) > 4.358056 .AND. PLAT(:,:) < 55.335278 & - .AND. ZLON(:,:) > -123.157778 .AND. ZLON(:,:) <-34.285556 - GAUSTRALIA(:,:) = PLAT(:,:) > -39.561389 .AND. PLAT(:,:) < -10.251667 & - .AND. ZLON(:,:) > -155.041944 .AND. ZLON(:,:) < -111.405556 - ! - ! Only bare soil fractions larger than 0.5 are supposed to contribute to - ! desert aerosols - ! - WHERE (GAFRICA(:,:) .OR. GASIA(:,:) .OR. GAUSTRALIA(:,:)) & - ZDESERT(:,:) = MAX( 2.*(PBARE(:,:)-0.5) , 0.) - ! - ! - ELSE - ! - ZDESERT(:,:) = MAX( 2.*(PBARE(:,:)-0.5) , 0.) - ! - ENDIF - ! - !* fills sea, town, desert and land surface covers for aerosols distributions - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZAESEA(IIJ) = PSEA(JI,JJ) - ZAEURB(IIJ) = PTOWN(JI,JJ) - ZAEDES(IIJ) = ZDESERT(JI,JJ) - ZAELAN(IIJ) = MAX( 1.- ZAESEA(IIJ) - ZAEURB(IIJ) - ZAEDES(IIJ) , 0.) - END DO - END DO - IF (ALLOCATED(ZLON)) DEALLOCATE(ZLON) - IF (ALLOCATED(GAFRICA)) DEALLOCATE(GAFRICA) - IF (ALLOCATED(GASIA)) DEALLOCATE(GASIA) - IF (ALLOCATED(GAUSTRALIA)) DEALLOCATE(GAUSTRALIA) - IF (ALLOCATED(ZDESERT)) DEALLOCATE(ZDESERT) - - END IF +CALL AEROZON(PPABST,PTHT,PTSRAD,PLAT,PLON,TPDTCUR,TPDTEXP, & + KDLON,KFLEV,HAER,KAER,KSTATM, & + ZSINDEL,ZCOSDEL,ZTSIDER,ZCORSOL, & + PSTATM,POZON, PAER) ! -! 8.3.2 vertical ditributions (standard profiles derived from Tanre) -! - ALLOCATE (ZCVDAES(KDLON,KFLEV+1)) - ALLOCATE (ZCVDAEL(KDLON,KFLEV+1)) - ALLOCATE (ZCVDAEU(KDLON,KFLEV+1)) - ALLOCATE (ZCVDAED(KDLON,KFLEV+1)) - DO JL=1,KDLON - ZETAH(JL,:)=ZPRES_HL(JL,:)/101300. ! reference pressure for normalisation - END DO - WHERE (ZETAH (:,:) > 1.) - ZETAH(:,:)=1. - END WHERE -! -! set up of vertical ditribution parameters - CALL SUAERV ( KDLON, KFLEV , ZETAH, & - ZCVDAES ,ZCVDAEL ,ZCVDAEU ,ZCVDAED, & - RCTRBGA,RCVOBGA,RCSTBGA,RCAEOPS,RCAEOPL,RCAEOPU,& - RCAEOPD,RCTRPT ,RCAEADK,RCAEADM,RCAEROS ) -! -! modification of initial ECMWF maximum optical thickness -! for aerosols classes in case of HAER=SURF -! note : these variables belongs to yoeaerd module -! - IF ( HAER =='SURF') THEN - RCAEOPS = 0.001 ! Sea instead 0.02 to agree with TEGEN - RCAEOPL = 0.05 ! Land (continental) - RCAEOPU = 0.3 ! Urban zone - RCAEOPD = 0.5 ! Desert - END IF ! -! final aerosol profiles on mnh grid -! - ZAESEA_RAD = ZAESEA ; ZAELAN_RAD = ZAELAN ; ZAEURB_RAD = ZAEURB ; ZAEDES_RAD = ZAEDES - CALL RADAER (1, KDLON, KDLON, 1, KFLEV, ZPRES_HL,ZT_HL, & - ZCVDAES ,ZCVDAEL ,ZCVDAEU ,ZCVDAED, & - ZAESEA_RAD, ZAELAN_RAD, ZAEURB_RAD, ZAEDES_RAD, & - ZAER ) -! -!!- VOLCANIC AEROSOL SET TO epsilon IN ABSENCE OF ERUPTION - ZAER(:,:,5) = 1.E-12 -! - DEALLOCATE (ZCVDAES) - DEALLOCATE (ZCVDAEL) - DEALLOCATE (ZCVDAEU) - DEALLOCATE (ZCVDAED) - DEALLOCATE (ZAESEA) - DEALLOCATE (ZAELAN) - DEALLOCATE (ZAEURB) - DEALLOCATE (ZAEDES) - - DEALLOCATE (ZAESEA_RAD) - DEALLOCATE (ZAELAN_RAD) - DEALLOCATE (ZAEURB_RAD) - DEALLOCATE (ZAEDES_RAD) -ELSE - ZAER(:,:,:)= 1E-12 -END IF +!------------------------------------------------------------------------------- ! -!* 8.4 Adaptation on mnh domain +!* 8.4 Dusts ! -ALLOCATE (POZON(IIU,IJU,KFLEV)) -ALLOCATE (PAER(IIU,IJU,KFLEV,KAER)) ALLOCATE (PDST_WL(IIU,IJU,KFLEV,KSWB)) ! -POZON (:,:,:)=0. -PAER (:,:,:,:)=0. PDST_WL (:,:,:,:)=0. ! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - DO JKRAD=1,KFLEV - JK1 = KFLEV +1 -JKRAD - POZON (JI,JJ,JKRAD) = ZOZON (IIJ,JK1) - PAER (JI,JJ,JKRAD,:) = ZAER (IIJ,JK1,:) - END DO - END DO -END DO ! ! Read in look up tables of dust optical properties !No arguments, all look up tables are defined in module @@ -727,13 +453,6 @@ IF ( LSALT .AND. CAOP=='EXPL' ) THEN END IF ! CALL INI_CONS_PROP_OP -DEALLOCATE (ZPRES_HL) -DEALLOCATE (ZPAVE) -DEALLOCATE (ZT_HL) -DEALLOCATE (ZETAH) -DEALLOCATE (ZGEMU) -DEALLOCATE (ZOZON) -DEALLOCATE (ZAER) ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/ini_radiations_ecrad.f90 b/src/MNH/ini_radiations_ecrad.f90 index 7c9349afeb1656c871411d9b57f8d9c34ffa569d..5e3c184b1f03effecd772acfcce3b7ad0609d115 100644 --- a/src/MNH/ini_radiations_ecrad.f90 +++ b/src/MNH/ini_radiations_ecrad.f90 @@ -12,7 +12,7 @@ INTERFACE SUBROUTINE INI_RADIATIONS_ECRAD( & PZHAT, PPABST, PTHT, PTSRAD, PLAT, PLON, TPDTCUR, TPDTEXP, & HLW, KDLON, KFLEV, KFLUX, KRAD, KSWB_OLD, HAER, KAER, KSTATM, & - PSTATM, PSEA, PTOWN, PBARE, POZON, PAER, PDST_WL, OSUBG_COND ) + PSTATM, POZON, PAER, PDST_WL, OSUBG_COND ) ! USE MODD_TYPE_DATE @@ -23,9 +23,6 @@ REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! height level without orography REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST! pressure REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT !Temperature REAL, DIMENSION(:,:), INTENT(IN) :: PTSRAD ! surface radiative temperature -REAL, DIMENSION (:,:), INTENT(IN) :: PSEA ! sea fraction -REAL, DIMENSION (:,:), INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION (:,:), INTENT(IN) :: PBARE ! bare soil fraction REAL, DIMENSION(:,:), INTENT(IN) :: PLAT, PLON ! arrays of latitude-longitude ! TYPE (DATE_TIME), INTENT(IN) :: TPDTCUR ! Current date and time @@ -61,7 +58,7 @@ END MODULE MODI_INI_RADIATIONS_ECRAD SUBROUTINE INI_RADIATIONS_ECRAD( & PZHAT, PPABST, PTHT, PTSRAD, PLAT, PLON, TPDTCUR, TPDTEXP, & HLW, KDLON, KFLEV, KFLUX, KRAD, KSWB_OLD, HAER, KAER, KSTATM, & - PSTATM, PSEA, PTOWN, PBARE, POZON, PAER, PDST_WL, OSUBG_COND ) + PSTATM, POZON, PAER, PDST_WL, OSUBG_COND ) ! #################################################################### ! ! INI_RADIATIONS_ECRAD - Initialization of ECRAD code @@ -121,9 +118,6 @@ REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! height level without orography REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST! pressure REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT !Temperature REAL, DIMENSION(:,:), INTENT(IN) :: PTSRAD ! surface radiative temperature -REAL, DIMENSION (:,:), INTENT(IN) :: PSEA ! sea fraction -REAL, DIMENSION (:,:), INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION (:,:), INTENT(IN) :: PBARE ! bare soil fraction REAL, DIMENSION(:,:), INTENT(IN) :: PLAT, PLON ! arrays of latitude-longitude ! TYPE (DATE_TIME), INTENT(IN) :: TPDTCUR ! Current date and time @@ -156,7 +150,7 @@ NULOUT = TLUOUT%NLU CALL INI_RADIATIONS_ECMWF( & PZHAT, PPABST, PTHT, PTSRAD, PLAT, PLON, TPDTCUR, TPDTEXP, & HLW, KDLON, KFLEV, KFLUX, KRAD, KSWB_OLD, HAER, KAER, KSTATM, & - PSTATM, PSEA, PTOWN, PBARE, POZON, PAER, PDST_WL, OSUBG_COND ) + PSTATM, POZON, PAER, PDST_WL, OSUBG_COND ) ! ECRAD specific variables diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90 index 98a316851fc4b5d21ca797b02b3275da6c87069f..f7f5ea11509566967e1b757bdbfc4cb0b333721b 100644 --- a/src/MNH/ini_segn.f90 +++ b/src/MNH/ini_segn.f90 @@ -324,7 +324,7 @@ CALL DEFAULT_DESFM_n(KMI) !* 3. READ INITIAL FILE NAME AND OPEN INITIAL FILE ! -------------------------------------------- ! -CALL POSNAM(ILUSEG,'NAM_LUNITN',GFOUND) +CALL POSNAM( TZFILE_DES, 'NAM_LUNITN', GFOUND ) IF (GFOUND) THEN CALL INIT_NAM_LUNITn READ(UNIT=ILUSEG,NML=NAM_LUNITn) @@ -337,9 +337,9 @@ END IF IF (CPROGRAM=='MESONH') THEN IF (KMI.EQ.1) THEN - CALL POSNAM(ILUSEG,'NAM_CONFZ',GFOUND,ILUOUT) + CALL POSNAM( TZFILE_DES, 'NAM_CONFZ', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFZ) - CALL POSNAM(ILUSEG,'NAM_CONFIO',GFOUND,ILUOUT) + CALL POSNAM( TZFILE_DES, 'NAM_CONFIO', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFIO) CALL IO_Config_set() END IF diff --git a/src/MNH/init_salt.f90 b/src/MNH/init_salt.f90 index ab14998b35e89dc56ce1e4b224b74877ce471401..bb99ab50f8e781aa38ef3af7ddf7cb790406ad9b 100644 --- a/src/MNH/init_salt.f90 +++ b/src/MNH/init_salt.f90 @@ -45,7 +45,7 @@ XINIRADIUS_SLT= (/0.009, 0.021, 0.045, 0.115, 0.415,2.5, 7.0, 25.0/) !Initial, standard deviation from Ova et al., 2014 XINISIG_SLT = (/ 1.37, 1.5, 1.42, 1.53, 1.85,1.7, 1.8, 2.1 /) !Minimum allowed number concentration for any mode (#/m3) -XN0MIN_SLT = (/1.e1 , 1.e1, 1.e1, 1., 1.e-4,1.e-20 , 1.e-20, 1.e-20 /) +XN0MIN_SLT = (/1.e1 , 1.e1, 1.e1, 1., 1.e-4, 1.e-5, 1.e-6, 1.e-7 /) ELSE IF ( NMODE_SLT == 3) THEN diff --git a/src/MNH/latlon_to_xy.f90 b/src/MNH/latlon_to_xy.f90 index 98b134a36a1cf7e21a18a8cb4c49a3627e5f8490..ae3cfb6cabf936316edb62b8075f01839b07b4c8 100644 --- a/src/MNH/latlon_to_xy.f90 +++ b/src/MNH/latlon_to_xy.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -147,16 +147,14 @@ CALL IO_File_add2list(TZNMLFILE,'LATLON2XY1.nam','NML','READ') CALL IO_File_open(TZNMLFILE) INAM=TZNMLFILE%NLU ! -CALL POSNAM(INAM,'NAM_INIFILE',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_INIFILE', GFOUND ) IF (GFOUND) THEN READ(UNIT=INAM,NML=NAM_INIFILE) - PRINT*, ' namelist NAM_INIFILE read' END IF ! -CALL POSNAM(INAM,'NAM_CONFIO',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND ) IF (GFOUND) THEN READ(UNIT=INAM,NML=NAM_CONFIO) - PRINT*, ' namelist NAM_CONFIO read' END IF ! CALL IO_Config_set() diff --git a/src/MNH/mnh2lpdm.f90 b/src/MNH/mnh2lpdm.f90 index deb8dda2312cc5000d28482412cf5e4695292e0d..7a37fde0fe1a5c05c86da90720d933ea9b6a0011 100644 --- a/src/MNH/mnh2lpdm.f90 +++ b/src/MNH/mnh2lpdm.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -113,7 +113,7 @@ READ(UNIT=IFNML,NML=NAM_TURB) READ(UNIT=IFNML,NML=NAM_FIC) print *,'Lecture de NAM_FIC OK.' -CALL POSNAM(IFNML,'NAM_CONFIO',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND ) IF (GFOUND) THEN READ(UNIT=IFNML,NML=NAM_CONFIO) END IF diff --git a/src/MNH/modd_allprofilern.f90 b/src/MNH/modd_allprofilern.f90 index fd7cd8eb21b2e5938cb4f72068f2cfe466e72c65..176c5560f14d458f5e7f09bf68aec00432563029 100644 --- a/src/MNH/modd_allprofilern.f90 +++ b/src/MNH/modd_allprofilern.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2021-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2021-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -44,7 +44,7 @@ IMPLICIT NONE PRIVATE PUBLIC :: NNUMB_PROF, XSTEP_PROF, XX_PROF, XY_PROF, XLAT_PROF, XLON_PROF, XZ_PROF -PUBLIC :: CNAME_PROF, CFILE_PROF !, LDIAG_SURFRAD +PUBLIC :: CNAME_PROF, CFILE_PROF, LDIAG_SURFRAD_PROF PUBLIC :: ALLPROFILER_GOTO_MODEL @@ -58,7 +58,7 @@ TYPE ALLPROFILER_t CHARACTER(LEN=NSTATPROFNAMELGTMAX), DIMENSION(100) :: CNAME_PROF CHARACTER(LEN=NFILENAMELGTMAX) :: CFILE_PROF REAL :: XSTEP_PROF -! LOGICAL :: LDIAG_SURFRAD + LOGICAL :: LDIAG_SURFRAD_PROF ! ! END TYPE ALLPROFILER_t @@ -74,7 +74,7 @@ REAL, DIMENSION(:), POINTER :: XLON_PROF=>NULL() REAL, DIMENSION(:), POINTER :: XZ_PROF=>NULL() CHARACTER (LEN=NSTATPROFNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_PROF=>NULL() CHARACTER (LEN=NFILENAMELGTMAX),POINTER :: CFILE_PROF=>NULL() -!LOGICAL, POINTER :: LDIAG_SURFRAD=>NULL() +LOGICAL, POINTER :: LDIAG_SURFRAD_PROF => NULL() CONTAINS SUBROUTINE ALLPROFILER_GOTO_MODEL(KFROM, KTO) @@ -93,7 +93,7 @@ XLAT_PROF =>ALLPROFILER_MODEL(KTO)%XLAT_PROF XLON_PROF =>ALLPROFILER_MODEL(KTO)%XLON_PROF CNAME_PROF =>ALLPROFILER_MODEL(KTO)%CNAME_PROF CFILE_PROF =>ALLPROFILER_MODEL(KTO)%CFILE_PROF -!LDIAG_SURFRAD =>ALLPROFILER_MODEL(KTO)%LDIAG_SURFRAD +LDIAG_SURFRAD_PROF =>ALLPROFILER_MODEL(KTO)%LDIAG_SURFRAD_PROF END SUBROUTINE ALLPROFILER_GOTO_MODEL END MODULE MODD_ALLPROFILER_n diff --git a/src/MNH/modd_allstationn.f90 b/src/MNH/modd_allstationn.f90 index 4fe0a7be7e95b4677d7a9dd3f4752d996ace1d7a..463e5a811a2d7361b4bf0d07d51b9ce1a4e71515 100644 --- a/src/MNH/modd_allstationn.f90 +++ b/src/MNH/modd_allstationn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2021-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2021-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -43,7 +43,7 @@ IMPLICIT NONE PRIVATE PUBLIC :: NNUMB_STAT, XSTEP_STAT, XX_STAT, XY_STAT, XLAT_STAT, XLON_STAT, XZ_STAT -PUBLIC :: CNAME_STAT, CFILE_STAT, LDIAG_SURFRAD +PUBLIC :: CNAME_STAT, CFILE_STAT, LDIAG_SURFRAD_STAT PUBLIC :: ALLSTATION_GOTO_MODEL @@ -57,7 +57,7 @@ TYPE ALLSTATION_t CHARACTER(LEN=NSTATPROFNAMELGTMAX), DIMENSION(100) :: CNAME_STAT CHARACTER(LEN=NFILENAMELGTMAX) :: CFILE_STAT REAL :: XSTEP_STAT - LOGICAL :: LDIAG_SURFRAD + LOGICAL :: LDIAG_SURFRAD_STAT ! ! END TYPE ALLSTATION_t @@ -73,7 +73,7 @@ REAL, DIMENSION(:), POINTER :: XLON_STAT=>NULL() REAL, DIMENSION(:), POINTER :: XZ_STAT=>NULL() CHARACTER (LEN=NSTATPROFNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_STAT=>NULL() CHARACTER (LEN=NFILENAMELGTMAX),POINTER :: CFILE_STAT=>NULL() -LOGICAL, POINTER :: LDIAG_SURFRAD=>NULL() +LOGICAL, POINTER :: LDIAG_SURFRAD_STAT=>NULL() CONTAINS SUBROUTINE ALLSTATION_GOTO_MODEL(KFROM, KTO) @@ -92,7 +92,7 @@ XLAT_STAT =>ALLSTATION_MODEL(KTO)%XLAT_STAT XLON_STAT =>ALLSTATION_MODEL(KTO)%XLON_STAT CNAME_STAT =>ALLSTATION_MODEL(KTO)%CNAME_STAT CFILE_STAT =>ALLSTATION_MODEL(KTO)%CFILE_STAT -LDIAG_SURFRAD =>ALLSTATION_MODEL(KTO)%LDIAG_SURFRAD +LDIAG_SURFRAD_STAT =>ALLSTATION_MODEL(KTO)%LDIAG_SURFRAD_STAT END SUBROUTINE ALLSTATION_GOTO_MODEL END MODULE MODD_ALLSTATION_n diff --git a/src/PHYEX/turb/modd_diag_in_run.f90 b/src/MNH/modd_diag_in_run.f90 similarity index 93% rename from src/PHYEX/turb/modd_diag_in_run.f90 rename to src/MNH/modd_diag_in_run.f90 index 6f9829570ec8a9f75685491317b5adc86b18e623..854a980048bcd3a877f6de900bb55febb176f91a 100644 --- a/src/PHYEX/turb/modd_diag_in_run.f90 +++ b/src/MNH/modd_diag_in_run.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2003-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -34,5 +34,5 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_DSTAOD! dust aerosol optical dep REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SFCO2 ! CO2 Surface flux REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCURRENT_TKE_DISS ! Tke dissipation rate REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SLTAOD ! Salt aerosol optical depth -REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_ZWS ! Significant height of waves +! REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_ZWS ! Significant height of waves END MODULE MODD_DIAG_IN_RUN diff --git a/src/MNH/modd_dust.f90 b/src/MNH/modd_dust.f90 index 540de108e225683892178339a0ca054f7064f0c2..2f2a7dca2de875bddd3dd308f7aa875cc26c8d21 100644 --- a/src/MNH/modd_dust.f90 +++ b/src/MNH/modd_dust.f90 @@ -100,7 +100,7 @@ REAL, DIMENSION(3) :: XINIRADIUS= 0.5*(/0.078, 0.641, 5.00 /) !Initial, standard deviation from Alfaro et al 1998 REAL, DIMENSION(3) :: XINISIG = (/1.75, 1.76, 1.70/) !Minimum allowed number concentration for any mode (#/m3) -REAL, DIMENSION(3) :: XN0MIN = (/1.e3 , 1.e1 , 1.e-2 /) +REAL, DIMENSION(3) :: XN0MIN = (/1.e1 , 1.e-1 , 1.e-4 /) CHARACTER(LEN=9),DIMENSION(:),ALLOCATABLE :: CDEDSTNAMES CHARACTER(LEN=9),DIMENSION(6), PARAMETER :: YPDEDST_INI = & (/'DEDSTM31C','DEDSTM32C','DEDSTM33C' & diff --git a/src/MNH/modd_salt.f90 b/src/MNH/modd_salt.f90 index e111b15db085287e012c5afaf137f9be3bd03185..c8ebbebd09a3525e588a3ce3b226f22ac60aaa44 100644 --- a/src/MNH/modd_salt.f90 +++ b/src/MNH/modd_salt.f90 @@ -83,7 +83,7 @@ REAL,DIMENSION(8) :: XINIRADIUS_SLT= (/0.009, 0.021, 0.045, 0.115,0.415,2.5, REAL,DIMENSION(8) :: XINISIG_SLT = (/ 1.37, 1.5, 1.42, 1.53, 1.85,1.7,1.8, 2.9 /) !Minimum allowed number concentration for any mode (#/m3) -REAL,DIMENSION(8) :: XN0MIN_SLT = (/1.e1 , 1.e1, 1.e1, 1., 1.e-4,1.e-20, 1.e-20,1.e-20 /) +REAL,DIMENSION(8) :: XN0MIN_SLT = (/1.e1 , 1.e1, 1.e1, 1., 1.e-4,1.e-5, 1.e-6,1.e-7 /) !Test Thomas REAL, DIMENSION(:,:,:), ALLOCATABLE :: XSLTMSS ! [kg/m3] total mass concentration of sea salt ! diff --git a/src/MNH/modd_type_statprof.f90 b/src/MNH/modd_type_statprof.f90 index 747825bd728d0e725e57119a87bb835823074198..c113913dea706432d942f5f630cc7fd9e4327796 100644 --- a/src/MNH/modd_type_statprof.f90 +++ b/src/MNH/modd_type_statprof.f90 @@ -84,15 +84,20 @@ TYPE :: TSTATPROFDATA REAL, DIMENSION(:), ALLOCATABLE :: XHU2M ! 2 m relative humidity (%) REAL, DIMENSION(:), ALLOCATABLE :: XZON10M ! 10 m zonal wind (m/s) REAL, DIMENSION(:), ALLOCATABLE :: XMER10M ! 10 m merid. wind (m/s) - REAL, DIMENSION(:), ALLOCATABLE :: XRN ! net radiation (W m2) - REAL, DIMENSION(:), ALLOCATABLE :: XH ! sensible heat flux (W m2) - REAL, DIMENSION(:), ALLOCATABLE :: XLE ! Total latent heat flux (W m2) - REAL, DIMENSION(:), ALLOCATABLE :: XLEI ! Solid latent heat flux (W m2) - REAL, DIMENSION(:), ALLOCATABLE :: XGFLUX ! storage heat flux (W m2) - REAL, DIMENSION(:), ALLOCATABLE :: XSWD ! IR downward radiation (W m2) - REAL, DIMENSION(:), ALLOCATABLE :: XSWU ! IR upward radiation (W m2) - REAL, DIMENSION(:), ALLOCATABLE :: XLWD ! solar downward radiation (W m2) - REAL, DIMENSION(:), ALLOCATABLE :: XLWU ! solar upward radiation (W m2) + REAL, DIMENSION(:), ALLOCATABLE :: XRN ! net radiation (W/m2) + REAL, DIMENSION(:), ALLOCATABLE :: XH ! sensible heat flux (W/m2) + REAL, DIMENSION(:), ALLOCATABLE :: XLE ! Total latent heat flux (W/m2) + REAL, DIMENSION(:), ALLOCATABLE :: XLEI ! Solid latent heat flux (W/m2) + REAL, DIMENSION(:), ALLOCATABLE :: XGFLUX ! storage heat flux (W/m2) + REAL, DIMENSION(:), ALLOCATABLE :: XSWD ! IR downward radiation (W/m2) + REAL, DIMENSION(:), ALLOCATABLE :: XSWU ! IR upward radiation (W/m2) + REAL, DIMENSION(:), ALLOCATABLE :: XLWD ! solar downward radiation (W/m2) + REAL, DIMENSION(:), ALLOCATABLE :: XLWU ! solar upward radiation (W/m2) + REAL, DIMENSION(:), ALLOCATABLE :: XSWDIR ! IR downward direct radiation (W/m2) + REAL, DIMENSION(:), ALLOCATABLE :: XSWDIFF ! IR downward diffuse radiation (W/m2) + REAL, DIMENSION(:), ALLOCATABLE :: XDSTAOD ! Dust Aerosol Optical Depth (m) + REAL, DIMENSION(:), ALLOCATABLE :: XSLTAOD ! Salt Aerosol Optical Depth (m) + REAL, DIMENSION(:), ALLOCATABLE :: XSFCO2 ! CO2 surface flux (mg/m2/s) END TYPE TYPE, EXTENDS( TSTATPROFDATA ) :: TSTATIONDATA @@ -112,11 +117,6 @@ TYPE, EXTENDS( TSTATPROFDATA ) :: TSTATIONDATA REAL, DIMENSION(:,:), ALLOCATABLE :: XR ! r*(n) REAL, DIMENSION(:,:), ALLOCATABLE :: XSV ! Sv*(n) REAL, DIMENSION(:), ALLOCATABLE :: XTSRAD ! Ts(n) - - REAL, DIMENSION(:), ALLOCATABLE :: XSWDIR - REAL, DIMENSION(:), ALLOCATABLE :: XSWDIFF - REAL, DIMENSION(:), ALLOCATABLE :: XDSTAOD ! Dust Aerosol Optical Depth - REAL, DIMENSION(:), ALLOCATABLE :: XSFCO2 ! CO2 surface flux END TYPE TSTATIONDATA TYPE, EXTENDS( TSTATPROFDATA ) :: TPROFILERDATA diff --git a/src/MNH/mode_aero_psd.f90 b/src/MNH/mode_aero_psd.f90 index d5d72fd29799702f2504a7badf56c22b208b1800..f03bdfcee1b9b84623a350d908857a96eff8ec4d 100644 --- a/src/MNH/mode_aero_psd.f90 +++ b/src/MNH/mode_aero_psd.f90 @@ -101,6 +101,7 @@ REAL :: ZDEN2MOL REAL,DIMENSION(JPMODE*3) :: ZPMIN ! [aerosol units] minimum values for N, sigma, M INTEGER :: JI,JJ,JK,JSV, JN ! [idx] loop counters REAL :: ZINIRADIUSI, ZINIRADIUSJ +INTEGER :: II,IJ,IK ! !------------------------------------------------------------------------------- ! @@ -253,6 +254,7 @@ END IF ! !* 5 set moment 6 ==> um6_{aer}/m3_{air} ! + IF (LVARSIGI) THEN ! set M6 variable standard deviation IF ((CPROGRAM=="REAL ").OR.(CPROGRAM=="IDEAL ")) THEN ZM(:,:,:,3)= ZM(:,:,:,1) * (ZINIRADIUSJ**6)*EXP(18. * LOG(XINISIGJ)**2) @@ -328,6 +330,7 @@ DO JN=1,JPMODE ENDDO ! + IF(PRESENT(PCTOTA)) PCTOTA(:,:,:,:,:) = ZCTOTA(:,:,:,:,:) IF(PRESENT(PM3D)) PM3D(:,:,:,:) = ZM(:,:,:,:) ! @@ -463,7 +466,9 @@ ENDDO ZCTOTA(:,:,:,JP_AER_SOA10,1) = PSVT(:,:,:,JP_CH_SOA10i) ZCTOTA(:,:,:,JP_AER_SOA10,2) = PSVT(:,:,:,JP_CH_SOA10j) END IF - ZCTOTA(:,:,:,:,:) = MAX(ZCTOTA(:,:,:,:,:),XMNH_TINY) + ZCTOTA(:,:,:,:,1) = MAX(ZCTOTA(:,:,:,:,1),1E-6) + ZCTOTA(:,:,:,:,2) = MAX(ZCTOTA(:,:,:,:,2),1E-4) + ! !* 3 calculate moment 3 from total aerosol mass @@ -547,8 +552,6 @@ IF (LVARSIGJ) PSVT(:,:,:,JP_CH_M6j) = ZM(:,:,:,6) DO JJ=1,SIZE(PSVT,4) PSVT(:,:,:,JJ) = PSVT(:,:,:,JJ) / (ZDEN2MOL * PRHODREF(:,:,:)) ENDDO - - END SUBROUTINE CON2MIX ! ############################################################ diff --git a/src/MNH/mode_pos.f90 b/src/MNH/mode_pos.f90 index 09a2ca12ee8467375b1784743768c89c72e14e98..1a8344973bc1ae797242feb6205c49603f716d8f 100644 --- a/src/MNH/mode_pos.f90 +++ b/src/MNH/mode_pos.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1993-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1993-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -12,9 +12,9 @@ implicit none !! CONTAINS !! -!! ############################################## - SUBROUTINE POSNAM(KULNAM,HDNAML,OFOUND,KLUOUT) -!! ############################################## +!! ########################################### + SUBROUTINE POSNAM( TPFILE, HDNAML, OFOUND ) +!! ########################################### !! !!*** *POSNAM* !! @@ -45,72 +45,102 @@ CONTAINS !! Original : 22/06/93 !! I. Mallet 15/10/01 adaptation to MesoNH (F90 norm) ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 05/04/2023: POSNAM: modernisation + improvements !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS ! ------------ +USE MODD_IO, ONLY: TFILEDATA + +USE MODE_MSG +USE MODE_TOOLS, ONLY: Upcase ! !* 0.1 Declarations of arguments ! -INTEGER, INTENT(IN) :: KULNAM +TYPE(TFILEDATA), INTENT(IN) :: TPFILE CHARACTER(LEN=*), INTENT(IN) :: HDNAML LOGICAL, INTENT(OUT):: OFOUND -INTEGER, OPTIONAL,INTENT(IN) :: KLUOUT ! !* 0.2 Declarations of local variables ! -CHARACTER(LEN=120) :: YLINE -CHARACTER(LEN=1) :: YLTEST -INTEGER :: ILEN,ILEY,IND1,IRET -INTEGER :: J,JA -! -CHARACTER(LEN=1),DIMENSION(26) :: YLO=(/'a','b','c','d','e','f','g','h', & - 'i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'/) -CHARACTER(LEN=1),DIMENSION(26) :: YUP=(/'A','B','C','D','E','F','G','H', & - 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'/) -! -!* 1. POSITION FILE -! ------------- -! -REWIND(KULNAM) -ILEN=LEN(HDNAML) -IRET = 0 -! +CHARACTER(LEN=100) :: YERRORMSG +CHARACTER(LEN=120) :: YLINE +CHARACTER(LEN=1) :: YLTEST +CHARACTER(LEN=:), ALLOCATABLE :: YDNAML +INTEGER :: ILU +INTEGER :: ILEN, IND1, IRET +INTEGER :: IVERBLVL + + +OFOUND = .FALSE. + +IF ( .NOT.TPFILE%LOPENED ) THEN + call Print_msg( NVERB_ERROR, 'IO', 'POSNAM', Trim( TPFILE%CNAME ) // ' not opened' ) + RETURN +END IF + +ILU = TPFILE%NLU + +IF ( TPFILE%CTYPE == 'DES' ) THEN + IVERBLVL = NVERB_DEBUG +ELSE IF ( TPFILE%CTYPE == 'NML' ) THEN + IVERBLVL = NVERB_INFO +ELSE + ! Check if there is an associated .des file + ! and use it if available + IF ( ASSOCIATED( TPFILE%TDESFILE ) ) THEN + IVERBLVL = NVERB_DEBUG + IF ( .NOT.TPFILE%TDESFILE%LOPENED ) THEN + call Print_msg( NVERB_ERROR, 'IO', 'POSNAM', Trim( TPFILE%TDESFILE%CNAME ) // ' not opened' ) + RETURN + END IF + ILU = TPFILE%TDESFILE%NLU + ELSE + IVERBLVL = NVERB_INFO + call Print_msg( NVERB_WARNING, 'IO', 'POSNAM', Trim( TPFILE%CNAME ) & + // ': unexpected filetype: ' // Trim( TPFILE%CTYPE ) ) + END IF +END IF + +REWIND( ILU ) + +ILEN = LEN( HDNAML ) +ALLOCATE( CHARACTER(LEN=ILEN) :: YDNAML ) +YDNAML = Upcase( HDNAML ) ! Force namelist name into upper case (read namelist name will also be upcased) + search_nam : DO - YLINE=' ' - READ(UNIT=KULNAM,FMT='(A)',IOSTAT=IRET,END=100) YLINE - IF (IRET /=0 ) THEN - IF (PRESENT(KLUOUT)) & - WRITE(KLUOUT,FMT=*) '-> error reading from unit',KULNAM,' line ',YLINE - ELSE - ILEY=LEN(YLINE) - DO J=1,ILEY - DO JA=1,26 - IF (YLINE(J:J)==YLO(JA)) YLINE(J:J)=YUP(JA) - END DO - END DO - IND1=INDEX(YLINE,'&'//HDNAML) - IF(IND1.NE.0) THEN - YLTEST=YLINE(IND1+ILEN+1:IND1+ILEN+1) - !IF((LLT(YLTEST,'0').OR.LGT(YLTEST,'9')).AND. & - ! (LLT(YLTEST,'A').OR.LGT(YLTEST,'Z'))) EXIT search_nam - IF(YLTEST == ' ') EXIT search_nam - ENDIF - ENDIF -ENDDO search_nam -! -BACKSPACE(KULNAM) -OFOUND=.TRUE. -IF (PRESENT(KLUOUT)) WRITE(KLUOUT,FMT=*) '-- namelist ',HDNAML,' read' -! + READ ( UNIT=ILU, FMT='(A)', IOSTAT=IRET, IOMSG=YERRORMSG, END=100 ) YLINE + IF (IRET /= 0 ) THEN + call Print_msg( NVERB_ERROR, 'IO', 'POSNAM', 'read error:' // Trim( YERRORMSG ) ) + ELSE + YLINE = Upcase( YLINE ) + IND1 = INDEX( YLINE, '&'//YDNAML ) + IF( IND1 /= 0 ) THEN + IF( IND1 > 1 ) THEN + IF ( LEN_TRIM( YLINE(:IND1-1) ) /= 0 ) THEN + ! Check that it is really the beginning of a namelist and that is not a comment + ! Nothing but spaces is allowed here + call Print_msg( NVERB_DEBUG, 'IO', 'POSNAM', 'invalid header or commented namelist: ' // Trim ( YLINE) ) + CYCLE + END IF + END IF + YLTEST = YLINE(IND1+ILEN+1:IND1+ILEN+1) + IF( YLTEST == ' ' ) EXIT search_nam + END IF + END IF +END DO search_nam + +BACKSPACE( ILU ) +OFOUND = .TRUE. +call Print_msg( IVERBLVL, 'IO', 'POSNAM', Trim( TPFILE%CNAME ) // ': namelist ' // Trim( HDNAML ) // ' found' ) + RETURN -! + ! end of file: namelist name not found 100 CONTINUE -OFOUND=.FALSE. -IF (PRESENT(KLUOUT)) & -WRITE(KLUOUT,FMT=*) & -'-- namelist ',HDNAML,' not found: default values used if required' +call Print_msg( IVERBLVL, 'IO', 'POSNAM', Trim( TPFILE%CNAME ) // ': namelist ' // Trim( HDNAML ) & + // ' not found: default values used if required' ) + !------------------------------------------------------------------ END SUBROUTINE POSNAM !! diff --git a/src/MNH/modn_profilern.f90 b/src/MNH/modn_profilern.f90 index d050fddcf48abb54547f69c42a1180a4321397ee..c5e398416461974c92211d6ab8d3a99f8cda196f 100644 --- a/src/MNH/modn_profilern.f90 +++ b/src/MNH/modn_profilern.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2020-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2020-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -35,8 +35,8 @@ USE MODD_ALLPROFILER_n, ONLY:& XLON_PROF_n =>XLON_PROF ,& XZ_PROF_n =>XZ_PROF ,& CNAME_PROF_n =>CNAME_PROF ,& - CFILE_PROF_n =>CFILE_PROF !,& -! LDIAG_SURFRAD_n =>LDIAG_SURFRAD + CFILE_PROF_n =>CFILE_PROF ,& + LDIAG_SURFRAD_n =>LDIAG_SURFRAD_PROF USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATPROFNAMELGTMAX ! !----------------------------------------------------------------------------- @@ -51,14 +51,14 @@ REAL ,SAVE:: XSTEP_PROF REAL, DIMENSION(100) ,SAVE:: XX_PROF, XY_PROF, XZ_PROF, XLAT_PROF, XLON_PROF CHARACTER (LEN=NSTATPROFNAMELGTMAX), DIMENSION(100),SAVE:: CNAME_PROF CHARACTER (LEN=NFILENAMELGTMAX), SAVE:: CFILE_PROF !filename -! LOGICAL ,SAVE:: LDIAG_SURFRAD +LOGICAL ,SAVE:: LDIAG_SURFRAD NAMELIST /NAM_PROFILERn/ & NNUMB_PROF, XSTEP_PROF, & XX_PROF,XY_PROF,XZ_PROF,& XLON_PROF,XLAT_PROF,& CNAME_PROF,& - CFILE_PROF !,LDIAG_SURFRAD + CFILE_PROF, LDIAG_SURFRAD ! CONTAINS @@ -73,7 +73,7 @@ SUBROUTINE INIT_NAM_PROFILERn XZ_PROF = XZ_PROF_n CNAME_PROF = CNAME_PROF_n CFILE_PROF = CFILE_PROF_n -! LDIAG_SURFRAD= LDIAG_SURFRAD_n + LDIAG_SURFRAD= LDIAG_SURFRAD_n END SUBROUTINE INIT_NAM_PROFILERn SUBROUTINE UPDATE_NAM_PROFILERn @@ -86,6 +86,6 @@ SUBROUTINE UPDATE_NAM_PROFILERn XZ_PROF_n = XZ_PROF CNAME_PROF_n = CNAME_PROF CFILE_PROF_n = CFILE_PROF -! LDIAG_SURFRAD_n= LDIAG_SURFRAD + LDIAG_SURFRAD_n= LDIAG_SURFRAD END SUBROUTINE UPDATE_NAM_PROFILERn END MODULE MODN_PROFILER_n diff --git a/src/MNH/modn_stationn.f90 b/src/MNH/modn_stationn.f90 index 094b3dbb1c5325f2a8264a316a211ad131e7997f..5cacedfca4f47d44265ae09caa765147b10902eb 100644 --- a/src/MNH/modn_stationn.f90 +++ b/src/MNH/modn_stationn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2020-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2020-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -35,7 +35,7 @@ USE MODD_ALLSTATION_n, ONLY:& XZ_STAT_n =>XZ_STAT ,& CNAME_STAT_n =>CNAME_STAT ,& CFILE_STAT_n =>CFILE_STAT ,& - LDIAG_SURFRAD_n =>LDIAG_SURFRAD + LDIAG_SURFRAD_n =>LDIAG_SURFRAD_STAT USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATPROFNAMELGTMAX ! !----------------------------------------------------------------------------- diff --git a/src/MNH/open_nestpgd_files.f90 b/src/MNH/open_nestpgd_files.f90 index d331134d68ce797a6112596032f6fe6448b3b1e8..555d5cbc174d5b8f21ef737eccbb17b5255752d3 100644 --- a/src/MNH/open_nestpgd_files.f90 +++ b/src/MNH/open_nestpgd_files.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -172,11 +172,11 @@ CALL IO_File_add2list(TZPRE_NEST_PGD,TRIM(HPRE_NEST_PGD),'NML','READ') CALL IO_File_open(TZPRE_NEST_PGD) IPRE_NEST_PGD = TZPRE_NEST_PGD%NLU !reading of NAM_CONFZ -CALL POSNAM(IPRE_NEST_PGD,'NAM_CONFZ',GFOUND) +CALL POSNAM( TZPRE_NEST_PGD, 'NAM_CONFZ', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_CONFZ) ! !JUAN -CALL POSNAM(IPRE_NEST_PGD,'NAM_CONF_NEST',GFOUND) +CALL POSNAM( TZPRE_NEST_PGD, 'NAM_CONF_NEST', GFOUND ) IF (GFOUND) THEN NHALO_MNH = NHALO_CONF_MNH READ(UNIT=IPRE_NEST_PGD,NML=NAM_CONF_NEST) @@ -203,35 +203,35 @@ GADD=.TRUE. DO JPGD=1,JPMODELMAX IDAD=0 IF (JPGD==1) THEN - CALL POSNAM(IPRE_NEST_PGD,'NAM_PGD1',GFOUND) + CALL POSNAM( TZPRE_NEST_PGD, 'NAM_PGD1', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_PGD1) END IF IF (JPGD==2) THEN - CALL POSNAM(IPRE_NEST_PGD,'NAM_PGD2',GFOUND) + CALL POSNAM( TZPRE_NEST_PGD, 'NAM_PGD2', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_PGD2) END IF IF (JPGD==3) THEN - CALL POSNAM(IPRE_NEST_PGD,'NAM_PGD3',GFOUND) + CALL POSNAM( TZPRE_NEST_PGD, 'NAM_PGD3', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_PGD3) END IF IF (JPGD==4) THEN - CALL POSNAM(IPRE_NEST_PGD,'NAM_PGD4',GFOUND) + CALL POSNAM( TZPRE_NEST_PGD, 'NAM_PGD4', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_PGD4) END IF IF (JPGD==5) THEN - CALL POSNAM(IPRE_NEST_PGD,'NAM_PGD5',GFOUND) + CALL POSNAM( TZPRE_NEST_PGD, 'NAM_PGD5', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_PGD5) END IF IF (JPGD==6) THEN - CALL POSNAM(IPRE_NEST_PGD,'NAM_PGD6',GFOUND) + CALL POSNAM( TZPRE_NEST_PGD, 'NAM_PGD6', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_PGD6) END IF IF (JPGD==7) THEN - CALL POSNAM(IPRE_NEST_PGD,'NAM_PGD7',GFOUND) + CALL POSNAM( TZPRE_NEST_PGD, 'NAM_PGD7', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_PGD7) END IF IF (JPGD==8) THEN - CALL POSNAM(IPRE_NEST_PGD,'NAM_PGD8',GFOUND) + CALL POSNAM( TZPRE_NEST_PGD, 'NAM_PGD8', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_PGD8) END IF ! @@ -291,10 +291,10 @@ END DO !* 6. NAMES OF OUTPUT PGD FILES ! ------------------------- ! -CALL POSNAM(IPRE_NEST_PGD,'NAM_NEST_PGD',GFOUND,ILUOUT0) +CALL POSNAM( TZPRE_NEST_PGD, 'NAM_NEST_PGD', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_NEST_PGD) ! -CALL POSNAM(IPRE_NEST_PGD,'NAM_CONFIO',GFOUND,ILUOUT0) +CALL POSNAM( TZPRE_NEST_PGD, 'NAM_CONFIO', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_CONFIO) CALL IO_Config_set() ! diff --git a/src/MNH/open_prc_files.f90 b/src/MNH/open_prc_files.f90 index ecf98378f07cd1712e1d68cb4c51bcd853324bd5..056eb30ae0b95a26cc5df71c399bf76b18ca4f13 100644 --- a/src/MNH/open_prc_files.f90 +++ b/src/MNH/open_prc_files.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -208,15 +208,15 @@ ENDIF ! ---------------------------- ! !JUANZ -CALL POSNAM(IPRE_REAL1,'NAM_CONFZ',GFOUND,ILUOUT0) +CALL POSNAM( TPPRE_REAL1FILE, 'NAM_CONFZ', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CONFZ) !JUANZ -CALL POSNAM(IPRE_REAL1,'NAM_CONFIO',GFOUND,ILUOUT0) +CALL POSNAM( TPPRE_REAL1FILE, 'NAM_CONFIO', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CONFIO) CALL IO_Config_set() ! CINIFILE = CINIFILE_n -CALL POSNAM(IPRE_REAL1,'NAM_FILE_NAMES',GFOUND,ILUOUT0) +CALL POSNAM( TPPRE_REAL1FILE, 'NAM_FILE_NAMES', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_FILE_NAMES) CINIFILE_n = CINIFILE ! diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90 index 14eb622d9cfe9b3b9d60e6818c022ffbc2744fa6..f69cb3f18aa3fe130c42f998609f5b5565c72273 100644 --- a/src/MNH/phys_paramn.f90 +++ b/src/MNH/phys_paramn.f90 @@ -285,6 +285,7 @@ USE MODD_IO, ONLY: TFILEDATA USE MODD_LATZ_EDFLX USE MODD_LBC_n USE MODD_LES +USE MODD_LES_n, ONLY: NLES_TIMES USE MODD_LES_BUDGET USE MODD_LSFIELD_n USE MODD_LUNIT_n @@ -499,7 +500,7 @@ IKB = 1 + JPVEXT IKE = IKU - JPVEXT ! CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(XTHT,1), SIZE(XTHT,2), SIZE(XTHT,3),.TRUE.) +CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(XTHT,1), SIZE(XTHT,2), SIZE(XTHT,3),.TRUE.,NLES_TIMES) ! ZTIME1 = 0.0_MNHTIME ZTIME2 = 0.0_MNHTIME diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index 8abd65649d35f0fe2dc1e5a2257d5e7b99be5faa..ee75625e84f9a4ebe04ffd83774e65aad7bb4d2b 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -690,35 +690,35 @@ NLUPRE=TZEXPREFILE%NLU !* 3.2 read in NLUPRE the namelist informations ! WRITE(NLUOUT,FMT=*) 'attempt to read ',TRIM(TZEXPREFILE%CNAME),' file' -CALL POSNAM(NLUPRE,'NAM_REAL_PGD',GFOUND,NLUOUT) +CALL POSNAM( TZEXPREFILE, 'NAM_REAL_PGD', GFOUND ) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_REAL_PGD) ! ! -CALL POSNAM(NLUPRE,'NAM_CONF_PRE',GFOUND,NLUOUT) +CALL POSNAM( TZEXPREFILE, 'NAM_CONF_PRE', GFOUND ) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONF_PRE) !JUANZ -CALL POSNAM(NLUPRE,'NAM_CONFZ',GFOUND,NLUOUT) +CALL POSNAM( TZEXPREFILE, 'NAM_CONFZ', GFOUND ) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFZ) !JUANZ -CALL POSNAM(NLUPRE,'NAM_CONFIO',GFOUND,NLUOUT) +CALL POSNAM( TZEXPREFILE, 'NAM_CONFIO', GFOUND ) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFIO) CALL IO_Config_set() -CALL POSNAM(NLUPRE,'NAM_GRID_PRE',GFOUND,NLUOUT) +CALL POSNAM( TZEXPREFILE, 'NAM_GRID_PRE', GFOUND ) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRID_PRE) -CALL POSNAM(NLUPRE,'NAM_GRIDH_PRE',GFOUND,NLUOUT) +CALL POSNAM( TZEXPREFILE, 'NAM_GRIDH_PRE', GFOUND ) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRIDH_PRE) -CALL POSNAM(NLUPRE,'NAM_VPROF_PRE',GFOUND,NLUOUT) +CALL POSNAM( TZEXPREFILE, 'NAM_VPROF_PRE', GFOUND ) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_VPROF_PRE) -CALL POSNAM(NLUPRE,'NAM_BLANKN',GFOUND,NLUOUT) +CALL POSNAM( TZEXPREFILE, 'NAM_BLANKN', GFOUND ) CALL INIT_NAM_BLANKn IF (GFOUND) THEN READ(UNIT=NLUPRE,NML=NAM_BLANKn) CALL UPDATE_NAM_BLANKn END IF -CALL READ_PRE_IDEA_NAM_n(NLUPRE,NLUOUT) -CALL POSNAM(NLUPRE,'NAM_AERO_PRE',GFOUND,NLUOUT) +CALL READ_PRE_IDEA_NAM_n( TZEXPREFILE ) +CALL POSNAM( TZEXPREFILE, 'NAM_AERO_PRE', GFOUND ) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_AERO_PRE) -CALL POSNAM(NLUPRE,'NAM_IBM_LSF' ,GFOUND,NLUOUT) +CALL POSNAM( TZEXPREFILE, 'NAM_IBM_LSF', GFOUND ) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_IBM_LSF ) ! CALL INI_FIELD_LIST() diff --git a/src/MNH/prep_pgd.f90 b/src/MNH/prep_pgd.f90 index 2df254d5ec8aab95ee4ad9713ccf8e65fc7f4af4..64c43fb8cce5d20a50b84d57ea9c6896d052e079 100644 --- a/src/MNH/prep_pgd.f90 +++ b/src/MNH/prep_pgd.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -190,23 +190,23 @@ IF (IRESP.NE.0 ) THEN ENDIF !JUAN -CALL POSNAM(ILUNAM,'NAM_PGDFILE',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_PGDFILE', GFOUND ) IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PGDFILE) -CALL POSNAM(ILUNAM,'NAM_ZSFILTER',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_ZSFILTER', GFOUND ) IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_ZSFILTER) -CALL POSNAM(ILUNAM,'NAM_SLEVE',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_SLEVE', GFOUND ) IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_SLEVE) !JUANZ -CALL POSNAM(ILUNAM,'NAM_CONFZ',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_CONFZ', GFOUND ) IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFZ) -CALL POSNAM(ILUNAM,'NAM_CONF_PGD',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_CONF_PGD', GFOUND ) IF (GFOUND) THEN NHALO_MNH = NHALO_CONF_MNH READ(UNIT=ILUNAM,NML=NAM_CONF_PGD) NHALO_CONF_MNH = NHALO_MNH ENDIF !JUANZ -CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND ) IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFIO) CALL IO_Config_set() ! diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90 index 7af314fe4d80534c4e54da7ddf628de41dbdfb56..0ed4641b560593cbb9442d6fb8b7005066bbeb04 100644 --- a/src/MNH/prep_real_case.f90 +++ b/src/MNH/prep_real_case.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -674,9 +674,9 @@ CALL INI_CST IPRE_REAL1 = TZPRE_REAL1FILE%NLU ! CALL INIT_NMLVAR -CALL POSNAM(IPRE_REAL1,'NAM_REAL_CONF',GFOUND,ILUOUT0) +CALL POSNAM( TZPRE_REAL1FILE, 'NAM_REAL_CONF', GFOUND ) IF (GFOUND) READ(IPRE_REAL1,NAM_REAL_CONF) -CALL POSNAM(IPRE_REAL1,'NAM_PARAM_LIMA',GFOUND,ILUOUT0) +CALL POSNAM( TZPRE_REAL1FILE, 'NAM_PARAM_LIMA', GFOUND ) IF (GFOUND) READ(IPRE_REAL1,NAM_PARAM_LIMA) ! CALL INI_FIELD_LIST() @@ -746,18 +746,18 @@ XANGCONV0=0. ; XANGCONV1000=0. ; XANGCONV2000=0. CDADATMFILE=' ' ; CDADBOGFILE=' ' ! CALL INIT_NMLVAR -CALL POSNAM(IPRE_REAL1,'NAM_REAL_CONF',GFOUND,ILUOUT0) +CALL POSNAM( TZPRE_REAL1FILE, 'NAM_REAL_CONF', GFOUND ) IF (GFOUND) READ(IPRE_REAL1,NAM_REAL_CONF) -CALL POSNAM(IPRE_REAL1,'NAM_HURR_CONF',GFOUND,ILUOUT0) +CALL POSNAM( TZPRE_REAL1FILE, 'NAM_HURR_CONF', GFOUND ) IF (GFOUND) READ(IPRE_REAL1,NAM_HURR_CONF) -CALL POSNAM(IPRE_REAL1,'NAM_CH_CONF',GFOUND,ILUOUT0) +CALL POSNAM( TZPRE_REAL1FILE, 'NAM_CH_CONF', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CH_CONF) CALL UPDATE_MODD_FROM_NMLVAR -CALL POSNAM(IPRE_REAL1,'NAM_AERO_CONF',GFOUND,ILUOUT0) +CALL POSNAM( TZPRE_REAL1FILE, 'NAM_AERO_CONF', GFOUND ) IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF) -CALL POSNAM(IPRE_REAL1,'NAM_CONFZ',GFOUND,ILUOUT0) +CALL POSNAM( TZPRE_REAL1FILE, 'NAM_CONFZ', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CONFZ) -CALL POSNAM(IPRE_REAL1,'NAM_IBM_LSF' ,GFOUND,ILUOUT0) +CALL POSNAM( TZPRE_REAL1FILE, 'NAM_IBM_LSF' , GFOUND ) IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_IBM_LSF) ! GAERINIT = LAERINIT @@ -810,7 +810,7 @@ END IF ! !IF(LEN_TRIM(YCHEMFILE)>0)THEN ! ! read again Nam_aero_conf -! CALL POSNAM(IPRE_REAL1,'NAM_AERO_CONF',GFOUND,ILUOUT0) +! CALL POSNAM( TZPRE_REAL1FILE, 'NAM_AERO_CONF', GFOUND ) ! IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF) ! IF(YCHEMFILETYPE=='GRIBEX') & ! CALL READ_ALL_DATA_GRIB_CASE('CHEM',TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) @@ -844,7 +844,7 @@ END IF ! IF(LEN_TRIM(YCHEMFILE)>0)THEN ! read again Nam_aero_conf - CALL POSNAM(IPRE_REAL1,'NAM_AERO_CONF',GFOUND,ILUOUT0) + CALL POSNAM( TZPRE_REAL1FILE, 'NAM_AERO_CONF', GFOUND ) IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF) IF(YCHEMFILETYPE=='GRIBEX') & CALL READ_ALL_DATA_GRIB_CASE('CHEM',TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index 904d5c71a3468f9d40cdc0b7a5fe79b5267b40a5..25c907e90e8dd9822a8fd9070b041ad4c6124ccb 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -88,6 +88,7 @@ END MODULE MODI_PROFILER_n !* 0. DECLARATIONS ! ------------ ! +USE MODD_ALLPROFILER_n, ONLY: LDIAG_SURFRAD_PROF USE MODD_CST, ONLY: XCPD, XG, XLAM_CRAD, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XRV, XTT USE MODD_DIAG_IN_RUN USE MODD_GRID, ONLY: XBETA, XLON0, XRPK @@ -689,7 +690,7 @@ PROFILER: DO JP = 1, NUMBPROFILER_LOC END DO IF (SIZE(PTKE)>0) TPROFILERS(JP)%XTKE (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), PTKE ) ! - IF (LDIAG_IN_RUN) THEN + IF ( LDIAG_SURFRAD_PROF ) THEN TPROFILERS(JP)%XT2M (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_T2M ) TPROFILERS(JP)%XQ2M (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_Q2M ) TPROFILERS(JP)%XHU2M (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_HU2M ) @@ -705,9 +706,14 @@ PROFILER: DO JP = 1, NUMBPROFILER_LOC TPROFILERS(JP)%XSWU (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_SWU ) TPROFILERS(JP)%XLWD (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_LWD ) TPROFILERS(JP)%XLWU (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_LWU ) + TPROFILERS(JP)%XSWDIR (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_SWDIR ) + TPROFILERS(JP)%XSWDIFF(IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_SWDIFF ) + TPROFILERS(JP)%XDSTAOD(IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_DSTAOD ) + TPROFILERS(JP)%XSLTAOD(IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_SLTAOD ) END IF - TPROFILERS(JP)%XTKE_DISS(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), XCURRENT_TKE_DISS ) + TPROFILERS(JP)%XSFCO2 (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_SFCO2 ) END IF + TPROFILERS(JP)%XTKE_DISS(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), XCURRENT_TKE_DISS ) END DO PROFILER ! !---------------------------------------------------------------------------- diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90 index 4e03378378ef394b67c2644ca79352602f39b2e6..14925cb2b28bbcf29a381cf01af447266e21b9dd 100644 --- a/src/MNH/read_all_data_grib_case.f90 +++ b/src/MNH/read_all_data_grib_case.f90 @@ -714,6 +714,10 @@ DEALLOCATE (ZLNPS_G) ! WRITE (ILUOUT0,'(A)') ' | Reading T and Q fields' ! +IF (IMODEL==11) THEN + CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=130,KLEV1=1000) !look for air temperature at pressure level 1000hPa + IF (INUM < 0) IMODEL = 0 ! This change is for handling IFS model level grib file obtained by python API +END IF IF (IMODEL/=10.AND.IMODEL/=11) THEN SELECT CASE (IMODEL) CASE(0) ! ECMWF diff --git a/src/MNH/read_chem_data_mozart_case.f90 b/src/MNH/read_chem_data_mozart_case.f90 index e8a65c705587d0c61bb0276aa206c1f2b6d35312..e11f1c03a3053ead1c3256c5f72d4198217fb2bf 100644 --- a/src/MNH/read_chem_data_mozart_case.f90 +++ b/src/MNH/read_chem_data_mozart_case.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2012-2017 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2012-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -85,6 +85,7 @@ END MODULE MODI_READ_CHEM_DATA_MOZART_CASE !! P. Wautelet 30/10/17 use F90 module for netCDF !! J.Pianezzej 13/02/2019 : correction for use of MEGAN ! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) +! P. Wautelet 29/03/2022: add error if CDUMMY1 not set correctly !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -112,17 +113,13 @@ USE MODD_PREP_REAL USE MODD_TIME USE MODD_TIME_n ! -!UPG*PT -!USE MODE_FM -!USE MODE_IO_ll -USE MODE_TOOLS, ONLY: UPCASE -use MODE_TOOLS_ll USE MODE_IO_FILE, only: IO_File_close -!UPG*PT - USE MODE_MPPDB +USE MODE_MSG USE MODE_THERMO USE MODE_TIME +USE MODE_TOOLS, ONLY: UPCASE +use MODE_TOOLS_ll ! USE MODI_CH_AER_INIT_SOA USE MODI_CH_INIT_SCHEME_n @@ -398,6 +395,9 @@ ELSEIF (CDUMMY1=="18") THEN itimeindex=3 ELSEIF ((CDUMMY1=="24").OR.(CDUMMY1=="00")) THEN itimeindex=4 +ELSE + call Print_msg( NVERB_ERROR, 'GEN', 'READ_CHEM_DATA_MOZART_CASE', 'CDUMMY1 is not set correctly (or not set at all)' ) + itimeindex=1 ENDIF start3d(4) = itimeindex ! diff --git a/src/MNH/read_chem_data_netcdf_case.f90 b/src/MNH/read_chem_data_netcdf_case.f90 index 2648709e0c93aed6ecd7ca7c21a4727a94d9881b..f55fe1f28bfeeac1d67c04d6975e47be7ccce3df 100644 --- a/src/MNH/read_chem_data_netcdf_case.f90 +++ b/src/MNH/read_chem_data_netcdf_case.f90 @@ -175,7 +175,7 @@ INTEGER(kind=CDFINT) :: ind_netcdf ! Indice for netcdf var. INTEGER :: ICHANNEL CHARACTER(LEN=8) :: YMOZ="MOZ1.nam" integer :: IMOZ -CHARACTER(LEN=68) :: YFORMAT +CHARACTER(LEN=100) :: YFORMAT CHARACTER(LEN=40), DIMENSION(:), ALLOCATABLE :: YSPCMNH integer, dimension(:), ALLOCATABLE :: ISPCMOZ CHARACTER(LEN=9) :: YA diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90 index 213063f3545c5c332f751b34e18e16ad2c717fc8..ce23cbb2ccae0f1e9151fd117335a597a91d865d 100644 --- a/src/MNH/read_desfmn.f90 +++ b/src/MNH/read_desfmn.f90 @@ -266,8 +266,8 @@ USE MODN_LATZ_EDFLX USE MODN_2D_FRC USE MODN_BLOWSNOW_n USE MODN_BLOWSNOW -USE MODN_PROFILER_n -USE MODN_STATION_n +USE MODN_PROFILER_n, LDIAG_SURFRAD_PROF => LDIAG_SURFRAD +USE MODN_STATION_n, LDIAG_SURFRAD_STAT => LDIAG_SURFRAD ! USE MODN_PARAM_LIMA ! USE MODN_FLYERS @@ -343,6 +343,7 @@ LOGICAL :: GFOUND ! Return code when searching namelist LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_DST ! Dust Moist flag LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_SLT ! Sea Salt Moist flag LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_AER ! Orilam Moist flag +TYPE(TFILEDATA), POINTER :: TZDESFILE ! !------------------------------------------------------------------------------- ! @@ -354,144 +355,145 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_DESFM_n','called for '//TRIM(TPDATAFILE%CN IF (.NOT.ASSOCIATED(TPDATAFILE%TDESFILE)) & CALL PRINT_MSG(NVERB_FATAL,'IO','READ_DESFM_n','TDESFILE not associated for '//TRIM(TPDATAFILE%CNAME)) ! -ILUDES = TPDATAFILE%TDESFILE%NLU +TZDESFILE => TPDATAFILE%TDESFILE +ILUDES = TZDESFILE%NLU ILUOUT = TLUOUT%NLU ! -CALL POSNAM(ILUDES,'NAM_LUNITN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_LUNITN', GFOUND ) CALL INIT_NAM_LUNITN IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_LUNITn) CALL UPDATE_NAM_LUNITN END IF -CALL POSNAM(ILUDES,'NAM_CONFN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_CONFN', GFOUND ) CALL INIT_NAM_CONFN IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_CONFn) CALL UPDATE_NAM_CONFN END IF -CALL POSNAM(ILUDES,'NAM_DYNN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_DYNN', GFOUND ) CALL INIT_NAM_DYNN IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_DYNn) CALL UPDATE_NAM_DYNN END IF -CALL POSNAM(ILUDES,'NAM_ADVN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_ADVN', GFOUND ) CALL INIT_NAM_ADVN IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_ADVn) CALL UPDATE_NAM_ADVN END IF -CALL POSNAM(ILUDES,'NAM_PARAMN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_PARAMN', GFOUND ) CALL INIT_NAM_PARAMn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_PARAMn) CALL UPDATE_NAM_PARAMn END IF -CALL POSNAM(ILUDES,'NAM_PARAM_RADN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_PARAM_RADN', GFOUND ) CALL INIT_NAM_PARAM_RADn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_PARAM_RADn) CALL UPDATE_NAM_PARAM_RADn END IF #ifdef MNH_ECRAD -CALL POSNAM(ILUDES,'NAM_PARAM_ECRADN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_PARAM_ECRADN', GFOUND ) CALL INIT_NAM_PARAM_ECRADn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_PARAM_ECRADn) CALL UPDATE_NAM_PARAM_ECRADn END IF #endif -CALL POSNAM(ILUDES,'NAM_PARAM_KAFRN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_PARAM_KAFRN', GFOUND ) CALL INIT_NAM_PARAM_KAFRn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_PARAM_KAFRn) CALL UPDATE_NAM_PARAM_KAFRn END IF -CALL POSNAM(ILUDES,'NAM_PARAM_MFSHALLN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_PARAM_MFSHALLN', GFOUND ) CALL INIT_NAM_PARAM_MFSHALLn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_PARAM_MFSHALLn) CALL UPDATE_NAM_PARAM_MFSHALLn END IF -CALL POSNAM(ILUDES,'NAM_LBCN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_LBCN', GFOUND ) CALL INIT_NAM_LBCn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_LBCn) CALL UPDATE_NAM_LBCn END IF -CALL POSNAM(ILUDES,'NAM_NUDGINGN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_NUDGINGN', GFOUND ) CALL INIT_NAM_NUDGINGn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_NUDGINGn) CALL UPDATE_NAM_NUDGINGn END IF -CALL POSNAM(ILUDES,'NAM_TURBN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_TURBN', GFOUND ) CALL INIT_NAM_TURBn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_TURBn) CALL UPDATE_NAM_TURBn END IF -CALL POSNAM(ILUDES,'NAM_CH_MNHCN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_CH_MNHCN', GFOUND ) CALL INIT_NAM_CH_MNHCn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_CH_MNHCn) CALL UPDATE_NAM_CH_MNHCn END IF -CALL POSNAM(ILUDES,'NAM_CH_SOLVERN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_CH_SOLVERN', GFOUND ) CALL INIT_NAM_CH_SOLVERn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_CH_SOLVERn) CALL UPDATE_NAM_CH_SOLVERn END IF -CALL POSNAM(ILUDES,'NAM_DRAGN',GFOUND) +CALL POSNAM( TZDESFILE, 'NAM_DRAGN', GFOUND ) CALL INIT_NAM_DRAGn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_DRAGn) CALL UPDATE_NAM_DRAGn END IF -CALL POSNAM(ILUDES,'NAM_IBM_PARAMN',GFOUND,ILUOUT) +CALL POSNAM( TZDESFILE, 'NAM_IBM_PARAMN', GFOUND ) CALL INIT_NAM_IBM_PARAMn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_IBM_PARAMn) CALL UPDATE_NAM_IBM_PARAMn END IF -CALL POSNAM(ILUDES,'NAM_RECYCL_PARAMN',GFOUND,ILUOUT) +CALL POSNAM( TZDESFILE, 'NAM_RECYCL_PARAMN', GFOUND ) CALL INIT_NAM_RECYCL_PARAMn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_RECYCL_PARAMn) CALL UPDATE_NAM_RECYCL_PARAMn END IF -CALL POSNAM(ILUDES,'NAM_SERIESN',GFOUND,ILUOUT) +CALL POSNAM( TZDESFILE, 'NAM_SERIESN', GFOUND ) CALL INIT_NAM_SERIESn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_SERIESn) CALL UPDATE_NAM_SERIESn END IF -CALL POSNAM(ILUDES,'NAM_BLOWSNOWN',GFOUND,ILUOUT) +CALL POSNAM( TZDESFILE, 'NAM_BLOWSNOWN', GFOUND ) CALL INIT_NAM_BLOWSNOWn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_BLOWSNOWn) CALL UPDATE_NAM_BLOWSNOWn END IF -CALL POSNAM(ILUDES,'NAM_BLANKN',GFOUND,ILUOUT) +CALL POSNAM( TZDESFILE, 'NAM_BLANKN', GFOUND ) CALL INIT_NAM_BLANKn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_BLANKn) CALL UPDATE_NAM_BLANKn END IF -CALL POSNAM(ILUDES,'NAM_PROFILERN',GFOUND,ILUOUT) +CALL POSNAM( TZDESFILE, 'NAM_PROFILERN', GFOUND ) CALL INIT_NAM_PROFILERn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_PROFILERN) CALL UPDATE_NAM_PROFILERn END IF -CALL POSNAM(ILUDES,'NAM_STATIONN',GFOUND,ILUOUT) +CALL POSNAM( TZDESFILE, 'NAM_STATIONN', GFOUND ) CALL INIT_NAM_STATIONn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_STATIONn) CALL UPDATE_NAM_STATIONn END IF -CALL POSNAM(ILUDES,'NAM_FIREN',GFOUND,ILUOUT) +CALL POSNAM( TZDESFILE, 'NAM_FIREN', GFOUND ) CALL INIT_NAM_FIREn IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_FIREn) @@ -500,13 +502,13 @@ END IF ! ! IF (KMI == 1) THEN - CALL POSNAM(ILUDES,'NAM_CONF',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_CONF', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CONF) - CALL POSNAM(ILUDES,'NAM_DYN',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_DYN', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_DYN) - CALL POSNAM(ILUDES,'NAM_NESTING',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_NESTING', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_NESTING) - CALL POSNAM(ILUDES,'NAM_BACKUP',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_BACKUP', GFOUND ) IF (GFOUND) THEN IF (.NOT.ALLOCATED(XBAK_TIME)) THEN ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) @@ -530,10 +532,10 @@ IF (KMI == 1) THEN END IF READ(UNIT=ILUDES,NML=NAM_BACKUP) ELSE - CALL POSNAM(ILUDES,'NAM_FMOUT',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_FMOUT', GFOUND ) IF (GFOUND) CALL PRINT_MSG(NVERB_FATAL,'IO','READ_DESFM_n','use namelist NAM_BACKUP instead of namelist NAM_FMOUT') END IF - CALL POSNAM(ILUDES,'NAM_OUTPUT',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_OUTPUT', GFOUND ) IF (GFOUND) THEN IF (.NOT.ALLOCATED(XBAK_TIME)) THEN ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) !Allocate *BAK* variables to prevent @@ -559,88 +561,88 @@ IF (KMI == 1) THEN END IF ! Note: it is not useful to read the budget namelists in the .des files ! The values here (if present in file) don't need to be compared with the ones in the EXSEGn files -! CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BUDGET', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET) -! CALL POSNAM(ILUDES,'NAM_BU_RU',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RU', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RU) -! CALL POSNAM(ILUDES,'NAM_BU_RV',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RV', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RV) -! CALL POSNAM(ILUDES,'NAM_BU_RW',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RW', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RW) -! CALL POSNAM(ILUDES,'NAM_BU_RTH',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RTH', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTH) -! CALL POSNAM(ILUDES,'NAM_BU_RTKE',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RTKE', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTKE) -! CALL POSNAM(ILUDES,'NAM_BU_RRV',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RRV', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRV) -! CALL POSNAM(ILUDES,'NAM_BU_RRC',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RRC', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRC) -! CALL POSNAM(ILUDES,'NAM_BU_RRR',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RRR', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRR) -! CALL POSNAM(ILUDES,'NAM_BU_RRI',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RRI', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRI) -! CALL POSNAM(ILUDES,'NAM_BU_RRS',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RRS', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRS) -! CALL POSNAM(ILUDES,'NAM_BU_RRG',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RRG', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRG) -! CALL POSNAM(ILUDES,'NAM_BU_RRH',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RRH', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRH) -! CALL POSNAM(ILUDES,'NAM_BU_RSV',GFOUND) +! CALL POSNAM( TZDESFILE, 'NAM_BU_RSV', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RSV) - CALL POSNAM(ILUDES,'NAM_LES',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_LES', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LES) - CALL POSNAM(ILUDES,'NAM_PDF',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_PDF', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PDF) - CALL POSNAM(ILUDES,'NAM_FRC',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_FRC', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FRC) - CALL POSNAM(ILUDES,'NAM_PARAM_ICE',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_PARAM_ICE', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_ICE) - CALL POSNAM(ILUDES,'NAM_PARAM_C2R2',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_PARAM_C2R2', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_C2R2) - CALL POSNAM(ILUDES,'NAM_PARAM_C1R3',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_PARAM_C1R3', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_C1R3) - CALL POSNAM(ILUDES,'NAM_PARAM_LIMA',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_PARAM_LIMA', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_LIMA) - CALL POSNAM(ILUDES,'NAM_ELEC',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_ELEC', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_ELEC) - CALL POSNAM(ILUDES,'NAM_SERIES',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_SERIES', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SERIES) - CALL POSNAM(ILUDES,'NAM_TURB_CLOUD',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_TURB_CLOUD', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_TURB_CLOUD) - CALL POSNAM(ILUDES,'NAM_TURB',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_TURB', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_TURB) - CALL POSNAM(ILUDES,'NAM_CH_ORILAM',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_CH_ORILAM', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CH_ORILAM) - CALL POSNAM(ILUDES,'NAM_DUST',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_DUST', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_DUST) - CALL POSNAM(ILUDES,'NAM_SALT',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_SALT', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SALT) - CALL POSNAM(ILUDES,'NAM_PASPOL',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_PASPOL', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PASPOL) #ifdef MNH_FOREFIRE - CALL POSNAM(ILUDES,'NAM_FOREFIRE',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_FOREFIRE', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FOREFIRE) #endif - CALL POSNAM(ILUDES,'NAM_CONDSAMP',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_CONDSAMP', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CONDSAMP) - CALL POSNAM(ILUDES,'NAM_BLOWSNOW',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_BLOWSNOW', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BLOWSNOW) - CALL POSNAM(ILUDES,'NAM_2D_FRC',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_2D_FRC', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_2D_FRC) LTEMPDEPOS_DST(:) = LDEPOS_DST(:) LTEMPDEPOS_SLT(:) = LDEPOS_SLT(:) LTEMPDEPOS_AER(:) = LDEPOS_AER(:) - CALL POSNAM(ILUDES,'NAM_LATZ_EDFLX',GFOUND) + CALL POSNAM( TZDESFILE, 'NAM_LATZ_EDFLX', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LATZ_EDFLX) - CALL POSNAM(ILUDES,'NAM_VISC',GFOUND,ILUOUT) + CALL POSNAM( TZDESFILE, 'NAM_VISC', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_VISC) ! Note: it is not useful to read the FLYERS/AIRCRAFTS/BALLOONS namelists in the .des files ! The values here (if present in file) don't need to be compared with the ones in the EXSEGn files -! CALL POSNAM(ILUDES,'NAM_FLYERS',GFOUND,ILUOUT) +! CALL POSNAM( TZDESFILE, 'NAM_FLYERS', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FLYERS) -! CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS',GFOUND,ILUOUT) +! CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS) -! CALL POSNAM(ILUSEG,'NAM_BALLOONS',GFOUND,ILUOUT) +! CALL POSNAM(ILUSEG,'NAM_BALLOONS', GFOUND ) ! IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BALLOONS) END IF ! diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 241510495deebf1e3c4528ff5276472a9274f858..9d9639c35241ba5b5ad5a55fd6c23389b54bca05 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -404,12 +404,12 @@ USE MODN_PARAM_MFSHALL_n USE MODN_PARAM_n ! realized in subroutine ini_model n USE MODN_PARAM_RAD_n USE MODN_PASPOL -USE MODN_PROFILER_n +USE MODN_PROFILER_n, LDIAG_SURFRAD_PROF => LDIAG_SURFRAD USE MODN_RECYCL_PARAM_n USE MODN_SALT USE MODN_SERIES USE MODN_SERIES_n -USE MODN_STATION_n +USE MODN_STATION_n, LDIAG_SURFRAD_STAT => LDIAG_SURFRAD USE MODN_TURB USE MODN_TURB_CLOUD USE MODN_TURB_n @@ -519,78 +519,78 @@ CALL INIT_NAM_STATIONn CALL INIT_NAM_FIREn ! WRITE(UNIT=ILUOUT,FMT="(/,'READING THE EXSEG.NAM FILE')") -CALL POSNAM(ILUSEG,'NAM_LUNITN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_LUNITN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LUNITn) -CALL POSNAM(ILUSEG,'NAM_CONFN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_CONFN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFn) -CALL POSNAM(ILUSEG,'NAM_DYNN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_DYNN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DYNn) -CALL POSNAM(ILUSEG,'NAM_ADVN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_ADVN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_ADVn) -CALL POSNAM(ILUSEG,'NAM_PARAMN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_PARAMN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAMn) -CALL POSNAM(ILUSEG,'NAM_PARAM_RADN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_RADN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_RADn) #ifdef MNH_ECRAD -CALL POSNAM(ILUSEG,'NAM_PARAM_ECRADN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_ECRADN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_ECRADn) #endif -CALL POSNAM(ILUSEG,'NAM_PARAM_KAFRN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_KAFRN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_KAFRn) -CALL POSNAM(ILUSEG,'NAM_PARAM_MFSHALLN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_MFSHALLN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_MFSHALLn) -CALL POSNAM(ILUSEG,'NAM_LBCN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_LBCN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LBCn) -CALL POSNAM(ILUSEG,'NAM_NUDGINGN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_NUDGINGN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_NUDGINGn) -CALL POSNAM(ILUSEG,'NAM_TURBN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_TURBN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_TURBn) -CALL POSNAM(ILUSEG,'NAM_DRAGN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_DRAGN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGn) -CALL POSNAM(ILUSEG,'NAM_IBM_PARAMN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_IBM_PARAMN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_IBM_PARAMn) -CALL POSNAM(ILUSEG,'NAM_RECYCL_PARAMN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_RECYCL_PARAMN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_RECYCL_PARAMn) -CALL POSNAM(ILUSEG,'NAM_CH_MNHCN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_CH_MNHCN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_MNHCn) -CALL POSNAM(ILUSEG,'NAM_CH_SOLVERN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_CH_SOLVERN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_SOLVERn) -CALL POSNAM(ILUSEG,'NAM_SERIESN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_SERIESN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SERIESn) -CALL POSNAM(ILUSEG,'NAM_BLANKN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_BLANKN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLANKn) -CALL POSNAM(ILUSEG,'NAM_BLOWSNOWN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_BLOWSNOWN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOWn) -CALL POSNAM(ILUSEG,'NAM_DRAGTREEN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_DRAGTREEN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGTREEn) -CALL POSNAM(ILUSEG,'NAM_DRAGBLDGN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_DRAGBLDGN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGBLDGn) -CALL POSNAM(ILUSEG,'NAM_COUPLING_LEVELSN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE,'NAM_COUPLING_LEVELSN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_COUPLING_LEVELSn) -CALL POSNAM(ILUSEG,'NAM_EOL',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_EOL', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL) -CALL POSNAM(ILUSEG,'NAM_EOL_ADNR',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_EOL_ADNR', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ADNR) -CALL POSNAM(ILUSEG,'NAM_EOL_ALM',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_EOL_ALM', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ALM) -CALL POSNAM(ILUSEG,'NAM_PROFILERN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_PROFILERN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PROFILERn) -CALL POSNAM(ILUSEG,'NAM_STATIONN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_STATIONN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_STATIONn) -CALL POSNAM(ILUSEG,'NAM_FIREN',GFOUND,ILUOUT) +CALL POSNAM( TPEXSEGFILE, 'NAM_FIREN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FIREn) ! IF (KMI == 1) THEN WRITE(UNIT=ILUOUT,FMT="(' namelists common to all the models ')") - CALL POSNAM(ILUSEG,'NAM_CONF',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_CONF', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONF) - CALL POSNAM(ILUSEG,'NAM_CONFZ',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_CONFZ', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFZ) - CALL POSNAM(ILUSEG,'NAM_DYN',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_DYN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DYN) - CALL POSNAM(ILUSEG,'NAM_NESTING',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_NESTING', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_NESTING) - CALL POSNAM(ILUSEG,'NAM_BACKUP',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BACKUP', GFOUND ) IF (GFOUND) THEN !Should have been allocated before in READ_DESFM_n IF (.NOT.ALLOCATED(XBAK_TIME)) THEN @@ -615,14 +615,14 @@ IF (KMI == 1) THEN END IF READ(UNIT=ILUSEG,NML=NAM_BACKUP) ELSE - CALL POSNAM(ILUSEG,'NAM_FMOUT',GFOUND) + CALL POSNAM( TPEXSEGFILE, 'NAM_FMOUT', GFOUND ) IF (GFOUND) THEN CALL PRINT_MSG(NVERB_FATAL,'IO','READ_EXSEG_n','use namelist NAM_BACKUP instead of namelist NAM_FMOUT') ELSE IF (CPROGRAM=='MESONH') CALL PRINT_MSG(NVERB_ERROR,'IO','READ_EXSEG_n','namelist NAM_BACKUP not found') END IF END IF - CALL POSNAM(ILUSEG,'NAM_OUTPUT',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_OUTPUT', GFOUND ) IF (GFOUND) THEN !Should have been allocated before in READ_DESFM_n IF (.NOT.ALLOCATED(XBAK_TIME)) THEN @@ -647,10 +647,10 @@ IF (KMI == 1) THEN END IF READ(UNIT=ILUSEG,NML=NAM_OUTPUT) END IF - CALL POSNAM(ILUSEG,'NAM_BUDGET',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BUDGET', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BUDGET) - CALL POSNAM(ILUSEG,'NAM_BU_RU',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RU', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RU ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RU was already allocated' ) @@ -663,7 +663,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RV',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RV', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RV ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RV was already allocated' ) @@ -676,7 +676,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RW',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RW', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RW ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RW was already allocated' ) @@ -689,7 +689,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RTH',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RTH', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RTH ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTH was already allocated' ) @@ -702,7 +702,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RTKE',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RTKE', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RTKE ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTKE was already allocated' ) @@ -715,7 +715,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RRV',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRV', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RRV ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRV was already allocated' ) @@ -728,7 +728,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RRC',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRC', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RRC ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRC was already allocated' ) @@ -741,7 +741,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RRR',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRR', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RRR ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRR was already allocated' ) @@ -754,7 +754,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RRI',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRI', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RRI ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRI was already allocated' ) @@ -767,7 +767,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RRS',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRS', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RRS ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRS was already allocated' ) @@ -780,7 +780,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RRG',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRG', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RRG ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRG was already allocated' ) @@ -793,7 +793,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RRH',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRH', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RRH ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRH was already allocated' ) @@ -806,7 +806,7 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_BU_RSV',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RSV', GFOUND ) IF (GFOUND) THEN IF ( ALLOCATED( CBULIST_RSV ) ) THEN CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RSV was already allocated' ) @@ -819,65 +819,65 @@ IF (KMI == 1) THEN ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(0) ) END IF - CALL POSNAM(ILUSEG,'NAM_LES',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_LES', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LES) - CALL POSNAM(ILUSEG,'NAM_MEAN',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_MEAN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_MEAN) - CALL POSNAM(ILUSEG,'NAM_PDF',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_PDF', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PDF) - CALL POSNAM(ILUSEG,'NAM_FRC',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_FRC', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FRC) - CALL POSNAM(ILUSEG,'NAM_PARAM_ICE',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_ICE', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_ICE) - CALL POSNAM(ILUSEG,'NAM_PARAM_C2R2',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_C2R2', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_C2R2) - CALL POSNAM(ILUSEG,'NAM_PARAM_C1R3',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_C1R3', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_C1R3) - CALL POSNAM(ILUSEG,'NAM_PARAM_LIMA',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_LIMA', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_LIMA) - CALL POSNAM(ILUSEG,'NAM_ELEC',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_ELEC', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_ELEC) - CALL POSNAM(ILUSEG,'NAM_SERIES',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_SERIES', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SERIES) - CALL POSNAM(ILUSEG,'NAM_TURB_CLOUD',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_TURB_CLOUD', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_TURB_CLOUD) - CALL POSNAM(ILUSEG,'NAM_TURB',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_TURB', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_TURB) - CALL POSNAM(ILUSEG,'NAM_CH_ORILAM',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_CH_ORILAM', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_ORILAM) - CALL POSNAM(ILUSEG,'NAM_DUST',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_DUST', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DUST) - CALL POSNAM(ILUSEG,'NAM_SALT',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_SALT', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SALT) - CALL POSNAM(ILUSEG,'NAM_PASPOL',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_PASPOL', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PASPOL) #ifdef MNH_FOREFIRE - CALL POSNAM(ILUSEG,'NAM_FOREFIRE',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_FOREFIRE', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FOREFIRE) #endif - CALL POSNAM(ILUSEG,'NAM_CONDSAMP',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_CONDSAMP', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONDSAMP) - CALL POSNAM(ILUSEG,'NAM_2D_FRC',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_2D_FRC', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_2D_FRC) - CALL POSNAM(ILUSEG,'NAM_LATZ_EDFLX',GFOUND) + CALL POSNAM( TPEXSEGFILE, 'NAM_LATZ_EDFLX', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LATZ_EDFLX) - CALL POSNAM(ILUSEG,'NAM_BLOWSNOW',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BLOWSNOW', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOW) - CALL POSNAM(ILUSEG,'NAM_VISC',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_VISC', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_VISC) - CALL POSNAM(ILUSEG,'NAM_FLYERS',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_FLYERS', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FLYERS) IF ( NAIRCRAFTS > 0 ) THEN CALL AIRCRAFTS_NML_ALLOCATE( NAIRCRAFTS ) - CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_AIRCRAFTS', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS) END IF IF ( NBALLOONS > 0 ) THEN CALL BALLOONS_NML_ALLOCATE( NBALLOONS ) - CALL POSNAM(ILUSEG,'NAM_BALLOONS',GFOUND,ILUOUT) + CALL POSNAM( TPEXSEGFILE, 'NAM_BALLOONS', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BALLOONS) END IF END IF diff --git a/src/MNH/read_exspa.f90 b/src/MNH/read_exspa.f90 index f2b15fa20424d42bb1a3d96e232ad0ad479b5926..dd261a9bc94cb7e5443222203b5816a8a655c1d3 100644 --- a/src/MNH/read_exspa.f90 +++ b/src/MNH/read_exspa.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -225,18 +225,18 @@ IXOR=NUNDEF IYOR=NUNDEF GBAL_ONLY=.FALSE. ! -CALL POSNAM(ILUSPA,'NAM_GRID2_SPA',GFOUND,ILUOUT) +CALL POSNAM( TZNMLFILE, 'NAM_GRID2_SPA', GFOUND ) IF (GFOUND) READ(ILUSPA,NAM_GRID2_SPA) ! CINIFILE = LUNIT_MODEL(1)%CINIFILE !To respect default values CINIFILEPGD = LUNIT_MODEL(1)%CINIFILEPGD !To respect default values ! -CALL POSNAM(ILUSPA,'NAM_LUNIT2_SPA',GFOUND,ILUOUT) +CALL POSNAM( TZNMLFILE, 'NAM_LUNIT2_SPA', GFOUND ) IF (GFOUND) READ(ILUSPA,NAM_LUNIT2_SPA) LUNIT_MODEL(2)%CINIFILE = CINIFILE LUNIT_MODEL(2)%CINIFILEPGD = CINIFILEPGD ! -CALL POSNAM(ILUSPA,'NAM_CONFIO',GFOUND,ILUOUT) +CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND ) IF (GFOUND) READ(ILUSPA,NAM_CONFIO) ! CALL IO_Config_set() diff --git a/src/MNH/read_pre_idea_namn.f90 b/src/MNH/read_pre_idea_namn.f90 index 7dcd303219b515d6050d7dd1bc03c781592d60ea..3a63a6b67450af94614043b6a54bb7f2aa2dc521 100644 --- a/src/MNH/read_pre_idea_namn.f90 +++ b/src/MNH/read_pre_idea_namn.f90 @@ -1,46 +1,45 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 newsrc 2006/06/06 11:10:18 -!----------------------------------------------------------------- !#################################### MODULE MODI_READ_PRE_IDEA_NAM_n !#################################### INTERFACE - SUBROUTINE READ_PRE_IDEA_NAM_n(KLUPRE,KLUOUT) - INTEGER,INTENT(IN) :: KLUPRE,KLUOUT ! Logical unit numbers for EXPRE file - ! and for output_listing file + SUBROUTINE READ_PRE_IDEA_NAM_n( TPFILEPRE ) + USE MODD_IO, ONLY: TFILEDATA + + TYPE(TFILEDATA), INTENT(IN) :: TPFILEPRE ! EXPRE file END SUBROUTINE READ_PRE_IDEA_NAM_n END INTERFACE ! END MODULE MODI_READ_PRE_IDEA_NAM_n ! ! -! ############################################# - SUBROUTINE READ_PRE_IDEA_NAM_n(KLUPRE,KLUOUT) -! ############################################# +! ########################################### + SUBROUTINE READ_PRE_IDEA_NAM_n( TPFILEPRE ) +! ########################################### -USE MODD_DIM_n, ONLY: NIMAX_n=>NIMAX, NJMAX_n=>NJMAX -USE MODD_DYN_n, ONLY: CPRESOPT_n=>CPRESOPT,NITR_n=>NITR,XRELAX_n=>XRELAX, & - LRES_n=>LRES,XRES_n=>XRES -USE MODD_LBC_n, ONLY: CLBCX_n=>CLBCX,CLBCY_n=>CLBCY -USE MODD_CH_MNHC_n, ONLY: LCH_INIT_FIELD_n=>LCH_INIT_FIELD, & +USE MODD_CH_AEROSOL, ONLY: LORILAM +USE MODD_CH_MNHC_n, ONLY: LCH_INIT_FIELD_n=>LCH_INIT_FIELD, & CCHEM_INPUT_FILE_n=>CCHEM_INPUT_FILE -USE MODD_PARAM_n, ONLY: CSURF_n=>CSURF -USE MODD_CH_AEROSOL, ONLY : LORILAM -USE MODN_LUNIT_n ! Namelist modules -USE MODN_CONF_n +USE MODD_DIM_n, ONLY: NIMAX_n=>NIMAX, NJMAX_n=>NJMAX +USE MODD_DYN_n, ONLY: CPRESOPT_n=>CPRESOPT,NITR_n=>NITR,XRELAX_n=>XRELAX, & + LRES_n=>LRES,XRES_n=>XRES +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LBC_n, ONLY: CLBCX_n=>CLBCX,CLBCY_n=>CLBCY +USE MODD_PARAM_n, ONLY: CSURF_n=>CSURF + USE MODE_POS -! + +USE MODN_CONF_n +USE MODN_LUNIT_n ! Namelist modules + IMPLICIT NONE -INTEGER,INTENT(IN) :: KLUPRE,KLUOUT ! Logical unit numbers for EXPRE file - ! and for output_listing file -! + +TYPE(TFILEDATA), INTENT(IN) :: TPFILEPRE ! EXPRE file + LOGICAL :: GFOUND ! Return code when searching namelist ! Namelist variables from $n INTEGER :: NIMAX,NJMAX @@ -53,6 +52,8 @@ CHARACTER(LEN=4), DIMENSION(2) :: CLBCX,CLBCY CHARACTER(LEN=5) :: CSURF LOGICAL :: LCH_INIT_FIELD CHARACTER(LEN=80) :: CCHEM_INPUT_FILE + +INTEGER :: ILUPRE ! !* 0.2 Namelist declarations ! @@ -64,29 +65,31 @@ NAMELIST/NAM_CH_MNHCn_PRE/ LCH_INIT_FIELD, CCHEM_INPUT_FILE, LORILAM ! !------------------------------------------------------------------------------ ! +ILUPRE = TPFILEPRE%NLU + CALL INIT_NMLVAR -CALL POSNAM(KLUPRE,'NAM_DIMN_PRE',GFOUND,KLUOUT) -IF (GFOUND) READ(UNIT=KLUPRE,NML=NAM_DIMn_PRE) -CALL POSNAM(KLUPRE,'NAM_DYNN_PRE',GFOUND,KLUOUT) -IF (GFOUND) READ(UNIT=KLUPRE,NML=NAM_DYNn_PRE) -CALL POSNAM(KLUPRE,'NAM_LBCN_PRE',GFOUND,KLUOUT) -IF (GFOUND) READ(UNIT=KLUPRE,NML=NAM_LBCn_PRE) -CALL POSNAM(KLUPRE,'NAM_GRN_PRE',GFOUND,KLUOUT) -IF (GFOUND) READ(UNIT=KLUPRE,NML=NAM_GRn_PRE) -CALL POSNAM(KLUPRE,'NAM_CH_MNHCN_PRE',GFOUND,KLUOUT) -IF (GFOUND) READ(UNIT=KLUPRE,NML=NAM_CH_MNHCn_PRE) +CALL POSNAM( TPFILEPRE, 'NAM_DIMN_PRE', GFOUND ) +IF (GFOUND) READ(UNIT=ILUPRE,NML=NAM_DIMn_PRE) +CALL POSNAM( TPFILEPRE, 'NAM_DYNN_PRE', GFOUND ) +IF (GFOUND) READ(UNIT=ILUPRE,NML=NAM_DYNn_PRE) +CALL POSNAM( TPFILEPRE, 'NAM_LBCN_PRE', GFOUND ) +IF (GFOUND) READ(UNIT=ILUPRE,NML=NAM_LBCn_PRE) +CALL POSNAM( TPFILEPRE, 'NAM_GRN_PRE', GFOUND ) +IF (GFOUND) READ(UNIT=ILUPRE,NML=NAM_GRn_PRE) +CALL POSNAM( TPFILEPRE, 'NAM_CH_MNHCN_PRE', GFOUND ) +IF (GFOUND) READ(UNIT=ILUPRE,NML=NAM_CH_MNHCn_PRE) CALL UPDATE_MODD_FROM_NMLVAR ! -CALL POSNAM(KLUPRE,'NAM_CONFN',GFOUND,KLUOUT) +CALL POSNAM( TPFILEPRE, 'NAM_CONFN', GFOUND ) IF (GFOUND) THEN CALL INIT_NAM_CONFn - READ(UNIT=KLUPRE,NML=NAM_CONFn) + READ(UNIT=ILUPRE,NML=NAM_CONFn) CALL UPDATE_NAM_CONFn END IF -CALL POSNAM(KLUPRE,'NAM_LUNITN',GFOUND,KLUOUT) +CALL POSNAM( TPFILEPRE, 'NAM_LUNITN', GFOUND ) IF (GFOUND) THEN CALL INIT_NAM_LUNITn - READ(UNIT=KLUPRE,NML=NAM_LUNITn) + READ(UNIT=ILUPRE,NML=NAM_LUNITn) CALL UPDATE_NAM_LUNITn END IF diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90 index 9d73972cf48986f32f3baee89d19fa530745c922..e7758a91c9e200fa9a915f54281fcd10b5912a30 100644 --- a/src/MNH/read_surf_mnh.f90 +++ b/src/MNH/read_surf_mnh.f90 @@ -1373,7 +1373,7 @@ IF (TPINFILE%NMNHVERSION(1)<4 .OR. (TPINFILE%NMNHVERSION(1)==4 .AND. TPINFILE%NM ELSE CGROUND='NONE' ILUDES = TPINFILE%TDESFILE%NLU - CALL POSNAM(ILUDES,'NAM_PARAMN',GFOUND,ILUOUT) + CALL POSNAM( TPINFILE%TDESFILE, 'NAM_PARAMN', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAMn) END IF IF (CGROUND=='NONE') THEN diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90 index fe77bede8d2330f95569ae06ff2f745250e362ad..2b28a476beebf3d0346f70bd7ea95c4241777631 100644 --- a/src/MNH/read_ver_grid.f90 +++ b/src/MNH/read_ver_grid.f90 @@ -186,7 +186,7 @@ CALL DEFAULT_SLEVE(LSLEVE,XLEN1,XLEN2) ! ------------------- ! NKMAX=NKMAX_n -CALL POSNAM(IPRE_REAL1,'NAM_VER_GRID',GFOUND,ILUOUT0) +CALL POSNAM( TPPRE_REAL1, 'NAM_VER_GRID', GFOUND ) IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_VER_GRID) NKMAX_n = NKMAX LSLEVE_n = LSLEVE @@ -196,7 +196,7 @@ XLEN2_n = XLEN2 IF (CPROGRAM=='REAL ') THEN IF (ASSOCIATED (XZHAT) ) DEALLOCATE(XZHAT) IF (ASSOCIATED (XZHATM) ) DEALLOCATE(XZHATM) - CALL POSNAM(IPRE_REAL1,'NAM_BLANKN',GFOUND,ILUOUT0) + CALL POSNAM( TPPRE_REAL1, 'NAM_BLANKN', GFOUND ) IF (GFOUND) THEN CALL INIT_NAM_BLANKn READ(UNIT=IPRE_REAL1,NML=NAM_BLANKn) diff --git a/src/MNH/reset_exseg.f90 b/src/MNH/reset_exseg.f90 index 0d06d2be3cbadabfab8ce39faa44c18c8f496bcc..b467f7c05123f190f3c63c50506cf111bdbd110f 100644 --- a/src/MNH/reset_exseg.f90 +++ b/src/MNH/reset_exseg.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -115,7 +115,7 @@ ILUNAM = TZNMLFILE%NLU ! Meso-NH to store these diagnostics must be allocated by the ini_model1 subroutine ! IF (NCONV_KF>=0) THEN - CALL POSNAM(ILUNAM,'NAM_PARAM_KAFRN',GFOUND) + CALL POSNAM( TZNMLFILE, 'NAM_PARAM_KAFRN', GFOUND ) IF (GFOUND) THEN CALL INIT_NAM_PARAM_KAFRn READ(UNIT=ILUNAM,NML=NAM_PARAM_KAFRN) @@ -149,7 +149,7 @@ IF (CRAD=='NONE') THEN END IF ! IF(NRAD_3D>=1) THEN - CALL POSNAM(ILUNAM,'NAM_PARAM_RADN',GFOUND) + CALL POSNAM( TZNMLFILE, 'NAM_PARAM_RADN', GFOUND ) IF (GFOUND) THEN CALL INIT_NAM_PARAM_RADn READ(UNIT=ILUNAM,NML=NAM_PARAM_RADN) @@ -157,7 +157,7 @@ IF(NRAD_3D>=1) THEN IF ( IP == 1 ) PRINT*, ' namelist NAM_PARAM_RADN read' END IF #ifdef MNH_ECRAD - CALL POSNAM(ILUNAM,'NAM_PARAM_ECRADN',GFOUND) + CALL POSNAM( TZNMLFILE, 'NAM_PARAM_ECRADN', GFOUND ) IF (GFOUND) THEN CALL INIT_NAM_PARAM_EcRADn READ(UNIT=ILUNAM,NML=NAM_PARAM_ECRADN) @@ -193,7 +193,7 @@ IF ( IP == 1 ) PRINT*,' ' ! !* 5. For retrotrajectories in // , reset NHALO >> 1 if needed from NAM_CONF_DIAG ! --------------------------------------------------- -CALL POSNAM(ILUNAM,'NAM_CONF_DIAG',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_CONF_DIAG', GFOUND ) IF (GFOUND) THEN READ(UNIT=ILUNAM,NML=NAM_CONF_DIAG) END IF diff --git a/src/MNH/saltcamsn.f90 b/src/MNH/saltcamsn.f90 index 1747bddc7934c3ada4267f7df353af05de3ab6e1..96dcde95d634c1a05a2ce9a284648bfd704ecc4c 100644 --- a/src/MNH/saltcamsn.f90 +++ b/src/MNH/saltcamsn.f90 @@ -135,6 +135,8 @@ DELTA_CAMS_3 = RAY_CAMS_4 - RAY_CAMS_3 ! puis calcul de la masse correspondante avec facteur correctif pour eviter ! la surestimation des concentrations en aerosols +ZMASS(:,:,:,1) = PMASSCAMS(:,:,:,1) * 1E-3 + DELTA_1 = RAY_2 - RAY_CAMS_1 RATIO_1 = DELTA_1 / DELTA_CAMS_1 ZMASS(:,:,:,2) = PMASSCAMS(:,:,:,1) * RATIO_1 ! * 1E-2 ! Attribution Mode 2 ORILAM @@ -159,18 +161,16 @@ DELTA_6 = 10 - RAY_CAMS_3 RATIO_6 = DELTA_3 / DELTA_CAMS_1 ZMASS(:,:,:,5) = (PMASSCAMS(:,:,:,3) * RATIO_6) + ZMASS(:,:,:,5) ! Attribution Mode 5 ter ORILAM -ZMASS(:,:,:,5) = ZMASS(:,:,:,5) * 1E-1 - -! Hyp : the ultrafine mode is neglected for orilam-lima coupling -ZMASS(:,:,:,1) = PMASSCAMS(:,:,:,1) * 1E-5 ! ultrafin mode -! !======================================================== ! Adjust the mass / SSA emissions after a few hours -ZMASS(:,:,:,1) = ZMASS(:,:,:,1) * 1. -ZMASS(:,:,:,2) = ZMASS(:,:,:,2) * 1. -ZMASS(:,:,:,3) = ZMASS(:,:,:,3) * 1. -ZMASS(:,:,:,4) = ZMASS(:,:,:,4) * 1. -ZMASS(:,:,:,5) = ZMASS(:,:,:,5) * 1. +ZMASS(:,:,:,1) = MAX(ZMASS(:,:,:,1) * 0.16, 1E-18) +ZMASS(:,:,:,2) = MAX(ZMASS(:,:,:,2) * 0.1, 1E-17) +ZMASS(:,:,:,3) = MAX(ZMASS(:,:,:,3) * 0.5, 1E-16) +ZMASS(:,:,:,4) = MAX(ZMASS(:,:,:,4) * 0.1, 1E-16) +ZMASS(:,:,:,5) = MAX(ZMASS(:,:,:,5), 1E-17) +IF (NMODE_SLT >= 6) ZMASS(:,:,:,6) = MAX(ZMASS(:,:,:,5) * 0.01, 1E-16) +IF (NMODE_SLT >= 7) ZMASS(:,:,:,7) = MAX(ZMASS(:,:,:,5) * 0.001, 1E-16) +IF (NMODE_SLT >= 8) ZMASS(:,:,:,8) = MAX(ZMASS(:,:,:,5) * 0.0001, 1E-16) !======================================================== DO JN = 1, NMODE_SLT @@ -197,15 +197,11 @@ DO JN = 1, NMODE_SLT ZMMIN(IM6(JN)) = XN0MIN_SLT(IMODEIDX) * (ZRGMIN**6)*EXP(18. * LOG(ZINISIGMA(JN))**2) END DO - -ZMASS(:,:,:,:) = MAX(ZMASS(:,:,:,:), 1E-40) -! ! ZRHOI = XDENSITY_SALT ZMI = XMOLARWEIGHT_SALT ZDEN2MOL = 1E-6 * XAVOGADRO / XMD ZFAC = (4. / 3.) * XPI * ZRHOI * 1.e-9 - ! DO JN = 1, NMODE_SLT @@ -225,13 +221,13 @@ DO JN = 1, NMODE_SLT (ZINIRADIUS(JN)**3) * & EXP(4.5*LOG(ZINISIGMA(JN))**2) - ZM(:,:,:,IM3(JN)) = MAX(ZMMIN(IM3(JN)), ZM(:,:,:,IM3(JN))) +! ZM(:,:,:,IM3(JN)) = MAX(ZMMIN(IM3(JN)), ZM(:,:,:,IM3(JN))) ! !* 1.3 calculate moment 6 from m0, RG and SIG ! ZM(:,:,:,IM6(JN))= ZM(:,:,:,IM0(JN)) * ((ZINIRADIUS(JN)**6)*& EXP(18. * (LOG(ZINISIGMA(JN)))**2)) - ZM(:,:,:,IM6(JN)) = MAX(ZMMIN(IM6(JN)), ZM(:,:,:,IM6(JN))) +! ZM(:,:,:,IM6(JN)) = MAX(ZMMIN(IM6(JN)), ZM(:,:,:,IM6(JN))) ! !* 1.4 output concentration (in ppv) ! diff --git a/src/MNH/set_perturb.f90 b/src/MNH/set_perturb.f90 index 7c4ea5e2e9c224c4d9d1d2022b8fcc0c372d1d8f..c35565007fafde5c4cdbd48aba59de67dbba2bd3 100644 --- a/src/MNH/set_perturb.f90 +++ b/src/MNH/set_perturb.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -211,7 +211,7 @@ NAMELIST/NAM_PERT_PRE/CPERT_KIND,XAMPLITH, &! Perturbation parameters ILUPRE = TPEXPREFILE%NLU ILUOUT = TLUOUT%NLU ! -CALL POSNAM(ILUPRE,'NAM_PERT_PRE',GFOUND,ILUOUT) +CALL POSNAM( TPEXPREFILE, 'NAM_PERT_PRE', GFOUND ) IF (GFOUND) READ(UNIT=ILUPRE,NML=NAM_PERT_PRE) ! ! Distribue/set identical parameter seed to all the proc diff --git a/src/MNH/set_subdomain.f90 b/src/MNH/set_subdomain.f90 index ba8bdd4f2c8618bd0072d8100bd07bda3bf5bbf2..60105c54d2d93748d83d35dd2525940994ff9250 100644 --- a/src/MNH/set_subdomain.f90 +++ b/src/MNH/set_subdomain.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -175,7 +175,7 @@ NYOR=NUNDEF ! ---------------------------- ! ILUNAM = TPNMLFILE%NLU -CALL POSNAM(ILUNAM,'NAM_MESONH_DOM',GFOUND,ILUOUT0) +CALL POSNAM( TPNMLFILE, 'NAM_MESONH_DOM', GFOUND ) IF (GFOUND) THEN NIMAX=NIMAX_n ; NJMAX=NJMAX_n READ(UNIT=ILUNAM,NML=NAM_MESONH_DOM) diff --git a/src/MNH/spawning.f90 b/src/MNH/spawning.f90 index f0ef283104e3c88829e862df850bdd5a11a39c2e..d073818d1e3a450d657454afbf24754c27213a1c 100644 --- a/src/MNH/spawning.f90 +++ b/src/MNH/spawning.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -190,18 +190,18 @@ CALL IO_File_open(TZEXPAFILE) ILUSPA = TZEXPAFILE%NLU ! CALL INIT_NMLVAR -CALL POSNAM(ILUSPA,'NAM_SPAWN_SURF',GFOUND) +CALL POSNAM( TZEXPAFILE, 'NAM_SPAWN_SURF', GFOUND ) IF (GFOUND) READ(UNIT=ILUSPA,NML=NAM_SPAWN_SURF) CALL UPDATE_MODD_FROM_NMLVAR -CALL POSNAM(ILUSPA,'NAM_BLANKN',GFOUND) +CALL POSNAM( TZEXPAFILE, 'NAM_BLANKN', GFOUND ) CALL INIT_NAM_BLANKn IF (GFOUND) THEN READ(UNIT=ILUSPA,NML=NAM_BLANKn) CALL UPDATE_NAM_BLANKn END IF -CALL POSNAM(ILUSPA,'NAM_CONFZ',GFOUND) +CALL POSNAM( TZEXPAFILE, 'NAM_CONFZ', GFOUND ) IF (GFOUND) READ(UNIT=ILUSPA,NML=NAM_CONFZ) -CALL POSNAM(ILUSPA,'NAM_CONF_SPAWN',GFOUND) +CALL POSNAM( TZEXPAFILE, 'NAM_CONF_SPAWN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSPA,NML=NAM_CONF_SPAWN) CALL IO_File_close(TZEXPAFILE) ! @@ -241,7 +241,7 @@ ILUSPA = TZEXPAFILE%NLU CALL SET_POINTERS_TO_MODEL1() CALL GOTO_MODEL(2) CALL INIT_NMLVAR -CALL POSNAM(ILUSPA,'NAM_SPAWN_SURF',GFOUND) +CALL POSNAM( TZEXPAFILE, 'NAM_SPAWN_SURF', GFOUND ) IF (GFOUND) READ(UNIT=ILUSPA,NML=NAM_SPAWN_SURF) CALL UPDATE_MODD_FROM_NMLVAR CALL GOTO_MODEL(1) diff --git a/src/MNH/spectre.f90 b/src/MNH/spectre.f90 index a87838c936e9c344c04f5fcc40325dac525eeab5..a6801f1de0a0391f08b41622b673fc1c038da998 100644 --- a/src/MNH/spectre.f90 +++ b/src/MNH/spectre.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2011-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2011-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -126,38 +126,38 @@ ILUNAM = TZNMLFILE%NLU ! PRINT*, 'READ THE SPEC1.NAM FILE' ! -CALL POSNAM(ILUNAM,'NAM_SPECTRE',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_SPECTRE', GFOUND ) IF (GFOUND) THEN READ(UNIT=ILUNAM,NML=NAM_SPECTRE) PRINT*, ' namelist NAM_SPECTRE read' END IF ! ! -CALL POSNAM(ILUNAM,'NAM_SPECTRE_FILE',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_SPECTRE_FILE', GFOUND ) IF (GFOUND) THEN READ(UNIT=ILUNAM,NML=NAM_SPECTRE_FILE) PRINT*, ' namelist NAM_SPECTRE_FILE read' END IF ! -CALL POSNAM(ILUNAM,'NAM_ZOOM_SPECTRE',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_ZOOM_SPECTRE', GFOUND ) IF (GFOUND) THEN READ(UNIT=ILUNAM,NML=NAM_ZOOM_SPECTRE) PRINT*, ' namelist NAM_ZOOM_SPECTRE read' END IF ! -CALL POSNAM(ILUNAM,'NAM_DOMAIN_AROME',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_DOMAIN_AROME', GFOUND ) IF (GFOUND) THEN READ(UNIT=ILUNAM,NML=NAM_DOMAIN_AROME) PRINT*, ' namelist NAM_DOMAIN_AROME read' END IF ! -CALL POSNAM(ILUNAM,'NAM_CONFZ',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_CONFZ', GFOUND ) IF (GFOUND) THEN READ(UNIT=ILUNAM,NML=NAM_CONFZ) PRINT*, ' namelist NAM_CONFZ read' END IF ! -CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND) +CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND ) IF (GFOUND) THEN READ(UNIT=ILUNAM,NML=NAM_CONFIO) PRINT*, ' namelist NAM_CONFIO read' diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90 index 172521e8abb91b0ef28830380b52e3aee4aea628..a9a08e66a8a54e80fd3ec5f53b7b7f90aee738c3 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -82,6 +82,7 @@ END MODULE MODI_STATION_n !* 0. DECLARATIONS ! ------------ ! +USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD_STAT USE MODD_CONF, ONLY: LCARTESIAN USE MODD_CST, ONLY: XPI USE MODD_DIAG_IN_RUN @@ -89,7 +90,6 @@ USE MODD_GRID, ONLY: XBETA, XLON0, XRPK USE MODD_PARAMETERS, ONLY: JPVEXT USE MODD_PARAM_n, ONLY: CRAD USE MODD_STATION_n -USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD ! USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT, STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V ! @@ -168,7 +168,7 @@ STATION: DO JS = 1,NUMBSTAT_LOC IF ( CRAD /= 'NONE' ) TSTATIONS(JS)%XTSRAD(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), PTS ) TSTATIONS(JS)%XZS = STATPROF_INTERP_2D( TSTATIONS(JS), PZ(:,:,1+JPVEXT)) - IF ( LDIAG_SURFRAD ) THEN + IF ( LDIAG_SURFRAD_STAT ) THEN TSTATIONS(JS)%XZON10M(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_ZON10M ) TSTATIONS(JS)%XMER10M(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_MER10M ) TSTATIONS(JS)%XT2M (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_T2M ) @@ -187,6 +187,7 @@ STATION: DO JS = 1,NUMBSTAT_LOC TSTATIONS(JS)%XSWDIR (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIR ) TSTATIONS(JS)%XSWDIFF(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIFF ) TSTATIONS(JS)%XDSTAOD(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_DSTAOD ) + TSTATIONS(JS)%XSLTAOD(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SLTAOD ) END IF TSTATIONS(JS)%XSFCO2(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SFCO2 ) END IF diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90 index 09fcf049b2a7e7e90b44aa9f1c6097fe89446593..f7e0e7596480f238e84f28cf092b60db764c6f08 100644 --- a/src/MNH/statprof_tools.f90 +++ b/src/MNH/statprof_tools.f90 @@ -35,15 +35,14 @@ CONTAINS SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE ) ! ################################################ -! USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD - USE MODD_CONF_n, ONLY: NRR - USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN - USE MODD_DIM_n, ONLY: NKMAX - USE MODD_NSV, ONLY: NSV - USE MODD_PARAMETERS, ONLY: JPVEXT, XUNDEF - USE MODD_PARAM_n, ONLY: CCLOUD, CRAD, CTURB - USE MODD_RADIATIONS_n, ONLY: NAER - USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF + USE MODD_ALLPROFILER_n, ONLY: LDIAG_SURFRAD_PROF + USE MODD_CONF_n, ONLY: NRR + USE MODD_DIM_n, ONLY: NKMAX + USE MODD_NSV, ONLY: NSV + USE MODD_PARAMETERS, ONLY: JPVEXT, XUNDEF + USE MODD_PARAM_n, ONLY: CCLOUD, CRAD, CTURB + USE MODD_RADIATIONS_n, ONLY: NAER + USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF IMPLICIT NONE @@ -96,7 +95,7 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE ) ALLOCATE( TPPROFILER%XZWD(KSTORE) ) ALLOCATE( TPPROFILER%XZHD(KSTORE) ) -! IF ( LDIAG_IN_RUN ) THEN + IF ( LDIAG_SURFRAD_PROF ) THEN ALLOCATE( TPPROFILER%XT2M (KSTORE) ) ALLOCATE( TPPROFILER%XQ2M (KSTORE) ) ALLOCATE( TPPROFILER%XHU2M (KSTORE) ) @@ -112,9 +111,15 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE ) ALLOCATE( TPPROFILER%XSWU (KSTORE) ) ALLOCATE( TPPROFILER%XLWD (KSTORE) ) ALLOCATE( TPPROFILER%XLWU (KSTORE) ) + ALLOCATE( TPPROFILER%XSWDIR (KSTORE) ) + ALLOCATE( TPPROFILER%XSWDIFF(KSTORE) ) + ALLOCATE( TPPROFILER%XDSTAOD(KSTORE) ) + ALLOCATE( TPPROFILER%XSLTAOD(KSTORE) ) END IF - ALLOCATE( TPPROFILER%XTKE_DISS(KSTORE, IKU) ) -! END IF + ALLOCATE( TPPROFILER%XSFCO2 (KSTORE) ) + END IF + + ALLOCATE( TPPROFILER%XTKE_DISS(KSTORE, IKU) ) TPPROFILER%XZON (:,:) = XUNDEF TPPROFILER%XMER (:,:) = XUNDEF @@ -143,7 +148,7 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE ) TPPROFILER%XZWD(:) = XUNDEF TPPROFILER%XZHD(:) = XUNDEF -! IF ( LDIAG_IN_RUN ) THEN + IF ( LDIAG_SURFRAD_PROF ) THEN TPPROFILER%XT2M (:) = XUNDEF_SFX TPPROFILER%XQ2M (:) = XUNDEF_SFX TPPROFILER%XHU2M (:) = XUNDEF_SFX @@ -159,9 +164,15 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE ) TPPROFILER%XSWU (:) = XUNDEF TPPROFILER%XLWD (:) = XUNDEF TPPROFILER%XLWU (:) = XUNDEF + TPPROFILER%XSWDIR (:) = XUNDEF + TPPROFILER%XSWDIFF(:) = XUNDEF + TPPROFILER%XDSTAOD(:) = XUNDEF + TPPROFILER%XSLTAOD(:) = XUNDEF END IF - TPPROFILER%XTKE_DISS(:,:) = XUNDEF -! END IF + TPPROFILER%XSFCO2(:) = XUNDEF + END IF + + TPPROFILER%XTKE_DISS(:,:) = XUNDEF END SUBROUTINE PROFILER_ALLOCATE @@ -169,7 +180,7 @@ END SUBROUTINE PROFILER_ALLOCATE SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE ) ! ############################################## - USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD + USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD_STAT USE MODD_CONF_n, ONLY: NRR USE MODD_NSV, ONLY: NSV USE MODD_PARAMETERS, ONLY: XUNDEF @@ -198,7 +209,7 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE ) ELSE ALLOCATE( TPSTATION%XTSRAD(0) ) END IF - IF ( LDIAG_SURFRAD ) THEN + IF ( LDIAG_SURFRAD_STAT ) THEN ALLOCATE( TPSTATION%XT2M (KSTORE) ) ALLOCATE( TPSTATION%XQ2M (KSTORE) ) ALLOCATE( TPSTATION%XHU2M (KSTORE) ) @@ -217,6 +228,7 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE ) ALLOCATE( TPSTATION%XSWDIR (KSTORE) ) ALLOCATE( TPSTATION%XSWDIFF(KSTORE) ) ALLOCATE( TPSTATION%XDSTAOD(KSTORE) ) + ALLOCATE( TPSTATION%XSLTAOD(KSTORE) ) END IF ALLOCATE( TPSTATION%XSFCO2(KSTORE) ) END IF @@ -230,7 +242,7 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE ) TPSTATION%XR(:,:) = XUNDEF TPSTATION%XSV(:,:) = XUNDEF TPSTATION%XTSRAD(:) = XUNDEF - IF ( LDIAG_SURFRAD ) THEN + IF ( LDIAG_SURFRAD_STAT ) THEN TPSTATION%XT2M(:) = XUNDEF_SFX TPSTATION%XQ2M(:) = XUNDEF_SFX TPSTATION%XHU2M(:) = XUNDEF_SFX @@ -249,6 +261,7 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE ) TPSTATION%XSWDIR(:) = XUNDEF TPSTATION%XSWDIFF(:) = XUNDEF TPSTATION%XDSTAOD(:) = XUNDEF + TPSTATION%XSLTAOD(:) = XUNDEF END IF TPSTATION%XSFCO2(:) = XUNDEF_SFX END IF diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index 2284be8ea3e8264dbb21d273f7e11a7604ffad51..9c3c5b5849ed8591196b57cc81690e35eb862485 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -203,7 +203,6 @@ USE MODD_AIRCRAFT_BALLOON use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & tbudiachrometadata USE MODD_CST, ONLY: XRV -USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_FLYER_PROC, NMNHDIM_FLYER_TIME, NMNHDIM_UNUSED, & tfieldmetadata_base, TYPEREAL USE MODD_IO, ONLY: TFILEDATA @@ -268,7 +267,7 @@ IPROCZ = SIZE(TPFLYER%XRTZ,2)+ SIZE(TPFLYER%XRZ,2)+ SIZE(TPFLYER%XRZ,3)+ SIZE(T IF (NSV_LIMA_BEG<=NSV_LIMA_END) IPROCZ= IPROCZ+ SIZE(TPFLYER%XCCZ,2) + SIZE(TPFLYER%XCRZ,2) IF (SIZE(TPFLYER%XTKE )>0) IPROC = IPROC + 1 -IF (LDIAG_IN_RUN) IPROC = IPROC + 1 +IPROC = IPROC + 1 ! TKE_DISS IF (LORILAM) IPROC = IPROC + JPMODE*3 IF (LDUST) IPROC = IPROC + NMODE_DST*3 IF (SIZE(TPFLYER%XTSRAD)>0) IPROC = IPROC + 1 @@ -352,9 +351,7 @@ DO JSV=1,SIZE(TPFLYER%XSVW_FLUX,2) WRITE ( YTITLE, FMT = '( A, I3.3 )' ) 'SV_FLUX', JSV call Add_point( Trim( ytitle ), 'scalar flux', 'SVUNIT m s-1', tpflyer%xsvw_flux(:,jsv) ) END DO -IF (LDIAG_IN_RUN) THEN - call Add_point( 'Tke_Diss', 'TKE dissipation rate', 'm2 s-2', tpflyer%xtke_diss(:) ) -ENDIF +call Add_point( 'Tke_Diss', 'TKE dissipation rate', 'm2 s-2', tpflyer%xtke_diss(:) ) ! IF (SIZE(TPFLYER%XSV,2)>=1) THEN ! Scalar variables diff --git a/src/MNH/write_desfmn.f90 b/src/MNH/write_desfmn.f90 index 4f27769f9d9560bee7196a32ce2ed37b49b6bff2..cb4330d88a9c934e7e4f07d8242256f26ad46d1e 100644 --- a/src/MNH/write_desfmn.f90 +++ b/src/MNH/write_desfmn.f90 @@ -216,8 +216,8 @@ USE MODN_BLOWSNOW_n USE MODN_BLOWSNOW USE MODN_IBM_PARAM_n USE MODN_RECYCL_PARAM_n -USE MODN_PROFILER_n -USE MODN_STATION_n +USE MODN_PROFILER_n, LDIAG_SURFRAD_PROF => LDIAG_SURFRAD +USE MODN_STATION_n, LDIAG_SURFRAD_STAT => LDIAG_SURFRAD USE MODN_FIRE_n USE MODN_FLYERS ! diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index a6099e6a0f4eb779347699adbcf1e6f85fc896ca..01c1c560e957fed8f28c7445895ae399ea2487da 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -1348,8 +1348,26 @@ IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN IF (.NOT.(ASSOCIATED(XSIG3D))) & ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) ! - CALL PPP2AERO(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND), XRHODREF, & - PSIG3D=XSIG3D, PRG3D=XRG3D, PN3D=XN3D, PCTOTA=ZPTOTA) + IF (CRGUNIT=="MASS") THEN + XRG3D(:,:,:,1) = XINIRADIUSI * EXP(-3.*(LOG(XINISIGI))**2) + XRG3D(:,:,:,2) = XINIRADIUSJ * EXP(-3.*(LOG(XINISIGJ))**2) + ELSE + XRG3D(:,:,:,1) = XINIRADIUSI + XRG3D(:,:,:,2) = XINIRADIUSJ + END IF + XSIG3D(:,:,:,1) = XINISIGI + XSIG3D(:,:,:,2) = XINISIGJ + XN3D(:,:,:,1) = XN0IMIN + XN3D(:,:,:,2) = XN0JMIN + + ZPTOTA(:,:,:,:,:) = 0. + + CALL PPP2AERO(XSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_AERBEG:NSV_AEREND),& + XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & + PSIG3D=XSIG3D(IIB:IIE,IJB:IJE,IKB:IKE,:),& + PRG3D=XRG3D(IIB:IIE,IJB:IJE,IKB:IKE,:),& + PN3D=XN3D(IIB:IIE,IJB:IJE,IKB:IKE,:),& + PCTOTA=ZPTOTA(IIB:IIE,IJB:IJE,IKB:IKE,:,:)) TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for aerosol modes', & diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index 57a71520c08f08422bb87928e1a0ee143e70735d..33e3d1c32c52c3d6c1d4cc78880ac2fb18e05be6 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -91,6 +91,9 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP !! 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 +!! D. Ricard & Q.Rodier 08/2023 add some diagnostics on pressure levels +!! (temperature, relative and specific humidity, vertical velocity, TKE) +!! D. Ricard 08/2023 add a diagnostic: maximum of cloud fraction on vertical levels !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -100,7 +103,7 @@ 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_CH_PRODLOSSTOT_n, ONLY: CNAMES_PRODLOSST, NEQ_PLT, XLOSS, XPROD -USE MODD_CST, ONLY: XCPD, XP00, XRD, XTT +USE MODD_CST, ONLY: XCPD, XP00, XRD, XTT, XMV, XMD, XALPI, XGAMI, XBETAI USE MODD_CURVCOR_n, ONLY: XCORIOZ USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_ZON10M, XCURRENT_MER10M, & XCURRENT_SFCO2, XCURRENT_SWD, XCURRENT_LWD, & @@ -111,7 +114,7 @@ use modd_field, only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED, NMN use modd_field USE MODD_IO, ONLY: TFILEDATA USE MODD_CONF, ONLY: LCARTESIAN -USE MODD_CONF_n, ONLY: LUSERC, LUSERI, NRR +USE MODD_CONF_n, ONLY: LUSERC, LUSERI, LUSERV, 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, & @@ -122,7 +125,7 @@ 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_n, ONLY: CRAD, CSURF, CCLOUD 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, & @@ -137,6 +140,7 @@ 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_THERMO, ONLY: SM_FOES USE MODE_TOOLS_LL, ONLY: GET_INDICE_ll #ifdef MNH_RTTOV_8 @@ -171,7 +175,7 @@ TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file INTEGER :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds INTEGER :: IKRAD ! -INTEGER :: JI,JJ,JK,JSV ! loop index +INTEGER :: JI,JJ,JK,JSV,JRR ! loop index ! ! variables for Diagnostic variables related to deep convection REAL,DIMENSION(:,:), ALLOCATABLE :: ZWORK21,ZWORK22 @@ -197,7 +201,8 @@ INTEGER :: IPRES, ITH CHARACTER(LEN=4) :: YCAR4 CHARACTER(LEN=4), DIMENSION(SIZE(XISOPR)) :: YPRES CHARACTER(LEN=4), DIMENSION(SIZE(XISOTH)) :: YTH -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK32,ZWORK33,ZWORK34,ZWRES,ZPRES,ZWTH +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK32,ZWORK33,ZWORK34,ZWRES,ZPRES,ZWTH, & + ZRT,ZQV,ZMRVP,ZWRES1,ZTEMPP REAL, DIMENSION(:), ALLOCATABLE :: ZTH REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZPOVO REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZVOX,ZVOY,ZVOZ @@ -433,6 +438,21 @@ IF (LCLD_COV .AND. LUSERC) THEN CALL IO_Field_write(TPFILE,'CLDFR',XCLDFR) CALL IO_Field_write(TPFILE,'ICEFR',XICEFR) ! + ZWORK21(:,:)=0.0 + ZWORK21(IIB:IIE,IJB:IJE)=MAXVAL(XCLDFR(IIB:IIE,IJB:IJE,JPVEXT+1:IKE),DIM=3) + + TZFIELD%CMNHNAME = 'CLDFRMAX' + TZFIELD%CSTDNAME = 'max_cloud_fraction' + TZFIELD%CLONGNAME = 'CLDFRMAX' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_MAx of CLoud fraction' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 2 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) + ! ! Visibility ! ZWORK31(:,:,:)= 1.E4 ! 10 km for clear sky @@ -909,6 +929,7 @@ IF (CSURF=='EXTE') THEN CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SFCO2) END IF ! + IF ( CRAD /= 'NONE' ) THEN IF(ANY(XCURRENT_SWD/=XUNDEF))THEN TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SWD', & @@ -968,6 +989,7 @@ IF (CSURF=='EXTE') THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWU) END IF + END IF ! CRAD/='NONE' END IF ! MODIF FP NOV 2012 @@ -995,6 +1017,7 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU)) END DO ALLOCATE(ZWRES(IIU,IJU,IPRES)) + ALLOCATE(ZTEMPP(IIU,IJU,IPRES)) ZWRES(:,:,:)=XUNDEF ALLOCATE(ZPRES(IIU,IJU,IPRES)) IPRES=0 @@ -1030,6 +1053,17 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU)) CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) END DO ! ********************* +! Temperature +! ********************* + DO JK=1,IPRES + TZFIELD%CMNHNAME = 'TEMP'//TRIM(YPRES(JK))//'HPA' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'K' + TZFIELD%CCOMMENT = 'X_Y_air temperature '//TRIM(YPRES(JK))//' hPa' + CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)*(ZPRES(:,:,JK)/XP00)**(XRD/XCPD)) + END DO + ZTEMPP(:,:,:)=ZWRES(:,:,:) +! ********************* ! Wind ! ********************* ZWORK31(:,:,:) = MXF(XUT(:,:,:)) @@ -1053,6 +1087,29 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU)) TZFIELD%CCOMMENT = 'X_Y_V component of wind '//TRIM(YPRES(JK))//' hPa' CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) END DO + ! + ZWORK31(:,:,:) = MZF(XWT(:,:,:)) + CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & + IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') + DO JK=1,IPRES + TZFIELD%CMNHNAME = 'WT'//TRIM(YPRES(JK))//'HPA' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'm s-1' + TZFIELD%CCOMMENT = 'X_Y_V component of wind '//TRIM(YPRES(JK))//' hPa' + CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) + END DO +! ********************* +! Turbulent kinetic energy +! ********************* + CALL PINTER(XTKET, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & + IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') + DO JK=1,IPRES + TZFIELD%CMNHNAME = 'TKET'//TRIM(YPRES(JK))//'HPA' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'm 2 s-2' + TZFIELD%CCOMMENT = 'X_Y_turbulent kinetic energy '//TRIM(YPRES(JK))//' hPa' + CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) + END DO ! ********************* ! Water Vapour Mixing Ratio ! ********************* @@ -1065,6 +1122,55 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU)) TZFIELD%CCOMMENT = 'X_Y_Vapor Mixing Ratio '//TRIM(YPRES(JK))//' hPa' CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)*1.E3) END DO +! +! ********************* +! Relative humidity +! ********************* + IF (LUSERV) THEN + ALLOCATE(ZWRES1(IIU,IJU,IPRES)) + ALLOCATE(ZMRVP(IIU,IJU,IPRES)) + ZMRVP(:,:,:)=ZWRES(:,:,:) + ZWRES1(:,:,:)=SM_FOES(ZTEMPP(:,:,:)) + ZWRES1(:,:,:)=(XMV/XMD)*ZWRES1(:,:,:)/(ZPRES(:,:,:)-ZWRES1(:,:,:)) + ZWRES(:,:,:)=100.*ZMRVP(:,:,:)/ZWRES1(:,:,:) + IF (CCLOUD(1:3) =='ICE' .OR. CCLOUD =='C3R5' .OR. CCLOUD == 'LIMA') THEN + WHERE ( ZTEMPP(:,:,:)< XTT) + ZWRES1(:,:,:) = EXP( XALPI - XBETAI/ZTEMPP(:,:,:) & + - XGAMI*ALOG(ZTEMPP(:,:,:)) ) !saturation over ice + ZWRES1(:,:,:)=(XMV/XMD)*ZWRES1(:,:,:)/(ZPRES(:,:,:)-ZWRES1(:,:,:)) + ZWRES(:,:,:)=100.*ZMRVP(:,:,:)/ZWRES1(:,:,:) + END WHERE + END IF + DO JK=1,IPRES + TZFIELD%CMNHNAME = 'REHU'//TRIM(YPRES(JK))//'HPA' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'percent' + TZFIELD%CCOMMENT = 'X_Y_Relative humidity '//TRIM(YPRES(JK))//' hPa' + CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) + END DO + DEALLOCATE(ZWRES1,ZMRVP,ZTEMPP) + END IF + ! + ALLOCATE(ZRT(IIU,IJU,IKU)) + ALLOCATE(ZQV(IIU,IJU,IKU)) + ZRT(:,:,:)=0. + DO JRR=1,NRR + ZRT(:,:,:) = ZRT(:,:,:) + XRT(:,:,:,JRR) + END DO + ZQV(:,:,:) = XRT(:,:,:,1) / (1.0 + ZRT(:,:,:)) + ! ********************* + ! Water specific humidity + ! ********************* + CALL PINTER(ZQV, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & + IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') + DO JK=1,IPRES + TZFIELD%CMNHNAME = 'QV'//TRIM(YPRES(JK))//'HPA' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CCOMMENT = 'X_Y_Vapor Specific humidity '//TRIM(YPRES(JK))//' hPa' + CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) + END DO + DEALLOCATE(ZRT,ZQV) ! ********************* ! Geopotential in meters ! ********************* diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index ed97cc4758803960f3b69215912f189291c883dd..98e73e04c80ffa866f208ccd3299bf70d8ab2845 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -51,10 +51,10 @@ SUBROUTINE WRITE_PROFILER_n( TPDIAFILE ) !* 0. DECLARATIONS ! ------------ ! +USE MODD_ALLPROFILER_n, ONLY: LDIAG_SURFRAD_PROF USE MODD_CONF_n, ONLY: NRR USE MODD_DIM_n, ONLY: NKMAX USE MODD_IO, ONLY: ISNPROC, ISP, TFILEDATA -USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN USE MODD_MPIF USE MODD_NSV, ONLY: NSV USE MODD_PARAMETERS, ONLY: JPVEXT @@ -146,11 +146,12 @@ IF ( ISNPROC > 1 ) THEN IF ( CTURB == 'TKEL') IPACKSIZE = IPACKSIZE + ISTORE * IKU !Tke term IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) IPACKSIZE = IPACKSIZE + ISTORE * IKU !CIZ term IPACKSIZE = IPACKSIZE + 4 * ISTORE - IF ( LDIAG_IN_RUN ) THEN + IF ( LDIAG_SURFRAD_PROF ) THEN IPACKSIZE = IPACKSIZE + ISTORE * 10 - IF ( CRAD /= 'NONE' ) IPACKSIZE = IPACKSIZE + ISTORE * 4 - IPACKSIZE = IPACKSIZE + ISTORE * IKU !XTKE_DISS term + IF ( CRAD /= 'NONE' ) IPACKSIZE = IPACKSIZE + ISTORE * 8 + IPACKSIZE = IPACKSIZE + ISTORE !XSFCO2 term END IF + IPACKSIZE = IPACKSIZE + ISTORE * IKU !XTKE_DISS term ALLOCATE( ZPACK(IPACKSIZE) ) END IF @@ -215,7 +216,7 @@ PROFILER: DO JS = 1, INUMPROF ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XZWD(:); IPOS = IPOS + ISTORE ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XZHD(:); IPOS = IPOS + ISTORE - IF ( LDIAG_IN_RUN ) THEN + IF ( LDIAG_SURFRAD_PROF ) THEN ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XT2M; IPOS = IPOS + ISTORE ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XQ2M; IPOS = IPOS + ISTORE ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XHU2M; IPOS = IPOS + ISTORE @@ -231,10 +232,16 @@ PROFILER: DO JS = 1, INUMPROF ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XSWU; IPOS = IPOS + ISTORE ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XLWD; IPOS = IPOS + ISTORE ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XLWU; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XSWDIR; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XSWDIFF; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XDSTAOD; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XSLTAOD; IPOS = IPOS + ISTORE END IF - ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XTKE_DISS(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XSFCO2; IPOS = IPOS + ISTORE END IF + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XTKE_DISS(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + IF ( IPOS-1 /= IPACKSIZE ) & call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS-1 /= IPACKSIZE (sender side)', OLOCAL = .TRUE. ) @@ -297,7 +304,7 @@ PROFILER: DO JS = 1, INUMPROF TZPROFILER%XZWD(:) = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE TZPROFILER%XZHD(:) = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE - IF ( LDIAG_IN_RUN ) THEN + IF ( LDIAG_SURFRAD_PROF ) THEN TZPROFILER%XT2M = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE TZPROFILER%XQ2M = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE TZPROFILER%XHU2M = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE @@ -309,14 +316,20 @@ PROFILER: DO JS = 1, INUMPROF TZPROFILER%XGFLUX = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE TZPROFILER%XLEI = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE IF ( CRAD /= 'NONE' ) THEN - TZPROFILER%XSWD = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE - TZPROFILER%XSWU = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE - TZPROFILER%XLWD = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE - TZPROFILER%XLWU = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XSWD = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZPROFILER%XSWU = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZPROFILER%XLWD = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZPROFILER%XLWU = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZPROFILER%XSWDIR = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZPROFILER%XSWDIFF = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZPROFILER%XDSTAOD = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZPROFILER%XSLTAOD = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE END IF - TZPROFILER%XTKE_DISS(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XSFCO2 = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE END IF + TZPROFILER%XTKE_DISS(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + IF ( IPOS-1 /= IPACKSIZE ) & call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS-1 /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. ) END IF @@ -334,13 +347,13 @@ END SUBROUTINE WRITE_PROFILER_n SUBROUTINE PROFILER_DIACHRO_n( TPDIAFILE, TPPROFILER ) ! #################################################### +USE MODD_ALLPROFILER_n, ONLY: LDIAG_SURFRAD_PROF use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & tbudiachrometadata USE MODD_CH_AEROSOL, ONLY: LORILAM, JPMODE USE MODD_CONF, ONLY: LCARTESIAN USE MODD_CONF_n, ONLY: NRR USE MODD_CST, ONLY: XRV -USE MODD_DIAG_IN_RUN, only: LDIAG_IN_RUN USE MODD_DUST, ONLY: LDUST, NMODE_DST USE MODD_DIM_n, ONLY: NKMAX use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_PROFILER_TIME, NMNHDIM_PROFILER_PROC, NMNHDIM_UNUSED, & @@ -385,7 +398,11 @@ IKU = NKMAX + 2 * JPVEXT !Number of vertical levels ! !IPROC is too large (not a big problem) due to the separation between vertical profiles and point values IPROC = 25 + NRR + NSV -IF (LDIAG_IN_RUN) IPROC = IPROC + 15 +IF (LDIAG_SURFRAD_PROF) THEN + IPROC = IPROC + 10 + IF(CRAD/="NONE") IPROC = IPROC + 8 + IPROC = IPROC + 1 ! XSFCO2 term +END IF IF (LORILAM) IPROC = IPROC + JPMODE*3 IF (LDUST) IPROC = IPROC + NMODE_DST*3 IF (LDUST .OR. LORILAM .OR. LSALT) IPROC=IPROC+NAER @@ -422,8 +439,7 @@ call Add_profile( 'W', 'Air vertical speed', 'm s-1', tpprofi !Store position of W in the field list. Useful because it is not computed on the same Arakawa-grid points jproc_w = jproc -if ( ldiag_in_run ) & - call Add_profile( 'TKE_DISS', 'TKE dissipation rate', 'm2 s-2', tpprofiler%xtke_diss ) +call Add_profile( 'TKE_DISS', 'TKE dissipation rate', 'm2 s-2', tpprofiler%xtke_diss ) if ( ccloud == 'ICE3' .or. ccloud == 'ICE4' ) & call Add_profile( 'CIT', 'Ice concentration', 'kg-3', tpprofiler%xciz ) @@ -658,7 +674,7 @@ ALLOCATE ( XWORK6(1, 1, 1, ISTORE, 1, IPROC) ) jproc = 0 -if ( ldiag_in_run ) then +if ( ldiag_surfrad_prof ) then call Add_point( 'T2m', '2-m temperature', 'K', tpprofiler%xt2m ) call Add_point( 'Q2m', '2-m humidity', 'kg kg-1', tpprofiler%xq2m ) call Add_point( 'HU2m', '2-m relative humidity', 'percent', tpprofiler%xhu2m ) @@ -673,6 +689,10 @@ if ( ldiag_in_run ) then call Add_point( 'SWU', 'Upward short-wave radiation', 'W m-2', tpprofiler%xswu ) call Add_point( 'LWD', 'Downward long-wave radiation', 'W m-2', tpprofiler%xlwd ) call Add_point( 'LWU', 'Upward long-wave radiation', 'W m-2', tpprofiler%xlwu ) + call Add_point( 'SWDIR', 'Downward direct short-wave radiation', 'W m-2', tpprofiler%xswdir(:) ) + call Add_point( 'SWDIFF', 'Downward diffuse short-wave radiation', 'W m-2', tpprofiler%xswdiff(:) ) + call Add_point( 'DSTAOD', 'Dust aerosol optical depth', 'm', tpprofiler%xdstaod(:) ) + call Add_point( 'SLTAOD', 'Salt aerosol optical depth', 'm', tpprofiler%xsltaod(:) ) end if call Add_point( 'LEI', 'Solid Latent heat flux', 'W m-2', tpprofiler%xlei ) end if @@ -682,6 +702,8 @@ call Add_point( 'ZTD', 'Zenith Tropospheric Delay', 'm', tpprofiler%xztd ) call Add_point( 'ZWD', 'Zenith Wet Delay', 'm', tpprofiler%xzwd ) call Add_point( 'ZHD', 'Zenith Hydrostatic Delay', 'm', tpprofiler%xzhd ) +if ( ldiag_surfrad_prof ) call Add_point( 'SFCO2', 'CO2 Surface Flux', 'mg m-2 s-1', tpprofiler%xsfco2(:) ) + Allocate( tzfields( jproc ) ) tzfields(:)%cmnhname = ctitle(1 : jproc) diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index a94bf78b08f6c1b793d01d41aa0317856ad59488..903380597d8454e9743a91097c1f9a47f0b5d8e9 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -44,7 +44,7 @@ SUBROUTINE WRITE_STATION_n( TPDIAFILE ) !* 0. DECLARATIONS ! ------------ ! -USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD +USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD_STAT USE MODD_CONF_n, ONLY: NRR USE MODD_IO, ONLY: ISNPROC, ISP, TFILEDATA USE MODD_MPIF @@ -130,9 +130,9 @@ IF ( ISNPROC > 1 ) THEN IPACKSIZE = IPACKSIZE + ISTORE * ( 5 + NRR + NSV ) IF ( CTURB == 'TKEL') IPACKSIZE = IPACKSIZE + ISTORE !Tke term IF ( CRAD /= 'NONE' ) IPACKSIZE = IPACKSIZE + ISTORE !XTSRAD term - IF ( LDIAG_SURFRAD ) THEN + IF ( LDIAG_SURFRAD_STAT ) THEN IF ( CSURF == 'EXTE' ) IPACKSIZE = IPACKSIZE + ISTORE * 10 - IF ( CRAD /= 'NONE' ) IPACKSIZE = IPACKSIZE + ISTORE * 7 + IF ( CRAD /= 'NONE' ) IPACKSIZE = IPACKSIZE + ISTORE * 8 IPACKSIZE = IPACKSIZE + ISTORE !XSFCO2 term END IF @@ -175,7 +175,7 @@ STATION: DO JS = 1, INUMSTAT IF ( CRAD /= 'NONE' ) THEN ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XTSRAD(:); IPOS = IPOS + ISTORE END IF - IF ( LDIAG_SURFRAD ) THEN + IF ( LDIAG_SURFRAD_STAT ) THEN IF ( CSURF == 'EXTE') THEN ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XT2M; IPOS = IPOS + ISTORE ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XQ2M; IPOS = IPOS + ISTORE @@ -196,6 +196,7 @@ STATION: DO JS = 1, INUMSTAT ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSWDIR; IPOS = IPOS + ISTORE ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSWDIFF; IPOS = IPOS + ISTORE ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XDSTAOD; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSLTAOD; IPOS = IPOS + ISTORE END IF ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSFCO2; IPOS = IPOS + ISTORE END IF @@ -238,7 +239,7 @@ STATION: DO JS = 1, INUMSTAT IF ( CRAD /= 'NONE' ) THEN TZSTATION%XTSRAD(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE END IF - IF ( LDIAG_SURFRAD ) THEN + IF ( LDIAG_SURFRAD_STAT ) THEN IF ( CSURF == 'EXTE' ) THEN TZSTATION%XT2M = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE TZSTATION%XQ2M = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE @@ -259,8 +260,9 @@ STATION: DO JS = 1, INUMSTAT TZSTATION%XSWDIR = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE TZSTATION%XSWDIFF = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE TZSTATION%XDSTAOD = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XSLTAOD = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE END IF - TZSTATION%XSFCO2 = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XSFCO2 = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE END IF IF ( IPOS-1 /= IPACKSIZE ) & @@ -278,7 +280,7 @@ END SUBROUTINE WRITE_STATION_n SUBROUTINE STATION_DIACHRO_n( TPDIAFILE, TPSTATION ) ! ################################################## -USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD +USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD_STAT use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & tbudiachrometadata USE MODD_CONF, ONLY: LCARTESIAN @@ -327,9 +329,9 @@ type(tfieldmetadata_base), dimension(:), allocatable :: tzfields IPROC = 5 + SIZE(TPSTATION%XR,2) + SIZE(TPSTATION%XSV,2) IF ( CTURB == 'TKEL' ) IPROC = IPROC + 1 -IF (LDIAG_SURFRAD) THEN +IF (LDIAG_SURFRAD_STAT) THEN IF(CSURF=="EXTE") IPROC = IPROC + 10 - IF(CRAD/="NONE") IPROC = IPROC + 7 + IF(CRAD/="NONE") IPROC = IPROC + 8 IPROC = IPROC + 1 ! XSFCO2 term END IF IF (LORILAM) IPROC = IPROC + JPMODE*(3+NSOA+NCARB+NSP) @@ -363,7 +365,7 @@ end if call Add_point( 'W', 'Air vertical speed', 'm s-1', tpstation%xw(:) ) call Add_point( 'Th', 'Potential temperature', 'K', tpstation%xth(:) ) -if ( ldiag_surfrad ) then +if ( ldiag_surfrad_stat ) then if ( csurf == "EXTE" ) then call Add_point( 'T2m', '2-m temperature', 'K', tpstation%xt2m(:) ) call Add_point( 'Q2m', '2-m humidity', 'kg kg-1', tpstation%xq2m(:) ) @@ -384,6 +386,7 @@ if ( ldiag_surfrad ) then call Add_point( 'SWDIR', 'Downward direct short-wave radiation', 'W m-2', tpstation%xswdir(:) ) call Add_point( 'SWDIFF', 'Downward diffuse short-wave radiation', 'W m-2', tpstation%xswdiff(:) ) call Add_point( 'DSTAOD', 'Dust aerosol optical depth', 'm', tpstation%xdstaod(:) ) + call Add_point( 'SLTAOD', 'Salt aerosol optical depth', 'm', tpstation%xsltaod(:) ) end if end if @@ -620,7 +623,7 @@ end if if ( crad /= 'NONE' ) call Add_point( 'Tsrad', 'Radiative Surface Temperature', 'K', tpstation%xtsrad(:) ) -if ( ldiag_surfrad ) call Add_point( 'SFCO2', 'CO2 Surface Flux', 'mg m-2 s-1', tpstation%xsfco2(:) ) +if ( ldiag_surfrad_stat ) call Add_point( 'SFCO2', 'CO2 Surface Flux', 'mg m-2 s-1', tpstation%xsfco2(:) ) ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/zoom_pgd.f90 b/src/MNH/zoom_pgd.f90 index 4f0961d8e48419a0a966933dcf1ac64215208bb7..0763fd28301b809b9496f68736e0846dc36fdd8c 100644 --- a/src/MNH/zoom_pgd.f90 +++ b/src/MNH/zoom_pgd.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2005-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2005-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -137,9 +137,9 @@ ILUNAM = TZNMLFILE%NLU CPGDFILE = 'PGDFILE' ! name of the input file YZOOMFILE = '' YZOOMNBR = '00' -CALL POSNAM(ILUNAM,'NAM_PGDFILE',GFOUND,ILUOUT0) +CALL POSNAM( TZNMLFILE, 'NAM_PGDFILE', GFOUND ) IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PGDFILE) -CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND,ILUOUT0) +CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND ) IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFIO) CALL IO_Config_set() ! diff --git a/src/PHYEX/aux/modd_dimphyexn.f90 b/src/PHYEX/aux/modd_dimphyexn.f90 index a2767fe04d1d746f47a742200d17f1f97522477d..cac698c823aa8e03727ee9d744341830f5e9ef9a 100644 --- a/src/PHYEX/aux/modd_dimphyexn.f90 +++ b/src/PHYEX/aux/modd_dimphyexn.f90 @@ -76,6 +76,7 @@ TYPE DIMPHYEX_t INTEGER :: NIJE ! Last horizontal inner mass point index ! INTEGER :: NLESMASK ! Number of LES masks + INTEGER :: NLES_TIMES ! Number of LES time data storage ! END TYPE DIMPHYEX_t ! diff --git a/src/PHYEX/aux/mode_argslist_ll_phy.F90 b/src/PHYEX/aux/mode_argslist_ll_phy.F90 new file mode 100644 index 0000000000000000000000000000000000000000..de0a2f3be638ee37ff57be176a475ad882f2b290 --- /dev/null +++ b/src/PHYEX/aux/mode_argslist_ll_phy.F90 @@ -0,0 +1,60 @@ +!MNH_LIC Copyright 2023-2023 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! +!! ####################### +MODULE MODE_ARGSLIST_ll_PHY +! + USE MODE_ll + USE MODD_ARGSLIST_ll, ONLY : LIST_ll + USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +! + CONTAINS +! + SUBROUTINE ADD3DFIELD_ll_PHY(D, TPLIST, PFIELD, HNAME) +!! ############################################### +! +!!**** *ADD3DFIELD_ll_PHY* - +! +!! Purpose +!! ------- +! This routine is used as an interface to ADD3DFIELD_ll for +! unpacking horizontal dimensions +! +!! Reference +!! --------- +! +! see PHYEX documentation +! +!! Implicit Arguments +!! ------------------ +! +! Module MODD_ARGSLIST : +! LIST_ll : list of fields +! DIMPHYEX_t: PHYEX dimensions +! +!! Author +!! ------ +! +! Q.Rodier +! +!! Modifications +!! ------------- +! Original August, 3, 2023 +! +!------------------------------------------------------------------------------- +! + IMPLICIT NONE +! + TYPE(DIMPHYEX_t), INTENT(IN) :: D + TYPE(LIST_ll), POINTER :: TPLIST ! list of fields + REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PFIELD ! field which is unpaked here +! of fields + CHARACTER(LEN=*), INTENT(IN) :: HNAME ! Name of the field to be added + + CALL ADD3DFIELD_ll(TPLIST, PFIELD, HNAME) + + END SUBROUTINE ADD3DFIELD_ll_PHY +END MODULE MODE_ARGSLIST_ll_PHY diff --git a/src/PHYEX/aux/mode_fill_dimphyexn.f90 b/src/PHYEX/aux/mode_fill_dimphyexn.f90 index 80679f8e1929dfc71b47905a1d88abf6ebffd437..5f965be18b7d6a788d424ab047032aded219485c 100644 --- a/src/PHYEX/aux/mode_fill_dimphyexn.f90 +++ b/src/PHYEX/aux/mode_fill_dimphyexn.f90 @@ -6,7 +6,7 @@ MODULE MODE_FILL_DIMPHYEX IMPLICIT NONE CONTAINS -SUBROUTINE FILL_DIMPHYEX(YDDIMPHYEX, KIT, KJT, KKT, LTURB) +SUBROUTINE FILL_DIMPHYEX(YDDIMPHYEX, KIT, KJT, KKT, LTURB,KLES_TIMES) ! ######################### ! !! @@ -48,6 +48,7 @@ IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(OUT) :: YDDIMPHYEX ! Structure to fill in INTEGER, INTENT(IN) :: KIT, KJT, KKT ! Array dimensions +INTEGER, INTENT(IN), OPTIONAL :: KLES_TIMES ! Number of LES data storage frequency LOGICAL, INTENT(IN), OPTIONAL :: LTURB ! Flag to replace array dimensions I/JB and I/JE to the full array size ! needed if computation in HALO points (e.g. in turbulence) LOGICAL :: YTURB @@ -97,7 +98,11 @@ ELSE END IF IF (LHOOK) CALL DR_HOOK('FILL_DIMPHYEX', 1, ZHOOK_HANDLE) ! -YDDIMPHYEX%NLESMASK = 1 +YDDIMPHYEX%NLESMASK=1 +YDDIMPHYEX%NLES_TIMES=0 +IF (PRESENT(KLES_TIMES)) THEN + YDDIMPHYEX%NLES_TIMES = KLES_TIMES +END IF IF (LLES_MY_MASK) YDDIMPHYEX%NLESMASK = YDDIMPHYEX%NLESMASK + NLES_MASKS_USER IF (LLES_NEB_MASK) YDDIMPHYEX%NLESMASK = YDDIMPHYEX%NLESMASK + 2 IF (LLES_CORE_MASK) YDDIMPHYEX%NLESMASK = YDDIMPHYEX%NLESMASK + 2 diff --git a/src/PHYEX/micro/mode_ice4_budgets.f90 b/src/PHYEX/micro/mode_ice4_budgets.f90 index e2d91bd8c7adb3221a2fd53b3655df6f6af066a2..a33b0acf7fca490a07caaa8b10bdb4fb70a89924 100644 --- a/src/PHYEX/micro/mode_ice4_budgets.f90 +++ b/src/PHYEX/micro/mode_ice4_budgets.f90 @@ -1,9 +1,11 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -! ######spl +! Modifications: +! P. Wautelet 14/04/2023: initialize ZZ_LSFACT and ZZ_LVFACT +!----------------------------------------------------------------- MODULE MODE_ICE4_BUDGETS IMPLICIT NONE CONTAINS @@ -73,7 +75,9 @@ IIJE=D%NIJE ZINV_TSTEP=1./PTSTEP ! IF (BUCONF%LBUDGET_TH) THEN - ZZ_DIFF(:,:)=0. + ZZ_DIFF(:,:) = 0. + ZZ_LSFACT(:,:) = 0. + ZZ_LVFACT(:,:) = 0. DO JK = IKTB, IKTE DO JIJ = IIJB, IIJE ZZ_LVFACT(JIJ, JK) = PLVFACT(JIJ, JK) / PEXNREF(JIJ, JK) diff --git a/src/PHYEX/turb/les_mean_subgrid_phy.f90 b/src/PHYEX/turb/les_mean_subgrid_phy.f90 index 88a7d2c7260c6756fca71fcaabaebfbaa19b0f34..92d0629464e0cff34788b70ae8bcc8cd6d4071b5 100644 --- a/src/PHYEX/turb/les_mean_subgrid_phy.f90 +++ b/src/PHYEX/turb/les_mean_subgrid_phy.f90 @@ -25,7 +25,7 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA ! -REAL, DIMENSION(D%NKLES,TLES%NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(D%NKLES,D%NLES_TIMES,D%NLESMASK), INTENT(INOUT) :: PA_MEAN ! LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! @@ -41,7 +41,7 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIJT), INTENT(IN) :: PA ! -REAL, DIMENSION(TLES%NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(D%NLES_TIMES), INTENT(INOUT) :: PA_MEAN ! LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! @@ -63,7 +63,7 @@ IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA -REAL, DIMENSION(D%NKLES,TLES%NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(D%NKLES,D%NLES_TIMES,D%NLESMASK), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! CALL LES_MEAN_SUBGRID_unpack3D(D,TLES, PA, PA_MEAN, OSUM) @@ -85,7 +85,7 @@ IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIJT), INTENT(IN) :: PA -REAL, DIMENSION(TLES%NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(D%NLES_TIMES), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! CALL LES_MEAN_SUBGRID_unpackSURF(D, TLES, PA, PA_MEAN, OSUM) @@ -105,7 +105,7 @@ IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PA -REAL, DIMENSION(D%NKLES,TLES%NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(D%NKLES,D%NLES_TIMES,D%NLESMASK), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! CALL LES_MEAN_SUBGRID_3D(PA, PA_MEAN, OSUM) @@ -128,7 +128,7 @@ IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIT,D%NJT), INTENT(IN) :: PA -REAL, DIMENSION(TLES%NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(D%NLES_TIMES), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! CALL LES_MEAN_SUBGRID_SURF(PA, PA_MEAN, OSUM) diff --git a/src/PHYEX/turb/mode_tke_eps_sources.f90 b/src/PHYEX/turb/mode_tke_eps_sources.f90 index aef4003ca11c629af10bfa8336bd7f91821fc6ff..ef2af6385bb73cc3853bb6998a045dea8c4e445f 100644 --- a/src/PHYEX/turb/mode_tke_eps_sources.f90 +++ b/src/PHYEX/turb/mode_tke_eps_sources.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -145,6 +145,7 @@ USE MODD_TURB_n, ONLY: TURB_t USE MODE_BUDGET_PHY, ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_END_PHY, BUDGET_STORE_INIT_PHY USE MODE_IO_FIELD_WRITE_PHY, ONLY: IO_FIELD_WRITE_PHY USE MODE_ll +USE MODE_ARGSLIST_ll_PHY, ONLY: ADD3DFIELD_ll_PHY ! USE MODI_GET_HALO USE MODI_LES_MEAN_SUBGRID_PHY @@ -320,7 +321,7 @@ IF (ODIAG_IN_RUN) THEN *(PEXPL*PTKEM(:,:) + TURBN%XIMPL*ZRES(:,:)) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) ! - CALL ADD2DFIELD_ll(TZFIELDDISS_ll, PCURRENT_TKE_DISS, 'TKE_EPS_SOURCES::PCURRENT_TKE_DISS' ) + CALL ADD3DFIELD_ll_PHY(D, TZFIELDDISS_ll, PCURRENT_TKE_DISS, 'TKE_EPS_SOURCES::PCURRENT_TKE_DISS' ) CALL UPDATE_HALO_ll(TZFIELDDISS_ll,IINFO_ll) CALL CLEANLIST_ll(TZFIELDDISS_ll) ENDIF @@ -474,12 +475,12 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! stores the dynamic production ! TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'DP', & + CMNHNAME = 'TKE_DP', & CSTDNAME = '', & - CLONGNAME = 'DP', & + CLONGNAME = 'Subgrid TKE dynamical production', & CUNITS = 'm2 s-3', & CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_DP', & + CCOMMENT = 'Subgrid dynamical production of TKE', & NGRID = 1, & NTYPE = TYPEREAL, & NDIMS = 3, & @@ -489,12 +490,12 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! stores the thermal production ! TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TP', & + CMNHNAME = 'TKE_TP', & CSTDNAME = '', & - CLONGNAME = 'TP', & + CLONGNAME = 'Subgrid TKE thermal production', & CUNITS = 'm2 s-3', & CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_TP', & + CCOMMENT = 'Subgrid thermal production of TKE', & NGRID = 1, & NTYPE = TYPEREAL, & NDIMS = 3, & @@ -504,12 +505,12 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! stores the whole turbulent transport ! TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TR', & + CMNHNAME = 'TKE_TR', & CSTDNAME = '', & - CLONGNAME = 'TR', & + CLONGNAME = 'Subgrid TKE turbulent transport', & CUNITS = 'm2 s-3', & CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_TR', & + CCOMMENT = 'Subgrid total turbulent transport of TKE', & NGRID = 1, & NTYPE = TYPEREAL, & NDIMS = 3, & @@ -519,12 +520,12 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! stores the dissipation of TKE ! TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'DISS', & + CMNHNAME = 'TKE_DISS', & CSTDNAME = '', & - CLONGNAME = 'DISS', & + CLONGNAME = 'Subgrid TKE dissipation', & CUNITS = 'm2 s-3', & CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_DISS', & + CCOMMENT = 'Subgrid dissipation of TKE', & NGRID = 1, & NTYPE = TYPEREAL, & NDIMS = 3, & diff --git a/src/MNH/coupling_dmsn.F90 b/src/SURFEX/coupling_dmsn.F90 similarity index 100% rename from src/MNH/coupling_dmsn.F90 rename to src/SURFEX/coupling_dmsn.F90 diff --git a/src/SURFEX/coupling_sltn.F90 b/src/SURFEX/coupling_sltn.F90 index 3db0c7b1a987464590ce42376196f115d2188399..cdb6c10ee14606387b1c2ef4ade7427feb3e2155 100644 --- a/src/SURFEX/coupling_sltn.F90 +++ b/src/SURFEX/coupling_sltn.F90 @@ -192,7 +192,7 @@ IF ((CEMISPARAM_SLT .eq. "Ova14").OR.(CEMISPARAM_SLT .eq. "OvB21a").OR.(CEMISPAR ! Tableau d'interpolation pour calculer ZNUWATER en fonction de la SST ! Cas ou 0 < SST < 10 C - WHERE ((PSST(:) >= 273.15).AND.(PSST(:) < 283.15)) + WHERE (PSST(:) < 283.15) ZVISCO(:) = ZNUWATER(1) + (PSST(:) - ZWT(1)) * (ZNUWATER(2)-ZNUWATER(1)) / & (ZWT(2) - ZWT(1)) ENDWHERE @@ -210,7 +210,7 @@ IF ((CEMISPARAM_SLT .eq. "Ova14").OR.(CEMISPARAM_SLT .eq. "OvB21a").OR.(CEMISPAR ENDWHERE ! Cas ou 30 < SST < 40 C - WHERE ((PSST(:) >= 303.15).AND.(PSST(:) < 313.15)) + WHERE (PSST(:) >= 303.15) ZVISCO(:) = ZNUWATER(4) + (PSST(:) - ZWT(4)) * (ZNUWATER(5)-ZNUWATER(4)) / & (ZWT(5) - ZWT(4)) ENDWHERE diff --git a/src/SURFEX/default_slt.F90 b/src/SURFEX/default_slt.F90 index ca96f03f98d0b5c56c5cbd4b31838ac4d8c27045..1ac9363d66c36f06f83a25449d1b2d1467410d60 100644 --- a/src/SURFEX/default_slt.F90 +++ b/src/SURFEX/default_slt.F90 @@ -53,10 +53,8 @@ IMPLICIT NONE REAL(KIND=JPRB) :: ZHOOK_HANDLE ! IF (LHOOK) CALL DR_HOOK('DEFAULT_SLT',0,ZHOOK_HANDLE) -! ++ PIERRE / MARINE SSA - MODIF ++ -CEMISPARAM_SLT = 'Ova14' -JPMODE_SLT = 5 -! -- PIERRE / MARINE SSA - MODIF -- +CEMISPARAM_SLT = 'OvB21b' +JPMODE_SLT = 8 LVARSIG_SLT = .FALSE. LRGFIX_SLT = .TRUE. IF (LHOOK) CALL DR_HOOK('DEFAULT_SLT',1,ZHOOK_HANDLE) diff --git a/src/SURFEX/init_slt.F90 b/src/SURFEX/init_slt.F90 index 1476491cd9ec211e4e2964ae365f975ccff87dc3..c74c91f1272e646cbeefab81468ff9dbb25e99a4 100644 --- a/src/SURFEX/init_slt.F90 +++ b/src/SURFEX/init_slt.F90 @@ -63,12 +63,11 @@ IF (LHOOK) CALL DR_HOOK('INIT_SLT',0,ZHOOK_HANDLE) !Get initial size distributions. This is cut and pasted !from dead routine dstpsd.F90 !Check for different source parameterizations -! Default : CEMISPARAM_SLT.eq."Ova14" - - NSLTMDE = 5 +! Default : CEMISPARAM_SLT.eq."OvB21b" + NSLTMDE = 8 CRGUNITS = 'NUMB' - XEMISRADIUS_INI_SLT = (/0.009, 0.021, 0.045, 0.115, 0.415, 0.0, 0.0, 0.0/) - XEMISSIG_INI_SLT = (/1.37, 1.5, 1.42, 1.53, 1.85,0.,0.,0./) + XEMISRADIUS_INI_SLT = (/0.009, 0.021, 0.045, 0.115, 0.415, 2.5, 7.0, 25.0/) + XEMISSIG_INI_SLT = (/1.37, 1.5, 1.42, 1.53,1.70,1.80, 1.85, 2.1/) IF ((CEMISPARAM_SLT.eq."OvB21a").OR.(CEMISPARAM_SLT.eq."OvB21b")) THEN NSLTMDE = 8 @@ -76,6 +75,11 @@ IF ((CEMISPARAM_SLT.eq."OvB21a").OR.(CEMISPARAM_SLT.eq."OvB21b")) THEN XEMISRADIUS_INI_SLT = (/0.009, 0.021, 0.045, 0.115, 0.415, 2.5, 7.0, 25.0/) XEMISSIG_INI_SLT = (/1.37, 1.5, 1.42, 1.53,1.70,1.80, 1.85, 2.1/) +ELSE IF (CEMISPARAM_SLT.eq."Ova14") THEN + NSLTMDE = 5 + CRGUNITS = 'NUMB' + XEMISRADIUS_INI_SLT = (/0.009, 0.021, 0.045, 0.115, 0.415, 0.0, 0.0, 0.0/) + XEMISSIG_INI_SLT = (/1.37, 1.5, 1.42, 1.53, 1.85,0.,0.,0./) ELSE IF (CEMISPARAM_SLT.eq."Vig01") THEN NSLTMDE = 5 diff --git a/src/SURFEX/modd_ch_isban.F90 b/src/SURFEX/modd_ch_isban.F90 index 5e5a9cd49202de3de4d4fba742150fc7612b5c8e..cdb60e93910e621f899734eb8a7db06be2006ea3 100644 --- a/src/SURFEX/modd_ch_isban.F90 +++ b/src/SURFEX/modd_ch_isban.F90 @@ -87,7 +87,7 @@ NULLIFY(YCH_ISBA%CAER_NAMES) NULLIFY(YCH_ISBA%CDSTNAMES) NULLIFY(YCH_ISBA%CSLTNAMES) NULLIFY(YCH_ISBA%CSNWNAMES) -YCH_ISBA%CCHEM_SURF_FILE=' ' +YCH_ISBA%CCHEM_SURF_FILE='MNHC.input' YCH_ISBA%CCH_DRY_DEP=' ' YCH_ISBA%CPARAMBVOC=' ' YCH_ISBA%LCH_BIO_FLUX=.FALSE. diff --git a/src/SURFEX/modd_ch_surfn.F90 b/src/SURFEX/modd_ch_surfn.F90 index f0268de9148a3eee0342221f768cda67c5e3020c..3a3793967653388db4694c3c7ce09b6a8e61b773 100644 --- a/src/SURFEX/modd_ch_surfn.F90 +++ b/src/SURFEX/modd_ch_surfn.F90 @@ -89,7 +89,7 @@ IF (LHOOK) CALL DR_HOOK("MODD_CH_SURF_N:CH_SURF_INIT",0,ZHOOK_HANDLE) YCH_SURF%CCH_EMIS='NONE' YCH_SURF%CCH_BIOEMIS='NONE' YCH_SURF%CCH_DMSEMIS='NONE' -YCH_SURF%CCHEM_SURF_FILE='EXSEG1.nam' +YCH_SURF%CCHEM_SURF_FILE='MNHC.input' YCH_SURF%LCH_SURF_EMIS=.FALSE. YCH_SURF%LCH_EMIS=.FALSE. YCH_SURF%LCH_BIOEMIS=.FALSE. diff --git a/src/SURFEX/modd_ch_tebn.F90 b/src/SURFEX/modd_ch_tebn.F90 index 745cbc847d317063a3d5a21f5208b9fa08541388..516651103d3e4756334a04a2374bf9eba9882b49 100644 --- a/src/SURFEX/modd_ch_tebn.F90 +++ b/src/SURFEX/modd_ch_tebn.F90 @@ -85,7 +85,7 @@ NULLIFY(YCH_TEB%CCH_NAMES) NULLIFY(YCH_TEB%CAER_NAMES) NULLIFY(YCH_TEB%CDSTNAMES) NULLIFY(YCH_TEB%CSLTNAMES) -YCH_TEB%CCHEM_SURF_FILE=' ' +YCH_TEB%CCHEM_SURF_FILE='MNHC.input' YCH_TEB%CCH_DRY_DEP=' ' YCH_TEB%CPARAMBVOC=' ' YCH_TEB%LCH_BIO_FLUX=.FALSE. diff --git a/src/MNH/modd_dms_surf_fieldsn.F90 b/src/SURFEX/modd_dms_surf_fieldsn.F90 similarity index 100% rename from src/MNH/modd_dms_surf_fieldsn.F90 rename to src/SURFEX/modd_dms_surf_fieldsn.F90 diff --git a/src/MNH/modd_dmsn.F90 b/src/SURFEX/modd_dmsn.F90 similarity index 100% rename from src/MNH/modd_dmsn.F90 rename to src/SURFEX/modd_dmsn.F90 diff --git a/src/SURFEX/mode_pos_surf.F90 b/src/SURFEX/mode_pos_surf.F90 index 478ee2034e3b350f6b3e2d92e8770f506c3fba0b..dfb6b2f73dfcde2dbde801ffb085e1d89358fbe4 100644 --- a/src/SURFEX/mode_pos_surf.F90 +++ b/src/SURFEX/mode_pos_surf.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 2001-2019 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2001-2023 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. @@ -53,8 +53,13 @@ END INTERFACE !! -------------- !! I. Mallet 15/10/01 adaptation to MesoNH (F90 norm) !! P. Wautelet 22/01/2019 use standard FLUSH statement instead of non standard intrinsics +!! P. Wautelet 12/04/2023: POSNAM: modernisation + improvements (taken from MesoNH mode_pos.f90) !------------------------------------------------------------------------------ ! +#ifdef SFX_MNH +USE MODE_MSG +#endif +! IMPLICIT NONE ! !* 0. DECLARATIONS @@ -69,6 +74,7 @@ INTEGER, OPTIONAL,INTENT(IN) :: KLUOUT ! !* 0.2 Declarations of local variables ! + CHARACTER(LEN=100) :: YERRORMSG CHARACTER(LEN=120) :: YLINE CHARACTER(LEN=1) :: YLTEST INTEGER :: ILEN,ILEY,INDL,IND1,IRET @@ -92,22 +98,26 @@ ILEN=LEN(HDNAML) DO JFILE=1,2 search_nam : DO YLINE=' ' - READ(UNIT=KULNAM,FMT='(A)',IOSTAT=IRET,END=100) YLINE + READ ( UNIT=KULNAM, FMT='(A)', IOSTAT=IRET, IOMSG=YERRORMSG, END=100 ) YLINE ! If file does not exist, most compilers would just create it and jump ! to the END label ; but a few of them would report an error: IF (IRET /=0 ) THEN +#ifndef SFX_MNH INQUIRE(KULNAM,OPENED=LLOPENED) IF (LLOPENED) THEN IF (PRESENT(KLUOUT)) THEN WRITE(KLUOUT,FMT=*) 'MODE_POS_SURF : error reading from unit ',& KULNAM,' file ',HDNAML,' line ',YLINE FLUSH(unit=KLUOUT) - ENDIF + ENDIF CALL ABOR1_SFX('MODE_POS_SURF: read error in namelist file') ELSE EXIT search_nam END IF +#else + call Print_msg( NVERB_ERROR, 'IO', 'POSNAM (SFX)', Trim( HDNAML) // ': read error:' // Trim( YERRORMSG ) ) +#endif ELSE ! FIRST SEARCH for "&" IN THE LINE, THEN CORRECT LINE AND TEST : INDL=INDEX(YLINE,'&') @@ -120,12 +130,30 @@ DO JFILE=1,2 END DO IND1=INDEX(YLINE,'&'//HDNAML) IF(IND1.NE.0) THEN + IF( IND1 > 1 ) THEN + IF ( LEN_TRIM( YLINE(:IND1-1) ) /= 0 ) THEN + ! Check that it is really the beginning of a namelist and that is not a comment + ! Nothing but spaces is allowed here +#ifdef SFX_MNH + call Print_msg( NVERB_DEBUG, 'IO', 'POSNAM (SFX)', 'invalid header or commented namelist: ' // Trim ( YLINE) ) +#endif + CYCLE + END IF + END IF YLTEST=YLINE(IND1+ILEN+1:IND1+ILEN+1) IF(YLTEST == ' ') THEN ! NAMELIST FOUND : RETURN BACKSPACE(KULNAM) OFOUND=.TRUE. +#ifndef SFX_MNH IF (PRESENT(KLUOUT)) WRITE(KLUOUT,FMT=*) '-- namelist ',HDNAML,' read' +#else + IF ( PRESENT( KLUOUT ) ) THEN + call Print_msg( NVERB_INFO, 'IO', 'POSNAM (SFX)', 'namelist ' // Trim( HDNAML ) // ' found' ) + ELSE + call Print_msg( NVERB_DEBUG, 'IO', 'POSNAM (SFX)', 'namelist ' // Trim( HDNAML ) // ' found' ) + END IF +#endif IF (LHOOK) CALL DR_HOOK('MODE_POS_SURF:POSNAM',1,ZHOOK_HANDLE) RETURN ENDIF @@ -139,9 +167,19 @@ ENDDO BACKSPACE(KULNAM) ! end of file: namelist name not found +#ifndef SFX_MNH IF (PRESENT(KLUOUT)) & WRITE(KLUOUT,FMT=*) & '-- namelist ',HDNAML,' not found: default values used if required' +#else +IF ( PRESENT( KLUOUT ) ) THEN + call Print_msg( NVERB_INFO, 'IO', 'POSNAM (SFX)', 'namelist ' // Trim( HDNAML ) & + // ' not found: default values used if required' ) +ELSE + call Print_msg( NVERB_DEBUG, 'IO', 'POSNAM (SFX)', 'namelist ' // Trim( HDNAML ) & + // ' not found: default values used if required' ) +END IF +#endif IF (LHOOK) CALL DR_HOOK('MODE_POS_SURF:POSNAM',1,ZHOOK_HANDLE) !------------------------------------------------------------------ END SUBROUTINE POSNAM diff --git a/src/MNH/read_dmsn.F90 b/src/SURFEX/read_dmsn.F90 similarity index 100% rename from src/MNH/read_dmsn.F90 rename to src/SURFEX/read_dmsn.F90 diff --git a/src/MNH/writesurf_dmsn.F90 b/src/SURFEX/writesurf_dmsn.F90 similarity index 100% rename from src/MNH/writesurf_dmsn.F90 rename to src/SURFEX/writesurf_dmsn.F90