PM-JPL 1.2.1__py3-none-any.whl → 1.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PMJPL/ECOv002-cal-val-PM-JPL-inputs.csv +1048 -0
- PMJPL/ECOv002-cal-val-PM-JPL-outputs.csv +1048 -0
- PMJPL/ECOv002-static-tower-PM-JPL-inputs.csv +122 -0
- PMJPL/ECOv002_calval_PMJPL_inputs.py +19 -0
- PMJPL/ECOv002_static_tower_PMJPL_inputs.py +19 -0
- PMJPL/PMJPL.py +45 -378
- PMJPL/{parameters.py → PMJPL_parameter_from_IGBP.py} +22 -7
- PMJPL/VPD_factor.py +1 -1
- PMJPL/__init__.py +1 -6
- PMJPL/calculate_gamma.py +128 -0
- PMJPL/canopy_aerodynamic_resistance.py +151 -18
- PMJPL/canopy_conductance.py +71 -15
- PMJPL/closed_minimum_temperature.py +11 -0
- PMJPL/closed_vapor_pressure_deficit.py +11 -0
- PMJPL/constants.py +6 -1
- PMJPL/correctance_factor.py +56 -7
- PMJPL/generate_PMJPL_inputs.py +263 -0
- PMJPL/interception.py +1 -3
- PMJPL/leaf_conductance_to_evaporated_water.py +11 -0
- PMJPL/leaf_conductance_to_sensible_heat.py +58 -0
- PMJPL/maximum_boundary_layer_resistance.py +11 -0
- PMJPL/minimum_boundary_layer_resistance.py +11 -0
- PMJPL/{tmin_factor.py → minimum_temperature_factor.py} +2 -2
- PMJPL/mod16.csv +19 -0
- PMJPL/model.py +690 -0
- PMJPL/open_minimum_temperature.py +11 -0
- PMJPL/open_vapor_pressure_deficit.py +11 -0
- PMJPL/potential_soil_evaporation.py +2 -2
- PMJPL/potential_stomatal_conductance.py +11 -0
- PMJPL/process_PMJPL_table.py +208 -0
- PMJPL/process_daily_ET_table.py +40 -0
- PMJPL/transpiration.py +4 -4
- PMJPL/verify.py +77 -0
- PMJPL/version.py +4 -0
- PMJPL/wet_canopy_resistance.py +1 -0
- PMJPL/wet_soil_evaporation.py +4 -4
- {pm_jpl-1.2.1.dist-info → pm_jpl-1.7.0.dist-info}/METADATA +18 -21
- pm_jpl-1.7.0.dist-info/RECORD +42 -0
- {pm_jpl-1.2.1.dist-info → pm_jpl-1.7.0.dist-info}/WHEEL +1 -1
- PMJPL/MCD12C1/MCD12C1.py +0 -10
- PMJPL/MCD12C1/__init__.py +0 -1
- PMJPL/SEBAL/SEBAL.py +0 -45
- PMJPL/SEBAL/__init__.py +0 -1
- PMJPL/downscaling/__init__.py +0 -1
- PMJPL/downscaling/downscaling.py +0 -271
- PMJPL/downscaling/linear_downscale.py +0 -71
- PMJPL/evapotranspiration_conversion/__init__.py +0 -1
- PMJPL/evapotranspiration_conversion/evapotranspiration_conversion.py +0 -80
- PMJPL/fwet.py +0 -21
- PMJPL/meteorology_conversion/__init__.py +0 -1
- PMJPL/meteorology_conversion/meteorology_conversion.py +0 -123
- PMJPL/penman_monteith/__init__.py +0 -1
- PMJPL/penman_monteith/penman_monteith.py +0 -20
- PMJPL/priestley_taylor/__init__.py +0 -1
- PMJPL/priestley_taylor/priestley_taylor.py +0 -27
- PMJPL/santanello/__init__.py +0 -1
- PMJPL/santanello/santanello.py +0 -46
- PMJPL/soil_heat_flux/__init__.py +0 -1
- PMJPL/soil_heat_flux/soil_heat_flux.py +0 -62
- PMJPL/vegetation_conversion/__init__.py +0 -1
- PMJPL/vegetation_conversion/vegetation_conversion.py +0 -47
- PMJPL/verma_net_radiation/__init__.py +0 -1
- PMJPL/verma_net_radiation/verma_net_radiation.py +0 -108
- pm_jpl-1.2.1.dist-info/RECORD +0 -44
- {pm_jpl-1.2.1.dist-info → pm_jpl-1.7.0.dist-info}/licenses/LICENSE +0 -0
- {pm_jpl-1.2.1.dist-info → pm_jpl-1.7.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
ID,name,elevation_km,IGBP,gl_sh,gl_e_wv,RBL_min,RBL_max,CL,Tmin_open,Tmin_closed,VPD_open,VPD_closed,geometry
|
|
2
|
+
US-NC3,NC_Clearcut#3,0.005,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-76.656 35.799)
|
|
3
|
+
PE-QFR,Quistococha Forest Reserve,0.104,2,0.01,0.01,70.0,100.0,0.0025,9.09,-8.0,1000.0,4000.0,POINT (-73.319 -3.8344)
|
|
4
|
+
US-Mi3,LTAR UCB (Upper Chesapeake Bay) Miscanthus 3,0.27,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-80.637 41.8222)
|
|
5
|
+
US-NC4,NC_AlligatorRiver,0.001,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-75.9038 35.7879)
|
|
6
|
+
CA-DB2,Delta Burns Bog 2,0.004,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-122.9951 49.119)
|
|
7
|
+
US-Sne,Sherman Island Restored Wetland,-0.005,13,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-121.7547 38.0369)
|
|
8
|
+
US-Mi1,LTAR UCB (Upper Chesapeake Bay) Miscanthus 1,0.29,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-80.6313 41.7727)
|
|
9
|
+
US-PFe,NW4 Lake-1 CHEESEHEAD 2019,0.48,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.3004 45.9793)
|
|
10
|
+
US-NR1,Niwot Ridge Forest (LTER NWT1),3.05,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-105.5464 40.0329)
|
|
11
|
+
US-Vcp,Valles Caldera Ponderosa Pine,2.542,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-106.5974 35.8624)
|
|
12
|
+
US-xAB,NEON Abby Road (ABBY),0.363,1,0.04,0.04,65.0,95.0,0.0032,8.31,-8.0,650.0,3000.0,POINT (-122.3303 45.7624)
|
|
13
|
+
US-HBK,Hubbard Brook Experimental Forest,0.367,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-71.7181 43.9397)
|
|
14
|
+
US-EDN,Eden Landing Ecological Reserve,,13,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-122.114 37.6156)
|
|
15
|
+
US-PFh,NE2 Pine-3 CHEESEHEAD 2019,0.463,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.2406 45.9557)
|
|
16
|
+
US-Me6,Metolius Young Pine Burn,0.998,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-121.6078 44.3233)
|
|
17
|
+
US-NC2,NC_Loblolly Plantation,0.005,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-76.6685 35.803)
|
|
18
|
+
US-Whs,Walnut Gulch Lucky Hills Shrub,1.37,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-110.0522 31.7438)
|
|
19
|
+
US-SRM,Santa Rita Mesquite,1.12,7,0.04,0.04,20.0,55.0,0.0065,8.8,-8.0,650.0,4400.0,POINT (-110.8661 31.8214)
|
|
20
|
+
US-CS1,Central Sands Irrigated Agricultural Field,0.328,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-89.5379 44.1031)
|
|
21
|
+
US-PFs,SE5 Aspen-5 CHEESEHEAD 2019,0.489,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.2382 45.9381)
|
|
22
|
+
US-PFg,NE1 Pine-2 CHEESEHEAD 2019,0.475,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.2723 45.9735)
|
|
23
|
+
US-Ha1,Harvard Forest EMS Tower (HFR1),0.34,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-72.1715 42.5378)
|
|
24
|
+
US-Ne2,Mead - irrigated maize-soybean rotation site,0.362,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-96.4701 41.1649)
|
|
25
|
+
US-PFm,SW3 Hardwood-2 CHEESEHEAD 2019,0.484,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.3099 45.9207)
|
|
26
|
+
US-PFr,SE4 Tussock-2 CHEESEHEAD 2019,0.49,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.2475 45.9245)
|
|
27
|
+
US-PFL,SW2 Aspen-3 CHEESEHEAD 2019,0.464,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.3177 45.9409)
|
|
28
|
+
US-PFj,NE4 Maple-1 CHEESEHEAD 2019,0.484,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.227 45.9619)
|
|
29
|
+
US-CC2,Coloma Corn 2,0.32,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-89.6196 44.1039)
|
|
30
|
+
US-NR3,Niwot Ridge Alpine (T-Van West),3.504,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-105.5864 40.052)
|
|
31
|
+
US-PFt,SE6 Pine-4 CHEESEHEAD 2019,0.466,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.2288 45.9197)
|
|
32
|
+
CA-Cbo,"Ontario - Mixed Deciduous, Borden Forest Site",0.12,9,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3600.0,POINT (-79.9333 44.3167)
|
|
33
|
+
PR-xLA,NEON Lajas Experimental Station (LAJA),0.024,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-67.0769 18.0212)
|
|
34
|
+
US-Ne3,Mead - rainfed maize-soybean rotation site,0.363,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-96.4397 41.1797)
|
|
35
|
+
US-PHM,Plum Island High Marsh,0.0014,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-70.8301 42.7423)
|
|
36
|
+
US-Tw1,Twitchell Wetland West Pond,-0.005,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-121.6469 38.1074)
|
|
37
|
+
US-Hn3,Hanford 100H sagebrush,0.12090000000000001,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-119.4614 46.6878)
|
|
38
|
+
US-PFk,SW1 Aspen-2 CHEESEHEAD 2019,0.476,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.3425 45.9149)
|
|
39
|
+
US-CS2,Tri county school Pine Forest,0.328,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-89.5002 44.1467)
|
|
40
|
+
US-ONA,Florida pine flatwoods,0.025,9,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3600.0,POINT (-81.9509 27.3836)
|
|
41
|
+
US-CC1,Coloma Corn 1,0.314,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-89.6787 44.0732)
|
|
42
|
+
US-Rls,RCEW Low Sagebrush,1.608,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-116.7356 43.1439)
|
|
43
|
+
US-UMd,UMBS Disturbance,0.239,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-84.6975 45.5625)
|
|
44
|
+
US-PFq,SE3 Aspen-4 CHEESEHEAD 2019,0.473,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.2475 45.9271)
|
|
45
|
+
US-PFn,SW4 Hardwood-3 CHEESEHEAD 2019,0.478,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.2823 45.9392)
|
|
46
|
+
US-HB3,Hobcaw Barony Longleaf Pine Restoration,0.0073,1,0.04,0.04,65.0,95.0,0.0032,8.31,-8.0,650.0,3000.0,POINT (-79.2322 33.3482)
|
|
47
|
+
US-DFC,"US Dairy Forage Research Center, Prairie du Sac",0.26489999999999997,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-89.7117 43.3448)
|
|
48
|
+
US-Wkg,Walnut Gulch Kendall Grasslands,1.531,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-109.9419 31.7365)
|
|
49
|
+
US-CF1,CAF-LTAR Cook East,0.794,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-117.0821 46.7815)
|
|
50
|
+
US-Ho2,Howland Forest (west tower),0.061,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-68.747 45.2091)
|
|
51
|
+
US-Snf,Sherman Barn,-0.004,0,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-121.7272 38.0402)
|
|
52
|
+
US-Me2,Metolius mature ponderosa pine,1.253,1,0.04,0.04,65.0,95.0,0.0032,8.31,-8.0,650.0,3000.0,POINT (-121.5574 44.4523)
|
|
53
|
+
US-CF3,CAF-LTAR Boyd North,0.795,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-117.1261 46.7551)
|
|
54
|
+
US-Ne1,Mead - irrigated continuous maize site,0.361,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-96.4766 41.1651)
|
|
55
|
+
US-Ha2,Harvard Forest Hemlock Site,0.36,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-72.1779 42.5393)
|
|
56
|
+
CA-Ca3,British Columbia - Pole sapling Douglas-fir stand,,1,0.04,0.04,65.0,95.0,0.0032,8.31,-8.0,650.0,3000.0,POINT (-124.9004 49.5346)
|
|
57
|
+
US-SP1,Slashpine-Austin Cary- 65yrs nat regen,0.05,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-82.2188 29.7381)
|
|
58
|
+
US-UMB,Univ. of Mich. Biological Station,0.234,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-84.7138 45.5598)
|
|
59
|
+
US-Bi1,Bouldin Island Alfalfa,-0.0027,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-121.4993 38.0992)
|
|
60
|
+
US-PFi,NE3 Hardwood-1 CHEESEHEAD 2019,0.488,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.2327 45.9749)
|
|
61
|
+
US-CF2,CAF-LTAR Cook West,0.807,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-117.0908 46.784)
|
|
62
|
+
US-KFS,Kansas Field Station,0.31,9,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3600.0,POINT (-95.1907 39.0561)
|
|
63
|
+
US-CMW,Charleston Mesquite Woodland,1.199,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-110.1777 31.6637)
|
|
64
|
+
US-Ro4,Rosemount Prairie,0.274,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-93.0723 44.6781)
|
|
65
|
+
US-PAS,"Florida, Paspalum notatum pasture",0.027100000000000003,9,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3600.0,POINT (-81.951 27.3944)
|
|
66
|
+
US-xYE,NEON Yellowstone Northern Range (Frog Rock) (YELL),2.116,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-110.5391 44.9535)
|
|
67
|
+
US-Los,Lost Creek,0.48,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-89.9792 46.0827)
|
|
68
|
+
US-PFd,NW3 Tussock-1 CHEESEHEAD 2019,0.473,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.301 45.9689)
|
|
69
|
+
US-KM4,KBS Marshall Farms Smooth Brome Grass (Ref),0.24630000000000002,9,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3600.0,POINT (-85.3301 42.4423)
|
|
70
|
+
US-Syv,Sylvania Wilderness Area,0.54,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-89.3477 46.242)
|
|
71
|
+
US-WCr,Willow Creek,0.52,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-90.0799 45.8059)
|
|
72
|
+
US-Rws,Reynolds Creek Wyoming big sagebrush,1.425,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-116.7132 43.1675)
|
|
73
|
+
US-xJE,NEON Jones Ecological Research Center (JERC),0.044,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-84.4686 31.1948)
|
|
74
|
+
US-SRG,Santa Rita Grassland,1.291,7,0.04,0.04,20.0,55.0,0.0065,8.8,-8.0,650.0,4400.0,POINT (-110.8277 31.7894)
|
|
75
|
+
US-xNW,NEON Niwot Ridge Mountain Research Station (NIWO),3.513,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-105.5824 40.0543)
|
|
76
|
+
US-Rms,RCEW Mountain Big Sagebrush,2.111,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-116.7486 43.0645)
|
|
77
|
+
US-NR4,Niwot Ridge Alpine (T-Van East),3.502,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-105.5859 40.052)
|
|
78
|
+
US-xDS,NEON Disney Wilderness Preserve (DSNY),0.015,9,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3600.0,POINT (-81.4362 28.125)
|
|
79
|
+
US-xJR,NEON Jornada LTER (JORN),1.329,7,0.04,0.04,20.0,55.0,0.0065,8.8,-8.0,650.0,4400.0,POINT (-106.8425 32.5907)
|
|
80
|
+
US-Bar,Bartlett Experimental Forest,0.272,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-71.2881 44.0646)
|
|
81
|
+
US-ALQ,Allequash Creek Site,,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-89.6067 46.0308)
|
|
82
|
+
US-MMS,Morgan Monroe State Forest,0.275,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-86.4131 39.3232)
|
|
83
|
+
US-UC1,LTAR UCB (Upper Chesapeake Bay) EC1,0.39,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-78.0056 40.7536)
|
|
84
|
+
US-PFb,NW1 Pine-1 CHEESEHEAD 2019,0.474,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.3232 45.972)
|
|
85
|
+
US-xDL,NEON Dead Lake (DELA),0.022,13,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-87.8039 32.5417)
|
|
86
|
+
US-xPU,NEON Pu'u Maka'ala Natural Area Reserve (PUUM),1.685,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-155.3173 19.5531)
|
|
87
|
+
US-xBL,NEON Blandy Experimental Farm (BLAN),0.183,9,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3600.0,POINT (-78.0716 39.0603)
|
|
88
|
+
US-xST,NEON Steigerwaldt Land Services (STEI),0.481,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-89.5864 45.5089)
|
|
89
|
+
US-xSB,NEON Ordway-Swisher Biological Station (OSBS),0.045,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-81.9934 29.6893)
|
|
90
|
+
US-xRN,NEON Oak Ridge National Lab (ORNL),0.334,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-84.2826 35.9641)
|
|
91
|
+
US-UC2,LTAR UCB (Upper Chesapeake Bay) EC2,0.396,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-77.9998 40.7559)
|
|
92
|
+
US-xTR,NEON Treehaven (TREE),0.472,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-89.5857 45.4937)
|
|
93
|
+
US-xRM,"NEON Rocky Mountain National Park, CASTNET (RMNP)",2.743,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-105.5459 40.2759)
|
|
94
|
+
US-Tw4,Twitchell East End Wetland,-0.005,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-121.6413 38.1027)
|
|
95
|
+
US-Bi2,Bouldin Island corn,-0.005,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-121.5351 38.1091)
|
|
96
|
+
US-Jo2,Jornada Experimental Range Mixed Shrubland,1.469,7,0.04,0.04,20.0,55.0,0.0065,8.8,-8.0,650.0,4400.0,POINT (-106.6032 32.5849)
|
|
97
|
+
US-CS5,Central Sands Irrigated Agricultural Field,0.328,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-89.5377 44.1095)
|
|
98
|
+
US-Mpj,Mountainair Pinyon-Juniper Woodland,2.138,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-106.2377 34.4384)
|
|
99
|
+
US-xWR,NEON Wind River Experimental Forest (WREF),0.407,1,0.04,0.04,65.0,95.0,0.0032,8.31,-8.0,650.0,3000.0,POINT (-121.9519 45.8205)
|
|
100
|
+
US-xUK,NEON The University of Kansas Field Station (UKFS),0.335,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-95.1921 39.0404)
|
|
101
|
+
US-xUN,NEON University of Notre Dame Environmental Research Center (UNDE),0.518,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-89.5373 46.2339)
|
|
102
|
+
US-xBR,NEON Bartlett Experimental Forest (BART),0.232,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-71.2873 44.0639)
|
|
103
|
+
US-CF4,CAF-LTAR Boyd South,0.795,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-117.1285 46.7518)
|
|
104
|
+
US-xCL,NEON LBJ National Grassland (CLBJ),0.259,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-97.57 33.4012)
|
|
105
|
+
CA-DBB,Delta Burns Bog,0.004,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-122.9849 49.1293)
|
|
106
|
+
US-Hn2,Hanford 100H grassland,0.1175,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-119.4641 46.6889)
|
|
107
|
+
US-PFp,SE2 Hardwood-4 CHEESEHEAD 2019,0.497,5,0.04,0.04,65.0,95.0,0.0025,9.5,-7.0,650.0,2900.0,POINT (-90.2641 45.9365)
|
|
108
|
+
US-xKA,NEON Konza Prairie Biological Station - Relocatable (KONA),1.329,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-96.6129 39.1104)
|
|
109
|
+
US-CS3,Central Sands Irrigated Agricultural Field,0.328,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-89.5727 44.1394)
|
|
110
|
+
US-xTE,NEON Lower Teakettle (TEAK),2.147,9,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3600.0,POINT (-119.006 37.0058)
|
|
111
|
+
US-Rwf,RCEW Upper Sheep Prescibed Fire,1.878,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-116.7231 43.1207)
|
|
112
|
+
US-xML,NEON Mountain Lake Biological Station (MLBS),1.126,4,0.01,0.01,65.0,100.0,0.0028,9.94,-6.0,650.0,2900.0,POINT (-80.5248 37.3783)
|
|
113
|
+
US-UiB,University of Illinois Miscanthus,0.224,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-88.1984 40.0628)
|
|
114
|
+
PR-xGU,NEON Guanica Forest (GUAN),0.143,8,0.08,0.08,25.0,45.0,0.0065,11.39,-8.0,650.0,3500.0,POINT (-66.8687 17.9696)
|
|
115
|
+
US-ARM,ARM Southern Great Plains site- Lamont,0.314,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-97.4888 36.6058)
|
|
116
|
+
US-Kon,Konza Prairie LTER (KNZ),0.417,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-96.5603 39.0824)
|
|
117
|
+
US-HB2,Hobcaw Barony Mature Longleaf Pine,0.0047,1,0.04,0.04,65.0,95.0,0.0032,8.31,-8.0,650.0,3000.0,POINT (-79.244 33.3242)
|
|
118
|
+
US-xSL,"NEON North Sterling, CO (STER)",1.364,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-103.0293 40.4619)
|
|
119
|
+
US-xWD,NEON Woodworth (WOOD),0.579,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-99.2414 47.1282)
|
|
120
|
+
US-CS4,Central Sands Irrigated Agricultural Field,0.328,12,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4500.0,POINT (-89.5475 44.1597)
|
|
121
|
+
US-xAE,NEON Klemme Range Research Station (OAES),0.516,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-99.0588 35.4106)
|
|
122
|
+
US-GLE,GLEES,3.197,10,0.02,0.02,20.0,50.0,0.007,12.02,-8.0,650.0,4200.0,POINT (-106.2399 41.3665)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import pandas as pd
|
|
3
|
+
|
|
4
|
+
def load_ECOv002_calval_PMJPL_inputs() -> pd.DataFrame:
|
|
5
|
+
"""
|
|
6
|
+
Load the input data for the PM-JPL model from the ECOSTRESS Collection 2 Cal-Val dataset.
|
|
7
|
+
|
|
8
|
+
Returns:
|
|
9
|
+
pd.DataFrame: A DataFrame containing the input data.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
# Define the path to the input CSV file relative to this module's directory
|
|
13
|
+
module_dir = os.path.dirname(os.path.abspath(__file__))
|
|
14
|
+
input_file_path = os.path.join(module_dir, "ECOv002-cal-val-PM-JPL-inputs.csv")
|
|
15
|
+
|
|
16
|
+
# Load the input data into a DataFrame
|
|
17
|
+
inputs_df = pd.read_csv(input_file_path)
|
|
18
|
+
|
|
19
|
+
return inputs_df
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import pandas as pd
|
|
3
|
+
|
|
4
|
+
def load_ECOv002_static_tower_PMJPL_inputs() -> pd.DataFrame:
|
|
5
|
+
"""
|
|
6
|
+
Load the input data for the PM-JPL model from the ECOSTRESS Collection 2 Cal-Val dataset.
|
|
7
|
+
|
|
8
|
+
Returns:
|
|
9
|
+
pd.DataFrame: A DataFrame containing the input data.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
# Define the path to the input CSV file relative to this module's directory
|
|
13
|
+
module_dir = os.path.dirname(os.path.abspath(__file__))
|
|
14
|
+
input_file_path = os.path.join(module_dir, "ECOv002-static-tower-PM-JPL-inputs.csv")
|
|
15
|
+
|
|
16
|
+
# Load the input data into a DataFrame
|
|
17
|
+
inputs_df = pd.read_csv(input_file_path)
|
|
18
|
+
|
|
19
|
+
return inputs_df
|
PMJPL/PMJPL.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
"""
|
|
2
3
|
MOD16 model of evapotranspiration
|
|
3
4
|
|
|
@@ -6,401 +7,67 @@ https://landweb.nascom.nasa.gov/QA_WWW/forPage/user_guide/MOD16UsersGuide2016.pd
|
|
|
6
7
|
|
|
7
8
|
Developed by Gregory Halverson in the Jet Propulsion Laboratory Year-Round Internship Program (Columbus Technologies and Services), in coordination with the ECOSTRESS mission and master's thesis studies at California State University, Northridge.
|
|
8
9
|
"""
|
|
10
|
+
|
|
11
|
+
# All imports moved to the top
|
|
9
12
|
import logging
|
|
10
|
-
from typing import
|
|
13
|
+
from typing import Dict, Union
|
|
11
14
|
from datetime import datetime
|
|
12
|
-
from os.path import join, abspath, dirname, expanduser
|
|
13
15
|
|
|
14
16
|
import numpy as np
|
|
15
|
-
import
|
|
16
|
-
from
|
|
17
|
-
import warnings
|
|
17
|
+
import rasters as rt
|
|
18
|
+
from rasters import Raster, RasterGrid, RasterGeometry, VectorGeometry
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
from check_distribution import check_distribution
|
|
21
|
+
from GEOS5FP import GEOS5FP
|
|
22
|
+
from NASADEM import NASADEM
|
|
23
|
+
from verma_net_radiation import verma_net_radiation
|
|
24
|
+
from SEBAL_soil_heat_flux import calculate_SEBAL_soil_heat_flux
|
|
25
|
+
from MCD12C1_2019_v006 import load_MCD12C1_IGBP
|
|
20
26
|
|
|
21
|
-
from
|
|
27
|
+
from carlson_leaf_area_index import carlson_leaf_area_index
|
|
28
|
+
from carlson_fractional_vegetation_cover import carlson_fractional_vegetation_cover
|
|
29
|
+
from carlson_leaf_area_index import carlson_leaf_area_index
|
|
22
30
|
|
|
23
|
-
from
|
|
24
|
-
from .parameters import MOD16_parameter_from_IGBP
|
|
25
|
-
from .evapotranspiration_conversion.evapotranspiration_conversion import lambda_Jkg_from_Ta_C
|
|
26
|
-
from .meteorology_conversion.meteorology_conversion import SVP_Pa_from_Ta_C, calculate_specific_heat, calculate_surface_pressure, celcius_to_kelvin
|
|
27
|
-
from .penman_monteith.penman_monteith import calculate_gamma
|
|
28
|
-
from .priestley_taylor.priestley_taylor import delta_Pa_from_Ta_C, delta_kPa_from_Ta_C
|
|
31
|
+
from daylight_evapotranspiration import lambda_Jkg_from_Ta_C
|
|
29
32
|
|
|
30
|
-
from
|
|
31
|
-
from
|
|
32
|
-
from
|
|
33
|
-
from
|
|
33
|
+
from meteorology_conversion import SVP_Pa_from_Ta_C
|
|
34
|
+
from meteorology_conversion import calculate_air_density
|
|
35
|
+
from meteorology_conversion import calculate_specific_heat
|
|
36
|
+
from meteorology_conversion import calculate_specific_humidity
|
|
37
|
+
from meteorology_conversion import calculate_surface_pressure
|
|
38
|
+
from meteorology_conversion import celcius_to_kelvin
|
|
34
39
|
|
|
35
|
-
from
|
|
40
|
+
from priestley_taylor import delta_Pa_from_Ta_C
|
|
41
|
+
from PTJPL import calculate_relative_surface_wetness
|
|
42
|
+
from PTJPL import RH_THRESHOLD, MIN_FWET
|
|
36
43
|
|
|
37
|
-
from .
|
|
44
|
+
from .constants import *
|
|
45
|
+
from .PMJPL_parameter_from_IGBP import PMJPL_parameter_from_IGBP
|
|
46
|
+
from .calculate_gamma import calculate_gamma
|
|
38
47
|
from .soil_moisture_constraint import calculate_fSM
|
|
39
|
-
from .
|
|
40
|
-
from .correctance_factor import
|
|
48
|
+
from .minimum_temperature_factor import Tmin_factor
|
|
49
|
+
from .correctance_factor import calculate_correctance_factor
|
|
41
50
|
from .VPD_factor import calculate_VPD_factor
|
|
42
|
-
|
|
43
51
|
from .canopy_conductance import calculate_canopy_conductance
|
|
44
|
-
|
|
45
52
|
from .wet_canopy_resistance import calculate_wet_canopy_resistance
|
|
46
|
-
from .canopy_aerodynamic_resistance import
|
|
47
|
-
|
|
53
|
+
from .canopy_aerodynamic_resistance import calculate_canopy_aerodynamic_resistance
|
|
48
54
|
from .wet_soil_evaporation import calculate_wet_soil_evaporation
|
|
49
55
|
from .potential_soil_evaporation import calculate_potential_soil_evaporation
|
|
50
56
|
from .interception import calculate_interception
|
|
51
57
|
from .transpiration import calculate_transpiration
|
|
58
|
+
from .leaf_conductance_to_sensible_heat import leaf_conductance_to_sensible_heat
|
|
59
|
+
from .potential_stomatal_conductance import potential_stomatal_conductance
|
|
60
|
+
from .open_minimum_temperature import open_minimum_temperature
|
|
61
|
+
from .closed_minimum_temperature import closed_minimum_temperature
|
|
62
|
+
from .open_vapor_pressure_deficit import open_vapor_pressure_deficit
|
|
63
|
+
from .closed_vapor_pressure_deficit import closed_vapor_pressure_deficit
|
|
64
|
+
from .leaf_conductance_to_evaporated_water import leaf_conductance_to_evaporated_water
|
|
65
|
+
from .maximum_boundary_layer_resistance import maximum_boundary_layer_resistance
|
|
66
|
+
from .minimum_boundary_layer_resistance import minimum_boundary_layer_resistance
|
|
67
|
+
from .model import PMJPL
|
|
68
|
+
from .process_PMJPL_table import process_PMJPL_table
|
|
69
|
+
from .ECOv002_static_tower_PMJPL_inputs import load_ECOv002_static_tower_PMJPL_inputs
|
|
70
|
+
from .ECOv002_calval_PMJPL_inputs import load_ECOv002_calval_PMJPL_inputs
|
|
71
|
+
from .verify import verify
|
|
52
72
|
|
|
53
73
|
__author__ = 'Qiaozhen Mu, Maosheng Zhao, Steven W. Running, Gregory Halverson'
|
|
54
|
-
|
|
55
|
-
logger = logging.getLogger(__name__)
|
|
56
|
-
|
|
57
|
-
DEFAULT_WORKING_DIRECTORY = "."
|
|
58
|
-
DEFAULT_MOD16_INTERMEDIATE = "MOD16_intermediate"
|
|
59
|
-
|
|
60
|
-
DEFAULT_OUTPUT_VARIABLES = [
|
|
61
|
-
'LEi',
|
|
62
|
-
'LEc',
|
|
63
|
-
'LEs',
|
|
64
|
-
'LE',
|
|
65
|
-
'LE_daily',
|
|
66
|
-
'ET_daily_kg'
|
|
67
|
-
]
|
|
68
|
-
|
|
69
|
-
def PMJPL(
|
|
70
|
-
Rn: Union[Raster, np.ndarray],
|
|
71
|
-
G: Union[Raster, np.ndarray],
|
|
72
|
-
NDVI: Union[Raster, np.ndarray],
|
|
73
|
-
Ta_C: Union[Raster, np.ndarray],
|
|
74
|
-
Tmin_C: Union[Raster, np.ndarray],
|
|
75
|
-
RH: Union[Raster, np.ndarray],
|
|
76
|
-
IGBP: Union[Raster, np.ndarray],
|
|
77
|
-
Ps_Pa: Union[Raster, np.ndarray] = None,
|
|
78
|
-
elevation_m: Union[Raster, np.ndarray] = None,
|
|
79
|
-
delta_Pa: Union[Raster, np.ndarray] = None,
|
|
80
|
-
gamma_Jkg: Union[Raster, np.ndarray, float] = None) -> Dict[str, Raster]:
|
|
81
|
-
results = {}
|
|
82
|
-
|
|
83
|
-
# calculate leaf area index if it's not given
|
|
84
|
-
if LAI is None:
|
|
85
|
-
# calculate leaf area index from NDVI
|
|
86
|
-
LAI = LAI_from_NDVI(NDVI)
|
|
87
|
-
|
|
88
|
-
# calculate fraction of vegetation cover if it's not given
|
|
89
|
-
if FVC is None:
|
|
90
|
-
# calculate fraction of vegetation cover from NDVI
|
|
91
|
-
FVC = FVC_from_NDVI(NDVI)
|
|
92
|
-
|
|
93
|
-
# calculate surface air pressure if it's not given
|
|
94
|
-
if Ps_Pa is None:
|
|
95
|
-
# calculate surface air pressure is Pascal
|
|
96
|
-
Ps_Pa = calculate_surface_pressure(elevation_m=elevation_m, Ta_C=Ta_C)
|
|
97
|
-
|
|
98
|
-
# calculate Penman-Monteith/Priestley-Taylor delta term if it's not given
|
|
99
|
-
if delta_Pa is None:
|
|
100
|
-
# calculate Penman-Monteith/Priestley-Taylor delta term in Pascal per degree Celsius
|
|
101
|
-
delta_Pa = delta_Pa_from_Ta_C(Ta_C)
|
|
102
|
-
|
|
103
|
-
# calculate latent heat of vaporization if it's not given
|
|
104
|
-
if lambda_Jkg is None:
|
|
105
|
-
# calculate latent heat of vaporization in Joules per kilogram
|
|
106
|
-
lambda_Jkg = lambda_Jkg_from_Ta_C(Ta_C)
|
|
107
|
-
|
|
108
|
-
logger.info("calculating PM-MOD meteorology")
|
|
109
|
-
|
|
110
|
-
# calculate air temperature in Kelvin
|
|
111
|
-
Ta_K = celcius_to_kelvin(Ta_C)
|
|
112
|
-
|
|
113
|
-
# calculate saturation vapor pressure in Pascal from air temperature in Celsius
|
|
114
|
-
SVP_Pa = SVP_Pa_from_Ta_C(Ta_C)
|
|
115
|
-
|
|
116
|
-
# calculate vapor pressure in Pascal from releative humidity and saturation vapor pressure
|
|
117
|
-
Ea_Pa = RH * SVP_Pa
|
|
118
|
-
|
|
119
|
-
# specific humidity of air
|
|
120
|
-
# as a ratio of kilograms of water to kilograms of air and water
|
|
121
|
-
# from surface pressure and actual water vapor pressure
|
|
122
|
-
specific_humidity = calculate_specific_humidity(Ea_Pa, Ps_Pa)
|
|
123
|
-
results['specific_humidity'] = specific_humidity
|
|
124
|
-
|
|
125
|
-
# calculate air density (rho) in kilograms per cubic meter
|
|
126
|
-
rho_kgm3 = calculate_air_density(Ps_Pa, Ta_K, specific_humidity)
|
|
127
|
-
results["rho_kgm3"] = rho_kgm3
|
|
128
|
-
|
|
129
|
-
# calculate specific heat capacity of the air (Cp)
|
|
130
|
-
# in joules per kilogram per kelvin
|
|
131
|
-
# from specific heat of water vapor (CPW)
|
|
132
|
-
# and specific heat of dry air (CPD)
|
|
133
|
-
Cp_Jkg = calculate_specific_heat(specific_humidity)
|
|
134
|
-
results["Cp"] = Cp_Jkg
|
|
135
|
-
|
|
136
|
-
# calculate delta term if it's not given
|
|
137
|
-
if delta_Pa is None:
|
|
138
|
-
# slope of saturation vapor pressure curve in Pascal per degree
|
|
139
|
-
delta_Pa = delta_Pa_from_Ta_C(Ta_C)
|
|
140
|
-
|
|
141
|
-
results["delta_Pa"] = delta_Pa
|
|
142
|
-
|
|
143
|
-
# calculate gamma term if it's not given
|
|
144
|
-
if gamma_Jkg is None:
|
|
145
|
-
# calculate psychrometric gamma in Joules per kilogram
|
|
146
|
-
gamma_Jkg = calculate_gamma(
|
|
147
|
-
Ta_C=Ta_C,
|
|
148
|
-
Ps_Pa=Ps_Pa,
|
|
149
|
-
Cp_Jkg=Cp_Jkg
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
# vapor pressure deficit in Pascal
|
|
153
|
-
VPD_Pa = rt.clip(SVP_Pa - Ea_Pa, 0.0, None)
|
|
154
|
-
|
|
155
|
-
# calculate relative surface wetness (fwet)
|
|
156
|
-
# from relative humidity
|
|
157
|
-
fwet = calculate_fwet(RH)
|
|
158
|
-
results['fwet'] = fwet
|
|
159
|
-
|
|
160
|
-
logger.info("calculating PM-MOD resistances")
|
|
161
|
-
|
|
162
|
-
# query leaf conductance to sensible heat (gl_sh) in seconds per meter
|
|
163
|
-
gl_sh = MOD16_parameter_from_IGBP(
|
|
164
|
-
variable="gl_sh",
|
|
165
|
-
IGBP=IGBP
|
|
166
|
-
)
|
|
167
|
-
|
|
168
|
-
results['gl_sh'] = gl_sh
|
|
169
|
-
|
|
170
|
-
# calculate wet canopy resistance to sensible heat (rhc) in seconds per meter
|
|
171
|
-
# from leaf conductance to sensible heat (gl_sh), LAI, and relative surface wetness (fwet)
|
|
172
|
-
rhc = calculate_wet_canopy_resistance(gl_sh, LAI, fwet)
|
|
173
|
-
results['rhc'] = rhc
|
|
174
|
-
|
|
175
|
-
# calculate resistance to radiative heat transfer through air (rrc)
|
|
176
|
-
rrc = float32(rho_kgm3 * Cp_Jkg / (4.0 * SIGMA * Ta_K ** 3.0))
|
|
177
|
-
results['rrc'] = rrc
|
|
178
|
-
|
|
179
|
-
# calculate aerodynamic resistance (rhrc)
|
|
180
|
-
# in seconds per meter
|
|
181
|
-
# from wet canopy resistance to sensible heat
|
|
182
|
-
# and resistance to radiative heat transfer through air
|
|
183
|
-
rhrc = float32((rhc * rrc) / (rhc + rrc))
|
|
184
|
-
results['rhrc'] = rhrc
|
|
185
|
-
|
|
186
|
-
# calculate leaf conductance to evaporated water vapor (gl_e_wv)
|
|
187
|
-
gl_e_wv = MOD16_parameter_from_IGBP(
|
|
188
|
-
variable="gl_e_wv",
|
|
189
|
-
IGBP=IGBP
|
|
190
|
-
)
|
|
191
|
-
|
|
192
|
-
results['gl_e_wv'] = gl_e_wv
|
|
193
|
-
|
|
194
|
-
rvc = calculate_wet_canopy_resistance(gl_e_wv, LAI, fwet)
|
|
195
|
-
results['rvc'] = rvc
|
|
196
|
-
|
|
197
|
-
# caluclate available radiation to the canopy (Ac)
|
|
198
|
-
# in watts per square meter
|
|
199
|
-
# this is the same as net radiation to the canopy in PT-JPL
|
|
200
|
-
Ac = Rn * FVC
|
|
201
|
-
results['Ac'] = Ac
|
|
202
|
-
|
|
203
|
-
# calculate wet latent heat flux (LEi)
|
|
204
|
-
# in watts per square meter
|
|
205
|
-
LEi = calculate_interception(
|
|
206
|
-
delta_Pa=delta_Pa,
|
|
207
|
-
Ac=Ac,
|
|
208
|
-
rho=rho_kgm3,
|
|
209
|
-
Cp=Cp_Jkg,
|
|
210
|
-
VPD_Pa=VPD_Pa,
|
|
211
|
-
FVC=FVC,
|
|
212
|
-
rhrc=rhrc,
|
|
213
|
-
fwet=fwet,
|
|
214
|
-
rvc=rvc,
|
|
215
|
-
gamma_Jkg=gamma_Jkg
|
|
216
|
-
)
|
|
217
|
-
|
|
218
|
-
results['LEi'] = LEi
|
|
219
|
-
|
|
220
|
-
# calculate correctance factor (rcorr)
|
|
221
|
-
# for stomatal and cuticular conductances
|
|
222
|
-
# from surface pressure and air temperature
|
|
223
|
-
rcorr = calculate_rcorr(Ps_Pa, Ta_K)
|
|
224
|
-
results['rcorr'] = rcorr
|
|
225
|
-
|
|
226
|
-
# query biome-specific mean potential stomatal conductance per unit leaf area
|
|
227
|
-
CL = MOD16_parameter_from_IGBP(
|
|
228
|
-
variable="CL",
|
|
229
|
-
IGBP=IGBP
|
|
230
|
-
)
|
|
231
|
-
|
|
232
|
-
results['CL'] = CL
|
|
233
|
-
|
|
234
|
-
# query open minimum temperature by land-cover
|
|
235
|
-
tmin_open = MOD16_parameter_from_IGBP(
|
|
236
|
-
variable="tmin_open",
|
|
237
|
-
IGBP=IGBP
|
|
238
|
-
)
|
|
239
|
-
|
|
240
|
-
results['tmin_open'] = tmin_open
|
|
241
|
-
|
|
242
|
-
# query closed minimum temperature by land-cover
|
|
243
|
-
tmin_close = MOD16_parameter_from_IGBP(
|
|
244
|
-
variable="tmin_close",
|
|
245
|
-
IGBP=IGBP
|
|
246
|
-
)
|
|
247
|
-
|
|
248
|
-
results['tmin_close'] = tmin_close
|
|
249
|
-
|
|
250
|
-
# calculate minimum temperature factor for stomatal conductance
|
|
251
|
-
mTmin = calculate_tmin_factor(Tmin_C, tmin_open, tmin_close, IGBP)
|
|
252
|
-
results['mTmin'] = mTmin
|
|
253
|
-
|
|
254
|
-
# query open vapor pressure deficit by land-cover
|
|
255
|
-
VPD_open = MOD16_parameter_from_IGBP(
|
|
256
|
-
variable="VPD_open",
|
|
257
|
-
IGBP=IGBP
|
|
258
|
-
)
|
|
259
|
-
|
|
260
|
-
results['vpd_open'] = VPD_open
|
|
261
|
-
|
|
262
|
-
# query closed vapor pressure deficit by land-cover
|
|
263
|
-
VPD_close = MOD16_parameter_from_IGBP(
|
|
264
|
-
variable="VPD_close",
|
|
265
|
-
IGBP=IGBP
|
|
266
|
-
)
|
|
267
|
-
|
|
268
|
-
results['vpd_close'] = VPD_close
|
|
269
|
-
|
|
270
|
-
# calculate vapor pressure deficit factor for stomatal conductance
|
|
271
|
-
mVPD = calculate_VPD_factor(VPD_open, VPD_close, VPD_Pa)
|
|
272
|
-
results['mVPD'] = mVPD
|
|
273
|
-
|
|
274
|
-
# calculate stomatal conductance (gs1)
|
|
275
|
-
gs1 = CL * mTmin * mVPD * rcorr
|
|
276
|
-
results['gs1'] = gs1
|
|
277
|
-
|
|
278
|
-
# correct cuticular conductance constant to leaf cuticular conductance (Gcu) using correction factor (rcorr)
|
|
279
|
-
Gcu = CUTICULAR_CONDUCTANCE * rcorr
|
|
280
|
-
results['Gcu'] = Gcu
|
|
281
|
-
|
|
282
|
-
# calculate canopy conductance
|
|
283
|
-
# equivalent to g_canopy
|
|
284
|
-
Cc = calculate_canopy_conductance(LAI, fwet, gl_sh, gs1, Gcu)
|
|
285
|
-
results['Cc'] = Cc
|
|
286
|
-
|
|
287
|
-
# calculate surface resistance to evapotranspiration as inverse of canopy conductance (Cc)
|
|
288
|
-
rs = rt.clip(1.0 / Cc, 0.0, MAX_RESISTANCE)
|
|
289
|
-
results['rs'] = rs
|
|
290
|
-
|
|
291
|
-
# calculate convective heat transfer as inverse of leaf conductance to sensible heat (gl_sh)
|
|
292
|
-
rh = 1.0 / gl_sh
|
|
293
|
-
results['rh'] = rs
|
|
294
|
-
|
|
295
|
-
# calculate radiative heat transfer (rr)
|
|
296
|
-
rr = rho_kgm3 * Cp_Jkg / (4.0 * SIGMA * Ta_K ** 3)
|
|
297
|
-
results['rr'] = rr
|
|
298
|
-
|
|
299
|
-
# calculate parallel resistance (ra)
|
|
300
|
-
# MOD16 user guide is not clear about what to call this
|
|
301
|
-
ra = (rh * rr) / (rh + rr)
|
|
302
|
-
results["ra"] = ra
|
|
303
|
-
|
|
304
|
-
# calculate transpiration
|
|
305
|
-
LEc = calculate_transpiration(
|
|
306
|
-
delta_Pa=delta_Pa,
|
|
307
|
-
Ac=Ac,
|
|
308
|
-
rho=rho_kgm3,
|
|
309
|
-
Cp_Jkg=Cp_Jkg,
|
|
310
|
-
VPD_Pa=VPD_Pa,
|
|
311
|
-
FVC=FVC,
|
|
312
|
-
ra=ra,
|
|
313
|
-
fwet=fwet,
|
|
314
|
-
rs=rs,
|
|
315
|
-
gamma_Jkg=gamma_Jkg
|
|
316
|
-
)
|
|
317
|
-
|
|
318
|
-
results['LEc'] = LEc
|
|
319
|
-
|
|
320
|
-
# soil evaporation
|
|
321
|
-
|
|
322
|
-
# query aerodynamic resistant constraints from land-cover
|
|
323
|
-
rbl_max = MOD16_parameter_from_IGBP(
|
|
324
|
-
variable="rbl_max",
|
|
325
|
-
IGBP=IGBP
|
|
326
|
-
)
|
|
327
|
-
|
|
328
|
-
results['rbl_max'] = rbl_max
|
|
329
|
-
|
|
330
|
-
rbl_min = MOD16_parameter_from_IGBP(
|
|
331
|
-
variable="rbl_min",
|
|
332
|
-
IGBP=IGBP
|
|
333
|
-
)
|
|
334
|
-
|
|
335
|
-
results['rbl_min'] = rbl_min
|
|
336
|
-
|
|
337
|
-
rtotc = calculate_rtotc(VPD_Pa, VPD_open, VPD_close, rbl_max, rbl_min)
|
|
338
|
-
results['rtotc'] = rtotc
|
|
339
|
-
|
|
340
|
-
# calculate total aerodynamic resistance
|
|
341
|
-
# by applying correction to total canopy resistance
|
|
342
|
-
rtot = rcorr * rtotc
|
|
343
|
-
results['rtot'] = rtot
|
|
344
|
-
|
|
345
|
-
# calculate resistance to radiative heat transfer through air
|
|
346
|
-
rrs = float32(rho_kgm3 * Cp_Jkg / (4.0 * SIGMA * Ta_K ** 3))
|
|
347
|
-
results['rrs'] = rrs
|
|
348
|
-
|
|
349
|
-
# calculate aerodynamic resistance at the soil surface
|
|
350
|
-
ras = (rtot * rrs) / (rtot + rrs)
|
|
351
|
-
results['ras'] = ras
|
|
352
|
-
|
|
353
|
-
# calculate available radiation at the soil
|
|
354
|
-
Asoil = rt.clip((1.0 - FVC) * Rn - G, 0.0, None)
|
|
355
|
-
results['Asoil'] = Asoil
|
|
356
|
-
|
|
357
|
-
# separate wet soil evaporation and potential soil evaporation
|
|
358
|
-
|
|
359
|
-
# calculate wet soil evaporation
|
|
360
|
-
LE_soil_wet = calculate_wet_soil_evaporation(
|
|
361
|
-
delta_Pa=delta_Pa,
|
|
362
|
-
Asoil=Asoil,
|
|
363
|
-
rho=rho_kgm3,
|
|
364
|
-
Cp_Jkg=Cp_Jkg,
|
|
365
|
-
FVC=FVC,
|
|
366
|
-
VPD_Pa=VPD_Pa,
|
|
367
|
-
ras=ras,
|
|
368
|
-
fwet=fwet,
|
|
369
|
-
rtot=rtot,
|
|
370
|
-
gamma_Jkg=gamma_Jkg
|
|
371
|
-
)
|
|
372
|
-
|
|
373
|
-
results['LE_soil_wet'] = LE_soil_wet
|
|
374
|
-
|
|
375
|
-
# calculate potential soil evaporation
|
|
376
|
-
LE_soil_pot = calculate_potential_soil_evaporation(
|
|
377
|
-
delta_Pa=delta_Pa,
|
|
378
|
-
Asoil=Asoil,
|
|
379
|
-
rho=rho_kgm3,
|
|
380
|
-
Cp_Jkg=Cp_Jkg,
|
|
381
|
-
FVC=FVC,
|
|
382
|
-
VPD_Pa=VPD_Pa,
|
|
383
|
-
ras=ras,
|
|
384
|
-
fwet=fwet,
|
|
385
|
-
rtot=rtot,
|
|
386
|
-
gamma_Jkg=gamma_Jkg
|
|
387
|
-
)
|
|
388
|
-
|
|
389
|
-
results['LE_soil_pot'] = LE_soil_pot
|
|
390
|
-
|
|
391
|
-
# calculate soil moisture constraint
|
|
392
|
-
fSM = calculate_fSM(RH, VPD_Pa)
|
|
393
|
-
results['fSM'] = fSM
|
|
394
|
-
|
|
395
|
-
# calculate soil evaporation
|
|
396
|
-
LEs = rt.clip(LE_soil_wet + LE_soil_pot * fSM, 0.0, None)
|
|
397
|
-
|
|
398
|
-
# fill soil evaporation with zero
|
|
399
|
-
LEs = rt.where(isnan(LEs), 0.0, LEs)
|
|
400
|
-
results['LEs'] = LEs
|
|
401
|
-
|
|
402
|
-
# sum partitions into total latent heat flux
|
|
403
|
-
LE = rt.clip(LEi + LEc + LEs, 0.0, Rn)
|
|
404
|
-
results['LE'] = LE
|
|
405
|
-
|
|
406
|
-
return results
|
|
@@ -3,13 +3,20 @@ from os.path import join, abspath, dirname
|
|
|
3
3
|
import numpy as np
|
|
4
4
|
import pandas as pd
|
|
5
5
|
|
|
6
|
-
from rasters import Raster, RasterGeometry
|
|
6
|
+
from rasters import Raster, RasterGeometry, SpatialGeometry
|
|
7
7
|
|
|
8
|
-
from
|
|
8
|
+
from MCD12C1_2019_v006 import load_MCD12C1_IGBP
|
|
9
|
+
|
|
10
|
+
from .constants import *
|
|
9
11
|
|
|
10
12
|
LUT = pd.read_csv(join(abspath(dirname(__file__)), 'mod16.csv'))
|
|
11
13
|
|
|
12
|
-
def
|
|
14
|
+
def PMJPL_parameter_from_IGBP(
|
|
15
|
+
variable: str,
|
|
16
|
+
IGBP: Union[Raster, np.ndarray] = None,
|
|
17
|
+
geometry: SpatialGeometry = None,
|
|
18
|
+
IGBP_upsampling_resolution_meters: int = IGBP_UPSAMPLING_RESOLUTION_METERS,
|
|
19
|
+
resampling=IGBP_PARAMETER_RESAMPLING) -> Union[Raster, np.ndarray]:
|
|
13
20
|
"""
|
|
14
21
|
Translates the IGBP (International Geosphere-Biosphere Programme) values to the corresponding values in the Look-Up Table (LUT) for a given variable.
|
|
15
22
|
|
|
@@ -28,14 +35,22 @@ def MOD16_parameter_from_IGBP(variable: str, IGBP: Union[Raster, np.ndarray] = N
|
|
|
28
35
|
|
|
29
36
|
Returns:
|
|
30
37
|
Union[np.ndarray, Raster]: The translated values.
|
|
31
|
-
|
|
32
38
|
"""
|
|
39
|
+
if geometry is None and isinstance(IGBP, Raster):
|
|
40
|
+
geometry = IGBP.geometry
|
|
41
|
+
|
|
42
|
+
if isinstance(geometry, RasterGeometry):
|
|
43
|
+
IGBP_geometry = geometry.UTM(IGBP_upsampling_resolution_meters)
|
|
44
|
+
else:
|
|
45
|
+
IGBP_geometry = geometry
|
|
46
|
+
|
|
33
47
|
if IGBP is None:
|
|
34
|
-
IGBP = load_MCD12C1_IGBP(geometry=
|
|
48
|
+
IGBP = load_MCD12C1_IGBP(geometry=IGBP_geometry)
|
|
35
49
|
|
|
36
50
|
result = np.float32(np.array(LUT[variable])[np.array(IGBP).astype(int)])
|
|
37
51
|
|
|
38
|
-
if isinstance(IGBP, Raster):
|
|
39
|
-
result = Raster(result, geometry=
|
|
52
|
+
if isinstance(IGBP, Raster) or isinstance(geometry, RasterGeometry):
|
|
53
|
+
result = Raster(result, geometry=IGBP_geometry)
|
|
54
|
+
result = result.to_geometry(geometry, resampling=resampling)
|
|
40
55
|
|
|
41
56
|
return result
|
PMJPL/VPD_factor.py
CHANGED
|
@@ -20,7 +20,7 @@ def calculate_VPD_factor(
|
|
|
20
20
|
"""
|
|
21
21
|
# calculate VPD factor using queried open and closed VPD
|
|
22
22
|
mVPD = rt.where(VPD <= VPD_open, 1.0, np.nan)
|
|
23
|
-
mVPD = rt.where(
|
|
23
|
+
mVPD = rt.where(np.logical_and(VPD_open < VPD, VPD < VPD_close), (VPD_close - VPD) / (VPD_close - VPD_open), mVPD)
|
|
24
24
|
mVPD = rt.where(VPD >= VPD_close, 0.0, mVPD)
|
|
25
25
|
|
|
26
26
|
return mVPD
|