query_paramfile: Better presentation of mergetoclmpft
- Dominant language
- Fortran
- Stars
- 352
- Forks
- 361
- Avg merge
- 6d 6h
- Merged PRs (30d)
- 8
Description
CLM doesn't simulate every crop that we have area for in the surface dataset. We use the `mergetoclmpft` parameter (from the paramfile) to merge non-simulated crops' area (and maybe other stuff?) into similar versions we do simulate. It would be nice to be able to see this information easily using `query_paramfile`.
I developed this (rough!) code snippet for the CUPiD crop notebook but am probably not going to end up needing it.
How would this interact with the PFT filtering? I think we would only print rows that contain the PFT(s) of interest, on either side of the `:`.
Results:
```
needleleaf_evergreen_temperate_tree: ['needleleaf_evergreen_temperate_tree']
needleleaf_evergreen_boreal_tree: ['needleleaf_evergreen_boreal_tree']
needleleaf_deciduous_boreal_tree: ['needleleaf_deciduous_boreal_tree']
broadleaf_evergreen_tropical_tree: ['broadleaf_evergreen_tropical_tree']
broadleaf_evergreen_temperate_tree: ['broadleaf_evergreen_temperate_tree']
broadleaf_deciduous_tropical_tree: ['broadleaf_deciduous_tropical_tree']
broadleaf_deciduous_temperate_tree: ['broadleaf_deciduous_temperate_tree']
broadleaf_deciduous_boreal_tree: ['broadleaf_deciduous_boreal_tree']
broadleaf_evergreen_shrub: ['broadleaf_evergreen_shrub']
broadleaf_deciduous_temperate_shrub: ['broadleaf_deciduous_temperate_shrub']
broadleaf_deciduous_boreal_shrub: ['broadleaf_deciduous_boreal_shrub']
c3_arctic_grass: ['c3_arctic_grass']
c3_non-arctic_grass: ['c3_non-arctic_grass']
c4_grass: ['c4_grass']
c3_crop: ['c3_crop']
c3_irrigated: ['c3_irrigated']
temperate_corn: ['temperate_corn']
irrigated_temperate_corn: ['irrigated_temperate_corn']
spring_wheat: ['spring_wheat', 'barley', 'rye', 'citrus', 'foddergrass', 'grapes', 'potatoes', 'pulses', 'rapeseed', 'sugarbeet', 'sunflower']
irrigated_spring_wheat: ['irrigated_spring_wheat', 'irrigated_barley', 'irrigated_rye', 'irrigated_citrus', 'irrigated_foddergrass', 'irrigated_grapes', 'irrigated_potatoes', 'irrigated_pulses', 'irrigated_rapeseed', 'irrigated_sugarbeet', 'irrigated_sunflower']
winter_wheat: ['winter_wheat', 'winter_barley', 'winter_rye']
irrigated_winter_wheat: ['irrigated_winter_wheat', 'irrigated_winter_barley', 'irrigated_winter_rye']
temperate_soybean: ['temperate_soybean']
irrigated_temperate_soybean: ['irrigated_temperate_soybean']
cotton: ['cotton', 'datepalm']
irrigated_cotton: ['irrigated_cotton', 'irrigated_datepalm']
rice: ['cassava', 'cocoa', 'coffee', 'groundnuts', 'oilpalm', 'rice']
irrigated_rice: ['irrigated_cassava', 'irrigated_cocoa', 'irrigated_coffee', 'irrigated_groundnuts', 'irrigated_oilpalm', 'irrigated_rice']
sugarcane: ['sugarcane']
irrigated_sugarcane: ['irrigated_sugarcane']
miscanthus: ['miscanthus']
irrigated_miscanthus: ['irrigated_miscanthus']
switchgrass: ['switchgrass']
irrigated_switchgrass: ['irrigated_switchgrass']
tropical_corn: ['millet', 'sorghum', 'tropical_corn']
irrigated_tropical_corn: ['irrigated_millet', 'irrigated_sorghum', 'irrigated_tropical_corn']
tropical_soybean: ['tropical_soybean']
irrigated_tropical_soybean: ['irrigated_tropical_soybean']
```
Compare that with the output of `query_paramfile -i /glade/campaign/cesm/cesmdata/cseg/inputdata/lnd/clm2/paramdata/ctsm5.3.041.Nfix_params.v13.c250221_upplim250.nc mergetoclmpft`:
```
mergetoclmpft:
not_vegetated : nan
needleleaf_evergreen_temperate_tree: 1.0
needleleaf_evergreen_boreal_tree : 2.0
needleleaf_deciduous_boreal_tree : 3.0
broadleaf_evergreen_tropical_tree : 4.0
broadleaf_evergreen_temperate_tree : 5.0
broadleaf_deciduous_tropical_tree : 6.0
broadleaf_deciduous_temperate_tree : 7.0
broadleaf_deciduous_boreal_tree : 8.0
broadleaf_evergreen_shrub : 9.0
broadleaf_deciduous_temperate_shrub: 10.0
broadleaf_deciduous_boreal_shrub : 11.0
c3_arctic_grass : 12.0
c3_non-arctic_grass : 13.0
c4_grass : 14.0
c3_crop : 15.0
c3_irrigated : 16.0
temperate_corn : 17.0
irrigated_temperate_corn : 18.0
spring_wheat : 19.0
irrigated_spring_wheat : 20.0
winter_wheat : 21.0
irrigated_winter_wheat : 22.0
temperate_soybean : 23.0
irrigated_temperate_soybean : 24.0
barley : 19.0
irrigated_barley : 20.0
winter_barley : 21.0
irrigated_winter_barley : 22.0
rye : 19.0
irrigated_rye : 20.0
winter_rye : 21.0
irrigated_winter_rye : 22.0
cassava : 61.0
irrigated_cassava : 62.0
citrus : 19.0
irrigated_citrus : 20.0
cocoa : 61.0
irrigated_cocoa : 62.0
coffee : 61.0
irrigated_coffee : 62.0
cotton : 41.0
irrigated_cotton : 42.0
datepalm : 41.0
irrigated_datepalm : 42.0
foddergrass : 19.0
irrigated_foddergrass : 20.0
grapes : 19.0
irrigated_grapes : 20.0
groundnuts : 61.0
irrigated_groundnuts : 62.0
millet : 75.0
irrigated_millet : 76.0
oilpalm : 61.0
irrigated_oilpalm : 62.0
potatoes : 19.0
irrigated_potatoes : 20.0
pulses : 19.0
irrigated_pulses : 20.0
rapeseed : 19.0
irrigated_rapeseed : 20.0
rice : 61.0
irrigated_rice : 62.0
sorghum : 75.0
irrigated_sorghum : 76.0
sugarbeet : 19.0
irrigated_sugarbeet : 20.0
sugarcane : 67.0
irrigated_sugarcane : 68.0
sunflower : 19.0
irrigated_sunflower : 20.0
miscanthus : 71.0
irrigated_miscanthus : 72.0
switchgrass : 73.0
irrigated_switchgrass : 74.0
tropical_corn : 75.0
irrigated_tropical_corn : 76.0
tropical_soybean : 77.0
irrigated_tropical_soybean : 78.0
```
Code:
```python
# %%
import xarray as xr
# Which crops' area is being combined into which crops' PFTs?
paramfile = "/glade/campaign/cesm/cesmdata/cseg/inputdata/lnd/clm2/paramdata/ctsm5.3.041.Nfix_params.v13.c250221_upplim250.nc"
params_ds = xr.open_dataset(
paramfile,
decode_timedelta=False,
)
# Actually set data values for the PFT dimension
params_ds["pft"] = params_ds["pft"]
pft_ints = params_ds["pft"].values
# Define some info
pft_names = [x.decode().strip() for x in params_ds["pftname"].values]
merge_int = params_ds["mergetoclmpft"].values
# Identify the PFTs that actually get things merged into them
parent_pft_names = []
parent_pft_ints = []
for i, pft_int in enumerate(pft_ints):
if merge_int[i] == pft_int:
pft_name = pft_names[i]
parent_pft_names.append(pft_name)
parent_pft_ints.append(pft_int)
# Create merge keys
merge_key_names = {}
for i_parent, parent_pft_name in enumerate(parent_pft_names):
parent_pft_int = parent_pft_ints[i_parent]
child_pft_names = []
for i_child, child_pft_int in enumerate(pft_ints):
if merge_int[i_child] == parent_pft_int:
child_pft_name = pft_names[i_child]
child_pft_names.append(child_pft_name)
if not child_pft_names:
raise RuntimeError(
f"Every parent PFT should have at least one child; {parent_pft_name} doesn't"
)
merge_key_names[parent_pft_name] = child_pft_names
print(f"{parent_pft_name}: {merge_key_names[parent_pft_name]}")
```
Contributor guide
Assessment
This issue has not been assessed yet.