diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index ff01011b61356a50b1bc7bade6b190141bcf930f..86eb6589f4c65e4b1ee9cf50ae70b63835889dcf 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 245e8f67283a5e9db1824466f63025377bc5678d..21f1f177fdb72649cc8f5074726840a36ea06626 100644 --- a/src/MNH/aer_monitorn.f90 +++ b/src/MNH/aer_monitorn.f90 @@ -72,7 +72,8 @@ END MODULE MODI_AER_MONITOR_n !! !! MODIFICATIONS !! ------------- -!! +! +!! Bielli S. (02/2019) : Sea salt : significant sea wave height influences salt emission; 5 salt modes !! EXTERNAL !! -------- ! @@ -112,7 +113,7 @@ USE MODD_LBC_n, ONLY: CLBCX, &!X-direction LBC type at left(1) ! and right(2) boundaries USE MODD_CLOUDPAR_n, ONLY: NSPLITR ! Nb of required small time step integration ! for rain sedimentation computation -USE MODD_CONF, ONLY: L1D, L2D +USE MODD_CONF, ONLY: L1D, L2D, NVERB USE MODD_CONF_n, ONLY: LUSERC,& ! Logical to use clouds LUSERV,& ! Logical to use wapor water LUSERR,& ! Logical to use rain water @@ -185,9 +186,14 @@ IKE = IKU - JPVEXT ! !* 1.2 calculate timestep variables ! +! ++ JORIS DEBUG ++ +IF (NVERB == 10) WRITE(*,*) 'dans aer_monitorn.f90 1.' +! -- JORIS DEBUG -- ! - XRSVS(:,:,:,NSV_DSTBEG:NSV_DSTEND) = & - MAX(XRSVS(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.) +! ++ PIERRE / MARINE SSA DUST - MODIF ++ +! XRSVS(:,:,:,NSV_DSTBEG:NSV_DSTEND) = & +! MAX(XRSVS(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.) +! -- PIERRE / MARINE SSA DUST - MODIF -- ! !* 2. Sedimentation of aerosols ! ------------------------ @@ -198,8 +204,11 @@ IF (LDUST.AND.LSEDIMDUST) THEN DO JSV = NSV_DSTBEG, NSV_DSTEND ZSVT(:,:,:,JSV-NSV_DSTBEG+1) = XRSVS(:,:,:,JSV) * PTSTEP / XRHODJ(:,:,:) ENDDO - CALL DUST_FILTER(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),& - XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) +! ++ PIERRE / MARINE SSA DUST - MODIF ++ + CALL DUST_FILTER(ZSVT,XRHODREF) +! CALL DUST_FILTER(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),& +! XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) +! -- PIERRE / MARINE SSA DUST - MODIF -- CALL SEDIM_DUST(XTHT(IIB:IIE,IJB:IJE,IKB:IKE), PTSTEP,& XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & @@ -222,14 +231,17 @@ IF ((LSALT).AND.(LSEDIMSALT)) THEN ZSVT(:,:,:,JSV-NSV_SLTBEG+1) = XRSVS(:,:,:,JSV) * PTSTEP / XRHODJ(:,:,:) ENDDO +! ++ JORIS DEBUG ++ CALL SALT_FILTER(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),& - XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) + XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) +! CALL SEDIM_SALT(XTHT(IIB:IIE,IJB:IJE,IKB:IKE),PTSTEP,& XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & XZZ(IIB:IIE,IJB:IJE,IKB:IKE+1), & ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:)) !ppp (concentration) -! +! -- JORIS DEBUG -- + DO JSV = NSV_SLTBEG, NSV_SLTEND XRSVS(IIB:IIE,IJB:IJE,IKB:IKE,JSV) = & ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,JSV-NSV_SLTBEG+1) *& @@ -365,7 +377,26 @@ SELECT CASE (CCLOUD) ZVMASSMIN(IIB:IIE,IJB:IJE,IKB:IKE,:),& PCCT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_C2R2BEG+1),& PCRT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_C2R2BEG+2) ) - +!++th++ 05/05/17 ajout LIMA +CASE ('LIMA') + CALL AER_WET_DEP_KMT_WARM (NSPLITR, PTSTEP, & + XZZ(IIB:IIE,IJB:IJE,IKB:IKE), & + XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & + XRT(IIB:IIE,IJB:IJE,IKB:IKE,2), & + XRT(IIB:IIE,IJB:IJE,IKB:IKE,3), & + ZRCS(IIB:IIE,IJB:IJE,IKB:IKE), & + ZRRS(IIB:IIE,IJB:IJE,IKB:IKE), & + ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & + XTHT(IIB:IIE,IJB:IJE,IKB:IKE), & + XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & + ZRGDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & + XEVAP3D(IIB:IIE,IJB:IJE,IKB:IKE), & + NMODE_DST, & + ZDENSITY(IIB:IIE,IJB:IJE,IKB:IKE,:), & + ZVMASSMIN(IIB:IIE,IJB:IJE,IKB:IKE,:),& + PCCT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_LIMA_NC),& + PCRT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_LIMA_NR) ) +!--th-- END SELECT ! 3.5 Compute return to moment vector @@ -441,25 +472,25 @@ ZDENSITY(:,:,:,:) = XDENSITY_SALT ! ! 4.1 Minimum mass to transfer between dry mass or in-cloud droplets - +! ++ PIERRE / MARINE SSA DUST - MODIF ++ DO JN=1,NMODE_SLT IMODEIDX = JPSALTORDER(JN) IF (CRGUNITD=="MASS") THEN - ZINIRADIUS(JN) = XINIRADIUS(IMODEIDX) * EXP(-3.*(LOG(XINISIG(IMODEIDX)))**2) + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) * EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) ELSE - ZINIRADIUS(JN) = XINIRADIUS(IMODEIDX) + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) END IF IF (LVARSIG) THEN - ZSIGMIN = XSIGMIN + ZSIGMIN = XSIGMIN_SLT ELSE - ZSIGMIN = XINISIG(IMODEIDX) + ZSIGMIN = XINISIG_SLT(IMODEIDX) ENDIF - ZMASSMIN(JN) = XN0MIN(IMODEIDX) * (ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(ZSIGMIN)**2) + ZMASSMIN(JN) = XN0MIN_SLT(IMODEIDX) * (ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(ZSIGMIN)**2) ! volume/um3 => #/molec_{air} ZVMASSMIN(:,:,:,JN)= ZMASSMIN(JN) * XMD * XPI * 4./3. * XDENSITY_SALT / & - (XMOLARWEIGHT_SALT*XM3TOUM3*XRHODREF(:,:,:)) + (XMOLARWEIGHT_SALT*XM3TOUM3_SALT*XRHODREF(:,:,:)) ENDDO - +! -- PIERRE / MARINE SSA DUST - MODIF -- ! ! 4.2 Derive moment from aerosol moments sources @@ -536,7 +567,25 @@ SELECT CASE (CCLOUD) ZVMASSMIN(IIB:IIE,IJB:IJE,IKB:IKE,:),& PCCT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_C2R2BEG+1),& PCRT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_C2R2BEG+2) ) - +!++th++05/05/17 ajout LIMA + CALL AER_WET_DEP_KMT_WARM (NSPLITR, PTSTEP, & + XZZ(IIB:IIE,IJB:IJE,IKB:IKE), & + XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & + XRT(IIB:IIE,IJB:IJE,IKB:IKE,2), & + XRT(IIB:IIE,IJB:IJE,IKB:IKE,3), & + ZRCS(IIB:IIE,IJB:IJE,IKB:IKE), & + ZRRS(IIB:IIE,IJB:IJE,IKB:IKE), & + ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & + XTHT(IIB:IIE,IJB:IJE,IKB:IKE), & + XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & + ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & + XEVAP3D(IIB:IIE,IJB:IJE,IKB:IKE), & + NMODE_SLT, & + ZDENSITY(IIB:IIE,IJB:IJE,IKB:IKE,:), & + ZVMASSMIN(IIB:IIE,IJB:IJE,IKB:IKE,:),& + PCCT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_LIMA_NC),& + PCRT=ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_LIMA_NR) ) +!--th-- END SELECT ! 4.5 Compute return to moment vector diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index 2632f9f08f9de9c63dc9dd42533becb31d1c5b93..9c7cbcb5bc7fc9f526fb80dcdc91661a9bbe26ca 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -227,6 +227,7 @@ END MODULE MODI_DEFAULT_DESFM_n !! 01/2018 (J.Colin) add VISC and DRAG !! 07/2017 (V. Vionnet) add blowing snow variables !! 01/2019 (R. Honnert) add reduction of the mass-flux surface closure with the resolution +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -1371,7 +1372,6 @@ IF (KMI == 1) THEN ! other values initialized in modd_dust LDEPOS_DST(:) = .FALSE. LSALT = .FALSE. - NMODE_SLT = 3 LVARSIG_SLT= .FALSE. LSEDIMSALT = .FALSE. LDEPOS_SLT(:) = .FALSE. diff --git a/src/MNH/effic_salt.f90 b/src/MNH/effic_salt.f90 index 71ee6dfc2ef9b7c6e9d84509b606551e4f30499d..a2636789606306e49d88e71ac4d74e2d72ef3c1a 100644 --- a/src/MNH/effic_salt.f90 +++ b/src/MNH/effic_salt.f90 @@ -57,6 +57,7 @@ END MODULE MODI_EFFIC_SALT !! ------------- !! Original !! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes ! Entry variables: ! ! PSVTS(INOUT) -Array of moments included in PSVTS diff --git a/src/MNH/end_diag_in_run.f90 b/src/MNH/end_diag_in_run.f90 index 139ba83bee5bc12af51fbb463a93fab6ad36a449..61405af363c8688e00877d1e7b5e1334eb17c292 100644 --- a/src/MNH/end_diag_in_run.f90 +++ b/src/MNH/end_diag_in_run.f90 @@ -58,6 +58,7 @@ SUBROUTINE END_DIAG_IN_RUN !! Original 11/2003 !! !! 02/2018 Q.Libois ECRAD +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -92,6 +93,9 @@ DEALLOCATE(XCURRENT_MER10M)! meridian wind at 10m DEALLOCATE(XCURRENT_DSTAOD)! dust aerosol optical depth DEALLOCATE(XCURRENT_SFCO2 ) ! CO2 Surface flux DEALLOCATE(XCURRENT_TKE_DISS) ! Tke dissipation rate +DEALLOCATE(XCURRENT_SLTAOD) ! Salt aerosol optical depth +DEALLOCATE(XCURRENT_ZWS ) ! Significant height of waves + ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/endstep.f90 b/src/MNH/endstep.f90 index fb0bd478bdabc82aefe0b8e7e7165a50758a34cb..9a3da2c5443fb7d07a7e43c62891df3b1d1e7ea9 100644 --- a/src/MNH/endstep.f90 +++ b/src/MNH/endstep.f90 @@ -18,16 +18,16 @@ INTERFACE PUS,PVS,PWS,PDRYMASSS, & PTHS,PRS,PTKES,PSVS, & PLSUS,PLSVS,PLSWS, & - PLSTHS,PLSRVS, & + PLSTHS,PLSRVS,PLSZWSS, & PLBXUS,PLBXVS,PLBXWS, & PLBXTHS,PLBXRS,PLBXTKES,PLBXSVS, & PLBYUS,PLBYVS,PLBYWS, & PLBYTHS,PLBYRS,PLBYTKES,PLBYSVS, & - PUM,PVM,PWM, & + PUM,PVM,PWM,PZWS, & PUT,PVT,PWT,PPABST,PDRYMASST, & PTHT,PRT,PTHM,PRCM,PPABSM,PTKET,PSVT, & PLSUM,PLSVM,PLSWM, & - PLSTHM,PLSRVM, & + PLSTHM,PLSRVM,PLSZWSM, & PLBXUM,PLBXVM,PLBXWM, & PLBXTHM,PLBXRM,PLBXTKEM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM, & @@ -51,6 +51,7 @@ REAL, INTENT(IN) :: PDRYMASSS ! Md source REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUS,PLSVS,PLSWS,& ! Large Scale PLSTHS,PLSRVS ! fields tendencies ! +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSS ! Large Scale fields tendencies REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS, & ! PLBXTHS,PLBXTKES ! LBX tendancy REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRS,PLBXSVS ! @@ -68,6 +69,7 @@ REAL, INTENT(INOUT):: PDRYMASST ! ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM,PLSVM,PLSWM,& ! Large Scale fields PLSTHM,PLSRVM ! at t-dt +REAL, DIMENSION(:,:), INTENT(INOUT) :: PLSZWSM ! Large Scale fields at t-dt ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBXUM,PLBXVM,PLBXWM, & ! PLBXTHM,PLBXTKEM ! LBX fields @@ -76,6 +78,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBXRM,PLBXSVM ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBYUM,PLBYVM,PLBYWM, & ! PLBYTHM,PLBYTKEM ! LBY fields REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBYRM,PLBYSVM ! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PZWS ! significant wave height ! END SUBROUTINE ENDSTEP ! @@ -91,16 +94,16 @@ END MODULE MODI_ENDSTEP PUS,PVS,PWS,PDRYMASSS, & PTHS,PRS,PTKES,PSVS, & PLSUS,PLSVS,PLSWS, & - PLSTHS,PLSRVS, & + PLSTHS,PLSRVS,PLSZWSS, & PLBXUS,PLBXVS,PLBXWS, & PLBXTHS,PLBXRS,PLBXTKES,PLBXSVS, & PLBYUS,PLBYVS,PLBYWS, & PLBYTHS,PLBYRS,PLBYTKES,PLBYSVS, & - PUM,PVM,PWM, & + PUM,PVM,PWM,PZWS, & PUT,PVT,PWT,PPABST,PDRYMASST, & PTHT,PRT,PTHM,PRCM,PPABSM,PTKET,PSVT, & PLSUM,PLSVM,PLSWM, & - PLSTHM,PLSRVM, & + PLSTHM,PLSRVM,PLSZWSM, & PLBXUM,PLBXVM,PLBXWM, & PLBXTHM,PLBXRM,PLBXTKEM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM, & @@ -192,6 +195,7 @@ END MODULE MODI_ENDSTEP !! 04/2013 (C.Lac) FIT for all the variables !! 04/2014 (C.Lac) Check on the positivity of PSVT !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! 02/2019 (S. Bielli) Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !------------------------------------------------------------------------------ ! @@ -241,6 +245,7 @@ REAL, INTENT(IN) :: PDRYMASSS ! Md source ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUS,PLSVS,PLSWS,& ! Large Scale PLSTHS,PLSRVS ! fields tendencies +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSS ! Large Scale fields tendencies ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS, & ! PLBXTHS,PLBXTKES ! LBX tendancy @@ -260,6 +265,8 @@ REAL, INTENT(INOUT):: PDRYMASST ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM,PLSVM,PLSWM,& ! Large Scale fields PLSTHM,PLSRVM ! at t-dt ! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PLSZWSM ! Large Scale fields at t-dt +! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBXUM,PLBXVM,PLBXWM, & ! PLBXTHM,PLBXTKEM ! LBX fields REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBXRM,PLBXSVM ! @@ -268,6 +275,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBYUM,PLBYVM,PLBYWM, & ! PLBYTHM,PLBYTKEM ! LBY fields REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBYRM,PLBYSVM ! ! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PZWS ! significant wave height ! !* 0.2 DECLARATIONS OF LOCAL VARIABLES ! @@ -383,6 +391,11 @@ ENDIF IF (SIZE(PLSRVS,1) /= 0) THEN PLSRVM(:,:,:) = MAX( PLSRVM(:,:,:) + PTSTEP * PLSRVS(:,:,:) , 0.) ENDIF + +IF (SIZE(PLSZWSS,1) /= 0) THEN + PLSZWSM(:,:) = MAX( PLSZWSM(:,:) + PTSTEP * PLSZWSS(:,:) , 0.) + PZWS(:,:) = PLSZWSM(:,:) +ENDIF ! !------------------------------------------------------------------------------ ! diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index a492a36b3bdc9c765346897f749a57689d8e21db..717aa871ba524e674bf2baffa19ea52659e6d26c 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -109,6 +109,7 @@ END MODULE MODI_GROUND_PARAM_n !! (P.Wautelet) 28/03/2018 replace TEMPORAL_DIST by DATETIME_DISTANCE !! (V. Vionnet) 18/07/2017 add coupling for blowing snow module +!! (Bielli S.) 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -128,7 +129,7 @@ USE MODD_CST, ONLY : XP00, XCPD, XRD, XRV,XRHOLW, XDAY, XPI, XLVTT, XMD, USE MODD_PARAMETERS, ONLY : JPVEXT, XUNDEF USE MODD_DYN_n, ONLY : XTSTEP USE MODD_CH_MNHC_n, ONLY : LUSECHEM -USE MODD_FIELD_n, ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET +USE MODD_FIELD_n, ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS USE MODD_METRICS_n, ONLY : XDXX, XDYY, XDZZ USE MODD_DIM_n, ONLY : NKMAX USE MODD_GRID_n, ONLY : XLON, XZZ, XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & @@ -307,6 +308,7 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_SW ! direct incoming shortwave REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_SW ! diffuse incoming shortwave REAL, DIMENSION(:), ALLOCATABLE :: ZP_PS ! surface pressure REAL, DIMENSION(:), ALLOCATABLE :: ZP_PA ! pressure at first atmospheric level +REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZWS ! significant wave height (m) REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTQ ! water vapor flux REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTH ! potential temperature flux @@ -594,7 +596,7 @@ CALL COUPLING_SURF_ATM_n(YSURF_CUR,'MESONH', 'E',ZTIMEC, ZP_SFTQ, ZP_SFTH, ZP_SFTS, ZP_SFCO2, ZP_SFU, ZP_SFV, & ZP_TSRAD, ZP_DIR_ALB, ZP_SCA_ALB, ZP_EMIS, ZP_TSURF, ZP_Z0, ZP_Z0H, ZP_QSURF, & ZP_PEW_A_COEF, ZP_PEW_B_COEF, & - ZP_PET_A_COEF, ZP_PEQ_A_COEF, ZP_PET_B_COEF, ZP_PEQ_B_COEF, & + ZP_PET_A_COEF, ZP_PEQ_A_COEF, ZP_PET_B_COEF, ZP_PEQ_B_COEF,ZP_ZWS, & 'OK' ) ! #ifdef CPLOASIS @@ -751,12 +753,14 @@ IF (LDIAG_IN_RUN) THEN XCURRENT_SWDIFF(:,:) = SUM(XSCAFLASWD(:,:,:),DIM=3) XCURRENT_SFCO2(:,:) = ZSFCO2(:,:) XCURRENT_DSTAOD(:,:)=0.0 + XCURRENT_SLTAOD(:,:)=0.0 IF (CRAD=='ECMW') THEN DO JK=IKB,IKE IKRAD = JK - 1 DO JJ=IJB,IJE DO JI=IIB,IIE XCURRENT_DSTAOD(JI,JJ)=XCURRENT_DSTAOD(JI,JJ)+XAER(JI,JJ,IKRAD,3) + XCURRENT_SLTAOD(JI,JJ)=XCURRENT_SLTAOD(JI,JJ)+XAER(JI,JJ,IKRAD,2) ENDDO ENDDO ENDDO @@ -777,6 +781,8 @@ IF (LDIAG_IN_RUN) THEN CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_ZON10M) CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_MER10M) CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_DSTAOD) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_SLTAOD) + CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_ZWS ) CALL ADD2DFIELD_ll(TZFIELDSURF_ll,XCURRENT_SFCO2 ) CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll) @@ -815,6 +821,7 @@ ALLOCATE(ZP_DIR_SW (KDIM1D,SIZE(XDIRSRFSWD,3))) ALLOCATE(ZP_SCA_SW (KDIM1D,SIZE(XSCAFLASWD,3))) ALLOCATE(ZP_PS (KDIM1D)) ALLOCATE(ZP_PA (KDIM1D)) +ALLOCATE(ZP_ZWS (KDIM1D)) ALLOCATE(ZP_SFTQ (KDIM1D)) ALLOCATE(ZP_SFTH (KDIM1D)) @@ -861,6 +868,7 @@ ZP_CO2(:) = RESHAPE(ZCO2(IIB:IIE,IJB:IJE), ISHAPE_1) ZP_SNOW(:) = RESHAPE(ZSNOW(IIB:IIE,IJB:IJE), ISHAPE_1) ZP_RAIN(:) = RESHAPE(ZRAIN(IIB:IIE,IJB:IJE), ISHAPE_1) ZP_ZREF(:) = RESHAPE(ZZREF(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_ZWS(:) = RESHAPE(XZWS(IIB:IIE,IJB:IJE), ISHAPE_1) DO JLAYER=1,NSV ZP_SV(:,JLAYER) = RESHAPE(XSVT(IIB:IIE,IJB:IJE,IKB,JLAYER), ISHAPE_1) @@ -961,6 +969,7 @@ IF (LDIAG_IN_RUN) THEN XCURRENT_HU2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_HU2M(:), ISHAPE_2) XCURRENT_ZON10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZON10M(:), ISHAPE_2) XCURRENT_MER10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_MER10M(:), ISHAPE_2) + XCURRENT_ZWS (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZWS(:), ISHAPE_2) ENDIF ! DO JLAYER=1,SIZE(PDIR_ALB,3) @@ -987,6 +996,7 @@ DEALLOCATE(ZP_DIR_SW ) DEALLOCATE(ZP_SCA_SW ) DEALLOCATE(ZP_PS ) DEALLOCATE(ZP_PA ) +DEALLOCATE(ZP_ZWS ) DEALLOCATE(ZP_SFTQ ) DEALLOCATE(ZP_SFTH ) diff --git a/src/MNH/ini_cpl.f90 b/src/MNH/ini_cpl.f90 index 5f7909787d20886c40be811715f3efb431fa15a4..d7dac918ae716215f9d5e9fedc996fb47b7464e2 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 2df092c1c83f13ae1e26a1cc14c9d704603156e5..d44800cdcd9db3fe83ddd67555e70ae68b186440 100644 --- a/src/MNH/ini_diag_in_run.f90 +++ b/src/MNH/ini_diag_in_run.f90 @@ -63,6 +63,7 @@ END MODULE MODI_INI_DIAG_IN_RUN !! ------------- !! Original 11/2003 !! 02/2018 Q.Libois ECRAD +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !! -------------------------------------------------------------------------- ! @@ -113,6 +114,8 @@ IF (LDIAG_IN_RUN) THEN ALLOCATE(XCURRENT_DSTAOD(KIU,KJU))! dust aerosol optical depth ALLOCATE(XCURRENT_SFCO2 (KIU,KJU))! CO2 Surface flux ALLOCATE(XCURRENT_TKE_DISS(KIU,KJU,KKU)) ! Tke dissipation rate + ALLOCATE(XCURRENT_SLTAOD(KIU,KJU))! Salt aerosol optical depth + ALLOCATE(XCURRENT_ZWS(KIU,KJU)) ! Significant height of waves ! ! XCURRENT_RN = XUNDEF @@ -134,6 +137,8 @@ IF (LDIAG_IN_RUN) THEN XCURRENT_DSTAOD= XUNDEF XCURRENT_SFCO2 = XUNDEF XCURRENT_TKE_DISS = XUNDEF + XCURRENT_SLTAOD= XUNDEF + XCURRENT_ZWS = XUNDEF ELSE ALLOCATE(XCURRENT_RN (0,0))! net radiation ALLOCATE(XCURRENT_H (0,0))! sensible heat flux @@ -154,6 +159,8 @@ ELSE ALLOCATE(XCURRENT_DSTAOD(0,0))! dust aerosol optical depth ALLOCATE(XCURRENT_SFCO2 (0,0))! CO2 Surface flux ALLOCATE(XCURRENT_TKE_DISS(0,0,0)) ! Tke dissipation rate + ALLOCATE(XCURRENT_SLTAOD(0,0))! Salt aerosol optical depth + ALLOCATE(XCURRENT_ZWS(0,0))! Significant height of waves END IF ! !------------------------------------------------------------------------------- diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90 index 087ffad6779d3f8a8d1e0968c9c8bc04edc5a878..d204ff419e4b1e95f06c122e62ce9f78c31575ef 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 5cf2317848635d0bd4a48ae78935e2f84b5f579f..4addd03ac9dad7bfe05a215c7a5e6c32fc627926 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 dd7d2119fc914b868c71ea58e284b70296a34796..c879f7b8bf1b78a3b6e9d76c013582cfa413c1c0 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 8c580978621c68922036a3f52244a5b3f40c280f..f33f727bbc247a84af9b5ae3934f0e8de1157b72 100644 --- a/src/MNH/ini_spawn_lsn.f90 +++ b/src/MNH/ini_spawn_lsn.f90 @@ -19,8 +19,8 @@ INTERFACE KDXRATIO,KDYRATIO, & HLBCX,HLBCY,PZZ,PZHAT, & OSLEVE,PLEN1,PLEN2, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, & - PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & + PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PLSZWSS, & KKLIN_LBXU,PCOEFLIN_LBXU,KKLIN_LBYU,PCOEFLIN_LBYU, & KKLIN_LBXV,PCOEFLIN_LBXV,KKLIN_LBYV,PCOEFLIN_LBYV, & KKLIN_LBXW,PCOEFLIN_LBXW,KKLIN_LBYW,PCOEFLIN_LBYW, & @@ -48,8 +48,10 @@ CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCY ! boundary conditions ! REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSUM,PLSVM,PLSWM ! Large Scale fields REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSTHM, PLSRVM ! at t-dt +REAL, DIMENSION(:,:), INTENT( OUT) :: PLSZWSM ! at t-dt REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSUS,PLSVS,PLSWS ! Large Scale source REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSTHS, PLSRVS ! terms +REAL, DIMENSION(:,:), INTENT( OUT) :: PLSZWSS ! source terms ! coefficients for the vertical interpolation of the LB fields INTEGER, DIMENSION(:,:,:), INTENT( OUT) :: KKLIN_LBXU,KKLIN_LBYU REAL, DIMENSION(:,:,:), INTENT( OUT) :: PCOEFLIN_LBXU,PCOEFLIN_LBYU @@ -73,8 +75,8 @@ END MODULE MODI_INI_SPAWN_LS_n KDXRATIO,KDYRATIO, & HLBCX,HLBCY,PZZ,PZHAT, & OSLEVE,PLEN1,PLEN2, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, & - PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS, & + PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & + PLSUS,PLSVS,PLSWS,PLSTHS,PLSRVS,PLSZWSS, & KKLIN_LBXU,PCOEFLIN_LBXU,KKLIN_LBYU,PCOEFLIN_LBYU, & KKLIN_LBXV,PCOEFLIN_LBXV,KKLIN_LBYV,PCOEFLIN_LBYV, & KKLIN_LBXW,PCOEFLIN_LBXW,KKLIN_LBYW,PCOEFLIN_LBYW, & @@ -140,6 +142,7 @@ END MODULE MODI_INI_SPAWN_LS_n !! coeff for U !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! J.Escobar : 18/12/2015 : Correction of bug in bound in // for NHALO <>1 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -190,6 +193,8 @@ CHARACTER (LEN=4), DIMENSION (2), INTENT(IN) :: HLBCY ! boundary conditions ! REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSUM,PLSVM,PLSWM ! Large Scale fields REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSTHM, PLSRVM ! at t-dt +REAL, DIMENSION(:,:), INTENT( OUT) :: PLSZWSM ! LS at t-dt +REAL, DIMENSION(:,:), INTENT( OUT) :: PLSZWSS ! source terms REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSUS,PLSVS,PLSWS ! Large Scale source REAL, DIMENSION(:,:,:), INTENT( OUT) :: PLSTHS, PLSRVS ! terms ! coefficients for the vertical interpolation of the LB fields @@ -231,6 +236,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTLSUM, ZTLSVM, ZTLSWM, ZTLSTHM, ZTLSRVM REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTLSUS, ZTLSVS, ZTLSWS, ZTLSTHS, ZTLSRVS REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTZS,ZZS REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTZSMT,ZZSMT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTZWS,ZTZWSS ! !------------------------------------------------------------------------------- ! @@ -260,6 +266,7 @@ ALLOCATE(ZTLSUM(IDIMX,IDIMY,SIZE(PLSUM,3))) ALLOCATE(ZTLSVM(IDIMX,IDIMY,SIZE(PLSVM,3))) ALLOCATE(ZTLSWM(IDIMX,IDIMY,SIZE(PLSWM,3))) ALLOCATE(ZTLSTHM(IDIMX,IDIMY,SIZE(PLSTHM,3))) +IF(SIZE(PLSZWSM) /= 0) ALLOCATE(ZTZWS(IDIMX,IDIMY)) IF(SIZE(PLSRVM) /= 0) ALLOCATE(ZTLSRVM(IDIMX,IDIMY,SIZE(PLSRVM,3))) ! IF(GVERT_INTERP) THEN @@ -277,11 +284,14 @@ IF ( SIZE(PLSTHS,1) /= 0 ) THEN ALLOCATE(ZTLSWS(IDIMX,IDIMY,SIZE(PLSWS,3))) ALLOCATE(ZTLSTHS(IDIMX,IDIMY,SIZE(PLSTHS,3))) ENDIF +IF ( SIZE(PLSZWSS) /= 0 ) ALLOCATE(ZTZWSS(IDIMX,IDIMY)) IF ( SIZE(PLSRVS) /= 0 ) ALLOCATE(ZTLSRVS(IDIMX,IDIMY,SIZE(PLSRVS,3))) ! ! 1.3 Specify the ls "source" fields and receiver fields ! CALL SET_LSFIELD_1WAY_ll(XLSUM, ZTLSUM, KMI) +IF ( SIZE(PLSZWSM,1) /= 0 ) & + CALL SET_LSFIELD_1WAY_ll(XLSZWSM, ZTZWS, KMI) CALL SET_LSFIELD_1WAY_ll(XLSVM, ZTLSVM, KMI) CALL SET_LSFIELD_1WAY_ll(XLSWM, ZTLSWM, KMI) CALL SET_LSFIELD_1WAY_ll(XLSTHM, ZTLSTHM, KMI) @@ -295,6 +305,8 @@ IF ( SIZE(PLSTHS,1) /= 0 ) THEN CALL SET_LSFIELD_1WAY_ll(XLSTHS, ZTLSTHS, KMI) IF ( SIZE(PLSRVM,1) /= 0 ) & CALL SET_LSFIELD_1WAY_ll(XLSRVS, ZTLSRVS, KMI) + IF ( SIZE(PLSZWSM,1) /= 0 ) & + CALL SET_LSFIELD_1WAY_ll(XLSZWSS, ZTZWSS, KMI) ENDIF ! IF ( GVERT_INTERP ) THEN @@ -454,6 +466,13 @@ IF ( SIZE(PLSRVM,1) /= 0 ) THEN HLBCX,HLBCY,ZTLSRVM,PLSRVM(IIB:IIE,IJB:IJE,:)) END IF ! +IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + CALL BIKHARDT (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, & + PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, & + 2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1, & + HLBCX,HLBCY,ZTZWS,PLSZWSM(IIB:IIE,IJB:IJE)) +END IF + IF ( SIZE(PLSTHS,1) /= 0 ) THEN ! CALL BIKHARDT (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, & @@ -469,6 +488,13 @@ IF ( SIZE(PLSTHS,1) /= 0 ) THEN ! END IF ! + IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + CALL BIKHARDT (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, & + PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, & + 2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1, & + HLBCX,HLBCY,ZTZWS+ZTIME*ZTZWSS,PLSZWSS(IIB:IIE,IJB:IJE)) + ! + END IF END IF ! !* 3.2 Vertical linear interpolation on the mass grid @@ -550,6 +576,9 @@ IF ( SIZE(PLSTHS,1) /= 0 ) THEN PLSRVS(:,:,:) = (PLSRVS(:,:,:) - PLSRVM(:,:,:)) / ZTIME END IF ! + IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + PLSZWSS(:,:) = (PLSZWSS(:,:) - PLSZWSM(:,:)) / ZTIME + END IF END IF ! !------------------------------------------------------------------------------ @@ -749,12 +778,14 @@ END IF ! DEALLOCATE(ZTLSUM,ZTLSVM,ZTLSWM,ZTLSTHM) IF(SIZE(PLSRVM) /= 0) DEALLOCATE(ZTLSRVM) +IF(SIZE(PLSZWSM) /= 0) DEALLOCATE(ZTZWS) ! IF(GVERT_INTERP) DEALLOCATE(ZTZS,ZZS) IF(GVERT_INTERP) DEALLOCATE(ZTZSMT,ZZSMT) ! IF ( SIZE(PLSTHS,1) /= 0 ) DEALLOCATE(ZTLSUS,ZTLSVS,ZTLSWS,ZTLSTHS) IF ( SIZE(PLSRVS,1) /= 0 ) DEALLOCATE(ZTLSRVS) +IF ( SIZE(PLSZWSS,1) /= 0 ) DEALLOCATE(ZTZWSS) !------------------------------------------------------------------------------ NULLIFY(TZLSFIELD_ll) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSUM) @@ -762,6 +793,7 @@ CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSVM) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSWM) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSTHM) IF(SIZE(PLSRVM) /= 0) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSRVM) +IF(SIZE(PLSZWSM) /= 0) CALL ADD2DFIELD_ll(TZLSFIELD_ll, PLSZWSM) IF ( SIZE(PLSTHS,1) /= 0 ) THEN CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSUS) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSVS) @@ -769,6 +801,7 @@ IF ( SIZE(PLSTHS,1) /= 0 ) THEN CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSTHS) ENDIF IF ( SIZE(PLSRVS,1) /= 0 ) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSRVS) +IF ( SIZE(PLSZWSS,1) /= 0 ) CALL ADD2DFIELD_ll(TZLSFIELD_ll, PLSZWSS) CALL UPDATE_HALO_ll(TZLSFIELD_ll,IINFO_ll) CALL CLEANLIST_ll(TZLSFIELD_ll) ! diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90 index b932716fc7e9519cdf8662b3e95cdafc598e2c7e..89fe2916a6f9d2d667dba4dd1ef78453250ce323 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 0000000000000000000000000000000000000000..de95ce681e4751a7b4c244bec44bcbdfa0e6c9f8 --- /dev/null +++ b/src/MNH/init_salt.f90 @@ -0,0 +1,74 @@ +!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence +!ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!ORILAM_LIC for details. +!----------------------------------------------------------------- + +!! ###################### + SUBROUTINE INIT_SALT +!! ###################### +! PURPOSE +!! ------- +!! +!! initialization of variables for the sea salt scheme +!! +!! METHOD +!! ------ +!! +!! +!! REFERENCE +!! --------- +!! none +!! +!! +!! AUTHOR +!! ------ +!! Marine Claeys (CNRM) +!! +!! MODIFICATIONS +!! ------------- +!! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! +USE MODD_SALT +! +IMPLICIT NONE + +IF(NMODE_SLT == 5) THEN + +!JPSALTORDER = (/5, 4, 3, 2, 1 /) +!Initial dry number median radius (um) from Ova et al., 2014 +XINIRADIUS_SLT= (/0.009, 0.021, 0.045, 0.115, 0.415/) +!Initial, standard deviation from Ova et al., 2014 +XINISIG_SLT = (/ 1.37, 1.5, 1.42, 1.53, 1.85 /) +!Minimum allowed number concentration for any mode (#/m3) +XN0MIN_SLT = (/1.e1 , 1.e1, 1.e1, 1., 1.e-4 /) + + +ELSE IF ( NMODE_SLT == 3) THEN + +! Set the order of the loops sorted by importance +!This means that if a user choses 1 mode it will have characteristics of mode 2 +!2 modes will be mode 2 & 3, whereas 3 modes will modes 1, 2 and 3 +!JPSALTORDER = (/3, 2, 1, 4, 5/) +! + !Initial dry number median radius (um) from Vignati et al., 2001 + ! XINIRADIUS_SLT= (/0.2, 2., 12./) + !Initial, standard deviation from Vignati et al., 2001 + ! XINISIG_SLT = (/1.9, 2., 3./) + !Minimum allowed number concentration for any mode (#/m3) + ! XN0MIN_SLT = (/1.e1 , 1. , 1.e-4 /) + + +!Pour 3 modes Schultz +!Initial dry number median radius (um) from Schultz et al., 2004 + XINIRADIUS_SLT= 0.5*(/0.28, 2.25, 15.32, 0., 0. /) +!Initial, standard deviation from Schultz et al., 2004 + XINISIG_SLT = (/1.9, 2., 2., 0., 0./) +!Minimum allowed number concentration for any mode (#/m3) + XN0MIN_SLT = (/1.e1 , 1. , 1.e-4, 0., 0. /) +! +END IF + + +END SUBROUTINE INIT_SALT diff --git a/src/MNH/ls_coupling.f90 b/src/MNH/ls_coupling.f90 index b2d17436aded6339a4c727650852033aaa8ac48d..24238e398d3ac9b80170747fbeb47cb5ab41deb6 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 4c985d21a1f9e606d11aa89ec831c8ecb621a5e6..9db26edacaf63aa95a8388e544ed9eacf29f6308 100644 --- a/src/MNH/modd_csts_salt.f90 +++ b/src/MNH/modd_csts_salt.f90 @@ -33,6 +33,7 @@ !! !! MODIFICATIONS !! ------------- +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !!-------------------------------------------------------------------- !! DECLARATIONS @@ -42,7 +43,9 @@ IMPLICIT NONE ! !densit� salt a introduire -REAL, PARAMETER :: XDENSITY_SALT = 2.1e3 ![kg/m3] density of dust +! ++ PIERRE / MARINE SSA DUST - MODIF ++ +REAL, PARAMETER :: XDENSITY_SALT = 2.2e3 ![kg/m3] density of dust +! -- PIERRE / MARINE SSA DUST - MODIF -- REAL, PARAMETER :: XMOLARWEIGHT_SALT = 58.e-3 ![kg/mol] molar weight dust REAL, PARAMETER :: XM3TOUM3_SALT = 1.d18 ![um3/m3] conversion factor REAL, PARAMETER :: XUM3TOM3_SALT = 1.d-18 ![m3/um3] conversion factor diff --git a/src/MNH/modd_diag_in_run.f90 b/src/MNH/modd_diag_in_run.f90 index 4c52ea1175777bf35c09d329002634b54f7c99ca..b7bba80d0c045a7787cf64d952de4b44c6a2961f 100644 --- a/src/MNH/modd_diag_in_run.f90 +++ b/src/MNH/modd_diag_in_run.f90 @@ -11,6 +11,7 @@ MODULE MODD_DIAG_IN_RUN ! Modifications !! 02/2018 Q.Libois ECRAD +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes ! !* stores instantaneous diagnostic arrays for the current time-step ! @@ -37,4 +38,6 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_MER10M! meridian wind at 10m REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_DSTAOD! dust aerosol optical depth REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SFCO2 ! CO2 Surface flux REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCURRENT_TKE_DISS ! Tke dissipation rate +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SLTAOD ! Salt aerosol optical depth +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_ZWS ! Significant height of waves END MODULE MODD_DIAG_IN_RUN diff --git a/src/MNH/modd_fieldn.f90 b/src/MNH/modd_fieldn.f90 index c1a0be8f9e0f84db061d3b232b2a086f7a64d82f..7a91f15cc757113aaa76f87549a4bc01de7e02e5 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 7a583779d04dd284bda63e2f567b548931c21c26..bae3402d5f9a9453dbc6f7f0fa706e3755793aa3 100644 --- a/src/MNH/modd_getn.f90 +++ b/src/MNH/modd_getn.f90 @@ -52,6 +52,7 @@ !! V. Masson 01/2004 surface externalization (rm CGETSURF) !! 05/2006 Remove EPS and LGETALL !! M. Leriche 04/2010 add get indicators for pH in cloud and rain +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -102,6 +103,7 @@ TYPE GET_t CHARACTER (LEN=4) :: CGETBL_DEPTH ! Get indicator for the BL depth CHARACTER (LEN=4) :: CGETSBL_DEPTH ! Get indicator for the SBL depth CHARACTER (LEN=4) :: CGETPHC,CGETPHR ! Get indicator for the pH values + CHARACTER (LEN=4) :: CGETZWS ! in cloud water and rainwater ! END TYPE GET_t @@ -133,6 +135,7 @@ CHARACTER (LEN=4), POINTER :: CGETBL_DEPTH=>NULL() CHARACTER (LEN=4), POINTER :: CGETSBL_DEPTH=>NULL() CHARACTER (LEN=4), POINTER :: CGETPHC=>NULL() CHARACTER (LEN=4), POINTER :: CGETPHR=>NULL() +CHARACTER (LEN=4), POINTER :: CGETZWS=>NULL() CONTAINS @@ -179,6 +182,7 @@ CGETSRC=>GET_MODEL(KTO)%CGETSRC CGETCLDFR=>GET_MODEL(KTO)%CGETCLDFR CGETSRCT=>GET_MODEL(KTO)%CGETSRCT CGETCIT=>GET_MODEL(KTO)%CGETCIT +CGETZWS=>GET_MODEL(KTO)%CGETZWS CGETCONV=>GET_MODEL(KTO)%CGETCONV CGETRAD=>GET_MODEL(KTO)%CGETRAD CGETCLOUD=>GET_MODEL(KTO)%CGETCLOUD diff --git a/src/MNH/modd_lsfieldn.f90 b/src/MNH/modd_lsfieldn.f90 index 208f1d4d2bb3a8ae3cdd6b34a35324f76449d7a8..6274b8dd6075620ef5b74a9c58629da9b5884af1 100644 --- a/src/MNH/modd_lsfieldn.f90 +++ b/src/MNH/modd_lsfieldn.f90 @@ -36,6 +36,7 @@ !! 2D arrays to store values at lateral boundaries !! 20/05/06 Remove EPS !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! ! @@ -55,12 +56,15 @@ TYPE LSFIELD_t ! ! time t-dt for larger scales ! REAL, DIMENSION(:,:,:), POINTER :: XLSRVM=>NULL() ! Rv (mixing ratio for vapor) ! ! at time t-dt for larger scales + REAL, DIMENSION(:,:), POINTER :: XLSZWSM=>NULL() ! height of sea waves REAL, DIMENSION(:,:,:), POINTER :: XLSUS=>NULL(),XLSVS=>NULL(),XLSWS=>NULL() ! Tendency of ! U,V,W for larger scales REAL, DIMENSION(:,:,:), POINTER :: XLSTHS=>NULL() ! Tendency of ! theta for larger scales REAL, DIMENSION(:,:,:), POINTER :: XLSRVS=>NULL() ! Tendency of ! ! RV for larger scales +REAL, DIMENSION(:,:), POINTER :: XLSZWSS=>NULL() ! Tendency of +! ! sea wave for larger scales ! previously present for LS for V * Prhodj ! ! Large scale variables for horizontal lbc @@ -104,8 +108,10 @@ TYPE(LSFIELD_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: LSFIELD_MODEL REAL, DIMENSION(:,:,:), POINTER :: XLSUM=>NULL(),XLSVM=>NULL(),XLSWM=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLSTHM=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLSRVM=>NULL() +REAL, DIMENSION(:,:), POINTER :: XLSZWSM=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLSUS=>NULL(),XLSVS=>NULL(),XLSWS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLSTHS=>NULL() +REAL, DIMENSION(:,:), POINTER :: XLSZWSS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLSRVS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLBXUM=>NULL(),XLBXVM=>NULL(),XLBXWM=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLBXTHM=>NULL() @@ -143,11 +149,13 @@ INTEGER, INTENT(IN) :: KFROM, KTO !LSFIELD_MODEL(KFROM)%XLSWM=>XLSWM !Done in FIELDLIST_GOTO_MODEL !LSFIELD_MODEL(KFROM)%XLSTHM=>XLSTHM !Done in FIELDLIST_GOTO_MODEL !LSFIELD_MODEL(KFROM)%XLSRVM=>XLSRVM !Done in FIELDLIST_GOTO_MODEL +LSFIELD_MODEL(KFROM)%XLSZWSM=>XLSZWSM LSFIELD_MODEL(KFROM)%XLSUS=>XLSUS LSFIELD_MODEL(KFROM)%XLSVS=>XLSVS LSFIELD_MODEL(KFROM)%XLSWS=>XLSWS LSFIELD_MODEL(KFROM)%XLSTHS=>XLSTHS LSFIELD_MODEL(KFROM)%XLSRVS=>XLSRVS +LSFIELD_MODEL(KFROM)%XLSZWSS=>XLSZWSS !LSFIELD_MODEL(KFROM)%XLBXUM=>XLBXUM !Done in FIELDLIST_GOTO_MODEL !LSFIELD_MODEL(KFROM)%XLBXVM=>XLBXVM !Done in FIELDLIST_GOTO_MODEL !LSFIELD_MODEL(KFROM)%XLBXWM=>XLBXWM !Done in FIELDLIST_GOTO_MODEL @@ -199,11 +207,13 @@ LSFIELD_MODEL(KFROM)%NKLIN_LBYM=>NKLIN_LBYM !XLSWM=>LSFIELD_MODEL(KTO)%XLSWM !Done in FIELDLIST_GOTO_MODEL !XLSTHM=>LSFIELD_MODEL(KTO)%XLSTHM !Done in FIELDLIST_GOTO_MODEL !XLSRVM=>LSFIELD_MODEL(KTO)%XLSRVM !Done in FIELDLIST_GOTO_MODEL +XLSZWSM=>LSFIELD_MODEL(KTO)%XLSZWSM XLSUS=>LSFIELD_MODEL(KTO)%XLSUS XLSVS=>LSFIELD_MODEL(KTO)%XLSVS XLSWS=>LSFIELD_MODEL(KTO)%XLSWS XLSTHS=>LSFIELD_MODEL(KTO)%XLSTHS XLSRVS=>LSFIELD_MODEL(KTO)%XLSRVS +XLSZWSS=>LSFIELD_MODEL(KTO)%XLSZWSS !XLBXUM=>LSFIELD_MODEL(KTO)%XLBXUM !Done in FIELDLIST_GOTO_MODEL !XLBXVM=>LSFIELD_MODEL(KTO)%XLBXVM !Done in FIELDLIST_GOTO_MODEL !XLBXWM=>LSFIELD_MODEL(KTO)%XLBXWM !Done in FIELDLIST_GOTO_MODEL diff --git a/src/MNH/modd_salt.f90 b/src/MNH/modd_salt.f90 index 01f908fe1e56873f0a8c7db97be309d50a94aa63..907b95672080fb541fd8a47c907051f9fd893687 100644 --- a/src/MNH/modd_salt.f90 +++ b/src/MNH/modd_salt.f90 @@ -35,6 +35,7 @@ !! ------------- !! !! 2014 P.Tulet modif XINIRADIUS_SLT and XN0MIN_SLT +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! USE MODD_PARAMETERS, ONLY: JPMODELMAX !!-------------------------------------------------------------------- @@ -42,51 +43,64 @@ USE MODD_PARAMETERS, ONLY: JPMODELMAX !! ------------ IMPLICIT NONE ! - +! ++ PIERRE / MARINE SSA DUST - MODIF ++ +LOGICAL :: LSLTMACC = .FALSE. ! switch to active pronostic sea salts from MACC LOGICAL :: LSALT = .FALSE. ! switch to active pronostic sea salts +LOGICAL :: LONLY = .FALSE. +LOGICAL :: LREAD_ONLY_HS_MACC = .FALSE. LOGICAL :: LSLTINIT = .FALSE. ! switch to initialize pronostic sea salts LOGICAL :: LSLTPRES = .FALSE. ! switch to know if pronostic salts exist LOGICAL,DIMENSION(JPMODELMAX) :: LDEPOS_SLT = .FALSE. ! switch to SLT wet depositon -INTEGER :: NMODE_SLT= 3 ! number of sea salt modes (max 3; default = 3) + +!INTEGER :: NMODE_SLT= 3 ! number of sea salt modes (max 3; default = 3) +INTEGER :: NMODE_SLT= 5 ! number of sea salt modes (max 5; default = 3) ! CHARACTER(LEN=9),DIMENSION(:),ALLOCATABLE :: CDESLTNAMES -CHARACTER(LEN=9),DIMENSION(6), PARAMETER :: YPDESLT_INI = & - (/'DESLTM31C','DESLTM32C','DESLTM33C' & - ,'DESLTM31R','DESLTM32R','DESLTM33R' /) -CHARACTER(LEN=6),DIMENSION(:),ALLOCATABLE :: CSALTNAMES -CHARACTER(LEN=6),DIMENSION(9), PARAMETER :: YPSALT_INI = & - (/'SLTM01','SLTM31','SLTM61' & - ,'SLTM02','SLTM32','SLTM62' & - ,'SLTM03','SLTM33','SLTM63' /) -! Set the order of the loops sorted by importance -!This means that if a user choses 1 mode it will have characteristics of mode 2 -!2 modes will be mode 2 & 3, whereas 3 modes will modes 1, 2 and 3 -INTEGER, DIMENSION(3),PARAMETER :: JPSALTORDER = (/3, 2, 1/) -! -REAL, ALLOCATABLE :: XSLTMSS(:,:,:) ! [kg/m3] total mass concentration of sea salt +CHARACTER(LEN=6),DIMENSION(:), ALLOCATABLE :: CSALTNAMES +CHARACTER(LEN=9),DIMENSION(10), PARAMETER :: YPDESLT_INI = & + (/'DESLTM31C','DESLTM32C','DESLTM33C','DESLTM34C', 'DESLTM35C', & + 'DESLTM31R','DESLTM32R','DESLTM33R', 'DESLTM34R','DESLTM35R' /) + +CHARACTER(LEN=6),DIMENSION(15), PARAMETER :: YPSALT_INI = & + (/'SLTM01','SLTM31','SLTM61',& + 'SLTM02','SLTM32','SLTM62',& + 'SLTM03','SLTM33','SLTM63',& + 'SLTM04','SLTM34','SLTM64',& + 'SLTM05','SLTM35','SLTM65' /) + +INTEGER, DIMENSION(5),PARAMETER :: JPSALTORDER = (/3, 2, 1, 5, 4/) + +!Test Thomas (definir rayons et sigma ici si on veut desactiver initialisation MACC) + +!REAL, DIMENSION(5) :: XINIRADIUS_SLT,XINISIG_SLT,XN0MIN_SLT + +!Initial dry number median radius (um) from Ova et al., 2014 +REAL,DIMENSION(5) :: XINIRADIUS_SLT= (/0.009, 0.021, 0.045, 0.115, 0.415/) +!Initial, standard deviation from Ova et al., 2014 +REAL,DIMENSION(5) :: XINISIG_SLT = (/ 1.37, 1.5, 1.42, 1.53, 1.85 /) +!Minimum allowed number concentration for any mode (#/m3) +REAL,DIMENSION(5) :: XN0MIN_SLT = (/1.e1 , 1.e1, 1.e1, 1., 1.e-4 /) + +!Test Thomas + +REAL, DIMENSION(:,:,:), ALLOCATABLE :: XSLTMSS ! [kg/m3] total mass concentration of sea salt ! ! aerosol lognormal parameterization -CHARACTER(LEN=4) :: CRGUNITS = 'MASS' ! type of log-normal geometric mean radius +CHARACTER(LEN=4) :: CRGUNITS = 'NUMB' ! type of log-normal geometric mean radius ! !given in namelist (mass on number) ! LOGICAL :: LRGFIX_SLT = .FALSE. ! switch to fix RG (sedimentation) LOGICAL :: LVARSIG_SLT = .FALSE. ! switch to active pronostic dispersion for all modes LOGICAL :: LSEDIMSALT = .FALSE. ! switch to active aerosol sedimentation REAL :: XSIGMIN_SLT = 1.20 ! minimum dispersion value for sea salt mode +!REAL :: XSIGMIN_SLT = 0. ! minimum dispersion value for sea salt mode REAL :: XSIGMAX_SLT = 3.60 ! maximum dispersion value for sea salt mode REAL :: XCOEFRADMAX_SLT = 10. ! maximum increasement for Rg mode sea salt -REAL :: XCOEFRADMIN_SLT = 0.1 ! maximum decreasement for Rg mode sea salt -! +REAL :: XCOEFRADMIN_SLT = 0.1 ! minimum decreasement for Rg mode sea salt +!REAL :: XCOEFRADMIN_SLT = 0. ! minimum decreasement for Rg mode sea salt -!Initial dry number median radius (um) from Vignati et al., 2001 -!REAL, DIMENSION(3) :: XINIRADIUS_SLT= (/0.2, 2., 12./) -!Initial, standard deviation from Vignati et al., 2001 -!REAL, DIMENSION(3) :: XINISIG_SLT = (/1.9, 2., 3./) -!Initial dry number median radius (um) from Schultz et al., 2004 -REAL, DIMENSION(3) :: XINIRADIUS_SLT= 0.5*(/0.28, 2.25, 15.32/) -!Initial, standard deviation from Schultz et al., 2004 -REAL, DIMENSION(3) :: XINISIG_SLT = (/1.9, 2., 2./) -!Minimum allowed number concentration for any mode (#/m3) -REAL, DIMENSION(3) :: XN0MIN_SLT = (/1.e1 , 1. , 1.e-4 /) + +! +! -- PIERRE / MARINE SSA DUST - MODIF -- ! END MODULE MODD_SALT diff --git a/src/MNH/modd_spawn.f90 b/src/MNH/modd_spawn.f90 index 41f83c8a1d5ede0151a11e0ca4c1329dd1a40150..8d432e588f5fbce395ee2385fb50883f8eb5f41e 100644 --- a/src/MNH/modd_spawn.f90 +++ b/src/MNH/modd_spawn.f90 @@ -33,6 +33,7 @@ !! Original 12/07/99 !! Modification 08/04/04 (G.Jaubert) Spawning 1 option !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -79,12 +80,14 @@ REAL,DIMENSION(:,:,:,:),SAVE,POINTER :: XRT1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XUT1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XVT1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XWT1 => NULL() +REAL,DIMENSION(:,:), SAVE,POINTER :: XZWS1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XSRCT1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XSIGS1 => NULL() TYPE(DATE_TIME), SAVE,POINTER :: TDTCUR1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSUM1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSVM1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSWM1 => NULL() +REAL,DIMENSION(:,:) ,SAVE,POINTER :: XLSZWSM1=> NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSTHM1 => NULL() REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSRVM1 => NULL() ! diff --git a/src/MNH/mode_salt_psd.f90 b/src/MNH/mode_salt_psd.f90 index e361c1dfac7aa5e7831247959f959777e4d6eec4..dc5a8611ef01cbc1505633c4b5a97c2a9848e699 100644 --- a/src/MNH/mode_salt_psd.f90 +++ b/src/MNH/mode_salt_psd.f90 @@ -23,9 +23,14 @@ !! !! MODIFICATIONS !! ------------- +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !------------------------------------------------------------------------------- ! +! ++ JORIS DEBUG ++ +USE MODD_CONF, ONLY : NVERB +! -- JORIS DEBUG -- +! USE MODD_CSTS_SALT !Constants which are important for sea salt calculations USE MODD_SALT !Dust module which contains even more constants USE MODD_CST, ONLY : & @@ -137,6 +142,11 @@ ALLOCATE (ZINIRADIUS(NMODE_SLT)) ZSV(:,:,:,:) = MAX(PSVT(:,:,:,:), XMNH_TINY) +! ++ JORIS DBG ++ +ZRG(:,:,:)= XMNH_TINY +ZM(:,:,:,:)= XMNH_TINY +! -- JORIS DBG -- + DO JN=1,NMODE_SLT IMODEIDX = JPSALTORDER(JN) !Calculations here are for one mode only @@ -235,6 +245,10 @@ DO JN=1,NMODE_SLT * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) ZM(:,:,:,NM3(JN)) = MAX(ZM(:,:,:,NM3(JN)), ZMMIN(NM3(JN))) +!Modif salt/dust 5.1. beg + PSVT(:,:,:,JN) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) +!Modif salt/dust 5.1. end ZM(:,:,:,NM0(JN))= ZM(:,:,:,NM3(JN))/& ((ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(XINISIG_SLT(JPSALTORDER(JN)))**2)) @@ -280,6 +294,21 @@ DO JN=1,NMODE_SLT END IF ! !Get number median radius (eqn. 7 in Orilam manuscript) + ! ++ JORIS DBG ++ + IF (NVERB ==15) THEN + WRITE(*,*) 'SHAPE(ZM) =', SHAPE(ZM) + WRITE(*,*) 'MINVAL(ZM), MAXVAL(ZM) =', MINVAL(ZM), MAXVAL(ZM) + WRITE(*,*) 'MINLOC(ZM), MAXLOC(ZM) =', MINLOC(ZM), MAXLOC(ZM) + WRITE(*,*) 'SHAPE(ZRG) =', SHAPE(ZRG) + WRITE(*,*) 'MINVAL(ZRG), MAXVAL(ZRG) =', MINVAL(ZRG), MAXVAL(ZRG) + WRITE(*,*) 'MINLOC(ZRG), MAXLOC(ZRG) =', MINLOC(ZRG), MAXLOC(ZRG) + WRITE(*,*) 'XSIXTH_SALT =', XSIXTH_SALT + WRITE(*,*) 'JN =', JN + WRITE(*,*) 'NM0 =', NM0 + WRITE(*,*) 'NM3 =', NM3 + WRITE(*,*) 'NM6 =', NM6 + ENDIF + ! -- JORIS DBG -- ZRG(:,:,:)= & ( & ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN)) & @@ -414,7 +443,9 @@ END SUBROUTINE PPP2SALT ! ! PSVT need to be positive - PSVT(:,:,:,:) = MAX(PSVT(:,:,:,:), XMNH_TINY) +!Modif salt/dust 5.1. beg +! PSVT(:,:,:,:) = MAX(PSVT(:,:,:,:), XMNH_TINY) +!Modif salt/dust 5.1. end DO JN=1,NMODE_SLT IMODEIDX = JPSALTORDER(JN) @@ -629,8 +660,10 @@ ALLOCATE (ZSIGMA(SIZE(PSVT,1))) ALLOCATE (ZRG(SIZE(PSVT,1))) ALLOCATE (ZSV(SIZE(PSVT,1), SIZE(PSVT,2))) ALLOCATE (ZINIRADIUS(NMODE_SLT)) - + +!Modif salt/dust 5.1. beg ZSV(:,:) = MAX(PSVT(:,:), XMNH_TINY) +!Modif salt/dust 5.1. end DO JN=1,NMODE_SLT IMODEIDX = JPSALTORDER(JN) diff --git a/src/MNH/mode_salt_psd_wet.f90 b/src/MNH/mode_salt_psd_wet.f90 new file mode 100644 index 0000000000000000000000000000000000000000..cb5af52f838a83cd4997f9fad234eb1919262d24 --- /dev/null +++ b/src/MNH/mode_salt_psd_wet.f90 @@ -0,0 +1,926 @@ +!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence +!ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!ORILAM_LIC for details. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/Attic/mode_salt_psd.f90,v $ $Revision: 1.1.2.1.2.1.2.1.2.1 $ $Date: 2013/07/12 13:55:08 $ +!----------------------------------------------------------------- +!! ######################## + MODULE MODE_SALT_PSD_WET +!! ######################## +!! +!! PURPOSE +!! ------- +!! MODULE SALT PSD (Particle Size Distribution) +!! Purpose: Contains subroutines to convert from transported variables (ppp) +!! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n} +!! +!! AUTHOR +!! ------ +!! Alf Grini (CNRM/GMEI) +!! +!! MODIFICATIONS +!! ------------- +!! M. Claeys - (CNRM-GMEI) 2015 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +!------------------------------------------------------------------------------- +! +USE MODD_CSTS_SALT !Constants which are important for sea salt calculations +USE MODD_SALT !Dust module which contains even more constants +USE MODD_CST, ONLY : & + XPI & !Definition of pi + ,XBOLTZ & ! Boltzman constant + ,XAVOGADRO & ![molec/mol] avogadros number + ,XG & ! Gravity constant + ,XP00 & ! Reference pressure + ,XMD & ![kg/mol] molar weight of air + ,XRD & ! Gaz constant for dry air + ,XCPD & ! Cpd (dry air) + ,XRHOLW & ! Densité de l'eau + ,XMV & ! Molar weight of water + ,XALPI & + ,XBETAI & + ,XGAMI & + ,XTT +USE MODD_CST, ONLY : XMNH_TINY +USE MODE_THERMO ! Pour calcul de la pression de vapeur saturante +USE MODD_PARAM_n, ONLY : CCLOUD + + +! +IMPLICIT NONE +! +CONTAINS +! +!! ############################################################ + SUBROUTINE PPP2SALT_WET( & + PSVT & !I [ppp] input scalar variables (moment of distribution) + , PRHODREF & !I [kg/m3] density of air + , PPABST & !I Pression + , PTHT & !I Potential temperature + , PRT & !I Large scale vapor mixing ratio + , PSIG3D & !O [-] standard deviation of aerosol distribution + , PRG3D & !O [um] number median wet radius of aerosol distribution + , PN3D & !O [#/m3] number concentration of aerosols + , PMASS3D & !O [kg/m3]wet mass concentration of aerosol + , PM3D & !O aerosols moments 0, 3 and 6 + , PDENSITY_WET & !O [g/m2] density of wet aerosol (water + salt) + ) +!! ############################################################ +! +!! +!! PURPOSE +!! ------- +!! Translate the three moments M0, M3 and M6 given in ppp into +!! Values which can be understood more easily (R, sigma, N, M) +!! +!! Calcul the wet radius of the particles, using RH and Gerber (1985) relation +!! The mass of the aerosols is calculated using the new radius and the +!density of water and salt +!! +!! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES +!! ------- +!! CALL PPP2AEROS(PSVT, PRHODREF, PSIG3D=SIGVAR, & +!! PRG3D=RVAR, PN3D=NVAR, PM3D=MASSVAR) +!! +!! REFERENCE +!! --------- +!! none +!! +!! AUTHOR +!! ------ +!! Pierre TULET (LA) +!! +!! MODIFICATIONS +!! ------------- +!! 2005 Alf Grini (CNRM) +!! 2006 Jean-Pierre Chaboureau (LA) +!! 2015 Marine Claeys (CNRM) +!! EXTERNAL +!! -------- +!! None +!! + IMPLICIT NONE +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !I [ppp] first moment +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST !I Pression +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT !I Potential temperature +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT !I Large scale vapor mixing ratio + +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PSIG3D !O [-] standard deviation +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PRG3D !O [um] number median radius +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PN3D !O [#/m3] number concentration +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PMASS3D !O [kg_{aer}/m3] wet mass concentration +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PM3D !O aerosols moments +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PDENSITY_WET !O Density of wet aerosol (water + salt) +! +! +!* 0.2 declarations local variables +! +REAL :: ZRHOI ! [kg/m3] density of aerosol +REAL :: ZRHOLW ! [kg/m3] density of water +REAL :: ZMI ! [kg/mol] molar weight of aerosol +REAL :: ZMV ! [kg/mol] molar weight of water +REAL :: ZRGMIN ! [um] minimum radius accepted +REAL :: ZSIGMIN ! minimum standard deviation accepted + +REAL, PARAMETER :: C1 = 0.7674 +REAL, PARAMETER :: C2 = 3.079 +REAL, PARAMETER :: C3 = 2.572E-11 +REAL, PARAMETER :: C4 = -1.424 + +REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZM ! [aerosol units] local array which goes to output later +REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV ! [sea salts moment concentration] +REAL,DIMENSION(:), ALLOCATABLE :: ZMMIN ! [aerosol units] minimum values for N, sigma, M +INTEGER,DIMENSION(:), ALLOCATABLE :: NM0 ! [idx] index for Mode 0 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM3 ! [idx] indexes for Mode 3 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM6 ! [idx] indexes for Mode 6 in passed variables +REAL,DIMENSION(:), ALLOCATABLE :: ZINIRADIUS ! initial mean radius +INTEGER :: JN,IMODEIDX,JJ ! [idx] loop counters + +REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3), NMODE_SLT) :: ZMASS3D, & + ZMASS3D_SLT ![kg/m3] mass of one sea salt mode + +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZTEMP, ZREHU, ZREHU_tmp +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3), NMODE_SLT) :: ZDENSITY_WET ! [g/m2] Aerosol wet density (salt + water) +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZSIGMA ! [-] standard deviation +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZRG, ZRG_WET ! [um] number median radius, and nuber median wet radius +! +!------------------------------------------------------------------------------- +! + +!+ Marine +! Calcul de RH +! Pris dans write_lfi_for_diag pour le calcul de RH +ZTEMP(:,:,:) = PTHT(:,:,:) * (PPABST(:,:,:) / XP00)**(XRD/XCPD) + +ZREHU_tmp(:,:,:) = SM_FOES(ZTEMP(:,:,:)) ! SM_FOES = to compute saturation vapor pressure +ZREHU_tmp(:,:,:) = (XMV / XMD) * ZREHU_tmp(:,:,:) / (PPABST(:,:,:) - ZREHU_tmp(:,:,:)) +!XMD,XMV ! Molar mass of dry air and molar mass of vapor, PPABST: pression + +ZREHU(:,:,:) = PRT(:,:,:,1) / ZREHU_tmp(:,:,:) + +IF (CCLOUD(1:3) =='ICE' .OR. CCLOUD =='C3R5') THEN + WHERE ( ZTEMP(:,:,:) < XTT) ! XTT : Triple point temperature + ZREHU_tmp(:,:,:) = EXP( XALPI - XBETAI/ZTEMP(:,:,:) & ! XALPI,XBETAI,XGAMI ! Constants for saturation vapor pressure + - XGAMI*ALOG(ZTEMP(:,:,:)) ) !saturation over ice + ZREHU_tmp(:,:,:) = (XMV / XMD) * ZREHU_tmp(:,:,:) / (PPABST(:,:,:) - ZREHU_tmp(:,:,:)) + ZREHU(:,:,:) = PRT(:,:,:,1) / ZREHU_tmp(:,:,:) + END WHERE +END IF + +ZREHU(:,:,:) = MIN(MAX(ZREHU(:,:,:), 0.02),0.95) + + +! 1.1 initialisation +! +!Calculations here are for one mode only +! +ALLOCATE (NM0(NMODE_SLT)) +ALLOCATE (NM3(NMODE_SLT)) +ALLOCATE (NM6(NMODE_SLT)) +ALLOCATE (ZM(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3), NMODE_SLT*3)) +ALLOCATE (ZMMIN(NMODE_SLT*3)) +ALLOCATE (ZSV(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3), SIZE(PSVT,4))) +ALLOCATE (ZINIRADIUS(NMODE_SLT)) + +ZSV(:,:,:,:) = MAX(PSVT(:,:,:,:), XMNH_TINY) + +DO JN = 1, NMODE_SLT + IMODEIDX = JPSALTORDER(JN) + !Calculations here are for one mode only + IF (CRGUNITS == "MASS") THEN + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) * EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) + ELSE + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) + END IF + + !Set counter for number, M3 and M6 + NM0(JN) = 1 + (JN - 1) * 3 + NM3(JN) = 2 + (JN - 1) * 3 + NM6(JN) = 3 + (JN - 1) * 3 + !Get minimum values possible + ZMMIN(NM0(JN)) = XN0MIN_SLT(IMODEIDX) + ZRGMIN = ZINIRADIUS(JN) + IF (LVARSIG_SLT) THEN + ZSIGMIN = XSIGMIN_SLT + ELSE + ZSIGMIN = XINISIG_SLT(IMODEIDX) + ENDIF + ZMMIN(NM3(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**3)*EXP(4.5 * LOG(ZSIGMIN)**2) + ZMMIN(NM6(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**6)*EXP(18. * LOG(ZSIGMIN)**2) +END DO +! +!Set density of aerosol, here sea salt (kg/m3) and water +ZRHOI = XDENSITY_SALT +ZRHOLW = XRHOLW +!Set molecular weight of sea salt and water!NOTE THAT THIS IS NOW IN KG +ZMI = XMOLARWEIGHT_SALT +ZMV = XMV +! +! +DO JN = 1, NMODE_SLT + ! + IF (LVARSIG_SLT) THEN ! give M6 (case of variable standard deviation) + ! + !Get number concentration (#/molec_{air}==>#/m3) + ZM(:,:,:,NM0(JN))= & + ZSV(:,:,:,1+(JN-1)*3) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * PRHODREF(:,:,:) !==>#/m3 + ! + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,:,:,NM3(JN)) = & + ZSV(:,:,:,2+(JN-1)*3) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + !Limit mass concentration to minimum value + ZM(:,:,:,NM3(JN)) = MAX(ZM(:,:,:,NM3(JN)), ZMMIN(NM3(JN))) + ! + ZM(:,:,:,NM6(JN)) = ZSV(:,:,:,3+(JN-1)*3) & !um6/molec_{air}*(cm3/m3) + * 1.d-6 & !==> um6/molec_{air} + * XAVOGADRO & !==> um6/mole_{air} + / XMD & !==> um6/kg_{air} + * PRHODREF(:,:,:) !==> um6/m3_{air} + !Limit m6 concentration to minimum value + ZM(:,:,:,NM6(JN)) = MAX(ZM(:,:,:,NM6(JN)), ZMMIN(NM6(JN))) + ! + !Get sigma (only if sigma is allowed to vary) + !Get intermediate values for sigma M3^2/(M0*M6) (ORILAM paper, eqn 8) + ZSIGMA(:,:,:)=ZM(:,:,:,NM3(JN))**2/(ZM(:,:,:,NM0(JN))*ZM(:,:,:,NM6(JN))) + !Limit the intermediate value, can not be larger than 1 + ZSIGMA(:,:,:)=MIN(1-1E-10,ZSIGMA(:,:,:)) + !Limit the value for intermediate, can not be smaller than 0 + ZSIGMA(:,:,:)=MAX(1E-10,ZSIGMA(:,:,:)) + !Calculate log(sigma) + ZSIGMA(:,:,:)= LOG(ZSIGMA(:,:,:)) + !Finally get the real sigma the negative sign is because of + !The way the equation is written (M3^2/(M0*M6)) instead of (M0*M6)/M3^3 + ZSIGMA(:,:,:)= EXP(1./3.*SQRT(-ZSIGMA(:,:,:))) + !Limit the value to reasonable ones + ZSIGMA(:,:,:) = MAX( XSIGMIN_SLT, MIN( XSIGMAX_SLT, ZSIGMA(:,:,:) ) ) + + ! + !Put back M6 so that it fits the sigma which is possibly modified above + !The following makes M6 consistent with N, R, SIGMA + ZM(:,:,:,NM6(JN)) = ZM(:,:,:,NM0(JN)) & + * ( (ZM(:,:,:,NM3(JN))/ZM(:,:,:,NM0(JN)))**(1./3.) & + * exp(-(3./2.)*log(ZSIGMA(:,:,:))**2))**6 & + * exp(18.*log(ZSIGMA(:,:,:))**2) + + ELSE ! compute M6 from M0, M3 and SIGMA + ! + ZSIGMA(:,:,:) = XINISIG_SLT(JPSALTORDER(JN)) + IF (LRGFIX_SLT) THEN + + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,:,:,NM3(JN)) = & + ZSV(:,:,:,JN) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + + ZM(:,:,:,NM3(JN)) = MAX(ZM(:,:,:,NM3(JN)), ZMMIN(NM3(JN))) + PSVT(:,:,:,JN) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + + ZM(:,:,:,NM0(JN))= ZM(:,:,:,NM3(JN))/& + ((ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(XINISIG_SLT(JPSALTORDER(JN)))**2)) + + + + ELSE + + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,:,:,NM3(JN)) = & + ZSV(:,:,:,2+(JN-1)*2) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + + + !Get number concentration (#/molec_{air}==>#/m3) + ZM(:,:,:,NM0(JN))= & + ZSV(:,:,:,1+(JN-1)*2) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * PRHODREF(:,:,:) !==>#/m3 + + ! Limit concentration to minimum values + WHERE ((ZM(:,:,:,NM0(JN)) < ZMMIN(NM0(JN)) ).OR. & + (ZM(:,:,:,NM3(JN)) < ZMMIN(NM3(JN)) )) + ZM(:,:,:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,:,:,NM3(JN)) = ZMMIN(NM3(JN)) + PSVT(:,:,:,1+(JN-1)*2) = ZM(:,:,:,NM0(JN)) * XMD / & + (XAVOGADRO * PRHODREF(:,:,:) ) + PSVT(:,:,:,2+(JN-1)*2) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + ENDWHERE + END IF + + ZM(:,:,:,NM6(JN)) = ZM(:,:,:,NM0(JN)) & + * ( (ZM(:,:,:,NM3(JN))/ZM(:,:,:,NM0(JN)))**(1./3.) & + * exp(-(3./2.)*log(ZSIGMA(:,:,:))**2))**6 & + * exp(18.*log(ZSIGMA(:,:,:))**2) + + ! + END IF + ! + !Get number median radius (eqn. 7 in Orilam manuscript) + ZRG(:,:,:)= & + ( & + ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN))*ZM(:,:,:,NM3(JN)) & + /(ZM(:,:,:,NM6(JN))*ZM(:,:,:,NM0(JN))*ZM(:,:,:,NM0(JN))*ZM(:,:,:,NM0(JN))) & + ) & + ** XSIXTH_SALT + + + !ZRG(:,:,:)=MIN(ZRG(:,:,:),ZINIRADIUS(JN)) + !Give the sigma-values to the passed array + IF(PRESENT(PSIG3D)) PSIG3D(:,:,:,JN) = ZSIGMA(:,:,:) + ! + !Set the number concentrations in the passed array + IF(PRESENT(PN3D)) PN3D(:,:,:,JN) = ZM(:,:,:,NM0(JN)) + ! +! !Get the number median radius +! IF(PRESENT(PRG3D)) PRG3D(:,:,:,JN)= ZRG(:,:,:) + ! + ! + !+ Marine +!!!!!!!!!!! Wet radius calculus + +!Test pour Marine + + ZRG_WET(:,:,:) = C1 * (ZRG(:,:,:)*1.d-4)**C2 ! Pour le calcul, ZRG en cm! (d'où 1.d-4) + +!+ Marine test + + ZRG_WET(:,:,:) = ZRG_WET(:,:,:) / (C3 * ((ZRG(:,:,:)*1.d-4)**C4) - LOG10(ZREHU(:,:,:))) + ZRG_WET(:,:,:) = ZRG_WET(:,:,:) + (ZRG(:,:,:)*1.d-4)**3 + ZRG_WET(:,:,:) = ( ZRG_WET(:,:,:)**(1./3) )*1.d4 ! *1.d4 pour repasser de cm à micromètres + + !Get the number median radius + IF(PRESENT(PRG3D)) PRG3D(:,:,:,JN) = ZRG_WET(:,:,:) + + + +! Wet density calcul + ZDENSITY_WET(:,:,:,JN)=(ZRHOI * ZRG(:,:,:) * ZRG(:,:,:) * ZRG(:,:,:) + & + ZRHOLW * (ZRG_WET(:,:,:) * ZRG_WET(:,:,:) * ZRG_WET(:,:,:)- & + ZRG(:,:,:) * ZRG(:,:,:) * ZRG(:,:,:))) & + / (ZRG_WET(:,:,:) * ZRG_WET(:,:,:) * ZRG_WET(:,:,:)) + +!Wet mass + ZMASS3D(:,:,:,JN)= & + ZM(:,:,:,NM0(JN)) & !#/m^3_{air} + * XPI*4./3. & + * ZDENSITY_WET(:,:,:,JN) & !==>kg/m^3_{aeros}/m^3_{air} + * ZRG_WET(:,:,:) * ZRG_WET(:,:,:) * ZRG_WET(:,:,:) & + * XUM3TOM3_SALT & !==>kg/m^3_{air} + * exp(4.5*log(ZSIGMA(:,:,:))*log(ZSIGMA(:,:,:))) + +! Salt Mass + ZMASS3D_SLT(:,:,:,JN)= & + ZM(:,:,:,NM0(JN)) & !#/m^3_{air} + * XPI*4./3. & + * ZRHOI & !==>kg/m^3_{aeros}/m^3_{air} + * ZRG(:,:,:) * ZRG(:,:,:) * ZRG(:,:,:) & + * XUM3TOM3_SALT & !==>kg/m^3_{air} + * exp(4.5*log(ZSIGMA(:,:,:))*log(ZSIGMA(:,:,:))) + + IF(PRESENT(PMASS3D)) THEN + PMASS3D(:,:,:,JN)= ZMASS3D(:,:,:,JN) + ENDIF + + IF(PRESENT(PDENSITY_WET)) THEN + PDENSITY_WET(:,:,:,JN) = ZDENSITY_WET(:,:,:,JN) + ENDIF +! +END DO !Loop on modes +! +IF(PRESENT(PM3D)) PM3D(:,:,:,:) = ZM(:,:,:,:) +! +DEALLOCATE(ZINIRADIUS) +DEALLOCATE(ZSV) +DEALLOCATE(ZMMIN) +DEALLOCATE(ZM) +DEALLOCATE(NM6) +DEALLOCATE(NM3) +DEALLOCATE(NM0) + +!+ Marine + +END SUBROUTINE PPP2SALT_WET + +!! ############################################################ + SUBROUTINE SALT2PPP( & + PSVT & !IO [ppp] input scalar variables (moment of distribution) + , PRHODREF & !I [kg/m3] density of air + , PSIG3D & !I [-] standard deviation of aerosol distribution + , PRG3D & !I [um] number median diameter of aerosol distribution + ) +!! ############################################################ +! +!! +!! PURPOSE +!! ------- +!! Translate the sea salt Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppp +!! +!! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES +!! ------- +!! CALL PPP2AEROS(PSVT, PRHODREF, PSIG3D=SIGVAR, & +!! PRG3D=RVAR, PN3D=NVAR) +!! +!! REFERENCE +!! --------- +!! none +!! +!! AUTHOR +!! ------ +!! Pierre TULET (LA) +!! +!! MODIFICATIONS +!! ------------- +!! Alf Grini (CNRM) +!! +!! EXTERNAL +!! -------- +!! None +!! + IMPLICIT NONE +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.1 declarations of arguments +! + !INPUT + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSIG3D !O [-] standard deviation + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRG3D !O [um] number median diameter + + !OUTPUT + REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !IO [#/molec_{air}] first moment + !IO [molec_{aer}/molec_{air} 3rd moment + !IO [um6/molec_{air}*(cm3/m3)] 6th moment +! +! +!* 0.2 declarations local variables +! + REAL :: ZRHOI ! [kg/m3] density of aerosol + REAL :: ZMI ! [kg/mol] molar weight of aerosol + REAL :: ZRGMIN ! [um] minimum radius accepted + REAL :: ZSIGMIN ! minimum standard deviation accepted + REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZM ! [aerosol units] local array which goes to output later + REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZSIGMA ! aersol standard deviation + REAL,DIMENSION(:), ALLOCATABLE :: ZMMIN ! [aerosol units] minimum values for N, sigma, M + REAL,DIMENSION(:), ALLOCATABLE :: ZINIRADIUS ! initial mean radius + INTEGER,DIMENSION(:), ALLOCATABLE :: NM0 ! [idx] index for Mode 0 in passed variables + INTEGER,DIMENSION(:), ALLOCATABLE :: NM3 ! [idx] indexes for Mode 3 in passed variables + INTEGER,DIMENSION(:), ALLOCATABLE :: NM6 ! [idx] indexes for Mode 6 in passed variables + INTEGER :: JJ, JN ! [idx] loop counters + INTEGER :: IMODEIDX +! +!------------------------------------------------------------------------------- +! +! 1.1 initialisation + + + ALLOCATE (NM0(NMODE_SLT)) + ALLOCATE (NM3(NMODE_SLT)) + ALLOCATE (NM6(NMODE_SLT)) + ALLOCATE (ZINIRADIUS(NMODE_SLT)) + ALLOCATE (ZMMIN(NMODE_SLT*3)) + ALLOCATE (ZM(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3), NMODE_SLT*3)) + ALLOCATE (ZSIGMA(SIZE(PSVT,1), SIZE(PSVT,2), SIZE(PSVT,3))) + + !Set density of aerosol, here sea salt (kg/m3) + ZRHOI = XDENSITY_SALT + !Set molecular weight of sea salt !NOTE THAT THIS IS NOW IN KG + ZMI = XMOLARWEIGHT_SALT +! + + ! PSVT need to be positive +! PSVT(:,:,:,:) = MAX(PSVT(:,:,:,:), XMNH_TINY) + + DO JN=1,NMODE_SLT + IMODEIDX = JPSALTORDER(JN) + !Calculations here are for one mode only + IF (CRGUNITS=="MASS") THEN + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) * EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) + ELSE + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) + END IF + + !Set counter for number, M3 and M6 + NM0(JN) = 1+(JN-1)*3 + NM3(JN) = 2+(JN-1)*3 + NM6(JN) = 3+(JN-1)*3 + + !Get minimum values possible + ZMMIN(NM0(JN)) = XN0MIN_SLT(IMODEIDX) + ZRGMIN = ZINIRADIUS(JN) + IF (LVARSIG_SLT) THEN + ZSIGMIN = XSIGMIN_SLT + ELSE + ZSIGMIN = XINISIG_SLT(IMODEIDX) + ENDIF + ZMMIN(NM3(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**3)*EXP(4.5 * LOG(ZSIGMIN)**2) + ZMMIN(NM6(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**6)*EXP(18. * LOG(ZSIGMIN)**2) + END DO + + !Set density of aerosol, here sea salt (kg/m3) + ZRHOI = XDENSITY_SALT + !Set molecular weight of sea salt !NOTE THAT THIS IS NOW IN KG + ZMI = XMOLARWEIGHT_SALT +! + DO JN=1,NMODE_SLT + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + IF (LVARSIG_SLT) THEN + ZM(:,:,:,NM3(JN)) = & + PSVT(:,:,:,2+(JN-1)*3) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + ELSE + IF ((LRGFIX_SLT)) THEN + ZM(:,:,:,NM3(JN)) = & + PSVT(:,:,:,JN) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + ZM(:,:,:,NM3(JN)) = MAX(ZM(:,:,:,NM3(JN)), ZMMIN(NM3(JN))) + ELSE + ZM(:,:,:,NM3(JN)) = & + PSVT(:,:,:,2+(JN-1)*2) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + END IF + END IF +! calculate moment 0 from dispersion and mean radius + ZM(:,:,:,NM0(JN))= ZM(:,:,:,NM3(JN))/& + ((PRG3D(:,:,:,JN)**3)*EXP(4.5 * LOG(PSIG3D(:,:,:,JN))**2)) + +! calculate moment 6 from dispersion and mean radius + ZM(:,:,:,NM6(JN)) = ZM(:,:,:,NM0(JN)) * (PRG3D(:,:,:,JN)**6) * & + EXP(18 *(LOG(PSIG3D(:,:,:,JN)))**2) + + IF (LVARSIG_SLT) THEN + WHERE ((ZM(:,:,:,NM0(JN)) .LT. ZMMIN(NM0(JN))).OR.& + (ZM(:,:,:,NM3(JN)) .LT. ZMMIN(NM3(JN))).OR.& + (ZM(:,:,:,NM6(JN)) .LT. ZMMIN(NM6(JN)))) + ZM(:,:,:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,:,:,NM3(JN)) = ZMMIN(NM3(JN)) + ZM(:,:,:,NM6(JN)) = ZMMIN(NM6(JN)) + END WHERE + ELSE IF (.NOT.(LRGFIX_SLT)) THEN + + WHERE ((ZM(:,:,:,NM0(JN)) .LT. ZMMIN(NM0(JN))).OR.& + (ZM(:,:,:,NM3(JN)) .LT. ZMMIN(NM3(JN)))) + ZM(:,:,:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,:,:,NM3(JN)) = ZMMIN(NM3(JN)) + END WHERE + ENDIF + + + ! return to concentration #/m3 => (#/molec_{air} + IF (LVARSIG_SLT) THEN + PSVT(:,:,:,1+(JN-1)*3) = ZM(:,:,:,NM0(JN)) * XMD / & + (XAVOGADRO*PRHODREF(:,:,:)) + + PSVT(:,:,:,2+(JN-1)*3) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3 * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + + PSVT(:,:,:,3+(JN-1)*3) = ZM(:,:,:,NM6(JN)) * XMD / & + ( XAVOGADRO*PRHODREF(:,:,:) * 1.d-6) + ELSE IF (LRGFIX_SLT) THEN + PSVT(:,:,:,JN) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + ELSE + PSVT(:,:,:,1+(JN-1)*2) = ZM(:,:,:,NM0(JN)) * XMD / & + (XAVOGADRO*PRHODREF(:,:,:)) + + PSVT(:,:,:,2+(JN-1)*2) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + END IF +! +END DO !Loop on modes + +DEALLOCATE(ZINIRADIUS) +DEALLOCATE(ZMMIN) +DEALLOCATE(ZSIGMA) +DEALLOCATE(ZM) +DEALLOCATE(NM6) +DEALLOCATE(NM3) +DEALLOCATE(NM0) +! +END SUBROUTINE SALT2PPP +! +!! ############################################################ + SUBROUTINE PPP2SALT1D( & + PSVT & !I [ppp] input scalar variables (moment of distribution) + , PRHODREF & !I [kg/m3] density of air + , PSIG1D & !O [-] standard deviation of aerosol distribution + , PRG1D & !O [um] number median diameter of aerosol distribution + , PN1D & !O [#/m3] number concentration of aerosols + , PMASS1D & !O [kg/m3] mass concentration of aerosol + , PM1D & !O aerosols moments 0, 3 and 6 + ) +!! ############################################################ +! +!! +!! PURPOSE +!! ------- +!! Translate the three moments M0, M3 and M6 given in ppp into +!! Values which can be understood more easily (R, sigma, N, M) +!! +!! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES +!! ------- +!! CALL PPP2AEROS(PSVT, PRHODREF, PSIG3D=SIGVAR, & +!! PRG3D=RVAR, PN3D=NVAR, PM3D=MASSVAR) +!! +!! REFERENCE +!! --------- +!! none +!! +!! AUTHOR +!! ------ +!! Pierre TULET (LA) +!! +!! MODIFICATIONS +!! ------------- +!! 2005 Alf Grini (CNRM) +!! 2006 Jean-Pierre Chaboureau (LA) +!! +!! EXTERNAL +!! -------- +!! None +!! + IMPLICIT NONE +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PSVT !I [ppp] first moment +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air + +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PSIG1D !O [-] standard deviation +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PRG1D !O [um] number median diameter +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PN1D !O [#/m3] number concentration +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PMASS1D !O [kg_{aer}/m3] mass concentration +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PM1D !O aerosols moments +! +! +!* 0.2 declarations local variables +! +REAL :: ZRHOI ! [kg/m3] density of aerosol +REAL :: ZMI ! [kg/mol] molar weight of aerosol +REAL :: ZRGMIN ! [um] minimum radius accepted +REAL :: ZSIGMIN ! minimum standard deviation accepted +REAL,DIMENSION(:,:), ALLOCATABLE :: ZM ! [aerosol units] local array which goes to output later +REAL,DIMENSION(:,:), ALLOCATABLE :: ZSV ! [sea salts moment concentration] +REAL,DIMENSION(:), ALLOCATABLE :: ZSIGMA ! [-] standard deviation +REAL,DIMENSION(:), ALLOCATABLE :: ZRG ! [um] number median diameter +REAL,DIMENSION(:), ALLOCATABLE :: ZMMIN ! [aerosol units] minimum values for N, sigma, M +INTEGER,DIMENSION(:), ALLOCATABLE :: NM0 ! [idx] index for Mode 0 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM3 ! [idx] indexes for Mode 3 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM6 ! [idx] indexes for Mode 6 in passed variables +REAL,DIMENSION(:), ALLOCATABLE :: ZINIRADIUS ! initial mean radius +INTEGER :: JN,IMODEIDX,JJ ! [idx] loop counters +! +!------------------------------------------------------------------------------- +! +! 1.1 initialisation +! +!Calculations here are for one mode only +! +ALLOCATE (NM0(NMODE_SLT)) +ALLOCATE (NM3(NMODE_SLT)) +ALLOCATE (NM6(NMODE_SLT)) +ALLOCATE (ZM(SIZE(PSVT,1), NMODE_SLT*3)) +ALLOCATE (ZMMIN(NMODE_SLT*3)) +ALLOCATE (ZSIGMA(SIZE(PSVT,1))) +ALLOCATE (ZRG(SIZE(PSVT,1))) +ALLOCATE (ZSV(SIZE(PSVT,1), SIZE(PSVT,2))) +ALLOCATE (ZINIRADIUS(NMODE_SLT)) + +!ZSV(:,:) = MAX(PSVT(:,:), XMNH_TINY) + +DO JN=1,NMODE_SLT + IMODEIDX = JPSALTORDER(JN) + !Calculations here are for one mode only + IF (CRGUNITS=="MASS") THEN + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) * EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) + ELSE + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) + END IF + + !Set counter for number, M3 and M6 + NM0(JN) = 1+(JN-1)*3 + NM3(JN) = 2+(JN-1)*3 + NM6(JN) = 3+(JN-1)*3 + !Get minimum values possible + ZMMIN(NM0(JN)) = XN0MIN_SLT(IMODEIDX) + ZRGMIN = ZINIRADIUS(JN) + IF (LVARSIG_SLT) THEN + ZSIGMIN = XSIGMIN_SLT + ELSE + ZSIGMIN = XINISIG_SLT(IMODEIDX) + ENDIF + ZMMIN(NM3(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**3)*EXP(4.5 * LOG(ZSIGMIN)**2) + ZMMIN(NM6(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**6)*EXP(18. * LOG(ZSIGMIN)**2) +END DO +! +!Set density of aerosol, here sea salt (kg/m3) +ZRHOI = XDENSITY_SALT +!Set molecular weight of sea salt !NOTE THAT THIS IS NOW IN KG +ZMI = XMOLARWEIGHT_SALT +! +! +DO JN=1,NMODE_SLT + ! + IF (LVARSIG_SLT) THEN ! give M6 (case of variable standard deviation) + ! + !Get number concentration (#/molec_{air}==>#/m3) + ZM(:,NM0(JN))= & + ZSV(:,1+(JN-1)*3) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * PRHODREF(:) !==>#/m3 + ! + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,NM3(JN)) = & + ZSV(:,2+(JN-1)*3) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + !Limit mass concentration to minimum value + ZM(:,NM3(JN)) = MAX(ZM(:,NM3(JN)), ZMMIN(NM3(JN))) + ! + ZM(:,NM6(JN)) = ZSV(:,3+(JN-1)*3) & !um6/molec_{air}*(cm3/m3) + * 1.d-6 & !==> um6/molec_{air} + * XAVOGADRO & !==> um6/mole_{air} + / XMD & !==> um6/kg_{air} + * PRHODREF(:) !==> um6/m3_{air} + !Limit m6 concentration to minimum value + ZM(:,NM6(JN)) = MAX(ZM(:,NM6(JN)), ZMMIN(NM6(JN))) + ! + !Get sigma (only if sigma is allowed to vary) + !Get intermediate values for sigma M3^2/(M0*M6) (ORILAM paper, eqn 8) + ZSIGMA(:)=ZM(:,NM3(JN))**2/(ZM(:,NM0(JN))*ZM(:,NM6(JN))) + !Limit the intermediate value, can not be larger than 1 + ZSIGMA(:)=MIN(1-1E-10,ZSIGMA(:)) + !Limit the value for intermediate, can not be smaller than 0 + ZSIGMA(:)=MAX(1E-10,ZSIGMA(:)) + !Calculate log(sigma) + ZSIGMA(:)= LOG(ZSIGMA(:)) + !Finally get the real sigma the negative sign is because of + !The way the equation is written (M3^2/(M0*M6)) instead of (M0*M6)/M3^3 + ZSIGMA(:)= EXP(1./3.*SQRT(-ZSIGMA(:))) + !Limit the value to reasonable ones + ZSIGMA(:) = MAX( XSIGMIN_SLT, MIN( XSIGMAX_SLT, ZSIGMA(:) ) ) + + ! + !Put back M6 so that it fits the sigma which is possibly modified above + !The following makes M6 consistent with N, R, SIGMA + ZM(:,NM6(JN)) = ZM(:,NM0(JN)) & + * ( (ZM(:,NM3(JN))/ZM(:,NM0(JN)))**(1./3.) & + * exp(-(3./2.)*log(ZSIGMA(:))**2))**6 & + * exp(18.*log(ZSIGMA(:))**2) + + ELSE ! compute M6 from M0, M3 and SIGMA + ! + ZSIGMA(:) = XINISIG_SLT(JPSALTORDER(JN)) + IF (LRGFIX_SLT) THEN + + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,NM3(JN)) = & + ZSV(:,JN) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + ZM(:,NM3(JN)) = MAX(ZM(:,NM3(JN)), ZMMIN(NM3(JN))) + + ZM(:,NM0(JN))= ZM(:,NM3(JN))/& + ((ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(XINISIG_SLT(JPSALTORDER(JN)))**2)) + + ELSE + + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + ZM(:,NM3(JN)) = & + ZSV(:,2+(JN-1)*2) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + + + !Get number concentration (#/molec_{air}==>#/m3) + ZM(:,NM0(JN))= & + ZSV(:,1+(JN-1)*2) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * PRHODREF(:) !==>#/m3 + + ! Limit concentration to minimum values + WHERE ((ZM(:,NM0(JN)) < ZMMIN(NM0(JN)) ).OR. & + (ZM(:,NM3(JN)) < ZMMIN(NM3(JN)) )) + ZM(:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,NM3(JN)) = ZMMIN(NM3(JN)) + PSVT(:,1+(JN-1)*2) = ZM(:,NM0(JN)) * XMD / & + (XAVOGADRO * PRHODREF(:) ) + PSVT(:,2+(JN-1)*2) = ZM(:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:)*XM3TOUM3_SALT) + ENDWHERE + + END IF + + ZM(:,NM6(JN)) = ZM(:,NM0(JN)) & + * ( (ZM(:,NM3(JN))/ZM(:,NM0(JN)))**(1./3.) & + * exp(-(3./2.)*log(ZSIGMA(:))**2))**6 & + * exp(18.*log(ZSIGMA(:))**2) + + ! + END IF + ! + !Get number median radius (eqn. 7 in Orilam manuscript) + ZRG(:)= & + ( & + ZM(:,NM3(JN))*ZM(:,NM3(JN))*ZM(:,NM3(JN))*ZM(:,NM3(JN)) & + /(ZM(:,NM6(JN))*ZM(:,NM0(JN))*ZM(:,NM0(JN))*ZM(:,NM0(JN))) & + ) & + ** XSIXTH_SALT + !ZRG(:)=MIN(ZRG(:),ZINIRADIUS(JN)) + !Give the sigma-values to the passed array + IF(PRESENT(PSIG1D)) PSIG1D(:,JN) = ZSIGMA(:) + ! + !Set the number concentrations in the passed array + IF(PRESENT(PN1D)) PN1D(:,JN) = ZM(:,NM0(JN)) + ! + !Get the number median radius + IF(PRESENT(PRG1D)) PRG1D(:,JN)= ZRG(:) + ! + IF(PRESENT(PMASS1D))THEN + PMASS1D(:,JN)= & + ZM(:,NM0(JN)) & !#/m^3_{air} + * XPI*4./3. & + * ZRHOI & !==>kg/m^3_{aeros}/m^3_{air} + * ZRG(:) * ZRG(:) * ZRG(:) & + * XUM3TOM3_SALT & !==>kg/m^3_{air} + * exp(4.5*log(ZSIGMA(:))*log(ZSIGMA(:))) + ENDIF +! +END DO !Loop on modes +! +IF(PRESENT(PM1D)) PM1D(:,:) = ZM(:,:) +! +DEALLOCATE(ZINIRADIUS) +DEALLOCATE(ZSV) +DEALLOCATE(ZRG) +DEALLOCATE(ZSIGMA) +DEALLOCATE(ZMMIN) +DEALLOCATE(ZM) +DEALLOCATE(NM6) +DEALLOCATE(NM3) +DEALLOCATE(NM0) +! +END SUBROUTINE PPP2SALT1D + +!! ############################################################ +END MODULE MODE_SALT_PSD_WET diff --git a/src/MNH/mode_saltopt.f90 b/src/MNH/mode_saltopt.f90 index ac1b4099d92e0dd752a1e5460a39f8ba41587e0d..d7fd28f3f1912d0a897de0aa93aebc050b6a761a 100644 --- a/src/MNH/mode_saltopt.f90 +++ b/src/MNH/mode_saltopt.f90 @@ -14,8 +14,11 @@ !! PURPOSE !! ------- !! +!! MODIFICATIONS +!! ------------- !! - +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! IMPLICIT NONE PUBLIC PRIVATE :: SALTOPT_LKT @@ -27,6 +30,9 @@ CONTAINS PSVT & !I [moments/molec_{air}] Transported moments of sea salts ,PZZ & !I [m] height of layers ,PRHODREF & !I [kg/m3] density of air + ,PTHT & + ,PPABST & + ,PRT & ,PPIZA_WVL & !O [-] single scattering albedo of sea salt layer for all SW wavelengths ,PCGA_WVL & !O [-] assymetry factor for sea salt layer for all SW wavelengths ,PTAUREL_WVL & !O [-] opt.depth/opt.depth(550) for sea salt layer for all SW wvl @@ -35,14 +41,18 @@ CONTAINS ) - USE MODE_SALT_PSD !Conversion procedures from moments to radius, ,number, mass and sigma + USE MODE_SALT_PSD_WET !Conversion procedures from moments to radius, ,number, mass and sigma + USE MODE_SALT_PSD USE MODD_SALT, ONLY : NMODE_SLT + IMPLICIT NONE !INPUT REAL, DIMENSION(:,:,:,:),INTENT(IN) :: PSVT !I [moments/molec_{air}] transported moments of sea salt REAL, DIMENSION(:,:,:),INTENT(IN) :: PZZ !I [m] height of layers REAL, DIMENSION(:,:,:),INTENT(IN) :: PRHODREF !I [kg/m3] density of air + REAL, DIMENSION(:,:,:),INTENT(IN) :: PTHT, PPABST !I + REAL, DIMENSION(:,:,:,:),INTENT(IN) :: PRT INTEGER, INTENT(IN) :: KSWB !I [nbr] number of shortwave wavelengths REAL, PARAMETER :: EPSILON=1.e-8 !a very low number for optical depth in a layer @@ -57,6 +67,7 @@ CONTAINS REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NMODE_SLT) :: ZMASS ![kg/m3] mass of one sea salt mode REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NMODE_SLT) :: ZRADIUS ![um] number median radius of one sea salt mode REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NMODE_SLT) :: ZSIGMA ![-] dispersion coefficient one sea salt mode + REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NMODE_SLT) :: ZDENSITY ![-] [g/m2] density of wet aerosol (water + sea salt) REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: ZTAU550_MDE ![-] opt.depth 550nm one mode REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: ZTAU_WVL_MDE ![-] opt.depth @ wvl, one mode REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: ZPIZA_WVL_MDE ![-] single scattering albedo @ wvl, one mode @@ -70,15 +81,26 @@ CONTAINS ALLOCATE(ZCGA_WVL_MDE(SIZE(PTAU550,1),SIZE(PTAU550,2),SIZE(PTAU550,3),KSWB,NMODE_SLT)) ZSVT(:,:,:,:)=PSVT(:,:,:,:) - - CALL PPP2SALT( & + CALL PPP2SALT_WET( & ZSVT & !I [moments/molec_{air}] moments of sea salt for all modes ,PRHODREF & !I [kg/m3] air density + ,PPABST & !I Pression + ,PTHT & !I Potential temperature + ,PRT & !I Large scale vapor mixing ratio ,PSIG3D=ZSIGMA & !O [-] dispersion coefficient ,PRG3D=ZRADIUS & !O [um] number median radius ,PMASS3D=ZMASS & !O [kg/m3] mass of sea salt + ,PDENSITY_WET=ZDENSITY & !0 [g/m2] density of wet aerosol (water + salt) ) - + +! CALL PPP2SALT( & +! ZSVT & !I [moments/molec_{air}] moments of sea salt for all modes +! ,PRHODREF & !I [kg/m3] air density +! ,PSIG3D=ZSIGMA & !O [-] dispersion coefficient +! ,PRG3D=ZRADIUS & !O [um] number median radius +! ,PMASS3D=ZMASS & !O [kg/m3] mass of sea salt +! ) + DO JMDE=1,NMODE_SLT !Get sea salt optical properties from look up tables CALL SALTOPT_LKT( & diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index a903c134fac224153fbdb1462f1b5942baefb0fa..8731123547563e0128956764c67786a1da8cde16 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 92fa8499839e57ba36cd792c698c10913e1fc6f1..0b7e674471ace04ac31394ff115436386cd9c2c8 100644 --- a/src/MNH/modn_salt.f90 +++ b/src/MNH/modn_salt.f90 @@ -25,6 +25,7 @@ !! MODIFICATIONS !! ------------- !! Original 24/02/05 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -38,6 +39,6 @@ IMPLICIT NONE ! NAMELIST /NAM_SALT/ LSALT, CRGUNITS, LVARSIG_SLT,LSEDIMSALT,XN0MIN_SLT, XINIRADIUS_SLT, & XINISIG_SLT, XSIGMIN_SLT, XSIGMAX_SLT, XCOEFRADMAX_SLT, XCOEFRADMIN_SLT, & - NMODE_SLT, LRGFIX_SLT, LDEPOS_SLT + NMODE_SLT, LRGFIX_SLT, LDEPOS_SLT, LONLY ! END MODULE MODN_SALT diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90 index a11651b58556f0605edf0f6d6f4e4a325ad29826..b4ea670d87dd6107b79e2bcc5a5a95fc73aacdb3 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 2bec821d736e9e3a9ff5ff6a75182ab7f12edfd9..807b5e1c604aeac9724ff37c7bda41f30de547bf 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 8f4e4835a34e939884aa517bc353b000a844383b..ade924eadf78caaefc6d50429522bb2b4882e267 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 e8f0e9d738b2c9c6fe179715410d8ec5850e9f33..83d45636d8ac4bef7534dd6e1ddab45f402761ed 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 cba6d68cd76965ba93841e36c1390241bb450540..15878a3b6dac327f77cab71ab0175b47369089bc 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 bff76dfe979c1d70196c4698031c2fa097ef0aee..bc40e889136a14db3727ae76c2c90da0e3572948 100644 --- a/src/MNH/salt_filter.f90 +++ b/src/MNH/salt_filter.f90 @@ -45,19 +45,8 @@ END MODULE MODI_SALT_FILTER !! MODIFICATIONS !! ------------- !! Original +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! -! Entry variables: -! -! PRSVS(INOUT) -Array of moments included in PRSVS -! -!************************************************************* -! Exit variables: -! -!************************************************************* -! Variables used during the deposition velocity calculation -! -! ZVGK -Polydisperse settling velocity of the kth moment (m/s) -!************************************************************ !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -66,10 +55,12 @@ END MODULE MODI_SALT_FILTER ! IMPLICIT ARGUMENTS ! USE MODD_SALT -USE MODD_CSTS_SALT -! USE MODE_SALT_PSD -USE MODD_CST, ONLY : XMNH_TINY + +!+ Marine +USE MODI_INIT_SALT +!- Marine + ! IMPLICIT NONE ! @@ -78,27 +69,156 @@ IMPLICIT NONE REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSV REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! -!* 0.2 Declarations of local variables : -! -INTEGER :: JN -INTEGER :: IMODEIDX -REAL, DIMENSION(NMODE_SLT*3) :: ZPMIN -REAL, DIMENSION(NMODE_SLT) :: ZINIRADIUS -REAL, DIMENSION(SIZE(PSV,1), SIZE(PSV,2), SIZE(PSV,3), NMODE_SLT*3) :: ZM ! [aerosol units] local array which goes to output later - -REAL :: ZRGMIN, ZSIGMIN -REAL :: ZRHOP, ZMI -INTEGER,DIMENSION(NMODE_SLT) :: NM0, NM3, NM6 -! -!* 0.3 initialize constant -! -ZRHOP = XDENSITY_SALT -ZMI = XMOLARWEIGHT_SALT ! molecular mass in kg/mol -! +!* 0.2 declarations local variables +! +REAL :: ZRHOI ! [kg/m3] density of aerosol +REAL :: ZMI ! [kg/mol] molar weight of aerosol +REAL :: ZRGMIN ! [um] minimum radius accepted +REAL :: ZSIGMIN ! minimum standard deviation accepted +REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZM ! [aerosol units] local array which goes to output later +REAL,DIMENSION(:), ALLOCATABLE :: ZMMIN ! [aerosol units] minimum values for N, sigma, M +INTEGER,DIMENSION(:), ALLOCATABLE :: NM0 ! [idx] index for Mode 0 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM3 ! [idx] indexes for Mode 3 in passed variables +INTEGER,DIMENSION(:), ALLOCATABLE :: NM6 ! [idx] indexes for Mode 6 in passed variables +REAL,DIMENSION(:), ALLOCATABLE :: ZINIRADIUS ! initial mean radius +REAL,DIMENSION(:), ALLOCATABLE :: ZINISIGMA ! initial standard deviation +INTEGER :: JN,IMODEIDX,JJ ! [idx] loop counters + !------------------------------------------------------------------------------- +!+ Marine +CALL INIT_SALT +!- Marine + + +ALLOCATE (NM0(NMODE_SLT)) +ALLOCATE (NM3(NMODE_SLT)) +ALLOCATE (NM6(NMODE_SLT)) +ALLOCATE (ZM(SIZE(PSV,1), SIZE(PSV,2), SIZE(PSV,3), NMODE_SLT*3)) +ALLOCATE (ZMMIN(NMODE_SLT*3)) +ALLOCATE (ZINIRADIUS(NMODE_SLT)) +ALLOCATE (ZINISIGMA(NMODE_SLT)) + +PSV(:,:,:,:) = MAX(PSV(:,:,:,:), XMNH_TINY) + +DO JN=1,NMODE_SLT + IMODEIDX = JPSALTORDER(JN) + !Calculations here are for one mode only + ZINISIGMA(JN) = XINISIG_SLT(IMODEIDX) + IF (CRGUNITS=="MASS") THEN + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) * EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) + ELSE + ZINIRADIUS(JN) = XINIRADIUS_SLT(IMODEIDX) + END IF + + !Set counter for number, M3 and M6 + NM0(JN) = 1+(JN-1)*3 + NM3(JN) = 2+(JN-1)*3 + NM6(JN) = 3+(JN-1)*3 + !Get minimum values possible + ZMMIN(NM0(JN)) = XN0MIN_SLT(IMODEIDX) + ZRGMIN = ZINIRADIUS(JN) + IF (LVARSIG_SLT) THEN + ZSIGMIN = XSIGMIN_SLT + ELSE + ZSIGMIN = XINISIG_SLT(IMODEIDX) + ENDIF + ZMMIN(NM3(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**3)*EXP(4.5 * LOG(ZSIGMIN)**2) + ZMMIN(NM6(JN)) = ZMMIN(NM0(JN)) * (ZRGMIN**6)*EXP(18. * LOG(ZSIGMIN)**2) +END DO +! +!Set density of aerosol, here dust (kg/m3) +ZRHOI = XDENSITY_SALT +!Set molecular weight of dust !NOTE THAT THIS IS NOW IN KG +ZMI = XMOLARWEIGHT_SALT +! +DO JN=1,NMODE_SLT + !calculate moment 3 from total aerosol mass (molec_{aer}/molec_{air} ==> + IF (LVARSIG_SLT) THEN + ZM(:,:,:,NM3(JN)) = & + PSV(:,:,:,2+(JN-1)*3) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + ELSE + IF ((LRGFIX_SLT)) THEN + ZM(:,:,:,NM3(JN)) = & + PSV(:,:,:,JN) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + ELSE + ZM(:,:,:,NM3(JN)) = & + PSV(:,:,:,2+(JN-1)*2) & !molec_{aer}/molec_{aer} + * (ZMI/XMD) & !==>kg_{aer}/kg_{aer} + * PRHODREF(:,:,:) & !==>kg_{aer}/m3_{air} + * (1.d0/ZRHOI) & !==>m3_{aer}/m3_{air} + * XM3TOUM3_SALT & !==>um3_{aer}/m3_{air} + / (XPI * 4./3.) !==>um3_{aer}/m3_{air} (volume ==> 3rd moment) + END IF + END IF + +! calculate moment 0 from dispersion and mean radius + ZM(:,:,:,NM0(JN))= ZM(:,:,:,NM3(JN))/& + ((ZINIRADIUS(JN)**3)*EXP(4.5 * LOG(ZINISIGMA(JN))**2)) + + +! calculate moment 6 from dispersion and mean radius + ZM(:,:,:,NM6(JN)) = ZM(:,:,:,NM0(JN)) * (ZINIRADIUS(JN)**6) * & + EXP(18 *(LOG(ZINISIGMA(JN)))**2) + + IF (LVARSIG_SLT) THEN + WHERE ((ZM(:,:,:,NM0(JN)) .LT. ZMMIN(NM0(JN))).OR.& + (ZM(:,:,:,NM3(JN)) .LT. ZMMIN(NM3(JN))).OR.& + (ZM(:,:,:,NM6(JN)) .LT. ZMMIN(NM6(JN)))) + ZM(:,:,:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,:,:,NM3(JN)) = ZMMIN(NM3(JN)) + ZM(:,:,:,NM6(JN)) = ZMMIN(NM6(JN)) + END WHERE + + ELSE IF (.NOT.(LRGFIX_SLT)) THEN + + WHERE ((ZM(:,:,:,NM0(JN)) .LT. ZMMIN(NM0(JN))).OR.& + (ZM(:,:,:,NM3(JN)) .LT. ZMMIN(NM3(JN)))) + ZM(:,:,:,NM0(JN)) = ZMMIN(NM0(JN)) + ZM(:,:,:,NM3(JN)) = ZMMIN(NM3(JN)) + END WHERE + ENDIF + + ! return to concentration #/m3 => (#/molec_{air} + IF (LVARSIG_SLT) THEN + PSV(:,:,:,1+(JN-1)*3) = ZM(:,:,:,NM0(JN)) * XMD / & + (XAVOGADRO*PRHODREF(:,:,:)) + + PSV(:,:,:,2+(JN-1)*3) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3 * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + + PSV(:,:,:,3+(JN-1)*3) = ZM(:,:,:,NM6(JN)) * XMD / & + ( XAVOGADRO*PRHODREF(:,:,:) * 1.d-6) + ELSE IF (LRGFIX_SLT) THEN + PSV(:,:,:,JN) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + ELSE + PSV(:,:,:,1+(JN-1)*2) = ZM(:,:,:,NM0(JN)) * XMD / & + (XAVOGADRO*PRHODREF(:,:,:)) + + PSV(:,:,:,2+(JN-1)*2) = ZM(:,:,:,NM3(JN)) * XMD * XPI * 4./3. * ZRHOI / & + (ZMI*PRHODREF(:,:,:)*XM3TOUM3_SALT) + END IF ! -PSV(:,:,:,:) = MAX(PSV(:,:,:,:), XMNH_TINY) -! +END DO !Loop on modes + +DEALLOCATE(ZINIRADIUS) +DEALLOCATE(ZMMIN) +DEALLOCATE(ZINISIGMA) +DEALLOCATE(ZM) +DEALLOCATE(NM6) +DEALLOCATE(NM3) +DEALLOCATE(NM0) + END SUBROUTINE SALT_FILTER diff --git a/src/MNH/saltlfin.f90 b/src/MNH/saltlfin.f90 index c3a2650b09b25c8d0c1e9b9d87396867f464e2f3..3b637b2785bdb83d2d1002ef60ffa646c4963729 100644 --- a/src/MNH/saltlfin.f90 +++ b/src/MNH/saltlfin.f90 @@ -14,10 +14,14 @@ ! INTERFACE ! -SUBROUTINE SALTLFI_n(PSV, PRHODREF) +!++cb++24/10/16 +!SUBROUTINE SALTLFI_n(PSV, PRHODREF) +SUBROUTINE SALTLFI_n(PSV, PRHODREF, PZZ) IMPLICIT NONE -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSV -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSV +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ + END SUBROUTINE SALTLFI_n ! END INTERFACE @@ -26,7 +30,8 @@ END MODULE MODI_SALTLFI_n ! ! ! ############################################################ - SUBROUTINE SALTLFI_n(PSV, PRHODREF) +! SUBROUTINE SALTLFI_n(PSV, PRHODREF) + SUBROUTINE SALTLFI_n(PSV, PRHODREF, PZZ) ! ############################################################ ! !! PURPOSE @@ -43,9 +48,9 @@ END MODULE MODI_SALTLFI_n !! !! MODIFICATIONS !! ------------- -!! none -!! !! 2014 P.Tulet modif calcul ZM +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes + !! EXTERNAL !! -------- !! None @@ -57,7 +62,9 @@ END MODULE MODI_SALTLFI_n ! USE MODD_SALT USE MODD_NSV -USE MODD_GRID_n, ONLY: XZZ +!++cb++24/10/16 +!USE MODD_GRID_n, ONLY: XZZ +!--cb-- USE MODD_CSTS_SALT USE MODD_CST, ONLY : & XPI & !Definition of pi @@ -75,6 +82,7 @@ IMPLICIT NONE ! REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSV REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! ! !* 0.2 declarations local variables @@ -88,6 +96,9 @@ REAL,DIMENSION(:), ALLOCATABLE :: ZMMIN REAL,DIMENSION(:), ALLOCATABLE :: ZINIRADIUS, ZINISIGMA REAL,DIMENSION(:,:), ALLOCATABLE :: ZSEA INTEGER :: IKU +!+Marine +INTEGER :: IMOMENTS +!-Marine INTEGER :: JI, JJ, JN, JK ! loop counter INTEGER :: IMODEIDX ! index mode REAL, PARAMETER :: ZN_SALT=0.1 ! particles of sea salt/cm3 {air} @@ -102,6 +113,7 @@ REAL :: ZN_SALTN ! 1.1 initialisation ! IKU=SIZE(PSV,3) +!+ Marine ! ALLOCATE (IM0(NMODE_SLT)) ALLOCATE (IM3(NMODE_SLT)) @@ -115,11 +127,20 @@ ALLOCATE (ZMMIN(NMODE_SLT*3)) ALLOCATE (ZSEA(SIZE(PSV,1), SIZE(PSV,2))) ZSEA(:,:) = 0. -WHERE ((XZZ(:,:,1) .LT. 0.1).AND.(XZZ(:,:,1) .GE. 0.)) +!++cb++20/10/16 +!WHERE ((XZZ(:,:,1) .LT. 0.1).AND.(XZZ(:,:,1) .GE. 0.)) +! ZSEA(:,:) = 1. +!END WHERE +!++cb++24/10/16 +!WHERE (XZZ(:,:,1) .LE. 0.01) +WHERE (PZZ(:,:,1) .LE. 0.01) +!--cb-- ZSEA(:,:) = 1. END WHERE +!--cb-- ! ! +!+ Marine DO JN = 1, NMODE_SLT IM0(JN) = 1+(JN-1)*3 IM3(JN) = 2+(JN-1)*3 @@ -146,8 +167,8 @@ DO JN = 1, NMODE_SLT ENDDO ! ! -ZRHOI = XDENSITY_SALT !1.8e3 !++changed alfgr -!ZMI = XMOLARWEIGHT_SALT*1.D3 !100. !++changed alfgr +!XDENSITY_SALT est fix� dans modd_csts_salt.f90 +ZRHOI = XDENSITY_SALT ZMI = XMOLARWEIGHT_SALT ZDEN2MOL = 1E-6 * XAVOGADRO / XMD ZFAC=(4./3.)*XPI*ZRHOI*1.e-9 @@ -158,18 +179,49 @@ DO JN=1,NMODE_SLT !* 1.1 calculate moment 0 from sea salt number by m3 ! ! initial vertical profil of sea salt and convert in #/m3 - IF (JN == 1) ZN_SALTN = 1E-4 * ZN_SALT *1E6 - IF (JN == 2) ZN_SALTN = 1. * ZN_SALT *1E6 - IF (JN == 3) ZN_SALTN = 10 * ZN_SALT *1E6 - DO JK=1, SIZE(XZZ,3) - DO JJ=1, SIZE(XZZ,2) - DO JI=1, SIZE(XZZ,1) - IF (XZZ(JI,JJ,JK) .LT. 600.) THEN - ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN - ELSE IF ((XZZ(JI,JJ,JK) .GE. 600.).AND.(XZZ(JI,JJ,JK) .LT. 1000.)) THEN - ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN - ZN_SALTN*(1.-1E-3)*(XZZ(JI,JJ,JK)-600.) / 400. - ELSE IF (XZZ(JI,JJ,JK) .GE. 1000.) THEN - ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN *1E-3 +!+Marine : (reprendre XN0MIN_SLT de modd_salt.f90). +! Pas plus simple de fixer une dimension � ZN_SALT qui d�pend de JN pour ne pas +! avoir � rappeler le sch�ma d'�mission? + + IF(NMODE_SLT == 5)THEN + + + IF (JN == 1) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 2) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 3) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 4) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 5) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + + ELSE +! IF (JN == 1) ZN_SALTN = 1E-4 * ZN_SALT *1E6 +! IF (JN == 2) ZN_SALTN = 1. * ZN_SALT *1E6 +! IF (JN == 3) ZN_SALTN = 10 * ZN_SALT *1E6 + + IF (JN == 1) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 2) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + IF (JN == 3) ZN_SALTN = XN0MIN_SLT(JPSALTORDER(JN)) * ZN_SALT *1E6 + + END IF + + +!-Marine + + DO JK=1, SIZE(PSV,3) + DO JJ=1, SIZE(PSV,2) + DO JI=1, SIZE(PSV,1) +!++cb++24/10/16 +! IF (XZZ(JI,JJ,JK) .LT. 600.) THEN + IF (PZZ(JI,JJ,JK) .LT. 600.) THEN + ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN +! ELSE IF ((XZZ(JI,JJ,JK) .GE. 600.).AND.(XZZ(JI,JJ,JK) .LT. 1000.)) THEN + ELSE IF ((PZZ(JI,JJ,JK) .GE. 600.).AND.(PZZ(JI,JJ,JK) .LT. 1000.)) THEN +! ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN - ZN_SALTN*(1.-1E-3)*(XZZ(JI,JJ,JK)-600.) / 400. + ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN - & + ZN_SALTN * (1.-1E-3) * (PZZ(JI,JJ,JK)-600.) / 400. +! ELSE IF (XZZ(JI,JJ,JK) .GE. 1000.) THEN + ELSE IF (PZZ(JI,JJ,JK) .GE. 1000.) THEN + ZM(JI,JJ,JK,IM0(JN)) = ZN_SALTN * 1E-3 +!--cb-- END IF END DO END DO @@ -179,7 +231,7 @@ DO JN=1,NMODE_SLT END WHERE WHERE ((ZSEA(:,:) .GT. 0.).AND.(ZSEA(:,:) .LT. 1.)) ZM(:,:,JK,IM0(JN)) = ZM(:,:,JK,IM0(JN))-(ZM(:,:,JK,IM0(JN)) -ZN_SALTN *1E-3) * & - (1. - ZSEA(:,:)) + (1. - ZSEA(:,:)) END WHERE END DO @@ -198,12 +250,31 @@ DO JN=1,NMODE_SLT ZM(:,:,:,IM6(JN)) = MAX(ZMMIN(IM6(JN)), ZM(:,:,:,IM6(JN))) ! !* 1.4 output concentration +!+ Marine +! PSV(:,:,:,1+(JN-1)*3) = ZM(:,:,:,IM0(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)) +! PSV(:,:,:,2+(JN-1)*3) = ZM(:,:,:,IM3(JN)) * XMD*XPI * 4./3. / & +! (ZMI*PRHODREF(:,:,:)*(1.d0/ZRHOI)*XM3TOUM3_SALT) +! +! PSV(:,:,:,3+(JN-1)*3) = ZM(:,:,:,IM6(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)*1.d-6) ! - PSV(:,:,:,1+(JN-1)*3) = ZM(:,:,:,IM0(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)) - PSV(:,:,:,2+(JN-1)*3) = ZM(:,:,:,IM3(JN)) * XMD*XPI * 4./3. / & - (ZMI*PRHODREF(:,:,:)*(1.d0/ZRHOI)*XM3TOUM3_SALT) +!++cb++20/10/16 + IMOMENTS = INT(NSV_SLTEND - NSV_SLTBEG + 1) / NMODE_SLT +!--cb-- - PSV(:,:,:,3+(JN-1)*3) = ZM(:,:,:,IM6(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)*1.d-6) + IF (IMOMENTS == 3) THEN + PSV(:,:,:,1+(JN-1)*3) = ZM(:,:,:,IM0(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)) + PSV(:,:,:,2+(JN-1)*3) = ZM(:,:,:,IM3(JN)) * XMD*XPI * 4./3. / & + (ZMI*PRHODREF(:,:,:)*(1.d0/ZRHOI)*XM3TOUM3_SALT) + + PSV(:,:,:,3+(JN-1)*3) = ZM(:,:,:,IM6(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)*1.d-6) + ELSE IF (IMOMENTS == 2) THEN + PSV(:,:,:,1+(JN-1)*2) = ZM(:,:,:,IM0(JN)) * XMD / (XAVOGADRO*PRHODREF(:,:,:)) + PSV(:,:,:,2+(JN-1)*2) = ZM(:,:,:,IM3(JN)) * XMD*XPI * 4./3. / & + (ZMI*PRHODREF(:,:,:)*(1.d0/ZRHOI)*XM3TOUM3_SALT) + ELSE + PSV(:,:,:,JN) = ZM(:,:,:,IM3(JN)) * XMD*XPI * 4./3. / & + (ZMI*PRHODREF(:,:,:)*(1.d0/ZRHOI)*XM3TOUM3_SALT) + END IF ! END DO ! diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90 index b083a03d68516e936982ae973153c0c63e69351b..b49d86cc6228e7e64050ebcda9de4a23c9c2b0b9 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 74f43ed3e08b907f5d8a4b778f63f4b72249cd79..b7e8c6605ae79c2e98d1c62506da7c0351dbe6a2 100644 --- a/src/MNH/spawn_lsn.f90 +++ b/src/MNH/spawn_lsn.f90 @@ -21,9 +21,9 @@ INTERFACE HLBCX,HLBCY,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2, & PCOEFLIN_LBXM, & PLSTHM,PLSRVM, & - PLSUM,PLSVM,PLSWM, & + PLSUM,PLSVM,PLSWM,PLSZWSM, & PLSTHS,PLSRVS, & - PLSUS,PLSVS,PLSWS ) + PLSUS,PLSVS,PLSWS,PLSZWSS ) ! INTEGER, INTENT(IN) :: KDAD ! number of the DAD model REAL, INTENT(IN) :: PTSTEP ! Time step @@ -48,8 +48,11 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEFLIN_LBXM ! coefficient used for ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSTHM,PLSRVM ! Large Scale fields at t-dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUM,PLSVM,PLSWM ! Large Scale fields at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSM ! Large Scale fields at t-dt + REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHS,PLSRVS ! Large Scale source terms REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUS,PLSVS,PLSWS ! Large Scale source terms +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSS ! END SUBROUTINE SPAWN_LS_n ! @@ -65,10 +68,10 @@ END MODULE MODI_SPAWN_LS_n KDXRATIO,KDYRATIO, & HLBCX,HLBCY,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2, & PCOEFLIN_LBXM, & - PLSTHM,PLSRVM, & + PLSTHM,PLSRVM,PLSZWSM, & PLSUM,PLSVM,PLSWM, & PLSTHS,PLSRVS, & - PLSUS,PLSVS,PLSWS ) + PLSUS,PLSVS,PLSWS,PLSZWSS ) ! ################################################################ ! !!**** *SPAWN_LS_n* - Refresh of the Large Scale sources @@ -125,7 +128,7 @@ END MODULE MODI_SPAWN_LS_n !! Original 22/12/97 !! P. Jabouille 19/04/00 parallelisation !! J.Escobar : 18/12/2015 : Correction of bug in bound in // for NHALO <>1 -!! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -174,8 +177,10 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEFLIN_LBXM ! coefficient used for ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSTHM,PLSRVM ! Large Scale fields at t-dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUM,PLSVM,PLSWM ! Large Scale fields at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSM ! Large Scale fields at t-dt REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHS,PLSRVS ! Large Scale source terms REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUS,PLSVS,PLSWS ! Large Scale source terms +REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSS ! ! !* 0.2 declarations of local variables @@ -202,8 +207,10 @@ TYPE(LIST_ll), POINTER :: TZLSFIELD_ll ! list of metric coefficient fields INTEGER :: IINFO_ll, IDIMX, IDIMY REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTLSUM, ZTLSVM, ZTLSWM, ZTLSTHM, ZTLSRVM REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTZS,ZZS +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTZWS REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTZSMT,ZZSMT REAL, DIMENSION(:,:,:), ALLOCATABLE :: Z1,Z2,Z3,Z4,Z5 +REAL, DIMENSION(:,:), ALLOCATABLE :: Z6 ! !------------------------------------------------------------------------------- ! @@ -235,6 +242,7 @@ ALLOCATE(ZTLSVM(IDIMX,IDIMY,SIZE(PLSVM,3))) ALLOCATE(ZTLSWM(IDIMX,IDIMY,SIZE(PLSWM,3))) ALLOCATE(ZTLSTHM(IDIMX,IDIMY,SIZE(PLSTHM,3))) ALLOCATE(ZTLSRVM(IDIMX,IDIMY,SIZE(PLSRVM,3))) +ALLOCATE(ZTZWS(IDIMX,IDIMY)) ! IF(GVERT_INTERP) THEN ALLOCATE(ZTZS (IDIMX,IDIMY,1)) @@ -250,6 +258,7 @@ ALLOCATE(Z2(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3))) ALLOCATE(Z3(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3))) ALLOCATE(Z4(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3))) ALLOCATE(Z5(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3))) +ALLOCATE(Z6(SIZE(XLSUM,1),SIZE(XLSUM,2))) ! Z1=XLSUM+XLSUS*ZTIME CALL SET_LSFIELD_1WAY_ll(Z1, ZTLSUM, KMI) @@ -263,6 +272,10 @@ IF ( SIZE(PLSRVM,1) /= 0 ) THEN Z5=XLSRVM+XLSRVS*ZTIME CALL SET_LSFIELD_1WAY_ll(Z5, ZTLSRVM, KMI) ENDIF +IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + Z6=XLSZWSM+XLSZWSS*ZTIME + CALL SET_LSFIELD_1WAY_ll(Z6, ZTZWS, KMI) +ENDIF ! IF ( GVERT_INTERP ) THEN CALL SET_LSFIELD_1WAY_ll(ZZS, ZTZS, KMI) @@ -273,7 +286,7 @@ ENDIF ! CALL LS_FORCING_ll(KMI, IINFO_ll) ! -DEALLOCATE(Z1,Z2,Z3,Z4,Z5) +DEALLOCATE(Z1,Z2,Z3,Z4,Z5,Z6) ! ! 1.5 Back to the (current) child model ! @@ -355,6 +368,12 @@ IF ( SIZE(PLSRVM,1) /= 0 ) THEN 2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1, & HLBCX,HLBCY,ZTLSRVM,PLSRVS(IIB:IIE,IJB:IJE,:)) END IF +IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + CALL BIKHARDT (PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4, & + PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4, & + 2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1, & + HLBCX,HLBCY,ZTZWS,PLSZWSS(IIB:IIE,IJB:IJE)) +END IF ! !* 3.2 Vertical linear interpolation on the mass grid ! @@ -384,6 +403,9 @@ PLSTHS(:,:,:) = (PLSTHS(:,:,:) - PLSTHM(:,:,:)) / ZTIME IF ( SIZE(PLSRVM,1) /= 0 ) THEN PLSRVS(:,:,:) = (PLSRVS(:,:,:) - PLSRVM(:,:,:)) / ZTIME END IF +IF ( SIZE(PLSZWSM,1) /= 0 ) THEN + PLSZWSS(:,:) = (PLSZWSS(:,:) - PLSZWSM(:,:)) / ZTIME +END IF ! !------------------------------------------------------------------------------ ! @@ -454,6 +476,7 @@ PLSVS(:,:,:) = (PLSVS(:,:,:) - PLSVM(:,:,:)) / ZTIME ! DEALLOCATE(ZTLSUM,ZTLSVM,ZTLSWM,ZTLSTHM,ZTLSRVM) IF(GVERT_INTERP) DEALLOCATE(ZTZS,ZZS) +DEALLOCATE(ZTLSUM,ZTLSVM,ZTLSWM,ZTLSTHM,ZTLSRVM,ZTZWS) IF(GVERT_INTERP) DEALLOCATE(ZTZSMT,ZZSMT) ! NULLIFY(TZLSFIELD_ll) @@ -462,6 +485,7 @@ CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSVS) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSWS) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSTHS) IF(SIZE(PLSRVM) /= 0) CALL ADD3DFIELD_ll(TZLSFIELD_ll, PLSRVS) +IF(SIZE(PLSZWSM) /= 0) CALL ADD2DFIELD_ll(TZLSFIELD_ll, PLSZWSS) CALL UPDATE_HALO_ll(TZLSFIELD_ll,IINFO_ll) CALL CLEANLIST_ll(TZLSFIELD_ll) !------------------------------------------------------------------------------ diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90 index d920dbc0cf86068f1382448fc4e0a07c59680955..2811911fc7159b5ab6a0e40a45421b0569baf8e7 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 7ab352665080b6bc19ddcea1d8107ccae3e71e25..04eda8bb61e31d15c1375edd6cff67660277ab25 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 b4044c86b79cec0bdaa52f3a69c0e968b622a9c9..0334fe22c9e5714fbe7413cbfe5478dfa4a1685c 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 188a9f0c62e3d5fad935766cb65ab8130b1cb91e..235aa1ec29fc0093828c1c5c9b83bc94e70f0d9f 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 7d7b49854a196e64109bf64ded0a794ec0cbdfe9..6b6eb5b1845bd1ef123bad6be6e44a1ad2a08a01 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 71b257f9f1cc6ad8c05be6223221fbc855a7ea35..5d222e8480eba4d94bac84f3c51a259ecb074d32 100644 --- a/src/SURFEX/coupling_seaflux_orogn.F90 +++ b/src/SURFEX/coupling_seaflux_orogn.F90 @@ -11,7 +11,7 @@ SUBROUTINE COUPLING_SEAFLUX_OROG_n (SM, DST, SLT, HPROGRAM, HCOUPLING, PTIMEC, P PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB,& PEMIS, PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, & PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, & - PPEQ_B_COEF, HTEST ) + PPEQ_B_COEF, PZWS, HTEST ) ! ############################################################################### ! !!**** *COUPLING_SEAFLUX_OROG_n * - Modifies the input forcing if not @@ -38,6 +38,7 @@ SUBROUTINE COUPLING_SEAFLUX_OROG_n (SM, DST, SLT, HPROGRAM, HCOUPLING, PTIMEC, P !! J. Escobar 09/2012 SIZE(PTA) not allowed without-interface , replace by KI !! B. Decharme 04/2013 new coupling variables !! improve forcing vertical shift +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !!------------------------------------------------------------- ! ! @@ -106,6 +107,7 @@ REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizonta ! ! (W/m2) REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PZWS ! significant sea wave (m) REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m) REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s) @@ -204,7 +206,7 @@ ENDIF PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, & PEMIS, PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, & PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, ZPET_B_COEF, & - ZPEQ_B_COEF, HTEST ) + ZPEQ_B_COEF, PZWS, HTEST ) ! IF (LHOOK) CALL DR_HOOK('COUPLING_SEAFLUX_OROG_N',1,ZHOOK_HANDLE) !------------------------------------------------------------------------------------- diff --git a/src/SURFEX/coupling_seaflux_sbln.F90 b/src/SURFEX/coupling_seaflux_sbln.F90 index 857f16473668a9831029b3f31d3bcaab7deb85c3..53aa72d42ebc46a6e8c6ca068027000af37bd2d6 100644 --- a/src/SURFEX/coupling_seaflux_sbln.F90 +++ b/src/SURFEX/coupling_seaflux_sbln.F90 @@ -11,7 +11,7 @@ SUBROUTINE COUPLING_SEAFLUX_SBL_n (CHS, DTS, DGS, O, OR, G, S, SB, DST, SLT, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, & PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, & PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, & - PPEQ_B_COEF, HTEST ) + PPEQ_B_COEF, PZWS, HTEST ) ! ############################################################################### ! !!**** *COUPLING_SEAFLUX_SBL_n * - Adds a SBL into SEAFLUX @@ -38,6 +38,7 @@ SUBROUTINE COUPLING_SEAFLUX_SBL_n (CHS, DTS, DGS, O, OR, G, S, SB, DST, SLT, !! S. Riette 10/2009 Iterative computation of XZ0 !! S. Riette 01/2010 Use of interpol_sbl to compute 10m wind diagnostic !! B. Decharme 04/2013 new coupling variables +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !---------------------------------------------------------------- ! ! @@ -122,6 +123,7 @@ REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizonta ! ! (W/m2) REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PZWS ! significant sea wave (m) REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s) REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s) @@ -302,7 +304,7 @@ END IF PSV, PCO2, HSV, PRAIN, PSNOW, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS, ZPA,& PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, & PEMIS, PTSURF, PZ0, PZ0H, PQSURF, ZPEW_A_COEF, ZPEW_B_COEF, & - ZPET_A_COEF, ZPEQ_A_COEF, ZPET_B_COEF, ZPEQ_B_COEF, HTEST) + ZPET_A_COEF, ZPEQ_A_COEF, ZPET_B_COEF, ZPEQ_B_COEF, PZWS, HTEST) ! !------------------------------------------------------------------------------------- ! diff --git a/src/SURFEX/coupling_seafluxn.F90 b/src/SURFEX/coupling_seafluxn.F90 index 5ea7b516c971576bf25a3d80fa24f72ba2f7690c..f7fc56d8021d2435be11826b58f57e6579b6ea9c 100644 --- a/src/SURFEX/coupling_seafluxn.F90 +++ b/src/SURFEX/coupling_seafluxn.F90 @@ -10,7 +10,7 @@ SUBROUTINE COUPLING_SEAFLUX_n (CHS, DTS, DGS, O, OR, G, S, DST, SLT, & PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, PSFTS, & PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, & PZ0, PZ0H, PQSURF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, & - PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST ) + PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PZWS, HTEST ) ! ############################################################################### ! !!**** *COUPLING_SEAFLUX_n * - Driver of the WATER_FLUX scheme for sea @@ -49,6 +49,7 @@ SUBROUTINE COUPLING_SEAFLUX_n (CHS, DTS, DGS, O, OR, G, S, DST, SLT, & !! Modified 01/2015 : R. Séférian interactive ocaen surface albedo !! Modified 03/2014 : M.N. Bouin possibility of wave parameters from external source !! Modified 11/2014 : J. Pianezze : add currents for wave coupling +!! Modified 02/2019 : S. Bielli Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !!--------------------------------------------------------------------- ! @@ -157,6 +158,7 @@ REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizonta ! ! (W/m2) REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PZWS ! significant sea wave (m) REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s) REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s) @@ -232,6 +234,8 @@ REAL, DIMENSION(KI) :: ZHU ! Near surface relative humidity REAL, DIMENSION(KI) :: ZQA ! specific humidity (kg/kg) REAL, DIMENSION(KI) :: ZEMIS ! Emissivity at time t REAL, DIMENSION(KI) :: ZTRAD ! Radiative temperature at time t +REAL, DIMENSION(KI) :: ZHS ! significant wave height +REAL, DIMENSION(KI) :: ZTP ! peak period ! REAL, DIMENSION(KI) :: ZSST ! XSST corrected for anomalously low values (which actually are sea-ice temp) REAL, DIMENSION(KI) :: ZMASK ! A mask for diagnosing where seaice exists (or, for coupling_iceflux, may appear) @@ -245,14 +249,17 @@ INTEGER :: ISIZE_ICE ! number of points with some se ! INTEGER :: ISWB ! number of shortwave spectral bands INTEGER :: JSWB ! loop counter on shortwave spectral bands -INTEGER :: ISLT ! number of sea salt variable ! INTEGER :: IBEG, IEND +INTEGER :: ISLT, IDST, JSV, IMOMENT ! number of sea salt, dust variables +! +INTEGER :: ILUOUT ! REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------------- ! Preliminaries: !------------------------------------------------------------------------------------- +CALL GET_LUOUT(HPROGRAM,ILUOUT) IF (LHOOK) CALL DR_HOOK('COUPLING_SEAFLUX_N',0,ZHOOK_HANDLE) IF (HTEST/='OK') THEN CALL ABOR1_SFX('COUPLING_SEAFLUXN: FATAL ERROR DURING ARGUMENT TRANSFER') @@ -277,6 +284,8 @@ ZUSTAR (:) = XUNDEF ZZ0 (:) = XUNDEF ZZ0H (:) = XUNDEF ZQSAT (:) = XUNDEF +ZHS (:) = XUNDEF +ZTP (:) = XUNDEF ! ZSFTQ_ICE(:) = XUNDEF ZSFTH_ICE(:) = XUNDEF @@ -317,6 +326,24 @@ PSFTS(:,:) = 0. ZHU = 1. ! ZQA(:) = PQA(:) / PRHOA(:) + +! HS value from ECMWF file +ZHS(:) = PZWS(:) +#ifdef CPLOASIS +! HS value from WW3 if activated +IF (LCPL_WAVE) THEN + ZHS(:)=S%XHS(:) + ZTP(:)=S%XTP(:) +ELSE + ZHS(:)=PZWS(:) + ZTP(:)=S%XTP(:) +END IF +#endif +! if HS value is undef : constant value and alert message +IF (ALL(ZHS==XUNDEF)) THEN + ZHS(:)=2. + WRITE (ILUOUT,*) 'WARNING : no HS values from ECMWF or WW3, then it is initialized to a constant value of 2 m' +END IF ! ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! Time evolution @@ -374,8 +401,16 @@ CALL COARE30_SEAFLUX(S, ZMASK, ISIZE_WATER, ISIZE_ICE, & PTA, ZEXNA ,PRHOA, ZSST, ZEXNS, ZQA, PRAIN, & PSNOW, ZWIND, PZREF, PUREF, PPS, ZQSAT, & ZSFTH, ZSFTQ, ZUSTAR, & - ZCD, ZCDN, ZCH, ZCE, ZRI, ZRESA_SEA, ZZ0H ) + ZCD, ZCDN, ZCH, ZCE, ZRI, ZRESA_SEA, ZZ0H ) END SELECT + +#ifdef CPLOASIS +IF (.NOT. LCPL_WAVE) THEN + S%XHS(:)=ZHS(:) + S%XTP(:)=ZTP(:) +END IF +#endif + ! !------------------------------------------------------------------------------------- !radiative properties at time t @@ -442,7 +477,7 @@ PSFCO2(:) = - ZWIND(:)**2 * 1.13E-3 * 8.7 * 44.E-3 / ( 365*24*3600 ) ! Scalar fluxes: !------------------------------------------------------------------------------------- ! -IF (CHS%SVS%NBEQ>0) THEN +IF (CHS%SVS%NBEQ>0.AND.(KI.GT.0)) THEN ! IF (CHS%CCH_DRY_DEP == "WES89") THEN ! @@ -475,7 +510,7 @@ IF (CHS%SVS%NBEQ>0) THEN ! ENDIF ! -IF (CHS%SVS%NDSTEQ>0) THEN +IF (CHS%SVS%NDSTEQ>0.AND.(KI.GT.0)) THEN ! IBEG = CHS%SVS%NSV_DSTBEG IEND = CHS%SVS%NSV_DSTEND @@ -499,7 +534,7 @@ IF (CHS%SVS%NDSTEQ>0) THEN ENDIF ! -IF (CHS%SVS%NSLTEQ>0) THEN +IF (CHS%SVS%NSLTEQ>0.AND.(KI.GT.0)) THEN ! IBEG = CHS%SVS%NSV_SLTBEG IEND = CHS%SVS%NSV_SLTEND @@ -510,6 +545,9 @@ IF (CHS%SVS%NSLTEQ>0) THEN SIZE(ZUSTAR,1), & !I [nbr] number of sea point ISLT, & !I [nbr] number of sea salt variables ZWIND, & !I [m/s] wind velocity + ZHS, & !I [m] significant sea wave + S%XSST, & + ZUSTAR, & PSFTS(:,IBEG:IEND) ) ! CALL DSLT_DEP(PSV(:,IBEG:IEND), PSFTS(:,IBEG:IEND), ZUSTAR, ZRESA_SEA, PTA, & @@ -517,11 +555,11 @@ IF (CHS%SVS%NSLTEQ>0) THEN XDENSITY_SLT, XMOLARWEIGHT_SLT, ZCONVERTFACM0_SLT, ZCONVERTFACM6_SLT, & ZCONVERTFACM3_SLT, LVARSIG_SLT, LRGFIX_SLT, CVERMOD ) ! - CALL MASSFLUX2MOMENTFLUX( & - PSFTS(:,IBEG:IEND), & !I/O ![kg/m2/sec] In: flux of only mass, out: flux of moments + CALL MASSFLUX2MOMENTFLUX( & + PSFTS(:,IBEG:IEND), & !I/O [kg/m2/sec] In: flux of only mass, out: flux of moments PRHOA, & !I [kg/m3] air density - SLT%XEMISRADIUS_SLT, &!I [um] emitted radius for the modes (max 3) - SLT%XEMISSIG_SLT, &!I [-] emitted sigma for the different modes (max 3) + SLT%XEMISRADIUS_SLT, & !I [um] emitted radius for the modes (max 3) + SLT%XEMISSIG_SLT, & !I [-] emitted sigma for the different modes (max 3) NSLTMDE, & ZCONVERTFACM0_SLT, & ZCONVERTFACM6_SLT, & diff --git a/src/SURFEX/coupling_sean.F90 b/src/SURFEX/coupling_sean.F90 index 97a8b1f7c6b4bc5a12c04551a6e869c22869d3b8..ca4ae208190a3df6849a9732c4918ee675ba8c55 100644 --- a/src/SURFEX/coupling_sean.F90 +++ b/src/SURFEX/coupling_sean.F90 @@ -10,7 +10,7 @@ SUBROUTINE COUPLING_SEA_n (SM, DGO, DL, DLC, U, DST, SLT, HPROGRAM, HCOUPLING, P PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, & PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, & PPEW_A_COEF, PPEW_B_COEF, & - PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST ) + PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PZWS, HTEST ) ! ############################################################################### ! !!**** *COUPLING_SEA_n * - Chooses the surface schemes for sea @@ -33,6 +33,7 @@ SUBROUTINE COUPLING_SEA_n (SM, DGO, DL, DLC, U, DST, SLT, HPROGRAM, HCOUPLING, P !! ------------- !! Original 01/2004 !! B. Decharme 04/2013 new coupling variables +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !!----------------------------------------------------------------------- ! ! @@ -104,6 +105,7 @@ REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizonta ! ! (W/m2) REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PZWS ! significant sea wave (m) REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m) REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s) @@ -150,7 +152,7 @@ IF (U%CSEA=='SEAFLX') THEN PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, & PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, & PPEW_A_COEF, PPEW_B_COEF, & - PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST ) + PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PZWS, HTEST ) ELSE IF (U%CSEA=='FLUX ') THEN CALL COUPLING_IDEAL_FLUX(DGO, DL, DLC, HPROGRAM, HCOUPLING, PTIMEC, & PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, & diff --git a/src/SURFEX/coupling_sltn.F90 b/src/SURFEX/coupling_sltn.F90 index 7e66f3fa5f6cbd143802a1d3f054ce40c4e5b0cc..284fc093527a26c6342ca61c0ac9e7b190aa9b7b 100644 --- a/src/SURFEX/coupling_sltn.F90 +++ b/src/SURFEX/coupling_sltn.F90 @@ -3,16 +3,26 @@ !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. SUBROUTINE COUPLING_SLT_n (SLT, & - KI, &!I [nbr] number of sea points - KSLT, &!I [nbr] number of sea points - PWIND, &!I Wind velocity - PSFSLT &!O [kg/m2/sec] flux of sea salt + KI, &!I [nbr] number of sea points + KSLT, &!I [nbr] number of sea salt variables + PWIND, &!I Wind velocity +! ++ PIERRE / MARINE SSA - MODIF ++ + PWHEIGHT, &! Significant height of wind-generated waves (in ECMWF analyses) + ! local pour l'instant, PWHEIGHT plus tard + PSST, &! Sea water temperature (C) + PUSTAR, &! Friction velocity (ecmwf?) Calcule dans coupling_seafluxn.F90 +! -- PIERRE / MARINE SSA - MODIF -- + PSFSLT &!O [kg/m2/sec] production flux of sea salt ) !PURPOSE !------- ! Compute sea salt emission upon Vignatti et al, 2001 +! ++ PIERRE / MARINE SSA - MODIF ++ +! Compute sea salt emission upon Ovadnevaite et al, 2014 +! -- PIERRE / MARINE SSA - MODIF -- ! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !AUTHOR !------- ! P. Tulet @@ -35,45 +45,64 @@ TYPE(SLT_t), INTENT(INOUT) :: SLT INTEGER, INTENT(IN) :: KI !I Number of sea points INTEGER, INTENT(IN) :: KSLT !I Number of sea salt emission variables REAL, DIMENSION(KI), INTENT(IN) :: PWIND !I wind velocity -REAL, DIMENSION(KI,KSLT), INTENT(OUT) :: PSFSLT !Out: mole particles per mole air m/s *(MWdst/MWair*rhoair)(index #1) - !Out: kg/m2/s (index #2) - !Out: moles m6/moles air m/s *(MWdst/MWair*rhoair)(index #3) +REAL, DIMENSION(KI,KSLT), INTENT(OUT) :: PSFSLT !Out: kg/m2/s (index #2) +! ++ PIERRE / MARINE SSA - MODIF ++ +REAL, DIMENSION(KI), INTENT(INOUT) :: PWHEIGHT !Significant height of wind-generated waves (in ECMWF analyses) +REAL, DIMENSION(KI), INTENT(IN) :: PUSTAR !Friction velocity (ecmwf?) : Unite: m.s^(-2)? +REAL, DIMENSION(KI), INTENT(IN) :: PSST ! Sea surface temperature (K) +! -- PIERRE / MARINE SSA - MODIF -- + !LOCAL VARIABLES -REAL,DIMENSION(KI,3) :: ZSFSLT_MDE ! sea salt flux from modes -INTEGER :: JN, JI !Counter for sea salt modes -REAL, DIMENSION(KI) :: DZSPEED -INTEGER, DIMENSION(KI):: WCL -REAL :: ZCONVERTFACM0_SLT -REAL :: ZCONVERTFACM3_SLT -REAL :: ZCONVERTFACM6_SLT -! -!REAL, PARAMETER :: MASS1FLUX(0:40) = (/ & -! 0.000E+00, 2.483E-15, 2.591E-14, 1.022E-13, 2.707E-13, 5.761E-13, & -! 1.068E-12, 1.800E-12, 2.829E-12, 4.215E-12, 6.023E-12, 8.317E-12, & -! 1.117E-11, 1.464E-11, 1.882E-11, 2.378E-11, 2.959E-11, 3.633E-11, & -! 4.409E-11, 5.296E-11, 6.301E-11, 7.433E-11, 8.693E-11, 1.012E-10, & -! 1.168E-10, 1.342E-10, 1.532E-10, 1.741E-10, 1.970E-10, 2.219E-10, & -! 2.489E-10, 2.781E-10, 3.097E-10, 3.437E-10, 3.803E-10, 4.195E-10, & -! 4.616E-10, 5.065E-10, 5.544E-10, 6.054E-10, 6.711E-10 /) -! -!REAL, PARAMETER :: MASS2FLUX(0:40) = (/ & -! 0.000E+00, 2.319E-13, 2.411E-12, 9.481E-12, 2.505E-11, 5.321E-11, & -! 9.850E-11, 1.658E-10, 2.602E-10, 3.874E-10, 5.529E-10, 7.628E-10, & -! 1.023E-09, 1.341E-09, 1.722E-09, 2.175E-09, 2.704E-09, 3.319E-09, & -! 4.026E-09, 4.832E-09, 5.746E-09, 6.776E-09, 7.925E-09, 9.214E-09, & -! 1.064E-08, 1.221E-08, 1.394E-08, 1.584E-08, 1.791E-08, 2.016E-08, & -! 2.261E-08, 2.526E-08, 2.812E-08, 3.120E-08, 3.451E-08, 3.806E-08, & -! 4.186E-08, 4.592E-08, 5.025E-08, 5.486E-08, 6.014E-08 /) -! -!REAL, PARAMETER :: MASS3FLUX(0:40) = (/ 0.0, & -! 1.783E-12, 1.579E-11, 5.852E-11, 1.501E-10, 3.134E-10, 5.740E-10, & -! 9.597E-10, 1.500E-09, 2.227E-09, 3.175E-09, 4.378E-09, 5.872E-09, & -! 7.698E-09, 9.897E-09, 1.250E-08, 1.556E-08, 1.912E-08, 2.323E-08, & -! 2.792E-08, 3.325E-08, 3.927E-08, 4.608E-08, 5.356E-08, 6.194E-08, & +REAL,DIMENSION(KI,JPMODE_SLT) :: ZSFSLT_MDE ! sea salt flux from modes +INTEGER :: JN, JI, II !Counter for sea salt modes +REAL, DIMENSION(KI) :: DZSPEED +INTEGER, DIMENSION(KI) :: WCL +REAL :: ZCONVERTFACM0_SLT ![kg/mole*mole/molec] conversion factor + !for moment fluxes and used fluxes +REAL :: ZCONVERTFACM3_SLT +REAL :: ZCONVERTFACM6_SLT +! +! ++ PIERRE / MARINE SSA - MODIF ++ + +REAL, DIMENSION(5) :: ZNUWATER ! Temperature-dependant kinematic viscosity of + ! sea-water (table of data to interpolate) (m².s-¹) +REAL, DIMENSION(5) :: ZWT ! Sea water temperature in table +REAL, DIMENSION(KI) :: ZREYNOLDS ! Reynolds Number +REAL, DIMENSION(KI) :: ZHVAGUE ! sea wave height from wind if ZWS is unknown. +REAL, DIMENSION(KI) :: ZVISCO ! Temperature-dependant kinematic viscosity + ! of sea-water interpolated +! -- PIERRE / MARINE SSA - MODIF -- +! +!REAL, PARAMETER :: mass1flux(0:40) = (/ & +! 0.000E+00, 2.483E-15, 2.591E-14, 1.022E-13, 2.707E-13, 5.761E-13, & +! 1.068E-12, 1.800E-12, 2.829E-12, 4.215E-12, 6.023E-12, 8.317E-12, & +! 1.117E-11, 1.464E-11, 1.882E-11, 2.378E-11, 2.959E-11, 3.633E-11, & +! 4.409E-11, 5.296E-11, 6.301E-11, 7.433E-11, 8.693E-11, 1.012E-10, & +! 1.168E-10, 1.342E-10, 1.532E-10, 1.741E-10, 1.970E-10, 2.219E-10, & +! 2.489E-10, 2.781E-10, 3.097E-10, 3.437E-10, 3.803E-10, 4.195E-10, & +! 4.616E-10, 5.065E-10, 5.544E-10, 6.054E-10, 6.711E-10 /) + +!REAL, PARAMETER :: mass2flux(0:40) = (/ & +! 0.000E+00, 2.319E-13, 2.411E-12, 9.481E-12, 2.505E-11, 5.321E-11, & +! 9.850E-11, 1.658E-10, 2.602E-10, 3.874E-10, 5.529E-10, 7.628E-10, & +! 1.023E-09, 1.341E-09, 1.722E-09, 2.175E-09, 2.704E-09, 3.319E-09, & +! 4.026E-09, 4.832E-09, 5.746E-09, 6.776E-09, 7.925E-09, 9.214E-09, & +! 1.064E-08, 1.221E-08, 1.394E-08, 1.584E-08, 1.791E-08, 2.016E-08, & +! 2.261E-08, 2.526E-08, 2.812E-08, 3.120E-08, 3.451E-08, 3.806E-08, & +! 4.186E-08, 4.592E-08, 5.025E-08, 5.486E-08, 6.014E-08 /) + +!REAL, PARAMETER :: mass3flux(0:40) = (/ 0.0, & +! 1.783E-12, 1.579E-11, 5.852E-11, 1.501E-10, 3.134E-10, 5.740E-10, & +! 9.597E-10, 1.500E-09, 2.227E-09, 3.175E-09, 4.378E-09, 5.872E-09, & +! 7.698E-09, 9.897E-09, 1.250E-08, 1.556E-08, 1.912E-08, 2.323E-08, & +! 2.792E-08, 3.325E-08, 3.927E-08, 4.608E-08, 5.356E-08, 6.194E-08, & ! 7.121E-08, 8.143E-08, 9.266E-08, 1.049E-07, 1.183E-07, 1.329E-07, & ! 1.487E-07, 1.658E-07, 1.843E-07, 2.041E-07, 2.255E-07, 2.484E-07, & ! 2.729E-07, 2.991E-07, 3.270E-07, 3.517E-07 /) +REAL, PARAMETER :: HVAGUE(1:9) = (/ 0., 0.1, 0.5, 1.25, 2.5, 4., 6., 9., 14. /) +REAL, PARAMETER :: VVENT(1:9) = (/ 1., 2.7, 4.1, 6.3, 8.3, 11.1, 13.8, & + 16.6, 19.4/) REAL, PARAMETER :: NUMB1FLUX(0:40) = (/ & 0.000E+00, 3.004E+01, 3.245E+02, 1.306E+03, 3.505E+03, 7.542E+03, & @@ -107,7 +136,7 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE !! M0=#/molec_{air} !! M6=um6/molec_{air}*1.d6 !! The surface model should have (for sea salt) -!! M0=#/m3*[kg_{dst}/mole_{dst}/XAVOGADRO] +!! M0=#/m3*[kg_{slt}/mole_{slt}/XAVOGADRO] !! M3=kg/m3 !! M6=um6/m3 !! REFERENCE @@ -119,71 +148,175 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COUPLING_SLT_N',0,ZHOOK_HANDLE) ! !Factor which is needed so that all gains normal units when leaving ground paramn -ZCONVERTFACM0_SLT = XMOLARWEIGHT_SLT / XAVOGADRO !(kg_dst/mol_dst)/(molec/mol) +ZCONVERTFACM0_SLT = XMOLARWEIGHT_SLT / XAVOGADRO !(kg_slt/mol_slt)/(molec/mol) !Factor which is needed for moment 6, there is a factor 1.d6 transported around in M6 in MESONH ZCONVERTFACM6_SLT = XMOLARWEIGHT_SLT / XAVOGADRO*1.d6 ZCONVERTFACM3_SLT = 4./3.*XPI*XDENSITY_SLT / 1.d18 ! PSFSLT(:,:)=0.d0 ! -IF (CEMISPARAM_SLT.eq."Vig01")THEN - ! - ! Vignatti et al. 2001 (in particles.cm-2.s-1) - ZSFSLT_MDE(:,1) = 10**(0.09 *PWIND(:) + 0.283) ! fine mode - ZSFSLT_MDE(:,2) = 10**(0.0422*PWIND(:) + 0.288) ! median mode - ZSFSLT_MDE(:,3) = 10**(0.069 *PWIND(:) - 3.5) ! coarse mode - ! convert into particles.m-2.s-1) - ZSFSLT_MDE(:,1) = MAX(ZSFSLT_MDE(:,1) * 1E4, 1E-10) - ZSFSLT_MDE(:,2) = MAX(ZSFSLT_MDE(:,2) * 1E4, 1E-10) - ZSFSLT_MDE(:,3) = MAX(ZSFSLT_MDE(:,3) * 1E4, 1E-10) - ! -ELSE ! Use Schultz et al., 2004 - ! +!+ Marine +IF (CEMISPARAM_SLT .eq. "Ova14") THEN ! Rajouter Ova14 dans fichier initialisation + ZHVAGUE(:) = 0. + DO II = 1, 8 +!++cb++19/10/16 modif de la formule : + de vent => vagues + hautes +! WHERE ((PWIND(:) .GT. VVENT(II)).AND.(PWIND(:) .LT. VVENT(II+1))) + WHERE ((PWIND(:) .GT. VVENT(II)).AND.(PWIND(:) .LT. VVENT(II+1))) +! ZHVAGUE(:) = HVAGUE(II) + (VVENT(II+1) - PWIND(:)) * & + ZHVAGUE(:) = HVAGUE(II) + (PWIND(:) - VVENT(II+1)) * & + (HVAGUE(II+1) - HVAGUE(II)) / & + (VVENT(II+1) - VVENT(II)) +!--cb-- + ENDWHERE + ENDDO + + WHERE (PWIND(:) .GE. VVENT(9)) + ZHVAGUE(:) = HVAGUE(9) + END WHERE + + WHERE (PWHEIGHT(:) .EQ. -1.) + PWHEIGHT(:) = ZHVAGUE(:) + END WHERE + + ZWT = (/ 273.15, 283.15, 293.15, 303.15, 313.15 /) ! Unite : K + ZNUWATER = (/ 1.854E-6, 1.36E-6, 1.051E-6, 0.843E-6, 0.695E-6 /) +! Unite : m².s^(-1) Pour une salinite = 35g/kg. +! En mer Mediterranee = 38.5g/kg (Lewis and Schwartz) + +! Initialisation des valeurs de ZVISCO, ZREYNOLDS + ZVISCO(:) = 0. + ZREYNOLDS(:) = 0. + + ! Tableau d'interpolation pour calculer ZNUWATER en fonction de la SST + ! Cas ou 0 < SST < 10 C + WHERE ((PSST(:) >= 273.15).AND.(PSST(:) < 283.15)) + ZVISCO(:) = ZNUWATER(1) + (PSST(:) - ZWT(1)) * (ZNUWATER(2)-ZNUWATER(1)) / & + (ZWT(2) - ZWT(1)) + ENDWHERE + + ! Cas ou 10 < SST < 20 C + WHERE ((PSST(:) >= 283.15).AND.(PSST(:) < 293.15)) + ZVISCO(:) = ZNUWATER(2) + (PSST(:) - ZWT(2)) * (ZNUWATER(3)-ZNUWATER(2)) / & + (ZWT(3) - ZWT(2)) + ENDWHERE + + ! Cas ou 20 < SST < 30 C + WHERE ((PSST(:) >= 293.15).AND.(PSST(:) < 303.15)) + ZVISCO(:) = ZNUWATER(3) + (PSST(:) - ZWT(3)) * (ZNUWATER(4)-ZNUWATER(3)) / & + (ZWT(4) - ZWT(3)) + ENDWHERE + + ! Cas ou 30 < SST < 40 C + WHERE ((PSST(:) >= 303.15).AND.(PSST(:) < 313.15)) + ZVISCO(:) = ZNUWATER(4) + (PSST(:) - ZWT(4)) * (ZNUWATER(5)-ZNUWATER(4)) / & + (ZWT(5) - ZWT(4)) + ENDWHERE + +! Calcul du nombre de Reynolds + ZREYNOLDS(:) = (PUSTAR(:) * PWHEIGHT(:)) / ZVISCO(:) + +! Calcul du flux en nombre pour chaque mode + +! Ovadnevaite et al. 2014 +!!!!! Total number flux, Unite ZSDSLT_MDE ne correspond pas au total number +!flux mais au size dependent SSA production flux + +! Ecrire equation integration pour chaque mode + +!Condition d'emission : ZREYNOLDS > 1E5 + + WHERE (ZREYNOLDS(:) > 1.E5) + ZSFSLT_MDE(:,1) = 104.51 * ( ZREYNOLDS(:) - 1.E5)**0.556 + ZSFSLT_MDE(:,2) = 0.044 * ( ZREYNOLDS(:) - 1.E5)**1.08 + ZSFSLT_MDE(:,3) = 149.64 * ( ZREYNOLDS(:) - 1.E5)**0.545 + ZSFSLT_MDE(:,4) = 2.96 * ( ZREYNOLDS(:) - 1.E5)**0.79 + ENDWHERE + WHERE (ZREYNOLDS(:) > 2.E5) + ZSFSLT_MDE(:,5) = 0.52 * ( ZREYNOLDS(:) - 2.E5)**0.87 + ENDWHERE + + + + WHERE (ZREYNOLDS(:) <= 1.E5) + ZSFSLT_MDE(:,1) = 1.E-10 + ZSFSLT_MDE(:,2) = 1.E-10 + ZSFSLT_MDE(:,3) = 1.E-10 + ZSFSLT_MDE(:,4) = 1.E-10 + ENDWHERE + WHERE (ZREYNOLDS(:) <= 2.E5) + ZSFSLT_MDE(:,5) = 1.E-10 + ENDWHERE + +! Controle avec des valeurs limites , Pas besoin de la conversion 1E4 pour Ova +! car deja en m-2 + ZSFSLT_MDE(:,1) = MAX(ZSFSLT_MDE(:,1) , 1.E-10) + ZSFSLT_MDE(:,2) = MAX(ZSFSLT_MDE(:,2) , 1.E-10) + ZSFSLT_MDE(:,3) = MAX(ZSFSLT_MDE(:,3) , 1.E-10) + ZSFSLT_MDE(:,4) = MAX(ZSFSLT_MDE(:,4) , 1.E-10) + ZSFSLT_MDE(:,5) = MAX(ZSFSLT_MDE(:,5) , 1.E-10) +!- Marine + +ELSEIF (CEMISPARAM_SLT .eq. "Vig01") THEN +! Vignatti et al. 2001 (in particles.cm-2.s-1) : en #.cm-3 en fait + ZSFSLT_MDE(:,1) = 10.**(0.09 *PWIND(:) + 0.283) ! fine mode + ZSFSLT_MDE(:,2) = 10.**(0.0422*PWIND(:) + 0.288) ! median mode + ZSFSLT_MDE(:,3) = 10.**(0.069 *PWIND(:) - 3.5) ! coarse mode + +! convert into particles.m-2.s-1) + ZSFSLT_MDE(:,1) = MAX(ZSFSLT_MDE(:,1) * 1.E4, 1.E-10) + ZSFSLT_MDE(:,2) = MAX(ZSFSLT_MDE(:,2) * 1.E4, 1.E-10) + ZSFSLT_MDE(:,3) = MAX(ZSFSLT_MDE(:,3) * 1.E4, 1.E-10) +! +ELSEIF (CEMISPARAM_SLT .eq. "Sch04") THEN! Use Schultz et al., 2004 WCL(:) = INT(PWIND(:)) WCL(:) = MAX (0, MIN(WCL(:), 39)) - ! + DZSPEED(:) = MAX(0., MIN(PWIND(:) - FLOAT(WCL(:)), 1.)) - ! - ! Flux given in particles.m-2 s-1 - ! - DO JI=1,KI - !plm-gfortran - ZSFSLT_MDE(JI,1) = NUMB1FLUX(WCL(JI)) + (NUMB1FLUX(WCL(JI)+1)-NUMB1FLUX(WCL(JI)))*DZSPEED(JI) - ZSFSLT_MDE(JI,2) = NUMB2FLUX(WCL(JI)) + (NUMB2FLUX(WCL(JI)+1)-NUMB2FLUX(WCL(JI)))*DZSPEED(JI) - ZSFSLT_MDE(JI,3) = NUMB3FLUX(WCL(JI)) + (NUMB3FLUX(WCL(JI)+1)-NUMB3FLUX(WCL(JI)))*DZSPEED(JI) - !plm-gfortran - ENDDO - ! + ! + ! Flux given in particles.m-2 s-1 + ! + DO JI = 1, KI + !plm-gfortran + ZSFSLT_MDE(JI,1) = NUMB1FLUX(WCL(JI)) + & + (NUMB1FLUX(WCL(JI)+1)-NUMB1FLUX(WCL(JI)))*DZSPEED(JI) + ZSFSLT_MDE(JI,2) = NUMB2FLUX(WCL(JI)) + & + (NUMB2FLUX(WCL(JI)+1)-NUMB2FLUX(WCL(JI)))*DZSPEED(JI) + ZSFSLT_MDE(JI,3) = NUMB3FLUX(WCL(JI)) + & + (NUMB3FLUX(WCL(JI)+1)-NUMB3FLUX(WCL(JI)))*DZSPEED(JI) + !plm-gfortran + END DO END IF ! -DO JN=1,JPMODE_SLT +DO JN = 1, JPMODE_SLT + +! convert particles.m-2 s-1 into kg.m-2.s-1 +! N'est calculé que pour le moment 3 (en masse), la conversion pour les autres +! flux de moments se fait plus tard (mode_dslt_surf.F90 MASSFLUX2MOMENTFLUX) +!+Marine ! - IF (LVARSIG_SLT) THEN - ! - PSFSLT(:,1+(JN-1)*3) = ZSFSLT_MDE(:,JORDER_SLT(JN)) - PSFSLT(:,2+(JN-1)*3) = PSFSLT(:,1+(JN-1)*3) * (SLT%XEMISRADIUS_SLT(JN)**3)*EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JN))**2) - PSFSLT(:,3+(JN-1)*3) = PSFSLT(:,1+(JN-1)*3) * (SLT%XEMISRADIUS_SLT(JN)**6)*EXP(18. * LOG(SLT%XEMISSIG_SLT(JN))**2) - ! - ! Conversion into fluxes - PSFSLT(:,1+(JN-1)*3) = PSFSLT(:,1+(JN-1)*3) * ZCONVERTFACM0_SLT - PSFSLT(:,2+(JN-1)*3) = PSFSLT(:,1+(JN-1)*3) * ZCONVERTFACM3_SLT - PSFSLT(:,3+(JN-1)*3) = PSFSLT(:,3+(JN-1)*3) * ZCONVERTFACM6_SLT - - ELSE IF (LRGFIX_SLT) THEN - PSFSLT(:,JN) = ZSFSLT_MDE(:,JORDER_SLT(JN)) * (SLT%XEMISRADIUS_SLT(JN)**3)*EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JN))**2) - ! Conversion into fluxes - PSFSLT(:,JN) = PSFSLT(:,JN) * ZCONVERTFACM3_SLT - - ELSE - PSFSLT(:,1+(JN-1)*2) = ZSFSLT_MDE(:,JORDER_SLT(JN)) - PSFSLT(:,2+(JN-1)*2) = PSFSLT(:,1+(JN-1)*2) * (SLT%XEMISRADIUS_SLT(JN)**3)*EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JN))**2) - - ! Conversion into fluxes - PSFSLT(:,1+(JN-1)*2) = PSFSLT(:,1+(JN-1)*2) * ZCONVERTFACM0_SLT - PSFSLT(:,2+(JN-1)*2) = PSFSLT(:,1+(JN-1)*2) * ZCONVERTFACM3_SLT - - ENDIF + IF (LVARSIG_SLT) THEN ! cas 3 moment + + PSFSLT(:,2+(JN-1)*3) = ZSFSLT_MDE(:,JORDER_SLT(JN)) & + * ((SLT%XEMISRADIUS_SLT(JORDER_SLT(JN))**3) & + * EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JORDER_SLT(JN)))**2)) & + * ZCONVERTFACM3_SLT + + ELSEIF (LRGFIX_SLT) THEN ! cas 1 moment + PSFSLT(:,JN) = ZSFSLT_MDE(:,JORDER_SLT(JN)) & + * (SLT%XEMISRADIUS_SLT(JORDER_SLT(JN))**3) & + * EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JORDER_SLT(JN)))**2) & + * ZCONVERTFACM3_SLT + + ELSE ! cas 2 moments + + PSFSLT(:,2+(JN-1)*2) = ZSFSLT_MDE(:,JORDER_SLT(JN)) & + * ((SLT%XEMISRADIUS_SLT(JORDER_SLT(JN))**3) & + * EXP(4.5 * LOG(SLT%XEMISSIG_SLT(JORDER_SLT(JN)))**2)) & + * ZCONVERTFACM3_SLT +! -- PIERRE / MARINE SSA - MODIF -- + END IF END DO + IF (LHOOK) CALL DR_HOOK('COUPLING_SLT_N',1,ZHOOK_HANDLE) END SUBROUTINE COUPLING_SLT_n diff --git a/src/SURFEX/coupling_surf_atmn.F90 b/src/SURFEX/coupling_surf_atmn.F90 index 9ee9651c22ceb72b66851668e76cfc2771982a1e..9a52eed46e1b6525e9e0ad2a000b97fc84ef205e 100644 --- a/src/SURFEX/coupling_surf_atmn.F90 +++ b/src/SURFEX/coupling_surf_atmn.F90 @@ -10,7 +10,7 @@ SUBROUTINE COUPLING_SURF_ATM_n (YSC, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, PPS, PPA, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, PTRAD, & PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, & PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, & - PPET_B_COEF, PPEQ_B_COEF, HTEST ) + PPET_B_COEF, PPEQ_B_COEF, PZWS, HTEST ) ! ################################################################################# ! !!**** *COUPLING_INLAND_WATER_n * - Driver to call the schemes for the @@ -39,6 +39,7 @@ SUBROUTINE COUPLING_SURF_ATM_n (YSC, HPROGRAM, HCOUPLING, PTIMEC, PTSTEP, KYEAR, !! Modified 06/2013 by J.Escobar : replace DOUBLE PRECISION by REAL to handle problem for promotion of real on IBM SP !! R. Séférian 03/2014 Adding decoupling between CO2 seen by photosynthesis and radiative CO2 !! P. Wautelet 02/2019 bug correction KI->KSIZE for size of KMASK argument in TREAT_SURF +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !!------------------------------------------------------------- ! ! @@ -128,6 +129,7 @@ REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizonta ! ! (W/m2) REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa) +REAL, DIMENSION(KI), INTENT(IN) :: PZWS ! significant sea wave (m) REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m) REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KI), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s) @@ -475,6 +477,7 @@ REAL, DIMENSION(KSIZE) :: ZP_LW ! longwave radiation (on horizontal surf.) ! ! (W/m2) REAL, DIMENSION(KSIZE) :: ZP_PS ! pressure at atmospheric model surface (Pa) REAL, DIMENSION(KSIZE) :: ZP_PA ! pressure at forcing level (Pa) +REAL, DIMENSION(KSIZE) :: ZP_ZWS ! significant sea wave (m) REAL, DIMENSION(KSIZE) :: ZP_ZS ! atmospheric model orography (m) REAL, DIMENSION(KSIZE) :: ZP_CO2 ! CO2 concentration in the air (kg/m3) REAL, DIMENSION(KSIZE,KSV) :: ZP_SV ! scalar concentration in the air @@ -532,6 +535,7 @@ DO JJ=1,KSIZE ZP_LW(JJ) = PLW (JI) ZP_PS(JJ) = PPS (JI) ZP_PA(JJ) = PPA (JI) + ZP_ZWS(JJ) = PZWS (JI) ZP_ZS(JJ) = PZS (JI) ENDDO ! @@ -584,7 +588,7 @@ IF (KTILE==1) THEN ZP_PS, ZP_PA, ZP_SFTQ, ZP_SFTH, ZP_SFTS, ZP_SFCO2, ZP_SFU, ZP_SFV, & ZP_TRAD, ZP_DIR_ALB, ZP_SCA_ALB, ZP_EMIS, ZP_TSURF, ZP_Z0, ZP_Z0H, & ZP_QSURF, ZP_PEW_A_COEF, ZP_PEW_B_COEF, ZP_PET_A_COEF, ZP_PEQ_A_COEF, & - ZP_PET_B_COEF, ZP_PEQ_B_COEF, 'OK' ) + ZP_PET_B_COEF, ZP_PEQ_B_COEF, ZP_ZWS, 'OK' ) ! ELSEIF (KTILE==2) THEN ! diff --git a/src/SURFEX/default_slt.F90 b/src/SURFEX/default_slt.F90 index e4f99f54a4c89da71b6fe82f411f277676888cc0..ca96f03f98d0b5c56c5cbd4b31838ac4d8c27045 100644 --- a/src/SURFEX/default_slt.F90 +++ b/src/SURFEX/default_slt.F90 @@ -32,6 +32,7 @@ !! MODIFICATIONS !! ------------- !! Original 03/2005 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -52,8 +53,10 @@ IMPLICIT NONE REAL(KIND=JPRB) :: ZHOOK_HANDLE ! IF (LHOOK) CALL DR_HOOK('DEFAULT_SLT',0,ZHOOK_HANDLE) -CEMISPARAM_SLT = 'Vig01' -JPMODE_SLT = 3 +! ++ PIERRE / MARINE SSA - MODIF ++ +CEMISPARAM_SLT = 'Ova14' +JPMODE_SLT = 5 +! -- PIERRE / MARINE SSA - MODIF -- LVARSIG_SLT = .FALSE. LRGFIX_SLT = .TRUE. IF (LHOOK) CALL DR_HOOK('DEFAULT_SLT',1,ZHOOK_HANDLE) diff --git a/src/SURFEX/init_slt.F90 b/src/SURFEX/init_slt.F90 index 2320d6517af47881244b62bf2f3fb97d39c4841e..44e1e1bf988df95211f08f3e438b918468c72617 100644 --- a/src/SURFEX/init_slt.F90 +++ b/src/SURFEX/init_slt.F90 @@ -5,7 +5,36 @@ SUBROUTINE INIT_SLT (SLT, & HPROGRAM &! Program calling unit ) - +! ###################################################################### +! +!!**** *INIT_SLT* - +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! !! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! ? +!! +!! MODIFICATIONS +!! ------------- +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +!! +!------------------------------------------------------------------------------ +! ! USE MODD_SLT_n, ONLY : SLT_t ! @@ -38,14 +67,28 @@ ALLOCATE(SLT%XEMISSIG_SLT (NSLTMDE)) !Get initial size distributions. This is cut and pasted !from dead routine dstpsd.F90 !Check for different source parameterizations -IF(CEMISPARAM_SLT.eq."Vig01") THEN + +IF (CEMISPARAM_SLT.eq."Ova14") THEN + NSLTMDE = 5 +! JORDER_SLT = (/3,2,1,4,5/) !Salt modes in order of importance CRGUNITS = 'NUMB' - XEMISRADIUS_INI_SLT(:) = (/ 0.2, 2.0, 12. /) ! [um] Number median radius She84 p. 75 Table 1 - XEMISSIG_INI_SLT (:) = (/ 1.9, 2.0, 3.00 /) ! [frc] Geometric standard deviation She84 p. 75 Table 1 -ELSE ! use default of Schultz et al, 2004 - CRGUNITS = 'MASS' - XEMISRADIUS_INI_SLT(:) = 0.5*(/0.28, 2.25, 15.32/) ! [um] Mass median radius - XEMISSIG_INI_SLT (:) = (/1.59, 2.00, 2.00 /) ! [frc] Geometric standard deviation + XEMISRADIUS_INI_SLT = (/0.009, 0.021, 0.045, 0.115, 0.415/) + XEMISSIG_INI_SLT = (/1.37, 1.5, 1.42, 1.53, 1.85/) + +ELSE IF(CEMISPARAM_SLT.eq."Vig01") THEN + NSLTMDE = 5 +! JORDER_SLT = (/3,2,1,4,5/) !Salt modes in order of importance, only three modes + CRGUNITS = 'NUMB' + XEMISRADIUS_INI_SLT = (/ 0.2, 2.0, 12.,0.,0. /) ! [um] Number median radius Viganati et al., 2001 + XEMISSIG_INI_SLT = (/ 1.9, 2.0, 3.00,0.,0. /) ! [frc] Geometric standard deviation Viganati et al., 2001 + +ELSE IF(CEMISPARAM_SLT.eq."Sch04") THEN ! use default of Schultz et al, 2004 + NSLTMDE = 5 +! JORDER_SLT = (/3,2,1,4,5/), only three modes + CRGUNITS = 'MASS' + XEMISRADIUS_INI_SLT = 0.5*(/0.28, 2.25, 15.32, 0., 0./)! [um] Mass median radius + XEMISSIG_INI_SLT = (/1.59, 2.00, 2.00, 0., 0./) ! [frc] Geometric standard deviation + ENDIF ! DO JMODE=1,NSLTMDE diff --git a/src/SURFEX/modd_slt_surf.F90 b/src/SURFEX/modd_slt_surf.F90 index 0ee1b2b658f75509634126c22cb7e93e5e97c9ff..589cfb655881a5efb184c08463b4ba564280a427 100644 --- a/src/SURFEX/modd_slt_surf.F90 +++ b/src/SURFEX/modd_slt_surf.F90 @@ -4,13 +4,18 @@ !SFX_LIC for details. version 1. MODULE MODD_SLT_SURF ! +! MODIFICATIONS +! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes + + IMPLICIT NONE ! REAL, PARAMETER :: XDENSITY_SLT = 2.1e3 ! [kg/m3] density of sea salt REAL, PARAMETER :: XMOLARWEIGHT_SLT = 58.e-3 ! [kg/mol] molar weight sea salt ! -INTEGER, PARAMETER :: NEMISMODES_MAX=3 -INTEGER, DIMENSION(NEMISMODES_MAX), PARAMETER :: JORDER_SLT=(/3,2,1/) !Dust modes in order of importance +INTEGER, PARAMETER :: NEMISMODES_MAX=5 +INTEGER, DIMENSION(NEMISMODES_MAX), PARAMETER :: JORDER_SLT=(/3,2,1,5,4/) !Dust modes in order of importance !Set emission related parameters REAL,DIMENSION(NEMISMODES_MAX) :: XEMISRADIUS_INI_SLT ! number madian radius initialization for sea salt mode (um) REAL,DIMENSION(NEMISMODES_MAX) :: XEMISSIG_INI_SLT ! dispersion initialization for sea salt mode diff --git a/src/SURFEX/modd_sltn.F90 b/src/SURFEX/modd_sltn.F90 index 84a48d74c4c7c20da51619e79970ec1ebc6e72ad..4187b72f2450b5a50a00f2607d1ec550871476ad 100644 --- a/src/SURFEX/modd_sltn.F90 +++ b/src/SURFEX/modd_sltn.F90 @@ -10,25 +10,43 @@ MODULE MODD_SLT_n ! !Author: Alf Grini / Pierre Tulet ! +! MODIFICATIONS +! +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes + USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE PARKIND1 ,ONLY : JPRB ! IMPLICIT NONE -! + TYPE SLT_t +! ++ PIERRE / MARINE SSA DUST - MODIF ++ +! REAL, DIMENSION(:,:,:),POINTER :: XSFSLT ! Sea Salt variables to be send to output +! -- PIERRE / MARINE SSA DUST - MODIF -- REAL,DIMENSION(:), POINTER :: XEMISRADIUS_SLT ! Number median radius for each source mode REAL,DIMENSION(:), POINTER :: XEMISSIG_SLT ! sigma for each source mode END TYPE SLT_t + + + + CONTAINS + ! -CONTAINS -! + + + + SUBROUTINE SLT_INIT(YSLT) TYPE(SLT_t), INTENT(INOUT) :: YSLT REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK("MODD_SLT_N:SLT_INIT",0,ZHOOK_HANDLE) +! ++ PIERRE / MARINE SSA DUST - MODIF ++ +! NULLIFY(YSLT%XSFSLT) +! -- PIERRE / MARINE SSA DUST - MODIF -- NULLIFY(YSLT%XEMISRADIUS_SLT) NULLIFY(YSLT%XEMISSIG_SLT) IF (LHOOK) CALL DR_HOOK("MODD_SLT_N:SLT_INIT",1,ZHOOK_HANDLE) END SUBROUTINE SLT_INIT -! + + END MODULE MODD_SLT_n diff --git a/src/SURFEX/modn_slt.F90 b/src/SURFEX/modn_slt.F90 index 44a889c3f838d35db853431031274e7c30b52680..091c4e400dd9203e36752aa5084e7f688cc20846 100644 --- a/src/SURFEX/modn_slt.F90 +++ b/src/SURFEX/modn_slt.F90 @@ -20,10 +20,11 @@ !! MODIFICATIONS !! ------------- !! Original 24/02/05 +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! !! IMPLICIT ARGUMENTS !! ------------------ -USE MODD_SLT_SURF, ONLY : CEMISPARAM_SLT +USE MODD_SLT_SURF !! !----------------------------------------------------------------------------- ! @@ -32,7 +33,6 @@ USE MODD_SLT_SURF, ONLY : CEMISPARAM_SLT IMPLICIT NONE SAVE NAMELIST /NAM_SURF_SLT/ & - CEMISPARAM_SLT !Parameterization type - + CEMISPARAM_SLT, LVARSIG_SLT, LRGFIX_SLT, JPMODE_SLT !Parameterization type ! END MODULE MODN_SLT