From c6b42eb9b23d69766f5539f0b75062af01d2e38c Mon Sep 17 00:00:00 2001 From: Wouter Knoben Date: Sat, 14 Aug 2021 10:10:18 -0600 Subject: [PATCH 1/3] cleaned up noah-mp phenology routine and removed check that gave 0 SAI & LAI if below 0.05 --- build/source/noah-mp/module_sf_noahmplsm.F | 48 +++++++++++++--------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/build/source/noah-mp/module_sf_noahmplsm.F b/build/source/noah-mp/module_sf_noahmplsm.F index 3a649ea9..a20f8cd3 100755 --- a/build/source/noah-mp/module_sf_noahmplsm.F +++ b/build/source/noah-mp/module_sf_noahmplsm.F @@ -518,35 +518,36 @@ SUBROUTINE PHENOLOGY (VEGTYP , ISURBAN, SNOWH , TV , LAT , YEARLEN , JULI ! inputs INTEGER , INTENT(IN ) :: VEGTYP !vegetation type INTEGER , INTENT(IN ) :: ISURBAN!urban category - REAL(rkind) , INTENT(IN ) :: SNOWH !snow height [m] - REAL(rkind) , INTENT(IN ) :: TV !vegetation temperature (k) - REAL(rkind) , INTENT(IN ) :: LAT !latitude (radians) + REAL(rkind) , INTENT(IN ) :: SNOWH !snow height [m] + REAL(rkind) , INTENT(IN ) :: TV !vegetation temperature (k) + REAL(rkind) , INTENT(IN ) :: LAT !latitude (radians) INTEGER , INTENT(IN ) :: YEARLEN!Number of days in the particular year - REAL(rkind) , INTENT(IN ) :: JULIAN !Julian day of year (fractional) ( 0 <= JULIAN < YEARLEN ) - real(rkind) , INTENT(IN ) :: TROOT !root-zone averaged temperature (k) - REAL(rkind) , INTENT(INOUT) :: LAI !LAI, unadjusted for burying by snow - REAL(rkind) , INTENT(INOUT) :: SAI !SAI, unadjusted for burying by snow + REAL(rkind) , INTENT(IN ) :: JULIAN !Julian day of year (fractional) ( 0 <= JULIAN < YEARLEN ) + real(rkind) , INTENT(IN ) :: TROOT !root-zone averaged temperature (k) + REAL(rkind) , INTENT(INOUT) :: LAI !LAI, unadjusted for burying by snow + REAL(rkind) , INTENT(INOUT) :: SAI !SAI, unadjusted for burying by snow ! outputs - REAL(rkind) , INTENT(OUT ) :: HTOP !top of canopy layer (m) - REAL(rkind) , INTENT(OUT ) :: ELAI !leaf area index, after burying by snow - REAL(rkind) , INTENT(OUT ) :: ESAI !stem area index, after burying by snow - REAL(rkind) , INTENT(OUT ) :: IGS !growing season index (0=off, 1=on) + REAL(rkind) , INTENT(OUT ) :: HTOP !top of canopy layer (m) + REAL(rkind) , INTENT(OUT ) :: ELAI !leaf area index, after burying by snow + REAL(rkind) , INTENT(OUT ) :: ESAI !stem area index, after burying by snow + REAL(rkind) , INTENT(OUT ) :: IGS !growing season index (0=off, 1=on) ! locals - REAL(rkind) :: DB !thickness of canopy buried by snow (m) - REAL(rkind) :: FB !fraction of canopy buried by snow - REAL(rkind) :: SNOWHC !critical snow depth at which short vege + REAL(rkind) :: DB !thickness of canopy buried by snow (m) + REAL(rkind) :: FB !fraction of canopy buried by snow + REAL(rkind) :: SNOWHC !critical snow depth at which short vege !is fully covered by snow INTEGER :: K !index INTEGER :: IT1,IT2 !interpolation months - REAL(rkind) :: DAY !current day of year ( 0 <= DAY < YEARLEN ) - REAL(rkind) :: WT1,WT2 !interpolation weights - REAL(rkind) :: T !current month (1.00, ..., 12.00) + REAL(rkind) :: DAY !current day of year ( 0 <= DAY < YEARLEN ) + REAL(rkind) :: WT1,WT2 !interpolation weights + REAL(rkind) :: T !current month (1.00, ..., 12.00) ! -------------------------------------------------------------------------------------------------- + ! Interpolate monthly SAI and LAI to daily values IF ( DVEG == 1 .or. DVEG == 3 .or. DVEG == 4 ) THEN IF (LAT >= 0.) THEN @@ -568,10 +569,17 @@ SUBROUTINE PHENOLOGY (VEGTYP , ISURBAN, SNOWH , TV , LAT , YEARLEN , JULI LAI = WT1*LAIM(VEGTYP,IT1) + WT2*LAIM(VEGTYP,IT2) SAI = WT1*SAIM(VEGTYP,IT1) + WT2*SAIM(VEGTYP,IT2) ENDIF - IF (SAI < 0.05) SAI = 0.0 ! MB: SAI CHECK - IF (LAI < 0.05 .OR. SAI == 0.0) LAI = 0.0 ! MB: LAI CHECK + + ! Realism check: no leaves without stems + IF (SAI == 0.0) LAI = 0.0 - IF ( ( VEGTYP == ISWATER ) .OR. ( VEGTYP == ISBARREN ) .OR. ( VEGTYP == ISSNOW ) .or. ( VEGTYP == ISURBAN) ) THEN + ! Realism check: warn about no stems for vegetated land classes + IF ( (SAI == 0.0) .and. ( VEGTYP /= ISWATER ) .and. ( VEGTYP /= ISBARREN ) .and. ( VEGTYP /= ISSNOW ) .and. ( VEGTYP /= ISURBAN) ) THEN + write(*,'(A,I3,A)') ' WARNING: module_sf_noahmplsm/PHENOLOGY: Stem Area Index (SAI) = 0.0 may be unrealistic for vegetation type ',VEGTYP,'. Continuing.' + ENDIF + + ! Realism check: no vegetation should exist on certain land classes + IF ( ( VEGTYP == ISWATER ) .or. ( VEGTYP == ISBARREN ) .or. ( VEGTYP == ISSNOW ) .or. ( VEGTYP == ISURBAN) ) THEN LAI = 0. SAI = 0. ENDIF From c644ca61ed7136dbf2949db8abb12302fc394788 Mon Sep 17 00:00:00 2001 From: Wouter Knoben Date: Sat, 14 Aug 2021 10:20:04 -0600 Subject: [PATCH 2/3] updated docs with change --- docs/whats-new.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/whats-new.md b/docs/whats-new.md index 247f380f..6c57ee5e 100644 --- a/docs/whats-new.md +++ b/docs/whats-new.md @@ -2,6 +2,9 @@ This page provides simple, high-level documentation about what has changed in each new release of SUMMA. +## Develop +- Fixes an unnecessary rounding error on SAI and LAI values in PHENOLOGY routine + ## Version 3.0.4 (pre-release) - Initial addition of the "What's new" page From 4a8e91e498c9ffec527876c8b123d666392f76ba Mon Sep 17 00:00:00 2001 From: Wouter Knoben Date: Mon, 16 Aug 2021 14:24:05 -0600 Subject: [PATCH 3/3] included exposed SAI and LAI calculations in changes --- build/source/noah-mp/module_sf_noahmplsm.F | 2 -- 1 file changed, 2 deletions(-) diff --git a/build/source/noah-mp/module_sf_noahmplsm.F b/build/source/noah-mp/module_sf_noahmplsm.F index a20f8cd3..bb21f290 100755 --- a/build/source/noah-mp/module_sf_noahmplsm.F +++ b/build/source/noah-mp/module_sf_noahmplsm.F @@ -601,8 +601,6 @@ SUBROUTINE PHENOLOGY (VEGTYP , ISURBAN, SNOWH , TV , LAT , YEARLEN , JULI ELAI = LAI*(1.-FB) ESAI = SAI*(1.-FB) - IF (ESAI < 0.05) ESAI = 0.0 ! MB: ESAI CHECK - IF (ELAI < 0.05 .OR. ESAI == 0.0) ELAI = 0.0 ! MB: LAI CHECK IF (TV .GT. TMIN(VEGTYP)) THEN IGS = 1.