diff --git a/bin/numabind_core_slurm b/bin/numabind_core_slurm new file mode 100755 index 0000000000000000000000000000000000000000..f78124c9243ef034a2d4245d1c307fad59c2e987 --- /dev/null +++ b/bin/numabind_core_slurm @@ -0,0 +1,23 @@ +#!/bin/bash +#NB_CORE=128 +Numactl='numactl' +export IP=${SLURM_PROCID} + +if [ "x${IP}" != "x" ] +then +export LIP=${SLURM_LOCALID} +export NP=${SLURM_NTASKS} +export NN=${SLURM_NNODES} +export NPN=$(( NP / NN )) +export NB_CORE=${SLURM_JOB_CPUS_PER_NODE/(*)/} +export NPC=$(( NB_CORE / NPN )) +CORE=$(( LIP * NPC )) +#echo IP=${IP} LIP=${LIP} NP=${NP} NN=${NN} NPN=${NPN} NPC=${NPC} HOST=`hostname` NB_CORE=${NB_CORE} CORE=${CORE} +# +# execution +# +exec ${Numactl} --physcpubind ${CORE} $* +else +exec ${Numactl} --physcpubind 0 $* +fi + diff --git a/src/LIB/SURCOUCHE/src/mode_ga.f90 b/src/LIB/SURCOUCHE/src/mode_ga.f90 index 9a2d05b6d6fe372ce51c922e91b467e545ed0b0b..ea98b0eedf5fd44edf7545347799c28335388319 100644 --- a/src/LIB/SURCOUCHE/src/mode_ga.f90 +++ b/src/LIB/SURCOUCHE/src/mode_ga.f90 @@ -9,6 +9,7 @@ ! J. Escobar 05/02/2015: use JPHEXT from MODD_PARAMETERS_ll ! P. Wautelet 14/12/2018: split from fmwrit_ll.f90 ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! J. Escobar 11/02/2020: for GA, add some sync, & reduce size of MA heap <-> not used !----------------------------------------------------------------- #ifdef MNH_GA MODULE MODE_GA @@ -20,11 +21,11 @@ MODULE MODE_GA INTEGER, PARAMETER :: jpix=1 , jpiy = 2 , jpiz = 3 ! INTEGER :: NIMAX_ll,NJMAX_ll, IIU_ll,IJU_ll,IKU_ll - integer :: heap=5*10**6, stack + integer :: heap=1*10**5, stack logical :: gstatus_ga INTEGER, PARAMETER :: ndim_GA = 3 INTEGER, DIMENSION(ndim_GA) :: dims_GA , chunk_GA - INTEGER,PARAMETER :: CI=1 ,CJ=-1 ,CK=-1 + INTEGER,PARAMETER :: CI= 1 ,CJ=-1 ,CK=-1 INTEGER :: g_a integer, DIMENSION(ndim_GA) :: lo_col, hi_col , ld_col integer, DIMENSION(ndim_GA) :: lo_zplan , hi_zplan , ld_zplan @@ -68,6 +69,8 @@ MODULE MODE_GA call ga_initialize() END IF + call ga_sync() + CALL GET_GLOBALDIMS_ll (NIMAX_ll,NJMAX_ll) IIU_ll = NIMAX_ll + 2*JPHEXT IJU_ll = NJMAX_ll + 2*JPHEXT @@ -92,9 +95,11 @@ MODULE MODE_GA ! reallocate the g_a , if need with bigger Z size ! IF ( IKU_ll_MAX .NE. -1 ) gstatus_ga = ga_destroy(g_a) + call ga_sync() IIU_ll_MAX = IIU_ll IJU_ll_MAX = IJU_ll IKU_ll_MAX = IKU_ll + !print*,"MNH_INIT_GA::nga_create=",MT_F_DBL, ndim_GA, dims_GA, HRECFM ,chunk_GA, g_a ; call flush(6) gstatus_ga = nga_create(MT_F_DBL, ndim_GA, dims_GA, HRECFM ,chunk_GA, g_a) call ga_sync() END IF diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 index 8f717bce0cda430ec8cb752eab038973db07b230..340d0490e92bff0cdb65b636a931dbc1e65543f1 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-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. @@ -15,6 +15,7 @@ ! P. Wautelet 12/04/2019: use MNHTIME for time measurement variables ! P. Wautelet 26/04/2019: use modd_precision parameters for datatypes of MPI communications ! P. Wautelet 25/06/2019: added IO_Field_read for 3D integer arrays (IO_Field_read_byname_N3 and IO_Field_read_byfield_N3) +! J. Escobar 11/02/2020: for GA & // IO, add update_halo + sync, & mpi_allreduce for error handling in // IO !----------------------------------------------------------------- MODULE MODE_IO_FIELD_READ @@ -338,6 +339,11 @@ USE MODE_GA USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_SCATTER_ll ! +#ifdef MNH_GA +USE MODD_ARGSLIST_ll, ONLY : LIST_ll +USE MODE_ll , ONLY : ADD2DFIELD_ll,UPDATE_HALO_ll,CLEANLIST_ll +#endif +! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD REAL,DIMENSION(:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field @@ -354,7 +360,9 @@ INTEGER :: IHEXTOT REAL(kind=MNHTIME), DIMENSION(2) :: T0, T1, T2 REAL(kind=MNHTIME), DIMENSION(2) :: T11, T22 #ifdef MNH_GA -REAL,DIMENSION(:,:),POINTER :: ZFIELD_GA +REAL,DIMENSION(:,:),POINTER :: ZFIELD_GA +TYPE(LIST_ll) ,POINTER :: TZFIELD_ll +INTEGER :: IINFO_ll #endif ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_X2',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME)) @@ -434,16 +442,23 @@ IF (IRESP==0) THEN ! lo_zplan(JPIZ) = 1 hi_zplan(JPIZ) = 1 + !print*,"IO_READ_FIELD_BYFIELD_X2::nga_put=",g_a, lo_zplan, hi_zplan, ld_zplan, TPFIELD%CMNHNAME ; call flush(6) call nga_put(g_a, lo_zplan, hi_zplan,ZFIELDP, ld_zplan) END IF - call ga_sync + call ga_sync() ! ! get the columun data in this proc ! ! temp buf to avoid problem with none stride PFIELDS buffer with HALO ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2))) + !print*,"IO_READ_FIELD_BYFIELD_X2::nga_get=",g_a, lo_col, hi_col, ld_col, TPFIELD%CMNHNAME ; call flush(6) call nga_get(g_a, lo_col, hi_col,ZFIELD_GA(1,1) , ld_col) PFIELD = ZFIELD_GA + call ga_sync() + NULLIFY(TZFIELD_ll) + CALL ADD2DFIELD_ll(TZFIELD_ll,PFIELD ) + CALL UPDATE_HALO_ll(TZFIELD_ll,IINFO_ll) + CALL CLEANLIST_ll(TZFIELD_ll) DEALLOCATE(ZFIELD_GA) #else ! XY Scatter Field @@ -500,6 +515,7 @@ USE MODD_VAR_ll, ONLY: MNH_STATUSES_IGNORE USE MODE_ALLOCBUFFER_ll #ifdef MNH_GA USE MODE_GA +USE MODI_GET_HALO #endif USE MODE_IO_TOOLS, ONLY: IO_Level2filenumber_get USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_find_byname @@ -515,7 +531,7 @@ TYPE TX_2DP REAL,DIMENSION(:,:), POINTER :: X END TYPE TX_2DP ! -INTEGER :: IERR,IRESP,IRESP_TMP +INTEGER :: IERR,IRESP,IRESP_TMP,IRESP_ISP INTEGER :: IHEXTOT INTEGER :: IK_FILE,IK_RANK,INB_PROC_REAL,JK_MAX INTEGER :: JI,IXO,IXE,IYO,IYE @@ -630,7 +646,8 @@ IF (IRESP==0) THEN ! ALLOCATE(ZSLICE_ll(0,0)) ! to avoid bug on test of size GALLOC_ll = .TRUE. - DO JKK=1,IKU_ll + IRESP_ISP=0 + DO JKK=1,SIZE(PFIELD,3) ! IKU_ll IK_FILE = IO_Level2filenumber_get(JKK,TPFILE%NSUBFILES_IOZ) TZFILE => TPFILE%TFILES_IOZ(IK_FILE+1)%TFILE TZFIELD = TPFIELD @@ -658,6 +675,7 @@ IF (IRESP==0) THEN ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN CALL IO_Field_read_nc4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP) END IF + IF (IRESP_TMP .NE. 0 ) IRESP_ISP = IRESP_TMP CALL SECOND_MNH2(T1) TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0 ! @@ -665,25 +683,30 @@ IF (IRESP==0) THEN ! LO_ZPLAN(JPIZ) = JKK HI_ZPLAN(JPIZ) = JKK + !print*,"IO_READ_FIELD_BYFIELD_X3::nga_put=",g_a, lo_zplan, hi_zplan, ld_zplan, TZFIELD%CMNHNAME ; call flush(6) CALL NGA_PUT(G_A, LO_ZPLAN, HI_ZPLAN,ZSLICE_LL, LD_ZPLAN) END IF TZFILE => NULL() END DO - CALL GA_SYNC + CALL GA_SYNC() ! - CALL MPI_BCAST(IRESP_TMP,1,MNHINT_MPI,IK_RANK-1,TZFILE%NMPICOMM,IERR) + CALL MPI_ALLREDUCE(-ABS(IRESP_ISP),IRESP_TMP,1,MNHINT_MPI,MPI_MIN,TPFILE%NMPICOMM,IRESP) IF (IRESP_TMP/=0) IRESP = IRESP_TMP !Keep last "error" ! ! get the columun data in this proc ! ! temp buf to avoid problem with none stride PFIELDS buffer with HALO ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))) + !print*,"IO_READ_FIELD_BYFIELD_X3::nga_get=",g_a, lo_col, hi_col, ld_col, TPFIELD%CMNHNAME ; call flush(6) CALL NGA_GET(G_A, LO_COL, HI_COL,ZFIELD_GA(1,1,1) , LD_COL) PFIELD = ZFIELD_GA + call ga_sync() + CALL GET_HALO(PFIELD) DEALLOCATE(ZFIELD_GA) #else ALLOCATE(ZSLICE_ll(0,0)) GALLOC_ll = .TRUE. + IRESP_ISP=0 INB_PROC_REAL = MIN(TPFILE%NSUBFILES_IOZ,ISNPROC) ALLOCATE(REQ_TAB((ISNPROC-1)*INB_PROC_REAL)) ALLOCATE(T_TX2DP((ISNPROC-1)*INB_PROC_REAL)) @@ -724,6 +747,7 @@ IF (IRESP==0) THEN ELSE IF (TZFILE%CFORMAT=='LFICDF4') THEN CALL IO_Field_read_nc4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP) END IF + IF (IRESP_TMP .NE. 0 ) IRESP_ISP = IRESP_TMP CALL SECOND_MNH2(T1) TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0 DO JI = 1,ISNPROC @@ -744,8 +768,6 @@ IF (IRESP==0) THEN TIMEZ%T_READ3D_SEND=TIMEZ%T_READ3D_SEND + T2 - T1 END IF ! - CALL MPI_BCAST(IRESP_TMP,1,MNHINT_MPI,IK_RANK-1,TZFILE%NMPICOMM,IERR) - IF (IRESP_TMP/=0) IRESP = IRESP_TMP !Keep last "error" TZFILE => NULL() END DO ! @@ -807,6 +829,8 @@ IF (IRESP==0) THEN DEALLOCATE(T_TX2DP) DEALLOCATE(REQ_TAB) ! + CALL MPI_ALLREDUCE(-ABS(IRESP_ISP),IRESP_TMP,1,MNHINT_MPI,MPI_MIN,TPFILE%NMPICOMM,IRESP) + IF (IRESP_TMP/=0) IRESP = IRESP_TMP !Keep last "error" !Broadcast header only if IRESP==-111 !because metadata of field has been modified in IO_Field_read_xxx IF (IRESP==-111) CALL IO_Field_metadata_bcast(TPFILE,TPFIELD) diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 index afd62237f12cfe0acf7f3e8eafb9917ed399c10c..30f0330bfbfc4144c902096c5796541786b02f1a 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-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. @@ -12,6 +12,7 @@ ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 12/04/2019: added pointers for C1D, L1D, N1D, X5D and X6D structures in TFIELDDATA ! P. Wautelet 12/04/2019: use MNHTIME for time measurement variables +! J. Escobar 11/02/2020: for GA & // IO, add sync, & mpi_allreduce for error handling in // IO !----------------------------------------------------------------- #define MNH_SCALARS_IN_SPLITFILES 0 @@ -590,8 +591,10 @@ CONTAINS ! ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2))) ZFIELD_GA = PFIELD + !print*,"IO_WRITE_FIELD_BYFIELD_X2::nga_put=",g_a, lo_col, hi_col,NIXO_L,NIYO_L , ld_col, YRECFM ; call flush(6) + call ga_sync() call nga_put(g_a, lo_col, hi_col,ZFIELD_GA(NIXO_L,NIYO_L) , ld_col) - call ga_sync + call ga_sync() DEALLOCATE (ZFIELD_GA) IF (ISP == TPFILE%NMASTER_RANK) THEN ! @@ -599,6 +602,7 @@ CONTAINS ! lo_zplan(JPIZ) = 1 hi_zplan(JPIZ) = 1 + !print*,"IO_WRITE_FIELD_BYFIELD_X2::nga_get=",g_a, lo_zplan, hi_zplan, ld_zplan, YRECFM ; call flush(6) call nga_get(g_a, lo_zplan, hi_zplan,ZFIELDP, ld_zplan) END IF #else @@ -690,7 +694,7 @@ CONTAINS CHARACTER(LEN=2) :: YDIR ! field form INTEGER :: IERR INTEGER :: ISIZEMAX - INTEGER :: IRESP + INTEGER :: IRESP,IRESP_ISP,IRESP_TMP REAL,DIMENSION(:,:,:),POINTER :: ZFIELDP LOGICAL :: GALLOC LOGICAL :: GLFI, GNC4 @@ -798,6 +802,11 @@ CONTAINS RETURN END IF ! + ! Write the variable attributes in the non-split file + ! + if ( tpfile%nmaster_rank==isp .and. gnc4 ) & + call IO_Field_header_split_write_nc4( tpfile, tpfield, size( pfield, 3 ) ) + ! !JUAN BG Z SLICE ! ! @@ -812,23 +821,21 @@ CONTAINS ! ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))) ZFIELD_GA = PFIELD + !print*,"IO_WRITE_FIELD_BYFIELD_X3::nga_put=",g_a, lo_col, hi_col,NIXO_L,NIYO_L , ld_col, YRECFM ; call flush(6) + call ga_sync() call nga_put(g_a, lo_col, hi_col,ZFIELD_GA(NIXO_L,NIYO_L,1) , ld_col) + call ga_sync() DEALLOCATE(ZFIELD_GA) - call ga_sync CALL SECOND_MNH2(T1) TIMEZ%T_WRIT3D_SEND=TIMEZ%T_WRIT3D_SEND + T1 - T0 ! - ! Write the variable attributes in the non-split file - ! - if ( tpfile%nmaster_rank==isp .and. gnc4 ) & - call IO_Write_field_header_split_nc4( tpfile, tpfield, size( pfield, 3 ) ) - ! ! write the data ! ALLOCATE(ZSLICE_ll(0,0)) ! to avoid bug on test of size GALLOC_ll = .TRUE. + IRESP_ISP=0 ! - DO JKK=1,IKU_ll + DO JKK=1,SIZE(PFIELD,3) ! IKU_ll ! IK_FILE = IO_Level2filenumber_get(JKK,TPFILE%NSUBFILES_IOZ) TZFILE => TPFILE%TFILES_IOZ(IK_FILE+1)%TFILE @@ -847,12 +854,14 @@ CONTAINS ! lo_zplan(JPIZ) = JKK hi_zplan(JPIZ) = JKK + !print*,"IO_WRITE_FIELD_BYFIELD_X3::nga_get=",g_a, lo_zplan, hi_zplan, ld_zplan, YRECFM,JKK ; call flush(6) call nga_get(g_a, lo_zplan, hi_zplan,ZSLICE_ll, ld_zplan) CALL SECOND_MNH2(T1) TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0 ! - IF (GLFI) CALL IO_Field_write_lfi(TPFILE,TPFIELD,ZSLICE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) - IF (GNC4) CALL IO_Field_write_nc4(TPFILE,TPFIELD,ZSLICE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (GLFI) CALL IO_Field_write_lfi(TPFILE,TPFIELD,ZSLICE_ll,IRESP_TMP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (GNC4) CALL IO_Field_write_nc4(TPFILE,TPFIELD,ZSLICE_ll,IRESP_TMP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (IRESP_TMP .NE. 0 ) IRESP_ISP = IRESP_TMP CALL SECOND_MNH2(T2) TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 END IF @@ -866,6 +875,7 @@ CONTAINS ! ALLOCATE(ZSLICE_ll(0,0)) GALLOC_ll = .TRUE. + IRESP_ISP=0 INB_PROC_REAL = MIN(TPFILE%NSUBFILES_IOZ,ISNPROC) Z_SLICE: DO JK=1,SIZE(PFIELD,3),INB_PROC_REAL ! @@ -920,7 +930,7 @@ CONTAINS ! ! Write the variable attributes in the non-split file ! - if ( tpfile%nmaster_rank==isp .and. gnc4 ) & + if ( tpfile%nmaster_rank == isp .and. gnc4 ) & call IO_Field_header_split_write_nc4( tpfile, tpfield, size( pfield, 3 ) ) ! ! write the data @@ -956,8 +966,9 @@ CONTAINS END DO CALL SECOND_MNH2(T1) TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0 - IF (GLFI) CALL IO_Field_write_lfi(TPFILE,TPFIELD,ZSLICE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) - IF (GNC4) CALL IO_Field_write_nc4(TPFILE,TPFIELD,ZSLICE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (GLFI) CALL IO_Field_write_lfi(TPFILE,TPFIELD,ZSLICE_ll,IRESP_TMP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (GNC4) CALL IO_Field_write_nc4(TPFILE,TPFIELD,ZSLICE_ll,IRESP_TMP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (IRESP_TMP .NE. 0 ) IRESP_ISP = IRESP_TMP CALL SECOND_MNH2(T2) TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 END IF @@ -976,6 +987,8 @@ CONTAINS !JUAN BG Z SLICE ! end of MNH_GA #endif + CALL MPI_ALLREDUCE(-ABS(IRESP_ISP),IRESP_TMP,1,MNHINT_MPI,MPI_MIN,TPFILE%NMPICOMM,IRESP) + IF (IRESP_TMP/=0) IRESP = IRESP_TMP !Keep last "error" END IF ! multiprocesses execution END IF ! diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 index 4e6bce3f26e7f74836495171a3da9dcab91a5e6b..1787cac1005bbf5f988de57cc19590c469bae1ce 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2016-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2016-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. @@ -16,6 +16,8 @@ ! P. Wautelet 18/02/2019: bugfixes for nsubfiles_ioz ! P. Wautelet 05/03/2019: rename IO subroutines and modules ! P. Wautelet 12/03/2019: add TMAINFILE field in TFILEDATA +! P. Wautelet 11/02/2020: bugfix: TDADFILE was wrongly constructed for output files +! S. Donnier 28/02/2020: type STREAM needed for use of ECOCLIMAP SG !----------------------------------------------------------------- MODULE MODE_IO_MANAGE_STRUCT ! @@ -253,7 +255,7 @@ DO IMI = 1, NMODEL IF (IDX>0) THEN OUT_MODEL(IMI)%TOUTPUTN(IPOS)%NOUTDAD = IDX WRITE (YDADNUMBER,FMT="('.',I3.3)") OUT_MODEL(IMI)%TOUTPUTN(IPOS)%NOUTDAD - OUT_MODEL(IMI)%TOUTPUTN(IPOS)%TFILE%TDADFILE => OUT_MODEL(NDAD(IMI))%TBACKUPN(IDX)%TFILE + OUT_MODEL(IMI)%TOUTPUTN(IPOS)%TFILE%TDADFILE => OUT_MODEL(NDAD(IMI))%TOUTPUTN(IDX)%TFILE ELSE OUT_MODEL(IMI)%TOUTPUTN(IPOS)%NOUTDAD = -1 NULLIFY(OUT_MODEL(IMI)%TOUTPUTN(IPOS)%TFILE%TDADFILE) !No dad file diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 34eebc5adef4e993658ae2cbc7dcd0f27b164250..cde87daf03a0505fc4de4807761f9c43908e430c 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-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. @@ -14,6 +14,7 @@ ! P. Wautelet 05/03/2019: rename IO subroutines and modules ! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) ! P. Wautelet 19/09/2019: temporary workaround for netCDF bug if MNH_INT=8 (if netCDF fortran < 4.4.5) +! P. Wautelet 11/02/2020: add 'dims' attribute in IO_Write_field_header_split_nc4 !----------------------------------------------------------------- #if defined(MNH_IOCDF4) module mode_io_write_nc4 @@ -130,6 +131,10 @@ if ( istatus /= NF90_NOERR ) then if ( istatus /= NF90_NOERR ) call IO_Err_handle_nc4( istatus, 'IO_Field_header_split_write_nc4', 'NF90_PUT_ATT', & 'ndims for '//trim( tpfield%cmnhname ) ) + istatus = NF90_PUT_ATT( incid, ivarid,'dims', ishape ) + if ( istatus /= NF90_NOERR ) call IO_Err_handle_nc4( istatus, 'IO_Field_header_split_write_nc4', 'NF90_PUT_ATT', & + 'dims for '//trim( tpfield%cmnhname ) ) + if ( tpfield%ltimedep ) then istatus = NF90_PUT_ATT( incid, ivarid,'time_dependent', 'yes' ) else diff --git a/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 b/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 index b10e2eea94b404e947df4e57f4a9c5ac5240c8b4..6a405483dbf3e11d5446d4f2db9ab0457babf08d 100644 --- a/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 +++ b/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 @@ -8,6 +8,7 @@ ! P. Wautelet 03/10/2017: set IP and NPROC in INIT_NMNH_COMM_WORLD ! P. Wautelet 10/01/2019: use NEWUNIT argument of OPEN ! P. Wautelet 21/11/2019: bugfix: close call could be done on a non-opened file +! J. Escobar 11/02/2020: For GA , replace MPI_INIT_THREAD -> MPI_INIT !----------------------------------------------------------------- MODULE MODE_MNH_WORLD IMPLICIT NONE @@ -50,7 +51,7 @@ CONTAINS CALL MPI_INITIALIZED(GISINIT, KINFO_ll) IF (.NOT. GISINIT) THEN #ifdef MNH_GA - CALL MPI_INIT_thread(REQUIRED,PROVIDED,KINFO_ll) + CALL MPI_INIT(KINFO_ll) #else CALL MPI_INIT(KINFO_ll) #endif diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index 50717842638c609e788fa79a38cd902dfe26e9bd..5ea23bf85eded9708521ce00cc2926e5c0fd2779 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-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. @@ -136,6 +136,8 @@ END MODULE MODI_ADVECTION_METSV !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! 07/2017 (V. Vionnet) : add advection of 2D variables at !! the surface for the blowing snow scheme +!! 03/2020 (B.Vie) : LIMA negativity checks after turbulence, advection and +!! microphysics budgets ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine !------------------------------------------------------------------------------- ! @@ -148,6 +150,8 @@ USE MODD_CTURB, ONLY: XTKEMIN USE MODD_CONF, ONLY: LNEUTRAL,NHALO,L1D, L2D USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_NSV +USE MODD_PARAM_LIMA USE MODD_PARAM_n USE MODD_TYPE_DATE, ONLY: DATE_TIME USE MODD_BLOWSNOW @@ -253,7 +257,7 @@ REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),NBLOWSNOW_2D) :: ZRSNWCS_ REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOX1,ZRHOX2 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOY1,ZRHOY2 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOZ1,ZRHOZ2 -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZT,ZEXN,ZLV,ZLS,ZCPH +REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZT,ZEXN,ZLV,ZLS,ZCPH,ZCOR ! Temporary advected rhodj for PPM routines ! INTEGER :: JS,JR,JSV,JSPL, JI, JJ ! Loop index @@ -669,34 +673,136 @@ DO JSV=1,KSV IF (LBUDGET_SV) CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADV_BU_RSV') END DO ! -IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) THEN - ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) - ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) +SELECT CASE ( HCLOUD ) + CASE('ICE3','ICE4') + ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) + WHERE (PRRS(:,:,:,4) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,4) = 0. + END WHERE +! +! cloud + WHERE (PRRS(:,:,:,2) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,2) = 0. + END WHERE +! +! if rc or ri are positive, we can correct negative rv +! cloud + WHERE ((PRRS(:,:,:,1) <0.) .AND. (PRRS(:,:,:,2)> 0.) ) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,2) = 0. + END WHERE +! ice + IF(KRR > 3) THEN + WHERE ((PRRS(:,:,:,1) < 0.).AND.(PRRS(:,:,:,4) > 0.)) + ZCOR(:,:,:)=MIN(-PRRS(:,:,:,1),PRRS(:,:,:,4)) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + ZCOR(:,:,:) + PRTHS(:,:,:) = PRTHS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,4) = PRRS(:,:,:,4) -ZCOR(:,:,:) + END WHERE + END IF +! + CASE('C2R2','KHKO') + ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) ! CALL GET_HALO(PRRS(:,:,:,2)) ! CALL GET_HALO(PRSVS(:,:,:,2)) ! CALL GET_HALO(PRSVS(:,:,:,3)) - WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.) - PRSVS(:,:,:,1) = 0.0 - END WHERE - DO JSV = 2, 3 - WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) - PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRRS(:,:,:,JSV) = 0.0 - PRSVS(:,:,:,JSV) = 0.0 - END WHERE - END DO -! + WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.) + PRSVS(:,:,:,1) = 0.0 + END WHERE + DO JSV = 2, 3 + WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,JSV) = 0.0 + PRSVS(:,:,:,JSV) = 0.0 + END WHERE + END DO + ! + CASE('LIMA') + ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) +! Correction where rc<0 or Nc<0 + IF (LWARM) THEN + WHERE (PRRS(:,:,:,2) < XRTMIN(2)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NC) < XCTMIN(2)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,2) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NC) = 0.0 + END WHERE + END IF +! Correction where rr<0 or Nr<0 + IF (LWARM .AND. LRAIN) THEN + WHERE (PRRS(:,:,:,3) < XRTMIN(3)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NR) < XCTMIN(3)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,3) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,3) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,3) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NR) = 0.0 + END WHERE + END IF +! Correction where ri<0 or Ni<0 + IF (LCOLD) THEN + WHERE (PRRS(:,:,:,4) < XRTMIN(4)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NI) < XCTMIN(4)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,4) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NI) = 0.0 + END WHERE + END IF +! + PRSVS(:,:,:,:) = MAX( 0.0,PRSVS(:,:,:,:) ) + PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) ) +! +END SELECT +! +IF ((HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'KHKO') .OR. (HCLOUD /= 'C2R2') .OR. (HCLOUD /= 'LIMA') ) THEN IF (LBUDGET_TH) CALL BUDGET (PRTHS(:,:,:) , 4,'NEADV_BU_RTH') IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), 6,'NEADV_BU_RRV') IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), 7,'NEADV_BU_RRC') - + IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3), 8,'NEADV_BU_RRR') + IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4), 9,'NEADV_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'NEADV_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'NEADV_BU_RRG') + IF (LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'NEADV_BU_RRH') +END IF +IF (LBUDGET_SV .AND. (HCLOUD == 'LIMA')) THEN + IF (LWARM) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NC),12+NSV_LIMA_NC,'NEADV_BU_RSV') + IF (LWARM.AND.LRAIN) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NR),12+NSV_LIMA_NR,'NEADV_BU_RSV') + IF (LCOLD) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NI),12+NSV_LIMA_NI,'NEADV_BU_RSV') + IF (NMOD_CCN.GE.1) THEN + DO JI=1, NMOD_CCN + CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_CCN_FREE+JI-1),12+NSV_LIMA_CCN_FREE+JI-1,'NEADV_BU_RSV') + END DO + END IF + IF (NMOD_IFN.GE.1) THEN + DO JI=1, NMOD_IFN + CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_IFN_FREE+JI-1),12+NSV_LIMA_IFN_FREE+JI-1,'NEADV_BU_RSV') + END DO + END IF END IF - !------------------------------------------------------------------------------- ! diff --git a/src/MNH/boundaries.f90 b/src/MNH/boundaries.f90 index 2e28cb605cbceda8bc384f44e16d4b7f5e1501e3..a0095f8c355ebaf408bcee8d5bd4396754a85a59 100644 --- a/src/MNH/boundaries.f90 +++ b/src/MNH/boundaries.f90 @@ -19,7 +19,7 @@ INTERFACE PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS, & PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS, & - PRHODJ, & + PRHODJ,PRHODREF, & PUT,PVT,PWT,PTHT,PTKET,PRT,PSVT,PSRCT ) ! REAL, INTENT(IN) :: PTSTEP ! time step dt @@ -51,6 +51,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRS ,PLBYSVS ! in x and y-di ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian * dry density of ! the reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT,PTHT,PTKET,PSRCT REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT @@ -71,7 +72,7 @@ END MODULE MODI_BOUNDARIES PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS, & PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS, & - PRHODJ, & + PRHODJ,PRHODREF, & PUT,PVT,PWT,PTHT,PTKET,PRT,PSVT,PSRCT ) ! #################################################################### ! @@ -173,7 +174,8 @@ END MODULE MODI_BOUNDARIES !! Redelsperger & Pianezze : 08/2015 : add XPOND coefficient !! Modification 01/2016 (JP Pinty) Add LIMA that is LBC for CCN and IFN !! Modification 18/07/17 (Vionnet) Add blowing snow variables -!! Modification 01/2018 (JL Redelsperger) Correction for TKE treatment +!! Modification 01/2018 (JL Redelsperger) Correction for TKE treatment +!! Modification 03/02/2020 (B. Vié) Correction for SV with LIMA !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -195,6 +197,7 @@ USE MODD_BLOWSNOW_n USE MODD_REF_n USE MODD_PARAM_n, ONLY : CELEC,CCLOUD USE MODD_LBC_n, ONLY : XPOND +USE MODD_GRID_n, ONLY : XZZ ! USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, LBOUND, LWARM, LCOLD ! @@ -210,6 +213,8 @@ USE MODI_CH_BOUNDARIES ! USE MODE_ll ! +USE MODI_INIT_AEROSOL_CONCENTRATION +USE MODI_SET_CONC_LIMA ! IMPLICIT NONE ! @@ -248,6 +253,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRS ,PLBYSVS ! in x and y-di ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian * dry density of ! the reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT,PTHT,PTKET,PSRCT REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT @@ -310,6 +316,9 @@ LOGICAL :: GFFTMP ! INTEGER :: JI,JJ ! +REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),SIZE(PSVT,4)) :: ZSVT +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) :: ZRT +! !------------------------------------------------------------------------------- ! !* 1. COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES: @@ -969,7 +978,11 @@ END SELECT END IF ! ! -IF (CCLOUD == 'LIMA' .AND. IMI == 1) THEN +IF (CCLOUD == 'LIMA' .AND. IMI == 1 .AND. CPROGRAM=='MESONH') THEN + + ZSVT=PSVT + ZRT=PRT + IF (GFIRSTCALLLIMA) THEN ALLOCATE(GLIMABOUNDARY(NSV_LIMA)) GFIRSTCALLLIMA = .FALSE. @@ -981,23 +994,53 @@ IF (CCLOUD == 'LIMA' .AND. IMI == 1) THEN IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1) = GCHTMP ENDDO - ENDIF + ENDIF + CALL INIT_AEROSOL_CONCENTRATION(PRHODREF,ZSVT,XZZ) + DO JSV=NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1 ! LBC for CCN + IF (GLIMABOUNDARY(JSV-NSV_LIMA_CCN_FREE+1)) THEN + PSVT(IIB-1,:,:,JSV)=ZSVT(IIB-1,:,:,JSV) + PSVT(IIE+1,:,:,JSV)=ZSVT(IIE+1,:,:,JSV) + PSVT(:,IJB-1,:,JSV)=ZSVT(:,IJB-1,:,JSV) + PSVT(:,IJE+1,:,JSV)=ZSVT(:,IJE+1,:,JSV) + ENDIF + END DO + DO JSV=NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 ! LBC for IFN + IF (GLIMABOUNDARY(JSV-NSV_LIMA_IFN_FREE+1)) THEN + PSVT(IIB-1,:,:,JSV)=ZSVT(IIB-1,:,:,JSV) + PSVT(IIE+1,:,:,JSV)=ZSVT(IIE+1,:,:,JSV) + PSVT(:,IJB-1,:,JSV)=ZSVT(:,IJB-1,:,JSV) + PSVT(:,IJE+1,:,JSV)=ZSVT(:,IJE+1,:,JSV) + ENDIF + END DO - DO JSV=NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1 ! LBC for CCN from MACC - IF (GLIMABOUNDARY(JSV-NSV_LIMA_CCN_FREE+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO - DO JSV=NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 ! LBC for IFN from MACC - IF (GLIMABOUNDARY(JSV-NSV_LIMA_IFN_FREE+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF + CALL SET_CONC_LIMA('NONE',PRHODREF,ZRT,ZSVT) + IF (NSV_LIMA_NC.GE.1) THEN + IF (GLIMABOUNDARY(NSV_LIMA_NC)) THEN + PSVT(IIB-1,:,:,NSV_LIMA_NC)=ZSVT(IIB-1,:,:,NSV_LIMA_NC) ! cloud + PSVT(IIE+1,:,:,NSV_LIMA_NC)=ZSVT(IIE+1,:,:,NSV_LIMA_NC) + PSVT(:,IJB-1,:,NSV_LIMA_NC)=ZSVT(:,IJB-1,:,NSV_LIMA_NC) + PSVT(:,IJE+1,:,NSV_LIMA_NC)=ZSVT(:,IJE+1,:,NSV_LIMA_NC) + ENDIF + ENDIF + IF (NSV_LIMA_NR.GE.1) THEN + IF (GLIMABOUNDARY(NSV_LIMA_NR)) THEN + PSVT(IIB-1,:,:,NSV_LIMA_NR)=ZSVT(IIB-1,:,:,NSV_LIMA_NR) ! rain + PSVT(IIE+1,:,:,NSV_LIMA_NR)=ZSVT(IIE+1,:,:,NSV_LIMA_NR) + PSVT(:,IJB-1,:,NSV_LIMA_NR)=ZSVT(:,IJB-1,:,NSV_LIMA_NR) + PSVT(:,IJE+1,:,NSV_LIMA_NR)=ZSVT(:,IJE+1,:,NSV_LIMA_NR) + ENDIF + ENDIF + IF (NSV_LIMA_NI.GE.1) THEN + IF (GLIMABOUNDARY(NSV_LIMA_NI)) THEN + PSVT(IIB-1,:,:,NSV_LIMA_NI)=ZSVT(IIB-1,:,:,NSV_LIMA_NI) ! ice + PSVT(IIE+1,:,:,NSV_LIMA_NI)=ZSVT(IIE+1,:,:,NSV_LIMA_NI) + PSVT(:,IJB-1,:,NSV_LIMA_NI)=ZSVT(:,IJB-1,:,NSV_LIMA_NI) + PSVT(:,IJE+1,:,NSV_LIMA_NI)=ZSVT(:,IJE+1,:,NSV_LIMA_NI) + ENDIF + END IF + +END IF +! ! IF (LUSECHEM .AND. IMI == 1) THEN IF (GFIRSTCALL1) THEN diff --git a/src/MNH/deallocate_model1.f90 b/src/MNH/deallocate_model1.f90 index dc3107d54dd4857b1857c4a2692638d4e9a4c3c8..113521daf887dcd7e673028de0a58f81dc1aa64b 100644 --- a/src/MNH/deallocate_model1.f90 +++ b/src/MNH/deallocate_model1.f90 @@ -455,9 +455,6 @@ IF ( ALLOCATED(XUFRC) .AND. KCALL == 4 ) THEN DEALLOCATE(XGYTHFRC) DEALLOCATE(XPGROUNDFRC) END IF -IF ( ALLOCATED(XWTFRC) .AND. KCALL == 4 ) THEN - DEALLOCATE(XWTFRC) -END IF ! !* 12. Module MODD_ICE_CONC$n ! diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index 38c7bba55cb86e02d0f9edc6ad19b085f384dacf..934b3447a3e135da7947c7fb823d1907f91b83fa 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -229,6 +229,7 @@ END MODULE MODI_DEFAULT_DESFM_n !! 01/2019 (R. Honnert) add reduction of the mass-flux surface closure with the resolution !! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! 05/2019 F.Brient add tracer emission from the top of the boundary-layer +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree !! !------------------------------------------------------------------------------- ! @@ -272,7 +273,8 @@ USE MODD_SALT USE MODD_PASPOL USE MODD_CONDSAMP USE MODD_MEAN_FIELD -USE MODD_DRAGTREE +USE MODD_DRAGTREE_n +USE MODD_DRAGBLDG_n ! ! USE MODD_PARAM_LIMA, ONLY : LCOLD, LNUCL, LSEDI, LHHONI, LSNOW, LHAIL, LMEYERS,& @@ -544,6 +546,12 @@ VSIGQSAT = 0.02 LDRAGTREE = .FALSE. LDEPOTREE = .FALSE. XVDEPOTREE = 0.02 ! 2 cm/s +!------------------------------------------------------------------------------ +! +!* 10c. SET DEFAULT VALUES FOR MODD_DRAGB +! ---------------------------------- +! +LDRAGBLDG = .FALSE. ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/drag_bld.f90 b/src/MNH/drag_bld.f90 new file mode 100644 index 0000000000000000000000000000000000000000..02de3d18214954b08f6539e041d493dd5dcaeb90 --- /dev/null +++ b/src/MNH/drag_bld.f90 @@ -0,0 +1,236 @@ +!MNH_LIC Copyright 2019-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_DRAG_BLD + ! ####################### + ! + INTERFACE + ! + SUBROUTINE DRAG_BLD(PTSTEP, PUT, PVT, PTKET, PRHODJ, PZZ, PRUS, PRVS, PRTKES ) + ! + REAL, INTENT(IN) :: PTSTEP ! Time step + REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t + ! + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian + REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) + ! + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke + ! + END SUBROUTINE DRAG_BLD + + END INTERFACE + +END MODULE MODI_DRAG_BLD +! +! ################################################################### +SUBROUTINE DRAG_BLD(PTSTEP, PUT, PVT, PTKET, PRHODJ, PZZ, PRUS, PRVS, PRTKES ) + ! ################################################################### + ! + !!**** *DRAG_BLD_n * - + !! + !! PURPOSE + !! ------- + ! + ! Drag force due to buildings + ! + !!** METHOD + !! ------ + !! + !! REFERENCE + !! --------- + !! + !! AUTHOR + !! ------ + !! R. Schoetter + !! + !! MODIFICATIONS + !! ------------- + !! Original 09/2019 + !!--------------------------------------------------------------- + ! + !* 0. DECLARATIONS + ! ------------ + ! + USE MODD_CONF + USE MODD_CST + USE MODD_DRAGBLDG_n + USE MODD_DYN + USE MODD_DYN_n + USE MODD_GROUND_PAR + USE MODD_PGDFIELDS + USE MODD_NSV + USE MODI_MNHGET_SURF_PARAM_n + USE MODI_SHUMAN + ! + IMPLICIT NONE + ! + !* 0.1 Declarations of dummy arguments : + ! + REAL, INTENT(IN) :: PTSTEP ! Time step + REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t + ! + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian + REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) + ! + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke + ! + !* 0.2 Declarations of local variables : + ! + INTEGER :: IIU,IJU,IKU,IKV ! array size along the k direction + INTEGER :: JI, JJ, JK ! loop index + INTEGER :: INFO_ll + ! + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & + ZWORK1, ZWORK2, ZWORK3, ZUT_SCAL, ZVT_SCAL, & + ZUS, ZVS, ZTKES, ZTKET + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & + ZCDRAG, ZDENSITY + ! + REAL, DIMENSION(:,:), ALLOCATABLE :: ZH_BUILD_PGD + REAL, DIMENSION(:,:), ALLOCATABLE :: ZWALL_O_HOR_PGD + REAL, DIMENSION(:,:), ALLOCATABLE :: ZFRAC_TOWN_PGD + ! + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2)) :: & + ZH_BLD,ZF_BLD ! Building height, frontal density + REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZT,ZEXN,ZLV,ZCPH + ! + !* 0.3 Initialization + ! + IIU = SIZE(PUT,1) + IJU = SIZE(PUT,2) + IKU = SIZE(PUT,3) + ! + ZUS (:,:,:) = 0.0 + ZVS (:,:,:) = 0.0 + ZTKES (:,:,:) = 0.0 + ! + ZH_BLD (:,:) = 0. + ZF_BLD (:,:) = 0. + ! + ZCDRAG (:,:,:) = 0. + ZDENSITY (:,:,:) = 0. + ! + ALLOCATE(ZFRAC_TOWN_PGD(IIU,IJU)) + ALLOCATE(ZH_BUILD_PGD(IIU,IJU)) + ALLOCATE(ZWALL_O_HOR_PGD(IIU,IJU)) + ! + ZFRAC_TOWN_PGD (:,:) = XUNDEF + ZH_BUILD_PGD (:,:) = XUNDEF + ZWALL_O_HOR_PGD (:,:) = XUNDEF + ! + CALL MNHGET_SURF_PARAM_n( PTOWN=ZFRAC_TOWN_PGD, & + PBUILD_HEIGHT=ZH_BUILD_PGD, & + PWALL_O_HOR=ZWALL_O_HOR_PGD ) + ! + ! FIXME: Some values of ZFRAC_TOWN_PGD are 999. This is a bit strange since the + ! TOWN fraction should be defined everywhere. + ! It is set to 0.0 provisionally + ! + WHERE(ZFRAC_TOWN_PGD(:,:).GT.1.0) ZFRAC_TOWN_PGD(:,:)=0.0 + ! + ! The values for wall density and building height are set to 0.0 where the Town fraction is 0.0 + ! For the wall density this would not be necessary since it will be multiplied by the town + ! fraction anyway. + ! + WHERE(ZFRAC_TOWN_PGD(:,:).EQ.0.0) + ZWALL_O_HOR_PGD(:,:) = 0.0 + ZH_BUILD_PGD(:,:) = 0.0 + ENDWHERE + ! + ! For buildings, the frontal wall area density is calculated [m^2(walls facing the wind)/m^2] + ! The division by PI means that cylindrical buildings are assumed (circle perimeter = PI*D, circle frontal area = D) + ! [m^2(walls facing the wind)/m^2]=[m^2(wall)/m^2(town)*m^2(town)/m^2/PI] + ! It will be assumed that the frontal wall area is equally distributed with height (all buildings same height) + ! + ZH_BLD(:,:) = ZH_BUILD_PGD(:,:) + ZF_BLD(:,:) = ZFRAC_TOWN_PGD(:,:)*ZWALL_O_HOR_PGD(:,:)/XPI + ! + DEALLOCATE(ZFRAC_TOWN_PGD) + DEALLOCATE(ZH_BUILD_PGD) + DEALLOCATE(ZWALL_O_HOR_PGD) + ! + !------------------------------------------------------------------------------- + ! + ! + !* 1. COMPUTES THE TRUE VELOCITY COMPONENTS + ! ------------------------------------- + ! + ZUT_SCAL(:,:,:) = MXF(PUT(:,:,:)) + ZVT_SCAL(:,:,:) = MYF(PVT(:,:,:)) + ZTKET(:,:,:) = PTKET(:,:,:) + !------------------------------------------------------------------------------- + ! + !* 1. Computations of wind tendency due to canopy drag + ! ------------------------------------------------ + ! + ! Ext = - Cdrag * u- * u- * Sv tree canopy drag + ! - u'w'(ground) * Sh horizontal surfaces (ground) + ! ------------------------------ + ! + DO JJ=2,(IJU-1) + DO JI=2,(IIU-1) + ! + ! Set density and drag coefficient for buildings + ! + IF (ZH_BLD(JI,JJ) /= 0) THEN + ! + DO JK=2,(IKU-1) + ! + IF ( (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) .LT. ZH_BLD(JI,JJ) ) THEN + ! + ! FIXME: Check literature values for the drag coefficient here + ! + ZCDRAG(JI,JJ,JK) = 0.2 + ! + ! A uniform distribution of building heights is assumed + ! + ZDENSITY(JI,JJ,JK) = ZF_BLD(JI,JJ) / ZH_BLD(JI,JJ) + ! + ENDIF + ! + ENDDO + ENDIF + ! + ENDDO + ENDDO + ! + !* 1.2 Drag force by wall surfaces + ! --------------------------- + ! + !* drag force by vertical surfaces + ! + ZUS(:,:,:) = PUT(:,:,:)/( 1.0 + MXM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) + ! + ZVS(:,:,:) = PVT(:,:,:)/( 1.0 + MYM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) + ! + PRUS(:,:,:) = PRUS(:,:,:) + (ZUS(:,:,:)-PUT(:,:,:)) * MXM(PRHODJ(:,:,:)) / PTSTEP + ! + PRVS(:,:,:) = PRVS(:,:,:) + (ZVS(:,:,:)-PVT(:,:,:)) * MYM(PRHODJ(:,:,:)) / PTSTEP + ! + !* 3. Computations of TKE tendency due to canopy drag + ! ------------------------------------------------ + !* 3.1 Creation of TKE by wake + ! ----------------------- + ! + ! from Kanda and Hino (1994) + ! + ! Ext = + Cd * u+^3 * Sv/Vair vertical surfaces or trees + ! + ! with Vair = Vair/Vtot * Vtot = (Vair/Vtot) * Stot * Dz + ! and Sv/Vair = (Sv/Stot) * Stot/Vair = (Sv/Stot) / (Vair/Vtot) / Dz + ! + ZTKES(:,:,:) = ZTKET(:,:,:) + & + PTSTEP * ZCDRAG(:,:,:) * ZDENSITY(:,:,:) * (SQRT( ZUT_SCAL(:,:,:)**2 + ZVT_SCAL(:,:,:)**2 ))**3 + ! + PRTKES(:,:,:) = PRTKES(:,:,:) + (ZTKES(:,:,:)-ZTKET(:,:,:))*PRHODJ(:,:,:)/PTSTEP + ! +END SUBROUTINE DRAG_BLD diff --git a/src/MNH/drag_veg.f90 b/src/MNH/drag_veg.f90 index ce157a15406a436c180f33162b87687868ab56a1..f1b092dab469552bb82462873fe49ed1d8da65cf 100644 --- a/src/MNH/drag_veg.f90 +++ b/src/MNH/drag_veg.f90 @@ -1,305 +1,317 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2009-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. +!--------------------------------------------------------------- ! ####################### - MODULE MODI_DRAG_VEG + MODULE MODI_DRAG_VEG ! ####################### ! INTERFACE -SUBROUTINE DRAG_VEG(PTSTEP,PUT,PVT,PTKET,ODEPOTREE, PVDEPOTREE, & - HCLOUD,PPABST,PTHT,PRT,PSVT, & - PRHODJ,PZZ,PRUS, PRVS, PRTKES, & - PTHS,PRRS,PSVS) -! -REAL, INTENT(IN) :: PTSTEP ! Time step -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t -LOGICAL, INTENT(IN) :: ODEPOTREE ! Droplet deposition on tree -REAL, INTENT(IN) :: PVDEPOTREE! Velocity deposition on tree -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -! - -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS -! -! - -END SUBROUTINE DRAG_VEG + SUBROUTINE DRAG_VEG(PTSTEP,PUT,PVT,PTKET,ODEPOTREE, PVDEPOTREE, & + HCLOUD,PPABST,PTHT,PRT,PSVT, & + PRHODJ,PZZ,PRUS, PRVS, PRTKES, & + PTHS,PRRS,PSVS) +! + REAL, INTENT(IN) :: PTSTEP ! Time step + REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t + LOGICAL, INTENT(IN) :: ODEPOTREE ! Droplet deposition on tree + REAL, INTENT(IN) :: PVDEPOTREE! Velocity deposition on tree + CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! at t + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! at t + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! at t + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! at t + ! + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian + REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) + ! + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke + REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS + REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS + ! + END SUBROUTINE DRAG_VEG -END INTERFACE + END INTERFACE END MODULE MODI_DRAG_VEG ! ! ################################################################### SUBROUTINE DRAG_VEG(PTSTEP,PUT,PVT,PTKET,ODEPOTREE, PVDEPOTREE, & - HCLOUD,PPABST,PTHT,PRT,PSVT, & - PRHODJ,PZZ,PRUS, PRVS, PRTKES, & - PTHS,PRRS,PSVS) -! ################################################################### -! -!!**** *DRAG_VEG_n * - -!! -!! PURPOSE -!! ------- -! -!!** METHOD -!! ------ -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! P. Aumond -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/2009 -!! C.Lac 07/2011 : Add budgets -!! S. Donier 06/2015 : bug surface aerosols -!! C.Lac 07/2016 : Add droplet deposition -!! C.Lac 10/2017 : Correction on deposition -!!--------------------------------------------------------------- -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CONF -USE MODD_CST -USE MODD_DYN -USE MODD_DYN_n -USE MODD_VEG_n -USE MODD_BUDGET -USE MODD_PARAM_C2R2 -USE MODD_NSV - -! -USE MODI_SHUMAN -USE MODD_PGDFIELDS -USE MODD_GROUND_PAR -USE MODI_MNHGET_SURF_PARAM_n -USE MODI_BUDGET + HCLOUD,PPABST,PTHT,PRT,PSVT, & + PRHODJ,PZZ,PRUS, PRVS, PRTKES, & + PTHS,PRRS,PSVS) + ! ################################################################### + ! + !!**** *DRAG_VEG_n * - + !! + !! PURPOSE + !! ------- + ! + !!** METHOD + !! ------ + !! + !! REFERENCE + !! --------- + !! + !! + !! AUTHOR + !! ------ + !! P. Aumond + !! + !! MODIFICATIONS + !! ------------- + !! Original 07/2009 + !! C.Lac 07/2011 : Add budgets + !! S. Donier 06/2015 : bug surface aerosols + !! C.Lac 07/2016 : Add droplet deposition + !! C.Lac 10/2017 : Correction on deposition + !! C.Lac 11/2019 : Correction in the drag formula and application to building in addition to tree + !! C.Lac 02/2020 : Correction missing condition for budget on RC and SV + !!--------------------------------------------------------------- + ! + ! + !* 0. DECLARATIONS + ! ------------ + ! + USE MODD_CONF + USE MODD_CST + USE MODD_DYN + USE MODD_DYN_n + USE MODD_VEG_n + USE MODD_BUDGET + USE MODD_PARAM_C2R2 + USE MODD_NSV -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -REAL, INTENT(IN) :: PTSTEP ! Time step -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t -LOGICAL, INTENT(IN) :: ODEPOTREE ! Droplet deposition on tree -REAL, INTENT(IN) :: PVDEPOTREE! Velocity deposition on tree -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -! - -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS -! -! -!* 0.2 Declarations of local variables : -! -INTEGER :: IIU,IJU,IKU,IKV ! array size along the k direction -INTEGER :: JI, JJ, JK ! loop index -! -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZH_TREE_PGD ! surface cover types -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLAI_PGD ! surface cover types -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & - ZWORK1, ZWORK2, ZWORK3, ZUT, ZVT, & - ZUS, ZVS, ZTKES, ZTKET -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & - ZCDRAG, ZDENSITY -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2)) :: & - ZVH,ZLAI ! LAI, Vegetation height -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZT,ZEXN,ZLV,ZCPH -LOGICAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) & - :: GDEP -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZWDEPR,ZWDEPS - -! -! -IIU = SIZE(PUT,1) -IJU = SIZE(PUT,2) -IKU = SIZE(PUT,3) -! -!* 0.3 Initialisation de kelkes variables -! -ZVH(:,:)=0. -ZLAI(:,:)=0. -ZCDRAG(:,:,:)=0. -ZDENSITY(:,:,:)=0. -! -ALLOCATE(ZH_TREE_PGD(IIU,IJU)) -ALLOCATE(ZLAI_PGD(IIU,IJU)) -! -CALL MNHGET_SURF_PARAM_n(PH_TREE=ZH_TREE_PGD,PLAI_TREE=ZLAI_PGD) -! -ZVH(:,:)=ZH_TREE_PGD(:,:) -ZLAI(:,:)=ZLAI_PGD(:,:) -! -DEALLOCATE(ZH_TREE_PGD) -DEALLOCATE(ZLAI_PGD) -! -!------------------------------------------------------------------------------- -! -! -!* 1. COMPUTES THE TRUE VELOCITY COMPONENTS -! ------------------------------------- -! -ZUT(:,:,:) = PUT(:,:,:) -ZVT(:,:,:) = PVT(:,:,:) -ZTKET(:,:,:) = PTKET(:,:,:) -!------------------------------------------------------------------------------- -! -!* 1. Computations of wind tendency due to canopy drag -! ------------------------------------------------ -! -! -! -! Ext = - Cdrag * u- * u- * Sv tree canopy drag -! - u'w'(ground) * Sh horizontal surfaces (ground) -! -!* 1.1 Drag coefficient by vegetation (Patton et al 2001) -! ------------------------------ -! -GDEP(:,:,:) = .FALSE. -DO JJ=2,(IJU-1) - DO JI=2,(IIU-1) - IF (ZVH(JI,JJ) /= 0) THEN - DO JK=2,(IKU-1) - IF ((ZVH(JI,JJ)+PZZ(JI,JJ,2))<PZZ(JI,JJ,JK)) EXIT - IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO')) THEN - IF ((PRRS(JI,JJ,JK,2) >0.) .AND. (PSVS(JI,JJ,JK,NSV_C2R2BEG+1) >0.)) & - GDEP(JI,JJ,JK) = .TRUE. - ELSE IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'REVE') THEN - IF (PRRS(JI,JJ,JK,2) >0.) GDEP(JI,JJ,JK) = .TRUE. - END IF - ZCDRAG(JI,JJ,JK) = 0.2 !0.075 - ZDENSITY(JI,JJ,JK) = MAX((4 * (ZLAI(JI,JJ) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (ZVH(JI,JJ)-(PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)))/& - ZVH(JI,JJ)**3)-& - (0.30*((ZLAI(JI,JJ) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) /& - (ZVH(JI,JJ)**3))-ZLAI(JI,JJ))))/& - ZVH(JI,JJ), 0.) + ! + USE MODI_SHUMAN + USE MODD_PGDFIELDS + USE MODD_GROUND_PAR + USE MODI_MNHGET_SURF_PARAM_n + USE MODI_BUDGET - - END DO - END IF - END DO -END DO -! To exclude the first vertical level already dealt in rain_ice or rain_c2r2_khko -GDEP(:,:,2) = .FALSE. -! -!* 1.2 Drag force by wall surfaces -! --------------------------- -! -!* drag force by vertical surfaces -! -ZUS(:,:,:)= ZUT(:,:,:)/(1 + ZCDRAG(:,:,:)* ZDENSITY(:,:,:)*PTSTEP & - *SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2)) -! -ZVS(:,:,:)= ZVT(:,:,:)/(1 + ZCDRAG(:,:,:)* ZDENSITY(:,:,:)*PTSTEP & - *SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2)) -! -PRUS(:,:,:)=PRUS(:,:,:)+((ZUS(:,:,:)-ZUT(:,:,:))*PRHODJ(:,:,:))/PTSTEP -! -PRVS(:,:,:)=PRVS(:,:,:)+((ZVS(:,:,:)-ZVT(:,:,:))*PRHODJ(:,:,:))/PTSTEP -! -IF (ODEPOTREE) THEN - ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) - ZWDEPR(:,:,:)= 0. - ZWDEPS(:,:,:)= 0. - WHERE (GDEP) - ZWDEPR(:,:,:)= PVDEPOTREE * PRT(:,:,:,2) * PRHODJ(:,:,:) - END WHERE - IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO') .OR. (HCLOUD=='LIMA')) THEN - WHERE (GDEP) - ZWDEPS(:,:,:)= PVDEPOTREE * PSVT(:,:,:,NSV_C2R2BEG+1) * PRHODJ(:,:,:) - END WHERE - END IF + ! + IMPLICIT NONE + ! + !* 0.1 Declarations of dummy arguments : + ! + REAL, INTENT(IN) :: PTSTEP ! Time step + REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t + LOGICAL, INTENT(IN) :: ODEPOTREE ! Droplet deposition on tree + REAL, INTENT(IN) :: PVDEPOTREE! Velocity deposition on tree + CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! at t + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! at t + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! at t + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! at t + ! + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian + REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) + ! + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke + REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS + REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS + ! + !* 0.2 Declarations of local variables : + ! + INTEGER :: IIU,IJU,IKU,IKV ! array size along the k direction + INTEGER :: JI, JJ, JK ! loop index + ! + REAL, DIMENSION(:,:), ALLOCATABLE :: ZH_TREE_PGD ! surface cover types + REAL, DIMENSION(:,:), ALLOCATABLE :: ZLAI_PGD ! surface cover types + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & + ZWORK1, ZWORK2, ZWORK3, ZUT_SCAL, ZVT_SCAL, & + ZUS, ZVS, ZTKES, ZTKET + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & + ZCDRAG, ZDENSITY + ! + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2)) :: & + ZH,ZLAI ! LAI, Vegetation height + REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZT,ZEXN,ZLV,ZCPH + LOGICAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) & + :: GDEP + REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZWDEPR,ZWDEPS + ! + !* 0.3 Initialisation de kelkes variables + ! + IIU = SIZE(PUT,1) + IJU = SIZE(PUT,2) + IKU = SIZE(PUT,3) + ! + ZUS (:,:,:) = 0.0 + ZVS (:,:,:) = 0.0 + ZTKES (:,:,:) = 0.0 + ! + ZH (:,:) = 0. + ZLAI (:,:) = 0. + ! + ZCDRAG (:,:,:) = 0. + ZDENSITY (:,:,:) = 0. + ! + ALLOCATE(ZH_TREE_PGD(IIU,IJU)) + ALLOCATE(ZLAI_PGD(IIU,IJU)) + ! + ZH_TREE_PGD (:,:) = XUNDEF + ZLAI_PGD (:,:) = XUNDEF + ! + CALL MNHGET_SURF_PARAM_n( PH_TREE = ZH_TREE_PGD, PLAI_TREE = ZLAI_PGD ) + ! + ZH (:,:) = ZH_TREE_PGD(:,:) + ZLAI(:,:) = ZLAI_PGD(:,:) + ! + WHERE ( ZH (:,:).GT.998.0 ) ZH (:,:) = 0.0 + WHERE ( ZLAI (:,:).GT.998.0 ) ZLAI (:,:) = 0.0 + ! + DEALLOCATE(ZH_TREE_PGD) + DEALLOCATE(ZLAI_PGD) + ! + !------------------------------------------------------------------------------- + ! + ! + !* 1. COMPUTES THE TRUE VELOCITY COMPONENTS + ! ------------------------------------- + ! + ZUT_SCAL(:,:,:) = MXF(PUT(:,:,:)) + ZVT_SCAL(:,:,:) = MYF(PVT(:,:,:)) + ZTKET(:,:,:) = PTKET(:,:,:) + !------------------------------------------------------------------------------- + ! + !* 1. Computations of wind tendency due to canopy drag + ! ------------------------------------------------ + ! + ! + ! + ! Ext = - Cdrag * u- * u- * Sv tree canopy drag + ! - u'w'(ground) * Sh horizontal surfaces (ground) + ! + !* 1.1 Drag coefficient by vegetation (Patton et al 2001) + ! ------------------------------ + ! + GDEP(:,:,:) = .FALSE. + ! DO JJ=2,(IJU-1) - DO JI=2,(IIU-1) - DO JK=2,(IKU-2) - IF (GDEP(JI,JJ,JK)) THEN - PRRS(JI,JJ,JK,2) = PRRS(JI,JJ,JK,2) + (ZWDEPR(JI,JJ,JK+1)-ZWDEPR(JI,JJ,JK))/ & - (PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) - IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO').OR. (HCLOUD=='LIMA')) THEN - PSVS(JI,JJ,JK,NSV_C2R2BEG+1) = PSVS(JI,JJ,JK,NSV_C2R2BEG+1) + & - (ZWDEPS(JI,JJ,JK+1)-ZWDEPS(JI,JJ,JK))/(PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) - END IF - END IF + DO JI=2,(IIU-1) + ! + ! Set density and drag coefficient for vegetation + ! + IF (ZH(JI,JJ) /= 0) THEN + ! + DO JK=2,(IKU-1) + ! + IF ( (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) .LT. ZH(JI,JJ) ) THEN + ! + IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO')) THEN + IF ((PRRS(JI,JJ,JK,2) >0.) .AND. (PSVS(JI,JJ,JK,NSV_C2R2BEG+1) >0.)) & + GDEP(JI,JJ,JK) = .TRUE. + ELSE IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'REVE') THEN + IF (PRRS(JI,JJ,JK,2) >0.) GDEP(JI,JJ,JK) = .TRUE. + ENDIF + ! + ZCDRAG(JI,JJ,JK) = 0.2 !0.075 + ZDENSITY(JI,JJ,JK) = MAX((4 * (ZLAI(JI,JJ) *& + (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& + (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& + (ZH(JI,JJ)-(PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)))/& + ZH(JI,JJ)**3)-& + (0.30*((ZLAI(JI,JJ) *& + (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& + (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& + (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) /& + (ZH(JI,JJ)**3))-ZLAI(JI,JJ))))/& + ZH(JI,JJ), 0.) + ! + ENDIF + ! + ENDDO + ENDIF + ! + ENDDO + ENDDO + ! + ! To exclude the first vertical level already dealt in rain_ice or rain_c2r2_khko + GDEP(:,:,2) = .FALSE. + ! + !* 1.2 Drag force by wall surfaces + ! --------------------------- + ! + !* drag force by vertical surfaces + ! + ZUS(:,:,:) = PUT(:,:,:)/( 1.0 + MXM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) + ! + ZVS(:,:,:) = PVT(:,:,:)/( 1.0 + MYM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) + ! + PRUS(:,:,:) = PRUS(:,:,:) + (ZUS(:,:,:)-PUT(:,:,:)) * MXM(PRHODJ(:,:,:)) / PTSTEP + ! + PRVS(:,:,:) = PRVS(:,:,:) + (ZVS(:,:,:)-PVT(:,:,:)) * MYM(PRHODJ(:,:,:)) / PTSTEP + ! + IF (ODEPOTREE) THEN + ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) + ZWDEPR(:,:,:)= 0. + ZWDEPS(:,:,:)= 0. + WHERE (GDEP) + ZWDEPR(:,:,:)= PVDEPOTREE * PRT(:,:,:,2) * PRHODJ(:,:,:) + END WHERE + IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO') .OR. (HCLOUD=='LIMA')) THEN + WHERE (GDEP) + ZWDEPS(:,:,:)= PVDEPOTREE * PSVT(:,:,:,NSV_C2R2BEG+1) * PRHODJ(:,:,:) + END WHERE + END IF + DO JJ=2,(IJU-1) + DO JI=2,(IIU-1) + DO JK=2,(IKU-2) + IF (GDEP(JI,JJ,JK)) THEN + PRRS(JI,JJ,JK,2) = PRRS(JI,JJ,JK,2) + (ZWDEPR(JI,JJ,JK+1)-ZWDEPR(JI,JJ,JK))/ & + (PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) + IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO').OR. (HCLOUD=='LIMA')) THEN + PSVS(JI,JJ,JK,NSV_C2R2BEG+1) = PSVS(JI,JJ,JK,NSV_C2R2BEG+1) + & + (ZWDEPS(JI,JJ,JK+1)-ZWDEPS(JI,JJ,JK))/(PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) + END IF + END IF + END DO + END DO END DO - END DO - END DO -! -! -END IF -! -IF (LBUDGET_U) CALL BUDGET (PRUS,1,'DRAG_BU_RU') -IF (LBUDGET_V) CALL BUDGET (PRVS,2,'DRAG_BU_RV') -IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7,'DEPOTR_BU_RRC') -IF (LBUDGET_SV) CALL BUDGET (PSVS(:,:,:,NSV_C2R2BEG+1),14+(NSV_C2R2BEG-1),'DEPOTR_BU_RSV') -! -! -!* 3. Computations of TKE tendency due to canopy drag -! ------------------------------------------------ - -!* 3.1 Creation of TKE by wake -! ----------------------- -! -! from Kanda and Hino (1994) -! -! Ext = + Cd * u+^3 * Sv/Vair vertical surfaces or trees -! Ext = - Cd * e * u * Sv trees Destruction of TKE due to -! small-scale motions forced by leaves from Kanda and Hino (1994) -! -! with Vair = Vair/Vtot * Vtot = (Vair/Vtot) * Stot * Dz -! and Sv/Vair = (Sv/Stot) * Stot/Vair = (Sv/Stot) / (Vair/Vtot) / Dz -! -!ZTKES(:,:,:)= (ZTKET(:,:,:) + (ZCDRAG(:,:,:)* ZDENSITY(:,:,:) & -! *(SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2))**3)) /& -! (1.+(2.*ZCDRAG(:,:,:)* ZDENSITY(:,:,:)*SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2))) -ZTKES(:,:,:)= (ZTKET(:,:,:) + (ZCDRAG(:,:,:)* ZDENSITY(:,:,:) & - *(SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2))**3))*PTSTEP /& - (1.+PTSTEP*ZCDRAG(:,:,:)* ZDENSITY(:,:,:)*SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2)) -! -PRTKES(:,:,:)=PRTKES(:,:,:)+((ZTKES(:,:,:)-ZTKET(:,:,:))*PRHODJ(:,:,:)/PTSTEP) -! -IF (LBUDGET_TKE) CALL BUDGET (PRTKES(:,:,:),5,'DRAG_BU_RTKE') -! + ! + END IF + ! + IF (LBUDGET_U) CALL BUDGET (PRUS,1,'DRAG_BU_RU') + IF (LBUDGET_V) CALL BUDGET (PRVS,2,'DRAG_BU_RV') + IF (ODEPOTREE) THEN + IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7,'DEPOTR_BU_RRC') + IF (LBUDGET_SV) CALL BUDGET (PSVS(:,:,:,NSV_C2R2BEG+1),14+(NSV_C2R2BEG-1),'DEPOTR_BU_RSV') + END IF + ! + !* 3. Computations of TKE tendency due to canopy drag + ! ------------------------------------------------ + !* 3.1 Creation of TKE by wake + ! ----------------------- + ! + ! from Kanda and Hino (1994) + ! + ! Ext = + Cd * u+^3 * Sv/Vair vertical surfaces or trees + ! Ext = - Cd * e * u * Sv trees Destruction of TKE due to + ! small-scale motions forced by leaves from Kanda and Hino (1994) + ! + ! with Vair = Vair/Vtot * Vtot = (Vair/Vtot) * Stot * Dz + ! and Sv/Vair = (Sv/Stot) * Stot/Vair = (Sv/Stot) / (Vair/Vtot) / Dz + ! + ZTKES(:,:,:)= ( ZTKET(:,:,:) + PTSTEP * ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * (SQRT( ZUT_SCAL(:,:,:)**2 + ZVT_SCAL(:,:,:)**2 ))**3 ) / & + ( 1. + PTSTEP * ZCDRAG(:,:,:) * ZDENSITY(:,:,:) * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2)) + ! + PRTKES(:,:,:) = PRTKES(:,:,:) + (ZTKES(:,:,:)-ZTKET(:,:,:))*PRHODJ(:,:,:)/PTSTEP + ! + IF (LBUDGET_TKE) CALL BUDGET (PRTKES(:,:,:),5,'DRAG_BU_RTKE') + ! END SUBROUTINE DRAG_VEG diff --git a/src/MNH/forcing.f90 b/src/MNH/forcing.f90 index 3163cb1ae95584c7e7a318bf245560f5d3229ab1..f8073f8ddddfc0fdfdcf5f786de660c485daebe3 100644 --- a/src/MNH/forcing.f90 +++ b/src/MNH/forcing.f90 @@ -11,7 +11,7 @@ INTERFACE ! SUBROUTINE FORCING ( PTSTEP, OUSERV, PRHODJ, PCORIOZ, & PZHAT, PZZ, TPDTCUR, & - PUFRC_PAST, PVFRC_PAST, & + PUFRC_PAST, PVFRC_PAST, PWTFRC, & PUT, PVT, PWT, PTHT, PTKET, PRT, PSVT, & PRUS, PRVS, PRWS, PRTHS, PRTKES, PRRS, PRSVS, & KMI,PJ) @@ -29,6 +29,8 @@ TYPE (DATE_TIME), INTENT(IN) :: TPDTCUR ! current date and time REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUFRC_PAST, PVFRC_PAST ! ! forcing at previous time-step ! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTFRC ! large scale vertical wind +! REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT,PVT,PWT,PTHT,PTKET ! wind, potential temperature and ! TKE at time t @@ -53,7 +55,7 @@ END MODULE MODI_FORCING ! ###################################################################### SUBROUTINE FORCING ( PTSTEP, OUSERV, PRHODJ, PCORIOZ, & PZHAT, PZZ, TPDTCUR, & - PUFRC_PAST, PVFRC_PAST, & + PUFRC_PAST, PVFRC_PAST, PWTFRC, & PUT, PVT, PWT, PTHT, PTKET, PRT, PSVT, & PRUS, PRVS, PRWS, PRTHS, PRTKES, PRRS, PRSVS, & KMI,PJ) @@ -183,6 +185,8 @@ TYPE (DATE_TIME), INTENT(IN) :: TPDTCUR ! current date and time REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUFRC_PAST, PVFRC_PAST ! ! forcing at previous time-step ! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTFRC ! large scale vertical wind +! REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT,PVT,PWT,PTHT,PTKET ! wind, potential temperature and ! TKE at time t @@ -607,7 +611,7 @@ END DO ! ! store large scale w in module to be used later ! in convection scheme -XWTFRC(:,:,:) = ZWF(:,:,:) +PWTFRC(:,:,:) = ZWF(:,:,:) ! !* computes evolution of forcing wind WHERE(PUFRC_PAST==XUNDEF) PUFRC_PAST = ZUF(:,:,:) diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90 index 8774b548f230f23bd8ac2e48bfed340df491a843..1d11087bf9d4c9b9ce3636b148ce7f1d5a786009 100644 --- a/src/MNH/goto_model_wrapper.f90 +++ b/src/MNH/goto_model_wrapper.f90 @@ -15,6 +15,7 @@ ! 02/2018 Q.Libois ECRAD !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! 2017 V.Vionnet blow snow +! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree !----------------------------------------------------------------- MODULE MODI_GOTO_MODEL_WRAPPER @@ -42,6 +43,8 @@ USE MODD_CONF_n USE MODD_CURVCOR_n !USE MODD_DEEP_CONVECTION_n USE MODD_DIM_n +USE MODD_DRAGTREE_n +USE MODD_DRAGBLDG_n USE MODD_DUMMY_GR_FIELD_n USE MODD_DYN_n USE MODD_DYNZD_n @@ -152,6 +155,8 @@ CALL CONF_GOTO_MODEL(KFROM, KTO) CALL CURVCOR_GOTO_MODEL(KFROM, KTO) !CALL DEEP_CONVECTION_GOTO_MODEL(KFROM, KTO) CALL DIM_GOTO_MODEL(KFROM, KTO) +CALL DRAGTREE_GOTO_MODEL(KFROM, KTO) +CALL DRAGBLDG_GOTO_MODEL(KFROM, KTO) CALL DUMMY_GR_FIELD_GOTO_MODEL(KFROM, KTO) CALL DYN_GOTO_MODEL(KFROM, KTO) CALL DYNZD_GOTO_MODEL(KFROM,KTO) diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90 index d89d7227fd120a31677f451e7c38c069c5c8a89d..3e9e2ef8cdd83a6998aa096e98553f5415aa3d7a 100644 --- a/src/MNH/ice_adjust.f90 +++ b/src/MNH/ice_adjust.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-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. @@ -23,7 +23,7 @@ INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO INTEGER, INTENT(IN) :: KRR ! Number of moist variables CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE -CHARACTER(len=4), INTENT(IN) :: HBUNAME ! Name of the budget +CHARACTER(len=*), INTENT(IN) :: HBUNAME ! Name of the budget LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid ! Condensation LOGICAL :: OSIGMAS ! Switch for Sigma_s: @@ -164,7 +164,7 @@ END MODULE MODI_ICE_ADJUST !! or to call it on S variables !! 2016-11 S. Riette: all-or-nothing adjustment now uses condensation !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +! P. Wautelet 24/02/2020: bugfix: corrected budget name (DEPI->CDEPI) for ice_adjust !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -192,7 +192,7 @@ INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO INTEGER, INTENT(IN) :: KRR ! Number of moist variables CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE -CHARACTER(len=4), INTENT(IN) :: HBUNAME ! Name of the budget +CHARACTER(len=*), INTENT(IN) :: HBUNAME ! Name of the budget LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid ! Condensation LOGICAL :: OSIGMAS ! Switch for Sigma_s: @@ -430,10 +430,10 @@ ENDIF !* 6. STORE THE BUDGET TERMS ! ---------------------- ! -IF (LBUDGET_RV) CALL BUDGET (PRVS(:,:,:) * PRHODJ(:,:,:),6,HBUNAME//'_BU_RRV') -IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:) * PRHODJ(:,:,:),7,HBUNAME//'_BU_RRC') -IF (LBUDGET_RI) CALL BUDGET (PRIS(:,:,:) * PRHODJ(:,:,:),9,HBUNAME//'_BU_RRI') -IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:),4,HBUNAME//'_BU_RTH') +IF (LBUDGET_RV) CALL BUDGET (PRVS(:,:,:) * PRHODJ(:,:,:),6,trim(HBUNAME)//'_BU_RRV') +IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:) * PRHODJ(:,:,:),7,trim(HBUNAME)//'_BU_RRC') +IF (LBUDGET_RI) CALL BUDGET (PRIS(:,:,:) * PRHODJ(:,:,:),9,trim(HBUNAME)//'_BU_RRI') +IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:),4,trim(HBUNAME)//'_BU_RTH') ! !------------------------------------------------------------------------------ ! diff --git a/src/MNH/ice_adjust_elec.f90 b/src/MNH/ice_adjust_elec.f90 index 8d802babf157138a461aeff09c479f519d42149b..79382ad2828ca1567e8d1953430e4ced316f6002 100644 --- a/src/MNH/ice_adjust_elec.f90 +++ b/src/MNH/ice_adjust_elec.f90 @@ -625,15 +625,15 @@ ENDIF !* 6. STORE THE BUDGET TERMS ! ---------------------- ! -IF (LBUDGET_RV) CALL BUDGET (PRVS(:,:,:) * PRHODJ(:,:,:),6,'DEPI_BU_RRV') -IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:) * PRHODJ(:,:,:),7,'DEPI_BU_RRC') -IF (LBUDGET_RI) CALL BUDGET (PRIS(:,:,:) * PRHODJ(:,:,:),9,'DEPI_BU_RRI') -IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:),4,'DEPI_BU_RTH') +IF (LBUDGET_RV) CALL BUDGET (PRVS(:,:,:) * PRHODJ(:,:,:),6,'CDEPI_BU_RRV') +IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:) * PRHODJ(:,:,:),7,'CDEPI_BU_RRC') +IF (LBUDGET_RI) CALL BUDGET (PRIS(:,:,:) * PRHODJ(:,:,:),9,'CDEPI_BU_RRI') +IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:),4,'CDEPI_BU_RTH') IF (LBUDGET_SV) THEN - CALL BUDGET(PQPIS(:,:,:) * PRHODJ(:,:,:), 12+NSV_ELECBEG, 'DEPI_BU_RSV') - CALL BUDGET(PQNIS(:,:,:) * PRHODJ(:,:,:), 12+NSV_ELECEND, 'DEPI_BU_RSV') - CALL BUDGET(PQCS(:,:,:) * PRHODJ(:,:,:), 12+NSV_ELECBEG+1, 'DEPI_BU_RSV') - CALL BUDGET(PQIS(:,:,:) * PRHODJ(:,:,:), 12+NSV_ELECBEG+3, 'DEPI_BU_RSV') + CALL BUDGET(PQPIS(:,:,:) * PRHODJ(:,:,:), 12+NSV_ELECBEG, 'CDEPI_BU_RSV') + CALL BUDGET(PQNIS(:,:,:) * PRHODJ(:,:,:), 12+NSV_ELECEND, 'CDEPI_BU_RSV') + CALL BUDGET(PQCS(:,:,:) * PRHODJ(:,:,:), 12+NSV_ELECBEG+1, 'CDEPI_BU_RSV') + CALL BUDGET(PQIS(:,:,:) * PRHODJ(:,:,:), 12+NSV_ELECBEG+3, 'CDEPI_BU_RSV') END IF ! !------------------------------------------------------------------------------ diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index f0707d44a4f05f3929ac26bf41a1504d98f88bce..6808bbc6ce0f615d2ce245b2016efe89c4c6547d 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!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. @@ -152,8 +152,12 @@ END MODULE MODI_INI_BUDGET !! C. Barthe 01/2016 Add budget for LIMA !! C.Lac 10/2016 Add budget for droplet deposition !! S. Riette 11/2016 New budgets for ICE3/ICE4 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 24/02/2020: bugfix: corrected condition for budget NCDEPITH +! P. Wautelet 26/02/2020: bugfix: rename CEVA->REVA for budget for raindrop evaporation in C2R2 (necessary after commit 4ed805fc) +! P. Wautelet 26/02/2020: bugfix: add missing condition on OCOLD for NSEDIRH budget in LIMA case +! B. Vie 02/03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -774,14 +778,16 @@ IF (LBU_RTH) THEN IPROC=IPROC+1 IF (HTURB /= 'NONE') IPROACTV(4,IPROC) = NDISSHTH IPROC=IPROC+1 - IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2'))) & + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') & + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) & IPROACTV(4,IPROC) = NNETURTH IPROC=IPROC+1 IF ( HSCONV == 'EDKF' ) IPROACTV(4,IPROC) = NMAFLTH IPROC=IPROC+1 IPROACTV(4,IPROC) = NADVTH IPROC=IPROC+1 - IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) IPROACTV(4,IPROC) = NNEADVTH + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(4,IPROC) = NNEADVTH IPROC=IPROC+1 IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') & IPROACTV(4,IPROC) = NNEGATH @@ -878,15 +884,16 @@ IF (LBU_RTH) THEN IPROC=IPROC+1 IF (HCLOUD(1:3) == 'ICE' .AND. LRED) IPROACTV(4,IPROC) = NCORRTH IPROC=IPROC+1 - IF (HCLOUD(1:3) == 'ICE' .AND. .NOT. LRED .OR. (LRED .AND. LADJ_AFTER)) & - IPROACTV(4,IPROC) = NCDEPITH + IF (HCLOUD(1:3) == 'ICE' .AND. (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) )) & + IPROACTV(4,IPROC) = NCDEPITH IPROC=IPROC+1 IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO' .OR. HCLOUD(1:3) == 'KES' .OR. & HCLOUD == 'REVE') IPROACTV(4,IPROC) = NCONDTH IPROC=IPROC+1 - IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2'))& + END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2').OR. (HCLOUD == 'KESS')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& IPROACTV(4,IPROC) = NNECONTH - END IF ! YWORK2(4,1) = 'INIF_' YWORK2(4,2) = 'ENDF_' @@ -1023,8 +1030,9 @@ IF (LBU_RTH) THEN IPROC=IPROC+1 YWORK2(4,IPROC) = 'COND_' IPROC=IPROC+1 - YWORK2(4,IPROC) = 'NECON_' END IF + YWORK2(4,IPROC) = 'NECON_' + IPROC=IPROC+1 ! YEND_COMMENT(4) = 'BU_RTH' NBUPROCNBR(4) = 3 @@ -1154,14 +1162,16 @@ IF (LBU_RRV) THEN END IF END IF IPROC=IPROC+1 - IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2'))) & + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))) & IPROACTV(6,IPROC) = NNETURRV IPROC=IPROC+1 IF ( HSCONV == 'EDKF' ) IPROACTV(6,IPROC) = NMAFLRV IPROC=IPROC+1 IPROACTV(6,IPROC) = NADVRV IPROC=IPROC+1 - IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) IPROACTV(6,IPROC) = NNEADVRV + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(6,IPROC) = NNEADVRV IPROC=IPROC+1 IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') & IPROACTV(6,IPROC) = NNEGARV @@ -1213,10 +1223,11 @@ IF (LBU_RRV) THEN IF (HCLOUD(1:3) == 'ICE' .AND. (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) )) & IPROACTV(6,IPROC) = NCDEPIRV IPROC=IPROC+1 - IF ( (HCLOUD == 'KHKO' ) .OR. (HCLOUD == 'C2R2')) & +END IF + IF ( (HCLOUD == 'KHKO' ) .OR. (HCLOUD == 'C2R2') .OR. (HCLOUD == 'KESS')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) & IPROACTV(6,IPROC) = NNECONRV IPROC=IPROC+1 -END IF ! YWORK2(6,1) = 'INIF_' @@ -1291,9 +1302,9 @@ ELSE YWORK2(6,IPROC) = 'CORR_' IPROC=IPROC+1 YWORK2(6,IPROC) = 'CDEPI_' +END IF IPROC=IPROC+1 YWORK2(6,IPROC) = 'NECON_' -END IF ! YEND_COMMENT(6) = 'BU_RRV' NBUPROCNBR(6) = 3 @@ -1348,12 +1359,14 @@ IF (LBU_RRC) THEN END IF END IF IPROC=IPROC+1 - IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2'))) & + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))) & IPROACTV(7,IPROC) = NNETURRC IPROC=IPROC+1 IPROACTV(7,IPROC) = NADVRC IPROC=IPROC+1 - IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) & + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) & IPROACTV(7,IPROC) = NNEADVRC IPROC=IPROC+1 IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') & @@ -1460,10 +1473,11 @@ IF (LBU_RRC) THEN IF (HCLOUD == 'C2R2'.OR. HCLOUD == 'KHKO' .OR. & HCLOUD(1:3) == 'KES'.OR. HCLOUD == 'REVE') IPROACTV(7,IPROC) = NCONDRC IPROC=IPROC+1 - IF ( (HCLOUD == 'KHKO' ) .OR. (HCLOUD == 'C2R2')) & +END IF + IF ( (HCLOUD == 'KHKO' ) .OR. (HCLOUD == 'C2R2') .OR. (HCLOUD == 'KESS')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) & IPROACTV(7,IPROC) = NNECONRC IPROC=IPROC+1 - END IF ! YWORK2(7,1) = 'INIF_' @@ -1581,9 +1595,9 @@ IF (LBU_RRC) THEN YWORK2(7,IPROC) = 'CDEPI_' IPROC=IPROC+1 YWORK2(7,IPROC) = 'COND_' - IPROC=IPROC+1 - YWORK2(7,IPROC) = 'NECON_' END IF + IPROC=IPROC+1 + YWORK2(7,IPROC) = 'NECON_' ! YEND_COMMENT(7) = 'BU_RRC' NBUPROCNBR(7) = 3 @@ -1622,8 +1636,14 @@ IF (LBU_RRR) THEN END IF END IF IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(8,IPROC) = NNETURRR + IPROC=IPROC+1 IPROACTV(8,IPROC) = NADVRR IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(8,IPROC) = NNEADVRR + IPROC=IPROC+1 IF ( HCLOUD /= 'NONE' ) IPROACTV(8,IPROC) = NNEGARR IPROC=IPROC+1 @@ -1657,6 +1677,7 @@ IF (LBU_RRR) THEN IF (.NOT.OPTSPLIT .AND. OHAIL) IPROACTV(8,IPROC) = NWETHRR IPROC=IPROC+1 IF (.NOT.OPTSPLIT .AND. OHAIL) IPROACTV(8,IPROC) = NHMLTRR + IPROC=IPROC+1 ELSE IF (HCLOUD(1:3) == 'KES' ) IPROACTV(8,IPROC) = NSEDIRR IPROC=IPROC+1 @@ -1713,6 +1734,9 @@ IF (LBU_RRR) THEN IPROACTV(8,IPROC) = NSEDIRR IPROC=IPROC+1 END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& + IPROACTV(8,IPROC) = NNECONRR ! YWORK2(8,1) = 'INIF_' YWORK2(8,2) = 'ENDF_' @@ -1728,8 +1752,12 @@ IF (LBU_RRR) THEN IPROC=IPROC+1 YWORK2(8,IPROC) = 'REL_' IPROC=IPROC+1 + YWORK2(8,IPROC) = 'NETUR_' + IPROC=IPROC+1 YWORK2(8,IPROC) = 'ADV_' IPROC=IPROC+1 + YWORK2(8,IPROC) = 'NEADV_' + IPROC=IPROC+1 YWORK2(8,IPROC) = 'NEGA_' IPROC=IPROC+1 @@ -1763,7 +1791,6 @@ IF (HCLOUD == 'LIMA') THEN YWORK2(8,IPROC) = 'WETH_' IPROC=IPROC+1 YWORK2(8,IPROC) = 'HMLT_' - IPROC=IPROC+1 ELSE YWORK2(8,IPROC) = 'SEDI_' IPROC=IPROC+1 @@ -1811,6 +1838,8 @@ ELSE IPROC=IPROC+1 YWORK2(8,IPROC) = 'SEDI_' END IF + IPROC=IPROC+1 + YWORK2(8,IPROC) = 'NECON_' ! YEND_COMMENT(8) = 'BU_RRR' NBUPROCNBR(8) = 3 @@ -1863,8 +1892,15 @@ IF (LBU_RRI) THEN END IF END IF IPROC=IPROC+1 + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') & + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) & + IPROACTV(9,IPROC) = NNETURRI + IPROC=IPROC+1 IPROACTV(9,IPROC) = NADVRI IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(9,IPROC) = NNEADVRI + IPROC=IPROC+1 IF( HCLOUD /= 'NONE' ) IPROACTV(9,IPROC) = NNEGARI IPROC=IPROC+1 @@ -1903,7 +1939,8 @@ IF (LBU_RRI) THEN IPROC=IPROC+1 IF (.NOT.OPTSPLIT .AND. OHAIL) IPROACTV(9,IPROC) = NWETHRI IPROC=IPROC+1 - IPROACTV(9,IPROC) = NCEDSRI + IPROACTV(9,IPROC) = NCEDSRI + IPROC=IPROC+1 ELSE IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LADJ_BEFORE) IPROACTV(9,IPROC) = NADJURI IPROC=IPROC+1 @@ -1942,6 +1979,9 @@ IF (LBU_RRI) THEN IPROACTV(9,IPROC) = NCDEPIRI IPROC=IPROC+1 END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& + IPROACTV(9,IPROC) = NNECONRI ! YWORK2(9,1) = 'INIF_' YWORK2(9,2) = 'ENDF_' @@ -1963,8 +2003,12 @@ IF (LBU_RRI) THEN IPROC=IPROC+1 YWORK2(9,IPROC) = 'HTURB_' IPROC= IPROC+1 + YWORK2(9,IPROC) = 'NETUR_' + IPROC= IPROC+1 YWORK2(9,IPROC) = 'ADV_' IPROC=IPROC+1 + YWORK2(9,IPROC) = 'NEADV_' + IPROC= IPROC+1 YWORK2(9,IPROC) = 'NEGA_' IPROC= IPROC+1 IF (HCLOUD=='LIMA') THEN @@ -2036,6 +2080,8 @@ IF (LBU_RRI) THEN IPROC= IPROC+1 YWORK2(9,IPROC) = 'CDEPI_' END IF + IPROC=IPROC+1 + YWORK2(9,IPROC) = 'NECON_' ! YEND_COMMENT(9) = 'BU_RRI' NBUPROCNBR(9) = 3 @@ -2073,8 +2119,15 @@ IF (LBU_RRS) THEN IPROACTV(10,IPROC) = 3 END IF END IF + IPROC=IPROC+1 + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') & + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) & + IPROACTV(10,IPROC) = NNETURRS IPROC= IPROC+1 IPROACTV(10,IPROC) = NADVRS + IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(10,IPROC) = NNEADVRS IPROC= IPROC+1 IF( HCLOUD /= 'NONE' ) IPROACTV(10,IPROC) = NNEGARS IPROC=IPROC+1 @@ -2137,6 +2190,9 @@ IF (HCLOUD=='LIMA') THEN IPROACTV(10,IPROC) = NSEDIRS IPROC=IPROC+1 END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& + IPROACTV(10,IPROC) = NNECONRS ! YWORK2(10,1) = 'INIF_' YWORK2(10,2) = 'ENDF_' @@ -2151,9 +2207,13 @@ END IF YWORK2(10,IPROC) = 'DIF_' IPROC= IPROC+1 YWORK2(10,IPROC) = 'REL_' + IPROC=IPROC+1 + YWORK2(10,IPROC) = 'NETUR_' IPROC= IPROC+1 YWORK2(10,IPROC) = 'ADV_' IPROC=IPROC+1 + YWORK2(10,IPROC) = 'NEADV_' + IPROC=IPROC+1 YWORK2(10,IPROC) = 'NEGA_' IPROC= IPROC+1 IF (HCLOUD=='LIMA') THEN @@ -2182,7 +2242,6 @@ IF (HCLOUD=='LIMA') THEN YWORK2(10,IPROC) = 'DRYG_' IPROC= IPROC+1 YWORK2(10,IPROC) = 'WETH_' - IPROC= IPROC+1 ELSE YWORK2(10,IPROC) = 'SEDI_' IPROC= IPROC+1 @@ -2210,6 +2269,8 @@ ELSE IPROC=IPROC+1 YWORK2(10,IPROC) = 'SEDI_' END IF + IPROC=IPROC+1 + YWORK2(10,IPROC) = 'NECON_' ! YEND_COMMENT(10) = 'BU_RRS' NBUPROCNBR(10) = 3 @@ -2248,8 +2309,15 @@ IF (LBU_RRG) THEN END IF END IF IPROC=IPROC+1 + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') & + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) & + IPROACTV(11,IPROC) = NNETURRG + IPROC=IPROC+1 IPROACTV(11,IPROC) = NADVRG IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(11,IPROC) = NNEADVRG + IPROC=IPROC+1 IF( HCLOUD /= 'NONE' ) IPROACTV(11,IPROC) = NNEGARG IPROC=IPROC+1 IF (HCLOUD=='LIMA') THEN @@ -2316,6 +2384,9 @@ ELSE IPROACTV(11,IPROC) = NSEDIRG IPROC=IPROC+1 END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& + IPROACTV(11,IPROC) = NNECONRG ! YWORK2(11,1) = 'INIF_' YWORK2(11,2) = 'ENDF_' @@ -2331,8 +2402,12 @@ END IF IPROC=IPROC+1 YWORK2(11,IPROC) = 'REL_' IPROC=IPROC+1 + YWORK2(11,IPROC) = 'NETUR_' + IPROC=IPROC+1 YWORK2(11,IPROC) = 'ADV_' IPROC=IPROC+1 + YWORK2(11,IPROC) = 'NEADV_' + IPROC=IPROC+1 YWORK2(11,IPROC) = 'NEGA_' IPROC=IPROC+1 IF (HCLOUD=='LIMA') THEN @@ -2394,6 +2469,8 @@ ELSE IPROC=IPROC+1 YWORK2(11,IPROC)= 'SEDI_' END IF + IPROC=IPROC+1 + YWORK2(11,IPROC) = 'NECON_' ! YEND_COMMENT(11) = 'BU_RRG' NBUPROCNBR(11) = 3 @@ -2444,8 +2521,15 @@ IF (LBU_RRH) THEN END IF END IF IPROC=IPROC+1 + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') & + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) & + IPROACTV(12,IPROC) = NNETURRH + IPROC=IPROC+1 IPROACTV(12,IPROC) = NADVRH IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(12,IPROC) = NNEADVRH + IPROC=IPROC+1 IF( HCLOUD /= 'NONE' ) THEN IPROACTV(12,IPROC) = NNEGARH ELSE @@ -2454,7 +2538,7 @@ IF (LBU_RRH) THEN IPROC=IPROC+1 ! IF (HCLOUD=='LIMA' .AND. OHAIL) THEN - IPROACTV(12,IPROC) = NSEDIRH + IF (OCOLD) IPROACTV(12,IPROC) = NSEDIRH IPROC=IPROC+1 IPROACTV(12,IPROC) = NWETGRH IPROC=IPROC+1 @@ -2485,6 +2569,9 @@ IF (LBU_RRH) THEN (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LSEDIM_AFTER)) & IPROACTV(12,IPROC) = NSEDIRH END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& + IPROACTV(12,IPROC) = NNECONRH ! YWORK2(12,1) = 'INIF_' YWORK2(12,2) = 'ENDF_' @@ -2500,8 +2587,12 @@ IF (LBU_RRH) THEN IPROC=IPROC+1 YWORK2(12,IPROC) = 'REL_' IPROC=IPROC+1 + YWORK2(12,IPROC) = 'NETUR_' + IPROC=IPROC+1 YWORK2(12,IPROC) = 'ADV_' IPROC=IPROC+1 + YWORK2(12,IPROC) = 'NEADV_' + IPROC=IPROC+1 YWORK2(12,IPROC) = 'NEGA_' IPROC=IPROC+1 IF (HCLOUD=='LIMA' .AND. OHAIL) THEN @@ -2534,6 +2625,8 @@ IF (LBU_RRH) THEN IPROC=IPROC+1 YWORK2(12,IPROC) = 'SEDI_' END IF + IPROC=IPROC+1 + YWORK2(12,IPROC) = 'NECON_' ! YEND_COMMENT(12) = 'BU_RRH' NBUPROCNBR(12) = 3 @@ -2595,7 +2688,7 @@ IF (LBU_RSV) THEN IPROC=IPROC+1 IF ( HSCONV == 'EDKF' ) IPROACTV(12+JSV,IPROC)= NMAFLSV IPROC=IPROC+1 - IPROACTV(12+JSV,IPROC)= NADVSV + IF ( HCLOUD /= 'LIMA' ) IPROACTV(12+JSV,IPROC)= NADVSV IPROC=IPROC+1 ! YWORK2(12+JSV,1) = 'INIF_' @@ -2953,7 +3046,7 @@ USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, NMOD_IMM IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 END IF ILAST_PROC_NBR = ILAST_PROC_NBR + 1 - YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEVA_' + YWORK2(12+JSV,ILAST_PROC_NBR)= 'REVA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'BRKU_' @@ -2968,6 +3061,15 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN IF (JSV == NSV_LIMA_NC) THEN ! Cloud droplets conc. ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OPTSPLIT .AND. OWARM .AND. ORAIN) THEN @@ -3063,10 +3165,22 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! ELSE IF (JSV == NSV_LIMA_NR) THEN ! Rain drops conc. ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OPTSPLIT .AND. OWARM .AND. ORAIN) THEN @@ -3149,10 +3263,22 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN YWORK2(12+JSV,ILAST_PROC_NBR)= 'HMLT_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 END IF + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! ELSE IF (JSV.GE.NSV_LIMA_CCN_FREE .AND. JSV.LT.(NSV_LIMA_CCN_FREE+NMOD_CCN)) THEN ! Free CCN conc. ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OWARM .AND. OACTI .AND. NMOD_CCN.GE.1) THEN @@ -3168,6 +3294,9 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OSCAV) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'SCAV_' @@ -3175,11 +3304,23 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN END IF ! ELSE IF (JSV.GE.NSV_LIMA_CCN_ACTI .AND. JSV.LT.(NSV_LIMA_CCN_ACTI+NMOD_CCN)) THEN + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! Activated CCN conc. ELSE IF (JSV == NSV_LIMA_NI) THEN ! Pristine ice crystals conc. ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OPTSPLIT .AND. OCOLD .AND. OSNOW) THEN @@ -3265,10 +3406,22 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! ELSE IF (JSV.GE.NSV_LIMA_IFN_FREE .AND. JSV.LT.(NSV_LIMA_IFN_FREE+NMOD_IFN)) THEN ! Free IFN conc. ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OCOLD .AND. ONUCL .AND. (.NOT.OMEYERS)) THEN @@ -3279,6 +3432,9 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OSCAV) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'SCAV_' @@ -3286,14 +3442,23 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN END IF ! ELSE IF (JSV.GE.NSV_LIMA_IFN_NUCL .AND. JSV.LT.(NSV_LIMA_IFN_NUCL+NMOD_IFN)) THEN + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! Nucleated IFN conc. ELSE IF (JSV.GE.NSV_LIMA_IMM_NUCL .AND. JSV.LT.(NSV_LIMA_IMM_NUCL+NMOD_IMM)) THEN + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! Nucleated IMM conc. ELSE IF (JSV == NSV_LIMA_HOM_HAZE) THEN ! Homogeneous freezing of CCN - IF (OCOLD .AND. ONUCL .AND. OWARM .AND. OHHONI) THEN + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + IF (OPTSPLIT .AND. OCOLD .AND. ONUCL .AND. OWARM .AND. OHHONI) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'HONH_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 @@ -3319,8 +3484,8 @@ ELSEIF (JSV >= NSV_ELECBEG .AND. JSV <= NSV_ELECEND) THEN IPROACTV(12+JSV,ILAST_PROC_NBR) = NREVAQV END IF ILAST_PROC_NBR = ILAST_PROC_NBR + 1 - YWORK2(12+JSV,ILAST_PROC_NBR) = 'DEPI_' - IPROACTV(12+JSV,ILAST_PROC_NBR) = NDEPIQV + YWORK2(12+JSV,ILAST_PROC_NBR) = 'CDEPI_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = NCDEPIQV ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR) = 'NEUT_' IPROACTV(12+JSV,ILAST_PROC_NBR) = NNEUTQV @@ -3349,13 +3514,8 @@ ELSEIF (JSV >= NSV_ELECBEG .AND. JSV <= NSV_ELECEND) THEN YWORK2(12+JSV,ILAST_PROC_NBR) = 'BERFI_' IPROACTV(12+JSV,ILAST_PROC_NBR) = NBERFIQC ILAST_PROC_NBR = ILAST_PROC_NBR + 1 - YWORK2(12+JSV,ILAST_PROC_NBR) = 'DEPI_' - IPROACTV(12+JSV,ILAST_PROC_NBR) = NDEPIQC - IF (LINDUCTIVE) THEN - ILAST_PROC_NBR = ILAST_PROC_NBR + 1 - YWORK2(12+JSV,ILAST_PROC_NBR) = 'IND_' - END IF - IPROACTV(12+JSV,ILAST_PROC_NBR) = NINDQC + YWORK2(12+JSV,ILAST_PROC_NBR) = 'CDEPI_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = NCDEPIQC IF (LSEDIC) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR) = 'SEDI_' @@ -3420,8 +3580,8 @@ ELSEIF (JSV >= NSV_ELECBEG .AND. JSV <= NSV_ELECEND) THEN YWORK2(12+JSV,ILAST_PROC_NBR) = 'BERFI_' IPROACTV(12+JSV,ILAST_PROC_NBR) = NBERFIQI ILAST_PROC_NBR = ILAST_PROC_NBR + 1 - YWORK2(12+JSV,ILAST_PROC_NBR) = 'DEPI_' - IPROACTV(12+JSV,ILAST_PROC_NBR) = NDEPIQI + YWORK2(12+JSV,ILAST_PROC_NBR) = 'CDEPI_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = NCDEPIQI ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR) = 'NIIS_' IPROACTV(12+JSV,ILAST_PROC_NBR) = NNIISQI @@ -3464,6 +3624,7 @@ ELSEIF (JSV >= NSV_ELECBEG .AND. JSV <= NSV_ELECEND) THEN IPROACTV(12+JSV,ILAST_PROC_NBR) = NSEDIQS ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR) = 'NEUT_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = NNEUTQS CASE(6) ! volumetric charge of graupel ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR) = 'DEPG_' @@ -3489,11 +3650,6 @@ ELSEIF (JSV >= NSV_ELECBEG .AND. JSV <= NSV_ELECEND) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR) = 'GMLT_' IPROACTV(12+JSV,ILAST_PROC_NBR) = NGMLTQG - IF (LINDUCTIVE) THEN - ILAST_PROC_NBR = ILAST_PROC_NBR + 1 - YWORK2(12+JSV,ILAST_PROC_NBR) = 'IND_' - IPROACTV(12+JSV,ILAST_PROC_NBR) = NINDQG - END IF ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR) = 'SEDI_' IPROACTV(12+JSV,ILAST_PROC_NBR) = NSEDIQG @@ -3516,6 +3672,11 @@ ELSE IF (JSV >= NSV_CHEMBEG .AND. JSV <= NSV_CHEMEND) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = NNEGASV +! +ELSE IF (JSV >= NSV_AERBEG .AND. JSV <= NSV_AEREND) THEN + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = NNEGASV ! ELSE ! other processes diff --git a/src/MNH/ini_micron.f90 b/src/MNH/ini_micron.f90 index 718eebb464b59a2d271a80cfbab03dceacc418fd..c6f6b991f6edda384225b3e5c44563d215674ae1 100644 --- a/src/MNH/ini_micron.f90 +++ b/src/MNH/ini_micron.f90 @@ -53,7 +53,7 @@ END MODULE MODI_INI_MICRO_n !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! P.Wautelet 01/2019: bug: add missing allocations ! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -!! +! C. Lac 02/2020: add missing allocation of INPRC and ACPRC with deposition !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -161,9 +161,9 @@ ELSE ALLOCATE(XACPRR(0,0)) END IF ! -IF (( CCLOUD(1:3) == 'ICE' .AND.LSEDIC) .OR. & - ((CCLOUD=='C2R2' .OR. CCLOUD=='C3R5' .OR. CCLOUD=='KHKO').AND.LSEDC) .OR. & - ( CCLOUD=='LIMA' .AND.MSEDC)) THEN +IF (( CCLOUD(1:3) == 'ICE' .AND.(LSEDIC .OR. LDEPOSC)) .OR. & + ((CCLOUD=='C2R2' .OR. CCLOUD=='C3R5' .OR. CCLOUD=='KHKO').AND.(LSEDC .OR. LDEPOC)) .OR. & + ( CCLOUD=='LIMA' .AND.(MSEDC .OR. MDEPOC))) THEN ALLOCATE(XINPRC(IIU,IJU)) ALLOCATE(XACPRC(IIU,IJU)) XINPRC(:,:)=0.0 diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index a7ff5457c1cfbe7464077149deef90d0492ec766..2548b6a26f8be699774ce2dfa6ace5a71d9d279d 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -287,6 +287,7 @@ END MODULE MODI_INI_MODEL_n ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 19/04/2019: removed unused dummy arguments and variables ! P. Wautelet 07/06/2019: allocate lookup tables for optical properties only when needed +! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree !--------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -326,7 +327,7 @@ USE MODD_DEF_EDDYUV_FLUX_n ! FOR UV USE MODD_DIAG_FLAG, only: LCHEMDIAG, CSPEC_BU_DIAG USE MODD_DIM_n USE MODD_DRAG_n -USE MODD_DRAGTREE +USE MODD_DRAGTREE_n USE MODD_DUST use MODD_DUST_OPT_LKT, only: NMAX_RADIUS_LKT_DUST=>NMAX_RADIUS_LKT, NMAX_SIGMA_LKT_DUST=>NMAX_SIGMA_LKT, & NMAX_WVL_SW_DUST=>NMAX_WVL_SW, & @@ -1483,7 +1484,17 @@ ALLOCATE(XRI_MF(IIU,IJU,IKU)) ; XRI_MF=0.0 ! ALLOCATE(ZJ(IIU,IJU,IKU)) ! -!* 3.10 Forcing variables (Module MODD_FRC) +!* 3.10 Forcing variables (Module MODD_FRC and MODD_FRCn) +! +IF ( LFORCING ) THEN + ALLOCATE(XWTFRC(IIU,IJU,IKU)) ; XWTFRC = XUNDEF + ALLOCATE(XUFRC_PAST(IIU,IJU,IKU)) ; XUFRC_PAST = XUNDEF + ALLOCATE(XVFRC_PAST(IIU,IJU,IKU)) ; XVFRC_PAST = XUNDEF +ELSE + ALLOCATE(XWTFRC(0,0,0)) + ALLOCATE(XUFRC_PAST(0,0,0)) + ALLOCATE(XVFRC_PAST(0,0,0)) +END IF ! IF (KMI == 1) THEN IF ( LFORCING ) THEN @@ -1515,15 +1526,6 @@ IF (KMI == 1) THEN ALLOCATE(XTENDUFRC(0,0)) ALLOCATE(XTENDVFRC(0,0)) END IF - IF ( LFORCING ) THEN - ALLOCATE(XWTFRC(IIU,IJU,IKU)) - ALLOCATE(XUFRC_PAST(IIU,IJU,IKU)) ; XUFRC_PAST = XUNDEF - ALLOCATE(XVFRC_PAST(IIU,IJU,IKU)) ; XVFRC_PAST = XUNDEF - ELSE - ALLOCATE(XWTFRC(0,0,0)) - ALLOCATE(XUFRC_PAST(0,0,0)) - ALLOCATE(XVFRC_PAST(0,0,0)) - END IF ELSE !Do not allocate because they are the same on all grids (not 'n' variables) END IF diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90 index 1d6bc3eefe6e98c6b53edb1a4346b1c613ed793b..1067f2ceffdbf2de2b8de02dcf94039a76a01378 100644 --- a/src/MNH/ini_spectren.f90 +++ b/src/MNH/ini_spectren.f90 @@ -58,7 +58,7 @@ USE MODD_CTURB USE MODD_CURVCOR_n USE MODD_DEEP_CONVECTION_n USE MODD_DIM_n -USE MODD_DRAGTREE +USE MODD_DRAGTREE_n USE MODD_DUST USE MODD_DYN USE MODD_DYN_n diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index 0c099b7fbd6bcd5ae0243e75412d060eb4bfdbeb..c9a06aa58a1c7c94483761e603c19c23957c7a52 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -66,21 +66,25 @@ END MODULE MODI_INI_SURFSTATION_n !! P. Tulet 15/01/2002 !! A. Lemonsu 19/11/2002 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +!! R. Schoetter : 11/2019 : work for cartesian coordinates + parallel. !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! USE MODD_CONF +USE MODD_DIM_n USE MODD_DYN_n USE MODD_GRID USE MODD_GRID_n USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS +USE MODD_SHADOWS_n USE MODD_STATION_n USE MODD_TYPE_DATE +USE MODD_VAR_ll, ONLY: IP ! +USE MODE_GATHER_ll USE MODE_GRIDPROJ USE MODE_ll USE MODE_MSG @@ -108,6 +112,7 @@ REAL, INTENT(IN) :: PLONOR ! longitude of origine point ! INTEGER :: ISTORE ! number of storage instants INTEGER :: ILUOUT ! logical unit +INTEGER :: IIU_ll,IJU_ll,IRESP ! !---------------------------------------------------------------------------- ILUOUT = TLUOUT%NLU @@ -239,7 +244,6 @@ INTEGER :: JII ! INTEGER :: IIU, IJU ! ! IF ( ALL(TSTATION%LAT(:)/=XUNDEF) .AND. ALL(TSTATION%LON(:)/=XUNDEF) ) THEN - LSTATLAT = .TRUE. DO JII=1,NUMBSTAT CALL GET_DIM_EXT_ll ('B',IIU,IJU) CALL SM_XYHAT(PLATOR,PLONOR, & @@ -247,11 +251,20 @@ IF ( ALL(TSTATION%LAT(:)/=XUNDEF) .AND. ALL(TSTATION%LON(:)/=XUNDEF) ) THEN TSTATION%X(JII), TSTATION%Y(JII) ) ENDDO ELSE - LSTATLAT = .FALSE. DO JII=1,NUMBSTAT - TSTATION%X(JII) = XXHAT(TSTATION%I(JII)) - TSTATION%Y(JII) = XYHAT(TSTATION%I(JII)) CALL GET_DIM_EXT_ll ('B',IIU,IJU) + IIU_ll=NIMAX_ll + 2 * JPHEXT + IJU_ll=NJMAX_ll + 2 * JPHEXT + ALLOCATE(XXHAT_ll (IIU_ll)) + ALLOCATE(XYHAT_ll (IJU_ll)) + ! + CALL GATHERALL_FIELD_ll('XX',XXHAT,XXHAT_ll,IRESP) + CALL GATHERALL_FIELD_ll('YY',XYHAT,XYHAT_ll,IRESP) + TSTATION%X(JII) = XXHAT_ll(TSTATION%I(JII)) + TSTATION%Y(JII) = XYHAT_ll(TSTATION%J(JII)) + IF (LCARTESIAN) THEN + XRPK = -1 + ENDIF CALL SM_LATLON(PLATOR,PLONOR, & TSTATION%X(JII), TSTATION%Y(JII), & TSTATION%LAT(JII), TSTATION%LON(JII) ) diff --git a/src/MNH/lima.f90 b/src/MNH/lima.f90 index 851660cf9fc9c96c62d3af27de1c3667d02115fe..8c4538828cc25fc32b411db1fe67adff293687b8 100644 --- a/src/MNH/lima.f90 +++ b/src/MNH/lima.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2013-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2013-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. @@ -14,7 +14,7 @@ INTERFACE PRHODREF, PEXNREF, PDZZ, & PRHODJ, PPABSM, PPABST, & NCCN, NIFN, NIMM, & - PTHM, PTHT, PRT, PSVT, PW_NU, & + PDTHRAD, PTHT, PRT, PSVT, PW_NU, & PTHS, PRS, PSVS, & PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PINPRH, & PEVAP3D ) @@ -41,7 +41,7 @@ INTEGER, INTENT(IN) :: NCCN ! for array size declarati INTEGER, INTENT(IN) :: NIFN ! for array size declarations INTEGER, INTENT(IN) :: NIMM ! for array size declarations ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Theta at time t-dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Mixing ratios at time t REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations at time t @@ -71,7 +71,7 @@ END MODULE MODI_LIMA PRHODREF, PEXNREF, PDZZ, & PRHODJ, PPABSM, PPABST, & NCCN, NIFN, NIMM, & - PTHM, PTHT, PRT, PSVT, PW_NU, & + PDTHRAD, PTHT, PRT, PSVT, PW_NU, & PTHS, PRS, PSVS, & PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PINPRH, & PEVAP3D ) @@ -97,8 +97,9 @@ END MODULE MODI_LIMA !! Original 15/03/2018 !! !! B.Vié 02/2019 : minor correction on budget -!! -!! +!! P. Wautelet 26/02/2020: bugfix: corrected condition to write budget CORR_BU_RRS +!! B.Vié 03/03/2020 : use DTHRAD instead of dT/dt in Smax diagnostic computation +! !* 0. DECLARATIONS ! ------------ USE MODD_BUDGET, ONLY: LBU_ENABLE, LBUDGET_TH, LBUDGET_RV, LBUDGET_RC, LBUDGET_RR, & @@ -151,7 +152,7 @@ INTEGER, INTENT(IN) :: NCCN ! for array size declarati INTEGER, INTENT(IN) :: NIFN ! for array size declarations INTEGER, INTENT(IN) :: NIMM ! for array size declarations ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Theta at time t-dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Mixing ratios at time t REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations at time t @@ -189,7 +190,7 @@ REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZHOMFS ! ! Other 3D thermodynamical variables -REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZEXN, ZT, ZTM +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZEXN, ZT ! ! Packed prognostic & thermo variables @@ -563,7 +564,7 @@ IF(LBU_ENABLE) THEN IF (LBUDGET_RC .AND. LWARM .AND. LRAIN) CALL BUDGET (ZRCS(:,:,:)*PRHODJ(:,:,:), 7 , 'CORR_BU_RRC') IF (LBUDGET_RR .AND. LWARM .AND. LRAIN) CALL BUDGET (ZRRS(:,:,:)*PRHODJ(:,:,:), 8 , 'CORR_BU_RRR') IF (LBUDGET_RI .AND. LCOLD .AND. LSNOW) CALL BUDGET (ZRIS(:,:,:)*PRHODJ(:,:,:), 9 , 'CORR_BU_RRI') - IF (LBUDGET_RI .AND. LCOLD .AND. LSNOW) CALL BUDGET (ZRSS(:,:,:)*PRHODJ(:,:,:),10 , 'CORR_BU_RRS') + IF (LBUDGET_RS .AND. LCOLD .AND. LSNOW) CALL BUDGET (ZRSS(:,:,:)*PRHODJ(:,:,:),10 , 'CORR_BU_RRS') IF (LBUDGET_SV) THEN IF (LWARM .AND. LRAIN) CALL BUDGET (ZCCS(:,:,:)*PRHODJ(:,:,:), 12+NSV_LIMA_NC , 'CORR_BU_RSV') IF (LWARM .AND. LRAIN) CALL BUDGET (ZCRS(:,:,:)*PRHODJ(:,:,:), 12+NSV_LIMA_NR , 'CORR_BU_RSV') @@ -625,7 +626,7 @@ END IF IF (LWARM .AND. LDEPOC) THEN PINDEP(:,:)=0. GDEP(:,:) = .FALSE. - GDEP(:,:) = ZRCS(:,:,IKB) >0 .AND. ZCCS(:,:,IKB) >0 + GDEP(:,:) = ZRCS(:,:,IKB) >0 .AND. ZCCS(:,:,IKB) >0 .AND. ZRCT(:,:,IKB) >0 .AND. ZCCT(:,:,IKB) >0 WHERE (GDEP) ZRCS(:,:,IKB) = ZRCS(:,:,IKB) - XVDEPOC * ZRCT(:,:,IKB) / PDZZ(:,:,IKB) ZCCS(:,:,IKB) = ZCCS(:,:,IKB) - XVDEPOC * ZCCT(:,:,IKB) / PDZZ(:,:,IKB) @@ -680,18 +681,11 @@ IF ( LCOLD ) ZCIT(:,:,:) = ZCIS(:,:,:) * PTSTEP !* 2. Nucleation processes ! -------------------- ! -! -IF( LACTIT ) THEN - ZTM(:,:,:) = PTHM(:,:,:) * (PPABSM(:,:,:)/XP00)**(XRD/XCPD) -ELSE - ZTM(:,:,:) = ZT(:,:,:) -END IF -! CALL LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, OCLOSE_OUT, PRHODJ, & - PRHODREF, ZEXN, PPABST, ZT, ZTM, PW_NU, & - ZTHT, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & - ZCCT, ZCRT, ZCIT, & - ZCCNFT, ZCCNAT, ZIFNFT, ZIFNNT, ZIMMNT, ZHOMFT ) + PRHODREF, ZEXN, PPABST, ZT, PDTHRAD, PW_NU, & + ZTHT, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & + ZCCT, ZCRT, ZCIT, & + ZCCNFT, ZCCNAT, ZIFNFT, ZIFNNT, ZIMMNT, ZHOMFT ) ! ! Saving sources before microphysics time-splitting loop ! diff --git a/src/MNH/lima_adjust.f90 b/src/MNH/lima_adjust.f90 index 752c861b9d9792eed74add2178143552c425b9c1..e9c32bb0b1f2d0dbaa9350bf39874076ba7376cf 100644 --- a/src/MNH/lima_adjust.f90 +++ b/src/MNH/lima_adjust.f90 @@ -1109,8 +1109,8 @@ DEALLOCATE(ZCTMIN) !* 5.2 compute the cloud fraction PCLDFR (binary !!!!!!!) ! IF ( .NOT. OSUBG_COND ) THEN -! WHERE (PRCS(:,:,:) + PRIS(:,:,:) + PRSS(:,:,:) > 1.E-12 / ZDT) - WHERE (PRCS(:,:,:) + PRIS(:,:,:) > 1.E-12 / ZDT) + WHERE (PRCS(:,:,:) + PRIS(:,:,:) + PRSS(:,:,:) > 1.E-12 / ZDT) +! WHERE (PRCS(:,:,:) + PRIS(:,:,:) > 1.E-12 / ZDT) ZW(:,:,:) = 1. ELSEWHERE ZW(:,:,:) = 0. diff --git a/src/MNH/lima_ccn_activation.f90 b/src/MNH/lima_ccn_activation.f90 index 211fbd35f53472766670fcec4fd26ae627f67a26..237752747d8e237e8fea020ab92a7acaaac8f94e 100644 --- a/src/MNH/lima_ccn_activation.f90 +++ b/src/MNH/lima_ccn_activation.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2013-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2013-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. @@ -8,9 +8,9 @@ ! ############################### ! INTERFACE - SUBROUTINE LIMA_CCN_ACTIVATION (PTSTEP, TPFILE, OCLOSE_OUT, & - PRHODREF, PEXNREF, PPABST, ZT, ZTM, PW_NU, & - PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT ) + SUBROUTINE LIMA_CCN_ACTIVATION (PTSTEP, TPFILE, OCLOSE_OUT, & + PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & + PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT ) USE MODD_IO, ONLY: TFILEDATA ! REAL, INTENT(IN) :: PTSTEP ! Double Time step @@ -22,8 +22,8 @@ LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: ZTM ! Temperature at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Radiative temperature tendency ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for ! the nucleation param. @@ -40,9 +40,9 @@ END SUBROUTINE LIMA_CCN_ACTIVATION END INTERFACE END MODULE MODI_LIMA_CCN_ACTIVATION ! ############################################################################# - SUBROUTINE LIMA_CCN_ACTIVATION (PTSTEP, TPFILE, OCLOSE_OUT, & - PRHODREF, PEXNREF, PPABST, ZT, ZTM, PW_NU, & - PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT ) + SUBROUTINE LIMA_CCN_ACTIVATION (PTSTEP, TPFILE, OCLOSE_OUT, & + PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & + PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT ) ! ############################################################################# ! !! @@ -87,6 +87,7 @@ END MODULE MODI_LIMA_CCN_ACTIVATION !! MODIFICATIONS !! ------------- !! Original ??/??/13 +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 @@ -123,8 +124,8 @@ LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: ZTM ! Temperature at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Radiative temperature tendency ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for ! the nucleation param. @@ -198,9 +199,10 @@ IKE=SIZE(PRHODREF,3) - JPVEXT ! Saturation vapor mixing ratio and radiative tendency ! ZEPS= XMV / XMD -ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:)*EXP(-XALPW+XBETAW/ZT(:,:,:)+XGAMW*ALOG(ZT(:,:,:))) - 1.0) +ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:)*EXP(-XALPW+XBETAW/PT(:,:,:)+XGAMW*ALOG(PT(:,:,:))) - 1.0) ZTDT(:,:,:) = 0. -IF (LACTIT) ZTDT(:,:,:) = (ZT(:,:,:)-ZTM(:,:,:))/PTSTEP ! dT/dt +IF (LACTIT .AND. SIZE(PDTHRAD).GT.0) ZTDT(:,:,:) = PDTHRAD(:,:,:) * PEXNREF(:,:,:) +!IF (LACTIT) ZTDT(:,:,:) = (PT(:,:,:)-PTM(:,:,:))/PTSTEP ! dT/dt ! ! find locations where CCN are available ! @@ -220,13 +222,13 @@ IF( LACTIT ) THEN ZTDT(IIB:IIE,IJB:IJE,IKB:IKE)<XTMIN .OR. & PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) ) .AND.& PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>(0.98*ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE))& - .AND. ZT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & + .AND. PT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(4) ELSE GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = (PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN .OR. & PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) ) .AND.& PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>(0.98*ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE))& - .AND. ZT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & + .AND. PT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(4) END IF INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) @@ -251,7 +253,7 @@ IF( INUCT >= 1 ) THEN ALLOCATE(ZRHODREF(INUCT)) ALLOCATE(ZEXNREF(INUCT)) DO JL=1,INUCT - ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = PT(I1(JL),I2(JL),I3(JL)) ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) ZZW2(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) ZZTDT(JL) = ZTDT(I1(JL),I2(JL),I3(JL)) @@ -422,7 +424,7 @@ IF( INUCT >= 1 ) THEN END WHERE ZW(:,:,:) = MIN( UNPACK( ZZW1(:),MASK=GNUCT(:,:,:),FIELD=0.0 ),PRVT(:,:,:) ) ! - PTHT(:,:,:) = PTHT(:,:,:) + ZW(:,:,:) * (XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT))/ & + PTHT(:,:,:) = PTHT(:,:,:) + ZW(:,:,:) * (XLVTT+(XCPV-XCL)*(PT(:,:,:)-XTT))/ & (PEXNREF(:,:,:)*(XCPD+XCPV*PRVT(:,:,:)+XCL*(PRCT(:,:,:)+PRRT(:,:,:)))) PRVT(:,:,:) = PRVT(:,:,:) - ZW(:,:,:) PRCT(:,:,:) = PRCT(:,:,:) + ZW(:,:,:) diff --git a/src/MNH/lima_droplets_autoconversion.f90 b/src/MNH/lima_droplets_autoconversion.f90 index 2f2c911100c174146817e1ab5db7e2ae87966098..f88eb265d4d599ecdbb43cf0035fef6923c2212e 100644 --- a/src/MNH/lima_droplets_autoconversion.f90 +++ b/src/MNH/lima_droplets_autoconversion.f90 @@ -57,7 +57,7 @@ END MODULE MODI_LIMA_DROPLETS_AUTOCONVERSION !! MODIFICATIONS !! ------------- !! Original 15/03/2018 -!! +!! B. Vie 02/03/2020 : missing CC process !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -125,11 +125,11 @@ WHERE( PRCT(:)>XRTMIN(2) .AND. PLBDC(:)>0. .AND. LDCOMPUTE(:) ) ! min (80 microns, D_h, D_r) ZW3(:) = ZW3(:) * MAX( 0.0,ZW1(:) )**3 / XAC ! - P_CC_AUTO(:) = 0. + P_CC_AUTO(:) = -ZW3(:) P_CR_AUTO(:) = ZW3(:) ! PA_RC(:) = PA_RC(:) + P_RC_AUTO(:) - PA_CC(:) = PA_CC(:) + PA_CC(:) = PA_CC(:) + P_CC_AUTO(:) PA_RR(:) = PA_RR(:) - P_RC_AUTO(:) PA_CR(:) = PA_CR(:) + P_CR_AUTO(:) END WHERE diff --git a/src/MNH/lima_inst_procs.f90 b/src/MNH/lima_inst_procs.f90 index fe22db3a839f9a512f80485587ac6f7d6cfab536..a03eed7e3af5aa42c376955b9d8094bde1204feb 100644 --- a/src/MNH/lima_inst_procs.f90 +++ b/src/MNH/lima_inst_procs.f90 @@ -95,7 +95,7 @@ SUBROUTINE LIMA_INST_PROCS (PTSTEP, LDCOMPUTE, !------------------------------------------------------------------------------- ! ! -USE MODD_PARAM_LIMA, ONLY : LCOLD, LNUCL, LMEYERS, LSNOW, LWARM, LACTI, LRAIN, LHHONI, NMOD_CCN, NMOD_IFN +USE MODD_PARAM_LIMA, ONLY : LCOLD, LWARM, LRAIN ! USE MODI_LIMA_DROPS_BREAK_UP USE MODI_LIMA_DROPS_HOM_FREEZING diff --git a/src/MNH/lima_meyers_nucleation.f90 b/src/MNH/lima_meyers_nucleation.f90 index 0aa09ccbabce9769552385398f63cbc8e8283e81..bf77de46421082792eddebe764baeb569b336c5d 100644 --- a/src/MNH/lima_meyers_nucleation.f90 +++ b/src/MNH/lima_meyers_nucleation.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2018-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2013-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. @@ -13,7 +13,7 @@ INTERFACE PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & PCCT, PCIT, PINT, & P_TH_HIND, P_RI_HIND, P_CI_HIND, & - P_RC_HINC, P_CC_HINC ) + P_TH_HINC, P_RC_HINC, P_CC_HINC ) ! REAL, INTENT(IN) :: PTSTEP ! @@ -33,11 +33,12 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water C. at t REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Ice crystal C. source REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT ! Activated ice nuclei C. ! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_TH_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_RI_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_CI_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_RC_HINC -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_CC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CC_HINC ! END SUBROUTINE LIMA_MEYERS_NUCLEATION END INTERFACE @@ -49,7 +50,7 @@ END MODULE MODI_LIMA_MEYERS_NUCLEATION PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & PCCT, PCIT, PINT, & P_TH_HIND, P_RI_HIND, P_CI_HIND, & - P_RC_HINC, P_CC_HINC ) + P_TH_HINC, P_RC_HINC, P_CC_HINC ) ! ############################################################################# !! !! PURPOSE @@ -69,7 +70,7 @@ END MODULE MODI_LIMA_MEYERS_NUCLEATION !! ------------- !! Original 15/03/2018 ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -! +! P. Wautelet 27/02/2020: add P_TH_HINC dummy argument + change intent of *_HIND and *_HINC dummy arguments (INOUT->OUT) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -108,11 +109,12 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water C. at t REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Ice crystal C. source REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT ! Activated ice nuclei C. ! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_TH_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_RI_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_CI_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_RC_HINC -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_CC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CC_HINC ! ! !* 0.2 Declarations of local variables : @@ -302,7 +304,8 @@ IF( INEGT >= 1 ) THEN ! P_RC_HINC(:,:,:) = - UNPACK( ZZW(:), MASK=GNEGT(:,:,:), FIELD=0. ) P_CC_HINC(:,:,:) = - UNPACK( ZZX(:), MASK=GNEGT(:,:,:), FIELD=0. ) - PTHT(:,:,:) = PTHT(:,:,:) + UNPACK( ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)), MASK=GNEGT(:,:,:), FIELD=0. ) + P_TH_HINC(:,:,:) = UNPACK( ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)), MASK=GNEGT(:,:,:), FIELD=0. ) + PTHT(:,:,:) = PTHT(:,:,:) + P_TH_HINC(:,:,:) PRCT(:,:,:) = PRCT(:,:,:) + P_RC_HINC(:,:,:) PRIT(:,:,:) = PRIT(:,:,:) - P_RC_HINC(:,:,:) PCCT(:,:,:) = PCCT(:,:,:) + P_CC_HINC(:,:,:) diff --git a/src/MNH/lima_nucleation_procs.f90 b/src/MNH/lima_nucleation_procs.f90 index e3efc478d7c83f49440a8f7c344103bd4ec19768..2588a5e56621231849adf05c168517b7a52cb714 100644 --- a/src/MNH/lima_nucleation_procs.f90 +++ b/src/MNH/lima_nucleation_procs.f90 @@ -1,18 +1,18 @@ -!MNH_LIC Copyright 2018-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2013-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_LIMA_NUCLEATION_PROCS ! ############################### ! INTERFACE - SUBROUTINE LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, OCLOSE_OUT, PRHODJ, & - PRHODREF, PEXNREF, PPABST, PT, PTM, PW_NU, & - PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & - PCCT, PCRT, PCIT, & - PNFT, PNAT, PIFT, PINT, PNIT, PNHT ) + SUBROUTINE LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, OCLOSE_OUT, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, & + PNFT, PNAT, PIFT, PINT, PNIT, PNHT ) ! USE MODD_IO, ONLY: TFILEDATA ! @@ -25,7 +25,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTM ! Temperature at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Radiative temperature tendency REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at t @@ -50,13 +50,13 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNHT ! CCN hom freezing END SUBROUTINE LIMA_NUCLEATION_PROCS END INTERFACE END MODULE MODI_LIMA_NUCLEATION_PROCS -! ############################################################################# -SUBROUTINE LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, OCLOSE_OUT, PRHODJ, & - PRHODREF, PEXNREF, PPABST, PT, PTM, PW_NU, & - PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & - PCCT, PCRT, PCIT, & - PNFT, PNAT, PIFT, PINT, PNIT, PNHT ) -! ############################################################################# +! ############################################################################ +SUBROUTINE LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, OCLOSE_OUT, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, & + PNFT, PNAT, PIFT, PINT, PNIT, PNHT ) +! ############################################################################ ! !! PURPOSE !! ------- @@ -69,7 +69,9 @@ SUBROUTINE LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, OCLOSE_OUT, PRHODJ, !! MODIFICATIONS !! ------------- !! Original 15/03/2018 -!! +! P. Wautelet 27/02/2020: bugfix: PNFT was not updated after LIMA_CCN_HOM_FREEZING +! P. Wautelet 27/02/2020: add Z_TH_HINC variable (for budgets) +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation !------------------------------------------------------------------------------- ! USE MODD_PARAM_LIMA, ONLY : LCOLD, LNUCL, LMEYERS, LSNOW, LWARM, LACTI, LRAIN, LHHONI, & @@ -93,7 +95,7 @@ IMPLICIT NONE !------------------------------------------------------------------------------- ! REAL, INTENT(IN) :: PTSTEP ! Double Time step -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Reference density @@ -101,7 +103,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTM ! Temperature at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Radiative temperature tendency REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at t @@ -125,7 +127,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNHT ! CCN hom. freezing ! !------------------------------------------------------------------------------- ! -REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, Z_RC_HINC, Z_CC_HINC +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, Z_TH_HINC, Z_RC_HINC, Z_CC_HINC REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: ZTHT, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: ZCCT, ZCRT, ZCIT REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3),NMOD_CCN) :: ZNFT, ZNAT @@ -156,9 +158,9 @@ ZNHT(:,:,:) = PNHT(:,:,:) !------------------------------------------------------------------------------- ! IF (LWARM .AND. LACTI .AND. NMOD_CCN.GE.1) THEN - CALL LIMA_CCN_ACTIVATION (PTSTEP, TPFILE, OCLOSE_OUT, & - PRHODREF, PEXNREF, PPABST, PT, PTM, PW_NU, & - ZTHT, ZRVT, ZRCT, ZCCT, ZRRT, ZNFT, ZNAT) + CALL LIMA_CCN_ACTIVATION (PTSTEP, TPFILE, OCLOSE_OUT, & + PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & + ZTHT, ZRVT, ZRCT, ZCCT, ZRRT, ZNFT, ZNAT ) PTHT(:,:,:) = ZTHT(:,:,:) PRVT(:,:,:) = ZRVT(:,:,:) PRCT(:,:,:) = ZRCT(:,:,:) @@ -189,7 +191,7 @@ IF (LCOLD .AND. LNUCL .AND. .NOT.LMEYERS .AND. NMOD_IFN.GE.1) THEN ZTHT, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & ZCCT, ZCIT, ZNAT, ZIFT, ZINT, ZNIT, & Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, & - Z_RC_HINC, Z_CC_HINC ) + Z_TH_HINC, Z_RC_HINC, Z_CC_HINC ) ! ! Call budgets ! @@ -235,7 +237,7 @@ IF (LCOLD .AND. LNUCL .AND. LMEYERS) THEN ZTHT, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & ZCCT, ZCIT, ZINT, & Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, & - Z_RC_HINC, Z_CC_HINC ) + Z_TH_HINC, Z_RC_HINC, Z_CC_HINC ) ! ! Call budgets ! @@ -288,6 +290,7 @@ PTHT(:,:,:) = ZTHT(:,:,:) PRVT(:,:,:) = ZRVT(:,:,:) PRIT(:,:,:) = ZRIT(:,:,:) PCIT(:,:,:) = ZCIT(:,:,:) +PNFT(:,:,:,:) = ZNFT(:,:,:,:) PNHT(:,:,:) = ZNHT(:,:,:) ENDIF ! diff --git a/src/MNH/lima_phillips_ifn_nucleation.f90 b/src/MNH/lima_phillips_ifn_nucleation.f90 index a6cd6aa804cfb86b819599cee52b962fc3f489d7..440a53f1550937df07b86365ce60cb8e2c61a0f9 100644 --- a/src/MNH/lima_phillips_ifn_nucleation.f90 +++ b/src/MNH/lima_phillips_ifn_nucleation.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2018-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2013-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. @@ -13,7 +13,7 @@ INTERFACE PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & PCCT, PCIT, PNAT, PIFT, PINT, PNIT, & P_TH_HIND, P_RI_HIND, P_CI_HIND, & - P_RC_HINC, P_CC_HINC ) + P_TH_HINC, P_RC_HINC, P_CC_HINC ) ! REAL, INTENT(IN) :: PTSTEP ! @@ -36,11 +36,12 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFT ! Free IFN conc. REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT ! Nucleated IFN conc. REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIT ! Nucleated (by immersion) CCN conc. ! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_TH_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_RI_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_CI_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_RC_HINC -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_CC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CC_HINC ! END SUBROUTINE LIMA_PHILLIPS_IFN_NUCLEATION END INTERFACE @@ -52,7 +53,7 @@ END MODULE MODI_LIMA_PHILLIPS_IFN_NUCLEATION PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & PCCT, PCIT, PNAT, PIFT, PINT, PNIT, & P_TH_HIND, P_RI_HIND, P_CI_HIND, & - P_RC_HINC, P_CC_HINC ) + P_TH_HINC, P_RC_HINC, P_CC_HINC ) ! ################################################################################# !! !! PURPOSE @@ -103,7 +104,8 @@ END MODULE MODI_LIMA_PHILLIPS_IFN_NUCLEATION !! ------------- !! Original 15/03/2018 ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -! +! P. Wautelet 27/02/2020: bugfix: P_TH_HIND was not accumulated (will affect budgets) + add P_TH_HINC dummy argument +! + change intent of *_HIND and *_HINC dummy arguments (INOUT->OUT) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -151,11 +153,12 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFT ! Free IFN conc. REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT ! Nucleated IFN conc. REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIT ! Nucleated (by immersion) CCN conc. ! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_TH_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_RI_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_CI_HIND -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_RC_HINC -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_CC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CC_HINC ! ! !* 0.2 Declarations of local variables : @@ -218,6 +221,7 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZTCELSIUS, ZZT_SI0_BC P_TH_HIND(:,:,:) = 0. P_RI_HIND(:,:,:) = 0. P_CI_HIND(:,:,:) = 0. +P_TH_HINC(:,:,:) = 0. P_RC_HINC(:,:,:) = 0. P_CC_HINC(:,:,:) = 0. ! @@ -408,8 +412,9 @@ IF (INEGT > 0) THEN PRVT(:,:,:) = PRVT(:,:,:) - ZW(:,:,:) PRIT(:,:,:) = PRIT(:,:,:) + ZW(:,:,:) ! - P_TH_HIND(:,:,:) = UNPACK( ZZW(:)*ZLSFACT(:), MASK=GNEGT(:,:,:), FIELD=0. ) - PTHT(:,:,:) = PTHT(:,:,:) + P_TH_HIND(:,:,:) + ZW(:,:,:) = UNPACK( ZZW(:)*ZLSFACT(:), MASK=GNEGT(:,:,:), FIELD=0. ) + P_TH_HIND(:,:,:) = P_TH_HIND(:,:,:) + ZW(:,:,:) + PTHT(:,:,:) = PTHT(:,:,:) + ZW(:,:,:) END DO ! ! @@ -453,7 +458,10 @@ IF (INEGT > 0) THEN P_RC_HINC(:,:,:) = P_RC_HINC(:,:,:) - ZW(:,:,:) PRCT(:,:,:) = PRCT(:,:,:) - ZW(:,:,:) PRIT(:,:,:) = PRIT(:,:,:) + ZW(:,:,:) - PTHT(:,:,:) = PTHT(:,:,:) + UNPACK( ZZY(:)*ZLSFACT(:), MASK=GNEGT(:,:,:), FIELD=0. ) +! + ZW(:,:,:) = UNPACK( ZZY(:)*ZLSFACT(:), MASK=GNEGT(:,:,:), FIELD=0. ) + P_TH_HINC(:,:,:) = P_TH_HINC(:,:,:) + ZW(:,:,:) + PTHT(:,:,:) = PTHT(:,:,:) + ZW(:,:,:) END IF END DO ! diff --git a/src/MNH/lima_sedimentation.f90 b/src/MNH/lima_sedimentation.f90 index 88a0a544ba43209e515ae2bf972eff8a57b79714..365ae0f23362e17a84e8f9ab1682d8dc165f38dd 100644 --- a/src/MNH/lima_sedimentation.f90 +++ b/src/MNH/lima_sedimentation.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2018-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2018-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. @@ -65,6 +65,7 @@ END MODULE MODI_LIMA_SEDIMENTATION !! B.Vie 02/2019 Desactivate (comment) the heat transport by droplets ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! B. Vie 03/2020: disable temperature change of droplets by air temperature !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -230,7 +231,7 @@ DO JN = 1 , NSPLITSED(KID) DEALLOCATE(ZZY) ! PINPR(:,:) = PINPR(:,:) + ZWSEDR(:,:,KKB)/XRHOLW/NSPLITSED(KID) ! in m/s - PT(:,:,:) = PT(:,:,:) + ZWDT(:,:,:) + !PT(:,:,:) = PT(:,:,:) + ZWDT(:,:,:) END IF END DO diff --git a/src/MNH/lima_warm.f90 b/src/MNH/lima_warm.f90 index 1ac67f3ce0e7830f0112bad40bf766dbcb0fd783..d982cbe4fdc52b4c6d2de105836a2ad6fcf66937 100644 --- a/src/MNH/lima_warm.f90 +++ b/src/MNH/lima_warm.f90 @@ -127,7 +127,8 @@ END MODULE MODI_LIMA_WARM !! C. Barthe * LACy * jan. 2014 add budgets !! J. Escobar : for real*4 , use XMNH_HUGE !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +!! B.Vié 03/02/2020 : correction of activation of water deposition on the ground +!! B.Vié 03/03/2020 : use DTHRAD instead of dT/dt in Smax diagnostic computation !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -219,16 +220,16 @@ REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & PCCS, & ! Cloud water C. source PCRS ! Rain water C. source ! -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNFS ! CCN C. available source +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNFS ! CCN C. available source !used as Free ice nuclei for !HOMOGENEOUS nucleation of haze -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNAS ! Cloud C. nuclei C. source +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNAS ! Cloud C. nuclei C. source !used as Free ice nuclei for !IMMERSION freezing ! ! REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & - :: ZT, ZTM + :: ZT REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & :: ZWLBDR,ZWLBDR3,ZWLBDC,ZWLBDC3 INTEGER :: JL @@ -269,15 +270,15 @@ IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) IF ( LWARM .AND. LRAIN ) PCRS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NR) ! IF ( NMOD_CCN .GE. 1 ) THEN - ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) - ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) - PNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) - PNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) + ALLOCATE( ZNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( ZNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ZNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) + ZNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) ELSE - ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) - ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) - PNFS(:,:,:,:) = 0. - PNAS(:,:,:,:) = 0. + ALLOCATE( ZNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( ZNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ZNFS(:,:,:,:) = 0. + ZNAS(:,:,:,:) = 0. END IF ! !------------------------------------------------------------------------------- @@ -302,11 +303,6 @@ WHERE (PRRT(:,:,:)>XRTMIN(3) .AND. PCRT(:,:,:)>XCTMIN(3)) ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR END WHERE ZT(:,:,:) = PTHT(:,:,:) * (PPABST(:,:,:)/XP00)**(XRD/XCPD) -IF( OACTIT ) THEN - ZTM(:,:,:) = PTHM(:,:,:) * (PPABSM(:,:,:)/XP00)**(XRD/XCPD) -ELSE - ZTM(:,:,:) = ZT(:,:,:) -END IF ! !------------------------------------------------------------------------------- ! @@ -335,7 +331,7 @@ END IF IF (LDEPOC) THEN PINDEP(:,:)=0. GDEP(:,:) = .FALSE. - GDEP(:,:) = PRCS(:,:,2) >0 .AND. PCCS(:,:,2) >0 + GDEP(:,:) = PRCS(:,:,2) >0 .AND. PCCS(:,:,2) >0 .AND. PRCT(:,:,2) >0 .AND. PCCT(:,:,2) >0 WHERE (GDEP) PRCS(:,:,2) = PRCS(:,:,2) - XVDEPOC * PRCT(:,:,2) / ( PZZ(:,:,3) - PZZ(:,:,2)) PCCS(:,:,2) = PCCS(:,:,2) - XVDEPOC * PCCT(:,:,2) / ( PZZ(:,:,3) - PZZ(:,:,2)) @@ -356,9 +352,9 @@ END IF IF (LACTI .AND. NMOD_CCN.GE.1) THEN ! CALL LIMA_WARM_NUCL (OACTIT, PTSTEP, KMI, TPFILE, OCLOSE_OUT,& - PRHODREF, PEXNREF, PPABST, ZT, ZTM, PW_NU, & + PRHODREF, PEXNREF, PPABST, ZT, PTHM, PW_NU, & PRCM, PRVT, PRCT, PRRT, & - PTHS, PRVS, PRCS, PCCS, PNFS, PNAS ) + PTHS, PRVS, PRCS, PCCS, ZNFS, ZNAS ) ! IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:)*PRHODJ(:,:,:),4,'HENU_BU_RTH') IF (LBUDGET_RV) CALL BUDGET (PRVS(:,:,:)*PRHODJ(:,:,:),6,'HENU_BU_RRV') @@ -366,7 +362,7 @@ IF (LACTI .AND. NMOD_CCN.GE.1) THEN IF (LBUDGET_SV) THEN CALL BUDGET (PCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,'HENU_BU_RSV') ! RCN DO JL=1, NMOD_CCN - CALL BUDGET ( PNFS(:,:,:,JL)*PRHODJ(:,:,:),12+NSV_LIMA_CCN_FREE+JL-1,'HENU_BU_RSV') + CALL BUDGET ( ZNFS(:,:,:,JL)*PRHODJ(:,:,:),12+NSV_LIMA_CCN_FREE+JL-1,'HENU_BU_RSV') END DO END IF ! @@ -448,14 +444,12 @@ IF ( LWARM ) PSVS(:,:,:,NSV_LIMA_NC) = PCCS(:,:,:) IF ( LWARM .AND. LRAIN ) PSVS(:,:,:,NSV_LIMA_NR) = PCRS(:,:,:) ! IF ( NMOD_CCN .GE. 1 ) THEN - PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = PNFS(:,:,:,:) - PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = PNAS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = ZNFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = ZNAS(:,:,:,:) END IF ! -!++cb++ -IF (ALLOCATED(PNFS)) DEALLOCATE(PNFS) -IF (ALLOCATED(PNAS)) DEALLOCATE(PNAS) -!--cb-- +IF (ALLOCATED(ZNFS)) DEALLOCATE(ZNFS) +IF (ALLOCATED(ZNAS)) DEALLOCATE(ZNAS) ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/lima_warm_nucl.f90 b/src/MNH/lima_warm_nucl.f90 index 3cd2f705228d3a81608c24308e85cfefe259cd9e..c9d061fc87aecfeebc3e2f0f5b5a8b08edce7cca 100644 --- a/src/MNH/lima_warm_nucl.f90 +++ b/src/MNH/lima_warm_nucl.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2013-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2013-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. @@ -9,7 +9,7 @@ ! INTERFACE SUBROUTINE LIMA_WARM_NUCL (OACTIT, PTSTEP, KMI, TPFILE, OCLOSE_OUT,& - PRHODREF, PEXNREF, PPABST, ZT, ZTM, PW_NU, & + PRHODREF, PEXNREF, PPABST, PT, PTM, PW_NU, & PRCM, PRVT, PRCT, PRRT, & PTHS, PRVS, PRCS, PCCS, PNFS, PNAS ) ! @@ -28,8 +28,8 @@ LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: ZTM ! Temperature at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTM ! Temperature at time t-dt ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for ! the nucleation param. @@ -53,7 +53,7 @@ END INTERFACE END MODULE MODI_LIMA_WARM_NUCL ! ############################################################################# SUBROUTINE LIMA_WARM_NUCL (OACTIT, PTSTEP, KMI, TPFILE, OCLOSE_OUT,& - PRHODREF, PEXNREF, PPABST, ZT, ZTM, PW_NU, & + PRHODREF, PEXNREF, PPABST, PT, PTM, PW_NU, & PRCM, PRVT, PRCT, PRRT, & PTHS, PRVS, PRCS, PCCS, PNFS, PNAS ) ! ############################################################################# @@ -105,7 +105,7 @@ END MODULE MODI_LIMA_WARM_NUCL ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -! +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -141,8 +141,8 @@ LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: ZTM ! Temperature at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTM ! Temperature at time t-dt ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for ! the nucleation param. @@ -222,13 +222,7 @@ IJE=SIZE(PRHODREF,2) - JPHEXT IKB=1+JPVEXT IKE=SIZE(PRHODREF,3) - JPVEXT ! -!++cb++ -!ALLOCATE(ZRTMIN(SIZE(XRTMIN))) -!--cb-- ALLOCATE(ZCTMIN(SIZE(XCTMIN))) -!++cb++ -!ZRTMIN(:) = XRTMIN(:) / PTSTEP -!--cb-- ZCTMIN(:) = XCTMIN(:) / PTSTEP ! ! Saturation vapor mixing ratio and radiative tendency @@ -236,11 +230,12 @@ ZCTMIN(:) = XCTMIN(:) / PTSTEP ZEPS= XMV / XMD ! ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:) * & - EXP(-XALPW+XBETAW/ZT(:,:,:)+XGAMW*ALOG(ZT(:,:,:))) - 1.0) + EXP(-XALPW+XBETAW/PT(:,:,:)+XGAMW*ALOG(PT(:,:,:))) - 1.0) ZTDT(:,:,:) = 0. !! ZDRC(:,:,:) = 0. -IF (OACTIT) THEN - ZTDT(:,:,:) = (ZT(:,:,:)-ZTM(:,:,:))/PTSTEP ! dT/dt +IF (OACTIT .AND. SIZE(PTM).GT.0) THEN + ZTDT(:,:,:) = PTM(:,:,:) ! dThRad +! ZTDT(:,:,:) = (PT(:,:,:)-PTM(:,:,:))/PTSTEP ! dT/dt !!! JPP !!! JPP !!! ZDRC(:,:,:) = (PRCT(:,:,:)-PRCM(:,:,:))/PTSTEP ! drc/dt @@ -251,7 +246,7 @@ IF (OACTIT) THEN !! BV - W and drc/dt effect should not be included in ZTDT (already accounted for in the computations) ? !! !! ZTDT(:,:,:) = MIN(0.,ZTDT(:,:,:)+(XG*PW_NU(:,:,:))/XCPD- & -!! (XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT))*ZDRC(:,:,:)/XCPD) +!! (XLVTT+(XCPV-XCL)*(PT(:,:,:)-XTT))*ZDRC(:,:,:)/XCPD) END IF ! ! find locations where CCN are available @@ -272,13 +267,13 @@ IF( OACTIT ) THEN ZTDT(IIB:IIE,IJB:IJE,IKB:IKE)<XTMIN .OR. & PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) ) .AND.& PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>(0.98*ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE))& - .AND. ZT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & + .AND. PT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(4) ELSE GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = (PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN .OR. & PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) ) .AND.& PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>(0.98*ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE))& - .AND. ZT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & + .AND. PT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(4) END IF INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) @@ -306,7 +301,7 @@ IF( INUCT >= 1 ) THEN ALLOCATE(ZEXNREF(INUCT)) DO JL=1,INUCT ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) - ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = PT(I1(JL),I2(JL),I3(JL)) ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) ZZW2(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) ZZTDT(JL) = ZTDT(I1(JL),I2(JL),I3(JL)) @@ -484,7 +479,7 @@ IF( INUCT >= 1 ) THEN ! PRVS(:,:,:) = PRVS(:,:,:) - ZW(:,:,:) PRCS(:,:,:) = PRCS(:,:,:) + ZW(:,:,:) - ZW(:,:,:) = ZW(:,:,:) * (XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT))/ & + ZW(:,:,:) = ZW(:,:,:) * (XLVTT+(XCPV-XCL)*(PT(:,:,:)-XTT))/ & (PEXNREF(:,:,:)*(XCPD+XCPV*PRVT(:,:,:)+XCL*(PRCT(:,:,:)+PRRT(:,:,:)))) PTHS(:,:,:) = PTHS(:,:,:) + ZW(:,:,:) ! diff --git a/src/MNH/mnhget_surf_paramn.f90 b/src/MNH/mnhget_surf_paramn.f90 index da6c4608943b601d01edfbb2a234079a68c551cb..937af0e3cee56a552c469fd360bc22fc4937b08b 100644 --- a/src/MNH/mnhget_surf_paramn.f90 +++ b/src/MNH/mnhget_surf_paramn.f90 @@ -9,15 +9,19 @@ INTERFACE SUBROUTINE MNHGET_SURF_PARAM_n(PCOVER,PSEA,KCOVER,PRN,PH,PLE,PLEI,PGFLUX, & PT2M,PQ2M,PHU2M,PZON10M,PMER10M,PZS,PTOWN,& - PBARE, PLAI_TREE, PH_TREE ) + PBARE, PLAI_TREE, PH_TREE, PWALL_O_HOR, & + PBUILD_HEIGHT,PNATURE ) ! REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCOVER ! cover types REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PSEA ! sea fraction REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PTOWN ! town fraction +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PNATURE ! nature fraction INTEGER, INTENT(OUT), OPTIONAL :: KCOVER ! number of cover types REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PBARE ! Bare soil fraction -REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PLAI_TREE ! -REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PH_TREE +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PLAI_TREE ! Tree leaf area index [m^2(leaf)/m^2(nature)] +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PH_TREE ! Tree height [m] +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PWALL_O_HOR ! Facade area density [m^2(fac.)/m^2(town)] +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PBUILD_HEIGHT ! Building height [m] REAL, DIMENSION(:), INTENT(INOUT), OPTIONAL :: PRN ! Net radiation at surface (W/m2) REAL, DIMENSION(:), INTENT(INOUT), OPTIONAL :: PH ! Sensible heat flux (W/m2) REAL, DIMENSION(:), INTENT(INOUT), OPTIONAL :: PLE ! Total Latent heat flux (W/m2) @@ -38,7 +42,8 @@ END MODULE MODI_MNHGET_SURF_PARAM_n ! ######################################## SUBROUTINE MNHGET_SURF_PARAM_n(PCOVER,PSEA,KCOVER,PRN,PH,PLE,PLEI,PGFLUX, & PT2M,PQ2M,PHU2M,PZON10M,PMER10M,PZS,PTOWN,& - PBARE, PLAI_TREE, PH_TREE ) + PBARE, PLAI_TREE, PH_TREE, PWALL_O_HOR, & + PBUILD_HEIGHT,PNATURE ) ! ######################################## ! !!**** *MNHGET_SURF_PARAM_n* - gets some surface fields on MESONH grid @@ -74,6 +79,7 @@ END MODULE MODI_MNHGET_SURF_PARAM_n !! S. Donier 06/2015 : bug surface aerosols !! 06/2016 (G.Delautier) phasage surfex 8 !! 01/2018 (G.Delautier) SURFEX 8.1 +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -101,10 +107,13 @@ IMPLICIT NONE REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCOVER ! cover types REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PSEA ! sea fraction REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PTOWN ! town fraction +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PNATURE ! nature fraction INTEGER, INTENT(OUT), OPTIONAL :: KCOVER ! number of cover types REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PBARE ! Bare soil fraction REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PLAI_TREE ! REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PH_TREE ! +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PWALL_O_HOR ! Facade area density [m^2(fac.)/m^2(town)] +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PBUILD_HEIGHT ! Building height [m] REAL, DIMENSION(:), INTENT(INOUT), OPTIONAL :: PRN ! Net radiation at surface (W/m2) REAL, DIMENSION(:), INTENT(INOUT), OPTIONAL :: PH ! Sensible heat flux (W/m2) REAL, DIMENSION(:), INTENT(INOUT), OPTIONAL :: PLE ! Total Latent heat flux (W/m2) @@ -137,6 +146,8 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZNATURE! nature fraction REAL, DIMENSION(:), ALLOCATABLE :: ZTOWN ! town fraction REAL, DIMENSION(:), ALLOCATABLE :: ZVH REAL, DIMENSION(:), ALLOCATABLE :: ZLAI +REAL, DIMENSION(:), ALLOCATABLE :: ZWALL_O_HOR ! Facade surface density [m^2(fac.)/m^2(town)] +REAL, DIMENSION(:), ALLOCATABLE :: ZBUILD_HEIGHT ! Building height [m] REAL, DIMENSION(:), ALLOCATABLE :: ZBARE ! bare soil fraction REAL, DIMENSION(:), ALLOCATABLE :: ZZS ! orography REAL, DIMENSION(:), ALLOCATABLE :: ZRN ! net radiation at surface (W/m2) @@ -170,8 +181,9 @@ IF (PRESENT(PCOVER)) THEN DEALLOCATE(ZCOVER) END IF ! -IF (PRESENT(PSEA) .OR. PRESENT(PTOWN) .OR. & - PRESENT(PBARE) .OR. PRESENT(PLAI_TREE) .OR. PRESENT(PH_TREE)) THEN +IF (PRESENT(PSEA) .OR. PRESENT(PTOWN) .OR. PRESENT(PNATURE) .OR. & + PRESENT(PBARE) .OR. PRESENT(PLAI_TREE) .OR. PRESENT(PH_TREE) .OR. & + PRESENT(PWALL_O_HOR) .OR. PRESENT(PBUILD_HEIGHT) ) THEN ALLOCATE(ZSEA ( ILU )) ALLOCATE(ZWATER ( ILU )) ALLOCATE(ZNATURE( ILU )) @@ -183,6 +195,9 @@ IF (PRESENT(PSEA) .OR. PRESENT(PTOWN) .OR. & IF (PRESENT(PTOWN)) THEN CALL REMOVE_HALO(ZTOWN,PTOWN) END IF + IF (PRESENT(PNATURE)) THEN + CALL REMOVE_HALO(ZNATURE,PNATURE) + END IF END IF ! IF (PRESENT(PBARE)) THEN @@ -248,6 +263,22 @@ IF (PRESENT(PH_TREE) .OR.PRESENT(PLAI_TREE)) THEN DEALLOCATE(ZLAI) END IF ! +IF (PRESENT(PWALL_O_HOR) .OR. PRESENT(PBUILD_HEIGHT)) THEN + PBUILD_HEIGHT(:,:) = XUNDEF + PWALL_O_HOR(:,:) = XUNDEF + ALLOCATE(ZBUILD_HEIGHT ( ILU )) + ALLOCATE(ZWALL_O_HOR ( ILU )) + CALL GET_SURF_VAR_n(YSURF_CUR%FM,YSURF_CUR%IM,YSURF_CUR%SM,YSURF_CUR%TM, & + YSURF_CUR%WM,YSURF_CUR%DUO,YSURF_CUR%DU,YSURF_CUR%UG,& + YSURF_CUR%U,YSURF_CUR%USS,& + 'MESONH',ILU,1,PTOWN=ZTOWN, & + PWALL_O_HOR=ZWALL_O_HOR,PBUILD_HEIGHT=ZBUILD_HEIGHT ) + CALL REMOVE_HALO(ZBUILD_HEIGHT,PBUILD_HEIGHT) + CALL REMOVE_HALO(ZWALL_O_HOR,PWALL_O_HOR) + DEALLOCATE(ZBUILD_HEIGHT) + DEALLOCATE(ZWALL_O_HOR) +END IF +! IF (ALLOCATED(ZSEA)) THEN DEALLOCATE(ZSEA ) DEALLOCATE(ZWATER ) diff --git a/src/MNH/modd_budget.f90 b/src/MNH/modd_budget.f90 index 14387e9f096dfadc2fa95b186c91d1bf6e299cfe..c39a3436d7a650e609d81ab92ee5980d08bbd581 100644 --- a/src/MNH/modd_budget.f90 +++ b/src/MNH/modd_budget.f90 @@ -42,6 +42,7 @@ !! C. LAc 10/2016 add droplets deposition !! S. Riette 11/2016 New budgets for ICE3/ICE4 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! B.Vie 03/02/2020 : LIMA negativity checks after turbulence, advection and microphysics budgets !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -399,6 +400,9 @@ INTEGER, SAVE :: NFRCRR ! forcing INTEGER, SAVE :: NDIFRR ! numerical diffusion INTEGER, SAVE :: NRELRR ! relaxation INTEGER, SAVE :: NNEGARR ! negative correction +INTEGER, SAVE :: NNETURRR ! negative correction +INTEGER, SAVE :: NNEADVRR ! negative correction +INTEGER, SAVE :: NNECONRR ! negative correction INTEGER, SAVE :: NACCRRR ! accretion INTEGER, SAVE :: NAUTORR ! autoconversion INTEGER, SAVE :: NREVARR ! rain evaporation @@ -434,6 +438,9 @@ INTEGER, SAVE :: NDCONVRI ! Deep CONVection INTEGER, SAVE :: NHTURBRI ! horizontal turbulence INTEGER, SAVE :: NVTURBRI ! vertical turbulence INTEGER, SAVE :: NNEGARI ! negative correction +INTEGER, SAVE :: NNETURRI ! negative correction +INTEGER, SAVE :: NNEADVRI ! negative correction +INTEGER, SAVE :: NNECONRI ! negative correction INTEGER, SAVE :: NSEDIRI ! SEDImentation ICE3 INTEGER, SAVE :: NHENURI ! HEterogenous NUcleation ICE3 INTEGER, SAVE :: NHONRI ! HOmogeneous Nucleation ICE3 @@ -472,6 +479,9 @@ INTEGER, SAVE :: NFRCRS ! forcing INTEGER, SAVE :: NDIFRS ! numerical diffusion INTEGER, SAVE :: NRELRS ! relaxation INTEGER, SAVE :: NNEGARS ! negative correction +INTEGER, SAVE :: NNETURRS ! negative correction +INTEGER, SAVE :: NNEADVRS ! negative correction +INTEGER, SAVE :: NNECONRS ! negative correction INTEGER, SAVE :: NSEDIRS ! SEDImentation ICE3 INTEGER, SAVE :: NDEPSRS ! DEPosition on Snow ICE3 INTEGER, SAVE :: NAGGSRS ! AGGregation of snow ICE3 @@ -501,6 +511,9 @@ INTEGER, SAVE :: NFRCRG ! forcing INTEGER, SAVE :: NDIFRG ! numerical diffusion INTEGER, SAVE :: NRELRG ! relaxation INTEGER, SAVE :: NNEGARG ! negative correction +INTEGER, SAVE :: NNETURRG ! negative correction +INTEGER, SAVE :: NNEADVRG ! negative correction +INTEGER, SAVE :: NNECONRG ! negative correction INTEGER, SAVE :: NSEDIRG ! SEDImentation ICE3 INTEGER, SAVE :: NSFRRG ! Spontaneous FReezing ICE3 INTEGER, SAVE :: NDEPGRG ! DEPosition on Snow ICE3 @@ -533,6 +546,9 @@ INTEGER, SAVE :: NFRCRH ! forcing INTEGER, SAVE :: NDIFRH ! numerical diffusion INTEGER, SAVE :: NRELRH ! relaxation INTEGER, SAVE :: NNEGARH ! negative correction +INTEGER, SAVE :: NNETURRH ! negative correction +INTEGER, SAVE :: NNEADVRH ! negative correction +INTEGER, SAVE :: NNECONRH ! negative correction INTEGER, SAVE :: NSEDIRH ! sedimentation INTEGER, SAVE :: NWETGRH ! wet growth of graupel INTEGER, SAVE :: NWETHRH ! wet growth of hail @@ -566,7 +582,7 @@ INTEGER, SAVE :: NNEGASV INTEGER, SAVE :: NDEPSQV INTEGER, SAVE :: NDEPGQV INTEGER, SAVE :: NREVAQV -INTEGER, SAVE :: NDEPIQV +INTEGER, SAVE :: NCDEPIQV INTEGER, SAVE :: NNEUTQV ! ! Allowed processes for the budget of electric charge carried by cloud droplets @@ -577,8 +593,7 @@ INTEGER, SAVE :: NWETGQC INTEGER, SAVE :: NDRYGQC INTEGER, SAVE :: NIMLTQC INTEGER, SAVE :: NBERFIQC -INTEGER, SAVE :: NDEPIQC -INTEGER, SAVE :: NINDQC ! inductive process +INTEGER, SAVE :: NCDEPIQC INTEGER, SAVE :: NSEDIQC INTEGER, SAVE :: NNEUTQC ! @@ -602,7 +617,7 @@ INTEGER, SAVE :: NWETGQI INTEGER, SAVE :: NDRYGQI INTEGER, SAVE :: NIMLTQI INTEGER, SAVE :: NBERFIQI -INTEGER, SAVE :: NDEPIQI +INTEGER, SAVE :: NCDEPIQI INTEGER, SAVE :: NNIISQI ! non-inductive I-S INTEGER, SAVE :: NSEDIQI INTEGER, SAVE :: NNEUTQI @@ -629,7 +644,6 @@ INTEGER, SAVE :: NCFRZQG INTEGER, SAVE :: NWETGQG INTEGER, SAVE :: NDRYGQG INTEGER, SAVE :: NGMLTQG -INTEGER, SAVE :: NINDQG ! inductive process INTEGER, SAVE :: NSEDIQG INTEGER, SAVE :: NNEUTQG ! diff --git a/src/MNH/modd_dragbldgn.f90 b/src/MNH/modd_dragbldgn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f89fc0d09d34143191714cca3d89bbf9a55ab580 --- /dev/null +++ b/src/MNH/modd_dragbldgn.f90 @@ -0,0 +1,54 @@ +!MNH_LIC Copyright 2019-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 MODD_DRAGBLDG_n +!! ##################### +!! +!!*** *MODD_DRAGBLDG* +!! +!! PURPOSE +!! ------- +! Declaration to take into account building drag in Meso-NH instead of SURFEX. +!! +!!** AUTHOR +!! ------ +!! R.Schoetter *CNRM* +! +!! MODIFICATIONS +!! ------------- +!! Original 09/2019 +!----------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ----------------- +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX +! +IMPLICIT NONE +! +TYPE DRAGBLDG_t + ! + LOGICAL :: LDRAGBLDG ! flag used to take into account building drag in + ! ! the atmospheric model instead of SURFEX. + ! +END TYPE DRAGBLDG_t +! +TYPE(DRAGBLDG_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: DRAGBLDG_MODEL +! +LOGICAL, POINTER :: LDRAGBLDG=>NULL() +! +CONTAINS +! +SUBROUTINE DRAGBLDG_GOTO_MODEL(KFROM, KTO) + ! + INTEGER, INTENT(IN) :: KFROM, KTO + ! + LDRAGBLDG=>DRAGBLDG_MODEL(KTO)%LDRAGBLDG + ! +END SUBROUTINE DRAGBLDG_GOTO_MODEL +! +END MODULE MODD_DRAGBLDG_n diff --git a/src/MNH/modd_dragtree.f90 b/src/MNH/modd_dragtree.f90 deleted file mode 100644 index 7390bf68283e54df8e4086a89c8d7953616aa8c4..0000000000000000000000000000000000000000 --- a/src/MNH/modd_dragtree.f90 +++ /dev/null @@ -1,36 +0,0 @@ -!MNH_LIC Copyright 1994-2014 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 MODD_DRAGTREE -!! ##################### -!! -!!*** *MODD_DRAGTREE* -!! -!! PURPOSE -!! ------- -! Declaration to take into account tree drag in Meso-NH -! instead of SURFEX. -!! -!!** AUTHOR -!! ------ -!! C.Lac *CNRM* -! -!! MODIFICATIONS -!! ------------- -!! Original 30/06/11 -!! 06/16 (C.Lac) Add droplet deposition -!----------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ----------------- -IMPLICIT NONE -LOGICAL :: LDRAGTREE ! flag used to take into account tree drag in -! ! the atmospheric model instead of SURFEX. -LOGICAL :: LDEPOTREE ! flag for droplet deposition on trees -! -REAL :: XVDEPOTREE ! Droplet deposition velocity -! -END MODULE MODD_DRAGTREE diff --git a/src/MNH/modd_dragtreen.f90 b/src/MNH/modd_dragtreen.f90 new file mode 100644 index 0000000000000000000000000000000000000000..0ed016777983a5fcc69e029270e2c41838aba595 --- /dev/null +++ b/src/MNH/modd_dragtreen.f90 @@ -0,0 +1,65 @@ +!MNH_LIC Copyright 2011-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 MODD_DRAGTREE_n +!! ##################### +!! +!!*** *MODD_DRAGTREE* +!! +!! PURPOSE +!! ------- +! Declaration to take into account tree drag in Meso-NH +! instead of SURFEX. +!! +!!** AUTHOR +!! ------ +!! C.Lac *CNRM* +! +!! MODIFICATIONS +!! ------------- +!! Original 30/06/11 +!! 06/16 (C.Lac) Add droplet deposition +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree + +!----------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ----------------- +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX +! +IMPLICIT NONE +! +TYPE DRAGTREE_t + ! + LOGICAL :: LDRAGTREE ! flag used to take into account tree drag in + ! ! the atmospheric model instead of SURFEX. + LOGICAL :: LDEPOTREE ! flag for droplet deposition on trees + ! + REAL :: XVDEPOTREE ! Droplet deposition velocity + ! +END TYPE DRAGTREE_t +! +TYPE(DRAGTREE_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: DRAGTREE_MODEL +! +LOGICAL,POINTER :: LDRAGTREE=>NULL() +LOGICAL,POINTER :: LDEPOTREE=>NULL() +REAL ,POINTER :: XVDEPOTREE=>NULL() +! +CONTAINS +! +SUBROUTINE DRAGTREE_GOTO_MODEL(KFROM, KTO) + ! + INTEGER, INTENT(IN) :: KFROM, KTO + ! + LDRAGTREE=>DRAGTREE_MODEL(KTO)%LDRAGTREE + LDEPOTREE=>DRAGTREE_MODEL(KTO)%LDEPOTREE + XVDEPOTREE=>DRAGTREE_MODEL(KTO)%XVDEPOTREE + ! +END SUBROUTINE DRAGTREE_GOTO_MODEL +! +END MODULE MODD_DRAGTREE_n diff --git a/src/MNH/modd_frc.f90 b/src/MNH/modd_frc.f90 index 0fdd3c63315b69c0bc97eaa7852cea8b93884763..a430ad6034fce90152a49a63052db13cb2f87e2b 100644 --- a/src/MNH/modd_frc.f90 +++ b/src/MNH/modd_frc.f90 @@ -64,7 +64,6 @@ TYPE (DATE_TIME), SAVE, DIMENSION(:), ALLOCATABLE :: TDTFRC ! date of REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: XUFRC, &! geostrophic wind XVFRC, &! components U and V XWFRC ! large scale vertical wind -REAL, SAVE, DIMENSION(:,:,:),ALLOCATABLE:: XWTFRC ! large scale vertical wind REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: XTHFRC, &! large scale TH profile XRVFRC ! large scale RV profile REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: XGXTHFRC,&! large scale TH gradient diff --git a/src/MNH/modd_frcn.f90 b/src/MNH/modd_frcn.f90 index 3a01de69f39beb23c12defa4307cfbb4d07b8161..fc9c683629d057037e5a9884658007863b4c6aba 100644 --- a/src/MNH/modd_frcn.f90 +++ b/src/MNH/modd_frcn.f90 @@ -35,11 +35,12 @@ ! USE MODD_PARAMETERS, ONLY: JPMODELMAX IMPLICIT NONE - +! TYPE FRC_t ! - REAL, DIMENSION(:,:,:), POINTER :: XUFRC_PAST=>NULL()! Forcing wind components - REAL, DIMENSION(:,:,:), POINTER :: XVFRC_PAST=>NULL()! at previous time-step + REAL, DIMENSION(:,:,:), POINTER :: XUFRC_PAST=>NULL() ! Forcing wind components + REAL, DIMENSION(:,:,:), POINTER :: XVFRC_PAST=>NULL() ! at previous time-step + REAL, DIMENSION(:,:,:), POINTER :: XWTFRC=>NULL() ! large scale vertical wind ! END TYPE FRC_t @@ -47,6 +48,7 @@ TYPE(FRC_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: FRC_MODEL REAL, DIMENSION(:,:,:), POINTER :: XUFRC_PAST=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XVFRC_PAST=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XWTFRC=>NULL() CONTAINS @@ -56,11 +58,13 @@ INTEGER, INTENT(IN) :: KFROM, KTO ! Save current state for allocated arrays FRC_MODEL(KFROM)%XUFRC_PAST=>XUFRC_PAST FRC_MODEL(KFROM)%XVFRC_PAST=>XVFRC_PAST +FRC_MODEL(KFROM)%XWTFRC=>XWTFRC ! ! Current model is set to model KTO XUFRC_PAST=>FRC_MODEL(KTO)%XUFRC_PAST XVFRC_PAST=>FRC_MODEL(KTO)%XVFRC_PAST - +XWTFRC=>FRC_MODEL(KTO)%XWTFRC +! END SUBROUTINE FRC_GOTO_MODEL END MODULE MODD_FRC_n diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 919e8bb405d9645d7adcb76848a95061612e4a7a..7def250d57f0a34ad2a8013b1df7c462342efb28 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -886,7 +886,7 @@ CALL BOUNDARIES ( & XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS, & XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS, & - XRHODJ, & + XRHODJ,XRHODREF, & XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT ) CALL MPPDB_CHECK3DM("after BOUNDARIES:XUT, XVT, XWT, XTHT, XTKET",PRECISION,& & XUT, XVT, XWT, XTHT, XTKET) @@ -1109,7 +1109,7 @@ END IF ! IF ( LFORCING ) THEN CALL FORCING(XTSTEP,LUSERV,XRHODJ,XCORIOZ,XZHAT,XZZ,TDTCUR,& - XUFRC_PAST, XVFRC_PAST, & + XUFRC_PAST, XVFRC_PAST,XWTFRC, & XUT,XVT,XWT,XTHT,XTKET,XRT,XSVT, & XRUS,XRVS,XRWS,XRTHS,XRTKES,XRRS,XRSVS,IMI,ZJ) END IF diff --git a/src/MNH/modn_budget.f90 b/src/MNH/modn_budget.f90 index 8d83765590a09f58a926aa1ed985a733951cc0ce..2e0f1f4ec6433fd184ddcb835902edc3aebb13cc 100644 --- a/src/MNH/modn_budget.f90 +++ b/src/MNH/modn_budget.f90 @@ -1,12 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!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 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: /srv/cvsroot/MNH-VX-Y-Z/src/MNH/modn_budget.f90,v $ $Revision: 1.2.2.1.2.1.2.1.10.1.2.3 $ $Date: 2014/01/09 15:01:56 $ -!----------------------------------------------------------------- ! ################## MODULE MODN_BUDGET ! ################## @@ -229,6 +225,7 @@ !! C. Barthe /16 add budget terms for LIMA !! C.Lac 10/2016 Add droplet deposition !! S. Riette 11/2016 New budgets for ICE3/ICE4 +!! B.Vie 03/02/2020 LIMA negativity checks after turbulence, advection and microphysics budgets !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -278,42 +275,48 @@ NAMELIST/NAM_BU_RRC/LBU_RRC, NASSERC, NNESTRC, NADVRC, NFRCRC, & NAMELIST/NAM_BU_RRR/LBU_RRR, NASSERR, NNESTRR, NADVRR, NFRCRR, & NDIFRR, NRELRR, NNEGARR, NACCRRR, NAUTORR, NREVARR, NSEDIRR, & NSFRRR, NACCRR, NCFRZRR, NWETGRR, NDRYGRR, NGMLTRR, NWETHRR, & - NHMLTRR, NDRYHRR, NCORRRR, NCMELRR,NHONRRR, NCORRRR, NR2C1RR, NCVRCRR + NHMLTRR, NDRYHRR, NCORRRR, NCMELRR,NHONRRR, NCORRRR, NR2C1RR, NCVRCRR, & + NNETURRR, NNEADVRR, NNECONRR ! NAMELIST/NAM_BU_RRI/LBU_RRI, NASSERI, NNESTRI, NADVRI, NFRCRI, & NDIFRI, NRELRI, NDCONVRI, NHTURBRI, NVTURBRI, NNEGARI, NSEDIRI, & NHENURI, NHONRI, NAGGSRI, NAUTSRI, NCFRZRI, NWETGRI, NDRYGRI, & NIMLTRI, NBERFIRI, NCDEPIRI, NWETHRI, NDRYHRI, NADJURI, NCORRRI, & NHINDRI, NHINCRI, NHONHRI, NHONCRI, NCNVIRI, NCNVSRI, & - NHMSRI, NHMGRI, NCEDSRI, NCORRRI + NHMSRI, NHMGRI, NCEDSRI, NCORRRI, & + NNETURRI, NNEADVRI, NNECONRI ! NAMELIST/NAM_BU_RRS/LBU_RRS, NASSERS, NNESTRS, NADVRS, NFRCRS, & NDIFRS, NRELRS, NNEGARS, NSEDIRS, NDEPSRS, NAGGSRS, NAUTSRS, & NRIMRS, NACCRS, NCMELRS, NWETGRS, NDRYGRS, NWETHRS, NDRYHRS, & - NCORRRS, NCNVIRS, NCNVSRS, NHMSRS, NCORRRS + NCORRRS, NCNVIRS, NCNVSRS, NHMSRS, NCORRRS, & + NNETURRS, NNEADVRS, NNECONRS ! NAMELIST/NAM_BU_RRG/LBU_RRG, NASSERG, NNESTRG, NADVRG, NFRCRG, & NDIFRG, NRELRG, NNEGARG, NSEDIRG, NSFRRG, NDEPGRG, NRIMRG, NACCRG, & NCMELRG, NCFRZRG, NWETGRG, NDRYGRG, NGMLTRG, NWETHRG, & - NDRYHRG, NCORRRG, NHGCVRG, NGHCVRG,NHONRRG, NHMGRG, NCOHGRG + NDRYHRG, NCORRRG, NHGCVRG, NGHCVRG,NHONRRG, NHMGRG, NCOHGRG, & + NNETURRG, NNEADVRG, NNECONRG ! NAMELIST/NAM_BU_RRH/LBU_RRH, NASSERH, NNESTRH, NADVRH, NFRCRH, & NDIFRH, NRELRH, NNEGARH, NSEDIRH, NWETGRH, NWETHRH, NDRYHRH, NHMLTRH, & - NCORRRH, NHGCVRH, NGHCVRH, NCOHGRH, NHMLTRH + NCORRRH, NHGCVRH, NGHCVRH, NCOHGRH, NHMLTRH, & + NNETURRH, NNEADVRH, NNECONRH ! NAMELIST/NAM_BU_RSV/ LBU_RSV, NASSESV, NNESTSV, NADVSV, NFRCSV, & NDIFSV, NRELSV, NDCONVSV, NVTURBSV, NHTURBSV, NCHEMSV, NMAFLSV, & NNEGASV, & + NDEPSQV, NDEPGQV, NREVAQV, NCDEPIQV, NNEUTQV, & NAUTOQC, NACCRQC, NRIMQC, NWETGQC, NDRYGQC, NIMLTQC, NBERFIQC, & - NDEPIQC, NINDQC, NSEDIQC, NNEUTQC, & + NCDEPIQC, NSEDIQC, NNEUTQC, & NAUTOQR, NACCRQR, NREVAQR, NACCQR, NCFRZQR, NWETGQR, NDRYGQR, & NGMLTQR, NSEDIQR, NNEUTQR, & NAGGSQI, NAUTSQI, NCFRZQI, NWETGQI, NDRYGQI, NIMLTQI, NBERFIQI, & - NDEPIQI, NNIISQI, NSEDIQI, NNEUTQI, & + NCDEPIQI, NNIISQI, NSEDIQI, NNEUTQI, & NDEPSQS, NAGGSQS, NAUTSQS, NRIMQS, NACCQS, NCMELQS, NWETGQS, & NDRYGQS, NNIISQS, NSEDIQS, NNEUTQS, & NDEPGQG, NRIMQG, NACCQG, NCMELQG, NCFRZQG, NWETGQG, NDRYGQG, & - NGMLTQG, NINDQG, NSEDIQG, NNEUTQG, NDEPOTRSV + NGMLTQG, NSEDIQG, NNEUTQG, NDEPOTRSV ! must add budget for hail ! END MODULE MODN_BUDGET diff --git a/src/MNH/modn_dragbldgn.f90 b/src/MNH/modn_dragbldgn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..bf2a7c7458fb91bbd436c5a17c39e9e6b63e8dcc --- /dev/null +++ b/src/MNH/modn_dragbldgn.f90 @@ -0,0 +1,52 @@ +!MNH_LIC Copyright 2019-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 MODN_DRAGBLDG_n +!! ##################### +!! +!!*** *MODN_DRAGBLDG* +!! +!! PURPOSE +!! ------- +! Namelist to take into account building drag in the atmospheric model +! instead of SURFEX. +!! +!!** AUTHOR +!! ------ +!! R.Schoetter *CNRM* +! +!! MODIFICATIONS +!! ------------- +!! Original 09/2019 +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +! +USE MODD_DRAGBLDG_n, ONLY : & + LDRAGBLDG_n => LDRAGBLDG +! +!----------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ----------------- +IMPLICIT NONE +! +LOGICAL, SAVE :: LDRAGBLDG +! +NAMELIST /NAM_DRAGBLDGn/LDRAGBLDG +! +CONTAINS +! +SUBROUTINE INIT_NAM_DRAGBLDGn + LDRAGBLDG = LDRAGBLDG_n +END SUBROUTINE INIT_NAM_DRAGBLDGn +! +SUBROUTINE UPDATE_NAM_DRAGBLDGn + LDRAGBLDG_n = LDRAGBLDG +END SUBROUTINE UPDATE_NAM_DRAGBLDGn +! +END MODULE MODN_DRAGBLDG_n diff --git a/src/MNH/modn_dragtree.f90 b/src/MNH/modn_dragtree.f90 deleted file mode 100644 index 58703b7a9474db24073b6248cd2d714eef0ffe21..0000000000000000000000000000000000000000 --- a/src/MNH/modn_dragtree.f90 +++ /dev/null @@ -1,40 +0,0 @@ -!MNH_LIC Copyright 1994-2014 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 MODN_DRAGTREE -!! ##################### -!! -!!*** *MODN_DRAGTREE* -!! -!! PURPOSE -!! ------- -! Namelist to take into account tree drag in the atmospheric model -! instead of SURFEX. -!! -!!** AUTHOR -!! ------ -!! C.Lac *CNRM* -! -!! MODIFICATIONS -!! ------------- -!! Original 30/06/11 -!! -!! 10/2016 : (C.Lac) Add droplet deposition on trees -!! IMPLICIT ARGUMENTS -!! ------------------ -USE MODD_DRAGTREE -!! -!----------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ----------------- -IMPLICIT NONE -SAVE -NAMELIST /NAM_DRAGTREE/ & - LDRAGTREE,LDEPOTREE,XVDEPOTREE - -! -END MODULE MODN_DRAGTREE diff --git a/src/MNH/modn_dragtreen.f90 b/src/MNH/modn_dragtreen.f90 new file mode 100644 index 0000000000000000000000000000000000000000..6f9fe1af4098ea854d6eff9adc735d1a9c8eca86 --- /dev/null +++ b/src/MNH/modn_dragtreen.f90 @@ -0,0 +1,62 @@ +!MNH_LIC Copyright 2011-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 MODN_DRAGTREE_n +!! ##################### +!! +!!*** *MODN_DRAGTREE* +!! +!! PURPOSE +!! ------- +! Namelist to take into account tree drag in the atmospheric model +! instead of SURFEX. +!! +!!** AUTHOR +!! ------ +!! C.Lac *CNRM* +! +!! MODIFICATIONS +!! ------------- +!! Original 30/06/11 +!! +!! 10/2016 : (C.Lac) Add droplet deposition on trees +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree +!! IMPLICIT ARGUMENTS +!! ------------------ +! +USE MODD_DRAGTREE_n, ONLY : & + LDRAGTREE_n => LDRAGTREE, & + LDEPOTREE_n => LDEPOTREE, & + XVDEPOTREE_n => XVDEPOTREE +! +!----------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ----------------- +IMPLICIT NONE +! +LOGICAL, SAVE :: LDRAGTREE +LOGICAL, SAVE :: LDEPOTREE +REAL, SAVE :: XVDEPOTREE +! +NAMELIST /NAM_DRAGTREEn/LDRAGTREE,LDEPOTREE,XVDEPOTREE +! +CONTAINS +! +SUBROUTINE INIT_NAM_DRAGTREEn + LDRAGTREE = LDRAGTREE_n + LDEPOTREE = LDEPOTREE_n + XVDEPOTREE = XVDEPOTREE_n +END SUBROUTINE INIT_NAM_DRAGTREEn +! +SUBROUTINE UPDATE_NAM_DRAGTREEn + LDRAGTREE_n = LDRAGTREE + LDEPOTREE_n = LDEPOTREE + XVDEPOTREE_n = XVDEPOTREE +END SUBROUTINE UPDATE_NAM_DRAGTREEn +! +END MODULE MODN_DRAGTREE_n diff --git a/src/MNH/paspol.f90 b/src/MNH/paspol.f90 index 1a2146b66e5f3b71efebaed0305508bf6888b345..9e180552f667722dde9abb30c5f111c7f6ee0998 100644 --- a/src/MNH/paspol.f90 +++ b/src/MNH/paspol.f90 @@ -217,7 +217,12 @@ IF (GPPFIRSTCALL) THEN ! puis les indices fractionnaires (ZSRCI,ZSRCJ) et entiers ! (IPIGI,IPIGJ) du point de rejet dans le domaine de travail global. ! - CALL SM_XYHAT(XLATORI,XLONORI,XPPLAT(JSV),XPPLON(JSV),ZSRCX,ZSRCY) + IF (LCARTESIAN) THEN !En cartesien ecriture dans la namelist des coordonnees X,Y et non LAT,LON + ZSRCX = XPPLAT(JSV) + ZSRCY = XPPLON(JSV) + ELSE + CALL SM_XYHAT(XLATORI,XLONORI,XPPLAT(JSV),XPPLON(JSV),ZSRCX,ZSRCY) + END IF II=MAX(MIN(COUNT(XXHAT(:)<ZSRCX),IIU-1),1) IJ=MAX(MIN(COUNT(XYHAT(:)<ZSRCY),IJU-1),1) ZSRCI=(ZSRCX-XXHAT(II))/(XXHAT(II+1)-XXHAT(II))+REAL(II) diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90 index 802fa044c109bacd947149d054a572142a021f8e..507a6b48bcd96656f798ac074326fccfd5e2a901 100644 --- a/src/MNH/phys_paramn.f90 +++ b/src/MNH/phys_paramn.f90 @@ -236,6 +236,7 @@ END MODULE MODI_PHYS_PARAM_n ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine ! P. Wautelet 21/11/2019: ZRG_HOUR and ZRAT_HOUR are now parameter arrays +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -249,6 +250,7 @@ USE MODD_BLANK USE MODD_CST USE MODD_DYN USE MODD_CONF +USE MODD_FRC_n USE MODD_FRC USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS @@ -312,6 +314,7 @@ USE MODI_SEDIM_SALT USE MODI_DUST_FILTER USE MODI_SALT_FILTER USE MODI_DRAG_VEG +USE MODI_DRAG_BLD USE MODD_DUST USE MODD_SALT USE MODD_PASPOL @@ -322,7 +325,8 @@ USE MODE_SALT_PSD USE MODE_AERO_PSD USE MODE_MNH_TIMING USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY : XTHW_FLUX, XRCW_FLUX, XSVW_FLUX -USE MODD_DRAGTREE +USE MODD_DRAGTREE_n +USE MODD_DRAGBLDG_n ! USE MODD_TIME, ONLY : TDTEXP ! Ajout PP USE MODI_AEROZON ! Ajout PP @@ -739,6 +743,23 @@ CALL SUNPOS_n ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL ) WRITE(UNIT=ILUOUT,FMT='(" RADIATIONS called for KTCOUNT=",I6, & & "with the CLOUD_ONLY option set ",L2)') KTCOUNT,OCLOUD_ONLY ! + ! + WHERE (XDIRFLASWD.LT.0.0) + XDIRFLASWD=0.0 + ENDWHERE + ! + WHERE (XDIRFLASWD.GT.1500.0) + XDIRFLASWD=1500.0 + ENDWHERE + ! + WHERE (XSCAFLASWD.LT.0.0) + XSCAFLASWD=0.0 + ENDWHERE + ! + WHERE (XSCAFLASWD.GT.1500.0) + XSCAFLASWD=1500.0 + ENDWHERE + ! WHERE( XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) >0. ) XALBUV(:,:) = ( XDIR_ALB(:,:,1) * XDIRFLASWD(:,:,1) & + XSCA_ALB(:,:,1) * XSCAFLASWD(:,:,1) ) & @@ -1236,10 +1257,11 @@ ZTIME1 = ZTIME2 XTIME_BU_PROCESS = 0. XTIME_LES_BU_PROCESS = 0. ! -IF (LDRAGTREE) CALL DRAG_VEG(XTSTEP,XUT,XVT,XTKET,LDEPOTREE,XVDEPOTREE, & - CCLOUD, XPABST,XTHT,XRT,XSVT, & - XRHODJ,XZZ,XRUS, XRVS, & - XRTKES,XRTHS, XRRS,XRSVS) +IF (LDRAGTREE) CALL DRAG_VEG( XTSTEP, XUT, XVT, XTKET, LDEPOTREE, XVDEPOTREE, & + CCLOUD, XPABST, XTHT, XRT, XSVT, XRHODJ, XZZ, & + XRUS, XRVS, XRTKES, XRTHS, XRRS, XRSVS ) +! +IF (LDRAGBLDG) CALL DRAG_BLD ( XTSTEP, XUT, XVT, XTKET, XRHODJ, XZZ, XRUS, XRVS, XRTKES ) ! CALL SECOND_MNH2(ZTIME2) ! @@ -1302,6 +1324,7 @@ IF ( CTURB == 'TKEL' ) THEN ENDIF ZSFCO2(IIB-1,:)=ZSFCO2(IIB,:) END IF + ! IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN ZSFTH(IIE+1,:)=ZSFTH(IIE,:) ZSFRV(IIE+1,:)=ZSFRV(IIE,:) @@ -1315,6 +1338,7 @@ IF ( CTURB == 'TKEL' ) THEN ENDIF ZSFCO2(IIE+1,:)=ZSFCO2(IIE,:) END IF + ! IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN ZSFTH(:,IJB-1)=ZSFTH(:,IJB) ZSFRV(:,IJB-1)=ZSFRV(:,IJB) @@ -1328,6 +1352,7 @@ IF ( CTURB == 'TKEL' ) THEN ENDIF ZSFCO2(:,IJB-1)=ZSFCO2(:,IJB) END IF + ! IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN ZSFTH(:,IJE+1)=ZSFTH(:,IJE) ZSFRV(:,IJE+1)=ZSFRV(:,IJE) diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90 index 564611d776d47cec051614a4d4a8bd7d3a1535b7..552ba3e237bc21ec75d71fa5be364c97a0fc9911 100644 --- a/src/MNH/prep_real_case.f90 +++ b/src/MNH/prep_real_case.f90 @@ -985,7 +985,7 @@ CALL BOUNDARIES ( & XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XRHODJ, & + XRHODJ,XRHODREF, & XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT ) ! CALL SECOND_MNH(ZTIME2) diff --git a/src/MNH/rain_c2r2_khko.f90 b/src/MNH/rain_c2r2_khko.f90 index 07060753098a0018b03b7cd6d72bfe9f2a1e8705..4bb0e2474c480e71f4cc76d435e300374c3f5755 100644 --- a/src/MNH/rain_c2r2_khko.f90 +++ b/src/MNH/rain_c2r2_khko.f90 @@ -1718,7 +1718,7 @@ ENDIF IF (LBUDGET_RV) CALL BUDGET (PRVS(:,:,:)*PRHODJ(:,:,:),6 ,'REVA_BU_RRV') IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:)*PRHODJ(:,:,:),8 ,'REVA_BU_RRR') IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:)*PRHODJ(:,:,:),4 ,'REVA_BU_RTH') -IF (LBUDGET_SV) CALL BUDGET (PCRS(:,:,:)*PRHODJ(:,:,:),15+(NSV_C2R2BEG-1),'CEVA_BU_RSV') +IF (LBUDGET_SV) CALL BUDGET (PCRS(:,:,:)*PRHODJ(:,:,:),15+(NSV_C2R2BEG-1),'REVA_BU_RSV') ! END SUBROUTINE C2R2_KHKO_EVAPORATION ! diff --git a/src/MNH/rain_ice_elec.f90 b/src/MNH/rain_ice_elec.f90 index 15faf9c9ea551e37b19be5e5818628f3e3c224b6..b2f0a40e55ccc534e882027cfc6cb8d48f7a2f60 100644 --- a/src/MNH/rain_ice_elec.f90 +++ b/src/MNH/rain_ice_elec.f90 @@ -1976,7 +1976,7 @@ REAL :: ZVR, ZVI, ZVS, ZVG, ZETA0, ZK, ZRE0 CALL BUDGET (PRHS(:,:,:)*PRHODJ(:,:,:),12,'SEDI_BU_RRH') ! IF (LBUDGET_SV) THEN - CALL BUDGET (PQCS(:,:,:)*PRHODJ(:,:,:),12+NSV_ELECBEG+1,'SEDI_BU_RSV') + IF (OSEDIC) CALL BUDGET (PQCS(:,:,:)*PRHODJ(:,:,:),12+NSV_ELECBEG+1,'SEDI_BU_RSV') CALL BUDGET (PQRS(:,:,:)*PRHODJ(:,:,:),12+NSV_ELECBEG+2,'SEDI_BU_RSV') CALL BUDGET (PQIS(:,:,:)*PRHODJ(:,:,:),12+NSV_ELECBEG+3,'SEDI_BU_RSV') CALL BUDGET (PQSS(:,:,:)*PRHODJ(:,:,:),12+NSV_ELECBEG+4,'SEDI_BU_RSV') @@ -2571,9 +2571,9 @@ IMPLICIT NONE ! IF (LBUDGET_SV) THEN CALL BUDGET (UNPACK(ZQRS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0),& - 12+NSV_ELECBEG+2,'HON_BU_RSV') + 12+NSV_ELECBEG+2,'SFR_BU_RSV') CALL BUDGET (UNPACK(ZQGS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & - 12+NSV_ELECEND, 'HON_BU_RSV') + 12+NSV_ELECBEG+5,'SFR_BU_RSV') END IF ! @@ -2764,7 +2764,7 @@ IMPLICIT NONE CALL BUDGET (UNPACK(ZQNIS(:), MASK=GMICRO(:,:,:), FIELD=PQNIS) & *PRHODJ(:,:,:), 12+NSV_ELECEND ,'DEPG_BU_RSV') CALL BUDGET (UNPACK(ZQGS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & - 12+NSV_ELECEND,'DEPG_BU_RSV') + 12+NSV_ELECBEG+5,'DEPG_BU_RSV') END IF ! END SUBROUTINE RAIN_ICE_ELEC_SLOW @@ -3080,7 +3080,7 @@ IMPLICIT NONE CALL BUDGET (UNPACK(ZQSS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & 12+NSV_ELECBEG+4,'RIM_BU_RSV') CALL BUDGET (UNPACK(ZQGS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & - 12+NSV_ELECEND,'RIM_BU_RSV') + 12+NSV_ELECBEG+5,'RIM_BU_RSV') END IF ! DEALLOCATE(GRIM) @@ -3257,7 +3257,7 @@ IMPLICIT NONE CALL BUDGET (UNPACK(ZQSS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & 12+NSV_ELECBEG+4,'ACC_BU_RSV') CALL BUDGET (UNPACK(ZQGS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & - 12+NSV_ELECEND,'ACC_BU_RSV') + 12+NSV_ELECBEG+5,'ACC_BU_RSV') END IF ! !* 5.3 Conversion-Melting of the aggregates: RSMLT & QSMLT @@ -3305,7 +3305,7 @@ IMPLICIT NONE CALL BUDGET (UNPACK(ZQSS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & 12+NSV_ELECBEG+4,'CMEL_BU_RSV') CALL BUDGET (UNPACK(ZQGS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & - 12+NSV_ELECEND,'CMEL_BU_RSV') + 12+NSV_ELECBEG+5,'CMEL_BU_RSV') END IF ! END SUBROUTINE RAIN_ICE_ELEC_FAST_RS @@ -3378,7 +3378,7 @@ IMPLICIT NONE CALL BUDGET (UNPACK(ZQIS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & 12+NSV_ELECBEG+3,'CFRZ_BU_RSV') CALL BUDGET (UNPACK(ZQGS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & - 12+NSV_ELECEND,'CFRZ_BU_RSV') + 12+NSV_ELECBEG+5,'CFRZ_BU_RSV') END IF ! ! @@ -3776,7 +3776,7 @@ IMPLICIT NONE CALL BUDGET (UNPACK(ZQSS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & 12+NSV_ELECBEG+4,'WETG_BU_RSV') CALL BUDGET (UNPACK(ZQGS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & - 12+NSV_ELECEND,'WETG_BU_RSV') + 12+NSV_ELECBEG+5,'WETG_BU_RSV') END IF ! WHERE (ZRGT(:) > XRTMIN(6) .AND. ZZT(:) < XTT .AND. & ! Dry @@ -3826,7 +3826,7 @@ IMPLICIT NONE CALL BUDGET (UNPACK(ZQSS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & 12+NSV_ELECBEG+4,'DRYG_BU_RSV') CALL BUDGET (UNPACK(ZQGS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & - 12+NSV_ELECEND,'DRYG_BU_RSV') + 12+NSV_ELECBEG+5,'DRYG_BU_RSV') END IF ! ! @@ -3848,7 +3848,7 @@ IMPLICIT NONE CALL BUDGET (UNPACK(ZQCS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & 12+NSV_ELECBEG+1,'INCG_BU_RSV') CALL BUDGET (UNPACK(ZQGS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & - 12+NSV_ELECEND,'INCG_BU_RSV') + 12+NSV_ELECBEG+5,'INCG_BU_RSV') END IF ! ! @@ -3897,7 +3897,7 @@ IMPLICIT NONE CALL BUDGET (UNPACK(ZQRS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & 12+NSV_ELECBEG+2,'GMLT_BU_RSV') CALL BUDGET (UNPACK(ZQGS(:)*ZRHODJ(:), MASK=GMICRO(:,:,:), FIELD=0.0), & - 12+NSV_ELECEND,'GMLT_BU_RSV') + 12+NSV_ELECBEG+5,'GMLT_BU_RSV') END IF ! END SUBROUTINE RAIN_ICE_ELEC_FAST_RG diff --git a/src/MNH/rain_ice_red.f90 b/src/MNH/rain_ice_red.f90 index 9fb83cb0473eb5a441b6ee63d7e065e57d364686..7ea2350e975773ec93fc1ba85937fb71602e77c5 100644 --- a/src/MNH/rain_ice_red.f90 +++ b/src/MNH/rain_ice_red.f90 @@ -243,6 +243,7 @@ END MODULE MODI_RAIN_ICE_RED ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 ! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) ! P. Wautelet 17/01/2020: move Quicksort to tools.f90 +! P. Wautelet 25/02/2020: bugfix: add missing budget: WETH_BU_RRG ! !* 0. DECLARATIONS ! ------------ @@ -1439,6 +1440,7 @@ IF(LBU_ENABLE) THEN IF (LBUDGET_RR) CALL BUDGET(PRRS(:,:,:)*PRHODJ(:,:,:), 8, 'WETH_BU_RRR') IF (LBUDGET_RI) CALL BUDGET(PRIS(:,:,:)*PRHODJ(:,:,:), 9, 'WETH_BU_RRI') IF (LBUDGET_RS) CALL BUDGET(PRSS(:,:,:)*PRHODJ(:,:,:), 10,'WETH_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET(PRGS(:,:,:)*PRHODJ(:,:,:), 11,'WETH_BU_RRG') IF (LBUDGET_RH) CALL BUDGET(PRHS(:,:,:)*PRHODJ(:,:,:), 12,'WETH_BU_RRH') ZW(:,:,:) = 0. diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90 index a8178a0be6fb189500b2977c055ecec45d8db4fe..968991a463cf75f0d7e4f591c4c04bd419133cb5 100644 --- a/src/MNH/read_all_data_grib_case.f90 +++ b/src/MNH/read_all_data_grib_case.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1998-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1998-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. @@ -131,7 +131,8 @@ END MODULE MODI_READ_ALL_DATA_GRIB_CASE !! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 14/03/2019: correct ZWS when variable not present in file ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! Q. Rodier 16/09/2019: switch of GRIB number ID for Orograpgy in ARPEGE/AROME in EPyGrAM +! Q. Rodier 16/09/2019: switch of GRIB number ID for orography in ARPEGE/AROME in EPyGrAM +! Q. Rodier 27/01/2020: switch of GRIB number ID for orography and hydrometeors in ARPEGE/AROME in EPyGrAM v1.3.7 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -519,7 +520,11 @@ SELECT CASE (IMODEL) CASE(6,7) ! arpege and arome GRIB2 CALL SEARCH_FIELD(IGRIB,INUM_ZS,KDIS=0,KCAT=3,KNUMBER=4) IF(INUM_ZS < 0) THEN - WRITE (ILUOUT0,'(A)')'Orography is missing - abort' + ! Old version of EPyGraM (bug corrected since 01/2020) + CALL SEARCH_FIELD(IGRIB,INUM_ZS,KDIS=0,KCAT=3,KNUMBER=5) + IF(INUM_ZS < 0) THEN + WRITE (ILUOUT0,'(A)')'Orography is missing - abort' + END IF ENDIF CASE(10) ! NCEP DO IVAR=0,222 @@ -921,6 +926,10 @@ IF (IMODEL==6) THEN ! GRIB2 AROME ISTARTLEVEL = 0 CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=6,KNUMBER=6,KLEV1=ISTARTLEVEL) END IF + IF (INUM < 0) THEN + ISTARTLEVEL = 1 + CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=83,KLEV1=ISTARTLEVEL) + END IF IF (INUM > 0) THEN WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Arome model (forecast)' LCPL_AROME=.TRUE. @@ -1116,7 +1125,7 @@ IF (NRR >1) THEN WRITE (ILUOUT0,'(A)') ' | Reading Q fields (except humidity)' DO JLOOP1=1, INLEVEL ILEV1 = JLOOP1-1+ISTARTLEVEL - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=6,KNUMBER=6,KLEV1=ILEV1) + CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=83,KLEV1=ILEV1) IF (INUM < 0) THEN WRITE(YMSG,*) 'Specific ratio ',IPAR,' at level ',JLOOP1,' is missing' @@ -1155,7 +1164,7 @@ IF (NRR >1) THEN DO JLOOP1=1, INLEVEL ILEV1 = JLOOP1-1+ISTARTLEVEL - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=82,KLEV1=ILEV1) + CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=84,KLEV1=ILEV1) IF (INUM < 0) THEN WRITE(YMSG,*) 'Specific ratio for ICE at level ',JLOOP1,' is missing' CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 075e87d75cd8d9fa54a8e620bd48956803a021dd..befd38e8c84c8d365e43ce2d4152ca357de387b7 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-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. @@ -293,6 +293,8 @@ END MODULE MODI_READ_EXSEG_n !! Modification 01/2019 (R. Honnert) remove SURF in CMF_UPDRAFT !! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree +! Q. Rodier 03/2020: add abort if use of any LHORELAX and cyclic conditions !!------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -344,7 +346,8 @@ USE MODN_SERIES_n USE MODN_TURB_CLOUD USE MODN_TURB USE MODN_MEAN -USE MODN_DRAGTREE +USE MODN_DRAGTREE_n +USE MODN_DRAGBLDG_n USE MODN_LATZ_EDFLX ! USE MODD_NSV,NSV_USER_n=>NSV_USER @@ -461,6 +464,8 @@ CCPLFILE(:)=" " CALL INIT_NAM_CONFN CALL INIT_NAM_DYNN CALL INIT_NAM_ADVN +CALL INIT_NAM_DRAGTREEN +CALL INIT_NAM_DRAGBLDGN CALL INIT_NAM_PARAMN CALL INIT_NAM_PARAM_RADN #ifdef MNH_ECRAD @@ -514,6 +519,10 @@ CALL POSNAM(ILUSEG,'NAM_SERIESN',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SERIESn) CALL POSNAM(ILUSEG,'NAM_BLOWSNOWN',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOWn) +CALL POSNAM(ILUSEG,'NAM_DRAGTREEN',GFOUND,ILUOUT) +IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGTREEn) +CALL POSNAM(ILUSEG,'NAM_DRAGBLDGN',GFOUND,ILUOUT) +IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGBLDGn) ! IF (KMI == 1) THEN WRITE(UNIT=ILUOUT,FMT="(' namelists common to all the models ')") @@ -650,8 +659,6 @@ IF (KMI == 1) THEN #endif CALL POSNAM(ILUSEG,'NAM_CONDSAMP',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONDSAMP) - CALL POSNAM(ILUSEG,'NAM_DRAGTREE',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGTREE) CALL POSNAM(ILUSEG,'NAM_2D_FRC',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_2D_FRC) CALL POSNAM(ILUSEG,'NAM_LATZ_EDFLX',GFOUND) @@ -2583,7 +2590,31 @@ IF ((LHORELAX_UVWTH .OR. LHORELAX_SVPP .OR. & !callabortstop CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') END IF -! +! +IF ((LHORELAX_UVWTH .OR. LHORELAX_SVPP .OR. & + LHORELAX_SVCS .OR. & +#ifdef MNH_FOREFIRE + LHORELAX_SVFF .OR. & +#endif + LHORELAX_SVC2R2 .OR. LHORELAX_SVC1R3 .OR. & + LHORELAX_SVLIMA .OR. & + LHORELAX_SVELEC .OR. LHORELAX_SVCHEM .OR. & + LHORELAX_SVLG .OR. ANY(LHORELAX_SV) .OR. & + LHORELAX_RV .OR. LHORELAX_RC .OR. & + LHORELAX_RR .OR. LHORELAX_RI .OR. & + LHORELAX_RG .OR. LHORELAX_RS .OR. & + LHORELAX_RH .OR. LHORELAX_TKE.OR. & + LHORELAX_SVCHIC ) & + .AND. (CLBCX(1)=='CYCL'.OR.CLBCX(2)=='CYCL' & + .OR.CLBCY(1)=='CYCL'.OR.CLBCY(2)=='CYCL')) THEN + WRITE(UNIT=ILUOUT,FMT=9003) KMI + WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE HORIZONTAL RELAXATION ' + WRITE(ILUOUT,FMT=*) 'FOR CYCLIC CLBCX OR CLBCY VALUES' + WRITE(ILUOUT,FMT=*) 'CHANGE LHORELAX TO FALSE' + !callabortstop + CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') +END IF +! IF (KMI==1) THEN GRELAX = .NOT.(OUSERV) .AND. LUSERV .AND. LHORELAX_RV ELSE @@ -2815,6 +2846,8 @@ END IF ! CALL UPDATE_NAM_LUNITN CALL UPDATE_NAM_CONFN +CALL UPDATE_NAM_DRAGTREEN +CALL UPDATE_NAM_DRAGBLDGN CALL UPDATE_NAM_DYNN CALL UPDATE_NAM_ADVN CALL UPDATE_NAM_PARAMN diff --git a/src/MNH/read_grid_time_mesonh_case.f90 b/src/MNH/read_grid_time_mesonh_case.f90 index 58599b38386dd2225254c6590127c93be7efdf97..fba1ea9e956b21a5e3ff451c4a86b8d9b2bce6aa 100644 --- a/src/MNH/read_grid_time_mesonh_case.f90 +++ b/src/MNH/read_grid_time_mesonh_case.f90 @@ -174,23 +174,27 @@ CALL IO_Field_read(TZFMFILE,'RPK', ZRPK_LS) CALL IO_Field_read(TZFMFILE,'LAT0',ZLAT0_LS) CALL IO_Field_read(TZFMFILE,'BETA',ZBETA_LS) ! -IF ( (ABS(ZLAT0_LS-XLAT0)>ZEPS*MAX(1.,ABS(XLAT0))) & - .OR. (ABS(ZLON0_LS-XLON0)>ZEPS*MAX(1.,ABS(XLON0))) & - .OR. (ABS(ABS(ZRPK_LS)-ABS(XRPK))>ZEPS*MAX(1.,ABS(XRPK))) & - .OR. (ABS(ZBETA_LS-XBETA)>ZEPS*MAX(1.,ABS(XBETA))) ) THEN -! - WRITE(ILUOUT0,FMT=*) ' ' - WRITE(ILUOUT0,FMT=*) '***************************************************************' - WRITE(ILUOUT0,FMT=*) 'Projection are different between MESONH input file and PGD file' - WRITE(ILUOUT0,FMT=*) 'You must recompute a PGD file with PREP_PGD,' - WRITE(ILUOUT0,FMT=*) 'using the input MESONH file to define its domain.' - WRITE(ILUOUT0,FMT=*) '***************************************************************' - WRITE(ILUOUT0,FMT=*) ' ' - WRITE(ILUOUT0,FMT=*) ' input file physiographic data' - WRITE(ILUOUT0,1) 'LAT0 ',ZLAT0_LS, ' ',XLAT0 - WRITE(ILUOUT0,1) 'LON0 ',ZLON0_LS, ' ',XLON0 - WRITE(ILUOUT0,1) 'RPK ',ZRPK_LS, ' ',XRPK - WRITE(ILUOUT0,1) 'BETA ',ZBETA_LS, ' ',XBETA +IF(.NOT.LCARTESIAN) THEN + ! + IF ( (ABS(ZLAT0_LS-XLAT0)>ZEPS*MAX(1.,ABS(XLAT0))) & + .OR. (ABS(ZLON0_LS-XLON0)>ZEPS*MAX(1.,ABS(XLON0))) & + .OR. (ABS(ABS(ZRPK_LS)-ABS(XRPK))>ZEPS*MAX(1.,ABS(XRPK))) & + .OR. (ABS(ZBETA_LS-XBETA)>ZEPS*MAX(1.,ABS(XBETA))) ) THEN + ! + WRITE(ILUOUT0,FMT=*) ' ' + WRITE(ILUOUT0,FMT=*) '***************************************************************' + WRITE(ILUOUT0,FMT=*) 'Projection are different between MESONH input file and PGD file' + WRITE(ILUOUT0,FMT=*) 'You must recompute a PGD file with PREP_PGD,' + WRITE(ILUOUT0,FMT=*) 'using the input MESONH file to define its domain.' + WRITE(ILUOUT0,FMT=*) '***************************************************************' + WRITE(ILUOUT0,FMT=*) ' ' + WRITE(ILUOUT0,FMT=*) ' input file physiographic data' + WRITE(ILUOUT0,1) 'LAT0 ',ZLAT0_LS, ' ',XLAT0 + WRITE(ILUOUT0,1) 'LON0 ',ZLON0_LS, ' ',XLON0 + WRITE(ILUOUT0,1) 'RPK ',ZRPK_LS, ' ',XRPK + WRITE(ILUOUT0,1) 'BETA ',ZBETA_LS, ' ',XBETA + END IF + ! END IF ! !* 2.2 Horizontal grid: diff --git a/src/MNH/reset_exseg.f90 b/src/MNH/reset_exseg.f90 index 5c6a80d42b249e954c295db03ba6176789c28f6a..0d06d2be3cbadabfab8ce39faa44c18c8f496bcc 100644 --- a/src/MNH/reset_exseg.f90 +++ b/src/MNH/reset_exseg.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2000-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-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. @@ -56,6 +56,7 @@ END MODULE MODI_RESET_EXSEG !! 02/2018 Q.Libois ECRAD !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables +! J. Escobar 11/02/2020: for retrotrajectories in //, reset NHALO >> 1 if needed from NAM_CONF_DIAG !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -74,6 +75,10 @@ USE MODN_PARAM_KAFR_n USE MODN_PARAM_RAD_n USE MODN_PARAM_ECRAD_n ! +USE MODD_CONF, ONLY: NHALO +! +USE MODD_VAR_ll, ONLY : IP +! IMPLICIT NONE ! ! @@ -88,6 +93,8 @@ INTEGER :: IGRID ! IGRID : grid indicator INTEGER :: ILENCH ! ILENCH : length of comment string TYPE(TFILEDATA),POINTER :: TZNMLFILE! Namelist file ! +NAMELIST/NAM_CONF_DIAG/NHALO +! !------------------------------------------------------------------------------- ! !* 1. OPENING NAMELIST FILE @@ -112,7 +119,7 @@ IF (NCONV_KF>=0) THEN IF (GFOUND) THEN CALL INIT_NAM_PARAM_KAFRn READ(UNIT=ILUNAM,NML=NAM_PARAM_KAFRN) - PRINT*, ' namelist NAM_PARAM_KAFRN read' + IF ( IP == 1 ) PRINT*, ' namelist NAM_PARAM_KAFRN read' END IF IF (LUSERV) THEN LDIAGCONV=.TRUE. @@ -126,7 +133,7 @@ IF (NCONV_KF>=0) THEN END IF END IF ! -PRINT*,'RESET_EXSEG OUTPUT: NCONV_KF=',NCONV_KF,' CDCONV=',CDCONV,' CGETCONV=',CGETCONV +IF ( IP == 1 ) PRINT*,'RESET_EXSEG OUTPUT: NCONV_KF=',NCONV_KF,' CDCONV=',CDCONV,' CGETCONV=',CGETCONV ! !------------------------------------------------------------------------------- ! @@ -147,7 +154,7 @@ IF(NRAD_3D>=1) THEN CALL INIT_NAM_PARAM_RADn READ(UNIT=ILUNAM,NML=NAM_PARAM_RADN) CALL UPDATE_NAM_PARAM_RADn - PRINT*, ' namelist NAM_PARAM_RADN read' + IF ( IP == 1 ) PRINT*, ' namelist NAM_PARAM_RADN read' END IF #ifdef MNH_ECRAD CALL POSNAM(ILUNAM,'NAM_PARAM_ECRADN',GFOUND) @@ -155,7 +162,7 @@ IF(NRAD_3D>=1) THEN CALL INIT_NAM_PARAM_EcRADn READ(UNIT=ILUNAM,NML=NAM_PARAM_ECRADN) CALL UPDATE_NAM_PARAM_ECRADn - PRINT*, ' namelist NAM_PARAM_ECRADN read' + IF ( IP == 1 ) PRINT*, ' namelist NAM_PARAM_ECRADN read' END IF #endif ENDIF @@ -170,7 +177,7 @@ IF(LEN_TRIM(CRAD_SAT) /= 0) THEN CRAD='ECMW' END IF ! -PRINT*,'RESET_EXSEG OUTPUT: NRAD_3D =',NRAD_3D,' CRAD =',CRAD,' CGETRAD =',CGETRAD +IF ( IP == 1 ) PRINT*,'RESET_EXSEG OUTPUT: NRAD_3D =',NRAD_3D,' CRAD =',CRAD,' CGETRAD =',CGETRAD ! !------------------------------------------------------------------------------- ! @@ -179,8 +186,17 @@ PRINT*,'RESET_EXSEG OUTPUT: NRAD_3D =',NRAD_3D,' CRAD =',CRAD,' CGETRAD =',CGETR ! IF (LUSECHEM .AND. .NOT.LCHEMDIAG) LUSECHEM =.FALSE. ! -PRINT*,'RESET_EXSEG OUTPUT: LUSECHEM =',LUSECHEM,' LCHEMDIAG =',LCHEMDIAG -PRINT*,' ' +IF ( IP == 1 ) PRINT*,'RESET_EXSEG OUTPUT: LUSECHEM =',LUSECHEM,' LCHEMDIAG =',LCHEMDIAG +IF ( IP == 1 ) PRINT*,' ' +! +!------------------------------------------------------------------------------- +! +!* 5. For retrotrajectories in // , reset NHALO >> 1 if needed from NAM_CONF_DIAG +! --------------------------------------------------- +CALL POSNAM(ILUNAM,'NAM_CONF_DIAG',GFOUND) +IF (GFOUND) THEN + READ(UNIT=ILUNAM,NML=NAM_CONF_DIAG) +END IF ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 4d282227691efc3708daba8bb3c34b77b2def60a..68ae9f8b9c39f51a85eb8968cd522249281fc9a5 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -267,6 +267,9 @@ END MODULE MODI_RESOLVED_CLOUD !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! P. Wautelet: 01/02/2019: ZRSMIN is now allocatable (instead of size of XRTMIN which was sometimes not allocated) !! 02/2019 C.Lac add rain fraction as an output field +!! P. Wautelet 24/02/2020: bugfix: corrected budget name (DEPI->CDEPI) for ice_adjust +!! 03/2020 (B.Vie) : LIMA negativity checks after turbulence, advection and microphysics budgets +!! B.Vié 03/03/2020 : use DTHRAD instead of dT/dt in Smax diagnostic computation !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -725,7 +728,7 @@ SELECT CASE ( HCLOUD ) CASE('LIMA') ! Correction where rc<0 or Nc<0 IF (OWARM) THEN - WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,NSV_LIMA_NC) < 0.) + WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NC) < YCTMIN(2)/PTSTEP) PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) @@ -954,7 +957,7 @@ SELECT CASE ( HCLOUD ) ! ! IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN - CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'DEPI', & + CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'CDEPI', & OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT, & PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, ZZZ, & ZEXN, PCF_MF,PRC_MF,PRI_MF, & @@ -1039,7 +1042,7 @@ SELECT CASE ( HCLOUD ) !* 10.2 Perform the saturation adjustment over cloud ice and cloud water ! IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN - CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'DEPI', & + CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'CDEPI', & OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT, & PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, ZZZ, & ZEXN, PCF_MF,PRC_MF,PRI_MF, & @@ -1072,7 +1075,7 @@ SELECT CASE ( HCLOUD ) PRHODREF, PEXNREF, ZDZZ, & PRHODJ, PPABSM, PPABST, & NMOD_CCN, NMOD_IFN, NMOD_IMM, & - PTHM, PTHT, PRT, ZSVT, PW_ACT, & + PDTHRAD, PTHT, PRT, ZSVT, PW_ACT, & PTHS, PRS, ZSVS, & PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, PINPRH, & PEVAP3D ) @@ -1081,7 +1084,7 @@ SELECT CASE ( HCLOUD ) IF (OWARM) CALL LIMA_WARM(OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & TPFILE, OCLOSE_OUT, KRR, PZZ, PRHODJ, & PRHODREF, PEXNREF, PW_ACT, PPABSM, PPABST, & - PTHM, PRCM, & + PDTHRAD, PRCM, & PTHT, PRT, ZSVT, & PTHS, PRS, ZSVS, & PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) @@ -1137,10 +1140,73 @@ IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN ENDIF ENDIF ! -IF ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') ) THEN -! CALL GET_HALO(PRS(:,:,:,2)) -! CALL GET_HALO(ZSVS(:,:,:,2)) -! CALL GET_HALO(ZSVS(:,:,:,3)) +! +SELECT CASE ( HCLOUD ) + CASE('KESS') + WHERE (PRS(:,:,:,2) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,2) = 0.0 + END WHERE +! +! +! CASE('C2R2','KHKO') +! CALL GET_HALO(PRS(:,:,:,2)) +! CALL GET_HALO(ZSVS(:,:,:,2)) +! WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,2) < 0.) +! ZSVS(:,:,:,1) = 0.0 +! END WHERE +! DO JSV = 2, 3 +! WHERE (PRS(:,:,:,JSV) < 0. .OR. ZSVS(:,:,:,JSV) < 0.) +! PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JSV) +! PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JSV) * ZLV(:,:,:) / & +! ZCPH(:,:,:) / ZEXN(:,:,:) +! PRS(:,:,:,JSV) = 0.0 +! ZSVS(:,:,:,JSV) = 0.0 +! END WHERE +! ENDDO +! Commented 03/2013 O.Thouron +! (at least necessary to be commented for supersaturation variable) +! ZSVS(:,:,:,:) = MAX( 0.0,ZSVS(:,:,:,:) ) +! +! + CASE('ICE3','ICE4') + WHERE (PRS(:,:,:,4) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,4) = 0. + END WHERE +! +! cloud + WHERE (PRS(:,:,:,2) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,2) = 0. + END WHERE +! +! if rc or ri are positive, we can correct negative rv +! cloud + WHERE ((PRS(:,:,:,1) <0.) .AND. (PRS(:,:,:,2)> 0.) ) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,2) = 0. + END WHERE +! ice + IF(KRR > 3) THEN + WHERE ((PRS(:,:,:,1) < 0.).AND.(PRS(:,:,:,4) > 0.)) + ZCOR(:,:,:)=MIN(-PRS(:,:,:,1),PRS(:,:,:,4)) + PRS(:,:,:,1) = PRS(:,:,:,1) + ZCOR(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,4) = PRS(:,:,:,4) -ZCOR(:,:,:) + END WHERE + END IF +! + CASE('C2R2','KHKO') WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,2) < 0.) ZSVS(:,:,:,1) = 0.0 END WHERE @@ -1153,9 +1219,104 @@ IF ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') ) THEN ZSVS(:,:,:,JSV) = 0.0 END WHERE ENDDO - IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:), 4,'NECON_BU_RTH') - IF (LBUDGET_RV) CALL BUDGET (PRS(:,:,:,1) * PRHODJ(:,:,:), 6,'NECON_BU_RRV') - IF (LBUDGET_RC) CALL BUDGET (PRS(:,:,:,2) * PRHODJ(:,:,:), 7,'NECON_BU_RRC') +! + CASE('C3R5') + WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,2) < 0.) + ZSVS(:,:,:,1) = 0.0 + END WHERE + DO JSV = 2, 3 + WHERE (PRS(:,:,:,JSV) < 0. .OR. ZSVS(:,:,:,JSV) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JSV) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JSV) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,JSV) = 0.0 + ZSVS(:,:,:,JSV) = 0.0 + END WHERE + ENDDO + ZSVS(:,:,:,:) = MAX( 0.0,ZSVS(:,:,:,:) ) +! ice + WHERE (PRS(:,:,:,4) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,4) = 0.0 + PSVS(:,:,:,4) = 0.0 + END WHERE +! cloud + WHERE (PRS(:,:,:,2) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,2) = 0.0 + PSVS(:,:,:,2) = 0.0 + END WHERE + PSVS(:,:,:,:) = MAX( 0.0,PSVS(:,:,:,:) ) +! + CASE('LIMA') +! Correction where rc<0 or Nc<0 + IF (OWARM) THEN + WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NC) < YCTMIN(2)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,2) = 0.0 + ZSVS(:,:,:,NSV_LIMA_NC) = 0.0 + END WHERE + END IF +! Correction where rr<0 or Nr<0 + IF (OWARM .AND. ORAIN) THEN + WHERE (PRS(:,:,:,3) < YRTMIN(3)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NR) < YCTMIN(3)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,3) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,3) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,3) = 0.0 + ZSVS(:,:,:,NSV_LIMA_NR) = 0.0 + END WHERE + END IF +! Correction where ri<0 or Ni<0 + IF (LCOLD) THEN + WHERE (PRS(:,:,:,4) < YRTMIN(4)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NI) < YCTMIN(4)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,4) = 0.0 + ZSVS(:,:,:,NSV_LIMA_NI) = 0.0 + END WHERE + END IF +! + ZSVS(:,:,:,:) = MAX( 0.0,ZSVS(:,:,:,:) ) + PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) ) +! +END SELECT +! +! +!* 3.3 STORE THE BUDGET TERMS +! ---------------------- +! +IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:), 4,'NECON_BU_RTH') +IF (LBUDGET_RV) CALL BUDGET (PRS(:,:,:,1) * PRHODJ(:,:,:), 6,'NECON_BU_RRV') +IF (LBUDGET_RC) CALL BUDGET (PRS(:,:,:,2) * PRHODJ(:,:,:), 7,'NECON_BU_RRC') +IF (LBUDGET_RR) CALL BUDGET (PRS(:,:,:,3) * PRHODJ(:,:,:), 8,'NECON_BU_RRR') +IF (LBUDGET_RI) CALL BUDGET (PRS(:,:,:,4) * PRHODJ(:,:,:) ,9,'NECON_BU_RRI') +IF (LBUDGET_RS) CALL BUDGET (PRS(:,:,:,5) * PRHODJ(:,:,:),10,'NECON_BU_RRS') +IF (LBUDGET_RG) CALL BUDGET (PRS(:,:,:,6) * PRHODJ(:,:,:),11,'NECON_BU_RRG') +IF (LBUDGET_RH) CALL BUDGET (PRS(:,:,:,7) * PRHODJ(:,:,:),12,'NECON_BU_RRH') +IF (LBUDGET_SV .AND. (HCLOUD == 'LIMA')) THEN + IF (OWARM) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NC) * PRHODJ(:,:,:),12+NSV_LIMA_NC,'NECON_BU_RSV') + IF (OWARM.AND.ORAIN) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NR) * PRHODJ(:,:,:),12+NSV_LIMA_NR,'NECON_BU_RSV') + IF (LCOLD) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NI) * PRHODJ(:,:,:),12+NSV_LIMA_NI,'NECON_BU_RSV') + IF (NMOD_CCN.GE.1) THEN + DO JL=1, NMOD_CCN + CALL BUDGET ( ZSVS(:,:,:,NSV_LIMA_CCN_FREE+JL-1)* & + PRHODJ(:,:,:),12+NSV_LIMA_CCN_FREE+JL-1,'NECON_BU_RSV') + END DO + END IF + IF (NMOD_IFN.GE.1) THEN + DO JL=1, NMOD_IFN + CALL BUDGET ( ZSVS(:,:,:,NSV_LIMA_IFN_FREE+JL-1)* & + PRHODJ(:,:,:),12+NSV_LIMA_IFN_FREE+JL-1,'NECON_BU_RSV') + END DO + END IF END IF !------------------------------------------------------------------------------- ! diff --git a/src/MNH/sbl_depth.f90 b/src/MNH/sbl_depth.f90 index b9add72367f32f69eb048d2f64dff7ad166df5c2..e83d8f784d4b1f4b84e755fe227fff2c588f24fc 100644 --- a/src/MNH/sbl_depth.f90 +++ b/src/MNH/sbl_depth.f90 @@ -59,7 +59,7 @@ END MODULE MODI_SBL_DEPTH !! MODIFICATIONS !! ------------- !! Original nov. 2005 -!! +!! 26/02/2020 T.Nagel Correction of SBL depth computation in neutral stratification !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -130,7 +130,7 @@ ZSBL_THER= XSBL_O_BL * BL_DEPTH_DIAG(KKB,KKE,ZQ0,PZZ(:,:,KKB),PWTHV,PZZ,XFTOP_O_ PSBL_DEPTH = 0. WHERE (ZSBL_THER> 0. .AND. ZSBL_DYN> 0.) PSBL_DEPTH = MIN(ZSBL_THER(:,:),ZSBL_DYN(:,:)) WHERE (ZSBL_THER> 0. .AND. ZSBL_DYN==0.) PSBL_DEPTH = ZSBL_THER(:,:) -WHERE (ZSBL_THER==0. .AND. ZSBL_DYN> 0.) PSBL_DEPTH = ZSBL_THER(:,:) +WHERE (ZSBL_THER==0. .AND. ZSBL_DYN> 0.) PSBL_DEPTH = ZSBL_DYN(:,:) ! DO JLOOP=1,5 WHERE (PLMO(:,:)/=XUNDEF .AND. ABS(PLMO(:,:))>=0.01 ) @@ -138,8 +138,8 @@ DO JLOOP=1,5 PSBL_DEPTH = 0.2 * PSBL_DEPTH + 0.8 * ((1.-ZA) * ZSBL_DYN + ZA * ZSBL_THER ) END WHERE END DO -WHERE (ABS(PLMO(:,:))<=0.01 ) PSBL_DEPTH = ZSBL_DYN -WHERE (PLMO(:,:)==XUNDEF) PSBL_DEPTH = ZSBL_THER +WHERE (ABS(PLMO(:,:))<=0.01 ) PSBL_DEPTH = ZSBL_THER +WHERE (PLMO(:,:)==XUNDEF) PSBL_DEPTH = ZSBL_DYN ! !---------------------------------------------------------------------------- END SUBROUTINE SBL_DEPTH diff --git a/src/MNH/set_conc_lima.f90 b/src/MNH/set_conc_lima.f90 index 6f9e6c6ad06019e5104d70c6a2c4e92c01462bd4..688d20a6bbef50f36ac33543b1ff3d076dde6543 100644 --- a/src/MNH/set_conc_lima.f90 +++ b/src/MNH/set_conc_lima.f90 @@ -79,7 +79,7 @@ END MODULE MODI_SET_CONC_LIMA !! Original 15/11/00 !! 2014 G.Delautier : remplace MODD_RAIN_C2R2_PARAM par MODD_RAIN_C2R2_KHKO_PARAM * !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +!! B.Vié : 03/03/2020 secure physical tests !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -90,6 +90,7 @@ USE MODD_PARAM_LIMA_COLD, ONLY : XAI, XBI USE MODD_NSV, ONLY : NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_ACTI, NSV_LIMA_NI, NSV_LIMA_IFN_NUCL USE MODD_CST, ONLY : XPI, XRHOLW, XRHOLI USE MODD_CONF, ONLY : NVERB +USE MODD_CONF_n, ONLY : NRR USE MODD_LUNIT_n, ONLY : TLUOUT ! IMPLICIT NONE @@ -119,7 +120,7 @@ ILUOUT = TLUOUT%NLU !* 2. INITIALIZATION ! -------------- ! -IF (LWARM) THEN +IF (LWARM .AND. NRR.GE.2) THEN ! ! droplets ! @@ -147,7 +148,7 @@ IF (LWARM) THEN END IF END IF ! -IF (LWARM .AND. LRAIN) THEN +IF (LWARM .AND. LRAIN .AND. NRR.GE.3) THEN ! ! drops ! @@ -157,7 +158,7 @@ IF (LWARM .AND. LRAIN) THEN ELSE ! init from KESS, ICE3... WHERE ( PRT(:,:,:,3) > 1.E-11 ) PSVT(:,:,:,NSV_LIMA_NR) = MAX( SQRT(SQRT(PRHODREF(:,:,:)*PRT(:,:,:,3) & - *ZCONCR)),XCTMIN(3) ) + *ZCONCR)),1. ) END WHERE WHERE ( PRT(:,:,:,3) <= 1.E-11 ) PRT(:,:,:,3) = 0.0 @@ -170,7 +171,7 @@ IF (LWARM .AND. LRAIN) THEN END IF END IF ! -IF (LCOLD) THEN +IF (LCOLD .AND. NRR.GE.4) THEN ! ! ice crystals ! @@ -181,7 +182,7 @@ IF (LCOLD) THEN ! ( XRHOLI * XAI*(10.E-06)**XBI * PRT(:,:,:,4) ), & ! ZCONCI ) ! Correction - PSVT(:,:,:,NSV_LIMA_NI) = MIN(PRT(:,:,:,4)/(XAI*(10.E-06)**XBI),ZCONCI ) + PSVT(:,:,:,NSV_LIMA_NI) = MIN(PRT(:,:,:,4)/(0.82*(10.E-06)**2.5),ZCONCI ) END WHERE WHERE ( PRT(:,:,:,4) <= 1.E-11 ) PRT(:,:,:,4) = 0.0 diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90 index ff2edc1eaabb3935cb93357fdb1430abe4e042a5..e5de7a4c72e5736acdeb99546bea0ae380ee492e 100644 --- a/src/MNH/spawn_model2.f90 +++ b/src/MNH/spawn_model2.f90 @@ -1413,7 +1413,7 @@ IF (.NOT. L1D) THEN XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XRHODJ, & + XRHODJ,XRHODREF, & XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT ) END IF ! diff --git a/src/MNH/spawning.f90 b/src/MNH/spawning.f90 index 2480473be3a44be2ae754e179093f444bf3c264b..3392212b137d81ff30a2cb66d643f683f69d52e1 100644 --- a/src/MNH/spawning.f90 +++ b/src/MNH/spawning.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!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. @@ -76,7 +76,8 @@ !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 07/02/2019: remove OPARALLELIO argument from open and close files subroutines ! (nsubfiles_ioz is now determined in IO_File_add2list) -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! S. Bielli 02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes +! P. Wautelet 11/02/2020: bugfix: close TINIFILEPGD only if previously opened !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -208,7 +209,7 @@ CALL INIT_MNH ! CALL IO_File_find_byname(TRIM(CINIFILE),TZINIFILE,IRESP) CALL IO_File_close(TZINIFILE) -CALL IO_File_close(TINIFILEPGD) +IF ( TINIFILEPGD%LOPENED ) CALL IO_File_close(TINIFILEPGD) !------------------------------------------------------------------------------- ! !* 4. INITIALIZATION OF OUTER POINTS OF MODEL 1 @@ -220,7 +221,7 @@ CALL BOUNDARIES & XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS, & XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS, & - XRHODJ, & + XRHODJ,XRHODREF, & XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT ) CALL MPPDB_CHECK3D(XUT,"SPAWNING-after boundaries::XUT",PRECISION) ! diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90 index f1d20df7e869f96195e5b9ac6ca4e6e7fd7e6d1b..898770bb7b28719c9602272e996f58eaa6ce38b1 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 2002-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2019 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. !----------------------------------------------------------------- ! ########################## @@ -86,6 +86,7 @@ END MODULE MODI_STATION_n !! C.Lac 04/2013 : Add I/J positioning !! P.Wautelet 28/03/2018 : Replace TEMPORAL_DIST by DATETIME_DISTANCE !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! R.Schoetter 11/2019 : use LCARTESIAN instead of LSTATLAT for multiproc in cartesian !! !! -------------------------------------------------------------------------- ! @@ -292,7 +293,6 @@ IF (GSTATFIRSTCALL) THEN ! !* 4.4 Computations only on correct processor ! -------------------------------------- - IF ( LSTATLAT ) THEN ZXCOEF(I) = 0. ZYCOEF(I) = 0. ZUCOEF(I) = 0. @@ -331,7 +331,6 @@ IF (GSTATFIRSTCALL) THEN ! END IF - END IF ENDDO END IF !---------------------------------------------------------------------------- @@ -360,18 +359,16 @@ IF (GSTORE) THEN ENDIF END IF ! - ZGAM = (XRPK * (TSTATION%LON(I) - XLON0) - XBETA)*(XPI/180.) - IF ( LSTATLAT ) THEN - ZU_STAT = STATION_INTERP_2D_U(PU(:,:,J)) - ZV_STAT = STATION_INTERP_2D_V(PV(:,:,J)) + IF (LCARTESIAN) THEN + TSTATION%ZON (IN,I) = STATION_INTERP_2D_U(PU(:,:,J)) + TSTATION%MER (IN,I) = STATION_INTERP_2D_V(PV(:,:,J)) ELSE - ZU_STAT = PU(TSTATION%I(I),TSTATION%J(I),J) - ZV_STAT = PV(TSTATION%I(I),TSTATION%J(I),J) - END IF - ! - TSTATION%ZON (IN,I) = ZU_STAT * COS(ZGAM) + ZV_STAT * SIN(ZGAM) - TSTATION%MER (IN,I) = - ZU_STAT * SIN(ZGAM) + ZV_STAT * COS(ZGAM) - IF ( LSTATLAT ) THEN + ZU_STAT = STATION_INTERP_2D_U(PU(:,:,J)) + ZV_STAT = STATION_INTERP_2D_V(PV(:,:,J)) + ZGAM = (XRPK * (TSTATION%LON(I) - XLON0) - XBETA)*(XPI/180.) + TSTATION%ZON (IN,I) = ZU_STAT * COS(ZGAM) + ZV_STAT * SIN(ZGAM) + TSTATION%MER (IN,I) = - ZU_STAT * SIN(ZGAM) + ZV_STAT * COS(ZGAM) + ENDIF TSTATION%W (IN,I) = STATION_INTERP_2D(PW(:,:,J)) TSTATION%TH (IN,I) = STATION_INTERP_2D(PTH(:,:,J)) TSTATION%P (IN,I) = STATION_INTERP_2D(PP(:,:,J)) @@ -410,46 +407,7 @@ IF (GSTORE) THEN ENDIF TSTATION%SFCO2 (IN,I) = STATION_INTERP_2D(XCURRENT_SFCO2 ) ENDIF - ELSE - TSTATION%W (IN,I) = PW(TSTATION%I(I),TSTATION%J(I),J) - TSTATION%TH (IN,I) = PTH(TSTATION%I(I),TSTATION%J(I),J) - TSTATION%P (IN,I) = PP(TSTATION%I(I),TSTATION%J(I),J) - ! - DO JSV=1,SIZE(PR,4) - TSTATION%R (IN,I,JSV) = PR(TSTATION%I(I),TSTATION%J(I),J,JSV) - END DO - ! - DO JSV=1,SIZE(PSV,4) - TSTATION%SV (IN,I,JSV) = PSV(TSTATION%I(I),TSTATION%J(I),J,JSV) - END DO - ! - IF (SIZE(PTKE)>0) TSTATION%TKE (IN,I) = PTKE(TSTATION%I(I),TSTATION%J(I),J) - IF (SIZE(PTS) >0) TSTATION%TSRAD(IN,I) = PTS(TSTATION%I(I),TSTATION%J(I)) - TSTATION%ZS(I) = PZ(TSTATION%I(I),TSTATION%J(I),1+JPVEXT) - ! - IF (LDIAG_IN_RUN) THEN - TSTATION%ZON10M(IN,I) = XCURRENT_ZON10M(TSTATION%I(I),TSTATION%J(I)) - TSTATION%MER10M(IN,I) = XCURRENT_MER10M(TSTATION%I(I),TSTATION%J(I)) - TSTATION%T2M (IN,I) = XCURRENT_T2M(TSTATION%I(I),TSTATION%J(I)) - TSTATION%Q2M (IN,I) = XCURRENT_Q2M(TSTATION%I(I),TSTATION%J(I)) - TSTATION%HU2M (IN,I) = XCURRENT_HU2M(TSTATION%I(I),TSTATION%J(I)) - TSTATION%RN (IN,I) = XCURRENT_RN(TSTATION%I(I),TSTATION%J(I)) - TSTATION%H (IN,I) = XCURRENT_H(TSTATION%I(I),TSTATION%J(I)) - TSTATION%LE (IN,I) = XCURRENT_LE(TSTATION%I(I),TSTATION%J(I)) - TSTATION%LEI (IN,I) = XCURRENT_LEI(TSTATION%I(I),TSTATION%J(I)) - TSTATION%GFLUX (IN,I) = XCURRENT_GFLUX(TSTATION%I(I),TSTATION%J(I)) - IF (CRAD /= 'NONE') THEN - TSTATION%SWD (IN,I) = XCURRENT_SWD(TSTATION%I(I),TSTATION%J(I)) - TSTATION%SWU (IN,I) = XCURRENT_SWU(TSTATION%I(I),TSTATION%J(I)) - TSTATION%LWD (IN,I) = XCURRENT_LWD(TSTATION%I(I),TSTATION%J(I)) - TSTATION%LWU (IN,I) = XCURRENT_LWU(TSTATION%I(I),TSTATION%J(I)) - TSTATION%SWDIR (IN,I) = XCURRENT_SWDIR(TSTATION%I(I),TSTATION%J(I)) - TSTATION%SWDIFF(IN,I) = XCURRENT_SWDIFF(TSTATION%I(I),TSTATION%J(I)) - TSTATION%DSTAOD(IN,I) = XCURRENT_DSTAOD(TSTATION%I(I),TSTATION%J(I)) - ENDIF - TSTATION%SFCO2 (IN,I) = XCURRENT_SFCO2(TSTATION%I(I),TSTATION%J(I)) - ENDIF - ENDIF + ! END IF ! diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index 512065c1886a9b463f97f8091125b62792a5f1c5..061191b1ed5e0fb2a4d1ba70b8c69a1ee7645dd5 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -341,6 +341,7 @@ END MODULE MODI_TURB !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! 01/2018 (Q.Rodier) Introduction of RM17 ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -354,6 +355,7 @@ USE MODD_BUDGET USE MODD_IO, ONLY: TFILEDATA USE MODD_LES USE MODD_NSV +USE MODD_PARAM_LIMA ! USE MODI_GRADIENT_M USE MODI_GRADIENT_U @@ -538,7 +540,7 @@ REAL :: ZALPHA ! proportionnality constant between Dz/2 and ! ! BL89 mixing length near the surface ! REAL :: ZTIME1, ZTIME2 -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH +REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH,ZCOR REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZSHEAR, ZDUDZ, ZDVDZ TYPE(TFIELDDATA) :: TZFIELD ! @@ -1109,32 +1111,137 @@ IF ( KRRL >= 1 ) THEN END IF END IF ! -IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) THEN - ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) - ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) -! CALL GET_HALO(PRRS(:,:,:,2)) -! CALL GET_HALO(PRSVS(:,:,:,2)) -! CALL GET_HALO(PRSVS(:,:,:,3)) - WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.) - PRSVS(:,:,:,1) = 0.0 - END WHERE - DO JSV = 2, 3 - WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) - PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & +SELECT CASE ( HCLOUD ) + CASE('ICE3','ICE4') + ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) + WHERE (PRRS(:,:,:,4) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,4) = 0. + END WHERE +! +! cloud + WHERE (PRRS(:,:,:,2) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,2) = 0. + END WHERE +! +! if rc or ri are positive, we can correct negative rv +! cloud + WHERE ((PRRS(:,:,:,1) <0.) .AND. (PRRS(:,:,:,2)> 0.) ) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,2) = 0. + END WHERE +! ice + IF(KRR > 3) THEN + WHERE ((PRRS(:,:,:,1) < 0.).AND.(PRRS(:,:,:,4) > 0.)) + ZCOR(:,:,:)=MIN(-PRRS(:,:,:,1),PRRS(:,:,:,4)) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + ZCOR(:,:,:) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) / & ZCPH(:,:,:) / ZEXNE(:,:,:) - PRRS(:,:,:,JSV) = 0.0 - PRSVS(:,:,:,JSV) = 0.0 - END WHERE - END DO -! - IF (LBUDGET_TH) CALL BUDGET (PRTHLS(:,:,:), 4,'NETUR_BU_RTH') - IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), 6,'NETUR_BU_RRV') - IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), 7,'NETUR_BU_RRC') + PRRS(:,:,:,4) = PRRS(:,:,:,4) -ZCOR(:,:,:) + END WHERE + END IF +! + CASE('C2R2','KHKO') + ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) +! CALL GET_HALO(PRRS(:,:,:,2)) +! CALL GET_HALO(PRSVS(:,:,:,2)) +! CALL GET_HALO(PRSVS(:,:,:,3)) + WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.) + PRSVS(:,:,:,1) = 0.0 + END WHERE + DO JSV = 2, 3 + WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,JSV) = 0.0 + PRSVS(:,:,:,JSV) = 0.0 + END WHERE + END DO + ! + CASE('LIMA') + ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) +! Correction where rc<0 or Nc<0 + IF (LWARM) THEN + WHERE (PRRS(:,:,:,2) < XRTMIN(2)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NC) < XCTMIN(2)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,2) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NC) = 0.0 + END WHERE + END IF +! Correction where rr<0 or Nr<0 + IF (LWARM .AND. LRAIN) THEN + WHERE (PRRS(:,:,:,3) < XRTMIN(3)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NR) < XCTMIN(3)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,3) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,3) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,3) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NR) = 0.0 + END WHERE + END IF +! Correction where ri<0 or Ni<0 + IF (LCOLD) THEN + WHERE (PRRS(:,:,:,4) < XRTMIN(4)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NI) < XCTMIN(4)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,4) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NI) = 0.0 + END WHERE + END IF +! + PRSVS(:,:,:,:) = MAX( 0.0,PRSVS(:,:,:,:) ) + PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) ) +! +END SELECT +! +IF ((HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'KHKO') .OR. (HCLOUD /= 'C2R2') .OR. (HCLOUD /= 'LIMA') ) THEN + IF (LBUDGET_TH) CALL BUDGET (PRTHLS(:,:,:), 4,'NETUR_BU_RTH') + IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), 6,'NETUR_BU_RRV') + IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), 7,'NETUR_BU_RRC') + IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3), 8,'NETUR_BU_RRR') + IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4), 9,'NETUR_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'NETUR_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'NETUR_BU_RRG') + IF (LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'NETUR_BU_RRH') END IF +IF (LBUDGET_SV .AND. (HCLOUD == 'LIMA')) THEN + IF (LWARM) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NC),12+NSV_LIMA_NC,'NETUR_BU_RSV') + IF (LWARM.AND.LRAIN) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NR),12+NSV_LIMA_NR,'NETUR_BU_RSV') + IF (LCOLD) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NI),12+NSV_LIMA_NI,'NETUR_BU_RSV') + IF (NMOD_CCN.GE.1) THEN + DO JI=1, NMOD_CCN + CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_CCN_FREE+JI-1),12+NSV_LIMA_CCN_FREE+JI-1,'NETUR_BU_RSV') + END DO + END IF + IF (NMOD_IFN.GE.1) THEN + DO JI=1, NMOD_IFN + CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_IFN_FREE+JI-1),12+NSV_LIMA_IFN_FREE+JI-1,'NETUR_BU_RSV') + END DO + END IF +END IF + ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90 index e24f6a3009250f1f268fe012cc47cad643d5603a..bbf9ca689d1391b73b7db7769935eaceebcf208a 100644 --- a/src/MNH/write_budget.f90 +++ b/src/MNH/write_budget.f90 @@ -946,7 +946,6 @@ SELECT CASE (CBUTYPE) ZWORKT(:,:,:,1,1,JPROC) = ZWORKT(:,:,:,1,1,JPROC)* ZCONVERT(JPROC) & / ZWORK(:,:,:,1,1,1) END DO - DEALLOCATE(ZWORK) ENDIF DEALLOCATE(ZCONVERT) ! diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index 75c4c6d8f0157264aa29c590de96ef8033ef9cd5..e2c1038474ab4d59e9e77a76d6929aa39853eb27 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-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. @@ -172,6 +172,7 @@ END MODULE MODI_WRITE_LFIFM_n !! C.Lac 18/02/2019: add rain fraction as an output field !! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Tulet 02/2020: correction for dust and sea salts !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -256,6 +257,8 @@ USE MODI_WRITE_BALLOON_n USE MODI_DUSTLFI_n USE MODI_SALTLFI_n USE MODI_CH_AER_REALLFI_n +USE MODI_SALT_FILTER +USE MODI_DUST_FILTER ! !20131128 USE MODE_MPPDB @@ -1218,6 +1221,7 @@ IF (NSV >=1) THEN TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. ! + CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) DO JSV = NSV_DSTBEG,NSV_DSTEND TZFIELD%CMNHNAME = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) @@ -1275,22 +1279,34 @@ IF (NSV >=1) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - DO JMODE=1, NMODE_SLT - DO JMOM = 1, IMOMENTS - !Index from which names are picked - ISV_NAME_IDX = (JPSALTORDER(JMODE)-1)*IMOMENTS + JMOM - !Index which counts in the XSVT - JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted - + JMOM & !Number of moments in this mode - + (NSV_SLTBEG -1) !Previous list of tracers - - TZFIELD%CMNHNAME = TRIM(YPSALT_INI(ISV_NAME_IDX))//'T' !The refererence which will be written to file +! + IF (IMOMENTS == 1) THEN + DO JMODE=1, NMODE_SLT + ISV_NAME_IDX = (JPSALTORDER(JMODE) - 1)*3 + 2 + JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted + + 1 & !Number of moments in this mode + + (NSV_SLTBEG -1) !Previous list of tracers + TZFIELD%CMNHNAME = TRIM(YPSALT_INI(ISV_NAME_IDX))//'T' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - YSLTNAMES((JMODE-1)*IMOMENTS+JMOM)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on moments - END DO ! Loop on modes + YSLTNAMES((JMODE-1)*IMOMENTS+1)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) + END DO ! Loop on mode + ELSE + DO JMODE=1, NMODE_SLT + DO JMOM = 1, IMOMENTS + ISV_NAME_IDX = (JPSALTORDER(JMODE) - 1)*IMOMENTS + JMOM + JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted + + JMOM & !Number of moments in this mode + + (NSV_SLTBEG -1) + TZFIELD%CMNHNAME = TRIM(YPSALT_INI(ISV_NAME_IDX))//'T' !The refererence which will be written to file + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) + YSLTNAMES((JMODE-1)*IMOMENTS+JMOM)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) + END DO ! Loop on moment + END DO ! loop on mode + END IF ! IMOMENTS ! DO JSV = NSV_SLTBEG,NSV_SLTEND YCHNAMES(JSV-JSA) = YSLTNAMES(JSV-NSV_SLTBEG+1) @@ -1307,6 +1323,7 @@ IF (NSV >=1) THEN TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. ! + CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF) DO JSV = NSV_SLTBEG,NSV_SLTEND TZFIELD%CMNHNAME = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 916f951e3b4a5c45a51d019d01d7dbefd7fec4d5..b5de08b9ae67869e2bd5839589080ab3403031f8 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -63,30 +63,30 @@ END MODULE MODI_WRITE_STATION_n !* 0. DECLARATIONS ! ------------ ! +USE MODD_CH_M9_n, ONLY: CNAMES +USE MODD_CH_AEROSOL, ONLY: CAERONAMES, LORILAM, JPMODE +USE MODD_CONF USE MODD_CST +USE MODD_DIAG_IN_RUN +USE MODD_DIM_n +USE MODD_DUST, ONLY: CDUSTNAMES, LDUST, NMODE_DST +USE MODD_ELEC_DESCR, ONLY: CELECNAMES +USE MODD_GRID_n +USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES USE MODD_IO, ONLY: TFILEDATA +USE MODD_LG, ONLY: CLGNAMES USE MODD_LUNIT +USE MODD_NSV USE MODD_PARAMETERS -! -USE MODD_CH_M9_n, ONLY: CNAMES -USE MODD_CH_AEROSOL, ONLY: CAERONAMES, LORILAM, JPMODE +USE MODD_PARAM_n, ONLY: CRAD +USE MODD_PASPOL USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -USE MODD_LG, ONLY: CLGNAMES -USE MODD_DUST, ONLY: CDUSTNAMES, LDUST, NMODE_DST USE MODD_SALT, ONLY: CSALTNAMES, LSALT, NMODE_SLT -USE MODD_NSV -USE MODD_DIAG_IN_RUN -USE MODD_PARAM_n, ONLY: CRAD -! -USE MODD_DIM_n -USE MODD_GRID_n USE MODD_STATION_n ! +USE MODE_AERO_PSD USE MODE_DUST_PSD USE MODE_SALT_PSD -USE MODE_AERO_PSD ! USE MODI_WRITE_DIACHRO ! @@ -200,6 +200,20 @@ YUNIT (JPROC) = 'degree' YCOMMENT (JPROC) = 'Latitude' ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LAT(II) ! +IF (LCARTESIAN) THEN + JPROC = JPROC + 1 + YTITLE (JPROC) = 'X' + YUNIT (JPROC) = 'm' + YCOMMENT (JPROC) = 'X Pos' + ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%X(II) + ! + JPROC = JPROC + 1 + YTITLE (JPROC) = 'Y' + YUNIT (JPROC) = 'm' + YCOMMENT (JPROC) = 'Y Pos' + ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%Y(II) +ENDIF +! JPROC = JPROC + 1 YTITLE (JPROC) = 'ZON_WIND' YUNIT (JPROC) = 'm s-1' @@ -367,6 +381,15 @@ IF (SIZE(TSTATION%TKE,1)>0) THEN END IF ! ! +IF (LPASPOL) THEN + JSV=1 + JPROC = JPROC+1 + WRITE (YTITLE(JPROC),FMT='(A2,I3.3)') 'Sv',JSV + YUNIT (JPROC) = 'kg kg-1' + YCOMMENT (JPROC) = ' ' + ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) +ENDIF +! IF (SIZE(TSTATION%SV,3)>=1) THEN ! User scalar variables DO JSV = 1,NSV_USER diff --git a/src/Rules.LXifort.mk b/src/Rules.LXifort.mk index e89ea60a34fab24e948a7040ae516eb254a807aa..a912f800b0dadff45dcd117e54bfe49c4443c0c5 100644 --- a/src/Rules.LXifort.mk +++ b/src/Rules.LXifort.mk @@ -180,7 +180,7 @@ CPPFLAGS_MNH = -DMNH -DSFX_MNH ifdef VER_GA CPPFLAGS_SURCOUCHE += -DMNH_GA INC += -I${GA_ROOT}/include -LIBS += -L${GA_ROOT}/lib -larmci -lga -lgfortran +LIBS += -L${GA_ROOT}/lib -lga -larmci endif # # Gribex flags diff --git a/src/SURFEX/allocate_physio.F90 b/src/SURFEX/allocate_physio.F90 index 1028fa2498a5949727561ed5e83c6b1bc3f45250..745a7d007573acc54b03ab9a38911feb85faedc7 100644 --- a/src/SURFEX/allocate_physio.F90 +++ b/src/SURFEX/allocate_physio.F90 @@ -33,6 +33,7 @@ !! ------------- !! Original xx/xxxx !! Modified 10/2014 P. Samuelsson MEB +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree ! ! USE MODD_ISBA_OPTIONS_n, ONLY : ISBA_OPTIONS_t @@ -99,11 +100,7 @@ ELSE ENDIF ! - vegetation: Ags parameters ('AGS', 'LAI', 'AST', 'LST', 'NIT' options) ! -IF (IO%CPHOTO/='NON'.OR.LTREEDRAG) THEN - ALLOCATE(PK%XH_TREE (ISIZE )) -ELSE - ALLOCATE(PK%XH_TREE (0 )) -ENDIF +ALLOCATE(PK%XH_TREE (ISIZE )) ! IF (IO%CPHOTO/='NON') THEN ALLOCATE(PK%XRE25 (ISIZE )) diff --git a/src/SURFEX/ch_emission_fluxn.F90 b/src/SURFEX/ch_emission_fluxn.F90 index 25b6a7e646b86a910fcd2d6f54bc7569a41a46c6..f9eae54518a9396b0c73cce922894b0fad2493f7 100644 --- a/src/SURFEX/ch_emission_fluxn.F90 +++ b/src/SURFEX/ch_emission_fluxn.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2000-2020 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. @@ -28,6 +28,7 @@ !! P.Tulet 01/01/05 add dust, orilam !! M.Leriche 2015 suppress ZDEPOT !! M.Moge 01/2016 using READ_SURF_FIELD2D for 2D surfex fields reads +! P. Wautelet 11/02/2020: bugfix: set correct filein before call to INIT_IO_SURF_n !! !! EXTERNAL !! -------- @@ -53,6 +54,7 @@ USE MODI_GET_LUOUT USE MODD_CHS_AEROSOL, ONLY: LCH_AERO_FLUX USE MODI_CH_AER_EMISSION !UPG*AERO1 +USE MODI_SET_SURFEX_FILEIN !! !------------------------------------------------------------------------------ ! @@ -208,6 +210,7 @@ DO JI=1,SIZE(CHE%TSEMISS) ! IF (.NOT. LIOINIT) THEN ! Must be done once before reading + CALL SET_SURFEX_FILEIN(HPROGRAM,'PGD ') CALL INIT_IO_SURF_n(DTCO, U, HPROGRAM,'FULL ','SURF ','READ ') IF (IVERB >= 6) WRITE(ILUOUT,*) 'INIT des I/O DONE.' LIOINIT=.TRUE. diff --git a/src/SURFEX/convert_patch_isba.F90 b/src/SURFEX/convert_patch_isba.F90 index cad66666339946c838b566938c50ad491b38e4f0..b04278c2088347b63e33deac72c1660e34f2c7ff 100644 --- a/src/SURFEX/convert_patch_isba.F90 +++ b/src/SURFEX/convert_patch_isba.F90 @@ -46,6 +46,7 @@ !! coupled to atmosphere) !! P Samuelsson 10/2014 MEB ! P. Wautelet 15/02/2019: bugfix: allocate ZSTRESS only when its size has a meaning +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree ! !---------------------------------------------------------------------------- ! @@ -215,7 +216,6 @@ IF (OFIX) THEN PK%NR_P,IO%NPATCH,KPATCH,KDECADE=KDEC) ENDIF ! - IF (IO%CPHOTO/='NON'.OR.LTREEDRAG) THEN IF (GDATA .AND. ANY(DTV%LDATA_H_TREE)) THEN CALL AV_PGD_PARAM(DTV%XPAR_LAI, DTV%XPAR_VEG, & PK%XH_TREE,DTV%XPAR_VEGTYPE,DTV%XPAR_H_TREE,YTREE,'ARI',PK%NR_P,IO%NPATCH,KPATCH) @@ -223,7 +223,6 @@ IF (OFIX) THEN CALL AV_PGD_1P(DTCO, PK%XH_TREE,PCOVER,XDATA_H_TREE(:,:),YTREE,'ARI',OCOVER,& PK%NR_P,IO%NPATCH,KPATCH,KDECADE=KDEC) ENDIF - ENDIF ! IF (IO%CPHOTO/='NON') THEN ! diff --git a/src/SURFEX/get_surf_varn.F90 b/src/SURFEX/get_surf_varn.F90 index f732f03161620077971e172764a7af89d51acc92..de14d16e00dcc1c9b80ee0ee6ff3bc89e9816833 100644 --- a/src/SURFEX/get_surf_varn.F90 +++ b/src/SURFEX/get_surf_varn.F90 @@ -10,7 +10,8 @@ PZ0H_WATER, PZ0H_NATURE, PZ0H_TOWN, PQS_SEA, & PQS_WATER, PQS_NATURE, PQS_TOWN, PPSNG, PPSNV, & PZS, PSERIES, PTWSNOW, PSSO_STDEV, PLON, PLAT, & - PBARE, PLAI_TREE, PH_TREE ) + PBARE, PLAI_TREE, PH_TREE, & + PWALL_O_HOR, PBUILD_HEIGHT ) ! ####################################################################### ! !!**** *GET_SURF_VAR_n* - gets some surface fields on atmospheric grid @@ -47,6 +48,7 @@ ! S. Riette 06/2010 PSSO_STDEV and PTWSNOW added ! B. Decharme 09/2012 Argument added in GET_FLUX_n ! B. Decharme 05/2013 Argument added in GET_FLUX_n for debug in ARP/AL/AR +!! C. Lac 11/2019 correction in the drag formula and application to building in addition to tree !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -144,8 +146,11 @@ REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PLON ! longitude REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PLAT ! latitude ! REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PBARE ! bare soil fraction on grid mesh (-) -REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PLAI_TREE ! Leaf Area Index on grid mesh (-) -REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PH_TREE ! Height of trees on grid mesh (-) +REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PLAI_TREE ! Leaf Area Index on grid mesh (-) +REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PH_TREE ! Height of trees on grid mesh (-) +! +REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PWALL_O_HOR ! Facade area density on grid mesh [m^2(fac.)/m^2(town)] +REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PBUILD_HEIGHT ! Building height on grid mesh [m] ! !------------------------------------------------------------------------------- ! @@ -425,7 +430,8 @@ ENDIF ! !------------------------------------------------------------------------------- ! -IF ( PRESENT(PQS_TOWN) .OR. PRESENT(PZ0_TOWN) .OR. PRESENT(PZ0H_TOWN) ) THEN +IF ( PRESENT(PQS_TOWN) .OR. PRESENT(PZ0_TOWN) .OR. PRESENT(PZ0H_TOWN) .OR. & + PRESENT(PWALL_O_HOR) .OR. PRESENT (PBUILD_HEIGHT) ) THEN ! ! Get parameters over town tile ! @@ -440,8 +446,9 @@ IF ( PRESENT(PQS_TOWN) .OR. PRESENT(PZ0_TOWN) .OR. PRESENT(PZ0H_TOWN) ) THEN IMASK(:)=0 CALL GET_1D_MASK(KI_TOWN, KI, PTOWN, IMASK(1:KI_TOWN)) ! - CALL GET_VAR_TOWN_n(TM%TD%O, TM%TD%D, HPROGRAM, KI_TOWN, & - ZFIELD1(1:KI_TOWN), ZFIELD2(1:KI_TOWN), ZFIELD3(1:KI_TOWN)) + CALL GET_VAR_TOWN_n(TM%TOP, TM%TD%O, TM%TD%D, TM%NT,HPROGRAM, KI_TOWN, & + ZFIELD1(1:KI_TOWN), ZFIELD2(1:KI_TOWN), ZFIELD3(1:KI_TOWN),& + ZFIELD4(1:KI_TOWN), ZFIELD5(1:KI_TOWN) ) ! IF(PRESENT(PQS_TOWN))THEN PQS_TOWN (:) = XUNDEF @@ -464,6 +471,20 @@ IF ( PRESENT(PQS_TOWN) .OR. PRESENT(PZ0_TOWN) .OR. PRESENT(PZ0H_TOWN) ) THEN END DO ENDIF ! + IF(PRESENT(PWALL_O_HOR))THEN + PWALL_O_HOR (:) = XUNDEF + DO JI = 1, KI_TOWN + PWALL_O_HOR(IMASK(JI)) = ZFIELD4(JI) + END DO + ENDIF + ! + IF(PRESENT(PBUILD_HEIGHT))THEN + PBUILD_HEIGHT (:) = XUNDEF + DO JI = 1, KI_TOWN + PBUILD_HEIGHT(IMASK(JI)) = ZFIELD5(JI) + END DO + ENDIF + ! END IF ! !* 5. Orography diff --git a/src/SURFEX/get_var_townn.F90 b/src/SURFEX/get_var_townn.F90 index 0f2e9c9d7a8501a326655eb869dbe19ee0f69416..382f32216f17819a49f02764db3ef54b5a2889e6 100644 --- a/src/SURFEX/get_var_townn.F90 +++ b/src/SURFEX/get_var_townn.F90 @@ -3,7 +3,8 @@ !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ######### - SUBROUTINE GET_VAR_TOWN_n (DGO, D, HPROGRAM,KI,PQS,PZ0,PZ0H) + SUBROUTINE GET_VAR_TOWN_n (TOP, DGO, D, NT, HPROGRAM,KI,PQS,PZ0,PZ0H, & + PWALL_O_HOR,PBUILD_HEIGHT ) ! ################################################### ! !!**** *GET_VAR_TOWN_n* - routine to get variables defined only over town @@ -33,6 +34,7 @@ !! ------------- !! Original 02/2006 ! M. Jidane 08/2008 Z0 and Z0H recovery from town tiles +!! C.Lac 11/2019 correction in the drag formula and application to building in addition to tree !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -40,6 +42,8 @@ ! ! USE MODD_DIAG_n, ONLY : DIAG_t, DIAG_OPTIONS_t +USE MODD_TEB_n, ONLY : TEB_NP_t +USE MODD_TEB_OPTION_n, ONLY : TEB_OPTIONS_t ! USE MODI_GET_LUOUT USE MODD_SURF_PAR, ONLY : XUNDEF @@ -54,19 +58,24 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! ------------------------- ! +TYPE(TEB_OPTIONS_t), INTENT(IN) :: TOP TYPE(DIAG_OPTIONS_t), INTENT(IN) :: DGO -TYPE(DIAG_t), INTENT(IN) :: D +TYPE(DIAG_t), INTENT(IN) :: D +TYPE(TEB_NP_t), INTENT(IN) :: NT ! CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM INTEGER, INTENT(IN) :: KI ! Number of points REAL, DIMENSION(KI), INTENT(OUT) :: PQS ! surface humidity REAL, DIMENSION(KI), INTENT(OUT) :: PZ0 ! surface roughness length REAL, DIMENSION(KI), INTENT(OUT) :: PZ0H ! surface roughness length for heat +REAL, DIMENSION(KI), INTENT(OUT) :: PWALL_O_HOR ! Facade surface density [m^2(fac.)/m^2(town)] +REAL, DIMENSION(KI), INTENT(OUT) :: PBUILD_HEIGHT ! Building height [m] ! ! !* 0.2 Declarations of local variables ! ------------------------------- ! +INTEGER :: JP ! loop counter on TEB patches INTEGER :: ILUOUT REAL(KIND=JPRB) :: ZHOOK_HANDLE ! @@ -76,17 +85,28 @@ IF (LHOOK) CALL DR_HOOK('GET_VAR_TOWN_N',0,ZHOOK_HANDLE) !------------------------------------------------------------------------------- ! IF (DGO%LSURF_VARS) THEN - PQS = D%XQS - ELSE - PQS = XUNDEF + PQS = D%XQS +ELSE + PQS = XUNDEF ENDIF IF (DGO%LCOEF) THEN - PZ0 = D%XZ0 - PZ0H = D%XZ0H - ELSE - PZ0 = XUNDEF - PZ0H = XUNDEF -ENDIF + PZ0 = D%XZ0 + PZ0H = D%XZ0H +ELSE + PZ0 = XUNDEF + PZ0H = XUNDEF +ENDIF +! +!* building height and external wall coverage fraction +! +PWALL_O_HOR = 0. +PBUILD_HEIGHT = 0. + +DO JP=1,TOP%NTEB_PATCH + PWALL_O_HOR (:) = PWALL_O_HOR (:) + TOP%XTEB_PATCH(:,JP) * NT%AL(JP)%XWALL_O_HOR(:) + PBUILD_HEIGHT(:) = PBUILD_HEIGHT(:) + TOP%XTEB_PATCH(:,JP) * NT%AL(JP)%XBLD_HEIGHT(:) +END DO + IF (LHOOK) CALL DR_HOOK('GET_VAR_TOWN_N',1,ZHOOK_HANDLE) ! !============================================================================== diff --git a/src/SURFEX/get_vegn.F90 b/src/SURFEX/get_vegn.F90 index a41238194f6801df7bdcbfa3720681b65c25c90f..d1e9c583dea8d354a300c86d77501cd24ee6236b 100644 --- a/src/SURFEX/get_vegn.F90 +++ b/src/SURFEX/get_vegn.F90 @@ -29,6 +29,7 @@ !! MODIFICATIONS !! ------------- !! Original 07/2009 +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -100,16 +101,16 @@ IPATCH_BONE = VEGTYPE_TO_PATCH(NVT_BONE, IO%NPATCH) IPATCH_BOND = VEGTYPE_TO_PATCH(NVT_BOND, IO%NPATCH) -!ZWORK(:) = S%XVEGTYPE(:,NVT_TRBE) + S%XVEGTYPE(:,NVT_TRBD) + S%XVEGTYPE(:,NVT_TEBE) + & -! S%XVEGTYPE(:,NVT_TEBD) + S%XVEGTYPE(:,NVT_TENE) + S%XVEGTYPE(:,NVT_BOBD) + & -! S%XVEGTYPE(:,NVT_BONE) + S%XVEGTYPE(:,NVT_BOND) - ZH_TREE(:) = 0. ZLAI(:) = 0. ZWORK(:) = 0. ! DO JP = 1,IO%NPATCH + PK => NP%AL(JP) + PEK => NPE%AL(JP) +END DO ! +DO JP = 1,IO%NPATCH IF (JP==IPATCH_TRBE .OR. JP==IPATCH_TRBD .OR. JP==IPATCH_TEBE .OR. JP==IPATCH_TEBD .OR. & JP==IPATCH_TENE .OR. JP==IPATCH_BOBD .OR. JP==IPATCH_BONE .OR. JP==IPATCH_BOND) THEN ! diff --git a/src/SURFEX/init_isban.F90 b/src/SURFEX/init_isban.F90 index 4bdbb57e1112e5df8c0cf986a6e72663295b7cbe..283b107f5744b132310c3f43feb9f084748da5b4 100644 --- a/src/SURFEX/init_isban.F90 +++ b/src/SURFEX/init_isban.F90 @@ -59,6 +59,7 @@ SUBROUTINE INIT_ISBA_n (DTCO, OREAD_BUDGETC, UG, U, USS, GCP, IM, DTZ,& !! P.Tulet 06/16 : add MEGAN coupling !! J.Pianezzej 02/2019 : correction for use of MEGAN ! P. Wautelet 21/11/2019: initialize YSNOW_SCHEME +! S. Donnier 02/2020 : correction for ECOCLIMAP SG (20 vegtypes possible) !! !------------------------------------------------------------------------------- ! @@ -371,7 +372,10 @@ ISIZE_LMEB_PATCH=COUNT(IM%O%LMEB_PATCH(:)) !* 2.2 Check: ! ------ ! -IF ( IM%O%CPHOTO/='NON' .AND. IM%O%NPATCH/=12 .AND. IM%O%NPATCH/=19 )THEN +! modif ECOSG +!IF ( IM%O%CPHOTO/='NON' .AND. IM%O%NPATCH/=12 .AND. IM%O%NPATCH/=19 )THEN +IF ( IM%O%CPHOTO/='NON' .AND. IM%O%NPATCH/=12 .AND. IM%O%NPATCH/=19 .AND. IM%O%NPATCH/=20 )THEN +! fin modif ECOSG CALL ABOR1_SFX('INIT_ISBAN: INCONSISTENCY BETWEEN CPHOTO AND NPATCH') ENDIF ! diff --git a/src/SURFEX/mode_aer_surf.F90 b/src/SURFEX/mode_aer_surf.F90 index e38f84a6480ea33bc163205106b8a4411443b125..a23ac0cdb8bb8f53f88d4f3148a08d0dead73d78 100644 --- a/src/SURFEX/mode_aer_surf.F90 +++ b/src/SURFEX/mode_aer_surf.F90 @@ -215,6 +215,7 @@ REAL,DIMENSION(JPMODE*3) :: ZMMIN ! REAL,DIMENSION(NSP+NCARB+NSOA) :: ZFAC ! M3 / mass conversion factor REAL, PARAMETER :: ZDEN2MOL = 1E-6 * 6.0221367E+23 / 28.9644E-3 +REAL :: ZEMISRADIUSI, ZEMISRADIUSJ INTEGER :: JJ, JN ! [idx] loop counters REAL(KIND=JPRB) :: ZHOOK_HANDLE ! @@ -227,6 +228,23 @@ DO JJ=1, SIZE(PSVT,2) ZSV(:,JJ) = PSVT(:,JJ) * ZDEN2MOL * PRHODREF(:) ZSV(:,JJ) = MAX(ZSV(:,JJ),1E-40 * ZDEN2MOL * PRHODREF(:)) ENDDO +!Get minimum values possible for aerosols moments +IF (CRGUNIT=="MASS") THEN + ZEMISRADIUSI = XEMISRADIUSI * EXP(-3.*(LOG(XEMISSIGI))**2) + ZEMISRADIUSJ = XEMISRADIUSJ * EXP(-3.*(LOG(XEMISSIGJ))**2) +ELSE + ZEMISRADIUSI = XEMISRADIUSI + ZEMISRADIUSJ = XEMISRADIUSJ +END IF + +ZMMIN(1) = XSURF_TINY +ZMMIN(2) = ZMMIN(1) * (ZEMISRADIUSI**3)*EXP(4.5 * LOG(XEMISSIGI)**2) +ZMMIN(3) = ZMMIN(1) * (ZEMISRADIUSI**6)*EXP(18. * LOG(XEMISSIGI)**2) + +ZMMIN(4) = XSURF_TINY +ZMMIN(5) = ZMMIN(4) * (ZEMISRADIUSJ**3)*EXP(4.5 * LOG(XEMISSIGJ)**2) +ZMMIN(6) = ZMMIN(4) * (ZEMISRADIUSJ**6)*EXP(18. * LOG(XEMISSIGJ)**2) + ! CALL INIT_VAR(ZSV,ZFAC,ZCTOTA) ! diff --git a/src/SURFEX/mode_read_grib.F90 b/src/SURFEX/mode_read_grib.F90 index ec71d31314156d270939ae14202ce729473420d3..344ea5967b0658f1a362b4eef77366bc302691fa 100644 --- a/src/SURFEX/mode_read_grib.F90 +++ b/src/SURFEX/mode_read_grib.F90 @@ -1,10 +1,11 @@ -!SFX_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2020 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. !------------------------------------------------------------------- ! Modifications: ! P. Wautelet 19/09/2019: correct support of 64bit integers (MNH_INT=8) +! Q. Rodier 27/01/2020: switch of GRIB number ID for Orography in ARPEGE in EPyGrAM v1.3.7 !------------------------------------------------------------------- ! ##################### MODULE MODE_READ_GRIB @@ -516,7 +517,11 @@ SELECT CASE (HINMODEL) CALL READ_GRIB(HGRIB,HINMODEL,KLUOUT,228002,IRET,PZS) CASE ('ARPEGE','MOCAGE') IF (HINMODEL=='ARPEGE' .AND. NGRIB_VERSION==2) THEN - CALL READ_GRIB(HGRIB,HINMODEL,KLUOUT,5,IRET,PZS) + CALL READ_GRIB(HGRIB,HINMODEL,KLUOUT,4,IRET,PZS) + IF (IRET /= 0) THEN + ! Old version of EPyGraM (bug corrected since 01/2020) + CALL READ_GRIB(HGRIB,HINMODEL,KLUOUT,5,IRET,PZS) + END IF ELSE CALL READ_GRIB(HGRIB,HINMODEL,KLUOUT,8,IRET,PZS) ENDIF diff --git a/src/configure b/src/configure index 2e6f572cb49dcbfc706c4399c5c2fb064bdf1609..9a6a4f7a257cc4a8ae8f4e5c046866aaf7870498 100755 --- a/src/configure +++ b/src/configure @@ -9,9 +9,9 @@ if [ "x$XYZ" = "x" ] then # export VERSION_MASTER=${VERSION_MASTER:-MNH-V5-4} -export VERSION_BUG=${VERSION_BUG:-2} +export VERSION_BUG=${VERSION_BUG:-3} export VERSION_XYZ=${VERSION_XYZ:-${VERSION_MASTER}-${VERSION_BUG}${VER_OASIS:+-${VER_OASIS}}} -export VERSION_DATE=${VERSION_DATE:-"03/04/2019"} +export VERSION_DATE=${VERSION_DATE:-"06/03/2020"} export VERSION_LIBAEC=${VERSION_LIBAEC:-"0.3.2"} export VERSION_HDF=${VERSION_HDF:-"1.8.20"} export VERSION_CDFC=${VERSION_CDFC:-"4.5.0"} @@ -52,8 +52,8 @@ case "$TARG" in export VER_CDF=${VER_CDF:-CDFAUTO} export MNHENV=${MNHENV:-" module purge -module load intel-compilers-19/19.0.4.243 -module load intel-mpi-19/19.0.4.243 +module load intel-compilers/19.0.5 +module load intel-mpi/19.0.5 ulimit -s unlimited export SLURM_CPU_BIND=none export I_MPI_PIN_PROCESSOR_LIST=all:map=spread @@ -118,6 +118,9 @@ module load ncl_ncarg/6.3.0 "} ;; 'Linux irene'*) + MODEL_NAME=`lscpu | grep 'Model name' ` + case ${MODEL_NAME} in +*Intel*) # Irene Intel core export MNH_ARCH=`echo $ARCH | grep LX` export ARCH=${MNH_ARCH:-LXifort} export VER_MPI=${VER_MPI:-MPIINTEL} @@ -131,6 +134,30 @@ module load mpi/intelmpi/2018.0.3.222 export SLURM_CPU_BIND=none export I_MPI_PIN_PROCESSOR_LIST=all:map=spread "} +;; +*AMD*) # Irene AMD core + export MNH_ARCH=`echo $ARCH | grep LX` + export ARCH=${MNH_ARCH:-LXifort} + export VER_MPI=${VER_MPI:-MPIAUTO} + export OPTLEVEL=${OPTLEVEL:-O2} + export MVWORK=${MVWORK:-NO} + export VER_CDF=${VER_CDF:-CDFAUTO} + export VERSION_XYZ="${VERSION_XYZ}-AMD" + export MNHENV=${MNHENV:-" +module purge +module load intel/19.0.5.281 +module load mpi/openmpi/4.0.2 +# Set some openmpi variable for pb with nb of cores >> 1024 +export OMPI_MCA_coll_hcoll_enable=0 +export HCOLL_ENABLE_MCAST_ALL=0 +export OMPI_MCA_coll_tuned_barrier_algorithm=2 +# For GA version set GA/ARMCI variables +export ARMCI_VERBOSE=1 +export ARMCI_STRIDED_METHOD=IOV ARMCI_IOV_METHOD=BATCHED +export ARMCI_SHR_BUF_METHOD=COPY +"} +;; + esac ;; 'Linux beaufix'*|'Linux prolix'*) diff --git a/src/job_make_examples_BullX_jeanzay b/src/job_make_examples_BullX_jeanzay new file mode 100755 index 0000000000000000000000000000000000000000..82ee2e6a67cd69fbdaea3cc6d92201974141e7dc --- /dev/null +++ b/src/job_make_examples_BullX_jeanzay @@ -0,0 +1,65 @@ +#!/bin/bash +#SBATCH -J Examples +#SBATCH -N 2 # nodes number +#SBATCH -n 4 # CPUs number (on all nodes) +#SBATCH -q qos_cpu-dev +#SBATCH --exclusive +#SBATCH -o Examples.eo%j # +#SBATCH -e Examples.eo%j # +#SBATCH -t 01:00:00 # time limit +#SBATCH --export=NONE + +# Echo des commandes +ulimit -c 0 +ulimit -s unlimited +# Arrete du job des la premiere erreur +#set -e +set -x +# Nom de la machine +hostname + +. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-4-3-MPIINTEL-O2 +export MONORUN="Exec srun -l -n 1 --export=ALL numabind_core_slurm" +export MPIRUN="Exec srun -l -n 4 --export=ALL numabind_core_slurm" +export POSTRUN="time " + +cd $SRC_MESONH/MY_RUN/KTEST/003_KW78 +make -k +# +echo "#################################################################################" +echo "##CAS SUIVANT####################################################################" +echo "#################################################################################" +cd $SRC_MESONH/MY_RUN/KTEST/001_2Drelief +make -k +# +echo "#################################################################################" +echo "##CAS SUIVANT####################################################################" +echo "#################################################################################" +cd $SRC_MESONH/MY_RUN/KTEST/002_3Drelief +make -k +# +echo "#################################################################################" +echo "##CAS SUIVANT####################################################################" +echo "#################################################################################" + +cd $SRC_MESONH/MY_RUN/KTEST/004_Reunion +make -k << EOF + + +EOF +# +echo "#################################################################################" +echo "##CAS SUIVANT####################################################################" +echo "#################################################################################" +cd $SRC_MESONH/MY_RUN/KTEST/007_16janvier +make -k << EOF + + +EOF +# +echo "#################################################################################" +echo "##CAS SUIVANT####################################################################" +echo "#################################################################################" +cd $SRC_MESONH/MY_RUN/KTEST/014_LIMA +make -k +