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_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index a56b264904c6332d208e916679d483f2cead2f9d..082ab6328083801e8ddd309de81db5d265bb516e 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.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. @@ -3756,6 +3756,9 @@ IF (.NOT.LFIELDLIST_ISINIT) THEN RETURN END IF ! +if (kfrom > nmodel_allocated .or. kto > nmodel_allocated ) & + call Print_msg( NVERB_FATAL, 'GEN', 'FIELDLIST_GOTO_MODEL', 'kfrom or kto > nmodel_allocated' ) +! ! Initialize some pointers ! !PW: TODO: check if still necessary as XRHODREFZ and XTHVREFZ are now initialiazed in ini_modeln even for KMI/=1 (29/01/2019) 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 4f3904e3d8d404b917a10cd9672e0833a34aba12..8e99f41615836f06432eb9b8836b2938882c9697 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 @@ -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 @@ -339,6 +340,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 @@ -355,7 +361,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)) @@ -435,16 +443,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 @@ -501,6 +516,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 @@ -516,7 +532,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 @@ -631,7 +647,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 @@ -659,6 +676,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 ! @@ -666,25 +684,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)) @@ -725,6 +748,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 @@ -745,8 +769,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 ! @@ -808,6 +830,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 1f02a2694aabd0ec0e22f4e69209b440d8ddf990..e90deedc52bde60629024130e015ef22bcbe33de 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 @@ -13,6 +13,7 @@ ! 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 ! P. Wautelet 12/07/2019: add support for 1D array of dates +! J. Escobar 11/02/2020: for GA & // IO, add sync, & mpi_allreduce for error handling in // IO !----------------------------------------------------------------- #define MNH_SCALARS_IN_SPLITFILES 0 @@ -592,8 +593,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 ! @@ -601,6 +604,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 @@ -692,7 +696,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 @@ -800,6 +804,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 ! ! @@ -814,23 +823,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 @@ -849,12 +856,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 @@ -868,6 +877,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 ! @@ -922,7 +932,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 @@ -958,8 +968,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 @@ -978,6 +989,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 3beae194e79cd286494ed66c91f4aa40b070aa27..ad3d23d18a6dc71144b0cadca6fb6cbab319d911 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 @@ -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 ! @@ -255,7 +257,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 7fa766ccd96a2c9fd729efe0267a839efb40c242..c1c7c8c58508fa174249a3d5adbf62873763ab9c 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -17,6 +17,7 @@ ! + no more process coordination for Z-split files ! 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 !----------------------------------------------------------------- #ifdef MNH_IOCDF4 module mode_io_write_nc4 @@ -133,6 +134,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/advecmet.f90 b/src/MNH/advecmet.f90 index 527febf154254736b76fc2d418571901ca7731a8..f165f3e06fb01afd306867a53d73898214c54798 100644 --- a/src/MNH/advecmet.f90 +++ b/src/MNH/advecmet.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. @@ -157,12 +157,10 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS !* 0.2 Declarations of local variables : ! INTEGER :: JRR ! Loop index for moist variables -INTEGER :: IKU ! ! !------------------------------------------------------------------------------- ! -IKU=SIZE(XZHAT) !* 1. COMPUTES THE ADVECTIVE TENDENCIES ! --------------------------------- ! @@ -176,7 +174,7 @@ PRTHS(:,:,:) = PRTHS(:,:,:) & !IF (LBUDGET_TH) CALL BUDGET (PRTHS,NBUDGET_TH,'ADVY_BU_RTH') ! PRTHS(:,:,:) = PRTHS(:,:,:) & - -DZF(1,IKU,1, PRWCT(:,:,:) * MZM (1,IKU,1,PTHT(:,:,:)) ) + -DZF( PRWCT(:,:,:) * MZM (PTHT(:,:,:)) ) !IF (LBUDGET_TH) CALL BUDGET (PRTHS,NBUDGET_TH,'ADVZ_BU_RTH') ! ! Case with KRR moist variables @@ -208,7 +206,7 @@ END DO ! DO JRR=1,KRR PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) & - -DZF(1,IKU,1, PRWCT(:,:,:) * MZM (1,IKU,1,PRT(:,:,:,JRR)) ) + -DZF( PRWCT(:,:,:) * MZM (PRT(:,:,:,JRR)) ) END DO ! !IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),NBUDGET_RV,'ADVZ_BU_RRV') @@ -230,7 +228,7 @@ IF (SIZE(PTKET,1) /= 0) THEN ! IF (LBUDGET_TKE) CALL BUDGET (PRTKES,NBUDGET_TKE,'ADVY_BU_RTKE') ! PRTKES(:,:,:) = PRTKES(:,:,:) & - -DZF(1,IKU,1, PRWCT(:,:,:) * MZM (1,IKU,1,PTKET(:,:,:)) ) + -DZF( PRWCT(:,:,:) * MZM (PTKET(:,:,:)) ) ! IF (LBUDGET_TKE) CALL BUDGET (PRTKES,NBUDGET_TKE,'ADVZ_BU_RTKE') END IF ! diff --git a/src/MNH/advecmet_4th.f90 b/src/MNH/advecmet_4th.f90 index 57ab588ade20114634aa7ff2e600891319bd0042..261ac95237afee599c8c4fdaf5da39cc1918422c 100644 --- a/src/MNH/advecmet_4th.f90 +++ b/src/MNH/advecmet_4th.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2005-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2005-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. @@ -194,7 +194,6 @@ TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion INTEGER :: JRR ! Loop index for moist variables INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE ! End useful area in x,y,z directions -INTEGER :: IKU ! LOGICAL :: GTKEALLOC ! true if TKE arrays are not zero-sized ! @@ -211,7 +210,6 @@ REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZMEANX, ZMEANY ! flux CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) ! GTKEALLOC = SIZE(PTKET,1) /= 0 -IKU=SIZE(XZHAT) ! !------------------------------------------------------------------------------- ! @@ -239,7 +237,7 @@ PRTHS(:,:,:) = PRTHS(:,:,:) & !IF (LBUDGET_TH) CALL BUDGET (PRTHS,NBUDGET_TH,'ADVY_BU_RTH') ! PRTHS(:,:,:) = PRTHS(:,:,:) & - -DZF(1,IKU,1, PRWCT(:,:,:) * MZM4(PTHT(:,:,:)) ) + -DZF( PRWCT(:,:,:) * MZM4(PTHT(:,:,:)) ) !IF (LBUDGET_TH) CALL BUDGET (PRTHS,NBUDGET_TH,'ADVZ_BU_RTH') ! ! Turbulence variables @@ -262,7 +260,7 @@ IF ( GTKEALLOC ) THEN ! IF (LBUDGET_TKE) CALL BUDGET (PRTKES,NBUDGET_TKE,'ADVY_BU_RTKE') ! PRTKES(:,:,:) = PRTKES(:,:,:) & - -DZF(1,IKU,1, PRWCT(:,:,:) * MZM4(PTKET(:,:,:)) ) + -DZF( PRWCT(:,:,:) * MZM4(PTKET(:,:,:)) ) ! IF (LBUDGET_TKE) CALL BUDGET (PRTKES,NBUDGET_TKE,'ADVZ_BU_RTKE') ENDIF ! @@ -299,7 +297,7 @@ DO JRR=1, KRR ! IF (JRR==7 .AND. LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),NBUDGET_RH,'ADVY_BU_RRH') ! PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) & - -DZF(1,IKU,1, PRWCT(:,:,:) * MZM4(PRT(:,:,:,JRR)) ) + -DZF( PRWCT(:,:,:) * MZM4(PRT(:,:,:,JRR)) ) ! IF (JRR==1 .AND. LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),NBUDGET_RV,'ADVZ_BU_RRV') ! IF (JRR==2 .AND. LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),NBUDGET_RC,'ADVZ_BU_RRC') ! IF (JRR==3 .AND. LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),NBUDGET_RR,'ADVZ_BU_RRR') diff --git a/src/MNH/advecscalar.f90 b/src/MNH/advecscalar.f90 index 0efc3342f2d9ec36ab4de1745739d8b92d4ebddc..fa353914ed8751aa65d4e0b66f6741a30f3b51aa 100644 --- a/src/MNH/advecscalar.f90 +++ b/src/MNH/advecscalar.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. @@ -124,7 +124,6 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS !* 0.2 Declarations of local variables : ! INTEGER :: JSV ! Loop index for Scalar Variables -INTEGER :: IKU ! ! !------------------------------------------------------------------------------- @@ -132,8 +131,6 @@ INTEGER :: IKU !* 1. COMPUTES THE ADVECTIVE TENDENCIES ! --------------------------------- ! -IKU=SIZE(XZHAT) -! ! Case with KSV Scalar Variables DO JSV=1,KSV PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) & @@ -157,7 +154,7 @@ END IF ! DO JSV=1,KSV PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) & - -DZF(1,IKU,1, PRWCT(:,:,:) * MZM (1,IKU,1, PSVT(:,:,:,JSV)) ) + -DZF( PRWCT(:,:,:) * MZM (PSVT(:,:,:,JSV)) ) END DO IF (LBUDGET_SV) THEN DO JSV=1,KSV diff --git a/src/MNH/advecscalar_4th.f90 b/src/MNH/advecscalar_4th.f90 index 2e0821a6b00395724e8b0ff0023d3587ac91ad7f..ce3082347400323f4f13ff31d3d4c9bcf2916015 100644 --- a/src/MNH/advecscalar_4th.f90 +++ b/src/MNH/advecscalar_4th.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 2005-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2005-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. !----------------------------------------------------------------- ! ############################### @@ -156,7 +156,6 @@ TYPE(HALO2LIST_ll), POINTER :: TZHALO2LIST ! INTEGER :: IGRID ! localisation on the model grid REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZMEANX, ZMEANY ! fluxes -INTEGER :: IKU ! !------------------------------------------------------------------------------- ! @@ -164,7 +163,6 @@ INTEGER :: IKU ! ------------------------------ ! CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) -IKU=SIZE(XZHAT) ! !------------------------------------------------------------------------------- ! @@ -195,7 +193,7 @@ DO JSV=1,KSV ! IF (LBUDGET_SV) CALL BUDGET (PRSVS(:,:,:,JSV),JSV+NBUDGET_SV1-1,'ADVY_BU_RSV') ! PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) & - -DZF(1,IKU,1, PRWCT(:,:,:) * MZM4(PSVT(:,:,:,JSV)) ) + -DZF( PRWCT(:,:,:) * MZM4(PSVT(:,:,:,JSV)) ) ! IF (LBUDGET_SV) CALL BUDGET (PRSVS(:,:,:,JSV),JSV+NBUDGET_SV1-1,'ADVZ_BU_RSV') ENDDO ! diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index 4d1e9d9235681ed902c54e3cfb0a38420ac54a85..b99acba7d2ae4635b61085896a81382c21cb1703 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -138,6 +138,7 @@ END MODULE MODI_ADVECTION_METSV !! the surface for the blowing snow scheme ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -154,6 +155,8 @@ USE MODD_CONF, ONLY: LNEUTRAL,NHALO,L1D, L2D use modd_field, only: tfielddata, TYPEREAL 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 @@ -258,7 +261,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 @@ -689,37 +692,154 @@ if ( lbudget_sv) then end do end if -IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) THEN - if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'NEADV', prths(:, :, :) ) - if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'NEADV', prrs (:, :, :, 1) ) - if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'NEADV', prrs (:, :, :, 2) ) +if ( hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) then + if (lbudget_th) call Budget_store_init( tbudgets(NBUDGET_TH), 'NEADV', prths(:, :, :) ) + if (lbudget_rv) call Budget_store_init( tbudgets(NBUDGET_RV), 'NEADV', prrs (:, :, :, 1) ) + if (lbudget_rc) call Budget_store_init( tbudgets(NBUDGET_RC), 'NEADV', prrs (:, :, :, 2) ) + if (lbudget_rr) call Budget_store_init( tbudgets(NBUDGET_RR), 'NEADV', prrs (:, :, :, 3) ) + if (lbudget_ri) call Budget_store_init( tbudgets(NBUDGET_RI), 'NEADV', prrs (:, :, :, 4) ) + if (lbudget_rs) call Budget_store_init( tbudgets(NBUDGET_RS), 'NEADV', prrs (:, :, :, 5) ) + if (lbudget_rg) call Budget_store_init( tbudgets(NBUDGET_RG), 'NEADV', prrs (:, :, :, 6) ) + if (lbudget_rh) call Budget_store_init( tbudgets(NBUDGET_RH), 'NEADV', prrs (:, :, :, 7) ) +end if +if ( lbudget_sv .and. hcloud == 'LIMA' ) then + if ( lwarm ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'NEADV', prsvs(:, :, :, nsv_lima_nc) ) + if ( lwarm .and. lrain ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'NEADV', prsvs(:, :, :, nsv_lima_nr) ) + if ( lcold ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'NEADV', prsvs(:, :, :, nsv_lima_ni) ) + do ji = nsv_lima_ccn_free, nsv_lima_ccn_free + nmod_ccn - 1 + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), 'NEADV', prsvs(:, :, :, ji) ) + end do + do ji = nsv_lima_ifn_free, nsv_lima_ifn_free + nmod_ifn - 1 + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), 'NEADV', prsvs(:, :, :, ji) ) + end do +end if - 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 - - if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'NEADV', prths(:, :, :) ) - if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'NEADV', prrs (:, :, :, 1) ) - if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'NEADV', prrs (:, :, :, 2) ) -END IF + 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_store_end( tbudgets(NBUDGET_TH), 'NEADV', prths(:, :, :) ) + if (lbudget_rv) call Budget_store_end( tbudgets(NBUDGET_RV), 'NEADV', prrs (:, :, :, 1) ) + if (lbudget_rc) call Budget_store_end( tbudgets(NBUDGET_RC), 'NEADV', prrs (:, :, :, 2) ) + if (lbudget_rr) call Budget_store_end( tbudgets(NBUDGET_RR), 'NEADV', prrs (:, :, :, 3) ) + if (lbudget_ri) call Budget_store_end( tbudgets(NBUDGET_RI), 'NEADV', prrs (:, :, :, 4) ) + if (lbudget_rs) call Budget_store_end( tbudgets(NBUDGET_RS), 'NEADV', prrs (:, :, :, 5) ) + if (lbudget_rg) call Budget_store_end( tbudgets(NBUDGET_RG), 'NEADV', prrs (:, :, :, 6) ) + if (lbudget_rh) call Budget_store_end( tbudgets(NBUDGET_RH), 'NEADV', prrs (:, :, :, 7) ) +end if +if ( lbudget_sv .and. hcloud == 'LIMA' ) then + if ( lwarm ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'NEADV', prsvs(:, :, :, nsv_lima_nc) ) + if ( lwarm .and. lrain ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'NEADV', prsvs(:, :, :, nsv_lima_nr) ) + if ( lcold ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'NEADV', prsvs(:, :, :, nsv_lima_ni) ) + do ji = nsv_lima_ccn_free, nsv_lima_ccn_free + nmod_ccn - 1 + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + ji), 'NEADV', prsvs(:, :, :, ji) ) + end do + do ji = nsv_lima_ifn_free, nsv_lima_ifn_free + nmod_ifn - 1 + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + ji), 'NEADV', prsvs(:, :, :, ji) ) + end do +end if !------------------------------------------------------------------------------- ! diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90 index 596990fd7726b994457ce87aed044a3933d5a6dc..64a497958d0296f788ea7d87e77af64a9a9c0485 100644 --- a/src/MNH/advection_uvw.f90 +++ b/src/MNH/advection_uvw.f90 @@ -176,7 +176,6 @@ REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMZM_RHODJ INTEGER :: ISPLIT ! Number of splitting loops INTEGER :: JSPL ! Loop index REAL :: ZTSTEP ! Sub Time step -INTEGER :: IIU, IJU, IKU ! array sizes ! INTEGER :: IINFO_ll ! return code of parallel routine TYPE(LIST_ll), POINTER :: TZFIELD_ll ! list of fields to exchange @@ -191,14 +190,9 @@ TYPE(LIST_ll), POINTER :: TZFIELDS0_ll ! list of fields to exchange ! IKE = SIZE(PWT,3) - JPVEXT ! -IIU = SIZE(PWT,1) -IJU = SIZE(PWT,2) -IKU = SIZE(PWT,3) -! -! ZMXM_RHODJ = MXM(PRHODJ) ZMYM_RHODJ = MYM(PRHODJ) -ZMZM_RHODJ = MZM(1,IKU,1,PRHODJ) +ZMZM_RHODJ = MZM(PRHODJ) if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U), 'ADV', prus(:, :, :) ) if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V), 'ADV', prvs(:, :, :) ) diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90 index cb828e7443367ed648d0bfbcbb08355d98bd42f9..62787ea599d91b6def85a40a70d94cb1b97a3fd3 100644 --- a/src/MNH/advection_uvw_cen.f90 +++ b/src/MNH/advection_uvw_cen.f90 @@ -169,24 +169,17 @@ REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMZM_RHODJ ! INTEGER :: IINFO_ll ! return code of parallel routine TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -INTEGER :: IKU -INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE ! index values for the physical subdomain ! !------------------------------------------------------------------------------- ! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKU = SIZE(XZHAT) -IKB=1+JPVEXT -IKE=IKU-JPVEXT - if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U), 'ADV', prus(:, :, :) ) if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V), 'ADV', prvs(:, :, :) ) if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W), 'ADV', prws(:, :, :) ) ZMXM_RHODJ = MXM(PRHODJ) ZMYM_RHODJ = MYM(PRHODJ) -ZMZM_RHODJ = MZM(1,IKU,1,PRHODJ) +ZMZM_RHODJ = MZM(PRHODJ) ! !* 1. COMPUTES THE CONTRAVARIANT COMPONENTS ! ------------------------------------- diff --git a/src/MNH/advecuvw.f90 b/src/MNH/advecuvw.f90 index 3ad38e2ec32cb5eebdaa7ec97d52df8ac6d31fdc..91a4fb5eb5a5c2c5278f36de0e8118759df58945 100644 --- a/src/MNH/advecuvw.f90 +++ b/src/MNH/advecuvw.f90 @@ -1,6 +1,6 @@ -!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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! #################### @@ -129,13 +129,8 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS ! Sources of Momentum ! -INTEGER :: IKU -! -! !------------------------------------------------------------------------------- ! -IKU=SIZE(XZHAT) -! !* 1. COMPUTES THE ADVECTIVE TENDANCIES ! --------------------------------- ! @@ -148,8 +143,8 @@ PRUS(:,:,:) = PRUS(:,:,:) & !IF (LBUDGET_U) CALL BUDGET (PRUS,NBUDGET_U,'ADVY_BU_RU') ! PRUS(:,:,:) = PRUS(:,:,:) & - -DZF(1,IKU,1, MXM(PRWCT(:,:,:))*MZM(1,IKU,1,PUT(:,:,:)) ) -!IF (LBUDGET_U) CALL BUDGET (PRUS,NBUDGET_U,'ADVZ_BU_RU') + -DZF( MXM(PRWCT(:,:,:))*MZM(PUT(:,:,:)) ) +!IF (LBUDGET_U) CALL BUDGET (PRUS,1,'ADVZ_BU_RU') ! ! PRVS(:,:,:) = PRVS(:,:,:) & @@ -161,21 +156,21 @@ PRVS(:,:,:) = PRVS(:,:,:) & !IF (LBUDGET_V) CALL BUDGET (PRVS,NBUDGET_V,'ADVY_BU_RV') ! PRVS(:,:,:) = PRVS(:,:,:) & - -DZF(1,IKU,1, MYM(PRWCT(:,:,:))*MZM(1,IKU,1,PVT(:,:,:)) ) -!IF (LBUDGET_V) CALL BUDGET (PRVS,NBUDGET_V,'ADVZ_BU_RV') + -DZF( MYM(PRWCT(:,:,:))*MZM(PVT(:,:,:)) ) +!IF (LBUDGET_V) CALL BUDGET (PRVS,2,'ADVZ_BU_RV') ! ! PRWS(:,:,:) = PRWS(:,:,:) & - -DXF( MZM(1,IKU,1,PRUCT(:,:,:))*MXM(PWT(:,:,:)) ) -!IF (LBUDGET_W) CALL BUDGET (PRWS,NBUDGET_W,'ADVX_BU_RW') + -DXF( MZM(PRUCT(:,:,:))*MXM(PWT(:,:,:)) ) +!IF (LBUDGET_W) CALL BUDGET (PRWS,3,'ADVX_BU_RW') ! PRWS(:,:,:) = PRWS(:,:,:) & - -DYF( MZM(1,IKU,1,PRVCT(:,:,:))*MYM(PWT(:,:,:)) ) -!IF (LBUDGET_W) CALL BUDGET (PRWS,NBUDGET_W,'ADVY_BU_RW') + -DYF( MZM(PRVCT(:,:,:))*MYM(PWT(:,:,:)) ) +!IF (LBUDGET_W) CALL BUDGET (PRWS,3,'ADVY_BU_RW') ! PRWS(:,:,:) = PRWS(:,:,:) & - -DZM(1,IKU,1, MZF(1,IKU,1,PRWCT(:,:,:))*MZF(1,IKU,1,PWT(:,:,:)) ) -!IF (LBUDGET_W) CALL BUDGET (PRWS,NBUDGET_W,'ADVZ_BU_RW') + -DZM( MZF(PRWCT(:,:,:))*MZF(PWT(:,:,:)) ) +!IF (LBUDGET_W) CALL BUDGET (PRWS,3,'ADVZ_BU_RW') ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/advecuvw_2nd.f90 b/src/MNH/advecuvw_2nd.f90 index 9b0999450cbd6da96e0c9b934fb38d51e9a47bde..a8313c2f5e94de2a323694ca77fb9c364b3eab6f 100644 --- a/src/MNH/advecuvw_2nd.f90 +++ b/src/MNH/advecuvw_2nd.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 adiab 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! #################### MODULE MODI_ADVECUVW_2ND ! #################### @@ -117,13 +112,8 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS ! Sources of Momentum ! -INTEGER :: IKU -! -! !------------------------------------------------------------------------------- ! -IKU=SIZE(XZHAT) -! !* 1. COMPUTES THE ADVECTIVE TENDANCIES ! --------------------------------- ! @@ -134,7 +124,7 @@ PRUS(:,:,:) = PRUS(:,:,:) & -DYF( MXM(PRVCT(:,:,:))*MYM(PUT(:,:,:)) ) ! PRUS(:,:,:) = PRUS(:,:,:) & - -DZF(1,IKU,1, MXM(PRWCT(:,:,:))*MZM(1,IKU,1,PUT(:,:,:)) ) + -DZF( MXM(PRWCT(:,:,:))*MZM(PUT(:,:,:)) ) ! ! PRVS(:,:,:) = PRVS(:,:,:) & @@ -144,17 +134,17 @@ PRVS(:,:,:) = PRVS(:,:,:) & -DYM( MYF(PRVCT(:,:,:))*MYF(PVT(:,:,:)) ) ! PRVS(:,:,:) = PRVS(:,:,:) & - -DZF(1,IKU,1, MYM(PRWCT(:,:,:))*MZM(1,IKU,1,PVT(:,:,:)) ) + -DZF( MYM(PRWCT(:,:,:))*MZM(PVT(:,:,:)) ) ! ! PRWS(:,:,:) = PRWS(:,:,:) & - -DXF( MZM(1,IKU,1,PRUCT(:,:,:))*MXM(PWT(:,:,:)) ) + -DXF( MZM(PRUCT(:,:,:))*MXM(PWT(:,:,:)) ) ! PRWS(:,:,:) = PRWS(:,:,:) & - -DYF( MZM(1,IKU,1,PRVCT(:,:,:))*MYM(PWT(:,:,:)) ) + -DYF( MZM(PRVCT(:,:,:))*MYM(PWT(:,:,:)) ) ! PRWS(:,:,:) = PRWS(:,:,:) & - -DZM(1,IKU,1, MZF(1,IKU,1,PRWCT(:,:,:))*MZF(1,IKU,1,PWT(:,:,:)) ) + -DZM( MZF(PRWCT(:,:,:))*MZF(PWT(:,:,:)) ) ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/advecuvw_4th.f90 b/src/MNH/advecuvw_4th.f90 index 468515c425232c47bac036f26b642220c6ff9968..546f079c47ed5250daf1dc2707f9149ce663fa93 100644 --- a/src/MNH/advecuvw_4th.f90 +++ b/src/MNH/advecuvw_4th.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2005-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$ $Revision$ -! MASDEV4_7 adiab 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ########################### MODULE MODI_ADVECUVW_4TH ! ########################### @@ -143,10 +138,6 @@ TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion ! !* 0.2 Declarations of local variables : ! -INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions -INTEGER:: IIE,IJE ! End useful area in x,y,z directions -INTEGER :: IKU -! TYPE(HALO2LIST_ll), POINTER :: TZHALO2LIST ! INTEGER :: IGRID ! localisation on the model grid @@ -154,14 +145,6 @@ REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMEANX, ZMEANY ! fluxes ! !------------------------------------------------------------------------------- ! -!* 1. COMPUTES THE DOMAIN DIMENSIONS -! ------------------------------ -! -CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) -! -IKU=SIZE(XZHAT) -!------------------------------------------------------------------------------- -! !* 2. CALL THE ADVEC_4TH_ORDER_ALGO ROUTINE FOR MOMENTUM ! -------------------------------------------------- ! @@ -181,7 +164,7 @@ PRUS(:,:,:) = PRUS(:,:,:) & -DYF( MXM(PRVCT(:,:,:))*ZMEANY(:,:,:) ) ! PRUS(:,:,:) = PRUS(:,:,:) & - -DZF(1,IKU,1, MXM(PRWCT(:,:,:))*MZM4(PUT(:,:,:)) ) + -DZF( MXM(PRWCT(:,:,:))*MZM4(PUT(:,:,:)) ) ! ! IGRID = 3 @@ -200,7 +183,7 @@ PRVS(:,:,:) = PRVS(:,:,:) & -DYM( MYF(PRVCT(:,:,:))*ZMEANY(:,:,:) ) ! PRVS(:,:,:) = PRVS(:,:,:) & - -DZF(1,IKU,1, MYM(PRWCT(:,:,:))*MZM4(PVT(:,:,:)) ) + -DZF( MYM(PRWCT(:,:,:))*MZM4(PVT(:,:,:)) ) ! ! IGRID = 4 @@ -214,13 +197,13 @@ IGRID = 4 !!$ENDIF ! PRWS(:,:,:) = PRWS(:,:,:) & - -DXF( MZM(1,IKU,1,PRUCT(:,:,:))*ZMEANX(:,:,:) ) + -DXF( MZM(PRUCT(:,:,:))*ZMEANX(:,:,:) ) ! PRWS(:,:,:) = PRWS(:,:,:) & - -DYF( MZM(1,IKU,1,PRVCT(:,:,:))*ZMEANY(:,:,:) ) + -DYF( MZM(PRVCT(:,:,:))*ZMEANY(:,:,:) ) ! PRWS(:,:,:) = PRWS(:,:,:) & - -DZM(1,IKU,1, MZF(1,IKU,1,PRWCT(:,:,:))*MZF4(PWT(:,:,:)) ) + -DZM( MZF(PRWCT(:,:,:))*MZF4(PWT(:,:,:)) ) ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/advecuvw_weno_k.f90 b/src/MNH/advecuvw_weno_k.f90 index 44c2dd4a6fb2f4ebeb03412205f591bd94f562ea..704b470ea32641ce4f8d9b266bcd78965c8175b1 100644 --- a/src/MNH/advecuvw_weno_k.f90 +++ b/src/MNH/advecuvw_weno_k.f90 @@ -1,7 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. +!----------------------------------------------------------------- ! ########################### MODULE MODI_ADVECUVW_WENO_K ! ########################### @@ -98,10 +99,6 @@ INTEGER :: IINFO_ll ! return code of parallel routine ! REAL, DIMENSION(SIZE(PUT,1), SIZE(PUT,2), SIZE(PUT,3)) :: ZMEAN, ZWORK ! -INTEGER :: K_SCHEME -INTEGER :: IKU -INTEGER :: IWORK -! !------------------------- ADVECTION OF MOMENTUM ------------------------------ ! ! @@ -109,7 +106,6 @@ TZHALO2_UT => TPHALO2LIST ! 1rst add3dfield in model_n TZHALO2_VT => TPHALO2LIST%NEXT ! 2nd add3dfield in model_n TZHALO2_WT => TPHALO2LIST%NEXT%NEXT ! 3rst add3dfield in model_n ! -IKU=SIZE(PUT,3) ! ------------------------------------------------------- ! SELECT CASE(KWENO_ORDER) @@ -122,7 +118,7 @@ CASE(1) ! WENO 1 ! PRUS = PRUS - DYF(UP_MY(PUT,MXM(PRVCT))) ! - PRUS = PRUS - DZF(1,IKU,1,UP_MZ(PUT,MXM(PRWCT))) + PRUS = PRUS - DZF(UP_MZ(PUT,MXM(PRWCT))) ! ! V component ! @@ -130,15 +126,15 @@ CASE(1) ! WENO 1 ! PRVS = PRVS - DYM(UP_VY(PVT,MYF(PRVCT))) ! - PRVS = PRVS - DZF(1,IKU,1,UP_MZ(PVT,MYM(PRWCT))) + PRVS = PRVS - DZF(UP_MZ(PVT,MYM(PRWCT))) ! ! W component ! - PRWS = PRWS - DXF(UP_MX(PWT,MZM(1,IKU,1,PRUCT))) + PRWS = PRWS - DXF(UP_MX(PWT,MZM(PRUCT))) ! - PRWS = PRWS - DYF(UP_MY(PWT,MZM(1,IKU,1,PRVCT))) + PRWS = PRWS - DYF(UP_MY(PWT,MZM(PRVCT))) ! - PRWS = PRWS - DZM(1,IKU,1,UP_WZ(PWT,MZF(1,IKU,1,PRWCT))) + PRWS = PRWS - DZM(UP_WZ(PWT,MZF(PRWCT))) ! ! CASE(3) ! WENO 3 @@ -156,7 +152,7 @@ CASE(3) ! WENO 3 PRUS = PRUS - DYF(ZMEAN) END IF ! - PRUS = PRUS - DZF(1,IKU,1,WENO_K_2_MZ(PUT, MXM(PRWCT))) + PRUS = PRUS - DZF(WENO_K_2_MZ(PUT, MXM(PRWCT))) ! ! V component ! @@ -169,22 +165,22 @@ CASE(3) ! WENO 3 CALL ADVEC_WENO_K_2_VY(HLBCY, PVT, ZWORK, ZMEAN, TZHALO2_VT%HALO2) PRVS = PRVS - DYM(ZMEAN) ! - PRVS = PRVS - DZF(1,IKU,1,WENO_K_2_MZ(PVT, MYM(PRWCT))) + PRVS = PRVS - DZF(WENO_K_2_MZ(PVT, MYM(PRWCT))) END IF ! ! W component ! - ZWORK = MZM(1,IKU,1,PRUCT) + ZWORK = MZM(PRUCT) CALL ADVEC_WENO_K_2_MX(HLBCX, PWT, ZWORK, ZMEAN, TZHALO2_WT%HALO2) PRWS = PRWS - DXF(ZMEAN) ! IF (.NOT.L2D) THEN - ZWORK = MZM(1,IKU,1,PRVCT) + ZWORK = MZM(PRVCT) CALL ADVEC_WENO_K_2_MY(HLBCY, PWT, ZWORK, ZMEAN, TZHALO2_WT%HALO2) PRWS = PRWS - DYF(ZMEAN) END IF ! - PRWS = PRWS - DZM(1,IKU,1,WENO_K_2_WZ(PWT,MZF(1,IKU,1,PRWCT))) + PRWS = PRWS - DZM(WENO_K_2_WZ(PWT,MZF(PRWCT))) ! ! CASE(5) ! WENO 5 @@ -205,7 +201,7 @@ CASE(5) ! WENO 5 ! ZMEAN = WENO_K_3_MZ(PUT, MXM(PRWCT)) CALL GET_HALO(ZMEAN)! Update HALO - maybe not necessary (T.Lunet) - PRUS = PRUS - DZF(1,IKU,1,ZMEAN) + PRUS = PRUS - DZF(ZMEAN) ! ! V component, only called in 3D case ! @@ -223,27 +219,27 @@ CASE(5) ! WENO 5 ! ZMEAN = WENO_K_3_MZ(PVT, MYM(PRWCT)) CALL GET_HALO(ZMEAN)! Update HALO - maybe not necessary (T.Lunet) - PRVS = PRVS - DZF(1,IKU,1,ZMEAN) + PRVS = PRVS - DZF(ZMEAN) ! END IF ! ! W component ! - ZWORK = MZM(1,IKU,1,PRUCT) + ZWORK = MZM(PRUCT) CALL ADVEC_WENO_K_3_MX(HLBCX, PWT, ZWORK, ZMEAN) CALL GET_HALO(ZMEAN)! Update HALO PRWS = PRWS - DXF(ZMEAN) ! IF (.NOT.L2D) THEN! 3D Case - ZWORK = MZM(1,IKU,1,PRVCT) + ZWORK = MZM(PRVCT) CALL ADVEC_WENO_K_3_MY(HLBCY, PWT, ZWORK, ZMEAN) CALL GET_HALO(ZMEAN)! Update HALO PRWS = PRWS - DYF(ZMEAN) END IF ! - ZMEAN = WENO_K_3_WZ(PWT,MZF(1,IKU,1,PRWCT)) + ZMEAN = WENO_K_3_WZ(PWT,MZF(PRWCT)) CALL GET_HALO(ZMEAN)! Update HALO - maybe not necessary (T.Lunet) - PRWS = PRWS - DZM(1,IKU,1,ZMEAN) + PRWS = PRWS - DZM(ZMEAN) ! ! END SELECT diff --git a/src/MNH/anel_balancen.f90 b/src/MNH/anel_balancen.f90 index 21c83f052591ee0cf8e0540429d0a661075c3a58..743c5b5c7f57048cb103e29372c2e9748c70dd21 100644 --- a/src/MNH/anel_balancen.f90 +++ b/src/MNH/anel_balancen.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. @@ -233,7 +233,7 @@ CALL MPPDB_CHECK3D(XWT,"anel_balancen3.1-after update halo::XWT",PRECISION) ! ZRU(:,:,:) = MXM(XRHODJ) * XUT(:,:,:) ZRV(:,:,:) = MYM(XRHODJ) * XVT(:,:,:) -ZRW(:,:,:) = MZM(1,IKU,1,XRHODJ) * XWT(:,:,:) +ZRW(:,:,:) = MZM(XRHODJ) * XWT(:,:,:) ZTH(:,:,:) = XTHT(:,:,:) ALLOCATE(ZRR(SIZE(XRHODJ,1),SIZE(XRHODJ,2),SIZE(XRHODJ,3),SIZE(XRT,4))) ZRR(:,:,:,:) = XRT(:,:,:,:) @@ -288,7 +288,7 @@ DEALLOCATE(ZBFY,ZTRIGSX,ZTRIGSY,ZRR,ZBF_SXP2_YP1_Z) !20131112 appli update_halo_ll and associated operations XUT(:,:,:) = ZRU(:,:,:) / MXM(XRHODJ) XVT(:,:,:) = ZRV(:,:,:) / MYM(XRHODJ) -XWT(:,:,:) = ZRW(:,:,:) / MZM(1,IKU,1,XRHODJ) +XWT(:,:,:) = ZRW(:,:,:) / MZM(XRHODJ) !20131112 appli update_halo_ll to XUT,XVT,XWT CALL ADD3DFIELD_ll( TZFIELDS_ll, XUT, 'ANEL_BALANCE_n::XUT' ) CALL ADD3DFIELD_ll( TZFIELDS_ll, XVT, 'ANEL_BALANCE_n::XVT' ) diff --git a/src/MNH/anti_diff.f90 b/src/MNH/anti_diff.f90 index d2dd37c190ac49f5609a93e584eaacb99e87d2ce..56372bfeccbfd1529118443c2bcef1ecc3f89675 100644 --- a/src/MNH/anti_diff.f90 +++ b/src/MNH/anti_diff.f90 @@ -1,13 +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$ $Revision$ -! MASDEV4_7 adiab 2006/12/12 15:06:20 -!----------------------------------------------------------------- ! ########################## MODULE MODI_ANTI_DIFF ! ########################## @@ -156,44 +151,44 @@ IKE=IKU-JPVEXT (MXM(PAS(:,:,:))+ZEPSILON) ZB(:,:,:)=PRAVCT(:,:,:)*DYM(PAS(:,:,:)/PRHODJ(:,:,:))/ & (MYM(PAS(:,:,:))+ZEPSILON) - ZC(:,:,:)=PRAWCT(:,:,:)*DZM(1,IKU,1,PAS(:,:,:)/PRHODJ(:,:,:))/ & - (MZM(1,IKU,1,PAS(:,:,:))+ZEPSILON) + ZC(:,:,:)=PRAWCT(:,:,:)*DZM(PAS(:,:,:)/PRHODJ(:,:,:))/ & + (MZM(PAS(:,:,:))+ZEPSILON) ! ! 1.2 Calculation antidiffusion velocities ! ------------------------------------ ! ! u-component antidiffusive velocity ! - PRAUCT(:,:,:)=PTSTEP/2.* ( & + PRAUCT(:,:,:)=PTSTEP/2.* ( & ZA*( & MXM(PRHODJ)*SIGN(1.,PRAUCT) & /ZDBLTST- & PRAUCT & )- & - PRAUCT*MXM(MYF(ZB)+MZF(1,IKU,1,ZC)) & + PRAUCT*MXM(MYF(ZB)+MZF(ZC)) & ) ! ! v-component antidiffusive velocity ! - PRAVCT(:,:,:)=PTSTEP/2.* ( & + PRAVCT(:,:,:)=PTSTEP/2.* ( & ZB*( & MYM(PRHODJ)*SIGN(1.,PRAVCT) & /ZDBLTST- & PRAVCT & )- & - PRAVCT*MYM(MXF(ZA)+MZF(1,IKU,1,ZC)) & + PRAVCT*MYM(MXF(ZA)+MZF(ZC)) & ) ! ! ! w-component antidiffusive velocity ! - PRAWCT(:,:,:)=PTSTEP/2.* ( & + PRAWCT(:,:,:)=PTSTEP/2.* ( & ZC*( & - MZM(1,IKU,1,PRHODJ)*SIGN(1.,PRAWCT) & + MZM(PRHODJ)*SIGN(1.,PRAWCT) & /ZDBLTST- & PRAWCT & )- & - PRAWCT*MZM(1,IKU,1,MXF(ZA)+MYF(ZB)) & + PRAWCT*MZM(MXF(ZA)+MYF(ZB)) & ) ! ! 1.3 Limit of the antidiffusive velocities to satisfy CFL<1 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/compute_exner_from_ground.f90 b/src/MNH/compute_exner_from_ground.f90 index cbb64d0376d42b3af52447f12503b78531513f23..60225dbf11bd04c14b13258431b8ffbfcc084e8d 100644 --- a/src/MNH/compute_exner_from_ground.f90 +++ b/src/MNH/compute_exner_from_ground.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. @@ -150,7 +150,7 @@ ZGSCPD = XG/XCPD !* 2. COMPUTATION OF THE EXNER FUNCTION AT FLUX POINTS ! ------------------------------------------------ ! -ZZM=MZF(1,IKU,1,PZFLUX) +ZZM=MZF(PZFLUX) PEXNFLUX(:,:,IKB)=PEXNSURF2D(:,:) IF (LCARTESIAN .OR. LTHINSHELL) THEN ZD1=0. diff --git a/src/MNH/compute_exner_from_top.f90 b/src/MNH/compute_exner_from_top.f90 index e195e725de1cf4e020487bbf3f2de6e052415b76..4048672a15b4470c3aa6d6987e61d26f8d219b36 100644 --- a/src/MNH/compute_exner_from_top.f90 +++ b/src/MNH/compute_exner_from_top.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. @@ -149,7 +149,7 @@ ZGSCPD = XG/XCPD !* 2. COMPUTATION OF THE EXNER FUNCTION AT FLUX POINTS ! ------------------------------------------------ ! -ZZM=MZF(1,IKU,1,PZFLUX) +ZZM=MZF(PZFLUX) PEXNFLUX(:,:,IKE+1)=PEXNTOP2D(:,:) IF (LCARTESIAN .OR. LTHINSHELL) THEN ZD1=0. diff --git a/src/MNH/compute_r00.f90 b/src/MNH/compute_r00.f90 index 855c8370861141e3424b9c672d3d0e4122d1a3b9..5b7c686508c5c690de357cfabbbd28710b36f0b6 100644 --- a/src/MNH/compute_r00.f90 +++ b/src/MNH/compute_r00.f90 @@ -113,7 +113,6 @@ LOGICAL :: GSTART INTEGER :: INBR_START REAL :: ZXMAX,ZYMAX,ZZMAX ! domain extrema INTEGER, DIMENSION(100) :: NBRFILES -INTEGER :: IKU TYPE(TFIELDDATA) :: TZFIELD TYPE(TFILEDATA),POINTER :: TZTRACFILE ! @@ -124,7 +123,6 @@ TYPE(TFILEDATA),POINTER :: TZTRACFILE ! TZTRACFILE => NULL() ZSPVAL=-1.E+11 -IKU=SIZE(XZHAT) ! !------------------------------------------------------------------------------- ! @@ -193,7 +191,7 @@ ZXOR=0.5 * (XXHAT(2)+XXHAT(3)) ZYOR=0.5 * (XYHAT(2)+XYHAT(3)) ZDX= XXHAT(3)-XXHAT(2) ZDY= XYHAT(3)-XYHAT(2) -ZZL=MZF(1,IKU,1,XZZ) +ZZL=MZF(XZZ) ZZL(:,:,NKU)=2*XZZ(:,:,NKU)-ZZL(:,:,NKU-1) ZXMAX=ZXOR+(NIU-3)*ZDX ZYMAX=ZYOR+(NJU-3)*ZDY diff --git a/src/MNH/contrav.f90 b/src/MNH/contrav.f90 index 8154936aa184ad41e9cbf27287af028c42cf315f..a5b30eff1e82af71bb0b62302f1a30666ad63bea 100644 --- a/src/MNH/contrav.f90 +++ b/src/MNH/contrav.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. @@ -70,9 +70,6 @@ END MODULE MODI_CONTRAV !! !! EXTERNAL !! -------- -!! MXF, MYF, MZM : Shuman functions (mean operators) -!! -!! Module MODI_SHUMAN : Interface for Shuman functions !! !! !! IMPLICIT ARGUMENTS @@ -112,7 +109,6 @@ USE MODD_GRID_n, ONLY: XZZ USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll USE MODE_ll ! -USE MODI_SHUMAN USE MODI_GET_HALO ! USE MODE_MPPDB diff --git a/src/MNH/convection.f90 b/src/MNH/convection.f90 index 2738ac854fe50aabff8b02554b43b0c6f41b6c79..f80a0c0890a70519dac4d25e2daf92f70a644258 100644 --- a/src/MNH/convection.f90 +++ b/src/MNH/convection.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. @@ -396,9 +396,9 @@ END IF !* 1. Center all fields on thermo levels ! ---------------------------------- ! -ZWORK(:,:,:) = MZF(1,IKU,1, PZZ(:,:,:) ) +ZWORK(:,:,:) = MZF( PZZ(:,:,:) ) ZZZ(:,:,:) = ZWORK(:,:,:) -ZWORK(:,:,:) = MZF(1,IKU,1, PWT(:,:,:) ) +ZWORK(:,:,:) = MZF( PWT(:,:,:) ) ZWT(:,:,:) = ZWORK(:,:,:) ZWORK(:,:,:) = MXF( PUT(:,:,:) ) ZUT(:,:,:) = ZWORK(:,:,:) 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/dflux_corr.f90 b/src/MNH/dflux_corr.f90 index 20b2b79cbce459f9f3a16947abb5d81c2246d97f..fec030ec7aa25c9434f803dea97a2853cf983a1d 100644 --- a/src/MNH/dflux_corr.f90 +++ b/src/MNH/dflux_corr.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. @@ -204,7 +204,7 @@ PFY(:,:,:) = (0.5+SIGN(0.5,PRVCT(:,:,:)))*MIN( PFY(:,:,:),ZFOUT(:,:,:) ) & ZFOUT(:,:,2:IKU) = -ZBETAOUT(:,:,1:IKU-1) ! Second limiter ZFOUT(:,:,1) = 0.0 ! -PFZ(:,:,:) = PRWCT(:,:,:) * MZM (1,IKU,1,PAT(:,:,:)) +PFZ(:,:,:) = PRWCT(:,:,:) * MZM (PAT(:,:,:)) PFZ(:,:,:) = (0.5+SIGN(0.5,PRWCT(:,:,:)))*MIN( PFZ(:,:,:),ZFOUT(:,:,:) ) & +(0.5-SIGN(0.5,PRWCT(:,:,:)))*MAX( PFZ(:,:,:),ZBETAOUT(:,:,:) ) ! diff --git a/src/MNH/diagnos_les_mf.f90 b/src/MNH/diagnos_les_mf.f90 index 31fa13da74a1fc2c0444f1495a15a465801a4214..f537b04f36ac1617a2b8590e1deee9cdd8d0ed52 100644 --- a/src/MNH/diagnos_les_mf.f90 +++ b/src/MNH/diagnos_les_mf.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2009-2019 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 for details. version 1. @@ -151,83 +151,83 @@ CALL SECOND_MNH2(ZTIME1) ZWORK(:,:,:)=RESHAPE(PWTHMF(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT(MZF(1,KKU,1,ZWORK) ,ZTHLMFFLX_LES ) + CALL LES_VER_INT(MZF(ZWORK) ,ZTHLMFFLX_LES ) CALL LES_MEAN_ll(ZTHLMFFLX_LES,LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_WTHLMF(:,NLES_CURRENT_TCOUNT,1)) ZWORK(:,:,:)=RESHAPE(PWRTMF(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZRTMFFLX_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZRTMFFLX_LES ) CALL LES_MEAN_ll (ZRTMFFLX_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_WRTMF(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PWUMF(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZUMFFLX_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZUMFFLX_LES ) CALL LES_MEAN_ll (ZUMFFLX_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_WUMF(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PWVMF(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZVMFFLX_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZVMFFLX_LES ) CALL LES_MEAN_ll (ZVMFFLX_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_WVMF(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PWTHVMF(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZTHVMFFLX_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZTHVMFFLX_LES ) CALL LES_MEAN_ll (ZTHVMFFLX_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PTHL_UP(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZTHLUP_MF_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZTHLUP_MF_LES ) CALL LES_MEAN_ll (ZTHLUP_MF_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_THLUP_MF(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PRT_UP(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZRTUP_MF_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZRTUP_MF_LES ) CALL LES_MEAN_ll (ZRTUP_MF_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_RTUP_MF(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PRV_UP(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZRVUP_MF_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZRVUP_MF_LES ) CALL LES_MEAN_ll (ZRVUP_MF_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_RVUP_MF(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PRC_UP(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZRCUP_MF_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZRCUP_MF_LES ) CALL LES_MEAN_ll (ZRCUP_MF_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_RCUP_MF(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PRI_UP(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZRIUP_MF_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZRIUP_MF_LES ) CALL LES_MEAN_ll (ZRIUP_MF_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_RIUP_MF(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PEMF(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZEMF_MF_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZEMF_MF_LES ) CALL LES_MEAN_ll (ZEMF_MF_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_MASSFLUX(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PDETR(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZDETR_MF_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZDETR_MF_LES ) CALL LES_MEAN_ll (ZDETR_MF_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_DETR(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PENTR(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZENTR_MF_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZENTR_MF_LES ) CALL LES_MEAN_ll (ZENTR_MF_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_ENTR(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PW_UP(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZWUP_MF_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZWUP_MF_LES ) CALL LES_MEAN_ll (ZWUP_MF_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_WUP_MF(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PFRAC_UP(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZFRACUP_MF_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZFRACUP_MF_LES ) CALL LES_MEAN_ll (ZFRACUP_MF_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_FRACUP(:,NLES_CURRENT_TCOUNT,1) ) ZWORK(:,:,:)=RESHAPE(PTHV_UP(:,:),(/ KIU,KJU,KKU /) ) - CALL LES_VER_INT( MZF(1,KKU,1,ZWORK) ,ZTHVUP_MF_LES ) + CALL LES_VER_INT( MZF(ZWORK) ,ZTHVUP_MF_LES ) CALL LES_MEAN_ll (ZTHVUP_MF_LES , LLES_CURRENT_CART_MASK, & X_LES_SUBGRID_THVUP_MF(:,NLES_CURRENT_TCOUNT,1) ) 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 4c7a185cfe8fd37c73b44376f32b39c3f0023557..30c901a69dd0f4b54f77617cdee7a60ae0fa5db8 100644 --- a/src/MNH/drag_veg.f90 +++ b/src/MNH/drag_veg.f90 @@ -27,16 +27,12 @@ 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 ! -! - END SUBROUTINE DRAG_VEG END INTERFACE @@ -73,7 +69,9 @@ SUBROUTINE DRAG_VEG(PTSTEP,PUT,PVT,PTKET,ODEPOTREE, PVDEPOTREE, & !! 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 ! P. Wautelet 28/01/2020: use the new data structures and subroutines for budgets for U +! C. Lac 02/2020: correction missing condition for budget on RC and SV !!--------------------------------------------------------------- ! ! @@ -115,15 +113,12 @@ 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 ! -! !* 0.2 Declarations of local variables : ! INTEGER :: IIU,IJU,IKU,IKV ! array size along the k direction @@ -133,12 +128,12 @@ 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, & + 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)) :: & - ZVH,ZLAI ! LAI, Vegetation height + 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 @@ -146,10 +141,6 @@ 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) - if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U ), 'DRAG', prus (:, :, :) ) if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V ), 'DRAG', prvs (:, :, :) ) if ( lbudget_tke ) call Budget_store_init( tbudgets(NBUDGET_TKE), 'DRAG', prtkes(:, :, :) ) @@ -160,18 +151,33 @@ if ( odepotree ) then call Budget_store_init( tbudgets(NBUDGET_SV1-1+(NSV_C2R2BEG+1)), 'DEPOTR', psvs(:, :, :, NSV_C2R2BEG+1) ) end if -ZVH(:,:)=0. -ZLAI(:,:)=0. -ZCDRAG(:,:,:)=0. -ZDENSITY(:,:,:)=0. +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) ! -ZVH(:,:)=ZH_TREE_PGD(:,:) -ZLAI(:,:)=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) @@ -182,9 +188,9 @@ DEALLOCATE(ZLAI_PGD) !* 1. COMPUTES THE TRUE VELOCITY COMPONENTS ! ------------------------------------- ! -ZUT(:,:,:) = PUT(:,:,:) -ZVT(:,:,:) = PVT(:,:,:) -ZTKET(:,:,:) = PTKET(:,:,:) +ZUT_SCAL(:,:,:) = MXF(PUT(:,:,:)) +ZVT_SCAL(:,:,:) = MYF(PVT(:,:,:)) +ZTKET(:,:,:) = PTKET(:,:,:) !------------------------------------------------------------------------------- ! !* 1. Computations of wind tendency due to canopy drag @@ -199,35 +205,46 @@ ZTKET(:,:,:) = PTKET(:,:,:) ! ------------------------------ ! 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.) - - - END DO - END IF - END DO -END DO + 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. ! @@ -236,15 +253,15 @@ GDEP(:,:,2) = .FALSE. ! !* drag force by vertical surfaces ! -ZUS(:,:,:)= ZUT(:,:,:)/(1 + ZCDRAG(:,:,:)* ZDENSITY(:,:,:)*PTSTEP & - *SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2)) +ZUS(:,:,:) = PUT(:,:,:)/( 1.0 + MXM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) ! -ZVS(:,:,:)= ZVT(:,:,:)/(1 + ZCDRAG(:,:,:)* ZDENSITY(:,:,:)*PTSTEP & - *SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2)) +ZVS(:,:,:) = PVT(:,:,:)/( 1.0 + MYM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) ! -PRUS(:,:,:)=PRUS(:,:,:)+((ZUS(:,:,:)-ZUT(:,:,:))*PRHODJ(:,:,:))/PTSTEP +PRUS(:,:,:) = PRUS(:,:,:) + (ZUS(:,:,:)-PUT(:,:,:)) * MXM(PRHODJ(:,:,:)) / PTSTEP ! -PRVS(:,:,:)=PRVS(:,:,:)+((ZVS(:,:,:)-ZVT(:,:,:))*PRHODJ(:,:,:))/PTSTEP +PRVS(:,:,:) = PRVS(:,:,:) + (ZVS(:,:,:)-PVT(:,:,:)) * MYM(PRHODJ(:,:,:)) / PTSTEP ! IF (ODEPOTREE) THEN ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) @@ -294,14 +311,11 @@ END IF ! 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)) +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) +PRTKES(:,:,:) = PRTKES(:,:,:) + (ZTKES(:,:,:)-ZTKET(:,:,:))*PRHODJ(:,:,:)/PTSTEP if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U ), 'DRAG', prus (:, :, :) ) if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V ), 'DRAG', prvs (:, :, :) ) diff --git a/src/MNH/dyn_sources.f90 b/src/MNH/dyn_sources.f90 index ad9f3773d84569ef947e06cf4b5ab0431430f5c6..efc0e518999897364ba4ef04a6a3461289d00189 100644 --- a/src/MNH/dyn_sources.f90 +++ b/src/MNH/dyn_sources.f90 @@ -242,28 +242,28 @@ IF ((.NOT.L1D).AND.(.NOT.LCARTESIAN) ) THEN ELSE ! NO THINSHELL approximation if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W), 'CURV', prws(:, :, :) ) - ZWORK3(:,:,:) = 1.0 / ( XRADIUS + MZF(1,IKU,1,PZZ(:,:,:)) ) + ZWORK3(:,:,:) = 1.0 / ( XRADIUS + MZF(PZZ(:,:,:)) ) ZWORK1(:,:,:) = SPREAD( PCURVX(:,:),DIM=3,NCOPIES=IKU ) ZWORK2(:,:,:) = SPREAD( PCURVY(:,:),DIM=3,NCOPIES=IKU ) CALL MPPDB_CHECK3DM("DYN_SOOURCES:ZWORK3,ZWORK1,ZWORK2",PRECISION,& & ZWORK3,ZWORK1,ZWORK2,& & MXM( MYF(ZRVT*PVT) * ZWORK2 * ZWORK3 ) , & - & MXM( ( MYF(PVT) * ZWORK1 - MZF(1,IKU,1,PWT) ) * ZWORK3 ) ,& - & MYF(PVT) * ZWORK1 - MZF(1,IKU,1,PWT) , & - & MYF(PVT) , MZF(1,IKU,1,PWT) , MXM(PWT) , MYM(PWT) ) + & MXM( ( MYF(PVT) * ZWORK1 - MZF(PWT) ) * ZWORK3 ) ,& + & MYF(PVT) * ZWORK1 - MZF(PWT) , & + & MYF(PVT) , MZF(PWT) , MXM(PWT) , MYM(PWT) ) CALL MPPDB_CHECK3DM("DYN_SOOURCES:SUITE",PRECISION,& & MXM(ZRVT),MXM(PVT),MXM(PWT),MXM(ZWORK1),MXM(ZWORK2),MXM(ZWORK3) ) ! PRUS(:,:,:) = PRUS & + MXM( MYF(ZRVT*PVT) * ZWORK2 * ZWORK3 ) & - + ZRUT * MXM( ( MYF(PVT) * ZWORK1 - MZF(1,IKU,1,PWT) ) * ZWORK3 ) + + ZRUT * MXM( ( MYF(PVT) * ZWORK1 - MZF(PWT) ) * ZWORK3 ) ! PRVS(:,:,:) = PRVS & - MYM( MXF(ZRUT*PUT) * ZWORK1 * ZWORK3 ) & - - ZRVT * MYM( (MXF(PUT) * ZWORK2 + MZF(1,IKU,1,PWT) ) * ZWORK3 ) + - ZRVT * MYM( (MXF(PUT) * ZWORK2 + MZF(PWT) ) * ZWORK3 ) ! PRWS(:,:,:) = PRWS & - +MZM(1,IKU,1, ( MXF(ZRUT*PUT) + MYF(ZRVT*PVT) ) * ZWORK3 ) + +MZM( ( MXF(ZRUT*PUT) + MYF(ZRVT*PVT) ) * ZWORK3 ) if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'CURV', prws(:, :, :) ) END IF @@ -293,11 +293,11 @@ IF (LCORIO) THEN ZWORK1(:,:,:) = SPREAD( PCORIOX(:,:),DIM=3,NCOPIES=IKU) * PRHODJ(:,:,:) ZWORK2(:,:,:) = SPREAD( PCORIOY(:,:),DIM=3,NCOPIES=IKU) * PRHODJ(:,:,:) ! - PRUS(:,:,:) = PRUS - MXM( ZWORK2 * MZF(1,IKU,1,PWT) ) + PRUS(:,:,:) = PRUS - MXM( ZWORK2 * MZF(PWT) ) ! - PRVS(:,:,:) = PRVS - MYM( ZWORK1 * MZF(1,IKU,1,PWT) ) + PRVS(:,:,:) = PRVS - MYM( ZWORK1 * MZF(PWT) ) ! - PRWS(:,:,:) = PRWS + MZM( 1,IKU,1,ZWORK2 * MXF(PUT) + ZWORK1 * MYF(PVT) ) + PRWS(:,:,:) = PRWS + MZM( ZWORK2 * MXF(PUT) + ZWORK1 * MYF(PVT) ) if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'COR', prws(:, :, :) ) END IF @@ -341,8 +341,8 @@ IF( .NOT.L1D ) THEN ! PRTHS(:,:,:) = PRTHS(:,:,:) + PRHODJ(:,:,:) & * ( ( XRD + XRV * PRT(:,:,:,1) ) * ZCPD_OV_RD / ZWORK1(:,:,:) - 1. ) & - * PTHT(:,:,:)/PEXNREF(:,:,:)*MZF(1,IKU,1,PWT(:,:,:))*(ZG_OV_CPD/PTHVREF(:,:,:) & - -ZD1*4./7.*PEXNREF(:,:,:)/( XRADIUS+MZF(1,IKU,1,PZZ(:,:,:)) )) + * PTHT(:,:,:)/PEXNREF(:,:,:)*MZF(PWT(:,:,:))*(ZG_OV_CPD/PTHVREF(:,:,:) & + -ZD1*4./7.*PEXNREF(:,:,:)/( XRADIUS+MZF(PZZ(:,:,:)) )) if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'PREF', prths(:, :, :) ) END IF diff --git a/src/MNH/eddyUV_flux_one_wayn.f90 b/src/MNH/eddyUV_flux_one_wayn.f90 index e6cae0cb995d7ee6cd62aa4fb0fc074ddc764496..93c8fe46c51316c64ea58845e09213866a46fb96 100644 --- a/src/MNH/eddyUV_flux_one_wayn.f90 +++ b/src/MNH/eddyUV_flux_one_wayn.f90 @@ -96,7 +96,6 @@ INTEGER:: IDTRATIO_KMI_1 ! Ratio between the time step of the son and the model REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX2 ! Work array=Dad interpolated flux field ! on the son grid REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIV_UV! Work array=DIV of ZFLUX2 -INTEGER :: IKU ! INTEGER :: IDIMX,IDIMY INTEGER :: IID, IRESP @@ -105,7 +104,6 @@ INTEGER :: IID, IRESP ! ! test of temporal synchronisation between the model 1 and the son KMI ! -IKU=SIZE(XZHAT) IDTRATIO_KMI_1=1 DO JMI=2,KMI IDTRATIO_KMI_1=IDTRATIO_KMI_1*NDTRATIO(JMI) @@ -138,7 +136,7 @@ IF (ISYNCHRO==1 .OR. IDTRATIO_KMI_1 == 1) THEN ZFLUX2(IIE,:,:) = ZFLUX2(IIE-1,:,:) ZFLUX2(IIE+1,:,:) = ZFLUX2(IIE,:,:) - ZDIV_UV(:,:,:) = GX_U_M(1,IKU,1,ZFLUX2,XDXX,XDZZ,XDZX) + ZDIV_UV(:,:,:) = GX_U_M(ZFLUX2,XDXX,XDZZ,XDZX) ! Lateral boundary conditions ZDIV_UV(IIB,:,:) =0.0 diff --git a/src/MNH/eddyUV_fluxn.f90 b/src/MNH/eddyUV_fluxn.f90 index 924e2dd2b67a7daa0c0d58ea21e97a2dc0c378b3..f4879b6031859028fd3dba4e8e23c4a87a52b070 100644 --- a/src/MNH/eddyUV_fluxn.f90 +++ b/src/MNH/eddyUV_fluxn.f90 @@ -209,7 +209,7 @@ ZCORIOZ(:,:,:)= SPREAD(XCORIOZ(:,:),3,IKU) ZLAT3D(:,:,:) = SPREAD(XLAT(:,:),3,IKU) ! ! relative vorticity -ZVOZ(:,:,:)=GX_V_UV(1,IKU,1,PVM,XDXX,XDZZ,XDZX) +ZVOZ(:,:,:)=GX_V_UV(PVM,XDXX,XDZZ,XDZX) ZVOZ(:,:,2)=ZVOZ(:,:,3) ZVOZ(:,:,1)=ZVOZ(:,:,3) ! @@ -422,7 +422,7 @@ PVU_FLUX_M(:,:,:) = ZUV_FLUX(:,:,:) ! ----------------------------- ! ! Take the divergence of the momentum flux -ZDIV_UV(:,:,:) = GX_U_M(1,IKU,1,ZUV_FLUX,XDXX,XDZZ,XDZX) +ZDIV_UV(:,:,:) = GX_U_M(ZUV_FLUX,XDXX,XDZZ,XDZX) ! Lateral boundary conditions ZDIV_UV(IIB,:,:)=0.0 diff --git a/src/MNH/eddy_flux_one_wayn.f90 b/src/MNH/eddy_flux_one_wayn.f90 index 14b7d035b08df04c37c8f162499a8c1e4ac67962..40773ec8d8d091754aa4856860b87bd7be004815 100644 --- a/src/MNH/eddy_flux_one_wayn.f90 +++ b/src/MNH/eddy_flux_one_wayn.f90 @@ -92,7 +92,6 @@ INTEGER:: IDTRATIO_KMI_1 ! Ratio between the time step of the son and the model REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX2 ! Work array=Dad interpolated flux field ! on the son grid -INTEGER :: IKU ! INTEGER :: IDIMX,IDIMY INTEGER :: IID, IRESP @@ -101,7 +100,6 @@ INTEGER :: IID, IRESP ! ! test of temporal synchronisation between the model 1 and the son KMI ! -IKU=SIZE(XZHAT) IDTRATIO_KMI_1=1 DO JMI=2,KMI IDTRATIO_KMI_1=IDTRATIO_KMI_1*NDTRATIO(JMI) @@ -126,7 +124,7 @@ IF (ISYNCHRO==1 .OR. IDTRATIO_KMI_1 == 1) THEN HLBCX,HLBCY,TFIELDLIST(IID)%TFIELD_X3D(1)%DATA,ZFLUX2) ! operator GX_U_M used for gradient of v'T' (flux point) placed at a mass point - XRTHS_EDDY_FLUX(:,:,:) = - XRHODJ(:,:,:)* GX_U_M(1,IKU,1,ZFLUX2,XDXX,XDZZ,XDZX) + XRTHS_EDDY_FLUX(:,:,:) = - XRHODJ(:,:,:)* GX_U_M(ZFLUX2,XDXX,XDZZ,XDZX) ! w'T' (EDDY_FLUX_MODEL(1)%XWTH_FLUX_M) of model1 interpolation on the son grid put into ZFLUX2 ZFLUX2 = 0. @@ -139,7 +137,7 @@ IF (ISYNCHRO==1 .OR. IDTRATIO_KMI_1 == 1) THEN ! DIV(W'T') put into the source term XRTHS_EDDY_FLUX(:,:,:) = XRTHS_EDDY_FLUX(:,:,:) & - - XRHODJ(:,:,:)* GZ_W_M(1,IKU,1,ZFLUX2,XDZZ) + - XRHODJ(:,:,:)* GZ_W_M(ZFLUX2,XDZZ) DEALLOCATE(ZFLUX2) diff --git a/src/MNH/eddy_fluxn.f90 b/src/MNH/eddy_fluxn.f90 index aa3148e7c226c5c0633dd8bf52e56aa4bca45ee3..ed52def268d0ea872591a158078514d3fef3316e 100644 --- a/src/MNH/eddy_fluxn.f90 +++ b/src/MNH/eddy_fluxn.f90 @@ -230,7 +230,7 @@ ZBETA(:,:,:) = GX_M_U(1,IKU,1,ZCORIOZ(:,:,:),XDXX,XDZZ,XDZX) ZCORIOZ(:,:,:)= MXM(ZCORIOZ(:,:,:)) ! Dry Brunt Vaisal frequency -ZWORK32(:,:,:)=DZM(1,IKU,1,PTHM(:,:,:))/ MZM(1,IKU,1,PTHM(:,:,:)) +ZWORK32(:,:,:)=DZM(PTHM(:,:,:))/ MZM(PTHM(:,:,:)) DO JK=1,(IKE+1) DO JJ=1,(IJE+1) DO JI=1,(IIE+1) @@ -245,7 +245,7 @@ ENDDO ZND(:,:,:) = MXM(ZND(:,:,:)) !! latitudinal gradient of TH ZDTHM_DY(:,:,:) = GX_M_U(1,IKU,1,PTHM,XDXX,XDZZ,XDZX) -ZDTHM_DZ(:,:,:) = MXM(GZ_M_M(1,IKU,1,PTHM,XDZZ)) +ZDTHM_DZ(:,:,:) = MXM(GZ_M_M(PTHM,XDZZ)) ! density scale height ZH(:,:,:) = PTHM(:,:,:) * XRD * (XG**(-1)) ZH(:,:,:) = MXM(ZH) @@ -430,9 +430,9 @@ ENDIF ! -------------------- ! operator GX_U_M used for gradient of v'T' (flux point) placed at a mass point ! -ZDIV_YTHFLUX(:,:,:) = GX_U_M(1,IKU,1,ZVTH_FLUX,XDXX,XDZZ,XDZX) +ZDIV_YTHFLUX(:,:,:) = GX_U_M(ZVTH_FLUX,XDXX,XDZZ,XDZX) ! -ZDIV_ZTHFLUX(:,:,:) = GZ_W_M(1,IKU,1,ZWTH_FLUX,XDZZ) +ZDIV_ZTHFLUX(:,:,:) = GZ_W_M(ZWTH_FLUX,XDZZ) ! ! Control test for the sign of the flux diff --git a/src/MNH/elec_fieldn.f90 b/src/MNH/elec_fieldn.f90 index ee38a7d922012e96176c2fc8e7394fa9d2915386..e6da7d7693844e48104d165456247a87aa077cf4 100644 --- a/src/MNH/elec_fieldn.f90 +++ b/src/MNH/elec_fieldn.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. @@ -99,7 +99,7 @@ INTEGER :: IRESP ! Return code of FM routines INTEGER :: ILENG ! Length of the data field in LFIFM file INTEGER :: IGRID ! C-grid indicator in LFIFM file INTEGER :: ILENCH ! Length of comment string in LFIFM file -INTEGER :: IIU,IJU,IKU ! array sizes in I,J,K +INTEGER :: IIU,IJU ! array sizes in I,J,K INTEGER :: JI,JJ,JK !loop index on the vertical levels INTEGER :: IINFO_ll ! @@ -117,8 +117,7 @@ CALL GET_PHYSICAL_ll(IIB,IJB,IIE,IJE) CALL GET_DIM_EXT_ll('B',IIU,IJU) ! IKB = 1 + JPVEXT -IKU = SIZE(PEFIELDU,3) -IKE = IKU - JPVEXT +IKE = SIZE(PEFIELDU,3) - JPVEXT ! ALLOCATE(ZDV_SOURCE(SIZE(PQ_SOURCE,1),SIZE(PQ_SOURCE,2),SIZE(PQ_SOURCE,3))) ALLOCATE(ZPHIT(SIZE(PQ_SOURCE,1),SIZE(PQ_SOURCE,2),SIZE(PQ_SOURCE,3))) @@ -226,9 +225,9 @@ CALL ADD3DFIELD_ll( TZFIELDS_ll, ZPHIT, 'ELEC_FIELD_n::ZPHIT' ) CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) CALL CLEANLIST_ll(TZFIELDS_ll) ! -PEFIELDU(:,:,:) = PRHODJ(:,:,:) * GX_M_M(1,IKU,1,ZPHIT,XDXX,XDZZ,XDZX) -PEFIELDV(:,:,:) = PRHODJ(:,:,:) * GY_M_M(1,IKU,1,ZPHIT,XDYY,XDZZ,XDZY) -PEFIELDW(:,:,:) = PRHODJ(:,:,:) * GZ_M_M(1,IKU,1,ZPHIT,XDZZ) +PEFIELDU(:,:,:) = PRHODJ(:,:,:) * GX_M_M(ZPHIT,XDXX,XDZZ,XDZX) +PEFIELDV(:,:,:) = PRHODJ(:,:,:) * GY_M_M(ZPHIT,XDYY,XDZZ,XDZY) +PEFIELDW(:,:,:) = PRHODJ(:,:,:) * GZ_M_M(ZPHIT,XDZZ) ! IF (PRESENT(PPHIT)) PPHIT(:,:,:) = - PRHODJ(:,:,:) * ZPHIT(:,:,:) ! diff --git a/src/MNH/endstep.f90 b/src/MNH/endstep.f90 index 665de2a84e479f2e36bd304fe3699e0d5edc7c36..a272d44733c0c9d0ed35dd117e91f9183be0f2f2 100644 --- a/src/MNH/endstep.f90 +++ b/src/MNH/endstep.f90 @@ -281,7 +281,6 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PZWS ! significant w !* 0.2 DECLARATIONS OF LOCAL VARIABLES ! INTEGER:: JSV ! loop counters -INTEGER :: IKU INTEGER :: IIB, IIE ! index of first and last inner mass points along x INTEGER :: IJB, IJE ! index of first and last inner mass points along y real, dimension(:,:,:), allocatable :: zrhodjontime @@ -289,7 +288,6 @@ real, dimension(:,:,:), allocatable :: zrhodjontime !------------------------------------------------------------------------------ ! CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKU=SIZE(XZHAT) ! !* 1. ASSELIN FILTER ! @@ -547,8 +545,7 @@ IF (LBU_ENABLE) THEN if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U ), 'ENDF', pus (:, :, :) * Mxm( prhodj(:, :, :) ) / ptstep ) if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V ), 'ENDF', pvs (:, :, :) * Mym( prhodj(:, :, :) ) / ptstep ) - if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W ), 'ENDF', pws (:, :, :) * Mzm( 1, iku, 1, prhodj(:, :, :) ) & - / ptstep ) + if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W ), 'ENDF', pws (:, :, :) * Mzm( prhodj(:, :, :) ) / ptstep ) if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH ), 'ENDF', pths (:, :, :) * prhodj(:, :, :) / ptstep ) if ( lbudget_tke ) call Budget_store_end( tbudgets(NBUDGET_TKE), 'ENDF', ptkes(:, :, :) * prhodj(:, :, :) / ptstep ) if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV ), 'ENDF', prs (:, :, :, 1) * prhodj(:, :, :) / ptstep ) @@ -566,8 +563,7 @@ IF (LBU_ENABLE) THEN if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U ), 'ASSE', pus (:, :, :) * Mxm( prhodj(:, :, :) ) / ptstep ) if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V ), 'ASSE', pvs (:, :, :) * Mym( prhodj(:, :, :) ) / ptstep ) - if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W ), 'ASSE', pws (:, :, :) * Mzm( 1, iku, 1, prhodj(:, :, :) ) & - / ptstep ) + if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W ), 'ASSE', pws (:, :, :) * Mzm( prhodj(:, :, :) ) / ptstep ) if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH ), 'ASSE', pths (:, :, :) * prhodj(:, :, :) / ptstep ) if ( lbudget_tke ) call Budget_store_init( tbudgets(NBUDGET_TKE), 'ASSE', ptkes(:, :, :) * prhodj(:, :, :) / ptstep ) if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV ), 'ASSE', prs (:, :, :, 1) * prhodj(:, :, :) / ptstep ) @@ -582,7 +578,6 @@ IF (LBU_ENABLE) THEN call Budget_store_init( tbudgets(jsv + NBUDGET_SV1 - 1), 'ASSE', psvs(:, :, :, jsv) * prhodj(:, :, :) / ptstep ) end do end if - END IF ! !------------------------------------------------------------------------------ diff --git a/src/MNH/exchange.f90 b/src/MNH/exchange.f90 index 5587e5331b307d7edfc6bc7469b8c8738b7d3d87..c175d25f3466bb3811307c8d197793e018962f52 100644 --- a/src/MNH/exchange.f90 +++ b/src/MNH/exchange.f90 @@ -132,14 +132,12 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS,PRSVS ! INTEGER :: IINFO_ll ! return code of parallel routine INTEGER :: JRR,JSV ! loop counters ! -INTEGER :: IKU INTEGER :: ILUOUT ! logical unit numbers of output-listing INTEGER :: IRESP ! IRESP : return-code if a problem appears !in LFI subroutines at the open of the file REAL :: ZRATIO, ZMASSTOT, ZMASSPOS !------------------------------------------------------------------------------ ! -IKU=SIZE(XZHAT) ILUOUT = TLUOUT%NLU ! !* 1. TRANSFORMS THE SOURCE TERMS INTO PROGNOSTIC VARIABLES @@ -149,7 +147,7 @@ ILUOUT = TLUOUT%NLU ! PRUS(:,:,:) = PRUS(:,:,:)*PTSTEP / MXM(PRHODJ) PRVS(:,:,:) = PRVS(:,:,:)*PTSTEP / MYM(PRHODJ) -PRWS(:,:,:) = PRWS(:,:,:)*PTSTEP / MZM(1,IKU,1,PRHODJ) +PRWS(:,:,:) = PRWS(:,:,:)*PTSTEP / MZM(PRHODJ) ! ! 1.b Meteorological scalar variables ! diff --git a/src/MNH/fct_met.f90 b/src/MNH/fct_met.f90 index 3597b264c76bdd1c2228a2871090b789ca3af7c9..7c9a24d7e876246c65a3f6f4ed6c2846894dab7a 100644 --- a/src/MNH/fct_met.f90 +++ b/src/MNH/fct_met.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. @@ -148,10 +148,8 @@ REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: & REAL :: ZMINR,ZMINTKE ! Absolute minimum values of ! water substances, TKE -INTEGER :: IKU !------------------------------------------------------------------------------- ! -IKU=SIZE(XZHAT) !* 1. FLUX-CORRECTED TRANSPORT ADVECTION SCHEME for the HMET group ! ! @@ -170,8 +168,8 @@ IKU=SIZE(XZHAT) ! IF (LBUDGET_TH) CALL BUDGET (PRTHS,NBUDGET_TH,'ADVY_BU_RTH') ! PRTHS(:,:,:) = PRTHS(:,:,:) & - - DZF(1,IKU,1,PRWCT(:,:,:)*MZM (1,IKU,1,PTHT(:,:,:))) -! IF (LBUDGET_TH) CALL BUDGET (PRTHS,NBUDGET_TH,'ADVZ_BU_RTH') + - DZF(PRWCT(:,:,:)*MZM (PTHT(:,:,:))) +! IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'ADVZ_BU_RTH') ! !* 1.2 No condensation case: Vapor ---> advected by a FCT scheme ! @@ -191,9 +189,9 @@ IKU=SIZE(XZHAT) ! IF (LBUDGET_RV) & ! CALL BUDGET (PRRS(:,:,:,1), NBUDGET_RV,'ADVY_BU_RRV') ! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DZF(1,IKU,1,ZFZ(:,:,:)) + PRRS(:,:,:,1) = PRRS(:,:,:,1) - DZF(ZFZ(:,:,:)) ! IF (LBUDGET_RV) & -! CALL BUDGET (PRRS(:,:,:,1), NBUDGET_RV,'ADVZ_BU_RRV') +! CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVZ_BU_RRV') END IF ! !* 1.3 No ice case: rv+rc ---> advected by the FCT scheme @@ -207,7 +205,7 @@ IKU=SIZE(XZHAT) ! ZFX(:,:,:) = PRUCT(:,:,:) * MXM (PRT(:,:,:,2)) ! ZFY(:,:,:) = PRVCT(:,:,:) * MYM (PRT(:,:,:,2)) ! CENtred scheme for rc - ZFZ(:,:,:) = PRWCT(:,:,:) * MZM (1,IKU,1,PRT(:,:,:,2)) ! + ZFZ(:,:,:) = PRWCT(:,:,:) * MZM (PRT(:,:,:,2)) ! ! ZRTFX(:,:,:) = ZRTFX(:,:,:) - ZFX(:,:,:) ! ZRTFY(:,:,:) = ZRTFY(:,:,:) - ZFY(:,:,:) ! rv fluxes deduction @@ -223,10 +221,10 @@ IKU=SIZE(XZHAT) ! IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), NBUDGET_RV,'ADVY_BU_RRV') ! IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), NBUDGET_RC,'ADVY_BU_RRC') ! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DZF(1,IKU,1,ZRTFZ(:,:,:)) - PRRS(:,:,:,2) = PRRS(:,:,:,2) - DZF(1,IKU,1, ZFZ(:,:,:)) -! IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), NBUDGET_RV,'ADVZ_BU_RRV') -! IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), NBUDGET_RC,'ADVZ_BU_RRC') + PRRS(:,:,:,1) = PRRS(:,:,:,1) - DZF(ZRTFZ(:,:,:)) + PRRS(:,:,:,2) = PRRS(:,:,:,2) - DZF( ZFZ(:,:,:)) +! IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVZ_BU_RRV') +! IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVZ_BU_RRC') ! END IF ! @@ -243,7 +241,7 @@ IKU=SIZE(XZHAT) ! ZFX(:,:,:) = PRUCT(:,:,:) * MXM (PRT(:,:,:,2)) ! ZFY(:,:,:) = PRVCT(:,:,:) * MYM (PRT(:,:,:,2)) ! CENtred scheme for rc - ZFZ(:,:,:) = PRWCT(:,:,:) * MZM (1,IKU,1,PRT(:,:,:,2)) ! + ZFZ(:,:,:) = PRWCT(:,:,:) * MZM (PRT(:,:,:,2)) ! ! ZRTFX(:,:,:) = ZRTFX(:,:,:) - ZFX(:,:,:) ! ZRTFY(:,:,:) = ZRTFY(:,:,:) - ZFY(:,:,:) ! rv+ri fluxes deduction @@ -255,13 +253,13 @@ IKU=SIZE(XZHAT) PRRS(:,:,:,2) = PRRS(:,:,:,2) - DYF( ZFY(:,:,:)) ! IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), NBUDGET_RC,'ADVY_BU_RRC') ! - PRRS(:,:,:,2) = PRRS(:,:,:,2) - DZF(1,IKU,1, ZFZ(:,:,:)) -! IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), NBUDGET_RC,'ADVZ_BU_RRC') + PRRS(:,:,:,2) = PRRS(:,:,:,2) - DZF( ZFZ(:,:,:)) +! IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7 ,'ADVZ_BU_RRC') ! ! ZFX(:,:,:) = PRUCT(:,:,:) * MXM (PRT(:,:,:,4)) ! ZFY(:,:,:) = PRVCT(:,:,:) * MYM (PRT(:,:,:,4)) ! CENtred scheme for ri - ZFZ(:,:,:) = PRWCT(:,:,:) * MZM (1,IKU,1,PRT(:,:,:,4)) ! + ZFZ(:,:,:) = PRWCT(:,:,:) * MZM (PRT(:,:,:,4)) ! ! ZRTFX(:,:,:) = ZRTFX(:,:,:) - ZFX(:,:,:) ! ZRTFY(:,:,:) = ZRTFY(:,:,:) - ZFY(:,:,:) ! rv fluxes deduction @@ -277,10 +275,10 @@ IKU=SIZE(XZHAT) ! IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), NBUDGET_RV,'ADVY_BU_RRV') ! IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4), NBUDGET_RI,'ADVY_BU_RRI') ! - PRRS(:,:,:,1) = PRRS(:,:,:,1) - DZF(1,IKU,1,ZRTFZ(:,:,:)) - PRRS(:,:,:,4) = PRRS(:,:,:,4) - DZF(1,IKU,1, ZFZ(:,:,:)) -! IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), NBUDGET_RV,'ADVZ_BU_RRV') -! IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4), NBUDGET_RI,'ADVZ_BU_RRI') + PRRS(:,:,:,1) = PRRS(:,:,:,1) - DZF(ZRTFZ(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) - DZF( ZFZ(:,:,:)) +! IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6 ,'ADVZ_BU_RRV') +! IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9 ,'ADVZ_BU_RRI') ! END IF ! @@ -298,8 +296,8 @@ IKU=SIZE(XZHAT) PRRS(:,:,:,3) = PRRS(:,:,:,3) - DYF( ZFY(:,:,:)) ! IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3), NBUDGET_RR,'ADVY_BU_RRR') ! - PRRS(:,:,:,3) = PRRS(:,:,:,3) - DZF(1,IKU,1, ZFZ(:,:,:)) -! IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3), NBUDGET_RR,'ADVZ_BU_RRR') + PRRS(:,:,:,3) = PRRS(:,:,:,3) - DZF( ZFZ(:,:,:)) +! IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8 ,'ADVZ_BU_RRR') ! END IF ! @@ -327,13 +325,13 @@ IKU=SIZE(XZHAT) ! IF (JRR==7.AND.LBUDGET_RH) & ! CALL BUDGET (PRRS(:,:,:,7),NBUDGET_RH,'ADVY_BU_RRH') ! - PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) - DZF(1,IKU,1,ZFZ(:,:,:)) - ! IF (JRR==5.AND.LBUDGET_RS) & - ! CALL BUDGET (PRRS(:,:,:,5),NBUDGET_RS,'ADVZ_BU_RRS') - ! IF (JRR==6.AND.LBUDGET_RG) & - ! CALL BUDGET (PRRS(:,:,:,6),NBUDGET_RG,'ADVZ_BU_RRG') - ! IF (JRR==7.AND.LBUDGET_RH) & - ! CALL BUDGET (PRRS(:,:,:,7),NBUDGET_RH,'ADVZ_BU_RRH') + PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) - DZF(ZFZ(:,:,:)) +! IF (JRR==5.AND.LBUDGET_RS) & +! CALL BUDGET (PRRS(:,:,:,5),10,'ADVZ_BU_RRS') +! IF (JRR==6.AND.LBUDGET_RG) & +! CALL BUDGET (PRRS(:,:,:,6),11,'ADVZ_BU_RRG') +! IF (JRR==7.AND.LBUDGET_RH) & +! CALL BUDGET (PRRS(:,:,:,7),12,'ADVZ_BU_RRH') ! END DO ! @@ -354,8 +352,8 @@ IKU=SIZE(XZHAT) PRTKES(:,:,:) = PRTKES(:,:,:) - DYF(ZFY(:,:,:)) ! IF (LBUDGET_TKE) CALL BUDGET (PRTKES,NBUDGET_TKE,'ADVY_BU_RTKE') ! - PRTKES(:,:,:) = PRTKES(:,:,:) - DZF(1,IKU,1,ZFZ(:,:,:)) -! IF (LBUDGET_TKE) CALL BUDGET (PRTKES,NBUDGET_TKE,'ADVZ_BU_RTKE') + PRTKES(:,:,:) = PRTKES(:,:,:) - DZF(ZFZ(:,:,:)) +! IF (LBUDGET_TKE) CALL BUDGET (PRTKES,5,'ADVZ_BU_RTKE') ! END IF ! diff --git a/src/MNH/fct_scalar.f90 b/src/MNH/fct_scalar.f90 index f3641c63b0285f94b06dda82004ef3b5b7358a75..e0832c60e8729fb718cd275c1e6f056cd0c62a2e 100644 --- a/src/MNH/fct_scalar.f90 +++ b/src/MNH/fct_scalar.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. @@ -135,11 +135,9 @@ INTEGER :: JSV ! REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & :: ZFX ,ZFY ,ZFZ ! Advective flux components for each -INTEGER :: IKU ! !------------------------------------------------------------------------------- ! -IKU=SIZE(XZHAT) !* 1. FLUX-CORRECTED TRANSPORT ADVECTION SCHEME for the HSV group ! ! @@ -158,9 +156,9 @@ IKU=SIZE(XZHAT) ! IF (LBUDGET_SV) & ! CALL BUDGET (PRSVS(:,:,:,JSV),NBUDGET_SV1-1+JSV,'ADVY_BU_RSV') ! - PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) - DZF(1,IKU,1,ZFZ(:,:,:)) + PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) - DZF(ZFZ(:,:,:)) ! IF (LBUDGET_SV) & -! CALL BUDGET (PRSVS(:,:,:,JSV),NBUDGET_SV1-1+JSV,'ADVZ_BU_RSV') +! CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADVZ_BU_RSV') END DO ! !------------------------------------------------------------------------------- diff --git a/src/MNH/flash_geom_elec.f90 b/src/MNH/flash_geom_elec.f90 index 55b5db9c4bf12ca54f13e17b2b6cdec2357bd3db..3cd873895ccd911ef791e4700cda3fde6ded209a 100644 --- a/src/MNH/flash_geom_elec.f90 +++ b/src/MNH/flash_geom_elec.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2010-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2010-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. @@ -181,7 +181,6 @@ REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask INTEGER :: IIB, IIE ! index values of the first and last inner mass points along x INTEGER :: IJB, IJE ! index values of the first and last inner mass points along y INTEGER :: IKB, IKE ! index values of the first and last inner mass points along z -INTEGER :: IKU INTEGER :: II, IJ, IK, IL, IM, IPOINT ! loop indexes INTEGER :: IX, IY, IZ INTEGER :: IXOR, IYOR ! origin of the extended subdomain @@ -336,7 +335,6 @@ CALL MYPROC_ELEC_ll(IPROC) CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IKB = 1 + JPVEXT IKE = SIZE(PRT,3) - JPVEXT -IKU = SIZE(PRT,3) ! ! global indexes of the local subdomains origin CALL GET_GLOBALDIMS_ll (NIMAX_ll,NJMAX_ll) @@ -383,7 +381,7 @@ IF (GEFIRSTCALL) THEN ! ZXMASS(IIB:IIE) = 0.5 * (XXHAT(IIB:IIE) + XXHAT(IIB+1:IIE+1)) ZYMASS(IJB:IJE) = 0.5 * (XYHAT(IJB:IJE) + XYHAT(IJB+1:IJE+1)) - ZZMASS = MZF(1,IKU,1,PZZ) + ZZMASS = MZF(PZZ) ZPRES_COEF = EXP(ZZMASS/8400.) ZSCOORD_SEG(:,:,:) = 0.0 ISAVE_STATUS = 1 diff --git a/src/MNH/forcing.f90 b/src/MNH/forcing.f90 index a5e3075881810e2674b03563c18a306926f9e03a..ef75e5383198891f83377c714ad9f49413b01c43 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) @@ -188,6 +190,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 @@ -497,7 +501,7 @@ ELSE ! ALLOCATE(ZZA(SIZE(PWT,1),SIZE(PWT,2),SIZE(PWT,3))) ALLOCATE(ZZF(SIZE(PWT,1),SIZE(PWT,2),SIZE(PWT,3))) - ZZA(:,:,:) = MZF(1,IKU,1, PZZ(:,:,:) ) + ZZA(:,:,:) = MZF( PZZ(:,:,:) ) ZZA(:,:,IKU) = 2.0*PZZ(:,:,IKU) - ZZA(:,:,IKU-1) ZDZHAT_INV_IKU = 1.0 / ( PZHAT(IKU)-PZHAT(IKU-1) ) ! @@ -567,7 +571,7 @@ ELSE END DO CALL GET_HALO(ZWF) ! - ZZF(:,:,:) = MZF(1,IKU,1, PZZ(:,:,:) ) + ZZF(:,:,:) = MZF( PZZ(:,:,:) ) ZZF(:,:,IKU) = 2.0*PZZ(:,:,IKU)-ZZF(:,:,IKU-1) ! DO JL=1,IKU-1 @@ -606,7 +610,7 @@ END IF !! !! Ligne to add if you want W in Pa/s in namelist instead of m/s (omega = - w/(rho*g)) !! -!ZWF(:,:,:) = - ZWF(:,:,:)/(XG*MZM(1,IKU,1,(PRHODJ(:,:,:)/PJ(:,:,:)))) +!ZWF(:,:,:) = - ZWF(:,:,:)/(XG*MZM((PRHODJ(:,:,:)/PJ(:,:,:)))) ! !!============================ ! @@ -630,7 +634,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(:,:,:) @@ -657,49 +661,49 @@ ALLOCATE(ZRWCF(SIZE(PWT,1),SIZE(PWT,2),SIZE(PWT,3))) !* 4.1 integration of vertical motion (upstream scheme) ! IF (LVERT_MOTION_FRC) THEN - ZDZZ(:,:,:) = DZM(1,IKU,1,MZF(1,IKU,1,PZZ(:,:,:))) + ZDZZ(:,:,:) = DZM(MZF(PZZ(:,:,:))) ZDZZ(:,:,IKU) = PZZ(:,:,IKU) - PZZ(:,:,IKU-1) ! same delta z in IKU and IKU -1 ! - ZRWCF(:,:,:) = ZWF(:,:,:) * MZM(1,IKU,1,PRHODJ(:,:,:)) / ZDZZ(:,:,:) + ZRWCF(:,:,:) = ZWF(:,:,:) * MZM(PRHODJ(:,:,:)) / ZDZZ(:,:,:) ZRWCF(:,:,1) = - ZRWCF(:,:,3) ! Mirror hypothesis ! ! forced vertical transport of U and V ! - ZDZZ(:,:,:) = MXF(ZRWCF(:,:,:)) *DZM(1,IKU,1,PUT(:,:,:)) + ZDZZ(:,:,:) = MXF(ZRWCF(:,:,:)) *DZM(PUT(:,:,:)) PRUS(:,:,:) = PRUS(:,:,:) - UPSTREAM_Z(ZDZZ(:,:,:),ZRWCF(:,:,:)) - ZDZZ(:,:,:) = MYF(ZRWCF(:,:,:)) *DZM(1,IKU,1,PVT(:,:,:)) + ZDZZ(:,:,:) = MYF(ZRWCF(:,:,:)) *DZM(PVT(:,:,:)) PRVS(:,:,:) = PRVS(:,:,:) - UPSTREAM_Z(ZDZZ(:,:,:),ZRWCF(:,:,:)) ! ! forced vertical transport of W ! IF( .NOT.L1D ) THEN - ZDZZ(:,:,:) = MZF(1,IKU,1,ZRWCF(:,:,:)) *DZF(1,IKU,1,PWT(:,:,:)) + ZDZZ(:,:,:) = MZF(ZRWCF(:,:,:)) *DZF(PWT(:,:,:)) PRWS(:,:,:) = PRWS(:,:,:) - UPSTREAM_Z(ZDZZ(:,:,:),ZRWCF(:,:,:)) END IF ! ! forced vertical transport of THETA ! - ZDZZ(:,:,:) = ZRWCF(:,:,:) *DZM(1,IKU,1,PTHT(:,:,:)) + ZDZZ(:,:,:) = ZRWCF(:,:,:) *DZM(PTHT(:,:,:)) PRTHS(:,:,:) = PRTHS(:,:,:) - UPSTREAM_Z(ZDZZ(:,:,:),ZRWCF(:,:,:)) ! ! forced vertical transport of TKE (if allocated) ! IF( SIZE(PTKET) == SIZE(ZDZZ) ) THEN - ZDZZ(:,:,:) = ZRWCF(:,:,:) *DZM(1,IKU,1,PTKET(:,:,:)) + ZDZZ(:,:,:) = ZRWCF(:,:,:) *DZM(PTKET(:,:,:)) PRTKES(:,:,:) = PRTKES(:,:,:) - UPSTREAM_Z(ZDZZ(:,:,:),ZRWCF(:,:,:)) END IF ! ! forced vertical transport of water variables ! DO JL = 1 , SIZE(PRRS,4) - ZDZZ(:,:,:) = ZRWCF(:,:,:) *DZM(1,IKU,1,PRT(:,:,:,JL)) + ZDZZ(:,:,:) = ZRWCF(:,:,:) *DZM(PRT(:,:,:,JL)) PRRS(:,:,:,JL) = PRRS(:,:,:,JL) - UPSTREAM_Z(ZDZZ(:,:,:),ZRWCF(:,:,:)) END DO ! ! forced vertical transport of scalar variables ! DO JL = 1 , SIZE(PRSVS,4) - ZDZZ(:,:,:) = ZRWCF(:,:,:) *DZM(1,IKU,1,PSVT(:,:,:,JL)) + ZDZZ(:,:,:) = ZRWCF(:,:,:) *DZM(PSVT(:,:,:,JL)) PRSVS(:,:,:,JL) = PRSVS(:,:,:,JL) - UPSTREAM_Z(ZDZZ(:,:,:),ZRWCF(:,:,:)) END DO ! @@ -780,7 +784,7 @@ PVFRC_PAST(:,:,:) = ZVF(:,:,:) ! IF( LRELAX_THRV_FRC .OR. LRELAX_UV_FRC ) THEN ! - ZDZZ(:,:,:) = DZM(1,IKU,1,MZF(1,IKU,1,PZZ(:,:,:))) + ZDZZ(:,:,:) = DZM(MZF(PZZ(:,:,:))) ZDZZ(:,:,IKU) = PZZ(:,:,IKU) - PZZ(:,:,IKU-1) ! ! define the mask where the relaxation is to be applied @@ -795,7 +799,7 @@ IF( LRELAX_THRV_FRC .OR. LRELAX_UV_FRC ) THEN !callabortstop CALL PRINT_MSG(NVERB_FATAL,'GEN','FORCING','wrong CRELAX_HEIGHT_TYPE option') END SELECT - WHERE ( MZF(1,IKU,1,PZZ(:,:,:)) .LE. XRELAX_HEIGHT_FRC ) + WHERE ( MZF(PZZ(:,:,:)) .LE. XRELAX_HEIGHT_FRC ) GRELAX_MASK_FRC = .FALSE. END WHERE ! diff --git a/src/MNH/gdiv.f90 b/src/MNH/gdiv.f90 index f11b44f7ce0296f6025e7e9de8cb0b7f39cb0438..b22065908c6e897d61706999fd1374582060f1d4 100644 --- a/src/MNH/gdiv.f90 +++ b/src/MNH/gdiv.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 operators 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ################ MODULE MODI_GDIV ! ################ @@ -71,13 +66,6 @@ END MODULE MODI_GDIV !! EXTERNAL !! -------- !! SUBROUTINE CONTRAV : compute the contavariant components -!! Shuman operators : -!! FUNCTION DXF : compute finite difference along x for a variable -!! localized at a flux side -!! FUNCTION DYF : compute finite difference along y for a variable -!! localized at a flux side -!! FUNCTION DZF : compute finite difference along z for a variable -!! localized at a flux side !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -114,7 +102,6 @@ END MODULE MODI_GDIV ! USE MODD_PARAMETERS USE MODD_CONF -USE MODI_SHUMAN USE MODI_CONTRAV ! USE MODE_ll diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90 index 950d731b8edcb3f46b7512f56438d59c3c615ce9..6246b73a4e2dd7cf3dd5244b3d5ffc6db3b523a3 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 @@ -153,6 +156,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/gradient_m.f90 b/src/MNH/gradient_m.f90 index 3fed55910b986173a0ac6aefd185ccbe603fe746..b5ec025aacf1a6c83e0c74f0e68406ff736ab119 100644 --- a/src/MNH/gradient_m.f90 +++ b/src/MNH/gradient_m.f90 @@ -1,12 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -!----------------------------------------------------------------- ! ###################### MODULE MODI_GRADIENT_M ! ###################### @@ -14,9 +10,8 @@ INTERFACE ! ! -FUNCTION GX_M_M(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_M_M) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION GX_M_M(PA,PDXX,PDZZ,PDZX) RESULT(PGX_M_M) +! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -27,9 +22,8 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point END FUNCTION GX_M_M ! ! -FUNCTION GY_M_M(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_M_M) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION GY_M_M(PA,PDYY,PDZZ,PDZY) RESULT(PGY_M_M) +! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -40,10 +34,8 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point END FUNCTION GY_M_M ! ! -FUNCTION GZ_M_M(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_M_M) +FUNCTION GZ_M_M(PA,PDZZ) RESULT(PGZ_M_M) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -107,7 +99,7 @@ END MODULE MODI_GRADIENT_M ! ! ! ####################################################### - FUNCTION GX_M_M(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_M_M) + FUNCTION GX_M_M(PA,PDXX,PDZZ,PDZX) RESULT(PGX_M_M) ! ####################################################### ! !!**** *GX_M_M* - Cartesian Gradient operator: @@ -173,8 +165,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -194,7 +184,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point ! IF (.NOT. LFLAT) THEN PGX_M_M(:,:,:)= (DXF(MXM(PA(:,:,:))) - & - MZF(KKA,KKU,KL,MXF(PDZX)*DZM(KKA,KKU,KL,PA(:,:,:)) & + MZF(MXF(PDZX)*DZM(PA(:,:,:)) & /PDZZ(:,:,:)) ) /MXF(PDXX(:,:,:)) ELSE PGX_M_M(:,:,:)=DXF(MXM(PA(:,:,:))) / MXF(PDXX(:,:,:)) @@ -206,7 +196,7 @@ END FUNCTION GX_M_M ! ! ! ####################################################### - FUNCTION GY_M_M(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_M_M) + FUNCTION GY_M_M(PA,PDYY,PDZZ,PDZY) RESULT(PGY_M_M) ! ####################################################### ! !!**** *GY_M_M* - Cartesian Gradient operator: @@ -270,8 +260,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -291,7 +279,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point ! ! IF (.NOT. LFLAT) THEN - PGY_M_M(:,:,:)= (DYF(MYM(PA))-MZF(KKA,KKU,KL,MYF(PDZY)*DZM(KKA,KKU,KL,PA)& + PGY_M_M(:,:,:)= (DYF(MYM(PA))-MZF(MYF(PDZY)*DZM(PA)& /PDZZ) ) /MYF(PDYY) ELSE PGY_M_M(:,:,:)= DYF(MYM(PA))/MYF(PDYY) @@ -304,9 +292,9 @@ END FUNCTION GY_M_M ! ! ! -! ####################################################### - FUNCTION GZ_M_M(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_M_M) -! ####################################################### +! ############################################# + FUNCTION GZ_M_M(PA,PDZZ) RESULT(PGZ_M_M) +! ############################################# ! !!**** *GZ_M_M* - Cartesian Gradient operator: !! computes the gradient in the cartesian Z @@ -364,8 +352,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -381,7 +367,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point !* 1. DEFINITION of GZ_M_M ! -------------------- ! -PGZ_M_M(:,:,:)= MZF(KKA,KKU,KL, DZM(KKA,KKU,KL,PA(:,:,:))/PDZZ(:,:,:) ) +PGZ_M_M(:,:,:)= MZF( DZM(PA(:,:,:))/PDZZ(:,:,:) ) ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/gradient_u.f90 b/src/MNH/gradient_u.f90 index 20526e75efcfa6028c3bf69cfeda117598752815..3d32ffa807c906ac2984bbbb8e83b00936d619a4 100644 --- a/src/MNH/gradient_u.f90 +++ b/src/MNH/gradient_u.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 operators 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ###################### MODULE MODI_GRADIENT_U ! ###################### @@ -15,9 +10,8 @@ INTERFACE ! ! -FUNCTION GX_U_M(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_U_M) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION GX_U_M(PA,PDXX,PDZZ,PDZX) RESULT(PGX_U_M) +! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -28,10 +22,8 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_U_M ! result mass point END FUNCTION GX_U_M ! ! -FUNCTION GY_U_UV(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_U_UV) +FUNCTION GY_U_UV(PA,PDYY,PDZZ,PDZY) RESULT(PGY_U_UV) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -42,10 +34,8 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_U_UV ! result UV point END FUNCTION GY_U_UV ! ! -FUNCTION GZ_U_UW(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_U_UW) +FUNCTION GZ_U_UW(PA,PDZZ) RESULT(PGZ_U_UW) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -61,7 +51,7 @@ END MODULE MODI_GRADIENT_U ! ! ! ####################################################### - FUNCTION GX_U_M(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_U_M) + FUNCTION GX_U_M(PA,PDXX,PDZZ,PDZX) RESULT(PGX_U_M) ! ####################################################### ! !!**** *GX_U_M* - Cartesian Gradient operator: @@ -126,8 +116,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -147,7 +135,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_U_M ! result mass point ! IF (.NOT. LFLAT) THEN PGX_U_M(:,:,:)= ( DXF(PA) - & - MZF(KKA,KKU,KL,MXF(PDZX*DZM(KKA,KKU,KL,PA)) / PDZZ ) & + MZF(MXF(PDZX*DZM(PA)) / PDZZ ) & ) / MXF(PDXX) ELSE PGX_U_M(:,:,:)= DXF(PA) / MXF(PDXX) @@ -159,7 +147,7 @@ END FUNCTION GX_U_M ! ! ! ######################################################### - FUNCTION GY_U_UV(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_U_UV) + FUNCTION GY_U_UV(PA,PDYY,PDZZ,PDZY) RESULT(PGY_U_UV) ! ######################################################### ! !!**** *GY_U_UV* - Cartesian Gradient operator: @@ -225,8 +213,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -245,7 +231,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_U_UV ! result UV point ! --------------------- ! IF (.NOT. LFLAT) THEN - PGY_U_UV(:,:,:)= (DYM(PA)- MZF(KKA,KKU,KL, MYM( DZM(KKA,KKU,KL,PA)/& + PGY_U_UV(:,:,:)= (DYM(PA)- MZF( MYM( DZM(PA)/& MXM(PDZZ) ) *MXM(PDZY) ) ) / MXM(PDYY) ELSE PGY_U_UV(:,:,:)= DYM(PA) / MXM(PDYY) @@ -257,7 +243,7 @@ END FUNCTION GY_U_UV ! ! ! ####################################################### - FUNCTION GZ_U_UW(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_U_UW) + FUNCTION GZ_U_UW(PA,PDZZ) RESULT(PGZ_U_UW) ! ####################################################### ! !!**** *GZ_U_UW - Cartesian Gradient operator: @@ -315,8 +301,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -332,7 +316,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_U_UW ! result UW point !* 1. DEFINITION of GZ_U_UW ! --------------------- ! -PGZ_U_UW(:,:,:)= DZM(KKA,KKU,KL,PA) / MXM(PDZZ) +PGZ_U_UW(:,:,:)= DZM(PA) / MXM(PDZZ) ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/gradient_uv.f90 b/src/MNH/gradient_uv.f90 index b7c3e35fa1d9117c3c412ecc17cc77c32a5dd83a..8e1822ef37d0fb1f04ebe7a6f9a7eb8c4e19b64c 100644 --- a/src/MNH/gradient_uv.f90 +++ b/src/MNH/gradient_uv.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 operators 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ####################### MODULE MODI_GRADIENT_UV ! ####################### @@ -15,9 +10,8 @@ INTERFACE ! ! -FUNCTION GX_UV_V(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_UV_V) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION GX_UV_V(PA,PDXX,PDZZ,PDZX) RESULT(PGX_UV_V) +! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the UV point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -28,10 +22,8 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_UV_V ! result V point END FUNCTION GX_UV_V ! ! -FUNCTION GY_UV_U(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_UV_U) +FUNCTION GY_UV_U(PA,PDYY,PDZZ,PDZY) RESULT(PGY_UV_U) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the UV point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -49,7 +41,7 @@ END MODULE MODI_GRADIENT_UV ! ! ! ######################################################### - FUNCTION GX_UV_V(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_UV_V) + FUNCTION GX_UV_V(PA,PDXX,PDZZ,PDZX) RESULT(PGX_UV_V) ! ######################################################### ! !!**** *GX_UV_V* - Cartesian Gradient operator: @@ -112,8 +104,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the UV point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -133,7 +123,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_UV_V ! result V point ! IF (.NOT. LFLAT) THEN PGX_UV_V(:,:,:)= ( DXF(PA) - & - MZF(KKA,KKU,KL, MXF( MYM(PDZX)*DZM(KKA,KKU,KL,PA)/MYM(PDZZ) ) ) & + MZF( MXF( MYM(PDZX)*DZM(PA)/MYM(PDZZ) ) ) & ) / MXF(MYM(PDXX)) ELSE PGX_UV_V(:,:,:)= DXF(PA) / MXF(MYM(PDXX)) @@ -145,7 +135,7 @@ END FUNCTION GX_UV_V ! ! ! ######################################################### - FUNCTION GY_UV_U(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_UV_U) + FUNCTION GY_UV_U(PA,PDYY,PDZZ,PDZY) RESULT(PGY_UV_U) ! ######################################################### ! !!**** *GY_UV_U* - Cartesian Gradient operator: @@ -216,8 +206,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the UV point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -237,7 +225,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_UV_U ! result U point ! IF (.NOT. LFLAT) THEN PGY_UV_U(:,:,:)= ( DYF(PA) - & - MZF(KKA,KKU,KL, MYF( MXM(PDZY)*DZM(KKA,KKU,KL,PA)/MXM(PDZZ) ) ) & + MZF( MYF( MXM(PDZY)*DZM(PA)/MXM(PDZZ) ) ) & ) / MYF(MXM(PDYY)) ELSE PGY_UV_U(:,:,:)= DYF(PA) / MYF(MXM(PDYY)) diff --git a/src/MNH/gradient_uw.f90 b/src/MNH/gradient_uw.f90 index 5ef1c9622f649501ad3f610d1430d9c72c8e7a7a..946b85c836ad48ef71050ed74081bdf2d6fc1ab0 100644 --- a/src/MNH/gradient_uw.f90 +++ b/src/MNH/gradient_uw.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 operators 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ####################### MODULE MODI_GRADIENT_UW ! ####################### @@ -15,9 +10,7 @@ INTERFACE ! ! -FUNCTION GX_UW_W(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_UW_W) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION GX_UW_W(PA,PDXX,PDZZ,PDZX) RESULT(PGX_UW_W) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the UW point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -28,10 +21,8 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_UW_W ! result W point END FUNCTION GX_UW_W ! ! -FUNCTION GZ_UW_U(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_UW_U) +FUNCTION GZ_UW_U(PA,PDZZ) RESULT(PGZ_UW_U) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the UW point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -47,7 +38,7 @@ END MODULE MODI_GRADIENT_UW ! ! ! ######################################################### - FUNCTION GX_UW_W(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_UW_W) + FUNCTION GX_UW_W(PA,PDXX,PDZZ,PDZX) RESULT(PGX_UW_W) ! ######################################################### ! !!**** *GX_UW_W* - Cartesian Gradient operator: @@ -111,8 +102,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise* REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the UW point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -132,10 +121,10 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_UW_W ! result W point ! IF (.NOT. LFLAT) THEN PGX_UW_W(:,:,:)= ( DXF(PA) - & - MZF(KKA,KKU,KL, MXF(MZF(KKA,KKU,KL, PDZX)*DZF(KKA,KKU,KL,PA)) / MZF(KKA,KKU,KL,PDZZ) ) & - ) / MXF(MZM(KKA,KKU,KL,PDXX)) + MZF( MXF(MZF( PDZX)*DZF(PA)) / MZF(PDZZ) ) & + ) / MXF(MZM(PDXX)) ELSE - PGX_UW_W(:,:,:)= DXF(PA) / MXF(MZM(KKA,KKU,KL,PDXX)) + PGX_UW_W(:,:,:)= DXF(PA) / MXF(MZM(PDXX)) END IF ! !---------------------------------------------------------------------------- @@ -144,7 +133,7 @@ END FUNCTION GX_UW_W ! ! ! ############################################### - FUNCTION GZ_UW_U(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_UW_U) + FUNCTION GZ_UW_U(PA,PDZZ) RESULT(PGZ_UW_U) ! ############################################### ! !!**** *GZ_UW_U* - Cartesian Gradient operator: @@ -205,8 +194,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the UW point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -222,7 +209,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_UW_U ! result U point !* 1. DEFINITION of GZ_UW_U ! --------------------- ! -PGZ_UW_U(:,:,:)= DZF(KKA,KKU,KL,PA) / MXM(MZF(KKA,KKU,KL,PDZZ)) +PGZ_UW_U(:,:,:)= DZF(PA) / MXM(MZF(PDZZ)) ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/gradient_v.f90 b/src/MNH/gradient_v.f90 index 98a7349d7e7e75282666378f3a5d5b527bee7fac..12c1be749d779a02648de8bb380dbdf9004a2907 100644 --- a/src/MNH/gradient_v.f90 +++ b/src/MNH/gradient_v.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 operators 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ###################### MODULE MODI_GRADIENT_V ! ###################### @@ -15,10 +10,8 @@ INTERFACE ! ! -FUNCTION GY_V_M(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_V_M) +FUNCTION GY_V_M(PA,PDYY,PDZZ,PDZY) RESULT(PGY_V_M) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -28,10 +21,8 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_V_M ! result mass point ! END FUNCTION GY_V_M ! -FUNCTION GX_V_UV(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_V_UV) +FUNCTION GX_V_UV(PA,PDXX,PDZZ,PDZX) RESULT(PGX_V_UV) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -42,10 +33,8 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_V_UV ! result UV point END FUNCTION GX_V_UV ! ! -FUNCTION GZ_V_VW(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_V_VW) +FUNCTION GZ_V_VW(PA,PDZZ) RESULT(PGZ_V_VW) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -61,7 +50,7 @@ END MODULE MODI_GRADIENT_V ! ! ! ####################################################### - FUNCTION GY_V_M(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_V_M) + FUNCTION GY_V_M(PA,PDYY,PDZZ,PDZY) RESULT(PGY_V_M) ! ####################################################### ! !!**** *GY_V_M* - Cartesian Gradient operator: @@ -125,8 +114,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -146,7 +133,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_V_M ! result mass point ! IF (.NOT. LFLAT) THEN PGY_V_M(:,:,:)= (DYF(PA) - & - MZF(KKA,KKU,KL, MYF(PDZY*DZM(KKA,KKU,KL,PA))/PDZZ ) & + MZF( MYF(PDZY*DZM(PA))/PDZZ ) & ) / MYF(PDYY) ELSE PGY_V_M(:,:,:)= DYF(PA) / MYF(PDYY) @@ -158,7 +145,7 @@ END FUNCTION GY_V_M ! ! ! ######################################################### - FUNCTION GX_V_UV(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_V_UV) + FUNCTION GX_V_UV(PA,PDXX,PDZZ,PDZX) RESULT(PGX_V_UV) ! ######################################################### ! !!**** *GX_V_UV* - Cartesian Gradient operator: @@ -223,8 +210,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -243,7 +228,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_V_UV ! result UV point ! --------------------- ! IF (.NOT. LFLAT) THEN - PGX_V_UV(:,:,:)= ( DXM(PA)- MZF(KKA,KKU,KL, MXM( DZM(KKA,KKU,KL,PA)/& + PGX_V_UV(:,:,:)= ( DXM(PA)- MZF( MXM( DZM(PA)/& MYM(PDZZ) ) *MYM(PDZX) ) ) / MYM(PDXX) ELSE PGX_V_UV(:,:,:)= DXM(PA) / MYM(PDXX) @@ -255,7 +240,7 @@ END FUNCTION GX_V_UV ! ! ! ####################################################### - FUNCTION GZ_V_VW(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_V_VW) + FUNCTION GZ_V_VW(PA,PDZZ) RESULT(PGZ_V_VW) ! ####################################################### ! !!**** *GZ_V_VW - Cartesian Gradient operator: @@ -314,8 +299,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -331,7 +314,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_V_VW ! result VW point !* 1. DEFINITION of GZ_V_VW ! --------------------- ! -PGZ_V_VW(:,:,:)= DZM(KKA,KKU,KL,PA) / MYM(PDZZ) +PGZ_V_VW(:,:,:)= DZM(PA) / MYM(PDZZ) ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/gradient_vw.f90 b/src/MNH/gradient_vw.f90 index 6d82cb972c21769d5c8ee2c1f63d7825b7598b37..864be89c8f615f811549b8c3298727341d9cba59 100644 --- a/src/MNH/gradient_vw.f90 +++ b/src/MNH/gradient_vw.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 operators 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ####################### MODULE MODI_GRADIENT_VW ! ####################### @@ -15,9 +10,7 @@ INTERFACE ! ! -FUNCTION GY_VW_W(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_VW_W) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION GY_VW_W(PA,PDYY,PDZZ,PDZY) RESULT(PGY_VW_W) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the VW point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -28,10 +21,8 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_VW_W ! result W point END FUNCTION GY_VW_W ! ! -FUNCTION GZ_VW_V(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_VW_V) +FUNCTION GZ_VW_V(PA,PDZZ) RESULT(PGZ_VW_V) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the VW point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -47,7 +38,7 @@ END MODULE MODI_GRADIENT_VW ! ! ! ######################################################### - FUNCTION GY_VW_W(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_VW_W) + FUNCTION GY_VW_W(PA,PDYY,PDZZ,PDZY) RESULT(PGY_VW_W) ! ######################################################### ! !!**** *GY_VW_W* - Cartesian Gradient operator: @@ -111,8 +102,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the VW point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -132,10 +121,10 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_VW_W ! result W point ! IF (.NOT. LFLAT) THEN PGY_VW_W(:,:,:)= ( DYF(PA) - & - MZF(KKA,KKU,KL, MYF(MZF(KKA,KKU,KL,PDZY)*DZF(KKA,KKU,KL,PA)) / MZF(KKA,KKU,KL,PDZZ) ) & - ) / MYF(MZM(KKA,KKU,KL,PDYY)) + MZF( MYF(MZF(PDZY)*DZF(PA)) / MZF(PDZZ) ) & + ) / MYF(MZM(PDYY)) ELSE - PGY_VW_W(:,:,:)= DYF(PA) / MYF(MZM(KKA,KKU,KL,PDYY)) + PGY_VW_W(:,:,:)= DYF(PA) / MYF(MZM(PDYY)) END IF ! !---------------------------------------------------------------------------- @@ -144,7 +133,7 @@ END FUNCTION GY_VW_W ! ! ! ############################################### - FUNCTION GZ_VW_V(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_VW_V) + FUNCTION GZ_VW_V(PA,PDZZ) RESULT(PGZ_VW_V) ! ############################################### ! !!**** *GZ_VW_V* - Cartesian Gradient operator: @@ -205,8 +194,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the VW point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -222,7 +209,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_VW_V ! result V point !* 1. DEFINITION of GZ_VW_V ! --------------------- ! -PGZ_VW_V(:,:,:)= DZF(KKA,KKU,KL,PA) / MYM(MZF(KKA,KKU,KL,PDZZ)) +PGZ_VW_V(:,:,:)= DZF(PA) / MYM(MZF(PDZZ)) ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/gradient_w.f90 b/src/MNH/gradient_w.f90 index a1bfeed203020e73b27adbda43e96e0fbddc985f..1ef8f6916a266f0dc74a2cd5b8a79dceb85b979d 100644 --- a/src/MNH/gradient_w.f90 +++ b/src/MNH/gradient_w.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 operators 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ###################### MODULE MODI_GRADIENT_W ! ###################### @@ -15,10 +10,8 @@ INTERFACE ! ! -FUNCTION GZ_W_M(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_W_M) +FUNCTION GZ_W_M(PA,PDZZ) RESULT(PGZ_W_M) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -26,10 +19,8 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_W_M ! result mass point ! END FUNCTION GZ_W_M ! -FUNCTION GX_W_UW(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_W_UW) +FUNCTION GX_W_UW(PA,PDXX,PDZZ,PDZX) RESULT(PGX_W_UW) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -40,10 +31,8 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_W_UW ! result UW point END FUNCTION GX_W_UW ! ! -FUNCTION GY_W_VW(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_W_VW) +FUNCTION GY_W_VW(PA,PDYY,PDZZ,PDZY) RESULT(PGY_W_VW) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -61,7 +50,7 @@ END MODULE MODI_GRADIENT_W ! ! ! ####################################################### - FUNCTION GZ_W_M(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_W_M) + FUNCTION GZ_W_M(PA,PDZZ) RESULT(PGZ_W_M) ! ####################################################### ! !!**** *GZ_W_M* - Cartesian Gradient operator: @@ -114,8 +103,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -131,7 +118,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_W_M ! result mass point !* 1. DEFINITION of GZ_W_M ! -------------------- ! -PGZ_W_M(:,:,:)= DZF(KKA,KKU,KL,PA(:,:,:))/(MZF(KKA,KKU,KL,PDZZ(:,:,:))) +PGZ_W_M(:,:,:)= DZF(PA(:,:,:))/(MZF(PDZZ(:,:,:))) ! !---------------------------------------------------------------------------- ! @@ -139,7 +126,7 @@ END FUNCTION GZ_W_M ! ! ! ######################################################### - FUNCTION GX_W_UW(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX) RESULT(PGX_W_UW) + FUNCTION GX_W_UW(PA,PDXX,PDZZ,PDZX) RESULT(PGX_W_UW) ! ######################################################### ! !!**** *GX_W_UW* - Cartesian Gradient operator: @@ -194,8 +181,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -214,11 +199,11 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_W_UW ! result UW point ! --------------------- ! IF (.NOT. LFLAT) THEN - PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(KKA,KKU,KL,PDXX(:,:,:))) & - -DZM(KKA,KKU,KL,MXM(MZF(KKA,KKU,KL,PA(:,:,:))))*PDZX(:,:,:) & - /( MZM(KKA,KKU,KL,PDXX(:,:,:))*MXM(PDZZ(:,:,:)) ) + PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(PDXX(:,:,:))) & + -DZM(MXM(MZF(PA(:,:,:))))*PDZX(:,:,:) & + /( MZM(PDXX(:,:,:))*MXM(PDZZ(:,:,:)) ) ELSE - PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(KKA,KKU,KL,PDXX(:,:,:))) + PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(PDXX(:,:,:))) END IF ! !---------------------------------------------------------------------------- @@ -227,7 +212,7 @@ END FUNCTION GX_W_UW ! ! ! ######################################################### - FUNCTION GY_W_VW(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_W_VW) + FUNCTION GY_W_VW(PA,PDYY,PDZZ,PDZY) RESULT(PGY_W_VW) ! ######################################################### ! !!**** *GY_W_VW* - Cartesian Gradient operator: @@ -282,8 +267,6 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -302,11 +285,11 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_W_VW ! result VW point ! --------------------- ! IF (.NOT. LFLAT) THEN - PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(KKA,KKU,KL,PDYY(:,:,:))) & - -DZM(KKA,KKU,KL,MYM(MZF(KKA,KKU,KL,PA(:,:,:))))*PDZY(:,:,:) & - /( MZM(KKA,KKU,KL,PDYY(:,:,:))*MYM(PDZZ(:,:,:)) ) + PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(PDYY(:,:,:))) & + -DZM(MYM(MZF(PA(:,:,:))))*PDZY(:,:,:) & + /( MZM(PDYY(:,:,:))*MYM(PDZZ(:,:,:)) ) ELSE - PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(KKA,KKU,KL,PDYY(:,:,:))) + PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(PDYY(:,:,:))) END IF ! !---------------------------------------------------------------------------- diff --git a/src/MNH/gravity.f90 b/src/MNH/gravity.f90 index a5664d1b4e4c011960fdff1eee0f9678a495ab6e..72d0c1649e522a6b44541baa3b2ace50d7147061 100644 --- a/src/MNH/gravity.f90 +++ b/src/MNH/gravity.f90 @@ -135,7 +135,6 @@ REAL :: ZRV_OV_RD ! = RV / RD INTEGER :: JWATER ! loop index on the different types of water REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: & ZWORK1, ZWORK2 -INTEGER :: IKU ! !------------------------------------------------------------------------------- ! @@ -143,8 +142,6 @@ INTEGER :: IKU !* 1. COMPUTES THE GRAVITY TERM ! ------------------------- ! -IKU=SIZE(PTHT,3) -! IF( .NOT.L1D ) THEN ! no buoyancy for 1D case ! IF(KRR > 0) THEN @@ -173,7 +170,7 @@ IF( .NOT.L1D ) THEN ! no buoyancy for 1D case ! ! compute the gravity term ! - PRWS(:,:,:) = PRWS + XG * MZM(1,IKU,1, ( (ZWORK2/PTHVREF) - 1. ) * PRHODJ ) + PRWS(:,:,:) = PRWS + XG * MZM( ( (ZWORK2/PTHVREF) - 1. ) * PRHODJ ) ! ! the extrapolation for the PTHT and the THVREF must be the same at the ! ground diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90 index 3e3ef2d61044ac6567ffe81d4194de9c108bc9b6..aaf7c903b00284edd640ad3b20351a6d641362f9 100644 --- a/src/MNH/ice_adjust.f90 +++ b/src/MNH/ice_adjust.f90 @@ -163,6 +163,7 @@ END MODULE MODI_ICE_ADJUST !! or to call it on S variables !! 2016-11 S. Riette: all-or-nothing adjustment now uses condensation ! P. 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 ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets !------------------------------------------------------------------------------- ! diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index 6c2e8d0f2ddb9e9ac0472b283b842a7691f85ede..af5bfea3dce88fd0d6df9e2ec7a942c87295e7d3 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -101,10 +101,14 @@ contains !! 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 15/11/2019: remove unused CBURECORD variable +! 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 ! P. Wautelet 02-03/2020: use the new data structures and subroutines for budgets +! B. Vie 02/03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets ! P .Wautelet 09/03/2020: add missing budgets for electricity !------------------------------------------------------------------------------- ! @@ -862,7 +866,8 @@ if ( lbu_rth ) then tzsource%clongname = 'dissipation' call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ndisshth ) - gcond = hturb == 'TKEL' .and. ( hcloud == 'KHKO' .or. hcloud == 'C2R2' ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) tzsource%cmnhname = 'NETUR' tzsource%clongname = 'negative correction induced by turbulence' call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nneturth ) @@ -882,7 +887,8 @@ if ( lbu_rth ) then tzsource%clongname = 'total advection' call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nadvth ) - gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2' + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) tzsource%cmnhname = 'NEADV' tzsource%clongname = 'negative correction induced by advection' call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nneadvth ) @@ -1043,7 +1049,8 @@ if ( lbu_rth ) then tzsource%clongname = 'vapor condensation or cloud water evaporation' call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ncondth ) - gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2' + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) tzsource%cmnhname = 'NECON' tzsource%clongname = 'negative correction induced by condensation' call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nneconth ) @@ -1238,7 +1245,8 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then tzsource%clongname = 'horizontal turbulent diffusion' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nhturbrv ) - gcond = hturb == 'TKEL' .and. ( hcloud == 'KHKO' .or. hcloud == 'C2R2' ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) tzsource%cmnhname = 'NETUR' tzsource%clongname = 'negative correction induced by turbulence' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nneturrv ) @@ -1258,7 +1266,8 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then tzsource%clongname = 'total advection' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nadvrv ) - gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2' + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) tzsource%cmnhname = 'NEADV' tzsource%clongname = 'negative correction induced by advection' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nneadvrv ) @@ -1331,7 +1340,8 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then tzsource%clongname = 'deposition on ice' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, ncdepirv ) - gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2' + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) tzsource%cmnhname = 'NECON' tzsource%clongname = 'negative correction induced by condensation' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nneconrv ) @@ -1427,7 +1437,8 @@ if ( tbudgets(NBUDGET_RC)%lenabled ) then tzsource%clongname = 'horizontal turbulent diffusion' call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nhturbrc ) - gcond = hturb == 'TKEL' .and. ( hcloud == 'KHKO' .or. hcloud == 'C2R2' ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) tzsource%cmnhname = 'NETUR' tzsource%clongname = 'negative correction induced by turbulence' call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nneturrc ) @@ -1442,7 +1453,8 @@ if ( tbudgets(NBUDGET_RC)%lenabled ) then tzsource%clongname = 'total advection' call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nadvrc ) - gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2' + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) tzsource%cmnhname = 'NEADV' tzsource%clongname = 'negative correction induced by advection' call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nneadvrc ) @@ -1591,7 +1603,8 @@ if ( tbudgets(NBUDGET_RC)%lenabled ) then tzsource%clongname = 'vapor condensation or cloud water evaporation' call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ncondrc ) - gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2' + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) tzsource%cmnhname = 'NECON' tzsource%clongname = 'negative correction induced by condensation' call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nneconrc ) @@ -1663,6 +1676,12 @@ if ( tbudgets(NBUDGET_RR)%lenabled ) then tzsource%clongname = 'relaxation' call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nrelrr ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NETUR' + tzsource%clongname = 'negative correction induced by turbulence' + call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nneturrr ) + gcond = lvisc .and. lvisc_r tzsource%cmnhname = 'VISC' tzsource%clongname = 'viscosity' @@ -1673,6 +1692,12 @@ if ( tbudgets(NBUDGET_RR)%lenabled ) then tzsource%clongname = 'total advection' call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nadvrr ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NEADV' + tzsource%clongname = 'negative correction induced by advection' + call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nneadvrr ) + gcond = hcloud /= 'NONE' tzsource%cmnhname = 'NEGA' tzsource%clongname = 'negative correction' @@ -1788,6 +1813,12 @@ if ( tbudgets(NBUDGET_RR)%lenabled ) then tzsource%cmnhname = 'SFR' tzsource%clongname = 'spontaneous freezing' call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nsfrrr ) + + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NECON' + tzsource%clongname = 'negative correction induced by condensation' + call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nneconrr ) end if ! Budget of RRI @@ -1871,6 +1902,12 @@ if ( tbudgets(NBUDGET_RI)%lenabled ) then tzsource%clongname = 'horizontal turbulent diffusion' call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nhturbri ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NETUR' + tzsource%clongname = 'negative correction induced by turbulence' + call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nneturri ) + gcond = lvisc .and. lvisc_r tzsource%cmnhname = 'VISC' tzsource%clongname = 'viscosity' @@ -1881,6 +1918,12 @@ if ( tbudgets(NBUDGET_RI)%lenabled ) then tzsource%clongname = 'total advection' call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nadvri ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NEADV' + tzsource%clongname = 'negative correction induced by advection' + call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nneadvri ) + gcond = hcloud /= 'NONE' tzsource%cmnhname = 'NEGA' tzsource%clongname = 'negative correction' @@ -2008,6 +2051,12 @@ if ( tbudgets(NBUDGET_RI)%lenabled ) then tzsource%cmnhname = 'CDEPI' tzsource%clongname = 'condensation/deposition on ice' call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, ncdepiri ) + + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NECON' + tzsource%clongname = 'negative correction induced by condensation' + call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nneconri ) end if ! Budget of RRS @@ -2076,6 +2125,12 @@ if ( tbudgets(NBUDGET_RS)%lenabled ) then tzsource%clongname = 'relaxation' call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nrelrs ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NETUR' + tzsource%clongname = 'negative correction induced by turbulence' + call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nneturrs ) + gcond = lvisc .and. lvisc_r tzsource%cmnhname = 'VISC' tzsource%clongname = 'viscosity' @@ -2086,6 +2141,12 @@ if ( tbudgets(NBUDGET_RS)%lenabled ) then tzsource%clongname = 'total advection' call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nadvrs ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NEADV' + tzsource%clongname = 'negative correction induced by advection' + call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nneadvrs ) + gcond = hcloud /= 'NONE' tzsource%cmnhname = 'NEGA' tzsource%clongname = 'negative correction' @@ -2169,6 +2230,12 @@ if ( tbudgets(NBUDGET_RS)%lenabled ) then tzsource%cmnhname = 'DRYH' tzsource%clongname = 'dry growth of hail' call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, ndryhrs ) + + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NECON' + tzsource%clongname = 'negative correction induced by condensation' + call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nneconrs ) end if ! Budget of RRG @@ -2237,6 +2304,12 @@ if ( tbudgets(NBUDGET_RG)%lenabled ) then tzsource%clongname = 'relaxation' call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nrelrg ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NETUR' + tzsource%clongname = 'negative correction induced by turbulence' + call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nneturrg ) + gcond = lvisc .and. lvisc_r tzsource%cmnhname = 'VISC' tzsource%clongname = 'viscosity' @@ -2247,6 +2320,12 @@ if ( tbudgets(NBUDGET_RG)%lenabled ) then tzsource%clongname = 'total advection' call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nadvrg ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NEADV' + tzsource%clongname = 'negative correction induced by advection' + call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nneadvrg ) + gcond = hcloud /= 'NONE' tzsource%cmnhname = 'NEGA' tzsource%clongname = 'negative correction' @@ -2344,6 +2423,12 @@ if ( tbudgets(NBUDGET_RG)%lenabled ) then tzsource%cmnhname = 'DRYH' tzsource%clongname = 'dry growth of hail' call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, ndryhrg ) + + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NECON' + tzsource%clongname = 'negative correction induced by condensation' + call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nneconrg ) end if ! Budget of RRH @@ -2412,6 +2497,12 @@ if ( tbudgets(NBUDGET_RH)%lenabled ) then tzsource%clongname = 'relaxation' call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nrelrh ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NETUR' + tzsource%clongname = 'negative correction induced by turbulence' + call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nneturrh ) + gcond = lvisc .and. lvisc_r tzsource%cmnhname = 'VISC' tzsource%clongname = 'viscosity' @@ -2422,6 +2513,12 @@ if ( tbudgets(NBUDGET_RH)%lenabled ) then tzsource%clongname = 'total advection' call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nadvrh ) + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NEADV' + tzsource%clongname = 'negative correction induced by advection' + call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nneadvrh ) + gcond = hcloud /= 'NONE' tzsource%cmnhname = 'NEGA' tzsource%clongname = 'negative correction' @@ -2476,6 +2573,12 @@ if ( tbudgets(NBUDGET_RH)%lenabled ) then tzsource%cmnhname = 'CORR' tzsource%clongname = 'correction' call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, ncorrrh ) + + gcond = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) + tzsource%cmnhname = 'NECON' + tzsource%clongname = 'negative correction induced by condensation' + call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nneconrh ) end if ! Budgets of RSV (scalar variables) @@ -2677,6 +2780,16 @@ SV_BUDGETS: do jsv = 1, ksv ! LIMA case SV_LIMA: if ( jsv == nsv_lima_nc ) then ! Cloud droplets concentration + gcond = lwarm_lima + tzsource%cmnhname = 'NETUR' + tzsource%clongname = 'negative correction induced by turbulence' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + + gcond = lwarm_lima + tzsource%cmnhname = 'NEADV' + tzsource%clongname = 'negative correction induced by advection' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + gcond = .true. tzsource%cmnhname = 'NEGA' tzsource%clongname = 'negative correction' @@ -2772,9 +2885,24 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%clongname = 'adjustment to saturation' call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + gcond = lwarm_lima + tzsource%cmnhname = 'NECON' + tzsource%clongname = 'negative correction induced by condensation' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + else if ( jsv == nsv_lima_nr ) then SV_LIMA ! Rain drops concentration + gcond = lwarm_lima .and. lrain_lima + tzsource%cmnhname = 'NETUR' + tzsource%clongname = 'negative correction induced by turbulence' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + + gcond = lwarm_lima .and. lrain_lima + tzsource%cmnhname = 'NEADV' + tzsource%clongname = 'negative correction induced by advection' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + gcond = .true. tzsource%cmnhname = 'NEGA' tzsource%clongname = 'negative correction' @@ -2860,9 +2988,24 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%clongname = 'hail melting' call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + gcond = lwarm_lima .and. lrain_lima + tzsource%cmnhname = 'NECON' + tzsource%clongname = 'negative correction induced by condensation' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + else if ( jsv >= nsv_lima_ccn_free .and. jsv <= nsv_lima_ccn_free + nmod_ccn - 1 ) then SV_LIMA ! Free CCN concentration + gcond = .true. + tzsource%cmnhname = 'NETUR' + tzsource%clongname = 'negative correction induced by turbulence' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + + gcond = .true. + tzsource%cmnhname = 'NEADV' + tzsource%clongname = 'negative correction induced by advection' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + gcond = .true. tzsource%cmnhname = 'NEGA' tzsource%clongname = 'negative correction' @@ -2888,6 +3031,11 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%clongname = 'scavenging' call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + gcond = .true. + tzsource%cmnhname = 'NECON' + tzsource%clongname = 'negative correction induced by condensation' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + else if ( jsv >= nsv_lima_ccn_acti .and. jsv <= nsv_lima_ccn_acti + nmod_ccn - 1 ) then SV_LIMA ! Activated CCN concentration @@ -2899,6 +3047,16 @@ SV_BUDGETS: do jsv = 1, ksv else if ( jsv == nsv_lima_ni ) then SV_LIMA ! Pristine ice crystals concentration + gcond = lcold_lima + tzsource%cmnhname = 'NETUR' + tzsource%clongname = 'negative correction induced by turbulence' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + + gcond = lcold_lima + tzsource%cmnhname = 'NEADV' + tzsource%clongname = 'negative correction induced by advection' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + gcond = .true. tzsource%cmnhname = 'NEGA' tzsource%clongname = 'negative correction' @@ -2993,9 +3151,24 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%clongname = 'adjustment to saturation' call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + gcond = lcold_lima + tzsource%cmnhname = 'NECON' + tzsource%clongname = 'negative correction induced by condensation' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + else if ( jsv >= nsv_lima_ifn_free .and. jsv <= nsv_lima_ifn_free + nmod_ifn - 1 ) then SV_LIMA ! Free IFN concentration + gcond = .true. + tzsource%cmnhname = 'NETUR' + tzsource%clongname = 'negative correction induced by turbulence' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + + gcond = .true. + tzsource%cmnhname = 'NEADV' + tzsource%clongname = 'negative correction induced by advection' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + gcond = .true. tzsource%cmnhname = 'NEGA' tzsource%clongname = 'negative correction' @@ -3013,6 +3186,11 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%clongname = 'adjustment to saturation' call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + gcond = .true. + tzsource%cmnhname = 'NECON' + tzsource%clongname = 'negative correction induced by condensation' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup ) + gcond = lscav_lima tzsource%cmnhname = 'SCAV' tzsource%clongname = 'scavenging' diff --git a/src/MNH/ini_field_elec.f90 b/src/MNH/ini_field_elec.f90 index a4fa7cd9bdf038b73c0cd2c6a88a0ebb9357fba3..c5dcbb79a30d93761faecc41871205996584c396 100644 --- a/src/MNH/ini_field_elec.f90 +++ b/src/MNH/ini_field_elec.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-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. @@ -100,7 +100,6 @@ CHARACTER(LEN=4), DIMENSION(2) :: ZLBCY ! y-direction LBC type ! INTEGER :: JK ! loop over the vertical levels INTEGER :: IINFO_ll ! -INTEGER :: IKB,IKE,IKU ! Indices for the first and last point along vertical ! REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZMASS, ZWORK, ZWORK1, ZWORK2 ! @@ -112,9 +111,6 @@ TYPE(LIST_ll),POINTER :: TZFIELDS_ll ! list of fields to exchange !* 1. INITIALIZATIONS ! --------------- ! -IKB = 1 + JPVEXT -IKE = SIZE(PZZ,3) - JPVEXT -IKU = SIZE(PZZ,3) ZLBCX = 'OPEN' ! forced LBC ZLBCY = 'OPEN' ! forced LBC ! @@ -172,7 +168,7 @@ XEFIELDW(:,:,SIZE(PDZZ,3)) = 2. * XEFIELDW(:,:,SIZE(PDZZ,3)-1) - & XEFIELDW(:,:,SIZE(PDZZ,3)-2) ! Computing the mobility of small positive (negative) ions at Mass-point -ZZMASS = MZF(1,IKU,1, PZZ ) ! altitude at mass point +ZZMASS = MZF( PZZ ) ! altitude at mass point DO JK = 2,SIZE(PZZ,3)-1 XMOBIL_POS(:,:,JK) = XF_POS * EXP( XEXPMOB* ZZMASS(:,:,JK) ) 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 46a9f3910ae216567911cc090e0a3687569da0be..0cb003caf9cff5babb56206e5b09504dd11fd08a 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -288,6 +288,7 @@ END MODULE MODI_INI_MODEL_n ! 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 ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree !--------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -327,7 +328,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, & @@ -1484,7 +1485,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 @@ -1516,15 +1527,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_spawn_lsn.f90 b/src/MNH/ini_spawn_lsn.f90 index 75354a3f53f1b94993a020d953d37ad8232e4f84..3e31fdc9bb522c60f03c41674d8d2fdb8d1fceef 100644 --- a/src/MNH/ini_spawn_lsn.f90 +++ b/src/MNH/ini_spawn_lsn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1997-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1997-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. @@ -501,9 +501,9 @@ IF ( GVERT_INTERP ) THEN ! IKU = SIZE(PZZ,3) ! - ZZLS2=MZF(1,IKU,1,ZZLS1) + ZZLS2=MZF(ZZLS1) ZZLS2(:,:,IKU)=2.*ZZLS2(:,:,IKU-1)-ZZLS2(:,:,IKU-2) - ZZSS=MZF(1,IKU,1,PZZ) + ZZSS=MZF(PZZ) ZZSS(:,:,IKU)=2.*ZZSS(:,:,IKU-1)-ZZSS(:,:,IKU-2) ! CALL COEF_VER_INTERP_LIN(ZZLS2,ZZSS,IKLIN,ZCOEFLIN) @@ -707,7 +707,7 @@ IF ( GVERT_INTERP ) THEN ! ZZLS1=MYM(ZZLS2) ZZLS1(:,1,:)=2.*ZZLS1(:,2,:)-ZZLS1(:,3,:) - ZZSS=MZF(1,IKU,1,PZZ) + ZZSS=MZF(PZZ) ZZSS(:,:,IKU)=2.*ZZSS(:,:,IKU-1)-ZZSS(:,:,IKU-2) ZZSS=MYM(ZZSS) ZZSS(:,1,:)=2.*ZZSS(:,2,:)-ZZSS(:,3,:) 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 219e12397615e3a52af8ccd216f6eafc00f2ff9d..da26379bfef33982e86a2702a2be47a155524698 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -64,23 +64,27 @@ 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 -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! 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 @@ -107,6 +111,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 @@ -234,7 +239,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, & @@ -242,11 +246,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/ini_tke_eps.f90 b/src/MNH/ini_tke_eps.f90 index f0aba674f3ec36a83f1284b8fa33713cfd7af53f..c76c795b5e67772a14cd56384910110c2a55a010 100644 --- a/src/MNH/ini_tke_eps.f90 +++ b/src/MNH/ini_tke_eps.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. @@ -117,7 +117,7 @@ TYPE(LIST_ll), POINTER :: TPINITHALO3D_ll ! pointer for the ! !* 0.2 Declaration of local variables ! -INTEGER :: IKB,IKE,IKU! index value for the first and last inner +INTEGER :: IKB,IKE ! index value for the first and last inner ! mass points INTEGER :: JKK ! vertical loop index REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZDELTZ ! vertical @@ -128,7 +128,6 @@ REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZDELTZ ! vertical ! IKB=1+JPVEXT IKE=SIZE(PTHT,3)-JPVEXT -IKU=SIZE(PTHT,3) ! !* 1. TKE DETERMINATION ! ----------------- @@ -150,9 +149,9 @@ IF (HGETTKET == 'INIT' ) THEN ! ! determines TKE PTKET(:,:,:)=(XLINI**2/XCED)*( & - XCMFS*( DZF(1,IKU,1,MXF(MZM(1,IKU,1,PUT)))**2 & - +DZF(1,IKU,1,MYF(MZM(1,IKU,1,PVT)))**2) / ZDELTZ & - -(XG/PTHVREF)*XCSHF*DZF(1,IKU,1,MZM(1,IKU,1,PTHT)) & + XCMFS*( DZF(MXF(MZM(PUT)))**2 & + +DZF(MYF(MZM(PVT)))**2) / ZDELTZ & + -(XG/PTHVREF)*XCSHF*DZF(MZM(PTHT)) & ) / ZDELTZ ! positivity control WHERE (PTKET < XTKEMIN) PTKET=XTKEMIN diff --git a/src/MNH/initial_guess.f90 b/src/MNH/initial_guess.f90 index 6cffec168e49103fc509f7691bb965cd582fcbf9..9c99cca628b157bc5568c9bdfdd70db706ccaeab 100644 --- a/src/MNH/initial_guess.f90 +++ b/src/MNH/initial_guess.f90 @@ -187,12 +187,10 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT, PSVT !* 0.2 declarations of local variables ! INTEGER :: JRR, JSV -INTEGER :: IKU REAL :: ZINVTSTEP ! !------------------------------------------------------------------------------- ! -IKU=SIZE(XZHAT) !* 1. COMPUTES THE INVERSE OF THE APPLICABLE TIMESTEP ! ----------------------------------------------- ! @@ -206,7 +204,7 @@ ZINVTSTEP = 1./PTSTEP ! forward-in-time time-marching scheme PRUS = PUT * ZINVTSTEP * MXM(PRHODJ) PRVS = PVT * ZINVTSTEP * MYM(PRHODJ) -PRWS = PWT * ZINVTSTEP * MZM(1,IKU,1,PRHODJ) +PRWS = PWT * ZINVTSTEP * MZM(PRHODJ) ! ! *** meteorological variables ! diff --git a/src/MNH/interp3d.f90 b/src/MNH/interp3d.f90 index b5c2faa9db31d4193d7dae0c2f67abba16c4af5b..d6a05a70bba723815e295e7c8738e1f9a8e423b9 100644 --- a/src/MNH/interp3d.f90 +++ b/src/MNH/interp3d.f90 @@ -1,14 +1,11 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1997-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$ $Revision$ -!----------------------------------------------------------------- +!################### MODULE MODI_INTERP3D -!################################# +!################### ! INTERFACE SUBROUTINE INTERP3D(PFIELD,KGRID,PSVAL,PPLEV,PFIELDAP) @@ -88,7 +85,6 @@ INTEGER :: IIE,IJE,IPU ! End of usefull area INTEGER :: IIB,IJB,IKB ! Begining of usefull area REAL, DIMENSION(SIZE(XPABST,1),SIZE(XPABST,2),SIZE(XPABST,3)) :: ZPTH ! pressure for grid points corresponding to KGRID type REAL :: ZREF,ZXP,ZXM,ZDIXEPS ! pressure values and epsilon value -INTEGER :: IKU !------------------------------------------------------------------------------- ! !* 1. @@ -96,7 +92,6 @@ INTEGER :: IKU CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IPU=SIZE(PFIELDAP,3) IKB=1 +JPVEXT -IKU=SIZE(XZHAT) ZDIXEPS=10.*EPSILON(1.) ! SELECT CASE (KGRID) @@ -109,7 +104,7 @@ SELECT CASE (KGRID) ZPTH(:,:,:)=MYM(XPABST(:,:,:)) ZPTH(:,1,:)=2.*ZPTH(:,2,:) - ZPTH(:,3,:) CASE(4) - ZPTH(:,:,:)=MZM(1,IKU,1,XPABST(:,:,:)) + ZPTH(:,:,:)=MZM(XPABST(:,:,:)) ZPTH(:,:,1)=2.*ZPTH(:,:,2) - ZPTH(:,:,3) END SELECT ! diff --git a/src/MNH/ion_drift.f90 b/src/MNH/ion_drift.f90 index 73edec604ea8572b9418b0181fabd74761dfcc78..b3187ca833f755e9a0ad1ab341f829d89d26c633 100644 --- a/src/MNH/ion_drift.f90 +++ b/src/MNH/ion_drift.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2010-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2010-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. @@ -74,7 +74,6 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT INTEGER :: IIB, IIE ! index of first and last inner mass points along x INTEGER :: IJB, IJE ! index of first and last inner mass points along y INTEGER :: IKB, IKE ! index of first and last inner mass points along z -INTEGER :: IKU REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZDRIFTX REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZDRIFTY REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZDRIFTZ @@ -95,7 +94,6 @@ NULLIFY(TZFIELDS_ll) CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IKB = 1 + JPVEXT IKE = SIZE(PSVT,3) - JPVEXT -IKU = SIZE(PSVT,3) ! ! !------------------------------------------------------------------------------- @@ -166,7 +164,7 @@ ZDRIFTY(:,:,:) = -MYM(ZDRIFTY(:,:,:)) ! Put components at flux sides ! z-component of div term ZDRIFTZ(:,:,:) = PSVT(:,:,:,NSV_ELECBEG) * XMOBIL_POS(:,:,:) ZDRIFTZ(:,:,:) = ZDRIFTZ(:,:,:) * XEFIELDW(:,:,:) -ZDRIFTZ(:,:,:) = -MZM(1,IKU,1,ZDRIFTZ(:,:,:)) ! Put components at flux sides +ZDRIFTZ(:,:,:) = -MZM(ZDRIFTZ(:,:,:)) ! Put components at flux sides ! IF (LWEST_ll( )) ZDRIFTX(IIB-1,:,:) = ZDRIFTX(IIB,:,:) IF (LEAST_ll( )) ZDRIFTX(IIE+1,:,:) = ZDRIFTX(IIE,:,:) @@ -192,7 +190,7 @@ ZDRIFTY(:,:,:) = +MYM(ZDRIFTY(:,:,:)) ! Put components at flux sides ! z-component of div term ZDRIFTZ(:,:,:) = PSVT(:,:,:,NSV_ELECEND) * XMOBIL_NEG(:,:,:) ZDRIFTZ(:,:,:) = ZDRIFTZ(:,:,:) * XEFIELDW(:,:,:) -ZDRIFTZ(:,:,:) = +MZM(1,IKU,1,ZDRIFTZ(:,:,:)) ! Put components at flux sides +ZDRIFTZ(:,:,:) = +MZM(ZDRIFTZ(:,:,:)) ! Put components at flux sides ! IF (LWEST_ll( )) ZDRIFTX(IIB-1,:,:) = ZDRIFTX(IIB,:,:) diff --git a/src/MNH/lap_m.f90 b/src/MNH/lap_m.f90 index a16fd80611ef94e9a60d6cc9707f68bdf3833ab3..f1936c828237a3c61b7f54fcb0ab6ee86376396a 100644 --- a/src/MNH/lap_m.f90 +++ b/src/MNH/lap_m.f90 @@ -1,7 +1,8 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2007-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_LAP_M ! ################# @@ -211,7 +212,7 @@ IF(.NOT. L2D) THEN ZV = MYM(PRHODJ) * ZV ENDIF ! -ZW = MZM(1,IKU,1,PRHODJ) * GZ_M_W(1,IKU,1,PY,PDZZ) +ZW = MZM(PRHODJ) * GZ_M_W(1,IKU,1,PY,PDZZ) ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/les_budget.f90 b/src/MNH/les_budget.f90 index 4ad63f048213dd5898db2b6cd09ae89c755a539b..da9b09c2022185ae5f4e27524d17ab32eb9f08ff 100644 --- a/src/MNH/les_budget.f90 +++ b/src/MNH/les_budget.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-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. @@ -399,7 +399,7 @@ INTEGER :: IINFO_ll ZRHODJ(:,:,:) = MYM(XCURRENT_RHODJ) ZS(:,:,:) = PVARS(:,:,:) / ZRHODJ * XCURRENT_TSTEP CASE ('Z') - ZRHODJ(:,:,:) = MZM(1,IKU,1,XCURRENT_RHODJ) + ZRHODJ(:,:,:) = MZM(XCURRENT_RHODJ) ZS(:,:,:) = PVARS(:,:,:) / ZRHODJ * XCURRENT_TSTEP CASE DEFAULT ZRHODJ(:,:,:) = XCURRENT_RHODJ @@ -417,7 +417,7 @@ INTEGER :: IINFO_ll CASE ('Y') ZS(:,:,:) = MYF(ZS) CASE ('Z') - ZS(:,:,:) = MZF(1,IKU,1,ZS) + ZS(:,:,:) = MZF(ZS) END SELECT CALL LES_ANOMALY_FIELD(ZS,PANOM) diff --git a/src/MNH/les_budget_tendn.f90 b/src/MNH/les_budget_tendn.f90 index 88f033d8e0ad92ba150a3bd6117ab9ffcd27a223..35652009d4ca465bc5b6a480747514fc6822b28a 100644 --- a/src/MNH/les_budget_tendn.f90 +++ b/src/MNH/les_budget_tendn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 les 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ####################### MODULE MODI_LES_BUDGET_TEND_n ! ####################### @@ -134,7 +129,7 @@ ALLOCATE(ZSV_ANOM (IIU,IJU,NLES_K,NSV)) CALL LES_ANOMALY_FIELD(MXF(XUT),ZU_ANOM) CALL LES_ANOMALY_FIELD(MYF(XVT),ZV_ANOM) -CALL LES_ANOMALY_FIELD(MZF(1,IKU,1,XWT),ZW_ANOM) +CALL LES_ANOMALY_FIELD(MZF(XWT),ZW_ANOM) CALL LES_ANOMALY_FIELD(ZTHL,ZTHL_ANOM) CALL LES_ANOMALY_FIELD(ZRT,ZRT_ANOM) DO JSV=1,NSV diff --git a/src/MNH/les_cloud_masksn.f90 b/src/MNH/les_cloud_masksn.f90 index daeb189e9c4857293aa878d87b0c9ad65e92d079..9b9bbf3b2bec186d39db42ade3c6b34e8bd54806 100644 --- a/src/MNH/les_cloud_masksn.f90 +++ b/src/MNH/les_cloud_masksn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2006-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$ $Revision$ -! MASDEV4_7 les 2006/10/16 14:59:17 -!----------------------------------------------------------------- ! ####################### SUBROUTINE LES_CLOUD_MASKS_n ! ####################### @@ -170,7 +165,7 @@ ZWORK1D=0. ZWORK3D=0. ZWORK3DB=0. ! -CALL LES_VER_INT(MZF(1,IKU,1,XWT), ZW_LES) +CALL LES_VER_INT(MZF(XWT), ZW_LES) IF (NSV_CS>0) THEN DO JSV=NSV_CSBEG, NSV_CSEND CALL LES_VER_INT( XSVT(:,:,:,JSV), & diff --git a/src/MNH/les_ini_timestepn.f90 b/src/MNH/les_ini_timestepn.f90 index 505067d9d0fa2bb49778609fb8bc01fff4989ad5..996e6b628416f82131d0db585616732d9aaf08a2 100644 --- a/src/MNH/les_ini_timestepn.f90 +++ b/src/MNH/les_ini_timestepn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-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. @@ -357,7 +357,7 @@ CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR, & ! CALL LES_ANOMALY_FIELD(MXF(XUT),XU_ANOM) CALL LES_ANOMALY_FIELD(MYF(XVT),XV_ANOM) -CALL LES_ANOMALY_FIELD(MZF(1,IKU,1,XWT),XW_ANOM) +CALL LES_ANOMALY_FIELD(MZF(XWT),XW_ANOM) CALL LES_ANOMALY_FIELD(ZTHL,XTHL_ANOM) IF (LUSERV) CALL LES_ANOMALY_FIELD(ZRT,XRT_ANOM) DO JSV=1,NSV diff --git a/src/MNH/lesn.f90 b/src/MNH/lesn.f90 index 3eae3fc04d59c273e750b89bb0ef769ad7e3d3f9..aca09170f137177acc0c2a77d5394c067a7f302d 100644 --- a/src/MNH/lesn.f90 +++ b/src/MNH/lesn.f90 @@ -1,8 +1,7 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. -! $Source: /srv/cvsroot/MNH-VX-Y-Z/src/MNH/lesn.f90,v $ !----------------------------------------------------------------- ! ################# SUBROUTINE LES_n @@ -200,7 +199,7 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZWORK ! ! INTEGER :: IRR ! moist variables counter INTEGER :: JSV ! scalar variables counter -INTEGER :: IIU, IJU,IKU ! array sizes +INTEGER :: IIU, IJU ! array sizes INTEGER :: IKE,IKB INTEGER :: JI, JJ, JK ! loop counters INTEGER :: IIU_ll, IJU_ll ! total domain I size (fin) @@ -225,8 +224,7 @@ IIU_ll = IIMAX_ll+JPHEXT IJU_ll = IJMAX_ll+JPHEXT IIA_ll=JPHEXT+1 IJA_ll=JPHEXT+1 -IKU=SIZE(XVT,3) -IKE=IKU-JPVEXT +IKE=SIZE(XVT,3)-JPVEXT IKB=1+JPVEXT CALL GET_DIM_EXT_ll('B',IIU,IJU) ! @@ -485,7 +483,7 @@ ELSE END IF ! ! computation of mass flux -ZMASSF=MZM(1,IKU,1,ZRHO)*XWT +ZMASSF=MZM(ZRHO)*XWT ! !------------------------------------------------------------------------------- ! @@ -512,25 +510,25 @@ CALL LES_VER_INT( XTHP, ZTP_LES ) CALL LES_VER_INT( XTR, ZTR_LES ) CALL LES_VER_INT( XDISS, ZDISS_LES ) CALL LES_VER_INT( XLEM, ZLM_LES ) -CALL LES_VER_INT( GZ_M_M(1,IKU,1,XPABST,XDZZ), ZDPDZ_LES ) +CALL LES_VER_INT( GZ_M_M(XPABST,XDZZ), ZDPDZ_LES ) ! CALL LES_VER_INT( MXF(XUT) ,ZU_LES ) CALL LES_VER_INT( MYF(XVT) ,ZV_LES ) -CALL LES_VER_INT( MZF(1,IKU,1,XWT) ,ZW_LES ) -CALL LES_VER_INT( MZF(1,IKU,1,ZMASSF) ,ZMF_LES) +CALL LES_VER_INT( MZF(XWT) ,ZW_LES ) +CALL LES_VER_INT( MZF(ZMASSF) ,ZMF_LES) CALL LES_VER_INT( XTHT ,ZTH_LES ) -CALL LES_VER_INT( MXF(MZF(1,IKU,1,GZ_U_UW(1,IKU,1,XUT,XDZZ))), ZDUDZ_LES ) -CALL LES_VER_INT( MYF(MZF(1,IKU,1,GZ_V_VW(1,IKU,1,XVT,XDZZ))), ZDVDZ_LES ) -CALL LES_VER_INT( GZ_W_M(1,IKU,1,XWT,XDZZ), ZDWDZ_LES ) +CALL LES_VER_INT( MXF(MZF(GZ_U_UW(XUT,XDZZ))), ZDUDZ_LES ) +CALL LES_VER_INT( MYF(MZF(GZ_V_VW(XVT,XDZZ))), ZDVDZ_LES ) +CALL LES_VER_INT( GZ_W_M(XWT,XDZZ), ZDWDZ_LES ) CALL LES_VER_INT( ZEXN, ZEXN_LES) ! -CALL LES_VER_INT( GZ_M_M(1,IKU,1,XTHT,XDZZ), ZDTHDZ_LES ) +CALL LES_VER_INT( GZ_M_M(XTHT,XDZZ), ZDTHDZ_LES ) ! CALL LES_VER_INT(ZRHO, ZRHO_LES) ! IF (LUSERV) CALL LES_VER_INT(ZTHV, ZTHV_LES) CALL LES_VER_INT(ZTHL, ZTHL_LES) -CALL LES_VER_INT( GZ_M_M(1,IKU,1,ZTHL,XDZZ), ZDTHLDZ_LES ) +CALL LES_VER_INT( GZ_M_M(ZTHL,XDZZ), ZDTHLDZ_LES ) ! CALL LES_VER_INT( XTKET ,ZTKE_LES) IRR = 0 @@ -538,7 +536,7 @@ IF (LUSERV) THEN IRR = IRR + 1 CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRV_LES ) CALL LES_VER_INT( ZRT(:,:,:) ,ZRT_LES ) - CALL LES_VER_INT( GZ_M_M(1,IKU,1,ZRT,XDZZ), ZDRTDZ_LES ) + CALL LES_VER_INT( GZ_M_M(ZRT,XDZZ), ZDRTDZ_LES ) CALL LES_VER_INT( ZREHU(:,:,:) ,ZREHU_LES) END IF IF (LUSERC) THEN @@ -637,7 +635,7 @@ END IF IF (NSV>0) THEN DO JSV=1,NSV CALL LES_VER_INT( XSVT(:,:,:,JSV), ZSV_LES(:,:,:,JSV) ) - CALL LES_VER_INT( GZ_M_M(1,IKU,1,XSVT(:,:,:,JSV),XDZZ), ZDSVDZ_LES(:,:,:,JSV) ) + CALL LES_VER_INT( GZ_M_M(XSVT(:,:,:,JSV),XDZZ), ZDSVDZ_LES(:,:,:,JSV) ) END DO END IF ! @@ -870,7 +868,7 @@ END DO ! IF (NLES_CURRENT_TCOUNT==1) THEN ALLOCATE(ZZ_LES (IIU,IJU,NLES_K)) - CALL LES_VER_INT( MZF(1,IKU,1,XZZ) ,ZZ_LES ) + CALL LES_VER_INT( MZF(XZZ) ,ZZ_LES ) CALL LES_MEAN_ll ( ZZ_LES, LLES_CURRENT_CART_MASK, XLES_Z ) DEALLOCATE(ZZ_LES) CALL LES_MEAN_ll ( XZS, LLES_CURRENT_CART_MASK(:,:,1), XLES_ZS ) @@ -885,7 +883,7 @@ END IF ! CALL SPEC_VER_INT(IMI, MXF(XUT) ,ZU_SPEC ) CALL SPEC_VER_INT(IMI, MYF(XVT) ,ZV_SPEC ) -CALL SPEC_VER_INT(IMI, MZF(1,IKU,1,XWT) ,ZW_SPEC ) +CALL SPEC_VER_INT(IMI, MZF(XWT) ,ZW_SPEC ) CALL SPEC_VER_INT(IMI, XTHT ,ZTH_SPEC ) IF (LUSERC) CALL SPEC_VER_INT(IMI, ZTHL ,ZTHL_SPEC) IRR = 0 diff --git a/src/MNH/lima.f90 b/src/MNH/lima.f90 index c38fb972d5fbb3584a0323634f0942659430846a..74ea0d31cd6d50dca68459280cee6cbc1b5a86ad 100644 --- a/src/MNH/lima.f90 +++ b/src/MNH/lima.f90 @@ -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 ) @@ -96,8 +96,10 @@ END MODULE MODI_LIMA !! ------------- !! Original 15/03/2018 !! -!! B.Vié 02/2019 : minor correction on budget +! B. Vie 02/2019: minor correction on budget ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets (no more budget calls in this subroutine) +! P. Wautelet 26/02/2020: bugfix: corrected condition to write budget CORR_BU_RRS +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation ! !* 0. DECLARATIONS ! ------------ @@ -155,7 +157,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 @@ -193,7 +195,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 @@ -674,7 +676,7 @@ 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) @@ -734,18 +736,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 db514c5ff444a6ec46f23be4273f9332c229de55..91d1b4d348c72e60e9b904c741ca4c5a72843d45 100644 --- a/src/MNH/lima_adjust.f90 +++ b/src/MNH/lima_adjust.f90 @@ -1134,8 +1134,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 f7ef813095a0e02ac59946c7093d8bd3df2f251c..11c08da021a3b016ed3f1ddde9f2a116bf70d114 100644 --- a/src/MNH/lima_ccn_activation.f90 +++ b/src/MNH/lima_ccn_activation.f90 @@ -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_nucleation_procs.f90 b/src/MNH/lima_nucleation_procs.f90 index a7b7c98499b1a58c0c8a962cc8d5ff8ff6b5b9dc..4f3fb00b136386359fbe84b9eb62ea0657c7d3de 100644 --- a/src/MNH/lima_nucleation_procs.f90 +++ b/src/MNH/lima_nucleation_procs.f90 @@ -8,11 +8,11 @@ ! ############################### ! 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,9 +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) ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation !------------------------------------------------------------------------------- ! use modd_budget, only: lbu_enable, lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, & @@ -106,7 +106,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 @@ -151,9 +151,9 @@ IF ( LWARM .AND. LACTI .AND. NMOD_CCN >=1 ) THEN end if end if - CALL LIMA_CCN_ACTIVATION (PTSTEP, TPFILE, OCLOSE_OUT, & - PRHODREF, PEXNREF, PPABST, PT, PTM, PW_NU, & - PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT) + CALL LIMA_CCN_ACTIVATION (PTSTEP, TPFILE, OCLOSE_OUT, & + PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & + PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT ) if ( lbu_enable ) then if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', ptht(:, :, :) * prhodj(:, :, :) / ptstep ) 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 d47b2f25e1b24a9899d5dd731239c1d6551fc584..e1d141829a82859f73a51d6cff2726aa19f83012 100644 --- a/src/MNH/lima_warm.f90 +++ b/src/MNH/lima_warm.f90 @@ -128,6 +128,8 @@ END MODULE MODI_LIMA_WARM !! J. Escobar : for real*4 , use XMNH_HUGE ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets (no more budget calls in this subroutine) +! B. Vie 03/02/2020: correction of activation of water deposition on the ground +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -220,16 +222,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 :: idx @@ -271,15 +273,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 ! !------------------------------------------------------------------------------- @@ -304,11 +306,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 ! !------------------------------------------------------------------------------- ! @@ -347,7 +344,7 @@ 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)) @@ -373,14 +370,14 @@ IF ( LACTI .AND. NMOD_CCN > 0 ) THEN call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HENU', pccs(:, :, :) * prhodj(:, :, :) ) do jl = 1, nmod_ccn idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl - call Budget_store_init( tbudgets(idx), 'HENU', pnfs(:, :, :, jl) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(idx), 'HENU', znfs(:, :, :, jl) * prhodj(:, :, :) ) end do end if - CALL LIMA_WARM_NUCL (OACTIT, PTSTEP, KMI, TPFILE, OCLOSE_OUT,& - PRHODREF, PEXNREF, PPABST, ZT, ZTM, PW_NU, & - PRCM, PRVT, PRCT, PRRT, & - PTHS, PRVS, PRCS, PCCS, PNFS, PNAS ) + CALL LIMA_WARM_NUCL( OACTIT, PTSTEP, KMI, TPFILE, OCLOSE_OUT, & + PRHODREF, PEXNREF, PPABST, ZT, PTHM, PW_NU, & + PRCM, PRVT, PRCT, PRRT, & + PTHS, PRVS, PRCS, PCCS, ZNFS, ZNAS ) if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) @@ -389,7 +386,7 @@ IF ( LACTI .AND. NMOD_CCN > 0 ) THEN call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HENU', pccs(:, :, :) * prhodj(:, :, :) ) do jl = 1, nmod_ccn idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl - call Budget_store_end( tbudgets(idx), 'HENU', pnfs(:, :, :, jl) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(idx), 'HENU', znfs(:, :, :, jl) * prhodj(:, :, :) ) end do end if END IF ! LACTI @@ -473,14 +470,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 4bfbe6f8ccb07aed3271cdfd769d848ab81bfc13..55fac0b764ba0269a66b103e052de5dc33425232 100644 --- a/src/MNH/lima_warm_nucl.f90 +++ b/src/MNH/lima_warm_nucl.f90 @@ -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/metrics.f90 b/src/MNH/metrics.f90 index 6d292f948693ed1cdceb775cefb07e519eefd63a..b973e0920ed8e38b3ed6371269cfe5cd342a7a0b 100644 --- a/src/MNH/metrics.f90 +++ b/src/MNH/metrics.f90 @@ -1,14 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- -!----------------------------------------------------------------- -!----------------------------------------------------------------- ! ################### MODULE MODI_METRICS ! ################### @@ -162,7 +156,7 @@ ELSE ZD1=1. END IF IF (.NOT.LCARTESIAN) THEN - ZDZZ(:,:,:) = MZF(1,IKU,1, 1.+ ZD1*PZZ(:,:,:)/XRADIUS) + ZDZZ(:,:,:) = MZF( 1.+ ZD1*PZZ(:,:,:)/XRADIUS) DO JK=1,IKU ; DO JJ=1,IJU ; DO JI=1,IIU PDXX(JI,JJ,JK) = ZDZZ(JI,JJ,JK) * PDXHAT(JI) /PMAP(JI,JJ) PDYY(JI,JJ,JK) = ZDZZ(JI,JJ,JK) * PDYHAT(JJ) /PMAP(JI,JJ) @@ -201,7 +195,7 @@ PDZY(:,:,:) = DYM(PZZ(:,:,:)) !* 4. COMPUTE PDZZ : ! ------------- ! -PDZZ(:,:,:) = DZM(1,IKU,1,MZF(1,IKU,1,PZZ(:,:,:))) +PDZZ(:,:,:) = DZM(MZF(PZZ(:,:,:))) PDZZ(:,:,IKU) = PZZ(:,:,IKU) - PZZ(:,:,IKU-1) ! same delta z in IKU and IKU -1 PDZZ(:,:,1) = PDZZ(:,:,2) ! same delta z in 1 and 2 !20131024 diff --git a/src/MNH/mnhget_surf_paramn.f90 b/src/MNH/mnhget_surf_paramn.f90 index da6c4608943b601d01edfbb2a234079a68c551cb..ff527fcf295540f0ec92cf3c285998a33b3f0cb2 100644 --- a/src/MNH/mnhget_surf_paramn.f90 +++ b/src/MNH/mnhget_surf_paramn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2003-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2003-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,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,8 @@ 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 +! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree +! P. Wautelet 11/03/2020: bugfix: add present checks before working on optional arrays !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -101,10 +108,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 +147,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 +182,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 +196,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 @@ -242,12 +258,28 @@ IF (PRESENT(PH_TREE) .OR.PRESENT(PLAI_TREE)) THEN YSURF_CUR%WM,YSURF_CUR%DUO,YSURF_CUR%DU,YSURF_CUR%UG,& YSURF_CUR%U,YSURF_CUR%USS,& 'MESONH',ILU,1,PNATURE=ZNATURE,PLAI_TREE=ZLAI,PH_TREE=ZVH) - CALL REMOVE_HALO(ZLAI,PLAI_TREE) - CALL REMOVE_HALO(ZVH,PH_TREE) + IF ( PRESENT( PLAI_TREE ) ) CALL REMOVE_HALO(ZLAI,PLAI_TREE) + IF ( PRESENT( PH_TREE ) ) CALL REMOVE_HALO(ZVH,PH_TREE) DEALLOCATE(ZVH) DEALLOCATE(ZLAI) END IF ! +IF (PRESENT(PWALL_O_HOR) .OR. PRESENT(PBUILD_HEIGHT)) THEN + IF ( PRESENT ( PBUILD_HEIGHT ) ) PBUILD_HEIGHT(:,:) = XUNDEF + IF ( PRESENT ( PWALL_O_HOR ) ) 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 ) + IF ( PRESENT ( PBUILD_HEIGHT ) ) CALL REMOVE_HALO(ZBUILD_HEIGHT,PBUILD_HEIGHT) + IF ( PRESENT ( PWALL_O_HOR ) ) 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 7148c157e0d7e9913e073378ab420a89b34ec271..e78adebe538c585094b14238b087cc39f9517b92 100644 --- a/src/MNH/modd_budget.f90 +++ b/src/MNH/modd_budget.f90 @@ -49,6 +49,7 @@ ! P. Wautelet 27/01/2020: use the tfield_metadata_base abstract datatype ! P. Wautelet 28/01/2020: add missing budgets for viscosity ! P. Wautelet 28/01/2020: add trhodj in tbudgetdata datatype +! B. Vie 03/02/2020: LIMA negativity checks after turbulence, advection and microphysics budgets ! P. Wautelet 09/03/2020: add tburhodj variable ! P .Wautelet 09/03/2020: add missing budgets for electricity !------------------------------------------------------------------------------- @@ -433,6 +434,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 @@ -469,6 +473,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 @@ -508,6 +515,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 @@ -538,6 +548,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 @@ -571,6 +584,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 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/mode_prandtl.f90 b/src/MNH/mode_prandtl.f90 index 2215306e4cffe5e1f4f79323983001ebf4fe112f..a04e8aa6a4975ee2141b43df4ca538b98cf9d296 100644 --- a/src/MNH/mode_prandtl.f90 +++ b/src/MNH/mode_prandtl.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 mode 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! #################### MODULE MODE_PRANDTL ! #################### @@ -363,10 +358,7 @@ D_M3_WTH_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WTH2_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_WTH_WTH2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_WTH_W2TH(PREDTH1,PREDR1,PD,PKEFF,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -378,7 +370,7 @@ FUNCTION M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_WTH_W2TH(:,:,:) = XCSHF*PKEFF*1.5/MZM(KKA,KKU,KKL,PTKE) & +M3_WTH_W2TH(:,:,:) = XCSHF*PKEFF*1.5/MZM(PTKE) & * (1. - 0.5*PREDR1*(1.+PREDR1)/PD ) / (1.+PREDTH1) ! M3_WTH_W2TH(:,:,IKB-1)=M3_WTH_W2TH(:,:,IKB) @@ -386,10 +378,7 @@ M3_WTH_W2TH(:,:,IKE+1)=M3_WTH_W2TH(:,:,IKE) ! END FUNCTION M3_WTH_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_WTH_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -404,7 +393,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_WTH_W2TH_O_DDTDZ(:,:,:) = & - - XCSHF*PKEFF*1.5/MZM(KKA,KKU,KKL,PTKE)/(1.+PREDTH1)**2*XCTV*PBLL_O_E*PETHETA & + - XCSHF*PKEFF*1.5/MZM(PTKE)/(1.+PREDTH1)**2*XCTV*PBLL_O_E*PETHETA & * (1. - 0.5*PREDR1*(1.+PREDR1)/PD*( 1.+(1.+PREDTH1)*(1.5+PREDR1+PREDTH1)/PD) ) ! D_M3_WTH_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_W2TH_O_DDTDZ(:,:,IKB) @@ -412,12 +401,7 @@ D_M3_WTH_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_W2TH_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_WTH_W2TH_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_W2R(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 +FUNCTION M3_WTH_W2R(PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -430,17 +414,14 @@ FUNCTION M3_WTH_W2R(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PD IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_WTH_W2R(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(KKA,KKU,KKL,PTKE)*PEMOIST*PDTDZ/PD +M3_WTH_W2R(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE)*PEMOIST*PDTDZ/PD ! M3_WTH_W2R(:,:,IKB-1)=M3_WTH_W2R(:,:,IKB) M3_WTH_W2R(:,:,IKE+1)=M3_WTH_W2R(:,:,IKE) ! END FUNCTION M3_WTH_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_WTH_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -454,7 +435,7 @@ FUNCTION D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E, IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_WTH_W2R_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(KKA,KKU,KKL,PTKE)*PEMOIST/PD & +D_M3_WTH_W2R_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE)*PEMOIST/PD & * (1. - PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ! D_M3_WTH_W2R_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_W2R_O_DDTDZ(:,:,IKB) @@ -462,12 +443,7 @@ D_M3_WTH_W2R_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_W2R_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_WTH_W2R_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_WR2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 +FUNCTION M3_WTH_WR2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -484,17 +460,14 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_WTH_WR2(:,:,:) = - XCSHF*PKEFF*0.25*PBLL_O_E*XCTV*PEMOIST**2 & - *MZM(KKA,KKU,KKL,PBETA*PLEPS/(PSQRT_TKE*PTKE))/XCTD*PDTDZ/PD + *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE))/XCTD*PDTDZ/PD ! M3_WTH_WR2(:,:,IKB-1)=M3_WTH_WR2(:,:,IKB) M3_WTH_WR2(:,:,IKE+1)=M3_WTH_WR2(:,:,IKE) ! END FUNCTION M3_WTH_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_WTH_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -512,7 +485,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_WTH_WR2_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.25*PBLL_O_E*XCTV*PEMOIST**2 & - *MZM(KKA,KKU,KKL,PBETA*PLEPS/(PSQRT_TKE*PTKE))/XCTD/PD & + *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE))/XCTD/PD & * (1. - PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ! D_M3_WTH_WR2_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_WR2_O_DDTDZ(:,:,IKB) @@ -520,10 +493,7 @@ D_M3_WTH_WR2_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WR2_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_WTH_WR2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_WTH_WTHR(PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF @@ -538,9 +508,9 @@ FUNCTION M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMO IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -!M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST/MZM(KKA,KKU,KKL,PBETA*PTKE*PSQRT_TKE) & +!M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST/MZM(PBETA*PTKE*PSQRT_TKE) & ! *0.5*PLEPS/XCTD*(1+PREDR1)/PD -M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST*MZM(KKA,KKU,KKL,PBETA/PTKE*PSQRT_TKE) & +M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST*MZM(PBETA/PTKE*PSQRT_TKE) & *0.5*PLEPS/XCTD*(1+PREDR1)/PD ! M3_WTH_WTHR(:,:,IKB-1)=M3_WTH_WTHR(:,:,IKB) @@ -568,10 +538,7 @@ D_M3_WTH_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WTHR_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_WTH_WTHR_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_TH2_W2TH(PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -585,7 +552,7 @@ FUNCTION M3_TH2_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_W2TH(:,:,:) = - MZF(KKA,KKU,KKL,(1.-0.5*PREDR1*(1.+PREDR1)/PD)/(1.+PREDTH1)*PDTDZ) & +M3_TH2_W2TH(:,:,:) = - MZF((1.-0.5*PREDR1*(1.+PREDR1)/PD)/(1.+PREDTH1)*PDTDZ) & * 1.5*PLM*PLEPS/PTKE*XCTV ! M3_TH2_W2TH(:,:,IKB-1)=M3_TH2_W2TH(:,:,IKB) @@ -593,10 +560,7 @@ M3_TH2_W2TH(:,:,IKE+1)=M3_TH2_W2TH(:,:,IKE) ! END FUNCTION M3_TH2_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_TH2_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -611,15 +575,15 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB IF (OUSERV) THEN -! D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(KKA,KKU,KKL, & +! D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF( & ! (1.-0.5*PREDR1*(1.+PREDR1)/PD)*(1.-(1.5+PREDTH1+PREDR1)*(1.+PREDTH1)/PD ) & ! / (1.+PREDTH1)**2 ) - D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(KKA,KKU,KKL, & + D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF( & (1.-0.5*PREDR1*(1.+PREDR1)/PD)*(1.-(1.5+PREDTH1+PREDR1)* & PREDTH1*(1.+PREDTH1)/PD ) / (1.+PREDTH1)**2 ) ELSE - D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(KKA,KKU,KKL,1./(1.+PREDTH1)**2) + D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(1./(1.+PREDTH1)**2) END IF ! D_M3_TH2_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_W2TH_O_DDTDZ(:,:,IKB) @@ -627,10 +591,7 @@ D_M3_TH2_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_W2TH_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_TH2_W2TH_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_WTH2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_TH2_WTH2(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -643,17 +604,14 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_TH2_WTH2(:,:,:) = PLEPS*0.5/XCTD/PSQRT_TKE & - * MZF(KKA,KKU,KKL, (1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD ) + * MZF( (1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD ) ! M3_TH2_WTH2(:,:,IKB-1)=M3_TH2_WTH2(:,:,IKB) M3_TH2_WTH2(:,:,IKE+1)=M3_TH2_WTH2(:,:,IKE) ! END FUNCTION M3_TH2_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_TH2_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -668,7 +626,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_WTH2_O_DDTDZ(:,:,:) = PLEPS*0.5/XCTD/PSQRT_TKE*XCTV & - * MZF(KKA,KKU,KKL, PBLL_O_E*PETHETA* (0.5/PD & + * MZF( PBLL_O_E*PETHETA* (0.5/PD & - (1.5+PREDTH1+PREDR1)*(1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD**2 & ) ) ! @@ -677,10 +635,7 @@ D_M3_TH2_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WTH2_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_TH2_WTH2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_TH2_W2R(PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -694,17 +649,14 @@ FUNCTION M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_W2R(:,:,:) = 0.75*XCTV**2*MZF(KKA,KKU,KKL,PBLL_O_E*PEMOIST/PD*PDTDZ**2)*PLM*PLEPS/PTKE +M3_TH2_W2R(:,:,:) = 0.75*XCTV**2*MZF(PBLL_O_E*PEMOIST/PD*PDTDZ**2)*PLM*PLEPS/PTKE ! M3_TH2_W2R(:,:,IKB-1)=M3_TH2_W2R(:,:,IKB) M3_TH2_W2R(:,:,IKE+1)=M3_TH2_W2R(:,:,IKE) ! END FUNCTION M3_TH2_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_TH2_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -721,17 +673,14 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_W2R_O_DDTDZ(:,:,:) = 0.75*XCTV**2*PLM*PLEPS/PTKE & - * MZF(KKA,KKU,KKL, PBLL_O_E*PEMOIST/PD*PDTDZ*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF( PBLL_O_E*PEMOIST/PD*PDTDZ*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) ! D_M3_TH2_W2R_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_W2R_O_DDTDZ(:,:,IKB) D_M3_TH2_W2R_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_W2R_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_TH2_W2R_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE @@ -744,17 +693,14 @@ FUNCTION M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_WR2(:,:,:) = 0.25*XCTV**2*MZF(KKA,KKU,KKL,(PBLL_O_E*PEMOIST*PDTDZ)**2/PD)*PLEPS/PSQRT_TKE/XCTD +M3_TH2_WR2(:,:,:) = 0.25*XCTV**2*MZF((PBLL_O_E*PEMOIST*PDTDZ)**2/PD)*PLEPS/PSQRT_TKE/XCTD ! M3_TH2_WR2(:,:,IKB-1)=M3_TH2_WR2(:,:,IKB) M3_TH2_WR2(:,:,IKE+1)=M3_TH2_WR2(:,:,IKE) ! END FUNCTION M3_TH2_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_TH2_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -770,17 +716,14 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_WR2_O_DDTDZ(:,:,:) = 0.25*XCTV**2*PLEPS/PSQRT_TKE/XCTD & - * MZF(KKA,KKU,KKL, (PBLL_O_E*PEMOIST)**2*PDTDZ/PD*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF( (PBLL_O_E*PEMOIST)**2*PDTDZ/PD*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) ! D_M3_TH2_WR2_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WR2_O_DDTDZ(:,:,IKB) D_M3_TH2_WR2_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WR2_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_TH2_WR2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_WTHR(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_TH2_WTHR(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -795,17 +738,14 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_TH2_WTHR(:,:,:) = - 0.5*XCTV*PLEPS/PSQRT_TKE/XCTD & - * MZF(KKA,KKU,KKL, PBLL_O_E*PEMOIST*PDTDZ*(1.+PREDR1)/PD ) + * MZF( PBLL_O_E*PEMOIST*PDTDZ*(1.+PREDR1)/PD ) ! M3_TH2_WTHR(:,:,IKB-1)=M3_TH2_WTHR(:,:,IKB) M3_TH2_WTHR(:,:,IKE+1)=M3_TH2_WTHR(:,:,IKE) ! END FUNCTION M3_TH2_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_TH2_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -821,17 +761,14 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_WTHR_O_DDTDZ(:,:,:) = - 0.5*XCTV*PLEPS/PSQRT_TKE/XCTD & - * MZF(KKA,KKU,KKL, PBLL_O_E*PEMOIST*(1.+PREDR1)/PD * (1. -PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF( PBLL_O_E*PEMOIST*(1.+PREDR1)/PD * (1. -PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) ! D_M3_TH2_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WTHR_O_DDTDZ(:,:,IKB) D_M3_TH2_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WTHR_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_TH2_WTHR_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_WTHR(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_THR_WTHR(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -844,17 +781,14 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_THR_WTHR(:,:,:) = 0.5*PLEPS/PSQRT_TKE/XCTD & - * MZF(KKA,KKU,KKL, (1.+PREDTH1)*(1.+PREDR1)/PD ) + * MZF( (1.+PREDTH1)*(1.+PREDR1)/PD ) ! M3_THR_WTHR(:,:,IKB-1)=M3_THR_WTHR(:,:,IKB) M3_THR_WTHR(:,:,IKE+1)=M3_THR_WTHR(:,:,IKE) ! END FUNCTION M3_THR_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_THR_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -869,17 +803,14 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_WTHR_O_DDTDZ(:,:,:) = 0.5*PLEPS/PSQRT_TKE/XCTD * XCTV & - * MZF(KKA,KKU,KKL, PETHETA*PBLL_O_E/PD*(1.+PREDR1)*(1.-(1.+PREDTH1)*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF( PETHETA*PBLL_O_E/PD*(1.+PREDR1)*(1.-(1.+PREDTH1)*(1.5+PREDTH1+PREDR1)/PD) ) ! D_M3_THR_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_THR_WTHR_O_DDTDZ(:,:,IKB) D_M3_THR_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_THR_WTHR_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_THR_WTHR_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_WTH2(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_THR_WTH2(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -894,17 +825,14 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_THR_WTH2(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV & - * MZF(KKA,KKU,KKL, (1.+PREDR1)*PBLL_O_E*PETHETA*PDRDZ/PD ) + * MZF( (1.+PREDR1)*PBLL_O_E*PETHETA*PDRDZ/PD ) ! M3_THR_WTH2(:,:,IKB-1)=M3_THR_WTH2(:,:,IKB) M3_THR_WTH2(:,:,IKE+1)=M3_THR_WTH2(:,:,IKE) ! END FUNCTION M3_THR_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_THR_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -920,17 +848,14 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_WTH2_O_DDTDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV**2 & - * MZF(KKA,KKU,KKL, -(1.+PREDR1)*(PBLL_O_E*PETHETA/PD)**2*PDRDZ*(1.5+PREDTH1+PREDR1) ) + * MZF( -(1.+PREDR1)*(PBLL_O_E*PETHETA/PD)**2*PDRDZ*(1.5+PREDTH1+PREDR1) ) ! D_M3_THR_WTH2_O_DDTDZ(:,:,IKB-1)=D_M3_THR_WTH2_O_DDTDZ(:,:,IKB) D_M3_THR_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_THR_WTH2_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_THR_WTH2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_THR_WTH2_O_DDRDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -945,7 +870,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_WTH2_O_DDRDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV & - * MZF(KKA,KKU,KKL, PBLL_O_E*PETHETA/PD & + * MZF( PBLL_O_E*PETHETA/PD & *(-(1.+PREDR1)*PREDR1/PD*(1.5+PREDTH1+PREDR1)+(1.+2.*PREDR1)) & ) ! @@ -954,10 +879,7 @@ D_M3_THR_WTH2_O_DDRDZ(:,:,IKE+1)=D_M3_THR_WTH2_O_DDRDZ(:,:,IKE) ! END FUNCTION D_M3_THR_WTH2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_W2TH(KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_THR_W2TH(PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM @@ -971,17 +893,14 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_THR_W2TH(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV & - * MZF(KKA,KKU,KKL, (1.+PREDR1)*PDRDZ/PD ) + * MZF( (1.+PREDR1)*PDRDZ/PD ) ! M3_THR_W2TH(:,:,IKB-1)=M3_THR_W2TH(:,:,IKB) M3_THR_W2TH(:,:,IKE+1)=M3_THR_W2TH(:,:,IKE) ! END FUNCTION M3_THR_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ,PETHETA) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_THR_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ,PETHETA) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -998,7 +917,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_W2TH_O_DDTDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV**2 & - * MZF(KKA,KKU,KKL, -PETHETA*PBLL_O_E*(1.+PREDR1)*PDRDZ*(1.5+PREDTH1+PREDR1)/PD**2 ) + * MZF( -PETHETA*PBLL_O_E*(1.+PREDR1)*PDRDZ*(1.5+PREDTH1+PREDR1)/PD**2 ) ! D_M3_THR_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_THR_W2TH_O_DDTDZ(:,:,IKB) @@ -1006,10 +925,7 @@ D_M3_THR_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_THR_W2TH_O_DDTDZ(:,:,IKE) ! END FUNCTION D_M3_THR_W2TH_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_THR_W2TH_O_DDRDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1023,7 +939,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_W2TH_O_DDRDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV & - * MZF(KKA,KKU,KKL, -(1.+PREDR1)*PREDR1*(1.5+PREDTH1+PREDR1)/PD**2 & + * MZF( -(1.+PREDR1)*PREDR1*(1.5+PREDTH1+PREDR1)/PD**2 & +(1.+2.*PREDR1)/PD & ) @@ -1120,10 +1036,7 @@ D_M3_WR_WR2_O_DDRDZ = D_M3_WTH_WTH2_O_DDTDZ(PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_ ! END FUNCTION D_M3_WR_WR2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_WR_W2R(PREDR1,PREDTH1,PD,PKEFF,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1131,14 +1044,11 @@ FUNCTION M3_WR_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_W2R ! -M3_WR_W2R = M3_WTH_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE) +M3_WR_W2R = M3_WTH_W2TH(PREDR1,PREDTH1,PD,PKEFF,PTKE) ! END FUNCTION M3_WR_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_WR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1148,16 +1058,11 @@ FUNCTION D_M3_WR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_W2R_O_DDRDZ ! -D_M3_WR_W2R_O_DDRDZ = D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) +D_M3_WR_W2R_O_DDRDZ = D_M3_WTH_W2TH_O_DDTDZ(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) ! END FUNCTION D_M3_WR_W2R_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 +FUNCTION M3_WR_W2TH(PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -1166,14 +1071,11 @@ FUNCTION M3_WR_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_W2TH ! -M3_WR_W2TH = M3_WTH_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) +M3_WR_W2TH = M3_WTH_W2R(PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! END FUNCTION M3_WR_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_WR_W2TH_O_DDRDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1183,16 +1085,11 @@ FUNCTION D_M3_WR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E, REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_W2TH_O_DDRDZ ! -D_M3_WR_W2TH_O_DDRDZ = D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) +D_M3_WR_W2TH_O_DDRDZ = D_M3_WTH_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) ! END FUNCTION D_M3_WR_W2TH_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_WTH2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 +FUNCTION M3_WR_WTH2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -1204,14 +1101,11 @@ FUNCTION M3_WR_WTH2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E, REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_WTH2 ! -M3_WR_WTH2 = M3_WTH_WR2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) +M3_WR_WTH2 = M3_WTH_WR2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) ! END FUNCTION M3_WR_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_WR_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1224,14 +1118,11 @@ FUNCTION D_M3_WR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_WTH2_O_DDRDZ ! -D_M3_WR_WTH2_O_DDRDZ = D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) +D_M3_WR_WTH2_O_DDRDZ = D_M3_WTH_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) ! END FUNCTION D_M3_WR_WTH2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_WTHR(KKA,KKU,KKL,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_WR_WTHR(PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF @@ -1242,14 +1133,11 @@ FUNCTION M3_WR_WTHR(KKA,KKU,KKL,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETH REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_WTHR ! -M3_WR_WTHR = M3_WTH_WTHR(KKA,KKU,KKL,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) +M3_WR_WTHR = M3_WTH_WTHR(PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) ! END FUNCTION M3_WR_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_WTHR_O_DDRDZ(KKA,KKU,KKL,PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_WR_WTHR_O_DDRDZ(PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PM3_WR_WTHR REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 @@ -1262,10 +1150,7 @@ D_M3_WR_WTHR_O_DDRDZ = D_M3_WTH_WTHR_O_DDTDZ(PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_ ! END FUNCTION D_M3_WR_WTHR_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_R2_W2R(PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1275,14 +1160,11 @@ FUNCTION M3_R2_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_W2R ! -M3_R2_W2R = M3_TH2_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) +M3_R2_W2R = M3_TH2_W2TH(PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) ! END FUNCTION M3_R2_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_R2_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1292,14 +1174,11 @@ FUNCTION D_M3_R2_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV LOGICAL, INTENT(IN) :: OUSERV REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_W2R_O_DDRDZ ! -D_M3_R2_W2R_O_DDRDZ = D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) +D_M3_R2_W2R_O_DDRDZ = D_M3_TH2_W2TH_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) ! END FUNCTION D_M3_R2_W2R_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_WR2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_R2_WR2(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1307,14 +1186,11 @@ FUNCTION M3_R2_WR2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_WR2 ! -M3_R2_WR2 = M3_TH2_WTH2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) +M3_R2_WR2 = M3_TH2_WTH2(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) ! END FUNCTION M3_R2_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_R2_WR2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1324,14 +1200,11 @@ FUNCTION D_M3_R2_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_ REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_WR2_O_DDRDZ ! -D_M3_R2_WR2_O_DDRDZ = D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +D_M3_R2_WR2_O_DDRDZ = D_M3_TH2_WTH2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) ! END FUNCTION D_M3_R2_WR2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_W2TH(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_R2_W2TH(PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -1341,14 +1214,11 @@ FUNCTION M3_R2_W2TH(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_W2TH ! -M3_R2_W2TH = M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +M3_R2_W2TH = M3_TH2_W2R(PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! END FUNCTION M3_R2_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_R2_W2TH_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1360,14 +1230,11 @@ FUNCTION D_M3_R2_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_W2TH_O_DDRDZ ! -D_M3_R2_W2TH_O_DDRDZ = D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +D_M3_R2_W2TH_O_DDRDZ = D_M3_TH2_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! END FUNCTION D_M3_R2_W2TH_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_WTH2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_R2_WTH2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE @@ -1376,14 +1243,11 @@ FUNCTION M3_R2_WTH2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_WTH2 ! -M3_R2_WTH2 = M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +M3_R2_WTH2 = M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! END FUNCTION M3_R2_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_R2_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1394,14 +1258,11 @@ FUNCTION D_M3_R2_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_WTH2_O_DDRDZ ! -D_M3_R2_WTH2_O_DDRDZ = D_M3_TH2_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +D_M3_R2_WTH2_O_DDRDZ = D_M3_TH2_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! END FUNCTION D_M3_R2_WTH2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_WTHR(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_R2_WTHR(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -1411,14 +1272,11 @@ FUNCTION M3_R2_WTHR(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRD REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_WTHR ! -M3_R2_WTHR = M3_TH2_WTHR(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +M3_R2_WTHR = M3_TH2_WTHR(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! END FUNCTION M3_R2_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_R2_WTHR_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1429,14 +1287,11 @@ FUNCTION D_M3_R2_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_WTHR_O_DDRDZ ! -D_M3_R2_WTHR_O_DDRDZ = D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +D_M3_R2_WTHR_O_DDRDZ = D_M3_TH2_WTHR_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! END FUNCTION D_M3_R2_WTHR_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_THR_WTHR_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1446,14 +1301,11 @@ FUNCTION D_M3_THR_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBL REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WTHR_O_DDRDZ ! -D_M3_THR_WTHR_O_DDRDZ = D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +D_M3_THR_WTHR_O_DDRDZ = D_M3_THR_WTHR_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) ! END FUNCTION D_M3_THR_WTHR_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_WR2(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_THR_WR2(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -1463,14 +1315,11 @@ FUNCTION M3_THR_WR2(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTD REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_WR2 ! -M3_THR_WR2 = M3_THR_WTH2(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +M3_THR_WR2 = M3_THR_WTH2(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) ! END FUNCTION M3_THR_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_THR_WR2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1481,14 +1330,11 @@ FUNCTION D_M3_THR_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WR2_O_DDRDZ ! -D_M3_THR_WR2_O_DDRDZ = D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +D_M3_THR_WR2_O_DDRDZ = D_M3_THR_WTH2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) ! END FUNCTION D_M3_THR_WR2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_THR_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1498,14 +1344,11 @@ FUNCTION D_M3_THR_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WR2_O_DDTDZ ! -D_M3_THR_WR2_O_DDTDZ = D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +D_M3_THR_WR2_O_DDTDZ = D_M3_THR_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) ! END FUNCTION D_M3_THR_WR2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_W2R(KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION M3_THR_W2R(PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM @@ -1514,14 +1357,11 @@ FUNCTION M3_THR_W2R(KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_W2R ! -M3_THR_W2R = M3_THR_W2TH(KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) +M3_THR_W2R = M3_THR_W2TH(PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) ! END FUNCTION M3_THR_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_THR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1533,14 +1373,11 @@ FUNCTION D_M3_THR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_ REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_W2R_O_DDRDZ ! -D_M3_THR_W2R_O_DDRDZ = D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) +D_M3_THR_W2R_O_DDRDZ = D_M3_THR_W2TH_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) ! END FUNCTION D_M3_THR_W2R_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) - INTEGER, INTENT(IN) :: KKA - INTEGER, INTENT(IN) :: KKU - INTEGER, INTENT(IN) :: KKL +FUNCTION D_M3_THR_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1549,7 +1386,7 @@ FUNCTION D_M3_THR_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_W2R_O_DDTDZ ! -D_M3_THR_W2R_O_DDTDZ = D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) +D_M3_THR_W2R_O_DDTDZ = D_M3_THR_W2TH_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) ! END FUNCTION D_M3_THR_W2R_O_DDTDZ !---------------------------------------------------------------------------- diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index c6cd72db3a5629193b839d05bb30405b211fa4ed..51d29f1f855e73a8e480c439b2fcc83d24370ed7 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -892,7 +892,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) @@ -1001,7 +1001,7 @@ IF (NBUMOD==IMI .AND. CBUTYPE=='MASK' ) THEN end if if ( lbu_rw ) then tbudgets(NBUDGET_W)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_W)%trhodj%xdata(:, nbutime, :) & - + Mask_compress( Mzm( 1, iku, 1, xrhodj(:, :, :) ) ) + + Mask_compress( Mzm( xrhodj(:, :, :) ) ) end if if ( associated( tburhodj ) ) tburhodj%xdata(:, nbutime, :) = tburhodj%xdata(:, nbutime, :) + Mask_compress( xrhodj(:, :, :) ) END IF @@ -1015,7 +1015,7 @@ IF (NBUMOD==IMI .AND. CBUTYPE=='CART' ) THEN end if if ( lbu_rw ) then tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) & - + Cart_compress( Mzm( 1, iku, 1, xrhodj(:, :, :) ) ) + + Cart_compress( Mzm( xrhodj(:, :, :) ) ) end if if ( associated( tburhodj ) ) tburhodj%xdata(:, :, :) = tburhodj%xdata(:, :, :) + Cart_compress( xrhodj(:, :, :) ) END IF @@ -1121,7 +1121,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 56157206ab385d8c06ffae7ca7128c49f6d24c01..9276582fcb7b728e57c2e6305b4117ff68765771 100644 --- a/src/MNH/modn_budget.f90 +++ b/src/MNH/modn_budget.f90 @@ -226,6 +226,7 @@ !! C.Lac 10/2016 Add droplet deposition !! S. Riette 11/2016 New budgets for ICE3/ICE4 ! P. Wautelet 28/01/2020: add missing budgets for viscosity +! B. Vie 03/02/2020: LIMA negativity checks after turbulence, advection and microphysics budgets ! P .Wautelet 09/03/2020: add missing budgets for electricity !------------------------------------------------------------------------------- ! @@ -276,28 +277,33 @@ 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, NVISCRR + NHMLTRR, NDRYHRR, NCORRRR, NCMELRR,NHONRRR, NCORRRR, NR2C1RR, NCVRCRR, & + NNETURRR, NNEADVRR, NNECONRR, NVISCRR ! 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, NVISCRI + NHMSRI, NHMGRI, NCEDSRI, NCORRRI, & + NNETURRI, NNEADVRI, NNECONRI, NVISCRI ! 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, NVISCRS + NCORRRS, NCNVIRS, NCNVSRS, NHMSRS, NCORRRS, & + NNETURRS, NNEADVRS, NNECONRS, NVISCRS ! 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, NVISCRG + NDRYHRG, NCORRRG, NHGCVRG, NGHCVRG,NHONRRG, NHMGRG, NCOHGRG, & + NNETURRG, NNEADVRG, NNECONRG, NVISCRG ! NAMELIST/NAM_BU_RRH/LBU_RRH, NASSERH, NNESTRH, NADVRH, NFRCRH, & NDIFRH, NRELRH, NNEGARH, NSEDIRH, NWETGRH, NWETHRH, NDRYHRH, NHMLTRH, & - NCORRRH, NHGCVRH, NGHCVRH, NCOHGRH, NHMLTRH, NVISCRH + NCORRRH, NHGCVRH, NGHCVRH, NCOHGRH, NHMLTRH, & + NNETURRH, NNEADVRH, NNECONRH, NVISCRH ! NAMELIST/NAM_BU_RSV/ LBU_RSV, NASSESV, NNESTSV, NADVSV, NFRCSV, & NDIFSV, NRELSV, NDCONVSV, NVTURBSV, NHTURBSV, NCHEMSV, NMAFLSV, & 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/mpdata.f90 b/src/MNH/mpdata.f90 index 1729c968e1da31665cfd5161b4f88f1822508c7d..04f4fcaf132c2c7541b00363a92cb2d117afac64 100644 --- a/src/MNH/mpdata.f90 +++ b/src/MNH/mpdata.f90 @@ -1,6 +1,6 @@ -!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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ################## @@ -148,7 +148,6 @@ INTEGER :: JRR ! Loop index for moist variables ! INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE ! End useful area in x,y,z directions -INTEGER:: IKU ! REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZGUESS ! Guess ! variable (to be removed in the future !) @@ -180,7 +179,6 @@ NULLIFY(TZFIELDS_ll) !* 0.3 PROLOGUE ! CALL GET_PHYSICAL_ll(IIB,IJB,IIE,IJE) -IKU=SIZE(PTHM,3) ! YRX(1) = 'RRV' YRX(2) = 'RRC' @@ -220,7 +218,7 @@ irx(7) = NBUDGET_RH ZRVARS(:,:,:) = PRTHS(:,:,:) ZFADVU(:,:,:) = -DXF(FXM( PTHM(:,:,:),PRUCT(:,:,:) ) ) ZFADVV(:,:,:) = -DYF(FYM( PTHM(:,:,:),PRVCT(:,:,:) ) ) - ZFADVW(:,:,:) = -DZF(1,IKU,1,FZM( PTHM(:,:,:),PRWCT(:,:,:) ) ) + ZFADVW(:,:,:) = -DZF(FZM( PTHM(:,:,:),PRWCT(:,:,:) ) ) ! PRTHS(:,:,:) = PRTHS(:,:,:) + ZFADVU(:,:,:) + ZFADVV(:,:,:) + ZFADVW(:,:,:) ! @@ -257,7 +255,7 @@ irx(7) = NBUDGET_RH ZFADVV(:,:,:) = ZFADVV(:,:,:) + ZFADV(:,:,:) PRTHS(:,:,:) = PRTHS(:,:,:) + ZFADV(:,:,:) ! - ZFADV(:,:,:) = -DZF(1,IKU,1,FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) + ZFADV(:,:,:) = -DZF(FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. @@ -288,7 +286,7 @@ irx(7) = NBUDGET_RH ZRVARS(:,:,:) = PRRS(:,:,:,JRR) ZFADVU(:,:,:) = -DXF(FXM( PRM(:,:,:,JRR),PRUCT(:,:,:) ) ) ZFADVV(:,:,:) = -DYF(FYM( PRM(:,:,:,JRR),PRVCT(:,:,:) ) ) - ZFADVW(:,:,:) = -DZF(1,IKU,1,FZM( PRM(:,:,:,JRR),PRWCT(:,:,:) ) ) + ZFADVW(:,:,:) = -DZF(FZM( PRM(:,:,:,JRR),PRWCT(:,:,:) ) ) ! PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) + ZFADVU(:,:,:) + ZFADVV(:,:,:) + & ZFADVW(:,:,:) @@ -321,7 +319,7 @@ irx(7) = NBUDGET_RH ZFADVV(:,:,:) = ZFADVV(:,:,:) + ZFADV(:,:,:) PRRS(:,:,:,JRR) = PRRS(:,:,:,JRR) + ZFADV(:,:,:) ! - ZFADV(:,:,:) = -DZF(1,IKU,1,FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) + ZFADV(:,:,:) = -DZF(FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. @@ -356,7 +354,7 @@ irx(7) = NBUDGET_RH ZRVARS(:,:,:) = PRTKES(:,:,:) ZFADVU(:,:,:) = -DXF(FXM( PTKEM(:,:,:),PRUCT(:,:,:) ) ) ZFADVV(:,:,:) = -DYF(FYM( PTKEM(:,:,:),PRVCT(:,:,:) ) ) - ZFADVW(:,:,:) = -DZF(1,IKU,1,FZM( PTKEM(:,:,:),PRWCT(:,:,:) ) ) + ZFADVW(:,:,:) = -DZF(FZM( PTKEM(:,:,:),PRWCT(:,:,:) ) ) ! PRTKES(:,:,:) = PRTKES(:,:,:) + ZFADVU(:,:,:) + ZFADVV(:,:,:) + ZFADVW(:,:,:) ! @@ -388,7 +386,7 @@ irx(7) = NBUDGET_RH ZFADVV(:,:,:) = ZFADVV(:,:,:) + ZFADV(:,:,:) PRTKES(:,:,:) = PRTKES(:,:,:) + ZFADV(:,:,:) ! - ZFADV(:,:,:) = -DZF(1,IKU,1,FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) + ZFADV(:,:,:) = -DZF(FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. diff --git a/src/MNH/mpdata_scalar.f90 b/src/MNH/mpdata_scalar.f90 index d75869bfe09493031248db18ead866b6727ac0ef..7b5014cc9d8b41c2adefb2f231626c773a2f4458 100644 --- a/src/MNH/mpdata_scalar.f90 +++ b/src/MNH/mpdata_scalar.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. @@ -144,7 +144,6 @@ INTEGER :: JSV ! Loop index for Scalar Variables ! INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE ! End useful area in x,y,z directions -INTEGER:: IKU ! REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: ZGUESS ! Guess ! variable (to be removed in the future !) @@ -170,7 +169,6 @@ NULLIFY(TZFIELDS_ll) !* 0. PROLOGUE ! CALL GET_PHYSICAL_ll(IIB,IJB,IIE,IJE) -IKU=SIZE(PSVM,3) ! ! !------------------------------------------------------------------------------- @@ -183,7 +181,7 @@ IKU=SIZE(PSVM,3) ZRVARS(:,:,:) = PRSVS(:,:,:,JSV) ZFADVU(:,:,:) = -DXF(FXM( PSVM(:,:,:,JSV),PRUCT(:,:,:) ) ) ZFADVV(:,:,:) = -DYF(FYM( PSVM(:,:,:,JSV),PRVCT(:,:,:) ) ) - ZFADVW(:,:,:) = -DZF(1,IKU,1,FZM( PSVM(:,:,:,JSV),PRWCT(:,:,:) ) ) + ZFADVW(:,:,:) = -DZF(FZM( PSVM(:,:,:,JSV),PRWCT(:,:,:) ) ) ! PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) + ZFADVU(:,:,:) + ZFADVV(:,:,:) + & ZFADVW(:,:,:) @@ -222,7 +220,7 @@ IKU=SIZE(PSVM,3) ZFADVV(:,:,:) = ZFADVV(:,:,:) + ZFADV(:,:,:) PRSVS(:,:,:,JSV) = PRSVS(:,:,:,JSV) + ZFADV(:,:,:) ! - ZFADV(:,:,:) = -DZF(1,IKU,1,FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) + ZFADV(:,:,:) = -DZF(FZM( ZGUESS(:,:,:),ZRAWCT(:,:,:) ) ) IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIB,:,:)=0. IF(LEAST_ll() .AND. HLBCX(1) /= 'CYCL') ZFADV(IIE,:,:)=0. IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZFADV(:,IJB,:)=0. diff --git a/src/MNH/num_diff.f90 b/src/MNH/num_diff.f90 index 011ca0d61b018d4b7b65eafc7355741a784fc4e7..65c221c739d179b1116501ac1ce8fe9700be733a 100644 --- a/src/MNH/num_diff.f90 +++ b/src/MNH/num_diff.f90 @@ -284,7 +284,6 @@ INTEGER :: JRR ! Loop index for moist variables INTEGER :: JSV ! Loop index for Scalar Variables INTEGER:: IIB,IJB ! Begining useful area in x,y directions INTEGER:: IIE,IJE ! End useful area in x,y directions -INTEGER :: IKU ! LOGICAL :: GTKEALLOC ! true if TKE arrays are not zero-sized ! @@ -298,7 +297,6 @@ INTEGER :: IGRID ! localisation on the model grid !* 1. COMPUTES THE DOMAIN DIMENSIONS ! ------------------------------ CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) -IKU=SIZE(PUM,3) ! GTKEALLOC = SIZE(PTKEM,1) /= 0 @@ -359,10 +357,10 @@ IF (ONUMDIFU) THEN !!$ IF(NHALO == 1) THEN TZHALO2LIST => TZHALO2LIST%NEXT TZHALO2LSLIST => TZHALO2LSLIST%NEXT - CALL NUM_DIFF_ALGO(PRWS, PWM, IGRID, MZM(1,IKU,1,PRHODJ), PDK2U, PDK4U, & + CALL NUM_DIFF_ALGO(PRWS, PWM, IGRID, MZM(PRHODJ), PDK2U, PDK4U, & PLSWM, TZHALO2LIST%HALO2, TZHALO2LSLIST%HALO2) !!$ ELSE -!!$ CALL NUM_DIFF_ALGO(PRWS, PWM, IGRID, MZM(1,IKU,1,PRHODJ), PDK2U, PDK4U, PLSWM ) +!!$ CALL NUM_DIFF_ALGO(PRWS, PWM, IGRID, MZM(PRHODJ), PDK2U, PDK4U, PLSWM ) !!$ ENDIF ENDIF ! diff --git a/src/MNH/paspol.f90 b/src/MNH/paspol.f90 index e214de60144c967b3d356aa504ec4de67c0f1ef4..98c8c94d7ed67137cfe26cdc5384df2984f11fe3 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 8aedbaf47db9ef36d58ad2174699671c1b7044f0..5354a0b37b7315f50fbf5750dd3c3320dbcbf75b 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 @@ -260,12 +261,14 @@ USE MODD_CURVCOR_n USE MODD_DEEP_CONVECTION_n USE MODD_DEF_EDDY_FLUX_n ! Ajout PP USE MODD_DEF_EDDYUV_FLUX_n ! Ajout PP -USE MODD_DRAGTREE +USE MODD_DRAGBLDG_n +USE MODD_DRAGTREE_n USE MODD_DUST USE MODD_DYN USE MODD_DYN_n USE MODD_FIELD_n USE MODD_FRC +USE MODD_FRC_n USE MODD_GRID USE MODD_GRID_n USE MODD_ICE_C1R3_DESCR, ONLY : XRTMIN_C1R3=>XRTMIN @@ -320,6 +323,7 @@ USE MODE_SALT_PSD USE MODI_AEROZON ! Ajout PP USE MODI_CONDSAMP USE MODI_CONVECTION +USE MODI_DRAG_BLD USE MODI_DRAG_VEG USE MODI_DUST_FILTER USE MODI_EDDY_FLUX_n ! Ajout PP @@ -736,6 +740,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, XRRS,XRSVS) +IF (LDRAGTREE) CALL DRAG_VEG( XTSTEP, XUT, XVT, XTKET, LDEPOTREE, XVDEPOTREE, & + CCLOUD, XPABST, XTHT, XRT, XSVT, XRHODJ, XZZ, & + XRUS, XRVS, XRTKES, 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/ppm.f90 b/src/MNH/ppm.f90 index caec0f6ca9d4c1bf5b57a0aa6bcafd7b3c290bc0..367925a30a35124a1c71b40998c470bf44661c09 100644 --- a/src/MNH/ppm.f90 +++ b/src/MNH/ppm.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2018 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! Modifications: @@ -1083,7 +1083,6 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR ! INTEGER:: IKB ! Begining useful area in x,y,z directions INTEGER:: IKE ! End useful area in x,y,z directions -INTEGER:: IKU ! ! terms used in parabolic interpolation, dmq, qL, qR, dq, q6 REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZQL,ZQR @@ -1103,7 +1102,6 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG ! IKB = 1 + JPVEXT IKE = SIZE(PSRC,3) - JPVEXT -IKU = SIZE(PSRC,3) ! !------------------------------------------------------------------------------- ! @@ -1196,7 +1194,7 @@ ZFNEG(:,:,IKE+1) = (ZQR(:,:,IKE)-PSRC(:,:,IKE+1))*PCR(:,:,IKE+1) + & ! ! advect the actual field in Z direction by W*dt ! -PR = DZF(1,IKU,1, PCR*MZM(1,IKU,1,PRHO)*( ZFPOS*(0.5+SIGN(0.5,PCR)) + & +PR = DZF( PCR*MZM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,PCR)) + & ZFNEG*(0.5-SIGN(0.5,PCR)) ) ) !Unnecessary CALL GET_HALO(PR) ! @@ -1846,7 +1844,6 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR ! INTEGER:: IKB ! Begining useful area in x,y,z directions INTEGER:: IKE ! End useful area in x,y,z directions -INTEGER:: IKU ! ! advection fluxes REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG @@ -1861,7 +1858,6 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZPHAT ! IKB = 1 + JPVEXT IKE = SIZE(PSRC,3) - JPVEXT -IKU = SIZE(PSRC,3) ! !------------------------------------------------------------------------------- ! @@ -1917,7 +1913,7 @@ ZFNEG(:,:,IKE+1) = (ZPHAT(:,:,IKE+1) - PSRC(:,:,IKE+1))*PCR(:,:,IKE+1) + & ! calculate the advection ! PR = PSRC * PRHO - & - DZF(1,IKU,1, PCR*MZM(1,IKU,1,PRHO)*( ZFPOS(:,:,:)*(0.5+SIGN(0.5,PCR)) + & + DZF( PCR*MZM(PRHO)*( ZFPOS(:,:,:)*(0.5+SIGN(0.5,PCR)) + & ZFNEG*(0.5-SIGN(0.5,PCR)) ) ) ! ! in OPEN case fix boundary conditions @@ -2481,7 +2477,6 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR ! INTEGER:: IIB,IJB,IKB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE,IKE ! End useful area in x,y,z directions -INTEGER:: IKU ! ! variable at cell edges REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZPHAT, ZRVT @@ -2507,11 +2502,10 @@ INTEGER :: II, IJ, IK CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IKB = 1 + JPVEXT IKE = SIZE(PSRC,3) - JPVEXT -IKU = SIZE(PSRC,3) ! !------------------------------------------------------------------------------- ! -ZRVT = PCR/PTSTEP * MZM(1,IKU,1,PRHO) +ZRVT = PCR/PTSTEP * MZM(PRHO) ! ! calculate 4th order fluxes at cell edges in the inner domain ! ZPHAT(:,:,IKB+1:IKE) = (7.0 * & @@ -2618,7 +2612,7 @@ END WHERE ! ! 1. calculate upwind tendency of the source ! -PR = PSRC*PRHO - PTSTEP*DZF(1,IKU,1,ZFUP) +PR = PSRC*PRHO - PTSTEP*DZF(ZFUP) ! !------------------------------------------------------------------------------- ! compute and apply the limiters @@ -2746,7 +2740,7 @@ ZFCOR(:,:,IKB-1) = MIN( & !------------------------------------------------------------------------------- ! 6. apply the limited flux correction to scalar field ! -PR = PR - PTSTEP*DZF(1,IKU,1,ZFCOR) +PR = PR - PTSTEP*DZF(ZFCOR) ! ! END FUNCTION PPM_S1_Z diff --git a/src/MNH/prandtl.f90 b/src/MNH/prandtl.f90 index 10f5dcf7e3a5f8129616c61d35ea0665f508a124..fea5db344bfedb51513f1270ce89dd2c9146971a 100644 --- a/src/MNH/prandtl.f90 +++ b/src/MNH/prandtl.f90 @@ -282,8 +282,8 @@ IKB = KKA+JPVEXT_TURB*KKL IKE = KKU-JPVEXT_TURB*KKL ISV =SIZE(PSVM,4) ! -PETHETA(:,:,:) = MZM(KKA,KKU,KKL, ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) ) -PEMOIST(:,:,:) = MZM(KKA,KKU,KKL, EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) ) +PETHETA(:,:,:) = MZM( ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) ) +PEMOIST(:,:,:) = MZM( EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) ) PETHETA(:,:,KKA) = 2.*PETHETA(:,:,IKB) - PETHETA(:,:,IKB+KKL) PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL) ! @@ -291,7 +291,7 @@ PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL) ! ! 1.3 1D Redelsperger numbers ! -PBLL_O_E(:,:,:) = MZM(KKA,KKU,KKL, XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:) ) +PBLL_O_E(:,:,:) = MZM( XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:) ) IF (KRR /= 0) THEN ! moist case PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * & & GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) @@ -375,22 +375,22 @@ ELSE IF (L2D) THEN ! 3D case in a 2D model ! IF (KRR /= 0) THEN ! moist 3D case PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)**2 ) + MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 ) PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) ! PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 ) + MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 ) PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) ! PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)) + MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX)) PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) ! ELSE ! dry 3D case in a 2D model PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)**2 ) + MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 ) PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) ! PRED2R3(:,:,:) = 0. @@ -403,27 +403,27 @@ ELSE ! 3D case in a 3D model ! IF (KRR /= 0) THEN ! moist 3D case PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 + ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)**2 & - + GY_M_M(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY)**2 ) + MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY)**2 ) PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) ! PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 + & - GY_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDYY,PDZZ,PDZY)**2 ) + MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 + & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)**2 ) PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) ! PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)+ & - GY_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDYY,PDZZ,PDZY)* & - GY_M_M(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY) ) + MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX)+ & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)* & + GY_M_M(PTHLM,PDYY,PDZZ,PDZY) ) PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) ! ELSE ! dry 3D case in a 3D model PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM(KKA,KKU,KKL, GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)**2 & - + GY_M_M(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY)**2 ) + MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY)**2 ) PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) ! PRED2R3(:,:,:) = 0. @@ -454,21 +454,21 @@ ELSE IF (L2D) THEN ! 3D case in a 2D model ! DO JSV=1,ISV IF (KRR /= 0) THEN - ZW1 = MZM(KKA,KKU,KKL, (XG / PTHVREF * PLM * PLEPS / PTKEM)**2 ) *PETHETA + ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2 ) *PETHETA ELSE - ZW1 = MZM(KKA,KKU,KKL, (XG / PTHVREF * PLM * PLEPS / PTKEM)**2) + ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2) END IF PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & ZW1* & - MZM(KKA,KKU,KKL,GX_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX) & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX) & ) ! IF (KRR /= 0) THEN PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & ZW1 * PEMOIST * & - MZM(KKA,KKU,KKL,GX_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX) & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & + GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) & ) ELSE PRED2RS3(:,:,:,JSV) = 0. @@ -479,25 +479,25 @@ ELSE ! 3D case in a 3D model ! DO JSV=1,ISV IF (KRR /= 0) THEN - ZW1 = MZM(KKA,KKU,KKL, (XG / PTHVREF * PLM * PLEPS / PTKEM)**2 ) *PETHETA + ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2 ) *PETHETA ELSE - ZW1 = MZM(KKA,KKU,KKL, (XG / PTHVREF * PLM * PLEPS / PTKEM)**2) + ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2) END IF PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & ZW1* & - MZM(KKA,KKU,KKL,GX_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX) & - +GY_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)* & - GY_M_M(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY) & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX) & + +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)* & + GY_M_M(PTHLM,PDYY,PDZZ,PDZY) & ) ! IF (KRR /= 0) THEN PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & ZW1 * PEMOIST * & - MZM(KKA,KKU,KKL,GX_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX) & - +GY_M_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)* & - GY_M_M(KKA,KKU,KKL,PRM(:,:,:,1),PDYY,PDZZ,PDZY) & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & + GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) & + +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)* & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY) & ) ELSE PRED2RS3(:,:,:,JSV) = 0. diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90 index 450c4928b2467b5785470c12f122526e12278e3c..e0fff03f797676f343c3a395d29916e95f7e1241 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/pressure.f90 b/src/MNH/pressure.f90 index b64d1d913590da9ae17381cad6a7dc986ec01aae..2dd585ee40ddeef33cea5c54e5c0646bf3c5e2ab 100644 --- a/src/MNH/pressure.f90 +++ b/src/MNH/pressure.f90 @@ -514,10 +514,10 @@ END IF ! IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN PRUS = PRUS - MXM(PRHODJ * XCPD * ZTHETAV) * ZDV_SOURCE - PRWS = PRWS - MZM(1,IKU,1,PRHODJ * XCPD * ZTHETAV) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) + PRWS = PRWS - MZM(PRHODJ * XCPD * ZTHETAV) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) ELSEIF(CEQNSYS=='LHE') THEN PRUS = PRUS - MXM(PRHODJ) * ZDV_SOURCE - PRWS = PRWS - MZM(1,IKU,1,PRHODJ) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) + PRWS = PRWS - MZM(PRHODJ) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) END IF ! IF(.NOT. L2D) THEN diff --git a/src/MNH/pressure_in_prep.f90 b/src/MNH/pressure_in_prep.f90 index e012d515b828652f664356a845921c11fd663e38..6219e352f27f06e8a418d8073fdd8aed4031802d 100644 --- a/src/MNH/pressure_in_prep.f90 +++ b/src/MNH/pressure_in_prep.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. @@ -117,9 +117,6 @@ REAL,DIMENSION(SIZE(PDXX,1),SIZE(PDXX,2),SIZE(PDXX,3)):: ZDIV ! residual diverge !* file management variables and counters ! INTEGER :: ILUOUT0 ! logical unit for listing file -INTEGER :: IRESP ! error code -INTEGER :: IKB, IKE ! inner limits in Z direction -INTEGER :: IKU INTEGER :: IINFO_ll REAL :: ZMAXRES TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange @@ -133,10 +130,6 @@ INTEGER :: I,J,K ! ILUOUT0 = TLUOUT0%NLU ! -IKB=1+JPVEXT -IKE=NKMAX+JPVEXT -IKU=IKE+JPVEXT -! ZU(:,:,:) = XUT(:,:,:) ZV(:,:,:) = XVT(:,:,:) ZW(:,:,:) = XWT(:,:,:) @@ -192,7 +185,7 @@ CALL MPPDB_CHECK3D(XVT,"PressInP4-beforeupdhalo::XVT",PRECISION) ! ZRU(:,:,:) = XUT(:,:,:) * MXM(XRHODJ) ZRV(:,:,:) = XVT(:,:,:) * MYM(XRHODJ) - ZRW(:,:,:) = XWT(:,:,:) * MZM(1,IKU,1,XRHODJ) + ZRW(:,:,:) = XWT(:,:,:) * MZM(XRHODJ) ! CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRU, 'PRESSURE_IN_PREP::ZRU' ) CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRV, 'PRESSURE_IN_PREP::ZRV' ) diff --git a/src/MNH/pressurez.f90 b/src/MNH/pressurez.f90 index 87fc7063ade94b65b7633a5642cb199494aedd39..c015ab250313a97dca40978a587656cc6af99196 100644 --- a/src/MNH/pressurez.f90 +++ b/src/MNH/pressurez.f90 @@ -574,10 +574,10 @@ END IF CALL MPPDB_CHECK3DM("before MXM PRESSUREZ :PRU/V/WS",PRECISION,PRUS,PRVS,PRWS) IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN PRUS = PRUS - MXM(PRHODJ * XCPD * ZTHETAV) * ZDV_SOURCE - PRWS = PRWS - MZM(1,IKU,1,PRHODJ * XCPD * ZTHETAV) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) + PRWS = PRWS - MZM(PRHODJ * XCPD * ZTHETAV) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) ELSEIF(CEQNSYS=='LHE') THEN PRUS = PRUS - MXM(PRHODJ) * ZDV_SOURCE - PRWS = PRWS - MZM(1,IKU,1,PRHODJ) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) + PRWS = PRWS - MZM(PRHODJ) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) END IF ! IF(.NOT. L2D) THEN diff --git a/src/MNH/qlap.f90 b/src/MNH/qlap.f90 index 75f8c728fd2b2ac86cdd9ae57f907c2bf1752207..d4da491d97bc6c716267088375a88a11fbeac7cc 100644 --- a/src/MNH/qlap.f90 +++ b/src/MNH/qlap.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. @@ -236,13 +236,13 @@ IF ( CEQNSYS == 'DUR' .OR. CEQNSYS == 'MAE' ) THEN IF(.NOT. L2D) THEN ZV = MYM(PRHODJ * XCPD * PTHETAV) * ZV END IF - ZW = MZM(1,IKU,1,PRHODJ * XCPD * PTHETAV) * GZ_M_W(1,IKU,1,PY,PDZZ) + ZW = MZM(PRHODJ * XCPD * PTHETAV) * GZ_M_W(1,IKU,1,PY,PDZZ) ELSEIF ( CEQNSYS == 'LHE' ) THEN ZU = MXM(PRHODJ) * ZU IF(.NOT. L2D) THEN ZV = MYM(PRHODJ) * ZV ENDIF - ZW = MZM(1,IKU,1,PRHODJ) * GZ_M_W(1,IKU,1,PY,PDZZ) + ZW = MZM(PRHODJ) * GZ_M_W(1,IKU,1,PY,PDZZ) END IF ! !------------------------------------------------------------------------------- diff --git a/src/MNH/rain_ice_elec.f90 b/src/MNH/rain_ice_elec.f90 index 45a43609c93f47256fe45a4a0076a6772f7ad995..22cd95ed46790ff6e3a8d54200c817e274ea9490 100644 --- a/src/MNH/rain_ice_elec.f90 +++ b/src/MNH/rain_ice_elec.f90 @@ -680,7 +680,9 @@ IF (IMICRO > 0) THEN ! IF (LBU_ENABLE .OR. LLES_CALL) THEN ALLOCATE(ZRHODJ(IMICRO)) - ZRHODJ(:) = PACK( PRHODJ(:,:,:),MASK=GMICRO(:,:,:) ) + DO JL=1,IMICRO + ZRHODJ(JL) = PRHODJ(I1(JL),I2(JL),I3(JL)) + END DO END IF ! ALLOCATE( ZECT(IMICRO) ) @@ -915,47 +917,38 @@ IF (IMICRO > 0) THEN ! !* 8.1 Update the mixing ratio ! - ZW(:,:,:) = PRVS(:,:,:) - PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PRCS(:,:,:) - PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PRRS(:,:,:) - PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PRIS(:,:,:) - PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PRSS(:,:,:) - PRSS(:,:,:) = UNPACK( ZRSS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PRGS(:,:,:) - PRGS(:,:,:) = UNPACK( ZRGS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + DO JL=1,IMICRO + PRVS(I1(JL),I2(JL),I3(JL)) = ZRVS(JL) + PRCS(I1(JL),I2(JL),I3(JL)) = ZRCS(JL) + PRRS(I1(JL),I2(JL),I3(JL)) = ZRRS(JL) + PRIS(I1(JL),I2(JL),I3(JL)) = ZRIS(JL) + PRSS(I1(JL),I2(JL),I3(JL)) = ZRSS(JL) + PRGS(I1(JL),I2(JL),I3(JL)) = ZRGS(JL) + PTHS(I1(JL),I2(JL),I3(JL)) = ZTHS(JL) + PCIT(I1(JL),I2(JL),I3(JL)) = ZCIT(JL) + END DO IF ( KRR == 7 ) THEN - ZW(:,:,:) = PRHS(:,:,:) - PRHS(:,:,:) = UNPACK( ZRHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + DO JL=1,IMICRO + PRHS(I1(JL),I2(JL),I3(JL)) = ZRHS(JL) + END DO END IF - ZW(:,:,:) = PTHS(:,:,:) - PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PCIT(:,:,:) - PCIT(:,:,:) = UNPACK( ZCIT(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) ! ! !* 8.2 Compute the volumetric charge concentration ! - ZW(:,:,:) = PQPIS(:,:,:) - PQPIS(:,:,:) = UNPACK( ZQPIS(:), MASK=GMICRO(:,:,:), FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PQNIS(:,:,:) - PQNIS(:,:,:) = UNPACK( ZQNIS(:), MASK=GMICRO(:,:,:), FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PQCS(:,:,:) - PQCS(:,:,:) = UNPACK( ZQCS(:), MASK=GMICRO(:,:,:), FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PQRS(:,:,:) - PQRS(:,:,:) = UNPACK( ZQRS(:), MASK=GMICRO(:,:,:), FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PQIS(:,:,:) - PQIS(:,:,:) = UNPACK( ZQIS(:), MASK=GMICRO(:,:,:), FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PQSS(:,:,:) - PQSS(:,:,:) = UNPACK( ZQSS(:), MASK=GMICRO(:,:,:), FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PQGS(:,:,:) - PQGS(:,:,:) = UNPACK( ZQGS(:), MASK=GMICRO(:,:,:), FIELD=ZW(:,:,:) ) + DO JL=1,IMICRO + PQPIS(I1(JL),I2(JL),I3(JL)) = ZQPIS(JL) + PQNIS(I1(JL),I2(JL),I3(JL)) = ZQNIS(JL) + PQCS (I1(JL),I2(JL),I3(JL)) = ZQCS(JL) + PQRS (I1(JL),I2(JL),I3(JL)) = ZQRS(JL) + PQIS (I1(JL),I2(JL),I3(JL)) = ZQIS(JL) + PQSS (I1(JL),I2(JL),I3(JL)) = ZQSS(JL) + PQGS (I1(JL),I2(JL),I3(JL)) = ZQGS(JL) + END DO IF ( KRR == 7 ) THEN - ZW(:,:,:) = PQHS(:,:,:) - PQHS(:,:,:) = UNPACK( ZQHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + DO JL=1,IMICRO + PQHS(I1(JL),I2(JL),I3(JL)) = ZQHS(JL) + END DO END IF ! ! diff --git a/src/MNH/rain_ice_red.f90 b/src/MNH/rain_ice_red.f90 index 2b60d5375302a820e69ecd3cd74bb13534f434d5..246d4f51c49654e695b4910176926b630e3e19a0 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 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 02/2020: use the new data structures and subroutines for budgets +! P. Wautelet 25/02/2020: bugfix: add missing budget: WETH_BU_RRG !----------------------------------------------------------------- ! !* 0. DECLARATIONS 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/rel_forcingn.f90 b/src/MNH/rel_forcingn.f90 index 47c25af9c5f31c2f4108e0c0c23d228fe6426995..f53bda4deefcb13f725698f7614d542202faa6ba 100644 --- a/src/MNH/rel_forcingn.f90 +++ b/src/MNH/rel_forcingn.f90 @@ -143,7 +143,6 @@ REAL, DIMENSION(SIZE(PRTHS,1),SIZE(PRTHS,2),SIZE(PRTHS,3)) :: ZXADVTHFRC,ZXADVRV REAL, DIMENSION(SIZE(PRTHS,1),SIZE(PRTHS,2),SIZE(PRTHS,3)) :: ZTHREL,ZRVREL LOGICAL,DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: GRELAX_MASK_FRC ! MAsk for relaxation REAL :: ZRELAX_HEIGHT_TOP,ZRELAX_HEIGHT_BOT, ZRELAX_TIME -INTEGER :: IKU !---------------------------------------------------------------------------- ! @@ -153,8 +152,6 @@ INTEGER :: IKU if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), '2DREL', prths(:, :, :) ) if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_TH), '2DREL', prrs (:, :, :, 1) ) -IKU = SIZE(PTHM,3) - IF (GSFIRSTCALL) THEN ! GSFIRSTCALL = .FALSE. @@ -237,7 +234,7 @@ END IF ! Corresponds to CASE=FIXE of forcing.f90 ! GRELAX_MASK_FRC(:,:,:) = .TRUE. - WHERE ((MZF(1,IKU,1,PZZ).LT.ZRELAX_HEIGHT_BOT).OR.(MZF(1,IKU,1,PZZ).GT.ZRELAX_HEIGHT_TOP)) + WHERE ((MZF(PZZ).LT.ZRELAX_HEIGHT_BOT).OR.(MZF(PZZ).GT.ZRELAX_HEIGHT_TOP)) GRELAX_MASK_FRC = .FALSE. END WHERE ! diff --git a/src/MNH/relaxation.f90 b/src/MNH/relaxation.f90 index b75529537a2040f901f9c6f75bb0cdae7a1b3d91..8c3a844ceaa2a10a34897ace6db0a837bf08aa93 100644 --- a/src/MNH/relaxation.f90 +++ b/src/MNH/relaxation.f90 @@ -467,7 +467,7 @@ end if ZRHODJU(:,:,:) = MXM(PRHODJ) ZRHODJV(:,:,:) = MYM(PRHODJ) -ZRHODJW(:,:,:) = MZM(1,IKU,1,PRHODJ) +ZRHODJW(:,:,:) = MZM(PRHODJ) ! GHORELAXR(1) = OHORELAX_RV GHORELAXR(2) = OHORELAX_RC 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 7f920b09eb3faf6e3266ebf57719c44a01e4667e..74d9c92f79043d5b3014d8a8fe8166fed8844a6e 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -267,7 +267,10 @@ END MODULE MODI_RESOLVED_CLOUD ! P. 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) ! C. Lac 02/2019: add rain fraction as an output field +! P. Wautelet 24/02/2020: bugfix: corrected budget name (DEPI->CDEPI) for ice_adjust ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -288,7 +291,7 @@ USE MODD_NSV, ONLY: NSV_C1R3END, NSV_C2R2BEG, NSV_C2R2END, USE MODD_PARAM_C2R2, ONLY: LSUPSAT USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_PARAM_ICE, ONLY: CSEDIM, LADJ_BEFORE, LADJ_AFTER, CFRAC_ICE_ADJUST, LRED -USE MODD_PARAM_LIMA, ONLY: LCOLD, XCONC_CCN_TOT, NMOD_CCN, NMOD_IFN, NMOD_IMM, LPTSPLIT, & +USE MODD_PARAM_LIMA, ONLY: LCOLD, LRAIN, LWARM, XCONC_CCN_TOT, NMOD_CCN, NMOD_IFN, NMOD_IMM, LPTSPLIT, & YRTMIN=>XRTMIN, YCTMIN=>XCTMIN USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN USE MODD_SALT, ONLY: LSALT @@ -760,7 +763,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(:,:,:) @@ -934,7 +937,7 @@ SELECT CASE ( HCLOUD ) DO JK=IKB,IKE ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) ENDDO - ZZZ = MZF(1,IKU,1, PZZ ) + ZZZ = MZF( PZZ ) IF(LRED .AND. LADJ_BEFORE) THEN CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'ADJU', & OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT, & @@ -1013,7 +1016,7 @@ SELECT CASE ( HCLOUD ) DO JK=IKB,IKE ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) ENDDO - ZZZ = MZF(1,IKU,1, PZZ ) + ZZZ = MZF( PZZ ) IF(LRED .AND. LADJ_BEFORE) THEN CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'ADJU', & OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT, & @@ -1099,14 +1102,14 @@ SELECT CASE ( HCLOUD ) DO JK=IKB,IKE ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) ENDDO - ZZZ = MZF(1,IKU,1, PZZ ) + ZZZ = MZF( PZZ ) IF (LPTSPLIT) THEN CALL LIMA (1, IKU, 1, & PTSTEP, TPFILE, OCLOSE_OUT, & 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 ) @@ -1115,7 +1118,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 ) @@ -1170,14 +1173,96 @@ IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN ENDWHERE ENDIF ENDIF + +if (lbudget_th) call Budget_store_init( tbudgets(NBUDGET_TH), 'NECON', pths(:, :, :) * prhodj(:, :, :) ) +if (lbudget_rv) call Budget_store_init( tbudgets(NBUDGET_RV), 'NECON', prs (:, :, :, 1) * prhodj(:, :, :) ) +if (lbudget_rc) call Budget_store_init( tbudgets(NBUDGET_RC), 'NECON', prs (:, :, :, 2) * prhodj(:, :, :) ) +if (lbudget_rr) call Budget_store_init( tbudgets(NBUDGET_RR), 'NECON', prs (:, :, :, 3) * prhodj(:, :, :) ) +if (lbudget_ri) call Budget_store_init( tbudgets(NBUDGET_RI), 'NECON', prs (:, :, :, 4) * prhodj(:, :, :) ) +if (lbudget_rs) call Budget_store_init( tbudgets(NBUDGET_RS), 'NECON', prs (:, :, :, 5) * prhodj(:, :, :) ) +if (lbudget_rg) call Budget_store_init( tbudgets(NBUDGET_RG), 'NECON', prs (:, :, :, 6) * prhodj(:, :, :) ) +if (lbudget_rh) call Budget_store_init( tbudgets(NBUDGET_RH), 'NECON', prs (:, :, :, 7) * prhodj(:, :, :) ) +if ( lbudget_sv .and. hcloud == 'LIMA' ) then + if ( lwarm ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'NECON', & + psvs(:, :, :, nsv_lima_nc) * prhodj(:, :, :) ) + if ( lwarm .and. lrain ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'NECON',& + psvs(:, :, :, nsv_lima_nr) * prhodj(:, :, :) ) + if ( lcold ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'NECON', & + psvs(:, :, :, nsv_lima_ni) * prhodj(:, :, :) ) + do ji = nsv_lima_ccn_free, nsv_lima_ccn_free + nmod_ccn - 1 + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), 'NECON', psvs(:, :, :, ji) * prhodj(:, :, :) ) + end do + do ji = nsv_lima_ifn_free, nsv_lima_ifn_free + nmod_ifn - 1 + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), 'NECON', psvs(:, :, :, ji) * prhodj(:, :, :) ) + end do +end if + +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 +! ! -IF ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') ) THEN - if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'NECON', pths(:, :, :) ) - if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'NECON', prs (:, :, :, 1) ) - if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'NECON', prs (:, :, :, 2) ) -! CALL GET_HALO(PRS(:,:,:,2)) -! CALL GET_HALO(ZSVS(:,:,:,2)) -! CALL GET_HALO(ZSVS(:,:,:,3)) +! 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 @@ -1190,7 +1275,75 @@ IF ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') ) THEN ZSVS(:,:,:,JSV) = 0.0 END WHERE ENDDO -END IF +! + 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 !------------------------------------------------------------------------------- ! ! @@ -1214,12 +1367,26 @@ IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') DEALLOCATE(ZSVT) ENDIF -IF ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') ) THEN - if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'NECON', pths(:, :, :) ) - if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'NECON', prs (:, :, :, 1) ) - if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'NECON', prs (:, :, :, 2) ) -END IF -! +if (lbudget_th) call Budget_store_init( tbudgets(NBUDGET_TH), 'NECON', pths(:, :, :) ) +if (lbudget_rv) call Budget_store_init( tbudgets(NBUDGET_RV), 'NECON', prs (:, :, :, 1) ) +if (lbudget_rc) call Budget_store_init( tbudgets(NBUDGET_RC), 'NECON', prs (:, :, :, 2) ) +if (lbudget_rr) call Budget_store_init( tbudgets(NBUDGET_RR), 'NECON', prs (:, :, :, 3) ) +if (lbudget_ri) call Budget_store_init( tbudgets(NBUDGET_RI), 'NECON', prs (:, :, :, 4) ) +if (lbudget_rs) call Budget_store_init( tbudgets(NBUDGET_RS), 'NECON', prs (:, :, :, 5) ) +if (lbudget_rg) call Budget_store_init( tbudgets(NBUDGET_RG), 'NECON', prs (:, :, :, 6) ) +if (lbudget_rh) call Budget_store_init( tbudgets(NBUDGET_RH), 'NECON', prs (:, :, :, 7) ) +if ( lbudget_sv .and. hcloud == 'LIMA' ) then + if ( lwarm ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'NECON', psvs(:, :, :, nsv_lima_nc) ) + if ( lwarm .and. lrain ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'NECON', psvs(:, :, :, nsv_lima_nr) ) + if ( lcold ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'NECON', psvs(:, :, :, nsv_lima_ni) ) + do ji = nsv_lima_ccn_free, nsv_lima_ccn_free + nmod_ccn - 1 + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), 'NECON', psvs(:, :, :, ji) ) + end do + do ji = nsv_lima_ifn_free, nsv_lima_ifn_free + nmod_ifn - 1 + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), 'NECON', psvs(:, :, :, ji) ) + end do +end if + !------------------------------------------------------------------------------- ! END SUBROUTINE RESOLVED_CLOUD diff --git a/src/MNH/resolved_elecn.f90 b/src/MNH/resolved_elecn.f90 index a19e05f5c7fd3cb17481c7d72f9e0c5e126c0d40..1d5ed7d83b2cdc42b71989d8fb197d9cf586fed9 100644 --- a/src/MNH/resolved_elecn.f90 +++ b/src/MNH/resolved_elecn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2009-2019 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 for details. version 1. @@ -303,7 +303,6 @@ INTEGER :: IJB ! INTEGER :: IJE ! INTEGER :: IKB ! INTEGER :: IKE ! -INTEGER :: IKU INTEGER :: IINFO_ll ! return code of parallel routine INTEGER :: IPROC ! my proc number INTEGER :: IERR ! error status @@ -375,7 +374,6 @@ END IF CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IKB = 1 + JPVEXT IKE = SIZE(PZZ,3) - JPVEXT -IKU = SIZE(PZZ,3) ! if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'NEGA', pths(:, :, :) ) if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'NEGA', prs (:, :, :, 1) ) @@ -718,7 +716,7 @@ SELECT CASE (HCLOUD) ! !* 5.2 Perform the saturation adjustment over cloud ice and cloud water ! - ZZZ = MZF(1,IKU,1, PZZ ) + ZZZ = MZF( PZZ ) CALL ICE_ADJUST_ELEC (KRR, KMI, HRAD, HTURBDIM, & HSCONV, HMF_CLOUD, & OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT, & @@ -782,7 +780,7 @@ SELECT CASE (HCLOUD) ! !* 6.2 Perform the saturation adjustment over cloud ice and cloud water ! - ZZZ = MZF(1,IKU,1, PZZ ) + ZZZ = MZF( PZZ ) CALL ICE_ADJUST_ELEC (KRR, KMI, HRAD, & HTURBDIM, HSCONV, HMF_CLOUD, & OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT, & diff --git a/src/MNH/rmc01.f90 b/src/MNH/rmc01.f90 index 1b7ea4ed868dc53ce650d20c295b96d626092fba..cf77c5033063e8dc4aae3ea2752f02b0b29850de 100644 --- a/src/MNH/rmc01.f90 +++ b/src/MNH/rmc01.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-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$ $Revision$ -! MASDEV4_7 turb 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ################ MODULE MODI_RMC01 ! ################ @@ -144,7 +139,7 @@ IKT=SIZE(PZZ,3) IKTE=IKT-JPVEXT_TURB ! ! altitude of mass points -ZZZ=MZF(KKA,KKU,KKL,PZZ) +ZZZ=MZF(PZZ) ! replace by height of mass points DO JK=1,IKT ZZZ(:,:,JK) = ZZZ(:,:,JK) - PZZ(:,:,IKB) 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_bogus_vortex.f90 b/src/MNH/set_bogus_vortex.f90 index 5f22d60d909fb9459dacea44fab9f59f7a3cce78..b0a881e2813a891df91d13fe47a67a55ccd977c3 100644 --- a/src/MNH/set_bogus_vortex.f90 +++ b/src/MNH/set_bogus_vortex.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2001-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2001-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. @@ -236,7 +236,7 @@ ZRADBOGMAX=ZRADBOGMAX*1000. ! conversion from km to m ! ALLOCATE(ZZHAT3D(1,1,IKU),ZZHATM(1,1,IKU)) ! to compute altitude of mass points ZZHAT3D(1,1,:) = XZHAT(:) -ZZHATM = MZF(1,IKU,1,ZZHAT3D) +ZZHATM = MZF(ZZHAT3D) DEALLOCATE(ZZHAT3D) ! ! Definition de l angle de convergence 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/set_cstn.f90 b/src/MNH/set_cstn.f90 index 3ec1a28b54b6a2220d145c4a2a10c67672baa5b1..986526c82b5fd2812e3c20c9d54300592149a19e 100644 --- a/src/MNH/set_cstn.f90 +++ b/src/MNH/set_cstn.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. @@ -312,7 +312,7 @@ ELSE ZZS_LS(:,:)=ZHEIGHT(1) ENDIF CALL VERT_COORD(LSLEVE,ZZS_LS,ZZS_LS,XLEN1,XLEN2,XZHAT,ZZFLUX_MX) -ZZMASS_MX(:,:,:)=MZF(1,IKU,1,ZZFLUX_MX) +ZZMASS_MX(:,:,:)=MZF(ZZFLUX_MX) ZZMASS_MX(:,:,IKU)=1.5*ZZFLUX_MX(:,:,IKU)-0.5*ZZFLUX_MX(:,:,IKU-1) ! CALL MPPDB_CHECK3D(ZZMASS_MX,"SET_CSTN::ZZMASS_MX",PRECISION) diff --git a/src/MNH/set_geosbal.f90 b/src/MNH/set_geosbal.f90 index ac57ba40c6f88f310f314a0812194805aa23f73e..28e528d8b1fbc1d269681cc40769c4f31e2ed273 100644 --- a/src/MNH/set_geosbal.f90 +++ b/src/MNH/set_geosbal.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2010-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2010-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. @@ -385,11 +385,11 @@ ELSE ! conformal projection ! PCORIOZ(:,:,:) = SPREAD( 2. * XOMEGA * SIN(XLAT(:,:)*ZRADSDG),3,IKU) ZDXX(:,:,:) = MXM( & - MZF(1,IKU,1,SPREAD(SPREAD( 1.+ ZD1*XZHAT(:)/XRADIUS ,1,IIU),2,IJU )) & + MZF(SPREAD(SPREAD( 1.+ ZD1*XZHAT(:)/XRADIUS ,1,IIU),2,IJU )) & * SPREAD( SPREAD(XDXHAT(1:IIU),2,IJU) /XMAP(:,:),3,IKU) ) ! dxx (without orography) ZDYY(:,:,:) = MYM( & - MZF(1,IKU,1,SPREAD(SPREAD( 1.+ ZD1*XZHAT(:)/XRADIUS,1,IIU),2,IJU )) & + MZF(SPREAD(SPREAD( 1.+ ZD1*XZHAT(:)/XRADIUS,1,IIU),2,IJU )) & * SPREAD( SPREAD(XDYHAT(1:IJU),1,IIU) /XMAP(:,:),3,IKU) ) ! dyy (without orography) END IF @@ -648,7 +648,7 @@ ZTHV3D(:,:,:) = SPREAD(SPREAD(PTHVM(:),1,IIU),2,IJU) ! initialize with !* 4. INTERPOLATE THETAV, MR ON MODEL GRID (WITH OROGRAPHY) ! ------------------------------------------------------------ ! -ZZM(:,:,:) = MZF(1,IKU,1,XZZ) ! compute height at mass level +ZZM(:,:,:) = MZF(XZZ) ! compute height at mass level ! of grid with orography ! ZZM(:,:,IKU) = 2. * XZZ(:,:,IKU) - ZZM(:,:,IKU-1) ! extrapolate on IKU mass level diff --git a/src/MNH/set_mass.f90 b/src/MNH/set_mass.f90 index acb2014ea5e5a4223d218ed518acf2f24c58017f..a7b266aaa997e476fbc3fa3d32a820b47f56efbe 100644 --- a/src/MNH/set_mass.f90 +++ b/src/MNH/set_mass.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2010-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2010-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. @@ -331,8 +331,8 @@ ELSE ! conformal projection ZDXX(JI,JJ,JK) = ( 1.+ ZD1*XZHAT(JK)/XRADIUS ) * ( XDXHAT(JI) /XMAP(JI,JJ) ) ! XDXHAT(JI) ZDYY(JI,JJ,JK) = ( 1.+ ZD1*XZHAT(JK)/XRADIUS ) * ( XDYHAT(JJ) /XMAP(JI,JJ) ) ! XDYHAT(JJ) ENDDO ; ENDDO ; ENDDO ; - ZDXX = MXM(MZF(1,IKU,1,ZDXX)) - ZDYY = MYM(MZF(1,IKU,1,ZDYY)) + ZDXX = MXM(MZF(ZDXX)) + ZDYY = MYM(MZF(ZDYY)) END IF ! SELECT CASE(HFUNU) @@ -482,8 +482,8 @@ CALL CLEANLIST_ll(TZFIELDS_ll) ! ! Interpolation of the wind ! - ZRHODU_MX=MZF(1,IKU,1,ZUW3D_FL)*ZRHOD_MX - ZRHODV_MX=MZF(1,IKU,1,ZVW3D_FL)*ZRHOD_MX + ZRHODU_MX=MZF(ZUW3D_FL)*ZRHOD_MX + ZRHODV_MX=MZF(ZVW3D_FL)*ZRHOD_MX CALL MPPDB_CHECK3DM("SET_MASS:ZRHODU_MX,ZRHODV_MX,PZFLUX_MX,PZMASS_MX",PRECISION,& & ZRHODU_MX,ZRHODV_MX,PZFLUX_MX,PZMASS_MX ) CALL VER_INT_DYN(OSHIFT,ZRHODU_MX,ZRHODV_MX,PZFLUX_MX,PZMASS_MX,PZS_MX,ZRHODUA,ZRHODVA) diff --git a/src/MNH/set_refz.f90 b/src/MNH/set_refz.f90 index b8b10b3b75dc9c4f4f69bc0c632c59ebcd3aba6d..f6e82cd85f4e20a2e30627462ed593af03d6d0b8 100644 --- a/src/MNH/set_refz.f90 +++ b/src/MNH/set_refz.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. @@ -174,7 +174,7 @@ IKE=IKU-JPVEXT !* 2. ALTITUDE OF THE MASS POINTS ! --------------------------- ! -ZZMASS(:,:,:)=MZF(1,IKU,1,XZZ(:,:,:)) +ZZMASS(:,:,:)=MZF(XZZ(:,:,:)) ZZMASS(:,:,IKU)=1.5*XZZ(:,:,IKU)-0.5*XZZ(:,:,IKU-1) ! !20131024 check zzmass and pthv diff --git a/src/MNH/set_rsou.f90 b/src/MNH/set_rsou.f90 index 5a787a31bd6be1946fb9b1c7bdf5770622c16812..353c6298bd02baa8db936c4df60565fc4235c013 100644 --- a/src/MNH/set_rsou.f90 +++ b/src/MNH/set_rsou.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. @@ -1117,7 +1117,7 @@ ELSE ENDIF ENDIF CALL VERT_COORD(LSLEVE,ZZS_LS,ZZS_LS,XLEN1,XLEN2,XZHAT,ZZFLUX_MX) -ZZMASS_MX(:,:,:)=MZF(1,IKU,1,ZZFLUX_MX) +ZZMASS_MX(:,:,:)=MZF(ZZFLUX_MX) ZZMASS_MX(:,:,IKU)=1.5*ZZFLUX_MX(:,:,IKU)-0.5*ZZFLUX_MX(:,:,IKU-1) ! !* 3.2 Interpolate and extrapolate U and V on w- mixed grid levels diff --git a/src/MNH/shallow_mf_pack.f90 b/src/MNH/shallow_mf_pack.f90 index e3fb2799f22eea29e879a4fabc79686a8441fbb6..78937e508ba19776d3ce05b9a47691d3755d6056 100644 --- a/src/MNH/shallow_mf_pack.f90 +++ b/src/MNH/shallow_mf_pack.f90 @@ -295,7 +295,7 @@ ZSVM(:,:,:) = 0. ! wind on mass points ZUMM=MXF(PUM) ZVMM=MYF(PVM) -ZWMM=MZF(1,IKU,1,PWM) +ZWMM=MZF(PWM) ! !!! 2. Pack input variables ! diff --git a/src/MNH/shuman.f90 b/src/MNH/shuman.f90 index 526fa0491afa685dc859a3b53a8c3ebddf493b11..a0f0e3a59792a6463c05963b11ccf73615cafffe 100644 --- a/src/MNH/shuman.f90 +++ b/src/MNH/shuman.f90 @@ -41,18 +41,14 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYM ! result at flux ! side END FUNCTION DYM ! -FUNCTION DZF(KKA,KKU,KL,PA) RESULT(PDZF) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION DZF(PA) RESULT(PDZF) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux ! side REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF ! result at mass ! localization END FUNCTION DZF ! -FUNCTION DZM(KKA,KKU,KL,PA) RESULT(PDZM) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION DZM(PA) RESULT(PDZM) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass ! localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM ! result at flux @@ -83,18 +79,14 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass l REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYM ! result at flux localization END FUNCTION MYM ! -FUNCTION MZF(KKA,KKU,KL,PA) RESULT(PMZF) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION MZF(PA) RESULT(PMZF) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux ! side REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF ! result at mass ! localization END FUNCTION MZF ! -FUNCTION MZM(KKA,KKU,KL,PA) RESULT(PMZM) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +FUNCTION MZM(PA) RESULT(PMZM) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization END FUNCTION MZM @@ -505,7 +497,7 @@ END DO ! END FUNCTION MYM ! ############################### - FUNCTION MZF(KKA,KKU,KL,PA) RESULT(PMZF) + FUNCTION MZF(PA) RESULT(PMZF) ! ############################### ! !!**** *MZF* - Shuman operator : mean operator in z direction for a @@ -555,8 +547,6 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux ! side REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF ! result at mass @@ -601,7 +591,7 @@ END DO ! END FUNCTION MZF ! ############################### - FUNCTION MZM(KKA,KKU,KL,PA) RESULT(PMZM) + FUNCTION MZM(PA) RESULT(PMZM) ! ############################### ! !!**** *MZM* - Shuman operator : mean operator in z direction for a @@ -651,8 +641,6 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization ! @@ -1098,7 +1086,7 @@ END DO ! END FUNCTION DYM ! ############################### - FUNCTION DZF(KKA,KKU,KL,PA) RESULT(PDZF) + FUNCTION DZF(PA) RESULT(PDZF) ! ############################### ! !!**** *DZF* - Shuman operator : finite difference operator in z direction @@ -1148,8 +1136,6 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux ! side REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF ! result at mass @@ -1194,7 +1180,7 @@ END DO ! END FUNCTION DZF ! ############################### - FUNCTION DZM(KKA,KKU,KL,PA) RESULT(PDZM) + FUNCTION DZM(PA) RESULT(PDZM) ! ############################### ! !!**** *DZM* - Shuman operator : finite difference operator in z direction @@ -1244,8 +1230,6 @@ IMPLICIT NONE !* 0.1 Declarations of argument and result ! ------------------------------------ ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass ! localization REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM ! result at flux diff --git a/src/MNH/spawn_lsn.f90 b/src/MNH/spawn_lsn.f90 index 36a0341493c70d13ef181fe81596a5b7fb16b84a..4bf20369035d6bdc56badc2ee0b2339529ab943b 100644 --- a/src/MNH/spawn_lsn.f90 +++ b/src/MNH/spawn_lsn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1997-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1997-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. @@ -378,9 +378,9 @@ END IF IF ( GVERT_INTERP ) THEN IKU = SIZE(PZZ,3) ! - ZZLS2=MZF(1,IKU,1,ZZLS1) + ZZLS2=MZF(ZZLS1) ZZLS2(:,:,IKU)=2.*ZZLS2(:,:,IKU-1)-ZZLS2(:,:,IKU-2) - ZZSS=MZF(1,IKU,1,PZZ) + ZZSS=MZF(PZZ) ZZSS(:,:,IKU)=2.*ZZSS(:,:,IKU-1)-ZZSS(:,:,IKU-2) ! CALL COEF_VER_INTERP_LIN(ZZLS2,ZZSS,IKLIN,ZCOEFLIN) @@ -455,7 +455,7 @@ IF ( GVERT_INTERP ) THEN ! ZZLS1=MYM(ZZLS2) ZZLS1(:,1,:)=2.*ZZLS1(:,2,:)-ZZLS1(:,3,:) - ZZSS=MZF(1,IKU,1,PZZ) + ZZSS=MZF(PZZ) ZZSS(:,:,IKU)=2.*ZZSS(:,:,IKU-1)-ZZSS(:,:,IKU-2) ZZSS=MYM(ZZSS) ZZSS(:,1,:)=2.*ZZSS(:,2,:)-ZZSS(:,3,:) 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/spawn_pressure2.f90 b/src/MNH/spawn_pressure2.f90 index 0a55faaef3b11cd76e9f289ad02fd6a32e772000..0b763ec655d07bf049999250ef06abbc38b1faf4 100644 --- a/src/MNH/spawn_pressure2.f90 +++ b/src/MNH/spawn_pressure2.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1997-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1997-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. @@ -339,9 +339,9 @@ IKE=IKU-JPVEXT ! ALLOCATE(ZGRIDA(IIU,IJU,IKU)) ALLOCATE(ZGRIDB(IIU,IJU,IKU)) - ZGRIDA(:,:,:)=MZF(1,IKU,1,PZZ_LS(:,:,:)) + ZGRIDA(:,:,:)=MZF(PZZ_LS(:,:,:)) ZGRIDA(:,:,IKU)=2.*ZGRIDA(:,:,IKU-1)-ZGRIDA(:,:,IKU-2) - ZGRIDB(:,:,:)=MZF(1,IKU,1,PZZ(:,:,:)) + ZGRIDB(:,:,:)=MZF(PZZ(:,:,:)) ZGRIDB(:,:,IKU)=2.*ZGRIDB(:,:,IKU-1)-ZGRIDB(:,:,IKU-2) CALL COEF_VER_INTERP_LIN(ZGRIDA(:,:,:),ZGRIDB(:,:,:)) ! 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 1c71367b1befd1043898e32e5c4c2450e1fd8363..ad4ca3b71d3cacca6f47df59fde4603e29cdc2e7 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -76,9 +76,10 @@ END MODULE MODI_STATION_n !! P.Aumond 01/07/2011 : Add model levels !! C.Lac 04/2013 : Correction on the vertical levels !! 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 -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! P. Wautelet 28/03/2018: replace TEMPORAL_DIST by DATETIME_DISTANCE +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! R. Schoetter 11/2019: use LCARTESIAN instead of LSTATLAT for multiproc in cartesian ! ! -------------------------------------------------------------------------- ! @@ -268,7 +269,6 @@ IF (GSTATFIRSTCALL) THEN ! !* 4.4 Computations only on correct processor ! -------------------------------------- - IF ( LSTATLAT ) THEN ZXCOEF(I) = 0. ZYCOEF(I) = 0. ZUCOEF(I) = 0. @@ -307,7 +307,6 @@ IF (GSTATFIRSTCALL) THEN ! END IF - END IF ENDDO END IF !---------------------------------------------------------------------------- @@ -333,18 +332,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)) @@ -383,46 +380,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/tke_eps_sources.f90 b/src/MNH/tke_eps_sources.f90 index e773799be9ff0d2c4b77b8e0a891fd43681dd385..3ea39b78f0484024904edf523e253210111c4b0f 100644 --- a/src/MNH/tke_eps_sources.f90 +++ b/src/MNH/tke_eps_sources.f90 @@ -318,7 +318,7 @@ ZSOURCE(:,:,:) = PRTKES(:,:,:) / PRHODJ(:,:,:) + PRTKESM(:,:,:) / PRHODJ(:,:,: ! matrix inverted in TRIDIAG ! ZA(:,:,:) = - PTSTEP * XCET * & - MZM(KKA,KKU,KKL,ZKEFF) * MZM(KKA,KKU,KKL,PRHODJ) / PDZZ**2 + MZM(ZKEFF) * MZM(PRHODJ) / PDZZ**2 ! ! Compute TKE at time t+deltat: ( stored in ZRES ) ! @@ -350,20 +350,20 @@ IF ( LLES_CALL .OR. & ! Compute the cartesian vertical flux of TKE in ZFLX ! - ZFLX(:,:,:) = - XCET * MZM(KKA,KKU,KKL,ZKEFF) * & - DZM(KKA,KKU,KKL,PIMPL * ZRES + PEXPL * PTKEM ) / PDZZ + ZFLX(:,:,:) = - XCET * MZM(ZKEFF) * & + DZM(PIMPL * ZRES + PEXPL * PTKEM ) / PDZZ ! ZFLX(:,:,IKB) = 0. ZFLX(:,:,KKA) = 0. ! ! Compute the whole turbulent TRansport of TKE: ! - PTR(:,:,:)= PTR - DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL,PRHODJ) * ZFLX / PDZZ ) /PRHODJ + PTR(:,:,:)= PTR - DZF( MZM(PRHODJ) * ZFLX / PDZZ ) /PRHODJ ! ! Storage in the LES configuration ! IF (LLES_CALL) THEN - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,ZFLX), X_LES_SUBGRID_WTke ) + CALL LES_MEAN_SUBGRID( MZF(ZFLX), X_LES_SUBGRID_WTke ) CALL LES_MEAN_SUBGRID( -PTR, X_LES_SUBGRID_ddz_WTke ) END IF ! diff --git a/src/MNH/tridiag_thermo.f90 b/src/MNH/tridiag_thermo.f90 index 0da3f156b1cd1229272086f5409651a8d5f2388d..2a02b634692cfebf10465a38fea4875eb8cc12db 100644 --- a/src/MNH/tridiag_thermo.f90 +++ b/src/MNH/tridiag_thermo.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2003-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$ $Revision$ -! MASDEV4_7 newsrc 2006/06/02 17:32:30 -!----------------------------------------------------------------- ! ################### MODULE MODI_TRIDIAG_THERMO ! ################### @@ -199,7 +194,7 @@ IKB=KKA+JPVEXT_TURB*KKL IKE=KKU-JPVEXT_TURB*KKL ! -ZMZM_RHODJ = MZM(KKA,KKU,KKL,PRHODJ) +ZMZM_RHODJ = MZM(PRHODJ) ZRHODJ_DFDDTDZ_O_DZ2 = ZMZM_RHODJ*PDFDDTDZ/PDZZ**2 ! ZA=0. diff --git a/src/MNH/tridiag_w.f90 b/src/MNH/tridiag_w.f90 index 477384a7197c54f06a3199f5e34b5d67873672c5..c995d91f1e226456490b6f5cd817694b380cb9f0 100644 --- a/src/MNH/tridiag_w.f90 +++ b/src/MNH/tridiag_w.f90 @@ -1,7 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. +!----------------------------------------------------------------- ! ################### MODULE MODI_TRIDIAG_W ! ################### @@ -175,7 +176,7 @@ REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET ! 2D work array INTEGER :: JK ! loop counter -INTEGER :: IKB,IKE,IKU ! inner vertical limits +INTEGER :: IKB,IKE ! inner vertical limits ! ! --------------------------------------------------------------------------- ! @@ -184,9 +185,8 @@ INTEGER :: IKB,IKE,IKU ! inner vertical limits ! IKB=1+JPVEXT IKE=SIZE(PVARM,3)-JPVEXT -IKU=SIZE(PVARM,3) ! -ZMZM_RHODJ = MZM(1,IKU,1,PRHODJ) +ZMZM_RHODJ = MZM(PRHODJ) ZRHODJ_DFDDWDZ_O_DZ2 = PRHODJ*PDFDDWDZ/PMZF_DZZ**2 ! ZA=0. diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index e03e039d79aeb233385b3e9557e8e590bc62ea80..81dcee7fcce563951298de345c8c81adfc01aeeb 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -341,13 +341,16 @@ END MODULE MODI_TURB ! Q. Rodier 01/2018: introduction of RM17 ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -use modd_budget, only: lbudget_u, lbudget_v, lbudget_w, lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv, & - NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & +use modd_budget, only: lbudget_u, lbudget_v, lbudget_w, lbudget_th, lbudget_rv, lbudget_rc, & + lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & + NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & + NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & tbudgets USE MODD_CONF USE MODD_CST @@ -357,6 +360,7 @@ USE MODD_IO, ONLY: TFILEDATA USE MODD_LES USE MODD_NSV USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_PARAM_LIMA ! USE MODI_GRADIENT_M USE MODI_GRADIENT_U @@ -540,7 +544,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 ! @@ -749,8 +753,8 @@ SELECT CASE (HTURBLEN) ! ------------------ CASE ('RM17') - ZDUDZ = MXF(MZF(1,KKU,1,GZ_U_UW(1,KKU,1,PUT,PDZZ))) - ZDVDZ = MYF(MZF(1,KKU,1,GZ_V_VW(1,KKU,1,PVT,PDZZ))) + ZDUDZ = MXF(MZF(GZ_U_UW(PUT,PDZZ))) + ZDVDZ = MYF(MZF(GZ_V_VW(PVT,PDZZ))) ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,PLEM) ! @@ -877,9 +881,9 @@ IF (HTOM=='TM06') THEN ! ZFWTH = -GZ_M_W(KKA,KKU,KKL,ZMWTH,PDZZ) ! -d(w'2th' )/dz !ZFWR = -GZ_M_W(KKA,KKU,KKL,ZMWR, PDZZ) ! -d(w'2r' )/dz - ZFTH2 = -GZ_W_M(KKA,KKU,KKL,ZMTH2,PDZZ) ! -d(w'th'2 )/dz - !ZFR2 = -GZ_W_M(KKA,KKU,KKL,ZMR2, PDZZ) ! -d(w'r'2 )/dz - !ZFTHR = -GZ_W_M(KKA,KKU,KKL,ZMTHR,PDZZ) ! -d(w'th'r')/dz + ZFTH2 = -GZ_W_M(ZMTH2,PDZZ) ! -d(w'th'2 )/dz + !ZFR2 = -GZ_W_M(ZMR2, PDZZ) ! -d(w'r'2 )/dz + !ZFTHR = -GZ_W_M(ZMTHR,PDZZ) ! -d(w'th'r')/dz ! ZFWTH(:,:,IKTE:) = 0. ZFWTH(:,:,:IKTB) = 0. @@ -1064,7 +1068,7 @@ end if ! 6.1 Contribution of mass-flux in the TKE buoyancy production if ! cloud computation is not statistical - PTHP = PTHP + XG / PTHVREF * MZF(KKA,KKU,KKL, PFLXZTHVMF ) + PTHP = PTHP + XG / PTHVREF * MZF( PFLXZTHVMF ) ! 6.2 TKE evolution equation @@ -1151,47 +1155,156 @@ IF ( KRRL >= 1 ) THEN PRTHLS(:,:,:) = PRTHLS(:,:,:) + ZLOCPEXNM(:,:,:) * PRRS(:,:,:,2) END IF END IF -! -IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) THEN - if (lbudget_th) then - if ( krri >= 1 .and. krrl >= 1 ) then - call Budget_store_init( tbudgets(NBUDGET_TH), 'NETUR', prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & - + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) ) - else if ( krrl >= 1 ) then - call Budget_store_init( tbudgets(NBUDGET_TH), 'NETUR', prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) ) - else - call Budget_store_init( tbudgets(NBUDGET_TH), 'NETUR', prthls(:, :, :) ) - end if - end if + +if ( hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) then + if (lbudget_th) call Budget_store_init( tbudgets(NBUDGET_TH), 'NETUR', prthls(:, :, :) ) if (lbudget_rv) call Budget_store_init( tbudgets(NBUDGET_RV), 'NETUR', prrs (:, :, :, 1) ) if (lbudget_rc) call Budget_store_init( tbudgets(NBUDGET_RC), 'NETUR', prrs (:, :, :, 2) ) + if (lbudget_rr) call Budget_store_init( tbudgets(NBUDGET_RR), 'NETUR', prrs (:, :, :, 3) ) + if (lbudget_ri) call Budget_store_init( tbudgets(NBUDGET_RI), 'NETUR', prrs (:, :, :, 4) ) + if (lbudget_rs) call Budget_store_init( tbudgets(NBUDGET_RS), 'NETUR', prrs (:, :, :, 5) ) + if (lbudget_rg) call Budget_store_init( tbudgets(NBUDGET_RG), 'NETUR', prrs (:, :, :, 6) ) + if (lbudget_rh) call Budget_store_init( tbudgets(NBUDGET_RH), 'NETUR', prrs (:, :, :, 7) ) +end if +if ( lbudget_sv .and. hcloud == 'LIMA' ) then + if ( lwarm ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'NETUR', prsvs(:, :, :, nsv_lima_nc) ) + if ( lwarm .and. lrain ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'NETUR', prsvs(:, :, :, nsv_lima_nr) ) + if ( lcold ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'NETUR', prsvs(:, :, :, nsv_lima_ni) ) + do ji = nsv_lima_ccn_free, nsv_lima_ccn_free + nmod_ccn - 1 + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), 'NETUR', prsvs(:, :, :, ji) ) + end do + do ji = nsv_lima_ifn_free, nsv_lima_ifn_free + nmod_ifn - 1 + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), 'NETUR', prsvs(:, :, :, ji) ) + end do +end if - 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 + 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_store_end( tbudgets(NBUDGET_TH), 'NETUR', prthls(:, :, :) ) if (lbudget_rv) call Budget_store_end( tbudgets(NBUDGET_RV), 'NETUR', prrs (:, :, :, 1) ) if (lbudget_rc) call Budget_store_end( tbudgets(NBUDGET_RC), 'NETUR', prrs (:, :, :, 2) ) -END IF -! + if (lbudget_rr) call Budget_store_end( tbudgets(NBUDGET_RR), 'NETUR', prrs (:, :, :, 3) ) + if (lbudget_ri) call Budget_store_end( tbudgets(NBUDGET_RI), 'NETUR', prrs (:, :, :, 4) ) + if (lbudget_rs) call Budget_store_end( tbudgets(NBUDGET_RS), 'NETUR', prrs (:, :, :, 5) ) + if (lbudget_rg) call Budget_store_end( tbudgets(NBUDGET_RG), 'NETUR', prrs (:, :, :, 6) ) + if (lbudget_rh) call Budget_store_end( tbudgets(NBUDGET_RH), 'NETUR', prrs (:, :, :, 7) ) +end if +if ( lbudget_sv .and. hcloud == 'LIMA' ) then + if ( lwarm ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'NETUR', prsvs(:, :, :, nsv_lima_nc) ) + if ( lwarm .and. lrain ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'NETUR', prsvs(:, :, :, nsv_lima_nr) ) + if ( lcold ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'NETUR', prsvs(:, :, :, nsv_lima_ni) ) + do ji = nsv_lima_ccn_free, nsv_lima_ccn_free + nmod_ccn - 1 + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + ji), 'NETUR', prsvs(:, :, :, ji) ) + end do + do ji = nsv_lima_ifn_free, nsv_lima_ifn_free + nmod_ifn - 1 + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + ji), 'NETUR', prsvs(:, :, :, ji) ) + end do +end if + !---------------------------------------------------------------------------- ! !* 9. LES averaged surface fluxes @@ -1229,13 +1342,13 @@ IF (LLES_CALL) THEN CALL LES_MEAN_SUBGRID(2./3.*PTKET,X_LES_SUBGRID_U2) X_LES_SUBGRID_V2 = X_LES_SUBGRID_U2 X_LES_SUBGRID_W2 = X_LES_SUBGRID_U2 - CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(KKA,KKU,KKL,& + CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(& & GZ_M_W(KKA,KKU,KKL,PTHLT,PDZZ)),X_LES_RES_ddz_Thl_SBG_W2) IF (KRR>=1) & - CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(KKA,KKU,KKL,& + CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(& & GZ_M_W(KKA,KKU,KKL,PRT(:,:,:,1),PDZZ)),X_LES_RES_ddz_Rt_SBG_W2) DO JSV=1,NSV - CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(KKA,KKU,KKL,& + CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(& & GZ_M_W(KKA,KKU,KKL,PSVT(:,:,:,JSV),PDZZ)),X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) END DO END IF diff --git a/src/MNH/turb_cloud_index.f90 b/src/MNH/turb_cloud_index.f90 index 6e011097c60ff6adcc357ab828a413939959632d..3ab076106ce700ded50c86681ada39a2c8a34e16 100644 --- a/src/MNH/turb_cloud_index.f90 +++ b/src/MNH/turb_cloud_index.f90 @@ -135,7 +135,6 @@ REAL, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3),2) :: ZG_RVCI,ZQ_RVCI INTEGER :: JI,JJ,JK ! loop counters INTEGER :: IIB,IJB,IKB ! Begin of physical dimensions INTEGER :: IIE,IJE,IKE ! End of physical dimensions -INTEGER :: IKU ! array size in k INTEGER, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: IMASK_CLOUD ! 0 except cloudy points or adjacent points (1) TYPE(TFIELDDATA) :: TZFIELD @@ -147,8 +146,7 @@ TYPE(TFIELDDATA) :: TZFIELD ! CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IKB = 1 + JPVEXT -IKU = SIZE(PRM,3) -IKE = IKU - JPVEXT +IKE = SIZE(PRM,3) - JPVEXT ! IMASK_CLOUD(:,:,:) = 0 PCEI(:,:,:) = 0. @@ -167,8 +165,8 @@ ZRVCI0(:,:,:) = MAX ( PRRS(:,:,:,1) , 0. ) + MAX ( PRRS(:,:,:,2) , 0. ) IF (KRRI>=1) ZRVCI0(:,:,:) = ZRVCI0(:,:,:) + MAX ( PRRS(:,:,:,4) , 0. ) ! ZRVCI(:,:,:)= PTSTEP *ZRVCI0(:,:,:) /PRHODJ(:,:,:) -ZG_RVCI(:,:,:,1) = GX_M_M(1,IKU,1,ZRVCI,PDXX,PDZZ,PDZX) -ZG_RVCI(:,:,:,2) = GY_M_M(1,IKU,1,ZRVCI,PDYY,PDZZ,PDZY) +ZG_RVCI(:,:,:,1) = GX_M_M(ZRVCI,PDXX,PDZZ,PDZX) +ZG_RVCI(:,:,:,2) = GY_M_M(ZRVCI,PDYY,PDZZ,PDZY) ! ZGNORM_RVCI(:,:,:) = SQRT( ZG_RVCI(:,:,:,1)*ZG_RVCI(:,:,:,1) + & ZG_RVCI(:,:,:,2)*ZG_RVCI(:,:,:,2) ) @@ -185,8 +183,8 @@ ZWORK(:,:,:) = ZRVCI0 / PRHODJ(:,:,:) - & ( PRM(:,:,:,1)+ PRM(:,:,:,2) ) / PTSTEP IF (KRRI>=1) ZWORK(:,:,:) = ZWORK(:,:,:) - PRM(:,:,:,4) / PTSTEP ! -ZQ_RVCI(:,:,:,1) = GX_M_M(1,IKU,1,ZWORK,PDXX,PDZZ,PDZX) -ZQ_RVCI(:,:,:,2) = GY_M_M(1,IKU,1,ZWORK,PDYY,PDZZ,PDZY) +ZQ_RVCI(:,:,:,1) = GX_M_M(ZWORK,PDXX,PDZZ,PDZX) +ZQ_RVCI(:,:,:,2) = GY_M_M(ZWORK,PDYY,PDZZ,PDZY) ! ZQNORM_RVCI(:,:,:) = SQRT( ZQ_RVCI(:,:,:,1)*ZQ_RVCI(:,:,:,1) + & ZQ_RVCI(:,:,:,2)*ZQ_RVCI(:,:,:,2) ) diff --git a/src/MNH/turb_hor.f90 b/src/MNH/turb_hor.f90 index 389d45e490327bfcb3de8fb896f2a308defaa235..522bb30b003feab886665e6d263510a524a4d7e8 100644 --- a/src/MNH/turb_hor.f90 +++ b/src/MNH/turb_hor.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. @@ -184,20 +184,8 @@ END MODULE MODI_TURB_HOR !! !! EXTERNAL !! -------- -!! GX_M_U, GY_M_V -!! GX_M_M, GY_M_M, GZ_M_M -!! GY_U_UV,GX_V_UV -!! GX_U_M, GY_V_M, GZ_W_M -!! GX_W_UW,GY_W_UW -!! : Cartesian vertical gradient operators -!! !! -!! MXM,MXF,MYM,MYF,MZM,MZF -!! : Shuman functions (mean operators) -!! DXM,DXF.DYM,DYF,DZM,DZF -!! : Shuman functions (difference operators) !! -!! !! IMPLICIT ARGUMENTS !! ------------------ !! Module MODD_CST : contains physical constants @@ -259,13 +247,6 @@ USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES ! -! -USE MODI_GRADIENT_M -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_W -USE MODI_SHUMAN -! USE MODI_TURB_HOR_THERMO_FLUX USE MODI_TURB_HOR_THERMO_CORR USE MODI_TURB_HOR_DYN_CORR diff --git a/src/MNH/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90 index 1b5e6836c377d9767ebdec1f7f5fc003d5190e7f..4787f4dd84696cf26dabf5bbd9aa4e2b18227c04 100644 --- a/src/MNH/turb_hor_dyn_corr.f90 +++ b/src/MNH/turb_hor_dyn_corr.f90 @@ -274,11 +274,11 @@ IKU = SIZE(PUM,3) ! ZDIRSINZW(:,:) = SQRT( 1. - PDIRCOSZW(:,:)**2 ) ! -GX_U_M_PUM = GX_U_M(1,IKU,1,PUM,PDXX,PDZZ,PDZX) -IF (.NOT. L2D) GY_V_M_PVM = GY_V_M(1,IKU,1,PVM,PDYY,PDZZ,PDZY) -GZ_W_M_PWM = GZ_W_M(1,IKU,1,PWM,PDZZ) +GX_U_M_PUM = GX_U_M(PUM,PDXX,PDZZ,PDZX) +IF (.NOT. L2D) GY_V_M_PVM = GY_V_M(PVM,PDYY,PDZZ,PDZY) +GZ_W_M_PWM = GZ_W_M(PWM,PDZZ) ! -ZMZF_DZZ = MZF(1,IKU,1,PDZZ) +ZMZF_DZZ = MZF(PDZZ) ! CALL ADD3DFIELD_ll( TZFIELDS_ll, ZFLX, 'TURB_HOR_DYN_CORR::ZFLX' ) @@ -395,7 +395,7 @@ CALL MPPDB_CHECK3DM("before turb_corr:PRUS,PRHODJ,ZFLX,PDXX,PDZX,PINV_PDZZ",PREC PRUS(:,:,:)=PRUS & -DXM(PRHODJ * ZFLX / MXF(PDXX) ) & - +DZF(1,IKU,1, PDZX / MZM(1,IKU,1,PDXX) * MXM( MZM(1,IKU,1,PRHODJ*ZFLX) * PINV_PDZZ ) ) + +DZF( PDZX / MZM(PDXX) * MXM( MZM(PRHODJ*ZFLX) * PINV_PDZZ ) ) CALL MPPDB_CHECK3DM("after turb_corr:PRUS,PRHODJ,ZFLX,PDXX,PDZX,PINV_PDZZ",PRECISION,& & PRUS,PRHODJ,ZFLX,PDXX,PDZX,PINV_PDZZ ) ELSE @@ -488,8 +488,8 @@ IF (.NOT. L2D) THEN IF (.NOT. LFLAT) THEN PRVS(:,:,:)=PRVS & -DYM(PRHODJ * ZFLX / MYF(PDYY) ) & - +DZF(1,IKU,1, PDZY / MZM(1,IKU,1,PDYY) * & - MYM( MZM(1,IKU,1,PRHODJ*ZFLX) * PINV_PDZZ ) ) + +DZF( PDZY / MZM(PDYY) * & + MYM( MZM(PRHODJ*ZFLX) * PINV_PDZZ ) ) ELSE PRVS(:,:,:)=PRVS -DYM(PRHODJ * ZFLX / MYF(PDYY) ) END IF @@ -572,17 +572,17 @@ END IF ! ! Complete the W tendency ! -!PRWS(:,:,:)=PRWS(:,:,:) - DZM(1,IKU,1, PRHODJ*ZFLX/MZF(1,IKU,1,PDZZ) ) +!PRWS(:,:,:)=PRWS(:,:,:) - DZM( PRHODJ*ZFLX/MZF(PDZZ) ) ZDFDDWDZ(:,:,:) = - XCMFS * PK(:,:,:) * (4./3.) ZDFDDWDZ(:,:,:IKB) = 0. ! CALL TRIDIAG_W(PWM,ZFLX,ZDFDDWDZ,PTSTEP,ZMZF_DZZ,PRHODJ,ZWP) ! -PRWS = PRWS(:,:,:) + MZM(1,IKU,1,PRHODJ(:,:,:))*(ZWP(:,:,:)-PWM(:,:,:))/PTSTEP +PRWS = PRWS(:,:,:) + MZM(PRHODJ(:,:,:))*(ZWP(:,:,:)-PWM(:,:,:))/PTSTEP ! !* recomputes flux using guess of W ! -GZ_W_M_ZWP = GZ_W_M(1,IKU,1,ZWP,PDZZ) +GZ_W_M_ZWP = GZ_W_M(ZWP,PDZZ) ZFLX(:,:,IKB+1:)=ZFLX(:,:,IKB+1:) & - XCMFS * PK(:,:,IKB+1:) * (4./3.) * (GZ_W_M_ZWP(:,:,IKB+1:) - GZ_W_M_PWM(:,:,IKB+1:)) ! @@ -605,18 +605,18 @@ IF (LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_W2 ) CALL LES_MEAN_SUBGRID( -ZWORK, X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) - CALL LES_MEAN_SUBGRID( GZ_M_M(1,IKU,1,PTHLM,PDZZ)*ZFLX, X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) - CALL LES_MEAN_SUBGRID(ZFLX*MZF(1,IKU,1,GZ_M_W(1,IKU,1,PTHLM,PDZZ)),X_LES_RES_ddz_Thl_SBG_W2) + CALL LES_MEAN_SUBGRID( GZ_M_M(PTHLM,PDZZ)*ZFLX, X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) + CALL LES_MEAN_SUBGRID(ZFLX*MZF(GZ_M_W(1,IKU,1,PTHLM,PDZZ)),X_LES_RES_ddz_Thl_SBG_W2) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID( GZ_M_M(1,IKU,1,PRM(:,:,:,1),PDZZ)*ZFLX, & + CALL LES_MEAN_SUBGRID( GZ_M_M(PRM(:,:,:,1),PDZZ)*ZFLX, & X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) - CALL LES_MEAN_SUBGRID(ZFLX*MZF(1,IKU,1,GZ_M_W(1,IKU,1,PRM(:,:,:,1),PDZZ)), & + CALL LES_MEAN_SUBGRID(ZFLX*MZF(GZ_M_W(1,IKU,1,PRM(:,:,:,1),PDZZ)), & X_LES_RES_ddz_Rt_SBG_W2) END IF DO JSV=1,NSV - CALL LES_MEAN_SUBGRID( GZ_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDZZ)*ZFLX, & + CALL LES_MEAN_SUBGRID( GZ_M_M(PSVM(:,:,:,JSV),PDZZ)*ZFLX, & X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) , .TRUE.) - CALL LES_MEAN_SUBGRID(ZFLX*MZF(1,IKU,1,GZ_M_W(1,IKU,1,PSVM(:,:,:,JSV),PDZZ)), & + CALL LES_MEAN_SUBGRID(ZFLX*MZF(GZ_M_W(1,IKU,1,PSVM(:,:,:,JSV),PDZZ)), & X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) END DO CALL SECOND_MNH(ZTIME2) diff --git a/src/MNH/turb_hor_splt.f90 b/src/MNH/turb_hor_splt.f90 index 9fdace16e45e26608eccc6ec3b6077d9df398598..cb43941a8f96506c872550fc37fc5cf35bd703eb 100644 --- a/src/MNH/turb_hor_splt.f90 +++ b/src/MNH/turb_hor_splt.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. @@ -355,7 +355,7 @@ REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZMZM_PRHODJ ! MZM(PRHODJ) ! INTEGER :: JSPLT ! current split ! -INTEGER :: IKB, IKE, IIB, IIE, IJB, IJE, IKU +INTEGER :: IKB, IKE, IIB, IIE, IJB, IJE INTEGER :: JRR, JSV ! INTEGER :: ISV @@ -376,7 +376,6 @@ TYPE(LIST_ll), POINTER, SAVE :: TZFIELDS_ll ! IKB = 1.+JPVEXT IKE = SIZE(PUM,3) - JPVEXT -IKU = SIZE(PUM,3) CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) ISV=SIZE(PSVM,4) ! @@ -389,7 +388,7 @@ ALLOCATE(ZMZM_PRHODJ(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3))) ZINV_PDXX = 1./PDXX ZINV_PDYY = 1./PDYY ZINV_PDZZ = 1./PDZZ -ZMZM_PRHODJ = MZM(1,IKU,1,PRHODJ) +ZMZM_PRHODJ = MZM(PRHODJ) ! ZK(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ! diff --git a/src/MNH/turb_hor_sv_corr.f90 b/src/MNH/turb_hor_sv_corr.f90 index 77489e8c655e657bfcf213a77324a6d749543ced..f9e2c7b5557ff6c0f31e75efcf9a3aa3347b3406 100644 --- a/src/MNH/turb_hor_sv_corr.f90 +++ b/src/MNH/turb_hor_sv_corr.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-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$ $Revision$ -! MASDEV4_7 turb 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ############################ MODULE MODI_TURB_HOR_SV_CORR ! ############################ @@ -142,7 +137,6 @@ REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) & :: ZFLX, ZA ! INTEGER :: JSV ! loop counter -INTEGER :: IKU ! REAL :: ZTIME1, ZTIME2 ! @@ -153,7 +147,6 @@ REAL :: ZCQSVD = 2.4 ! constant for humidity - scalar covariance dissipation REAL :: ZCSV !constant for the scalar flux ! --------------------------------------------------------------------------- ! -IKU=SIZE(PTKEM,3) CALL SECOND_MNH(ZTIME1) ! IF(LBLOWSNOW) THEN @@ -172,15 +165,15 @@ DO JSV=1,NSV IF (LLES_CALL) THEN IF (.NOT. L2D) THEN ZFLX(:,:,:) = ZCSV / ZCSVD * PLM(:,:,:) * PLEPS(:,:,:) * & - ( GX_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)**2 & - + GY_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)**2 ) + ( GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)**2 & + + GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)**2 ) ELSE ZFLX(:,:,:) = ZCSV / ZCSVD * PLM(:,:,:) * PLEPS(:,:,:) * & - GX_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)**2 + GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)**2 END IF CALL LES_MEAN_SUBGRID( -2.*ZCSVD*SQRT(PTKEM)*ZFLX/PLEPS, & X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV), .TRUE. ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,PWM)*ZFLX, X_LES_RES_W_SBG_Sv2(:,:,:,JSV), .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_Sv2(:,:,:,JSV), .TRUE. ) END IF ! ! covariance SvThv @@ -189,12 +182,12 @@ DO JSV=1,NSV ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) IF (.NOT. L2D) THEN ZFLX(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) & - * ( GX_M_M(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & - + GY_M_M(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY) * GY_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY) & + * ( GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY) * GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY) & ) * (XCSHF+ZCSV) / (2.*ZCTSVD) ELSE ZFLX(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) & - * GX_M_M(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & + * GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & * (XCSHF+ZCSV) / (2.*ZCTSVD) END IF CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) @@ -204,12 +197,12 @@ DO JSV=1,NSV ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) IF (.NOT. L2D) THEN ZFLX(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) & - * ( GX_M_M(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX) * GX_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & - + GY_M_M(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY) * GY_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY) & + * ( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & + + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY) * GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY) & ) * (XCHF+ZCSV) / (2.*ZCQSVD) ELSE ZFLX(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) & - * GX_M_M(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX) * GX_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & + * GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & * (XCHF+ZCSV) / (2.*ZCQSVD) END IF CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) diff --git a/src/MNH/turb_hor_sv_flux.f90 b/src/MNH/turb_hor_sv_flux.f90 index c50ea5761fe9a04e81cf947c052e881deca43577..ea0b84e61b4a94d33130cbdf89f306fcb0758ee9 100644 --- a/src/MNH/turb_hor_sv_flux.f90 +++ b/src/MNH/turb_hor_sv_flux.f90 @@ -268,9 +268,9 @@ DO JSV=1,ISV IF (LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( MXF(ZFLXX), X_LES_SUBGRID_USv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(GX_W_UW(1,IKU,1,PWM,PDXX,PDZZ,PDZX)*MZM(1,IKU,1,ZFLXX))), & + CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,PDZZ,PDZX)*MZM(ZFLXX))), & X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) , .TRUE. ) - CALL LES_MEAN_SUBGRID( GX_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)*MXF(ZFLXX), & + CALL LES_MEAN_SUBGRID( GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)*MXF(ZFLXX), & X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV), .TRUE. ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -323,9 +323,9 @@ DO JSV=1,ISV IF (LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( MYF(ZFLXY), X_LES_SUBGRID_VSv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MYF(GY_W_VW(1,IKU,1,PWM,PDYY,PDZZ,PDZY)*MZM(1,IKU,1,ZFLXY))), & + CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*MZM(ZFLXY))), & X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) , .TRUE. ) - CALL LES_MEAN_SUBGRID( GY_M_M(1,IKU,1,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)*MYF(ZFLXY), & + CALL LES_MEAN_SUBGRID( GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)*MYF(ZFLXY), & X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) , .TRUE. ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -340,8 +340,8 @@ DO JSV=1,ISV PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV) & -DXF( MXM(PRHODJ) * ZFLXX * PINV_PDXX ) & -DYF( MYM(PRHODJ) * ZFLXY * PINV_PDYY ) & - +DZF( 1,IKU,1,PMZM_PRHODJ * PINV_PDZZ * & - ( MXF( MZM(1,IKU,1,ZFLXX * PINV_PDXX) * PDZX ) + MYF( MZM(1,IKU,1,ZFLXY * PINV_PDYY) * PDZY ) ) & + +DZF( PMZM_PRHODJ * PINV_PDZZ * & + ( MXF( MZM(ZFLXX * PINV_PDXX) * PDZX ) + MYF( MZM(ZFLXY * PINV_PDYY) * PDZY ) ) & ) ELSE PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV) & @@ -352,8 +352,8 @@ DO JSV=1,ISV IF (.NOT. LFLAT) THEN PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV) & -DXF( MXM(PRHODJ) * ZFLXX * PINV_PDXX ) & - +DZF(1,IKU,1, PMZM_PRHODJ * PINV_PDZZ * & - ( MXF( MZM(1,IKU,1,ZFLXX * PINV_PDXX) * PDZX ) ) & + +DZF( PMZM_PRHODJ * PINV_PDZZ * & + ( MXF( MZM(ZFLXX * PINV_PDXX) * PDZX ) ) & ) ELSE PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV) & diff --git a/src/MNH/turb_hor_thermo_corr.f90 b/src/MNH/turb_hor_thermo_corr.f90 index ef91a4e90117d841d097131cc45d6f5156c845c2..cf9363d6363524a427c88f79d600b796d1db4b33 100644 --- a/src/MNH/turb_hor_thermo_corr.f90 +++ b/src/MNH/turb_hor_thermo_corr.f90 @@ -194,7 +194,7 @@ REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) & :: ZFLX,ZWORK,ZA ! work arrays ! -INTEGER :: IKB,IKE,IKU +INTEGER :: IKB,IKE ! Index values for the Beginning and End ! mass points of the domain REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF @@ -210,7 +210,6 @@ TYPE(TFIELDDATA) :: TZFIELD ! IKB = 1+JPVEXT IKE = SIZE(PTHLM,3)-JPVEXT -IKU = SIZE(PTHLM,3) ! ! ! @@ -237,10 +236,10 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. OCLOSE_OUT ) & ! Computes the horizontal variance <THl THl> IF (.NOT. L2D) THEN ZFLX(:,:,:) = XCTV * PLM(:,:,:) * PLEPS(:,:,:) * & - ( GX_M_M(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX)**2 + GY_M_M(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY)**2 ) + ( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 + GY_M_M(PTHLM,PDYY,PDZZ,PDZY)**2 ) ELSE ZFLX(:,:,:) = XCTV * PLM(:,:,:) * PLEPS(:,:,:) * & - GX_M_M(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX)**2 + GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 END IF ! ! Compute the flux at the first inner U-point with an uncentred vertical @@ -289,7 +288,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. OCLOSE_OUT ) & IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_Thl2, .TRUE. ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,PWM)*ZFLX, X_LES_RES_W_SBG_Thl2, .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_Thl2, .TRUE. ) CALL LES_MEAN_SUBGRID( -2.*XCTD*SQRT(PTKEM)*ZFLX/PLEPS ,X_LES_SUBGRID_DISS_Thl2, .TRUE. ) ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_ThlThv, .TRUE. ) @@ -306,13 +305,13 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. OCLOSE_OUT ) & IF (.NOT. L2D) THEN ZFLX(:,:,:)= & PLM(:,:,:) * PLEPS(:,:,:) * & - (GX_M_M(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX) & - + GY_M_M(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY) * GY_M_M(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY) & + (GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY) * GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY) & ) * (XCHT1+XCHT2) ELSE ZFLX(:,:,:)= & PLM(:,:,:) * PLEPS(:,:,:) * & - (GX_M_M(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX) & + (GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) & ) * (XCHT1+XCHT2) END IF @@ -377,7 +376,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. OCLOSE_OUT ) & IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_ThlRt, .TRUE. ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,PWM)*ZFLX, X_LES_RES_W_SBG_ThlRt, .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_ThlRt, .TRUE. ) CALL LES_MEAN_SUBGRID( -XCTD*SQRT(PTKEM)*ZFLX/PLEPS ,X_LES_SUBGRID_DISS_ThlRt, .TRUE. ) CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_RtThv, .TRUE. ) CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_RtPz,.TRUE.) @@ -393,11 +392,11 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. OCLOSE_OUT ) & ! Computes the horizontal variance <Rnp Rnp> IF (.NOT. L2D) THEN ZFLX(:,:,:) = XCHV * PLM(:,:,:) * PLEPS(:,:,:) * & - ( GX_M_M(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 + & - GY_M_M(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY)**2 ) + ( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 + & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)**2 ) ELSE ZFLX(:,:,:) = XCHV * PLM(:,:,:) * PLEPS(:,:,:) * & - ( GX_M_M(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 ) + ( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 ) END IF ! ! Compute the flux at the first inner U-point with an uncentred vertical @@ -445,7 +444,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. OCLOSE_OUT ) & IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_Rt2, .TRUE. ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,PWM)*ZFLX, X_LES_RES_W_SBG_Rt2, .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_Rt2, .TRUE. ) CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_RtThv, .TRUE. ) CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_RtPz,.TRUE.) CALL LES_MEAN_SUBGRID( -2.*XCTD*SQRT(PTKEM)*ZFLX/PLEPS, X_LES_SUBGRID_DISS_Rt2, .TRUE. ) diff --git a/src/MNH/turb_hor_thermo_flux.f90 b/src/MNH/turb_hor_thermo_flux.f90 index 2efa2fb982b6420d0c4b8ee8e2328e386da818f7..bd7d1854aa5dfbaf2171ae889c7d9f38bcc63ed5 100644 --- a/src/MNH/turb_hor_thermo_flux.f90 +++ b/src/MNH/turb_hor_thermo_flux.f90 @@ -265,7 +265,7 @@ ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( SPREAD( PSFTHM(:,:)* PDIRCOSXW(:,:), 3,1) ) IF (.NOT. LFLAT) THEN PRTHLS(:,:,:) = PRTHLS & - DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX ) & - + DZF(1,IKU,1, PMZM_PRHODJ *MXF(PDZX*(MZM(1,IKU,1,ZFLX * PINV_PDXX))) * PINV_PDZZ ) + + DZF( PMZM_PRHODJ *MXF(PDZX*(MZM(ZFLX * PINV_PDXX))) * PINV_PDZZ ) ELSE PRTHLS(:,:,:) = PRTHLS - DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX ) END IF @@ -275,24 +275,24 @@ END IF IF ( KRRL >= 1 ) THEN IF (.NOT. LFLAT) THEN ZFLXC = 2.*( MXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX ) & - +MZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PATHETA*PSRCM )*MXF( & - PDZX*(MZM(1,IKU,1, ZFLX*PINV_PDXX )) ) )& + +MZF( MZM( PRHODJ*PATHETA*PSRCM )*MXF( & + PDZX*(MZM( ZFLX*PINV_PDXX )) ) )& ) IF ( KRRI >= 1 ) THEN PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & (- DXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDXX ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PATHETA*PSRCM )*MXF( PDZX*(MZM(1,IKU,1, ZFLX*PINV_PDXX )) )& + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& *PINV_PDZZ ) & )*(1.0-PFRAC_ICE(:,:,:)) PRRS(:,:,:,4) = PRRS(:,:,:,4) + 2. * & (- DXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDXX ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PATHETA*PSRCM )*MXF( PDZX*(MZM(1,IKU,1, ZFLX*PINV_PDXX )) )& + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& *PINV_PDZZ ) & )*PFRAC_ICE(:,:,:) ELSE PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & (- DXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDXX ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PATHETA*PSRCM )*MXF( PDZX*(MZM(1,IKU,1, ZFLX*PINV_PDXX )) )& + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& *PINV_PDZZ ) & ) END IF @@ -331,12 +331,12 @@ END IF IF (KSPLT==1 .AND. LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( MXF(ZFLX), X_LES_SUBGRID_UThl ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(GX_W_UW(1,IKU,1,PWM,PDXX,PDZZ,PDZX)*MZM(1,IKU,1,ZFLX))),& + CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,PDZZ,PDZX)*MZM(ZFLX))),& X_LES_RES_ddxa_W_SBG_UaThl , .TRUE. ) - CALL LES_MEAN_SUBGRID( GX_M_M(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX)*MXF(ZFLX),& + CALL LES_MEAN_SUBGRID( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)*MXF(ZFLX),& X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. ) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID( GX_M_M(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MXF(ZFLX), & + CALL LES_MEAN_SUBGRID( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MXF(ZFLX), & X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. ) END IF CALL SECOND_MNH(ZTIME2) @@ -370,7 +370,7 @@ IF (KRR/=0) THEN IF (.NOT. LFLAT) THEN PRRS(:,:,:,1) = PRRS(:,:,:,1) & - DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX ) & - + DZF(1,IKU,1, PMZM_PRHODJ *MXF(PDZX*(MZM(1,IKU,1,ZFLX * PINV_PDXX))) * PINV_PDZZ ) + + DZF( PMZM_PRHODJ *MXF(PDZX*(MZM(ZFLX * PINV_PDXX))) * PINV_PDZZ ) ELSE PRRS(:,:,:,1) = PRRS(:,:,:,1) - DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX ) END IF @@ -381,24 +381,24 @@ IF (KRR/=0) THEN IF (.NOT. LFLAT) THEN ZFLXC = ZFLXC & + 2.*( MXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX ) & - +MZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PAMOIST*PSRCM )*MXF( & - PDZX*(MZM(1,IKU,1, ZFLX*PINV_PDXX )) ) )& + +MZF( MZM( PRHODJ*PAMOIST*PSRCM )*MXF( & + PDZX*(MZM( ZFLX*PINV_PDXX )) ) )& ) IF ( KRRI >= 1 ) THEN PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & (- DXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX*PINV_PDXX ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PAMOIST*PSRCM )*MXF( PDZX*(MZM(1,IKU,1, ZFLX*PINV_PDXX )) )& + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& *PINV_PDZZ ) & )*(1.0-PFRAC_ICE(:,:,:)) PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & (- DXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX*PINV_PDXX ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PAMOIST*PSRCM )*MXF( PDZX*(MZM(1,IKU,1, ZFLX*PINV_PDXX )) )& + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& *PINV_PDZZ ) & )*PFRAC_ICE(:,:,:) ELSE PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & (- DXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX*PINV_PDXX ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PAMOIST*PSRCM )*MXF( PDZX*(MZM(1,IKU,1, ZFLX*PINV_PDXX )) )& + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& *PINV_PDZZ ) & ) END IF @@ -434,11 +434,11 @@ IF (KRR/=0) THEN IF (KSPLT==1 .AND. LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( MXF(ZFLX), X_LES_SUBGRID_URt ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(GX_W_UW(1,IKU,1,PWM,PDXX,PDZZ,PDZX)*MZM(1,IKU,1,ZFLX))),& + CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,PDZZ,PDZX)*MZM(ZFLX))),& X_LES_RES_ddxa_W_SBG_UaRt , .TRUE. ) - CALL LES_MEAN_SUBGRID( GX_M_M(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX)*MXF(ZFLX),& + CALL LES_MEAN_SUBGRID( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)*MXF(ZFLX),& X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. ) - CALL LES_MEAN_SUBGRID( GX_M_M(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MXF(ZFLX),& + CALL LES_MEAN_SUBGRID( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MXF(ZFLX),& X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -518,7 +518,7 @@ IF (.NOT. L2D) THEN IF (.NOT. LFLAT) THEN PRTHLS(:,:,:) = PRTHLS & - DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) & - + DZF(1,IKU,1, PMZM_PRHODJ *MYF(PDZY*(MZM(1,IKU,1,ZFLX * PINV_PDYY))) * PINV_PDZZ ) + + DZF( PMZM_PRHODJ *MYF(PDZY*(MZM(ZFLX * PINV_PDYY))) * PINV_PDZZ ) ELSE PRTHLS(:,:,:) = PRTHLS - DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) END IF @@ -530,24 +530,24 @@ END IF IF ( KRRL >= 1 .AND. .NOT. L2D) THEN IF (.NOT. LFLAT) THEN ZFLXC = 2.*( MYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX ) & - +MZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PATHETA*PSRCM )*MYF( & - PDZY*(MZM(1,IKU,1, ZFLX*PINV_PDYY )) ) )& + +MZF( MZM( PRHODJ*PATHETA*PSRCM )*MYF( & + PDZY*(MZM( ZFLX*PINV_PDYY )) ) )& ) IF ( KRRI >= 1 ) THEN PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & (- DYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDYY ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PATHETA*PSRCM )*MYF( PDZY*(MZM(1,IKU,1, ZFLX*PINV_PDYY )) )& + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& *PINV_PDZZ ) & )*(1.0-PFRAC_ICE(:,:,:)) PRRS(:,:,:,4) = PRRS(:,:,:,4) + 2. * & (- DYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDYY ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PATHETA*PSRCM )*MYF( PDZY*(MZM(1,IKU,1, ZFLX*PINV_PDYY )) )& + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& *PINV_PDZZ ) & )*PFRAC_ICE(:,:,:) ELSE PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & (- DYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDYY ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PATHETA*PSRCM )*MYF( PDZY*(MZM(1,IKU,1, ZFLX*PINV_PDYY )) )& + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& *PINV_PDZZ ) & ) END IF @@ -586,12 +586,12 @@ END IF IF (KSPLT==1 .AND. LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( MYF(ZFLX), X_LES_SUBGRID_VThl ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MYF(GY_W_VW(1,IKU,1,PWM,PDYY,PDZZ,PDZY)*MZM(1,IKU,1,ZFLX))),& + CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*MZM(ZFLX))),& X_LES_RES_ddxa_W_SBG_UaThl , .TRUE. ) - CALL LES_MEAN_SUBGRID( GY_M_M(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY)*MYF(ZFLX),& + CALL LES_MEAN_SUBGRID( GY_M_M(PTHLM,PDYY,PDZZ,PDZY)*MYF(ZFLX),& X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. ) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID( GY_M_M(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MYF(ZFLX),& + CALL LES_MEAN_SUBGRID( GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MYF(ZFLX),& X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. ) END IF CALL SECOND_MNH(ZTIME2) @@ -633,7 +633,7 @@ IF (KRR/=0) THEN PRRS(:,:,:,1) = PRRS(:,:,:,1) & - DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) & - + DZF(1,IKU,1, PMZM_PRHODJ *MYF(PDZY*(MZM(1,IKU,1,ZFLX * PINV_PDYY))) * PINV_PDZZ ) + + DZF( PMZM_PRHODJ *MYF(PDZY*(MZM(ZFLX * PINV_PDYY))) * PINV_PDZZ ) ELSE PRRS(:,:,:,1) = PRRS(:,:,:,1) - DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) END IF @@ -645,24 +645,24 @@ IF (KRR/=0) THEN IF (.NOT. LFLAT) THEN ZFLXC = ZFLXC & + 2.*( MXF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX ) & - + MZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PAMOIST*PSRCM )*MYF( & - PDZY*(MZM(1,IKU,1, ZFLX*PINV_PDYY )) ) )& + + MZF( MZM( PRHODJ*PAMOIST*PSRCM )*MYF( & + PDZY*(MZM( ZFLX*PINV_PDYY )) ) )& ) IF ( KRRI >= 1 ) THEN PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & (- DYF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX/PDYY ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PAMOIST*PSRCM )*MYF( PDZY*(MZM(1,IKU,1, ZFLX*PINV_PDYY )) )& + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& * PINV_PDZZ ) & )*(1.0-PFRAC_ICE(:,:,:)) PRRS(:,:,:,4) = PRRS(:,:,:,4) + 2. * & (- DYF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX/PDYY ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PAMOIST*PSRCM )*MYF( PDZY*(MZM(1,IKU,1, ZFLX*PINV_PDYY )) )& + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& * PINV_PDZZ ) & )*PFRAC_ICE(:,:,:) ELSE PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & (- DYF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX/PDYY ) & - + DZF(1,IKU,1, MZM(1,IKU,1, PRHODJ*PAMOIST*PSRCM )*MYF( PDZY*(MZM(1,IKU,1, ZFLX*PINV_PDYY )) )& + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& * PINV_PDZZ ) & ) END IF @@ -698,11 +698,11 @@ IF (KRR/=0) THEN IF (KSPLT==1 .AND. LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( MYF(ZFLX), X_LES_SUBGRID_VRt ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MYF(GY_W_VW(1,IKU,1,PWM,PDYY,PDZZ,PDZY)*MZM(1,IKU,1,ZFLX))),& + CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*MZM(ZFLX))),& X_LES_RES_ddxa_W_SBG_UaRt , .TRUE. ) - CALL LES_MEAN_SUBGRID( GY_M_M(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY)*MYF(ZFLX), & + CALL LES_MEAN_SUBGRID( GY_M_M(PTHLM,PDYY,PDZZ,PDZY)*MYF(ZFLX), & X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. ) - CALL LES_MEAN_SUBGRID( GY_M_M(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MYF(ZFLX), & + CALL LES_MEAN_SUBGRID( GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MYF(ZFLX), & X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 diff --git a/src/MNH/turb_hor_tke.f90 b/src/MNH/turb_hor_tke.f90 index 24ad7f953b77d50852f4e9d0b3a0e0414d0c89a0..ec8e9e2b63953f2eb38ebfad15f72c6837337fab 100644 --- a/src/MNH/turb_hor_tke.f90 +++ b/src/MNH/turb_hor_tke.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 turb 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! #################### MODULE MODI_TURB_HOR_TKE ! #################### @@ -183,7 +178,7 @@ ZFLX(:,:,IKU) = ZFLX(:,:,IKU-1) ! IF (.NOT. LFLAT) THEN PTRH =-( DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX)& - - DZF(1,IKU,1, PMZM_PRHODJ * MXF( PDZX * MZM(1,IKU,1,ZFLX*PINV_PDXX)) * PINV_PDZZ)& + - DZF( PMZM_PRHODJ * MXF( PDZX * MZM(ZFLX*PINV_PDXX)) * PINV_PDZZ)& ) /PRHODJ ELSE PTRH =-( DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX)& @@ -230,7 +225,7 @@ IF (.NOT. L2D) THEN ! IF (.NOT. LFLAT) THEN PTRH = PTRH - ( DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) & - - DZF(1,IKU,1, PMZM_PRHODJ * MYF( PDZY * MZM(1,IKU,1,ZFLX*PINV_PDYY) ) * PINV_PDZZ ) & + - DZF( PMZM_PRHODJ * MYF( PDZY * MZM(ZFLX*PINV_PDYY) ) * PINV_PDZZ ) & ) /PRHODJ ELSE PTRH = PTRH - ( DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) & diff --git a/src/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90 index 9d7e398eeb98a46d5352bab8f30ea7b6d814a0f8..b28ffda5ad18a05276cd57018c5d61e689c165f1 100644 --- a/src/MNH/turb_hor_uv.f90 +++ b/src/MNH/turb_hor_uv.f90 @@ -204,7 +204,7 @@ REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) & ! REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2)) ::ZDIRSINZW ! sinus of the angle between the vertical and the normal to the orography -INTEGER :: IKB,IKE,IKU +INTEGER :: IKB,IKE ! Index values for the Beginning and End ! mass points of the domain ! @@ -220,12 +220,11 @@ TYPE(TFIELDDATA) :: TZFIELD ! IKB = 1+JPVEXT IKE = SIZE(PUM,3)-JPVEXT -IKU = SIZE(PUM,3) ! ZDIRSINZW(:,:) = SQRT( 1. - PDIRCOSZW(:,:)**2 ) ! -GX_V_UV_PVM = GX_V_UV(1,IKU,1,PVM,PDXX,PDZZ,PDZX) -IF (.NOT. L2D) GY_U_UV_PUM = GY_U_UV(1,IKU,1,PUM,PDYY,PDZZ,PDZY) +GX_V_UV_PVM = GX_V_UV(PVM,PDXX,PDZZ,PDZX) +IF (.NOT. L2D) GY_U_UV_PUM = GY_U_UV(PUM,PDYY,PDZZ,PDZY) ! ! !* 12. < U'V'> @@ -294,7 +293,7 @@ END IF IF (.NOT. LFLAT) THEN PRUS(:,:,:) = PRUS(:,:,:) & - DYF(ZFLX * MXM(MYM(PRHODJ) * PINV_PDYY) ) & - + DZF(1,IKU,1, MYF( MZM(1,IKU,1,ZFLX)*MXM(PDZY/MZM(1,IKU,1,PDYY))) & + + DZF( MYF( MZM(ZFLX)*MXM(PDZY/MZM(PDYY))) & * MXM(PMZM_PRHODJ * PINV_PDZZ) ) ELSE PRUS(:,:,:) = PRUS(:,:,:) - DYF(ZFLX * MXM(MYM(PRHODJ) * PINV_PDYY) ) @@ -304,7 +303,7 @@ END IF IF (.NOT. LFLAT) THEN PRVS(:,:,:) = PRVS(:,:,:) & - DXF(ZFLX * MYM(MXM(PRHODJ) * PINV_PDXX) ) & - + DZF(1,IKU,1, MXF( MZM(1,IKU,1,ZFLX)*MYM(PDZX/MZM(1,IKU,1,PDXX))) & + + DZF( MXF( MZM(ZFLX)*MYM(PDZX/MZM(PDXX))) & * MYM(PMZM_PRHODJ * PINV_PDZZ) ) ELSE PRVS(:,:,:) = PRVS(:,:,:) - DXF(ZFLX * MYM(MXM(PRHODJ) * PINV_PDXX) ) @@ -350,8 +349,8 @@ END IF IF (LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( MXF(MYF(ZFLX)), X_LES_SUBGRID_UV ) - CALL LES_MEAN_SUBGRID( MXF(MYF(GY_U_UV(1,IKU,1,PUM,PDYY,PDZZ,PDZY)*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) - CALL LES_MEAN_SUBGRID( MXF(MYF(GX_V_UV(1,IKU,1,PVM,PDXX,PDZZ,PDZX)*ZFLX)), X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) + CALL LES_MEAN_SUBGRID( MXF(MYF(GY_U_UV(PUM,PDYY,PDZZ,PDZY)*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) + CALL LES_MEAN_SUBGRID( MXF(MYF(GX_V_UV(PVM,PDXX,PDZZ,PDZX)*ZFLX)), X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF diff --git a/src/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90 index 07f6c7cdbd2beafb7ce77d13c178eb9594361b5a..6928baca32b84536ba336131f42dbd095444e6ef 100644 --- a/src/MNH/turb_hor_uw.f90 +++ b/src/MNH/turb_hor_uw.f90 @@ -202,7 +202,7 @@ IKE = SIZE(PWM,3)-JPVEXT IKU = SIZE(PWM,3) ! ! -GX_W_UW_PWM = GX_W_UW(1,IKU,1,PWM,PDXX,PDZZ,PDZX) +GX_W_UW_PWM = GX_W_UW(PWM,PDXX,PDZZ,PDZX) ! ! !* 13. < U'W'> @@ -211,7 +211,7 @@ GX_W_UW_PWM = GX_W_UW(1,IKU,1,PWM,PDXX,PDZZ,PDZX) ! residual part of < U'W'> depending on dw/dx ! ZFLX(:,:,:) = & - - XCMFS * MXM(MZM(1,IKU,1,PK)) * GX_W_UW_PWM + - XCMFS * MXM(MZM(PK)) * GX_W_UW_PWM !! & to be tested !! - (2./3.) * XCMFB * MZM( ZVPTU * MXM( PLM / SQRT(PTKEM) * XG / PTHVREF ) ) ! @@ -240,23 +240,23 @@ END IF ! ! compute the source for rho*U due to this residual flux ( the other part is ! taken into account in TURB_VER) -PRUS(:,:,:) = PRUS(:,:,:) - DZF(1,IKU,1, ZFLX* MXM( PMZM_PRHODJ ) / MXM( PDZZ ) ) +PRUS(:,:,:) = PRUS(:,:,:) - DZF( ZFLX* MXM( PMZM_PRHODJ ) / MXM( PDZZ ) ) ! !computation of the source for rho*W due to this flux IF (.NOT. LFLAT) THEN PRWS(:,:,:) = PRWS(:,:,:) & - -DXF( MZM(1,IKU,1, MXM(PRHODJ) * PINV_PDXX) * ZFLX) & - +DZM(1,IKU,1, PRHODJ * MXF( MZF(1,IKU,1, ZFLX*PDZX ) * PINV_PDXX ) / MZF(1,IKU,1,PDZZ) ) + -DXF( MZM( MXM(PRHODJ) * PINV_PDXX) * ZFLX) & + +DZM( PRHODJ * MXF( MZF( ZFLX*PDZX ) * PINV_PDXX ) / MZF(PDZZ) ) ELSE - PRWS(:,:,:) = PRWS(:,:,:) -DXF( MZM(1,IKU,1, MXM(PRHODJ) * PINV_PDXX) * ZFLX) + PRWS(:,:,:) = PRWS(:,:,:) -DXF( MZM( MXM(PRHODJ) * PINV_PDXX) * ZFLX) END IF ! IF (KSPLT==1) THEN ! !Contribution to the dynamic production of TKE: ! - ZWORK(:,:,:) =-MZF(1,IKU,1, MXF( & - ZFLX *( GZ_U_UW(1,IKU,1,PUM,PDZZ) + GX_W_UW_PWM ) ) ) + ZWORK(:,:,:) =-MZF( MXF( & + ZFLX *( GZ_U_UW(PUM,PDZZ) + GX_W_UW_PWM ) ) ) ! ! ! evaluate the dynamic production at w(IKB+1) in PDP(IKB) @@ -282,17 +282,17 @@ END IF ! IF (LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(ZFLX)), X_LES_SUBGRID_WU , .TRUE. ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(GZ_U_UW(1,IKU,1,PUM,PDZZ)*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(GX_W_UW_PWM*ZFLX)), X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) - CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX)*MZF(1,IKU,1,ZFLX)),& + CALL LES_MEAN_SUBGRID( MZF(MXF(ZFLX)), X_LES_SUBGRID_WU , .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(MXF(GZ_U_UW(PUM,PDZZ)*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) + CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW_PWM*ZFLX)), X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) + CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX)*MZF(ZFLX)),& X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MZF(1,IKU,1,ZFLX)), & + CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MZF(ZFLX)), & X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) END IF DO JSV=1,NSV - CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)*MZF(1,IKU,1,ZFLX)), & + CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)*MZF(ZFLX)), & X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) , .TRUE.) END DO CALL SECOND_MNH(ZTIME2) diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90 index 87031f8b23da785f77227e0118c4427c7fc8203b..eb1de6d6f538c67a22ef4c547ea80a9a5c622d69 100644 --- a/src/MNH/turb_hor_vw.f90 +++ b/src/MNH/turb_hor_vw.f90 @@ -197,7 +197,7 @@ IKE = SIZE(PWM,3)-JPVEXT IKU = SIZE(PWM,3) ! ! -IF (.NOT. L2D) GY_W_VW_PWM = GY_W_VW(1,IKU,1,PWM,PDYY,PDZZ,PDZY) +IF (.NOT. L2D) GY_W_VW_PWM = GY_W_VW(PWM,PDYY,PDZZ,PDZY) ! ! !* 14. < V'W'> @@ -207,7 +207,7 @@ IF (.NOT. L2D) GY_W_VW_PWM = GY_W_VW(1,IKU,1,PWM,PDYY,PDZZ,PDZY) ! IF (.NOT. L2D) THEN ZFLX(:,:,:) = & - - XCMFS * MYM(MZM(1,IKU,1,PK)) * GY_W_VW_PWM + - XCMFS * MYM(MZM(PK)) * GY_W_VW_PWM !! & to be tested !! - (2./3.) * XCMFB * MZM( ZVPTV * MYM( PLM / SQRT(PTKEM) * XG / PTHVREF ) ) ELSE @@ -242,16 +242,16 @@ END IF ! compute the source for rho*V due to this residual flux ( the other part is ! taken into account in TURB_VER) IF (.NOT. L2D) & -PRVS(:,:,:) = PRVS(:,:,:) - DZF(1,IKU,1, ZFLX* MYM( PMZM_PRHODJ ) / MYM ( PDZZ ) ) +PRVS(:,:,:) = PRVS(:,:,:) - DZF( ZFLX* MYM( PMZM_PRHODJ ) / MYM ( PDZZ ) ) ! !computation of the source for rho*W due to this flux IF (.NOT. L2D) THEN IF (.NOT. LFLAT) THEN PRWS(:,:,:) = PRWS(:,:,:) & - -DYF( MZM(1,IKU,1, MYM(PRHODJ) * PINV_PDYY) * ZFLX) & - +DZM(1,IKU,1, PRHODJ * MYF( MZF(1,IKU,1, ZFLX*PDZY ) * PINV_PDYY ) / MZF(1,IKU,1,PDZZ) ) + -DYF( MZM( MYM(PRHODJ) * PINV_PDYY) * ZFLX) & + +DZM( PRHODJ * MYF( MZF( ZFLX*PDZY ) * PINV_PDYY ) / MZF(PDZZ) ) ELSE - PRWS(:,:,:) = PRWS(:,:,:) - DYF( MZM(1,IKU,1, MYM(PRHODJ) * PINV_PDYY) * ZFLX) + PRWS(:,:,:) = PRWS(:,:,:) - DYF( MZM( MYM(PRHODJ) * PINV_PDYY) * ZFLX) END IF END IF ! @@ -260,7 +260,7 @@ IF (KSPLT==1) THEN !Contribution to the dynamic production of TKE: ! IF (.NOT. L2D) THEN - ZWORK(:,:,:) =-MZF(1,IKU,1, MYF( ZFLX *( GZ_V_VW(1,IKU,1,PVM,PDZZ) + GY_W_VW_PWM ) ) ) + ZWORK(:,:,:) =-MZF( MYF( ZFLX *( GZ_V_VW(PVM,PDZZ) + GY_W_VW_PWM ) ) ) ! ! ! evaluate the dynamic production at w(IKB+1) in PDP(IKB) @@ -287,19 +287,19 @@ END IF ! IF (LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MYF(ZFLX)), X_LES_SUBGRID_WV , .TRUE. ) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MYF(GZ_V_VW(1,IKU,1,PVM,PDZZ)*ZFLX)),& + CALL LES_MEAN_SUBGRID( MZF(MYF(ZFLX)), X_LES_SUBGRID_WV , .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(MYF(GZ_V_VW(PVM,PDZZ)*ZFLX)),& X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) - CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MYF(GY_W_VW(1,IKU,1,PWM,PDYY,PDZZ,PDZY)*ZFLX)),& + CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*ZFLX)),& X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) - CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY)*MZF(1,IKU,1,ZFLX)),& + CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY)*MZF(ZFLX)),& X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MZF(1,IKU,1,ZFLX)), & + CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MZF(ZFLX)), & X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) END IF DO JSV=1,NSV - CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)*MZF(1,IKU,1,ZFLX)), & + CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)*MZF(ZFLX)), & X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV), .TRUE.) END DO CALL SECOND_MNH(ZTIME2) diff --git a/src/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90 index de1cf6c4c1abd2b7864b008a415fc54ca5cc7880..37b7bcfd9f135dce15593afefb79f6af73c85268 100644 --- a/src/MNH/turb_ver.f90 +++ b/src/MNH/turb_ver.f90 @@ -225,13 +225,7 @@ END MODULE MODI_TURB_VER !! field to be derivated !! _(M,UW,...) represent the localization of the !! field derivated -!! !! -!! MXM,MXF,MYM,MYF,MZM,MZF -!! : Shuman functions (mean operators) -!! DXF,DYF,DZF,DZM -!! : Shuman functions (difference operators) -!! !! SUBROUTINE TRIDIAG : to compute the splitted implicit evolution !! of a variable located at a mass point !! diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90 index 6371555afdd737b51d3b70a3addb66b12bd59431..96b5b1f48b85f31796d469abc4ceff58609b99be 100644 --- a/src/MNH/turb_ver_dyn_flux.f90 +++ b/src/MNH/turb_ver_dyn_flux.f90 @@ -428,7 +428,7 @@ ZDIRSINZW(:,:) = SQRT(1.-PDIRCOSZW(:,:)**2) ! compute the coefficients for the uncentred gradient computation near the ! ground ! -ZKEFF(:,:,:) = MZM(KKA,KKU,KKL, PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) ! ZUSLOPEM(:,:,1)=PUSLOPEM(:,:) ZVSLOPEM(:,:,1)=PVSLOPEM(:,:) @@ -444,7 +444,7 @@ ZVSLOPEM(:,:,1)=PVSLOPEM(:,:) ! Preparation of the arguments for TRIDIAG_WIND ! ZA(:,:,:) = -PTSTEP * XCMFS * & - MXM( ZKEFF ) * MXM(MZM(KKA,KKU,KKL, PRHODJ )) / & + MXM( ZKEFF ) * MXM(MZM( PRHODJ )) / & MXM( PDZZ )**2 ! ! @@ -498,7 +498,7 @@ PRUS(:,:,:)=PRUS(:,:,:)+MXM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP ! vertical flux of the U wind component ! ZFLXZ(:,:,:) = -XCMFS * MXM(ZKEFF) * & - DZM (KKA,KKU,KKL,PIMPL*ZRES + PEXPL*PUM) / MXM(PDZZ) + DZM (PIMPL*ZRES + PEXPL*PUM) / MXM(PDZZ) ! ! surface flux ZFLXZ(:,:,IKB:IKB) = MXM(PDZZ(:,:,IKB:IKB)) * & @@ -531,7 +531,7 @@ PWU(:,:,:) = ZFLXZ(:,:,:) ! Contribution to the dynamic production of TKE ! compute the dynamic production at the mass point ! -PDP(:,:,:) = - MZF(KKA,KKU,KKL, MXF ( ZFLXZ * GZ_U_UW(KKA,KKU,KKL,PUM,PDZZ) ) ) +PDP(:,:,:) = - MZF( MXF ( ZFLXZ * GZ_U_UW(PUM,PDZZ) ) ) ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) PDP(:,:,IKB:IKB) = - MXF ( & @@ -543,8 +543,8 @@ PDP(:,:,IKB:IKB) = - MXF ( ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MXF(ZFLXZ)), X_LES_SUBGRID_WU ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MXF(GZ_U_UW(KKA,KKU,KKL,PUM,PDZZ) & + CALL LES_MEAN_SUBGRID( MZF(MXF(ZFLXZ)), X_LES_SUBGRID_WU ) + CALL LES_MEAN_SUBGRID( MZF(MXF(GZ_U_UW(PUM,PDZZ) & & *ZFLXZ)), X_LES_RES_ddxa_U_SBG_UaU ) CALL LES_MEAN_SUBGRID( XCMFS * ZKEFF, X_LES_SUBGRID_Km ) CALL SECOND_MNH(ZTIME2) @@ -561,17 +561,17 @@ IF(HTURBDIM=='3DIM') THEN ! IF (.NOT. LFLAT) THEN PRWS(:,:,:)= PRWS & - -DXF( MZM(KKA,KKU,KKL, MXM(PRHODJ) /PDXX ) * ZFLXZ ) & - +DZM(KKA,KKU,KKL, PRHODJ / MZF(KKA,KKU,KKL,PDZZ ) * & - MXF( MZF(KKA,KKU,KKL, ZFLXZ*PDZX ) / PDXX ) & + -DXF( MZM( MXM(PRHODJ) /PDXX ) * ZFLXZ ) & + +DZM( PRHODJ / MZF(PDZZ ) * & + MXF( MZF( ZFLXZ*PDZX ) / PDXX ) & ) ELSE - PRWS(:,:,:)= PRWS -DXF( MZM(KKA,KKU,KKL, MXM(PRHODJ) /PDXX ) * ZFLXZ ) + PRWS(:,:,:)= PRWS -DXF( MZM( MXM(PRHODJ) /PDXX ) * ZFLXZ ) END IF ! ! Complete the Dynamical production with the W wind component ! - ZA(:,:,:)=-MZF(KKA,KKU,KKL, MXF ( ZFLXZ * GX_W_UW(KKA,KKU,KKL, PWM,PDXX,PDZZ,PDZX) ) ) + ZA(:,:,:)=-MZF( MXF ( ZFLXZ * GX_W_UW( PWM,PDXX,PDZZ,PDZX) ) ) ! ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) @@ -593,17 +593,17 @@ IF(HTURBDIM=='3DIM') THEN ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MXF(GX_W_UW(KKA,KKU,KKL,PWM,PDXX,& + CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,& PDZZ,PDZX)*ZFLXZ)), X_LES_RES_ddxa_W_SBG_UaW ) CALL LES_MEAN_SUBGRID( MXF(GX_M_U(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)& - * MZF(KKA,KKU,KKL,ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW ) + * MZF(ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW ) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID(MXF(GX_U_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX)& - *MZF(KKA,KKU,KKL,ZFLXZ)),X_LES_RES_ddxa_Rt_SBG_UaW ) + CALL LES_MEAN_SUBGRID(MXF(GX_U_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)& + *MZF(ZFLXZ)),X_LES_RES_ddxa_Rt_SBG_UaW ) END IF DO JSV=1,NSV - CALL LES_MEAN_SUBGRID( MXF(GX_U_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,& - PDZX)*MZF(KKA,KKU,KKL,ZFLXZ)),X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( MXF(GX_U_M(PSVM(:,:,:,JSV),PDXX,PDZZ,& + PDZX)*MZF(ZFLXZ)),X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) END DO CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -621,7 +621,7 @@ END IF ! Preparation of the arguments for TRIDIAG_WIND !! ZA(:,:,:) = - PTSTEP * XCMFS * & - MYM( ZKEFF ) * MYM(MZM(KKA,KKU,KKL, PRHODJ )) / & + MYM( ZKEFF ) * MYM(MZM( PRHODJ )) / & MYM( PDZZ )**2 ! ! @@ -673,7 +673,7 @@ PRVS(:,:,:)=PRVS(:,:,:)+MYM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PVM(:,:,:))/PTSTEP ! vertical flux of the V wind component ! ZFLXZ(:,:,:) = -XCMFS * MYM(ZKEFF) * & - DZM(KKA,KKU,KKL, PIMPL*ZRES + PEXPL*PVM ) / MYM(PDZZ) + DZM( PIMPL*ZRES + PEXPL*PVM ) / MYM(PDZZ) ! ZFLXZ(:,:,IKB:IKB) = MYM(PDZZ(:,:,IKB:IKB)) * & ( ZSOURCE(:,:,IKB:IKB) & @@ -705,7 +705,7 @@ PWV(:,:,:) = ZFLXZ(:,:,:) ! Contribution to the dynamic production of TKE ! compute the dynamic production contribution at the mass point ! -ZA(:,:,:) = - MZF(KKA,KKU,KKL, MYF ( ZFLXZ * GZ_V_VW(KKA,KKU,KKL,PVM,PDZZ) ) ) +ZA(:,:,:) = - MZF( MYF ( ZFLXZ * GZ_V_VW(PVM,PDZZ) ) ) ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) ZA(:,:,IKB:IKB) = & @@ -720,8 +720,8 @@ PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MYF(ZFLXZ)), X_LES_SUBGRID_WV ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MYF(GZ_V_VW(KKA,KKU,KKL,PVM,PDZZ)*& + CALL LES_MEAN_SUBGRID( MZF(MYF(ZFLXZ)), X_LES_SUBGRID_WV ) + CALL LES_MEAN_SUBGRID( MZF(MYF(GZ_V_VW(PVM,PDZZ)*& & ZFLXZ)), X_LES_RES_ddxa_V_SBG_UaV ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -737,18 +737,18 @@ IF(HTURBDIM=='3DIM') THEN IF (.NOT. L2D) THEN IF (.NOT. LFLAT) THEN PRWS(:,:,:)= PRWS(:,:,:) & - -DYF( MZM(KKA,KKU,KKL, MYM(PRHODJ) /PDYY ) * ZFLXZ ) & - +DZM(KKA,KKU,KKL, PRHODJ / MZF(KKA,KKU,KKL,PDZZ ) * & - MYF( MZF(KKA,KKU,KKL, ZFLXZ*PDZY ) / PDYY ) & + -DYF( MZM( MYM(PRHODJ) /PDYY ) * ZFLXZ ) & + +DZM( PRHODJ / MZF(PDZZ ) * & + MYF( MZF( ZFLXZ*PDZY ) / PDYY ) & ) ELSE - PRWS(:,:,:)= PRWS(:,:,:) -DYF( MZM(KKA,KKU,KKL, MYM(PRHODJ) /PDYY ) * ZFLXZ ) + PRWS(:,:,:)= PRWS(:,:,:) -DYF( MZM( MYM(PRHODJ) /PDYY ) * ZFLXZ ) END IF END IF ! ! Complete the Dynamical production with the W wind component IF (.NOT. L2D) THEN - ZA(:,:,:) = - MZF(KKA,KKU,KKL, MYF ( ZFLXZ * GY_W_VW(KKA,KKU,KKL, PWM,PDYY,PDZZ,PDZY) ) ) + ZA(:,:,:) = - MZF( MYF ( ZFLXZ * GY_W_VW( PWM,PDYY,PDZZ,PDZY) ) ) ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) ZA(:,:,IKB:IKB) = - MYF ( & @@ -771,13 +771,13 @@ IF(HTURBDIM=='3DIM') THEN ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MYF(GY_W_VW(KKA,KKU,KKL,PWM,PDYY,& + CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,& PDZZ,PDZY)*ZFLXZ)), X_LES_RES_ddxa_W_SBG_UaW , .TRUE. ) CALL LES_MEAN_SUBGRID( MYF(GY_M_V(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY)& - *MZF(KKA,KKU,KKL,ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE. ) + *MZF(ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE. ) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID( MYF(GY_V_M(KKA,KKU,KKL,PRM(:,:,:,1),PDYY,PDZZ,& - PDZY)*MZF(KKA,KKU,KKL,ZFLXZ)),X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE. ) + CALL LES_MEAN_SUBGRID( MYF(GY_V_M(PRM(:,:,:,1),PDYY,PDZZ,& + PDZY)*MZF(ZFLXZ)),X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE. ) END IF CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -793,7 +793,7 @@ END IF ! IF ( OTURB_FLX .AND. OCLOSE_OUT .AND. HTURBDIM == '1DIM') THEN ZFLXZ(:,:,:)= (2./3.) * PTKEM(:,:,:) & - -XCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*GZ_W_M(KKA,KKU,KKL,PWM,PDZZ) + -XCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*GZ_W_M(PWM,PDZZ) ! to be tested & ! +XCMFB*(4./3.)*PLM(:,:,:)/SQRT(PTKEM(:,:,:))*PTP(:,:,:) ! stores the W variance diff --git a/src/MNH/turb_ver_sv_corr.f90 b/src/MNH/turb_ver_sv_corr.f90 index 280f94392d43526a27e3d6a529fcad99f815da36..b62268e7e82a28d876844fb7abbbcaa02f3e87d0 100644 --- a/src/MNH/turb_ver_sv_corr.f90 +++ b/src/MNH/turb_ver_sv_corr.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-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$ $Revision$ -! MASDEV4_7 turb 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! #################### MODULE MODI_TURB_VER_SV_CORR ! #################### @@ -191,9 +186,9 @@ DO JSV=1,NSV IF (LLES_CALL) THEN ! approximation: diagnosed explicitely (without implicit term) ZFLXZ(:,:,:) = PPSI_SV(:,:,:,JSV)*GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ)**2 - ZFLXZ(:,:,:) = ZCSV / ZCSVD * PLM * PLEPS * MZF(KKA,KKU,KKL,ZFLXZ(:,:,:) ) + ZFLXZ(:,:,:) = ZCSV / ZCSVD * PLM * PLEPS * MZF(ZFLXZ(:,:,:) ) CALL LES_MEAN_SUBGRID( -2.*ZCSVD*SQRT(PTKEM)*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM)*ZFLXZ, X_LES_RES_W_SBG_Sv2(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_Sv2(:,:,:,JSV) ) END IF ! ! covariance ThvSv @@ -204,7 +199,7 @@ DO JSV=1,NSV ZFLXZ(:,:,:)= ( XCSHF * PPHI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & * GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) & * GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ) - ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCTSVD) * MZF(KKA,KKU,KKL,ZFLXZ) + ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCTSVD) * MZF(ZFLXZ) CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) ) CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) ! @@ -213,7 +208,7 @@ DO JSV=1,NSV ZFLXZ(:,:,:)= ( XCHF * PPSI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & * GZ_M_W(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ) & * GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ) - ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCQSVD) * MZF(KKA,KKU,KKL,ZFLXZ) + ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCQSVD) * MZF(ZFLXZ) CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) END IF diff --git a/src/MNH/turb_ver_sv_flux.f90 b/src/MNH/turb_ver_sv_flux.f90 index 356cf67001e980360b50ae038cc3e4be6b892216..ed660517d50265bf29be78168517612611e9cdf1 100644 --- a/src/MNH/turb_ver_sv_flux.f90 +++ b/src/MNH/turb_ver_sv_flux.f90 @@ -377,7 +377,7 @@ IKTB =1+JPVEXT_TURB ! ISV=SIZE(PSVM,4) ! -ZKEFF(:,:,:) = MZM(KKA,KKU,KKL, PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) ! IF(LBLOWSNOW) THEN ! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables @@ -396,7 +396,7 @@ DO JSV=1,ISV ! ! Preparation of the arguments for TRIDIAG ZA(:,:,:) = -PTSTEP*ZCSV*PPSI_SV(:,:,:,JSV) * & - ZKEFF * MZM(KKA,KKU,KKL,PRHODJ) / & + ZKEFF * MZM(PRHODJ) / & PDZZ**2 ZSOURCE(:,:,:) = 0. ! @@ -431,8 +431,8 @@ DO JSV=1,ISV IF ( (OTURB_FLX .AND. OCLOSE_OUT) .OR. LLES_CALL ) THEN ! Diagnostic of the cartesian vertical flux ! - ZFLXZ(:,:,:) = -ZCSV * PPSI_SV(:,:,:,JSV) * MZM(KKA,KKU,KKL,PLM*SQRT(PTKEM)) / PDZZ * & - DZM(KKA,KKU,KKL, PIMPL*ZRES(:,:,:) + PEXPL*PSVM(:,:,:,JSV) ) + ZFLXZ(:,:,:) = -ZCSV * PPSI_SV(:,:,:,JSV) * MZM(PLM*SQRT(PTKEM)) / PDZZ * & + DZM( PIMPL*ZRES(:,:,:) + PEXPL*PSVM(:,:,:,JSV) ) ! surface flux !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally ! (in presence of slopes) @@ -476,13 +476,13 @@ DO JSV=1,ISV ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_WSv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( GZ_W_M(KKA,KKU,KKL,PWM,PDZZ)*MZF(KKA,KKU,KKL,ZFLXZ), & + CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( GZ_W_M(PWM,PDZZ)*MZF(ZFLXZ), & X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ)*ZFLXZ), & + CALL LES_MEAN_SUBGRID( MZF(GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ)*ZFLXZ), & X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( -ZCSVP*SQRT(PTKEM)/PLM*MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_SvPz(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM*ZFLXZ), X_LES_RES_W_SBG_WSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( -ZCSVP*SQRT(PTKEM)/PLM*MZF(ZFLXZ), X_LES_SUBGRID_SvPz(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( MZF(PWM*ZFLXZ), X_LES_RES_W_SBG_WSv(:,:,:,JSV) ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90 index 7bcc6799f340016483d8ab7550c05a0cb2699348..44502079481db439d5b06edcd31ce7b00deb0826 100644 --- a/src/MNH/turb_ver_thermo_corr.f90 +++ b/src/MNH/turb_ver_thermo_corr.f90 @@ -467,7 +467,7 @@ ZCOEFF(:,:,IKB+KKL)= (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) / & ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2*KKL)+2.*PDZZ(:,:,IKB+KKL)) / & ( (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) * PDZZ(:,:,IKB+KKL) ) ! -ZKEFF(:,:,:) = MZM(KKA,KKU,KKL, PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) ! ! Flags for 3rd order quantities ! @@ -494,49 +494,49 @@ END IF !* 4.2 <THl THl> ! ! Compute the turbulent variance F and F' at time t-dt. - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(KKA,KKU,KKL,PPHI3*PDTH_DZ**2) + ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(PPHI3*PDTH_DZ**2) ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately ! ! Effect of 3rd order terms in temperature flux (at mass point) ! ! d(w'th'2)/dz IF (GFTH2) THEN - ZF = ZF + M3_TH2_WTH2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,& + ZF = ZF + M3_TH2_WTH2(PREDTH1,PREDR1,PD,PLEPS,& & PSQRT_TKE) * PFTH2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTH2_O_DDTDZ(PREDTH1,PREDR1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTH2 END IF ! ! d(w'2th')/dz IF (GFWTH) THEN - ZF = ZF + M3_TH2_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTH_DZ,& - & PLM,PLEPS,PTKEM) * MZF(KKA,KKU,KKL,PFWTH) - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& - & PLM,PLEPS,PTKEM,GUSERV) * MZF(KKA,KKU,KKL,PFWTH) + ZF = ZF + M3_TH2_W2TH(PREDTH1,PREDR1,PD,PDTH_DZ,& + & PLM,PLEPS,PTKEM) * MZF(PFWTH) + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,& + & PLM,PLEPS,PTKEM,GUSERV) * MZF(PFWTH) END IF ! IF (KRR/=0) THEN ! d(w'r'2)/dz IF (GFR2) THEN - ZF = ZF + M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,& + ZF = ZF + M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,& & PEMOIST,PDTH_DZ) * PFR2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,& & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 END IF ! ! d(w'2r')/dz IF (GFWR) THEN - ZF = ZF + M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKEM,PBLL_O_E,& - & PEMOIST,PDTH_DZ) * MZF(KKA,KKU,KKL,PFWR) - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& - & PLM,PLEPS,PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * MZF(KKA,KKU,KKL,PFWR) + ZF = ZF + M3_TH2_W2R(PD,PLM,PLEPS,PTKEM,PBLL_O_E,& + & PEMOIST,PDTH_DZ) * MZF(PFWR) + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,& + & PLM,PLEPS,PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * MZF(PFWR) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - ZF = ZF + M3_TH2_WTHR(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,& + ZF = ZF + M3_TH2_WTHR(PREDR1,PD,PLEPS,PSQRT_TKE,& & PBLL_O_E,PEMOIST,PDTH_DZ) * PFTHR - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTHR_O_DDTDZ(PREDTH1,PREDR1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFTHR END IF @@ -544,9 +544,9 @@ END IF ! ZFLXZ(:,:,:) = ZF & ! + PIMPL * XCTV*PLM*PLEPS & - ! *MZF(KKA,KKU,KKL,D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTH_DZ,HTURBDIM,GUSERV) & - ! *DZM(KKA,KKU,KKL,PTHLP - PTHLM) / PDZZ ) & - + PIMPL * ZDFDDTDZ * MZF(KKA,KKU,KKL,DZM(KKA,KKU,KKL,PTHLP - PTHLM) / PDZZ ) + ! *MZF(D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTH_DZ,HTURBDIM,GUSERV) & + ! *DZM(PTHLP - PTHLM) / PDZZ ) & + + PIMPL * ZDFDDTDZ * MZF(DZM(PTHLP - PTHLM) / PDZZ ) ! ! special case near the ground ( uncentred gradient ) ZFLXZ(:,:,IKB) = XCTV * PPHI3(:,:,IKB+KKL) * PLM(:,:,IKB) & @@ -590,7 +590,7 @@ END IF IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_Thl2 ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM)*ZFLXZ, X_LES_RES_W_SBG_Thl2 ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_Thl2 ) CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Thl2 ) CALL LES_MEAN_SUBGRID( PETHETA*ZFLXZ, X_LES_SUBGRID_ThlThv ) CALL LES_MEAN_SUBGRID( -XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) @@ -604,7 +604,7 @@ END IF ! ! ! Compute the turbulent variance F and F' at time t-dt. - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(KKA,KKU,KKL,0.5*(PPHI3+PPSI3)*PDTH_DZ*PDR_DZ) + ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(0.5*(PPHI3+PPSI3)*PDTH_DZ*PDR_DZ) ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately ! @@ -612,65 +612,65 @@ END IF ! ! d(w'th'2)/dz IF (GFTH2) THEN - ZF = ZF + M3_THR_WTH2(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,& + ZF = ZF + M3_THR_WTH2(PREDR1,PD,PLEPS,PSQRT_TKE,& & PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTH2_O_DDTDZ(PREDTH1,PREDR1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTH2_O_DDRDZ(PREDTH1,PREDR1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTH2 END IF ! ! d(w'2th')/dz IF (GFWTH) THEN - ZF = ZF + M3_THR_W2TH(KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKEM,& - & PDR_DZ) * MZF(KKA,KKU,KKL,PFWTH) - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& - & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PDR_DZ,PETHETA) * MZF(KKA,KKU,KKL,PFWTH) - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& - & PD,PLM,PLEPS,PTKEM) * MZF(KKA,KKU,KKL,PFWTH) + ZF = ZF + M3_THR_W2TH(PREDR1,PD,PLM,PLEPS,PTKEM,& + & PDR_DZ) * MZF(PFWTH) + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2TH_O_DDTDZ(PREDTH1,PREDR1,& + & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PDR_DZ,PETHETA) * MZF(PFWTH) + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2TH_O_DDRDZ(PREDTH1,PREDR1,& + & PD,PLM,PLEPS,PTKEM) * MZF(PFWTH) END IF ! ! d(w'r'2)/dz IF (GFR2) THEN - ZF = ZF + M3_THR_WR2(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,& + ZF = ZF + M3_THR_WR2(PREDTH1,PD,PLEPS,PSQRT_TKE,& & PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,& & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFR2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WR2_O_DDRDZ(PREDR1,PREDTH1,PD,& & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 END IF ! ! d(w'2r')/dz IF (GFWR) THEN - ZF = ZF + M3_THR_W2R(KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKEM,& - & PDTH_DZ) * MZF(KKA,KKU,KKL,PFWR) - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& - & PLM,PLEPS,PTKEM) * MZF(KKA,KKU,KKL,PFWR) - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& - & PLM,PLEPS,PTKEM,PBLL_O_E,PDTH_DZ,PEMOIST) * MZF(KKA,KKU,KKL,PFWR) + ZF = ZF + M3_THR_W2R(PREDTH1,PD,PLM,PLEPS,PTKEM,& + & PDTH_DZ) * MZF(PFWR) + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,& + & PLM,PLEPS,PTKEM) * MZF(PFWR) + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,& + & PLM,PLEPS,PTKEM,PBLL_O_E,PDTH_DZ,PEMOIST) * MZF(PFWR) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - ZF = ZF + M3_THR_WTHR(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,& + ZF = ZF + M3_THR_WTHR(PREDTH1,PREDR1,PD,PLEPS,& & PSQRT_TKE) * PFTHR - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTHR_O_DDTDZ(PREDTH1,PREDR1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTHR - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTHR_O_DDRDZ(PREDR1,PREDTH1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFTHR END IF ! ZFLXZ(:,:,:) = ZF & + PIMPL * XCTV*PLM*PLEPS*0.5 & - * MZF(KKA,KKU,KKL, ( D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*dthdz)/ddthdz term + * MZF( ( D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*dthdz)/ddthdz term +D_PSI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*dthdz)/ddthdz term - ) *PDR_DZ *DZM(KKA,KKU,KKL,PTHLP - PTHLM ) / PDZZ & + ) *PDR_DZ *DZM(PTHLP - PTHLM ) / PDZZ & +( D_PHI3DRDZ_O_DDRDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*drdz )/ddrdz term +D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*drdz )/ddrdz term - ) *PDTH_DZ *DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ & + ) *PDTH_DZ *DZM(PRP - PRM(:,:,:,1)) / PDZZ & ) & - + PIMPL * ZDFDDTDZ * MZF(KKA,KKU,KKL,DZM(KKA,KKU,KKL,PTHLP - PTHLM(:,:,:)) / PDZZ ) & - + PIMPL * ZDFDDRDZ * MZF(KKA,KKU,KKL,DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ ) + + PIMPL * ZDFDDTDZ * MZF(DZM(PTHLP - PTHLM(:,:,:)) / PDZZ ) & + + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1)) / PDZZ ) ! ! special case near the ground ( uncentred gradient ) ZFLXZ(:,:,IKB) = & @@ -717,7 +717,7 @@ END IF IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_THlRt ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM)*ZFLXZ, X_LES_RES_W_SBG_ThlRt ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_ThlRt ) CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_ThlRt ) CALL LES_MEAN_SUBGRID( PETHETA*ZFLXZ, X_LES_SUBGRID_RtThv ) CALL LES_MEAN_SUBGRID( -XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) @@ -732,49 +732,49 @@ END IF ! ! ! Compute the turbulent variance F and F' at time t-dt. - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(KKA,KKU,KKL,PPSI3*PDR_DZ**2) + ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(PPSI3*PDR_DZ**2) ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately ! ! Effect of 3rd order terms in temperature flux (at mass point) ! ! d(w'r'2)/dz IF (GFR2) THEN - ZF = ZF + M3_R2_WR2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,& + ZF = ZF + M3_R2_WR2(PREDR1,PREDTH1,PD,PLEPS,& & PSQRT_TKE) * PFR2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WR2_O_DDRDZ(PREDR1,PREDTH1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFR2 END IF ! ! d(w'2r')/dz IF (GFWR) THEN - ZF = ZF + M3_R2_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDR_DZ,& - & PLM,PLEPS,PTKEM) * MZF(KKA,KKU,KKL,PFWR) - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& - & PD,PLM,PLEPS,PTKEM,GUSERV) * MZF(KKA,KKU,KKL,PFWR) + ZF = ZF + M3_R2_W2R(PREDR1,PREDTH1,PD,PDR_DZ,& + & PLM,PLEPS,PTKEM) * MZF(PFWR) + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2R_O_DDRDZ(PREDR1,PREDTH1,& + & PD,PLM,PLEPS,PTKEM,GUSERV) * MZF(PFWR) END IF ! IF (KRR/=0) THEN ! d(w'r'2)/dz IF (GFTH2) THEN - ZF = ZF + M3_R2_WTH2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,& + ZF = ZF + M3_R2_WTH2(PD,PLEPS,PSQRT_TKE,& & PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTH2_O_DDRDZ(PREDR1,& & PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 END IF ! ! d(w'2r')/dz IF (GFWTH) THEN - ZF = ZF + M3_R2_W2TH(KKA,KKU,KKL,PD,PLM,PLEPS,PTKEM,& - & PBLL_O_E,PETHETA,PDR_DZ) * MZF(KKA,KKU,KKL,PFWTH) - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& - & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * MZF(KKA,KKU,KKL,PFWTH) + ZF = ZF + M3_R2_W2TH(PD,PLM,PLEPS,PTKEM,& + & PBLL_O_E,PETHETA,PDR_DZ) * MZF(PFWTH) + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2TH_O_DDRDZ(PREDR1,PREDTH1,& + & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * MZF(PFWTH) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - ZF = ZF + M3_R2_WTHR(KKA,KKU,KKL,PREDTH1,PD,PLEPS,& + ZF = ZF + M3_R2_WTHR(PREDTH1,PD,PLEPS,& & PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTHR - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTHR_O_DDRDZ(PREDR1,PREDTH1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTHR END IF @@ -782,9 +782,9 @@ END IF ! ZFLXZ(:,:,:) = ZF & + PIMPL * XCTV*PLM*PLEPS & - *MZF(KKA,KKU,KKL,D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDR_DZ,HTURBDIM,GUSERV) & - *DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ ) & - + PIMPL * ZDFDDRDZ * MZF(KKA,KKU,KKL,DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ ) + *MZF(D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDR_DZ,HTURBDIM,GUSERV) & + *DZM(PRP - PRM(:,:,:,1)) / PDZZ ) & + + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1)) / PDZZ ) ! ! special case near the ground ( uncentred gradient ) ZFLXZ(:,:,IKB) = XCHV * PPSI3(:,:,IKB+KKL) * PLM(:,:,IKB) & @@ -824,7 +824,7 @@ END IF IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_Rt2 ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM)*ZFLXZ, X_LES_RES_W_SBG_Rt2 ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_Rt2 ) CALL LES_MEAN_SUBGRID( PEMOIST*ZFLXZ, X_LES_SUBGRID_RtThv , .TRUE. ) CALL LES_MEAN_SUBGRID( -XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Rt2 ) diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90 index 2e01a94afd4b1cc8602f9764a5eef2df521260bb..25c9d06f4aff387a740da65634569d1ddaf5bb3b 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.f90 @@ -488,7 +488,7 @@ GUSERV = (KRR/=0) ! compute the coefficients for the uncentred gradient computation near the ! ground ! -ZKEFF(:,:,:) = MZM(KKA,KKU,KKL, PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) ! ! Flags for 3rd order quantities ! @@ -515,7 +515,7 @@ END IF ! ! Compute the turbulent flux F and F' at time t-dt. ! -ZF (:,:,:) = -XCSHF*PPHI3*ZKEFF*DZM(KKA,KKU,KKL,PTHLM)/PDZZ +ZF (:,:,:) = -XCSHF*PPHI3*ZKEFF*DZM(PTHLM)/PDZZ ZDFDDTDZ(:,:,:) = -XCSHF*ZKEFF*D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) ! @@ -523,10 +523,10 @@ ZDFDDTDZ(:,:,:) = -XCSHF*ZKEFF*D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3, ! ! d(w'2th')/dz IF (GFWTH) THEN - Z3RDMOMENT= M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,ZKEFF,PTKEM) + Z3RDMOMENT= M3_WTH_W2TH(PREDTH1,PREDR1,PD,ZKEFF,PTKEM) ! ZF = ZF + Z3RDMOMENT * PFWTH - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2TH_O_DDTDZ(PREDTH1,PREDR1,& & PD,PBLL_O_E,PETHETA,ZKEFF,PTKEM) * PFWTH END IF ! @@ -534,35 +534,35 @@ END IF IF (GFTH2) THEN Z3RDMOMENT= M3_WTH_WTH2(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) ! - ZF = ZF + Z3RDMOMENT * MZM(KKA,KKU,KKL,PFTH2) + ZF = ZF + Z3RDMOMENT * MZM(PFTH2) ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTH2_O_DDTDZ(Z3RDMOMENT,PREDTH1,PREDR1,& - & PD,PBLL_O_E,PETHETA) * MZM(KKA,KKU,KKL,PFTH2) + & PD,PBLL_O_E,PETHETA) * MZM(PFTH2) END IF ! ! d(w'2r')/dz IF (GFWR) THEN - ZF = ZF + M3_WTH_W2R(KKA,KKU,KKL,PREDTH1,PREDR1,PD,ZKEFF,& + ZF = ZF + M3_WTH_W2R(PD,ZKEFF,& & PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * PFWR - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2R_O_DDTDZ(PREDTH1,PREDR1,& & PD,ZKEFF,PTKEM,PBLL_O_E,PEMOIST) * PFWR END IF ! ! d(w'r'2)/dz IF (GFR2) THEN - ZF = ZF + M3_WTH_WR2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,ZKEFF,PTKEM,& - & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTH_DZ) * MZM(KKA,KKU,KKL,PFR2) - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& - & ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) * MZM(KKA,KKU,KKL,PFR2) + ZF = ZF + M3_WTH_WR2(PD,ZKEFF,PTKEM,& + & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTH_DZ) * MZM(PFR2) + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,& + & ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) * MZM(PFR2) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - Z3RDMOMENT= M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& + Z3RDMOMENT= M3_WTH_WTHR(PREDR1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& & PLEPS,PEMOIST) ! - ZF = ZF + Z3RDMOMENT * MZM(KKA,KKU,KKL,PFTHR) + ZF = ZF + Z3RDMOMENT * MZM(PFTHR) ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTHR_O_DDTDZ(Z3RDMOMENT,PREDTH1,& - & PREDR1,PD,PBLL_O_E,PETHETA) * MZM(KKA,KKU,KKL,PFTHR) + & PREDR1,PD,PBLL_O_E,PETHETA) * MZM(PFTHR) END IF ! !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally @@ -593,7 +593,7 @@ PRTHLS(:,:,:)= PRTHLS(:,:,:) + & ! Conservative potential temperature flux : ! ZFLXZ(:,:,:) = ZF & - + PIMPL * ZDFDDTDZ * DZM(KKA,KKU,KKL,PTHLP - PTHLM) / PDZZ + + PIMPL * ZDFDDTDZ * DZM(PTHLP - PTHLM) / PDZZ ! ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) ! @@ -622,16 +622,16 @@ END IF ! ! Contribution of the conservative temperature flux to the buoyancy flux IF (KRR /= 0) THEN - PTP(:,:,:) = PBETA * MZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL,PETHETA) * ZFLXZ ) + PTP(:,:,:) = PBETA * MZF( MZM(PETHETA) * ZFLXZ ) PTP(:,:,IKB)= PBETA(:,:,IKB) * PETHETA(:,:,IKB) * & 0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) ) ELSE - PTP(:,:,:)= PBETA * MZF(KKA,KKU,KKL, ZFLXZ ) + PTP(:,:,:)= PBETA * MZF( ZFLXZ ) END IF ! ! Buoyancy flux at flux points ! -PWTHV = MZM(KKA,KKU,KKL,PETHETA) * ZFLXZ +PWTHV = MZM(PETHETA) * ZFLXZ PWTHV(:,:,IKB) = PETHETA(:,:,IKB) * ZFLXZ(:,:,IKB) ! !* 2.3 Partial vertical divergence of the < Rc w > flux @@ -639,14 +639,14 @@ PWTHV(:,:,IKB) = PETHETA(:,:,IKB) * ZFLXZ(:,:,IKB) IF ( KRRL >= 1 ) THEN IF ( KRRI >= 1 ) THEN PRRS(:,:,:,2) = PRRS(:,:,:,2) - & - DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PATHETA*2.*PSRCM )*ZFLXZ/PDZZ ) & + DZF( MZM( PRHODJ*PATHETA*2.*PSRCM )*ZFLXZ/PDZZ ) & *(1.0-PFRAC_ICE(:,:,:)) PRRS(:,:,:,4) = PRRS(:,:,:,4) - & - DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PATHETA*2.*PSRCM )*ZFLXZ/PDZZ ) & + DZF( MZM( PRHODJ*PATHETA*2.*PSRCM )*ZFLXZ/PDZZ ) & *PFRAC_ICE(:,:,:) ELSE PRRS(:,:,:,2) = PRRS(:,:,:,2) - & - DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PATHETA*2.*PSRCM )*ZFLXZ/PDZZ ) + DZF( MZM( PRHODJ*PATHETA*2.*PSRCM )*ZFLXZ/PDZZ ) END IF END IF ! @@ -654,22 +654,22 @@ END IF ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_WThl ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM*ZFLXZ), X_LES_RES_W_SBG_WThl ) - CALL LES_MEAN_SUBGRID( GZ_W_M(KKA,KKU,KKL,PWM,PDZZ)*MZF(KKA,KKU,KKL,ZFLXZ),& + CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WThl ) + CALL LES_MEAN_SUBGRID( MZF(PWM*ZFLXZ), X_LES_RES_W_SBG_WThl ) + CALL LES_MEAN_SUBGRID( GZ_W_M(PWM,PDZZ)*MZF(ZFLXZ),& & X_LES_RES_ddxa_W_SBG_UaThl ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PDTH_DZ*ZFLXZ), X_LES_RES_ddxa_Thl_SBG_UaThl ) - CALL LES_MEAN_SUBGRID( -XCTP*PSQRT_TKE/PLM*MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_ThlPz ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MZM(KKA,KKU,KKL,PETHETA)*ZFLXZ), X_LES_SUBGRID_WThv ) + CALL LES_MEAN_SUBGRID( MZF(PDTH_DZ*ZFLXZ), X_LES_RES_ddxa_Thl_SBG_UaThl ) + CALL LES_MEAN_SUBGRID( -XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ), X_LES_SUBGRID_ThlPz ) + CALL LES_MEAN_SUBGRID( MZF(MZM(PETHETA)*ZFLXZ), X_LES_SUBGRID_WThv ) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PDR_DZ*ZFLXZ), X_LES_RES_ddxa_Rt_SBG_UaThl ) + CALL LES_MEAN_SUBGRID( MZF(PDR_DZ*ZFLXZ), X_LES_RES_ddxa_Rt_SBG_UaThl ) END IF !* diagnostic of mixing coefficient for heat - ZA = DZM(KKA,KKU,KKL,PTHLP) + ZA = DZM(PTHLP) WHERE (ZA==0.) ZA=1.E-6 ZA = - ZFLXZ / ZA * PDZZ ZA(:,:,IKB) = XCSHF*PPHI3(:,:,IKB)*ZKEFF(:,:,IKB) - ZA = MZF(KKA,KKU,KKL, ZA ) + ZA = MZF( ZA ) ZA = MIN(MAX(ZA,-1000.),1000.) CALL LES_MEAN_SUBGRID( ZA, X_LES_SUBGRID_Kh ) ! @@ -694,17 +694,17 @@ IF (HTOM=='TM06') CALL TM06_H(IKB,IKTB,IKTE,PTSTEP,PZZ,ZFLXZ,PBL_DEPTH) IF (KRR /= 0) THEN ! Compute the turbulent flux F and F' at time t-dt. ! - ZF (:,:,:) = -XCSHF*PPSI3*ZKEFF*DZM(KKA,KKU,KKL,PRM(:,:,:,1))/PDZZ + ZF (:,:,:) = -XCSHF*PPSI3*ZKEFF*DZM(PRM(:,:,:,1))/PDZZ ZDFDDRDZ(:,:,:) = -XCSHF*ZKEFF*D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) ! ! Effect of 3rd order terms in temperature flux (at flux point) ! ! d(w'2r')/dz IF (GFWR) THEN - Z3RDMOMENT= M3_WR_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,ZKEFF,PTKEM) + Z3RDMOMENT= M3_WR_W2R(PREDR1,PREDTH1,PD,ZKEFF,PTKEM) ! ZF = ZF + Z3RDMOMENT * PFWR - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,& & PBLL_O_E,PEMOIST,ZKEFF,PTKEM) * PFWR END IF ! @@ -712,35 +712,35 @@ IF (KRR /= 0) THEN IF (GFR2) THEN Z3RDMOMENT= M3_WR_WR2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! - ZF = ZF + Z3RDMOMENT * MZM(KKA,KKU,KKL,PFR2) + ZF = ZF + Z3RDMOMENT * MZM(PFR2) ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WR2_O_DDRDZ(Z3RDMOMENT,PREDR1,& - & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(KKA,KKU,KKL,PFR2) + & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFR2) END IF ! ! d(w'2th')/dz IF (GFWTH) THEN - ZF = ZF + M3_WR_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,ZKEFF,& + ZF = ZF + M3_WR_W2TH(PD,ZKEFF,& & PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * PFWTH - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2TH_O_DDRDZ(PREDR1,PREDTH1,& & PD,ZKEFF,PTKEM,PBLL_O_E,PETHETA) * PFWTH END IF ! ! d(w'th'2)/dz IF (GFTH2) THEN - ZF = ZF + M3_WR_WTH2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,ZKEFF,PTKEM,& - & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDR_DZ) * MZM(KKA,KKU,KKL,PFTH2) - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& - &ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) * MZM(KKA,KKU,KKL,PFTH2) + ZF = ZF + M3_WR_WTH2(PD,ZKEFF,PTKEM,& + & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDR_DZ) * MZM(PFTH2) + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,& + &ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) * MZM(PFTH2) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - Z3RDMOMENT= M3_WR_WTHR(KKA,KKU,KKL,PREDTH1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& + Z3RDMOMENT= M3_WR_WTHR(PREDTH1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& & PLEPS,PETHETA) ! - ZF = ZF + Z3RDMOMENT * MZM(KKA,KKU,KKL,PFTHR) - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTHR_O_DDRDZ(KKA,KKU,KKL,Z3RDMOMENT,PREDR1, & - & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(KKA,KKU,KKL,PFTHR) + ZF = ZF + Z3RDMOMENT * MZM(PFTHR) + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTHR_O_DDRDZ(Z3RDMOMENT,PREDR1, & + & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFTHR) END IF ! !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally @@ -771,7 +771,7 @@ IF (KRR /= 0) THEN ! cons. mixing ratio flux : ! ZFLXZ(:,:,:) = ZF & - + PIMPL * ZDFDDRDZ * DZM(KKA,KKU,KKL,PRP - PRM(:,:,:,1)) / PDZZ + + PIMPL * ZDFDDRDZ * DZM(PRP - PRM(:,:,:,1)) / PDZZ ! ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) ! @@ -799,14 +799,14 @@ IF (KRR /= 0) THEN END IF ! ! Contribution of the conservative water flux to the Buoyancy flux - ZA(:,:,:) = PBETA * MZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL,PEMOIST) * ZFLXZ ) + ZA(:,:,:) = PBETA * MZF( MZM(PEMOIST) * ZFLXZ ) ZA(:,:,IKB) = PBETA(:,:,IKB) * PEMOIST(:,:,IKB) * & 0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) ) PTP(:,:,:) = PTP(:,:,:) + ZA(:,:,:) ! ! Buoyancy flux at flux points ! - PWTHV = PWTHV + MZM(KKA,KKU,KKL,PEMOIST) * ZFLXZ + PWTHV = PWTHV + MZM(PEMOIST) * ZFLXZ PWTHV(:,:,IKB) = PWTHV(:,:,IKB) + PEMOIST(:,:,IKB) * ZFLXZ(:,:,IKB) ! !* 3.3 Complete vertical divergence of the < Rc w > flux @@ -814,14 +814,14 @@ IF (KRR /= 0) THEN IF ( KRRL >= 1 ) THEN IF ( KRRI >= 1 ) THEN PRRS(:,:,:,2) = PRRS(:,:,:,2) - & - DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PAMOIST*2.*PSRCM )*ZFLXZ/PDZZ ) & + DZF( MZM( PRHODJ*PAMOIST*2.*PSRCM )*ZFLXZ/PDZZ ) & *(1.0-PFRAC_ICE(:,:,:)) PRRS(:,:,:,4) = PRRS(:,:,:,4) - & - DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PAMOIST*2.*PSRCM )*ZFLXZ/PDZZ ) & + DZF( MZM( PRHODJ*PAMOIST*2.*PSRCM )*ZFLXZ/PDZZ ) & *PFRAC_ICE(:,:,:) ELSE PRRS(:,:,:,2) = PRRS(:,:,:,2) - & - DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL, PRHODJ*PAMOIST*2.*PSRCM )*ZFLXZ/PDZZ ) + DZF( MZM( PRHODJ*PAMOIST*2.*PSRCM )*ZFLXZ/PDZZ ) END IF END IF ! @@ -829,14 +829,14 @@ IF (KRR /= 0) THEN ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_WRt ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PWM*ZFLXZ), X_LES_RES_W_SBG_WRt ) - CALL LES_MEAN_SUBGRID( GZ_W_M(KKA,KKU,KKL,PWM,PDZZ)*MZF(KKA,KKU,KKL,ZFLXZ),& + CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WRt ) + CALL LES_MEAN_SUBGRID( MZF(PWM*ZFLXZ), X_LES_RES_W_SBG_WRt ) + CALL LES_MEAN_SUBGRID( GZ_W_M(PWM,PDZZ)*MZF(ZFLXZ),& & X_LES_RES_ddxa_W_SBG_UaRt ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PDTH_DZ*ZFLXZ), X_LES_RES_ddxa_Thl_SBG_UaRt ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,PDR_DZ*ZFLXZ), X_LES_RES_ddxa_Rt_SBG_UaRt ) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MZM(KKA,KKU,KKL,PEMOIST)*ZFLXZ), X_LES_SUBGRID_WThv , .TRUE. ) - CALL LES_MEAN_SUBGRID( -XCTP*PSQRT_TKE/PLM*MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_RtPz ) + CALL LES_MEAN_SUBGRID( MZF(PDTH_DZ*ZFLXZ), X_LES_RES_ddxa_Thl_SBG_UaRt ) + CALL LES_MEAN_SUBGRID( MZF(PDR_DZ*ZFLXZ), X_LES_RES_ddxa_Rt_SBG_UaRt ) + CALL LES_MEAN_SUBGRID( MZF(MZM(PEMOIST)*ZFLXZ), X_LES_SUBGRID_WThv , .TRUE. ) + CALL LES_MEAN_SUBGRID( -XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ), X_LES_SUBGRID_RtPz ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF @@ -855,14 +855,14 @@ END IF IF ( ((OTURB_FLX .AND. OCLOSE_OUT) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN ! ! recover the Conservative potential temperature flux : - ZA(:,:,:) = DZM(KKA,KKU,KKL,PIMPL * PTHLP + PEXPL * PTHLM) / PDZZ * & - (-PPHI3*MZM(KKA,KKU,KKL,PLM*PSQRT_TKE)) * XCSHF + ZA(:,:,:) = DZM(PIMPL * PTHLP + PEXPL * PTHLM) / PDZZ * & + (-PPHI3*MZM(PLM*PSQRT_TKE)) * XCSHF ZA(:,:,IKB) = ( PIMPL*PSFTHP(:,:) + PEXPL*PSFTHM(:,:) ) & * PDIRCOSZW(:,:) ! ! compute <w Rc> - ZFLXZ(:,:,:) = MZM(KKA,KKU,KKL, PAMOIST * 2.* PSRCM ) * ZFLXZ(:,:,:) + & - MZM(KKA,KKU,KKL, PATHETA * 2.* PSRCM ) * ZA(:,:,:) + ZFLXZ(:,:,:) = MZM( PAMOIST * 2.* PSRCM ) * ZFLXZ(:,:,:) + & + MZM( PATHETA * 2.* PSRCM ) * ZA(:,:,:) ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) ! ! store the liquid water mixing ratio vertical flux @@ -884,7 +884,7 @@ IF ( ((OTURB_FLX .AND. OCLOSE_OUT) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,ZFLXZ), X_LES_SUBGRID_WRc ) + CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WRc ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF diff --git a/src/MNH/two_wayn.f90 b/src/MNH/two_wayn.f90 index 52a22f8d530b86603579bc88ea8c555f242ced5c..5b361e3f9b57f7960993ed78924b5bab83fc2107 100644 --- a/src/MNH/two_wayn.f90 +++ b/src/MNH/two_wayn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1997-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1997-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. @@ -1286,7 +1286,7 @@ ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB) = 2.*ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB) ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB+1:IKU) = ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB+1:IKU) & +ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB:IKU-1) ! -ZAVE_RHODJ=MZM(1,IKU,1,PRHODJ) +ZAVE_RHODJ=MZM(PRHODJ) PRWS(IXOR:IXEND,IYOR:IYEND,:) = PRWS(IXOR:IXEND,IYOR:IYEND,:) & - ZK2W * ZAVE_RHODJ(IXOR:IXEND,IYOR:IYEND,:) * ( PWM(IXOR:IXEND,IYOR:IYEND,:) & -ZWM(IXOR:IXEND,IYOR:IYEND,:)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) diff --git a/src/MNH/ver_dyn.f90 b/src/MNH/ver_dyn.f90 index 49b6ef42936c3747e2784377d34bee9ae7ee0850..925c2225b66e5466ba7fc21484e247670678eb61 100644 --- a/src/MNH/ver_dyn.f90 +++ b/src/MNH/ver_dyn.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. @@ -80,7 +80,7 @@ END MODULE MODI_VER_DYN !! subroutine VER_INT_DYN : to initialize the horizontal momentum !! subroutine WGUESS : to initialize vertical momentum !! subroutine ANEL_BALANCE1 : to apply the anelastic correction -!! functions MXM ,MYM ,MZM : Shuman operators +!! functions MXM, MYM : Shuman operators !! !! !! IMPLICIT ARGUMENTS diff --git a/src/MNH/ver_int_dyn.f90 b/src/MNH/ver_int_dyn.f90 index 1065cdc10a890b91b3cdee4f2164fc58bcc768b4..912522f9835bd6d86bd2020c7baaa1a92d5c2eae 100644 --- a/src/MNH/ver_int_dyn.f90 +++ b/src/MNH/ver_int_dyn.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. @@ -186,7 +186,7 @@ ZRHODV_SH(:,:,1) = ZRHODV_SH(:,:,2) !* 3.1 Altitude of the mass points on the MESO-NH grid ! ----------------------------------------------- ! -ZZMASS(:,:,:)=MZF(1,IKU,1,XZZ(:,:,:)) +ZZMASS(:,:,:)=MZF(XZZ(:,:,:)) ZZMASS(:,:,SIZE(XZZ,3))=1.5*XZZ(:,:,SIZE(XZZ,3))-0.5*XZZ(:,:,SIZE(XZZ,3)-1) ! !* 3.2 Interpolation on the MESO-NH grid diff --git a/src/MNH/ver_int_thermo.f90 b/src/MNH/ver_int_thermo.f90 index caace8ad5fa37979d8840f7c279c6c98bf95ce92..1d3424a943e422cf37b2ec52dd4651470c25a108 100644 --- a/src/MNH/ver_int_thermo.f90 +++ b/src/MNH/ver_int_thermo.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. @@ -198,7 +198,7 @@ REAL,DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PLSRVM ! Large scale vapor ! ------------------------------ ! INTEGER ::ILUOUT0, IRESP -INTEGER ::IKB,IKE,IIB,IIE,IJB,IJE,IKU +INTEGER ::IKB,IKE,IIB,IIE,IJB,IJE INTEGER, DIMENSION(2) ::IIJ INTEGER :: IK4000 INTEGER ::JK @@ -270,7 +270,6 @@ ILUOUT0 = TLUOUT0%NLU CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IKB=JPVEXT+1 IKE=SIZE(XZZ,3)-JPVEXT -IKU=SIZE(XZZ,3) ! ! !------------------------------------------------------------------------------- @@ -515,7 +514,7 @@ PDIAG = ZTIME2 - ZTIME1 ! !20140217 upgrade shuman fct MZF !$ZZMASS(:,:,:)=MZF(XZZ(:,:,:)) -ZZMASS(:,:,:)=MZF(1,IKU,1,XZZ(:,:,:)) +ZZMASS(:,:,:)=MZF(XZZ(:,:,:)) !20131113 check CALL MPPDB_CHECK3D(ZZMASS,"ver_int_thermo6::ZZMASS",PRECISION) ZZMASS(:,:,SIZE(XZZ,3))=1.5*XZZ(:,:,SIZE(XZZ,3))-0.5*XZZ(:,:,SIZE(XZZ,3)-1) diff --git a/src/MNH/ver_interp_field.f90 b/src/MNH/ver_interp_field.f90 index 1eb52591ae889b6f813b5238972b3f79384bb79f..e380b7da0d431d133a1decd4e6ace07786cf7887 100644 --- a/src/MNH/ver_interp_field.f90 +++ b/src/MNH/ver_interp_field.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1997-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1997-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. @@ -157,9 +157,9 @@ CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) ! ----------- ! !* shift of grids to mass points -ZGRID1(:,:,:)=MZF(1,IKU,1,PZZ_LS(:,:,:)) +ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:)) ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2) -ZGRID2(:,:,:)=MZF(1,IKU,1,PZZ(:,:,:)) +ZGRID2(:,:,:)=MZF(PZZ(:,:,:)) ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2) !* move the first physical level if above the target grid ZGRID1(:,:,1:IKB)=MIN(ZGRID1(:,:,1:IKB),ZGRID2(:,:,1:IKB)) @@ -199,9 +199,9 @@ CALL MPPDB_CHECK3D(PUT,"VERINTERPFIELD:PUT",PRECISION) ! ----------- ! !* shift of grids to mass points -ZGRID1(:,:,:)=MZF(1,IKU,1,PZZ_LS(:,:,:)) +ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:)) ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2) -ZGRID2(:,:,:)=MZF(1,IKU,1,PZZ(:,:,:)) +ZGRID2(:,:,:)=MZF(PZZ(:,:,:)) ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2) !* move the first physical level if above the target grid ZGRID1(:,:,1:IKB)=MIN(ZGRID1(:,:,1:IKB),ZGRID2(:,:,1:IKB)) @@ -246,9 +246,9 @@ PLSWM (:,:,:) = VER_INTERP_LIN(PLSWM (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) ! ------------------------- ! !* shift of grids to mass points -ZGRID1(:,:,:)=MZF(1,IKU,1,PZZ_LS(:,:,:)) +ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:)) ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2) -ZGRID2(:,:,:)=MZF(1,IKU,1,PZZ(:,:,:)) +ZGRID2(:,:,:)=MZF(PZZ(:,:,:)) ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2) ! CALL COEF_VER_INTERP_LIN(ZGRID1(:,:,:),ZGRID2(:,:,:)) @@ -292,9 +292,9 @@ END DO ! ------------ ! !* shift of grids to mass points -ZGRID1(:,:,:)=MZF(1,IKU,1,PZZ_LS(:,:,:)) +ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:)) ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2) -ZGRID2(:,:,:)=MZF(1,IKU,1,PZZ(:,:,:)) +ZGRID2(:,:,:)=MZF(PZZ(:,:,:)) ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2) !* move the first physical level if above the target grid ZGRID1(:,:,1:IKB)=MIN(ZGRID1(:,:,1:IKB),ZGRID2(:,:,1:IKB)) diff --git a/src/MNH/ver_interp_to_mixed_grid.f90 b/src/MNH/ver_interp_to_mixed_grid.f90 index 1b2d4d6a0fb5905bb397b94dfcec75e811a99c00..94b161a5d4989fd24bcc8dc2305436acfc304d03 100644 --- a/src/MNH/ver_interp_to_mixed_grid.f90 +++ b/src/MNH/ver_interp_to_mixed_grid.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. @@ -290,13 +290,13 @@ IF (HFILE=='ATM ') THEN ALLOCATE(XZFLUX_MX(IIU,IJU,IKU)) ALLOCATE(XZMASS_MX(IIU,IJU,IKU)) CALL VERT_COORD(LSLEVE,PZS_LS,PZSMT_LS,XLEN1,XLEN2,XZHAT,XZFLUX_MX) - XZMASS_MX(:,:,:)=MZF(1,IKU,1,XZFLUX_MX) + XZMASS_MX(:,:,:)=MZF(XZFLUX_MX) XZMASS_MX(:,:,IKU)=1.5*XZFLUX_MX(:,:,IKU)-0.5*XZFLUX_MX(:,:,IKU-1) ELSE IF (HFILE=='CHEM') THEN ALLOCATE(ZZFLUX_MX(IIU,IJU,IKU)) ALLOCATE(ZZMASS_MX(IIU,IJU,IKU)) CALL VERT_COORD(LSLEVE,PZS_LS,PZSMT_LS,XLEN1,XLEN2,XZHAT,ZZFLUX_MX) - ZZMASS_MX(:,:,:)=MZF(1,IKU,1,ZZFLUX_MX) + ZZMASS_MX(:,:,:)=MZF(ZZFLUX_MX) ZZMASS_MX(:,:,IKU)=1.5*ZZFLUX_MX(:,:,IKU)-0.5*ZZFLUX_MX(:,:,IKU-1) END IF ! diff --git a/src/MNH/ver_prep_mesonh_case.f90 b/src/MNH/ver_prep_mesonh_case.f90 index 15ea1cc313fc52f699651a95190f5dab63a50c35..e50abec0ec100cf2792eddd685cd647ba7943322 100644 --- a/src/MNH/ver_prep_mesonh_case.f90 +++ b/src/MNH/ver_prep_mesonh_case.f90 @@ -169,7 +169,7 @@ CALL VERT_COORD(LSLEVE_LS,XZS_LS,XZSMT_LS,XLEN1_LS,XLEN2_LS,XZHAT_LS,XZFLUX_LS) ! !20140217 upgrade MZF !$XZMASS_LS(:,:,:)=MZF(XZFLUX_LS(:,:,:)) -XZMASS_LS(:,:,:)=MZF(1,ILU,1,XZFLUX_LS(:,:,:)) +XZMASS_LS(:,:,:)=MZF(XZFLUX_LS(:,:,:)) !20131112 add update_halo for this type of calculation CALL MPPDB_CHECK3D(XZMASS_LS,"ver_prep_mesonh_case1.2a::XZMASS_LS",PRECISION) CALL ADD3DFIELD_ll( TZFIELDS_ll, XZMASS_LS, 'VER_PREP_MESONH_CASE::XZMASS_LS' ) diff --git a/src/MNH/viscosity.f90 b/src/MNH/viscosity.f90 index e4c5d3ac5eea7f6bbdc7af3a2feabff8e757dcba..711824444a53790ce8fd53934b8edf633a011d16 100644 --- a/src/MNH/viscosity.f90 +++ b/src/MNH/viscosity.f90 @@ -304,7 +304,7 @@ ENDIF IKB = JPVEXT + 1 IKE = SIZE(PWT,3) - JPVEXT - ZTMP = MZF(1,IKU,1,PWT) + ZTMP = MZF(PWT) ! IF (ODRAG) THEN WHERE (PDRAG==-1) @@ -317,7 +317,7 @@ ENDIF ZTMP(:,:,IKE+IK) = ZTMP(:,:,IKE) END DO ! - ZTMP = MZM(1,IKU,1, PNU * & + ZTMP = MZM( PNU * & LAP_M(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,ZTMP) ) ! DO IK = 1,JPVEXT diff --git a/src/MNH/wguess.f90 b/src/MNH/wguess.f90 index 189707fef4876f91574364f272cb5a500f8bc0ab..d6324d60702c9724022327ca7d0efc5550ddf6a6 100644 --- a/src/MNH/wguess.f90 +++ b/src/MNH/wguess.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2018 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ################## @@ -140,8 +140,8 @@ END DO !* 2.1 General case ! ------------ ! -PRHODJW= PDZZ*ZRHODJWC + MXF(PDZX*MZM(1,IKU,1,PRHODJU/PDXX)) & - + MYF(PDZY*MZM(1,IKU,1,PRHODJV/PDYY)) +PRHODJW= PDZZ*ZRHODJWC + MXF(PDZX*MZM(PRHODJU/PDXX)) & + + MYF(PDZY*MZM(PRHODJV/PDYY)) ! !* 2.2 Copies on boundaries ! -------------------- diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90 index 197584a2ddcda810ec96b097c9b279a1ce5ad459..558e573b5f4e57ee793e3a5ddcc68b80e545d3ba 100644 --- a/src/MNH/write_budget.f90 +++ b/src/MNH/write_budget.f90 @@ -199,7 +199,7 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) ! CASE('MASK') ALLOCATE(ZWORKTEMP(NBUWRNB)) - allocate( tzdates( NBUWRNB ) ) + allocate( tzdates(NBUWRNB) ) ALLOCATE(ZWORKMASK(SIZE(XBUSURF,1),SIZE(XBUSURF,2),1,NBUWRNB,NBUMASK,1)) ! ! local array @@ -213,16 +213,16 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) ! ZWORKTEMP(NBUWRNB)=ZWORKTEMP(NBUWRNB)+(1.-NBUSTEP*0.5)*PTSTEP ! - tzdates(NBUWRNB )%tdate%year = tdtexp%tdate%year - tzdates(NBUWRNB )%tdate%month = tdtexp%tdate%month - tzdates(NBUWRNB )%tdate%day = tdtexp%tdate%day - tzdates(NBUWRNB )%time = tdtexp%time + zworktemp(NBUWRNB ) + tzdates(NBUWRNB)%tdate%year = tdtexp%tdate%year + tzdates(NBUWRNB)%tdate%month = tdtexp%tdate%month + tzdates(NBUWRNB)%tdate%day = tdtexp%tdate%day + tzdates(NBUWRNB)%time = tdtexp%time + zworktemp(NBUWRNB) DO JT=1,NBUWRNB-1 ZWORKTEMP(JT) = ZWORKTEMP(NBUWRNB)-NBUSTEP*PTSTEP*(NBUWRNB-JT) - tzdates(jt )%tdate%year = tdtexp%tdate%year - tzdates(jt )%tdate%month = tdtexp%tdate%month - tzdates(jt )%tdate%day = tdtexp%tdate%day - tzdates(jt )%time = tdtexp%time + zworktemp(jt ) + tzdates(jt)%tdate%year = tdtexp%tdate%year + tzdates(jt)%tdate%month = tdtexp%tdate%month + tzdates(jt)%tdate%day = tdtexp%tdate%day + tzdates(jt)%time = tdtexp%time + zworktemp(jt) END DO DEALLOCATE( ZWORKTEMP ) diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index 49ebac8c707aa801ebcab87d643cbe1b05d2fd81..9d80498ff21d8b01a72d5cd169db1be719a06cfb 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -482,18 +482,18 @@ IF (INDEX(CISO,'TK') /= 0) THEN END IF ! ZCORIOZ(:,:,:)=SPREAD( XCORIOZ(:,:),DIM=3,NCOPIES=IKU ) -ZVOX(:,:,:)=GY_W_VW(1,IKU,1,XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(1,IKU,1,XVT,XDZZ) +ZVOX(:,:,:)=GY_W_VW(XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(XVT,XDZZ) ZVOX(:,:,2)=ZVOX(:,:,3) -ZVOY(:,:,:)=GZ_U_UW(1,IKU,1,XUT,XDZZ)-GX_W_UW(1,IKU,1,XWT,XDXX,XDZZ,XDZX) +ZVOY(:,:,:)=GZ_U_UW(XUT,XDZZ)-GX_W_UW(XWT,XDXX,XDZZ,XDZX) ZVOY(:,:,2)=ZVOY(:,:,3) -ZVOZ(:,:,:)=GX_V_UV(1,IKU,1,XVT,XDXX,XDZZ,XDZX)-GY_U_UV(1,IKU,1,XUT,XDYY,XDZZ,XDZY) +ZVOZ(:,:,:)=GX_V_UV(XVT,XDXX,XDZZ,XDZX)-GY_U_UV(XUT,XDYY,XDZZ,XDZY) ZVOZ(:,:,2)=ZVOZ(:,:,3) ZVOZ(:,:,1)=ZVOZ(:,:,3) -ZWORK31(:,:,:)=GX_M_M(1,IKU,1,XTHT,XDXX,XDZZ,XDZX) -ZWORK32(:,:,:)=GY_M_M(1,IKU,1,XTHT,XDYY,XDZZ,XDZY) -ZWORK33(:,:,:)=GZ_M_M(1,IKU,1,XTHT,XDZZ) -ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(1,IKU,1,MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(1,IKU,1,MXF(ZVOY(:,:,:))) & +ZWORK31(:,:,:)=GX_M_M(XTHT,XDXX,XDZZ,XDZX) +ZWORK32(:,:,:)=GY_M_M(XTHT,XDYY,XDZZ,XDZY) +ZWORK33(:,:,:)=GZ_M_M(XTHT,XDZZ) +ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & + + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:) ZPOVO(:,:,1) =-1.E+11 @@ -705,7 +705,7 @@ IF (LVAR_PR ) THEN ZWORK21(:,:) = 0. ZWORK22(:,:) = 0. ZWORK23(:,:) = 0. - ZWORK31(:,:,:) = DZF(1,IKU,1,XZZ(:,:,:)) + ZWORK31(:,:,:) = DZF(XZZ(:,:,:)) DO JK = IKB,IKE !* Calcul de qtot IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN @@ -744,13 +744,13 @@ IF (LHU_FLX) THEN ZWORK35(:,:,:) = XRHODREF(:,:,:) * XRT(:,:,:,1) ZWORK31(:,:,:) = MXM(ZWORK35(:,:,:)) * XUT(:,:,:) ZWORK32(:,:,:) = MYM(ZWORK35(:,:,:)) * XVT(:,:,:) - ZWORK35(:,:,:) = GX_U_M(1,IKU,1,ZWORK31,XDXX,XDZZ,XDZX) + GY_V_M(1,IKU,1,ZWORK32,XDYY,XDZZ,XDZY) + ZWORK35(:,:,:) = GX_U_M(ZWORK31,XDXX,XDZZ,XDZX) + GY_V_M(ZWORK32,XDYY,XDZZ,XDZY) IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN ZWORK36(:,:,:) = ZWORK35(:,:,:) + XRHODREF(:,:,:) * (XRT(:,:,:,2) + & XRT(:,:,:,3) + XRT(:,:,:,4) + XRT(:,:,:,5) + XRT(:,:,:,6)) ZWORK33(:,:,:) = MXM(ZWORK36(:,:,:)) * XUT(:,:,:) ZWORK34(:,:,:) = MYM(ZWORK36(:,:,:)) * XVT(:,:,:) - ZWORK36(:,:,:) = GX_U_M(1,IKU,1,ZWORK33,XDXX,XDZZ,XDZX) + GY_V_M(1,IKU,1,ZWORK34,XDYY,XDZZ,XDZY) + ZWORK36(:,:,:) = GX_U_M(ZWORK33,XDXX,XDZZ,XDZX) + GY_V_M(ZWORK34,XDYY,XDZZ,XDZY) ENDIF ! ! Integration sur 3000 m @@ -761,7 +761,7 @@ IF (LHU_FLX) THEN IKTOP(:,:)=JK END WHERE END DO - ZDELTAZ(:,:,:)=DZF(1,IKU,1,XZZ) + ZDELTAZ(:,:,:)=DZF(XZZ) ZWORK21(:,:) = 0. ZWORK22(:,:) = 0. ZWORK25(:,:) = 0. @@ -2275,7 +2275,7 @@ IF (LTPZH .OR. LCOREF) THEN TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) ! - ZWORK33(:,:,:)=ZWORK33(:,:,:)+MZF(1,IKU,1,XZZ(:,:,:))*1E6/XRADIUS + ZWORK33(:,:,:)=ZWORK33(:,:,:)+MZF(XZZ(:,:,:))*1E6/XRADIUS TZFIELD%CMNHNAME = 'MCOREF' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'MCOREF' @@ -2585,7 +2585,7 @@ END IF ! IF (LVORT) THEN ! Vorticity x - ZWORK31(:,:,:)=MYF(MZF(1,IKU,1,MXM(ZVOX(:,:,:)))) + ZWORK31(:,:,:)=MYF(MZF(MXM(ZVOX(:,:,:)))) TZFIELD%CMNHNAME = 'UM1' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'UM1' @@ -2599,7 +2599,7 @@ IF (LVORT) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! ! Vorticity y - ZWORK32(:,:,:)=MZF(1,IKU,1,MXF(MYM(ZVOY(:,:,:)))) + ZWORK32(:,:,:)=MZF(MXF(MYM(ZVOY(:,:,:)))) TZFIELD%CMNHNAME = 'VM1' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'VM1' @@ -2639,7 +2639,7 @@ IF (LVORT) THEN ENDIF ! ! Vorticity z - ZWORK31(:,:,:)=MXF(MYF(MZM(1,IKU,1,ZVOZ(:,:,:)))) + ZWORK31(:,:,:)=MXF(MYF(MZM(ZVOZ(:,:,:)))) TZFIELD%CMNHNAME = 'WM1' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'WM1' @@ -2701,11 +2701,11 @@ END IF ! ! Virtual Potential Vorticity in PV units IF (LMOIST_V .AND. (NRR>0) ) THEN - ZWORK31(:,:,:)=GX_M_M(1,IKU,1,ZTHETAV,XDXX,XDZZ,XDZX) - ZWORK32(:,:,:)=GY_M_M(1,IKU,1,ZTHETAV,XDYY,XDZZ,XDZY) - ZWORK33(:,:,:)=GZ_M_M(1,IKU,1,ZTHETAV,XDZZ) - ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(1,IKU,1,MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(1,IKU,1,MXF(ZVOY(:,:,:))) & + ZWORK31(:,:,:)=GX_M_M(ZTHETAV,XDXX,XDZZ,XDZX) + ZWORK32(:,:,:)=GY_M_M(ZTHETAV,XDYY,XDZZ,XDZY) + ZWORK33(:,:,:)=GZ_M_M(ZTHETAV,XDZZ) + ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & + + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) TZFIELD%CMNHNAME = 'POVOV' @@ -2747,11 +2747,11 @@ END IF ! Equivalent Potential Vorticity in PV units IF (LMOIST_E .AND. (NRR>0) ) THEN ! - ZWORK31(:,:,:)=GX_M_M(1,IKU,1,ZTHETAE,XDXX,XDZZ,XDZX) - ZWORK32(:,:,:)=GY_M_M(1,IKU,1,ZTHETAE,XDYY,XDZZ,XDZY) - ZWORK33(:,:,:)=GZ_M_M(1,IKU,1,ZTHETAE,XDZZ) - ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(1,IKU,1,MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(1,IKU,1,MXF(ZVOY(:,:,:))) & + ZWORK31(:,:,:)=GX_M_M(ZTHETAE,XDXX,XDZZ,XDZX) + ZWORK32(:,:,:)=GY_M_M(ZTHETAE,XDYY,XDZZ,XDZY) + ZWORK33(:,:,:)=GZ_M_M(ZTHETAE,XDZZ) + ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & + + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) TZFIELD%CMNHNAME = 'POVOE' @@ -2794,11 +2794,11 @@ END IF ! ! Equivalent Saturated Potential Vorticity in PV units IF (LMOIST_ES .AND. (NRR>0) ) THEN - ZWORK31(:,:,:)=GX_M_M(1,IKU,1,ZTHETAES,XDXX,XDZZ,XDZX) - ZWORK32(:,:,:)=GY_M_M(1,IKU,1,ZTHETAES,XDYY,XDZZ,XDZY) - ZWORK33(:,:,:)=GZ_M_M(1,IKU,1,ZTHETAES,XDZZ) - ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(1,IKU,1,MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(1,IKU,1,MXF(ZVOY(:,:,:))) & + ZWORK31(:,:,:)=GX_M_M(ZTHETAES,XDXX,XDZZ,XDZX) + ZWORK32(:,:,:)=GY_M_M(ZTHETAES,XDYY,XDZZ,XDZY) + ZWORK33(:,:,:)=GZ_M_M(ZTHETAES,XDZZ) + ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & + + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) TZFIELD%CMNHNAME = 'POVOES' @@ -2821,7 +2821,7 @@ ENDIF ! IF (LDIV) THEN ! - ZWORK31=GX_U_M(1,IKU,1,XUT,XDXX,XDZZ,XDZX) + GY_V_M(1,IKU,1,XVT,XDYY,XDZZ,XDZY) + ZWORK31=GX_U_M(XUT,XDXX,XDZZ,XDZX) + GY_V_M(XVT,XDYY,XDZZ,XDZY) TZFIELD%CMNHNAME = 'HDIV' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'HDIV' @@ -2847,7 +2847,7 @@ IF (LDIV) THEN TZFIELD%LTIMEDEP = .TRUE. ZWORK31=MXM(XRHODREF*XRT(:,:,:,1))*XUT ZWORK32=MYM(XRHODREF*XRT(:,:,:,1))*XVT - ZWORK33=GX_U_M(1,IKU,1,ZWORK31,XDXX,XDZZ,XDZX) + GY_V_M(1,IKU,1,ZWORK32,XDYY,XDZZ,XDZY) + ZWORK33=GX_U_M(ZWORK31,XDXX,XDZZ,XDZX) + GY_V_M(ZWORK32,XDYY,XDZZ,XDZY) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) END IF ! @@ -2920,13 +2920,13 @@ IF (LGEO .OR. LAGEO) THEN ZPHI(1,IJU,:)=2*ZPHI(1,IJU-1,:)-ZPHI(1,IJU-2,:) ZPHI(IIU,1,:)=2*ZPHI(IIU,2,:)-ZPHI(IIU,3,:) ZPHI(IIU,IJU,:)=2*ZPHI(IIU,IJU-1,:)-ZPHI(IIU,IJU-2,:) - ZWORK31(:,:,:)=-MXM(GY_M_M(1,IKU,1,ZPHI,XDYY,XDZZ,XDZY)*XCPD*XTHVREF/ZCORIOZ) + ZWORK31(:,:,:)=-MXM(GY_M_M(ZPHI,XDYY,XDZZ,XDZY)*XCPD*XTHVREF/ZCORIOZ) ! ZPHI(1,1,:)=2*ZPHI(2,1,:)-ZPHI(3,1,:) ZPHI(IIU,1,:)=2*ZPHI(IIU-1,1,:)-ZPHI(IIU-2,1,:) ZPHI(1,IJU,:)=2*ZPHI(2,IJU,:)-ZPHI(3,IJU,:) ZPHI(IIU,IJU,:)=2*ZPHI(IIU-1,IJU,:)-ZPHI(IIU-2,IJU,:) - ZWORK32(:,:,:)=MYM(GX_M_M(1,IKU,1,ZPHI,XDXX,XDZZ,XDZX)*XCPD*XTHVREF/ZCORIOZ) + ZWORK32(:,:,:)=MYM(GX_M_M(ZPHI,XDXX,XDZZ,XDZX)*XCPD*XTHVREF/ZCORIOZ) ! ELSE IF(CEQNSYS=='LHE') THEN ZPHI(:,:,:)= ((XPABST(:,:,:)/XP00)**(XRD/XCPD)-XEXNREF(:,:,:)) & @@ -2936,13 +2936,13 @@ IF (LGEO .OR. LAGEO) THEN ZPHI(1,IJU,:)=2*ZPHI(1,IJU-1,:)-ZPHI(1,IJU-2,:) ZPHI(IIU,1,:)=2*ZPHI(IIU,2,:)-ZPHI(IIU,3,:) ZPHI(IIU,IJU,:)=2*ZPHI(IIU,IJU-1,:)-ZPHI(IIU,IJU-2,:) - ZWORK31(:,:,:)=-MXM(GY_M_M(1,IKU,1,ZPHI,XDYY,XDZZ,XDZY)/ZCORIOZ) + ZWORK31(:,:,:)=-MXM(GY_M_M(ZPHI,XDYY,XDZZ,XDZY)/ZCORIOZ) ! ZPHI(1,1,:)=2*ZPHI(2,1,:)-ZPHI(3,1,:) ZPHI(IIU,1,:)=2*ZPHI(IIU-1,1,:)-ZPHI(IIU-2,1,:) ZPHI(1,IJU,:)=2*ZPHI(2,IJU,:)-ZPHI(3,IJU,:) ZPHI(IIU,IJU,:)=2*ZPHI(IIU-1,IJU,:)-ZPHI(IIU-2,IJU,:) - ZWORK32(:,:,:)=MYM(GX_M_M(1,IKU,1,ZPHI,XDXX,XDZZ,XDZX)/ZCORIOZ) + ZWORK32(:,:,:)=MYM(GX_M_M(ZPHI,XDXX,XDZZ,XDZX)/ZCORIOZ) END IF DEALLOCATE(ZPHI) ! @@ -3497,7 +3497,7 @@ ENDIF !* B-V frequency to assess thermal tropopause ! IF (LBV_FR) THEN - ZWORK32(:,:,:)=DZM(1,IKU,1,XTHT(:,:,:))/ MZM(1,IKU,1,XTHT(:,:,:)) + ZWORK32(:,:,:)=DZM(XTHT(:,:,:))/ MZM(XTHT(:,:,:)) DO JK=1,IKU DO JJ=1,IJU DO JI=1,IIU @@ -3523,7 +3523,7 @@ IF (LBV_FR) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! IF (NRR > 0) THEN - ZWORK32(:,:,:)=DZM(1,IKU,1,ZTHETAE(:,:,:))/ MZM(1,IKU,1,ZTHETAE(:,:,:)) + ZWORK32(:,:,:)=DZM(ZTHETAE(:,:,:))/ MZM(ZTHETAE(:,:,:)) DO JK=1,IKU DO JJ=1,IJU DO JI=1,IIU diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index 29d7fed2d1cdef685ee2d3744efcb0fd08733d6c..7008f40e5ce147a157910c03790fa7ae0899e78c 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -421,7 +421,7 @@ IF (LCLD_COV .AND. LUSERC) THEN ZCLMR=1.E-4 ! detection of clouds for cloud mixing ratio > .1g/kg ! GMASK2(:,:)=.TRUE. - ZWORK31(:,:,:)= MZM(1,IKU,1, XRT(:,:,:,2) ) ! cloud mixing ratio at zz levels + ZWORK31(:,:,:)= MZM( XRT(:,:,:,2) ) ! cloud mixing ratio at zz levels DO JK=IKE,IKB,-1 WHERE ( (GMASK2(:,:)).AND.(ZWORK31(:,:,JK)>ZCLMR) ) GMASK2(:,:)=.FALSE. @@ -431,7 +431,7 @@ IF (LCLD_COV .AND. LUSERC) THEN ! IF (LUSERI) THEN GMASK2(:,:)=.TRUE. - ZWORK31(:,:,:)= MZM(1,IKU,1, XRT(:,:,:,4) ) ! cloud mixing ratio at zz levels + ZWORK31(:,:,:)= MZM( XRT(:,:,:,4) ) ! cloud mixing ratio at zz levels DO JK=IKE,IKB,-1 WHERE ( (GMASK2(:,:)).AND.(ZWORK31(:,:,JK)>ZCLMR) ) GMASK2(:,:)=.FALSE. @@ -467,7 +467,7 @@ IF (LCLD_COV .AND. LUSERC) THEN ! Higher top of the different species of clouds ! IWORK1(:,:)=IKB ! initialization with the ground values - ZWORK31(:,:,:)=MZM(1,IKU,1,ZTEMP(:,:,:)) ! temperature (K) at zz levels + ZWORK31(:,:,:)=MZM(ZTEMP(:,:,:)) ! temperature (K) at zz levels IF(CRAD/='NONE') ZWORK31(:,:,IKB)=XTSRAD(:,:) ZWORK21(:,:)=0. ZWORK22(:,:)=0. @@ -1125,7 +1125,7 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU)) ! ********************* ! Geopotential in meters ! ********************* - ZWORK31(:,:,:) = MZF(1,IKU,1,XZZ(:,:,:)) + ZWORK31(:,:,:) = MZF(XZZ(:,:,:)) CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') DO JK=1,IPRES @@ -1194,18 +1194,18 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU)) ! Potential Vorticity ! ********************* ZCORIOZ(:,:,:)=SPREAD( XCORIOZ(:,:),DIM=3,NCOPIES=IKU ) - ZVOX(:,:,:)=GY_W_VW(1,IKU,1,XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(1,IKU,1,XVT,XDZZ) + ZVOX(:,:,:)=GY_W_VW(XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(XVT,XDZZ) ZVOX(:,:,2)=ZVOX(:,:,3) - ZVOY(:,:,:)=GZ_U_UW(1,IKU,1,XUT,XDZZ)-GX_W_UW(1,IKU,1,XWT,XDXX,XDZZ,XDZX) + ZVOY(:,:,:)=GZ_U_UW(XUT,XDZZ)-GX_W_UW(XWT,XDXX,XDZZ,XDZX) ZVOY(:,:,2)=ZVOY(:,:,3) - ZVOZ(:,:,:)=GX_V_UV(1,IKU,1,XVT,XDXX,XDZZ,XDZX)-GY_U_UV(1,IKU,1,XUT,XDYY,XDZZ,XDZY) + ZVOZ(:,:,:)=GX_V_UV(XVT,XDXX,XDZZ,XDZX)-GY_U_UV(XUT,XDYY,XDZZ,XDZY) ZVOZ(:,:,2)=ZVOZ(:,:,3) ZVOZ(:,:,1)=ZVOZ(:,:,3) - ZWORK31(:,:,:)=GX_M_M(1,IKU,1,XTHT,XDXX,XDZZ,XDZX) - ZWORK32(:,:,:)=GY_M_M(1,IKU,1,XTHT,XDYY,XDZZ,XDZY) - ZWORK33(:,:,:)=GZ_M_M(1,IKU,1,XTHT,XDZZ) - ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(1,IKU,1,MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(1,IKU,1,MXF(ZVOY(:,:,:))) & + ZWORK31(:,:,:)=GX_M_M(XTHT,XDXX,XDZZ,XDZX) + ZWORK32(:,:,:)=GY_M_M(XTHT,XDYY,XDZZ,XDZY) + ZWORK33(:,:,:)=GZ_M_M(XTHT,XDZZ) + ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & + + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:) ZPOVO(:,:,1) =-1.E+11 @@ -1343,18 +1343,18 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN ! Potential Vorticity ! ********************* ZCORIOZ(:,:,:)=SPREAD( XCORIOZ(:,:),DIM=3,NCOPIES=IKU ) - ZVOX(:,:,:)=GY_W_VW(1,IKU,1,XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(1,IKU,1,XVT,XDZZ) + ZVOX(:,:,:)=GY_W_VW(XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(XVT,XDZZ) ZVOX(:,:,2)=ZVOX(:,:,3) - ZVOY(:,:,:)=GZ_U_UW(1,IKU,1,XUT,XDZZ)-GX_W_UW(1,IKU,1,XWT,XDXX,XDZZ,XDZX) + ZVOY(:,:,:)=GZ_U_UW(XUT,XDZZ)-GX_W_UW(XWT,XDXX,XDZZ,XDZX) ZVOY(:,:,2)=ZVOY(:,:,3) - ZVOZ(:,:,:)=GX_V_UV(1,IKU,1,XVT,XDXX,XDZZ,XDZX)-GY_U_UV(1,IKU,1,XUT,XDYY,XDZZ,XDZY) + ZVOZ(:,:,:)=GX_V_UV(XVT,XDXX,XDZZ,XDZX)-GY_U_UV(XUT,XDYY,XDZZ,XDZY) ZVOZ(:,:,2)=ZVOZ(:,:,3) ZVOZ(:,:,1)=ZVOZ(:,:,3) - ZWORK31(:,:,:)=GX_M_M(1,IKU,1,XTHT,XDXX,XDZZ,XDZX) - ZWORK32(:,:,:)=GY_M_M(1,IKU,1,XTHT,XDYY,XDZZ,XDZY) - ZWORK33(:,:,:)=GZ_M_M(1,IKU,1,XTHT,XDZZ) - ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(1,IKU,1,MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(1,IKU,1,MXF(ZVOY(:,:,:))) & + ZWORK31(:,:,:)=GX_M_M(XTHT,XDXX,XDZZ,XDZX) + ZWORK32(:,:,:)=GY_M_M(XTHT,XDYY,XDZZ,XDZY) + ZWORK33(:,:,:)=GZ_M_M(XTHT,XDZZ) + ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & + + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:) ZPOVO(:,:,1) =-1.E+11 @@ -1451,7 +1451,7 @@ IF (LCOARSE) THEN CALL BLOCKAVG(ZWORK31,IDX,IDX,ZUU_AVG) ZWORK31=MYF(ZVT_PRM*ZVT_PRM) CALL BLOCKAVG(ZWORK31,IDX,IDX,ZVV_AVG) - ZWORK31=MZF(1,IKU,1,ZWT_PRM*ZWT_PRM) + ZWORK31=MZF(ZWT_PRM*ZWT_PRM) CALL BLOCKAVG(ZWORK31,IDX,IDX,ZWW_AVG) CALL BLOCKAVG(XTKET,IDX,IDX,ZWORK31) ZWORK31=0.5*( ZUU_AVG+ZVV_AVG+ZWW_AVG ) + ZWORK31 @@ -1481,7 +1481,7 @@ IF (LCOARSE) THEN CALL MOVINGAVG(ZWORK31,IDX,IDX,ZUU_AVG) ZWORK31=MYF(ZVT_PRM*ZVT_PRM) CALL MOVINGAVG(ZWORK31,IDX,IDX,ZVV_AVG) - ZWORK31=MZF(1,IKU,1,ZWT_PRM*ZWT_PRM) + ZWORK31=MZF(ZWT_PRM*ZWT_PRM) CALL MOVINGAVG(ZWORK31,IDX,IDX,ZWW_AVG) CALL MOVINGAVG(XTKET,IDX,IDX,ZWORK31) ZWORK31=0.5*( ZUU_AVG+ZVV_AVG+ZWW_AVG ) + ZWORK31 diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index 22fe2bc3926138caa12cbeab4b3e1f3677531a53..971ea13e7a50f4b01177976e8e05779918c73815 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -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 @@ -257,6 +258,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 @@ -1219,6 +1222,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) @@ -1276,22 +1280,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) @@ -1308,6 +1324,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 f5d3a81f2e14d54d1385efac2eef39bb161e3921..ad714bd569127529dc61feaf0b50dd6a0d7a32ae 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -64,25 +64,25 @@ 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 @@ -195,6 +195,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' @@ -362,6 +376,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/MNH/zdiffusetup.f90 b/src/MNH/zdiffusetup.f90 index 3b7abb83c752596d0e25eb7aa264231b45efe6b0..955853512eb79517e052560b117e01f2952d3117 100644 --- a/src/MNH/zdiffusetup.f90 +++ b/src/MNH/zdiffusetup.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2006-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2006-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. @@ -151,7 +151,7 @@ ALLOCATE (ZN4HGTI_HALO2(IIB-2:IIE+2,IJB-2:IJE+2),ZN4HGTJ_HALO2(IIB-2:IIE+2,IJB-2 NULLIFY(TZHGTMASS_ll,TZHGTHALO2_ll) ! Compute height field at mass points -ZZMASS = MZF(1,IKU,1,PZZ) +ZZMASS = MZF(PZZ) CALL INIT_HALO2_ll(TZHGTHALO2_ll,1,IIU,IJU,IKU) CALL ADD3DFIELD_ll( TZHGTMASS_ll, ZZMASS, 'ZDIFFUSETUP::ZZMASS' ) 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 +