diff --git a/LIBTOOLS/lib/COMPRESS/src/compress.f90 b/LIBTOOLS/lib/COMPRESS/src/compress.f90 index 2bc2dfaf3afcef1c5dadadcd0053d18659904d51..950fdfb1739651d8208cb1e4b9ad24b2772da7cd 100644 --- a/LIBTOOLS/lib/COMPRESS/src/compress.f90 +++ b/LIBTOOLS/lib/COMPRESS/src/compress.f90 @@ -1,15 +1,13 @@ -!----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. !----------------------------------------------------------------- SUBROUTINE COMPRESS_FIELD(XTAB,KX,KY,KNBTOT,KNBUSE) USE MODD_COMPPAR USE MODE_SEARCHGRP -#ifdef NAGf95 USE,INTRINSIC :: IEEE_ARITHMETIC -#endif IMPLICIT NONE @@ -38,17 +36,21 @@ INTEGER :: IEXTCOD CHARACTER(LEN=8),PARAMETER :: KEYWORD='COMPRESS' REAL,DIMENSION(KNBTOT) :: XWORKTAB LOGICAL :: LUPREAL,LNAN -#ifndef NAGf95 -LOGICAL, EXTERNAL :: IEEE_IS_NAN -#endif +logical :: gnansupport ILEVNBELT = KX*KY LUPREAL = .FALSE. LNAN = .FALSE. +if ( IEEE_SUPPORT_NAN( xtab(1)) ) then + gnansupport=.true. +else + gnansupport=.false. +end if + ! Check for NAN and change Upper and Lower bound according to 32bits real limits. DO JI=1,KNBTOT - IF (IEEE_IS_NAN(XTAB(JI))) THEN + IF ( gnansupport .and. IEEE_IS_NAN(XTAB(JI)) ) THEN XTAB(JI)=0. LNAN = .TRUE. ELSE IF (ABS(XTAB(JI)) > HUGE(1.0_4)) THEN diff --git a/LIBTOOLS/lib/COMPRESS/src/ieee_is_nan.c b/LIBTOOLS/lib/COMPRESS/src/ieee_is_nan.c deleted file mode 100644 index f8682fbdba4e1ae2c55900c9127279a6de445fb9..0000000000000000000000000000000000000000 --- a/LIBTOOLS/lib/COMPRESS/src/ieee_is_nan.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <math.h> - -#ifdef NO_UNDERSCORE -# define IEEE_IS_NAN ieee_is_nan -#else -# define IEEE_IS_NAN ieee_is_nan_ -#endif - -int IEEE_IS_NAN(double *x){ - return isnan(*x); -} diff --git a/bin/spll b/bin/spll index c8b0ada9e568862d70b7ffd1e3d8a9689e091453..ba2fd7884933a0040563bbb5c72637abd64dde54 100755 --- a/bin/spll +++ b/bin/spll @@ -1,7 +1,7 @@ #!/bin/bash -#MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +#MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier #MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -#MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +#MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt #MNH_LIC for details. version 1. #set -x if [ $# -ne 2 ] @@ -26,7 +26,8 @@ ini_cmfshall.f90|mode_double_double.f90|mode_fgau.f90|\ extern_usersurc_ll.f90|\ extern_userio.f90|fmreadwrit.f90|fm_read_ll.f90|poub.f90|\ mode_glt.*.F90|\ -rrtm_.*.F90|srtm_.*.F90" +rrtm_.*.F90|srtm_.*.F90|\ +libs4py.f90" # if [ "$SUF" = "f" ] diff --git a/conf/profile_mesonh.ihm b/conf/profile_mesonh.ihm index 576185e854d5b04ede432efe2d0251e5a33a8804..7a9aa3618dc70b0056b463ac73f2742d1c3cf7b1 100755 --- a/conf/profile_mesonh.ihm +++ b/conf/profile_mesonh.ihm @@ -67,6 +67,7 @@ export CONF_DOLLAR=${CONF_DOLLAR} # export VER_CDF=${VER_CDF} export VERSION_CDFC=${VERSION_CDFC} +export VERSION_CDFCXX=${VERSION_CDFCXX} export VERSION_CDFF=${VERSION_CDFF} export VERSION_HDF=${VERSION_HDF} export VERSION_LIBAEC=${VERSION_LIBAEC} @@ -115,6 +116,10 @@ export VER_OASIS=${VER_OASIS} # export VERSION_NCL=${VERSION_NCL} # +# MEGAN +# +export MNH_MEGAN=${MNH_MEGAN} +# ########################################################## ########################################################## ########################################################## @@ -125,7 +130,7 @@ export VERSION_NCL=${VERSION_NCL} ########################################################## ########################################################## # -export XYZ="-\${ARCH}-R\${MNH_REAL}I\${MNH_INT}-\${VERSION_XYZ}\${MNH_ECRAD:+-ECRAD}\${VER_USER:+-\${VER_USER}}-\${VER_MPI}-\${OPTLEVEL}" +export XYZ="-\${ARCH}-R\${MNH_REAL}I\${MNH_INT}-\${VERSION_XYZ}\${MNH_ECRAD:+-ECRAD}\${MNH_FOREFIRE:+-FF}\${VER_USER:+-\${VER_USER}}-\${VER_MPI}-\${OPTLEVEL}" #[ "x\${VER_USER}" != "x" ] && export XYZ="\${XYZ}-\${VER_USER}" # PATH to find tools like "makegen, etc ..." export BIN_TOOLS=${BIN_TOOLS} diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index a7bcc64c5b5366b7b08c323c8d32cf36931ff793..4dff86bd3aafd4859ae05cac7c12f0f560436f8e 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -4,10 +4,13 @@ !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! Original version: -! 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 ! Modifications: -! Philippe Wautelet: 29/01/2019 : small bug correction (null pointers) in FIELDLIST_GOTO_MODEL if NESPGD or PGD -! Philippe Wautelet: 01/02/2019 : bug correction in case XRT is not associated +! P. Wautelet 29/01/2019: small bug correction (null pointers) in FIELDLIST_GOTO_MODEL if NESPGD or PGD +! P. Wautelet 01/02/2019: bug correction in case XRT is not associated +! C. Lac 02/2019: add rain fraction as an output field +! S. Bielli 02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes +! P. Wautelet 06/03/2019: correct ZWS entry !----------------------------------------------------------------- MODULE MODE_FIELD ! @@ -895,6 +898,20 @@ ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) IDX = IDX+1 ! IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() +TFIELDLIST(IDX)%CMNHNAME = 'ZWS' +TFIELDLIST(IDX)%CSTDNAME = 'sea_surface_wave_significant_height' +TFIELDLIST(IDX)%CLONGNAME = 'ZWS' +TFIELDLIST(IDX)%CUNITS = 'm' +TFIELDLIST(IDX)%CDIR = 'XY' +TFIELDLIST(IDX)%CCOMMENT = 'sea wave height' +TFIELDLIST(IDX)%NGRID = 4 +TFIELDLIST(IDX)%NTYPE = TYPEREAL +TFIELDLIST(IDX)%NDIMS = 2 +TFIELDLIST(IDX)%LTIMEDEP = .TRUE. +ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) +IDX = IDX+1 +! +IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() TFIELDLIST(IDX)%CMNHNAME = 'ZSMT' TFIELDLIST(IDX)%CSTDNAME = '' TFIELDLIST(IDX)%CLONGNAME = 'ZSMT' @@ -2339,6 +2356,20 @@ TFIELDLIST(IDX)%LTIMEDEP = .TRUE. ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) IDX = IDX+1 ! +IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() +TFIELDLIST(IDX)%CMNHNAME = 'RAINFR' +TFIELDLIST(IDX)%CSTDNAME = '' +TFIELDLIST(IDX)%CLONGNAME = 'RAINFR' +TFIELDLIST(IDX)%CUNITS = '1' +TFIELDLIST(IDX)%CDIR = 'XY' +TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Rain FRaction' +TFIELDLIST(IDX)%NGRID = 1 +TFIELDLIST(IDX)%NTYPE = TYPEREAL +TFIELDLIST(IDX)%NDIMS = 3 +TFIELDLIST(IDX)%LTIMEDEP = .TRUE. +ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) +IDX = IDX+1 +! END IF ! CPROGRAM=MESONH .OR. DIAG .OR. LFICDF ! ! @@ -3833,6 +3864,7 @@ END IF ! ! MODD_FIELD_n variables ! +CALL FIND_FIELD_ID_FROM_MNHNAME('ZWS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XZWS CALL FIND_FIELD_ID_FROM_MNHNAME('UT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUT CALL FIND_FIELD_ID_FROM_MNHNAME('VT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVT CALL FIND_FIELD_ID_FROM_MNHNAME('WT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XWT @@ -3934,6 +3966,7 @@ IF (CPROGRAM == 'MESONH') THEN END IF CALL FIND_FIELD_ID_FROM_MNHNAME('CLDFR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XCLDFR CALL FIND_FIELD_ID_FROM_MNHNAME('CIT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XCIT + CALL FIND_FIELD_ID_FROM_MNHNAME('RAINFR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRAINFR ! END IF ! @@ -4144,6 +4177,7 @@ IF( KFROM/=KTO) THEN ! ! MODD_FIELD_n variables ! +CALL FIND_FIELD_ID_FROM_MNHNAME('ZWS', IID,IRESP); XZWS => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA CALL FIND_FIELD_ID_FROM_MNHNAME('UT', IID,IRESP); XUT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA CALL FIND_FIELD_ID_FROM_MNHNAME('VT', IID,IRESP); XVT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA CALL FIND_FIELD_ID_FROM_MNHNAME('WT', IID,IRESP); XWT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA @@ -4258,6 +4292,7 @@ IF (CPROGRAM == 'MESONH') THEN CALL FIND_FIELD_ID_FROM_MNHNAME('THS_CLD',IID,IRESP); XRTHS_CLD => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA CALL FIND_FIELD_ID_FROM_MNHNAME('CLDFR', IID,IRESP); XCLDFR => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA CALL FIND_FIELD_ID_FROM_MNHNAME('CIT', IID,IRESP); XCIT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA + CALL FIND_FIELD_ID_FROM_MNHNAME('RAINFR', IID,IRESP); XRAINFR => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA END IF ! ! MODD_PAST_FIELD_n variables diff --git a/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 index fbc563242bd224d166817375df9f9f268d4c867f..160a79a6d876974572730b761cc578b785a75d48 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 @@ -15,6 +15,7 @@ ! + move management of NNCID and NLFIFLU to the nc4 and lfi subroutines ! P. Wautelet 10/01/2019: replace handle_err by IO_Err_handle_nc4 for better netCDF error messages ! P. Wautelet 05/03/2019: rename IO subroutines and modules +! P. Wautelet 07/03/2019: bugfix: io_set_mnhversion must be called by all the processes ! !----------------------------------------------------------------- #if defined(MNH_IOCDF4) @@ -58,10 +59,10 @@ subroutine IO_File_create_nc4(tpfile,hprogram_orig) if (istatus /= NF90_NOERR) then call print_msg(NVERB_FATAL,'IO','IO_File_create_nc4','NF90_CREATE for '//trim(yfilem)//'.nc: '//NF90_STRERROR(istatus)) end if - call io_set_not_cleanly_closed_nc4(tpfile) - call IO_Mnhversion_set(tpfile) + call IO_Not_cleanly_closed_set_nc4(tpfile) call IO_Knowndims_set_nc4(tpfile, hprogram_orig=hprogram_orig) end if + call IO_Mnhversion_set(tpfile) end subroutine IO_File_create_nc4 @@ -185,16 +186,16 @@ subroutine IO_Cleanly_closed_set_nc4(tpfile) end subroutine IO_Cleanly_closed_set_nc4 -subroutine io_set_not_cleanly_closed_nc4(tpfile) +subroutine IO_Not_cleanly_closed_set_nc4(tpfile) type(tfiledata), intent(in) :: tpfile integer(kind=IDCDF_KIND) :: istatus - call print_msg(NVERB_DEBUG,'IO','io_set_not_cleanly_closed_nc4','called for '//trim(tpfile%cname)) + call print_msg(NVERB_DEBUG,'IO','IO_Not_cleanly_closed_set_nc4','called for '//trim(tpfile%cname)) istatus = NF90_PUT_ATT(tpfile%nncid, NF90_GLOBAL, 'MNH_cleanly_closed', 'no') - if (istatus /= NF90_NOERR) call IO_Err_handle_nc4(istatus,'io_set_not_cleanly_closed_nc4','NF90_PUT_ATT','MNH_cleanly_closed') -end subroutine io_set_not_cleanly_closed_nc4 + if (istatus /= NF90_NOERR) call IO_Err_handle_nc4(istatus,'IO_Not_cleanly_closed_set_nc4','NF90_PUT_ATT','MNH_cleanly_closed') +end subroutine IO_Not_cleanly_closed_set_nc4 end module mode_io_file_nc4 #else diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 index 991a0c4b46f7766212264cba4bac99343cf48181..7b2f6e855fa12299b491035f84887da5805f4bcb 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 @@ -7,6 +7,7 @@ ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 21/06/2018: read and write correctly if MNH_REAL=4 ! P. Wautelet 14/12/2018: split fmreadwrit.f90 +! P. Wautelet 21/02/2019: bugfix: intent of read fields: OUT->INOUT to keep initial value if not found in file ! P. Wautelet 05/03/2019: rename IO subroutines and modules !----------------------------------------------------------------- module mode_io_read_lfi @@ -49,7 +50,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL, INTENT(OUT) :: PFIELD ! array containing the data field +REAL, INTENT(INOUT) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -88,7 +89,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:),INTENT(OUT) :: PFIELD ! array containing the data field +REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -122,7 +123,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:),INTENT(OUT) :: PFIELD ! array containing the data field +REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -156,7 +157,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:),INTENT(OUT) :: PFIELD ! array containing the data field +REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -190,7 +191,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:),INTENT(OUT) :: PFIELD ! array containing the data field +REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -224,7 +225,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:),INTENT(OUT) :: PFIELD ! array containing the data field +REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -258,7 +259,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:,:),INTENT(OUT) :: PFIELD ! array containing the data field +REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -292,7 +293,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD -INTEGER, INTENT(OUT) :: KFIELD ! array containing the data field +INTEGER, INTENT(INOUT) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -326,7 +327,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:),INTENT(OUT) :: KFIELD ! array containing the data field +INTEGER,DIMENSION(:),INTENT(INOUT) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -360,7 +361,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:,:),INTENT(OUT) :: KFIELD ! array containing the data field +INTEGER,DIMENSION(:,:),INTENT(INOUT) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -394,7 +395,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD -LOGICAL, INTENT(OUT) :: OFIELD ! array containing the data field +LOGICAL, INTENT(INOUT) :: OFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -441,7 +442,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL,DIMENSION(:),INTENT(OUT) :: OFIELD ! array containing the data field +LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables @@ -496,7 +497,7 @@ IMPLICIT NONE ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD -CHARACTER(LEN=*),INTENT(OUT) :: HFIELD ! array containing the data field +CHARACTER(LEN=*),INTENT(INOUT) :: HFIELD ! array containing the data field INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 index 2b760b114f717bf37107572e262be97f9b0cdecf..100078a8972c48c655b306f1ac35d6efe40c034f 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 @@ -8,8 +8,13 @@ ! J. Escobar 14/12/2017: correction for MNH_INT=8 ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 13/12/2018: split of mode_netcdf into multiple modules/files +<<<<<<< HEAD ! P. Wautelet 10/01/2019: replace handle_err by IO_Err_handle_nc4 for better netCDF error messages ! P. Wautelet 05/03/2019: rename IO subroutines and modules +======= +! P. Wautelet 10/01/2019: replace handle_err by io_handle_err_nc4 for better netCDF error messages +! P. Wautelet 21/02/2019: bugfix: intent of read fields: OUT->INOUT to keep initial value if not found in file +>>>>>>> MNH-54X !----------------------------------------------------------------- #if defined(MNH_IOCDF4) module mode_io_read_nc4 @@ -259,7 +264,7 @@ END SUBROUTINE IO_Field_attr_read_check_nc4 SUBROUTINE IO_Field_read_nc4_X0(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL, INTENT(OUT) :: PFIELD +REAL, INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -314,7 +319,7 @@ END SUBROUTINE IO_Field_read_nc4_X0 SUBROUTINE IO_Field_read_nc4_X1(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:),INTENT(OUT) :: PFIELD +REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -381,7 +386,7 @@ END SUBROUTINE IO_Field_read_nc4_X1 SUBROUTINE IO_Field_read_nc4_X2(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:),INTENT(OUT) :: PFIELD +REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -463,7 +468,7 @@ END SUBROUTINE IO_Field_read_nc4_X2 SUBROUTINE IO_Field_read_nc4_X3(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:),INTENT(OUT) :: PFIELD +REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -534,7 +539,7 @@ END SUBROUTINE IO_Field_read_nc4_X3 SUBROUTINE IO_Field_read_nc4_X4(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:),INTENT(OUT) :: PFIELD +REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -608,7 +613,7 @@ END SUBROUTINE IO_Field_read_nc4_X4 SUBROUTINE IO_Field_read_nc4_X5(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:),INTENT(OUT) :: PFIELD +REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -685,7 +690,7 @@ END SUBROUTINE IO_Field_read_nc4_X5 SUBROUTINE IO_Field_read_nc4_X6(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:,:),INTENT(OUT) :: PFIELD +REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -764,7 +769,7 @@ END SUBROUTINE IO_Field_read_nc4_X6 SUBROUTINE IO_Field_read_nc4_N0(TPFILE, TPFIELD, KFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER, INTENT(OUT) :: KFIELD +INTEGER, INTENT(INOUT) :: KFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -820,7 +825,7 @@ END SUBROUTINE IO_Field_read_nc4_N0 SUBROUTINE IO_Field_read_nc4_N1(TPFILE, TPFIELD, KFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER, DIMENSION(:), INTENT(OUT) :: KFIELD +INTEGER, DIMENSION(:), INTENT(INOUT) :: KFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -888,7 +893,7 @@ END SUBROUTINE IO_Field_read_nc4_N1 SUBROUTINE IO_Field_read_nc4_N2(TPFILE, TPFIELD, KFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER, DIMENSION(:,:), INTENT(OUT) :: KFIELD +INTEGER, DIMENSION(:,:), INTENT(INOUT) :: KFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -970,7 +975,7 @@ END SUBROUTINE IO_Field_read_nc4_N2 SUBROUTINE IO_Field_read_nc4_L0(TPFILE, TPFIELD, OFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL, INTENT(OUT) :: OFIELD +LOGICAL, INTENT(INOUT) :: OFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -1040,7 +1045,7 @@ END SUBROUTINE IO_Field_read_nc4_L0 SUBROUTINE IO_Field_read_nc4_L1(TPFILE, TPFIELD, OFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL,DIMENSION(:),INTENT(OUT) :: OFIELD +LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -1127,7 +1132,7 @@ END SUBROUTINE IO_Field_read_nc4_L1 SUBROUTINE IO_Field_read_nc4_C0(TPFILE, TPFIELD, HFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -CHARACTER(LEN=*), INTENT(OUT) :: HFIELD +CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS @@ -1196,7 +1201,7 @@ USE MODE_DATETIME ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -TYPE (DATE_TIME), INTENT(OUT) :: TPDATA +TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=IDCDF_KIND) :: STATUS diff --git a/src/LIB/megan.tar.gz b/src/LIB/megan.tar.gz index 81d81c29fa83d9f4724ba3e2085cf3613549fbc5..c9f186360fd3c305db25d9c72af24cca87988203 100644 --- a/src/LIB/megan.tar.gz +++ b/src/LIB/megan.tar.gz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f23728f9dae694a49c7a831686b8ee37a5f0be0b51839fa839bb8e022499bbc -size 42352 +oid sha256:0d9386c64cbbdf2ffe32f1c52e51e2606869e136a95a65e21f8081961f8e48d3 +size 42865 diff --git a/src/LIB/netcdf-cxx-4.2.tar.gz b/src/LIB/netcdf-cxx-4.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..11c1c15536cf186d606f9de7d6468223a68e838d --- /dev/null +++ b/src/LIB/netcdf-cxx-4.2.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95ed6ab49a0ee001255eac4e44aacb5ca4ea96ba850c08337a3e4c9a0872ccd1 +size 703482 diff --git a/src/LIB/s4py/init_gfortran.c b/src/LIB/s4py/init_gfortran.c new file mode 100644 index 0000000000000000000000000000000000000000..2fb55869b0fa5f71140d424df2568442eed4f059 --- /dev/null +++ b/src/LIB/s4py/init_gfortran.c @@ -0,0 +1,15 @@ +//MNH_LIC Copyright 2019-2019 CNRS, Meteo-France and Universite Paul Sabatier +//MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +//MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +//MNH_LIC for details. version 1. +//----------------------------------------------------------------- +#ifdef __GFORTRAN__ +/* Philippe Marguinaud idea */ + +void init_gfortran_big_endian_(){ + _gfortran_set_convert (2); +} +void init_gfortran_native_endian_(){ + _gfortran_set_convert (0); +} +#endif diff --git a/src/LIB/s4py/libs4py.f90 b/src/LIB/s4py/libs4py.f90 new file mode 100644 index 0000000000000000000000000000000000000000..94a19975455b3621545d5261069e5cdc0dbbf5b8 --- /dev/null +++ b/src/LIB/s4py/libs4py.f90 @@ -0,0 +1,532 @@ +!MNH_LIC Copyright 2014-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +SUBROUTINE WLFIOUV(KRETURNCODE, CDFILE, CDSTATE, KNUMER) +! ** PURPOSE +! Open a LFI file +! +! ** DUMMY ARGUMENTS +! KRETURNCODE: error code +! CDFILE: path to file to open +! CDSTATE: state of file ('NEW', 'OLD', 'UNKNOWN', 'SCRATCH') +! KNUMER: logical unit number associated to file +! +! ** AUTHOR +! 9 April 2014, S. Riette +! +! ** MODIFICATIONS +! 26 sept 2014, S. Riette: use 64bits LFI subroutines +! 8 nov 2018, S. Riette: Meso-NH version +! P. Wautelet 21/02/2019: add copyright notice + use INT64 for 64-bits integers +! +! I. Dummy arguments declaration +use iso_fortran_env, only: INT64 +IMPLICIT NONE +INTEGER(KIND=INT64), INTENT(OUT) :: KRETURNCODE +CHARACTER(LEN=*), INTENT(IN) :: CDFILE +CHARACTER(LEN=*), INTENT(IN) :: CDSTATE +INTEGER(KIND=INT64), INTENT(OUT) :: KNUMER +! +! II. Local variables declaration +INTEGER, PARAMETER :: JPMAXLOGICALUNITNUMBER=5000 +INTEGER(KIND=LFI_INT) :: IRETURNCODE +LOGICAL :: LLEXISTS, LLOPEN +INTEGER(KIND=LFI_INT) :: IRECORDNUMBER +INTEGER(KIND=LFI_INT) :: INUMER +! +! III. File opening +! +! III.a Search for an available logical unit +INUMER=0 +LLEXISTS=.FALSE. +LLOPEN=.TRUE. +IRETURNCODE=0 +DO WHILE(INUMER.LT.JPMAXLOGICALUNITNUMBER .AND. (LLOPEN .OR. .NOT. LLEXISTS)) + INUMER=INUMER+1 + INQUIRE(UNIT=INUMER, EXIST=LLEXISTS, OPENED=LLOPEN) +ENDDO +IF(LLOPEN .OR. .NOT. LLEXISTS) THEN + IRETURNCODE=-999 +ENDIF +! +#ifdef __GFORTRAN__ +! III.b (Re)-init of libgfortran to enable big_endian file reading +!**** *** ** * only gfortran will work with this * ** *** **** +CALL INIT_GFORTRAN_BIG_ENDIAN() +#endif +! +! III.c LFI file opening +CALL LFIOUV(IRETURNCODE, INUMER, .TRUE., CDFILE, CDSTATE, .FALSE.,& + &.FALSE., INT(0, LFI_INT), INT(1, LFI_INT), IRECORDNUMBER) +IF(IRETURNCODE/=0)THEN + CALL LFIENG(INUMER, INT(0, LFI_INT), IRETURNCODE, .FALSE., '', 'LFIOUV', '') +ENDIF +! +#ifdef __GFORTRAN__ +! III.d (Re)-init of libgfortran to enable native endianess file reading +!**** *** ** * only gfortran will work with this * ** *** **** +CALL INIT_GFORTRAN_NATIVE_ENDIAN() +#endif +! +KNUMER=INT(INUMER, 8) +KRETURNCODE=INT(IRETURNCODE,8) + +END SUBROUTINE WLFIOUV + +!______________________________________________________________________ + +SUBROUTINE WLFINAF(KRETURNCODE, KNUMER, KNALDO, KNTROU, KNARES, KNAMAX) +! ** PURPOSE +! Wrapper to LFINAF +! +! ** DUMMY ARGUMENTS +! KRETURNCODE: error code +! KNUMER: logical unit number associated to file +! KNALDO: Number of actual logical data records (holes excluded) +! KNTROU: Number of logical records which are holes +! KNARES: Number of logical records which can be written in the reserved part of index (holes included) +! KNAMAX: Maximum number of logical records which one can write on logical unit +! +! ** AUTHOR +! 9 April 2014, S. Riette +! +! ** MODIFICATIONS +! 26 sept 2014, S. Riette: use 64bits LFI subroutines +! 8 nov 2018, S. Riette: Meso-NH version +! +! I. Dummy arguments declaration +use iso_fortran_env, only: INT64 +IMPLICIT NONE +INTEGER(KIND=INT64), INTENT(OUT) :: KRETURNCODE +INTEGER(KIND=INT64), INTENT(IN) :: KNUMER +INTEGER(KIND=INT64), INTENT(OUT) :: KNALDO, KNTROU, KNARES, KNAMAX +! +! II. Local variables declaration +INTEGER(KIND=LFI_INT) :: IRETURNCODE +INTEGER(KIND=LFI_INT) :: INUMER +INTEGER(KIND=LFI_INT) :: INALDO, INTROU, INARES, INAMAX +! +! III. LFINAF call +INUMER=INT(KNUMER, KIND(INUMER)) +CALL LFINAF(IRETURNCODE, INUMER, INALDO, INTROU, INARES, INAMAX) +IF(IRETURNCODE/=0)THEN + CALL LFIENG(INUMER, INT(0, LFI_INT), IRETURNCODE, .FALSE., '', 'LFINAF', '') +ENDIF +KRETURNCODE=INT(IRETURNCODE,8) +KNALDO=INT(INALDO, 8) +KNTROU=INT(INTROU, 8) +KNARES=INT(INARES, 8) +KNAMAX=INT(INAMAX, 8) +! +END SUBROUTINE WLFINAF + +!______________________________________________________________________ + +SUBROUTINE WLFIPOS(KRETURNCODE, KNUMER) +! ** PURPOSE +! Wrapper to LFIPOS +! +! ** DUMMY ARGUMENTS +! KRETURNCODE: error code +! KNUMER: logical unit number associated to file +! +! ** AUTHOR +! 9 April 2014, S. Riette +! +! ** MODIFICATIONS +! 26 sept 2014, S. Riette: use 64bits LFI subroutines +! 8 nov 2018, S. Riette: Meso-NH version +! +! I. Dummy arguments declaration +use iso_fortran_env, only: INT64 +IMPLICIT NONE +INTEGER(KIND=INT64), INTENT(OUT) :: KRETURNCODE +INTEGER(KIND=INT64), INTENT(IN) :: KNUMER +! +! II. Local variables declaration +INTEGER(KIND=LFI_INT) :: IRETURNCODE +INTEGER(KIND=LFI_INT) :: INUMER +! +! III. LFIPOS call +INUMER=INT(KNUMER, KIND(INUMER)) +CALL LFIPOS(IRETURNCODE, INUMER) +IF(IRETURNCODE/=0)THEN + CALL LFIENG(INUMER, INT(0, LFI_INT), IRETURNCODE, .FALSE., '', 'LFIPOS', '') +ENDIF +KRETURNCODE=INT(IRETURNCODE,8) +! +END SUBROUTINE WLFIPOS + +!______________________________________________________________________ + +SUBROUTINE WLFICAS(KRETURNCODE, KNUMER, CDNOMA, KLONG, KPOSEX, LDAVAN) +! ** PURPOSE +! Wrapper to LFICAS +! +! ** DUMMY ARGUMENTS +! KRETURNCODE: error code +! KNUMER: logical unit number associated to file +! CDNOMA: name of next record +! KLONG: length of next record +! KPOSEX: position in file of the first word of next record +! LDAVAN: true if one must move forward the pointer +! +! ** AUTHOR +! 9 April 2014, S. Riette +! +! ** MODIFICATIONS +! 26 sept 2014, S. Riette: use 64bits LFI subroutines +! use of true logical instead of integer +! 8 nov 2018, S. Riette: Meso-NH version +! +! I. Dummy arguments declaration +use iso_fortran_env, only: INT64 +IMPLICIT NONE +INTEGER(KIND=INT64), INTENT(OUT) :: KRETURNCODE +INTEGER(KIND=INT64), INTENT(IN) :: KNUMER +CHARACTER(LEN=16), INTENT(OUT) :: CDNOMA +INTEGER(KIND=INT64), INTENT(OUT) :: KLONG, KPOSEX +LOGICAL, INTENT(IN) :: LDAVAN +! +! II. Local variables declaration +INTEGER(KIND=LFI_INT) :: IRETURNCODE +INTEGER(KIND=LFI_INT) :: INUMER +INTEGER(KIND=LFI_INT) :: ILONG, IPOSEX +! +! III. LFICAS call +INUMER=INT(KNUMER, KIND(INUMER)) +CALL LFICAS(IRETURNCODE, INUMER, CDNOMA, ILONG, IPOSEX, LDAVAN) +IF(IRETURNCODE/=0)THEN + CALL LFIENG(INUMER, INT(0, LFI_INT), IRETURNCODE, .FALSE., '', 'LFICAS', '') +ENDIF +KRETURNCODE=INT(IRETURNCODE,8) +KLONG=INT(ILONG, 8) +KPOSEX=INT(IPOSEX, 8) +! +END SUBROUTINE WLFICAS + +!______________________________________________________________________ + +SUBROUTINE WLFINFO(KRETURNCODE, KNUMER, CDNOMA, KLONG, KPOSEX) +! ** PURPOSE +! Wrapper to LFINFO +! +! ** DUMMY ARGUMENTS +! KRETURNCODE: error code +! KNUMER: logical unit number associated to file +! CDNOMA: name of record +! KLONG: length of record +! KPOSEX: position in file of the first word of next record + +! ** AUTHOR +! 9 April 2014, S. Riette +! +! ** MODIFICATIONS +! 26 sept 2014, S. Riette: use 64bits LFI subroutines +! 8 nov 2018, S. Riette: Meso-NH version +! +! I. Dummy arguments declaration +use iso_fortran_env, only: INT64 +IMPLICIT NONE +INTEGER(KIND=INT64), INTENT(OUT) :: KRETURNCODE +INTEGER(KIND=INT64), INTENT(IN) :: KNUMER +CHARACTER(LEN=16), INTENT(IN) :: CDNOMA +INTEGER(KIND=INT64), INTENT(OUT) :: KLONG, KPOSEX +! +! II. Local variables declaration +INTEGER(KIND=LFI_INT) :: IRETURNCODE +INTEGER(KIND=LFI_INT) :: INUMER +INTEGER(KIND=LFI_INT) :: ILONG, IPOSEX +! +! III. LFINFO call +INUMER=INT(KNUMER, KIND(INUMER)) +CALL LFINFO(IRETURNCODE, INUMER, CDNOMA, ILONG, IPOSEX) +IF(IRETURNCODE/=0)THEN + CALL LFIENG(INUMER, INT(0, LFI_INT), IRETURNCODE, .FALSE., '', 'LFINFO', '') +ENDIF +KRETURNCODE=INT(IRETURNCODE,8) +KLONG=INT(ILONG, 8) +KPOSEX=INT(IPOSEX, 8) +! +END SUBROUTINE WLFINFO + +!______________________________________________________________________ + +SUBROUTINE WLFILEC(KRETURNCODE, KNUMER, CDNOMA, KLONG, LDABORT, KTAB) +! ** PURPOSE +! Wrapper to LFILEC +! +! ** DUMMY ARGUMENTS +! KRETURNCODE: error code +! KNUMER: logical unit number associated to file +! CDNOMA: name of record +! KLONG: length of record +! LDABORT: must we raise an exception on error -21 ? +! KTAB: integer array read + +! ** AUTHOR +! 9 April 2014, S. Riette +! +! ** MODIFICATIONS +! 26 sept 2014, S. Riette: use 64bits LFI subroutines +! use of true logical instead of integer +! 8 nov 2018, S. Riette: Meso-NH version +! +! I. Dummy arguments declaration +use iso_fortran_env, only: INT64 +IMPLICIT NONE +INTEGER(KIND=INT64), INTENT(OUT) :: KRETURNCODE +INTEGER(KIND=INT64), INTENT(IN) :: KNUMER +CHARACTER(LEN=16), INTENT(IN) :: CDNOMA +INTEGER(KIND=INT64), INTENT(IN) :: KLONG +LOGICAL, INTENT(IN) :: LDABORT +INTEGER(KIND=INT64), INTENT(OUT), DIMENSION(KLONG) :: KTAB +! +! II. Local variables declaration +INTEGER(KIND=LFI_INT) :: IRETURNCODE +INTEGER(KIND=LFI_INT) :: INUMER, ILONG +INTEGER(KIND=LFI_INT) :: ITOTLONG, IPOSEX +INTEGER(KIND=INT64), ALLOCATABLE :: KTABTOT(:) +! +! III. LFILEC call +INUMER=INT(KNUMER, KIND(INUMER)) +ILONG=INT(KLONG, KIND(ILONG)) +! +!Because NERFAG cannot be changed easily, we read the entire article +!even if only a part is needed, otherwise NERFAG=2 would be sufficient +CALL WLFINFO(IRETURNCODE, INUMER, CDNOMA, ITOTLONG, IPOSEX) +IF(ILONG .LT. ITOTLONG) THEN + ALLOCATE(KTABTOT(ITOTLONG)) + CALL LFILEC(IRETURNCODE, INUMER, CDNOMA, KTABTOT, ITOTLONG) +ELSE + CALL LFILEC(IRETURNCODE, INUMER, CDNOMA, KTAB, ILONG) +ENDIF +IF (IRETURNCODE/=0 .AND. .NOT. (IRETURNCODE==-21 .AND. .NOT. LDABORT)) THEN + CALL LFIENG(INUMER, INT(0, LFI_INT), IRETURNCODE, .FALSE., '', 'LFILEC', '') + KRETURNCODE=INT(IRETURNCODE,8) +ELSE + KRETURNCODE=INT(0,8) +ENDIF +IF(ILONG .LT. ITOTLONG) THEN + KTAB(:)=KTABTOT(1:ILONG) + DEALLOCATE(KTABTOT) +ENDIF +! +END SUBROUTINE WLFILEC + +!_________________________________________________________________________________________________ + +SUBROUTINE WGET_COMPHEADER(KSIZE, KDATA, KLONG, KLONU, KTYPECOMP) +! ** PURPOSE +! Wrapper to GET_COMPHEADER +! +! ** DUMMY ARGUMENTS +! KSIZE: Size of KDATA +! KDATA: (part of) integer array read from record +! KLONG: length of compressed data +! KLONU: length of uncompressed data +! KTYPECOMP: type of compression +! +! ** AUTHOR +! 9 April 2014, S. Riette +! +! ** MODIFICATIONS +! +! I. Dummy arguments declaration +use iso_fortran_env, only: INT64 +IMPLICIT NONE +INTEGER(KIND=INT64), INTENT(IN) :: KSIZE +INTEGER(KIND=INT64), INTENT(IN), DIMENSION(KSIZE) :: KDATA +INTEGER(KIND=INT64), INTENT(IN) :: KLONG +INTEGER(KIND=INT64), INTENT(OUT) :: KLONU +INTEGER(KIND=INT64), INTENT(OUT) :: KTYPECOMP +! +! II. Local variables declaration +INTEGER :: ILONG +INTEGER :: ILONU, ITYPECOMP +! +! III. GET_COMPHEADER call +#ifdef MNH_COMPRESS +ILONG=KLONG +CALL GET_COMPHEADER(KDATA, ILONG, ILONU, ITYPECOMP) +KLONU=INT(ILONU, 8) +KTYPECOMP=INT(ITYPECOMP, 8) +#else +print*, "Error: code was compiled without COMPRESS support, please define MNH_COMPRESS" +KLONU=INT(-1, 8) +KTYPECOMP=INT(-1, 8) +#endif +! +END SUBROUTINE WGET_COMPHEADER + +!_________________________________________________________________________________________________ + +SUBROUTINE WCOMPRESS_FIELD(KTAB, KX, KY, KSIZEDECOMP, KSIZECOMP) +! ** PURPOSE +! Wrapper to COMPRESS_FIELD +! +! ** DUMMY ARGUMENTS +! KTAB: decompressed integer array (IN) +! compressed data integer array (OUT) +! KX, KY: x and y dimensions +! KSIZEDECOMP: size of decompressed data +! KSIZECOMP: size of compressed integer array +! +! ** AUTHOR +! 16 July 2015, S. Riette +! +! ** MODIFICATIONS +! +! I. Dummy arguments declaration +use iso_fortran_env, only: INT64 +IMPLICIT NONE +INTEGER(KIND=INT64), INTENT(IN) :: KX, KY, KSIZEDECOMP +INTEGER(KIND=INT64), INTENT(INOUT), DIMENSION(KSIZEDECOMP) :: KTAB +INTEGER(KIND=INT64), INTENT(OUT) :: KSIZECOMP +! +! II. Local variables declaration +INTEGER :: ISIZEDECOMP, ISIZECOMP, IX, IY +! +! III. COMPRESS_FIELD call +#ifdef MNH_COMPRESS +ISIZEDECOMP=KSIZEDECOMP +IX=KX +IY=KY +CALL COMPRESS_FIELD(KTAB, IX, IY, ISIZEDECOMP, ISIZECOMP) +KSIZECOMP=ISIZECOMP +#else +print*, "Error: code was compiled without COMPRESS support, please define MNH_COMPRESS" +KSIZECOMP=INT(-1, 8) +#endif +! +END SUBROUTINE WCOMPRESS_FIELD + +!_________________________________________________________________________________________________ + +SUBROUTINE WDECOMPRESS_FIELD(KSIZE, KCOMP, KTYPECOMP, KLDECOMP, KDECOMP) +! ** PURPOSE +! Wrapper to DECOMPRESS_FIELD +! +! ** DUMMY ARGUMENTS +! KSIZE: size of KCOMP +! KCOMP: compressed integer array +! KTYPECOMP: type of compression +! KDECOMP: decompressed data integer array +! KLDECOMP: length of decompressed data +! +! ** AUTHOR +! 9 April 2014, S. Riette +! +! ** MODIFICATIONS +! +! I. Dummy arguments declaration +use iso_fortran_env, only: INT64 +IMPLICIT NONE +INTEGER(KIND=INT64), INTENT(IN) :: KSIZE +INTEGER(KIND=INT64), INTENT(IN), DIMENSION(KSIZE) :: KCOMP +INTEGER(KIND=INT64), INTENT(IN) :: KTYPECOMP +INTEGER(KIND=INT64), INTENT(IN) :: KLDECOMP +INTEGER(KIND=INT64), INTENT(OUT), DIMENSION(KLDECOMP) :: KDECOMP +! +! II. Local variables declaration +INTEGER :: ITYPECOMP, ILDECOMP +! +! III. DECOMPRESS_FIELD call +#ifdef MNH_COMPRESS +ILDECOMP=KLDECOMP +ITYPECOMP=KTYPECOMP +CALL DECOMPRESS_FIELD(KDECOMP, ILDECOMP, KCOMP, SIZE(KCOMP,1), ITYPECOMP) +#else +print*, "Error: code was compiled without COMPRESS support, please define MNH_COMPRESS" +KDECOMP(:)=-1 +#endif +! +END SUBROUTINE WDECOMPRESS_FIELD + +!_________________________________________________________________________________________________ + +SUBROUTINE WLFIFER(KRETURNCODE, KNUMER, CDSTTC) +! ** PURPOSE +! Close a LFI file +! +! ** DUMMY ARGUMENTS +! KRETURNCODE: error code +! KNUMER: logical unit number associated to file +! CDSTTC: close status ('KEEP', 'SCRATCH', 'DELETE') +! +! ** AUTHOR +! 9 April 2014, S. Riette +! +! ** MODIFICATIONS +! 26 sept 2014, S. Riette: use 64bits LFI subroutines +! 8 nov 2018, S. Riette: Meso-NH version +! +! I. Dummy arguments declaration +use iso_fortran_env, only: INT64 +IMPLICIT NONE +INTEGER(KIND=INT64), INTENT(OUT) :: KRETURNCODE +INTEGER(KIND=INT64), INTENT(IN) :: KNUMER +CHARACTER(LEN=7), INTENT(IN) :: CDSTTC +! +! II. Local variables declaration +INTEGER(KIND=LFI_INT) :: IRETURNCODE +INTEGER(KIND=LFI_INT) :: INUMER +! +! III. LFIFER call +INUMER=INT(KNUMER, KIND(INUMER)) +CALL LFIFER(IRETURNCODE, INUMER, CDSTTC) +IF(IRETURNCODE/=0)THEN + CALL LFIENG(INUMER, INT(0, LFI_INT), IRETURNCODE, .FALSE., '', 'LFIFER', '') +ENDIF +KRETURNCODE=INT(IRETURNCODE,8) +! +END SUBROUTINE WLFIFER + +!_________________________________________________________________________________________________ + +SUBROUTINE WLFIECR(KRETURNCODE, KNUMER, CDNOMA, KSIZE, KTAB) +! ** PURPOSE +! Wrapper to LFIECR +! +! ** DUMMY ARGUMENTS +! KRETURNCODE: error code +! KNUMER: logical unit number associated to file +! CDNOMA: name of field to write +! KSIZE: Size of KTAB +! KTAB: integer array to write +! +! ** AUTHOR +! 9 April 2014, S. Riette +! +! ** MODIFICATIONS +! 26 sept 2014, S. Riette: use 64bits LFI subroutines +! 8 nov 2018, S. Riette: Meso-NH version +! +! I. Dummy arguments declaration +use iso_fortran_env, only: INT64 +IMPLICIT NONE +INTEGER(KIND=INT64), INTENT(OUT) :: KRETURNCODE +INTEGER(KIND=INT64), INTENT(IN) :: KNUMER +CHARACTER(LEN=16), INTENT(IN) :: CDNOMA +INTEGER(KIND=INT64), INTENT(IN) :: KSIZE +INTEGER(KIND=INT64), INTENT(IN), DIMENSION(KSIZE) :: KTAB +! +! II. Local variables declaration +INTEGER(KIND=LFI_INT) :: IRETURNCODE +INTEGER(KIND=LFI_INT) :: INUMER +INTEGER(KIND=LFI_INT) :: ISIZE +! +! III. LFIECR call +INUMER=INT(KNUMER, KIND(INUMER)) +ISIZE=INT(KSIZE, KIND(ISIZE)) +CALL LFIECR(IRETURNCODE, INUMER, CDNOMA, KTAB, ISIZE) +IF(IRETURNCODE/=0)THEN + CALL LFIENG(INUMER, INT(0, LFI_INT), IRETURNCODE, .FALSE., '', 'LFIECR', '') +ENDIF +KRETURNCODE=INT(IRETURNCODE,8) +! +END SUBROUTINE WLFIECR + +!_________________________________________________________________________________________________ diff --git a/src/MNH/BASIC.f90 b/src/MNH/BASIC.f90 old mode 100644 new mode 100755 diff --git a/src/MNH/aer_monitorn.f90 b/src/MNH/aer_monitorn.f90 index 245e8f67283a5e9db1824466f63025377bc5678d..21f1f177fdb72649cc8f5074726840a36ea06626 100644 --- a/src/MNH/aer_monitorn.f90 +++ b/src/MNH/aer_monitorn.f90 @@ -72,7 +72,8 @@ END MODULE MODI_AER_MONITOR_n !! !! MODIFICATIONS !! ------------- -!! +! +!! Bielli S. (02/2019) : Sea salt : significant sea wave height influences salt emission; 5 salt modes !! EXTERNAL !! -------- ! @@ -112,7 +113,7 @@ USE MODD_LBC_n, ONLY: CLBCX, &!X-direction LBC type at left(1) ! and right(2) boundaries USE MODD_CLOUDPAR_n, ONLY: NSPLITR ! Nb of required small time step integration ! for rain sedimentation computation -USE MODD_CONF, ONLY: L1D, L2D +USE MODD_CONF, ONLY: L1D, L2D, NVERB USE MODD_CONF_n, ONLY: LUSERC,& ! Logical to use clouds LUSERV,& ! Logical to use wapor water LUSERR,& ! Logical to use rain water @@ -185,9 +186,14 @@ IKE = IKU - JPVEXT ! !* 1.2 calculate timestep variables ! +! ++ JORIS DEBUG ++ +IF (NVERB == 10) WRITE(*,*) 'dans aer_monitorn.f90 1.' +! -- JORIS DEBUG -- ! - XRSVS(:,:,:,NSV_DSTBEG:NSV_DSTEND) = & - MAX(XRSVS(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.) +! ++ PIERRE / MARINE SSA DUST - MODIF ++ +! XRSVS(:,:,:,NSV_DSTBEG:NSV_DSTEND) = & +! MAX(XRSVS(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.) +! -- PIERRE / MARINE SSA DUST - MODIF -- ! !* 2. Sedimentation of aerosols ! ------------------------ @@ -198,8 +204,11 @@ IF (LDUST.AND.LSEDIMDUST) THEN DO JSV = NSV_DSTBEG, NSV_DSTEND ZSVT(:,:,:,JSV-NSV_DSTBEG+1) = XRSVS(:,:,:,JSV) * PTSTEP / XRHODJ(:,:,:) ENDDO - CALL DUST_FILTER(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),& - XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) +! ++ PIERRE / MARINE SSA DUST - MODIF ++ + CALL DUST_FILTER(ZSVT,XRHODREF) +! CALL DUST_FILTER(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),& +! XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) +! -- PIERRE / MARINE SSA DUST - MODIF -- CALL SEDIM_DUST(XTHT(IIB:IIE,IJB:IJE,IKB:IKE), PTSTEP,& XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & @@ -222,14 +231,17 @@ IF ((LSALT).AND.(LSEDIMSALT)) THEN ZSVT(:,:,:,JSV-NSV_SLTBEG+1) = XRSVS(:,:,:,JSV) * PTSTEP / XRHODJ(:,:,:) ENDDO +! ++ JORIS DEBUG ++ CALL SALT_FILTER(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),& - XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) + XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) +! CALL SEDIM_SALT(XTHT(IIB:IIE,IJB:IJE,IKB:IKE),PTSTEP,& XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & XZZ(IIB:IIE,IJB:IJE,IKB:IKE+1), & ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:)) !ppp (concentration) -! +! -- JORIS DEBUG -- + DO JSV = NSV_SLTBEG, NSV_SLTEND XRSVS(IIB:IIE,IJB:IJE,IKB:IKE,JSV) = & ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,JSV-NSV_SLTBEG+1) *& @@ -365,7 +377,26 @@ SELECT CASE (CCLOUD) ZVMASSMIN(IIB:IIE,IJB:IJE,IKB:IKE,:),& PCCT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_C2R2BEG+1),& PCRT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_C2R2BEG+2) ) - +!++th++ 05/05/17 ajout LIMA +CASE ('LIMA') + CALL AER_WET_DEP_KMT_WARM (NSPLITR, PTSTEP, & + XZZ(IIB:IIE,IJB:IJE,IKB:IKE), & + XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & + XRT(IIB:IIE,IJB:IJE,IKB:IKE,2), & + XRT(IIB:IIE,IJB:IJE,IKB:IKE,3), & + ZRCS(IIB:IIE,IJB:IJE,IKB:IKE), & + ZRRS(IIB:IIE,IJB:IJE,IKB:IKE), & + ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & + XTHT(IIB:IIE,IJB:IJE,IKB:IKE), & + XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & + ZRGDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & + XEVAP3D(IIB:IIE,IJB:IJE,IKB:IKE), & + NMODE_DST, & + ZDENSITY(IIB:IIE,IJB:IJE,IKB:IKE,:), & + ZVMASSMIN(IIB:IIE,IJB:IJE,IKB:IKE,:),& + PCCT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_LIMA_NC),& + PCRT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_LIMA_NR) ) +!--th-- END SELECT ! 3.5 Compute return to moment vector @@ -441,25 +472,25 @@ ZDENSITY(:,:,:,:) = XDENSITY_SALT ! ! 4.1 Minimum mass to transfer between dry mass or in-cloud droplets - +! ++ PIERRE / MARINE SSA DUST - MODIF ++ DO JN=1,NMODE_SLT IMODEIDX = JPSALTORDER(JN) IF (CRGUNITD=="MASS") THEN - ZINIRADIUS(JN) = XINIRADIUS(IMODEIDX) * EXP(-3.*(LOG(XINISIG(IMODEIDX)))**2) + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) * EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) ELSE - ZINIRADIUS(JN) = XINIRADIUS(IMODEIDX) + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) END IF IF (LVARSIG) THEN - ZSIGMIN = XSIGMIN + ZSIGMIN = XSIGMIN_SLT ELSE - ZSIGMIN = XINISIG(IMODEIDX) + ZSIGMIN = XINISIG_SLT(IMODEIDX) ENDIF - ZMASSMIN(JN) = XN0MIN(IMODEIDX) * (ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(ZSIGMIN)**2) + ZMASSMIN(JN) = XN0MIN_SLT(IMODEIDX) * (ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(ZSIGMIN)**2) ! volume/um3 => #/molec_{air} ZVMASSMIN(:,:,:,JN)= ZMASSMIN(JN) * XMD * XPI * 4./3. * XDENSITY_SALT / & - (XMOLARWEIGHT_SALT*XM3TOUM3*XRHODREF(:,:,:)) + (XMOLARWEIGHT_SALT*XM3TOUM3_SALT*XRHODREF(:,:,:)) ENDDO - +! -- PIERRE / MARINE SSA DUST - MODIF -- ! ! 4.2 Derive moment from aerosol moments sources @@ -536,7 +567,25 @@ SELECT CASE (CCLOUD) ZVMASSMIN(IIB:IIE,IJB:IJE,IKB:IKE,:),& PCCT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_C2R2BEG+1),& PCRT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_C2R2BEG+2) ) - +!++th++05/05/17 ajout LIMA + CALL AER_WET_DEP_KMT_WARM (NSPLITR, PTSTEP, & + XZZ(IIB:IIE,IJB:IJE,IKB:IKE), & + XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & + XRT(IIB:IIE,IJB:IJE,IKB:IKE,2), & + XRT(IIB:IIE,IJB:IJE,IKB:IKE,3), & + ZRCS(IIB:IIE,IJB:IJE,IKB:IKE), & + ZRRS(IIB:IIE,IJB:IJE,IKB:IKE), & + ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & + XTHT(IIB:IIE,IJB:IJE,IKB:IKE), & + XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & + ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & + XEVAP3D(IIB:IIE,IJB:IJE,IKB:IKE), & + NMODE_SLT, & + ZDENSITY(IIB:IIE,IJB:IJE,IKB:IKE,:), & + ZVMASSMIN(IIB:IIE,IJB:IJE,IKB:IKE,:),& + PCCT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_LIMA_NC),& + PCRT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_LIMA_NR) ) +!--th-- END SELECT ! 4.5 Compute return to moment vector diff --git a/src/MNH/ch_aer_eqm_initn.f90 b/src/MNH/ch_aer_eqm_initn.f90 index ef4f69812ec13a06d9d50d27d85b37adf99ee756..acece90b873e701417f00e2f778e8936bca66df6 100644 --- a/src/MNH/ch_aer_eqm_initn.f90 +++ b/src/MNH/ch_aer_eqm_initn.f90 @@ -1,13 +1,8 @@ -!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !ORILAM_LIC for details. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- -!----------------------------------------------------------------- !! ######################## MODULE MODI_CH_AER_EQM_INIT_n !! ######################## @@ -49,6 +44,7 @@ END MODULE MODI_CH_AER_EQM_INIT_n !! MODIFICATIONS !! ------------- !! M.Leriche 2015 : masse molaire Black carbon à 12 g/mol +! P. Wautelet 05/03/2019: modify allocation procedure for XMI and XSOLORG !! !! EXTERNAL !! -------- @@ -116,15 +112,27 @@ END DO ZDEN2MOL = 1E-6 * XAVOGADRO / XMD +IF ( ASSOCIATED(XMI) ) THEN + IF ( SIZE(XMI) == 0 ) THEN + DEALLOCATE( XMI ) + XMI => NULL() + END IF +END IF IF (.NOT.(ASSOCIATED(XMI))) THEN ALLOCATE(XMI(SIZE(PCHEM,1),SIZE(PCHEM,2),SIZE(PCHEM,3),NSP+NCARB+NSOA)) END IF +IF ( ASSOCIATED(XSOLORG) ) THEN + IF ( SIZE(XSOLORG) == 0 ) THEN + DEALLOCATE( XSOLORG ) + XSOLORG => NULL() + END IF +END IF IF (.NOT.(ASSOCIATED(XSOLORG))) THEN ALLOCATE(XSOLORG(SIZE(PCHEM,1),SIZE(PCHEM,2),SIZE(PCHEM,3),10)) XSOLORG(:,:,:,:) = 0. END IF - +! ! Default values of molar mass XMI(:,:,:,:) = 250. diff --git a/src/MNH/ch_aqueous_sedim1mom.f90 b/src/MNH/ch_aqueous_sedim1mom.f90 index 9bf9109b022306bf0ef99d6fd47b8d62230da921..cd0cf2e146b3e3350801ed6264a93aa9f496a87a 100644 --- a/src/MNH/ch_aqueous_sedim1mom.f90 +++ b/src/MNH/ch_aqueous_sedim1mom.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2007-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. ! ################################ MODULE MODI_CH_AQUEOUS_SEDIM1MOM @@ -79,6 +79,7 @@ END MODULE MODI_CH_AQUEOUS_SEDIM1MOM !! 17/09/10 (M Leriche) add LUSECHIC flag !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! 16/12/15 (M Leriche) compute instantaneous rain at the surface +! P. Wautelet 12/02/2019: bugfix: ZRR_SEDIM was not initialized everywhere !! !------------------------------------------------------------------------------- ! @@ -268,6 +269,7 @@ DO JN = 1 , KSPLITR ! ZZW(:) = ZFSEDR * ZZZRRS(:)**(ZEXSEDR) * ZRHODREF(:)**(ZEXSEDR-ZCEXVT) ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMR(:,:,:),FIELD=0.0 ) + ZRR_SEDIM(:,:,:) = 0.0 DO JK = IKB , IKE ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) END DO @@ -308,6 +310,7 @@ DO JN = 1 , KSPLITR ! ZZW(:) = XFSEDS * ZZZRSS(:)**(XEXSEDS) * ZRHODREF(:)**(XEXSEDS-ZCEXVT) ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMS(:,:,:),FIELD=0.0 ) + ZRR_SEDIM(:,:,:) = 0.0 DO JK = IKB , IKE ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) END DO @@ -336,6 +339,7 @@ DO JN = 1 , KSPLITR ! ZZW(:) = XFSEDG * ZZZRGS(:)**(XEXSEDG) * ZRHODREF(:)**(XEXSEDG-ZCEXVT) ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMG(:,:,:),FIELD=0.0 ) + ZRR_SEDIM(:,:,:) = 0.0 DO JK = IKB , IKE ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) END DO diff --git a/src/MNH/ch_f77.fx90 b/src/MNH/ch_f77.fx90 index 79387b824a2390553faa1a480964e9c3b9f034c0..be71fe6c01244c1265bc94f3e2f706cef92b5708 100644 --- a/src/MNH/ch_f77.fx90 +++ b/src/MNH/ch_f77.fx90 @@ -20,6 +20,8 @@ C**MODIFIED: 10/01/2019 (P.Wautelet) use newunit argument to open files C + bug corrections: some files were not closed C**MODIFIED: 10/01/2019 (P.Wautelet) replace double precision declarations by C real(kind(0.0d0)) (to allow compilation by NAG compiler) +C**MODIFIED: 08/02/2019 (P.Wautelet) bug fixes: missing argument +C + wrong use of an non initialized value C! C! C! @@ -4974,7 +4976,6 @@ c IF(zaird .GT. nzero) aircon(izout) = zaird * in subroutine. * Optical depths in Lyman-alpha and SRB will be over-written * in subroutine la_srb.f - CALL seto2(nz,z,nw,wl,aircol,o2xs1, dto2, kout) * Ozone optical depths @@ -20251,11 +20252,11 @@ c INCLUDE 'params' mabs = 4 - IF (mabs. EQ. 1) CALL no2xs_d(nz,tlev,nw,wl, no2xs) - IF (mabs .EQ. 2) CALL no2xs_jpl94(nz,tlev,nw,wl, no2xs) - IF (mabs .EQ. 3) CALL no2xs_har(nz,tlev,nw,wl, no2xs) - IF (mabs .EQ. 4) CALL no2xs_jpl06a(nz,tlev,nw,wl, no2xs) - IF (mabs .EQ. 5) CALL no2xs_jpl06b(nz,tlev,nw,wl, no2xs) + IF (mabs. EQ. 1) CALL no2xs_d(nz,tlev,nw,wl, no2xs, kout) + IF (mabs .EQ. 2) CALL no2xs_jpl94(nz,tlev,nw,wl, no2xs, kout) + IF (mabs .EQ. 3) CALL no2xs_har(nz,tlev,nw,wl, no2xs, kout) + IF (mabs .EQ. 4) CALL no2xs_jpl06a(nz,tlev,nw,wl, no2xs, kout) + IF (mabs .EQ. 5) CALL no2xs_jpl06b(nz,tlev,nw,wl, no2xs, kout) * quantum yields * myld = 1 NO2_calvert.yld (same as JPL2002) @@ -41184,8 +41185,8 @@ c INCLUDE 'params' * Assumes that O2 = 20.95 % of air density. If desire different O2 * profile (e.g. for upper atmosphere) then can load it here. - DO iz = 1, nz - DO iw =1, nw - 1 + DO iz = 1, nz-1 + DO iw =1, nw - 1 dto2(iz,iw) = 0.2095 * cz(iz) * o2xs1(iw) ENDDO ENDDO @@ -42824,7 +42825,8 @@ c INCLUDE 'params' * calculation is based on nz-1 layers (not nz). col(nz-1) = col(nz-1) + 1.E5 * hscale * con(nz) - + col(nz) = 0. + * Scale by input surface pressure: * min value = 1 molec cm-2 diff --git a/src/MNH/ch_init_constn.f90 b/src/MNH/ch_init_constn.f90 index 08109e2bfe9bbdbdabef97040250b77d9c086dfd..8473c00837d381118840260e24f6ec926bad5c1a 100644 --- a/src/MNH/ch_init_constn.f90 +++ b/src/MNH/ch_init_constn.f90 @@ -56,8 +56,8 @@ END MODULE MODI_CH_INIT_CONST_n !! MODIFICATIONS !! ------------- !! Original 16/02/01 -!! 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: 25/02/2019: bug correction for the file unit numbers !! EXTERNAL !! -------- USE MODI_CH_OPEN_INPUT ! open the general purpose ASCII input file @@ -240,6 +240,7 @@ IF (KVERB >= 5) WRITE(KLUOUT,*) & "CH_INIT_CONST: reading effective Henry constant", & " and its temperature correction " CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "HENRY_SP", TZFILE, KLUOUT, KVERB) +ICHANNEL = TZFILE%NLU ! ! read number of molecular diffusivity IHENRY READ(ICHANNEL, *) IHENRY diff --git a/src/MNH/ch_monitorn.f90 b/src/MNH/ch_monitorn.f90 index fb7fda98074078b1bf06621026f8ffa7e4277d5a..9ea38d3e41dfab50112aa5ca053cf77ccd555513 100644 --- a/src/MNH/ch_monitorn.f90 +++ b/src/MNH/ch_monitorn.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !! ######################## MODULE MODI_CH_MONITOR_n @@ -113,6 +113,7 @@ END MODULE MODI_CH_MONITOR_n !! 20/01/17 (G.Delautier) bug if CPROGRAM/=DIAG !! 01/10/17 (C.Lac) add correction of negativity !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 12/02/2019: bugfix: ZINPRR was not initialized all the time !! !! EXTERNAL !! -------- @@ -845,6 +846,8 @@ IF (LUSECHAQ.AND.(NRRL>=2) ) THEN XRSVS(:,:,:,NSV_CHACBEG+NEQAQ/2:NSV_CHACEND),& ZINPRR(:,:) ) END SELECT + ELSE + ZINPRR(:,:) = 0. END IF ELSE IF (LUSECHAQ.AND.(NRRL==1) ) THEN CALL CH_AQUEOUS_CHECK (PTSTEP, XRHODREF, XRHODJ, XRRS, XRSVS, NRRL, & diff --git a/src/MNH/compute_entr_detr.f90 b/src/MNH/compute_entr_detr.f90 index b7346fad93d7d261b08b2ec40e89ad1ed6ce95d1..da35fea05871eec70348a6e60de42ca8b85eef68 100644 --- a/src/MNH/compute_entr_detr.f90 +++ b/src/MNH/compute_entr_detr.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2009-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. ! ######spl MODULE MODI_COMPUTE_ENTR_DETR @@ -120,6 +120,7 @@ END MODULE MODI_COMPUTE_ENTR_DETR !! improvement of continuity at the condensation level !! S. Riette Nov 2013: protection against zero divide for min value of dry PDETR !! R.Honnert Oct 2016 : Update with AROME +! P. Wautelet 08/02/2019: bug fix: compute ZEPSI_CLOUD only once and only when it is needed !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -468,7 +469,7 @@ ENDDO ! 3.4 Computation of PENTR and PDETR DO JLOOP=1,SIZE(OTEST) IF(OTEST(JLOOP)) THEN - ZEPSI_CLOUD=MIN(ZDELTA,ZEPSI) + ZEPSI_CLOUD(JLOOP)=MIN(ZDELTA(JLOOP),ZEPSI(JLOOP)) PENTR_CLD(JLOOP) = (1.-PPART_DRY(JLOOP))*ZCOEFFMF_CLOUD*PRHODREF(JLOOP)*ZEPSI_CLOUD(JLOOP) PDETR_CLD(JLOOP) = (1.-PPART_DRY(JLOOP))*ZCOEFFMF_CLOUD*PRHODREF(JLOOP)*ZDELTA(JLOOP) PENTR(JLOOP) = PENTR(JLOOP)+PENTR_CLD(JLOOP) diff --git a/src/MNH/convect_updraft.f90 b/src/MNH/convect_updraft.f90 index a363aec976b3d5bb2a17f22fa6a2c3c4ee6e64f2..d860b62401954899c0df857b3178df86e8ea38c3 100644 --- a/src/MNH/convect_updraft.f90 +++ b/src/MNH/convect_updraft.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 conv 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ################# MODULE MODI_CONVECT_UPDRAFT ! ################# diff --git a/src/MNH/deallocate_model1.f90 b/src/MNH/deallocate_model1.f90 index 9a3b3a5c12ce8474778eaff273f99e3a1e3c701d..11a577e2e5a77f04b0ea4f0f24009235b5f51312 100644 --- a/src/MNH/deallocate_model1.f90 +++ b/src/MNH/deallocate_model1.f90 @@ -66,6 +66,7 @@ END MODULE MODI_DEALLOCATE_MODEL1 !! 06/2012 M.Tomasini add 2D nesting ADVFRC !! 10/2016 M.Mazoyer New KHKO output fields !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! 02/2019 C.Lac add rain fraction as an output field !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -187,6 +188,10 @@ IF ( ASSOCIATED(XCLDFR) .AND. KCALL==2 ) THEN DEALLOCATE(XCLDFR) END IF ! +IF ( ASSOCIATED(XRAINFR) .AND. KCALL==2 ) THEN + DEALLOCATE(XRAINFR) +END IF +! IF ( KCALL == 3 ) THEN DEALLOCATE(XSVT) END IF diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index 2632f9f08f9de9c63dc9dd42533becb31d1c5b93..9c7cbcb5bc7fc9f526fb80dcdc91661a9bbe26ca 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -227,6 +227,7 @@ END MODULE MODI_DEFAULT_DESFM_n !! 01/2018 (J.Colin) add VISC and DRAG !! 07/2017 (V. Vionnet) add blowing snow variables !! 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 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -1371,7 +1372,6 @@ IF (KMI == 1) THEN ! other values initialized in modd_dust LDEPOS_DST(:) = .FALSE. LSALT = .FALSE. - NMODE_SLT = 3 LVARSIG_SLT= .FALSE. LSEDIMSALT = .FALSE. LDEPOS_SLT(:) = .FALSE. diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90 index 1ad4aa373e925a36bb4e672f821dc8777e538367..b9feff89e8ae375a275254a369052cda6d5bded6 100644 --- a/src/MNH/diag.f90 +++ b/src/MNH/diag.f90 @@ -89,6 +89,7 @@ !! V.Vionnet 07/2017 add LWIND_CONTRAV !! 11/2017 (D. Ricard, P. Marquet) add diagnostics for THETAS ! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list +! P. Wautelet 11/02/2019: added missing use of MODI_CH_MONITOR_n !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -148,6 +149,7 @@ USE MODE_POS USE MODE_TIME ! USE MODI_AIRCRAFT_BALLOON +USE MODI_CH_MONITOR_n USE MODI_COMPUTE_R00 USE MODI_DIAG_SURF_ATM_N USE MODI_INIT_MNH diff --git a/src/MNH/effic_salt.f90 b/src/MNH/effic_salt.f90 index 71ee6dfc2ef9b7c6e9d84509b606551e4f30499d..a2636789606306e49d88e71ac4d74e2d72ef3c1a 100644 --- a/src/MNH/effic_salt.f90 +++ b/src/MNH/effic_salt.f90 @@ -57,6 +57,7 @@ END MODULE MODI_EFFIC_SALT !! ------------- !! Original !! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes ! Entry variables: ! ! PSVTS(INOUT) -Array of moments included in PSVTS diff --git a/src/MNH/end_diag_in_run.f90 b/src/MNH/end_diag_in_run.f90 index 139ba83bee5bc12af51fbb463a93fab6ad36a449..61405af363c8688e00877d1e7b5e1334eb17c292 100644 --- a/src/MNH/end_diag_in_run.f90 +++ b/src/MNH/end_diag_in_run.f90 @@ -58,6 +58,7 @@ SUBROUTINE END_DIAG_IN_RUN !! Original 11/2003 !! !! 02/2018 Q.Libois ECRAD +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -92,6 +93,9 @@ DEALLOCATE(XCURRENT_MER10M)! meridian wind at 10m DEALLOCATE(XCURRENT_DSTAOD)! dust aerosol optical depth DEALLOCATE(XCURRENT_SFCO2 ) ! CO2 Surface flux DEALLOCATE(XCURRENT_TKE_DISS) ! Tke dissipation rate +DEALLOCATE(XCURRENT_SLTAOD) ! Salt aerosol optical depth +DEALLOCATE(XCURRENT_ZWS ) ! Significant height of waves + ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/endstep.f90 b/src/MNH/endstep.f90 index fb0bd478bdabc82aefe0b8e7e7165a50758a34cb..9a3da2c5443fb7d07a7e43c62891df3b1d1e7ea9 100644 --- a/src/MNH/endstep.f90 +++ b/src/MNH/endstep.f90 @@ -18,16 +18,16 @@ INTERFACE PUS,PVS,PWS,PDRYMASSS, & PTHS,PRS,PTKES,PSVS, & PLSUS,PLSVS,PLSWS, & - PLSTHS,PLSRVS, & + PLSTHS,PLSRVS,PLSZWSS, & PLBXUS,PLBXVS,PLBXWS, & PLBXTHS,PLBXRS,PLBXTKES,PLBXSVS, & PLBYUS,PLBYVS,PLBYWS, & PLBYTHS,PLBYRS,PLBYTKES,PLBYSVS, & - PUM,PVM,PWM, & + PUM,PVM,PWM,PZWS, & PUT,PVT,PWT,PPABST,PDRYMASST, & PTHT,PRT,PTHM,PRCM,PPABSM,PTKET,PSVT, & PLSUM,PLSVM,PLSWM, & - PLSTHM,PLSRVM, & + PLSTHM,PLSRVM,PLSZWSM, & PLBXUM,PLBXVM,PLBXWM, & PLBXTHM,PLBXRM,PLBXTKEM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM, & @@ -51,6 +51,7 @@ REAL, INTENT(IN) :: PDRYMASSS ! Md source REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUS,PLSVS,PLSWS,& ! Large Scale PLSTHS,PLSRVS ! fields tendencies ! +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSS ! Large Scale fields tendencies REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS, & ! PLBXTHS,PLBXTKES ! LBX tendancy REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRS,PLBXSVS ! @@ -68,6 +69,7 @@ REAL, INTENT(INOUT):: PDRYMASST ! ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM,PLSVM,PLSWM,& ! Large Scale fields PLSTHM,PLSRVM ! at t-dt +REAL, DIMENSION(:,:), INTENT(INOUT) :: PLSZWSM ! Large Scale fields at t-dt ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBXUM,PLBXVM,PLBXWM, & ! PLBXTHM,PLBXTKEM ! LBX fields @@ -76,6 +78,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBXRM,PLBXSVM ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBYUM,PLBYVM,PLBYWM, & ! PLBYTHM,PLBYTKEM ! LBY fields REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBYRM,PLBYSVM ! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PZWS ! significant wave height ! END SUBROUTINE ENDSTEP ! @@ -91,16 +94,16 @@ END MODULE MODI_ENDSTEP PUS,PVS,PWS,PDRYMASSS, & PTHS,PRS,PTKES,PSVS, & PLSUS,PLSVS,PLSWS, & - PLSTHS,PLSRVS, & + PLSTHS,PLSRVS,PLSZWSS, & PLBXUS,PLBXVS,PLBXWS, & PLBXTHS,PLBXRS,PLBXTKES,PLBXSVS, & PLBYUS,PLBYVS,PLBYWS, & PLBYTHS,PLBYRS,PLBYTKES,PLBYSVS, & - PUM,PVM,PWM, & + PUM,PVM,PWM,PZWS, & PUT,PVT,PWT,PPABST,PDRYMASST, & PTHT,PRT,PTHM,PRCM,PPABSM,PTKET,PSVT, & PLSUM,PLSVM,PLSWM, & - PLSTHM,PLSRVM, & + PLSTHM,PLSRVM,PLSZWSM, & PLBXUM,PLBXVM,PLBXWM, & PLBXTHM,PLBXRM,PLBXTKEM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM, & @@ -192,6 +195,7 @@ END MODULE MODI_ENDSTEP !! 04/2013 (C.Lac) FIT for all the variables !! 04/2014 (C.Lac) Check on the positivity of PSVT !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! 02/2019 (S. Bielli) Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !------------------------------------------------------------------------------ ! @@ -241,6 +245,7 @@ REAL, INTENT(IN) :: PDRYMASSS ! Md source ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUS,PLSVS,PLSWS,& ! Large Scale PLSTHS,PLSRVS ! fields tendencies +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSS ! Large Scale fields tendencies ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS, & ! PLBXTHS,PLBXTKES ! LBX tendancy @@ -260,6 +265,8 @@ REAL, INTENT(INOUT):: PDRYMASST ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM,PLSVM,PLSWM,& ! Large Scale fields PLSTHM,PLSRVM ! at t-dt ! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PLSZWSM ! Large Scale fields at t-dt +! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBXUM,PLBXVM,PLBXWM, & ! PLBXTHM,PLBXTKEM ! LBX fields REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBXRM,PLBXSVM ! @@ -268,6 +275,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBYUM,PLBYVM,PLBYWM, & ! PLBYTHM,PLBYTKEM ! LBY fields REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBYRM,PLBYSVM ! ! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PZWS ! significant wave height ! !* 0.2 DECLARATIONS OF LOCAL VARIABLES ! @@ -383,6 +391,11 @@ ENDIF IF (SIZE(PLSRVS,1) /= 0) THEN PLSRVM(:,:,:) = MAX( PLSRVM(:,:,:) + PTSTEP * PLSRVS(:,:,:) , 0.) ENDIF + +IF (SIZE(PLSZWSS,1) /= 0) THEN + PLSZWSM(:,:) = MAX( PLSZWSM(:,:) + PTSTEP * PLSZWSS(:,:) , 0.) + PZWS(:,:) = PLSZWSM(:,:) +ENDIF ! !------------------------------------------------------------------------------ ! diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index a492a36b3bdc9c765346897f749a57689d8e21db..717aa871ba524e674bf2baffa19ea52659e6d26c 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -109,6 +109,7 @@ END MODULE MODI_GROUND_PARAM_n !! (P.Wautelet) 28/03/2018 replace TEMPORAL_DIST by DATETIME_DISTANCE !! (V. Vionnet) 18/07/2017 add coupling for blowing snow module +!! (Bielli S.) 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -128,7 +129,7 @@ USE MODD_CST, ONLY : XP00, XCPD, XRD, XRV,XRHOLW, XDAY, XPI, XLVTT, XMD, USE MODD_PARAMETERS, ONLY : JPVEXT, XUNDEF USE MODD_DYN_n, ONLY : XTSTEP USE MODD_CH_MNHC_n, ONLY : LUSECHEM -USE MODD_FIELD_n, ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET +USE MODD_FIELD_n, ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS USE MODD_METRICS_n, ONLY : XDXX, XDYY, XDZZ USE MODD_DIM_n, ONLY : NKMAX USE MODD_GRID_n, ONLY : XLON, XZZ, XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & @@ -307,6 +308,7 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_SW ! direct incoming shortwave REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_SW ! diffuse incoming shortwave REAL, DIMENSION(:), ALLOCATABLE :: ZP_PS ! surface pressure REAL, DIMENSION(:), ALLOCATABLE :: ZP_PA ! pressure at first atmospheric level +REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZWS ! significant wave height (m) REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTQ ! water vapor flux REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTH ! potential temperature flux @@ -594,7 +596,7 @@ CALL COUPLING_SURF_ATM_n(YSURF_CUR,'MESONH', 'E',ZTIMEC, ZP_SFTQ, ZP_SFTH, ZP_SFTS, ZP_SFCO2, ZP_SFU, ZP_SFV, & ZP_TSRAD, ZP_DIR_ALB, ZP_SCA_ALB, ZP_EMIS, ZP_TSURF, ZP_Z0, ZP_Z0H, ZP_QSURF, & ZP_PEW_A_COEF, ZP_PEW_B_COEF, & - ZP_PET_A_COEF, ZP_PEQ_A_COEF, ZP_PET_B_COEF, ZP_PEQ_B_COEF, & + ZP_PET_A_COEF, ZP_PEQ_A_COEF, ZP_PET_B_COEF, ZP_PEQ_B_COEF,ZP_ZWS, & 'OK' ) ! #ifdef CPLOASIS @@ -751,12 +753,14 @@ IF (LDIAG_IN_RUN) THEN XCURRENT_SWDIFF(:,:) = SUM(XSCAFLASWD(:,:,:),DIM=3) XCURRENT_SFCO2(:,:) = ZSFCO2(:,:) XCURRENT_DSTAOD(:,:)=0.0 + XCURRENT_SLTAOD(:,:)=0.0 IF (CRAD=='ECMW') THEN DO JK=IKB,IKE IKRAD = JK - 1 DO JJ=IJB,IJE DO JI=IIB,IIE XCURRENT_DSTAOD(JI,JJ)=XCURRENT_DSTAOD(JI,JJ)+XAER(JI,JJ,IKRAD,3) + XCURRENT_SLTAOD(JI,JJ)=XCURRENT_SLTAOD(JI,JJ)+XAER(JI,JJ,IKRAD,2) ENDDO ENDDO ENDDO @@ -777,6 +781,8 @@ IF (LDIAG_IN_RUN) THEN CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_ZON10M) CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_MER10M) CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_DSTAOD) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_SLTAOD) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_ZWS ) CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_SFCO2 ) CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll) @@ -815,6 +821,7 @@ ALLOCATE(ZP_DIR_SW (KDIM1D,SIZE(XDIRSRFSWD,3))) ALLOCATE(ZP_SCA_SW (KDIM1D,SIZE(XSCAFLASWD,3))) ALLOCATE(ZP_PS (KDIM1D)) ALLOCATE(ZP_PA (KDIM1D)) +ALLOCATE(ZP_ZWS (KDIM1D)) ALLOCATE(ZP_SFTQ (KDIM1D)) ALLOCATE(ZP_SFTH (KDIM1D)) @@ -861,6 +868,7 @@ ZP_CO2(:) = RESHAPE(ZCO2(IIB:IIE,IJB:IJE), ISHAPE_1) ZP_SNOW(:) = RESHAPE(ZSNOW(IIB:IIE,IJB:IJE), ISHAPE_1) ZP_RAIN(:) = RESHAPE(ZRAIN(IIB:IIE,IJB:IJE), ISHAPE_1) ZP_ZREF(:) = RESHAPE(ZZREF(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_ZWS(:) = RESHAPE(XZWS(IIB:IIE,IJB:IJE), ISHAPE_1) DO JLAYER=1,NSV ZP_SV(:,JLAYER) = RESHAPE(XSVT(IIB:IIE,IJB:IJE,IKB,JLAYER), ISHAPE_1) @@ -961,6 +969,7 @@ IF (LDIAG_IN_RUN) THEN XCURRENT_HU2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_HU2M(:), ISHAPE_2) XCURRENT_ZON10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZON10M(:), ISHAPE_2) XCURRENT_MER10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_MER10M(:), ISHAPE_2) + XCURRENT_ZWS (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZWS(:), ISHAPE_2) ENDIF ! DO JLAYER=1,SIZE(PDIR_ALB,3) @@ -987,6 +996,7 @@ DEALLOCATE(ZP_DIR_SW ) DEALLOCATE(ZP_SCA_SW ) DEALLOCATE(ZP_PS ) DEALLOCATE(ZP_PA ) +DEALLOCATE(ZP_ZWS ) DEALLOCATE(ZP_SFTQ ) DEALLOCATE(ZP_SFTH ) diff --git a/src/MNH/ice4_rainfr_vert.f90 b/src/MNH/ice4_rainfr_vert.f90 index 0448e36b0a80751f626dd3d903225c88d4788a7b..a048fc341249d8ccc9aa2f4ac580549d2614af2f 100644 --- a/src/MNH/ice4_rainfr_vert.f90 +++ b/src/MNH/ice4_rainfr_vert.f90 @@ -1,13 +1,13 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. MODULE MODI_ICE4_RAINFR_VERT INTERFACE SUBROUTINE ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PPRFR, PRR) IMPLICIT NONE INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL -REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PPRFR !Precipitation fraction +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PPRFR !Precipitation fraction REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRR !Rain field END SUBROUTINE ICE4_RAINFR_VERT END INTERFACE @@ -25,6 +25,7 @@ SUBROUTINE ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PP !! MODIFICATIONS !! ------------- !! +! P. Wautelet 13/02/2019: bugfix: intent of PPRFR OUT->INOUT ! ! !* 0. DECLARATIONS @@ -37,7 +38,7 @@ IMPLICIT NONE !* 0.1 Declarations of dummy arguments : ! INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL -REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PPRFR !Precipitation fraction +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PPRFR !Precipitation fraction REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRR !Rain field ! !* 0.2 declaration of local variables diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90 index 8efa25925f8341f4da81c555c5219a903385515a..f42739740b6dab06b0fc22996f7754cace50a0a0 100644 --- a/src/MNH/ice4_sedimentation_split.f90 +++ b/src/MNH/ice4_sedimentation_split.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. MODULE MODI_ICE4_SEDIMENTATION_SPLIT INTERFACE @@ -34,8 +34,8 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregat REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip @@ -69,6 +69,7 @@ SUBROUTINE ICE4_SEDIMENTATION_SPLIT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB !! MODIFICATIONS !! ------------- !! +! P. Wautelet 11/02/2019: dimensions of PINPRC and PINDEP not necessarily KIT,KJT ! ! !* 0. DECLARATIONS @@ -107,8 +108,8 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregat REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip diff --git a/src/MNH/ini_cpl.f90 b/src/MNH/ini_cpl.f90 index c7229f794f575e5cfdd0a775b59ed52d00a94ca4..b1ef0fa5227f135a57e4ecc88faa0b7b6d47a1f5 100644 --- a/src/MNH/ini_cpl.f90 +++ b/src/MNH/ini_cpl.f90 @@ -17,10 +17,10 @@ INTERFACE KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & KSIZELBXTKE_ll,KSIZELBYTKE_ll, & KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PDRYMASST, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM,PDRYMASST, & PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PDRYMASSS, & + PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PLSZWSS,PDRYMASSS, & PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS, & PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS ) ! @@ -53,6 +53,7 @@ INTEGER, INTENT(IN):: KSIZELBYTKE_ll ! for TKE INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll ! for Rx and SV ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUM,PLSVM,PLSWM ! Large Scale +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSM ! Significant wave height REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSTHM, PLSRVM ! fields at t-dt REAL, INTENT(IN) :: PDRYMASST ! Mass of dry air Md ! larger scale fields for Lateral Boundary condition @@ -68,6 +69,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRM ,PLBYSVM ! in x and y-di REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUS,PLSVS,PLSWS ! Large Scale REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHS,PLSRVS ! source terms REAL, INTENT(OUT) :: PDRYMASSS ! Md source +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSS ! Significant wave height ! larger scale fields sources for Lateral Boundary condition REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXUS,PLBXVS,PLBXWS ! Wind REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXTHS ! Mass @@ -94,10 +96,10 @@ END MODULE MODI_INI_CPL KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & KSIZELBXTKE_ll,KSIZELBYTKE_ll, & KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PDRYMASST, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM,PDRYMASST, & PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PDRYMASSS, & + PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PLSZWSS,PDRYMASSS, & PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS, & PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS ) ! ##################################################################### @@ -210,6 +212,7 @@ END MODULE MODI_INI_CPL !! (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 07/02/2019: force TYPE to a known value for IO_File_add2list +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -275,6 +278,7 @@ INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll ! for Rx and SV ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUM,PLSVM,PLSWM ! Large Scale REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSTHM, PLSRVM ! fields at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSM ! Significant wave height at t-dt REAL, INTENT(IN) :: PDRYMASST ! Mass of dry air Md ! larger scale fields for Lateral Boundary condition REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUM,PLBXVM,PLBXWM ! Wind @@ -288,6 +292,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRM ,PLBYSVM ! in x and y-di ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUS,PLSVS,PLSWS ! Large Scale REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHS,PLSRVS ! source terms +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSS ! Significant wave height REAL, INTENT(OUT) :: PDRYMASSS ! Md source ! larger scale fields sources for Lateral Boundary condition REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXUS,PLBXVS,PLBXWS ! Wind @@ -467,7 +472,8 @@ GLSOURCE=.TRUE. ZLENG = (NCPL_TIMES(NCPL_CUR,1)-2) * PTSTEP ! CALL INI_LS(TCPLFILE(NCPL_CUR)%TZFILE,HGETRVM,GLSOURCE,PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS, & - PDRYMASSS,PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PDRYMASST,ZLENG,OSTEADY_DMASS) + PLSZWSS,PDRYMASSS,PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM,PDRYMASST,ZLENG, & + OSTEADY_DMASS) ! ! !* 3.2 Initialize the LB sources diff --git a/src/MNH/ini_diag_in_run.f90 b/src/MNH/ini_diag_in_run.f90 index 2df092c1c83f13ae1e26a1cc14c9d704603156e5..d44800cdcd9db3fe83ddd67555e70ae68b186440 100644 --- a/src/MNH/ini_diag_in_run.f90 +++ b/src/MNH/ini_diag_in_run.f90 @@ -63,6 +63,7 @@ END MODULE MODI_INI_DIAG_IN_RUN !! ------------- !! Original 11/2003 !! 02/2018 Q.Libois ECRAD +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !! -------------------------------------------------------------------------- ! @@ -113,6 +114,8 @@ IF (LDIAG_IN_RUN) THEN ALLOCATE(XCURRENT_DSTAOD(KIU,KJU))! dust aerosol optical depth ALLOCATE(XCURRENT_SFCO2 (KIU,KJU))! CO2 Surface flux ALLOCATE(XCURRENT_TKE_DISS(KIU,KJU,KKU)) ! Tke dissipation rate + ALLOCATE(XCURRENT_SLTAOD(KIU,KJU))! Salt aerosol optical depth + ALLOCATE(XCURRENT_ZWS(KIU,KJU)) ! Significant height of waves ! ! XCURRENT_RN = XUNDEF @@ -134,6 +137,8 @@ IF (LDIAG_IN_RUN) THEN XCURRENT_DSTAOD= XUNDEF XCURRENT_SFCO2 = XUNDEF XCURRENT_TKE_DISS = XUNDEF + XCURRENT_SLTAOD= XUNDEF + XCURRENT_ZWS = XUNDEF ELSE ALLOCATE(XCURRENT_RN (0,0))! net radiation ALLOCATE(XCURRENT_H (0,0))! sensible heat flux @@ -154,6 +159,8 @@ ELSE ALLOCATE(XCURRENT_DSTAOD(0,0))! dust aerosol optical depth ALLOCATE(XCURRENT_SFCO2 (0,0))! CO2 Surface flux ALLOCATE(XCURRENT_TKE_DISS(0,0,0)) ! Tke dissipation rate + ALLOCATE(XCURRENT_SLTAOD(0,0))! Salt aerosol optical depth + ALLOCATE(XCURRENT_ZWS(0,0))! Significant height of waves END IF ! !------------------------------------------------------------------------------- diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90 index 046270d70470fd32c4ec283aa52b9a171dbc65aa..79fff80584ca80575e8a9298452aac79620a63a0 100644 --- a/src/MNH/ini_lb.f90 +++ b/src/MNH/ini_lb.f90 @@ -132,7 +132,9 @@ SUBROUTINE INI_LB(TPINIFILE,OLSOURCE,KSV, & !! J.-P. Pinty 09/02/16 Add LIMA that is LBC for CCN and IFN !! M.Leriche 09/02/16 Treat gas and aq. chemicals separately !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/02/2019: initialize PLBXSVM and PLBYSVM in all cases ! P. Wautelet 14/02/2019: move UPCASE function to tools.f90 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -471,7 +473,10 @@ END IF ! !* 2.6 LB-Scalar Variables ! -IF (KSV > 0) THEN +PLBXSVM(:,:,:,:) = 0. +PLBYSVM(:,:,:,:) = 0. +! +IF (KSV > 0) THEN IF (ANY(HGETSVM(1:KSV)=='READ')) THEN TZFIELD%CMNHNAME = 'HORELAX_SV' TZFIELD%CSTDNAME = '' @@ -898,7 +903,7 @@ END IF ! Chemical aqueous phase scalar variables IF (NSV_CHACEND>=NSV_CHACBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CUNITS = 'ppp' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -954,7 +959,7 @@ END IF ! Chemical ice phase scalar variables IF (NSV_CHICEND>=NSV_CHICBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CUNITS = 'ppp' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1010,7 +1015,7 @@ END IF ! Orilam aerosol scalar variables IF (NSV_AEREND>=NSV_AERBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CUNITS = 'ppp' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1066,7 +1071,7 @@ END IF ! Orilam aerosols moist scalar variables IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CUNITS = 'ppp' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1122,7 +1127,7 @@ END IF ! Dust scalar variables IF (NSV_DSTEND>=NSV_DSTBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CUNITS = 'ppp' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1178,7 +1183,7 @@ END IF ! IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CUNITS = 'ppp' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1235,7 +1240,7 @@ END IF ! Sea salt scalar variables IF (NSV_SLTEND>=NSV_SLTBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CUNITS = 'ppp' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90 index 48e83c6fbdcd93516108490a50847977a4a0a0bf..b2dd7e4a18cee347d210e043c7dbc2e4d92ea6a5 100644 --- a/src/MNH/ini_lesn.f90 +++ b/src/MNH/ini_lesn.f90 @@ -33,7 +33,7 @@ !! 06/11/02 (V. Masson) add LES budgets !! 10/2016 (C.Lac) Add droplet deposition !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +!! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -537,8 +537,10 @@ ELSE END IF IF (LUSERR ) THEN ALLOCATE(XLES_MEAN_Rr (NLES_K,NLES_TIMES,NLES_MASKS)) + ALLOCATE(XLES_MEAN_RF (NLES_K,NLES_TIMES,NLES_MASKS)) ELSE ALLOCATE(XLES_MEAN_Rr (0,0,0)) + ALLOCATE(XLES_MEAN_RF (0,0,0)) END IF IF (LUSERI ) THEN ALLOCATE(XLES_MEAN_Ri (NLES_K,NLES_TIMES,NLES_MASKS)) @@ -644,6 +646,7 @@ IF (LUSERC ) XLES_MEAN_KHt = XUNDEF IF (LUSERC ) XLES_MEAN_Rt = XUNDEF IF (LUSERC ) XLES_MEAN_Rc = XUNDEF IF (LUSERC ) XLES_MEAN_Cf = XUNDEF +IF (LUSERC ) XLES_MEAN_RF = XUNDEF IF (LUSERC ) XLES_MEAN_INDCf = XUNDEF IF (LUSERC ) XLES_MEAN_INDCf2 = XUNDEF IF (LUSERR ) XLES_MEAN_Rr = XUNDEF diff --git a/src/MNH/ini_ls.f90 b/src/MNH/ini_ls.f90 index 4fe067049ca0acaa938a0c3b455ae5a0a75341b0..7bb1f4f0b61e67a26d4bba0a149c284253fbcb98 100644 --- a/src/MNH/ini_ls.f90 +++ b/src/MNH/ini_ls.f90 @@ -10,9 +10,9 @@ INTERFACE ! SUBROUTINE INI_LS(TPINIFILE,HGETRVM,OLSOURCE, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & PDRYMASSS, & - PLSUMM,PLSVMM,PLSWMM,PLSTHMM,PLSRVMM,PDRYMASST,PLENG, & + PLSUMM,PLSVMM,PLSWMM,PLSTHMM,PLSRVMM,PLSZWSMM, PDRYMASST,PLENG, & OSTEADY_DMASS) ! USE MODD_IO, ONLY: TFILEDATA @@ -23,11 +23,13 @@ LOGICAL, INTENT(IN) :: OLSOURCE ! Switch for the source term ! Larger Scale fields (source if OLSOURCE=T, fields at time t-dt if OLSOURCE=F) : REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM,PLSVM,PLSWM ! Wind REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSTHM,PLSRVM ! Mass +REAL, DIMENSION(:,:), INTENT(INOUT) :: PLSZWSM ! sea wave !if OLSOURCE=T : REAL, INTENT(INOUT), OPTIONAL :: PDRYMASSS ! Md source !Large Scale fields at time t-dt (if OLSOURCE=T) : REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PLSUMM,PLSVMM,PLSWMM ! Wind REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PLSTHMM,PLSRVMM ! Mass +REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: PLSZWSMM ! Sea wave REAL, INTENT(IN), OPTIONAL :: PDRYMASST ! Md(t) REAL, INTENT(IN), OPTIONAL :: PLENG ! Interpolation length LOGICAL, INTENT(IN), OPTIONAL :: OSTEADY_DMASS ! Md evolution logical switch @@ -41,9 +43,9 @@ END MODULE MODI_INI_LS ! ! ############################################################ SUBROUTINE INI_LS(TPINIFILE,HGETRVM,OLSOURCE, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & PDRYMASSS, & - PLSUMM,PLSVMM,PLSWMM,PLSTHMM,PLSRVMM,PDRYMASST,PLENG, & + PLSUMM,PLSVMM,PLSWMM,PLSTHMM,PLSRVMM,PLSZWSMM,PDRYMASST,PLENG, & OSTEADY_DMASS) ! ############################################################ ! @@ -80,6 +82,7 @@ END MODULE MODI_INI_LS !! ------------- !! Original 22/09/98 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !! !------------------------------------------------------------------------------- @@ -104,11 +107,13 @@ LOGICAL, INTENT(IN) :: OLSOURCE ! Switch for the source term ! Larger Scale fields (source if OLSOURCE=T, fields at time t-dt if OLSOURCE=F) : REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM,PLSVM,PLSWM ! Wind REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSTHM,PLSRVM ! Mass +REAL, DIMENSION(:,:), INTENT(INOUT) :: PLSZWSM ! sea wave !if OLSOURCE=T : REAL, INTENT(INOUT), OPTIONAL :: PDRYMASSS ! Md source !Large Scale fields at time t-dt (if OLSOURCE=T) : REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PLSUMM,PLSVMM,PLSWMM ! Wind REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PLSTHMM,PLSRVMM ! Mass +REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: PLSZWSMM ! Sea wave REAL, INTENT(IN), OPTIONAL :: PDRYMASST ! Md(t) REAL, INTENT(IN), OPTIONAL :: PLENG ! Interpolation length LOGICAL, INTENT(IN), OPTIONAL :: OSTEADY_DMASS ! Md evolution logical switch @@ -137,11 +142,15 @@ CALL IO_Field_read(TPINIFILE,'LSUM', PLSUM) CALL IO_Field_read(TPINIFILE,'LSVM', PLSVM) CALL IO_Field_read(TPINIFILE,'LSWM', PLSWM) CALL IO_Field_read(TPINIFILE,'LSTHM',PLSTHM) +CALL IO_Field_read(TPINIFILE,'ZWS', PLSZWSM) ! IF (HGETRVM == 'READ') THEN ! LS-vapor CALL IO_Field_read(TPINIFILE,'LSRVM',PLSRVM) ENDIF ! +IF (PRESENT(PLSZWSMM)) THEN + PLSZWSM(:,:)= (PLSZWSM(:,:) - PLSZWSMM(:,:)) / PLENG +END IF ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 20ad8d343713b726b6d5d92de0938dd592b120e7..4bcf01d197d22fc7a15dbe676ee94be085c4f0e7 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -275,10 +275,14 @@ END MODULE MODI_INI_MODEL_n !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! V. Vionnet : 18/07/2017 : add blowing snow scheme !! 01/18 J.Colin Add DRAG -!! P.Wautelet 29/01/2019: bug: add missing zero-size allocations +! P. Wautelet 29/01/2019: bug: add missing zero-size allocations ! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list +! P. Wautelet 13/02/2019: initialize XALBUV even if no radiation (needed in CH_INTERP_JVALUES) +! P. Wautelet 13/02/2019: removed PPABSM and PTSTEP dummy arguments of READ_FIELD ! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables ! P. Wautelet 14/02/2019: remove HINIFILE dummy argument from INI_RADIATIONS_ECMWF/ECRAD +!! 02/2019 C.Lac add rain fraction as an output field +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !--------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -459,6 +463,8 @@ TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file ! !* 0.2 declarations of local variables ! +REAL, PARAMETER :: NALBUV_DEFAULT = 0.01 ! Arbitrary low value for XALBUV +! INTEGER :: JSV ! Loop index INTEGER :: IRESP ! Return code of FM routines INTEGER :: ILUOUT ! Logical unit number of output-listing @@ -526,6 +532,7 @@ REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRM,DPTR_XLBYRM REAL, DIMENSION(:,:,:), POINTER :: DPTR_XZZ REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS +REAL, DIMENSION(:,:), POINTER :: DPTR_XLSZWSM,DPTR_XLSZWSS ! INTEGER :: IIB,IJB,IIE,IJE,IDIMX,IDIMY,IMI ! @@ -830,13 +837,16 @@ END IF ! IF (NRR>1) THEN ALLOCATE(XCLDFR(IIU,IJU,IKU)) + ALLOCATE(XRAINFR(IIU,IJU,IKU)) ELSE ALLOCATE(XCLDFR(0,0,0)) + ALLOCATE(XRAINFR(0,0,0)) END IF ! ALLOCATE(XSVT(IIU,IJU,IKU,NSV)) ; XSVT = 0. ALLOCATE(XRSVS(IIU,IJU,IKU,NSV)); XRSVS = 0. ALLOCATE(XRSVS_CLD(IIU,IJU,IKU,NSV)); XRSVS_CLD = 0.0 +ALLOCATE(XZWS(IIU,IJU)) ; XZWS = -1. ! IF (LPASPOL) THEN ALLOCATE( XATC(IIU,IJU,IKU,NSV_PP) ) @@ -979,6 +989,7 @@ IF ( NRR > 0 ) THEN ELSE ALLOCATE(XLSRVM(0,0,0)) END IF +ALLOCATE(XLSZWSM(IIU,IJU)) ; XLSZWSM = -1. ! ! lbc part ! @@ -1257,6 +1268,7 @@ IF( .NOT. LSTEADYLS ) THEN ALLOCATE(XLSWS(SIZE(XLSWM,1),SIZE(XLSWM,2),SIZE(XLSWM,3))) ALLOCATE(XLSTHS(SIZE(XLSTHM,1),SIZE(XLSTHM,2),SIZE(XLSTHM,3))) ALLOCATE(XLSRVS(SIZE(XLSRVM,1),SIZE(XLSRVM,2),SIZE(XLSRVM,3))) + ALLOCATE(XLSZWSS(SIZE(XLSZWSM,1),SIZE(XLSZWSM,2))) ! ELSE ! @@ -1265,6 +1277,7 @@ ELSE ALLOCATE(XLSWS(0,0,0)) ALLOCATE(XLSTHS(0,0,0)) ALLOCATE(XLSRVS(0,0,0)) + ALLOCATE(XLSZWSS(0,0)) ! END IF ! allocation of the LB fields for horizontal relaxation and Lateral Boundaries @@ -1324,6 +1337,7 @@ ALLOCATE(XLW_BANDS (NLWB_MNH)) ALLOCATE(XZENITH (IIU,IJU)) ALLOCATE(XAZIM (IIU,IJU)) ALLOCATE(XALBUV (IIU,IJU)) +XALBUV(:,:) = NALBUV_DEFAULT !Set to an arbitrary low value (XALBUV is needed in CH_INTERP_JVALUES even if no radiation) ALLOCATE(XDIRSRFSWD(IIU,IJU,NSWB_MNH)) ALLOCATE(XSCAFLASWD(IIU,IJU,NSWB_MNH)) ALLOCATE(XFLALWD (IIU,IJU)) @@ -1742,18 +1756,18 @@ IF (CCLOUD=='LIMA') CALL INIT_AEROSOL_PROPERTIES ! -------------------------------- ! CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before read_field::XUT",PRECISION) -CALL READ_FIELD(TPINIFILE,IIU,IJU,IKU,XTSTEP, & - CGETTKET,CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETCIT, & +CALL READ_FIELD(TPINIFILE,IIU,IJU,IKU, & + CGETTKET,CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETCIT,CGETZWS, & CGETRST,CGETRGT,CGETRHT,CGETSVT,CGETSRCT,CGETSIGS,CGETCLDFR, & CGETBL_DEPTH,CGETSBL_DEPTH,CGETPHC,CGETPHR,CUVW_ADV_SCHEME, & CTEMP_SCHEME,NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll,& NSIZELBXTKE_ll,NSIZELBYTKE_ll, & NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & XUM,XVM,XWM,XDUM,XDVM,XDWM, & - XUT,XVT,XWT,XTHT,XPABST,XPABSM,XTKET,XRTKEMS, & - XRT,XSVT,XCIT,XDRYMASST, & + XUT,XVT,XWT,XTHT,XPABST,XTKET,XRTKEMS, & + XRT,XSVT,XZWS,XCIT,XDRYMASST, & XSIGS,XSRCT,XCLDFR,XBL_DEPTH,XSBL_DEPTH,XWTHVMF,XPHC,XPHR, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM, & + XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM, & XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM, & XLBXRM,XLBXSVM, & XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM, & @@ -1856,10 +1870,10 @@ IF ((KMI==1).AND.(.NOT. LSTEADYLS)) THEN NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll, & NSIZELBXTKE_ll,NSIZELBYTKE_ll, & NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XDRYMASST, & + XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,XDRYMASST, & XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XDRYMASSS, & + XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XLSZWSS,XDRYMASSS, & XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS, & XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS ) CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-after ini_cpl::XUT",PRECISION) @@ -1946,11 +1960,13 @@ IF ( KMI > 1) THEN DPTR_XLSWM=>XLSWM DPTR_XLSTHM=>XLSTHM DPTR_XLSRVM=>XLSRVM + DPTR_XLSZWSM=>XLSZWSM DPTR_XLSUS=>XLSUS DPTR_XLSVS=>XLSVS DPTR_XLSWS=>XLSWS DPTR_XLSTHS=>XLSTHS DPTR_XLSRVS=>XLSRVS + DPTR_XLSZWSS=>XLSZWSS ! DPTR_NKLIN_LBXU=>NKLIN_LBXU DPTR_XCOEFLIN_LBXU=>XCOEFLIN_LBXU @@ -1975,8 +1991,8 @@ IF ( KMI > 1) THEN NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI), & DPTR_CLBCX,DPTR_CLBCY,DPTR_XZZ,DPTR_XZHAT, & LSLEVE,XLEN1,XLEN2, & - DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM, & - DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS, & + DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM,DPTR_XLSZWSM, & + DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS,DPTR_XLSZWSS, & DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & diff --git a/src/MNH/ini_spawn_lsn.f90 b/src/MNH/ini_spawn_lsn.f90 index 8c580978621c68922036a3f52244a5b3f40c280f..f33f727bbc247a84af9b5ae3934f0e8de1157b72 100644 --- a/src/MNH/ini_spawn_lsn.f90 +++ b/src/MNH/ini_spawn_lsn.f90 @@ -19,8 +19,8 @@ INTERFACE KDXRATIO,KDYRATIO, & HLBCX,HLBCY,PZZ,PZHAT, & OSLEVE,PLEN1,PLEN2, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, & - PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & + PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PLSZWSS, & KKLIN_LBXU,PCOEFLIN_LBXU,KKLIN_LBYU,PCOEFLIN_LBYU, & KKLIN_LBXV,PCOEFLIN_LBXV,KKLIN_LBYV,PCOEFLIN_LBYV, & KKLIN_LBXW,PCOEFLIN_LBXW,KKLIN_LBYW,PCOEFLIN_LBYW, & @@ -48,8 +48,10 @@ CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCY ! boundary conditions ! REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSUM,PLSVM,PLSWM ! Large Scale fields REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSTHM, PLSRVM ! at t-dt +REAL, DIMENSION(:,:), INTENT( OUT) :: PLSZWSM ! at t-dt REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSUS,PLSVS,PLSWS ! Large Scale source REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSTHS, PLSRVS ! terms +REAL, DIMENSION(:,:), INTENT( OUT) :: PLSZWSS ! source terms ! coefficients for the vertical interpolation of the LB fields INTEGER, DIMENSION(:,:,:), INTENT( OUT) :: KKLIN_LBXU,KKLIN_LBYU REAL, DIMENSION(:,:,:), INTENT( OUT) :: PCOEFLIN_LBXU,PCOEFLIN_LBYU @@ -73,8 +75,8 @@ END MODULE MODI_INI_SPAWN_LS_n KDXRATIO,KDYRATIO, & HLBCX,HLBCY,PZZ,PZHAT, & OSLEVE,PLEN1,PLEN2, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, & - PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & + PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PLSZWSS, & KKLIN_LBXU,PCOEFLIN_LBXU,KKLIN_LBYU,PCOEFLIN_LBYU, & KKLIN_LBXV,PCOEFLIN_LBXV,KKLIN_LBYV,PCOEFLIN_LBYV, & KKLIN_LBXW,PCOEFLIN_LBXW,KKLIN_LBYW,PCOEFLIN_LBYW, & @@ -140,6 +142,7 @@ END MODULE MODI_INI_SPAWN_LS_n !! coeff for U !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! J.Escobar : 18/12/2015 : Correction of bug in bound in // for NHALO <>1 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -190,6 +193,8 @@ CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCY ! boundary conditions ! REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSUM,PLSVM,PLSWM ! Large Scale fields REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSTHM, PLSRVM ! at t-dt +REAL, DIMENSION(:,:), INTENT( OUT) :: PLSZWSM ! LS at t-dt +REAL, DIMENSION(:,:), INTENT( OUT) :: PLSZWSS ! source terms REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSUS,PLSVS,PLSWS ! Large Scale source REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSTHS, PLSRVS ! terms ! coefficients for the vertical interpolation of the LB fields @@ -231,6 +236,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTLSUM, ZTLSVM, ZTLSWM, ZTLSTHM, ZTLSRVM REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTLSUS, ZTLSVS, ZTLSWS, ZTLSTHS, ZTLSRVS REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTZS,ZZS REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTZSMT,ZZSMT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTZWS,ZTZWSS ! !------------------------------------------------------------------------------- ! @@ -260,6 +266,7 @@ ALLOCATE(ZTLSUM(IDIMX,IDIMY,SIZE(PLSUM,3))) ALLOCATE(ZTLSVM(IDIMX,IDIMY,SIZE(PLSVM,3))) ALLOCATE(ZTLSWM(IDIMX,IDIMY,SIZE(PLSWM,3))) ALLOCATE(ZTLSTHM(IDIMX,IDIMY,SIZE(PLSTHM,3))) +IF(SIZE(PLSZWSM) /= 0) ALLOCATE(ZTZWS(IDIMX,IDIMY)) IF(SIZE(PLSRVM) /= 0) ALLOCATE(ZTLSRVM(IDIMX,IDIMY,SIZE(PLSRVM,3))) ! IF(GVERT_INTERP) THEN @@ -277,11 +284,14 @@ IF ( SIZE(PLSTHS,1) /= 0 ) THEN ALLOCATE(ZTLSWS(IDIMX,IDIMY,SIZE(PLSWS,3))) ALLOCATE(ZTLSTHS(IDIMX,IDIMY,SIZE(PLSTHS,3))) ENDIF +IF ( SIZE(PLSZWSS) /= 0 ) ALLOCATE(ZTZWSS(IDIMX,IDIMY)) IF ( SIZE(PLSRVS) /= 0 ) ALLOCATE(ZTLSRVS(IDIMX,IDIMY,SIZE(PLSRVS,3))) ! ! 1.3 Specify the ls "source" fields and receiver fields ! CALL SET_LSFIELD_1WAY_ll(XLSUM, ZTLSUM, KMI) +IF ( SIZE(PLSZWSM,1) /= 0 ) & + CALL SET_LSFIELD_1WAY_ll(XLSZWSM, ZTZWS, KMI) CALL SET_LSFIELD_1WAY_ll(XLSVM, ZTLSVM, KMI) CALL SET_LSFIELD_1WAY_ll(XLSWM, ZTLSWM, KMI) CALL SET_LSFIELD_1WAY_ll(XLSTHM, ZTLSTHM, KMI) @@ -295,6 +305,8 @@ IF ( SIZE(PLSTHS,1) /= 0 ) THEN CALL SET_LSFIELD_1WAY_ll(XLSTHS, ZTLSTHS, KMI) IF ( SIZE(PLSRVM,1) /= 0 ) & CALL SET_LSFIELD_1WAY_ll(XLSRVS, ZTLSRVS, KMI) + IF ( SIZE(PLSZWSM,1) /= 0 ) & + CALL SET_LSFIELD_1WAY_ll(XLSZWSS, ZTZWSS, KMI) ENDIF ! IF ( GVERT_INTERP ) THEN @@ -454,6 +466,13 @@ IF ( SIZE(PLSRVM,1) /= 0 ) THEN HLBCX,HLBCY,ZTLSRVM,PLSRVM(IIB:IIE,IJB:IJE,:)) END IF ! +IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + CALL BIKHARDT (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, & + PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, & + 2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1, & + HLBCX,HLBCY,ZTZWS,PLSZWSM(IIB:IIE,IJB:IJE)) +END IF + IF ( SIZE(PLSTHS,1) /= 0 ) THEN ! CALL BIKHARDT (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, & @@ -469,6 +488,13 @@ IF ( SIZE(PLSTHS,1) /= 0 ) THEN ! END IF ! + IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + CALL BIKHARDT (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, & + PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, & + 2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1, & + HLBCX,HLBCY,ZTZWS+ZTIME*ZTZWSS,PLSZWSS(IIB:IIE,IJB:IJE)) + ! + END IF END IF ! !* 3.2 Vertical linear interpolation on the mass grid @@ -550,6 +576,9 @@ IF ( SIZE(PLSTHS,1) /= 0 ) THEN PLSRVS(:,:,:) = (PLSRVS(:,:,:) - PLSRVM(:,:,:)) / ZTIME END IF ! + IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + PLSZWSS(:,:) = (PLSZWSS(:,:) - PLSZWSM(:,:)) / ZTIME + END IF END IF ! !------------------------------------------------------------------------------ @@ -749,12 +778,14 @@ END IF ! DEALLOCATE(ZTLSUM,ZTLSVM,ZTLSWM,ZTLSTHM) IF(SIZE(PLSRVM) /= 0) DEALLOCATE(ZTLSRVM) +IF(SIZE(PLSZWSM) /= 0) DEALLOCATE(ZTZWS) ! IF(GVERT_INTERP) DEALLOCATE(ZTZS,ZZS) IF(GVERT_INTERP) DEALLOCATE(ZTZSMT,ZZSMT) ! IF ( SIZE(PLSTHS,1) /= 0 ) DEALLOCATE(ZTLSUS,ZTLSVS,ZTLSWS,ZTLSTHS) IF ( SIZE(PLSRVS,1) /= 0 ) DEALLOCATE(ZTLSRVS) +IF ( SIZE(PLSZWSS,1) /= 0 ) DEALLOCATE(ZTZWSS) !------------------------------------------------------------------------------ NULLIFY(TZLSFIELD_ll) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSUM) @@ -762,6 +793,7 @@ CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSVM) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSWM) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSTHM) IF(SIZE(PLSRVM) /= 0) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSRVM) +IF(SIZE(PLSZWSM) /= 0) CALL ADD2DFIELD_ll(TZLSFIELD_ll, PLSZWSM) IF ( SIZE(PLSTHS,1) /= 0 ) THEN CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSUS) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSVS) @@ -769,6 +801,7 @@ IF ( SIZE(PLSTHS,1) /= 0 ) THEN CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSTHS) ENDIF IF ( SIZE(PLSRVS,1) /= 0 ) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSRVS) +IF ( SIZE(PLSZWSS,1) /= 0 ) CALL ADD2DFIELD_ll(TZLSFIELD_ll, PLSZWSS) CALL UPDATE_HALO_ll(TZLSFIELD_ll,IINFO_ll) CALL CLEANLIST_ll(TZLSFIELD_ll) ! diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90 index e18f019a1f64b2e42280264bbe36b91f2f479541..33de77351477b18db6ec1955f01b975d5d3ac7a2 100644 --- a/src/MNH/ini_spectren.f90 +++ b/src/MNH/ini_spectren.f90 @@ -33,8 +33,10 @@ END MODULE MODI_INI_SPECTRE_n !! J.P Chaboureau * L.A* !! 10/2016 (C.Lac) Cleaning of the modules !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 08/02/2019: allocate to zero-size non associated pointers ! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +!! !--------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -195,6 +197,7 @@ REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRM,DPTR_XLBYRM REAL, DIMENSION(:,:,:), POINTER :: DPTR_XZZ REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS +REAL, DIMENSION(:,:), POINTER :: DPTR_XLSZWSS,DPTR_XLSZWSM ! !------------------------------------------------------------------------------- ! @@ -801,10 +804,10 @@ IF ((KMI==1).AND.(.NOT. LSTEADYLS)) THEN NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll, & NSIZELBXTKE_ll,NSIZELBYTKE_ll, & NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XDRYMASST, & + XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,XDRYMASST, & XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XDRYMASSS, & + XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XLSZWSS,XDRYMASSS, & XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS, & XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS ) END IF @@ -838,11 +841,13 @@ IF ( KMI > 1) THEN DPTR_XLSWM=>XLSWM DPTR_XLSTHM=>XLSTHM DPTR_XLSRVM=>XLSRVM + DPTR_XLSZWSM=>XLSZWSM DPTR_XLSUS=>XLSUS DPTR_XLSVS=>XLSVS DPTR_XLSWS=>XLSWS DPTR_XLSTHS=>XLSTHS DPTR_XLSRVS=>XLSRVS + DPTR_XLSZWSS=>XLSZWSS ! DPTR_NKLIN_LBXU=>NKLIN_LBXU DPTR_XCOEFLIN_LBXU=>XCOEFLIN_LBXU @@ -867,8 +872,8 @@ IF ( KMI > 1) THEN NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI), & DPTR_CLBCX,DPTR_CLBCY,DPTR_XZZ,DPTR_XZHAT, & LSLEVE,XLEN1,XLEN2, & - DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM, & - DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS, & + DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM,DPTR_XLSZWSM, & + DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS,DPTR_XLSZWSS, & DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & @@ -915,6 +920,10 @@ WRITE(COUTFILE,'(A,".",I1,".",A)') CEXP,KMI,TRIM(ADJUSTL(CSEG)) !* 17. INITIALIZE THE PARAMETERS FOR THE DYNAMICS ! ------------------------------------------ ! +!Allocate to zero size to not pass unallocated pointers +ALLOCATE(XALKBAS(0)) +ALLOCATE(XALKWBAS(0)) +! CALL INI_DYNAMICS(XLON,XLAT,XRHODJ,XTHVREF,XMAP,XZZ,XDXHAT,XDYHAT, & XZHAT,CLBCX,CLBCY,XTSTEP, & LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV, & diff --git a/src/MNH/init_salt.f90 b/src/MNH/init_salt.f90 new file mode 100644 index 0000000000000000000000000000000000000000..de95ce681e4751a7b4c244bec44bcbdfa0e6c9f8 --- /dev/null +++ b/src/MNH/init_salt.f90 @@ -0,0 +1,74 @@ +!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence +!ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!ORILAM_LIC for details. +!----------------------------------------------------------------- + +!! ###################### + SUBROUTINE INIT_SALT +!! ###################### +! PURPOSE +!! ------- +!! +!! initialization of variables for the sea salt scheme +!! +!! METHOD +!! ------ +!! +!! +!! REFERENCE +!! --------- +!! none +!! +!! +!! AUTHOR +!! ------ +!! Marine Claeys (CNRM) +!! +!! MODIFICATIONS +!! ------------- +!! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! +USE MODD_SALT +! +IMPLICIT NONE + +IF(NMODE_SLT == 5) THEN + +!JPSALTORDER = (/5, 4, 3, 2, 1 /) +!Initial dry number median radius (um) from Ova et al., 2014 +XINIRADIUS_SLT= (/0.009, 0.021, 0.045, 0.115, 0.415/) +!Initial, standard deviation from Ova et al., 2014 +XINISIG_SLT = (/ 1.37, 1.5, 1.42, 1.53, 1.85 /) +!Minimum allowed number concentration for any mode (#/m3) +XN0MIN_SLT = (/1.e1 , 1.e1, 1.e1, 1., 1.e-4 /) + + +ELSE IF ( NMODE_SLT == 3) THEN + +! Set the order of the loops sorted by importance +!This means that if a user choses 1 mode it will have characteristics of mode 2 +!2 modes will be mode 2 & 3, whereas 3 modes will modes 1, 2 and 3 +!JPSALTORDER = (/3, 2, 1, 4, 5/) +! + !Initial dry number median radius (um) from Vignati et al., 2001 + ! XINIRADIUS_SLT= (/0.2, 2., 12./) + !Initial, standard deviation from Vignati et al., 2001 + ! XINISIG_SLT = (/1.9, 2., 3./) + !Minimum allowed number concentration for any mode (#/m3) + ! XN0MIN_SLT = (/1.e1 , 1. , 1.e-4 /) + + +!Pour 3 modes Schultz +!Initial dry number median radius (um) from Schultz et al., 2004 + XINIRADIUS_SLT= 0.5*(/0.28, 2.25, 15.32, 0., 0. /) +!Initial, standard deviation from Schultz et al., 2004 + XINISIG_SLT = (/1.9, 2., 2., 0., 0./) +!Minimum allowed number concentration for any mode (#/m3) + XN0MIN_SLT = (/1.e1 , 1. , 1.e-4, 0., 0. /) +! +END IF + + +END SUBROUTINE INIT_SALT diff --git a/src/MNH/lesn.f90 b/src/MNH/lesn.f90 index eea67385bf0d09f146943e76e2dd50fc7fdaaaac..3eae3fc04d59c273e750b89bb0ef769ad7e3d3f9 100644 --- a/src/MNH/lesn.f90 +++ b/src/MNH/lesn.f90 @@ -42,6 +42,7 @@ !! 10/14 (C.Lac) Correction on user masks !! 10/16 (C.Lac) Add ground droplet deposition amount !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic !! !! -------------------------------------------------------------------------- ! @@ -107,6 +108,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEW REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZINDCLD !indice cloud si rc>0 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZINDCLD2 !indice cloud rc>1E-5 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCLDFR_LES! CLDFR on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRAINFR_LES! RAINFR on LES vertical grid REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMASSF ! massflux=rho*w REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZREHU ! relative humidity @@ -333,12 +335,14 @@ IF (LUSERR) THEN ALLOCATE(ZRWP_LES(IIU,IJU)) ALLOCATE(ZINPRR3D_LES (IIU,IJU,NLES_K)) ALLOCATE(ZEVAP3D_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZRAINFR_LES(IIU,IJU,NLES_K)) ELSE ALLOCATE(ZRR_LES (0,0,0)) ALLOCATE(ZMAXWRR2D(0,0)) ALLOCATE(ZRWP_LES(0,0)) ALLOCATE(ZINPRR3D_LES(0,0,0)) ALLOCATE(ZEVAP3D_LES(0,0,0)) + ALLOCATE(ZRAINFR_LES(0,0,0)) END IF IF (LUSERI) THEN ALLOCATE(ZRI_LES (IIU,IJU,NLES_K)) @@ -554,6 +558,7 @@ IF (LUSERR) THEN CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRR_LES ) CALL LES_VER_INT( XINPRR3D(:,:,:), ZINPRR3D_LES) CALL LES_VER_INT( XEVAP3D(:,:,:), ZEVAP3D_LES) + CALL LES_VER_INT( XRAINFR(:,:,:) ,ZRAINFR_LES ) END IF IF (LUSERC) THEN DO JJ=1,IJU @@ -779,6 +784,8 @@ END IF XLES_ACPRR(NLES_CURRENT_TCOUNT) ) ! conversion de m en mm XLES_ACPRR(NLES_CURRENT_TCOUNT)=XLES_ACPRR(NLES_CURRENT_TCOUNT)*1000. + CALL LES_MEAN_ll ( ZRAINFR_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_RF(:,NLES_CURRENT_TCOUNT,1) ) ENDIF ! @@ -1041,6 +1048,7 @@ DEALLOCATE(ZINDCLD2 ) DEALLOCATE(ZINDCLD2D ) DEALLOCATE(ZINDCLD2D2) DEALLOCATE(ZCLDFR_LES) +DEALLOCATE(ZRAINFR_LES) DEALLOCATE(ZMASSF ) DEALLOCATE(ZTEMP ) DEALLOCATE(ZREHU ) diff --git a/src/MNH/lima.f90 b/src/MNH/lima.f90 index ea0244c42c031fe96d89d5e8afe19e3ed86ec63c..7da0841e1b8fde7218257de8d6d111012caebb24 100644 --- a/src/MNH/lima.f90 +++ b/src/MNH/lima.f90 @@ -95,6 +95,7 @@ END MODULE MODI_LIMA !! ------------- !! Original 15/03/2018 !! +!! B.Vié 02/2019 : minor correction on budget !! !! !* 0. DECLARATIONS @@ -640,6 +641,12 @@ Z_CR_CVRC(:,:,:) = 0. IF (LWARM .AND. LRAIN) THEN CALL LIMA_DROPS_TO_DROPLETS_CONV(PRHODREF, ZRCS*PTSTEP, ZRRS*PTSTEP, ZCCS*PTSTEP, ZCRS*PTSTEP, & Z_RR_CVRC, Z_CR_CVRC) + ! + ZRCS(:,:,:) = ZRCS(:,:,:) - Z_RR_CVRC(:,:,:)/PTSTEP + ZRRS(:,:,:) = ZRRS(:,:,:) + Z_RR_CVRC(:,:,:)/PTSTEP + ZCCS(:,:,:) = ZCCS(:,:,:) - Z_CR_CVRC(:,:,:)/PTSTEP + ZCRS(:,:,:) = ZCRS(:,:,:) + Z_CR_CVRC(:,:,:)/PTSTEP + ! IF(LBU_ENABLE) THEN IF (LBUDGET_RC) CALL BUDGET (ZRCS(:,:,:)*PRHODJ(:,:,:), 7 , 'R2C1_BU_RRC') IF (LBUDGET_RR) CALL BUDGET (ZRRS(:,:,:)*PRHODJ(:,:,:), 8 , 'R2C1_BU_RRR') @@ -655,15 +662,15 @@ END IF ZTHT(:,:,:) = ZTHS(:,:,:) * PTSTEP ZT(:,:,:) = ZTHT(:,:,:) * ZEXN(:,:,:) ! -IF ( KRR .GE. 2 ) ZRCT(:,:,:) = ZRCS(:,:,:) * PTSTEP - Z_RR_CVRC(:,:,:) -IF ( KRR .GE. 3 ) ZRRT(:,:,:) = ZRRS(:,:,:) * PTSTEP + Z_RR_CVRC(:,:,:) +IF ( KRR .GE. 2 ) ZRCT(:,:,:) = ZRCS(:,:,:) * PTSTEP +IF ( KRR .GE. 3 ) ZRRT(:,:,:) = ZRRS(:,:,:) * PTSTEP IF ( KRR .GE. 4 ) ZRIT(:,:,:) = ZRIS(:,:,:) * PTSTEP IF ( KRR .GE. 5 ) ZRST(:,:,:) = ZRSS(:,:,:) * PTSTEP IF ( KRR .GE. 6 ) ZRGT(:,:,:) = ZRGS(:,:,:) * PTSTEP IF ( KRR .GE. 7 ) ZRHT(:,:,:) = ZRHS(:,:,:) * PTSTEP ! -IF ( LWARM ) ZCCT(:,:,:) = ZCCS(:,:,:) * PTSTEP - Z_CR_CVRC(:,:,:) -IF ( LWARM .AND. LRAIN ) ZCRT(:,:,:) = ZCRS(:,:,:) * PTSTEP + Z_CR_CVRC(:,:,:) +IF ( LWARM ) ZCCT(:,:,:) = ZCCS(:,:,:) * PTSTEP +IF ( LWARM .AND. LRAIN ) ZCRT(:,:,:) = ZCRS(:,:,:) * PTSTEP IF ( LCOLD ) ZCIT(:,:,:) = ZCIS(:,:,:) * PTSTEP ! !------------------------------------------------------------------------------- diff --git a/src/MNH/lima_ccn_activation.f90 b/src/MNH/lima_ccn_activation.f90 index 4b6d1c348cd57772a06f9dabfac56ea23ac02229..9a2e5dcdf722a6c122da92490a71db33d8d81c9c 100644 --- a/src/MNH/lima_ccn_activation.f90 +++ b/src/MNH/lima_ccn_activation.f90 @@ -471,7 +471,7 @@ IF ( OCLOSE_OUT ) THEN TZFIELD%CMNHNAME ='NACT' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '/kg' + TZFIELD%CUNITS = 'kg-1' TZFIELD%CDIR = 'XY' TZFIELD%CCOMMENT = 'X_Y_Z_NACT' TZFIELD%NGRID = 1 diff --git a/src/MNH/lima_sedimentation.f90 b/src/MNH/lima_sedimentation.f90 index ab0ebebcacad806e971b9dd53cf218122dc3590c..36b173a84f6ddf84e9e7a3732007891dca1b5b48 100644 --- a/src/MNH/lima_sedimentation.f90 +++ b/src/MNH/lima_sedimentation.f90 @@ -61,6 +61,7 @@ END MODULE MODI_LIMA_SEDIMENTATION !! ------------- !! Original 15/03/2018 !! +!! B.Vie 02/2019 Desactivate (comment) the heat transport by droplets !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -205,14 +206,14 @@ DO JN = 1 , NSPLITSED(KID) IF (KMOMENTS==2) PCS(:,:,JK) = PCS(:,:,JK) + ZW(:,:,JK)* & (ZWSEDC(:,:,JK+KKL)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) ! Heat transport - PRT_SUM(:,:,JK-KKL) = PRT_SUM(:,:,JK-KKL) + ZW(:,:,JK-KKL)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK-KKL) - PRT_SUM(:,:,JK) = PRT_SUM(:,:,JK) - ZW(:,:,JK)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK) - PCPT(:,:,JK-KKL) = PCPT(:,:,JK-KKL) + ZC * (ZW(:,:,JK-KKL)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK-KKL)) - PCPT(:,:,JK) = PCPT(:,:,JK) - ZC * (ZW(:,:,JK)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK)) - ZWDT(:,:,JK) =(PRHODREF(:,:,JK+KKL)*(1.+PRT_SUM(:,:,JK))*PCPT(:,:,JK)*PT(:,:,JK) + & - ZW(:,:,JK)*ZWSEDR(:,:,JK+1)*ZC*PT(:,:,JK+KKL)) / & - (PRHODREF(:,:,JK+KKL)*(1.+PRT_SUM(:,:,JK))*PCPT(:,:,JK) + ZW(:,:,JK)*ZWSEDR(:,:,JK+KKL)*ZC) - ZWDT(:,:,JK) = ZWDT(:,:,JK) - PT(:,:,JK) + !PRT_SUM(:,:,JK-KKL) = PRT_SUM(:,:,JK-KKL) + ZW(:,:,JK-KKL)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK-KKL) + !PRT_SUM(:,:,JK) = PRT_SUM(:,:,JK) - ZW(:,:,JK)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK) + !PCPT(:,:,JK-KKL) = PCPT(:,:,JK-KKL) + ZC * (ZW(:,:,JK-KKL)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK-KKL)) + !PCPT(:,:,JK) = PCPT(:,:,JK) - ZC * (ZW(:,:,JK)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK)) + !ZWDT(:,:,JK) =(PRHODREF(:,:,JK+KKL)*(1.+PRT_SUM(:,:,JK))*PCPT(:,:,JK)*PT(:,:,JK) + & + ! ZW(:,:,JK)*ZWSEDR(:,:,JK+1)*ZC*PT(:,:,JK+KKL)) / & + ! (PRHODREF(:,:,JK+KKL)*(1.+PRT_SUM(:,:,JK))*PCPT(:,:,JK) + ZW(:,:,JK)*ZWSEDR(:,:,JK+KKL)*ZC) + !ZWDT(:,:,JK) = ZWDT(:,:,JK) - PT(:,:,JK) END DO DEALLOCATE(ZRHODREF) DEALLOCATE(ZPABST) diff --git a/src/MNH/lima_warm_nucl.f90 b/src/MNH/lima_warm_nucl.f90 index 71974fc8c4d66eb94ee7cb0a06052efe469fa40e..08fa881a1ed3f0236d7a01cd683a8e4d61392a8e 100644 --- a/src/MNH/lima_warm_nucl.f90 +++ b/src/MNH/lima_warm_nucl.f90 @@ -539,7 +539,7 @@ IF ( OCLOSE_OUT ) THEN TZFIELD%CMNHNAME ='NACT' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '/kg' + TZFIELD%CUNITS = 'kg-1' TZFIELD%CDIR = 'XY' TZFIELD%CCOMMENT = 'X_Y_Z_NACT' TZFIELD%NGRID = 1 diff --git a/src/MNH/ls_coupling.f90 b/src/MNH/ls_coupling.f90 index 8b9430d839720d7cc00aeb1b98e29e3eecec8c9e..9af87a483a3b5cc7bcdd6c6c4b5c4bbc0b9a467d 100644 --- a/src/MNH/ls_coupling.f90 +++ b/src/MNH/ls_coupling.f90 @@ -17,10 +17,10 @@ INTERFACE KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & KSIZELBXTKE_ll,KSIZELBYTKE_ll, & KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & - PLSUM,PLSVM,PLSWM, PLSTHM,PLSRVM,PDRYMASST, & + PLSUM,PLSVM,PLSWM, PLSTHM,PLSRVM,PLSZWSM,PDRYMASST, & PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PDRYMASSS, & + PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PLSZWSS,PDRYMASSS, & PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS, & PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS ) ! @@ -52,6 +52,7 @@ INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll ! for Rx and SV ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUM,PLSVM,PLSWM ! Large Scale REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSTHM, PLSRVM ! fields at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSM ! fields at t-dt REAL, INTENT(IN) :: PDRYMASST ! Mass of dry air Md ! larger scale fields for Lateral Boundary condition REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUM,PLBXVM,PLBXWM ! Wind @@ -65,6 +66,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRM ,PLBYSVM ! in x and y-di ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUS,PLSVS,PLSWS ! Large Scale REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHS,PLSRVS ! source terms +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSS ! source terms REAL, INTENT(OUT) :: PDRYMASSS ! Md source ! larger scale fields sources for Lateral Boundary condition REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXUS,PLBXVS,PLBXWS ! Wind @@ -95,10 +97,10 @@ END MODULE MODI_LS_COUPLING KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & KSIZELBXTKE_ll,KSIZELBYTKE_ll, & KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & - PLSUM,PLSVM,PLSWM, PLSTHM,PLSRVM,PDRYMASST, & + PLSUM,PLSVM,PLSWM, PLSTHM,PLSRVM,PLSZWSM,PDRYMASST, & PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PDRYMASSS, & + PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PLSZWSS,PDRYMASSS, & PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS, & PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS ) ! ###################################################################### @@ -171,6 +173,7 @@ END MODULE MODI_LS_COUPLING !! 05/2006 Remove KEPS !! 2/2014 (escobar) add paspol for Forefire ! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !------------------------------------------------------------------------------ ! @@ -227,6 +230,7 @@ INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll ! for Rx and SV ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUM,PLSVM,PLSWM ! Large Scale REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSTHM, PLSRVM ! fields at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSM REAL, INTENT(IN) :: PDRYMASST ! Mass of dry air Md ! larger scale fields for Lateral Boundary condition REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUM,PLBXVM,PLBXWM ! Wind @@ -250,6 +254,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXTKES ! TKE REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYTKES REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PLBXRS ,PLBXSVS ! Moisture and SV REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PLBYRS ,PLBYSVS ! in x and y-dir. +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSS ! source terms ! ! !* 0.2 declarations of local variables @@ -297,7 +302,7 @@ GLSOURCE=.TRUE. ZLENG = (NCPL_TIMES(NCPL_CUR,1) - NCPL_TIMES(NCPL_CUR-1,1)) * PTSTEP ! CALL INI_LS(TCPLFILE(NCPL_CUR)%TZFILE,HGETRVM,GLSOURCE,PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS, & - PDRYMASSS,PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PDRYMASST,ZLENG,OSTEADY_DMASS) + PLSZWSS, PDRYMASSS,PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM,PDRYMASST,ZLENG,OSTEADY_DMASS) ! ! diff --git a/src/MNH/modd_RBK90_Globaln.f90 b/src/MNH/modd_RBK90_Globaln.f90 index ccf0f737b9147d5d900639505f0281dbbdac9dd1..4d4a40e402596db7d598f3bbcaf52915afc2f4c4 100644 --- a/src/MNH/modd_RBK90_Globaln.f90 +++ b/src/MNH/modd_RBK90_Globaln.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! @@ -23,6 +23,8 @@ ! Output root filename : RBK90 ! ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +! Modifications +! P. Wautelet 08/02/2019: add missing NULL association for pointers MODULE MODD_RBK90_Global_n @@ -40,15 +42,15 @@ TYPE RBK90_Global_t ! Declaration of global variables ! C - Concentration of all species - REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: C + REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: C => NULL() ! VAR - Concentrations of variable species (global) - REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: VAR + REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: VAR => NULL() ! FIX - Concentrations of fixed species (global) - REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: FIX + REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: FIX => NULL() !JPP EQUIVALENCE( C(1),VAR(1) ) !JPP EQUIVALENCE( C(66),FIX(1) ) ! RCONST - Rate constants (global) - REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: RCONST + REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: RCONST => NULL() ! TIME - Current integration time REAL(KIND(0.0D0)) :: TIME ! SUN - Sunlight intensity between [0,1] @@ -64,9 +66,9 @@ TYPE RBK90_Global_t ! DT - Integration step REAL(KIND(0.0D0)) :: DT ! ATOL - Absolute tolerance - REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: ATOL + REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: ATOL => NULL() ! RTOL - Relative tolerance - REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: RTOL + REAL(KIND(0.0D0)), DIMENSION(:), POINTER :: RTOL => NULL() ! STEPMIN - Lower bound for integration step REAL(KIND(0.0D0)) :: STEPMIN ! STEPMAX - Upper bound for integration step diff --git a/src/MNH/modd_RBK90_JacobianSPn.f90 b/src/MNH/modd_RBK90_JacobianSPn.f90 index dc7fd2c695c01ab1fd7ffb595ebd0b615b2d7fea..be6f91d417c0fa92b6859882a03bac0bc2597f95 100644 --- a/src/MNH/modd_RBK90_JacobianSPn.f90 +++ b/src/MNH/modd_RBK90_JacobianSPn.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !****************************************************************** @@ -25,6 +25,8 @@ ! Output root filename : RBK90 ! ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +! Modifications +! P. Wautelet 08/02/2019: add missing NULL association for pointers MODULE MODD_RBK90_JacobianSP_n @@ -39,13 +41,13 @@ TYPE RBK90_JacobianSP_t ! Sparse Jacobian Data - INTEGER, DIMENSION(:), POINTER :: LU_IROW - INTEGER, DIMENSION(:), POINTER :: LU_ICOL + INTEGER, DIMENSION(:), POINTER :: LU_IROW => NULL() + INTEGER, DIMENSION(:), POINTER :: LU_ICOL => NULL() - INTEGER, DIMENSION(:), POINTER :: LU_CROW - INTEGER, DIMENSION(:), POINTER :: LU_DIAG + INTEGER, DIMENSION(:), POINTER :: LU_CROW => NULL() + INTEGER, DIMENSION(:), POINTER :: LU_DIAG => NULL() - INTEGER, DIMENSION(:), POINTER :: LU_DIM_SPECIES + INTEGER, DIMENSION(:), POINTER :: LU_DIM_SPECIES => NULL() END TYPE RBK90_JacobianSP_t diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 677a4c4ac525ef94bb01b47788418f6289233c8e..9ff02772fc696e682c0efc396edbb3c0b6780748 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/modd_aircraft_balloon.f90,v $ $Revision: 1.1.10.1.2.1.10.2.2.2 $ -! MASDEV4_7 modd 2006/06/28 11:31:03 -!----------------------------------------------------------------- ! ############################ MODULE MODD_AIRCRAFT_BALLOON ! ############################ @@ -26,10 +21,10 @@ !! !! REFERENCE !! --------- -!! +!! !! AUTHOR !! ------ -!! P. Jabouille *Meteo France* +!! P. Jabouille *Meteo France* !! !! MODIFICATIONS !! ------------- @@ -37,6 +32,7 @@ !! Apr,19, 2001 (G.Jaubert) add CVBALL type !! March, 2013 : O.Caumont, C.Lac : add vertical profiles !! Oct,2016 : G.DELAUTIER LIMA +! P. Wautelet 08/02/2019: add missing NULL association for pointers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -92,13 +88,13 @@ REAL :: MASS ! mass of the balloon (kg) (if 'CVBALL') INTEGER :: SEG ! number of aircraft flight segments INTEGER :: SEGCURN ! current flight segment number REAL :: SEGCURT ! current flight segment time spent -REAL, DIMENSION(:), POINTER :: SEGLAT ! latitude of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGLON ! longitude of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGX ! X of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGY ! Y of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGP ! pressure of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGZ ! altitude of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGTIME ! duration of flight segments (LEG ) +REAL, DIMENSION(:), POINTER :: SEGLAT => NULL() ! latitude of flight segment extremities (LEG+1) +REAL, DIMENSION(:), POINTER :: SEGLON => NULL() ! longitude of flight segment extremities (LEG+1) +REAL, DIMENSION(:), POINTER :: SEGX => NULL() ! X of flight segment extremities (LEG+1) +REAL, DIMENSION(:), POINTER :: SEGY => NULL() ! Y of flight segment extremities (LEG+1) +REAL, DIMENSION(:), POINTER :: SEGP => NULL() ! pressure of flight segment extremities (LEG+1) +REAL, DIMENSION(:), POINTER :: SEGZ => NULL() ! altitude of flight segment extremities (LEG+1) +REAL, DIMENSION(:), POINTER :: SEGTIME => NULL() ! duration of flight segments (LEG ) ! !* aircraft altitude type definition ! @@ -113,42 +109,42 @@ REAL :: P_CUR ! current p (if 'AIRCRA' and 'ALTDEF' ! !* data records ! -REAL, DIMENSION(:), POINTER :: TIME ! t(n) (n: recording instants) -REAL, DIMENSION(:), POINTER :: X ! X(n) -REAL, DIMENSION(:), POINTER :: Y ! Y(n) -REAL, DIMENSION(:), POINTER :: Z ! Z(n) -REAL, DIMENSION(:), POINTER :: XLON ! longitude(n) -REAL, DIMENSION(:), POINTER :: YLAT ! latitude (n) -REAL, DIMENSION(:), POINTER :: ZON ! zonal wind(n) -REAL, DIMENSION(:), POINTER :: MER ! meridian wind(n) -REAL, DIMENSION(:), POINTER :: W ! w(n) (air vertical speed) -REAL, DIMENSION(:), POINTER :: P ! p(n) -REAL, DIMENSION(:), POINTER :: TKE ! tke(n) -REAL, DIMENSION(:), POINTER :: TKE_DISS ! tke dissipation rate -REAL, DIMENSION(:), POINTER :: TH ! th(n) -REAL, DIMENSION(:,:), POINTER :: R ! r*(n) -REAL, DIMENSION(:,:), POINTER :: SV ! Sv*(n) -REAL, DIMENSION(:,:), POINTER :: RTZ ! tot hydrometeor mixing ratio -REAL, DIMENSION(:,:,:), POINTER :: RZ ! water vapour mixing ratio -REAL, DIMENSION(:,:), POINTER :: FFZ ! horizontal wind -REAL, DIMENSION(:,:), POINTER :: IWCZ ! ice water content -REAL, DIMENSION(:,:), POINTER :: LWCZ ! liquid water content -REAL, DIMENSION(:,:), POINTER :: CIZ ! Ice concentration -REAL, DIMENSION(:,:), POINTER :: CCZ ! Cloud concentration (LIMA) -REAL, DIMENSION(:,:), POINTER :: CRZ ! Rain concentration (LIMA) -REAL, DIMENSION(:,:), POINTER :: CRARE ! cloud radar reflectivity -REAL, DIMENSION(:,:), POINTER :: CRARE_ATT ! attenuated (= more realistic) cloud radar reflectivity -REAL, DIMENSION(:,:), POINTER :: WZ ! vertical profile of vertical velocity -REAL, DIMENSION(:,:), POINTER :: ZZ ! vertical profile of mass point altitude (above sea) -REAL, DIMENSION(:,:), POINTER :: AER ! Extinction at 550 nm -REAL, DIMENSION(:,:), POINTER :: DST_WL ! Extinction by wavelength -REAL, DIMENSION(:), POINTER :: ZS ! zs(n) -REAL, DIMENSION(:), POINTER :: TSRAD ! Ts(n) -REAL, DIMENSION(:,:), POINTER :: DATIME ! record for diachro -! -REAL, DIMENSION(:) , POINTER :: THW_FLUX ! thw_flux(n) -REAL, DIMENSION(:) , POINTER :: RCW_FLUX ! rcw_flux(n) -REAL, DIMENSION(:,:), POINTER :: SVW_FLUX ! psw_flux(n) +REAL, DIMENSION(:), POINTER :: TIME => NULL() ! t(n) (n: recording instants) +REAL, DIMENSION(:), POINTER :: X => NULL() ! X(n) +REAL, DIMENSION(:), POINTER :: Y => NULL() ! Y(n) +REAL, DIMENSION(:), POINTER :: Z => NULL() ! Z(n) +REAL, DIMENSION(:), POINTER :: XLON => NULL() ! longitude(n) +REAL, DIMENSION(:), POINTER :: YLAT => NULL() ! latitude (n) +REAL, DIMENSION(:), POINTER :: ZON => NULL() ! zonal wind(n) +REAL, DIMENSION(:), POINTER :: MER => NULL() ! meridian wind(n) +REAL, DIMENSION(:), POINTER :: W => NULL() ! w(n) (air vertical speed) +REAL, DIMENSION(:), POINTER :: P => NULL() ! p(n) +REAL, DIMENSION(:), POINTER :: TKE => NULL() ! tke(n) +REAL, DIMENSION(:), POINTER :: TKE_DISS => NULL() ! tke dissipation rate +REAL, DIMENSION(:), POINTER :: TH => NULL() ! th(n) +REAL, DIMENSION(:,:), POINTER :: R => NULL() ! r*(n) +REAL, DIMENSION(:,:), POINTER :: SV => NULL() ! Sv*(n) +REAL, DIMENSION(:,:), POINTER :: RTZ => NULL() ! tot hydrometeor mixing ratio +REAL, DIMENSION(:,:,:),POINTER :: RZ => NULL() ! water vapour mixing ratio +REAL, DIMENSION(:,:), POINTER :: FFZ => NULL() ! horizontal wind +REAL, DIMENSION(:,:), POINTER :: IWCZ => NULL() ! ice water content +REAL, DIMENSION(:,:), POINTER :: LWCZ => NULL() ! liquid water content +REAL, DIMENSION(:,:), POINTER :: CIZ => NULL() ! Ice concentration +REAL, DIMENSION(:,:), POINTER :: CCZ => NULL() ! Cloud concentration (LIMA) +REAL, DIMENSION(:,:), POINTER :: CRZ => NULL() ! Rain concentration (LIMA) +REAL, DIMENSION(:,:), POINTER :: CRARE => NULL() ! cloud radar reflectivity +REAL, DIMENSION(:,:), POINTER :: CRARE_ATT => NULL() ! attenuated (= more realistic) cloud radar reflectivity +REAL, DIMENSION(:,:), POINTER :: WZ => NULL() ! vertical profile of vertical velocity +REAL, DIMENSION(:,:), POINTER :: ZZ => NULL() ! vertical profile of mass point altitude (above sea) +REAL, DIMENSION(:,:), POINTER :: AER => NULL() ! Extinction at 550 nm +REAL, DIMENSION(:,:), POINTER :: DST_WL => NULL() ! Extinction by wavelength +REAL, DIMENSION(:), POINTER :: ZS => NULL() ! zs(n) +REAL, DIMENSION(:), POINTER :: TSRAD => NULL() ! Ts(n) +REAL, DIMENSION(:,:), POINTER :: DATIME => NULL() ! record for diachro +! +REAL, DIMENSION(:) , POINTER :: THW_FLUX => NULL() ! thw_flux(n) +REAL, DIMENSION(:) , POINTER :: RCW_FLUX => NULL() ! rcw_flux(n) +REAL, DIMENSION(:,:), POINTER :: SVW_FLUX => NULL() ! psw_flux(n) END TYPE FLYER REAL :: XLAM_CRAD ! cloud radar wavelength (m) ! diff --git a/src/MNH/modd_blowsnown.f90 b/src/MNH/modd_blowsnown.f90 index 38bf7b9291a25eabec2250b1d72f199952b6acd2..531c86fdeca8d6a833945cbdc021c234ba675a38 100644 --- a/src/MNH/modd_blowsnown.f90 +++ b/src/MNH/modd_blowsnown.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2018-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- !! ###################### @@ -28,6 +28,7 @@ !! !! MODIFICATIONS !! ------------- +! P. Wautelet 08/02/2019: add missing NULL association for pointers !! !!-------------------------------------------------------------------- !! DECLARATIONS @@ -39,13 +40,13 @@ TYPE BLOWSNOW_t ! LOGICAL :: LSNOWSUBL ! switch to activate blowing snow sublimation ! -REAL, DIMENSION(:,:,:), POINTER :: XSNWSUBL3D ! Drifting snow instataneous +REAL, DIMENSION(:,:,:), POINTER :: XSNWSUBL3D => NULL() ! Drifting snow instataneous ! sublimation rate (kg/m3/s) -REAL, DIMENSION(:,:,:), POINTER :: XSNWCANO ! Total mass in Canopy at time t +REAL, DIMENSION(:,:,:), POINTER :: XSNWCANO => NULL() ! Total mass in Canopy at time t ! (:,:,1) : equivalent number concentration in Canopy (#/kg) ! (:,:,2) : equivalent mass concentration in Canopy (kg/kg) ! (:,:,3) : equivalent mass concentration in saltation (kg/kg) -REAL, DIMENSION(:,:,:), POINTER :: XRSNWCANOS ! Source of (rho*canopy mass) at time t +REAL, DIMENSION(:,:,:), POINTER :: XRSNWCANOS => NULL() ! Source of (rho*canopy mass) at time t diff --git a/src/MNH/modd_ch_budget_n.f90 b/src/MNH/modd_ch_budget_n.f90 index 41c039d0731d1b22e34d98f84f61a0ebfa72d541..4fe8de9b6374bb96b1c3c735e8cd5b5d9800082a 100644 --- a/src/MNH/modd_ch_budget_n.f90 +++ b/src/MNH/modd_ch_budget_n.f90 @@ -1,3 +1,7 @@ +!MNH_LIC Copyright 2016-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ####################### MODULE MODD_CH_BUDGET_n @@ -15,19 +19,20 @@ !! !!** IMPLICIT ARGUMENTS !! ------------------ -!! None +!! None !! !! REFERENCE !! --------- !! Book2 of documentation of Meso-NH -!! +!! !! AUTHOR !! ------ !! F. Brosse *Laboratoire d'Aerologie UPS-CNRS* !! !! MODIFICATIONS !! ------------- -!! Original October 2016 +!! Original October 2016 +! P. Wautelet 08/02/2019: add missing NULL association for pointers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -37,16 +42,16 @@ USE MODD_PARAMETERS, ONLY: JPMODELMAX IMPLICIT NONE TYPE TREAC_BUDGET - REAL , DIMENSION(:,:,:,:), POINTER :: XB_REAC - INTEGER, DIMENSION(:) , POINTER :: NB_REAC + REAL , DIMENSION(:,:,:,:), POINTER :: XB_REAC => NULL() + INTEGER, DIMENSION(:) , POINTER :: NB_REAC => NULL() END TYPE TREAC_BUDGET TYPE TCH_BUDGET_t - CHARACTER(LEN=32), DIMENSION(:), POINTER :: CNAMES_BUDGET - INTEGER, DIMENSION(:), POINTER :: NSPEC_BUDGET + CHARACTER(LEN=32), DIMENSION(:), POINTER :: CNAMES_BUDGET => NULL() + INTEGER, DIMENSION(:), POINTER :: NSPEC_BUDGET => NULL() INTEGER :: NEQ_BUDGET - TYPE(TREAC_BUDGET), DIMENSION(:), POINTER :: XTCHEM + TYPE(TREAC_BUDGET), DIMENSION(:), POINTER :: XTCHEM => NULL() END TYPE TCH_BUDGET_t diff --git a/src/MNH/modd_ch_constn.f90 b/src/MNH/modd_ch_constn.f90 index 92013fb84d2edd994cd6efed8593fef41c673c7e..f7495916ef8a30dc4d42686e9e16761665ea0698 100644 --- a/src/MNH/modd_ch_constn.f90 +++ b/src/MNH/modd_ch_constn.f90 @@ -1,14 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2001-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- -!----------------------------------------------------------------- -!----------------------------------------------------------------- ! ##################### MODULE MODD_CH_CONST_n ! ###################### @@ -32,6 +26,7 @@ !! !! MODIFICATIONS !! ------------- +! P. Wautelet 08/02/2019: add missing NULL association for pointers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -43,14 +38,14 @@ IMPLICIT NONE TYPE CH_CONST_t ! - REAL, DIMENSION(:), POINTER :: XSREALMASSMOLVAL ! final molecular + REAL, DIMENSION(:), POINTER :: XSREALMASSMOLVAL => NULL() ! final molecular ! diffusivity value - REAL, DIMENSION(:), POINTER :: XSREALREACTVAL ! final chemical + REAL, DIMENSION(:), POINTER :: XSREALREACTVAL => NULL() ! final chemical ! reactivity factor ! with biologie - REAL, DIMENSION(:,:), POINTER :: XSREALHENRYVAL ! chemical Henry + REAL, DIMENSION(:,:), POINTER :: XSREALHENRYVAL => NULL() ! chemical Henry ! constant value - REAL :: XCONVERSION ! emission unit + REAL :: XCONVERSION ! emission unit ! conversion factor ! diff --git a/src/MNH/modd_ch_icen.f90 b/src/MNH/modd_ch_icen.f90 index 8f9323d0c2af2a37acbae0e12c2241775e0beb60..19f0a3c2662045354fc8117702c6a98e16017a11 100644 --- a/src/MNH/modd_ch_icen.f90 +++ b/src/MNH/modd_ch_icen.f90 @@ -1,15 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2015-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source: /home//MESONH/MNH-V5-1-4/src/MODIF_TMICICE/modd_ch_icen.f90 -!----------------------------------------------------------------- -!----------------------------------------------------------------- -!----------------------------------------------------------------- -!----------------------------------------------------------------------------- !! ######################## MODULE MODD_CH_ICE_n !! ######################## @@ -28,6 +21,7 @@ !! MODIFICATIONS !! ------------- !! Original 11/12/15 +! P. Wautelet 08/02/2019: add missing NULL association for pointers !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -43,7 +37,7 @@ IMPLICIT NONE TYPE CH_ICE_t ! - INTEGER, POINTER, DIMENSION(:) :: NINDEXGI, NINDEXWI, NINDEXWG + INTEGER, POINTER, DIMENSION(:) :: NINDEXGI => NULL(), NINDEXWI => NULL(), NINDEXWG => NULL() ! !----------------------------------------------------------------------------- END TYPE CH_ICE_t diff --git a/src/MNH/modd_ch_phn.f90 b/src/MNH/modd_ch_phn.f90 index b321995c92d9ae22511de0417b35898bfca2dd17..b1071e5f2dd072436fd46ed18c7f2264e3f6d2d6 100644 --- a/src/MNH/modd_ch_phn.f90 +++ b/src/MNH/modd_ch_phn.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 2007-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2007-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- !! ######################## @@ -23,6 +23,7 @@ !! P. Tulet Nov 2014 accumulated moles of aqueous species that fall at the surface !! P. Tulet & M. Leriche Nov 2015 add pH in rain at the surface !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 08/02/2019: add missing NULL association for pointers !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -38,11 +39,11 @@ IMPLICIT NONE TYPE CH_PH_t ! -! REAL, POINTER, DIMENSION(:,:,:) :: XPHC ! cloud -! REAL, POINTER, DIMENSION(:,:,:) :: XPHR ! rain - REAL, POINTER, DIMENSION(:,:,:) :: XACPRAQ ! sum of aqueous chemical species fall at the surface by rain - ! in moles i / m2 (ratio with XACPRR for concentration - REAL, POINTER, DIMENSION(:,:) :: XACPHR ! mean PH in accumulated surface rain +! REAL, POINTER, DIMENSION(:,:,:) :: XPHC => NULL() ! cloud +! REAL, POINTER, DIMENSION(:,:,:) :: XPHR => NULL() ! rain + REAL, POINTER, DIMENSION(:,:,:) :: XACPRAQ => NULL() ! sum of aqueous chemical species fall at the surface by rain + ! in moles i / m2 (ratio with XACPRR for concentration + REAL, POINTER, DIMENSION(:,:) :: XACPHR => NULL() ! mean PH in accumulated surface rain ! !----------------------------------------------------------------------------- END TYPE CH_PH_t diff --git a/src/MNH/modd_ch_prodlosstotn.f90 b/src/MNH/modd_ch_prodlosstotn.f90 index 289f97e343281131b22dd047faec812e3ffe5e98..a5fb75b1cbeaaed3b87535d47e838daba5d870fd 100644 --- a/src/MNH/modd_ch_prodlosstotn.f90 +++ b/src/MNH/modd_ch_prodlosstotn.f90 @@ -1,3 +1,8 @@ +!MNH_LIC Copyright 2016-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- !! ######################## MODULE MODD_CH_PRODLOSSTOT_n !! ######################## @@ -25,7 +30,8 @@ !! !! MODIFICATIONS !! ------------- -!! Original October 2016 +!! Original October 2016 +! P. Wautelet 08/02/2019: add missing NULL association for pointers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -36,11 +42,11 @@ IMPLICIT NONE TYPE CH_PRODLOSSTOT_t ! - CHARACTER(LEN=32), DIMENSION(:), POINTER :: CNAMES_PRODLOSST - INTEGER, DIMENSION(:), POINTER :: NIND_SPEC + CHARACTER(LEN=32), DIMENSION(:), POINTER :: CNAMES_PRODLOSST => NULL() + INTEGER, DIMENSION(:), POINTER :: NIND_SPEC => NULL() INTEGER :: NEQ_PLT - REAL, DIMENSION(:,:,:,:), POINTER:: XPROD - REAL, DIMENSION(:,:,:,:), POINTER:: XLOSS + REAL, DIMENSION(:,:,:,:), POINTER:: XPROD => NULL() + REAL, DIMENSION(:,:,:,:), POINTER:: XLOSS => NULL() ! !----------------------------------------------------------------------------- diff --git a/src/MNH/modd_ch_rosenbrockn.f90 b/src/MNH/modd_ch_rosenbrockn.f90 index ff5b17a033bb4353b514e9ac997c1721e0daa78b..9e46c3d64f0288c21cd927a3b51d872136cae209 100644 --- a/src/MNH/modd_ch_rosenbrockn.f90 +++ b/src/MNH/modd_ch_rosenbrockn.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2007-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !! ######################### MODULE MODD_CH_ROSENBROCK_n @@ -20,6 +20,7 @@ !! MODIFICATIONS !! ------------- !! Original 05/06/07 +! P. Wautelet 08/02/2019: add missing NULL association for pointers !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -36,19 +37,19 @@ TYPE CH_ROSENBROCK_t ! INTEGER :: NSPARSEDIM ! size of vectors NSPARSE_IROW and NSPARSE_ICOL ! - INTEGER, POINTER, DIMENSION(:) :: NSPARSE_IROW ! row index - INTEGER, POINTER, DIMENSION(:) :: NSPARSE_ICOL ! col index - INTEGER, POINTER, DIMENSION(:) :: NSPARSE_CROW ! first row element index - INTEGER, POINTER, DIMENSION(:) :: NSPARSE_DIAG ! diag index + INTEGER, POINTER, DIMENSION(:) :: NSPARSE_IROW => NULL() ! row index + INTEGER, POINTER, DIMENSION(:) :: NSPARSE_ICOL => NULL() ! col index + INTEGER, POINTER, DIMENSION(:) :: NSPARSE_CROW => NULL() ! first row element index + INTEGER, POINTER, DIMENSION(:) :: NSPARSE_DIAG => NULL() ! diag index ! of the sparse JACobian matrix ! INTEGER :: NEQ_NAQ ! number of Non-AQueous species INTEGER :: NSPARSEDIM_NAQ !size of vectors NSPARSE_IROW_NAQ and NSPARSE_ICOL_NAQ ! - INTEGER, POINTER, DIMENSION(:) :: NSPARSE_IROW_NAQ ! row index - INTEGER, POINTER, DIMENSION(:) :: NSPARSE_ICOL_NAQ ! col index - INTEGER, POINTER, DIMENSION(:) :: NSPARSE_CROW_NAQ ! first row element index - INTEGER, POINTER, DIMENSION(:) :: NSPARSE_DIAG_NAQ ! diag index + INTEGER, POINTER, DIMENSION(:) :: NSPARSE_IROW_NAQ => NULL() ! row index + INTEGER, POINTER, DIMENSION(:) :: NSPARSE_ICOL_NAQ => NULL() ! col index + INTEGER, POINTER, DIMENSION(:) :: NSPARSE_CROW_NAQ => NULL() ! first row element index + INTEGER, POINTER, DIMENSION(:) :: NSPARSE_DIAG_NAQ => NULL() ! diag index ! of the sparse JACobian matrix of NonAQueous species ! ! diff --git a/src/MNH/modd_csts_salt.f90 b/src/MNH/modd_csts_salt.f90 index 4c985d21a1f9e606d11aa89ec831c8ecb621a5e6..9db26edacaf63aa95a8388e544ed9eacf29f6308 100644 --- a/src/MNH/modd_csts_salt.f90 +++ b/src/MNH/modd_csts_salt.f90 @@ -33,6 +33,7 @@ !! !! MODIFICATIONS !! ------------- +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !!-------------------------------------------------------------------- !! DECLARATIONS @@ -42,7 +43,9 @@ IMPLICIT NONE ! !densité salt a introduire -REAL, PARAMETER :: XDENSITY_SALT = 2.1e3 ![kg/m3] density of dust +! ++ PIERRE / MARINE SSA DUST - MODIF ++ +REAL, PARAMETER :: XDENSITY_SALT = 2.2e3 ![kg/m3] density of dust +! -- PIERRE / MARINE SSA DUST - MODIF -- REAL, PARAMETER :: XMOLARWEIGHT_SALT = 58.e-3 ![kg/mol] molar weight dust REAL, PARAMETER :: XM3TOUM3_SALT = 1.d18 ![um3/m3] conversion factor REAL, PARAMETER :: XUM3TOM3_SALT = 1.d-18 ![m3/um3] conversion factor diff --git a/src/MNH/modd_diag_in_run.f90 b/src/MNH/modd_diag_in_run.f90 index 4c52ea1175777bf35c09d329002634b54f7c99ca..b7bba80d0c045a7787cf64d952de4b44c6a2961f 100644 --- a/src/MNH/modd_diag_in_run.f90 +++ b/src/MNH/modd_diag_in_run.f90 @@ -11,6 +11,7 @@ MODULE MODD_DIAG_IN_RUN ! Modifications !! 02/2018 Q.Libois ECRAD +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes ! !* stores instantaneous diagnostic arrays for the current time-step ! @@ -37,4 +38,6 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_MER10M! meridian wind at 10m REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_DSTAOD! dust aerosol optical depth REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SFCO2 ! CO2 Surface flux REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCURRENT_TKE_DISS ! Tke dissipation rate +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SLTAOD ! Salt aerosol optical depth +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_ZWS ! Significant height of waves END MODULE MODD_DIAG_IN_RUN diff --git a/src/MNH/modd_fieldn.f90 b/src/MNH/modd_fieldn.f90 index 5f5e1847b0950cce83e8cb26aad68dbc4fbb2c5d..1bfaab8943aa48f79fea1868b07d09fe513e44e8 100644 --- a/src/MNH/modd_fieldn.f90 +++ b/src/MNH/modd_fieldn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -49,6 +49,9 @@ !! for Theta and r (noted _CLD) !! 04/16 (M.Mazoyer) New supersaturation fields !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! 02/2019 C.Lac 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 06/03/2019: correct XZWS entry !! !------------------------------------------------------------------------------- ! @@ -59,6 +62,7 @@ USE MODD_PARAMETERS, ONLY: JPMODELMAX IMPLICIT NONE TYPE FIELD_t + REAL, DIMENSION(:,:), POINTER :: XZWS=>NULL() ! significant sea wave ! REAL, DIMENSION(:,:,:), POINTER :: XUT=>NULL(),XVT=>NULL(),XWT=>NULL() ! U,V,W at time t REAL, DIMENSION(:,:,:), POINTER :: XRUS=>NULL(),XRVS=>NULL(),XRWS=>NULL() @@ -108,6 +112,7 @@ END TYPE FIELD_t TYPE(FIELD_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: FIELD_MODEL +REAL, DIMENSION(:,:), POINTER :: XZWS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XUT=>NULL(),XVT=>NULL(),XWT=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XRUS=>NULL(),XRVS=>NULL(),XRWS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XRUS_PRES=>NULL(),XRVS_PRES=>NULL(),XRWS_PRES=>NULL() @@ -133,6 +138,7 @@ REAL, DIMENSION(:,:,:), POINTER :: XSRC=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XSRCT=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XSIGS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XCLDFR=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XRAINFR=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XCIT=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XTHM=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XPABSM=>NULL() @@ -147,6 +153,7 @@ INTEGER, INTENT(IN) :: KFROM, KTO INTEGER :: IID,IRESP ! ! Save current state for allocated arrays +!FIELD_MODEL(KFROM)%XZWS=>XZWS !Done in FIELDLIST_GOTO_MODEL !FIELD_MODEL(KFROM)%XUT=>XUT !Done in FIELDLIST_GOTO_MODEL !FIELD_MODEL(KFROM)%XVT=>XVT !Done in FIELDLIST_GOTO_MODEL !FIELD_MODEL(KFROM)%XWT=>XWT !Done in FIELDLIST_GOTO_MODEL @@ -182,6 +189,7 @@ FIELD_MODEL(KFROM)%XPABSM=>XPABSM FIELD_MODEL(KFROM)%XRCM=>XRCM ! ! Current model is set to model KTO +!XZWS=>FIELD_MODEL(KTO)%XZWS !Done in FIELDLIST_GOTO_MODEL !XUT=>FIELD_MODEL(KTO)%XUT !Done in FIELDLIST_GOTO_MODEL !XVT=>FIELD_MODEL(KTO)%XVT !Done in FIELDLIST_GOTO_MODEL !XWT=>FIELD_MODEL(KTO)%XWT !Done in FIELDLIST_GOTO_MODEL diff --git a/src/MNH/modd_getn.f90 b/src/MNH/modd_getn.f90 index 7a583779d04dd284bda63e2f567b548931c21c26..bae3402d5f9a9453dbc6f7f0fa706e3755793aa3 100644 --- a/src/MNH/modd_getn.f90 +++ b/src/MNH/modd_getn.f90 @@ -52,6 +52,7 @@ !! V. Masson 01/2004 surface externalization (rm CGETSURF) !! 05/2006 Remove EPS and LGETALL !! M. Leriche 04/2010 add get indicators for pH in cloud and rain +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -102,6 +103,7 @@ TYPE GET_t CHARACTER (LEN=4) :: CGETBL_DEPTH ! Get indicator for the BL depth CHARACTER (LEN=4) :: CGETSBL_DEPTH ! Get indicator for the SBL depth CHARACTER (LEN=4) :: CGETPHC,CGETPHR ! Get indicator for the pH values + CHARACTER (LEN=4) :: CGETZWS ! in cloud water and rainwater ! END TYPE GET_t @@ -133,6 +135,7 @@ CHARACTER (LEN=4), POINTER :: CGETBL_DEPTH=>NULL() CHARACTER (LEN=4), POINTER :: CGETSBL_DEPTH=>NULL() CHARACTER (LEN=4), POINTER :: CGETPHC=>NULL() CHARACTER (LEN=4), POINTER :: CGETPHR=>NULL() +CHARACTER (LEN=4), POINTER :: CGETZWS=>NULL() CONTAINS @@ -179,6 +182,7 @@ CGETSRC=>GET_MODEL(KTO)%CGETSRC CGETCLDFR=>GET_MODEL(KTO)%CGETCLDFR CGETSRCT=>GET_MODEL(KTO)%CGETSRCT CGETCIT=>GET_MODEL(KTO)%CGETCIT +CGETZWS=>GET_MODEL(KTO)%CGETZWS CGETCONV=>GET_MODEL(KTO)%CGETCONV CGETRAD=>GET_MODEL(KTO)%CGETRAD CGETCLOUD=>GET_MODEL(KTO)%CGETCLOUD diff --git a/src/MNH/modd_lesn.f90 b/src/MNH/modd_lesn.f90 index dd37f5461e2c5e7c7146c82e8ef724ca066ae8d3..9fe76c3f8f7eacbc68b7724d4f0df26562d791d3 100644 --- a/src/MNH/modd_lesn.f90 +++ b/src/MNH/modd_lesn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source: /srv/cvsroot/MNH-VX-Y-Z/src/MNH/modd_lesn.f90,v $ $Revision: 1.2.2.2.2.1.2.1.12.2 $ $Date: 2014/01/09 15:01:56 $ -!----------------------------------------------------------------- -!----------------------------------------------------------------- ! ############### MODULE MODD_LES_n ! ############### @@ -22,13 +17,13 @@ !! !!** IMPLICIT ARGUMENTS !! ------------------ -!! None +!! None !! !! REFERENCE !! --------- !! Book2 of documentation of Meso-NH (module MODD_LES) !! Technical Specifications Report of the Meso-NH (chapters 2 and 3) -!! +!! !! !! AUTHOR !! ------ @@ -36,7 +31,7 @@ !! !! MODIFICATIONS !! ------------- -!! Original March 10, 1995 +!! Original March 10, 1995 !! !! (J.Stein) Sept. 25, 1995 add the model number in LES mode !! J. Cuxart Oct. 4, 1996 New time series @@ -44,6 +39,8 @@ !! V. Masson Nov. 6, 2002 LES budgets !! O.Thouron June, 2008 New radiation diagnostics !! 10/2016 (C.Lac) Add droplet deposition +! P. Wautelet 08/02/2019: add missing NULL association for pointers +!! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -117,6 +114,7 @@ TYPE LES_t REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Cf=>NULL() ! <CLDFR> REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_INDCf=>NULL() ! <Cf> tq rc>0 (0 OU 1) REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_INDCf2=>NULL() ! <Cf> tq rc>1E-5 (0 OU 1) + REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_RF=>NULL() ! <RAINFR> REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Mf=>NULL() ! <Mf> REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_KHt=>NULL()! <Kh for thet REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_KHr=>NULL()! <Kh for qr> @@ -647,20 +645,20 @@ TYPE LES_t ! REAL, DIMENSION(:,:,:), POINTER :: XCORRk_WW=>NULL() ! between w and w ! -!lw and sw fluxes up and down - REAL, DIMENSION(:,:), POINTER :: XLES_SWU !mean on the domain of the sw_up flux +!lw and sw fluxes up and down + REAL, DIMENSION(:,:), POINTER :: XLES_SWU => NULL() !mean on the domain of the sw_up flux !temporal serie - REAL, DIMENSION(:,:), POINTER :: XLES_SWD !mean on the domain of the sw_down flux + REAL, DIMENSION(:,:), POINTER :: XLES_SWD => NULL() !mean on the domain of the sw_down flux !temporal serie - REAL, DIMENSION(:,:), POINTER :: XLES_LWU !mean on the domain of the lw_up flux + REAL, DIMENSION(:,:), POINTER :: XLES_LWU => NULL() !mean on the domain of the lw_up flux !temporal serie - REAL, DIMENSION(:,:), POINTER :: XLES_LWD !mean on the domain of the lw_down flux + REAL, DIMENSION(:,:), POINTER :: XLES_LWD => NULL() !mean on the domain of the lw_down flux !temporal serie - REAL, DIMENSION(:,:), POINTER :: XLES_DTHRADSW !mean on the domain of dthrad_sw flux + REAL, DIMENSION(:,:), POINTER :: XLES_DTHRADSW => NULL() !mean on the domain of dthrad_sw flux !temporal serie - REAL, DIMENSION(:,:), POINTER :: XLES_DTHRADLW !mean on the domain of dthrad_lw flux + REAL, DIMENSION(:,:), POINTER :: XLES_DTHRADLW => NULL() !mean on the domain of dthrad_lw flux !temporal serie - REAL, DIMENSION(:,:), POINTER :: XLES_RADEFF ! effective radius + REAL, DIMENSION(:,:), POINTER :: XLES_RADEFF => NULL() ! effective radius !------------------------------------------------------------------------------- ! END TYPE LES_t @@ -698,6 +696,7 @@ REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Rc=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Cf=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_INDCf=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_INDCf2=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_RF=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Mf=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_KHt=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_KHr=>NULL() @@ -1125,6 +1124,7 @@ LES_MODEL(KFROM)%XLES_MEAN_Rc=>XLES_MEAN_Rc LES_MODEL(KFROM)%XLES_MEAN_Cf=>XLES_MEAN_Cf LES_MODEL(KFROM)%XLES_MEAN_INDCf=>XLES_MEAN_INDCf LES_MODEL(KFROM)%XLES_MEAN_INDCf2=>XLES_MEAN_INDCf2 +LES_MODEL(KFROM)%XLES_MEAN_RF=>XLES_MEAN_RF LES_MODEL(KFROM)%XLES_MEAN_Mf=>XLES_MEAN_Mf LES_MODEL(KFROM)%XLES_MEAN_KHt=>XLES_MEAN_KHt LES_MODEL(KFROM)%XLES_MEAN_KHr=>XLES_MEAN_KHr @@ -1553,6 +1553,7 @@ XLES_MEAN_Rc=>LES_MODEL(KTO)%XLES_MEAN_Rc XLES_MEAN_Cf=>LES_MODEL(KTO)%XLES_MEAN_Cf XLES_MEAN_INDCf=>LES_MODEL(KTO)%XLES_MEAN_INDCf XLES_MEAN_INDCf2=>LES_MODEL(KTO)%XLES_MEAN_INDCf2 +XLES_MEAN_RF=>LES_MODEL(KTO)%XLES_MEAN_RF XLES_MEAN_Mf=>LES_MODEL(KTO)%XLES_MEAN_Mf XLES_MEAN_KHt=>LES_MODEL(KTO)%XLES_MEAN_KHt XLES_MEAN_KHr=>LES_MODEL(KTO)%XLES_MEAN_KHr diff --git a/src/MNH/modd_lsfieldn.f90 b/src/MNH/modd_lsfieldn.f90 index 208f1d4d2bb3a8ae3cdd6b34a35324f76449d7a8..6274b8dd6075620ef5b74a9c58629da9b5884af1 100644 --- a/src/MNH/modd_lsfieldn.f90 +++ b/src/MNH/modd_lsfieldn.f90 @@ -36,6 +36,7 @@ !! 2D arrays to store values at lateral boundaries !! 20/05/06 Remove EPS !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! ! @@ -55,12 +56,15 @@ TYPE LSFIELD_t ! ! time t-dt for larger scales ! REAL, DIMENSION(:,:,:), POINTER :: XLSRVM=>NULL() ! Rv (mixing ratio for vapor) ! ! at time t-dt for larger scales + REAL, DIMENSION(:,:), POINTER :: XLSZWSM=>NULL() ! height of sea waves REAL, DIMENSION(:,:,:), POINTER :: XLSUS=>NULL(),XLSVS=>NULL(),XLSWS=>NULL() ! Tendency of ! U,V,W for larger scales REAL, DIMENSION(:,:,:), POINTER :: XLSTHS=>NULL() ! Tendency of ! theta for larger scales REAL, DIMENSION(:,:,:), POINTER :: XLSRVS=>NULL() ! Tendency of ! ! RV for larger scales +REAL, DIMENSION(:,:), POINTER :: XLSZWSS=>NULL() ! Tendency of +! ! sea wave for larger scales ! previously present for LS for V * Prhodj ! ! Large scale variables for horizontal lbc @@ -104,8 +108,10 @@ TYPE(LSFIELD_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: LSFIELD_MODEL REAL, DIMENSION(:,:,:), POINTER :: XLSUM=>NULL(),XLSVM=>NULL(),XLSWM=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLSTHM=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLSRVM=>NULL() +REAL, DIMENSION(:,:), POINTER :: XLSZWSM=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLSUS=>NULL(),XLSVS=>NULL(),XLSWS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLSTHS=>NULL() +REAL, DIMENSION(:,:), POINTER :: XLSZWSS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLSRVS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLBXUM=>NULL(),XLBXVM=>NULL(),XLBXWM=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLBXTHM=>NULL() @@ -143,11 +149,13 @@ INTEGER, INTENT(IN) :: KFROM, KTO !LSFIELD_MODEL(KFROM)%XLSWM=>XLSWM !Done in FIELDLIST_GOTO_MODEL !LSFIELD_MODEL(KFROM)%XLSTHM=>XLSTHM !Done in FIELDLIST_GOTO_MODEL !LSFIELD_MODEL(KFROM)%XLSRVM=>XLSRVM !Done in FIELDLIST_GOTO_MODEL +LSFIELD_MODEL(KFROM)%XLSZWSM=>XLSZWSM LSFIELD_MODEL(KFROM)%XLSUS=>XLSUS LSFIELD_MODEL(KFROM)%XLSVS=>XLSVS LSFIELD_MODEL(KFROM)%XLSWS=>XLSWS LSFIELD_MODEL(KFROM)%XLSTHS=>XLSTHS LSFIELD_MODEL(KFROM)%XLSRVS=>XLSRVS +LSFIELD_MODEL(KFROM)%XLSZWSS=>XLSZWSS !LSFIELD_MODEL(KFROM)%XLBXUM=>XLBXUM !Done in FIELDLIST_GOTO_MODEL !LSFIELD_MODEL(KFROM)%XLBXVM=>XLBXVM !Done in FIELDLIST_GOTO_MODEL !LSFIELD_MODEL(KFROM)%XLBXWM=>XLBXWM !Done in FIELDLIST_GOTO_MODEL @@ -199,11 +207,13 @@ LSFIELD_MODEL(KFROM)%NKLIN_LBYM=>NKLIN_LBYM !XLSWM=>LSFIELD_MODEL(KTO)%XLSWM !Done in FIELDLIST_GOTO_MODEL !XLSTHM=>LSFIELD_MODEL(KTO)%XLSTHM !Done in FIELDLIST_GOTO_MODEL !XLSRVM=>LSFIELD_MODEL(KTO)%XLSRVM !Done in FIELDLIST_GOTO_MODEL +XLSZWSM=>LSFIELD_MODEL(KTO)%XLSZWSM XLSUS=>LSFIELD_MODEL(KTO)%XLSUS XLSVS=>LSFIELD_MODEL(KTO)%XLSVS XLSWS=>LSFIELD_MODEL(KTO)%XLSWS XLSTHS=>LSFIELD_MODEL(KTO)%XLSTHS XLSRVS=>LSFIELD_MODEL(KTO)%XLSRVS +XLSZWSS=>LSFIELD_MODEL(KTO)%XLSZWSS !XLBXUM=>LSFIELD_MODEL(KTO)%XLBXUM !Done in FIELDLIST_GOTO_MODEL !XLBXVM=>LSFIELD_MODEL(KTO)%XLBXVM !Done in FIELDLIST_GOTO_MODEL !XLBXWM=>LSFIELD_MODEL(KTO)%XLBXWM !Done in FIELDLIST_GOTO_MODEL diff --git a/src/MNH/modd_nesting.f90 b/src/MNH/modd_nesting.f90 index 077e976819222b8ea362026da445b3113b47bda1..d644d0260864d317790838b253b26c75aca6bac0 100644 --- a/src/MNH/modd_nesting.f90 +++ b/src/MNH/modd_nesting.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1995-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ################### @@ -24,7 +24,7 @@ !! REFERENCE !! --------- !! Book2 of documentation of Meso-NH (module MODD_NESTING) -!! +!! !! AUTHOR !! ------ !! J.P. Lafore *Meteo France* @@ -32,8 +32,9 @@ !! MODIFICATIONS !! ------------- !! Original 18/08/95 -!! updated 29/07/96 (J.P. Lafore) MY_NAME(m) introduction +!! updated 29/07/96 (J.P. Lafore) MY_NAME(m) introduction !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 08/02/2019: add missing NULL association for pointers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -81,11 +82,11 @@ LOGICAL,SAVE, DIMENSION(JPMODELMAX) :: L2D_NEST ! Logical for 2D model LOGICAL,SAVE, DIMENSION(JPMODELMAX) :: LPACK_NEST ! Logical to compress 1D or 2D FM files of model m ! TYPE REAL_FIELD2D_ALL - REAL, DIMENSION(:,:), POINTER :: XFIELD2D + REAL, DIMENSION(:,:), POINTER :: XFIELD2D => NULL() END TYPE REAL_FIELD2D_ALL TYPE REAL_FIELD1D_ALL - REAL, DIMENSION(:), POINTER :: XFIELD1D + REAL, DIMENSION(:), POINTER :: XFIELD1D => NULL() END TYPE REAL_FIELD1D_ALL ! TYPE(REAL_FIELD2D_ALL), DIMENSION(JPMODELMAX), TARGET :: TXZS ! orography of model m diff --git a/src/MNH/modd_nudgingn.f90 b/src/MNH/modd_nudgingn.f90 index c4f4768bacd7ec1d74954871dcf574ef392c79bf..2bdadfb0f3c65b676df5f51f1b8f24c213e5dc7e 100644 --- a/src/MNH/modd_nudgingn.f90 +++ b/src/MNH/modd_nudgingn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2006-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 modd 2006/05/24 18:05:50 -!----------------------------------------------------------------- ! ################### MODULE MODD_NUDGING_n ! ################### @@ -32,6 +27,7 @@ !! MODIFICATIONS !! ------------- !! Original 15/05/06 +! P. Wautelet 08/02/2019: add missing NULL association for pointers !! !------------------------------------------------------------------------------- ! @@ -49,8 +45,8 @@ END TYPE NUDGING_t TYPE(NUDGING_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: NUDGING_MODEL -LOGICAL, POINTER :: LNUDGING -REAL, POINTER :: XTNUDGING +LOGICAL, POINTER :: LNUDGING => NULL() +REAL, POINTER :: XTNUDGING => NULL() CONTAINS diff --git a/src/MNH/modd_param_ecradn.f90 b/src/MNH/modd_param_ecradn.f90 index 988888427f73a72b906136430fc581646778aa82..a7bf0b344753be234bbed47285ed5880b1de3018 100644 --- a/src/MNH/modd_param_ecradn.f90 +++ b/src/MNH/modd_param_ecradn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2017-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 modd 2006/11/23 17:28:26 -!----------------------------------------------------------------- ! ######################## MODULE MODD_PARAM_ECRAD_n ! ######################## @@ -38,6 +33,7 @@ !! ------------- !! Original 29/05/2017 add ECRAD parameters as namelist !! Q. Libois +! P. Wautelet 08/02/2019: add missing NULL association for pointers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -213,7 +209,7 @@ LOGICAL, POINTER :: LAPPROXSWUPDATE=>NULL() LOGICAL, POINTER :: LAPPROXLWUPDATE=>NULL() CHARACTER (LEN=255), POINTER :: CDATADIR=>NULL() #ifdef MNH_ECRAD -type(config_type), pointer :: rad_config +type(config_type), pointer :: rad_config => NULL() #endif CONTAINS diff --git a/src/MNH/modd_radiationsn.f90 b/src/MNH/modd_radiationsn.f90 index 455a2bc04fccdd17251079516537718561c1c621..ec51e9e32cf0b37c8915903f16f156d690234f55 100644 --- a/src/MNH/modd_radiationsn.f90 +++ b/src/MNH/modd_radiationsn.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1995-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ######################## @@ -37,6 +37,7 @@ !! 03/03/03 (V. Masson) surface radiative schemes and !! multiple wavelengths for surface SW !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 08/02/2019: add missing NULL association for pointers !! !------------------------------------------------------------------------------- ! @@ -108,18 +109,18 @@ TYPE RADIATIONS_t ! REAL, DIMENSION(:,:,:), POINTER :: XSCA_ALB=>NULL() ! scattered albedo for each spectral band ! REAL, DIMENSION(:,:,:), POINTER :: XEMIS=>NULL() ! emissivity ! REAL, DIMENSION(:,:), POINTER :: XTSRAD=>NULL() ! surface temperature - REAL, DIMENSION(:,:), POINTER :: XSEA=>NULL() ! sea fraction + REAL, DIMENSION(:,:), POINTER :: XSEA=>NULL() ! sea fraction ! ! REAL, DIMENSION(:,:), POINTER :: XZENITH=>NULL() ! zenithal angle (radian from the vertical) ! REAL, DIMENSION(:,:), POINTER :: XAZIM=>NULL() ! azimuthal angle (radian from N, clockwise) - REAL, DIMENSION(:,:), POINTER :: XALBUV=>NULL() ! UV albedo - REAL, DIMENSION(:,:,:), POINTER :: XSWU !SW_UP - REAL, DIMENSION(:,:,:), POINTER :: XSWD !SW_DOWN - REAL, DIMENSION(:,:,:), POINTER :: XLWU !LW_UP - REAL, DIMENSION(:,:,:), POINTER :: XLWD !LW_DOWN - REAL, DIMENSION(:,:,:), POINTER :: XDTHRADSW !DTHRAD SW - REAL, DIMENSION(:,:,:), POINTER :: XDTHRADLW !DTHRAD LW - REAL, DIMENSION(:,:,:), POINTER :: XRADEFF !effective radius + REAL, DIMENSION(:,:), POINTER :: XALBUV=>NULL() ! UV albedo + REAL, DIMENSION(:,:,:), POINTER :: XSWU => NULL() ! SW_UP + REAL, DIMENSION(:,:,:), POINTER :: XSWD => NULL() ! SW_DOWN + REAL, DIMENSION(:,:,:), POINTER :: XLWU => NULL() ! LW_UP + REAL, DIMENSION(:,:,:), POINTER :: XLWD => NULL() ! LW_DOWN + REAL, DIMENSION(:,:,:), POINTER :: XDTHRADSW => NULL() ! DTHRAD SW + REAL, DIMENSION(:,:,:), POINTER :: XDTHRADLW => NULL() ! DTHRAD LW + REAL, DIMENSION(:,:,:), POINTER :: XRADEFF => NULL() ! effective radius ! END TYPE RADIATIONS_t diff --git a/src/MNH/modd_salt.f90 b/src/MNH/modd_salt.f90 index 01f908fe1e56873f0a8c7db97be309d50a94aa63..907b95672080fb541fd8a47c907051f9fd893687 100644 --- a/src/MNH/modd_salt.f90 +++ b/src/MNH/modd_salt.f90 @@ -35,6 +35,7 @@ !! ------------- !! !! 2014 P.Tulet modif XINIRADIUS_SLT and XN0MIN_SLT +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! USE MODD_PARAMETERS, ONLY: JPMODELMAX !!-------------------------------------------------------------------- @@ -42,51 +43,64 @@ USE MODD_PARAMETERS, ONLY: JPMODELMAX !! ------------ IMPLICIT NONE ! - +! ++ PIERRE / MARINE SSA DUST - MODIF ++ +LOGICAL :: LSLTMACC = .FALSE. ! switch to active pronostic sea salts from MACC LOGICAL :: LSALT = .FALSE. ! switch to active pronostic sea salts +LOGICAL :: LONLY = .FALSE. +LOGICAL :: LREAD_ONLY_HS_MACC = .FALSE. LOGICAL :: LSLTINIT = .FALSE. ! switch to initialize pronostic sea salts LOGICAL :: LSLTPRES = .FALSE. ! switch to know if pronostic salts exist LOGICAL,DIMENSION(JPMODELMAX) :: LDEPOS_SLT = .FALSE. ! switch to SLT wet depositon -INTEGER :: NMODE_SLT= 3 ! number of sea salt modes (max 3; default = 3) + +!INTEGER :: NMODE_SLT= 3 ! number of sea salt modes (max 3; default = 3) +INTEGER :: NMODE_SLT= 5 ! number of sea salt modes (max 5; default = 3) ! CHARACTER(LEN=9),DIMENSION(:),ALLOCATABLE :: CDESLTNAMES -CHARACTER(LEN=9),DIMENSION(6), PARAMETER :: YPDESLT_INI = & - (/'DESLTM31C','DESLTM32C','DESLTM33C' & - ,'DESLTM31R','DESLTM32R','DESLTM33R' /) -CHARACTER(LEN=6),DIMENSION(:),ALLOCATABLE :: CSALTNAMES -CHARACTER(LEN=6),DIMENSION(9), PARAMETER :: YPSALT_INI = & - (/'SLTM01','SLTM31','SLTM61' & - ,'SLTM02','SLTM32','SLTM62' & - ,'SLTM03','SLTM33','SLTM63' /) -! Set the order of the loops sorted by importance -!This means that if a user choses 1 mode it will have characteristics of mode 2 -!2 modes will be mode 2 & 3, whereas 3 modes will modes 1, 2 and 3 -INTEGER, DIMENSION(3),PARAMETER :: JPSALTORDER = (/3, 2, 1/) -! -REAL, ALLOCATABLE :: XSLTMSS(:,:,:) ! [kg/m3] total mass concentration of sea salt +CHARACTER(LEN=6),DIMENSION(:), ALLOCATABLE :: CSALTNAMES +CHARACTER(LEN=9),DIMENSION(10), PARAMETER :: YPDESLT_INI = & + (/'DESLTM31C','DESLTM32C','DESLTM33C','DESLTM34C', 'DESLTM35C', & + 'DESLTM31R','DESLTM32R','DESLTM33R', 'DESLTM34R','DESLTM35R' /) + +CHARACTER(LEN=6),DIMENSION(15), PARAMETER :: YPSALT_INI = & + (/'SLTM01','SLTM31','SLTM61',& + 'SLTM02','SLTM32','SLTM62',& + 'SLTM03','SLTM33','SLTM63',& + 'SLTM04','SLTM34','SLTM64',& + 'SLTM05','SLTM35','SLTM65' /) + +INTEGER, DIMENSION(5),PARAMETER :: JPSALTORDER = (/3, 2, 1, 5, 4/) + +!Test Thomas (definir rayons et sigma ici si on veut desactiver initialisation MACC) + +!REAL, DIMENSION(5) :: XINIRADIUS_SLT,XINISIG_SLT,XN0MIN_SLT + +!Initial dry number median radius (um) from Ova et al., 2014 +REAL,DIMENSION(5) :: XINIRADIUS_SLT= (/0.009, 0.021, 0.045, 0.115, 0.415/) +!Initial, standard deviation from Ova et al., 2014 +REAL,DIMENSION(5) :: XINISIG_SLT = (/ 1.37, 1.5, 1.42, 1.53, 1.85 /) +!Minimum allowed number concentration for any mode (#/m3) +REAL,DIMENSION(5) :: XN0MIN_SLT = (/1.e1 , 1.e1, 1.e1, 1., 1.e-4 /) + +!Test Thomas + +REAL, DIMENSION(:,:,:), ALLOCATABLE :: XSLTMSS ! [kg/m3] total mass concentration of sea salt ! ! aerosol lognormal parameterization -CHARACTER(LEN=4) :: CRGUNITS = 'MASS' ! type of log-normal geometric mean radius +CHARACTER(LEN=4) :: CRGUNITS = 'NUMB' ! type of log-normal geometric mean radius ! !given in namelist (mass on number) ! LOGICAL :: LRGFIX_SLT = .FALSE. ! switch to fix RG (sedimentation) LOGICAL :: LVARSIG_SLT = .FALSE. ! switch to active pronostic dispersion for all modes LOGICAL :: LSEDIMSALT = .FALSE. ! switch to active aerosol sedimentation REAL :: XSIGMIN_SLT = 1.20 ! minimum dispersion value for sea salt mode +!REAL :: XSIGMIN_SLT = 0. ! minimum dispersion value for sea salt mode REAL :: XSIGMAX_SLT = 3.60 ! maximum dispersion value for sea salt mode REAL :: XCOEFRADMAX_SLT = 10. ! maximum increasement for Rg mode sea salt -REAL :: XCOEFRADMIN_SLT = 0.1 ! maximum decreasement for Rg mode sea salt -! +REAL :: XCOEFRADMIN_SLT = 0.1 ! minimum decreasement for Rg mode sea salt +!REAL :: XCOEFRADMIN_SLT = 0. ! minimum decreasement for Rg mode sea salt -!Initial dry number median radius (um) from Vignati et al., 2001 -!REAL, DIMENSION(3) :: XINIRADIUS_SLT= (/0.2, 2., 12./) -!Initial, standard deviation from Vignati et al., 2001 -!REAL, DIMENSION(3) :: XINISIG_SLT = (/1.9, 2., 3./) -!Initial dry number median radius (um) from Schultz et al., 2004 -REAL, DIMENSION(3) :: XINIRADIUS_SLT= 0.5*(/0.28, 2.25, 15.32/) -!Initial, standard deviation from Schultz et al., 2004 -REAL, DIMENSION(3) :: XINISIG_SLT = (/1.9, 2., 2./) -!Minimum allowed number concentration for any mode (#/m3) -REAL, DIMENSION(3) :: XN0MIN_SLT = (/1.e1 , 1. , 1.e-4 /) + +! +! -- PIERRE / MARINE SSA DUST - MODIF -- ! END MODULE MODD_SALT diff --git a/src/MNH/modd_spawn.f90 b/src/MNH/modd_spawn.f90 index 41f83c8a1d5ede0151a11e0ca4c1329dd1a40150..8d432e588f5fbce395ee2385fb50883f8eb5f41e 100644 --- a/src/MNH/modd_spawn.f90 +++ b/src/MNH/modd_spawn.f90 @@ -33,6 +33,7 @@ !! Original 12/07/99 !! Modification 08/04/04 (G.Jaubert) Spawning 1 option !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -79,12 +80,14 @@ REAL,DIMENSION(:,:,:,:),SAVE,POINTER :: XRT1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XUT1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XVT1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XWT1 => NULL() +REAL,DIMENSION(:,:), SAVE,POINTER :: XZWS1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XSRCT1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XSIGS1 => NULL() TYPE(DATE_TIME), SAVE,POINTER :: TDTCUR1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSUM1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSVM1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSWM1 => NULL() +REAL,DIMENSION(:,:) ,SAVE,POINTER :: XLSZWSM1=> NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSTHM1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSRVM1 => NULL() ! diff --git a/src/MNH/modd_sub_modeln.f90 b/src/MNH/modd_sub_modeln.f90 index 50cd6ec7b1c58144a357c9c1d343ef56eff62093..48bfede318410cd24a6a6431857a57c50da89ed0 100644 --- a/src/MNH/modd_sub_modeln.f90 +++ b/src/MNH/modd_sub_modeln.f90 @@ -1,11 +1,12 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! Modifications: ! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! J. Escobar : 18/06/2018 , bug compile R*4 => real*8 pointer XT_VISC +! P. Wautelet 08/02/2019: add missing NULL association for pointers !----------------------------------------------------------------- ! ################# MODULE MODD_SUB_MODEL_n @@ -17,19 +18,19 @@ USE MODD_PARAMETERS, ONLY: JPMODELMAX IMPLICIT NONE TYPE SUB_MODEL_t - TYPE(LIST_ll), POINTER :: TZFIELDS_ll,TZLSFIELD_ll,TZFIELDM_ll + TYPE(LIST_ll), POINTER :: TZFIELDS_ll => NULL(), TZLSFIELD_ll => NULL(), TZFIELDM_ll => NULL() ! list of fields to update halo - TYPE(HALO2LIST_ll), POINTER :: TZHALO2M_ll, TZLSHALO2_ll + TYPE(HALO2LIST_ll), POINTER :: TZHALO2M_ll => NULL(), TZLSHALO2_ll => NULL() ! list of fields for the halo updates (2nd layer) ! halo lists and updates for 4th order schemes ! list of fields to update halo at time t - TYPE(LIST_ll), POINTER :: TZFIELDT_ll ! for meteorological scalars - TYPE(LIST_ll), POINTER :: TZFIELDMT_ll ! for momentum - TYPE(LIST_ll), POINTER :: TZFIELDSC_ll ! for tracer scalars + TYPE(LIST_ll), POINTER :: TZFIELDT_ll => NULL() ! for meteorological scalars + TYPE(LIST_ll), POINTER :: TZFIELDMT_ll => NULL() ! for momentum + TYPE(LIST_ll), POINTER :: TZFIELDSC_ll => NULL() ! for tracer scalars ! list of fields for the halo updates (2nd layer) at time t - TYPE(HALO2LIST_ll), POINTER :: TZHALO2T_ll - TYPE(HALO2LIST_ll), POINTER :: TZHALO2MT_ll - TYPE(HALO2LIST_ll), POINTER :: TZHALO2SC_ll + TYPE(HALO2LIST_ll), POINTER :: TZHALO2T_ll => NULL() + TYPE(HALO2LIST_ll), POINTER :: TZHALO2MT_ll => NULL() + TYPE(HALO2LIST_ll), POINTER :: TZHALO2SC_ll => NULL() INTEGER :: IBAK, IOUT ! number of the backup / output REAL*8,DIMENSION(2) :: XT_START REAL*8,DIMENSION(2) :: XT_STORE,XT_BOUND,XT_GUESS diff --git a/src/MNH/modd_timez.f90 b/src/MNH/modd_timez.f90 index bf8bcbd11bd9acbed926181f9113595557bb62bc..9c9235ed4da7b7779e6ac6cbd3007a64e2b62dff 100644 --- a/src/MNH/modd_timez.f90 +++ b/src/MNH/modd_timez.f90 @@ -1,7 +1,10 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Modifications +! P. Wautelet 08/02/2019: add missing NULL association for pointers MODULE MODD_TIMEZ USE MODD_PARAMETERS, ONLY: JPMODELMAX @@ -26,7 +29,7 @@ MODULE MODD_TIMEZ REAL*8,DIMENSION(2) :: T_WRIT3D_WRIT = 0.0 REAL*8,DIMENSION(2) :: T_WRIT3D_WAIT = 0.0 REAL*8,DIMENSION(2) :: T_WRIT3D_ALL = 0.0 - + REAL*8,DIMENSION(2) :: T_WRIT2D_GATH = 0.0 REAL*8,DIMENSION(2) :: T_WRIT2D_WRIT = 0.0 REAL*8,DIMENSION(2) :: T_WRIT2D_ALL = 0.0 @@ -51,7 +54,7 @@ MODULE MODD_TIMEZ TYPE(SUB_TIMEZ_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: SUB_TIMEZN -TYPE(SUB_TIMEZ_t), POINTER :: TIMEZ +TYPE(SUB_TIMEZ_t), POINTER :: TIMEZ => NULL() CONTAINS diff --git a/src/MNH/mode_salt_psd.f90 b/src/MNH/mode_salt_psd.f90 index e361c1dfac7aa5e7831247959f959777e4d6eec4..dc5a8611ef01cbc1505633c4b5a97c2a9848e699 100644 --- a/src/MNH/mode_salt_psd.f90 +++ b/src/MNH/mode_salt_psd.f90 @@ -23,9 +23,14 @@ !! !! MODIFICATIONS !! ------------- +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !------------------------------------------------------------------------------- ! +! ++ JORIS DEBUG ++ +USE MODD_CONF, ONLY : NVERB +! -- JORIS DEBUG -- +! USE MODD_CSTS_SALT !Constants which are important for sea salt calculations USE MODD_SALT !Dust module which contains even more constants USE MODD_CST, ONLY : & @@ -137,6 +142,11 @@ ALLOCATE (ZINIRADIUS(NMODE_SLT)) ZSV(:,:,:,:) = MAX(PSVT(:,:,:,:), XMNH_TINY) +! ++ JORIS DBG ++ +ZRG(:,:,:)= XMNH_TINY +ZM(:,:,:,:)= XMNH_TINY +! -- JORIS DBG -- + DO JN=1,NMODE_SLT IMODEIDX = JPSALTORDER(JN) !Calculations here are for one mode only @@ -235,6 +245,10 @@ DO JN=1,NMODE_SLT * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) ZM(:,:,:,NM3(JN)) = MAX(ZM(:,:,:,NM3(JN)), ZMMIN(NM3(JN))) +!Modif salt/dust 5.1. beg + PSVT(:,:,:,JN) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) +!Modif salt/dust 5.1. end ZM(:,:,:,NM0(JN))= ZM(:,:,:,NM3(JN))/& ((ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(XINISIG_SLT(JPSALTORDER(JN)))**2)) @@ -280,6 +294,21 @@ DO JN=1,NMODE_SLT END IF ! !Get number median radius (eqn. 7 in Orilam manuscript) + ! ++ JORIS DBG ++ + IF (NVERB ==15) THEN + WRITE(*,*) 'SHAPE(ZM) =', SHAPE(ZM) + WRITE(*,*) 'MINVAL(ZM), MAXVAL(ZM) =', MINVAL(ZM), MAXVAL(ZM) + WRITE(*,*) 'MINLOC(ZM), MAXLOC(ZM) =', MINLOC(ZM), MAXLOC(ZM) + WRITE(*,*) 'SHAPE(ZRG) =', SHAPE(ZRG) + WRITE(*,*) 'MINVAL(ZRG), MAXVAL(ZRG) =', MINVAL(ZRG), MAXVAL(ZRG) + WRITE(*,*) 'MINLOC(ZRG), MAXLOC(ZRG) =', MINLOC(ZRG), MAXLOC(ZRG) + WRITE(*,*) 'XSIXTH_SALT =', XSIXTH_SALT + WRITE(*,*) 'JN =', JN + WRITE(*,*) 'NM0 =', NM0 + WRITE(*,*) 'NM3 =', NM3 + WRITE(*,*) 'NM6 =', NM6 + ENDIF + ! -- JORIS DBG -- ZRG(:,:,:)= & ( & ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN)) & @@ -414,7 +443,9 @@ END SUBROUTINE PPP2SALT ! ! PSVT need to be positive - PSVT(:,:,:,:) = MAX(PSVT(:,:,:,:), XMNH_TINY) +!Modif salt/dust 5.1. beg +! PSVT(:,:,:,:) = MAX(PSVT(:,:,:,:), XMNH_TINY) +!Modif salt/dust 5.1. end DO JN=1,NMODE_SLT IMODEIDX = JPSALTORDER(JN) @@ -629,8 +660,10 @@ ALLOCATE (ZSIGMA(SIZE(PSVT,1))) ALLOCATE (ZRG(SIZE(PSVT,1))) ALLOCATE (ZSV(SIZE(PSVT,1), SIZE(PSVT,2))) ALLOCATE (ZINIRADIUS(NMODE_SLT)) - + +!Modif salt/dust 5.1. beg ZSV(:,:) = MAX(PSVT(:,:), XMNH_TINY) +!Modif salt/dust 5.1. end DO JN=1,NMODE_SLT IMODEIDX = JPSALTORDER(JN) diff --git a/src/MNH/mode_salt_psd_wet.f90 b/src/MNH/mode_salt_psd_wet.f90 new file mode 100644 index 0000000000000000000000000000000000000000..cb5af52f838a83cd4997f9fad234eb1919262d24 --- /dev/null +++ b/src/MNH/mode_salt_psd_wet.f90 @@ -0,0 +1,926 @@ +!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence +!ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!ORILAM_LIC for details. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/Attic/mode_salt_psd.f90,v $ $Revision: 1.1.2.1.2.1.2.1.2.1 $ $Date: 2013/07/12 13:55:08 $ +!----------------------------------------------------------------- +!! ######################## + MODULE MODE_SALT_PSD_WET +!! ######################## +!! +!! PURPOSE +!! ------- +!! MODULE SALT PSD (Particle Size Distribution) +!! Purpose: Contains subroutines to convert from transported variables (ppp) +!! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n} +!! +!! AUTHOR +!! ------ +!! Alf Grini (CNRM/GMEI) +!! +!! MODIFICATIONS +!! ------------- +!! M. Claeys - (CNRM-GMEI) 2015 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +!------------------------------------------------------------------------------- +! +USE MODD_CSTS_SALT !Constants which are important for sea salt calculations +USE MODD_SALT !Dust module which contains even more constants +USE MODD_CST, ONLY : & + XPI & !Definition of pi + ,XBOLTZ & ! Boltzman constant + ,XAVOGADRO & ![molec/mol] avogadros number + ,XG & ! Gravity constant + ,XP00 & ! Reference pressure + ,XMD & ![kg/mol] molar weight of air + ,XRD & ! Gaz constant for dry air + ,XCPD & ! Cpd (dry air) + ,XRHOLW & ! Densité de l'eau + ,XMV & ! Molar weight of water + ,XALPI & + ,XBETAI & + ,XGAMI & + ,XTT +USE MODD_CST, ONLY : XMNH_TINY +USE MODE_THERMO ! Pour calcul de la pression de vapeur saturante +USE MODD_PARAM_n, ONLY : CCLOUD + + +! +IMPLICIT NONE +! +CONTAINS +! +!! ############################################################ + SUBROUTINE PPP2SALT_WET( & + PSVT & !I [ppp] input scalar variables (moment of distribution) + , PRHODREF & !I [kg/m3] density of air + , PPABST & !I Pression + , PTHT & !I Potential temperature + , PRT & !I Large scale vapor mixing ratio + , PSIG3D & !O [-] standard deviation of aerosol distribution + , PRG3D & !O [um] number median wet radius of aerosol distribution + , PN3D & !O [#/m3] number concentration of aerosols + , PMASS3D & !O [kg/m3]wet mass concentration of aerosol + , PM3D & !O aerosols moments 0, 3 and 6 + , PDENSITY_WET & !O [g/m2] density of wet aerosol (water + salt) + ) +!! ############################################################ +! +!! +!! PURPOSE +!! ------- +!! Translate the three moments M0, M3 and M6 given in ppp into +!! Values which can be understood more easily (R, sigma, N, M) +!! +!! Calcul the wet radius of the particles, using RH and Gerber (1985) relation +!! The mass of the aerosols is calculated using the new radius and the +!density of water and salt +!! +!! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES +!! ------- +!! CALL PPP2AEROS(PSVT, PRHODREF, PSIG3D=SIGVAR, & +!! PRG3D=RVAR, PN3D=NVAR, PM3D=MASSVAR) +!! +!! REFERENCE +!! --------- +!! none +!! +!! AUTHOR +!! ------ +!! Pierre TULET (LA) +!! +!! MODIFICATIONS +!! ------------- +!! 2005 Alf Grini (CNRM) +!! 2006 Jean-Pierre Chaboureau (LA) +!! 2015 Marine Claeys (CNRM) +!! EXTERNAL +!! -------- +!! None +!! + IMPLICIT NONE +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !I [ppp] first moment +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST !I Pression +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT !I Potential temperature +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT !I Large scale vapor mixing ratio + +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PSIG3D !O [-] standard deviation +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PRG3D !O [um] number median radius +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PN3D !O [#/m3] number concentration +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PMASS3D !O [kg_{aer}/m3] wet mass concentration +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PM3D !O aerosols moments +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PDENSITY_WET !O Density of wet aerosol (water + salt) +! +! +!* 0.2 declarations local variables +! +REAL :: ZRHOI ! [kg/m3] density of aerosol +REAL :: ZRHOLW ! [kg/m3] density of water +REAL :: ZMI ! [kg/mol] molar weight of aerosol +REAL :: ZMV ! [kg/mol] molar weight of water +REAL :: ZRGMIN ! [um] minimum radius accepted +REAL :: ZSIGMIN ! minimum standard deviation accepted + +REAL, PARAMETER :: C1 = 0.7674 +REAL, PARAMETER :: C2 = 3.079 +REAL, PARAMETER :: C3 = 2.572E-11 +REAL, PARAMETER :: C4 = -1.424 + +REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZM ! [aerosol units] local array which goes to output later +REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV ! [sea salts moment concentration] +REAL,DIMENSION(:), ALLOCATABLE :: ZMMIN ! [aerosol units] minimum values for N, sigma, M +INTEGER,DIMENSION(:), ALLOCATABLE :: NM0 ! [idx] index for Mode 0 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM3 ! [idx] indexes for Mode 3 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM6 ! [idx] indexes for Mode 6 in passed variables +REAL,DIMENSION(:), ALLOCATABLE :: ZINIRADIUS ! initial mean radius +INTEGER :: JN,IMODEIDX,JJ ! [idx] loop counters + +REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3), NMODE_SLT) :: ZMASS3D, & + ZMASS3D_SLT ![kg/m3] mass of one sea salt mode + +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZTEMP, ZREHU, ZREHU_tmp +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3), NMODE_SLT) :: ZDENSITY_WET ! [g/m2] Aerosol wet density (salt + water) +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZSIGMA ! [-] standard deviation +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZRG, ZRG_WET ! [um] number median radius, and nuber median wet radius +! +!------------------------------------------------------------------------------- +! + +!+ Marine +! Calcul de RH +! Pris dans write_lfi_for_diag pour le calcul de RH +ZTEMP(:,:,:) = PTHT(:,:,:) * (PPABST(:,:,:) / XP00)**(XRD/XCPD) + +ZREHU_tmp(:,:,:) = SM_FOES(ZTEMP(:,:,:)) ! SM_FOES = to compute saturation vapor pressure +ZREHU_tmp(:,:,:) = (XMV / XMD) * ZREHU_tmp(:,:,:) / (PPABST(:,:,:) - ZREHU_tmp(:,:,:)) +!XMD,XMV ! Molar mass of dry air and molar mass of vapor, PPABST: pression + +ZREHU(:,:,:) = PRT(:,:,:,1) / ZREHU_tmp(:,:,:) + +IF (CCLOUD(1:3) =='ICE' .OR. CCLOUD =='C3R5') THEN + WHERE ( ZTEMP(:,:,:) < XTT) ! XTT : Triple point temperature + ZREHU_tmp(:,:,:) = EXP( XALPI - XBETAI/ZTEMP(:,:,:) & ! XALPI,XBETAI,XGAMI ! Constants for saturation vapor pressure + - XGAMI*ALOG(ZTEMP(:,:,:)) ) !saturation over ice + ZREHU_tmp(:,:,:) = (XMV / XMD) * ZREHU_tmp(:,:,:) / (PPABST(:,:,:) - ZREHU_tmp(:,:,:)) + ZREHU(:,:,:) = PRT(:,:,:,1) / ZREHU_tmp(:,:,:) + END WHERE +END IF + +ZREHU(:,:,:) = MIN(MAX(ZREHU(:,:,:), 0.02),0.95) + + +! 1.1 initialisation +! +!Calculations here are for one mode only +! +ALLOCATE (NM0(NMODE_SLT)) +ALLOCATE (NM3(NMODE_SLT)) +ALLOCATE (NM6(NMODE_SLT)) +ALLOCATE (ZM(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3), NMODE_SLT*3)) +ALLOCATE (ZMMIN(NMODE_SLT*3)) +ALLOCATE (ZSV(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3), SIZE(PSVT,4))) +ALLOCATE (ZINIRADIUS(NMODE_SLT)) + +ZSV(:,:,:,:) = MAX(PSVT(:,:,:,:), XMNH_TINY) + +DO JN = 1, NMODE_SLT + IMODEIDX = JPSALTORDER(JN) + !Calculations here are for one mode only + IF (CRGUNITS == "MASS") THEN + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) * EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) + ELSE + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) + END IF + + !Set counter for number, M3 and M6 + NM0(JN) = 1 + (JN - 1) * 3 + NM3(JN) = 2 + (JN - 1) * 3 + NM6(JN) = 3 + (JN - 1) * 3 + !Get minimum values possible + ZMMIN(NM0(JN)) = XN0MIN_SLT(IMODEIDX) + ZRGMIN = ZINIRADIUS(JN) + IF (LVARSIG_SLT) THEN + ZSIGMIN = XSIGMIN_SLT + ELSE + ZSIGMIN = XINISIG_SLT(IMODEIDX) + ENDIF + ZMMIN(NM3(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**3)*EXP(4.5 * LOG(ZSIGMIN)**2) + ZMMIN(NM6(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**6)*EXP(18. * LOG(ZSIGMIN)**2) +END DO +! +!Set density of aerosol, here sea salt (kg/m3) and water +ZRHOI = XDENSITY_SALT +ZRHOLW = XRHOLW +!Set molecular weight of sea salt and water!NOTE THAT THIS IS NOW IN KG +ZMI = XMOLARWEIGHT_SALT +ZMV = XMV +! +! +DO JN = 1, NMODE_SLT + ! + IF (LVARSIG_SLT) THEN ! give M6 (case of variable standard deviation) + ! + !Get number concentration (#/molec_{air}==>#/m3) + ZM(:,:,:,NM0(JN))= & + ZSV(:,:,:,1+(JN-1)*3) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * PRHODREF(:,:,:) !==>#/m3 + ! + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,:,:,NM3(JN)) = & + ZSV(:,:,:,2+(JN-1)*3) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + !Limit mass concentration to minimum value + ZM(:,:,:,NM3(JN)) = MAX(ZM(:,:,:,NM3(JN)), ZMMIN(NM3(JN))) + ! + ZM(:,:,:,NM6(JN)) = ZSV(:,:,:,3+(JN-1)*3) & !um6/molec_{air}*(cm3/m3) + * 1.d-6 & !==> um6/molec_{air} + * XAVOGADRO & !==> um6/mole_{air} + / XMD & !==> um6/kg_{air} + * PRHODREF(:,:,:) !==> um6/m3_{air} + !Limit m6 concentration to minimum value + ZM(:,:,:,NM6(JN)) = MAX(ZM(:,:,:,NM6(JN)), ZMMIN(NM6(JN))) + ! + !Get sigma (only if sigma is allowed to vary) + !Get intermediate values for sigma M3^2/(M0*M6) (ORILAM paper, eqn 8) + ZSIGMA(:,:,:)=ZM(:,:,:,NM3(JN))**2/(ZM(:,:,:,NM0(JN))*ZM(:,:,:,NM6(JN))) + !Limit the intermediate value, can not be larger than 1 + ZSIGMA(:,:,:)=MIN(1-1E-10,ZSIGMA(:,:,:)) + !Limit the value for intermediate, can not be smaller than 0 + ZSIGMA(:,:,:)=MAX(1E-10,ZSIGMA(:,:,:)) + !Calculate log(sigma) + ZSIGMA(:,:,:)= LOG(ZSIGMA(:,:,:)) + !Finally get the real sigma the negative sign is because of + !The way the equation is written (M3^2/(M0*M6)) instead of (M0*M6)/M3^3 + ZSIGMA(:,:,:)= EXP(1./3.*SQRT(-ZSIGMA(:,:,:))) + !Limit the value to reasonable ones + ZSIGMA(:,:,:) = MAX( XSIGMIN_SLT, MIN( XSIGMAX_SLT, ZSIGMA(:,:,:) ) ) + + ! + !Put back M6 so that it fits the sigma which is possibly modified above + !The following makes M6 consistent with N, R, SIGMA + ZM(:,:,:,NM6(JN)) = ZM(:,:,:,NM0(JN)) & + * ( (ZM(:,:,:,NM3(JN))/ZM(:,:,:,NM0(JN)))**(1./3.) & + * exp(-(3./2.)*log(ZSIGMA(:,:,:))**2))**6 & + * exp(18.*log(ZSIGMA(:,:,:))**2) + + ELSE ! compute M6 from M0, M3 and SIGMA + ! + ZSIGMA(:,:,:) = XINISIG_SLT(JPSALTORDER(JN)) + IF (LRGFIX_SLT) THEN + + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,:,:,NM3(JN)) = & + ZSV(:,:,:,JN) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + + ZM(:,:,:,NM3(JN)) = MAX(ZM(:,:,:,NM3(JN)), ZMMIN(NM3(JN))) + PSVT(:,:,:,JN) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + + ZM(:,:,:,NM0(JN))= ZM(:,:,:,NM3(JN))/& + ((ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(XINISIG_SLT(JPSALTORDER(JN)))**2)) + + + + ELSE + + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,:,:,NM3(JN)) = & + ZSV(:,:,:,2+(JN-1)*2) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + + + !Get number concentration (#/molec_{air}==>#/m3) + ZM(:,:,:,NM0(JN))= & + ZSV(:,:,:,1+(JN-1)*2) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * PRHODREF(:,:,:) !==>#/m3 + + ! Limit concentration to minimum values + WHERE ((ZM(:,:,:,NM0(JN)) < ZMMIN(NM0(JN)) ).OR. & + (ZM(:,:,:,NM3(JN)) < ZMMIN(NM3(JN)) )) + ZM(:,:,:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,:,:,NM3(JN)) = ZMMIN(NM3(JN)) + PSVT(:,:,:,1+(JN-1)*2) = ZM(:,:,:,NM0(JN)) * XMD / & + (XAVOGADRO * PRHODREF(:,:,:) ) + PSVT(:,:,:,2+(JN-1)*2) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + ENDWHERE + END IF + + ZM(:,:,:,NM6(JN)) = ZM(:,:,:,NM0(JN)) & + * ( (ZM(:,:,:,NM3(JN))/ZM(:,:,:,NM0(JN)))**(1./3.) & + * exp(-(3./2.)*log(ZSIGMA(:,:,:))**2))**6 & + * exp(18.*log(ZSIGMA(:,:,:))**2) + + ! + END IF + ! + !Get number median radius (eqn. 7 in Orilam manuscript) + ZRG(:,:,:)= & + ( & + ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN)) & + /(ZM(:,:,:,NM6(JN))*ZM(:,:,:,NM0(JN))*ZM(:,:,:,NM0(JN))*ZM(:,:,:,NM0(JN))) & + ) & + ** XSIXTH_SALT + + + !ZRG(:,:,:)=MIN(ZRG(:,:,:),ZINIRADIUS(JN)) + !Give the sigma-values to the passed array + IF(PRESENT(PSIG3D)) PSIG3D(:,:,:,JN) = ZSIGMA(:,:,:) + ! + !Set the number concentrations in the passed array + IF(PRESENT(PN3D)) PN3D(:,:,:,JN) = ZM(:,:,:,NM0(JN)) + ! +! !Get the number median radius +! IF(PRESENT(PRG3D)) PRG3D(:,:,:,JN)= ZRG(:,:,:) + ! + ! + !+ Marine +!!!!!!!!!!! Wet radius calculus + +!Test pour Marine + + ZRG_WET(:,:,:) = C1 * (ZRG(:,:,:)*1.d-4)**C2 ! Pour le calcul, ZRG en cm! (d'où 1.d-4) + +!+ Marine test + + ZRG_WET(:,:,:) = ZRG_WET(:,:,:) / (C3 * ((ZRG(:,:,:)*1.d-4)**C4) - LOG10(ZREHU(:,:,:))) + ZRG_WET(:,:,:) = ZRG_WET(:,:,:) + (ZRG(:,:,:)*1.d-4)**3 + ZRG_WET(:,:,:) = ( ZRG_WET(:,:,:)**(1./3) )*1.d4 ! *1.d4 pour repasser de cm à micromètres + + !Get the number median radius + IF(PRESENT(PRG3D)) PRG3D(:,:,:,JN) = ZRG_WET(:,:,:) + + + +! Wet density calcul + ZDENSITY_WET(:,:,:,JN)=(ZRHOI * ZRG(:,:,:) * ZRG(:,:,:) * ZRG(:,:,:) + & + ZRHOLW * (ZRG_WET(:,:,:) * ZRG_WET(:,:,:) * ZRG_WET(:,:,:)- & + ZRG(:,:,:) * ZRG(:,:,:) * ZRG(:,:,:))) & + / (ZRG_WET(:,:,:) * ZRG_WET(:,:,:) * ZRG_WET(:,:,:)) + +!Wet mass + ZMASS3D(:,:,:,JN)= & + ZM(:,:,:,NM0(JN)) & !#/m^3_{air} + * XPI*4./3. & + * ZDENSITY_WET(:,:,:,JN) & !==>kg/m^3_{aeros}/m^3_{air} + * ZRG_WET(:,:,:) * ZRG_WET(:,:,:) * ZRG_WET(:,:,:) & + * XUM3TOM3_SALT & !==>kg/m^3_{air} + * exp(4.5*log(ZSIGMA(:,:,:))*log(ZSIGMA(:,:,:))) + +! Salt Mass + ZMASS3D_SLT(:,:,:,JN)= & + ZM(:,:,:,NM0(JN)) & !#/m^3_{air} + * XPI*4./3. & + * ZRHOI & !==>kg/m^3_{aeros}/m^3_{air} + * ZRG(:,:,:) * ZRG(:,:,:) * ZRG(:,:,:) & + * XUM3TOM3_SALT & !==>kg/m^3_{air} + * exp(4.5*log(ZSIGMA(:,:,:))*log(ZSIGMA(:,:,:))) + + IF(PRESENT(PMASS3D)) THEN + PMASS3D(:,:,:,JN)= ZMASS3D(:,:,:,JN) + ENDIF + + IF(PRESENT(PDENSITY_WET)) THEN + PDENSITY_WET(:,:,:,JN) = ZDENSITY_WET(:,:,:,JN) + ENDIF +! +END DO !Loop on modes +! +IF(PRESENT(PM3D)) PM3D(:,:,:,:) = ZM(:,:,:,:) +! +DEALLOCATE(ZINIRADIUS) +DEALLOCATE(ZSV) +DEALLOCATE(ZMMIN) +DEALLOCATE(ZM) +DEALLOCATE(NM6) +DEALLOCATE(NM3) +DEALLOCATE(NM0) + +!+ Marine + +END SUBROUTINE PPP2SALT_WET + +!! ############################################################ + SUBROUTINE SALT2PPP( & + PSVT & !IO [ppp] input scalar variables (moment of distribution) + , PRHODREF & !I [kg/m3] density of air + , PSIG3D & !I [-] standard deviation of aerosol distribution + , PRG3D & !I [um] number median diameter of aerosol distribution + ) +!! ############################################################ +! +!! +!! PURPOSE +!! ------- +!! Translate the sea salt Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppp +!! +!! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES +!! ------- +!! CALL PPP2AEROS(PSVT, PRHODREF, PSIG3D=SIGVAR, & +!! PRG3D=RVAR, PN3D=NVAR) +!! +!! REFERENCE +!! --------- +!! none +!! +!! AUTHOR +!! ------ +!! Pierre TULET (LA) +!! +!! MODIFICATIONS +!! ------------- +!! Alf Grini (CNRM) +!! +!! EXTERNAL +!! -------- +!! None +!! + IMPLICIT NONE +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.1 declarations of arguments +! + !INPUT + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSIG3D !O [-] standard deviation + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRG3D !O [um] number median diameter + + !OUTPUT + REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !IO [#/molec_{air}] first moment + !IO [molec_{aer}/molec_{air} 3rd moment + !IO [um6/molec_{air}*(cm3/m3)] 6th moment +! +! +!* 0.2 declarations local variables +! + REAL :: ZRHOI ! [kg/m3] density of aerosol + REAL :: ZMI ! [kg/mol] molar weight of aerosol + REAL :: ZRGMIN ! [um] minimum radius accepted + REAL :: ZSIGMIN ! minimum standard deviation accepted + REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZM ! [aerosol units] local array which goes to output later + REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZSIGMA ! aersol standard deviation + REAL,DIMENSION(:), ALLOCATABLE :: ZMMIN ! [aerosol units] minimum values for N, sigma, M + REAL,DIMENSION(:), ALLOCATABLE :: ZINIRADIUS ! initial mean radius + INTEGER,DIMENSION(:), ALLOCATABLE :: NM0 ! [idx] index for Mode 0 in passed variables + INTEGER,DIMENSION(:), ALLOCATABLE :: NM3 ! [idx] indexes for Mode 3 in passed variables + INTEGER,DIMENSION(:), ALLOCATABLE :: NM6 ! [idx] indexes for Mode 6 in passed variables + INTEGER :: JJ, JN ! [idx] loop counters + INTEGER :: IMODEIDX +! +!------------------------------------------------------------------------------- +! +! 1.1 initialisation + + + ALLOCATE (NM0(NMODE_SLT)) + ALLOCATE (NM3(NMODE_SLT)) + ALLOCATE (NM6(NMODE_SLT)) + ALLOCATE (ZINIRADIUS(NMODE_SLT)) + ALLOCATE (ZMMIN(NMODE_SLT*3)) + ALLOCATE (ZM(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3), NMODE_SLT*3)) + ALLOCATE (ZSIGMA(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3))) + + !Set density of aerosol, here sea salt (kg/m3) + ZRHOI = XDENSITY_SALT + !Set molecular weight of sea salt !NOTE THAT THIS IS NOW IN KG + ZMI = XMOLARWEIGHT_SALT +! + + ! PSVT need to be positive +! PSVT(:,:,:,:) = MAX(PSVT(:,:,:,:), XMNH_TINY) + + DO JN=1,NMODE_SLT + IMODEIDX = JPSALTORDER(JN) + !Calculations here are for one mode only + IF (CRGUNITS=="MASS") THEN + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) * EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) + ELSE + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) + END IF + + !Set counter for number, M3 and M6 + NM0(JN) = 1+(JN-1)*3 + NM3(JN) = 2+(JN-1)*3 + NM6(JN) = 3+(JN-1)*3 + + !Get minimum values possible + ZMMIN(NM0(JN)) = XN0MIN_SLT(IMODEIDX) + ZRGMIN = ZINIRADIUS(JN) + IF (LVARSIG_SLT) THEN + ZSIGMIN = XSIGMIN_SLT + ELSE + ZSIGMIN = XINISIG_SLT(IMODEIDX) + ENDIF + ZMMIN(NM3(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**3)*EXP(4.5 * LOG(ZSIGMIN)**2) + ZMMIN(NM6(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**6)*EXP(18. * LOG(ZSIGMIN)**2) + END DO + + !Set density of aerosol, here sea salt (kg/m3) + ZRHOI = XDENSITY_SALT + !Set molecular weight of sea salt !NOTE THAT THIS IS NOW IN KG + ZMI = XMOLARWEIGHT_SALT +! + DO JN=1,NMODE_SLT + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + IF (LVARSIG_SLT) THEN + ZM(:,:,:,NM3(JN)) = & + PSVT(:,:,:,2+(JN-1)*3) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + ELSE + IF ((LRGFIX_SLT)) THEN + ZM(:,:,:,NM3(JN)) = & + PSVT(:,:,:,JN) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + ZM(:,:,:,NM3(JN)) = MAX(ZM(:,:,:,NM3(JN)), ZMMIN(NM3(JN))) + ELSE + ZM(:,:,:,NM3(JN)) = & + PSVT(:,:,:,2+(JN-1)*2) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + END IF + END IF +! calculate moment 0 from dispersion and mean radius + ZM(:,:,:,NM0(JN))= ZM(:,:,:,NM3(JN))/& + ((PRG3D(:,:,:,JN)**3)*EXP(4.5 * LOG(PSIG3D(:,:,:,JN))**2)) + +! calculate moment 6 from dispersion and mean radius + ZM(:,:,:,NM6(JN)) = ZM(:,:,:,NM0(JN)) * (PRG3D(:,:,:,JN)**6) * & + EXP(18 *(LOG(PSIG3D(:,:,:,JN)))**2) + + IF (LVARSIG_SLT) THEN + WHERE ((ZM(:,:,:,NM0(JN)) .LT. ZMMIN(NM0(JN))).OR.& + (ZM(:,:,:,NM3(JN)) .LT. ZMMIN(NM3(JN))).OR.& + (ZM(:,:,:,NM6(JN)) .LT. ZMMIN(NM6(JN)))) + ZM(:,:,:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,:,:,NM3(JN)) = ZMMIN(NM3(JN)) + ZM(:,:,:,NM6(JN)) = ZMMIN(NM6(JN)) + END WHERE + ELSE IF (.NOT.(LRGFIX_SLT)) THEN + + WHERE ((ZM(:,:,:,NM0(JN)) .LT. ZMMIN(NM0(JN))).OR.& + (ZM(:,:,:,NM3(JN)) .LT. ZMMIN(NM3(JN)))) + ZM(:,:,:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,:,:,NM3(JN)) = ZMMIN(NM3(JN)) + END WHERE + ENDIF + + + ! return to concentration #/m3 => (#/molec_{air} + IF (LVARSIG_SLT) THEN + PSVT(:,:,:,1+(JN-1)*3) = ZM(:,:,:,NM0(JN)) * XMD / & + (XAVOGADRO*PRHODREF(:,:,:)) + + PSVT(:,:,:,2+(JN-1)*3) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3 * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + + PSVT(:,:,:,3+(JN-1)*3) = ZM(:,:,:,NM6(JN)) * XMD / & + ( XAVOGADRO*PRHODREF(:,:,:) * 1.d-6) + ELSE IF (LRGFIX_SLT) THEN + PSVT(:,:,:,JN) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + ELSE + PSVT(:,:,:,1+(JN-1)*2) = ZM(:,:,:,NM0(JN)) * XMD / & + (XAVOGADRO*PRHODREF(:,:,:)) + + PSVT(:,:,:,2+(JN-1)*2) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + END IF +! +END DO !Loop on modes + +DEALLOCATE(ZINIRADIUS) +DEALLOCATE(ZMMIN) +DEALLOCATE(ZSIGMA) +DEALLOCATE(ZM) +DEALLOCATE(NM6) +DEALLOCATE(NM3) +DEALLOCATE(NM0) +! +END SUBROUTINE SALT2PPP +! +!! ############################################################ + SUBROUTINE PPP2SALT1D( & + PSVT & !I [ppp] input scalar variables (moment of distribution) + , PRHODREF & !I [kg/m3] density of air + , PSIG1D & !O [-] standard deviation of aerosol distribution + , PRG1D & !O [um] number median diameter of aerosol distribution + , PN1D & !O [#/m3] number concentration of aerosols + , PMASS1D & !O [kg/m3] mass concentration of aerosol + , PM1D & !O aerosols moments 0, 3 and 6 + ) +!! ############################################################ +! +!! +!! PURPOSE +!! ------- +!! Translate the three moments M0, M3 and M6 given in ppp into +!! Values which can be understood more easily (R, sigma, N, M) +!! +!! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES +!! ------- +!! CALL PPP2AEROS(PSVT, PRHODREF, PSIG3D=SIGVAR, & +!! PRG3D=RVAR, PN3D=NVAR, PM3D=MASSVAR) +!! +!! REFERENCE +!! --------- +!! none +!! +!! AUTHOR +!! ------ +!! Pierre TULET (LA) +!! +!! MODIFICATIONS +!! ------------- +!! 2005 Alf Grini (CNRM) +!! 2006 Jean-Pierre Chaboureau (LA) +!! +!! EXTERNAL +!! -------- +!! None +!! + IMPLICIT NONE +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PSVT !I [ppp] first moment +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air + +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PSIG1D !O [-] standard deviation +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PRG1D !O [um] number median diameter +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PN1D !O [#/m3] number concentration +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PMASS1D !O [kg_{aer}/m3] mass concentration +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PM1D !O aerosols moments +! +! +!* 0.2 declarations local variables +! +REAL :: ZRHOI ! [kg/m3] density of aerosol +REAL :: ZMI ! [kg/mol] molar weight of aerosol +REAL :: ZRGMIN ! [um] minimum radius accepted +REAL :: ZSIGMIN ! minimum standard deviation accepted +REAL,DIMENSION(:,:), ALLOCATABLE :: ZM ! [aerosol units] local array which goes to output later +REAL,DIMENSION(:,:), ALLOCATABLE :: ZSV ! [sea salts moment concentration] +REAL,DIMENSION(:), ALLOCATABLE :: ZSIGMA ! [-] standard deviation +REAL,DIMENSION(:), ALLOCATABLE :: ZRG ! [um] number median diameter +REAL,DIMENSION(:), ALLOCATABLE :: ZMMIN ! [aerosol units] minimum values for N, sigma, M +INTEGER,DIMENSION(:), ALLOCATABLE :: NM0 ! [idx] index for Mode 0 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM3 ! [idx] indexes for Mode 3 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM6 ! [idx] indexes for Mode 6 in passed variables +REAL,DIMENSION(:), ALLOCATABLE :: ZINIRADIUS ! initial mean radius +INTEGER :: JN,IMODEIDX,JJ ! [idx] loop counters +! +!------------------------------------------------------------------------------- +! +! 1.1 initialisation +! +!Calculations here are for one mode only +! +ALLOCATE (NM0(NMODE_SLT)) +ALLOCATE (NM3(NMODE_SLT)) +ALLOCATE (NM6(NMODE_SLT)) +ALLOCATE (ZM(SIZE(PSVT,1), NMODE_SLT*3)) +ALLOCATE (ZMMIN(NMODE_SLT*3)) +ALLOCATE (ZSIGMA(SIZE(PSVT,1))) +ALLOCATE (ZRG(SIZE(PSVT,1))) +ALLOCATE (ZSV(SIZE(PSVT,1), SIZE(PSVT,2))) +ALLOCATE (ZINIRADIUS(NMODE_SLT)) + +!ZSV(:,:) = MAX(PSVT(:,:), XMNH_TINY) + +DO JN=1,NMODE_SLT + IMODEIDX = JPSALTORDER(JN) + !Calculations here are for one mode only + IF (CRGUNITS=="MASS") THEN + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) * EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) + ELSE + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) + END IF + + !Set counter for number, M3 and M6 + NM0(JN) = 1+(JN-1)*3 + NM3(JN) = 2+(JN-1)*3 + NM6(JN) = 3+(JN-1)*3 + !Get minimum values possible + ZMMIN(NM0(JN)) = XN0MIN_SLT(IMODEIDX) + ZRGMIN = ZINIRADIUS(JN) + IF (LVARSIG_SLT) THEN + ZSIGMIN = XSIGMIN_SLT + ELSE + ZSIGMIN = XINISIG_SLT(IMODEIDX) + ENDIF + ZMMIN(NM3(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**3)*EXP(4.5 * LOG(ZSIGMIN)**2) + ZMMIN(NM6(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**6)*EXP(18. * LOG(ZSIGMIN)**2) +END DO +! +!Set density of aerosol, here sea salt (kg/m3) +ZRHOI = XDENSITY_SALT +!Set molecular weight of sea salt !NOTE THAT THIS IS NOW IN KG +ZMI = XMOLARWEIGHT_SALT +! +! +DO JN=1,NMODE_SLT + ! + IF (LVARSIG_SLT) THEN ! give M6 (case of variable standard deviation) + ! + !Get number concentration (#/molec_{air}==>#/m3) + ZM(:,NM0(JN))= & + ZSV(:,1+(JN-1)*3) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * PRHODREF(:) !==>#/m3 + ! + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,NM3(JN)) = & + ZSV(:,2+(JN-1)*3) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + !Limit mass concentration to minimum value + ZM(:,NM3(JN)) = MAX(ZM(:,NM3(JN)), ZMMIN(NM3(JN))) + ! + ZM(:,NM6(JN)) = ZSV(:,3+(JN-1)*3) & !um6/molec_{air}*(cm3/m3) + * 1.d-6 & !==> um6/molec_{air} + * XAVOGADRO & !==> um6/mole_{air} + / XMD & !==> um6/kg_{air} + * PRHODREF(:) !==> um6/m3_{air} + !Limit m6 concentration to minimum value + ZM(:,NM6(JN)) = MAX(ZM(:,NM6(JN)), ZMMIN(NM6(JN))) + ! + !Get sigma (only if sigma is allowed to vary) + !Get intermediate values for sigma M3^2/(M0*M6) (ORILAM paper, eqn 8) + ZSIGMA(:)=ZM(:,NM3(JN))**2/(ZM(:,NM0(JN))*ZM(:,NM6(JN))) + !Limit the intermediate value, can not be larger than 1 + ZSIGMA(:)=MIN(1-1E-10,ZSIGMA(:)) + !Limit the value for intermediate, can not be smaller than 0 + ZSIGMA(:)=MAX(1E-10,ZSIGMA(:)) + !Calculate log(sigma) + ZSIGMA(:)= LOG(ZSIGMA(:)) + !Finally get the real sigma the negative sign is because of + !The way the equation is written (M3^2/(M0*M6)) instead of (M0*M6)/M3^3 + ZSIGMA(:)= EXP(1./3.*SQRT(-ZSIGMA(:))) + !Limit the value to reasonable ones + ZSIGMA(:) = MAX( XSIGMIN_SLT, MIN( XSIGMAX_SLT, ZSIGMA(:) ) ) + + ! + !Put back M6 so that it fits the sigma which is possibly modified above + !The following makes M6 consistent with N, R, SIGMA + ZM(:,NM6(JN)) = ZM(:,NM0(JN)) & + * ( (ZM(:,NM3(JN))/ZM(:,NM0(JN)))**(1./3.) & + * exp(-(3./2.)*log(ZSIGMA(:))**2))**6 & + * exp(18.*log(ZSIGMA(:))**2) + + ELSE ! compute M6 from M0, M3 and SIGMA + ! + ZSIGMA(:) = XINISIG_SLT(JPSALTORDER(JN)) + IF (LRGFIX_SLT) THEN + + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,NM3(JN)) = & + ZSV(:,JN) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + ZM(:,NM3(JN)) = MAX(ZM(:,NM3(JN)), ZMMIN(NM3(JN))) + + ZM(:,NM0(JN))= ZM(:,NM3(JN))/& + ((ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(XINISIG_SLT(JPSALTORDER(JN)))**2)) + + ELSE + + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,NM3(JN)) = & + ZSV(:,2+(JN-1)*2) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + + + !Get number concentration (#/molec_{air}==>#/m3) + ZM(:,NM0(JN))= & + ZSV(:,1+(JN-1)*2) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * PRHODREF(:) !==>#/m3 + + ! Limit concentration to minimum values + WHERE ((ZM(:,NM0(JN)) < ZMMIN(NM0(JN)) ).OR. & + (ZM(:,NM3(JN)) < ZMMIN(NM3(JN)) )) + ZM(:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,NM3(JN)) = ZMMIN(NM3(JN)) + PSVT(:,1+(JN-1)*2) = ZM(:,NM0(JN)) * XMD / & + (XAVOGADRO * PRHODREF(:) ) + PSVT(:,2+(JN-1)*2) = ZM(:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:)*XM3TOUM3_SALT) + ENDWHERE + + END IF + + ZM(:,NM6(JN)) = ZM(:,NM0(JN)) & + * ( (ZM(:,NM3(JN))/ZM(:,NM0(JN)))**(1./3.) & + * exp(-(3./2.)*log(ZSIGMA(:))**2))**6 & + * exp(18.*log(ZSIGMA(:))**2) + + ! + END IF + ! + !Get number median radius (eqn. 7 in Orilam manuscript) + ZRG(:)= & + ( & + ZM(:,NM3(JN))*ZM(:,NM3(JN))*ZM(:,NM3(JN))*ZM(:,NM3(JN)) & + /(ZM(:,NM6(JN))*ZM(:,NM0(JN))*ZM(:,NM0(JN))*ZM(:,NM0(JN))) & + ) & + ** XSIXTH_SALT + !ZRG(:)=MIN(ZRG(:),ZINIRADIUS(JN)) + !Give the sigma-values to the passed array + IF(PRESENT(PSIG1D)) PSIG1D(:,JN) = ZSIGMA(:) + ! + !Set the number concentrations in the passed array + IF(PRESENT(PN1D)) PN1D(:,JN) = ZM(:,NM0(JN)) + ! + !Get the number median radius + IF(PRESENT(PRG1D)) PRG1D(:,JN)= ZRG(:) + ! + IF(PRESENT(PMASS1D))THEN + PMASS1D(:,JN)= & + ZM(:,NM0(JN)) & !#/m^3_{air} + * XPI*4./3. & + * ZRHOI & !==>kg/m^3_{aeros}/m^3_{air} + * ZRG(:) * ZRG(:) * ZRG(:) & + * XUM3TOM3_SALT & !==>kg/m^3_{air} + * exp(4.5*log(ZSIGMA(:))*log(ZSIGMA(:))) + ENDIF +! +END DO !Loop on modes +! +IF(PRESENT(PM1D)) PM1D(:,:) = ZM(:,:) +! +DEALLOCATE(ZINIRADIUS) +DEALLOCATE(ZSV) +DEALLOCATE(ZRG) +DEALLOCATE(ZSIGMA) +DEALLOCATE(ZMMIN) +DEALLOCATE(ZM) +DEALLOCATE(NM6) +DEALLOCATE(NM3) +DEALLOCATE(NM0) +! +END SUBROUTINE PPP2SALT1D + +!! ############################################################ +END MODULE MODE_SALT_PSD_WET diff --git a/src/MNH/mode_saltopt.f90 b/src/MNH/mode_saltopt.f90 index ac1b4099d92e0dd752a1e5460a39f8ba41587e0d..d7fd28f3f1912d0a897de0aa93aebc050b6a761a 100644 --- a/src/MNH/mode_saltopt.f90 +++ b/src/MNH/mode_saltopt.f90 @@ -14,8 +14,11 @@ !! PURPOSE !! ------- !! +!! MODIFICATIONS +!! ------------- !! - +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! IMPLICIT NONE PUBLIC PRIVATE :: SALTOPT_LKT @@ -27,6 +30,9 @@ CONTAINS PSVT & !I [moments/molec_{air}] Transported moments of sea salts ,PZZ & !I [m] height of layers ,PRHODREF & !I [kg/m3] density of air + ,PTHT & + ,PPABST & + ,PRT & ,PPIZA_WVL & !O [-] single scattering albedo of sea salt layer for all SW wavelengths ,PCGA_WVL & !O [-] assymetry factor for sea salt layer for all SW wavelengths ,PTAUREL_WVL & !O [-] opt.depth/opt.depth(550) for sea salt layer for all SW wvl @@ -35,14 +41,18 @@ CONTAINS ) - USE MODE_SALT_PSD !Conversion procedures from moments to radius, ,number, mass and sigma + USE MODE_SALT_PSD_WET !Conversion procedures from moments to radius, ,number, mass and sigma + USE MODE_SALT_PSD USE MODD_SALT, ONLY : NMODE_SLT + IMPLICIT NONE !INPUT REAL, DIMENSION(:,:,:,:),INTENT(IN) :: PSVT !I [moments/molec_{air}] transported moments of sea salt REAL, DIMENSION(:,:,:),INTENT(IN) :: PZZ !I [m] height of layers REAL, DIMENSION(:,:,:),INTENT(IN) :: PRHODREF !I [kg/m3] density of air + REAL, DIMENSION(:,:,:),INTENT(IN) :: PTHT, PPABST !I + REAL, DIMENSION(:,:,:,:),INTENT(IN) :: PRT INTEGER, INTENT(IN) :: KSWB !I [nbr] number of shortwave wavelengths REAL, PARAMETER :: EPSILON=1.e-8 !a very low number for optical depth in a layer @@ -57,6 +67,7 @@ CONTAINS REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NMODE_SLT) :: ZMASS ![kg/m3] mass of one sea salt mode REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NMODE_SLT) :: ZRADIUS ![um] number median radius of one sea salt mode REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NMODE_SLT) :: ZSIGMA ![-] dispersion coefficient one sea salt mode + REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NMODE_SLT) :: ZDENSITY ![-] [g/m2] density of wet aerosol (water + sea salt) REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: ZTAU550_MDE ![-] opt.depth 550nm one mode REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: ZTAU_WVL_MDE ![-] opt.depth @ wvl, one mode REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: ZPIZA_WVL_MDE ![-] single scattering albedo @ wvl, one mode @@ -70,15 +81,26 @@ CONTAINS ALLOCATE(ZCGA_WVL_MDE(SIZE(PTAU550,1),SIZE(PTAU550,2),SIZE(PTAU550,3),KSWB,NMODE_SLT)) ZSVT(:,:,:,:)=PSVT(:,:,:,:) - - CALL PPP2SALT( & + CALL PPP2SALT_WET( & ZSVT & !I [moments/molec_{air}] moments of sea salt for all modes ,PRHODREF & !I [kg/m3] air density + ,PPABST & !I Pression + ,PTHT & !I Potential temperature + ,PRT & !I Large scale vapor mixing ratio ,PSIG3D=ZSIGMA & !O [-] dispersion coefficient ,PRG3D=ZRADIUS & !O [um] number median radius ,PMASS3D=ZMASS & !O [kg/m3] mass of sea salt + ,PDENSITY_WET=ZDENSITY & !0 [g/m2] density of wet aerosol (water + salt) ) - + +! CALL PPP2SALT( & +! ZSVT & !I [moments/molec_{air}] moments of sea salt for all modes +! ,PRHODREF & !I [kg/m3] air density +! ,PSIG3D=ZSIGMA & !O [-] dispersion coefficient +! ,PRG3D=ZRADIUS & !O [um] number median radius +! ,PMASS3D=ZMASS & !O [kg/m3] mass of sea salt +! ) + DO JMDE=1,NMODE_SLT !Get sea salt optical properties from look up tables CALL SALTOPT_LKT( & diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 62c57bedeaab8450f31cc9529be58ba865eae45e..44fde5f596477bcc1cbcaa3d7b283a8a9b1130a8 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -255,6 +255,8 @@ END MODULE MODI_MODEL_n ! to allow to disable writes (for bench purposes) ! P. Wautelet 07/02/2019: remove OPARALLELIO argument from open and close files subroutines ! (nsubfiles_ioz is now determined in IO_File_add2list) +!! 02/2019 C.Lac add rain fraction as an output field +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -498,6 +500,7 @@ REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRM,DPTR_XLBYRM REAL, DIMENSION(:,:,:), POINTER :: DPTR_XZZ REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS +REAL, DIMENSION(:,:), POINTER :: DPTR_XLSZWSM,DPTR_XLSZWSS REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXUS,DPTR_XLBYUS,DPTR_XLBXVS,DPTR_XLBYVS REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXWS,DPTR_XLBYWS,DPTR_XLBXTHS,DPTR_XLBYTHS REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXTKES,DPTR_XLBYTKES @@ -673,6 +676,7 @@ IF (KTCOUNT == 1) THEN CALL ADD3DFIELD_ll(TZLSFIELD_ll, XLSVM) CALL ADD3DFIELD_ll(TZLSFIELD_ll, XLSWM) CALL ADD3DFIELD_ll(TZLSFIELD_ll, XLSTHM) + CALL ADD2DFIELD_ll(TZLSFIELD_ll, XLSZWSM) IF (NRR >= 1) THEN CALL ADD3DFIELD_ll(TZLSFIELD_ll, XLSRVM) ENDIF @@ -702,6 +706,7 @@ IF (KTCOUNT == 1) THEN ! IF ( LSTEADYLS ) THEN CALL UPDATE_HALO_ll(TZLSFIELD_ll, IINFO_ll) + CALL DEL2DFIELD_ll(TZLSFIELD_ll,XLSZWSM,IINFO_ll) CALL UPDATE_HALO2_ll(TZLSFIELD_ll, TZLSHALO2_ll, IINFO_ll) END IF END IF @@ -799,11 +804,13 @@ IF (IMI/=1 .AND. NDAD(IMI)/=IMI .AND. (ISYNCHRO==1 .OR. NDTRATIO(IMI) == 1) ) TH DPTR_XLSUM=>XLSUM DPTR_XLSVM=>XLSVM DPTR_XLSWM=>XLSWM + DPTR_XLSZWSM=>XLSZWSM DPTR_XLSTHS=>XLSTHS DPTR_XLSRVS=>XLSRVS DPTR_XLSUS=>XLSUS DPTR_XLSVS=>XLSVS DPTR_XLSWS=>XLSWS + DPTR_XLSZWSS=>XLSZWSS ! IF ( LSTEADYLS ) THEN NCPL_CUR=0 @@ -818,8 +825,8 @@ IF (IMI/=1 .AND. NDAD(IMI)/=IMI .AND. (ISYNCHRO==1 .OR. NDTRATIO(IMI) == 1) ) TH DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI), & DPTR_CLBCX,DPTR_CLBCY,DPTR_XZZ,DPTR_XZHAT,LSLEVE,XLEN1,XLEN2,DPTR_XCOEFLIN_LBXM, & - DPTR_XLSTHM,DPTR_XLSRVM,DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM, & - DPTR_XLSTHS,DPTR_XLSRVS,DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS ) + DPTR_XLSTHM,DPTR_XLSRVM,DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSZWSM, & + DPTR_XLSTHS,DPTR_XLSRVS,DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS, DPTR_XLSZWSS ) END IF END IF ! @@ -1409,10 +1416,10 @@ IF (.NOT. LSTEADYLS) THEN NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll, & NSIZELBXTKE_ll,NSIZELBYTKE_ll, & NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XDRYMASST, & + XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,XDRYMASST, & XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XDRYMASSS, & + XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XLSZWSS,XDRYMASSS, & XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS, & XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS ) ! @@ -1804,7 +1811,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D, & XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, & - XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, & + XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR, & ZSEA, ZTOWN ) DEALLOCATE(ZTOWN) ELSE @@ -1822,7 +1829,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D, & XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, & - XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO ) + XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR ) END IF XRTHS_CLD = XRTHS - XRTHS_CLD XRRS_CLD = XRRS - XRRS_CLD @@ -1979,16 +1986,16 @@ CALL ENDSTEP ( XTSTEP,NRR,NSV,KTCOUNT,IMI, & XRUS,XRVS,XRWS,XDRYMASSS, & XRTHS,XRRS,XRTKES,XRSVS, & XLSUS,XLSVS,XLSWS, & - XLSTHS,XLSRVS, & + XLSTHS,XLSRVS,XLSZWSS, & XLBXUS,XLBXVS,XLBXWS, & XLBXTHS,XLBXRS,XLBXTKES,XLBXSVS, & XLBYUS,XLBYVS,XLBYWS, & XLBYTHS,XLBYRS,XLBYTKES,XLBYSVS, & - XUM,XVM,XWM, & + XUM,XVM,XWM,XZWS, & XUT,XVT,XWT,XPABST,XDRYMASST, & XTHT, XRT, XTHM, XRCM, XPABSM,XTKET, XSVT,& XLSUM,XLSVM,XLSWM, & - XLSTHM,XLSRVM, & + XLSTHM,XLSRVM,XLSZWSM, & XLBXUM,XLBXVM,XLBXWM, & XLBXTHM,XLBXRM,XLBXTKEM,XLBXSVM, & XLBYUM,XLBYVM,XLBYWM, & diff --git a/src/MNH/modn_salt.f90 b/src/MNH/modn_salt.f90 index 92fa8499839e57ba36cd792c698c10913e1fc6f1..0b7e674471ace04ac31394ff115436386cd9c2c8 100644 --- a/src/MNH/modn_salt.f90 +++ b/src/MNH/modn_salt.f90 @@ -25,6 +25,7 @@ !! MODIFICATIONS !! ------------- !! Original 24/02/05 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -38,6 +39,6 @@ IMPLICIT NONE ! NAMELIST /NAM_SALT/ LSALT, CRGUNITS, LVARSIG_SLT,LSEDIMSALT,XN0MIN_SLT, XINIRADIUS_SLT, & XINISIG_SLT, XSIGMIN_SLT, XSIGMAX_SLT, XCOEFRADMAX_SLT, XCOEFRADMIN_SLT, & - NMODE_SLT, LRGFIX_SLT, LDEPOS_SLT + NMODE_SLT, LRGFIX_SLT, LDEPOS_SLT, LONLY ! END MODULE MODN_SALT diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90 index 7f87fe6a13d3f4db0206e5f280770f60005e5c21..98db95e8653abc0640a8faf4e33a1be51fb9f6b1 100644 --- a/src/MNH/prep_real_case.f90 +++ b/src/MNH/prep_real_case.f90 @@ -380,6 +380,7 @@ !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list ! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -689,6 +690,9 @@ IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF) CALL POSNAM(IPRE_REAL1,'NAM_CONFZ',GFOUND,ILUOUT0) IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CONFZ) ! +! Sea salt +CALL INIT_SALT +! !* 4.3 set soil scheme to ISBA for initialization from GRIB ! IF (YATMFILETYPE=='GRIBEX') THEN diff --git a/src/MNH/radiations.f90 b/src/MNH/radiations.f90 index efd8bca80356f5b3747ce324fea9400efffca735..b4533c7242178308fa29ecdb204beab23fc3d097 100644 --- a/src/MNH/radiations.f90 +++ b/src/MNH/radiations.f90 @@ -118,6 +118,7 @@ CONTAINS !! J.Escobar 28/06/2018 : Reproductible parallelisation of CLOUD_ONLY case !! J.Escobar 20/07/2018 : for real*4 compilation, convert with REAL(X) argument to SUM_DD... !! P.Wautelet 22/01/2019: use standard FLUSH statement instead of non standard intrinsics +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -926,13 +927,15 @@ IF (CAOP=='EXPL') THEN PSVT(IIB:IIE,IJB:IJE,:,NSV_SLTBEG:NSV_SLTEND) & !I [ppp] sea salt scalar concentration ,PZZ(IIB:IIE,IJB:IJE,:) & !I [m] height of layers ,PRHODREF(IIB:IIE,IJB:IJE,:) & !I [kg/m3] density of air + ,PTHT(IIB:IIE,IJB:IJE,:) & !I [K] potential temperature + ,PPABST(IIB:IIE,IJB:IJE,:) & !I [hPa] pressure + ,PRT(IIB:IIE,IJB:IJE,:,:) & !I [kg/kg] water mixing ratio ,ZPIZA_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] single scattering albedo of sea salt ,ZCGA_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] assymetry factor for sea salt ,ZTAUREL_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm) ,PAER_SLT(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT) & !O [-] optical depth of sea salt at wvl=550nm ,KSWB_OLD & !I |nbr] number of shortwave bands ) - ENDIF ZTAUREL_EQ_TMP(:,:,:,:)=ZTAUREL_DST_TMP(:,:,:,:)+ZTAUREL_AER_TMP(:,:,:,:)+ZTAUREL_SLT_TMP(:,:,:,:) diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90 index 4e627a348e442705cbf91d93d75cfcbb859361f3..463fcaabb182a481864acff23f89aae0a9eda7bb 100644 --- a/src/MNH/rain_ice.f90 +++ b/src/MNH/rain_ice.f90 @@ -14,7 +14,7 @@ INTERFACE PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS, PINDEP, PSEA, PTOWN, & + PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA, PTOWN, & PRHT, PRHS, PINPRH, PFPR ) ! ! @@ -70,6 +70,7 @@ REAL, DIMENSION(:,:,:),INTENT(OUT) :: PINPRR3D! Rain inst precip 3D REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D! Rain evap profile REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS! Snow instant precip REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG! Graupel instant precip +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR! Rain fraction REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t @@ -87,7 +88,7 @@ END MODULE MODI_RAIN_ICE PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS, PINDEP, PSEA, PTOWN, & + PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA, PTOWN, & PRHT, PRHS, PINPRH, PFPR ) ! ###################################################################### ! @@ -239,6 +240,7 @@ END MODULE MODI_RAIN_ICE !! (C. Abiven, Y. Léauté, V. Seigner, S. Riette) Phasing of Turner rain subgrid param !! J.Escobar : 8/2018 : for real*4 , bis => limit exp() in RAIN_ICE_SLOW with XMNH_HUGE_12_LOG !! P.Wautelet 01/02/2019: add missing initialization for PFPR +!! 02/2019 C.Lac add rain fraction as an output field ! !* 0. DECLARATIONS ! ------------ @@ -316,6 +318,7 @@ REAL, DIMENSION(:,:,:),INTENT(OUT) :: PINPRR3D! Rain inst precip 3D REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D! Rain evap profile REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS! Snow instant precip REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG! Graupel instant precip +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR! Rain fraction REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t @@ -379,7 +382,6 @@ REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: & ZRAY, & ! Cloud Mean radius ZLBC, & ! XLBC weighted by sea fraction ZFSEDC -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZRAINFR ! Rain fraction REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZHLC_HCF3D ! HLCLOUDS cloud fraction in high water content part REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZHLC_LCF3D ! HLCLOUDS cloud fraction in low water content part REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZHLC_HRC3D ! HLCLOUDS cloud water content in high water content part @@ -807,10 +809,10 @@ IF( IMICRO >= 0 ) THEN !Diagnostic of precipitation fraction ZW(:,:,:) = 0. - ZRAINFR(:,:,:) = UNPACK( ZRF(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) - CALL RAINFR_VERT(ZRAINFR(:,:,:), PRRT(:,:,:)) + PRAINFR(:,:,:) = UNPACK( ZRF(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + CALL RAINFR_VERT(PRAINFR(:,:,:), PRRT(:,:,:)) DO JL=1,IMICRO - ZRF(JL)=ZRAINFR(I1(JL),I2(JL),I3(JL)) + ZRF(JL)=PRAINFR(I1(JL),I2(JL),I3(JL)) END DO ! CALL RAIN_ICE_SLOW @@ -900,8 +902,8 @@ IF( IMICRO >= 0 ) THEN ZW(:,:,:) = PCIT(:,:,:) PCIT(:,:,:) = UNPACK( ZCIT(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) ! - ZW(:,:,:) = ZRAINFR(:,:,:) - ZRAINFR(:,:,:) = UNPACK( ZRF(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRAINFR(:,:,:) + PRAINFR(:,:,:) = UNPACK( ZRF(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) ! ZW(:,:,:) = 0. ZHLC_HCF3D(:,:,:) = UNPACK( ZHLC_HCF(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) @@ -1082,7 +1084,7 @@ ELSE CALL PRINT_MSG(NVERB_FATAL,'GEN','RAIN_ICE','') END IF !sedimentation of rain fraction -CALL RAINFR_VERT(ZRAINFR, PRRS(:,:,:)*PTSTEP) +CALL RAINFR_VERT(PRAINFR, PRRS(:,:,:)*PTSTEP) ! ! diff --git a/src/MNH/rain_ice_red.f90 b/src/MNH/rain_ice_red.f90 index 3f92b1f9e2ce57a6e0e24aa0197cde7ae640dc99..c761841286a25d436d66cf54640eb4001f2ff3c6 100644 --- a/src/MNH/rain_ice_red.f90 +++ b/src/MNH/rain_ice_red.f90 @@ -13,7 +13,7 @@ INTERFACE PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS, PINDEP, PSEA, PTOWN, & + PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA, PTOWN, & PRHT, PRHS, PINPRH, PFPR ) ! ! @@ -69,6 +69,7 @@ REAL, DIMENSION(:,:,:),INTENT(OUT) :: PINPRR3D! Rain inst precip 3D REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEVAP3D! Rain evap profile REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRS! Snow instant precip REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRG! Graupel instant precip +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR! Rain fraction REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t @@ -86,7 +87,7 @@ END MODULE MODI_RAIN_ICE_RED PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS, PINDEP, PSEA, PTOWN, & + PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA, PTOWN, & PRHT, PRHS, PINPRH, PFPR ) ! ###################################################################### ! @@ -237,6 +238,7 @@ END MODULE MODI_RAIN_ICE_RED !! J.Escobar : 10/2017 : for real*4 , limit exp() in RAIN_ICE_SLOW with XMNH_HUGE_12_LOG !! (C. Abiven, Y. Léauté, V. Seigner, S. Riette) Phasing of Turner rain subgrid param !! (S. Riette) Source code split into several files +!! 02/2019 C.Lac add rain fraction as an output field ! !* 0. DECLARATIONS ! ------------ @@ -313,6 +315,7 @@ REAL, DIMENSION(:,:,:),INTENT(OUT) :: PINPRR3D! Rain inst precip 3D REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEVAP3D! Rain evap profile REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRS! Snow instant precip REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRG! Graupel instant precip +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR! Rain fraction REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t @@ -345,7 +348,7 @@ REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: & REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZZ_LVFACT, ZZ_LSFACT ! !Diagnostics -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZRAINFR, & +REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: & & ZHLC_HCF3D,& ! HLCLOUDS cloud fraction in high water content part & ZHLC_LCF3D,& ! HLCLOUDS cloud fraction in low water content part & ZHLC_HRC3D,& ! HLCLOUDS cloud water content in high water content @@ -778,7 +781,7 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies &ZRS_TEND, ZRG_TEND, ZRH_TEND, & &ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH, & &ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH, & - &ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, ZRAINFR) + &ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, PRAINFR) ! External tendencies IF(LEXT_TEND) THEN ZA_TH(:) = ZA_TH(:) + ZEXT_TH(:) @@ -1032,7 +1035,7 @@ IF(IMICRO>0) THEN ZHLC_LRC3D(:,:,:) = UNPACK(ZHLC_LRC(:), MASK=LDMICRO(:,:,:), FIELD=ZW(:,:,:)) PCIT(:,:,:) = UNPACK(ZCIT(:), MASK=LDMICRO(:,:,:), FIELD=PCIT(:,:,:)) ELSE - ZRAINFR(:,:,:)=0. + PRAINFR(:,:,:)=0. ZHLC_HCF3D(:,:,:)=0. ZHLC_LCF3D(:,:,:)=0. ZHLC_HRC3D(:,:,:)=0. @@ -1539,7 +1542,7 @@ IF(LSEDIM_AFTER) THEN CALL BUDGET (PRHS(:,:,:)*PRHODJ(:,:,:), 12, 'SEDI_BU_RRH') ! !sedimentation of rain fraction - CALL ICE4_RAINFR_VERT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, ZRAINFR, PRRS(:,:,:)*PTSTEP) + CALL ICE4_RAINFR_VERT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRS(:,:,:)*PTSTEP) ENDIF ! diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90 index b782886d0fab5b6b3c4ce7c142ac3c64eab8df5b..77142fbfa8efcb5e552b560d667cc3c35cfafa46 100644 --- a/src/MNH/read_all_data_grib_case.f90 +++ b/src/MNH/read_all_data_grib_case.f90 @@ -128,6 +128,7 @@ END MODULE MODI_READ_ALL_DATA_GRIB_CASE !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! Pergaud : 2018 add GFS !! 01/2019 (G.Delautier via Q.Rodier) for GRIB2 ARPEGE and AROME from EPYGRAM +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -153,6 +154,7 @@ USE MODI_INI_CTURB USE MODI_CH_OPEN_INPUT ! USE MODD_IO, ONLY: TFILEDATA +USE MODD_FIELD_n, ONLY: XZWS USE MODD_CONF USE MODD_CONF_n USE MODD_CST @@ -325,6 +327,7 @@ INTEGER :: IMI TYPE(TFILEDATA),POINTER :: TZFILE INTEGER, DIMENSION(JP_GFS) :: IP_GFS ! list of pressure levels for GFS model INTEGER :: IVERSION,ILEVTYPE +LOGICAL :: GFIND ! to test if sea wave height is found !--------------------------------------------------------------------------------------- IP_GFS=(/1000,975,950,925,900,850,800,750,700,650,600,550,500,450,400,350,300,& 250,200,150,100,70,50,30,20,10/)! @@ -565,6 +568,55 @@ ELSE IF (HFILE=='CHEM') THEN END IF DEALLOCATE (ZOUT) ! +! *** BEGIN MODIF SB ADD HS *** +!--------------------------------------------------------------------------------------- +!* 2.3 bis Read and interpol Sea Wave significant height +!--------------------------------------------------------------------------------------- +WRITE (ILUOUT0,'(A)') ' | Searching sea wave significant height' +SELECT CASE (IMODEL) + CASE(0) ! ECMWF + ALLOCATE (XZWS(IIU,IJU)) + GFIND=.FALSE. + ! + CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=140229) + IF(INUM < 0) THEN + CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=229) + ! + IF(INUM < 0) THEN + WRITE (ILUOUT0,'(A)')' | !!! WARNING !!! Sea wave height is missing in '// & + 'the GRIB file - the default value of 2 meters is used' + XZWS = 2.0 + ELSE + GFIND=.TRUE. + END IF + ELSE + GFIND=.TRUE. + END IF + ! + IF(GFIND) THEN + !!!!!!!!!!! Faire en sorte de le faire que pour le CASE(0) + ! Sea wave significant height disponible uniquement pour ECMWF + ! recuperation du tableau de valeurs + CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) + ALLOCATE(IINLO(INJ)) + CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,& + ZXOUT,ZYOUT,INI,ZPARAM,IINLO) + ALLOCATE(ZVALUE(ISIZE)) + CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) + ! Change 9999 value to -1 + WHERE(ZVALUE.EQ.9999.) ZVALUE=0. + ALLOCATE(ZOUT(INO)) + CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & + ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) + DEALLOCATE(IINLO) + DEALLOCATE(ZVALUE) + ! Stores the field in a 2 dimension array + CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XZWS) + DEALLOCATE (ZOUT) + END IF +END SELECT + ! *** END MODIF SB ADD HS *** +! !--------------------------------------------------------------------------------------- !* 2.4 Interpolation surface pressure !--------------------------------------------------------------------------------------- @@ -1880,14 +1932,15 @@ INTEGER :: ILUOUT0 ! Logical unit number of the listing ILUOUT0 = TLUOUT0%NLU ! ISEARCH=0 +! Initialize as not found +KNUM = -1 +! IF (PRESENT(KPARAM)) ISEARCH=ISEARCH+1 IF (PRESENT(KDIS)) ISEARCH=ISEARCH+1 IF (PRESENT(KCAT)) ISEARCH=ISEARCH+1 IF (PRESENT(KNUMBER)) ISEARCH=ISEARCH+1 IF (PRESENT(KLEV1)) ISEARCH=ISEARCH+1 - - - +! DO JLOOP=1,SIZE(KGRIB) IFOUND = 0 ! @@ -1980,16 +2033,15 @@ DO JLOOP=1,SIZE(KGRIB) CYCLE ENDIF ENDIF - ! + ! IF (IFOUND == ISEARCH) THEN KNUM=JLOOP EXIT ELSE ! field not found KNUM=-1 END IF - END DO - +! END SUBROUTINE SEARCH_FIELD !################################################################################# SUBROUTINE COORDINATE_CONVERSION(KMODEL,KGRIB,KNOLON,KNOLARG,& diff --git a/src/MNH/read_chem_data_netcdf_case.f90 b/src/MNH/read_chem_data_netcdf_case.f90 index b92f56cc4b6cae6afbdcab28f7a2f32d732c197a..a9dc2f9a8d73555227191200084063a3d06d6906 100644 --- a/src/MNH/read_chem_data_netcdf_case.f90 +++ b/src/MNH/read_chem_data_netcdf_case.f90 @@ -83,6 +83,7 @@ END MODULE MODI_READ_CHEM_DATA_NETCDF_CASE !! Original 23/01/12 (C. Mari) !! A. Berger 20/03/12 adapt whatever the chemical mechanism in BASIC !! P. Wautelet 30/10/17 use F90 module for netCDF +!! J.Pianezzej 13/02/2019 : correction for use of MEGAN !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -389,7 +390,7 @@ ELSEIF (CDUMMY1=="12") THEN itimeindex=2 ELSEIF (CDUMMY1=="18") THEN itimeindex=3 -ELSEIF (CDUMMY1=="24") THEN +ELSEIF ((CDUMMY1=="24").OR.(CDUMMY1=="00")) THEN itimeindex=4 ENDIF start3d(4) = itimeindex diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 05faa7b8cceae9bee1a98d0086e549be36dc5725..b4393217782ed982df17b7094e2333753076ac3d 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -291,6 +291,7 @@ END MODULE MODI_READ_EXSEG_n !! Modification 01/2019 (Q. Rodier) define XCEDIS depending on BL89 or RM17 mixing length !! Modification 01/2019 (P. Wautelet) bugs correction: incorrect writes !! 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 !!------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -1738,6 +1739,7 @@ END IF IF (LSALT) THEN IF (OSALT) THEN CGETSVT(NSV_SLTBEG:NSV_SLTEND)='READ' + CGETZWS='READ' ! IF(CCONF=='START') CGETSVT(NSV_SLTBEG:NSV_SLTEND)='INIT' ELSE WRITE(UNIT=ILUOUT,FMT=9001) KMI @@ -1745,6 +1747,7 @@ IF (LSALT) THEN &SCHEME IN INITIAL FMFILE",/,& & "THE SALT VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') CGETSVT(NSV_SLTBEG:NSV_SLTEND)='INIT' + CGETZWS='INIT' END IF IF (LDEPOS_SLT(KMI)) THEN @@ -1769,9 +1772,9 @@ IF (LSALT) THEN CGETSVT(NSV_SLTDEPBEG:NSV_SLTDEPEND)='INIT' END IF END IF - IF(NMODE_SLT.GT.3 .OR. NMODE_SLT.LT.1) THEN + IF(NMODE_SLT.GT.5 .OR. NMODE_SLT.LT.1) THEN WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("SALT MODES MUST BE BETWEEN 1 and 3 ")') + WRITE(UNIT=ILUOUT,FMT='("SALT MODES MUST BE BETWEEN 1 and 5 ")') !callabortstop CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') END IF @@ -1805,7 +1808,7 @@ IF (LSALT) THEN IF(.NOT.ALLOCATED(CDESLTNAMES)) THEN ALLOCATE(CDESLTNAMES(NMODE_SLT*2)) DO JMODE=1,NMODE_SLT - IMODEIDX=JPDUSTORDER(JMODE) + IMODEIDX=JPSALTORDER(JMODE) CDESLTNAMES(JMODE) = YPDESLT_INI(IMODEIDX) CDESLTNAMES(NMODE_SLT+JMODE) = YPDESLT_INI(NMODE_SLT+IMODEIDX) ENDDO diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index 9c305af69bacfa0e96570b3cd35f20cc524de61c..ccdc3730df9f76c6ab240559af1af772d0211fc6 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -8,23 +8,23 @@ ! INTERFACE ! - SUBROUTINE READ_FIELD(TPINIFILE,KIU,KJU,KKU,PTSTEP, & - HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT, & + SUBROUTINE READ_FIELD(TPINIFILE,KIU,KJU,KKU, & + HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,HGETZWS, & HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR, & HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME, & HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & KSIZELBXTKE_ll,KSIZELBYTKE_ll, & KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & PUM,PVM,PWM,PDUM,PDVM,PDWM, & - PUT,PVT,PWT,PTHT,PPABST,PPABSM,PTKET,PRTKEMS, & - PRT,PSVT,PCIT,PDRYMASST, & + PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS, & + PRT,PSVT,PZWS,PCIT,PDRYMASST, & PSIGS,PSRCT,PCLDFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, PLSZWSM, & PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & KFRC,TPDTFRC,PUFRC,PVFRC,PWFRC,PTHFRC,PRVFRC, & PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC,PPGROUNDFRC,PATC, & - PTENDUFRC,PTENDVFRC, & + PTENDUFRC,PTENDVFRC, & KADVFRC,TPDTADVFRC,PDTHFRC,PDRVFRC, & KRELFRC,TPDTRELFRC, PTHREL, PRVREL, & PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M, & @@ -37,13 +37,11 @@ USE MODD_TIME ! for type DATE_TIME TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE !Initial file INTEGER, INTENT(IN) :: KIU, KJU, KKU ! array sizes in x, y and z directions -REAL, INTENT(IN) :: PTSTEP - ! current Time STEP ! CHARACTER (LEN=*), INTENT(IN) :: HGETTKET, & HGETRVT,HGETRCT,HGETRRT, & HGETRIT,HGETRST,HGETRGT,HGETRHT, & - HGETCIT,HGETSRCT, & + HGETCIT,HGETSRCT, HGETZWS, & HGETSIGS,HGETCLDFR,HGETBL_DEPTH, & HGETSBL_DEPTH,HGETPHC,HGETPHR CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVT @@ -72,9 +70,9 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PUT,PVT,PWT ! U,V,W at t REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHT,PTKET ! theta, tke and REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTKEMS ! tke adv source REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPABST ! pressure at t -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPABSM ! pressure at t-1 REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PRT,PSVT ! moist and scalar ! variables at t +REAL, DIMENSION(:,:), INTENT(OUT) :: PZWS REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCT ! turbulent flux ! <s'Rc'> at t REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCIT ! ice conc. at t @@ -88,6 +86,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHR ! pH value in rainwate REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUM,PLSVM,PLSWM ! Wind REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHM, PLSRVM ! Mass ! LB fields +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSM ! significant height of sea waves REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXTHM ! Mass REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYUM,PLBYVM,PLBYWM ! Wind @@ -124,23 +123,23 @@ END INTERFACE END MODULE MODI_READ_FIELD ! ! ######################################################################## - SUBROUTINE READ_FIELD(TPINIFILE,KIU,KJU,KKU,PTSTEP, & - HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT, & + SUBROUTINE READ_FIELD(TPINIFILE,KIU,KJU,KKU, & + HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,HGETZWS, & HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR, & HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME, & HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & KSIZELBXTKE_ll,KSIZELBYTKE_ll, & KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & PUM,PVM,PWM,PDUM,PDVM,PDWM, & - PUT,PVT,PWT,PTHT,PPABST,PPABSM,PTKET,PRTKEMS, & - PRT,PSVT,PCIT,PDRYMASST, & + PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS, & + PRT,PSVT,PZWS,PCIT,PDRYMASST, & PSIGS,PSRCT,PCLDFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & KFRC,TPDTFRC,PUFRC,PVFRC,PWFRC,PTHFRC,PRVFRC, & PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC,PPGROUNDFRC,PATC, & - PTENDUFRC,PTENDVFRC, & + PTENDUFRC,PTENDVFRC, & KADVFRC,TPDTADVFRC,PDTHFRC,PDRVFRC, & KRELFRC,TPDTRELFRC, PTHREL, PRVREL, & PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M, & @@ -238,6 +237,8 @@ END MODULE MODI_READ_FIELD !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! V. Vionnet 07/17 add blowing snow scheme !! P. Wautelet 01/2019 corrected intent of PDUM,PDVM,PDWM (OUT->INOUT) +! P. Wautelet 13/02/2019: removed PPABSM and PTSTEP dummy arguments (bugfix: PPABSM was intent(OUT)) +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -294,13 +295,11 @@ IMPLICIT NONE TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE !Initial file INTEGER, INTENT(IN) :: KIU, KJU, KKU ! array sizes in x, y and z directions -REAL, INTENT(IN) :: PTSTEP - ! current Time STEP ! CHARACTER (LEN=*), INTENT(IN) :: HGETTKET, & HGETRVT,HGETRCT,HGETRRT, & HGETRIT,HGETRST,HGETRGT,HGETRHT, & - HGETCIT,HGETSRCT, & + HGETCIT,HGETSRCT,HGETZWS, & HGETSIGS,HGETCLDFR,HGETBL_DEPTH, & HGETSBL_DEPTH,HGETPHC,HGETPHR CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVT @@ -331,9 +330,9 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PUT,PVT,PWT ! U,V,W at t REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHT,PTKET ! theta, tke and REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTKEMS ! tke adv source REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPABST ! pressure at t -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPABSM ! pressure at t-1 REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PRT,PSVT ! moist and scalar ! variables at t +REAL, DIMENSION(:,:), INTENT(OUT) :: PZWS REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCT ! turbulent flux ! <s'Rc'> at t REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCIT ! ice conc. at t @@ -346,6 +345,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHR ! pH value in rainwate ! ! ! Larger Scale fields +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSM ! significant height of sea waves REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUM,PLSVM,PLSWM ! Wind REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHM, PLSRVM ! Mass REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind @@ -461,6 +461,13 @@ SELECT CASE(HGETTKET) PRTKEMS(:,:,:) = 0. END SELECT ! +SELECT CASE(HGETZWS) + CASE('READ') + CALL IO_Field_read(TPINIFILE,'ZWS',PZWS) + CASE('INIT') + PZWS(:,:)=0. +END SELECT +! SELECT CASE(HGETRVT) ! vapor CASE('READ') IF (TPINIFILE%NMNHVERSION(1)<5) THEN @@ -1198,7 +1205,7 @@ END IF !* 2.2a 3D LS fields ! ! -CALL INI_LS(TPINIFILE,HGETRVT,GLSOURCE,PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM) +CALL INI_LS(TPINIFILE,HGETRVT,GLSOURCE,PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM) ! ! !* 2.2b 2D "surfacic" LB fields diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 67ba3a572efe55a7e8b683070b6504db2680a8b9..88210cf5983cfb77302569cfe4506d6889c78d14 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -22,7 +22,7 @@ INTERFACE PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D, & PSOLORG,PMI, & PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH, & - PINDEP, PSUPSAT, PNACT, PNPRO,PSSPRO, & + PINDEP, PSUPSAT, PNACT, PNPRO,PSSPRO, PRAINFR, & PSEA,PTOWN ) ! USE MODD_IO, ONLY: TFILEDATA @@ -133,6 +133,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSSPRO !sursat +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR ! Rain fraction REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction ! @@ -156,7 +157,7 @@ END MODULE MODI_RESOLVED_CLOUD PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D, & PSOLORG,PMI, & PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH, & - PINDEP, PSUPSAT, PNACT, PNPRO,PSSPRO, & + PINDEP, PSUPSAT, PNACT, PNPRO,PSSPRO, PRAINFR, & PSEA,PTOWN ) ! ########################################################################## ! @@ -265,6 +266,7 @@ END MODULE MODI_RESOLVED_CLOUD !! ICE3/ICE4 modified, old version under LRED=F !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! P. Wautelet: 01/02/2019: ZRSMIN is now allocatable (instead of size of XRTMIN which was sometimes not allocated) +!! 02/2019 C.Lac add rain fraction as an output field !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -419,6 +421,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSSPRO !sursat +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR ! Rain fraction REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction ! @@ -918,8 +921,8 @@ SELECT CASE ( HCLOUD ) PRS(:,:,:,4)>ZRSMIN(4) .OR. & PRS(:,:,:,5)>ZRSMIN(5) .OR. & PRS(:,:,:,6)>ZRSMIN(6) - CALL RAIN_ICE_RED ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1, & - PTSTEP, KRR, LLMICRO, ZEXN, & + CALL RAIN_ICE_RED ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1, & + PTSTEP, KRR, LLMICRO, ZEXN, & ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,& PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & PRT(:,:,:,3), PRT(:,:,:,4), & @@ -927,18 +930,18 @@ SELECT CASE ( HCLOUD ) PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS, PINDEP, PSEA,PTOWN, PFPR=ZFPR) + PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA,PTOWN, PFPR=ZFPR) ELSE - CALL RAIN_ICE ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1, & - KSPLITR, PTSTEP, KRR, & + CALL RAIN_ICE ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1, & + KSPLITR, PTSTEP, KRR, & ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,& PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & PRT(:,:,:,3), PRT(:,:,:,4), & PRT(:,:,:,5), PRT(:,:,:,6), & PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS,PINDEP, & + PINPRC,PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PSIGS,PINDEP, PRAINFR, & PSEA,PTOWN, PFPR=ZFPR) END IF ! @@ -1009,7 +1012,7 @@ SELECT CASE ( HCLOUD ) PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & PINPRC, PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS, PINDEP, PSEA, PTOWN, & + PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA, PTOWN, & PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR ) ELSE CALL RAIN_ICE ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1, & @@ -1021,7 +1024,7 @@ SELECT CASE ( HCLOUD ) PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & PINPRC, PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS,PINDEP, & + PINPRS, PINPRG, PSIGS,PINDEP, PRAINFR, & PSEA, PTOWN, & PRT(:,:,:,7), PRS(:,:,:,7), PINPRH,PFPR=ZFPR ) END IF diff --git a/src/MNH/salt_filter.f90 b/src/MNH/salt_filter.f90 index bff76dfe979c1d70196c4698031c2fa097ef0aee..bc40e889136a14db3727ae76c2c90da0e3572948 100644 --- a/src/MNH/salt_filter.f90 +++ b/src/MNH/salt_filter.f90 @@ -45,19 +45,8 @@ END MODULE MODI_SALT_FILTER !! MODIFICATIONS !! ------------- !! Original +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! -! Entry variables: -! -! PRSVS(INOUT) -Array of moments included in PRSVS -! -!************************************************************* -! Exit variables: -! -!************************************************************* -! Variables used during the deposition velocity calculation -! -! ZVGK -Polydisperse settling velocity of the kth moment (m/s) -!************************************************************ !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -66,10 +55,12 @@ END MODULE MODI_SALT_FILTER ! IMPLICIT ARGUMENTS ! USE MODD_SALT -USE MODD_CSTS_SALT -! USE MODE_SALT_PSD -USE MODD_CST, ONLY : XMNH_TINY + +!+ Marine +USE MODI_INIT_SALT +!- Marine + ! IMPLICIT NONE ! @@ -78,27 +69,156 @@ IMPLICIT NONE REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSV REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! -!* 0.2 Declarations of local variables : -! -INTEGER :: JN -INTEGER :: IMODEIDX -REAL, DIMENSION(NMODE_SLT*3) :: ZPMIN -REAL, DIMENSION(NMODE_SLT) :: ZINIRADIUS -REAL, DIMENSION(SIZE(PSV,1), SIZE(PSV,2), SIZE(PSV,3), NMODE_SLT*3) :: ZM ! [aerosol units] local array which goes to output later - -REAL :: ZRGMIN, ZSIGMIN -REAL :: ZRHOP, ZMI -INTEGER,DIMENSION(NMODE_SLT) :: NM0, NM3, NM6 -! -!* 0.3 initialize constant -! -ZRHOP = XDENSITY_SALT -ZMI = XMOLARWEIGHT_SALT ! molecular mass in kg/mol -! +!* 0.2 declarations local variables +! +REAL :: ZRHOI ! [kg/m3] density of aerosol +REAL :: ZMI ! [kg/mol] molar weight of aerosol +REAL :: ZRGMIN ! [um] minimum radius accepted +REAL :: ZSIGMIN ! minimum standard deviation accepted +REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZM ! [aerosol units] local array which goes to output later +REAL,DIMENSION(:), ALLOCATABLE :: ZMMIN ! [aerosol units] minimum values for N, sigma, M +INTEGER,DIMENSION(:), ALLOCATABLE :: NM0 ! [idx] index for Mode 0 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM3 ! [idx] indexes for Mode 3 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM6 ! [idx] indexes for Mode 6 in passed variables +REAL,DIMENSION(:), ALLOCATABLE :: ZINIRADIUS ! initial mean radius +REAL,DIMENSION(:), ALLOCATABLE :: ZINISIGMA ! initial standard deviation +INTEGER :: JN,IMODEIDX,JJ ! [idx] loop counters + !------------------------------------------------------------------------------- +!+ Marine +CALL INIT_SALT +!- Marine + + +ALLOCATE (NM0(NMODE_SLT)) +ALLOCATE (NM3(NMODE_SLT)) +ALLOCATE (NM6(NMODE_SLT)) +ALLOCATE (ZM(SIZE(PSV,1), SIZE(PSV,2), SIZE(PSV,3), NMODE_SLT*3)) +ALLOCATE (ZMMIN(NMODE_SLT*3)) +ALLOCATE (ZINIRADIUS(NMODE_SLT)) +ALLOCATE (ZINISIGMA(NMODE_SLT)) + +PSV(:,:,:,:) = MAX(PSV(:,:,:,:), XMNH_TINY) + +DO JN=1,NMODE_SLT + IMODEIDX = JPSALTORDER(JN) + !Calculations here are for one mode only + ZINISIGMA(JN) = XINISIG_SLT(IMODEIDX) + IF (CRGUNITS=="MASS") THEN + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) * EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) + ELSE + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) + END IF + + !Set counter for number, M3 and M6 + NM0(JN) = 1+(JN-1)*3 + NM3(JN) = 2+(JN-1)*3 + NM6(JN) = 3+(JN-1)*3 + !Get minimum values possible + ZMMIN(NM0(JN)) = XN0MIN_SLT(IMODEIDX) + ZRGMIN = ZINIRADIUS(JN) + IF (LVARSIG_SLT) THEN + ZSIGMIN = XSIGMIN_SLT + ELSE + ZSIGMIN = XINISIG_SLT(IMODEIDX) + ENDIF + ZMMIN(NM3(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**3)*EXP(4.5 * LOG(ZSIGMIN)**2) + ZMMIN(NM6(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**6)*EXP(18. * LOG(ZSIGMIN)**2) +END DO +! +!Set density of aerosol, here dust (kg/m3) +ZRHOI = XDENSITY_SALT +!Set molecular weight of dust !NOTE THAT THIS IS NOW IN KG +ZMI = XMOLARWEIGHT_SALT +! +DO JN=1,NMODE_SLT + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + IF (LVARSIG_SLT) THEN + ZM(:,:,:,NM3(JN)) = & + PSV(:,:,:,2+(JN-1)*3) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + ELSE + IF ((LRGFIX_SLT)) THEN + ZM(:,:,:,NM3(JN)) = & + PSV(:,:,:,JN) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + ELSE + ZM(:,:,:,NM3(JN)) = & + PSV(:,:,:,2+(JN-1)*2) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + END IF + END IF + +! calculate moment 0 from dispersion and mean radius + ZM(:,:,:,NM0(JN))= ZM(:,:,:,NM3(JN))/& + ((ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(ZINISIGMA(JN))**2)) + + +! calculate moment 6 from dispersion and mean radius + ZM(:,:,:,NM6(JN)) = ZM(:,:,:,NM0(JN)) * (ZINIRADIUS(JN)**6) * & + EXP(18 *(LOG(ZINISIGMA(JN)))**2) + + IF (LVARSIG_SLT) THEN + WHERE ((ZM(:,:,:,NM0(JN)) .LT. ZMMIN(NM0(JN))).OR.& + (ZM(:,:,:,NM3(JN)) .LT. ZMMIN(NM3(JN))).OR.& + (ZM(:,:,:,NM6(JN)) .LT. ZMMIN(NM6(JN)))) + ZM(:,:,:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,:,:,NM3(JN)) = ZMMIN(NM3(JN)) + ZM(:,:,:,NM6(JN)) = ZMMIN(NM6(JN)) + END WHERE + + ELSE IF (.NOT.(LRGFIX_SLT)) THEN + + WHERE ((ZM(:,:,:,NM0(JN)) .LT. ZMMIN(NM0(JN))).OR.& + (ZM(:,:,:,NM3(JN)) .LT. ZMMIN(NM3(JN)))) + ZM(:,:,:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,:,:,NM3(JN)) = ZMMIN(NM3(JN)) + END WHERE + ENDIF + + ! return to concentration #/m3 => (#/molec_{air} + IF (LVARSIG_SLT) THEN + PSV(:,:,:,1+(JN-1)*3) = ZM(:,:,:,NM0(JN)) * XMD / & + (XAVOGADRO*PRHODREF(:,:,:)) + + PSV(:,:,:,2+(JN-1)*3) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3 * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + + PSV(:,:,:,3+(JN-1)*3) = ZM(:,:,:,NM6(JN)) * XMD / & + ( XAVOGADRO*PRHODREF(:,:,:) * 1.d-6) + ELSE IF (LRGFIX_SLT) THEN + PSV(:,:,:,JN) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + ELSE + PSV(:,:,:,1+(JN-1)*2) = ZM(:,:,:,NM0(JN)) * XMD / & + (XAVOGADRO*PRHODREF(:,:,:)) + + PSV(:,:,:,2+(JN-1)*2) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + END IF ! -PSV(:,:,:,:) = MAX(PSV(:,:,:,:), XMNH_TINY) -! +END DO !Loop on modes + +DEALLOCATE(ZINIRADIUS) +DEALLOCATE(ZMMIN) +DEALLOCATE(ZINISIGMA) +DEALLOCATE(ZM) +DEALLOCATE(NM6) +DEALLOCATE(NM3) +DEALLOCATE(NM0) + END SUBROUTINE SALT_FILTER diff --git a/src/MNH/saltlfin.f90 b/src/MNH/saltlfin.f90 index c3a2650b09b25c8d0c1e9b9d87396867f464e2f3..3b637b2785bdb83d2d1002ef60ffa646c4963729 100644 --- a/src/MNH/saltlfin.f90 +++ b/src/MNH/saltlfin.f90 @@ -14,10 +14,14 @@ ! INTERFACE ! -SUBROUTINE SALTLFI_n(PSV, PRHODREF) +!++cb++24/10/16 +!SUBROUTINE SALTLFI_n(PSV, PRHODREF) +SUBROUTINE SALTLFI_n(PSV, PRHODREF, PZZ) IMPLICIT NONE -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSV -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSV +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ + END SUBROUTINE SALTLFI_n ! END INTERFACE @@ -26,7 +30,8 @@ END MODULE MODI_SALTLFI_n ! ! ! ############################################################ - SUBROUTINE SALTLFI_n(PSV, PRHODREF) +! SUBROUTINE SALTLFI_n(PSV, PRHODREF) + SUBROUTINE SALTLFI_n(PSV, PRHODREF, PZZ) ! ############################################################ ! !! PURPOSE @@ -43,9 +48,9 @@ END MODULE MODI_SALTLFI_n !! !! MODIFICATIONS !! ------------- -!! none -!! !! 2014 P.Tulet modif calcul ZM +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes + !! EXTERNAL !! -------- !! None @@ -57,7 +62,9 @@ END MODULE MODI_SALTLFI_n ! USE MODD_SALT USE MODD_NSV -USE MODD_GRID_n, ONLY: XZZ +!++cb++24/10/16 +!USE MODD_GRID_n, ONLY: XZZ +!--cb-- USE MODD_CSTS_SALT USE MODD_CST, ONLY : & XPI & !Definition of pi @@ -75,6 +82,7 @@ IMPLICIT NONE ! REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSV REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! ! !* 0.2 declarations local variables @@ -88,6 +96,9 @@ REAL,DIMENSION(:), ALLOCATABLE :: ZMMIN REAL,DIMENSION(:), ALLOCATABLE :: ZINIRADIUS, ZINISIGMA REAL,DIMENSION(:,:), ALLOCATABLE :: ZSEA INTEGER :: IKU +!+Marine +INTEGER :: IMOMENTS +!-Marine INTEGER :: JI, JJ, JN, JK ! loop counter INTEGER :: IMODEIDX ! index mode REAL, PARAMETER :: ZN_SALT=0.1 ! particles of sea salt/cm3 {air} @@ -102,6 +113,7 @@ REAL :: ZN_SALTN ! 1.1 initialisation ! IKU=SIZE(PSV,3) +!+ Marine ! ALLOCATE (IM0(NMODE_SLT)) ALLOCATE (IM3(NMODE_SLT)) @@ -115,11 +127,20 @@ ALLOCATE (ZMMIN(NMODE_SLT*3)) ALLOCATE (ZSEA(SIZE(PSV,1), SIZE(PSV,2))) ZSEA(:,:) = 0. -WHERE ((XZZ(:,:,1) .LT. 0.1).AND.(XZZ(:,:,1) .GE. 0.)) +!++cb++20/10/16 +!WHERE ((XZZ(:,:,1) .LT. 0.1).AND.(XZZ(:,:,1) .GE. 0.)) +! ZSEA(:,:) = 1. +!END WHERE +!++cb++24/10/16 +!WHERE (XZZ(:,:,1) .LE. 0.01) +WHERE (PZZ(:,:,1) .LE. 0.01) +!--cb-- ZSEA(:,:) = 1. END WHERE +!--cb-- ! ! +!+ Marine DO JN = 1, NMODE_SLT IM0(JN) = 1+(JN-1)*3 IM3(JN) = 2+(JN-1)*3 @@ -146,8 +167,8 @@ DO JN = 1, NMODE_SLT ENDDO ! ! -ZRHOI = XDENSITY_SALT !1.8e3 !++changed alfgr -!ZMI = XMOLARWEIGHT_SALT*1.D3 !100. !++changed alfgr +!XDENSITY_SALT est fixé dans modd_csts_salt.f90 +ZRHOI = XDENSITY_SALT ZMI = XMOLARWEIGHT_SALT ZDEN2MOL = 1E-6 * XAVOGADRO / XMD ZFAC=(4./3.)*XPI*ZRHOI*1.e-9 @@ -158,18 +179,49 @@ DO JN=1,NMODE_SLT !* 1.1 calculate moment 0 from sea salt number by m3 ! ! initial vertical profil of sea salt and convert in #/m3 - IF (JN == 1) ZN_SALTN = 1E-4 * ZN_SALT *1E6 - IF (JN == 2) ZN_SALTN = 1. * ZN_SALT *1E6 - IF (JN == 3) ZN_SALTN = 10 * ZN_SALT *1E6 - DO JK=1, SIZE(XZZ,3) - DO JJ=1, SIZE(XZZ,2) - DO JI=1, SIZE(XZZ,1) - IF (XZZ(JI,JJ,JK) .LT. 600.) THEN - ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN - ELSE IF ((XZZ(JI,JJ,JK) .GE. 600.).AND.(XZZ(JI,JJ,JK) .LT. 1000.)) THEN - ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN - ZN_SALTN*(1.-1E-3)*(XZZ(JI,JJ,JK)-600.) / 400. - ELSE IF (XZZ(JI,JJ,JK) .GE. 1000.) THEN - ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN *1E-3 +!+Marine : (reprendre XN0MIN_SLT de modd_salt.f90). +! Pas plus simple de fixer une dimension à ZN_SALT qui dépend de JN pour ne pas +! avoir à rappeler le schéma d'émission? + + IF(NMODE_SLT == 5)THEN + + + IF (JN == 1) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 2) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 3) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 4) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 5) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + + ELSE +! IF (JN == 1) ZN_SALTN = 1E-4 * ZN_SALT *1E6 +! IF (JN == 2) ZN_SALTN = 1. * ZN_SALT *1E6 +! IF (JN == 3) ZN_SALTN = 10 * ZN_SALT *1E6 + + IF (JN == 1) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 2) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 3) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + + END IF + + +!-Marine + + DO JK=1, SIZE(PSV,3) + DO JJ=1, SIZE(PSV,2) + DO JI=1, SIZE(PSV,1) +!++cb++24/10/16 +! IF (XZZ(JI,JJ,JK) .LT. 600.) THEN + IF (PZZ(JI,JJ,JK) .LT. 600.) THEN + ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN +! ELSE IF ((XZZ(JI,JJ,JK) .GE. 600.).AND.(XZZ(JI,JJ,JK) .LT. 1000.)) THEN + ELSE IF ((PZZ(JI,JJ,JK) .GE. 600.).AND.(PZZ(JI,JJ,JK) .LT. 1000.)) THEN +! ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN - ZN_SALTN*(1.-1E-3)*(XZZ(JI,JJ,JK)-600.) / 400. + ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN - & + ZN_SALTN * (1.-1E-3) * (PZZ(JI,JJ,JK)-600.) / 400. +! ELSE IF (XZZ(JI,JJ,JK) .GE. 1000.) THEN + ELSE IF (PZZ(JI,JJ,JK) .GE. 1000.) THEN + ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN * 1E-3 +!--cb-- END IF END DO END DO @@ -179,7 +231,7 @@ DO JN=1,NMODE_SLT END WHERE WHERE ((ZSEA(:,:) .GT. 0.).AND.(ZSEA(:,:) .LT. 1.)) ZM(:,:,JK,IM0(JN)) = ZM(:,:,JK,IM0(JN))-(ZM(:,:,JK,IM0(JN)) -ZN_SALTN *1E-3) * & - (1. - ZSEA(:,:)) + (1. - ZSEA(:,:)) END WHERE END DO @@ -198,12 +250,31 @@ DO JN=1,NMODE_SLT ZM(:,:,:,IM6(JN)) = MAX(ZMMIN(IM6(JN)), ZM(:,:,:,IM6(JN))) ! !* 1.4 output concentration +!+ Marine +! PSV(:,:,:,1+(JN-1)*3) = ZM(:,:,:,IM0(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)) +! PSV(:,:,:,2+(JN-1)*3) = ZM(:,:,:,IM3(JN)) * XMD*XPI * 4./3. / & +! (ZMI*PRHODREF(:,:,:)*(1.d0/ZRHOI)*XM3TOUM3_SALT) +! +! PSV(:,:,:,3+(JN-1)*3) = ZM(:,:,:,IM6(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)*1.d-6) ! - PSV(:,:,:,1+(JN-1)*3) = ZM(:,:,:,IM0(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)) - PSV(:,:,:,2+(JN-1)*3) = ZM(:,:,:,IM3(JN)) * XMD*XPI * 4./3. / & - (ZMI*PRHODREF(:,:,:)*(1.d0/ZRHOI)*XM3TOUM3_SALT) +!++cb++20/10/16 + IMOMENTS = INT(NSV_SLTEND - NSV_SLTBEG + 1) / NMODE_SLT +!--cb-- - PSV(:,:,:,3+(JN-1)*3) = ZM(:,:,:,IM6(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)*1.d-6) + IF (IMOMENTS == 3) THEN + PSV(:,:,:,1+(JN-1)*3) = ZM(:,:,:,IM0(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)) + PSV(:,:,:,2+(JN-1)*3) = ZM(:,:,:,IM3(JN)) * XMD*XPI * 4./3. / & + (ZMI*PRHODREF(:,:,:)*(1.d0/ZRHOI)*XM3TOUM3_SALT) + + PSV(:,:,:,3+(JN-1)*3) = ZM(:,:,:,IM6(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)*1.d-6) + ELSE IF (IMOMENTS == 2) THEN + PSV(:,:,:,1+(JN-1)*2) = ZM(:,:,:,IM0(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)) + PSV(:,:,:,2+(JN-1)*2) = ZM(:,:,:,IM3(JN)) * XMD*XPI * 4./3. / & + (ZMI*PRHODREF(:,:,:)*(1.d0/ZRHOI)*XM3TOUM3_SALT) + ELSE + PSV(:,:,:,JN) = ZM(:,:,:,IM3(JN)) * XMD*XPI * 4./3. / & + (ZMI*PRHODREF(:,:,:)*(1.d0/ZRHOI)*XM3TOUM3_SALT) + END IF ! END DO ! diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90 index 8c6748d5abac3302d794703c6d982d7cc120c137..aac71414c42db5dfd3753030b13afcf27dee31ec 100644 --- a/src/MNH/spawn_field2.f90 +++ b/src/MNH/spawn_field2.f90 @@ -9,9 +9,9 @@ MODULE MODI_SPAWN_FIELD2 INTERFACE ! SUBROUTINE SPAWN_FIELD2(KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,HTURB, & - PUT,PVT,PWT,PTHVT,PRT,PHUT,PTKET,PSVT,PATC, & + PUT,PVT,PWT,PTHVT,PRT,PHUT,PTKET,PSVT,PZWS,PATC, & PSRCT,PSIGS, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & PDTHFRC,PDRVFRC,PTHREL,PRVREL, & PVU_FLUX_M,PVTH_FLUX_M,PWTH_FLUX_M, & TPSONFILE,KIUSON,KJUSON, & @@ -30,11 +30,13 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PUT,PVT,PWT ! model 2 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTKET ! variables REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PRT,PSVT,PATC ! at t REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHVT,PHUT ! +REAL, DIMENSION(:,:), INTENT(OUT) :: PZWS ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCT,PSIGS ! secondary ! prognostic variables ! Larger Scale fields for relaxation and diffusion REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUM, PLSVM, PLSWM +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSM REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHM, PLSRVM REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PDTHFRC,PDRVFRC REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PTHREL,PRVREL @@ -55,9 +57,9 @@ END INTERFACE END MODULE MODI_SPAWN_FIELD2 ! ########################################################################## SUBROUTINE SPAWN_FIELD2(KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,HTURB, & - PUT,PVT,PWT,PTHVT,PRT,PHUT,PTKET,PSVT,PATC, & + PUT,PVT,PWT,PTHVT,PRT,PHUT,PTKET,PSVT, PZWS,PATC, & PSRCT,PSIGS, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & PDTHFRC,PDRVFRC,PTHREL,PRVREL, & PVU_FLUX_M,PVTH_FLUX_M,PWTH_FLUX_M, & TPSONFILE,KIUSON,KJUSON, & @@ -150,6 +152,7 @@ END MODULE MODI_SPAWN_FIELD2 !! Modification 01/2016 (JP Pinty) Add LIMA !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! Modification 05/03/2018 (J.Escobar) bypass gridnesting special case KD(X/Y)RATIO == 1 not parallelized +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -205,6 +208,7 @@ INTEGER, INTENT(IN) :: KDYRATIO ! between model 2 and model 1 CHARACTER (LEN=4), INTENT(IN) :: HTURB ! Kind of turbulence parameterization ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PUT,PVT,PWT ! model 2 +REAL, DIMENSION(:,:), INTENT(OUT) :: PZWS REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTKET ! variables REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PRT,PSVT,PATC ! at t REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHVT,PHUT ! @@ -213,6 +217,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCT,PSIGS ! secondary ! prognostic variables ! Larger Scale fields for relaxation and diffusion REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUM, PLSVM, PLSWM +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSM REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHM, PLSRVM REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PDTHFRC,PDRVFRC REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PTHREL,PRVREL @@ -238,6 +243,7 @@ REAL, DIMENSION(SIZE(XRT1,1),SIZE(XRT1,2),SIZE(XRT1,3)) :: ZHUT ! relative humid REAL, DIMENSION(SIZE(XTHT1,1),SIZE(XTHT1,2),SIZE(XTHT1,3)) :: ZTHVT! virtual pot. T ! (model 1) !$20140708 +REAL, DIMENSION(:,:), ALLOCATABLE :: ZZWS_C, ZLSZWSM_C !$***** 3D REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZUT_C, ZLSUM_C REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZVT_C, ZLSVM_C @@ -261,6 +267,7 @@ INTEGER :: IINFO_ll !$ ! Arrays for reading fields of input SON 1 file REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D +REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2D REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHT1,ZTHVT1 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPABST1,ZHUT1 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRT1 @@ -291,6 +298,7 @@ CALL COMPUTE_THV_HU(CONF_MODEL(1)%LUSERV,XRT1,XTHT1,XPABST1,ZTHVT,ZHUT) ! IF (PRESENT(TPSONFILE)) THEN ALLOCATE(ZWORK3D(KIUSON,KJUSON,SIZE(PUT,3))) + ALLOCATE(ZWORK2D(KIUSON,KJUSON)) ALLOCATE(ZPABST1(KIE1-KIB1+1,KJE1-KJB1+1,SIZE(PUT,3))) ALLOCATE(ZTHT1(KIE1-KIB1+1,KJE1-KJB1+1,SIZE(PUT,3))) ALLOCATE(ZTHVT1(KIE1-KIB1+1,KJE1-KJB1+1,SIZE(PUT,3))) @@ -402,6 +410,8 @@ END IF CALL GET_CHILD_DIM_ll(2, IDIMX_C, IDIMY_C, IINFO_ll) ! !$20140708 use ZTHVM_C in BIKAT top cal PTHVM_C + ALLOCATE(ZZWS_C(IDIMX_C,IDIMY_C)) + ALLOCATE(ZLSZWSM_C(IDIMX_C,IDIMY_C)) !$**** 3D ALLOCATE(ZUT_C(IDIMX_C,IDIMY_C,SIZE(PUT,3))) ALLOCATE(ZLSUM_C(IDIMX_C,IDIMY_C,SIZE(PUT,3))) @@ -434,6 +444,8 @@ END IF ZVT_C =0. ZWT_C =0. ZTHVT_C =0. + ZZWS_C =0. + ZLSZWSM_C=0. ZHUT_C =0. ZTKET_C =0. ZSRCT_C =0. @@ -449,6 +461,14 @@ END IF ZRVREL_C=0. ZTHREL_C=00 ! + CALL SET_LSFIELD_1WAY_ll(XZWS1(:,:),ZZWS_C(:,:),2) + CALL SET_LSFIELD_1WAY_ll(XLSZWSM1(:,:),ZLSZWSM_C(:,:),2) + ! + CALL LS_FORCING_ll(2, IINFO_ll, .TRUE.) + CALL GO_TOMODEL_ll(2, IINFO_ll) + CALL GOTO_MODEL(2) + CALL UNSET_LSFIELD_1WAY_ll() + ! !$***** 3D VARS DO JI=1,SIZE(PUT,3) CALL GOTO_MODEL(1) @@ -566,6 +586,21 @@ END IF 2,2,IDIMX_C-1,IDIMY_C-1,KDXRATIO,KDYRATIO,3, & LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,ZLSVM_C,PLSVM) CALL MPPDB_CHECK3D(PLSVM,"SPAWN_FIELD2:PLSVM",PRECISION) + +! Interpolation of the ZWS variable at t +! + CALL BIKHARDT (XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, & + XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, & + 2,2,IDIMX_C-1,IDIMY_C-1,KDXRATIO,KDYRATIO,3, & + LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,ZZWS_C,PZWS) + CALL MPPDB_CHECK2D(PZWS,"SPAWN_FIELD2:PZWS",PRECISION) +! + CALL BIKHARDT (XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, & + XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, & + 2,2,IDIMX_C-1,IDIMY_C-1,KDXRATIO,KDYRATIO,3, & + LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,ZLSZWSM_C,PLSZWSM) + CALL MPPDB_CHECK2D(PLSZWSM,"SPAWN_FIELD2:PLSZWSM",PRECISION) +! ! ! Interpolation of variables at t ! @@ -725,6 +760,8 @@ IF (PRESENT(TPSONFILE)) THEN PVT(KIB2:KIE2,KJB2:KJE2,:) = ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) CALL IO_Field_read(TPSONFILE,'WT',ZWORK3D) ! W wind component at time t PWT(KIB2:KIE2,KJB2:KJE2,:) = ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) + CALL IO_Field_read(TPSONFILE,'ZWS',ZWORK2D) ! + PZWS(KIB2:KIE2,KJB2:KJE2) = ZWORK2D(KIB1:KIE1,KJB1:KJE1) ! ! moist variables ! diff --git a/src/MNH/spawn_lsn.f90 b/src/MNH/spawn_lsn.f90 index 74f43ed3e08b907f5d8a4b778f63f4b72249cd79..b7e8c6605ae79c2e98d1c62506da7c0351dbe6a2 100644 --- a/src/MNH/spawn_lsn.f90 +++ b/src/MNH/spawn_lsn.f90 @@ -21,9 +21,9 @@ INTERFACE HLBCX,HLBCY,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2, & PCOEFLIN_LBXM, & PLSTHM,PLSRVM, & - PLSUM,PLSVM,PLSWM, & + PLSUM,PLSVM,PLSWM,PLSZWSM, & PLSTHS,PLSRVS, & - PLSUS,PLSVS,PLSWS ) + PLSUS,PLSVS,PLSWS,PLSZWSS ) ! INTEGER, INTENT(IN) :: KDAD ! number of the DAD model REAL, INTENT(IN) :: PTSTEP ! Time step @@ -48,8 +48,11 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEFLIN_LBXM ! coefficient used for ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSTHM,PLSRVM ! Large Scale fields at t-dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUM,PLSVM,PLSWM ! Large Scale fields at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSM ! Large Scale fields at t-dt + REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHS,PLSRVS ! Large Scale source terms REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUS,PLSVS,PLSWS ! Large Scale source terms +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSS ! END SUBROUTINE SPAWN_LS_n ! @@ -65,10 +68,10 @@ END MODULE MODI_SPAWN_LS_n KDXRATIO,KDYRATIO, & HLBCX,HLBCY,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2, & PCOEFLIN_LBXM, & - PLSTHM,PLSRVM, & + PLSTHM,PLSRVM,PLSZWSM, & PLSUM,PLSVM,PLSWM, & PLSTHS,PLSRVS, & - PLSUS,PLSVS,PLSWS ) + PLSUS,PLSVS,PLSWS,PLSZWSS ) ! ################################################################ ! !!**** *SPAWN_LS_n* - Refresh of the Large Scale sources @@ -125,7 +128,7 @@ END MODULE MODI_SPAWN_LS_n !! Original 22/12/97 !! P. Jabouille 19/04/00 parallelisation !! J.Escobar : 18/12/2015 : Correction of bug in bound in // for NHALO <>1 -!! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -174,8 +177,10 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEFLIN_LBXM ! coefficient used for ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSTHM,PLSRVM ! Large Scale fields at t-dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUM,PLSVM,PLSWM ! Large Scale fields at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSM ! Large Scale fields at t-dt REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHS,PLSRVS ! Large Scale source terms REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUS,PLSVS,PLSWS ! Large Scale source terms +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSS ! ! !* 0.2 declarations of local variables @@ -202,8 +207,10 @@ TYPE(LIST_ll), POINTER :: TZLSFIELD_ll ! list of metric coefficient fields INTEGER :: IINFO_ll, IDIMX, IDIMY REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTLSUM, ZTLSVM, ZTLSWM, ZTLSTHM, ZTLSRVM REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTZS,ZZS +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTZWS REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTZSMT,ZZSMT REAL, DIMENSION(:,:,:), ALLOCATABLE :: Z1,Z2,Z3,Z4,Z5 +REAL, DIMENSION(:,:), ALLOCATABLE :: Z6 ! !------------------------------------------------------------------------------- ! @@ -235,6 +242,7 @@ ALLOCATE(ZTLSVM(IDIMX,IDIMY,SIZE(PLSVM,3))) ALLOCATE(ZTLSWM(IDIMX,IDIMY,SIZE(PLSWM,3))) ALLOCATE(ZTLSTHM(IDIMX,IDIMY,SIZE(PLSTHM,3))) ALLOCATE(ZTLSRVM(IDIMX,IDIMY,SIZE(PLSRVM,3))) +ALLOCATE(ZTZWS(IDIMX,IDIMY)) ! IF(GVERT_INTERP) THEN ALLOCATE(ZTZS (IDIMX,IDIMY,1)) @@ -250,6 +258,7 @@ ALLOCATE(Z2(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3))) ALLOCATE(Z3(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3))) ALLOCATE(Z4(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3))) ALLOCATE(Z5(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3))) +ALLOCATE(Z6(SIZE(XLSUM,1),SIZE(XLSUM,2))) ! Z1=XLSUM+XLSUS*ZTIME CALL SET_LSFIELD_1WAY_ll(Z1, ZTLSUM, KMI) @@ -263,6 +272,10 @@ IF ( SIZE(PLSRVM,1) /= 0 ) THEN Z5=XLSRVM+XLSRVS*ZTIME CALL SET_LSFIELD_1WAY_ll(Z5, ZTLSRVM, KMI) ENDIF +IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + Z6=XLSZWSM+XLSZWSS*ZTIME + CALL SET_LSFIELD_1WAY_ll(Z6, ZTZWS, KMI) +ENDIF ! IF ( GVERT_INTERP ) THEN CALL SET_LSFIELD_1WAY_ll(ZZS, ZTZS, KMI) @@ -273,7 +286,7 @@ ENDIF ! CALL LS_FORCING_ll(KMI, IINFO_ll) ! -DEALLOCATE(Z1,Z2,Z3,Z4,Z5) +DEALLOCATE(Z1,Z2,Z3,Z4,Z5,Z6) ! ! 1.5 Back to the (current) child model ! @@ -355,6 +368,12 @@ IF ( SIZE(PLSRVM,1) /= 0 ) THEN 2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1, & HLBCX,HLBCY,ZTLSRVM,PLSRVS(IIB:IIE,IJB:IJE,:)) END IF +IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + CALL BIKHARDT (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, & + PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, & + 2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1, & + HLBCX,HLBCY,ZTZWS,PLSZWSS(IIB:IIE,IJB:IJE)) +END IF ! !* 3.2 Vertical linear interpolation on the mass grid ! @@ -384,6 +403,9 @@ PLSTHS(:,:,:) = (PLSTHS(:,:,:) - PLSTHM(:,:,:)) / ZTIME IF ( SIZE(PLSRVM,1) /= 0 ) THEN PLSRVS(:,:,:) = (PLSRVS(:,:,:) - PLSRVM(:,:,:)) / ZTIME END IF +IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + PLSZWSS(:,:) = (PLSZWSS(:,:) - PLSZWSM(:,:)) / ZTIME +END IF ! !------------------------------------------------------------------------------ ! @@ -454,6 +476,7 @@ PLSVS(:,:,:) = (PLSVS(:,:,:) - PLSVM(:,:,:)) / ZTIME ! DEALLOCATE(ZTLSUM,ZTLSVM,ZTLSWM,ZTLSTHM,ZTLSRVM) IF(GVERT_INTERP) DEALLOCATE(ZTZS,ZZS) +DEALLOCATE(ZTLSUM,ZTLSVM,ZTLSWM,ZTLSTHM,ZTLSRVM,ZTZWS) IF(GVERT_INTERP) DEALLOCATE(ZTZSMT,ZZSMT) ! NULLIFY(TZLSFIELD_ll) @@ -462,6 +485,7 @@ CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSVS) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSWS) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSTHS) IF(SIZE(PLSRVM) /= 0) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSRVS) +IF(SIZE(PLSZWSM) /= 0) CALL ADD2DFIELD_ll(TZLSFIELD_ll, PLSZWSS) CALL UPDATE_HALO_ll(TZLSFIELD_ll,IINFO_ll) CALL CLEANLIST_ll(TZLSFIELD_ll) !------------------------------------------------------------------------------ diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90 index b54c1e9e30b07e2e2137c877fe50b2f91961307d..24e5b49b47e6fd51f5f8832e05edad824ca61593 100644 --- a/src/MNH/spawn_model2.f90 +++ b/src/MNH/spawn_model2.f90 @@ -193,6 +193,7 @@ END MODULE MODI_SPAWN_MODEL2 !! 10/2016 (C.Lac) Add droplet deposition !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -704,6 +705,8 @@ ALLOCATE(ZJ(IIU,IJU,IKU)) ! !* 4.2 Prognostic (and diagnostic) variables (module MODD_FIELD2) : ! +ALLOCATE(XZWS(IIU,IJU)) +ALLOCATE(XLSZWSM(IIU,IJU)) ALLOCATE(XUT(IIU,IJU,IKU)) ALLOCATE(XVT(IIU,IJU,IKU)) ALLOCATE(XWT(IIU,IJU,IKU)) @@ -1118,18 +1121,18 @@ ALLOCATE(ZHUT(IIU,IJU,IKU)) MPPDB_CHECK_LB = .TRUE. IF (GNOSON) THEN CALL SPAWN_FIELD2 (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,CTURB, & - XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,XATC, & + XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,XZWS,XATC, & XSRCT,XSIGS, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM, & + XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM, & XDTHFRC,XDRVFRC,XTHREL,XRVREL, & XVU_FLUX_M,XVTH_FLUX_M,XWTH_FLUX_M ) CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 after SPAWN_FIELD2:XUT",PRECISION) ELSE CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 before SPAWN_FIELD2:XUT",PRECISION) CALL SPAWN_FIELD2 (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,CTURB, & - XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,XATC, & + XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,XZWS,XATC, & XSRCT,XSIGS, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM, & + XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM, & XDTHFRC,XDRVFRC,XTHREL,XRVREL, & XVU_FLUX_M, XVTH_FLUX_M,XWTH_FLUX_M, & TZSONFILE,IIUSON,IJUSON, & diff --git a/src/MNH/spawning.f90 b/src/MNH/spawning.f90 index 4e654fff1a5c861403f7daecffc5a958b379936e..16867d7f2c1cac9c3ebd56d546add0e8a389cc42 100644 --- a/src/MNH/spawning.f90 +++ b/src/MNH/spawning.f90 @@ -76,6 +76,7 @@ !! 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 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -294,12 +295,14 @@ XRT1 => XRT XUT1 => XUT XVT1 => XVT XWT1 => XWT +XZWS1 => XZWS XSRCT1 => XSRCT XSIGS1 => XSIGS TDTCUR1 => TDTCUR XLSUM1 => XLSUM XLSVM1 => XLSVM XLSWM1 => XLSWM +XLSZWSM1 => XLSZWSM XLSTHM1 => XLSTHM XLSRVM1 => XLSRVM ! diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90 index 5e789e752b255bf7d6cecb36fcf4fcb429a5223b..32f0fd5835e0e93685737ecda1cee76b6bffd2c0 100644 --- a/src/MNH/write_lbn.f90 +++ b/src/MNH/write_lbn.f90 @@ -76,6 +76,7 @@ END MODULE MODI_WRITE_LB_n !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! J.-P. Pinty 09/02/16 Add LIMA that is LBC for CCN and IFN !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -111,6 +112,8 @@ USE MODI_CH_AER_REALLFI_n USE MODD_CONF USE MODD_REF, ONLY : XRHODREFZ USE MODD_CONF, ONLY : CPROGRAM +USE MODD_GRID_n, ONLY : XZZ +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT USE MODD_DUST USE MODD_SALT USE MODI_DUSTLFI_n @@ -144,6 +147,12 @@ INTEGER :: JK INTEGER :: JMOM, IMOMENTS, JMODE, ISV_NAME_IDX INTEGER :: IMI ! Current model index CHARACTER(LEN=2) :: INDICE ! to index CCN and IFN fields of LIMA scheme +INTEGER :: I +INTEGER :: ILBX,ILBY +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE +INTEGER :: IIU, IJU, IKU +REAL, DIMENSION(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)) :: ZLBXZZ +REAL, DIMENSION(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)) :: ZLBYZZ CHARACTER(LEN=100) :: YMSG TYPE(TFIELDDATA) :: TZFIELD !------------------------------------------------------------------------------- @@ -154,6 +163,16 @@ TYPE(TFIELDDATA) :: TZFIELD ILUOUT = TLUOUT%NLU ! IMI = GET_CURRENT_MODEL_INDEX() + +IIB=JPHEXT+1 +IIE=SIZE(XZZ,1)-JPHEXT +IIU=SIZE(XZZ,1) +IJB=JPHEXT+1 +IJE=SIZE(XZZ,2)-JPHEXT +IJU=SIZE(XZZ,2) +IKB=JPVEXT+1 +IKE=SIZE(XZZ,3)-JPVEXT +IKU=SIZE(XZZ,3) ! ! 2. WRITE THE DIMENSION OF LB FIELDS ! -------------------------------- @@ -456,7 +475,7 @@ IF (NSV >=1) THEN END IF ! TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CUNITS = 'ppp' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -664,7 +683,7 @@ IF (NSV >=1) THEN !in the same order as the variables in XSVM (i.e. following JPDUSTORDER) ! TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CUNITS = 'ppp' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -717,6 +736,19 @@ IF (NSV >=1) THEN DO JK=1,size(XLBYSVM,3) ZRHODREFY(:,:,JK) = XRHODREFZ(JK) ENDDO + IIU = SIZE(XZZ,1) + IJU = SIZE(XZZ,2) + IKU = SIZE(XZZ,3) + IF (SIZE(ZLBXZZ) .NE. 0 ) THEN + ILBX=SIZE(ZLBXZZ,1)/2-1 + ZLBXZZ(1:ILBX+1,:,:) = XZZ(IIB-1:IIB-1+ILBX,:,:) + ZLBXZZ(ILBX+2:2*ILBX+2,:,:) = XZZ(IIE+1-ILBX:IIE+1,:,:) + ENDIF + IF (SIZE(ZLBYZZ) .NE. 0 ) THEN + ILBY=SIZE(ZLBYZZ,2)/2-1 + ZLBYZZ(:,1:ILBY+1,:) = XZZ(:,IJB-1:IJB-1+ILBY,:) + ZLBYZZ(:,ILBY+2:2*ILBY+2,:) = XZZ(:,IJE+1-ILBY:IJE+1,:) + ENDIF IF (NSIZELBXSV_ll /= 0) & XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0.) IF (NSIZELBYSV_ll /= 0) & @@ -727,16 +759,16 @@ IF (NSV >=1) THEN XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX(XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0.) IF ((LSLTINIT).OR.(LSLTPRES)) THEN ! GRIBEX case (dust initialization) IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX) + CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ) END IF IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY) + CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ) END IF IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX) + CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ) END IF IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY) + CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ) END IF END IF ! @@ -810,7 +842,7 @@ IF (NSV >=1) THEN ! We are in the subprogram MESONH, CSALTNAMES are allocated and are !in the same order as the variables in XSVM (i.e. following JPSALTORDER) TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CUNITS = 'ppp' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL diff --git a/src/MNH/write_lesn.f90 b/src/MNH/write_lesn.f90 index f269d460d47d5cdc59f20fdaf0e006dc849b2bfb..1ae4ad90c4df2ed27e600a5de13bbcc226ba3c50 100644 --- a/src/MNH/write_lesn.f90 +++ b/src/MNH/write_lesn.f90 @@ -56,7 +56,8 @@ END MODULE MODI_WRITE_LES_n !! 11/15 (C.Lac) Add production terms of TKE !! 10/2016 (C.Lac) Add droplet deposition !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +!!!! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic + !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -382,6 +383,10 @@ IF (LUSERR) & CALL LES_DIACHRO_MASKS(TPDIAFILE,"MEAN_RR ",YSUBTITLE(:), & "Mean Rr Profile"//YSUBTITLE(:),"kg kg-1",XLES_MEAN_Rr,HLES_AVG) +IF (LUSERR) & +CALL LES_DIACHRO_MASKS(TPDIAFILE,"MEAN_RF ",YSUBTITLE(:), & + "Mean RF Profile"//YSUBTITLE(:),"1",XLES_MEAN_RF,HLES_AVG) + IF (LUSERI) & CALL LES_DIACHRO_MASKS(TPDIAFILE,"MEAN_RI ",YSUBTITLE(:), & "Mean Ri Profile"//YSUBTITLE(:),"kg kg-1",XLES_MEAN_Ri,HLES_AVG) diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index c81ac0f78b8fa326bf02f9f427f60ab7b78c3c85..086c612361f34deb835812a13f8dec670c0500a1 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -142,6 +142,8 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! D.Ricard and P.Marquet 2016-2017 : THETAL + THETAS1 POVOS1 or THETAS2 POVOS2 !! if LMOIST_L LMOIST_S1 or LMOIST_S2 +! P. Wautelet 08/02/2019: minor bug: compute ZWORK36 only when needed +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -429,6 +431,7 @@ CALL IO_Field_write(TPFILE,'ZHAT',XZHAT) CALL IO_Field_write(TPFILE,'ZTOP',XZTOP) ! CALL IO_Field_write(TPFILE,'ZS', XZS) +CALL IO_Field_write(TPFILE,'ZWS', XZWS) CALL IO_Field_write(TPFILE,'ZSMT', XZSMT) CALL IO_Field_write(TPFILE,'SLEVE',LSLEVE) ! @@ -738,14 +741,14 @@ 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) 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) ENDIF - ZWORK35(:,:,:) = GX_U_M(1,IKU,1,ZWORK31,XDXX,XDZZ,XDZX) + GY_V_M(1,IKU,1,ZWORK32,XDYY,XDZZ,XDZY) - ZWORK36(:,:,:) = GX_U_M(1,IKU,1,ZWORK33,XDXX,XDZZ,XDZX) + GY_V_M(1,IKU,1,ZWORK34,XDYY,XDZZ,XDZY) ! ! Integration sur 3000 m ! @@ -1528,14 +1531,14 @@ IF (LSALT) THEN TZFIELD%LTIMEDEP = .TRUE. ! DO JJ=1,NMODE_SLT - TZFIELD%CMNHNAME = 'SLTRGA' - TZFIELD%CLONGNAME = 'SLTRGA' + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTRGA',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) SALT MODE ',JJ CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SLT(:,:,:,JJ)) ! - TZFIELD%CMNHNAME = 'SLTRGAM' - TZFIELD%CLONGNAME = 'SLTRGAM' + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTRGAM',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) SALT MODE ',JJ ZWORK31(:,:,:)=ZRG_SLT(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_SLT(:,:,:,JJ)))**2)) @@ -1706,14 +1709,14 @@ IF (LDUST) THEN CALL PPP2DUST(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND),XRHODREF,& PSIG3D=ZSIG_DST, PRG3D=ZRG_DST, PN3D=ZN0_DST) DO JJ=1,NMODE_DST - TZFIELD%CMNHNAME = 'DSTRGA' - TZFIELD%CLONGNAME = 'DSTRGA' + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTRGA',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) DUST MODE ',JJ CALL IO_Field_write(TPFILE,TZFIELD,ZRG_DST(:,:,:,JJ)) ! - TZFIELD%CMNHNAME = 'DSTRGAM' - TZFIELD%CLONGNAME = 'DSTRGAM' + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTRGAM',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) DUST MODE ',JJ ZWORK31(:,:,:)=ZRG_DST(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_DST(:,:,:,JJ)))**2)) diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index f08abfb1593d357c0c02505093c418d337b125ad..a58b90932f844534eaa6bfc1213b03eab95bab45 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -169,7 +169,8 @@ END MODULE MODI_WRITE_LFIFM_n !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! V. Vionnet 07/2017, add blowing snow variables !! P.Wautelet 11/01/2019: bug correction in write XBL_DEPTH->XSBL_DEPTH -!! +!! C.Lac 18/02/2019: add rain fraction as an output field +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -393,6 +394,9 @@ IF (.NOT.LCARTESIAN) THEN END IF ! CALL IO_Field_write(TPFILE,'ZS', XZS) +IF(ASSOCIATED(XZWS)) THEN + CALL IO_Field_write(TPFILE,'ZWS', XZWS) +END IF CALL IO_Field_write(TPFILE,'ZSMT', XZSMT) CALL IO_Field_write(TPFILE,'SLEVE',LSLEVE) ! @@ -1249,9 +1253,9 @@ IF (NSV >=1) THEN ! sea salt scalar variables IF (LSALT) THEN IF ((CPROGRAM == 'REAL ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT)) & - CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF) + CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ) IF ((CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1).AND.(IMI==1)) & - CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF) + CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ) !At this point, we have the tracer array in order of importance, i.e. !if mode 2 is most important it will occupy place 1-3 of XSVT IF (((CPROGRAM == 'REAL ').AND.(LSLTINIT)).OR.& @@ -1517,6 +1521,7 @@ ENDIF ! IF (NRR > 1 .AND. CPROGRAM == 'MESONH') THEN CALL IO_Field_write(TPFILE,'CLDFR',XCLDFR) + CALL IO_Field_write(TPFILE,'RAINFR',XRAINFR) END IF ! ! diff --git a/src/Makefile b/src/Makefile index ef4e4220cf8b008d851c17ba137fa40a7bf4382a..57b158f16ffcefc0f28ef9192ff29175a580f425 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,6 +1,6 @@ -#MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +#MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier #MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -#MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +#MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt #MNH_LIC for details. version 1. ########################################################## # # @@ -58,7 +58,7 @@ include Rules.$(ARCH)$(F).mk # All modification are allowed !!!!! # # adding new subroutines # # or # -# adding new modules # +# adding new modules # # # # REM : if during modification, you deleting some # # FORTRAN subroutines you must also deleted the # @@ -339,8 +339,8 @@ gribapi_clean : ########################################################## ifeq "$(VER_CDF)" "CDFAUTO" # -HDF_OPT = ${OPT_BASE_I4:-$OPT_BASE} -NETCDF_OPT = ${OPT_BASE_I4:-$OPT_BASE} +HDF_OPT ?= ${OPT_BASE_I4:-$OPT_BASE} +NETCDF_OPT ?= ${OPT_BASE_I4:-$OPT_BASE} # cdf : $(CDF_MOD) $(CDF_MOD) : @@ -352,6 +352,12 @@ $(CDF_MOD) : cd ${DIR_CDFC} && ./configure --disable-shared --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 --disable-dap \ CC="$(CC)" CFLAGS="$(NETCDF_OPT)" CPPFLAGS="${INC_NETCDF}" ${CDF_CONF} LDFLAGS="-L${CDF_PATH}/lib64" LIBS="-lhdf5_hl -lhdf5 -lsz -laec -lz" && \ $(MAKE) && $(MAKE) install && $(MAKE) clean +ifdef MNH_FOREFIRE + cd ${DIR_CDFCXX} && ./configure --disable-shared --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 \ + CXX="$(CXX)" CXXFLAGS="$(NETCDF_OPT)" FC="$(FC)" FCFLAGS="$(NETCDF_OPT) $(NETCDF_SUPPFLAGS)" FFLAGS="$(NETCDF_OPT)" \ + CPPFLAGS="${INC_NETCDF}" ${CDF_CONF} LDFLAGS="-L${CDF_PATH}/lib64" LIBS="-lnetcdf -lhdf5_hl -lhdf5 -lsz -laec -lz" && \ + $(MAKE) && $(MAKE) install && $(MAKE) clean +endif cd ${DIR_CDFF} && ./configure --disable-shared --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 \ CC="$(CC)" CFLAGS="$(NETCDF_OPT)" FC="$(FC)" FCFLAGS="$(NETCDF_OPT) $(NETCDF_SUPPFLAGS)" FFLAGS="$(NETCDF_OPT)" \ CPPFLAGS="${INC_NETCDF}" ${CDF_CONF} LDFLAGS="-L${CDF_PATH}/lib64" LIBS="-lnetcdf -lhdf5_hl -lhdf5 -lsz -laec -lz" && \ @@ -363,6 +369,9 @@ cleancdf : cd ${DIR_LIBAEC} && $(MAKE) clean cd ${DIR_HDF} && $(MAKE) clean cd ${DIR_CDFC} && $(MAKE) clean +ifdef MNH_FOREFIRE + cd ${DIR_CDFCXX} && $(MAKE) clean +endif cd ${DIR_CDFF} && $(MAKE) clean endif ########################################################## @@ -380,8 +389,26 @@ cleanmaster : cleanoasis cleanoasis : - [ -d ${OASIS_PATH} ] && rm -fr ${OASIS_PATH} endif +########################################################## +# # +# EXTRA LIB : S4PY # +# # +########################################################## +ifdef MNH_S4PY +all : libs4py.so +OBJ_S4PY=$(OBJDIR_MASTER)/spll_wcompress_field.o $(OBJDIR_MASTER)/spll_wdecompress_field.o \ +$(OBJDIR_MASTER)/spll_wget_compheader.o $(OBJDIR_MASTER)/spll_wlficas.o \ +$(OBJDIR_MASTER)/spll_wlfiecr.o $(OBJDIR_MASTER)/spll_wlfifer.o \ +$(OBJDIR_MASTER)/spll_wlfilec.o $(OBJDIR_MASTER)/spll_wlfinaf.o \ +$(OBJDIR_MASTER)/spll_wlfinfo.o $(OBJDIR_MASTER)/spll_wlfiouv.o $(OBJDIR_MASTER)/spll_wlfipos.o \ +$(OBJDIR_MASTER)/spll_NEWLFI_ALL.o $(OBJDIR_MASTER)/spll_lockasgn.o \ +$(OBJDIR_MASTER)/spll_lockoff.o $(OBJDIR_MASTER)/spll_lockon.o $(OBJDIR_MASTER)/spll_lockrel.o \ +$(OBJDIR_MASTER)/fswap8buff.o $(OBJDIR_MASTER)/spll_remark2.o +libs4py.so : progmaster + $(CC) -shared $(LDFLAGS) -o $(OBJDIR_MASTER)/$@ $(OBJ_S4PY) $(LIBS) +endif ########################################################## # # # PROGRAM RULES # diff --git a/src/Makefile.MESONH.mk b/src/Makefile.MESONH.mk index dec8ef951b1034ce02176b1fbded65f365c62729..3aa94d76ffaa1a3af42ec426573e5e30845d9387 100644 --- a/src/Makefile.MESONH.mk +++ b/src/Makefile.MESONH.mk @@ -1,6 +1,6 @@ -#MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +#MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier #MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -#MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +#MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt #MNH_LIC for details. version 1. ########################################################## # # @@ -242,6 +242,30 @@ VPATH += $(DIR_NEWLFI) #ARCH_XYZ := $(ARCH_XYZ)-$(VER_NEWLFI) endif ########################################################## +# Source COMPRESS # +########################################################## +ifdef MNH_COMPRESS +DIR_COMPRESS = ../LIBTOOLS/lib/COMPRESS/src +INC_COMPRESS = -I$(B)$(DIR_COMPRESS) +DIR_MASTER += $(DIR_COMPRESS) +OBJS_LISTE_MASTER += bitbuff.o nearestpow2.o +INC += $(INC_COMPRESS) +VPATH += $(DIR_COMPRESS) +CPPFLAGS_COMPRESS ?= -DLITTLE_endian +CPPFLAGS += $(CPPFLAGS_COMPRESS) +endif +########################################################## +# Source S4PY # +########################################################## +ifdef MNH_S4PY +DIR_S4PY = LIB/s4py +INC_S4PY = -I$(B)$(DIR_S4PY) +DIR_MASTER += $(DIR_S4PY) +OBJS_LISTE_MASTER += init_gfortran.o +INC += $(INC_S4PY) +VPATH += $(DIR_S4PY) +endif +########################################################## # Source FOREFIRE # ########################################################## ifdef MNH_FOREFIRE @@ -252,6 +276,7 @@ OBJS_LISTE_MASTER += C_ForeFire_Interface.o INC += $(INC_FOREFIRE) VPATH += $(DIR_FOREFIRE) CPPFLAGS += -DMNH_FOREFIRE +ARCH_XYZ := $(ARCH_XYZ)-FF endif ########################################################## # Source TOOLS # @@ -467,6 +492,7 @@ endif # ifeq "$(VER_CDF)" "CDFAUTO" DIR_CDFC?=${SRC_MESONH}/src/LIB/netcdf-${VERSION_CDFC} +DIR_CDFCXX?=${SRC_MESONH}/src/LIB/netcdf-cxx-${VERSION_CDFCXX} DIR_CDFF?=${SRC_MESONH}/src/LIB/netcdf-fortran-${VERSION_CDFF} CDF_PATH?=${SRC_MESONH}/src/LIB/netcdf-${ARCH}-R${MNH_REAL}I${MNH_INT} CDF_MOD?=${CDF_PATH}/include/netcdf.mod diff --git a/src/Rules.AIX64.mk b/src/Rules.AIX64.mk index c4ef4492eee78739b86f173fac6967d98ddd59a7..2324039953ef2d7ef7b676cec5241af35b39ae9c 100644 --- a/src/Rules.AIX64.mk +++ b/src/Rules.AIX64.mk @@ -101,6 +101,16 @@ CNAME_GRIBEX="" #if MNH_TOOLS exists => compile the tools MNH_TOOLS = yes # +## COMPRESS flag +# +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +MNH_COMPRESS=yes +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no +# ########################################################## # # # Source of MESONH PACKAGE Distribution # diff --git a/src/Rules.BG.mk b/src/Rules.BG.mk index 27714a08ab0da4d517e5d9367ad918a9d62e4cc5..ced46f4b4675a32db16d0937fc2f313d6a1b4ea2 100644 --- a/src/Rules.BG.mk +++ b/src/Rules.BG.mk @@ -112,6 +112,16 @@ CNAME_GRIBEX="" #if MNH_TOOLS exists => compile the tools #MNH_TOOLS = no # +## COMPRESS flag +# +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +#MNH_COMPRESS=no +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no +# ########################################################## # # # Source of MESONH PACKAGE Distribution # diff --git a/src/Rules.BGQ.mk b/src/Rules.BGQ.mk index ae3daf2777e3423ba880a4b4c4a39613d411872c..69d8268ebc1a5de8111437a1cf437ba4f66d63d3 100644 --- a/src/Rules.BGQ.mk +++ b/src/Rules.BGQ.mk @@ -171,6 +171,16 @@ GRIBAPI_CONF= --host=powerpc64-bgq-linux #if MNH_TOOLS exists => compile the tools #MNH_TOOLS = no # +## COMPRESS flag +# +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +#MNH_COMPRESS=no +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no +# ########################################################## # # # Source of MESONH PACKAGE Distribution # diff --git a/src/Rules.LXNAGfor.mk b/src/Rules.LXNAGfor.mk index 9a40610466148ba8a3231a40a8ed40a468673149..6d4220480813871f4efeffe54534c24959be9e02 100644 --- a/src/Rules.LXNAGfor.mk +++ b/src/Rules.LXNAGfor.mk @@ -94,6 +94,16 @@ NETCDF_SUPPFLAGS = -dusty -kind=byte #if MNH_TOOLS exists => compile the tools MNH_TOOLS = yes # +## COMPRESS flag +# +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +MNH_COMPRESS=yes +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no +# ########################################################## # # # Source of MESONH PACKAGE Distribution # @@ -121,5 +131,5 @@ OBJS_I4=spll_modd_netcdf.o $(OBJS_I4) : OPT = $(OPT_BASE_I4) endif # -LIST_MISMATCH=MPI_Allgatherv,MPI_Allreduce,MPI_Bcast,MPI_Bsend,MPI_Gather,MPI_Gatherv,MPI_Recv,LEPOLY +LIST_MISMATCH=MPI_Allgatherv,MPI_Allreduce,MPI_Bcast,MPI_Bsend,MPI_Gather,MPI_Gatherv,MPI_Recv,LEPOLY,EXTRACT_BBUFF,FILL_BBUFF diff --git a/src/Rules.LXarm.mk b/src/Rules.LXarm.mk index 9e959994231b56a93294b10df67b694f4881dcff..7a612027dcffb6b1140107fcd9f0e0da63affa7d 100644 --- a/src/Rules.LXarm.mk +++ b/src/Rules.LXarm.mk @@ -116,7 +116,15 @@ MNH_TOOLS=yes endif endif # +## COMPRESS flag # +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +MNH_COMPRESS=yes +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no # ########################################################## # # diff --git a/src/Rules.LXcray.mk b/src/Rules.LXcray.mk index 5898140d280b750d12947a3d51dc2d4e72292ebf..3602bcc51402db97b7794ee09faba18315f52ce4 100644 --- a/src/Rules.LXcray.mk +++ b/src/Rules.LXcray.mk @@ -109,6 +109,16 @@ GRIBAPI_CONF="FCFLAGS= -em -ef " #if MNH_TOOLS exists => compile the tools MNH_TOOLS = yes # +## COMPRESS flag +# +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +MNH_COMPRESS=yes +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no +# ########################################################## # # # Source of MESONH PACKAGE Distribution # diff --git a/src/Rules.LXg95.mk b/src/Rules.LXg95.mk index f326e14f5e1fdb021c171e201d6cd761a2c18afa..62b3d39ca93b2d91dfb9bd15ea2cea879fe869a9 100644 --- a/src/Rules.LXg95.mk +++ b/src/Rules.LXg95.mk @@ -81,6 +81,16 @@ CNAME_GRIBEX=g95 #if MNH_TOOLS exists => compile the tools MNH_TOOLS = yes # +## COMPRESS flag +# +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +MNH_COMPRESS=yes +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no +# ########################################################## # # # Source of MESONH PACKAGE Distribution # diff --git a/src/Rules.LXgfortran.mk b/src/Rules.LXgfortran.mk index e182448b3e133c37ed59150e19797aca84ea1d3a..ce4c05ef73dc8cb7ae46c7d24d74e7f38f3eda69 100644 --- a/src/Rules.LXgfortran.mk +++ b/src/Rules.LXgfortran.mk @@ -58,6 +58,7 @@ endif # # CC = gcc +CXX = g++ FC = gfortran ifeq "$(VER_MPI)" "MPIAUTO" F90 = mpif90 @@ -97,6 +98,8 @@ CNAME_GRIBEX=_gfortran # Netcdf/HDF5 flags # HDF_CONF= CFLAGS=-std=c99 +HDF_OPT ?= -fPIC +NETCDF_OPT ?= -fPIC # ## LIBTOOLS flags # @@ -107,7 +110,15 @@ MNH_TOOLS=yes endif endif # +## COMPRESS flag # +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +MNH_COMPRESS=yes +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no # ########################################################## # # diff --git a/src/Rules.LXifort.mk b/src/Rules.LXifort.mk index 8321534b0da08027fdc41774c59f1c08dc58fffe..1133f292bc994c6766f112d0ab8b67b9b5996cf7 100644 --- a/src/Rules.LXifort.mk +++ b/src/Rules.LXifort.mk @@ -128,6 +128,7 @@ endif # # CC ?= gcc +CXX ?= g++ FC = ifort ifeq "$(VER_MPI)" "MPIAUTO" ifneq "$(findstring TAU,$(XYZ))" "" @@ -191,6 +192,12 @@ endif TARGET_GRIBEX=linux CNAME_GRIBEX=ifort # +# Netcdf/HDF5 flags +# +HDF_CONF= CFLAGS=-std=c99 +HDF_OPT ?= -fPIC +NETCDF_OPT ?= -fPIC +# # LIBTOOLS flags # #if MNH_TOOLS exists => compile the tools @@ -198,6 +205,16 @@ ifeq "$(MNH_INT)" "4" MNH_TOOLS=yes endif # +## COMPRESS flag +# +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +MNH_COMPRESS=yes +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no +# ########################################################## # # # Source of MESONH PACKAGE Distribution # diff --git a/src/Rules.LXpathf95.mk b/src/Rules.LXpathf95.mk index 79a8e1c75211f03099530892f7d2fd9c39964bb9..cc0d1aa43f16cb6228b7598a690e22bd283dc7df 100644 --- a/src/Rules.LXpathf95.mk +++ b/src/Rules.LXpathf95.mk @@ -57,6 +57,16 @@ CNAME_GRIBEX=pathf95 #if MNH_TOOLS exists => compile the tools MNH_TOOLS = yes # +## COMPRESS flag +# +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +MNH_COMPRESS=yes +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no +# ########################################################## # # # Source of MESONH PACKAGE Distribution # diff --git a/src/Rules.LXpgi.mk b/src/Rules.LXpgi.mk index 4bb43023e46a300864b9db96f1ae9ddbfcc16d29..6296bbea4a82435b69e51a18c2b65dbcfe1a9845 100644 --- a/src/Rules.LXpgi.mk +++ b/src/Rules.LXpgi.mk @@ -116,6 +116,16 @@ CNAME_GRIBEX=_pgf77 #if MNH_TOOLS exists => compile the tools MNH_TOOLS = yes # +## COMPRESS flag +# +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +MNH_COMPRESS=yes +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no +# ########################################################## # # # Source of MESONH PACKAGE Distribution # diff --git a/src/Rules.SX8.mk b/src/Rules.SX8.mk index e5bb540f66d76050a6a8b064dbf354dbf02f4736..abbaf87223dc98a19966a3ffc2103598aa463696 100644 --- a/src/Rules.SX8.mk +++ b/src/Rules.SX8.mk @@ -103,6 +103,16 @@ CNAME_GRIBEX=sxmpif90 #if MNH_TOOLS exists => compile the tools #MNH_TOOLS = no # +## COMPRESS flag +# +#if MNH_COMPRESS exists => compile the COMPRESS library (for LFI files) +#MNH_COMPRESS=no +# +## S4PY flag +# +#if MNH_S4PY exists => compile the libs4py library (for epygram) +#MNH_S4PY=no +# ########################################################## # # # Source of MESONH PACKAGE Distribution # diff --git a/src/SURFEX/average_diag.F90 b/src/SURFEX/average_diag.F90 index 14364414e2a727b0a4b755b47730504e59c2ca61..158ea03afe9871fea872a33336159082b6ca6aec 100644 --- a/src/SURFEX/average_diag.F90 +++ b/src/SURFEX/average_diag.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2003-2019 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ######### SUBROUTINE AVERAGE_DIAG(PFRAC_TILE, DGO, D, ND, DC, NDC ) @@ -37,6 +37,7 @@ !! Modified 08/2009 (B. Decharme) : new diag ! 02/2010 - S. Riette - Security for wind average in case of XUNDEF values ! B. decharme 04/2013 : Add EVAP and SUBL diag +! P. Wautelet 02/2019: bug: fixed intent of PFIELD_OUT (OUT->INOUT) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -323,7 +324,7 @@ IMPLICIT NONE ! REAL, DIMENSION(:),INTENT(IN) :: PFRAC REAL, DIMENSION(:),INTENT(IN) :: PFIELD_IN -REAL, DIMENSION(:), INTENT(OUT) :: PFIELD_OUT +REAL, DIMENSION(:), INTENT(INOUT) :: PFIELD_OUT INTEGER, INTENT(IN) :: KTILE REAL(KIND=JPRB) :: ZHOOK_HANDLE INTEGER :: JT @@ -350,7 +351,7 @@ IMPLICIT NONE ! REAL, DIMENSION(:),INTENT(IN) :: PFRAC REAL, DIMENSION(:,:),INTENT(IN) :: PFIELD_IN -REAL, DIMENSION(:,:), INTENT(OUT) :: PFIELD_OUT +REAL, DIMENSION(:,:), INTENT(INOUT) :: PFIELD_OUT INTEGER, INTENT(IN) :: KTILE REAL(KIND=JPRB) :: ZHOOK_HANDLE INTEGER :: JT, JL @@ -379,7 +380,7 @@ IMPLICIT NONE REAL, DIMENSION(:),INTENT(IN) :: PFRAC REAL, DIMENSION(:),INTENT(IN) :: PFIELD_IN REAL, DIMENSION(:),INTENT(IN) :: PREF -REAL, DIMENSION(:), INTENT(OUT) :: PFIELD_OUT +REAL, DIMENSION(:), INTENT(INOUT) :: PFIELD_OUT INTEGER, INTENT(IN) :: KTILE REAL(KIND=JPRB) :: ZHOOK_HANDLE ! @@ -413,7 +414,7 @@ IMPLICIT NONE ! REAL, DIMENSION(:),INTENT(IN) :: PFRAC REAL, DIMENSION(:),INTENT(IN) :: PFIELD_IN -REAL, DIMENSION(:), INTENT(OUT) :: PFIELD_OUT +REAL, DIMENSION(:), INTENT(INOUT) :: PFIELD_OUT INTEGER, INTENT(IN) :: KTILE REAL, DIMENSION(:), INTENT(INOUT) :: PLAND REAL, DIMENSION(:), INTENT(INOUT) :: PSEA diff --git a/src/SURFEX/bilin_value.F90 b/src/SURFEX/bilin_value.F90 index f4aac84c2e69c97f7092bddfdd7178fec9c166fc..48bf32aaa3335f04288061dc54d8d8cb34df244a 100644 --- a/src/SURFEX/bilin_value.F90 +++ b/src/SURFEX/bilin_value.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2004-2019 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ######### SUBROUTINE BILIN_VALUE (KLUOUT,KX,KY,PFIELD1,PCX,PCY,KCI,KCJ,PFIELD2) @@ -77,7 +77,7 @@ !! !! Original 01/2004 ! TD&DD: added OpenMP directives - +! P. Wautelet 08/02/2019: initialize ZFIELD1 even if of size=1 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -200,7 +200,8 @@ ELSE IS2 = IBOR(2,2,0)-IBOR(2,1,0)+1 ISIZE = IS1*IS2 ALLOCATE(ZFIELD1(IS1,IS2,INL)) - IF (SUM(IBOR(:,:,0))/=0) THEN + IF(ISIZE==1) ZFIELD1(:,:,:) = XUNDEF !Necessary to initialize ZFIELD1 in all cases (value could be anything) + IF (SUM(IBOR(:,:,0))/=0) THEN DO JL=IBOR(2,1,0),IBOR(2,2,0) ZFIELD1(:,JL-IBOR(2,1,0)+1,:) = PFIELD1(KX*(JL-1)+IBOR(1,1,0):KX*(JL-1)+IBOR(1,2,0),:) ENDDO diff --git a/src/SURFEX/convert_patch_isba.F90 b/src/SURFEX/convert_patch_isba.F90 index 0ad47ed03181fa254b9bb6478e062eaa474c80b7..cad66666339946c838b566938c50ad491b38e4f0 100644 --- a/src/SURFEX/convert_patch_isba.F90 +++ b/src/SURFEX/convert_patch_isba.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2010-2019 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ######### SUBROUTINE CONVERT_PATCH_ISBA (DTCO, DTV, IO, KDEC, KDEC2, PCOVER, OCOVER,& @@ -45,7 +45,8 @@ !! albedo, UV albedo not defined (conserv nrj when !! coupled to atmosphere) !! P Samuelsson 10/2014 MEB -!! +! P. Wautelet 15/02/2019: bugfix: allocate ZSTRESS only when its size has a meaning +! !---------------------------------------------------------------------------- ! !* 0. DECLARATION @@ -671,13 +672,14 @@ SUBROUTINE SET_STRESS IMPLICIT NONE ! REAL, DIMENSION(PK%NSIZE_P) :: ZWORK -REAL, DIMENSION(SIZE(DTV%LPAR_STRESS,1),NVEGTYPE) :: ZSTRESS +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSTRESS INTEGER :: JI REAL(KIND=JPRB) :: ZHOOK_HANDLE ! IF (LHOOK) CALL DR_HOOK('CONVERT_PATCH_ISBA:SET_STRESS',0,ZHOOK_HANDLE) ! IF (GDATA .AND. ANY(DTV%LDATA_STRESS)) THEN + ALLOCATE( ZSTRESS( SIZE(DTV%LPAR_STRESS,1),NVEGTYPE ) ) ZSTRESS(:,:)=0. DO JVEG=1,NVEGTYPE DO JI = 1,PK%NSIZE_P @@ -686,6 +688,7 @@ IF (GDATA .AND. ANY(DTV%LDATA_STRESS)) THEN ENDDO CALL AV_PGD_PARAM(DTV%XPAR_LAI, DTV%XPAR_VEG, & ZWORK,DTV%XPAR_VEGTYPE,ZSTRESS,YVEG,'ARI',PK%NR_P,IO%NPATCH,KPATCH,KDECADE=KDEC2) + DEALLOCATE( ZSTRESS ) ELSE CALL AV_PGD_1P(DTCO, ZWORK,PCOVER,XDATA_STRESS(:,:),YVEG,'ARI',OCOVER,PK%NR_P,IO%NPATCH,KPATCH,KDECADE=KDEC) ENDIF diff --git a/src/SURFEX/coupling_isban.F90 b/src/SURFEX/coupling_isban.F90 index 1250e5719706301ef0e8e6e8fbc5f1db109bc8ea..45e5eea8f4176584b60b89e1c51e6e98230261d6 100644 --- a/src/SURFEX/coupling_isban.F90 +++ b/src/SURFEX/coupling_isban.F90 @@ -69,6 +69,7 @@ SUBROUTINE COUPLING_ISBA_n (DTCO, UG, U, USS, NAG, CHI, NCHI, MGN, MSF, DTI, ID !! P. LeMoigne 12/2014 EBA scheme update !! R. Seferian 05/2015 : Add coupling fiels to vegetation_evol call !! P. Tulet 06/2016 : call coupling_megan add RN leaves for MEGAN +!! J. Pianezzej 02/2019 : correction for use of MEGAN !!------------------------------------------------------------------- ! USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t @@ -1154,6 +1155,12 @@ ENDIF IF (CHI%SVI%NBEQ>0 .AND. CHI%LCH_BIO_FLUX) THEN IF ((TRIM(CHI%CPARAMBVOC) == 'MEGAN').AND.(ANY(PEK%XLAI(:)/=XUNDEF))) THEN +!UPG*PT + WHERE (GBK%XIACAN > 2000.) ! non physical values + GBK%XIACAN = 0. + END WHERE +!UPG*PT + CALL COUPLING_MEGAN_n(MGN, CHI, GK, PEK, & KYEAR, KMONTH, KDAY, PTIME, IO%LTR_ML, & IP_SLTYP, ZP_PFT, ZP_EF, & diff --git a/src/SURFEX/coupling_megann.F90 b/src/SURFEX/coupling_megann.F90 index 6d5641bf78b6f3acecc378ebc22d0bd2b51e0803..88bb6fd8a65007c6e2a7ad20bf6366a8f53cb603 100644 --- a/src/SURFEX/coupling_megann.F90 +++ b/src/SURFEX/coupling_megann.F90 @@ -29,6 +29,7 @@ !! ------------- !! Original: 25/10/2014 !! Modified: 06/07/2017, J. Pianezze, adaptation for SurfEx v8.0 +!! Modified: 06/07/2018, P. Tulet, correction for T leaf !! !! EXTERNAL !! -------- @@ -132,27 +133,14 @@ ZPFD(:) = 0. DO JSM = 1,SIZE(PIACAN,2) ZPFD(:) = ZPFD(:) + PIACAN(:, JSM) END DO -! Test car PIACAN prends des valeurs non physiques au lever du soleil -WHERE (ZPFD(:) .GT. 2000.) ZPFD(:) = 0. ! -! compute sun and shade leaf temperature upon RN_SHADE and RN_SUNLIT -! thanks to D. Carrer -! -ZLSUT(:) = PTEMP(:) + 3. +! UPG*PT en attendat un calcul propre. Temperature des feuilles à l'ombre egale a la +! température de l'air. La temparature des feuilles au soleil egale a la valeur +! max entre la temperature de l'air et la temperaure radiative. +ZLSUT(:) = MAX(PLEAFT(:),PTEMP(:)) ZLSHT(:) = PTEMP(:) -! -IF (OTR_ML) THEN - ! - ZRN(:) = PRN_SUNLIT(:)**2 + PRN_SHADE(:)**2 - ! - WHERE ( ZRN(:).NE.0. ) - ! for sun leaves - ZLSUT(:) = PLEAFT(:) * PRN_SUNLIT(:) * (PRN_SUNLIT(:)+PRN_SHADE(:))/ZRN(:) - ! for shade leaves - ZLSHT(:) = PLEAFT(:) * PRN_SHADE (:) * (PRN_SUNLIT(:)+PRN_SHADE(:))/ZRN(:) - END WHERE - ! -END IF +!UPG*PT + ! ! MEGAN : calcul des facteurs d'ajustement et de perte dans la canopée. ! ZCFSPEC: classe de sorties MEGAN (voir SPC_NOCONVER.EXT) diff --git a/src/SURFEX/coupling_seaflux_orogn.F90 b/src/SURFEX/coupling_seaflux_orogn.F90 index 71b257f9f1cc6ad8c05be6223221fbc855a7ea35..5d222e8480eba4d94bac84f3c51a259ecb074d32 100644 --- a/src/SURFEX/coupling_seaflux_orogn.F90 +++ b/src/SURFEX/coupling_seaflux_orogn.F90 @@ -11,7 +11,7 @@ SUBROUTINE COUPLING_SEAFLUX_OROG_n (SM, DST, SLT, HPROGRAM, HCOUPLING, PTIMEC, P PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB,& PEMIS, PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, & PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, & - PPEQ_B_COEF, HTEST ) + PPEQ_B_COEF, PZWS, HTEST ) ! ############################################################################### ! !!**** *COUPLING_SEAFLUX_OROG_n * - Modifies the input forcing if not @@ -38,6 +38,7 @@ SUBROUTINE COUPLING_SEAFLUX_OROG_n (SM, DST, SLT, HPROGRAM, HCOUPLING, PTIMEC, P !! J. Escobar 09/2012 SIZE(PTA) not allowed without-interface , replace by KI !! B. Decharme 04/2013 new coupling variables !! improve forcing vertical shift +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !!------------------------------------------------------------- ! ! @@ -106,6 +107,7 @@ REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizonta ! ! (W/m2) REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PZWS ! significant sea wave (m) REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m) REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s) @@ -204,7 +206,7 @@ ENDIF PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, & PEMIS, PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, & PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, ZPET_B_COEF, & - ZPEQ_B_COEF, HTEST ) + ZPEQ_B_COEF, PZWS, HTEST ) ! IF (LHOOK) CALL DR_HOOK('COUPLING_SEAFLUX_OROG_N',1,ZHOOK_HANDLE) !------------------------------------------------------------------------------------- diff --git a/src/SURFEX/coupling_seaflux_sbln.F90 b/src/SURFEX/coupling_seaflux_sbln.F90 index 857f16473668a9831029b3f31d3bcaab7deb85c3..53aa72d42ebc46a6e8c6ca068027000af37bd2d6 100644 --- a/src/SURFEX/coupling_seaflux_sbln.F90 +++ b/src/SURFEX/coupling_seaflux_sbln.F90 @@ -11,7 +11,7 @@ SUBROUTINE COUPLING_SEAFLUX_SBL_n (CHS, DTS, DGS, O, OR, G, S, SB, DST, SLT, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, & PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, & PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, & - PPEQ_B_COEF, HTEST ) + PPEQ_B_COEF, PZWS, HTEST ) ! ############################################################################### ! !!**** *COUPLING_SEAFLUX_SBL_n * - Adds a SBL into SEAFLUX @@ -38,6 +38,7 @@ SUBROUTINE COUPLING_SEAFLUX_SBL_n (CHS, DTS, DGS, O, OR, G, S, SB, DST, SLT, !! S. Riette 10/2009 Iterative computation of XZ0 !! S. Riette 01/2010 Use of interpol_sbl to compute 10m wind diagnostic !! B. Decharme 04/2013 new coupling variables +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !---------------------------------------------------------------- ! ! @@ -122,6 +123,7 @@ REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizonta ! ! (W/m2) REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PZWS ! significant sea wave (m) REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s) REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s) @@ -302,7 +304,7 @@ END IF PSV, PCO2, HSV, PRAIN, PSNOW, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS, ZPA,& PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, & PEMIS, PTSURF, PZ0, PZ0H, PQSURF, ZPEW_A_COEF, ZPEW_B_COEF, & - ZPET_A_COEF, ZPEQ_A_COEF, ZPET_B_COEF, ZPEQ_B_COEF, HTEST) + ZPET_A_COEF, ZPEQ_A_COEF, ZPET_B_COEF, ZPEQ_B_COEF, PZWS, HTEST) ! !------------------------------------------------------------------------------------- ! diff --git a/src/SURFEX/coupling_seafluxn.F90 b/src/SURFEX/coupling_seafluxn.F90 index 5ea7b516c971576bf25a3d80fa24f72ba2f7690c..f7fc56d8021d2435be11826b58f57e6579b6ea9c 100644 --- a/src/SURFEX/coupling_seafluxn.F90 +++ b/src/SURFEX/coupling_seafluxn.F90 @@ -10,7 +10,7 @@ SUBROUTINE COUPLING_SEAFLUX_n (CHS, DTS, DGS, O, OR, G, S, DST, SLT, & PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, PSFTS, & PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, & PZ0, PZ0H, PQSURF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, & - PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST ) + PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PZWS, HTEST ) ! ############################################################################### ! !!**** *COUPLING_SEAFLUX_n * - Driver of the WATER_FLUX scheme for sea @@ -49,6 +49,7 @@ SUBROUTINE COUPLING_SEAFLUX_n (CHS, DTS, DGS, O, OR, G, S, DST, SLT, & !! Modified 01/2015 : R. Séférian interactive ocaen surface albedo !! Modified 03/2014 : M.N. Bouin possibility of wave parameters from external source !! Modified 11/2014 : J. Pianezze : add currents for wave coupling +!! Modified 02/2019 : S. Bielli Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !!--------------------------------------------------------------------- ! @@ -157,6 +158,7 @@ REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizonta ! ! (W/m2) REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PZWS ! significant sea wave (m) REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s) REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s) @@ -232,6 +234,8 @@ REAL, DIMENSION(KI) :: ZHU ! Near surface relative humidity REAL, DIMENSION(KI) :: ZQA ! specific humidity (kg/kg) REAL, DIMENSION(KI) :: ZEMIS ! Emissivity at time t REAL, DIMENSION(KI) :: ZTRAD ! Radiative temperature at time t +REAL, DIMENSION(KI) :: ZHS ! significant wave height +REAL, DIMENSION(KI) :: ZTP ! peak period ! REAL, DIMENSION(KI) :: ZSST ! XSST corrected for anomalously low values (which actually are sea-ice temp) REAL, DIMENSION(KI) :: ZMASK ! A mask for diagnosing where seaice exists (or, for coupling_iceflux, may appear) @@ -245,14 +249,17 @@ INTEGER :: ISIZE_ICE ! number of points with some se ! INTEGER :: ISWB ! number of shortwave spectral bands INTEGER :: JSWB ! loop counter on shortwave spectral bands -INTEGER :: ISLT ! number of sea salt variable ! INTEGER :: IBEG, IEND +INTEGER :: ISLT, IDST, JSV, IMOMENT ! number of sea salt, dust variables +! +INTEGER :: ILUOUT ! REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------------- ! Preliminaries: !------------------------------------------------------------------------------------- +CALL GET_LUOUT(HPROGRAM,ILUOUT) IF (LHOOK) CALL DR_HOOK('COUPLING_SEAFLUX_N',0,ZHOOK_HANDLE) IF (HTEST/='OK') THEN CALL ABOR1_SFX('COUPLING_SEAFLUXN: FATAL ERROR DURING ARGUMENT TRANSFER') @@ -277,6 +284,8 @@ ZUSTAR (:) = XUNDEF ZZ0 (:) = XUNDEF ZZ0H (:) = XUNDEF ZQSAT (:) = XUNDEF +ZHS (:) = XUNDEF +ZTP (:) = XUNDEF ! ZSFTQ_ICE(:) = XUNDEF ZSFTH_ICE(:) = XUNDEF @@ -317,6 +326,24 @@ PSFTS(:,:) = 0. ZHU = 1. ! ZQA(:) = PQA(:) / PRHOA(:) + +! HS value from ECMWF file +ZHS(:) = PZWS(:) +#ifdef CPLOASIS +! HS value from WW3 if activated +IF (LCPL_WAVE) THEN + ZHS(:)=S%XHS(:) + ZTP(:)=S%XTP(:) +ELSE + ZHS(:)=PZWS(:) + ZTP(:)=S%XTP(:) +END IF +#endif +! if HS value is undef : constant value and alert message +IF (ALL(ZHS==XUNDEF)) THEN + ZHS(:)=2. + WRITE (ILUOUT,*) 'WARNING : no HS values from ECMWF or WW3, then it is initialized to a constant value of 2 m' +END IF ! ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! Time evolution @@ -374,8 +401,16 @@ CALL COARE30_SEAFLUX(S, ZMASK, ISIZE_WATER, ISIZE_ICE, & PTA, ZEXNA ,PRHOA, ZSST, ZEXNS, ZQA, PRAIN, & PSNOW, ZWIND, PZREF, PUREF, PPS, ZQSAT, & ZSFTH, ZSFTQ, ZUSTAR, & - ZCD, ZCDN, ZCH, ZCE, ZRI, ZRESA_SEA, ZZ0H ) + ZCD, ZCDN, ZCH, ZCE, ZRI, ZRESA_SEA, ZZ0H ) END SELECT + +#ifdef CPLOASIS +IF (.NOT. LCPL_WAVE) THEN + S%XHS(:)=ZHS(:) + S%XTP(:)=ZTP(:) +END IF +#endif + ! !------------------------------------------------------------------------------------- !radiative properties at time t @@ -442,7 +477,7 @@ PSFCO2(:) = - ZWIND(:)**2 * 1.13E-3 * 8.7 * 44.E-3 / ( 365*24*3600 ) ! Scalar fluxes: !------------------------------------------------------------------------------------- ! -IF (CHS%SVS%NBEQ>0) THEN +IF (CHS%SVS%NBEQ>0.AND.(KI.GT.0)) THEN ! IF (CHS%CCH_DRY_DEP == "WES89") THEN ! @@ -475,7 +510,7 @@ IF (CHS%SVS%NBEQ>0) THEN ! ENDIF ! -IF (CHS%SVS%NDSTEQ>0) THEN +IF (CHS%SVS%NDSTEQ>0.AND.(KI.GT.0)) THEN ! IBEG = CHS%SVS%NSV_DSTBEG IEND = CHS%SVS%NSV_DSTEND @@ -499,7 +534,7 @@ IF (CHS%SVS%NDSTEQ>0) THEN ENDIF ! -IF (CHS%SVS%NSLTEQ>0) THEN +IF (CHS%SVS%NSLTEQ>0.AND.(KI.GT.0)) THEN ! IBEG = CHS%SVS%NSV_SLTBEG IEND = CHS%SVS%NSV_SLTEND @@ -510,6 +545,9 @@ IF (CHS%SVS%NSLTEQ>0) THEN SIZE(ZUSTAR,1), & !I [nbr] number of sea point ISLT, & !I [nbr] number of sea salt variables ZWIND, & !I [m/s] wind velocity + ZHS, & !I [m] significant sea wave + S%XSST, & + ZUSTAR, & PSFTS(:,IBEG:IEND) ) ! CALL DSLT_DEP(PSV(:,IBEG:IEND), PSFTS(:,IBEG:IEND), ZUSTAR, ZRESA_SEA, PTA, & @@ -517,11 +555,11 @@ IF (CHS%SVS%NSLTEQ>0) THEN XDENSITY_SLT, XMOLARWEIGHT_SLT, ZCONVERTFACM0_SLT, ZCONVERTFACM6_SLT, & ZCONVERTFACM3_SLT, LVARSIG_SLT, LRGFIX_SLT, CVERMOD ) ! - CALL MASSFLUX2MOMENTFLUX( & - PSFTS(:,IBEG:IEND), & !I/O ![kg/m2/sec] In: flux of only mass, out: flux of moments + CALL MASSFLUX2MOMENTFLUX( & + PSFTS(:,IBEG:IEND), & !I/O [kg/m2/sec] In: flux of only mass, out: flux of moments PRHOA, & !I [kg/m3] air density - SLT%XEMISRADIUS_SLT, &!I [um] emitted radius for the modes (max 3) - SLT%XEMISSIG_SLT, &!I [-] emitted sigma for the different modes (max 3) + SLT%XEMISRADIUS_SLT, & !I [um] emitted radius for the modes (max 3) + SLT%XEMISSIG_SLT, & !I [-] emitted sigma for the different modes (max 3) NSLTMDE, & ZCONVERTFACM0_SLT, & ZCONVERTFACM6_SLT, & diff --git a/src/SURFEX/coupling_sean.F90 b/src/SURFEX/coupling_sean.F90 index 97a8b1f7c6b4bc5a12c04551a6e869c22869d3b8..ca4ae208190a3df6849a9732c4918ee675ba8c55 100644 --- a/src/SURFEX/coupling_sean.F90 +++ b/src/SURFEX/coupling_sean.F90 @@ -10,7 +10,7 @@ SUBROUTINE COUPLING_SEA_n (SM, DGO, DL, DLC, U, DST, SLT, HPROGRAM, HCOUPLING, P PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, & PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, & PPEW_A_COEF, PPEW_B_COEF, & - PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST ) + PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PZWS, HTEST ) ! ############################################################################### ! !!**** *COUPLING_SEA_n * - Chooses the surface schemes for sea @@ -33,6 +33,7 @@ SUBROUTINE COUPLING_SEA_n (SM, DGO, DL, DLC, U, DST, SLT, HPROGRAM, HCOUPLING, P !! ------------- !! Original 01/2004 !! B. Decharme 04/2013 new coupling variables +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !!----------------------------------------------------------------------- ! ! @@ -104,6 +105,7 @@ REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizonta ! ! (W/m2) REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PZWS ! significant sea wave (m) REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m) REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s) @@ -150,7 +152,7 @@ IF (U%CSEA=='SEAFLX') THEN PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, & PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, & PPEW_A_COEF, PPEW_B_COEF, & - PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST ) + PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PZWS, HTEST ) ELSE IF (U%CSEA=='FLUX ') THEN CALL COUPLING_IDEAL_FLUX(DGO, DL, DLC, HPROGRAM, HCOUPLING, PTIMEC, & PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, & diff --git a/src/SURFEX/coupling_sltn.F90 b/src/SURFEX/coupling_sltn.F90 index 7e66f3fa5f6cbd143802a1d3f054ce40c4e5b0cc..284fc093527a26c6342ca61c0ac9e7b190aa9b7b 100644 --- a/src/SURFEX/coupling_sltn.F90 +++ b/src/SURFEX/coupling_sltn.F90 @@ -3,16 +3,26 @@ !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. SUBROUTINE COUPLING_SLT_n (SLT, & - KI, &!I [nbr] number of sea points - KSLT, &!I [nbr] number of sea points - PWIND, &!I Wind velocity - PSFSLT &!O [kg/m2/sec] flux of sea salt + KI, &!I [nbr] number of sea points + KSLT, &!I [nbr] number of sea salt variables + PWIND, &!I Wind velocity +! ++ PIERRE / MARINE SSA - MODIF ++ + PWHEIGHT, &! Significant height of wind-generated waves (in ECMWF analyses) + ! local pour l'instant, PWHEIGHT plus tard + PSST, &! Sea water temperature (C) + PUSTAR, &! Friction velocity (ecmwf?) Calcule dans coupling_seafluxn.F90 +! -- PIERRE / MARINE SSA - MODIF -- + PSFSLT &!O [kg/m2/sec] production flux of sea salt ) !PURPOSE !------- ! Compute sea salt emission upon Vignatti et al, 2001 +! ++ PIERRE / MARINE SSA - MODIF ++ +! Compute sea salt emission upon Ovadnevaite et al, 2014 +! -- PIERRE / MARINE SSA - MODIF -- ! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !AUTHOR !------- ! P. Tulet @@ -35,45 +45,64 @@ TYPE(SLT_t), INTENT(INOUT) :: SLT INTEGER, INTENT(IN) :: KI !I Number of sea points INTEGER, INTENT(IN) :: KSLT !I Number of sea salt emission variables REAL, DIMENSION(KI), INTENT(IN) :: PWIND !I wind velocity -REAL, DIMENSION(KI,KSLT), INTENT(OUT) :: PSFSLT !Out: mole particles per mole air m/s *(MWdst/MWair*rhoair)(index #1) - !Out: kg/m2/s (index #2) - !Out: moles m6/moles air m/s *(MWdst/MWair*rhoair)(index #3) +REAL, DIMENSION(KI,KSLT), INTENT(OUT) :: PSFSLT !Out: kg/m2/s (index #2) +! ++ PIERRE / MARINE SSA - MODIF ++ +REAL, DIMENSION(KI), INTENT(INOUT) :: PWHEIGHT !Significant height of wind-generated waves (in ECMWF analyses) +REAL, DIMENSION(KI), INTENT(IN) :: PUSTAR !Friction velocity (ecmwf?) : Unite: m.s^(-2)? +REAL, DIMENSION(KI), INTENT(IN) :: PSST ! Sea surface temperature (K) +! -- PIERRE / MARINE SSA - MODIF -- + !LOCAL VARIABLES -REAL,DIMENSION(KI,3) :: ZSFSLT_MDE ! sea salt flux from modes -INTEGER :: JN, JI !Counter for sea salt modes -REAL, DIMENSION(KI) :: DZSPEED -INTEGER, DIMENSION(KI):: WCL -REAL :: ZCONVERTFACM0_SLT -REAL :: ZCONVERTFACM3_SLT -REAL :: ZCONVERTFACM6_SLT -! -!REAL, PARAMETER :: MASS1FLUX(0:40) = (/ & -! 0.000E+00, 2.483E-15, 2.591E-14, 1.022E-13, 2.707E-13, 5.761E-13, & -! 1.068E-12, 1.800E-12, 2.829E-12, 4.215E-12, 6.023E-12, 8.317E-12, & -! 1.117E-11, 1.464E-11, 1.882E-11, 2.378E-11, 2.959E-11, 3.633E-11, & -! 4.409E-11, 5.296E-11, 6.301E-11, 7.433E-11, 8.693E-11, 1.012E-10, & -! 1.168E-10, 1.342E-10, 1.532E-10, 1.741E-10, 1.970E-10, 2.219E-10, & -! 2.489E-10, 2.781E-10, 3.097E-10, 3.437E-10, 3.803E-10, 4.195E-10, & -! 4.616E-10, 5.065E-10, 5.544E-10, 6.054E-10, 6.711E-10 /) -! -!REAL, PARAMETER :: MASS2FLUX(0:40) = (/ & -! 0.000E+00, 2.319E-13, 2.411E-12, 9.481E-12, 2.505E-11, 5.321E-11, & -! 9.850E-11, 1.658E-10, 2.602E-10, 3.874E-10, 5.529E-10, 7.628E-10, & -! 1.023E-09, 1.341E-09, 1.722E-09, 2.175E-09, 2.704E-09, 3.319E-09, & -! 4.026E-09, 4.832E-09, 5.746E-09, 6.776E-09, 7.925E-09, 9.214E-09, & -! 1.064E-08, 1.221E-08, 1.394E-08, 1.584E-08, 1.791E-08, 2.016E-08, & -! 2.261E-08, 2.526E-08, 2.812E-08, 3.120E-08, 3.451E-08, 3.806E-08, & -! 4.186E-08, 4.592E-08, 5.025E-08, 5.486E-08, 6.014E-08 /) -! -!REAL, PARAMETER :: MASS3FLUX(0:40) = (/ 0.0, & -! 1.783E-12, 1.579E-11, 5.852E-11, 1.501E-10, 3.134E-10, 5.740E-10, & -! 9.597E-10, 1.500E-09, 2.227E-09, 3.175E-09, 4.378E-09, 5.872E-09, & -! 7.698E-09, 9.897E-09, 1.250E-08, 1.556E-08, 1.912E-08, 2.323E-08, & -! 2.792E-08, 3.325E-08, 3.927E-08, 4.608E-08, 5.356E-08, 6.194E-08, & +REAL,DIMENSION(KI,JPMODE_SLT) :: ZSFSLT_MDE ! sea salt flux from modes +INTEGER :: JN, JI, II !Counter for sea salt modes +REAL, DIMENSION(KI) :: DZSPEED +INTEGER, DIMENSION(KI) :: WCL +REAL :: ZCONVERTFACM0_SLT ![kg/mole*mole/molec] conversion factor + !for moment fluxes and used fluxes +REAL :: ZCONVERTFACM3_SLT +REAL :: ZCONVERTFACM6_SLT +! +! ++ PIERRE / MARINE SSA - MODIF ++ + +REAL, DIMENSION(5) :: ZNUWATER ! Temperature-dependant kinematic viscosity of + ! sea-water (table of data to interpolate) (m².s-¹) +REAL, DIMENSION(5) :: ZWT ! Sea water temperature in table +REAL, DIMENSION(KI) :: ZREYNOLDS ! Reynolds Number +REAL, DIMENSION(KI) :: ZHVAGUE ! sea wave height from wind if ZWS is unknown. +REAL, DIMENSION(KI) :: ZVISCO ! Temperature-dependant kinematic viscosity + ! of sea-water interpolated +! -- PIERRE / MARINE SSA - MODIF -- +! +!REAL, PARAMETER :: mass1flux(0:40) = (/ & +! 0.000E+00, 2.483E-15, 2.591E-14, 1.022E-13, 2.707E-13, 5.761E-13, & +! 1.068E-12, 1.800E-12, 2.829E-12, 4.215E-12, 6.023E-12, 8.317E-12, & +! 1.117E-11, 1.464E-11, 1.882E-11, 2.378E-11, 2.959E-11, 3.633E-11, & +! 4.409E-11, 5.296E-11, 6.301E-11, 7.433E-11, 8.693E-11, 1.012E-10, & +! 1.168E-10, 1.342E-10, 1.532E-10, 1.741E-10, 1.970E-10, 2.219E-10, & +! 2.489E-10, 2.781E-10, 3.097E-10, 3.437E-10, 3.803E-10, 4.195E-10, & +! 4.616E-10, 5.065E-10, 5.544E-10, 6.054E-10, 6.711E-10 /) + +!REAL, PARAMETER :: mass2flux(0:40) = (/ & +! 0.000E+00, 2.319E-13, 2.411E-12, 9.481E-12, 2.505E-11, 5.321E-11, & +! 9.850E-11, 1.658E-10, 2.602E-10, 3.874E-10, 5.529E-10, 7.628E-10, & +! 1.023E-09, 1.341E-09, 1.722E-09, 2.175E-09, 2.704E-09, 3.319E-09, & +! 4.026E-09, 4.832E-09, 5.746E-09, 6.776E-09, 7.925E-09, 9.214E-09, & +! 1.064E-08, 1.221E-08, 1.394E-08, 1.584E-08, 1.791E-08, 2.016E-08, & +! 2.261E-08, 2.526E-08, 2.812E-08, 3.120E-08, 3.451E-08, 3.806E-08, & +! 4.186E-08, 4.592E-08, 5.025E-08, 5.486E-08, 6.014E-08 /) + +!REAL, PARAMETER :: mass3flux(0:40) = (/ 0.0, & +! 1.783E-12, 1.579E-11, 5.852E-11, 1.501E-10, 3.134E-10, 5.740E-10, & +! 9.597E-10, 1.500E-09, 2.227E-09, 3.175E-09, 4.378E-09, 5.872E-09, & +! 7.698E-09, 9.897E-09, 1.250E-08, 1.556E-08, 1.912E-08, 2.323E-08, & +! 2.792E-08, 3.325E-08, 3.927E-08, 4.608E-08, 5.356E-08, 6.194E-08, & ! 7.121E-08, 8.143E-08, 9.266E-08, 1.049E-07, 1.183E-07, 1.329E-07, & ! 1.487E-07, 1.658E-07, 1.843E-07, 2.041E-07, 2.255E-07, 2.484E-07, & ! 2.729E-07, 2.991E-07, 3.270E-07, 3.517E-07 /) +REAL, PARAMETER :: HVAGUE(1:9) = (/ 0., 0.1, 0.5, 1.25, 2.5, 4., 6., 9., 14. /) +REAL, PARAMETER :: VVENT(1:9) = (/ 1., 2.7, 4.1, 6.3, 8.3, 11.1, 13.8, & + 16.6, 19.4/) REAL, PARAMETER :: NUMB1FLUX(0:40) = (/ & 0.000E+00, 3.004E+01, 3.245E+02, 1.306E+03, 3.505E+03, 7.542E+03, & @@ -107,7 +136,7 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE !! M0=#/molec_{air} !! M6=um6/molec_{air}*1.d6 !! The surface model should have (for sea salt) -!! M0=#/m3*[kg_{dst}/mole_{dst}/XAVOGADRO] +!! M0=#/m3*[kg_{slt}/mole_{slt}/XAVOGADRO] !! M3=kg/m3 !! M6=um6/m3 !! REFERENCE @@ -119,71 +148,175 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COUPLING_SLT_N',0,ZHOOK_HANDLE) ! !Factor which is needed so that all gains normal units when leaving ground paramn -ZCONVERTFACM0_SLT = XMOLARWEIGHT_SLT / XAVOGADRO !(kg_dst/mol_dst)/(molec/mol) +ZCONVERTFACM0_SLT = XMOLARWEIGHT_SLT / XAVOGADRO !(kg_slt/mol_slt)/(molec/mol) !Factor which is needed for moment 6, there is a factor 1.d6 transported around in M6 in MESONH ZCONVERTFACM6_SLT = XMOLARWEIGHT_SLT / XAVOGADRO*1.d6 ZCONVERTFACM3_SLT = 4./3.*XPI*XDENSITY_SLT / 1.d18 ! PSFSLT(:,:)=0.d0 ! -IF (CEMISPARAM_SLT.eq."Vig01")THEN - ! - ! Vignatti et al. 2001 (in particles.cm-2.s-1) - ZSFSLT_MDE(:,1) = 10**(0.09 *PWIND(:) + 0.283) ! fine mode - ZSFSLT_MDE(:,2) = 10**(0.0422*PWIND(:) + 0.288) ! median mode - ZSFSLT_MDE(:,3) = 10**(0.069 *PWIND(:) - 3.5) ! coarse mode - ! convert into particles.m-2.s-1) - ZSFSLT_MDE(:,1) = MAX(ZSFSLT_MDE(:,1) * 1E4, 1E-10) - ZSFSLT_MDE(:,2) = MAX(ZSFSLT_MDE(:,2) * 1E4, 1E-10) - ZSFSLT_MDE(:,3) = MAX(ZSFSLT_MDE(:,3) * 1E4, 1E-10) - ! -ELSE ! Use Schultz et al., 2004 - ! +!+ Marine +IF (CEMISPARAM_SLT .eq. "Ova14") THEN ! Rajouter Ova14 dans fichier initialisation + ZHVAGUE(:) = 0. + DO II = 1, 8 +!++cb++19/10/16 modif de la formule : + de vent => vagues + hautes +! WHERE ((PWIND(:) .GT. VVENT(II)).AND.(PWIND(:) .LT. VVENT(II+1))) + WHERE ((PWIND(:) .GT. VVENT(II)).AND.(PWIND(:) .LT. VVENT(II+1))) +! ZHVAGUE(:) = HVAGUE(II) + (VVENT(II+1) - PWIND(:)) * & + ZHVAGUE(:) = HVAGUE(II) + (PWIND(:) - VVENT(II+1)) * & + (HVAGUE(II+1) - HVAGUE(II)) / & + (VVENT(II+1) - VVENT(II)) +!--cb-- + ENDWHERE + ENDDO + + WHERE (PWIND(:) .GE. VVENT(9)) + ZHVAGUE(:) = HVAGUE(9) + END WHERE + + WHERE (PWHEIGHT(:) .EQ. -1.) + PWHEIGHT(:) = ZHVAGUE(:) + END WHERE + + ZWT = (/ 273.15, 283.15, 293.15, 303.15, 313.15 /) ! Unite : K + ZNUWATER = (/ 1.854E-6, 1.36E-6, 1.051E-6, 0.843E-6, 0.695E-6 /) +! Unite : m².s^(-1) Pour une salinite = 35g/kg. +! En mer Mediterranee = 38.5g/kg (Lewis and Schwartz) + +! Initialisation des valeurs de ZVISCO, ZREYNOLDS + ZVISCO(:) = 0. + ZREYNOLDS(:) = 0. + + ! Tableau d'interpolation pour calculer ZNUWATER en fonction de la SST + ! Cas ou 0 < SST < 10 C + WHERE ((PSST(:) >= 273.15).AND.(PSST(:) < 283.15)) + ZVISCO(:) = ZNUWATER(1) + (PSST(:) - ZWT(1)) * (ZNUWATER(2)-ZNUWATER(1)) / & + (ZWT(2) - ZWT(1)) + ENDWHERE + + ! Cas ou 10 < SST < 20 C + WHERE ((PSST(:) >= 283.15).AND.(PSST(:) < 293.15)) + ZVISCO(:) = ZNUWATER(2) + (PSST(:) - ZWT(2)) * (ZNUWATER(3)-ZNUWATER(2)) / & + (ZWT(3) - ZWT(2)) + ENDWHERE + + ! Cas ou 20 < SST < 30 C + WHERE ((PSST(:) >= 293.15).AND.(PSST(:) < 303.15)) + ZVISCO(:) = ZNUWATER(3) + (PSST(:) - ZWT(3)) * (ZNUWATER(4)-ZNUWATER(3)) / & + (ZWT(4) - ZWT(3)) + ENDWHERE + + ! Cas ou 30 < SST < 40 C + WHERE ((PSST(:) >= 303.15).AND.(PSST(:) < 313.15)) + ZVISCO(:) = ZNUWATER(4) + (PSST(:) - ZWT(4)) * (ZNUWATER(5)-ZNUWATER(4)) / & + (ZWT(5) - ZWT(4)) + ENDWHERE + +! Calcul du nombre de Reynolds + ZREYNOLDS(:) = (PUSTAR(:) * PWHEIGHT(:)) / ZVISCO(:) + +! Calcul du flux en nombre pour chaque mode + +! Ovadnevaite et al. 2014 +!!!!! Total number flux, Unite ZSDSLT_MDE ne correspond pas au total number +!flux mais au size dependent SSA production flux + +! Ecrire equation integration pour chaque mode + +!Condition d'emission : ZREYNOLDS > 1E5 + + WHERE (ZREYNOLDS(:) > 1.E5) + ZSFSLT_MDE(:,1) = 104.51 * ( ZREYNOLDS(:) - 1.E5)**0.556 + ZSFSLT_MDE(:,2) = 0.044 * ( ZREYNOLDS(:) - 1.E5)**1.08 + ZSFSLT_MDE(:,3) = 149.64 * ( ZREYNOLDS(:) - 1.E5)**0.545 + ZSFSLT_MDE(:,4) = 2.96 * ( ZREYNOLDS(:) - 1.E5)**0.79 + ENDWHERE + WHERE (ZREYNOLDS(:) > 2.E5) + ZSFSLT_MDE(:,5) = 0.52 * ( ZREYNOLDS(:) - 2.E5)**0.87 + ENDWHERE + + + + WHERE (ZREYNOLDS(:) <= 1.E5) + ZSFSLT_MDE(:,1) = 1.E-10 + ZSFSLT_MDE(:,2) = 1.E-10 + ZSFSLT_MDE(:,3) = 1.E-10 + ZSFSLT_MDE(:,4) = 1.E-10 + ENDWHERE + WHERE (ZREYNOLDS(:) <= 2.E5) + ZSFSLT_MDE(:,5) = 1.E-10 + ENDWHERE + +! Controle avec des valeurs limites , Pas besoin de la conversion 1E4 pour Ova +! car deja en m-2 + ZSFSLT_MDE(:,1) = MAX(ZSFSLT_MDE(:,1) , 1.E-10) + ZSFSLT_MDE(:,2) = MAX(ZSFSLT_MDE(:,2) , 1.E-10) + ZSFSLT_MDE(:,3) = MAX(ZSFSLT_MDE(:,3) , 1.E-10) + ZSFSLT_MDE(:,4) = MAX(ZSFSLT_MDE(:,4) , 1.E-10) + ZSFSLT_MDE(:,5) = MAX(ZSFSLT_MDE(:,5) , 1.E-10) +!- Marine + +ELSEIF (CEMISPARAM_SLT .eq. "Vig01") THEN +! Vignatti et al. 2001 (in particles.cm-2.s-1) : en #.cm-3 en fait + ZSFSLT_MDE(:,1) = 10.**(0.09 *PWIND(:) + 0.283) ! fine mode + ZSFSLT_MDE(:,2) = 10.**(0.0422*PWIND(:) + 0.288) ! median mode + ZSFSLT_MDE(:,3) = 10.**(0.069 *PWIND(:) - 3.5) ! coarse mode + +! convert into particles.m-2.s-1) + ZSFSLT_MDE(:,1) = MAX(ZSFSLT_MDE(:,1) * 1.E4, 1.E-10) + ZSFSLT_MDE(:,2) = MAX(ZSFSLT_MDE(:,2) * 1.E4, 1.E-10) + ZSFSLT_MDE(:,3) = MAX(ZSFSLT_MDE(:,3) * 1.E4, 1.E-10) +! +ELSEIF (CEMISPARAM_SLT .eq. "Sch04") THEN! Use Schultz et al., 2004 WCL(:) = INT(PWIND(:)) WCL(:) = MAX (0, MIN(WCL(:), 39)) - ! + DZSPEED(:) = MAX(0., MIN(PWIND(:) - FLOAT(WCL(:)), 1.)) - ! - ! Flux given in particles.m-2 s-1 - ! - DO JI=1,KI - !plm-gfortran - ZSFSLT_MDE(JI,1) = NUMB1FLUX(WCL(JI)) + (NUMB1FLUX(WCL(JI)+1)-NUMB1FLUX(WCL(JI)))*DZSPEED(JI) - ZSFSLT_MDE(JI,2) = NUMB2FLUX(WCL(JI)) + (NUMB2FLUX(WCL(JI)+1)-NUMB2FLUX(WCL(JI)))*DZSPEED(JI) - ZSFSLT_MDE(JI,3) = NUMB3FLUX(WCL(JI)) + (NUMB3FLUX(WCL(JI)+1)-NUMB3FLUX(WCL(JI)))*DZSPEED(JI) - !plm-gfortran - ENDDO - ! + ! + ! Flux given in particles.m-2 s-1 + ! + DO JI = 1, KI + !plm-gfortran + ZSFSLT_MDE(JI,1) = NUMB1FLUX(WCL(JI)) + & + (NUMB1FLUX(WCL(JI)+1)-NUMB1FLUX(WCL(JI)))*DZSPEED(JI) + ZSFSLT_MDE(JI,2) = NUMB2FLUX(WCL(JI)) + & + (NUMB2FLUX(WCL(JI)+1)-NUMB2FLUX(WCL(JI)))*DZSPEED(JI) + ZSFSLT_MDE(JI,3) = NUMB3FLUX(WCL(JI)) + & + (NUMB3FLUX(WCL(JI)+1)-NUMB3FLUX(WCL(JI)))*DZSPEED(JI) + !plm-gfortran + END DO END IF ! -DO JN=1,JPMODE_SLT +DO JN = 1, JPMODE_SLT + +! convert particles.m-2 s-1 into kg.m-2.s-1 +! N'est calculé que pour le moment 3 (en masse), la conversion pour les autres +! flux de moments se fait plus tard (mode_dslt_surf.F90 MASSFLUX2MOMENTFLUX) +!+Marine ! - IF (LVARSIG_SLT) THEN - ! - PSFSLT(:,1+(JN-1)*3) = ZSFSLT_MDE(:,JORDER_SLT(JN)) - PSFSLT(:,2+(JN-1)*3) = PSFSLT(:,1+(JN-1)*3) * (SLT%XEMISRADIUS_SLT(JN)**3)*EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JN))**2) - PSFSLT(:,3+(JN-1)*3) = PSFSLT(:,1+(JN-1)*3) * (SLT%XEMISRADIUS_SLT(JN)**6)*EXP(18. * LOG(SLT%XEMISSIG_SLT(JN))**2) - ! - ! Conversion into fluxes - PSFSLT(:,1+(JN-1)*3) = PSFSLT(:,1+(JN-1)*3) * ZCONVERTFACM0_SLT - PSFSLT(:,2+(JN-1)*3) = PSFSLT(:,1+(JN-1)*3) * ZCONVERTFACM3_SLT - PSFSLT(:,3+(JN-1)*3) = PSFSLT(:,3+(JN-1)*3) * ZCONVERTFACM6_SLT - - ELSE IF (LRGFIX_SLT) THEN - PSFSLT(:,JN) = ZSFSLT_MDE(:,JORDER_SLT(JN)) * (SLT%XEMISRADIUS_SLT(JN)**3)*EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JN))**2) - ! Conversion into fluxes - PSFSLT(:,JN) = PSFSLT(:,JN) * ZCONVERTFACM3_SLT - - ELSE - PSFSLT(:,1+(JN-1)*2) = ZSFSLT_MDE(:,JORDER_SLT(JN)) - PSFSLT(:,2+(JN-1)*2) = PSFSLT(:,1+(JN-1)*2) * (SLT%XEMISRADIUS_SLT(JN)**3)*EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JN))**2) - - ! Conversion into fluxes - PSFSLT(:,1+(JN-1)*2) = PSFSLT(:,1+(JN-1)*2) * ZCONVERTFACM0_SLT - PSFSLT(:,2+(JN-1)*2) = PSFSLT(:,1+(JN-1)*2) * ZCONVERTFACM3_SLT - - ENDIF + IF (LVARSIG_SLT) THEN ! cas 3 moment + + PSFSLT(:,2+(JN-1)*3) = ZSFSLT_MDE(:,JORDER_SLT(JN)) & + * ((SLT%XEMISRADIUS_SLT(JORDER_SLT(JN))**3) & + * EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JORDER_SLT(JN)))**2)) & + * ZCONVERTFACM3_SLT + + ELSEIF (LRGFIX_SLT) THEN ! cas 1 moment + PSFSLT(:,JN) = ZSFSLT_MDE(:,JORDER_SLT(JN)) & + * (SLT%XEMISRADIUS_SLT(JORDER_SLT(JN))**3) & + * EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JORDER_SLT(JN)))**2) & + * ZCONVERTFACM3_SLT + + ELSE ! cas 2 moments + + PSFSLT(:,2+(JN-1)*2) = ZSFSLT_MDE(:,JORDER_SLT(JN)) & + * ((SLT%XEMISRADIUS_SLT(JORDER_SLT(JN))**3) & + * EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JORDER_SLT(JN)))**2)) & + * ZCONVERTFACM3_SLT +! -- PIERRE / MARINE SSA - MODIF -- + END IF END DO + IF (LHOOK) CALL DR_HOOK('COUPLING_SLT_N',1,ZHOOK_HANDLE) END SUBROUTINE COUPLING_SLT_n diff --git a/src/SURFEX/coupling_surf_atmn.F90 b/src/SURFEX/coupling_surf_atmn.F90 index 9ee9651c22ceb72b66851668e76cfc2771982a1e..9a52eed46e1b6525e9e0ad2a000b97fc84ef205e 100644 --- a/src/SURFEX/coupling_surf_atmn.F90 +++ b/src/SURFEX/coupling_surf_atmn.F90 @@ -10,7 +10,7 @@ SUBROUTINE COUPLING_SURF_ATM_n (YSC, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, PPS, PPA, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, PTRAD, & PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, & PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, & - PPET_B_COEF, PPEQ_B_COEF, HTEST ) + PPET_B_COEF, PPEQ_B_COEF, PZWS, HTEST ) ! ################################################################################# ! !!**** *COUPLING_INLAND_WATER_n * - Driver to call the schemes for the @@ -39,6 +39,7 @@ SUBROUTINE COUPLING_SURF_ATM_n (YSC, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, !! Modified 06/2013 by J.Escobar : replace DOUBLE PRECISION by REAL to handle problem for promotion of real on IBM SP !! R. Séférian 03/2014 Adding decoupling between CO2 seen by photosynthesis and radiative CO2 !! P. Wautelet 02/2019 bug correction KI->KSIZE for size of KMASK argument in TREAT_SURF +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !!------------------------------------------------------------- ! ! @@ -128,6 +129,7 @@ REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizonta ! ! (W/m2) REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PZWS ! significant sea wave (m) REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m) REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s) @@ -475,6 +477,7 @@ REAL, DIMENSION(KSIZE) :: ZP_LW ! longwave radiation (on horizontal surf.) ! ! (W/m2) REAL, DIMENSION(KSIZE) :: ZP_PS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KSIZE) :: ZP_PA ! pressure at forcing level (Pa) +REAL, DIMENSION(KSIZE) :: ZP_ZWS ! significant sea wave (m) REAL, DIMENSION(KSIZE) :: ZP_ZS ! atmospheric model orography (m) REAL, DIMENSION(KSIZE) :: ZP_CO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KSIZE,KSV) :: ZP_SV ! scalar concentration in the air @@ -532,6 +535,7 @@ DO JJ=1,KSIZE ZP_LW(JJ) = PLW (JI) ZP_PS(JJ) = PPS (JI) ZP_PA(JJ) = PPA (JI) + ZP_ZWS(JJ) = PZWS (JI) ZP_ZS(JJ) = PZS (JI) ENDDO ! @@ -584,7 +588,7 @@ IF (KTILE==1) THEN ZP_PS, ZP_PA, ZP_SFTQ, ZP_SFTH, ZP_SFTS, ZP_SFCO2, ZP_SFU, ZP_SFV, & ZP_TRAD, ZP_DIR_ALB, ZP_SCA_ALB, ZP_EMIS, ZP_TSURF, ZP_Z0, ZP_Z0H, & ZP_QSURF, ZP_PEW_A_COEF, ZP_PEW_B_COEF, ZP_PET_A_COEF, ZP_PEQ_A_COEF, & - ZP_PET_B_COEF, ZP_PEQ_B_COEF, 'OK' ) + ZP_PET_B_COEF, ZP_PEQ_B_COEF, ZP_ZWS, 'OK' ) ! ELSEIF (KTILE==2) THEN ! diff --git a/src/SURFEX/default_ch_bio_flux.F90 b/src/SURFEX/default_ch_bio_flux.F90 index a7a3abb71f9543286b4bd27a23babb4f77ecb218..b303ab82f9f9e2de19605c054e48b2b6094dd80e 100644 --- a/src/SURFEX/default_ch_bio_flux.F90 +++ b/src/SURFEX/default_ch_bio_flux.F90 @@ -3,7 +3,7 @@ !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ######### - SUBROUTINE DEFAULT_CH_BIO_FLUX(OCH_BIO_FLUX) + SUBROUTINE DEFAULT_CH_BIO_FLUX(OCH_BIO_FLUX,PDAILYPAR,PDAILYTEMP) ! ######################################################################## ! !!**** *DEFAULT_CH_BIO_FLUX* - routine to set default values for the configuration for CH_BIO_FLUX scheme @@ -32,7 +32,7 @@ !! MODIFICATIONS !! ------------- !! Original 08/2007 - +!! J.Pianezzej 02/2019 : correction for use of MEGAN !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -49,6 +49,8 @@ IMPLICIT NONE ! ------------------------- ! LOGICAL, INTENT(OUT) :: OCH_BIO_FLUX ! flag for the calculation of biogenic fluxes +REAL, INTENT(OUT), OPTIONAL :: PDAILYPAR ! default values for megan PAR temperature +REAL, INTENT(OUT), OPTIONAL :: PDAILYTEMP ! default values for megan daily temperature REAL(KIND=JPRB) :: ZHOOK_HANDLE ! @@ -60,6 +62,8 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE ! IF (LHOOK) CALL DR_HOOK('DEFAULT_CH_BIO_FLUX',0,ZHOOK_HANDLE) OCH_BIO_FLUX= .FALSE. +IF (PRESENT(PDAILYPAR)) PDAILYPAR = 200. +IF (PRESENT(PDAILYTEMP)) PDAILYTEMP = 293. IF (LHOOK) CALL DR_HOOK('DEFAULT_CH_BIO_FLUX',1,ZHOOK_HANDLE) ! !------------------------------------------------------------------------------- diff --git a/src/SURFEX/default_slt.F90 b/src/SURFEX/default_slt.F90 index e4f99f54a4c89da71b6fe82f411f277676888cc0..ca96f03f98d0b5c56c5cbd4b31838ac4d8c27045 100644 --- a/src/SURFEX/default_slt.F90 +++ b/src/SURFEX/default_slt.F90 @@ -32,6 +32,7 @@ !! MODIFICATIONS !! ------------- !! Original 03/2005 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -52,8 +53,10 @@ IMPLICIT NONE REAL(KIND=JPRB) :: ZHOOK_HANDLE ! IF (LHOOK) CALL DR_HOOK('DEFAULT_SLT',0,ZHOOK_HANDLE) -CEMISPARAM_SLT = 'Vig01' -JPMODE_SLT = 3 +! ++ PIERRE / MARINE SSA - MODIF ++ +CEMISPARAM_SLT = 'Ova14' +JPMODE_SLT = 5 +! -- PIERRE / MARINE SSA - MODIF -- LVARSIG_SLT = .FALSE. LRGFIX_SLT = .TRUE. IF (LHOOK) CALL DR_HOOK('DEFAULT_SLT',1,ZHOOK_HANDLE) diff --git a/src/SURFEX/get_type_dimn.F90 b/src/SURFEX/get_type_dimn.F90 index b3b98462276242e11e3e7f37dc6cbc980aea6adc..05c60f73b86f8f402d50e74c1027f4e0a674dadf 100644 --- a/src/SURFEX/get_type_dimn.F90 +++ b/src/SURFEX/get_type_dimn.F90 @@ -1,6 +1,6 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2004-2019 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ##################################### SUBROUTINE GET_TYPE_DIM_n (DTCO, U, & @@ -26,6 +26,7 @@ !! MODIFICATIONS !! ------------- !! Original 01/2004 +! P. Wautelet 15/02/2019: move computation of ZLAND (to prevent use of non initialized values) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -99,7 +100,6 @@ ELSE ZWATER = U%XWATER ZTOWN = U%XTOWN END IF -ZLAND = ZTOWN + ZNATURE ! ALLOCATE(ZFULL(ILU)) ZFULL=1. @@ -124,6 +124,7 @@ SELECT CASE (HTYPE) KDIM = COUNT(ZWATER(:) > 0.) ! CASE ('LAND ') + ZLAND = ZTOWN + ZNATURE KDIM = COUNT(ZLAND(:) > 0.) ! END SELECT diff --git a/src/SURFEX/init_isban.F90 b/src/SURFEX/init_isban.F90 index a6680248b113d1754300bc218d5eb03e11f17c14..dfa0031efbe28ff219ee22d8797ece38d3b8b20b 100644 --- a/src/SURFEX/init_isban.F90 +++ b/src/SURFEX/init_isban.F90 @@ -57,6 +57,7 @@ SUBROUTINE INIT_ISBA_n (DTCO, OREAD_BUDGETC, UG, U, USS, GCP, IM, DTZ,& !! P. Wautelet 16/02/2018: bug correction: allocate some work arrays to 0,1,1 instead of 0,0,1 (crash with XLF) !! V.VIonnet 2017 : Blow snow !! P.Tulet 06/16 : add MEGAN coupling +!! J.Pianezzej 02/2019 : correction for use of MEGAN !! !------------------------------------------------------------------------------- ! @@ -234,7 +235,7 @@ IF (LNAM_READ) THEN IM%O%NNBYEARSPINS, IM%O%NNBYEARSPINW, IM%O%LNITRO_DILU ) ! CALL DEFAULT_CH_DEP(IM%CHI%CCH_DRY_DEP) - CALL DEFAULT_CH_BIO_FLUX(IM%CHI%LCH_BIO_FLUX) + CALL DEFAULT_CH_BIO_FLUX(IM%CHI%LCH_BIO_FLUX,PDAILYPAR=IM%MGN%XDAILYPAR,PDAILYTEMP=IM%MGN%XDAILYTEMP) CALL DEFAULT_DIAG_ISBA(IM%ID%O%N2M, IM%ID%O%LSURF_BUDGET, IM%ID%O%L2M_MIN_ZS, IM%ID%O%LRAD_BUDGET, & IM%ID%O%LCOEF, IM%ID%O%LSURF_VARS, IM%ID%DE%LSURF_EVAP_BUDGET, & IM%ID%DM%LSURF_MISC_BUDGET, IM%ID%DM%LSURF_DIAG_ALBEDO, & diff --git a/src/SURFEX/init_megann.F90 b/src/SURFEX/init_megann.F90 index e4654e149343b95b7002b1189942119ca50ede36..ee3b097f8a6b1a5ee6374c4458225f0cd1d16d81 100644 --- a/src/SURFEX/init_megann.F90 +++ b/src/SURFEX/init_megann.F90 @@ -25,6 +25,7 @@ SUBROUTINE INIT_MEGAN_n(IO, S, K, NP, MSF, MGN, PLAT, HSV, PMEGAN_FIELDS) !! ------------- !! Original: 25/10/14 !! Modified: 06/2017, J. Pianezze, adaptation for SurfEx v8.0 +!! Modified: 06/2018, P. Tulet, add PFT and LAI !! !! !! EXTERNAL @@ -44,7 +45,8 @@ USE MODD_DATA_COVER_PAR, ONLY : NVT_C4, NVT_TRBE, NVT_TRBD, NVT_TEBE, & NVT_BOGR, NVT_SHRB, NVT_GRAS, NVT_TROG, NVT_C3, & NVT_NO, NVT_ROCK, NVT_SNOW, NVT_IRR, NVT_PARK ! -USE MODD_SURF_PAR, ONLY : XUNDEF +USE MODD_SURF_PAR, ONLY : XUNDEF +USE MODD_DATA_COVER, ONLY : XDATA_LAI ! USE MODI_VEGTYPE_TO_PATCH #ifdef MNH_MEGAN @@ -86,9 +88,9 @@ REAL, DIMENSION(SIZE(K%XCLAY,1),IO%NPATCH) :: ZH_TREE REAL,DIMENSION(SIZE(K%XCLAY,1)) :: ZSILT REAL,DIMENSION(SIZE(K%XCLAY,1)) :: ZLAI ! -IF (.NOT.IO%LTR_ML) THEN - CALL ABOR1_SFX('INIT_MEGANN: FATAL ERROR PUT LTR_ML = T in NAM_ISBA (PREP_PGD step)') -END IF +!IF (.NOT.IO%LTR_ML) THEN +! CALL ABOR1_SFX('INIT_MEGANN: FATAL ERROR PUT LTR_ML = T in NAM_ISBA (PREP_PGD step)') +!END IF ! ALLOCATE(MGN%XPFT (N_MGN_PFT,SIZE(K%XCLAY,1))) ALLOCATE(MGN%XEF (N_MGN_SPC,SIZE(K%XCLAY,1))) @@ -497,7 +499,25 @@ DO JSV=1, MSF%NMEGAN_NBR IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFBIDER") MGN%XEF(18,:) = PMEGAN_FIELDS(:,JSV) IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFSTRESS") MGN%XEF(19,:) = PMEGAN_FIELDS(:,JSV) IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFOTHER") MGN%XEF(20,:) = PMEGAN_FIELDS(:,JSV) +! IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "LAI") PLAI(:,1) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT1") MGN%XPFT(1,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT2") MGN%XPFT(2,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT3") MGN%XPFT(3,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT4") MGN%XPFT(4,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT5") MGN%XPFT(5,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT6") MGN%XPFT(6,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT7") MGN%XPFT(7,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT8") MGN%XPFT(8,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT9") MGN%XPFT(9,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT10") MGN%XPFT(10,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT11") MGN%XPFT(11,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT12") MGN%XPFT(12,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT13") MGN%XPFT(13,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT14") MGN%XPFT(14,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT15") MGN%XPFT(15,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT16") MGN%XPFT(16,:) = PMEGAN_FIELDS(:,JSV) END DO + #endif ! !--------------------------------------------------------------------------- diff --git a/src/SURFEX/init_slt.F90 b/src/SURFEX/init_slt.F90 index 2320d6517af47881244b62bf2f3fb97d39c4841e..44e1e1bf988df95211f08f3e438b918468c72617 100644 --- a/src/SURFEX/init_slt.F90 +++ b/src/SURFEX/init_slt.F90 @@ -5,7 +5,36 @@ SUBROUTINE INIT_SLT (SLT, & HPROGRAM &! Program calling unit ) - +! ###################################################################### +! +!!**** *INIT_SLT* - +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! !! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! ? +!! +!! MODIFICATIONS +!! ------------- +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +!! +!------------------------------------------------------------------------------ +! ! USE MODD_SLT_n, ONLY : SLT_t ! @@ -38,14 +67,28 @@ ALLOCATE(SLT%XEMISSIG_SLT (NSLTMDE)) !Get initial size distributions. This is cut and pasted !from dead routine dstpsd.F90 !Check for different source parameterizations -IF(CEMISPARAM_SLT.eq."Vig01") THEN + +IF (CEMISPARAM_SLT.eq."Ova14") THEN + NSLTMDE = 5 +! JORDER_SLT = (/3,2,1,4,5/) !Salt modes in order of importance CRGUNITS = 'NUMB' - XEMISRADIUS_INI_SLT(:) = (/ 0.2, 2.0, 12. /) ! [um] Number median radius She84 p. 75 Table 1 - XEMISSIG_INI_SLT (:) = (/ 1.9, 2.0, 3.00 /) ! [frc] Geometric standard deviation She84 p. 75 Table 1 -ELSE ! use default of Schultz et al, 2004 - CRGUNITS = 'MASS' - XEMISRADIUS_INI_SLT(:) = 0.5*(/0.28, 2.25, 15.32/) ! [um] Mass median radius - XEMISSIG_INI_SLT (:) = (/1.59, 2.00, 2.00 /) ! [frc] Geometric standard deviation + XEMISRADIUS_INI_SLT = (/0.009, 0.021, 0.045, 0.115, 0.415/) + XEMISSIG_INI_SLT = (/1.37, 1.5, 1.42, 1.53, 1.85/) + +ELSE IF(CEMISPARAM_SLT.eq."Vig01") THEN + NSLTMDE = 5 +! JORDER_SLT = (/3,2,1,4,5/) !Salt modes in order of importance, only three modes + CRGUNITS = 'NUMB' + XEMISRADIUS_INI_SLT = (/ 0.2, 2.0, 12.,0.,0. /) ! [um] Number median radius Viganati et al., 2001 + XEMISSIG_INI_SLT = (/ 1.9, 2.0, 3.00,0.,0. /) ! [frc] Geometric standard deviation Viganati et al., 2001 + +ELSE IF(CEMISPARAM_SLT.eq."Sch04") THEN ! use default of Schultz et al, 2004 + NSLTMDE = 5 +! JORDER_SLT = (/3,2,1,4,5/), only three modes + CRGUNITS = 'MASS' + XEMISRADIUS_INI_SLT = 0.5*(/0.28, 2.25, 15.32, 0., 0./)! [um] Mass median radius + XEMISSIG_INI_SLT = (/1.59, 2.00, 2.00, 0., 0./) ! [frc] Geometric standard deviation + ENDIF ! DO JMODE=1,NSLTMDE diff --git a/src/SURFEX/modd_megann.F90 b/src/SURFEX/modd_megann.F90 index 25702d033b72cedd26ba9206b71617c6045379fe..3f1e4e1c66ca15aaa3b303c705fc692fc5dbd184 100644 --- a/src/SURFEX/modd_megann.F90 +++ b/src/SURFEX/modd_megann.F90 @@ -26,6 +26,7 @@ !! ------------- !! 16/07/2003 (P. Tulet) restructured for externalization !! 24/05/2017 (J. Pianezze) adaptation for SurfEx v8.0 +!! 13/02/2019 (J. Pianezze) correction for use of MEGAN !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -185,8 +186,8 @@ YMEGAN%LCONVERSION=.FALSE. YMEGAN%NVARS3D=0 YMEGAN%N_SCON_SPC=0 YMEGAN%XDROUGHT=0. -YMEGAN%XDAILYPAR=0. -YMEGAN%XDAILYTEMP=0. +YMEGAN%XDAILYPAR=150. +YMEGAN%XDAILYTEMP=293. YMEGAN%XMODPREC=0. IF (LHOOK) CALL DR_HOOK("MODD_MEGAN_n:MEGAN_INIT",1,ZHOOK_HANDLE) END SUBROUTINE MEGAN_INIT diff --git a/src/SURFEX/modd_slt_surf.F90 b/src/SURFEX/modd_slt_surf.F90 index 0ee1b2b658f75509634126c22cb7e93e5e97c9ff..589cfb655881a5efb184c08463b4ba564280a427 100644 --- a/src/SURFEX/modd_slt_surf.F90 +++ b/src/SURFEX/modd_slt_surf.F90 @@ -4,13 +4,18 @@ !SFX_LIC for details. version 1. MODULE MODD_SLT_SURF ! +! MODIFICATIONS +! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes + + IMPLICIT NONE ! REAL, PARAMETER :: XDENSITY_SLT = 2.1e3 ! [kg/m3] density of sea salt REAL, PARAMETER :: XMOLARWEIGHT_SLT = 58.e-3 ! [kg/mol] molar weight sea salt ! -INTEGER, PARAMETER :: NEMISMODES_MAX=3 -INTEGER, DIMENSION(NEMISMODES_MAX), PARAMETER :: JORDER_SLT=(/3,2,1/) !Dust modes in order of importance +INTEGER, PARAMETER :: NEMISMODES_MAX=5 +INTEGER, DIMENSION(NEMISMODES_MAX), PARAMETER :: JORDER_SLT=(/3,2,1,5,4/) !Dust modes in order of importance !Set emission related parameters REAL,DIMENSION(NEMISMODES_MAX) :: XEMISRADIUS_INI_SLT ! number madian radius initialization for sea salt mode (um) REAL,DIMENSION(NEMISMODES_MAX) :: XEMISSIG_INI_SLT ! dispersion initialization for sea salt mode diff --git a/src/SURFEX/modd_sltn.F90 b/src/SURFEX/modd_sltn.F90 index 84a48d74c4c7c20da51619e79970ec1ebc6e72ad..4187b72f2450b5a50a00f2607d1ec550871476ad 100644 --- a/src/SURFEX/modd_sltn.F90 +++ b/src/SURFEX/modd_sltn.F90 @@ -10,25 +10,43 @@ MODULE MODD_SLT_n ! !Author: Alf Grini / Pierre Tulet ! +! MODIFICATIONS +! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes + USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE PARKIND1 ,ONLY : JPRB ! IMPLICIT NONE -! + TYPE SLT_t +! ++ PIERRE / MARINE SSA DUST - MODIF ++ +! REAL, DIMENSION(:,:,:),POINTER :: XSFSLT ! Sea Salt variables to be send to output +! -- PIERRE / MARINE SSA DUST - MODIF -- REAL,DIMENSION(:), POINTER :: XEMISRADIUS_SLT ! Number median radius for each source mode REAL,DIMENSION(:), POINTER :: XEMISSIG_SLT ! sigma for each source mode END TYPE SLT_t + + + + CONTAINS + ! -CONTAINS -! + + + + SUBROUTINE SLT_INIT(YSLT) TYPE(SLT_t), INTENT(INOUT) :: YSLT REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK("MODD_SLT_N:SLT_INIT",0,ZHOOK_HANDLE) +! ++ PIERRE / MARINE SSA DUST - MODIF ++ +! NULLIFY(YSLT%XSFSLT) +! -- PIERRE / MARINE SSA DUST - MODIF -- NULLIFY(YSLT%XEMISRADIUS_SLT) NULLIFY(YSLT%XEMISSIG_SLT) IF (LHOOK) CALL DR_HOOK("MODD_SLT_N:SLT_INIT",1,ZHOOK_HANDLE) END SUBROUTINE SLT_INIT -! + + END MODULE MODD_SLT_n diff --git a/src/SURFEX/modn_slt.F90 b/src/SURFEX/modn_slt.F90 index 44a889c3f838d35db853431031274e7c30b52680..091c4e400dd9203e36752aa5084e7f688cc20846 100644 --- a/src/SURFEX/modn_slt.F90 +++ b/src/SURFEX/modn_slt.F90 @@ -20,10 +20,11 @@ !! MODIFICATIONS !! ------------- !! Original 24/02/05 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !! IMPLICIT ARGUMENTS !! ------------------ -USE MODD_SLT_SURF, ONLY : CEMISPARAM_SLT +USE MODD_SLT_SURF !! !----------------------------------------------------------------------------- ! @@ -32,7 +33,6 @@ USE MODD_SLT_SURF, ONLY : CEMISPARAM_SLT IMPLICIT NONE SAVE NAMELIST /NAM_SURF_SLT/ & - CEMISPARAM_SLT !Parameterization type - + CEMISPARAM_SLT, LVARSIG_SLT, LRGFIX_SLT, JPMODE_SLT !Parameterization type ! END MODULE MODN_SLT diff --git a/src/configure b/src/configure index ad0fab6be40d075c84bad39fbdabcdda25d303ed..9b3b03becf7cb4155f9587dbb2cde9aa3a9b5c45 100755 --- a/src/configure +++ b/src/configure @@ -9,12 +9,13 @@ if [ "x$XYZ" = "x" ] then # export VERSION_MASTER=${VERSION_MASTER:-MNH-V5-4} -export VERSION_BUG=${VERSION_BUG:-1} +export VERSION_BUG=${VERSION_BUG:-2} export VERSION_XYZ=${VERSION_XYZ:-${VERSION_MASTER}-${VERSION_BUG}${VER_OASIS:+-${VER_OASIS}}} export VERSION_DATE=${VERSION_DATE:-"dd/mm/yyyy"} export VERSION_LIBAEC=${VERSION_LIBAEC:-"0.3.2"} export VERSION_HDF=${VERSION_HDF:-"1.8.20"} export VERSION_CDFC=${VERSION_CDFC:-"4.5.0"} +export VERSION_CDFCXX=${VERSION_CDFCXX:-"4.2"} export VERSION_CDFF=${VERSION_CDFF:-"4.4.4"} export VERSION_GRIBAPI=${VERSION_GRIBAPI:-"1.26.0-Source"} export MNH_INT=${MNH_INT:-"4"} @@ -186,10 +187,9 @@ module load ga/\${VER_GA} export MVWORK=${MVWORK:-YES} export VER_CDF=${VER_CDF:-CDFAUTO} export MNHENV=${MNHENV:-" -#export OBJDIR_PATH=$WORKDIR/DIR_OBJ_ADA -export MP_MPILIB=pempi +#export MP_MPILIB=pempi module purge -module load intel/2013.1 +module load intel/2018.2 "} ;; AIX*) @@ -430,7 +430,7 @@ fi # ${LOCAL}/bin/eval_dollar profile_mesonh.ihm > profile_mesonh chmod +x profile_mesonh -XYZ=${ARCH}-R${MNH_REAL}I${MNH_INT}-${VERSION_XYZ}${MNH_ECRAD:+-ECRAD}${VER_USER:+-${VER_USER}}-${VER_MPI}-${OPTLEVEL} +XYZ=${ARCH}-R${MNH_REAL}I${MNH_INT}-${VERSION_XYZ}${MNH_ECRAD:+-ECRAD}${MNH_FOREFIRE:+-FF}${VER_USER:+-${VER_USER}}-${VER_MPI}-${OPTLEVEL} cp profile_mesonh profile_mesonh-${XYZ} # # Do some post-install stuff @@ -467,6 +467,7 @@ if [ "x${VER_CDF}" == "xCDFAUTO" ] ;then ( cd $LOCAL/src/LIB ; [ ! -d libaec-${VERSION_LIBAEC} ] && tar xvfz libaec-${VERSION_LIBAEC}.tar.gz ) ( cd $LOCAL/src/LIB ; [ ! -d hdf5-${VERSION_HDF} ] && tar xvfz hdf5-${VERSION_HDF}.tar.gz ) ( cd $LOCAL/src/LIB ; [ ! -d netcdf-${VERSION_CDFC} ] && tar xvfz netcdf-${VERSION_CDFC}.tar.gz ) +( cd $LOCAL/src/LIB ; [ ! -d netcdf-cxx-${VERSION_CDFCXX} ] && tar xvfz netcdf-cxx-${VERSION_CDFCXX}.tar.gz ) ( cd $LOCAL/src/LIB ; [ ! -d netcdf-fortran-${VERSION_CDFF} ] && tar xvfz netcdf-fortran-${VERSION_CDFF}.tar.gz ) fi # diff --git a/src/job_make_examples_IBM_ada b/src/job_make_examples_IBM_ada index 1dda93499733b1e16b67c7c4efadd636d8e953a5..d21cac773ced02c3139245c19dec26ea2981df77 100755 --- a/src/job_make_examples_IBM_ada +++ b/src/job_make_examples_IBM_ada @@ -1,11 +1,11 @@ -#MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +#MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier #MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -#MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +#MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt #MNH_LIC for details. version 1. # Nom arbitraire du travail LoadLeveler # @ job_name = Sortie_examples_ada # Type de travail -# @ job_type = parallel +# @ job_type = mpich # Fichier de sortie standard du travail # @ output = $(job_name).$(jobid) # Fichier de sortie d'erreur du travail @@ -14,7 +14,7 @@ # @ wall_clock_limit = 3600 # Nombre de processus demande (ici 1) # @ total_tasks = 4 -# @ environment = $DISPLAY +# @ environment = NB_TASKS=$(total_tasks) # @ queue cd $LOADL_STEP_INITDIR @@ -26,13 +26,10 @@ set -x #001_2Drelief 002_3Drelief 003_KW78 004_Reunion 007_16janvier -export MONORUN="Poe -world_sizes 1 " -export MPIRUN="Poe -world_sizes 4 " +export MONORUN="Mpirun -np 1 " +export MPIRUN="Mpirun -prepend-rank -np $NB_TASKS " export POSTRUN=" echo " -export MP_MPILIB=pempi -export MP_LABELIO=yes - time make -k 001_2Drelief time make -k 002_3Drelief time make -k 003_KW78 @@ -48,4 +45,3 @@ make -k << EOF EOF # -