diff --git a/README.md b/README.md new file mode 100644 index 00000000..c12e7575 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# noahmp +Noah-MP Community Repository + +This is the branch for Noah-MP model development. + +Model developers can make code development based on this branch and create pull request to this develop branch. The pull request will be reviewed by Noah-MP model release team and if everything looks good, the new code development will be merged to the official 'develop' branch here. Eventually, the updates in develop branch will be merged to the master branch for official Noah-MP model release. + diff --git a/parameters/MPTABLE.TBL b/parameters/MPTABLE.TBL index 7d8c9e34..dfceae24 100644 --- a/parameters/MPTABLE.TBL +++ b/parameters/MPTABLE.TBL @@ -39,9 +39,17 @@ ISCROP = 2 EBLFOREST = 13 NATURAL = 5 - LOW_DENSITY_RESIDENTIAL = 31 - HIGH_DENSITY_RESIDENTIAL = 32 - HIGH_INTENSITY_INDUSTRIAL = 33 + LCZ_1 = 31 + LCZ_2 = 32 + LCZ_3 = 33 + LCZ_4 = 34 + LCZ_5 = 35 + LCZ_6 = 36 + LCZ_7 = 37 + LCZ_8 = 38 + LCZ_9 = 39 + LCZ_10 = 40 + LCZ_11 = 41 !--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 @@ -53,7 +61,11 @@ HVB = 1.00, 0.10, 0.10, 0.10, 0.10, 0.15, 0.05, 0.10, 0.10, 0.10, 11.5, 7.00, 8.00, 8.50, 10.0, 0.00, 0.05, 0.10, 0.00, 0.10, 0.10, 0.10, 0.10, 0.00, 0.10, 0.00, 0.00, DEN = 0.01, 25.0, 25.0, 25.0, 25.0, 25.0, 100., 10.0, 10.0, 0.02, 0.10, 0.28, 0.02, 0.28, 0.10, 0.01, 10.0, 0.10, 0.01, 1.00, 1.00, 1.00, 1.00, 0.00, 0.01, 0.01, 0.01, RC = 1.00, 0.08, 0.08, 0.08, 0.08, 0.08, 0.03, 0.12, 0.12, 3.00, 1.40, 1.20, 3.60, 1.20, 1.40, 0.01, 0.10, 1.40, 0.01, 0.30, 0.30, 0.30, 0.30, 0.00, 0.01, 0.01, 0.01, - MFSNO = 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, +!MFSNO = 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, +! C. He 12/17/2020: optimized MFSNO values dependent on land type based on evaluation with SNOTEL SWE and MODIS SCF, surface albedo + MFSNO = 4.00, 3.00, 3.00, 3.00, 4.00, 4.00, 2.00, 2.00, 2.00, 2.00, 1.00, 1.00, 1.00, 1.00, 1.00, 3.00, 3.00, 3.00, 3.00, 3.50, 3.50, 3.50, 3.50, 2.50, 3.50, 3.50, 3.50, +! C. He 12/17/2020: optimized snow cover factor (m) in SCF formulation to replace original constant 2.5*z0,z0=0.002m, based on evaluation with SNOTEL SWE and MODIS SCF, surface albedo + SCFFAC= 0.042, 0.014, 0.014, 0.014, 0.026, 0.026, 0.020, 0.018, 0.016, 0.020, 0.008, 0.008, 0.008, 0.008, 0.008, 0.030, 0.020, 0.020, 0.016, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, ! Row 1: Vis ! Row 2: Near IR @@ -76,7 +88,8 @@ TAUS_NIR=0.00, 0.380, 0.380, 0.380, 0.380, 0.380, 0.380, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.000, 0.380, 0.001, 0.000, 0.380, 0.001, 0.001, 0.001, 0.000, 0.001, 0.000, 0.000, XL = 0.000, -0.30, -0.30, -0.30, -0.30, -0.30, -0.30, 0.010, 0.250, 0.010, 0.250, 0.010, 0.010, 0.010, 0.250, 0.000, -0.30, 0.250, 0.000, -0.30, 0.250, 0.250, 0.250, 0.000, 0.250, 0.000, 0.000, - CWPVT = 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, + ! make CWPVT vegetation dependent according to J. Goudriaan, Crop Micrometeorology: A Simulation Study (Simulation monographs), 1977). C. He, 12/17/2020 + CWPVT = 0.18, 1.67, 1.67, 1.67, 1.67, 0.5, 5.0, 1.0, 2.0, 1.0, 0.67, 0.18, 0.67, 0.18, 0.29, 0.18, 1.67, 0.67, 0.18, 1.67, 0.67, 1.00, 0.18, 0.18, 0.18, 0.18, 0.18, C3PSN = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, KC25 = 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, AKC = 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, @@ -182,10 +195,17 @@ ISCROP = 12 EBLFOREST = 2 NATURAL = 14 - LOW_DENSITY_RESIDENTIAL = 31 - HIGH_DENSITY_RESIDENTIAL = 32 - HIGH_INTENSITY_INDUSTRIAL = 33 - + LCZ_1 = 31 + LCZ_2 = 32 + LCZ_3 = 33 + LCZ_4 = 34 + LCZ_5 = 35 + LCZ_6 = 36 + LCZ_7 = 37 + LCZ_8 = 38 + LCZ_9 = 39 + LCZ_10 = 40 + LCZ_11 = 41 !--------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 !--------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -196,7 +216,11 @@ HVB = 8.50, 8.00, 7.00, 11.5, 10.0, 0.10, 0.10, 0.10, 0.10, 0.05, 0.10, 0.10, 1.00, 0.10, 0.00, 0.00, 0.00, 0.30, 0.20, 0.10, DEN = 0.28, 0.02, 0.28, 0.10, 0.10, 10.0, 10.0, 10.0, 0.02, 100., 5.05, 25.0, 0.01, 25.0, 0.00, 0.01, 0.01, 1.00, 1.00, 1.00, RC = 1.20, 3.60, 1.20, 1.40, 1.40, 0.12, 0.12, 0.12, 3.00, 0.03, 0.75, 0.08, 1.00, 0.08, 0.00, 0.01, 0.01, 0.30, 0.30, 0.30, - MFSNO = 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, +!MFSNO = 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, +! C. He 12/17/2020: optimized MFSNO values dependent on land type based on evaluation with SNOTEL SWE and MODIS SCF, surface albedo + MFSNO = 1.00, 1.00, 1.00, 1.00, 1.00, 2.00, 2.00, 2.00, 2.00, 2.00, 3.00, 3.00, 4.00, 4.00, 2.50, 3.00, 3.00, 3.50, 3.50, 3.50, +! C. He 12/17/2020: optimized snow cover factor (m) in SCF formulation to replace original constant 2.5*z0,z0=0.002m, based on evaluation with SNOTEL SWE and MODIS SCF, surface albedo + SCFFAC = 0.008, 0.008, 0.008, 0.008, 0.008, 0.016, 0.016, 0.020, 0.020, 0.020, 0.020, 0.014, 0.042, 0.026, 0.030, 0.016, 0.030, 0.030, 0.030, 0.030, ! Row 1: Vis ! Row 2: Near IR @@ -219,8 +243,8 @@ TAUS_NIR=0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.380, 0.1905, 0.380, 0.000, 0.380, 0.000, 0.000, 0.000, 0.001, 0.001, 0.001, XL = 0.010, 0.010, 0.010, 0.250, 0.250, 0.010, 0.010, 0.010, 0.010, -0.30, -0.025, -0.30, 0.000, -0.30, 0.000, 0.000, 0.000, 0.250, 0.250, 0.250, -! CWPVT = 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - CWPVT = 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, +! make CWPVT vegetation dependent according to J. Goudriaan, Crop Micrometeorology: A Simulation Study (Simulation monographs), 1977). C. He, 12/17/2020 + CWPVT = 0.18, 0.67, 0.18, 0.67, 0.29, 1.0, 2.0, 1.3, 1.0, 5.0, 1.17, 1.67, 1.67, 1.67, 0.18, 0.18, 0.18, 0.67, 1.0, 0.18, C3PSN = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, KC25 = 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, AKC = 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, @@ -327,6 +351,7 @@ Z0SNO = 0.002 !snow surface roughness length (m) (0.002) SSI = 0.03 !liquid water holding capacity for snowpack (m3/m3) (0.03) SNOW_RET_FAC = 5.e-5 !snowpack water release timescale factor (1/s) + SNOW_EMIS = 0.95 !snow emissivity (bring from hard-coded value of 1.0 to here) SWEMX = 1.00 !new snow mass to fully cover old snow (mm) !equivalent to 10mm depth (density = 100 kg/m3) TAU0 = 1.e6 !tau0 from Yang97 eqn. 10a @@ -345,6 +370,18 @@ / +&noahmp_irrigation_parameters +IRR_FRAC = 0.10 ! irrigation Fraction +IRR_HAR = 20 ! number of days before harvest date to stop irrigation +IRR_LAI = 0.50 ! Minimum lai to trigger irrigation +IRR_MAD = 0.60 ! management allowable deficit (0-1) +FILOSS = 0.10 ! fraction of flood irrigation loss (0-1) +SPRIR_RATE = 6.40 ! mm/h, sprinkler irrigation rate +MICIR_RATE = 1.38 ! mm/h, micro irrigation rate +FIRTFAC = 1.00 ! flood application rate factor +IR_RAIN = 1.00 ! maximum precipitation to stop irrigation trigger +/ + &noahmp_crop_parameters ! NCROP = 5 @@ -360,21 +397,31 @@ DEFAULT_CROP = 0 ! The default crop type(1- ! 1 2 3 4 5 !---------------------------------------------------------- -PLTDAY = 130, 111, 111, 111, 111, ! Planting date -HSDAY = 280, 300, 300, 300, 300, ! Harvest date +PLTDAY = 111, 131, 111, 111, 111, ! Planting date +HSDAY = 300, 280, 300, 300, 300, ! Harvest date PLANTPOP = 78.0, 78.0, 78.0, 78.0, 78.0, ! Plant density [per ha] - used? IRRI = 0.0, 0.0, 0.0, 0.0, 0.0, ! Irrigation strategy 0= non-irrigation 1=irrigation (no water-stress) GDDTBASE = 10.0, 10.0, 10.0, 10.0, 10.0, ! Base temperature for GDD accumulation [C] GDDTCUT = 30.0, 30.0, 30.0, 30.0, 30.0, ! Upper temperature for GDD accumulation [C] -GDDS1 = 60.0, 50.0, 50.0, 50.0, 50.0, ! GDD from seeding to emergence -GDDS2 = 675.0, 718.0, 718.0, 718.0, 718.0, ! GDD from seeding to initial vegetative -GDDS3 = 1183.0, 933.0, 933.0, 933.0, 933.0, ! GDD from seeding to post vegetative -GDDS4 = 1253.0, 1103.0, 1103.0, 1103.0, 1103.0, ! GDD from seeding to intial reproductive -GDDS5 = 1605.0, 1555.0, 1555.0, 1555.0, 1555.0, ! GDD from seeding to pysical maturity - +GDDS1 = 50.0, 60.0, 50.0, 50.0, 50.0, ! GDD from seeding to emergence +GDDS2 = 625.0, 675.0, 718.0, 718.0, 718.0, ! GDD from seeding to initial vegetative +GDDS3 = 933.0, 1183.0, 933.0, 933.0, 933.0, ! GDD from seeding to post vegetative +GDDS4 = 1103.0, 1253.0, 1103.0, 1103.0, 1103.0, ! GDD from seeding to intial reproductive +GDDS5 = 1555.0, 1605.0, 1555.0, 1555.0, 1555.0, ! GDD from seeding to pysical maturity +C3PSN = 0.0, 1.0, 1.0, 1.0, 1.0, ! transfer crop-specific photosynthetic parameters +KC25 = 30.0, 30.0, 30.0, 30.0, 30.0, ! Zhe Zhang +AKC = 2.1, 2.1, 2.1, 2.1, 2.1, ! 2020-02-05 +KO25 = 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, ! +AKO = 1.2, 1.2, 1.2, 1.2, 1.2, ! +AVCMX = 2.4, 2.4, 2.4, 2.4, 2.4, ! +VCMX25 = 60.0, 80.0, 60.0, 60.0, 55.0, ! +BP = 4.E4, 1.E4, 2.E3, 2.E3, 2.E3, ! +MP = 4., 9., 6., 9., 9., ! +FOLNMX = 1.5, 1.5, 1.5, 1.5, 1.5, ! +QE25 = 0.05, 0.06, 0.06, 0.06, 0.06, ! C3C4 = 2, 1, 2, 2, 2, ! photosynthetic pathway: 1. = c3 2. = c4 -Aref = 7.0, 7.0, 7.0, 7.0, 7.0, ! reference maximum CO2 assimulation rate +Aref = 7.0, 7.0, 7.0, 7.0, 7.0, ! reference maximum CO2 assimulation rate PSNRF = 0.85, 0.85, 0.85, 0.85, 0.85, ! CO2 assimulation reduction factor(0-1) (caused by non-modeling part,e.g.pest,weeds) I2PAR = 0.5, 0.5, 0.5, 0.5, 0.5, ! Fraction of incoming solar radiation to photosynthetically active radiation TASSIM0 = 8.0, 8.0, 8.0, 8.0, 8.0, ! Minimum temperature for CO2 assimulation [C] @@ -390,7 +437,7 @@ LEFREEZ = 268, 268, 268, 268, 268, ! characteristic T for lea DILE_FC_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! coeficient for temperature leaf stress death [1/s] DILE_FC_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages DILE_FC_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, -DILE_FC_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, +DILE_FC_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, DILE_FC_S5 = 0.5, 0.5, 0.5, 0.5, 0.5, DILE_FC_S6 = 0.5, 0.5, 0.5, 0.5, 0.5, DILE_FC_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, @@ -411,8 +458,8 @@ LF_OVRC_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of leaf turnove LF_OVRC_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages LF_OVRC_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, LF_OVRC_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, -LF_OVRC_S5 = 0.2, 0.48, 0.48, 0.48, 0.48, -LF_OVRC_S6 = 0.3, 0.48, 0.48, 0.48, 0.48, +LF_OVRC_S5 = 0.2, 0.2, 0.48, 0.48, 0.48, +LF_OVRC_S6 = 0.3, 0.3, 0.48, 0.48, 0.48, LF_OVRC_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, LF_OVRC_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, @@ -420,8 +467,8 @@ ST_OVRC_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of stem turnove ST_OVRC_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages ST_OVRC_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, ST_OVRC_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, -ST_OVRC_S5 = 0.12, 0.12, 0.12, 0.12, 0.12, -ST_OVRC_S6 = 0.06, 0.06, 0.06, 0.06, 0.06, +ST_OVRC_S5 = 0.2, 0.12, 0.12, 0.12, 0.12, +ST_OVRC_S6 = 0.3, 0.06, 0.06, 0.06, 0.06, ST_OVRC_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, ST_OVRC_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, @@ -434,16 +481,15 @@ RT_OVRC_S6 = 0.06, 0.06, 0.06, 0.06, 0.06, RT_OVRC_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, RT_OVRC_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -LFMR25 = 1.0, 1.0, 1.0, 1.0, 1.0, ! leaf maintenance respiration at 25C [umol CO2/m**2 /s] -STMR25 = 0.05, 0.1, 0.1, 0.1, 0.1, ! stem maintenance respiration at 25C [umol CO2/kg bio/s] -RTMR25 = 0.05, 0.0, 0.0, 0.0, 0.0, ! root maintenance respiration at 25C [umol CO2/kg bio/s] -GRAINMR25 = 0.0, 0.1, 0.1, 0.1, 0.1, ! grain maintenance respiration at 25C [umol CO2/kg bio/s] +LFMR25 = 0.8, 1.0, 1.0, 1.0, 1.0, ! leaf maintenance respiration at 25C [umol CO2/m**2 /s] +STMR25 = 0.05, 0.05, 0.1, 0.1, 0.1, ! stem maintenance respiration at 25C [umol CO2/kg bio/s] +RTMR25 = 0.05, 0.05, 0.0, 0.0, 0.0, ! root maintenance respiration at 25C [umol CO2/kg bio/s] +GRAINMR25 = 0.0, 0.0, 0.1, 0.1, 0.1, ! grain maintenance respiration at 25C [umol CO2/kg bio/s] LFPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to leaf LFPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -LFPT_S3 = 0.4, 0.4, 0.4, 0.4, 0.4, -LFPT_S4 = 0.2, 0.2, 0.2, 0.2, 0.2, +LFPT_S3 = 0.36, 0.4, 0.4, 0.4, 0.4, +LFPT_S4 = 0.1, 0.2, 0.2, 0.2, 0.2, LFPT_S5 = 0.0, 0.0, 0.0, 0.0, 0.0, LFPT_S6 = 0.0, 0.0, 0.0, 0.0, 0.0, LFPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, @@ -451,36 +497,63 @@ LFPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, STPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to stem STPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -STPT_S3 = 0.2, 0.2, 0.2, 0.2, 0.2, -STPT_S4 = 0.5, 0.5, 0.5, 0.5, 0.5, -STPT_S5 = 0.0, 0.15, 0.15, 0.15, 0.15, -STPT_S6 = 0.0, 0.05, 0.05, 0.05, 0.05, +STPT_S3 = 0.24, 0.2, 0.2, 0.2, 0.2, +STPT_S4 = 0.6, 0.5, 0.5, 0.5, 0.5, +STPT_S5 = 0.0, 0.0, 0.15, 0.15, 0.15, +STPT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, STPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -STPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, +STPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, RTPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to root RTPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -RTPT_S3 = 0.34, 0.4, 0.4, 0.4, 0.4, +RTPT_S3 = 0.4, 0.4, 0.4, 0.4, 0.4, RTPT_S4 = 0.3, 0.3, 0.3, 0.3, 0.3, RTPT_S5 = 0.05, 0.05, 0.05, 0.05, 0.05, -RTPT_S6 = 0.0, 0.05, 0.05, 0.05, 0.05, +RTPT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, RTPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, RTPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - + GRAINPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to grain GRAINPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages GRAINPT_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, GRAINPT_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, -GRAINPT_S5 = 0.95, 0.8, 0.8, 0.8, 0.8, -GRAINPT_S6 = 1.0, 0.9, 0.9, 0.9, 0.9, +GRAINPT_S5 = 0.95, 0.95, 0.8, 0.8, 0.8, +GRAINPT_S6 = 1.0, 1.0, 0.9, 0.9, 0.9, GRAINPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, GRAINPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, +LFCT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! carbohydrate translocation +LFCT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, +LFCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.4, +LFCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.3, +LFCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.05, +LFCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, +LFCT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, +LFCT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +STCT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! carbohydrate translocation +STCT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, +STCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.4, +STCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.3, +STCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.05, +STCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, +STCT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, +STCT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +RTCT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! carbohydrate translocation +RTCT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, +RTCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.4, +RTCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.3, +RTCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.05, +RTCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, +RTCT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, +RTCT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +BIO2LAI = 0.015, 0.030, 0.015, 0.015, 0.015, ! leaf are per living leaf biomass [m^2/kg] -BIO2LAI = 0.035, 0.015, 0.015, 0.015, 0.015, ! leaf are per living leaf biomass [m^2/kg] / - + &noahmp_optional_parameters !------------------------------------------------------------------------------ @@ -537,3 +610,4 @@ BIO2LAI = 0.035, 0.015, 0.015, 0.015, 0.015, ! leaf are per living leaf sr2006_smcmax_b = 0.043 ! constant adjustment / + diff --git a/src/module_sf_noahmplsm.F b/src/module_sf_noahmplsm.F index 7af8a439..12cf54f2 100644 --- a/src/module_sf_noahmplsm.F +++ b/src/module_sf_noahmplsm.F @@ -20,6 +20,8 @@ MODULE MODULE_SF_NOAHMPLSM + use module_sf_gecros, only : gecros + IMPLICIT NONE public :: noahmp_options @@ -140,7 +142,8 @@ MODULE MODULE_SF_NOAHMPLSM ! 2 -> BATS: when SFCTMP SFCTMP < TFRZ ! 4 -> Use WRF microphysics output - + ! 5 -> Use wetbulb temperature (Wang et al., 2019 GRL) C.He, 12/18/2020 + INTEGER :: OPT_TBOT ! options for lower boundary condition of soil temperature ! 1 -> zero heat flux from bottom (ZBOT and TBOT not used) ! **2 -> TBOT at ZBOT (8m) read from a file (original Noah) @@ -168,6 +171,19 @@ MODULE MODULE_SF_NOAHMPLSM INTEGER :: OPT_CROP ! options for crop model ! **0 -> No crop model, will run default dynamic vegetation ! 1 -> Liu, et al. 2016 + ! 2 -> Gecros (Genotype-by-Environment interaction on CROp growth Simulator) Yin and van Laar, 2005 + + INTEGER :: OPT_IRR ! options for irrigation + ! **0 -> No irrigation + ! 1 -> Irrigation ON + ! 2 -> irrigation trigger based on crop season Planting and harvesting dates + ! *3 -> irrigation trigger based on LAI threshold + + INTEGER :: OPT_IRRM ! options for irrigation method + ! **0 -> method based on geo_em fractions + ! 1 -> sprinkler method + ! 2 -> micro/drip irrigation + ! 3 -> surface flooding !------------------------------------------------------------------------------------------! ! Physical Constants: ! @@ -216,6 +232,7 @@ MODULE MODULE_SF_NOAHMPLSM REAL :: DEN !tree density (no. of trunks per m2) REAL :: RC !tree crown radius (m) REAL :: MFSNO !snowmelt m parameter () + REAL :: SCFFAC !snow cover factor (m) (originally hard-coded 2.5*z0 in SCF formulation) REAL :: SAIM(12) !monthly stem area index, one-sided REAL :: LAIM(12) !monthly leaf area index, one-sided REAL :: SLA !single-side leaf area per Kg [m2/kg] @@ -289,6 +306,7 @@ MODULE MODULE_SF_NOAHMPLSM REAL :: Z0SNO !snow surface roughness length (m) (0.002) REAL :: SSI !liquid water holding capacity for snowpack (m3/m3) REAL :: SNOW_RET_FAC !snowpack water release timescale factor (1/s) + REAL :: SNOW_EMIS !snow emissivity REAL :: SWEMX !new snow mass to fully cover old snow (mm) REAL :: TAU0 !tau0 from Yang97 eqn. 10a REAL :: GRAIN_GROWTH !growth from vapor diffusion Yang97 eqn. 10b @@ -304,6 +322,19 @@ MODULE MODULE_SF_NOAHMPLSM REAL :: RSURF_SNOW !surface resistance for snow(s/m) REAL :: RSURF_EXP !exponent in the shape parameter for soil resistance option 1 +!------------------------------------------------------------------------------------------! +! From the irrigation section of MPTABLE.TBL +!------------------------------------------------------------------------------------------! + REAL :: IRR_FRAC ! irrigation Fraction + INTEGER :: IRR_HAR ! number of days before harvest date to stop irrigation + REAL :: IRR_LAI ! Minimum lai to trigger irrigation + REAL :: IRR_MAD ! management allowable deficit (0-1) + REAL :: FILOSS ! fraction of flood irrigation loss (0-1) + REAL :: SPRIR_RATE ! mm/h, sprinkler irrigation rate + REAL :: MICIR_RATE ! mm/h, micro irrigation rate + REAL :: FIRTFAC ! flood application rate factor + REAL :: IR_RAIN ! maximum precipitation to stop irrigation trigger + !------------------------------------------------------------------------------------------! ! From the crop section of MPTABLE.TBL !------------------------------------------------------------------------------------------! @@ -344,6 +375,9 @@ MODULE MODULE_SF_NOAHMPLSM REAL :: LFPT(NSTAGE) ! fraction of carbohydrate flux to leaf REAL :: STPT(NSTAGE) ! fraction of carbohydrate flux to stem REAL :: RTPT(NSTAGE) ! fraction of carbohydrate flux to root + REAL :: LFCT(NSTAGE) ! fraction of carbohydrate flux transallocate from leaf to grain ! Zhe Zhang 2020-07-13 + REAL :: STCT(NSTAGE) ! fraction of carbohydrate flux transallocate from stem to grain + REAL :: RTCT(NSTAGE) ! fraction of carbohydrate flux transallocate from root to grain REAL :: GRAINPT(NSTAGE) ! fraction of carbohydrate flux to grain REAL :: BIO2LAI ! leaf are per living leaf biomass [m^2/kg] @@ -389,16 +423,21 @@ SUBROUTINE NOAHMP_SFLX (parameters, & QC , SOLDN , LWDN , & ! IN : Forcing PRCPCONV, PRCPNONC, PRCPSHCV, PRCPSNOW, PRCPGRPL, PRCPHAIL, & ! IN : Forcing TBOT , CO2AIR , O2AIR , FOLN , FICEOLD , ZLVL , & ! IN : Forcing + IRRFRA , SIFRA , MIFRA , FIFRA , LLANDUSE, & ! IN : Irrigation: fractions ALBOLD , SNEQVO , & ! IN/OUT : STC , SH2O , SMC , TAH , EAH , FWET , & ! IN/OUT : - CANLIQ , CANICE , TV , TG , QSFC, QSNOW, QRAIN, & ! IN/OUT : + CANLIQ , CANICE , TV , TG , QSFC , QSNOW , & ! IN/OUT : + QRAIN , & ! IN/OUT : ISNOW , ZSNSO , SNOWH , SNEQV , SNICE , SNLIQ , & ! IN/OUT : ZWT , WA , WT , WSLAKE , LFMASS , RTMASS , & ! IN/OUT : STMASS , WOOD , STBLCP , FASTCP , LAI , SAI , & ! IN/OUT : CM , CH , TAUSS , & ! IN/OUT : GRAIN , GDD , PGS , & ! IN/OUT SMCWTD ,DEEPRECH , RECH , & ! IN/OUT : - Z0WRF , & + GECROS1D, & ! IN/OUT : + Z0WRF , & + IRCNTSI , IRCNTMI , IRCNTFI , IRAMTSI , IRAMTMI , IRAMTFI , & ! IN/OUT : Irrigation: vars + IRSIRATE, IRMIRATE, IRFIRATE, FIRR , EIRR , & ! IN/OUT : Irrigation: vars FSA , FSR , FIRA , FSH , SSOIL , FCEV , & ! OUT : FGEV , FCTR , ECAN , ETRAN , EDIR , TRAD , & ! OUT : TGB , TGV , T2MV , T2MB , Q2V , Q2B , & ! OUT : @@ -474,7 +513,7 @@ SUBROUTINE NOAHMP_SFLX (parameters, & ! input/output : need arbitary intial values REAL , INTENT(INOUT) :: QSNOW !snowfall [mm/s] - REAL , INTENT(INOUT) :: QRAIN !rainfall [mm/s] + REAL , INTENT(INOUT) :: QRAIN !rain at ground surface (mm/s) REAL , INTENT(INOUT) :: FWET !wetted or snowed fraction of canopy (-) REAL , INTENT(INOUT) :: SNEQVO !snow mass at last time step (mm) REAL , INTENT(INOUT) :: EAH !canopy air vapor pressure (pa) @@ -506,6 +545,8 @@ SUBROUTINE NOAHMP_SFLX (parameters, & REAL, INTENT(INOUT) :: DEEPRECH !recharge to or from the water table when deep [m] REAL, INTENT(INOUT) :: RECH !recharge to or from the water table when shallow [m] (diagnostic) + REAL, DIMENSION(1:60) , INTENT(INOUT) :: gecros1d ! gecros crop + ! output REAL , INTENT(OUT) :: Z0WRF !combined z0 sent to coupled model REAL , INTENT(OUT) :: FSA !total absorbed solar radiation (w/m2) @@ -642,6 +683,28 @@ SUBROUTINE NOAHMP_SFLX (parameters, & REAL , INTENT(INOUT) :: GDD !growing degree days INTEGER , INTENT(INOUT) :: PGS !plant growing stage [-] +! irrigation variables + REAL , INTENT(IN) :: IRRFRA ! irrigation fraction + REAL , INTENT(IN) :: SIFRA ! sprinkler irrigation fraction + REAL , INTENT(IN) :: MIFRA ! micro irrigation fraction + REAL , INTENT(IN) :: FIFRA ! flood irrigation fraction + INTEGER , INTENT(INOUT) :: IRCNTSI ! irrigation event number, Sprinkler + INTEGER , INTENT(INOUT) :: IRCNTMI ! irrigation event number, Micro + INTEGER , INTENT(INOUT) :: IRCNTFI ! irrigation event number, Flood + REAL , INTENT(INOUT) :: IRAMTSI ! irrigation water amount [m] to be applied, Sprinkler + REAL , INTENT(INOUT) :: IRAMTMI ! irrigation water amount [m] to be applied, Micro + REAL , INTENT(INOUT) :: IRAMTFI ! irrigation water amount [m] to be applied, Flood + REAL , INTENT(INOUT) :: IRSIRATE ! rate of irrigation by sprinkler [m/timestep] + REAL , INTENT(INOUT) :: IRMIRATE ! rate of irrigation by micro [m/timestep] + REAL , INTENT(INOUT) :: IRFIRATE ! rate of irrigation by micro [m/timestep] + REAL , INTENT(INOUT) :: FIRR ! irrigation:latent heating due to sprinkler evaporation [w/m2] + REAL , INTENT(INOUT) :: EIRR ! evaporation of irrigation water to evaporation,sprinkler [mm/s] + CHARACTER(LEN=256) , INTENT(IN) :: LLANDUSE ! landuse data name (USGS or MODIS_IGBP) + REAL :: IREVPLOS ! loss of irrigation water to evaporation,sprinkler [m/timestep] + REAL :: SIFAC ! sprinkler irrigation fraction (local) + REAL :: MIFAC ! micro irrigation fraction (local) + REAL :: FIFAC ! flood irrigation fraction (local) + ! outputs REAL , INTENT(OUT) :: NEE !net ecosys exchange (g/m2/s CO2) REAL , INTENT(OUT) :: GPP !net instantaneous assimilation [g/m2/s C] @@ -668,6 +731,9 @@ SUBROUTINE NOAHMP_SFLX (parameters, & LOGICAL :: FROZEN_CANOPY ! used to define latent heat pathway LOGICAL :: dveg_active ! flag to run dynamic vegetation LOGICAL :: crop_active ! flag to run crop model + LOGICAL :: CROPLU ! flag to identify croplands + REAL :: SIFCUK ! Sprinkler fraction for unknown irrigation methods + REAL :: FB ! INTENT (OUT) variables need to be assigned a value. These normally get assigned values ! only if DVEG == 2. @@ -678,7 +744,8 @@ SUBROUTINE NOAHMP_SFLX (parameters, & PAHG = 0. PAHB = 0. PAH = 0. - + CROPLU = .FALSE. + ! -------------------------------------------------------------------------------------------------- ! re-process atmospheric forcing @@ -740,6 +807,63 @@ SUBROUTINE NOAHMP_SFLX (parameters, & IF(parameters%urban_flag .OR. VEGTYP == parameters%ISBARREN) FVEG = 0.0 IF(ELAI+ESAI == 0.0) FVEG = 0.0 +! Calling dynamic irrigation scheme-prasanth + IF ( TRIM(LLANDUSE) == "USGS" ) THEN + IF(VEGTYP .GE. 3 .AND. VEGTYP .LE. 6) CROPLU = .TRUE. + ELSE IF ( TRIM(LLANDUSE) == "MODIFIED_IGBP_MODIS_NOAH") THEN + IF(VEGTYP == 12 .OR. VEGTYP == 14) CROPLU = .TRUE. + END IF + + SIFAC = SIFRA + MIFAC = MIFRA + FIFAC = FIFRA + +! If OPT_IRRM = 0 and if methods are unknown for certain area, then use sprinkler irrigation method + IF((OPT_IRRM .EQ. 0) .AND. (SIFAC .EQ. 0.) .AND. (MIFAC .EQ. 0.) .AND. (FIFAC .EQ. 0.) & + .AND. (IRRFRA .GE. parameters%IRR_FRAC)) THEN + SIFAC = 1.0 + END IF +! choose method based on user namelist choice + IF(OPT_IRRM .EQ. 1) THEN + SIFAC = 1. + MIFAC = 0. + FIFAC = 0. + ELSE IF(OPT_IRRM .EQ. 2) THEN + SIFAC = 0. + MIFAC = 1. + FIFAC = 0. + ELSE IF(OPT_IRRM .EQ. 3) THEN + SIFAC = 0. + MIFAC = 0. + FIFAC = 1. + END IF +! Call triggering function + IF((CROPLU .EQV. .TRUE.) .AND. (IRRFRA .GE. parameters%IRR_FRAC) .AND. & + (RAIN .LT. (parameters%IR_RAIN/3600.)) .AND. ((IRAMTSI+IRAMTMI+IRAMTFI) .EQ. 0.0) )THEN + CALL TRIGGER_IRRIGATION(parameters,NSOIL,ZSOIL,SH2O,FVEG,JULIAN,IRRFRA,LAI, & !in + SIFAC,MIFAC,FIFAC, & !in + IRCNTSI,IRCNTMI,IRCNTFI, & !inout + IRAMTSI,IRAMTMI,IRAMTFI) !inout + END IF +! set irrigation off if parameters%IR_RAIN mm/h for this time step and irr triggered last time step + IF((RAIN .GE. (parameters%IR_RAIN/3600.)) .OR. (IRRFRA .LT. parameters%IRR_FRAC))THEN + IRAMTSI = 0. + IRAMTMI = 0. + IRAMTFI = 0. + END IF +! call sprinkler irrigation before CANWAT/PRECIP_HEAT to have canopy interception + IF((CROPLU .EQV. .TRUE.) .AND. (IRAMTSI .GT. 0.0)) THEN + CALL SPRINKLER_IRRIGATION(parameters,NSOIL,DT,SH2O,SMC,SICE,& !in + SFCTMP,UU,VV,EAIR,SIFAC, & !in + IRAMTSI,IREVPLOS,IRSIRATE) !inout + RAIN = RAIN + (IRSIRATE*1000./DT) ![mm/s] + ! cooling and humidification due to sprinkler evaporation, per m^2 calculation + FIRR = IREVPLOS*1000.*HVAP/DT ! heat used for evaporation (W/m2) + EIRR = IREVPLOS*1000./DT ! sprinkler evaporation (mm/s) + END IF +! call for micro irrigation and flood irrigation are implemented in WATER subroutine +! end irrigation call-prasanth + CALL PRECIP_HEAT(parameters,ILOC ,JLOC ,VEGTYP ,DT ,UU ,VV , & !in ELAI ,ESAI ,FVEG ,IST , & !in BDFALL ,RAIN ,SNOW ,FP , & !in @@ -774,7 +898,8 @@ SUBROUTINE NOAHMP_SFLX (parameters, & FSRG ,RSSUN ,RSSHA ,ALBSND ,ALBSNI, BGAP ,WGAP,TGV,TGB,& Q1 ,Q2V ,Q2B ,Q2E ,CHV ,CHB , & !out EMISSI ,PAH , & - SHG,SHC,SHB,EVG,EVB,GHV,GHB,IRG,IRC,IRB,TR,EVC,CHLEAF,CHUC,CHV2,CHB2 ) !out + SHG,SHC,SHB,EVG,EVB,GHV,GHB,IRG,IRC,IRB,TR,EVC,CHLEAF,CHUC,CHV2,CHB2,& + JULIAN, SWDOWN, PRCP, FB, GECROS1D ) !jref:end SICE(:) = MAX(0.0, SMC(:) - SH2O(:)) @@ -789,6 +914,7 @@ SUBROUTINE NOAHMP_SFLX (parameters, & CALL WATER (parameters,VEGTYP ,NSNOW ,NSOIL ,IMELT ,DT ,UU , & !in VV ,FCEV ,FCTR ,QPRECC ,QPRECL ,ELAI , & !in ESAI ,SFCTMP ,QVAP ,QDEW ,ZSOIL ,BTRANI , & !in + IRRFRA ,MIFAC ,FIFAC ,CROPLU , & !in FICEOLD,PONDING,TG ,IST ,FVEG ,iloc,jloc , SMCEQ , & !in BDFALL ,FP ,RAIN ,SNOW , & !in MB/AN: v3.7 QSNOW ,QRAIN ,SNOWHIN,LATHEAV,LATHEAG,frozen_canopy,frozen_ground, & !in MB @@ -796,6 +922,7 @@ SUBROUTINE NOAHMP_SFLX (parameters, & SNICE ,SNLIQ ,STC ,ZSNSO ,SH2O ,SMC , & !inout SICE ,ZWT ,WA ,WT ,DZSNSO ,WSLAKE , & !inout SMCWTD ,DEEPRECH,RECH , & !inout + IRAMTFI,IRAMTMI ,IRFIRATE ,IRMIRATE, & !inout CMC ,ECAN ,ETRAN ,FWET ,RUNSRF ,RUNSUB , & !out QIN ,QDIS ,PONDING1 ,PONDING2,& QSNBOT & @@ -835,6 +962,12 @@ SUBROUTINE NOAHMP_SFLX (parameters, & GPP ,NPP ,NEE ,AUTORS ,HETERS ,TOTSC ,TOTLB, PGS ) !out END IF +! before waterbalance check add irrigation water to precipitation +IF((CROPLU .EQV. .TRUE.) .AND. (IRRFRA .GE. parameters%IRR_FRAC))THEN + PRCP = PRCP + ((IRSIRATE+IRMIRATE+IRFIRATE)*1000./DT) ! irrigation + FSH = FSH - FIRR ! (W/m2) +END IF + ! water and energy balance check CALL ERROR (parameters,SWDOWN ,FSA ,FSR ,FIRA ,FSH ,FCEV , & !in @@ -843,7 +976,7 @@ SUBROUTINE NOAHMP_SFLX (parameters, & ETRAN ,EDIR ,RUNSRF ,RUNSUB ,DT ,NSOIL , & !in NSNOW ,IST ,ERRWAT ,ILOC , JLOC ,FVEG , & SAV ,SAG ,FSRV ,FSRG ,ZWT ,PAH , & - PAHV ,PAHG ,PAHB ) !in ( Except ERRWAT, which is out ) + PAHV ,PAHG ,PAHB ,FIRR) !in ( Except ERRWAT, which is out ) ! urban - jref QFX = ETRAN + ECAN + EDIR @@ -917,6 +1050,15 @@ SUBROUTINE ATM (parameters,SFCPRS ,SFCTMP ,Q2 , REAL :: PRCP_FROZEN !total frozen precipitation [mm/s] ! MB/AN : v3.7 REAL, PARAMETER :: RHO_GRPL = 500.0 ! graupel bulk density [kg/m3] ! MB/AN : v3.7 REAL, PARAMETER :: RHO_HAIL = 917.0 ! hail bulk density [kg/m3] ! MB/AN : v3.7 +! wet-bulb scheme Wang et al., 2019 GRL, C.He, 12/18/2020 + REAL :: ESATAIR ! saturated vapor pressure of air + REAL :: LATHEA ! latent heat of vapor/sublimation + REAL :: GAMMA_b ! (cp*p)/(eps*L) + REAL :: TDC ! air temperature [C] + REAL :: TWET ! wetbulb temperature + INTEGER :: ITER + INTEGER, PARAMETER :: NITER = 10 ! iterations for Twet calculation + ! -------------------------------------------------------------------------------------------------- !jref: seems like PAIR should be P1000mb?? @@ -1006,6 +1148,23 @@ SUBROUTINE ATM (parameters,SFCPRS ,SFCTMP ,Q2 , ENDIF +! wet-bulb scheme (Wang et al., 2019 GRL), C.He, 12/18/2020 + IF(OPT_SNF == 5) THEN + TDC = MIN( 50., MAX(-50.,(SFCTMP-TFRZ)) ) !Kelvin to degree Celsius with limit -50 to +50 + IF (SFCTMP > TFRZ) THEN + LATHEA = HVAP + ELSE + LATHEA = HSUB + END IF + GAMMA_b = CPAIR*SFCPRS/(0.622*LATHEA) + TWET = TDC - 5. ! first guess wetbulb temperature + DO ITER = 1, NITER + ESATAIR = 610.8 * EXP((17.27*TWET)/(237.3+TWET)) + TWET = TWET - (ESATAIR-EAIR)/ GAMMA_b ! Wang et al., 2019 GRL Eq.2 + END DO + FPICE = 1.0/(1.0+6.99E-5*exp(2.0*(TWET+3.97))) ! Wang et al., 2019 GRL Eq. 1 + ENDIF + RAIN = PRCP * (1.-FPICE) SNOW = PRCP * FPICE @@ -1357,7 +1516,7 @@ SUBROUTINE ERROR (parameters,SWDOWN ,FSA ,FSR ,FIRA ,FSH ,FCEV , & ETRAN ,EDIR ,RUNSRF ,RUNSUB ,DT ,NSOIL , & NSNOW ,IST ,ERRWAT, ILOC ,JLOC ,FVEG , & SAV ,SAG ,FSRV ,FSRG ,ZWT ,PAH , & - PAHV ,PAHG ,PAHB ) + PAHV ,PAHG ,PAHB ,FIRR) ! -------------------------------------------------------------------------------------------------- ! check surface energy balance and water balance ! -------------------------------------------------------------------------------------------------- @@ -1405,6 +1564,7 @@ SUBROUTINE ERROR (parameters,SWDOWN ,FSA ,FSR ,FIRA ,FSH ,FCEV , & REAL, INTENT(IN) :: PAHV !precipitation advected heat - total (W/m2) REAL, INTENT(IN) :: PAHG !precipitation advected heat - total (W/m2) REAL, INTENT(IN) :: PAHB !precipitation advected heat - total (W/m2) + REAL , INTENT(IN) :: FIRR ! latent heating due to sprinkler evaporation (w/m2) [+ to atm] INTEGER :: IZ !do-loop index REAL :: END_WB !water storage at end of a timestep [mm] @@ -1439,7 +1599,7 @@ SUBROUTINE ERROR (parameters,SWDOWN ,FSA ,FSR ,FIRA ,FSH ,FCEV , & call wrf_error_fatal("Stop in Noah-MP") END IF - ERRENG = SAV+SAG-(FIRA+FSH+FCEV+FGEV+FCTR+SSOIL) +PAH + ERRENG = SAV+SAG-(FIRA+FSH+FCEV+FGEV+FCTR+SSOIL+FIRR) +PAH ! ERRENG = FVEG*SAV+SAG-(FIRA+FSH+FCEV+FGEV+FCTR+SSOIL) ! WRITE(*,*) "ERRENG =",ERRENG IF(ABS(ERRENG) > 0.01) THEN @@ -1459,6 +1619,8 @@ SUBROUTINE ERROR (parameters,SWDOWN ,FSA ,FSR ,FIRA ,FSH ,FCEV , & call wrf_message(trim(message)) WRITE(message,'(a17,F10.4)') "Total ground: ",SSOIL call wrf_message(trim(message)) + WRITE(message,'(a17,F10.4)') "Sprinkler: ",FIRR + call wrf_message(trim(message)) WRITE(message,'(a17,4F10.4)') "Precip advected: ",PAH,PAHV,PAHG,PAHB call wrf_message(trim(message)) WRITE(message,'(a17,F10.4)') "Precip: ",PRCP @@ -1524,7 +1686,8 @@ SUBROUTINE ENERGY (parameters,ICE ,VEGTYP ,IST ,NSNOW ,NSOIL , & !in T2MV ,T2MB ,FSRV , & FSRG ,RSSUN ,RSSHA ,ALBSND ,ALBSNI,BGAP ,WGAP,TGV,TGB,& Q1 ,Q2V ,Q2B ,Q2E ,CHV ,CHB, EMISSI,PAH ,& - SHG,SHC,SHB,EVG,EVB,GHV,GHB,IRG,IRC,IRB,TR,EVC,CHLEAF,CHUC,CHV2,CHB2 ) !out + SHG,SHC,SHB,EVG,EVB,GHV,GHB,IRG,IRC,IRB,TR,EVC,CHLEAF,CHUC,CHV2,CHB2, & + JULIAN, SWDOWN, PRCP, FB, GECROS1D ) !jref:end ! -------------------------------------------------------------------------------------------------- @@ -1774,6 +1937,9 @@ SUBROUTINE ENERGY (parameters,ICE ,VEGTYP ,IST ,NSNOW ,NSOIL , & !in REAL,INTENT(OUT) :: CHB2 !sensible heat conductance, canopy air to ZLVL air (m/s) REAL :: noahmpres + REAL, INTENT(IN) :: JULIAN, SWDOWN, PRCP, FB + REAL,DIMENSION(1:60),INTENT(INOUT) :: GECROS1D + !jref:end REAL, PARAMETER :: MPE = 1.E-6 @@ -1819,7 +1985,8 @@ SUBROUTINE ENERGY (parameters,ICE ,VEGTYP ,IST ,NSNOW ,NSOIL , & !in IF(SNOWH.GT.0.) THEN BDSNO = SNEQV / SNOWH FMELT = (BDSNO/100.)**parameters%MFSNO - FSNO = TANH( SNOWH /(2.5* Z0 * FMELT)) + !FSNO = TANH( SNOWH /(2.5* Z0 * FMELT)) + FSNO = TANH( SNOWH /(parameters%SCFFAC * FMELT)) ! C.He: bring hard-coded 2.5*z0 to MPTABLE tunable parameter SCFFAC ENDIF ! ground roughness length @@ -1888,9 +2055,9 @@ SUBROUTINE ENERGY (parameters,ICE ,VEGTYP ,IST ,NSNOW ,NSOIL , & !in EMV = 1. - EXP(-(ELAI+ESAI)/1.0) IF (ICE == 1) THEN - EMG = 0.98*(1.-FSNO) + 1.0*FSNO + EMG = 0.98*(1.-FSNO) + parameters%SNOW_EMIS*FSNO ! move hard-coded snow emissivity as a global parameter to MPTABLE ELSE - EMG = parameters%EG(IST)*(1.-FSNO) + 1.0*FSNO + EMG = parameters%EG(IST)*(1.-FSNO) + parameters%SNOW_EMIS*FSNO END IF ! soil moisture factor controlling stomatal resistance @@ -2006,7 +2173,8 @@ SUBROUTINE ENERGY (parameters,ICE ,VEGTYP ,IST ,NSNOW ,NSOIL , & !in T2MV ,PSNSUN ,PSNSHA , & !out !jref:start QC ,QSFC ,PSFC , & !in - Q2V ,CHV2, CHLEAF, CHUC) !inout + Q2V ,CHV2, CHLEAF, CHUC, & + SH2O,JULIAN, SWDOWN, PRCP, FB, FSR, GECROS1D) ! Gecros !jref:end END IF @@ -3342,7 +3510,8 @@ SUBROUTINE VEGE_FLUX(parameters,NSNOW ,NSOIL ,ISNOW ,VEGTYP ,VEG , & SHC ,EVG ,EVC ,TR ,GH , & !out T2MV ,PSNSUN ,PSNSHA , & !out QC ,QSFC ,PSFC , & !in - Q2V ,CAH2 ,CHLEAF ,CHUC ) !inout + Q2V ,CAH2 ,CHLEAF ,CHUC, & !inout + SH2O,JULIAN, SWDOWN, PRCP, FB, FSR, GECROS1D) ! Gecros ! -------------------------------------------------------------------------------------------------- ! use newton-raphson iteration to solve for vegetation (tv) and @@ -3364,8 +3533,8 @@ SUBROUTINE VEGE_FLUX(parameters,NSNOW ,NSOIL ,ISNOW ,VEGTYP ,VEG , & INTEGER, INTENT(IN) :: ISNOW !actual no. of snow layers INTEGER, INTENT(IN) :: VEGTYP !vegetation physiology type REAL, INTENT(IN) :: FVEG !greeness vegetation fraction (-) - REAL, INTENT(IN) :: SAV !solar rad absorbed by veg (w/m2) - REAL, INTENT(IN) :: SAG !solar rad absorbed by ground (w/m2) + REAL, INTENT(INOUT) :: SAV !solar rad absorbed by veg (w/m2) + REAL, INTENT(INOUT) :: SAG !solar rad absorbed by ground (w/m2) REAL, INTENT(IN) :: LWDN !atmospheric longwave radiation (w/m2) REAL, INTENT(IN) :: UR !wind speed at height zlvl (m/s) REAL, INTENT(IN) :: UU !wind speed in eastward dir (m/s) @@ -3546,6 +3715,14 @@ SUBROUTINE VEGE_FLUX(parameters,NSNOW ,NSOIL ,ISNOW ,VEGTYP ,VEG , & INTEGER :: LITER !Last iteration + REAL, INTENT(IN) :: JULIAN, SWDOWN, PRCP, FB + REAL, INTENT(INOUT) :: FSR + REAL,DIMENSION(1:60), INTENT(INOUT) :: GECROS1D + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O !soil liquid water + + REAL :: ROOTD, WUL, WLL, Thickness, TLAIE, GLAIE, TLAI, GLAI, FRSU + INTEGER :: NROOT, J + REAL :: T, TDC !Kelvin to degree Celsius with limit -50 to +50 @@ -3693,6 +3870,57 @@ SUBROUTINE VEGE_FLUX(parameters,NSNOW ,NSOIL ,ISNOW ,VEGTYP ,VEG , & CALL CANRES (parameters,PARSHA,TV ,BTRAN ,EAH ,SFCPRS, & !in RSSHA ,PSNSHA,ILOC ,JLOC ) !out END IF + + ! Call Gecros + IF (opt_crop == 2) then + IF ((GECROS1D(41).GT.0).and.(GECROS1D(42).LT.0.)) then !Gecros + Thickness = 0. + NROOT = 0 + ROOTD = GECROS1D(33) + WUL = 0. + WLL = 0. + + DO J = 1,NSOIL + Thickness = Thickness + DZSNSO (J) + if (Thickness.lt.ROOTD/100.) then + NROOT = NROOT + 1 + endif + ENDDO + + NROOT = NROOT + 1 + NROOT = MAX(1,NROOT) + + Thickness = 0. + + DO J = 1,NROOT + Thickness = Thickness + DZSNSO (J) + if (Thickness.gt.ROOTD/100.) then + WUL = WUL + ((ROOTD/100.-Thickness+DZSNSO(J))*1000.*(SH2O(J)-parameters%SMCWLT(J))) + else + WUL = WUL + (DZSNSO(J)*1000.*(SH2O(J)-parameters%SMCWLT(J))) + endif + ENDDO + + DO J = 1,NSOIL + WLL = WLL + (DZSNSO(J)*1000.*(SH2O(J)-parameters%SMCWLT(J))) + ENDDO + WLL = WLL - WUL + + CALL gecros (JULIAN, DT, 1, RB, RAHC, RAHG+RSURF, FB, SNOWH , & !I + UR, SFCTMP, EAIR, SWDOWN, LWDN, PRCP, WUL, WLL , & !I + parameters%SMCWLT(1), parameters%DLEAF , & !I + GECROS1D , & !H + SAV, SAG, FSR, FRSU, RSSUN, RSSHA) !O + + GLAI = GECROS1D(49) + TLAI = GECROS1D(50) + + ! effective LAIs + TLAIE = MIN(6.,TLAI / FVEG) + GLAIE = MIN(6.,GLAI / FVEG) + ENDIF + ENDIF + END IF ! prepare for sensible heat flux above veg. @@ -3709,7 +3937,13 @@ SUBROUTINE VEGE_FLUX(parameters,NSNOW ,NSOIL ,ISNOW ,VEGTYP ,VEG , & CAW = 1./RAWC CEW = FWET*VAIE/RB - CTW = (1.-FWET)*(LAISUNE/(RB+RSSUN) + LAISHAE/(RB+RSSHA)) + + IF (OPT_CROP /= 2) THEN + CTW = (1.-FWET)*(LAISUNE/(RB+RSSUN) + LAISHAE/(RB+RSSHA)) + ELSE + !RSSUN and RSSHA are in resistance per unit LAI in the Jarvis and Ball-Berry!. RSSUN and RSSHA of Gecros are in s/m + CTW = (1.-FWET)*(1./(RB/(FRSU*GLAIE)+RSSUN) + 1./(RB/((1.-FRSU)*GLAIE)+RSSHA)) !transpiration conductance leaf to canopy air + ENDIF CGW = 1./(RAWG+RSURF) COND = CAW + CEW + CTW + CGW AEA = (EAIR*CAW + ESTG*CGW) / COND @@ -4254,8 +4488,7 @@ SUBROUTINE RAGRB(parameters,ITER ,VAI ,RHOAIR ,HG ,TAH , & !in TMPRB = CWPC*50. / (1. - EXP(-CWPC/2.)) RB = TMPRB * SQRT(parameters%DLEAF/UC) - RB = MAX(RB,20.0) -! RB = 200 + RB = MIN(MAX(RB, 5.0),50.0) ! limit RB to 5-50, typically RB<50 END SUBROUTINE RAGRB @@ -5631,6 +5864,7 @@ END SUBROUTINE FRH2O SUBROUTINE WATER (parameters,VEGTYP ,NSNOW ,NSOIL ,IMELT ,DT ,UU , & !in VV ,FCEV ,FCTR ,QPRECC ,QPRECL ,ELAI , & !in ESAI ,SFCTMP ,QVAP ,QDEW ,ZSOIL ,BTRANI , & !in + IRRFRA ,MIFAC ,FIFAC ,CROPLU , & !in FICEOLD,PONDING,TG ,IST ,FVEG ,ILOC ,JLOC ,SMCEQ , & !in BDFALL ,FP ,RAIN ,SNOW, & !in MB/AN: v3.7 QSNOW ,QRAIN ,SNOWHIN,LATHEAV,LATHEAG,frozen_canopy,frozen_ground, & !in MB @@ -5638,6 +5872,7 @@ SUBROUTINE WATER (parameters,VEGTYP ,NSNOW ,NSOIL ,IMELT ,DT ,UU , & SNICE ,SNLIQ ,STC ,ZSNSO ,SH2O ,SMC , & !inout SICE ,ZWT ,WA ,WT ,DZSNSO ,WSLAKE , & !inout SMCWTD ,DEEPRECH,RECH , & !inout + IRAMTFI,IRAMTMI ,IRFIRATE ,IRMIRATE, & !inout CMC ,ECAN ,ETRAN ,FWET ,RUNSRF ,RUNSUB , & !out QIN ,QDIS ,PONDING1 ,PONDING2, & QSNBOT & @@ -5729,6 +5964,15 @@ SUBROUTINE WATER (parameters,VEGTYP ,NSNOW ,NSOIL ,IMELT ,DT ,UU , & LOGICAL , INTENT(IN) :: FROZEN_GROUND ! used to define latent heat pathway LOGICAL , INTENT(IN) :: FROZEN_CANOPY ! used to define latent heat pathway +! irrigation + REAL, INTENT(IN) :: IRRFRA ! irrigation fraction + REAL, INTENT(IN) :: MIFAC ! micro irrigation fraction + REAL, INTENT(IN) :: FIFAC ! flood irrigation fraction + REAL, INTENT(INOUT):: IRAMTFI ! irrigation water amount [m] to be applied, Sprinkler + REAL, INTENT(INOUT):: IRAMTMI ! irrigation water amount [m] to be applied, Micro + REAL, INTENT(INOUT):: IRFIRATE ! rate of irrigation by micro [m/timestep] + REAL, INTENT(INOUT):: IRMIRATE ! rate of irrigation by micro [m/timestep] + LOGICAL, INTENT(IN) :: CROPLU ! flag to identify croplands ! local INTEGER :: IZ @@ -5820,6 +6064,22 @@ SUBROUTINE WATER (parameters,VEGTYP ,NSNOW ,NSOIL ,IMELT ,DT ,UU , & QINSUR = QINSUR+sfcheadrt/DT*0.001 !sfcheadrt units (m) #endif +! irrigation: call flood irrigation-pvk + IF((CROPLU .EQV. .TRUE.) .AND. (IRAMTFI .GT. 0.0))THEN + ! call flood irrigation and add to QINSUR + CALL FLOOD_IRRIGATION(parameters,NSOIL,DT,SH2O,SMC,SICE,FIFAC,& !in + IRAMTFI,IRFIRATE) !inout + QINSUR = QINSUR + (IRFIRATE/DT) ![m/s] + END IF +! irrigation: call micro irrigation-pvk + IF((CROPLU .EQV. .TRUE.) .AND. (IRAMTMI .GT. 0.0))THEN + ! call micro irrigation, assuming we implement drip in first layer + ! of the Noah-MP. Change layer 1 moisture wrt to MI rate-pvk + CALL MICRO_IRRIGATION(parameters,NSOIL,DT,SH2O,SMC,SICE,MIFAC, & !in + IRAMTMI,IRMIRATE) !inout + SH2O(1) = SH2O(1) + (IRMIRATE/(-1*ZSOIL(1))) + END IF + ! lake/soil water balances IF (IST == 2) THEN ! lake @@ -7594,6 +7854,342 @@ SUBROUTINE WDFCND2 (parameters,WDF,WCND,SMC,SICE,ISOIL) END SUBROUTINE WDFCND2 +!==========begin irrigation subroutines============================================================ + SUBROUTINE TRIGGER_IRRIGATION(parameters,NSOIL,ZSOIL,SH2O,FVEG, & !in + JULIAN,IRRFRA,LAI, & !in + SIFAC,MIFAC,FIFAC, & !in + IRCNTSI,IRCNTMI,IRCNTFI, & !inout + IRAMTSI,IRAMTMI,IRAMTFI) !inout + !----------------------------------------------------------------------------------------------- + ! This subroutine trigger irrigation if soil moisture less than the management allowable deficit + ! (MAD) and estimate irrigation water depth (m) using current rootzone soil moisture and field + ! capacity. There are two options here to trigger the irrigation scheme based on MAD + ! OPT_IRR = 1 -> if irrigated fraction > threshold fraction + ! OPT_IRR = 2 -> if irrigated fraction > threshold fraction and within crop season + ! OPT_IRR = 3 -> if irrigated fraction > threshold fraction and LAI > threshold LAI + ! Author: Prasanth Valayamkunnath (NCAR) + ! Date : 08/06/2020 + !----------------------------------------------------------------------------------------------- + IMPLICIT NONE + ! ---------------------------------------------------------------------------------------------- + ! inputs + type (noahmp_parameters), intent(in) :: parameters + INTEGER, INTENT(IN) :: NSOIL ! number of soil layers + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL ! depth of layers from surface, [m] + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O ! volumteric liquid water content [%] + REAL, INTENT(IN) :: FVEG ! green vegetation fraction [-] + REAL, INTENT(IN) :: IRRFRA ! irrigated area fraction [-] + REAL, INTENT(IN) :: LAI ! leaf area index [m^2/m^2] + REAL, INTENT(IN) :: JULIAN ! julian day + REAL, INTENT(IN) :: SIFAC ! sprinkler irrigation fraction [-] + REAL, INTENT(IN) :: MIFAC ! micro irrigation fraction [-] + REAL, INTENT(IN) :: FIFAC ! flood irrigation fraction [-] + ! inouts + INTEGER, INTENT(INOUT):: IRCNTSI ! irrigation event number, Sprinkler + INTEGER, INTENT(INOUT):: IRCNTMI ! irrigation event number, Micro + INTEGER, INTENT(INOUT):: IRCNTFI ! irrigation event number, Flood + REAL, INTENT(INOUT):: IRAMTSI ! irrigation water amount [m] to be applied, Sprinkler + REAL, INTENT(INOUT):: IRAMTMI ! irrigation water amount [m] to be applied, Micro + REAL, INTENT(INOUT):: IRAMTFI ! irrigation water amount [m] to be applied, Flood + ! local + REAL :: SMCAVL ! available soil moisture [m] at timestep + REAL :: SMCLIM ! maximum available moisture [m] (FC-PWD) + REAL :: SMCSAT ! maximum saturation moisture [m] (POROSITY-FC) + REAL :: IRRWATAMT ! irrigation water amount [m] + LOGICAL :: IRR_ACTIVE ! irrigation check + INTEGER :: K + !--------------------------------------------------------------------------------------------- + IRR_ACTIVE = .TRUE. + + ! check if irrigation is can be activated or not + IF(OPT_IRR .EQ. 2)THEN + ! activate irrigation if within crop season + IF ((JULIAN .LT. parameters%PLTDAY).OR.& + (JULIAN .GT. (parameters%HSDAY - parameters%IRR_HAR))) IRR_ACTIVE = .FALSE. + ELSE IF (OPT_IRR .EQ. 3) THEN + + ! activate if LAI > threshold LAI + IF(LAI .LT. parameters%IRR_LAI) IRR_ACTIVE = .FALSE. + + ELSE IF ( (OPT_IRR .GT. 3) .OR. (OPT_IRR .LT. 1)) THEN + IRR_ACTIVE = .FALSE. + END IF + + IF(IRR_ACTIVE)THEN + SMCAVL = 0.0 + SMCLIM = 0.0 + ! estimate available water and field capacity for the root zone + SMCAVL = (SH2O(1)-parameters%SMCWLT(1))*-1*ZSOIL(1) ! current soil water (m) + SMCLIM = (parameters%SMCREF(1)-parameters%SMCWLT(1))*-1*ZSOIL(1) ! available water (m) + DO K = 2, parameters%NROOT + SMCAVL = SMCAVL + (SH2O(K)-parameters%SMCWLT(K))*(ZSOIL(K-1) - ZSOIL(K)) + SMCLIM = SMCLIM + (parameters%SMCREF(K)-parameters%SMCWLT(K))*(ZSOIL(K-1) - ZSOIL(K)) + END DO + + ! check if root zone soil moisture < MAD + IF((SMCAVL/SMCLIM) .LE. parameters%IRR_MAD) THEN + ! parameters%IRR_MAD- calibratable + ! amount of water need to be added to bring soil moisture back to + ! field capacity, i.e., irrigation water amount (m) + IRRWATAMT = (SMCLIM - SMCAVL)*IRRFRA*FVEG + ! sprinkler irrigation amount (m) based on 2D SIFAC + IF((IRAMTSI .EQ. 0.0) .AND. (SIFAC .GT. 0.0) .AND. (OPT_IRRM .EQ. 0)) THEN + IRAMTSI = SIFAC*IRRWATAMT + IRCNTSI = IRCNTSI + 1 + ! sprinkler irrigation amount (m) based on namelist choice + ELSE IF ((IRAMTSI .EQ. 0.0) .AND. (OPT_IRRM .EQ. 1)) THEN + IRAMTSI = IRRWATAMT + IRCNTSI = IRCNTSI + 1 + END IF + ! micro irrigation amount (m) based on 2D MIFAC + IF((IRAMTMI .EQ. 0.0) .AND. (MIFAC .GT. 0.0) .AND. (OPT_IRRM .EQ. 0)) THEN + IRAMTMI = MIFAC*IRRWATAMT + IRCNTMI = IRCNTMI + 1 + ! micro irrigation amount (m) based on namelist choice + ELSE IF ((IRAMTMI .EQ. 0.0) .AND. (OPT_IRRM .EQ. 2)) THEN + IRAMTMI = IRRWATAMT + IRCNTMI = IRCNTMI + 1 + END IF + ! flood irrigation amount (m): Assumed to saturate top two layers and + ! third layer to FC. As water moves from one end of the field to + ! another, surface layers will be saturated. + ! flood irrigation amount (m) based on 2D FIFAC + IF((IRAMTFI .EQ. 0.0) .AND. (FIFAC .GT. 0.0) .AND. (OPT_IRRM .EQ. 0)) THEN + IRAMTFI = FIFAC*(IRRWATAMT)*(parameters%FILOSS+1) + IRCNTFI = IRCNTFI + 1 + !flood irrigation amount (m) based on namelist choice + ELSE IF((IRAMTFI .EQ. 0.0) .AND. (OPT_IRRM .EQ. 3)) THEN + IRAMTFI = (IRRWATAMT)*(parameters%FILOSS+1) + IRCNTFI = IRCNTFI + 1 + END IF + ELSE + IRRWATAMT = 0.0 + IRAMTSI = 0.0 + IRAMTMI = 0.0 + IRAMTFI = 0.0 + END IF + END IF + END SUBROUTINE TRIGGER_IRRIGATION + + !============================================================================================================ + + SUBROUTINE SPRINKLER_IRRIGATION(parameters,NSOIL,DT,SH2O,SMC,SICE,& !in + T2,WINDU,WINDV,EAIR,SIFAC, & !in + IRAMTSI,IREVPLOS,IRSIRATE) !inout + !--------------------------------------------------------------------------------------------- + ! This subroutine estimate irrigation water depth (m) based on sprinkler method defined in + ! chapter 11 of NRCS, Part 623 National Engineering Handbook. Irrigation water will be applied + ! over the canopy considering, present soil moisture, infiltration rate of the soil, and + ! evaporative loss. This subroutine will be called before CANWAT subroutine to estimate them + ! canopy water storage loss. + ! Author: Prasanth Valayamkunnath (NCAR) + ! Date : 08/06/2020 + !--------------------------------------------------------------------------------------------- + IMPLICIT NONE + ! -------------------------------------------------------------------------------------------- + ! inputs + type (noahmp_parameters), intent(in) :: parameters + INTEGER, INTENT(IN) :: NSOIL + REAL, INTENT(IN) :: DT + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE + REAL, INTENT(IN) :: T2 + REAL, INTENT(IN) :: WINDU + REAL, INTENT(IN) :: WINDV + REAL, INTENT(IN) :: EAIR + REAL, INTENT(IN) :: SIFAC ! sprinkler irrigation fraction + !inouts + REAL, INTENT(INOUT) :: IRAMTSI !total irrigation water amount [m] during this schedule + REAL, INTENT(INOUT) :: IREVPLOS !loss of irrigation water to evaporation,sprinkler [m/timestep] + REAL, INTENT(INOUT) :: IRSIRATE !rate of irrigation by sprinkler [m/timestep] + ! local + REAL :: FSUR !infiltration rate [m/s] + REAL :: TEMP_RATE + REAL :: WINDSPEED + REAL :: IRRLOSS !temporary var for irr loss [%] + REAL :: ESAT1 + !------------------------------------------------------------------------------------------- + ! estimate infiltration rate based on Philips Eq. + CALL IRR_PHILIP_INFIL(parameters,SMC,SH2O,SICE,DT,NSOIL,FSUR) + ! irrigation rate of sprinkler + TEMP_RATE = parameters%SPRIR_RATE*(1/1000.)*DT/3600. !NRCS rate/time step - calibratable + IRSIRATE = MIN(FSUR*DT,IRAMTSI,TEMP_RATE) !Limit the application rate to minimum of infiltration rate + !and to the NRCS recommended rate, (m) + + ! evaporative loss from droplets: Based on Bavi et al., (2009). Evaporation + ! losses from sprinkler irrigation systems under various operating + ! conditions. Journal of Applied Sciences, 9(3), 597-600. + WINDSPEED = SQRT((WINDU**2.0)+(WINDV**2.0)) ! [m/s] + ESAT1 = 610.8*EXP((17.27*(T2-273.15))/(237.3+(T2-273.15))) ! [Pa] + IF(T2 .GT. 273.15)THEN ! Equation (3) + IRRLOSS = 4.375*(EXP(0.106*WINDSPEED))*(((ESAT1-EAIR)*0.01)**(-0.092))*((T2-273.15)**(-0.102)) ! [%] + ELSE ! Equation (4) + IRRLOSS = 4.337*(EXP(0.077*WINDSPEED))*(((ESAT1-EAIR)*0.01)**(-0.098)) ! [%] + END IF + IF(ISNAN(IRRLOSS))IRRLOSS=4.0 ! In case if IRRLOSS is NaN + + ! Sprinkler water (m) for sprinkler fraction + IRSIRATE = IRSIRATE * SIFAC + IF(IRSIRATE .GE. IRAMTSI)THEN + IRSIRATE = IRAMTSI + IRAMTSI = 0.0 + ELSE + IRAMTSI = IRAMTSI - IRSIRATE + END IF + IREVPLOS = IRSIRATE*IRRLOSS*(1./100.) + IRSIRATE = IRSIRATE-IREVPLOS + END SUBROUTINE SPRINKLER_IRRIGATION + !============================================================================================================ + SUBROUTINE MICRO_IRRIGATION(parameters,NSOIL,DT,SH2O,SMC,SICE,MIFAC, & !in + IRAMTMI,IRMIRATE) !inout + !--------------------------------------------------------------------------------------------- + ! This subroutine estimate irrigation water depth (m) based on Micro irrigation method defined + ! in chapter 7 of NRCS, Part 623 National Engineering Handbook. Irrigation water will be applied + ! under the canopy, within first layer (at ~5 cm depth) considering current soil moisture. + ! This subroutine will be called after CANWAT. + ! Author: Prasanth Valayamkunnath (NCAR) + ! Date : 08/06/2020 + !--------------------------------------------------------------------------------------------- + IMPLICIT NONE + ! -------------------------------------------------------------------------------------------- + ! inputs + type (noahmp_parameters), intent(in) :: parameters + INTEGER, INTENT(IN) :: NSOIL + REAL, INTENT(IN) :: DT + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE + REAL, INTENT(IN) :: MIFAC ! micro irrigation fraction + ! inout + REAL, INTENT(INOUT) :: IRAMTMI !irrigation water amount [m] + REAL, INTENT(INOUT) :: IRMIRATE !rate of irrigation by micro [m/time step] + ! local + REAL :: FSUR !infiltration rate [m/s] + REAL :: TEMP_RATE + !----------------------------------------------------------------------------------------------------- + ! estimate infiltration rate based on Philips Eq. + CALL IRR_PHILIP_INFIL(parameters,SMC,SH2O,SICE,DT,NSOIL,FSUR) + ! irrigation rate of micro irrigation + TEMP_RATE = parameters%MICIR_RATE*(1./1000.)*DT/3600. !NRCS rate/time step - calibratable + IRMIRATE = MIN(0.5*FSUR*DT,IRAMTMI,TEMP_RATE) !Limit the application rate to minimum + !of 0.5*infiltration rate + !and to the NRCS recommended rate, (m) + IRMIRATE = IRMIRATE * MIFAC + IF(IRMIRATE .GE. IRAMTMI)THEN + IRMIRATE = IRAMTMI + IRAMTMI = 0.0 + ELSE + IRAMTMI = IRAMTMI - IRMIRATE + END IF + END SUBROUTINE MICRO_IRRIGATION + !============================================================================================================ + + SUBROUTINE FLOOD_IRRIGATION(parameters,NSOIL,DT,SH2O,SMC,SICE,FIFAC,& !in + IRAMTFI,IRFIRATE) !inout + !--------------------------------------------------------------------------------------------- + ! This subroutine estimate irrigation water depth (m) based on surface flooding irrigation method + ! defined in chapter 4 of NRCS, Part 623 National Engineering Handbook. Irrigation water will + ! be applied on the surface based on present soil moisture and infiltration rate of the soil. + ! This subroutine will be called after CANWAT subroutine to estimate them. Flooding or overland + ! flow is based on infiltration excess! + ! Author: Prasanth Valayamkunnath (NCAR) + ! Date : 08/06/2020 + !--------------------------------------------------------------------------------------------- + IMPLICIT NONE + ! -------------------------------------------------------------------------------------------- + ! inputs + type (noahmp_parameters), intent(in) :: parameters + INTEGER, INTENT(IN) :: NSOIL + REAL, INTENT(IN) :: DT + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE + REAL, INTENT(IN) :: FIFAC !fraction of grid under micro irrigation(0 to 1) + ! inout + REAL, INTENT(INOUT) :: IRAMTFI !irrigation water amount [m] + REAL, INTENT(INOUT) :: IRFIRATE !irrigation water rate by micro [m/timestep] + ! local + REAL :: FSUR !infiltration rate [m/s] + REAL :: TEMP_RATE + !----------------------------------------------------------------------------------------------------- + ! estimate infiltration rate based on Philips Eq. + CALL IRR_PHILIP_INFIL(parameters,SMC,SH2O,SICE,DT,NSOIL,FSUR) + ! irrigation rate of flood irrigation. It should be + ! greater than infiltration rate to get infiltration + ! excess runoff at the time of application + IRFIRATE = FSUR*DT*parameters%FIRTFAC !Limit the application rate to + !fac*infiltration rate + IRFIRATE = IRFIRATE * FIFAC + IF(IRFIRATE .GE. IRAMTFI)THEN + IRFIRATE = IRAMTFI + IRAMTFI = 0.0 + ELSE + IRAMTFI = IRAMTFI - IRFIRATE + END IF + + END SUBROUTINE FLOOD_IRRIGATION + + !============================================================================================================ + SUBROUTINE IRR_PHILIP_INFIL(parameters,SMC,SH2O,SICE,DT,NSOIL, & ! in + FSUR) ! out + !--------------------------------------------------------------------------------------------- + ! This function estimate infiltration rate based on Philip's two parameter equation (Eq. 2) + ! presented in Valiantzas (2010). New linearized two-parameter infiltration equation for direct + ! determination of conductivity and sorptivity, J. Hydrology. + ! Author: Prasanth Valayamkunnath (NCAR) + ! Date : 08/06/2020 + !--------------------------------------------------------------------------------------------- + IMPLICIT NONE + ! -------------------------------------------------------------------------------------------- + type (noahmp_parameters), intent(in) :: parameters + INTEGER, INTENT(IN) :: NSOIL !number of soil layers + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !soil moisture content [m3/m3] + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O !soil water content [m3/m3] + REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3] + REAL, INTENT(IN) :: DT !time-step (sec) + + ! outputs + REAL, INTENT(OUT):: FSUR !surface infiltration rate (m/s) + ! local variables + REAL :: WDF !soil water diffusivity (m2/s) + REAL :: WCND !soil water conductivity[m/s] + REAL :: SP !sorptivity (LT^-1/2) + REAL :: AP !intial hydraulic conductivity (m/s,L/T) + REAL :: SICEMAX + INTEGER :: ISOIL,K + !--------------------------------------------------------------------------------- + ! maximum ice fraction + SICEMAX = 0.0 + DO K = 1,NSOIL + IF (SICE(K) > SICEMAX) SICEMAX = SICE(K) + END DO + + ! estimate initial soil hydraulic conductivty and diffusivity (Ki, D(theta) in the equation) + ISOIL = 1 + CALL WDFCND2 (parameters,WDF,WCND,SH2O(ISOIL),SICEMAX,ISOIL) + + ! sorptivity based on Eq. 10b from Kutilek, Miroslav, and Jana Valentova (1986) + ! sorptivity approximations. Transport in Porous Media 1.1, 57-62. + SP = SQRT(2.0 * (parameters%SMCMAX(ISOIL) - SMC(ISOIL)) * (parameters%DWSAT(ISOIL) - WDF)) + + ! parameter A in Eq. 9 of Valiantzas (2010) is given by + AP = MIN(WCND,(2.0/3.0)*parameters%DKSAT(ISOIL)) + AP = MAX(AP,(1.0/3.0)*parameters%DKSAT(ISOIL)) + + ! maximun infiltration rate, m + FSUR = 0.5*SP*((DT)**(-0.5))+AP ! m/s + !PRINT*,'SP=',SP + !PRINT*,'AP=',AP + !PRINT*,'FSUR=',FSUR + !PRINT*,'WCND=',WCND + FSUR = MAX(0.0,FSUR) + !FSUR = MIN(WCND,FSUR) + + END SUBROUTINE IRR_PHILIP_INFIL + +!=========end irrigation subroutines================================================================ + !== begin groundwater ============================================================================== SUBROUTINE GROUNDWATER(parameters,NSNOW ,NSOIL ,DT ,SICE ,ZSOIL , & !in @@ -8527,6 +9123,7 @@ SUBROUTINE CO2FLUX_CROP (parameters, REAL :: STMSMN REAL :: SAPM !stem area per unit mass (m2/g) REAL :: DIEST + REAL :: LFCONVERT !leaf to grain conversion ! Zhe Zhang 2020-07-13 REAL :: STCONVERT !stem to grain conversion [g/m2/s] REAL :: RTCONVERT !root to grain conversion [g/m2/s] ! -------------------------- constants ------------------------------- @@ -8629,15 +9226,23 @@ SUBROUTINE CO2FLUX_CROP (parameters, GPP = CBHYDRAFX* 0.4 !!g/m2/s C 0.4=12/30, CH20 to C + LFCONVERT = 0.0 ! Zhe Zhang 2020-07-13 STCONVERT = 0.0 RTCONVERT = 0.0 - IF(PGS==6) THEN - STCONVERT = STMASS*(0.00005*DT/3600.0) - STMASS = STMASS - STCONVERT - RTCONVERT = RTMASS*(0.0005*DT/3600.0) - RTMASS = RTMASS - RTCONVERT - GRAIN = GRAIN + STCONVERT + RTCONVERT - END IF + LFCONVERT = LFMASS*(parameters%LFCT(PGS)*DT/3600.0) + STCONVERT = STMASS*(parameters%STCT(PGS)*DT/3600.0) + RTCONVERT = RTMASS*(parameters%RTCT(PGS)*DT/3600.0) + LFMASS = LFMASS - LFCONVERT + STMASS = STMASS - STCONVERT + RTMASS = RTMASS - RTCONVERT + GRAIN = GRAIN + STCONVERT + RTCONVERT + LFCONVERT + !IF(PGS==6) THEN + ! STCONVERT = STMASS*(0.00005*DT/3600.0) + ! STMASS = STMASS - STCONVERT + ! RTCONVERT = RTMASS*(0.0005*DT/3600.0) + ! RTMASS = RTMASS - RTCONVERT + ! GRAIN = GRAIN + STCONVERT + RTCONVERT + !END IF IF(RTMASS.LT.0.0) THEN RTTOVR = NPPR @@ -8981,6 +9586,55 @@ END SUBROUTINE PSN_CROP ! ! end subroutine bvocflux ! ================================================================================================== + +!***************** SUBROUTINES FOR GECROS CROP SIMULATION *************** +!*----------------------------------------------------------------------* +!* SUBROUTINE EMERG * +!* Purpose: This subroutine calculates germination and emergence of * +!* the crop * +!* * +!* FORMAL PARAMETERS: (I=input,O=output,C=control,IN=init,T=time) * +!* * +!* name type meaning units class * +!* ---- ---- ------- ----- ----- * +!* nowdate C12 Actual date dd.mm.yy I * +!* DT R4 Time step of integration s I * +!* DD R4 Drilling depth cm I * +!* TSOIL R4 Soil temperature in first layer K I * +!* TBEM R4 Temperature threshold oC I * +!* EMA R4 Intercept of function for emergence oC I * +!* EMB R4 Slope of function for emergence oC I * +!* TTEM R4 Cumulative temperature sum for emergence oC I/O * +!* EMERGENCE LOG Flag for emergence - I/O * +!* STATE_GECROS(41) = emerged yes/no * +!* STATE_GECROS(43) = TTEM * +!*----------------------------------------------------------------------* + +SUBROUTINE EMERG(DT, TSOIL, DD, TBEM, EMA, EMB, STATE_GECROS) + IMPLICIT NONE + REAL, INTENT(IN) :: DT, TSOIL, DD, TBEM, EMA, EMB + REAL, DIMENSION(1:60), INTENT(INOUT) :: STATE_GECROS + REAL :: EMTH, TINT + SAVE + + IF ((TSOIL-273.15).LT.TBEM) THEN + ELSE + STATE_GECROS(43) = STATE_GECROS(43) + (TSOIL-273.15-TBEM)/(86400./DT) + ENDIF + + EMTH = EMA + EMB*DD + + IF (STATE_GECROS(43).GT.EMTH) THEN + STATE_GECROS(41)=1. +! write(*,*) 'Crop emerged on ', nowdate +! read(*,*) + ELSE + STATE_GECROS(41)=-1. + ENDIF + + RETURN +END SUBROUTINE EMERG + ! ********************************* end of carbon subroutines ***************************** ! ================================================================================================== @@ -8988,7 +9642,7 @@ END SUBROUTINE PSN_CROP subroutine noahmp_options(idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc ,iopt_frz , & iopt_inf ,iopt_rad ,iopt_alb ,iopt_snf ,iopt_tbot, iopt_stc, & - iopt_rsf , iopt_soil, iopt_pedo, iopt_crop ) + iopt_rsf , iopt_soil, iopt_pedo, iopt_crop, iopt_irr, iopt_irrm) implicit none @@ -9009,8 +9663,15 @@ subroutine noahmp_options(idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc INTEGER, INTENT(IN) :: iopt_rsf !surface resistance (1->Sakaguchi/Zeng; 2->Seller; 3->mod Sellers; 4->1+snow) INTEGER, INTENT(IN) :: iopt_soil !soil parameters set-up option INTEGER, INTENT(IN) :: iopt_pedo !pedo-transfer function (1->Saxton and Rawls) - INTEGER, INTENT(IN) :: iopt_crop !crop model option (0->none; 1->Liu et al.) - + INTEGER, INTENT(IN) :: iopt_crop !crop model option (0->none; 1->Liu et al.; 2->Gecros) + INTEGER, INTENT(IN) :: iopt_irr ! 0 -> No irrigation; + ! 1 -> Irrigation ON; + ! 2 -> irrigation trigger based on crop season Planting and harvesting dates; + ! 3 -> irrigation trigger based on LAI threshold + INTEGER, INTENT(IN) :: iopt_irrm ! 0 -> all methods ON based on geo_em inputs + ! 1 -> sprinkler ON + ! 2 -> micro/drip ON + ! 3 -> flood irrigation ON ! ------------------------------------------------------------------------------------------------- dveg = idveg @@ -9030,6 +9691,8 @@ subroutine noahmp_options(idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc opt_soil = iopt_soil opt_pedo = iopt_pedo opt_crop = iopt_crop + opt_irr = iopt_irr + opt_irrm = iopt_irrm end subroutine noahmp_options @@ -9055,9 +9718,17 @@ MODULE NOAHMP_TABLES INTEGER :: ISCROP_TABLE INTEGER :: EBLFOREST_TABLE INTEGER :: NATURAL_TABLE - INTEGER :: LOW_DENSITY_RESIDENTIAL_TABLE - INTEGER :: HIGH_DENSITY_RESIDENTIAL_TABLE - INTEGER :: HIGH_INTENSITY_INDUSTRIAL_TABLE + INTEGER :: LCZ_1_TABLE + INTEGER :: LCZ_2_TABLE + INTEGER :: LCZ_3_TABLE + INTEGER :: LCZ_4_TABLE + INTEGER :: LCZ_5_TABLE + INTEGER :: LCZ_6_TABLE + INTEGER :: LCZ_7_TABLE + INTEGER :: LCZ_8_TABLE + INTEGER :: LCZ_9_TABLE + INTEGER :: LCZ_10_TABLE + INTEGER :: LCZ_11_TABLE REAL :: CH2OP_TABLE(MVT) !maximum intercepted h2o per unit lai+sai (mm) REAL :: DLEAF_TABLE(MVT) !characteristic leaf dimension (m) @@ -9067,6 +9738,7 @@ MODULE NOAHMP_TABLES REAL :: DEN_TABLE(MVT) !tree density (no. of trunks per m2) REAL :: RC_TABLE(MVT) !tree crown radius (m) REAL :: MFSNO_TABLE(MVT) !snowmelt curve parameter () + REAL :: SCFFAC_TABLE(MVT) !snow cover factor (m) (replace original hard-coded 2.5*z0 in SCF formulation) REAL :: SAIM_TABLE(MVT,12) !monthly stem area index, one-sided REAL :: LAIM_TABLE(MVT,12) !monthly leaf area index, one-sided REAL :: SLA_TABLE(MVT) !single-side leaf area per Kg [m2/kg] @@ -9158,7 +9830,8 @@ MODULE NOAHMP_TABLES REAL :: FSATMX_TABLE !maximum surface saturated fraction (global mean) REAL :: Z0SNO_TABLE !snow surface roughness length (m) (0.002) REAL :: SSI_TABLE !liquid water holding capacity for snowpack (m3/m3) (0.03) - REAL :: SNOW_RET_FAC_TABLE !snowpack water release timescale factor (1/s) + REAL :: SNOW_RET_FAC_TABLE !snowpack water release timescale factor (1/s) + REAL :: SNOW_EMIS_TABLE!snow emissivity REAL :: SWEMX_TABLE !new snow mass to fully cover old snow (mm) REAL :: TAU0_TABLE !tau0 from Yang97 eqn. 10a REAL :: GRAIN_GROWTH_TABLE !growth from vapor diffusion Yang97 eqn. 10b @@ -9174,6 +9847,18 @@ MODULE NOAHMP_TABLES REAL :: RSURF_SNOW_TABLE !surface resistance for snow(s/m) REAL :: RSURF_EXP_TABLE !exponent in the shape parameter for soil resistance option 1 +! MPTABLE.TBL irrigation parameters + + REAL :: IRR_FRAC_TABLE ! irrigation Fraction + INTEGER :: IRR_HAR_TABLE ! number of days before harvest date to stop irrigation + REAL :: IRR_LAI_TABLE ! Minimum lai to trigger irrigation + REAL :: IRR_MAD_TABLE ! management allowable deficit (0-1) + REAL :: FILOSS_TABLE ! fraction of flood irrigation loss (0-1) + REAL :: SPRIR_RATE_TABLE ! mm/h, sprinkler irrigation rate + REAL :: MICIR_RATE_TABLE ! mm/h, micro irrigation rate + REAL :: FIRTFAC_TABLE ! flood application rate factor + REAL :: IR_RAIN_TABLE ! maximum precipitation to stop irrigation trigger + ! MPTABLE.TBL crop parameters INTEGER :: DEFAULT_CROP_TABLE ! Default crop index @@ -9190,6 +9875,18 @@ MODULE NOAHMP_TABLES REAL :: GDDS4_TABLE(NCROP) ! GDD from seeding to intial reproductive REAL :: GDDS5_TABLE(NCROP) ! GDD from seeding to pysical maturity + REAL :: C3PSNI_TABLE(NCROP) !photosynthetic pathway: 0. = c4, 1. = c3 ! Zhe Zhang 2020-07-03 + REAL :: KC25I_TABLE(NCROP) !co2 michaelis-menten constant at 25c (pa) + REAL :: AKCI_TABLE(NCROP) !q10 for kc25 + REAL :: KO25I_TABLE(NCROP) !o2 michaelis-menten constant at 25c (pa) + REAL :: AKOI_TABLE(NCROP) !q10 for ko25 + REAL :: VCMX25I_TABLE(NCROP) !maximum rate of carboxylation at 25c (umol co2/m**2/s) + REAL :: AVCMXI_TABLE(NCROP) !q10 for vcmx25 + REAL :: BPI_TABLE(NCROP) !minimum leaf conductance (umol/m**2/s) + REAL :: MPI_TABLE(NCROP) !slope of conductance-to-photosynthesis relationship + REAL :: QE25I_TABLE(NCROP) !quantum efficiency at 25c (umol co2 / umol photon) + REAL :: FOLNMXI_TABLE(NCROP) !foliage nitrogen concentration when + INTEGER :: C3C4_TABLE(NCROP) ! photosynthetic pathway: 1. = c3 2. = c4 REAL :: AREF_TABLE(NCROP) ! reference maximum CO2 assimulation rate REAL :: PSNRF_TABLE(NCROP) ! CO2 assimulation reduction factor(0-1) (caused by non-modeling part,e.g.pest,weeds) @@ -9220,6 +9917,9 @@ MODULE NOAHMP_TABLES REAL :: STPT_TABLE(NCROP,NSTAGE) ! fraction of carbohydrate flux to stem REAL :: RTPT_TABLE(NCROP,NSTAGE) ! fraction of carbohydrate flux to root REAL :: GRAINPT_TABLE(NCROP,NSTAGE) ! fraction of carbohydrate flux to grain + REAL :: LFCT_TABLE(NCROP,NSTAGE) ! fraction of carbohydrate translocation from leaf to grain ! Zhe Zhang 2020-07-13 + REAL :: STCT_TABLE(NCROP,NSTAGE) ! stem to grain + REAL :: RTCT_TABLE(NCROP,NSTAGE) ! root to grain REAL :: BIO2LAI_TABLE(NCROP) ! leaf are per living leaf biomass [m^2/kg] ! MPTABLE.TBL optional parameters @@ -9292,9 +9992,17 @@ subroutine read_mp_veg_parameters(DATASET_IDENTIFIER) INTEGER :: ISCROP INTEGER :: EBLFOREST INTEGER :: NATURAL - INTEGER :: LOW_DENSITY_RESIDENTIAL - INTEGER :: HIGH_DENSITY_RESIDENTIAL - INTEGER :: HIGH_INTENSITY_INDUSTRIAL + INTEGER :: LCZ_1 + INTEGER :: LCZ_2 + INTEGER :: LCZ_3 + INTEGER :: LCZ_4 + INTEGER :: LCZ_5 + INTEGER :: LCZ_6 + INTEGER :: LCZ_7 + INTEGER :: LCZ_8 + INTEGER :: LCZ_9 + INTEGER :: LCZ_10 + INTEGER :: LCZ_11 REAL, DIMENSION(MVT) :: SAI_JAN,SAI_FEB,SAI_MAR,SAI_APR,SAI_MAY,SAI_JUN, & SAI_JUL,SAI_AUG,SAI_SEP,SAI_OCT,SAI_NOV,SAI_DEC @@ -9302,15 +10010,15 @@ subroutine read_mp_veg_parameters(DATASET_IDENTIFIER) LAI_JUL,LAI_AUG,LAI_SEP,LAI_OCT,LAI_NOV,LAI_DEC REAL, DIMENSION(MVT) :: RHOL_VIS, RHOL_NIR, RHOS_VIS, RHOS_NIR, & TAUL_VIS, TAUL_NIR, TAUS_VIS, TAUS_NIR - REAL, DIMENSION(MVT) :: CH2OP, DLEAF, Z0MVT, HVT, HVB, DEN, RC, MFSNO, XL, CWPVT, C3PSN, KC25, AKC, KO25, AKO, & + REAL, DIMENSION(MVT) :: CH2OP, DLEAF, Z0MVT, HVT, HVB, DEN, RC, MFSNO, SCFFAC, XL, CWPVT, C3PSN, KC25, AKC, KO25, AKO, & AVCMX, AQE, LTOVRC, DILEFC, DILEFW, RMF25 , SLA , FRAGR , TMIN , VCMX25, TDLEF , & BP, MP, QE25, RMS25, RMR25, ARM, FOLNMX, WDPOOL, WRRAT, MRP, NROOT, RGL, RS, HS, TOPT, RSMAX, & SLAREA, EPS1, EPS2, EPS3, EPS4, EPS5 NAMELIST / noahmp_usgs_veg_categories / VEG_DATASET_DESCRIPTION, NVEG NAMELIST / noahmp_usgs_parameters / ISURBAN, ISWATER, ISBARREN, ISICE, ISCROP, EBLFOREST, NATURAL, & - LOW_DENSITY_RESIDENTIAL, HIGH_DENSITY_RESIDENTIAL, HIGH_INTENSITY_INDUSTRIAL, & - CH2OP, DLEAF, Z0MVT, HVT, HVB, DEN, RC, MFSNO, XL, CWPVT, C3PSN, KC25, AKC, KO25, AKO, AVCMX, AQE, & + LCZ_1,LCZ_2,LCZ_3,LCZ_4,LCZ_5,LCZ_6,LCZ_7,LCZ_8,LCZ_9,LCZ_10,LCZ_11,& + CH2OP, DLEAF, Z0MVT, HVT, HVB, DEN, RC, MFSNO, SCFFAC, XL, CWPVT, C3PSN, KC25, AKC, KO25, AKO, AVCMX, AQE, & LTOVRC, DILEFC, DILEFW, RMF25 , SLA , FRAGR , TMIN , VCMX25, TDLEF , BP, MP, QE25, RMS25, RMR25, ARM, & FOLNMX, WDPOOL, WRRAT, MRP, NROOT, RGL, RS, HS, TOPT, RSMAX, & SAI_JAN, SAI_FEB, SAI_MAR, SAI_APR, SAI_MAY, SAI_JUN,SAI_JUL,SAI_AUG,SAI_SEP,SAI_OCT,SAI_NOV,SAI_DEC, & @@ -9319,8 +10027,8 @@ subroutine read_mp_veg_parameters(DATASET_IDENTIFIER) NAMELIST / noahmp_modis_veg_categories / VEG_DATASET_DESCRIPTION, NVEG NAMELIST / noahmp_modis_parameters / ISURBAN, ISWATER, ISBARREN, ISICE, ISCROP, EBLFOREST, NATURAL, & - LOW_DENSITY_RESIDENTIAL, HIGH_DENSITY_RESIDENTIAL, HIGH_INTENSITY_INDUSTRIAL, & - CH2OP, DLEAF, Z0MVT, HVT, HVB, DEN, RC, MFSNO, XL, CWPVT, C3PSN, KC25, AKC, KO25, AKO, AVCMX, AQE, & + LCZ_1,LCZ_2,LCZ_3,LCZ_4,LCZ_5,LCZ_6,LCZ_7,LCZ_8,LCZ_9,LCZ_10,LCZ_11, & + CH2OP, DLEAF, Z0MVT, HVT, HVB, DEN, RC, MFSNO, SCFFAC, XL, CWPVT, C3PSN, KC25, AKC, KO25, AKO, AVCMX, AQE, & LTOVRC, DILEFC, DILEFW, RMF25 , SLA , FRAGR , TMIN , VCMX25, TDLEF , BP, MP, QE25, RMS25, RMR25, ARM, & FOLNMX, WDPOOL, WRRAT, MRP, NROOT, RGL, RS, HS, TOPT, RSMAX, & SAI_JAN, SAI_FEB, SAI_MAR, SAI_APR, SAI_MAY, SAI_JUN,SAI_JUL,SAI_AUG,SAI_SEP,SAI_OCT,SAI_NOV,SAI_DEC, & @@ -9336,6 +10044,7 @@ subroutine read_mp_veg_parameters(DATASET_IDENTIFIER) DEN_TABLE = -1.E36 RC_TABLE = -1.E36 MFSNO_TABLE = -1.E36 + SCFFAC_TABLE = -1.E36 RHOL_TABLE = -1.E36 RHOS_TABLE = -1.E36 TAUL_TABLE = -1.E36 @@ -9383,9 +10092,17 @@ subroutine read_mp_veg_parameters(DATASET_IDENTIFIER) ISCROP_TABLE = -99999 EBLFOREST_TABLE = -99999 NATURAL_TABLE = -99999 - LOW_DENSITY_RESIDENTIAL_TABLE = -99999 - HIGH_DENSITY_RESIDENTIAL_TABLE = -99999 - HIGH_INTENSITY_INDUSTRIAL_TABLE = -99999 + LCZ_1_TABLE = -99999 + LCZ_2_TABLE = -99999 + LCZ_3_TABLE = -99999 + LCZ_4_TABLE = -99999 + LCZ_5_TABLE = -99999 + LCZ_6_TABLE = -99999 + LCZ_7_TABLE = -99999 + LCZ_8_TABLE = -99999 + LCZ_9_TABLE = -99999 + LCZ_10_TABLE = -99999 + LCZ_11_TABLE = -99999 inquire( file='MPTABLE.TBL', exist=file_named ) if ( file_named ) then @@ -9419,9 +10136,17 @@ subroutine read_mp_veg_parameters(DATASET_IDENTIFIER) ISCROP_TABLE = ISCROP EBLFOREST_TABLE = EBLFOREST NATURAL_TABLE = NATURAL - LOW_DENSITY_RESIDENTIAL_TABLE = LOW_DENSITY_RESIDENTIAL - HIGH_DENSITY_RESIDENTIAL_TABLE = HIGH_DENSITY_RESIDENTIAL - HIGH_INTENSITY_INDUSTRIAL_TABLE = HIGH_INTENSITY_INDUSTRIAL + LCZ_1_TABLE = LCZ_1 + LCZ_2_TABLE = LCZ_2 + LCZ_3_TABLE = LCZ_3 + LCZ_4_TABLE = LCZ_4 + LCZ_5_TABLE = LCZ_5 + LCZ_6_TABLE = LCZ_6 + LCZ_7_TABLE = LCZ_7 + LCZ_8_TABLE = LCZ_8 + LCZ_9_TABLE = LCZ_9 + LCZ_10_TABLE = LCZ_10 + LCZ_11_TABLE = LCZ_11 CH2OP_TABLE(1:NVEG) = CH2OP(1:NVEG) DLEAF_TABLE(1:NVEG) = DLEAF(1:NVEG) @@ -9431,6 +10156,7 @@ subroutine read_mp_veg_parameters(DATASET_IDENTIFIER) DEN_TABLE(1:NVEG) = DEN(1:NVEG) RC_TABLE(1:NVEG) = RC(1:NVEG) MFSNO_TABLE(1:NVEG) = MFSNO(1:NVEG) + SCFFAC_TABLE(1:NVEG) = SCFFAC(1:NVEG) XL_TABLE(1:NVEG) = XL(1:NVEG) CWPVT_TABLE(1:NVEG) = CWPVT(1:NVEG) C3PSN_TABLE(1:NVEG) = C3PSN(1:NVEG) @@ -9553,9 +10279,7 @@ subroutine read_mp_soil_parameters() READ (21,*) SLCATS WRITE( message , * ) 'SOIL TEXTURE CLASSIFICATION = ', TRIM ( SLTYPE ) , ' FOUND', & SLCATS,' CATEGORIES' -#ifdef HYDRO_D CALL wrf_message ( message ) -#endif DO LC=1,SLCATS READ (21,*) ITMP,BEXP_TABLE(LC),SMCDRY_TABLE(LC),F1_TABLE(LC),SMCMAX_TABLE(LC), & @@ -9672,12 +10396,12 @@ subroutine read_mp_global_parameters() integer :: ierr logical :: file_named - REAL :: CO2,O2,TIMEAN,FSATMX,Z0SNO,SSI,SNOW_RET_FAC, & + REAL :: CO2,O2,TIMEAN,FSATMX,Z0SNO,SSI,SNOW_RET_FAC,SNOW_EMIS,& SWEMX,TAU0,GRAIN_GROWTH,EXTRA_GROWTH,DIRT_SOOT,& BATS_COSZ,BATS_VIS_NEW,BATS_NIR_NEW,BATS_VIS_AGE,BATS_NIR_AGE,BATS_VIS_DIR,BATS_NIR_DIR,& RSURF_SNOW,RSURF_EXP - NAMELIST / noahmp_global_parameters / CO2,O2,TIMEAN,FSATMX,Z0SNO,SSI,SNOW_RET_FAC, & + NAMELIST / noahmp_global_parameters / CO2,O2,TIMEAN,FSATMX,Z0SNO,SSI,SNOW_RET_FAC,SNOW_EMIS,& SWEMX,TAU0,GRAIN_GROWTH,EXTRA_GROWTH,DIRT_SOOT,& BATS_COSZ,BATS_VIS_NEW,BATS_NIR_NEW,BATS_VIS_AGE,BATS_NIR_AGE,BATS_VIS_DIR,BATS_NIR_DIR,& RSURF_SNOW,RSURF_EXP @@ -9691,7 +10415,8 @@ subroutine read_mp_global_parameters() Z0SNO_TABLE = -1.E36 SSI_TABLE = -1.E36 SNOW_RET_FAC_TABLE = -1.E36 - SWEMX_TABLE = -1.E36 + SNOW_EMIS_TABLE = -1.E36 + SWEMX_TABLE = -1.E36 TAU0_TABLE = -1.E36 GRAIN_GROWTH_TABLE = -1.E36 EXTRA_GROWTH_TABLE = -1.E36 @@ -9728,6 +10453,7 @@ subroutine read_mp_global_parameters() Z0SNO_TABLE = Z0SNO SSI_TABLE = SSI SNOW_RET_FAC_TABLE = SNOW_RET_FAC + SNOW_EMIS_TABLE = SNOW_EMIS SWEMX_TABLE = SWEMX TAU0_TABLE = TAU0 GRAIN_GROWTH_TABLE = GRAIN_GROWTH @@ -9762,6 +10488,17 @@ subroutine read_mp_crop_parameters() REAL, DIMENSION(NCROP) :: GDDS3 REAL, DIMENSION(NCROP) :: GDDS4 REAL, DIMENSION(NCROP) :: GDDS5 + REAL, DIMENSION(NCROP) :: C3PSN ! this session copied from stomata parameters Zhe Zhang 2020-07-13 + REAL, DIMENSION(NCROP) :: KC25 + REAL, DIMENSION(NCROP) :: AKC + REAL, DIMENSION(NCROP) :: KO25 + REAL, DIMENSION(NCROP) :: AKO + REAL, DIMENSION(NCROP) :: AVCMX + REAL, DIMENSION(NCROP) :: VCMX25 + REAL, DIMENSION(NCROP) :: BP + REAL, DIMENSION(NCROP) :: MP + REAL, DIMENSION(NCROP) :: FOLNMX + REAL, DIMENSION(NCROP) :: QE25 ! until here INTEGER, DIMENSION(NCROP) :: C3C4 REAL, DIMENSION(NCROP) :: AREF REAL, DIMENSION(NCROP) :: PSNRF @@ -9788,12 +10525,20 @@ subroutine read_mp_crop_parameters() REAL, DIMENSION(NCROP) :: STPT_S1,STPT_S2,STPT_S3,STPT_S4,STPT_S5,STPT_S6,STPT_S7,STPT_S8 REAL, DIMENSION(NCROP) :: RTPT_S1,RTPT_S2,RTPT_S3,RTPT_S4,RTPT_S5,RTPT_S6,RTPT_S7,RTPT_S8 REAL, DIMENSION(NCROP) :: GRAINPT_S1,GRAINPT_S2,GRAINPT_S3,GRAINPT_S4,GRAINPT_S5,GRAINPT_S6,GRAINPT_S7,GRAINPT_S8 + REAL, DIMENSION(NCROP) :: LFCT_S1,LFCT_S2,LFCT_S3,LFCT_S4,LFCT_S5,LFCT_S6,LFCT_S7,LFCT_S8 + REAL, DIMENSION(NCROP) :: STCT_S1,STCT_S2,STCT_S3,STCT_S4,STCT_S5,STCT_S6,STCT_S7,STCT_S8 + REAL, DIMENSION(NCROP) :: RTCT_S1,RTCT_S2,RTCT_S3,RTCT_S4,RTCT_S5,RTCT_S6,RTCT_S7,RTCT_S8 REAL, DIMENSION(NCROP) :: BIO2LAI - NAMELIST / noahmp_crop_parameters /DEFAULT_CROP, PLTDAY, HSDAY, PLANTPOP, IRRI, GDDTBASE, GDDTCUT, GDDS1, GDDS2, & - GDDS3, GDDS4, GDDS5, C3C4, AREF, PSNRF, I2PAR, TASSIM0, & - TASSIM1, TASSIM2, K, EPSI, Q10MR, FOLN_MX, LEFREEZ, & +! NAMELIST / noahmp_crop_parameters /DEFAULT_CROP, PLTDAY, HSDAY, PLANTPOP, IRRI, GDDTBASE, GDDTCUT, GDDS1, GDDS2, & +! GDDS3, GDDS4, GDDS5, C3C4, AREF, PSNRF, I2PAR, TASSIM0, & +! TASSIM1, TASSIM2, K, EPSI, Q10MR, FOLN_MX, LEFREEZ, & +! Zhe Zhang 2020-07-13 + NAMELIST / noahmp_crop_parameters /DEFAULT_CROP, PLTDAY, HSDAY, PLANTPOP, IRRI, GDDTBASE, GDDTCUT, GDDS1, GDDS2, GDDS3, GDDS4, GDDS5, & ! + C3PSN, KC25, AKC, KO25, AKO, AVCMX, VCMX25, BP, MP, FOLNMX, QE25, & ! parameters added from stomata + C3C4, AREF, PSNRF, I2PAR, TASSIM0, & + TASSIM1, TASSIM2, K, EPSI, Q10MR, FOLN_MX, LEFREEZ, & DILE_FC_S1,DILE_FC_S2,DILE_FC_S3,DILE_FC_S4,DILE_FC_S5,DILE_FC_S6,DILE_FC_S7,DILE_FC_S8, & DILE_FW_S1,DILE_FW_S2,DILE_FW_S3,DILE_FW_S4,DILE_FW_S5,DILE_FW_S6,DILE_FW_S7,DILE_FW_S8, & FRA_GR, & @@ -9805,6 +10550,9 @@ subroutine read_mp_crop_parameters() STPT_S1, STPT_S2, STPT_S3, STPT_S4, STPT_S5, STPT_S6, STPT_S7, STPT_S8, & RTPT_S1, RTPT_S2, RTPT_S3, RTPT_S4, RTPT_S5, RTPT_S6, RTPT_S7, RTPT_S8, & GRAINPT_S1,GRAINPT_S2,GRAINPT_S3,GRAINPT_S4,GRAINPT_S5,GRAINPT_S6,GRAINPT_S7,GRAINPT_S8, & + LFCT_S1,LFCT_S2,LFCT_S3,LFCT_S4,LFCT_S5,LFCT_S6,LFCT_S7,LFCT_S8, & + STCT_S1,STCT_S2,STCT_S3,STCT_S4,STCT_S5,STCT_S6,STCT_S7,STCT_S8, & + RTCT_S1,RTCT_S2,RTCT_S3,RTCT_S4,RTCT_S5,RTCT_S6,RTCT_S7,RTCT_S8, & BIO2LAI @@ -9821,6 +10569,17 @@ subroutine read_mp_crop_parameters() GDDS3_TABLE = -1.E36 GDDS4_TABLE = -1.E36 GDDS5_TABLE = -1.E36 + C3PSNI_TABLE = -1.E36 ! parameter from PSN copied from stomata ! Zhe Zhang 2020-07-13 + KC25I_TABLE = -1.E36 + AKCI_TABLE = -1.E36 + KO25I_TABLE = -1.E36 + AKOI_TABLE = -1.E36 + AVCMXI_TABLE = -1.E36 + VCMX25I_TABLE = -1.E36 + BPI_TABLE = -1.E36 + MPI_TABLE = -1.E36 + FOLNMXI_TABLE = -1.E36 + QE25I_TABLE = -1.E36 ! ends here C3C4_TABLE = -99999 AREF_TABLE = -1.E36 PSNRF_TABLE = -1.E36 @@ -9847,6 +10606,9 @@ subroutine read_mp_crop_parameters() STPT_TABLE = -1.E36 RTPT_TABLE = -1.E36 GRAINPT_TABLE = -1.E36 + LFCT_TABLE = -1.E36 ! convert start + STCT_TABLE = -1.E36 + RTCT_TABLE = -1.E36 ! convert end BIO2LAI_TABLE = -1.E36 @@ -9877,6 +10639,17 @@ subroutine read_mp_crop_parameters() GDDS3_TABLE = GDDS3 GDDS4_TABLE = GDDS4 GDDS5_TABLE = GDDS5 + C3PSNI_TABLE(1:5) = C3PSN(1:5) ! parameters from stomata ! Zhe Zhang 2020-07-13 + KC25I_TABLE(1:5) = KC25(1:5) + AKCI_TABLE(1:5) = AKC(1:5) + KO25I_TABLE(1:5) = KO25(1:5) + AKOI_TABLE(1:5) = AKO(1:5) + AVCMXI_TABLE(1:5) = AVCMX(1:5) + VCMX25I_TABLE(1:5) = VCMX25(1:5) + BPI_TABLE(1:5) = BP(1:5) + MPI_TABLE(1:5) = MP(1:5) + FOLNMXI_TABLE(1:5) = FOLNMX(1:5) + QE25I_TABLE(1:5) = QE25(1:5) ! ends here C3C4_TABLE = C3C4 AREF_TABLE = AREF PSNRF_TABLE = PSNRF @@ -9966,10 +10739,89 @@ subroutine read_mp_crop_parameters() GRAINPT_TABLE(:,6) = GRAINPT_S6 GRAINPT_TABLE(:,7) = GRAINPT_S7 GRAINPT_TABLE(:,8) = GRAINPT_S8 + LFCT_TABLE(:,1) = LFCT_S1 + LFCT_TABLE(:,2) = LFCT_S2 + LFCT_TABLE(:,3) = LFCT_S3 + LFCT_TABLE(:,4) = LFCT_S4 + LFCT_TABLE(:,5) = LFCT_S5 + LFCT_TABLE(:,6) = LFCT_S6 + LFCT_TABLE(:,7) = LFCT_S7 + LFCT_TABLE(:,8) = LFCT_S8 + STCT_TABLE(:,1) = STCT_S1 + STCT_TABLE(:,2) = STCT_S2 + STCT_TABLE(:,3) = STCT_S3 + STCT_TABLE(:,4) = STCT_S4 + STCT_TABLE(:,5) = STCT_S5 + STCT_TABLE(:,6) = STCT_S6 + STCT_TABLE(:,7) = STCT_S7 + STCT_TABLE(:,8) = STCT_S8 + RTCT_TABLE(:,1) = RTCT_S1 + RTCT_TABLE(:,2) = RTCT_S2 + RTCT_TABLE(:,3) = RTCT_S3 + RTCT_TABLE(:,4) = RTCT_S4 + RTCT_TABLE(:,5) = RTCT_S5 + RTCT_TABLE(:,6) = RTCT_S6 + RTCT_TABLE(:,7) = RTCT_S7 + RTCT_TABLE(:,8) = RTCT_S8 BIO2LAI_TABLE = BIO2LAI end subroutine read_mp_crop_parameters + subroutine read_mp_irrigation_parameters() + implicit none + integer :: ierr + logical :: file_named + + REAL :: IRR_FRAC ! irrigation Fraction + INTEGER :: IRR_HAR ! number of days before harvest date to stop irrigation + REAL :: IRR_LAI ! Minimum lai to trigger irrigation + REAL :: IRR_MAD ! management allowable deficit (0-1) + REAL :: FILOSS ! fraction of flood irrigation loss (0-1) + REAL :: SPRIR_RATE ! mm/h, sprinkler irrigation rate + REAL :: MICIR_RATE ! mm/h, micro irrigation rate + REAL :: FIRTFAC ! flood application rate factor + REAL :: IR_RAIN ! maximum precipitation to stop irrigation trigger + + NAMELIST / noahmp_irrigation_parameters / IRR_FRAC, IRR_HAR, IRR_LAI, IRR_MAD, FILOSS, & + SPRIR_RATE, MICIR_RATE, FIRTFAC, IR_RAIN + + IRR_FRAC_TABLE = -1.E36 ! irrigation Fraction + IRR_HAR_TABLE = 0 ! number of days before harvest date to stop irrigation + IRR_LAI_TABLE = -1.E36 ! Minimum lai to trigger irrigation + IRR_MAD_TABLE = -1.E36 ! management allowable deficit (0-1) + FILOSS_TABLE = -1.E36 ! fraction of flood irrigation loss (0-1) + SPRIR_RATE_TABLE = -1.E36 ! mm/h, sprinkler irrigation rate + MICIR_RATE_TABLE = -1.E36 ! mm/h, micro irrigation rate + FIRTFAC_TABLE = -1.E36 ! flood application rate factor + IR_RAIN_TABLE = -1.E36 ! maximum precipitation to stop irrigation trigger + + inquire( file='MPTABLE.TBL', exist=file_named ) + if ( file_named ) then + open(15, file="MPTABLE.TBL", status='old', form='formatted', action='read', iostat=ierr) + else + open(15, status='old', form='formatted', action='read', iostat=ierr) + end if + + if (ierr /= 0) then + write(*,'("WARNING: Cannot find file MPTABLE.TBL")') + call wrf_error_fatal("STOP in Noah-MP read_mp_crop_parameters") + endif + + read(15,noahmp_irrigation_parameters) + close(15) + + IRR_FRAC_TABLE = IRR_FRAC ! irrigation Fraction + IRR_HAR_TABLE = IRR_HAR ! number of days before harvest date to stop irrigation + IRR_LAI_TABLE = IRR_LAI ! Minimum lai to trigger irrigation + IRR_MAD_TABLE = IRR_MAD ! management allowable deficit (0-1) + FILOSS_TABLE = FILOSS ! fraction of flood irrigation loss (0-1) + SPRIR_RATE_TABLE = SPRIR_RATE ! mm/h, sprinkler irrigation rate + MICIR_RATE_TABLE = MICIR_RATE ! mm/h, micro irrigation rate + FIRTFAC_TABLE = FIRTFAC ! flood application rate factor + IR_RAIN_TABLE = IR_RAIN ! maximum precipitation to stop irrigation trigger + + end subroutine read_mp_irrigation_parameters + subroutine read_mp_optional_parameters() implicit none integer :: ierr