From b0e04b95e6ef8de779c4e2e7027c80336ad1f184 Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Fri, 1 Mar 2019 16:08:17 +0100 Subject: [PATCH] Soline Bielli : 01/03/2019: Sea salt update: the significant sea wave height now influences salt emission. The sea salt is either set to a default value of 2meters or read in ECMWF Grib file (if the variable exists). Now 5 modes are available (3 before) and the order in output is changed. The large-scale sea wave height from ECMWF grib is 2D. HALO2 update of the ls variable in modeln is not yet adapted to 2D field (it is switch off in this version for this variable). --- src/LIB/SURCOUCHE/src/mode_field.f90 | 18 + src/MNH/aer_monitorn.f90 | 85 ++- src/MNH/default_desfmn.f90 | 2 +- src/MNH/effic_salt.f90 | 1 + src/MNH/end_diag_in_run.f90 | 4 + src/MNH/endstep.f90 | 25 +- src/MNH/ground_paramn.f90 | 14 +- src/MNH/ini_cpl.f90 | 16 +- src/MNH/ini_diag_in_run.f90 | 7 + src/MNH/ini_lb.f90 | 15 +- src/MNH/ini_ls.f90 | 17 +- src/MNH/ini_modeln.f90 | 22 +- src/MNH/ini_spawn_lsn.f90 | 41 +- src/MNH/ini_spectren.f90 | 12 +- src/MNH/init_salt.f90 | 74 ++ src/MNH/ls_coupling.f90 | 15 +- src/MNH/modd_csts_salt.f90 | 5 +- src/MNH/modd_diag_in_run.f90 | 3 + src/MNH/modd_fieldn.f90 | 9 + src/MNH/modd_getn.f90 | 4 + src/MNH/modd_lsfieldn.f90 | 10 + src/MNH/modd_salt.f90 | 72 +- src/MNH/modd_spawn.f90 | 3 + src/MNH/mode_salt_psd.f90 | 37 +- src/MNH/mode_salt_psd_wet.f90 | 926 ++++++++++++++++++++++++++ src/MNH/mode_saltopt.f90 | 32 +- src/MNH/modeln.f90 | 20 +- src/MNH/modn_salt.f90 | 3 +- src/MNH/prep_real_case.f90 | 4 + src/MNH/radiations.f90 | 5 +- src/MNH/read_all_data_grib_case.f90 | 64 +- src/MNH/read_exsegn.f90 | 9 +- src/MNH/read_field.f90 | 30 +- src/MNH/salt_filter.f90 | 188 +++++- src/MNH/saltlfin.f90 | 125 +++- src/MNH/spawn_field2.f90 | 45 +- src/MNH/spawn_lsn.f90 | 36 +- src/MNH/spawn_model2.f90 | 11 +- src/MNH/spawning.f90 | 3 + src/MNH/write_lbn.f90 | 46 +- src/MNH/write_lfifm1_for_diag.f90 | 18 +- src/MNH/write_lfin.f90 | 8 +- src/SURFEX/coupling_seaflux_orogn.F90 | 6 +- src/SURFEX/coupling_seaflux_sbln.F90 | 6 +- src/SURFEX/coupling_seafluxn.F90 | 58 +- src/SURFEX/coupling_sean.F90 | 6 +- src/SURFEX/coupling_sltn.F90 | 315 ++++++--- src/SURFEX/coupling_surf_atmn.F90 | 8 +- src/SURFEX/default_slt.F90 | 7 +- src/SURFEX/init_slt.F90 | 59 +- src/SURFEX/modd_slt_surf.F90 | 9 +- src/SURFEX/modd_sltn.F90 | 26 +- src/SURFEX/modn_slt.F90 | 6 +- 53 files changed, 2243 insertions(+), 347 deletions(-) create mode 100644 src/MNH/init_salt.f90 create mode 100644 src/MNH/mode_salt_psd_wet.f90 diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index ff01011b6..86eb6589f 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -9,6 +9,7 @@ ! 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 ! 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 !----------------------------------------------------------------- MODULE MODE_FIELD ! @@ -896,6 +897,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 = 'surface_altitude' +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' @@ -4160,6 +4175,9 @@ IF( KFROM/=KTO) THEN ! ! MODD_FIELD_n variables ! +! *** BEGIN SB ADD HS *** +CALL FIND_FIELD_ID_FROM_MNHNAME('ZWS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XZWS +! *** END SB ADD HS *** 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 diff --git a/src/MNH/aer_monitorn.f90 b/src/MNH/aer_monitorn.f90 index 245e8f672..21f1f177f 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/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index 2632f9f08..9c7cbcb5b 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/effic_salt.f90 b/src/MNH/effic_salt.f90 index 71ee6dfc2..a26367896 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 139ba83be..61405af36 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 fb0bd478b..9a3da2c54 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 a492a36b3..717aa871b 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/ini_cpl.f90 b/src/MNH/ini_cpl.f90 index 5f7909787..d7dac918a 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 ) ! ##################################################################### @@ -209,6 +211,7 @@ END MODULE MODI_INI_CPL !! (J.Escobar) 26/03/2014 bug in init of NSV_USER on RESTA case !! (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 +!! 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 2df092c1c..d44800cdc 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 087ffad67..d204ff419 100644 --- a/src/MNH/ini_lb.f90 +++ b/src/MNH/ini_lb.f90 @@ -133,6 +133,7 @@ SUBROUTINE INI_LB(TPINIFILE,OLSOURCE,KSV, & !! 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 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -900,7 +901,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 @@ -956,7 +957,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 @@ -1012,7 +1013,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 @@ -1068,7 +1069,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 @@ -1124,7 +1125,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 @@ -1180,7 +1181,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 @@ -1237,7 +1238,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_ls.f90 b/src/MNH/ini_ls.f90 index 5cf231784..4addd03ac 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_ll, 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 !! !! !------------------------------------------------------------------------------- @@ -105,11 +108,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 @@ -138,11 +143,15 @@ CALL IO_READ_FIELD(TPINIFILE,'LSUM', PLSUM) CALL IO_READ_FIELD(TPINIFILE,'LSVM', PLSVM) CALL IO_READ_FIELD(TPINIFILE,'LSWM', PLSWM) CALL IO_READ_FIELD(TPINIFILE,'LSTHM',PLSTHM) +CALL IO_READ_FIELD(TPINIFILE,'ZWS',PLSZWSM) ! IF (HGETRVM == 'READ') THEN ! LS-vapor CALL IO_READ_FIELD(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 dd7d2119f..c879f7b8b 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -282,6 +282,7 @@ END MODULE MODI_INI_MODEL_n ! 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 !! 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 @@ -532,6 +533,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 ! @@ -845,6 +847,7 @@ 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) ) @@ -987,6 +990,7 @@ IF ( NRR > 0 ) THEN ELSE ALLOCATE(XLSRVM(0,0,0)) END IF +ALLOCATE(XLSZWSM(IIU,IJU)) ; XLSZWSM = -1. ! ! lbc part ! @@ -1265,6 +1269,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 ! @@ -1273,6 +1278,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 @@ -1752,7 +1758,7 @@ 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, & - CGETTKET,CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETCIT, & + 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,& @@ -1760,9 +1766,9 @@ CALL READ_FIELD(TPINIFILE,IIU,IJU,IKU, & NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & XUM,XVM,XWM,XDUM,XDVM,XDWM, & XUT,XVT,XWT,XTHT,XPABST,XTKET,XRTKEMS, & - XRT,XSVT,XCIT,XDRYMASST, & + 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, & @@ -1865,10 +1871,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) @@ -1955,11 +1961,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 @@ -1984,8 +1992,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 8c5809786..f33f727bb 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 b932716fc..89fe2916a 100644 --- a/src/MNH/ini_spectren.f90 +++ b/src/MNH/ini_spectren.f90 @@ -35,6 +35,7 @@ END MODULE MODI_INI_SPECTRE_n !! 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 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !--------------------------------------------------------------------------------- ! @@ -198,6 +199,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 ! !------------------------------------------------------------------------------- ! @@ -804,10 +806,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 @@ -841,11 +843,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 @@ -870,8 +874,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/init_salt.f90 b/src/MNH/init_salt.f90 new file mode 100644 index 000000000..de95ce681 --- /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/ls_coupling.f90 b/src/MNH/ls_coupling.f90 index b2d17436a..24238e398 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 !! !------------------------------------------------------------------------------ ! @@ -228,6 +231,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 @@ -251,6 +255,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 @@ -298,7 +303,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_csts_salt.f90 b/src/MNH/modd_csts_salt.f90 index 4c985d21a..9db26edac 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 4c52ea117..b7bba80d0 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 c1a0be8f9..7a91f15cc 100644 --- a/src/MNH/modd_fieldn.f90 +++ b/src/MNH/modd_fieldn.f90 @@ -50,6 +50,7 @@ !! 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 !! !------------------------------------------------------------------------------- ! @@ -81,6 +82,8 @@ TYPE FIELD_t REAL, DIMENSION(:,:,:), POINTER :: XRTKES=>NULL() ! Source of kinetic energy ! (rho e) ! REAL, DIMENSION(:,:,:), POINTER :: XPABST=>NULL() ! absolute pressure at + REAL, DIMENSION(:,:), POINTER :: XZWS=>NULL() ! significant sea wave + REAL, DIMENSION(:,:), POINTER :: XZWSS=>NULL() ! significant sea wave ! ! time t ! REAL, DIMENSION(:,:,:,:), POINTER :: XRT=>NULL() ! Moist variables (rho Rn) ! ! at time t @@ -114,6 +117,8 @@ REAL, DIMENSION(:,:,:), POINTER :: XRUS=>NULL(),XRVS=>NULL(),XRWS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XRUS_PRES=>NULL(),XRVS_PRES=>NULL(),XRWS_PRES=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XTHT=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XRTHS=>NULL() +REAL, DIMENSION(:,:), POINTER :: XZWS=>NULL() +REAL, DIMENSION(:,:), POINTER :: XZWSS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XRTHS_CLD=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XSUPSAT=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XNACT=>NULL() @@ -159,6 +164,8 @@ FIELD_MODEL(KFROM)%XRWS=>XRWS !FIELD_MODEL(KFROM)%XRVS_PRES=>XRVS_PRES !Done in FIELDLIST_GOTO_MODEL !FIELD_MODEL(KFROM)%XRWS_PRES=>XRWS_PRES !Done in FIELDLIST_GOTO_MODEL !FIELD_MODEL(KFROM)%XTHT=>XTHT !Done in FIELDLIST_GOTO_MODEL +FIELD_MODEL(KFROM)%XZWS=>XZWS +FIELD_MODEL(KFROM)%XZWSS=>XZWSS FIELD_MODEL(KFROM)%XRTHS=>XRTHS !FIELD_MODEL(KFROM)%XRTHS_CLD=>XRTHS_CLD !Done in FIELDLIST_GOTO_MODEL !FIELD_MODEL(KFROM)%XSUPSAT=>XSUPSAT !Done in FIELDLIST_GOTO_MODEL @@ -193,6 +200,8 @@ XRWS=>FIELD_MODEL(KTO)%XRWS !XRUS_PRES=>FIELD_MODEL(KTO)%XRUS_PRES !Done in FIELDLIST_GOTO_MODEL !XRVS_PRES=>FIELD_MODEL(KTO)%XRVS_PRES !Done in FIELDLIST_GOTO_MODEL !XRWS_PRES=>FIELD_MODEL(KTO)%XRWS_PRES !Done in FIELDLIST_GOTO_MODEL +XZWS=>FIELD_MODEL(KTO)%XZWS +XZWSS=>FIELD_MODEL(KTO)%XZWSS !XTHT=>FIELD_MODEL(KTO)%XTHT !Done in FIELDLIST_GOTO_MODEL XRTHS=>FIELD_MODEL(KTO)%XRTHS !XRTHS_CLD=>FIELD_MODEL(KTO)%XRTHS_CLD !Done in FIELDLIST_GOTO_MODEL diff --git a/src/MNH/modd_getn.f90 b/src/MNH/modd_getn.f90 index 7a583779d..bae3402d5 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_lsfieldn.f90 b/src/MNH/modd_lsfieldn.f90 index 208f1d4d2..6274b8dd6 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_salt.f90 b/src/MNH/modd_salt.f90 index 01f908fe1..907b95672 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 41f83c8a1..8d432e588 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/mode_salt_psd.f90 b/src/MNH/mode_salt_psd.f90 index e361c1dfa..dc5a8611e 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 000000000..cb5af52f8 --- /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 ac1b4099d..d7fd28f3f 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 a903c134f..873112354 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -254,6 +254,7 @@ END MODULE MODI_MODEL_n !! Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll ! to allow to disable writes (for bench purposes) !! 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 @@ -497,6 +498,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 @@ -672,6 +674,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 @@ -701,6 +704,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 @@ -798,11 +802,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 @@ -817,8 +823,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 ! @@ -1408,10 +1414,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 ) ! @@ -1978,16 +1984,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 92fa84998..0b7e67447 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 a11651b58..b4ea670d8 100644 --- a/src/MNH/prep_real_case.f90 +++ b/src/MNH/prep_real_case.f90 @@ -379,6 +379,7 @@ !! P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define !! B.VIE 2016 : LIMA !! 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 @@ -688,6 +689,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 2bec821d7..807b5e1c6 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/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90 index 8f4e4835a..ade924ead 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 @@ -152,6 +153,7 @@ USE MODI_CH_AER_INIT_SOA USE MODI_INI_CTURB USE MODI_CH_OPEN_INPUT ! +USE MODD_FIELD_n, ONLY: XZWS USE MODD_IO_ll, ONLY: TFILEDATA USE MODD_CONF USE MODD_CONF_n @@ -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 !--------------------------------------------------------------------------------------- @@ -1882,14 +1934,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 ! @@ -1982,16 +2035,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_exsegn.f90 b/src/MNH/read_exsegn.f90 index e8f0e9d73..83d45636d 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 @@ -1739,6 +1740,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 @@ -1746,6 +1748,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 @@ -1770,9 +1773,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 @@ -1806,7 +1809,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 cba6d68cd..15878a3b6 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -9,7 +9,7 @@ INTERFACE ! SUBROUTINE READ_FIELD(TPINIFILE,KIU,KJU,KKU, & - HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT, & + 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, & @@ -17,9 +17,9 @@ INTERFACE KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & PUM,PVM,PWM,PDUM,PDVM,PDWM, & PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS, & - PRT,PSVT,PCIT,PDRYMASST, & + 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, & @@ -41,7 +41,7 @@ INTEGER, INTENT(IN) :: KIU, KJU, KKU 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,6 +72,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTKEMS ! tke adv source REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPABST ! pressure at t 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 @@ -85,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 @@ -122,7 +124,7 @@ END MODULE MODI_READ_FIELD ! ! ######################################################################## SUBROUTINE READ_FIELD(TPINIFILE,KIU,KJU,KKU, & - HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT, & + 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, & @@ -130,9 +132,9 @@ END MODULE MODI_READ_FIELD KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & PUM,PVM,PWM,PDUM,PDVM,PDWM, & PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS, & - PRT,PSVT,PCIT,PDRYMASST, & + 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, & @@ -236,6 +238,7 @@ END MODULE MODI_READ_FIELD !! 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 @@ -296,7 +299,7 @@ INTEGER, INTENT(IN) :: KIU, KJU, KKU 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 @@ -329,6 +332,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTKEMS ! tke adv source REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPABST ! pressure at t 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 @@ -341,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 @@ -456,6 +461,13 @@ SELECT CASE(HGETTKET) PRTKEMS(:,:,:) = 0. END SELECT ! +SELECT CASE(HGETZWS) + CASE('READ') + CALL IO_READ_FIELD(TPINIFILE,'ZWS',PZWS) + CASE('INIT') + PZWS(:,:)=0. +END SELECT +! SELECT CASE(HGETRVT) ! vapor CASE('READ') IF (TPINIFILE%NMNHVERSION(1)<5) THEN @@ -1193,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/salt_filter.f90 b/src/MNH/salt_filter.f90 index bff76dfe9..bc40e8891 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 c3a2650b0..3b637b278 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 b083a03d6..b49d86cc6 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_READ_FIELD(TPSONFILE,'WT',ZWORK3D) ! W wind component at time t PWT(KIB2:KIE2,KJB2:KJE2,:) = ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) + CALL IO_READ_FIELD(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 74f43ed3e..b7e8c6605 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 d920dbc0c..2811911fc 100644 --- a/src/MNH/spawn_model2.f90 +++ b/src/MNH/spawn_model2.f90 @@ -191,6 +191,7 @@ END MODULE MODI_SPAWN_MODEL2 !! Modification 01/2016 (JP Pinty) Add LIMA !! 10/2016 (C.Lac) Add droplet deposition !! 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 @@ -703,6 +704,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)) @@ -1117,18 +1120,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 7ab352665..04eda8bb6 100644 --- a/src/MNH/spawning.f90 +++ b/src/MNH/spawning.f90 @@ -74,6 +74,7 @@ !! J.Escobar : 19/04/2016 : Pb IOZ/NETCDF , missing OPARALLELIO=.FALSE. for PGD files !! 06/2016 (G.Delautier) phasage surfex 8 !! 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 @@ -292,12 +293,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 b4044c86b..0334fe22c 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_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index 188a9f0c6..235aa1ec2 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -143,6 +143,7 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG !! 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 @@ -430,6 +431,7 @@ CALL IO_WRITE_FIELD(TPFILE,'ZHAT',XZHAT) CALL IO_WRITE_FIELD(TPFILE,'ZTOP',XZTOP) ! CALL IO_WRITE_FIELD(TPFILE,'ZS', XZS) +CALL IO_WRITE_FIELD(TPFILE,'ZWS', XZWS) CALL IO_WRITE_FIELD(TPFILE,'ZSMT', XZSMT) CALL IO_WRITE_FIELD(TPFILE,'SLEVE',LSLEVE) ! @@ -1529,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_WRITE_FIELD(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)) @@ -1707,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_WRITE_FIELD(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 7d7b49854..6b6eb5b18 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -170,6 +170,7 @@ END MODULE MODI_WRITE_LFIFM_n !! 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_WRITE_FIELD(TPFILE,'ZS', XZS) +IF(ASSOCIATED(XZWS)) THEN + CALL IO_WRITE_FIELD(TPFILE,'ZWS', XZWS) +END IF CALL IO_WRITE_FIELD(TPFILE,'ZSMT', XZSMT) CALL IO_WRITE_FIELD(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.& diff --git a/src/SURFEX/coupling_seaflux_orogn.F90 b/src/SURFEX/coupling_seaflux_orogn.F90 index 71b257f9f..5d222e848 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 857f16473..53aa72d42 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 5ea7b516c..f7fc56d80 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 97a8b1f7c..ca4ae2081 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 7e66f3fa5..284fc0935 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 9ee9651c2..9a52eed46 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_slt.F90 b/src/SURFEX/default_slt.F90 index e4f99f54a..ca96f03f9 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/init_slt.F90 b/src/SURFEX/init_slt.F90 index 2320d6517..44e1e1bf9 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_slt_surf.F90 b/src/SURFEX/modd_slt_surf.F90 index 0ee1b2b65..589cfb655 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 84a48d74c..4187b72f2 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 44a889c3f..091c4e400 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 -- GitLab