From 3afef857e6398e06f19407246aa705b734d1adc6 Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Tue, 4 Jan 2022 17:05:10 +0100
Subject: [PATCH] P.Tulet 04/01/2022: update Megan PFT with Ecoclimap-SG

---
 src/SURFEX/init_megann.F90 | 102 +++++++++++--------------------------
 1 file changed, 29 insertions(+), 73 deletions(-)

diff --git a/src/SURFEX/init_megann.F90 b/src/SURFEX/init_megann.F90
index ee3b097f8..cfb05aecf 100644
--- a/src/SURFEX/init_megann.F90
+++ b/src/SURFEX/init_megann.F90
@@ -26,6 +26,7 @@ SUBROUTINE INIT_MEGAN_n(IO, S, K, NP, MSF, MGN, PLAT, HSV, PMEGAN_FIELDS)
 !!    Original: 25/10/14
 !!    Modified: 06/2017, J. Pianezze, adaptation for SurfEx v8.0
 !!    Modified: 06/2018, P. Tulet,  add PFT and LAI
+!!    Modified: 11/2021, P. Tulet,  update PFT with Ecoclimap-SG
 !!
 !!
 !!    EXTERNAL
@@ -40,10 +41,7 @@ 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_DATA_COVER_PAR
 !
 USE MODD_SURF_PAR,   ONLY : XUNDEF
 USE MODD_DATA_COVER, ONLY : XDATA_LAI
@@ -94,6 +92,7 @@ REAL,DIMENSION(SIZE(K%XCLAY,1)) :: ZLAI
 !
 ALLOCATE(MGN%XPFT   (N_MGN_PFT,SIZE(K%XCLAY,1)))
 ALLOCATE(MGN%XEF    (N_MGN_SPC,SIZE(K%XCLAY,1)))
+ALLOCATE(MGN%XLAI   (SIZE(K%XCLAY,1)))
 ALLOCATE(MGN%NSLTYP (SIZE(K%XCLAY,1)))
 ALLOCATE(MGN%XBIOFLX(SIZE(K%XCLAY,1)))
 MGN%XBIOFLX(:) = 0.
@@ -313,134 +312,91 @@ 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
+! utilisation de la classe NVT_TENE 
+MGN%XPFT(1,:) = S%XVEGTYPE(:,NVT_TENE)
 !
 ! 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
+!utilisation de la classe NVT_BONE 
+MGN%XPFT(2,:) = S%XVEGTYPE(:,NVT_BONE)
 !
 !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
+!utilisation de la classe NVT_BOND 
+MGN%XPFT(3,:) = S%XVEGTYPE(:,NVT_BOND)
 !
 !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))
+!utilisation de la classe NVT_TRBE
 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.)
+!utilisation de la classe NVT_SHBR pour -30 < LAT < 30
+WHERE (((PLAT(:) .GE. -30.) .AND. (PLAT(:) .LE. 30.)))
 MGN%XPFT(9,:) = S%XVEGTYPE(:,NVT_SHRB)
+ELSE WHERE
+MGN%XPFT(9,:) = 0.
 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. &
+!utilisation de la classe NVT_SHBR pour 30 < LAT < 60
+WHERE (((PLAT(:) .GE. 30.) .AND. (PLAT(:) .LT. 60.)).OR.&
        ((PLAT(:) .LE. -30.) .AND. (PLAT(:) .GT. -60.)))
 MGN%XPFT(10,:) = S%XVEGTYPE(:,NVT_SHRB)
+ELSE WHERE
+MGN%XPFT(10,:) = 0.
 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.)))
+!utilisation de la classe NVT_SHBR pour LAT > 60
+WHERE (((PLAT(:) .GE. 60.) .OR. (PLAT(:) .LE. -60.)))
 MGN%XPFT(11,:) = S%XVEGTYPE(:,NVT_SHRB)
+ELSE WHERE
+MGN%XPFT(11,:) = 0.
 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
+MGN%XPFT(12,:) = S%XVEGTYPE(:,NVT_BOGR) 
 !
 !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
+MGN%XPFT(13,:) = S%XVEGTYPE(:,NVT_GRAS)
 !
 !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
+IF (NVT_C3W .NE. 0 ) THEN ! use ecoclimap_sg
+MGN%XPFT(16,:) = S%XVEGTYPE(:,NVT_C3W) + S%XVEGTYPE(:,NVT_C3S)
+ELSE  ! use ecaclimap2.0
 MGN%XPFT(16,:) = S%XVEGTYPE(:,NVT_C3)
+END IF
 !
 ! Emission factor
 MGN%XEF(:,:) = 0.
@@ -499,7 +455,6 @@ DO JSV=1, MSF%NMEGAN_NBR
   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)
-!  IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "LAI")      PLAI(:,1)     = PMEGAN_FIELDS(:,JSV)
   IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT1")     MGN%XPFT(1,:) = PMEGAN_FIELDS(:,JSV)
   IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT2")     MGN%XPFT(2,:) = PMEGAN_FIELDS(:,JSV)
   IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT3")     MGN%XPFT(3,:) = PMEGAN_FIELDS(:,JSV)
@@ -516,6 +471,7 @@ DO JSV=1, MSF%NMEGAN_NBR
   IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT14")    MGN%XPFT(14,:) = PMEGAN_FIELDS(:,JSV)
   IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT15")    MGN%XPFT(15,:) = PMEGAN_FIELDS(:,JSV)
   IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "PFT16")    MGN%XPFT(16,:) = PMEGAN_FIELDS(:,JSV)
+  IF (TRIM(MSF%CMEGAN_NAME(JSV)) == "LAI")      MGN%XLAI(:)    = PMEGAN_FIELDS(:,JSV)
 END DO
 
 #endif
-- 
GitLab