diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index e030f6f5e8b7e1bdc23ae065c93eececa507e54d..6d135c72c053f1094f5978b6deb5fd48d6f4f802 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -143,9 +143,11 @@ USE MODD_ARGSLIST_ll, ONLY: LIST_ll USE MODD_BLOWSNOW, ONLY: LBLOWSNOW, NBLOWSNOW_2D, YPBLOWSNOW_2D USE MODD_BLOWSNOW_n, ONLY: XRSNWCANOS USE MODD_BUDGET, ONLY: LBUDGET_TH, LBUDGET_RV, NBUDGET_RV, NBUDGET_TH, TBUDGETS -USE MODD_CH_AEROSOL, ONLY: LORILAM +USE MODD_CH_AEROSOL, ONLY: LORILAM, NSP, NCARB, NSOA +USE MODD_CH_AERO_n, ONLY: XMI USE MODD_CH_FLX_n, ONLY: XCHFLX USE MODD_CH_MNHC_n, ONLY: LUSECHEM +USE MODD_CH_M9_SCHEME USE MODD_CONF, ONLY: CPROGRAM, LCARTESIAN, NHALO, NVERB USE MODD_CONF_n, ONLY: NRR USE MODD_COUPLING_LEVELS_n @@ -160,7 +162,8 @@ USE MODD_DIM_n, ONLY: NKMAX USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_DUST, ONLY: LDUST USE MODD_DYN_n, ONLY: XTSTEP -USE MODD_FIELD_n, ONLY: XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS, XRTHS, XRRS +USE MODD_FIELD_n, ONLY: XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS, XRTHS, XRRS, & + XFLX_SLT, XFLXT_SLT, XFLX_AER, XFLXT_AER, XFLX_DMS, XFLXT_DMS USE MODD_FIRE_n, ONLY: XLSPHI, XBMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMIGNITION, XFMFUELTYPE, & XFIRETAU, XFLUXPARAMH, XFLUXPARAMW, XFIRERW, XFMASE, XFMAWC, XFMWALKIG, & XFMFLUXHDH, XFMFLUXHDW, XFMHWS, XFMWINDU, XFMWINDV, XFMWINDW, XGRADLSPHIX, & @@ -187,7 +190,7 @@ USE MODD_RADIATIONS_n, ONLY: XFLALWD, XCCO2, XTSIDER, & XSW_BANDS, XDIRSRFSWD, XSCAFLASWD, & XZENITH, XAZIM, XAER, XSWU, XLWU USE MODD_REF_n, ONLY: XEXNREF, XRHODREF, XRHODJ -USE MODD_SALT, ONLY: LSALT +USE MODD_SALT, ONLY: LSALT, NMODE_SLT, XINIRADIUS_SLT, XINISIG_SLT, CRGUNITS, JPSALTORDER USE MODD_STATION_n, ONLY: LSTATION USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF USE MODD_TIME, ONLY: TDTSEG @@ -455,6 +458,11 @@ REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZFIREFUELMAP ! Fuel CHARACTER(LEN=7) :: YFUELMAPFILE ! Fuel Map file name TYPE(LIST_ll), POINTER :: TZFIELDFIRE_ll ! list of fields to exchange ! +INTEGER :: II +INTEGER :: JSV_DMS, JSV_SLT ! index for sea salt flux +INTEGER :: IMOMENTS ! number of moments for sea salt +REAL,DIMENSION(:), ALLOCATABLE :: ZINIRADIUS ! initial mean radius +INTEGER :: IMODEIDX ! [idx] loop counters !------------------------------------------------------------------------------- ! ! @@ -1065,6 +1073,13 @@ IF (LUSECHEM) THEN PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB)) IF ((LCHEMDIAG).AND.(CPROGRAM == 'DIAG ')) XCHFLX(:,:,JSV-NSV_CHEMBEG+1) = PSFSV(:,:,JSV) END DO + IF (CPROGRAM == 'MESONH') THEN + ! net flux of so2 in kg/m2/s + XFLX_DMS(:,:) = ZSFTS(:,:,NSV_CHEMBEG-1+JP_DMS) *62.13E-3 / XAVOGADRO + ! total net flux of so2 in kg/m2 + XFLXT_DMS(:,:) = XFLXT_DMS(:,:)+ ZSFTS(:,:,NSV_CHEMBEG-1+JP_DMS)*XTSTEP + END IF + ELSE PSFSV(:,:,NSV_CHEMBEG:NSV_CHEMEND) = 0. END IF @@ -1088,6 +1103,39 @@ IF (LSALT) THEN ELSE PSFSV(:,:,NSV_SLTBEG:NSV_SLTEND) = 0. END IF + +IF ((LSALT).AND.(CPROGRAM == 'MESONH')) THEN + IMOMENTS = INT(NSV_SLTEND - NSV_SLTBEG + 1) / NMODE_SLT + ALLOCATE (ZINIRADIUS(NMODE_SLT)) + + DO JSV = 1, NMODE_SLT + JSV_SLT = NSV_SLTBEG + 1 + (JSV-1)*IMOMENTS + + IF (IMOMENTS == 1) THEN ! conversion number to mass + IMODEIDX = JPSALTORDER(JSV) + IF (CRGUNITS=="MASS") THEN + ZINIRADIUS(JSV) = XINIRADIUS_SLT(IMODEIDX) * EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) + ELSE + ZINIRADIUS(JSV) = XINIRADIUS_SLT(IMODEIDX) + END IF + + +! Instantaneous net flux + XFLX_SLT(:,:,JSV) = ZSFTS(:,:,JSV_SLT-1) * 4./3. * XPI * XMD / 1.d18 * ZINIRADIUS(JSV)**3 / & + (EXP(-4.5*(LOG(XINISIG_SLT(IMODEIDX)))**2)) + + ELSE ! moment 2 or 3, direct mass flux from surfex +! Instantaneous net flux + XFLX_SLT(:,:,JSV) = ZSFTS(:,:,JSV_SLT) + END IF + +! Total net flux + XFLXT_SLT(:,:,JSV) = XFLXT_SLT(:,:,JSV) + & + ZSFTS(:,:,JSV_SLT) * XTSTEP + END DO + DEALLOCATE(ZINIRADIUS) +END IF + ! !* conversion from aerosol flux (molec/m2/s) to (ppv.m.s-1) ! @@ -1095,6 +1143,19 @@ IF (LORILAM) THEN DO JSV=NSV_AERBEG,NSV_AEREND PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB)) END DO + IF (CPROGRAM == 'MESONH') THEN + DO JSV=NSV_AERBEG,NSV_AERBEG+(NSP+NCARB+NSOA)*2-1 + JI=INT((JSV-NSV_AERBEG+1)/2. +0.5) +! Instantaneous net flux (kg/m2/s) + XFLX_AER(:,:,JSV-NSV_AERBEG+1) = ZSFTS(:,:,JSV) * XMI(:,:,IKB,JI) & + *1E-3 / XAVOGADRO + +! Total net flux + XFLXT_AER(:,:,JSV-NSV_AERBEG+1) = XFLXT_AER(:,:,JSV-NSV_AERBEG+1) + & + XFLX_AER(:,:,JSV-NSV_AERBEG+1) * XTSTEP + END DO + END IF + ELSE PSFSV(:,:,NSV_AERBEG:NSV_AEREND) = 0. END IF diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index ecaae1f6ef7aec7571272cdbd978fa948f962b43..d9d28aef64039c9e0a5d4a91061179ff639f3a39 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -394,7 +394,7 @@ USE MODD_RECYCL_PARAM_n USE MODD_REF USE MODD_REF_n USE MODD_RELFRC_n -use MODD_SALT, only: LSALT +use MODD_SALT, only: LSALT, NMODE_SLT use MODD_SALT_OPT_LKT, only: NMAX_RADIUS_LKT_SALT=>NMAX_RADIUS_LKT, NMAX_SIGMA_LKT_SALT=>NMAX_SIGMA_LKT, & NMAX_WVL_SW_SALT=>NMAX_WVL_SW, & XEXT_COEFF_WVL_LKT_SALT=>XEXT_COEFF_WVL_LKT, XEXT_COEFF_550_LKT_SALT=>XEXT_COEFF_550_LKT, & @@ -2555,6 +2555,22 @@ RCCO2 = 360.0E-06 * 44.0E-03 / XMD ! !* 17.2 Externalized surface fields ! --------------------------- +IF (CPROGRAM=='MESONH') THEN + ! ajout flux aerosols marins + ALLOCATE(XFLXT_SLT(IIU,IJU,NMODE_SLT)) + ALLOCATE(XFLX_SLT(IIU,IJU,NMODE_SLT)) + ALLOCATE(XFLX_AER(IIU,IJU,NSV_AER)) + ALLOCATE(XFLXT_AER(IIU,IJU,NSV_AER)) + ALLOCATE(XFLX_DMS(IIU,IJU)) + ALLOCATE(XFLXT_DMS(IIU,IJU)) + XFLX_SLT(:,:,:) = 0. + XFLXT_SLT(:,:,:) = 0. + XFLX_AER(:,:,:) = 0. + XFLXT_AER(:,:,:) = 0. + XFLX_DMS(:,:) = 0. + XFLXT_DMS(:,:) = 0. +END IF + ! ALLOCATE(ZCO2(IIU,IJU)) ZCO2(:,:) = XCCO2 diff --git a/src/MNH/modd_fieldn.f90 b/src/MNH/modd_fieldn.f90 index 9cc888e85f70d9bf95afbda9d907a9e5c572dd19..5073c5450d0926938ae467295e5846be79f2af9a 100644 --- a/src/MNH/modd_fieldn.f90 +++ b/src/MNH/modd_fieldn.f90 @@ -129,6 +129,13 @@ TYPE FIELD_t REAL, DIMENSION(:,:,:), POINTER :: XHLC_HCF=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XHLI_HRI=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XHLI_HCF=>NULL() + REAL, DIMENSION(:,:,:), POINTER :: XFLX_SLT=>NULL() ! + REAL, DIMENSION(:,:,:), POINTER :: XFLXT_SLT=>NULL() + REAL, DIMENSION(:,:,:), POINTER :: XFLX_AER=>NULL() ! + REAL, DIMENSION(:,:,:), POINTER :: XFLXT_AER=>NULL() + REAL, DIMENSION(:,:), POINTER :: XFLX_DMS=>NULL() ! + REAL, DIMENSION(:,:), POINTER :: XFLXT_DMS=>NULL() + ! END TYPE FIELD_t @@ -174,6 +181,13 @@ REAL, DIMENSION(:,:,:), POINTER :: XRCM=>NULL() REAL, DIMENSION(:,:), POINTER :: XFLUCTUNW=>NULL(),XFLUCTVNN=>NULL(),XFLUCTUTN=>NULL(),XFLUCTVTW=>NULL() REAL, DIMENSION(:,:), POINTER :: XFLUCTUNE=>NULL(),XFLUCTVNS=>NULL(),XFLUCTUTS=>NULL(),XFLUCTVTE=>NULL() REAL, DIMENSION(:,:), POINTER :: XFLUCTWTW=>NULL(),XFLUCTWTN=>NULL(),XFLUCTWTE=>NULL(),XFLUCTWTS=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XFLX_SLT=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XFLXT_SLT=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XFLX_AER=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XFLXT_AER=>NULL() +REAL, DIMENSION(:,:), POINTER :: XFLX_DMS=>NULL() +REAL, DIMENSION(:,:), POINTER :: XFLXT_DMS=>NULL() + CONTAINS @@ -235,6 +249,13 @@ FIELD_MODEL(KFROM)%XHLC_HRC=>XHLC_HRC FIELD_MODEL(KFROM)%XHLC_HCF=>XHLC_HCF FIELD_MODEL(KFROM)%XHLI_HRI=>XHLI_HRI FIELD_MODEL(KFROM)%XHLI_HCF=>XHLI_HCF + +FIELD_MODEL(KFROM)%XFLX_SLT => XFLX_SLT +FIELD_MODEL(KFROM)%XFLXT_SLT => XFLXT_SLT +FIELD_MODEL(KFROM)%XFLX_AER => XFLX_AER +FIELD_MODEL(KFROM)%XFLXT_AER => XFLXT_AER +FIELD_MODEL(KFROM)%XFLX_DMS => XFLX_DMS +FIELD_MODEL(KFROM)%XFLXT_DMS => XFLXT_DMS ! ! Current model is set to model KTO !XZWS=>FIELD_MODEL(KTO)%XZWS !Done in FIELDLIST_GOTO_MODEL @@ -290,6 +311,15 @@ XHLC_HRC=>FIELD_MODEL(KTO)%XHLC_HRC XHLC_HCF=>FIELD_MODEL(KTO)%XHLC_HCF XHLI_HRI=>FIELD_MODEL(KTO)%XHLI_HRI XHLI_HCF=>FIELD_MODEL(KTO)%XHLI_HCF + +XFLX_SLT=>FIELD_MODEL(KTO)%XFLX_SLT +XFLXT_SLT=>FIELD_MODEL(KTO)%XFLXT_SLT +XFLX_AER=>FIELD_MODEL(KTO)%XFLX_AER +XFLXT_AER=>FIELD_MODEL(KTO)%XFLXT_AER +XFLX_DMS=>FIELD_MODEL(KTO)%XFLX_DMS +XFLXT_DMS=>FIELD_MODEL(KTO)%XFLXT_DMS + END SUBROUTINE FIELD_GOTO_MODEL + END MODULE MODD_FIELD_n diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index b09dcfb7dad528cd2bad0d76b1c5c5154b75bc60..7f5b1ab8624962cb9217f76e52012f6c2fb5e180 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -223,6 +223,7 @@ USE MODD_EOL_SHARED_IO USE MODD_FIELD_n use modd_field, only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED, & TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL +use mode_field, only: Find_field_id_from_mnhname USE MODD_FIRE_n #ifdef MNH_FOREFIRE USE MODD_FOREFIRE @@ -301,6 +302,7 @@ INTEGER :: IRESP ! IRESP : return-code if a problem appears INTEGER :: JSV ! loop index for scalar variables ! CHARACTER(LEN=3) :: YFRC ! to mark the time of the forcing +CHARACTER(LEN=1) :: YFRC1 ! to mark the time of the forcing INTEGER :: JT ! loop index ! REAL,DIMENSION(:,:), ALLOCATABLE :: ZWORK2D ! Working array @@ -1128,6 +1130,98 @@ IF (NSV >= 1 ) THEN END IF END IF +IF ((LORILAM).AND.(CPROGRAM == 'MESONH')) THEN +DO JSV = 1 , NSV_AER + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'FLX_'//TRIM(UPCASE(CAERONAMES(JSV))), & + CSTDNAME = '', & + CLONGNAME = 'FLX_'//TRIM(UPCASE(CAERONAMES(JSV))), & + CUNITS = 'kg m-2 s-1', & + CDIR = 'XY', & + CCOMMENT = 'Aerosols mass flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,XFLX_AER(:,:,JSV)) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'FLXT_'//TRIM(UPCASE(CAERONAMES(JSV))), & + CSTDNAME = '', & + CLONGNAME = 'FLXT_'//TRIM(UPCASE(CAERONAMES(JSV))), & + CUNITS = 'kg m-2', & + CDIR = 'XY', & + CCOMMENT = 'Integrated aerosols flux since start/restart', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,XFLXT_AER(:,:,JSV)) +END DO +END IF + +IF ((LSALT).AND.(CPROGRAM == 'MESONH')) THEN +DO JSV = 1 , NMODE_SLT + WRITE (YFRC1,'(I1.1)') JSV + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'FLX_SLT'//YFRC1, & + CSTDNAME = '', & + CLONGNAME = 'FLX_SLT'//YFRC1, & + CUNITS = 'part m-2 s-1', & + CDIR = 'XY', & + CCOMMENT = 'Sea salt mass flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,XFLX_SLT(:,:,JSV)) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'FLXT_SLT'//YFRC1, & + CSTDNAME = '', & + CLONGNAME = 'FLXT_SLT'//YFRC1, & + CUNITS = 'part m-2', & + CDIR = 'XY', & + CCOMMENT = 'Integrated sea salt flux since start/restart', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,XFLXT_SLT(:,:,JSV)) +END DO +END IF + +IF ((LUSECHEM).AND.(CPROGRAM == 'MESONH')) THEN + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'FLX_DMS', & + CSTDNAME = '', & + CLONGNAME = 'FLX_DMS', & + CUNITS = 'kg m-2 s-1', & + CDIR = 'XY', & + CCOMMENT = 'Sea salt mass flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,XFLX_DMS(:,:)) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'FLXT_DMS', & + CSTDNAME = '', & + CLONGNAME = 'FLXT_DMS', & + CUNITS = 'kg m-2', & + CDIR = 'XY', & + CCOMMENT = 'Integrated sea salt flux since start/restart', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,XFLXT_DMS(:,:)) +END IF + + + ! electrical scalar variables IF (CELEC /= 'NONE') THEN CALL IO_Field_write(TPFILE,'EFIELDU',XEFIELDU)