diff --git a/src/LIB/megan.tar.gz b/src/LIB/megan.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..81d81c29fa83d9f4724ba3e2085cf3613549fbc5 --- /dev/null +++ b/src/LIB/megan.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f23728f9dae694a49c7a831686b8ee37a5f0be0b51839fa839bb8e022499bbc +size 42352 diff --git a/src/SURFEX/coupling_megann.F90 b/src/SURFEX/coupling_megann.F90 new file mode 100644 index 0000000000000000000000000000000000000000..6d5641bf78b6f3acecc378ebc22d0bd2b51e0803 --- /dev/null +++ b/src/SURFEX/coupling_megann.F90 @@ -0,0 +1,246 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ############################### + SUBROUTINE COUPLING_MEGAN_n(MGN, CHI, GK, PEK, & + KYEAR, KMONTH, KDAY, PTIME, OTR_ML, & + KSLTYP, PPFT, PEF, & + PTEMP, PIACAN, PLEAFT, PRN_SUNLIT, PRN_SHADE, & + PWIND, PPRES, PQV, PSFTS) +! ############################### +!! +!!*** *BVOCEM* +!! +!! PURPOSE +!! ------- +!! Calculate the biogenic emission fluxes upon the MEGAN code +!! http://lar.wsu.edu/megan/ +!! +!! METHOD +!! ------ +!! +!! +!! AUTHOR +!! ------ +!! P. Tulet (LACy) +!! +!! MODIFICATIONS +!! ------------- +!! Original: 25/10/2014 +!! Modified: 06/07/2017, J. Pianezze, adaptation for SurfEx v8.0 +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +! +USE MODD_MEGAN_n, ONLY : MEGAN_t +USE MODD_CH_ISBA_n, ONLY : CH_ISBA_t +USE MODD_ISBA_n, ONLY: ISBA_PE_t +USE MODD_SFX_GRID_n, ONLY: GRID_t +! +USE MODD_CSTS, ONLY : XAVOGADRO +! +#ifdef MNH_MEGAN +USE MODD_MEGAN +USE MODI_JULIAN +USE MODI_EMPROC +USE MODI_MGN2MECH +#endif +! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! ----------------- +! +IMPLICIT NONE +! +TYPE(MEGAN_t), INTENT(INOUT) :: MGN +TYPE(CH_ISBA_t), INTENT(INOUT) :: CHI +TYPE(GRID_t), INTENT(INOUT) :: GK +TYPE(ISBA_PE_t), INTENT(INOUT) :: PEK +! +!* 0.1 declaration of arguments +! +INTEGER, INTENT(IN) :: KYEAR ! I current year (UTC) +INTEGER, INTENT(IN) :: KMONTH ! I current month (UTC) +INTEGER, INTENT(IN) :: KDAY ! I current day (UTC) +REAL, INTENT(IN) :: PTIME ! I current time since midnight (UTC, s) +LOGICAL, INTENT(IN) :: OTR_ML ! new radiation for leaves temperatures +! +REAL, DIMENSION(:), INTENT(IN) :: PTEMP ! I Air temperature (K) +REAL, DIMENSION(:,:),INTENT(IN) :: PIACAN ! I PAR (umol/m2.s) +REAL, DIMENSION(:), INTENT(IN) :: PLEAFT ! I Leaf temperature (K) +REAL, DIMENSION(:), INTENT(IN) :: PRN_SUNLIT! I Leaf RN +REAL, DIMENSION(:), INTENT(IN) :: PRN_SHADE ! I Leaf RN +REAL, DIMENSION(:), INTENT(IN) :: PWIND +REAL, DIMENSION(:), INTENT(IN) :: PPRES ! I Atmospheric pressure (Pa) +REAL, DIMENSION(:), INTENT(IN) :: PQV ! I Air humidity (kg/kg) +REAL, DIMENSION(:,:),INTENT(IN) :: PPFT, PEF +INTEGER, DIMENSION(:), INTENT(IN) :: KSLTYP +REAL, DIMENSION(:,:), INTENT(INOUT) :: PSFTS ! O Scalar flux in molecules/m2/s +#ifdef MNH_MEGAN +!* 0.1 Declaration of local variables +! +INTEGER, PARAMETER :: NROWS = 1 +INTEGER :: ITIME ! Time of the day HHMMSS +INTEGER :: IDATE ! Date YYYYDDD +INTEGER :: IDAY ! julian day +REAL :: ZHOUR, ZMIN, ZSEC ! conversion ptime to itime format +REAL, DIMENSION(SIZE(PTEMP)) :: ZLAIC ! Current monthly LAI +REAL, DIMENSION(SIZE(PTEMP)) :: ZPFD ! Calculated PAR (umol/m2.s) +REAL, DIMENSION(SIZE(PTEMP)) :: ZLSUT ! Leaf on sun temperature (K) +REAL, DIMENSION(SIZE(PTEMP)) :: ZLSHT ! Leaf on shade temperature (K) +REAL, DIMENSION(SIZE(PTEMP)) :: ZRN +REAL, DIMENSION(SIZE(PTEMP)) :: ZCFNO ! NO correction factor +REAL, DIMENSION(SIZE(PTEMP)) :: ZCFNOG ! NO correction factor for grass +REAL, DIMENSION(N_MGN_SPC,SIZE(PTEMP)) :: ZCFSPEC ! Output emission buffer +REAL, DIMENSION(MGN%NVARS3D,SIZE(PTEMP)) :: ZFLUX ! Output emission megan flux +! +REAL :: ZDI ! Drought Index (0 normal, -2 moderate drought, -3 severe drought, -4 extreme drought) +REAL :: ZREC_ADJ ! Rain adjustment factor +REAL :: ZD_TEMP ! Daily temperature (K) +REAL :: ZD_PPFD ! Daily PAR (umol/m2.s) +! +INTEGER,DIMENSION(SIZE(PTEMP)) :: ISLTYP !Soil category (function of silt, clay and sand)) +INTEGER :: JSV, JSM +! +! Input parameters +ZHOUR = FLOAT(INT(PTIME/3600.)) +ZMIN = FLOAT(INT((PTIME - ZHOUR*3600) / 60.)) +ZSEC = FLOAT(INT(PTIME - ZHOUR*3600. - ZMIN * 60.)) +ITIME = INT(ZHOUR)*10000 + INT(ZMIN)*100 + ZSEC +IDAY = JULIAN(KYEAR, KMONTH, KDAY) +IDATE = KYEAR*1000 + IDAY +! +! current = previous pour le LAI, a modifier si CPHOTO=LAI (evolutif) +ZLAIC(:) = MIN(MAX(0.001,PEK%XLAI(:)),8.) +! +ZDI = MGN%XDROUGHT +ZREC_ADJ = MGN%XMODPREC +ZD_TEMP = MGN%XDAILYTEMP +ZD_PPFD = MGN%XDAILYPAR +! +ZCFNO = 0. +ZCFNOG = 0. +ZCFSPEC = 0. +! +ZPFD(:) = 0. +! Compute PAR from the entire canopy +DO JSM = 1,SIZE(PIACAN,2) + ZPFD(:) = ZPFD(:) + PIACAN(:, JSM) +END DO +! Test car PIACAN prends des valeurs non physiques au lever du soleil +WHERE (ZPFD(:) .GT. 2000.) ZPFD(:) = 0. +! +! compute sun and shade leaf temperature upon RN_SHADE and RN_SUNLIT +! thanks to D. Carrer +! +ZLSUT(:) = PTEMP(:) + 3. +ZLSHT(:) = PTEMP(:) +! +IF (OTR_ML) THEN + ! + ZRN(:) = PRN_SUNLIT(:)**2 + PRN_SHADE(:)**2 + ! + WHERE ( ZRN(:).NE.0. ) + ! for sun leaves + ZLSUT(:) = PLEAFT(:) * PRN_SUNLIT(:) * (PRN_SUNLIT(:)+PRN_SHADE(:))/ZRN(:) + ! for shade leaves + ZLSHT(:) = PLEAFT(:) * PRN_SHADE (:) * (PRN_SUNLIT(:)+PRN_SHADE(:))/ZRN(:) + END WHERE + ! +END IF +! +! MEGAN : calcul des facteurs d'ajustement et de perte dans la canopée. +! ZCFSPEC: classe de sorties MEGAN (voir SPC_NOCONVER.EXT) +! 1: ISOP isoprene +! 2: MYRC myrcene +! 3: SABI sabinene +! 4: LIMO limonene +! 5: A_3CAR carene_3 +! 6: OCIM ocimene_t_b +! 7: BPIN pinene_b +! 8: APIN pinene_a +! 9: OMTP A_2met_styrene + cymene_p + cymene_o + phellandrene_a + thujene_a + terpinene_a +! + terpinene_g + terpinolene + phellandrene_b + camphene + bornene + fenchene_a +! + ocimene_al + .... +! 10: FARN +! 11: BCAR +! 12: OSQT +! 13: MBO +! 14: MEOH +! 15: ACTO +! 16: CO +! 17: NO +! 18: BIDER +! 19: STRESS +! 20: OTHER +! +CALL EMPROC(ITIME, IDATE, ZD_PPFD, ZD_TEMP, ZDI, ZREC_ADJ, & + GK%XLAT, GK%XLON, ZLAIC, ZLAIC, PTEMP, & + ZPFD, PWIND, PPRES, PQV, KSLTYP, & + PEK%XWG(:,1), PEK%XTG(:,1), PPFT, & + CHI%LSOILNOX, ZCFNO, ZCFNOG, ZCFSPEC) +! +! MEGAN : calcul des flux d'émission +! Dans cette partie du programme les sorties des 20 catégories obtenues à l'issu de la partie +!EMPROC sont multipliées par les valeurs des facteurs d'émissions correspondants, puis converties +!en 150 espèces, et associées en différentes catégories chimiques en fonction du schéma de chimie +!atmosphérique choisi parmi RADM2, RACM, SAPRCII, SAPRC99, CBMZ, SAPRC99X, +!SAPRC99Q, CB05, CB6, SOAX . +! +CALL MGN2MECH(IDATE, GK%XLAT, PEF, PPFT, ZCFNO, ZCFNOG, ZCFSPEC, & + MGN%NSPMH_MAP, MGN%NMECH_MAP, MGN%XCONV_FAC, & + MGN%LCONVERSION, ZFLUX) +! +! Conversion ZFLUX from MEGAN mole/m2/s into molec/m2/s +ZFLUX(:,:) = ZFLUX(:,:) * XAVOGADRO +! +! Case of the same species between megan and mesonh +DO JSV=1, SIZE(CHI%SVI%CSV) + DO JSM=1, MGN%NVARS3D + IF (TRIM(CHI%SVI%CSV(JSV)) == TRIM(MGN%CVNAME3D(JSM))) THEN + PSFTS(:,JSV) = PSFTS(:,JSV) + ZFLUX(JSM,:) + END IF + END DO +END DO +! +! Case of special treatment : ReLACS 1, 2, 3 scheme or CACM scheme +! Megan conversion is upon SOAX species +IF ( TRIM(MGN%CMECHANISM)=="RELACS" ) THEN + PSFTS(:,MGN%NBIO ) = PSFTS(:,MGN%NBIO ) + ZFLUX(MGN%NISOPRENE,:) + ZFLUX(MGN%NTRP1,:) +ENDIF +! +IF ( TRIM(MGN%CMECHANISM)=="RELACS2") THEN + PSFTS(:,MGN%NORA1) = PSFTS(:,MGN%NORA1) + ZFLUX(MGN%NHCOOH,:) + PSFTS(:,MGN%NORA2) = PSFTS(:,MGN%NORA2) + ZFLUX(MGN%NCCO_OH,:) + PSFTS(:,MGN%NACID) = PSFTS(:,MGN%NACID) + ZFLUX(MGN%NRCO_OH,:) +END IF +! +IF ( TRIM(MGN%CMECHANISM)=="CACM" ) THEN + PSFTS(:,MGN%NACID) = PSFTS(:,MGN%NACID) + ZFLUX(MGN%NHCOOH,:) + ZFLUX(MGN%NCCO_OH,:) + ZFLUX(MGN%NRCO_OH,:) +ENDIF + +IF ( TRIM(MGN%CMECHANISM)=="CACM".OR.TRIM(MGN%CMECHANISM)=="RELACS2" ) THEN + PSFTS(:,MGN%NISOP) = PSFTS(:,MGN%NISOP) + ZFLUX(MGN%NISOPRENE,:) + PSFTS(:,MGN%NBIOH) = PSFTS(:,MGN%NBIOH) + 0.75*ZFLUX(MGN%NTRP1,:) + PSFTS(:,MGN%NBIOL) = PSFTS(:,MGN%NBIOL) + 0.25*ZFLUX(MGN%NTRP1,:) + PSFTS(:,MGN%NKETL) = PSFTS(:,MGN%NKETL) + ZFLUX(MGN%NACET,:) + ZFLUX(MGN%NMEK,:) + PSFTS(:,MGN%NARAL) = PSFTS(:,MGN%NARAL) + ZFLUX(MGN%NBALD,:) + PSFTS(:,MGN%NETHE) = PSFTS(:,MGN%NETHE) + ZFLUX(MGN%NETHENE,:) + PSFTS(:,MGN%NALKL) = PSFTS(:,MGN%NALKL) + ZFLUX(MGN%NALK4,:) + PSFTS(:,MGN%NALKM) = PSFTS(:,MGN%NALKM) + 0.5*ZFLUX(MGN%NALK5,:) + PSFTS(:,MGN%NALKH) = PSFTS(:,MGN%NALKH) + 0.5*ZFLUX(MGN%NALK5,:) + PSFTS(:,MGN%NAROH) = PSFTS(:,MGN%NAROH) + 0.5*ZFLUX(MGN%NARO1,:) + PSFTS(:,MGN%NAROL) = PSFTS(:,MGN%NAROL) + 0.5*ZFLUX(MGN%NARO1,:) + PSFTS(:,MGN%NAROO) = PSFTS(:,MGN%NAROO) + ZFLUX(MGN%NARO2,:) + PSFTS(:,MGN%NOLEL) = PSFTS(:,MGN%NOLEL) + 0.5*ZFLUX(MGN%NOLE1,:) + PSFTS(:,MGN%NOLEH) = PSFTS(:,MGN%NOLEH) + 0.5*ZFLUX(MGN%NOLE1,:) +END IF +! +! +#endif +END SUBROUTINE COUPLING_MEGAN_n diff --git a/src/SURFEX/init_megann.F90 b/src/SURFEX/init_megann.F90 new file mode 100644 index 0000000000000000000000000000000000000000..e4654e149343b95b7002b1189942119ca50ede36 --- /dev/null +++ b/src/SURFEX/init_megann.F90 @@ -0,0 +1,506 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ############################### +SUBROUTINE INIT_MEGAN_n(IO, S, K, NP, MSF, MGN, PLAT, HSV, PMEGAN_FIELDS) +! ############################### +!! +!!*** *BVOCEM* +!! +!! PURPOSE +!! ------- +!! Calculate the biogenic emission fluxes upon the MEGAN code +!! http://lar.wsu.edu/megan/ +!! +!! METHOD +!! ------ +!! +!! +!! AUTHOR +!! ------ +!! P. Tulet (LACy) +!! +!! MODIFICATIONS +!! ------------- +!! Original: 25/10/14 +!! Modified: 06/2017, J. Pianezze, adaptation for SurfEx v8.0 +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +! +USE MODD_MEGAN_SURF_FIELDS_n, ONLY : MEGAN_SURF_FIELDS_t +USE MODD_MEGAN_n, ONLY : MEGAN_t +! +USE MODD_ISBA_OPTIONS_n, ONLY : ISBA_OPTIONS_t +USE MODD_ISBA_n, ONLY : ISBA_S_t, ISBA_P_t, ISBA_K_t, ISBA_NP_t +! +USE MODD_DATA_COVER_PAR, ONLY : NVT_C4, NVT_TRBE, NVT_TRBD, NVT_TEBE, & + NVT_TEBD, NVT_TENE, NVT_BOBD, NVT_BONE, NVT_BOND, & + NVT_BOGR, NVT_SHRB, NVT_GRAS, NVT_TROG, NVT_C3, & + NVT_NO, NVT_ROCK, NVT_SNOW, NVT_IRR, NVT_PARK +! +USE MODD_SURF_PAR, ONLY : XUNDEF +! +USE MODI_VEGTYPE_TO_PATCH +#ifdef MNH_MEGAN +USE MODD_MEGAN +USE MODI_INIT_MGN2MECH +#endif +USE MODI_ABOR1_SFX +! +! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! ----------------- +! +IMPLICIT NONE +! +TYPE(ISBA_OPTIONS_t), INTENT(INOUT) :: IO +TYPE(ISBA_S_t), INTENT(INOUT) :: S +TYPE(ISBA_K_t), INTENT(INOUT) :: K +TYPE(ISBA_NP_t), INTENT(INOUT) :: NP +TYPE(MEGAN_SURF_FIELDS_t), INTENT(INOUT) :: MSF +TYPE(MEGAN_t), INTENT(INOUT) :: MGN +! +!* 0.1 declaration of arguments +! +REAL, DIMENSION(:), INTENT(IN) :: PLAT ! Lat of the grid cell +CHARACTER(LEN=6), DIMENSION(:),INTENT(IN) :: HSV ! name of all scalar variables +REAL, DIMENSION(:,:),INTENT(IN) :: PMEGAN_FIELDS ! EF factors +! +!* 0.1 Declaration of local variables +#ifdef MNH_MEGAN +! +INTEGER :: JI, JSV, JP +! +INTEGER:: IP_TRBE, IP_TRBD, IP_TEBE, IP_TEBD, IP_TENE, & + IP_BOBD, IP_BONE, IP_BOND, IP_SHRB +! +REAL, DIMENSION(SIZE(K%XCLAY,1),IO%NPATCH) :: ZH_TREE +REAL,DIMENSION(SIZE(K%XCLAY,1)) :: ZSILT +REAL,DIMENSION(SIZE(K%XCLAY,1)) :: ZLAI +! +IF (.NOT.IO%LTR_ML) THEN + CALL ABOR1_SFX('INIT_MEGANN: FATAL ERROR PUT LTR_ML = T in NAM_ISBA (PREP_PGD step)') +END IF +! +ALLOCATE(MGN%XPFT (N_MGN_PFT,SIZE(K%XCLAY,1))) +ALLOCATE(MGN%XEF (N_MGN_SPC,SIZE(K%XCLAY,1))) +ALLOCATE(MGN%NSLTYP (SIZE(K%XCLAY,1))) +ALLOCATE(MGN%XBIOFLX(SIZE(K%XCLAY,1))) +MGN%XBIOFLX(:) = 0. +! +! Prepare the mechanism conversion between Megan and MesoNH +MGN%CMECHANISM = "RELACS2" ! scheme default in MesoNH +! +DO JSV=1,SIZE(HSV) + IF (TRIM(HSV(JSV))=="DIEN") MGN%CMECHANISM = "RACM" + IF (TRIM(HSV(JSV))=="ALKA") MGN%CMECHANISM = "RELACS" + IF (TRIM(HSV(JSV))=="ALKA") MGN%CMECHANISM = "RELACS" + IF (TRIM(HSV(JSV))=="OLEH") MGN%CMECHANISM = "CACM" + IF (TRIM(HSV(JSV))=="URG7") MGN%CMECHANISM = "RELACS2" +END DO +! +IF (TRIM(MGN%CMECHANISM)=="RACM" .OR.TRIM(MGN%CMECHANISM)=="RADM2".OR.TRIM(MGN%CMECHANISM)=="SAPRCII" .OR.& + TRIM(MGN%CMECHANISM)=="SAPRC99" .OR.TRIM(MGN%CMECHANISM)=="CBMZ" .OR.TRIM(MGN%CMECHANISM)=="SAPRC99X".OR.& + TRIM(MGN%CMECHANISM)=="SAPRC99Q".OR.TRIM(MGN%CMECHANISM)=="CB05" .OR.TRIM(MGN%CMECHANISM)=="CB6" .OR.& + TRIM(MGN%CMECHANISM)=="SOAX") THEN + MGN%CMECHANISM2 = MGN%CMECHANISM +ELSE + MGN%CMECHANISM2 = "SAPRC99" ! megan default +END IF +! +MGN%LCONVERSION = .TRUE. +! +CALL INIT_MGN2MECH(MGN%CMECHANISM2, MGN%LCONVERSION, MGN%CVNAME3D, MGN%CMECH_SPC, MGN%NSPMH_MAP, & + MGN%NMECH_MAP, MGN%XCONV_FAC, MGN%XMECH_MWT, MGN%NVARS3D, MGN%N_SCON_SPC ) +! +DO JSV=1,SIZE(HSV) + IF (TRIM(HSV(JSV)) == "NO") MGN%NNO = JSV ! ReLACS + IF (TRIM(HSV(JSV)) == "ALD") MGN%NALD = JSV ! ReLACS + IF (TRIM(HSV(JSV)) == "BIO") MGN%NBIO = JSV ! ReLACS + IF (TRIM(HSV(JSV)) == "ALKA") MGN%NALKA = JSV ! ReLACS + IF (TRIM(HSV(JSV)) == "ALKE") MGN%NALKE = JSV ! ReLACS + IF (TRIM(HSV(JSV)) == "ARO") MGN%NARO = JSV ! ReLACS + IF (TRIM(HSV(JSV)) == "CARBO") MGN%NCARBO = JSV ! ReLACS + ! + IF (TRIM(HSV(JSV)) == "ETHE") MGN%NETHE = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "OLEL") MGN%NOLEL = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "OLEH") MGN%NOLEH = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ALKL") MGN%NALKL = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ALKM") MGN%NALKM = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ALKH") MGN%NALKH = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "AROH") MGN%NAROH = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "AROL") MGN%NAROL = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "AROO") MGN%NAROO = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "AROL") MGN%NAROL = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ARAL") MGN%NARAL = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ARAC") MGN%NARAC = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "PAH") MGN%NPAH = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ALD2") MGN%NALD2 = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "KETL") MGN%NKETL = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "KETH") MGN%NKETH = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "MEOH") MGN%NMEOH = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ETOH") MGN%NETOH = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ALCH") MGN%NALCH = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ISOP") MGN%NISOP = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "BIOL") MGN%NBIOL = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "BIOH") MGN%NBIOH = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "MTBE") MGN%NMTBE = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "MVK") MGN%NMVK = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "MCR") MGN%NMCR = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "MGLY") MGN%NMGLY = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ACID") MGN%NACID = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ORA1") MGN%NORA1 = JSV ! ReLACS2 or CACM + IF (TRIM(HSV(JSV)) == "ORA2") MGN%NORA2 = JSV ! ReLACS2 or CACM +END DO +! +DO JSV=1,SIZE(MGN%CVNAME3D) ! megan species (racm family) + IF (TRIM(MGN%CVNAME3D(JSV)) == "ISO") MGN%NISO = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "CH4") MGN%NCH4 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "ETH") MGN%NETH = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "HC3") MGN%NHC3 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "HC5") MGN%NHC5 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "HC8") MGN%NHC8 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "OL2") MGN%NOL2 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "OLI") MGN%NOLI = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "OLT") MGN%NOLT = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "ALD") MGN%NALD = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "KET") MGN%NKET = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "TOL") MGN%NTOL = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "HCHO") MGN%NHCHO = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "ORA1") MGN%NORA1 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "ORA2") MGN%NORA2 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "API") MGN%NAPI = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "LIM") MGN%NLIM = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "CO") MGN%NCO = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "SO2") MGN%NSO2 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "NO") MGN%NNO = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "HNO3") MGN%NHNO3 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "NO2") MGN%NNO2 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "NR") MGN%NNR = JSV +END DO +! +DO JSV=1,SIZE(MGN%CVNAME3D) ! megan species (soax family) + IF (TRIM(MGN%CVNAME3D(JSV)) == "ISP") MGN%NISP = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "TRP") MGN%NTRP = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "XYLA") MGN%NXYLA = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "CG5") MGN%NCG5 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "SQT") MGN%NSQT = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "TOLA") MGN%NTOLA = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "CG6") MGN%NCG6 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "CG4") MGN%NCG4 = JSV +END DO +! +DO JSV=1,SIZE(MGN%CVNAME3D) !megan species (saprc family) + IF (TRIM(MGN%CVNAME3D(JSV)) == "ISOPRENE") MGN%NISOPRENE = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "TRP1") MGN%NTRP1 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "ACET") MGN%NACET = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "MEK") MGN%NMEK = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "HCOOH") MGN%NHCOOH = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "CCO_OH") MGN%NCCO_OH = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "CCHO") MGN%NCCHO = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "RCHO") MGN%NRCHO = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "RCO_OH") MGN%NRCO_OH = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "BALD") MGN%NBALD = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "ETHENE") MGN%NETHENE = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "ALK4") MGN%NALK4 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "ALK5") MGN%NALK5 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "ARO1") MGN%NARO1 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "ARO2") MGN%NARO2 = JSV + IF (TRIM(MGN%CVNAME3D(JSV)) == "OLE1") MGN%NOLE1 = JSV +END DO +! +! Compute soil USDA type +! +! CLAY : CLAY >= 0.40 SILT < 0.40 SAND < 0.45 +! SANDY CLAY : CLAY >= 0.36 SAND >= 0.45 +! SILTY CLAY : CLAY >= 0.40 SILT >= 0.40 +! SILT : SILT >= 0.8 CLAY < 0.12 +! SAND : SAND >= 0.3*CLAY + 0.87 +! SANDY CLAY LOAM : CLAY >= 0.28 CLAY < 0.36 SAND >= 0.45 | CLAY >= 0.20 CLAY < 0.28 SILT < 0.28 +! SILTY CLAY LOAM : CLAY >= 0.28 CLAY < 0.40 SAND < 0.20 +! CLAY LOAM : CLAY >= 0.28 CLAY < 0.40 SAND >= 0.20 SAND < 0.45 +! SILT LOAM : SILT >= 0.8 CLAY >= 0.12 | SILT >= 0.5 SILT < 0.8 CLAY < 0.28 +! LOAMY SAND : SAND >= CLAY + 0.7 SAND < 0.3*CLAY + 0.87 +! SANDY LOAM : SAND >= 0.52 CLAY < 0.20 | SAND >= (0.5 - CLAY) CLAY < 0.07 +! LOAM : CLAY >= 0.20 CLAY < 0.28 SILT >= 0.28 SILT < 0.5 | SAND >= (0.5 - CLAY) CLAY < 0.20 +! +ZSILT(:) = 1. - K%XCLAY(:,1) - K%XSAND(:,1) +! +WHERE (ZSILT(:) <= 0.) ZSILT(:) = 0.0 +! +DO JI = 1, SIZE(K%XCLAY,1) + + IF ( K%XCLAY(JI,1)>=0.28 ) THEN + IF ( K%XSAND(JI,1)>=0.45 ) THEN + IF (K%XCLAY(JI,1)>=0.36 ) THEN ! Sandy Clay + MGN%NSLTYP(JI) = 9 + ELSE ! Sandy Clay Loam + MGN%NSLTYP(JI) = 6 + ENDIF + ELSEIF ( K%XCLAY(JI,1)>=0.40 ) THEN + IF ( ZSILT(JI)>=0.40 ) THEN ! Silty Clay + MGN%NSLTYP(JI) = 10 + ELSE ! Clay + MGN%NSLTYP(JI) = 11 + ENDIF + ELSEIF (K%XSAND(JI,1)>=0.20 ) THEN ! Clay Loam + MGN%NSLTYP(JI) = 8 + ELSE ! Silty Clay Loam + MGN%NSLTYP(JI) = 7 + ENDIF + ENDIF + ! + IF ( ZSILT(JI)>=0.8 .AND. K%XCLAY(JI,1)<0.12 ) THEN ! Silt + MGN%NSLTYP(JI) = 12 + ELSEIF ( K%XCLAY(JI,1)<0.28 ) THEN ! ( clay est forcément < 0.28 ) + IF ( ZSILT(JI) >= 0.5 ) THEN ! Silt Loam + MGN%NSLTYP(JI) = 4 + ELSEIF ( K%XCLAY(JI,1)>=0.20 ) THEN + IF ( ZSILT(JI)>=0.28 ) THEN ! Loam + MGN%NSLTYP(JI) = 5 + ELSE ! Sandy Clay Loam + MGN%NSLTYP(JI) = 6 + ENDIF + ENDIF + ENDIF + ! + IF ( K%XSAND(JI,1)>=(0.3*K%XCLAY(JI,1) + 0.87) ) THEN ! Sand + MGN%NSLTYP(JI) = 1 + ELSEIF ( K%XSAND(JI,1)>=(K%XCLAY(JI,1) + 0.7) ) THEN ! Loamy Sand + MGN%NSLTYP(JI) = 2 + ELSEIF ( K%XSAND(JI,1)>=0.52 .AND. K%XCLAY(JI,1)<0.20 ) THEN ! Sandy Loam + MGN%NSLTYP(JI) = 3 + ELSEIF ( K%XSAND(JI,1)>=(0.5 - K%XCLAY(JI,1)) ) THEN + IF ( K%XCLAY(JI,1)<0.07 ) THEN ! Sandy Loam + MGN%NSLTYP(JI) = 3 + ELSEIF ( K%XCLAY(JI,1)<0.20 ) THEN ! Loam + MGN%NSLTYP(JI) = 5 + ENDIF + ENDIF + ! +ENDDO +! +! Passage des type de végétation isba/vegtype avec ceux de Megan +! +IP_TRBE = VEGTYPE_TO_PATCH(NVT_TRBE, IO%NPATCH) +IP_TRBD = VEGTYPE_TO_PATCH(NVT_TRBD, IO%NPATCH) +IP_TEBE = VEGTYPE_TO_PATCH(NVT_TEBE, IO%NPATCH) +IP_TEBD = VEGTYPE_TO_PATCH(NVT_TEBD, IO%NPATCH) +IP_TENE = VEGTYPE_TO_PATCH(NVT_TENE, IO%NPATCH) +IP_BOBD = VEGTYPE_TO_PATCH(NVT_BOBD, IO%NPATCH) +IP_BONE = VEGTYPE_TO_PATCH(NVT_BONE, IO%NPATCH) +IP_BOND = VEGTYPE_TO_PATCH(NVT_BOND, IO%NPATCH) +IP_SHRB = VEGTYPE_TO_PATCH(NVT_SHRB, IO%NPATCH) +! +MGN%XPFT(:,:) = 0. +! +ZH_TREE(:,:) = XUNDEF +DO JP = 1,IO%NPATCH + DO JI = 1,NP%AL(JP)%NSIZE_P + ZH_TREE(NP%AL(JP)%NR_P(JI),JP) = NP%AL(JP)%XH_TREE(JI) + ENDDO +ENDDO +! +! 1 Needleleaf evergreen temperate tree +! ------------------------------------- +! utilisation de la classe NVT_CONI pour 30 < LAT < 60 +WHERE ((PLAT(:) .GE. 30.) .AND. (PLAT(:) .LT. 60.)) + MGN%XPFT(1,:) = S%XVEGTYPE(:,NVT_TENE) +END WHERE +WHERE ((PLAT(:) .LE. -30.) .AND. (PLAT(:) .GT. -60.)) + MGN%XPFT(1,:) = S%XVEGTYPE(:,NVT_TENE) +END WHERE +! +! 2 Needleleaf evergreen boreal tree +! ------------------------------------- +!utilisation de la classe NVT_CONI pour LAT > 60 +WHERE ((PLAT(:) .GE. 60.) .OR. (PLAT(:) .LE. -60.)) + MGN%XPFT(2,:) = S%XVEGTYPE(:,NVT_BONE) +END WHERE +! +!3 Needleleaf deciduous boreal tree +! ------------------------------------- +!utilisation de la classe NVT_TREE pour LAT > 60 +WHERE ((PLAT(:) .GE. 60.) .OR. (PLAT(:) .LE. -60.)) + MGN%XPFT(3,:) = S%XVEGTYPE(:,NVT_BOND) +END WHERE +! +!4 Broadleaf evergreen tropical tree +! ------------------------------------- +!utilisation de la classe NVT_EVER pour -30 < LAT < 30 +! et une hauteur d'arbre supérieur à 3 m +WHERE (((PLAT(:) .GE. -30.) .AND. (PLAT(:) .LE. 30.)).AND.& + (ZH_TREE(:,IP_TRBE) .GE. 3.).AND.(ZH_TREE(:,IP_TRBE) .NE. XUNDEF)) +MGN%XPFT(4,:) = S%XVEGTYPE(:,NVT_TRBE) +END WHERE +! +!5 Broadleaf evergreen temperate tree +! ------------------------------------- +! utilisation de la classe NVT_EVER pour 30 < LAT < 60 +! et une hauteur d'arbre supérieur à 3 m. +WHERE (((PLAT(:) .GE. 30.) .AND. (PLAT(:) .LT. 60.)).AND.& + (ZH_TREE(:,IP_TEBE) .GE. 3.).AND.(ZH_TREE(:,IP_TEBE) .NE. XUNDEF)) +MGN%XPFT(5,:) = S%XVEGTYPE(:,NVT_TEBE) +END WHERE +WHERE (((PLAT(:) .LE. -30.) .AND. (PLAT(:) .GT. -60.)).AND.& + (ZH_TREE(:,IP_TEBE) .GE. 3.).AND.(ZH_TREE(:,IP_TEBE) .NE. XUNDEF)) +MGN%XPFT(5,:) = S%XVEGTYPE(:,NVT_TEBE) +END WHERE +! +!6 Broadleaf deciduous tropical tree +! ------------------------------------- +!utilisation de la classe NVT_TREE pour -30 < LAT < 30 +WHERE ((PLAT(:) .GE. -30.) .AND. (PLAT(:) .LE. 30.)) +MGN%XPFT(6,:) = S%XVEGTYPE(:,NVT_TRBD) +END WHERE +! +!7 Broadleaf deciduous temperate tree +! ------------------------------------- +!utilisation de la classe NVT_TREE pour 30 < LAT < 60 +! en utilisant une hauteur d'arbre supérieur à 3 m +WHERE (((PLAT(:) .GE. 30.) .AND. (PLAT(:) .LT. 60.)).AND.& + (ZH_TREE(:,IP_TEBD) .GE. 3.).AND.(ZH_TREE(:,IP_TEBD) .NE. XUNDEF)) +MGN%XPFT(7,:) = S%XVEGTYPE(:,NVT_TEBD) +END WHERE +WHERE (((PLAT(:) .LE. -30.) .AND. (PLAT(:) .GT. -60.)).AND.& + (ZH_TREE(:,IP_TEBD) .GE. 3.).AND.(ZH_TREE(:,IP_TEBD) .NE. XUNDEF)) +MGN%XPFT(7,:) = S%XVEGTYPE(:,NVT_TEBD) +END WHERE +! +!8 Broadleaf deciduous boreal tree +! ------------------------------------- +!utilisation de la classe NVT_TREE pour LAT > 60 +WHERE (((PLAT(:) .GE. 60.) .OR. (PLAT(:) .LE. -60.)).AND.& + (ZH_TREE(:,IP_BOBD) .GE. 3.).AND.(ZH_TREE(:,IP_BOBD) .NE. XUNDEF)) +MGN%XPFT(8,:) = S%XVEGTYPE(:,NVT_BOBD) +END WHERE +! +!9 Broadleaf evergreen shrub +! ------------------------------------- +!utilisation de la classe NVT_EVER pour une hauteur d'arbre inférieure à 3 m +WHERE (ZH_TREE(:,IP_SHRB) .LT. 3.) +MGN%XPFT(9,:) = S%XVEGTYPE(:,NVT_SHRB) +END WHERE +! +!10 Broadleaf deciduous temperate shrub +! ------------------------------------- +!utilisation de la classe NVT_TREE pour une hauteur d'arbre inférieure à 3 m +! et pour 30 < LAT < 60 +WHERE ((ZH_TREE(:,IP_SHRB) .LT. 3.) .AND. (ZH_TREE(:,IP_SHRB).NE. XUNDEF) .AND. & + ((PLAT(:) .GE. 30.) .AND. (PLAT(:) .LT. 60.))) +MGN%XPFT(10,:) = S%XVEGTYPE(:,NVT_SHRB) +END WHERE +WHERE ((ZH_TREE(:,IP_SHRB) .LT. 3.) .AND. (ZH_TREE(:,IP_SHRB).NE. XUNDEF) .AND. & + ((PLAT(:) .LE. -30.) .AND. (PLAT(:) .GT. -60.))) +MGN%XPFT(10,:) = S%XVEGTYPE(:,NVT_SHRB) +END WHERE +! +!11 Broadleaf deciduous boreal_shrub +! ------------------------------------- +!utilisation de la classe NVT_TREE pour une hauteur d'arbre inférieure à 3 m +! et pour LAT > 60 +WHERE ((ZH_TREE(:,IP_SHRB) .LT. 3.) .AND. (ZH_TREE(:,IP_SHRB).NE. XUNDEF) .AND. & + ((PLAT(:) .GE. 60.) .OR. (PLAT(:) .LE. -60.))) +MGN%XPFT(11,:) = S%XVEGTYPE(:,NVT_SHRB) +END WHERE +! +!12 C3 arctic grass +! ------------------------------------- +!utilisation de la classe NVT_GRAS + NVT_PARK pour LAT > 60 +WHERE ((PLAT(:) .GE. 60.) .OR. (PLAT(:) .LE. -60.)) +MGN%XPFT(12,:) = S%XVEGTYPE(:,NVT_GRAS) + S%XVEGTYPE(:,NVT_PARK) +ELSEWHERE +! +!13 C3 non-arctic grass +! ------------------------------------- +!utilisation de la classe NVT_GRAS + NVT_PARK ailleur +MGN%XPFT(13,:) = S%XVEGTYPE(:,NVT_GRAS) + S%XVEGTYPE(:,NVT_PARK) +END WHERE +! +!14 C4 grass +! ------------------------------------- +! utilisation de la classe NVT_TROG +MGN%XPFT(14,:) = S%XVEGTYPE(:,NVT_TROG) +! +!15 Corn +! ------------------------------------- +! utilisation de la classe NVT_C4 +MGN%XPFT(15,:) = S%XVEGTYPE(:,NVT_C4) +! +!16 Wheat +! ------------------------------------- +! utilisation de la classe NVT_C3 +MGN%XPFT(16,:) = S%XVEGTYPE(:,NVT_C3) +! +! Emission factor +MGN%XEF(:,:) = 0. +! +! Default values +! 1: ISOP isoprene +MGN%XEF(1,:) = 6000. +! 2: MYRC myrcene +MGN%XEF(2,:) = 20. +! 3: SABI sabinene +MGN%XEF(3,:) = 300. +! 4: LIMO limonene +MGN%XEF(4,:) = 80. +! 5: A_3CAR carene_3 +MGN%XEF(5,:) = 40. +! 6: OCIM ocimene_t_b +MGN%XEF(6,:) = 40. +! 7: BPIN pinene_b +MGN%XEF(7,:) = 125. +! 8: APIN pinene_a +MGN%XEF(8,:) = 300. +! 9: OMTP A_2met_styrene + cymene_p + cymene_o + phellandrene_a + thujene_a + terpinene_a +! + terpinene_g + terpinolene + phellandrene_b + camphene + bornene + fenchene_a +! + ocimene_al + .... +! 10: FARN +! 11: BCAR +! 12: OSQT +! 13: MBO +! 14: MEOH +! 15: ACTO +! 16: CO +! 17: NO +!MGN%XEF(17,:,1) = 30. +! 18: BIDER +! 19: STRESS +! 20: OTHER +! Values from the megan maps fields (to be introduced at the PREP_PGD step - nameliste PRE_PGD1.nam) +DO JSV=1, MSF%NMEGAN_NBR + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFISOP") MGN%XEF(1,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFMYRC") MGN%XEF(2,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFSABI") MGN%XEF(3,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFLIMO") MGN%XEF(4,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFCARE") MGN%XEF(5,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFOCIM") MGN%XEF(6,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFBPIN") MGN%XEF(7,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFAPIN") MGN%XEF(8,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFOMTP") MGN%XEF(9,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFFARN") MGN%XEF(10,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFBCAR") MGN%XEF(11,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFOSQT") MGN%XEF(12,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFMBO") MGN%XEF(13,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFMEOH") MGN%XEF(14,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFACTO") MGN%XEF(15,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFCO") MGN%XEF(16,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFNO") MGN%XEF(17,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFBIDER") MGN%XEF(18,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFSTRESS") MGN%XEF(19,:) = PMEGAN_FIELDS(:,JSV) + IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "EFOTHER") MGN%XEF(20,:) = PMEGAN_FIELDS(:,JSV) +END DO +#endif +! +!--------------------------------------------------------------------------- +! +END SUBROUTINE INIT_MEGAN_n + diff --git a/src/SURFEX/modd_megan_surf_fieldsn.F90 b/src/SURFEX/modd_megan_surf_fieldsn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..165775020c0e9bcd3b15b4b49a1653aa5bcd543d --- /dev/null +++ b/src/SURFEX/modd_megan_surf_fieldsn.F90 @@ -0,0 +1,74 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! #################### + MODULE MODD_MEGAN_SURF_FIELDS_n +! #################### +! +!!**** *MODD_MEGAN_SURF_FIELDS* - declaration of megan physiographic data arrays +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to specify the +! megan physiographic data arrays. +! +!! +!! AUTHOR +!! ------ +!! P. Tulet & M. Leriche *LACy & LA* +!! +!! MODIFICATIONS +!! ------------- +!! Original 06/2017 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE + +TYPE MEGAN_SURF_FIELDS_t +! + INTEGER :: NMEGAN_NBR +! ! number of megan pgd fields chosen by user + CHARACTER(LEN=3) , DIMENSION(:), POINTER :: CMEGAN_AREA +! ! areas where megan pgd fields are defined +! ! 'ALL' : everywhere +! ! 'SEA' : where sea exists +! ! 'LAN' : where land exists +! ! 'WAT' : where inland water exists +! ! 'NAT' : where natural or agricultural areas exist +! ! 'TWN' : where town areas exist +! ! 'STR' : where streets are present +! ! 'BLD' : where buildings are present +! ! + CHARACTER(LEN=20), DIMENSION(:), POINTER :: CMEGAN_NAME +! ! name of the megan pgd fields (for information) + REAL, DIMENSION(:,:), POINTER :: XMEGAN_FIELDS +! ! megan pgd fields themselves +! +!------------------------------------------------------------------------------- +! +END TYPE MEGAN_SURF_FIELDS_t + + CONTAINS +! +! +SUBROUTINE MEGAN_SURF_FIELDS_INIT(YMEGAN_SURF_FIELDS) +TYPE(MEGAN_SURF_FIELDS_t), INTENT(INOUT) :: YMEGAN_SURF_FIELDS +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK("MODD_MEGAN_SURF_FIELDS_N:MEGAN_SURF_FIELDS_INIT",0,ZHOOK_HANDLE) +NULLIFY(YMEGAN_SURF_FIELDS%CMEGAN_NAME) +NULLIFY(YMEGAN_SURF_FIELDS%CMEGAN_AREA) +NULLIFY(YMEGAN_SURF_FIELDS%XMEGAN_FIELDS) +YMEGAN_SURF_FIELDS%NMEGAN_NBR=0 +IF (LHOOK) CALL DR_HOOK("MODD_MEGAN_SURF_FIELDS_N:MEGAN_SURF_FIELDS_INIT",1,ZHOOK_HANDLE) +END SUBROUTINE MEGAN_SURF_FIELDS_INIT + + +END MODULE MODD_MEGAN_SURF_FIELDS_n diff --git a/src/SURFEX/modd_megann.F90 b/src/SURFEX/modd_megann.F90 new file mode 100644 index 0000000000000000000000000000000000000000..25702d033b72cedd26ba9206b71617c6045379fe --- /dev/null +++ b/src/SURFEX/modd_megann.F90 @@ -0,0 +1,195 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ##################### + MODULE MODD_MEGAN_n +! ###################### +! +!! +!! PURPOSE +!! ------- +! +! +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +! +!! AUTHOR +!! ------ +!! P. Tulet *LACy +!! +!! MODIFICATIONS +!! ------------- +!! 16/07/2003 (P. Tulet) restructured for externalization +!! 24/05/2017 (J. Pianezze) adaptation for SurfEx v8.0 +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! ------------ +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +TYPE MEGAN_t +! + INTEGER :: NBIO, NALKA, NALKE, NARO, NCARBO, NETHE, NOLEL, NOLEH, & + NALKL, NALKM, NALKH, NAROH, NAROO, NAROL, NARAL, NSO, & + NARAC, NPAH, NALD2, NKETL, NKETH, NMEOH, NETOH, NALCH, & + NISOP, NBIOL, NBIOH, NMTBE, NMVK, NMCR, NMGLY, NISO, & + NCH4, NETH, NHC3, NHC5, NHC8, NOL2, NOLI, NOLT, NALD, & + NKET, NTOL, NHCHO, NORA1, NORA2, NAPI, NLIM, NCO, & + NSO2, NNO, NHNO3, NNO2, NNR, N3CAR, NACTA, NACTO, & + NAPIN, NFORM, NBPIN, NMYRC, NOCIM, NOMTP, NSABI, & + NISP, NTRP, NXYLA, NCG5, NSQT, NTOLA, NCG6, NCG4, & + NISOPRENE, NTRP1, NACET, NMEK, NHCOOH, NCCO_OH, & + NCCHO, NRCHO, NRCO_OH, NBALD, NETHENE, NALK4, NALK5, & + NARO1, NARO2, NOLE1, NACID +! + CHARACTER(LEN=16) :: CMECHANISM ! name of the MesoNH chemical scheme + CHARACTER(LEN=16) :: CMECHANISM2 ! name of the MEGAN scheme used for conversion + LOGICAL :: LCONVERSION ! flag for the MEGAN output species (speciation on scheme or not) + INTEGER :: NVARS3D, N_SCON_SPC ! number of megan and chemical scheme species + REAL :: XDROUGHT ! Drought Index + REAL :: XDAILYPAR ! Mean daily PAR + REAL :: XDAILYTEMP ! Mean daily temperature (K) + REAL :: XMODPREC ! Precipitation correction factor (megan) + REAL, POINTER, DIMENSION(:,:) :: XEF ! efficiency factor + REAL, POINTER, DIMENSION(:,:) :: XPFT ! PFT factor (veg type) + INTEGER, POINTER, DIMENSION(:) :: NSLTYP ! USDA soil number category + CHARACTER(LEN=16), POINTER, DIMENSION(:) :: CVNAME3D ! name of the scheme species + CHARACTER(LEN=16), POINTER, DIMENSION(:) :: CMECH_SPC ! name of the scheme species + INTEGER, POINTER, DIMENSION(:) :: NSPMH_MAP ! index map of the scheme species + INTEGER, POINTER, DIMENSION(:) :: NMECH_MAP ! index map the mecanisum species + REAL, POINTER, DIMENSION(:) :: XCONV_FAC ! conversion factor of species + REAL, POINTER, DIMENSION(:) :: XMECH_MWT ! molecular weight of species + REAL, POINTER, DIMENSION(:) ::XBIOFLX ! molecular weight of species +! +END TYPE MEGAN_t + + CONTAINS +! +SUBROUTINE MEGAN_INIT(YMEGAN) +TYPE(MEGAN_t), INTENT(INOUT) :: YMEGAN +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK("MODD_MEGAN_n:MEGAN_INIT",0,ZHOOK_HANDLE) +NULLIFY(YMEGAN%XEF) +NULLIFY(YMEGAN%XPFT) +NULLIFY(YMEGAN%NSLTYP) +NULLIFY(YMEGAN%CVNAME3D) +NULLIFY(YMEGAN%CMECH_SPC) +NULLIFY(YMEGAN%NSPMH_MAP) +NULLIFY(YMEGAN%NMECH_MAP) +NULLIFY(YMEGAN%XCONV_FAC) +NULLIFY(YMEGAN%XMECH_MWT) +NULLIFY(YMEGAN%XBIOFLX) +YMEGAN%NBIO=0 +YMEGAN%NALKA=0 +YMEGAN%NALKE=0 +YMEGAN%NARO=0 +YMEGAN%NCARBO=0 +YMEGAN%NETHE=0 +YMEGAN%NOLEL=0 +YMEGAN%NOLEH=0 +YMEGAN%NALKL=0 +YMEGAN%NALKM=0 +YMEGAN%NALKH=0 +YMEGAN%NAROH=0 +YMEGAN%NAROO=0 +YMEGAN%NAROL=0 +YMEGAN%NARAL=0 +YMEGAN%NSO=0 +YMEGAN%NARAC=0 +YMEGAN%NPAH=0 +YMEGAN%NALD2=0 +YMEGAN%NKETL=0 +YMEGAN%NKETH=0 +YMEGAN%NMEOH=0 +YMEGAN%NETOH=0 +YMEGAN%NALCH=0 +YMEGAN%NISOP=0 +YMEGAN%NBIOL=0 +YMEGAN%NBIOH=0 +YMEGAN%NMTBE=0 +YMEGAN%NMVK=0 +YMEGAN%NMCR=0 +YMEGAN%NMGLY=0 +YMEGAN%NISO=0 +YMEGAN%NCH4=0 +YMEGAN%NETH=0 +YMEGAN%NHC3=0 +YMEGAN%NHC5=0 +YMEGAN%NHC8=0 +YMEGAN%NOL2=0 +YMEGAN%NOLI=0 +YMEGAN%NOLT=0 +YMEGAN%NALD=0 +YMEGAN%NKET=0 +YMEGAN%NTOL=0 +YMEGAN%NHCHO=0 +YMEGAN%NORA1=0 +YMEGAN%NORA2=0 +YMEGAN%NAPI=0 +YMEGAN%NLIM=0 +YMEGAN%NCO=0 +YMEGAN%NSO2=0 +YMEGAN%NNO=0 +YMEGAN%NHNO3=0 +YMEGAN%NNO2=0 +YMEGAN%NNR=0 +YMEGAN%N3CAR=0 +YMEGAN%NACTA=0 +YMEGAN%NACTO=0 +YMEGAN%NAPIN=0 +YMEGAN%NFORM=0 +YMEGAN%NBPIN=0 +YMEGAN%NMYRC=0 +YMEGAN%NOCIM=0 +YMEGAN%NOMTP=0 +YMEGAN%NSABI=0 +YMEGAN%NISP=0 +YMEGAN%NTRP=0 +YMEGAN%NXYLA=0 +YMEGAN%NCG5=0 +YMEGAN%NSQT=0 +YMEGAN%NTOLA=0 +YMEGAN%NCG6=0 +YMEGAN%NCG4=0 +YMEGAN%NISOPRENE=0 +YMEGAN%NTRP1=0 +YMEGAN%NACET=0 +YMEGAN%NMEK=0 +YMEGAN%NHCOOH=0 +YMEGAN%NCCO_OH=0 +YMEGAN%NCCHO=0 +YMEGAN%NRCHO=0 +YMEGAN%NRCO_OH=0 +YMEGAN%NBALD=0 +YMEGAN%NETHENE=0 +YMEGAN%NALK4=0 +YMEGAN%NALK5=0 +YMEGAN%NARO1=0 +YMEGAN%NARO2=0 +YMEGAN%NOLE1=0 +YMEGAN%NACID=0 +! +YMEGAN%CMECHANISM=' ' +YMEGAN%CMECHANISM2=' ' +YMEGAN%LCONVERSION=.FALSE. +YMEGAN%NVARS3D=0 +YMEGAN%N_SCON_SPC=0 +YMEGAN%XDROUGHT=0. +YMEGAN%XDAILYPAR=0. +YMEGAN%XDAILYTEMP=0. +YMEGAN%XMODPREC=0. +IF (LHOOK) CALL DR_HOOK("MODD_MEGAN_n:MEGAN_INIT",1,ZHOOK_HANDLE) +END SUBROUTINE MEGAN_INIT + + +END MODULE MODD_MEGAN_n diff --git a/src/SURFEX/pgd_megan.F90 b/src/SURFEX/pgd_megan.F90 new file mode 100644 index 0000000000000000000000000000000000000000..2da76d748a600a363121a572fa2aef7c2d5ab674 --- /dev/null +++ b/src/SURFEX/pgd_megan.F90 @@ -0,0 +1,198 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE PGD_MEGAN(DTCO, UG, U, USS, MSF, HPROGRAM, OCH_BIOEMIS) +! ############################################################## +! +!!**** *PGD_MEGAN* monitor for averaging and interpolations of physiographic fields +!! +!! PURPOSE +!! ------- +!! +!! METHOD +!! ------ +!! +! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! P. Tulet & M. Leriche *LACy & LA* +!! +!! MODIFICATION +!! ------------ +!! +!! Original 15/06/2017 +!! Modified 06/07/2017 J. Pianezze : adapatation to SurfEx v8.0 +!! +!---------------------------------------------------------------------------- +! +!* 0. DECLARATION +! ----------- +! +USE MODD_DATA_COVER_n, ONLY : DATA_COVER_t +USE MODD_SURF_ATM_GRID_n, ONLY : SURF_ATM_GRID_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +USE MODD_SSO_n, ONLY : SSO_t +USE MODD_MEGAN_SURF_FIELDS_n,ONLY : MEGAN_SURF_FIELDS_t +! +USE MODD_PGD_GRID, ONLY : NL +USE MODD_PGDWORK, ONLY : CATYPE +USE MODD_SURF_PAR, ONLY : XUNDEF +! +USE MODI_GET_LUOUT +USE MODI_PGD_FIELD +USE MODI_READ_NAM_PGD_MEGAN +USE MODI_UNPACK_SAME_RANK +USE MODI_GET_SURF_SIZE_n +! +USE MODE_POS_SURF +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declaration of arguments +! ------------------------ +! +TYPE(DATA_COVER_t), INTENT(INOUT) :: DTCO +TYPE(SURF_ATM_GRID_t), INTENT(INOUT) :: UG +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +TYPE(SSO_t), INTENT(INOUT) :: USS +TYPE(MEGAN_SURF_FIELDS_t), INTENT(INOUT) :: MSF +! +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! Type of program +LOGICAL, INTENT(OUT) :: OCH_BIOEMIS ! emission flag + +! +! +!* 0.2 Declaration of local variables +! ------------------------------ +! +INTEGER :: ILUOUT ! output listing logical unit +INTEGER :: JNBR ! loop counter on dummy fields +INTEGER :: ILU, IL_SEA, IL_LAND, IL +! +!* 0.3 Declaration of namelists +! ------------------------ +! +INTEGER :: IMEGAN_NBR +CHARACTER(LEN=20), DIMENSION(1000) :: YMEGAN_NAME +CHARACTER(LEN=3), DIMENSION(1000) :: YMEGAN_AREA +CHARACTER(LEN=3), DIMENSION(1000) :: CMEGAN_ATYPE ! avg type for dummy pgd fields +! ! 'ARI' , 'INV' +CHARACTER(LEN=28), DIMENSION(1000) :: CMEGAN_FILE ! data files +CHARACTER(LEN=6), DIMENSION(1000) :: CMEGAN_FILETYPE ! type of these files +REAL, DIMENSION(:), ALLOCATABLE :: ZMEGAN_FIELD, ZMEGAN_FIELDS +INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK +CHARACTER(LEN=6) :: YMASK +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +!* 1. Initializations of defaults +! --------------------------- +! +IF (LHOOK) CALL DR_HOOK('PGD_MEGAN',0,ZHOOK_HANDLE) + CALL GET_LUOUT(HPROGRAM,ILUOUT) +! +!------------------------------------------------------------------------------- +! +!* 2. Reading of namelist +! ------------------- +! + CALL READ_NAM_PGD_MEGAN(HPROGRAM, IMEGAN_NBR, YMEGAN_NAME, YMEGAN_AREA, & + CMEGAN_ATYPE, CMEGAN_FILE, CMEGAN_FILETYPE ) +! +MSF%NMEGAN_NBR = IMEGAN_NBR +! +ALLOCATE(MSF%CMEGAN_NAME(MSF%NMEGAN_NBR)) +ALLOCATE(MSF%CMEGAN_AREA(MSF%NMEGAN_NBR)) +MSF%CMEGAN_NAME(:) = YMEGAN_NAME(1:MSF%NMEGAN_NBR) +MSF%CMEGAN_AREA(:) = YMEGAN_AREA(1:MSF%NMEGAN_NBR) +! +!------------------------------------------------------------------------------- +! +!* 3. Allocation +! ---------- +! +ALLOCATE(MSF%XMEGAN_FIELDS(NL,MSF%NMEGAN_NBR)) + CALL GET_SURF_SIZE_n(DTCO, U,'LAND', IL_LAND) + CALL GET_SURF_SIZE_n(DTCO, U,'SEA ',IL_SEA) +! +ALLOCATE(ZMEGAN_FIELDS (NL)) +! +!------------------------------------------------------------------------------- +OCH_BIOEMIS = MSF%NMEGAN_NBR > 0 +!------------------------------------------------------------------------------- +! +! +!* 4. Computations +! ------------ +! +DO JNBR=1,MSF%NMEGAN_NBR + + CATYPE = CMEGAN_ATYPE(JNBR) + SELECT CASE (MSF%CMEGAN_AREA(JNBR)) + CASE ('LAN') + IL = IL_LAND + YMASK='LAND ' + CASE ('SEA') + IL = IL_SEA + YMASK='SEA ' + CASE ('ALL') + IL = NL + YMASK='FULL ' + CASE DEFAULT + CALL ABOR1_SFX('PGD_MEGAN (1): MEGAN AREA NOT SUPPORTED') + END SELECT + ALLOCATE(ZMEGAN_FIELD (IL)) + ALLOCATE(IMASK(IL)) +! + CALL PGD_FIELD(DTCO, UG, U, USS, & + HPROGRAM,MSF%CMEGAN_NAME(JNBR),MSF%CMEGAN_AREA(JNBR),CMEGAN_FILE(JNBR), & + CMEGAN_FILETYPE(JNBR),XUNDEF,ZMEGAN_FIELD(:) ) + CATYPE = 'ARI' +! +!* 4.2 Expends field on all surface points + ILU=0 + CALL GET_SURF_MASK_n(DTCO, U, & + YMASK,IL,IMASK,ILU,ILUOUT) + CALL UNPACK_SAME_RANK(IMASK,ZMEGAN_FIELD(:),ZMEGAN_FIELDS(:)) + DEALLOCATE(ZMEGAN_FIELD) + DEALLOCATE(IMASK) +! +!* 4.3 Weights field on all surface points +! (zero weight where field is not defined) + SELECT CASE (MSF%CMEGAN_AREA(JNBR)) + CASE ('LAN') + MSF%XMEGAN_FIELDS(:,JNBR) = (U%XNATURE(:)+U%XTOWN(:))*ZMEGAN_FIELDS(:) + CASE ('SEA') + MSF%XMEGAN_FIELDS(:,JNBR) = U%XSEA*ZMEGAN_FIELDS(:) + CASE ('ALL') + MSF%XMEGAN_FIELDS(:,JNBR) = ZMEGAN_FIELDS(:) + CASE DEFAULT + CALL ABOR1_SFX('PGD_MEGAN (2): MEGAN AREA NOT SUPPORTED') + END SELECT + +END DO + +DEALLOCATE(ZMEGAN_FIELDS) + +IF (LHOOK) CALL DR_HOOK('PGD_MEGAN',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE PGD_MEGAN diff --git a/src/SURFEX/read_megann.F90 b/src/SURFEX/read_megann.F90 new file mode 100644 index 0000000000000000000000000000000000000000..c90b18bd693254ef25ff7153e976c7315d67c95b --- /dev/null +++ b/src/SURFEX/read_megann.F90 @@ -0,0 +1,102 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE READ_MEGAN_n(MSF, U, HPROGRAM) +! ################################# +! +!!**** *READ_MEGAN_n* - routine to READ dummy surface fields +!! +!! PURPOSE +!! ------- +!! +!! AUTHOR +!! ------ +!! P. Tulet & M. Leriche *LACy & LA* +!! +!! MODIFICATIONS +!! ------------- +!! Original 06/2017 +!! Modification 07/2017 J. Pianezze adaptation to SurfEx v8 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_MEGAN_SURF_FIELDS_n, ONLY : MEGAN_SURF_FIELDS_t +USE MODD_SURF_ATM_n, ONLY : SURF_ATM_t +! +USE MODI_READ_SURF +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! +TYPE(MEGAN_SURF_FIELDS_t), INTENT(INOUT) :: MSF +TYPE(SURF_ATM_t), INTENT(INOUT) :: U +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JMEGAN ! loop counter +! + CHARACTER(LEN=20 ):: YSTRING20 ! string + CHARACTER(LEN=3 ):: YSTRING03 ! string +! +INTEGER :: IRESP ! IRESP : return-code if a problem appears + CHARACTER(LEN=LEN_HREC) :: YRECFM ! Name of the article to be read + CHARACTER(LEN=100):: YCOMMENT ! Comment string +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +!* 2. Number of dummy fields : +! ---------------------- +! +IF (LHOOK) CALL DR_HOOK('READ_MEGAN_N',0,ZHOOK_HANDLE) +! +YRECFM='MEGAN_GR_NBR' +YCOMMENT=' ' +! + CALL READ_SURF(HPROGRAM,YRECFM,MSF%NMEGAN_NBR,IRESP,HCOMMENT=YCOMMENT) +! +!------------------------------------------------------------------------------- +! +!* 3. Dummy fields : +! ------------ +! +ALLOCATE(MSF%CMEGAN_NAME(MSF%NMEGAN_NBR)) +ALLOCATE(MSF%CMEGAN_AREA(MSF%NMEGAN_NBR)) +ALLOCATE(MSF%XMEGAN_FIELDS(U%NSIZE_FULL,MSF%NMEGAN_NBR)) +MSF%CMEGAN_NAME(:) = ' ' +MSF%CMEGAN_AREA(:) = ' ' +! +! +DO JMEGAN=1,MSF%NMEGAN_NBR + ! + WRITE(YRECFM,FMT='(A8,I3.3,A1)') 'MEGAN_GR',JMEGAN,' ' + CALL READ_SURF(HPROGRAM,YRECFM,MSF%XMEGAN_FIELDS(:,JMEGAN),IRESP,HCOMMENT=YCOMMENT) + ! + ! + YSTRING20=YCOMMENT(21:40) + YSTRING03=YCOMMENT(41:43) + ! + MSF%CMEGAN_NAME(JMEGAN) = YSTRING20 + MSF%CMEGAN_AREA(JMEGAN) = YSTRING03 + WRITE(YRECFM,FMT='(A10,I2.2)') 'MEGAN_NAME',JMEGAN + CALL READ_SURF(HPROGRAM,YRECFM,MSF%CMEGAN_NAME(JMEGAN),IRESP,HCOMMENT=YCOMMENT) + ! +END DO +! +IF (LHOOK) CALL DR_HOOK('READ_MEGAN_N',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE READ_MEGAN_n diff --git a/src/SURFEX/read_nam_pgd_megan.F90 b/src/SURFEX/read_nam_pgd_megan.F90 new file mode 100644 index 0000000000000000000000000000000000000000..19f90c326d930d4e5baf542adefb7710aaf4345f --- /dev/null +++ b/src/SURFEX/read_nam_pgd_megan.F90 @@ -0,0 +1,154 @@ +!SURFEX_LIC Copyright 1994-2014 Meteo-France +!SURFEX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SURFEX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SURFEX_LIC for details. version 1. +! ######### + SUBROUTINE READ_NAM_PGD_MEGAN(HPROGRAM, KMEGAN_NBR, HMEGAN_NAME, HMEGAN_AREA, & + HMEGAN_ATYPE, HMEGAN_FILE, HMEGAN_FILETYPE ) +! ############################################################## +! +!!**** *READ_NAM_PGD_MEGAN* reads namelist NAM_MEGAN_PGD +!! +!! PURPOSE +!! ------- +!! +!! METHOD +!! ------ +!! +! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! P. Tulet & M. Leriche *LACy & LA* +!! +!! MODIFICATION +!! ------------ +!! +!! Original 06/2017 +!! +!---------------------------------------------------------------------------- +! +!* 0. DECLARATION +! ----------- +! +USE MODI_GET_LUOUT +USE MODI_OPEN_NAMELIST +USE MODI_CLOSE_NAMELIST +! +USE MODE_POS_SURF +! +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declaration of arguments +! ------------------------ +! + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! Type of program +INTEGER, INTENT(OUT) :: KMEGAN_NBR +! ! number of megan pgd fields chosen by user + CHARACTER(LEN=20), DIMENSION(1000), INTENT(OUT) :: HMEGAN_NAME +! ! name of the megan pgd fields (for information) + CHARACTER(LEN=3), DIMENSION(1000), INTENT(OUT) :: HMEGAN_AREA +! ! areas where megan pgd fields are defined +! ! 'ALL' : everywhere +! ! 'SEA' : where sea exists +! ! 'LAN' : where land exists +! ! 'WAT' : where inland water exists +! ! 'NAT' : where natural or agricultural areas exist +! ! 'TWN' : where town areas exist +! ! 'STR' : where streets are present +! ! 'BLD' : where buildings are present + CHARACTER(LEN=3), DIMENSION(1000), INTENT(OUT) :: HMEGAN_ATYPE ! avg type for megan pgd fields +! ! 'ARI' , 'INV' + CHARACTER(LEN=28), DIMENSION(1000), INTENT(OUT) :: HMEGAN_FILE ! data files + CHARACTER(LEN=6), DIMENSION(1000), INTENT(OUT) :: HMEGAN_FILETYPE ! type of these files +! +! +!* 0.2 Declaration of local variables +! ------------------------------ +! +INTEGER :: ILUOUT ! output listing logical unit +INTEGER :: ILUNAM ! namelist file logical unit +LOGICAL :: GFOUND ! flag when namelist is present +! +!* 0.3 Declaration of namelists +! ------------------------ +! +INTEGER :: NMEGAN_NBR +! ! number of megan pgd fields chosen by user + CHARACTER(LEN=20), DIMENSION(1000) :: CMEGAN_NAME +! ! name of the megan pgd fields (for information) + CHARACTER(LEN=3), DIMENSION(1000) :: CMEGAN_AREA +! ! areas where megan pgd fields are defined +! ! 'ALL' : everywhere +! ! 'SEA' : where sea exists +! ! 'LAN' : where land exists +! ! 'WAT' : where inland water exists +! ! 'NAT' : where natural or agricultural areas exist +! ! 'TWN' : where town areas exist +! ! 'STR' : where streets are present +! ! 'BLD' : where buildings are present + CHARACTER(LEN=3), DIMENSION(1000) :: CMEGAN_ATYPE ! avg type for megan pgd fields +! ! 'ARI' , 'INV' + CHARACTER(LEN=28), DIMENSION(1000) :: CMEGAN_FILE ! data files + CHARACTER(LEN=6), DIMENSION(1000) :: CMEGAN_FILETYPE ! type of these files +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +NAMELIST/NAM_MEGAN_PGD/ NMEGAN_NBR, CMEGAN_NAME, CMEGAN_AREA, & + CMEGAN_ATYPE, CMEGAN_FILE, CMEGAN_FILETYPE +!------------------------------------------------------------------------------- +! +!* 1. Initializations of defaults +! --------------------------- +! +IF (LHOOK) CALL DR_HOOK('READ_NAM_PGD_MEGAN',0,ZHOOK_HANDLE) +NMEGAN_NBR = 0 +! +CMEGAN_NAME = " " +CMEGAN_FILE = " " +CMEGAN_FILETYPE = " " +CMEGAN_AREA = "ALL" +CMEGAN_ATYPE = "ARI" +! + CALL GET_LUOUT(HPROGRAM,ILUOUT) +! +!------------------------------------------------------------------------------- +! +!* 2. Reading of namelist +! ------------------- +! + CALL OPEN_NAMELIST(HPROGRAM,ILUNAM) +! + CALL POSNAM(ILUNAM,'NAM_MEGAN_PGD',GFOUND,ILUOUT) +IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_MEGAN_PGD) +! + CALL CLOSE_NAMELIST(HPROGRAM,ILUNAM) +! +!------------------------------------------------------------------------------- +! +!* 3. Fills output arguments +! ---------------------- +! +KMEGAN_NBR = NMEGAN_NBR +HMEGAN_NAME(:) = CMEGAN_NAME(:) +HMEGAN_AREA(:) = CMEGAN_AREA(:) +HMEGAN_ATYPE(:) = CMEGAN_ATYPE(:) +HMEGAN_FILE(:) = CMEGAN_FILE(:) +HMEGAN_FILETYPE(:) = CMEGAN_FILETYPE(:) +IF (LHOOK) CALL DR_HOOK('READ_NAM_PGD_MEGAN',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE READ_NAM_PGD_MEGAN diff --git a/src/SURFEX/writesurf_megann.F90 b/src/SURFEX/writesurf_megann.F90 new file mode 100644 index 0000000000000000000000000000000000000000..830250d1858d9d18ff1d752c52f7847f13f00ae4 --- /dev/null +++ b/src/SURFEX/writesurf_megann.F90 @@ -0,0 +1,89 @@ +!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence +!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!SFX_LIC for details. version 1. +! ######### + SUBROUTINE WRITESURF_MEGAN_n(HSELECT, MSF, HPROGRAM) +! ########################################## +! +!!**** *WRITESURF_MEGAN_n* - routine to write dummy surface fields +!! +!! PURPOSE +!! ------- +!! +!! AUTHOR +!! ------ +!! P. Tulet & M. Leriche *LACy & LA* +!! +!! MODIFICATIONS +!! ------------- +!! Original 06/2017 +!! J. Pianezze 07/2017 adapatation tu SurfEx v8.0 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_MEGAN_SURF_FIELDS_n, ONLY : MEGAN_SURF_FIELDS_t +! +USE MODI_WRITE_SURF +! +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE PARKIND1 ,ONLY : JPRB +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! ------------------------- +! + CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT +TYPE(MEGAN_SURF_FIELDS_t), INTENT(INOUT) :: MSF + CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JMEGAN ! loop counter +! +CHARACTER(LEN=20) :: YSTRING20 ! string +CHARACTER(LEN=3 ) :: YSTRING03 ! string +! +INTEGER :: IRESP ! IRESP : return-code if a problem appears +CHARACTER(LEN=LEN_HREC) :: YRECFM ! Name of the article to be read +CHARACTER(LEN=100):: YCOMMENT ! Comment string +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!------------------------------------------------------------------------------- +! +!* 1. Number of megan fields : +! ---------------------- +! +IF (LHOOK) CALL DR_HOOK('WRITESURF_MEGAN_N',0,ZHOOK_HANDLE) +! +YRECFM='MEGAN_GR_NBR' +YCOMMENT=' ' +! + CALL WRITE_SURF(HSELECT,HPROGRAM,YRECFM,MSF%NMEGAN_NBR,IRESP,HCOMMENT=YCOMMENT) +! +!------------------------------------------------------------------------------- +! +!* 2. MEGAN fields : +! ------------ +! +DO JMEGAN=1,MSF%NMEGAN_NBR + ! + WRITE(YRECFM,'(A8,I3.3,A1)') 'MEGAN_GR',JMEGAN,' ' + YSTRING20=MSF%CMEGAN_NAME(JMEGAN) + YSTRING03=MSF%CMEGAN_AREA(JMEGAN) + YCOMMENT='X_Y_'//YRECFM//YSTRING20//YSTRING03// & + ' ' + CALL WRITE_SURF(HSELECT,HPROGRAM,YRECFM,MSF%XMEGAN_FIELDS(:,JMEGAN),IRESP,HCOMMENT=YCOMMENT) + + WRITE(YRECFM,'(A10,I2.2)') 'MEGAN_NAME',JMEGAN + CALL WRITE_SURF(HSELECT, HPROGRAM,YRECFM,MSF%CMEGAN_NAME(JMEGAN),IRESP,HCOMMENT=YCOMMENT) +END DO +IF (LHOOK) CALL DR_HOOK('WRITESURF_MEGAN_N',1,ZHOOK_HANDLE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE WRITESURF_MEGAN_n