Skip to content
Snippets Groups Projects
Commit a9b59871 authored by RODIER Quentin's avatar RODIER Quentin
Browse files

P.Tulet 27/11/2023: add salt/dms emissions in backup files

parent ced271b0
Branches
Tags
No related merge requests found
......@@ -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
......
......@@ -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
......
......@@ -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
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment