CLM N budget and post processing

jinmuluo

Jinmu Luo
Member
Hi,

(1) I want to ask a nitrogen (N) budget question in CLM, likely I want to calculate how much above-ground N biomass grows in each PFT type in a specific year (for example, year X); So, I output all these variables in the monthly history type at the PFT level. Is it correct to include all variables with _STORAGE and _XFER in N biomass?

hist_fincl3 = 'WOOD_HARVESTN', 'GRAINN_TO_FOOD', 'GRAINN_TO_SEED', 'CROPPROD1N_LOSS', 'COL_FIRE_NLOSS' ,'SMINN_TO_PLANT_FUN', 'SMINN_TO_PLANT_FUN_NO3', 'SMINN_TO_PLANT_FUN_NH4', 'LEAFN', 'LEAFN_STORAGE', 'LEAFN_XFER', 'STEMN', 'LIVESTEMN', 'LIVESTEMN_STORAGE', 'LIVESTEMN_XFER', 'FROOTN', 'FROOTN_STORAGE', 'FROOTN_XFER', 'LIVECROOTN', 'LIVECROOTN_STORAGE', 'LIVECROOTN_XFER', 'TOTVEGN'

for example, I want to term the

N_above_ground = 'GRAINN_TO_FOOD' + 'GRAINN_TO_SEED' + 'LEAFN' + 'LEAFN_STORAGE' + 'LEAFN_XFER' + 'STEMN' + 'LIVESTEMN' + 'LIVESTEMN_STORAGE' + 'LIVESTEMN_XFER'

Any N variables I should exclude from the above equation, or any N variables I miss

(2) How to quickly project the column-level or PFT-level dataset back to the grid cell level? Eventually, I need to sum up the dataset at the country level. Processing the grid cell level is much easier than the column/PFT dataset, so I want to ask about the typical workflow of projecting the column and PFT level dataset to the grid cell level.


thank you
 

slevis

Moderator
Staff member
On your second question, assuming I understand it correctly, you need to write a script to map the data from one level to another. If you can rerun the simulation(s), then you could ask the model to write gridcell-level history for you (as it does for numerous fields).
 
Vote Upvote 0 Downvote

jinmuluo

Jinmu Luo
Member
On your second question, assuming I understand it correctly, you need to write a script to map the data from one level to another. If you can rerun the simulation(s), then you could ask the model to write gridcell-level history for you (as it does for numerous fields).
Hi Sam,

We want to project the PFTs output to the grid cell level, then we can calculate the PFTs level crop information at the country level. For example, maize production and the associated N budget in the United States. As I know, the grid cell level dataset couldn't provide the species information, so I have to find a way to map the PFT level back to the grid cell level. Any idea to do so?

best,
 
Vote Upvote 0 Downvote

slevis

Moderator
Staff member
Your history files with hist_dov2xy = .false. (i.e. with PFT-level, column-level, and landunit-level output) should contain helpful mapping information for the mapping script that you will write. Some of the fields that I listed here (using ncdump on one of my files) will help you do the mapping:
Code:
        double lon(lndgrid) ;
                lon:long_name = "coordinate longitude" ;
                lon:units = "degrees_east" ;
                lon:_FillValue = 1.e+36 ;
                lon:missing_value = 1.e+36 ;
        double lat(lndgrid) ;
                lat:long_name = "coordinate latitude" ;
                lat:units = "degrees_north" ;
                lat:_FillValue = 1.e+36 ;
                lat:missing_value = 1.e+36 ;
        double area(lndgrid) ;
                area:long_name = "grid cell areas" ;
                area:units = "km^2" ;
                area:_FillValue = 1.e+36 ;
                area:missing_value = 1.e+36 ;
        double landfrac(lndgrid) ;
                landfrac:long_name = "land fraction" ;
                landfrac:_FillValue = 1.e+36 ;
                landfrac:missing_value = 1.e+36 ;
        int landmask(lndgrid) ;
                landmask:long_name = "land/ocean mask (0.=ocean and 1.=land)" ;
                landmask:_FillValue = -9999 ;
                landmask:missing_value = -9999 ;
        double grid1d_lon(gridcell) ;
                grid1d_lon:long_name = "gridcell longitude" ;
                grid1d_lon:units = "degrees_east" ;
                grid1d_lon:_FillValue = 1.e+36 ;
        double grid1d_lat(gridcell) ;
                grid1d_lat:long_name = "gridcell latitude" ;
                grid1d_lat:units = "degrees_north" ;
                grid1d_lat:_FillValue = 1.e+36 ;
        int grid1d_ixy(gridcell) ;
                grid1d_ixy:long_name = "2d longitude index of corresponding gridcell" ;
                grid1d_ixy:_FillValue = -9999 ;
        int grid1d_jxy(gridcell) ;
                grid1d_jxy:long_name = "2d latitude index of corresponding gridcell" ;
                grid1d_jxy:_FillValue = -9999 ;
        double land1d_lon(landunit) ;
                land1d_lon:long_name = "landunit longitude" ;
                land1d_lon:units = "degrees_east" ;
                land1d_lon:_FillValue = 1.e+36 ;
        double land1d_lat(landunit) ;
                land1d_lat:long_name = "landunit latitude" ;
                land1d_lat:units = "degrees_north" ;
                land1d_lat:_FillValue = 1.e+36 ;
        int land1d_ixy(landunit) ;
                land1d_ixy:long_name = "2d longitude index of corresponding landunit" ;
                land1d_ixy:_FillValue = -9999 ;
        int land1d_jxy(landunit) ;
                land1d_jxy:long_name = "2d latitude index of corresponding landunit" ;
                land1d_jxy:_FillValue = -9999 ;
        int land1d_gi(landunit) ;
                land1d_gi:long_name = "1d grid index of corresponding landunit" ;
                land1d_gi:_FillValue = -9999 ;
        int land1d_ityplunit(landunit) ;
                land1d_ityplunit:long_name = "landunit type (vegetated,urban,lake,wetland,glacier or glacier_mec)" ;
                land1d_ityplunit:_FillValue = -9999 ;
        int land1d_active(landunit) ;
                land1d_active:long_name = "true => do computations on this landunit" ;
                land1d_active:_FillValue = 0 ;
                land1d_active:flag_values = 0, 1 ;
                land1d_active:flag_meanings = "FALSE TRUE" ;
                land1d_active:valid_range = 0, 1 ;
        double cols1d_lon(column) ;
                cols1d_lon:long_name = "column longitude" ;
                cols1d_lon:units = "degrees_east" ;
                cols1d_lon:_FillValue = 1.e+36 ;
        double cols1d_lat(column) ;
                cols1d_lat:long_name = "column latitude" ;
                cols1d_lat:units = "degrees_north" ;
                cols1d_lat:_FillValue = 1.e+36 ;
        int cols1d_ixy(column) ;
                cols1d_ixy:long_name = "2d longitude index of corresponding column" ;
                cols1d_ixy:_FillValue = -9999 ;
        int cols1d_jxy(column) ;
                cols1d_jxy:long_name = "2d latitude index of corresponding column" ;
                cols1d_jxy:_FillValue = -9999 ;
        int cols1d_gi(column) ;
                cols1d_gi:long_name = "1d grid index of corresponding column" ;
                cols1d_gi:_FillValue = -9999 ;
        int cols1d_li(column) ;
                cols1d_li:long_name = "1d landunit index of corresponding column" ;
                cols1d_li:_FillValue = -9999 ;
        int cols1d_itype_col(column) ;
                cols1d_itype_col:long_name = "column type (see global attributes)" ;
                cols1d_itype_col:_FillValue = -9999 ;
        int cols1d_itype_lunit(column) ;
                cols1d_itype_lunit:long_name = "column landunit type (vegetated,urban,lake,wetland,glacier or glacier_mec)" ;
                cols1d_itype_lunit:_FillValue = -9999 ;
        int cols1d_active(column) ;
                cols1d_active:long_name = "true => do computations on this column" ;
                cols1d_active:_FillValue = 0 ;
                cols1d_active:flag_values = 0, 1 ;
                cols1d_active:flag_meanings = "FALSE TRUE" ;
                cols1d_active:valid_range = 0, 1 ;
        int cols1d_nbedrock(column) ;
                cols1d_nbedrock:long_name = "column bedrock depth index" ;
                cols1d_nbedrock:_FillValue = -9999 ;
        double pfts1d_lon(pft) ;
                pfts1d_lon:long_name = "pft longitude" ;
                pfts1d_lon:units = "degrees_east" ;
                pfts1d_lon:_FillValue = 1.e+36 ;
        double pfts1d_lat(pft) ;
                pfts1d_lat:long_name = "pft latitude" ;
                pfts1d_lat:units = "degrees_north" ;
                pfts1d_lat:_FillValue = 1.e+36 ;
        int pfts1d_ixy(pft) ;
                pfts1d_ixy:long_name = "2d longitude index of corresponding pft" ;
                pfts1d_ixy:_FillValue = -9999 ;
        int pfts1d_jxy(pft) ;
                pfts1d_jxy:long_name = "2d latitude index of corresponding pft" ;
                pfts1d_jxy:_FillValue = -9999 ;
        int pfts1d_gi(pft) ;
                pfts1d_gi:long_name = "1d grid index of corresponding pft" ;
                pfts1d_gi:_FillValue = -9999 ;
        int pfts1d_li(pft) ;
                pfts1d_li:long_name = "1d landunit index of corresponding pft" ;
                pfts1d_li:_FillValue = -9999 ;
        int pfts1d_ci(pft) ;
                pfts1d_ci:long_name = "1d column index of corresponding pft" ;
                pfts1d_ci:_FillValue = -9999 ;
        int pfts1d_itype_veg(pft) ;
                pfts1d_itype_veg:long_name = "pft vegetation type" ;
                pfts1d_itype_veg:_FillValue = -9999 ;
        int pfts1d_itype_col(pft) ;
                pfts1d_itype_col:long_name = "pft column type (see global attributes)" ;
                pfts1d_itype_col:_FillValue = -9999 ;
        int pfts1d_itype_lunit(pft) ;
                pfts1d_itype_lunit:long_name = "pft landunit type (vegetated,urban,lake,wetland,glacier or glacier_mec)" ;
                pfts1d_itype_lunit:_FillValue = -9999 ;
        int pfts1d_active(pft) ;
                pfts1d_active:long_name = "true => do computations on this pft" ;
                pfts1d_active:_FillValue = 0 ;
                pfts1d_active:flag_values = 0, 1 ;
                pfts1d_active:flag_meanings = "FALSE TRUE" ;
                pfts1d_active:valid_range = 0, 1 ;
        double land1d_wtgcell(landunit) ;
                land1d_wtgcell:long_name = "landunit weight relative to corresponding gridcell" ;
                land1d_wtgcell:_FillValue = 1.e+36 ;
        double cols1d_wtgcell(column) ;
                cols1d_wtgcell:long_name = "column weight relative to corresponding gridcell" ;
                cols1d_wtgcell:_FillValue = 1.e+36 ;
        double cols1d_wtlunit(column) ;
                cols1d_wtlunit:long_name = "column weight relative to corresponding landunit" ;
                cols1d_wtlunit:_FillValue = 1.e+36 ;
        double pfts1d_wtgcell(pft) ;
                pfts1d_wtgcell:long_name = "pft weight relative to corresponding gridcell" ;
                pfts1d_wtgcell:_FillValue = 1.e+36 ;
        double pfts1d_wtlunit(pft) ;
                pfts1d_wtlunit:long_name = "pft weight relative to corresponding landunit" ;
                pfts1d_wtlunit:_FillValue = 1.e+36 ;
        double pfts1d_wtcol(pft) ;
                pfts1d_wtcol:long_name = "pft weight relative to corresponding column" ;
                pfts1d_wtcol:_FillValue = 1.e+36 ;
 
Vote Upvote 0 Downvote
Back
Top