Skip to content

Commit 96727d1

Browse files
Merge branch 'master' into calibration_updates
updating from master
2 parents e517474 + 93c25fc commit 96727d1

File tree

18 files changed

+988
-260
lines changed

18 files changed

+988
-260
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ command line.
2929

3030
More details are available in the [User Guide - Basic Model Setup and Run](https://uaf-arctic-eco-modeling.github.io/dvm-dos-tem/examples_and_tutorials/basic_model_run.html#basic-model-setup-and-run).
3131

32+
> [!TIP]
33+
> These instructions should work for users with [Podman](https://podman.io)
34+
> rather than Docker, but several additional steps may be necessary to ensure
35+
> that Podman can run with non-root access. See this
36+
> [issue](https://github.com/uaf-arctic-eco-modeling/dvm-dos-tem/issues/776)
37+
> for more information.
38+
3239
The settings shown here will use the input data that is shipped with the code in the
3340
repository's ``demo-data/`` directory. The run will output a single variable (GPP),
3441
and will run for 2 pixels.

config/output_spec.csv

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ DEADC,Standing dead C,g/m2,,,invalid,invalid,invalid,invalid,double,
1818
DEADN,Standing dead N,g/m2/time,,,invalid,invalid,invalid,invalid,double,
1919
DEEPC,Amorphous SOM C,g/m2,,,invalid,invalid,invalid,invalid,double,
2020
DEEPDZ,Amorphous SOM horizon thickness,m,,invalid,invalid,invalid,invalid,invalid,double,
21-
DRIVINGNIRR,Input driving NIRR,W/m2,invalid,invalid,,invalid,invalid,invalid,
21+
DRIVINGNIRR,Input driving NIRR,W/m2,invalid,invalid,,invalid,invalid,invalid,float,
2222
DRIVINGRAINFALL,Input driving precip data after being split from snowfall,mm,,,,invalid,invalid,invalid,float,
2323
DRIVINGSNOWFALL,Input driving precip data after being split from rainfall,mm,,,,invalid,invalid,invalid,float,
2424
DRIVINGTAIR,Input driving air temperature data,degree_C,invalid,invalid,,invalid,invalid,invalid,float,
2525
DRIVINGVAPO,Input driving vapor pressure,hPa,invalid,invalid,,invalid,invalid,invalid,float,
2626
DWDC,Dead woody debris C,g/m2/time,,,invalid,invalid,invalid,invalid,double,
2727
DWDN,Dead woody debris N,g/m2/time,,,invalid,invalid,invalid,invalid,double,
28-
EET,Actual ET,mm/m2/time,,,,,invalid,invalid,
28+
EET,Actual ET,mm/m2/time,,,,invalid,invalid,invalid,
2929
FRONTSDEPTH,Depth of fronts,mm,,,,invalid,invalid,,double,
3030
FRONTSTYPE,Front types,,,,,invalid,invalid,,int,
3131
GPP,GPP,g/m2/time,y,,invalid,,,invalid,double,
@@ -45,12 +45,12 @@ LAI,LAI,m2/m2,,,invalid,,invalid,invalid,double,
4545
LAYERDEPTH,Layer depth from the surface,m,,,invalid,invalid,invalid,forced,double,
4646
LAYERDZ,Thickness of layer,m,,,invalid,invalid,invalid,forced,double,
4747
LAYERTYPE,0:moss 1:shlw 2:deep 3:mineral,,,,invalid,invalid,invalid,forced,int,
48-
LTRFALC,Litterfall C,g/m2/time,,,invalid,,,invalid,double,
49-
LTRFALN,Litterfall N,g/m2/time,,,invalid,,,invalid,double,
48+
LFNVC,Litterfall C from non-vascular PFTs,g/m2/time,,,invalid,invalid,invalid,invalid,double,
49+
LFNVN,Litterfall N from non-vascular PFTs,g/m2/time,,,invalid,invalid,invalid,invalid,double,
50+
LFVC,Litterfall C from vascular PFTs,g/m2/time,,,invalid,,,invalid,double,
51+
LFVN,Litterfall N from vascular PFTs,g/m2/time,,,invalid,,,invalid,double,
5052
LWCLAYER,LWC by layer,m3/m3,,,invalid,invalid,invalid,forced,double,
5153
MINEC,Mineral SOM C,g/m2,,,invalid,invalid,invalid,invalid,double,
52-
MOSSDEATHC,Moss death carbon,g/m2,,,invalid,invalid,invalid,invalid,double,
53-
MOSSDEATHN,Moss death nitrogen,g/m2,,,invalid,invalid,invalid,invalid,double,
5454
MOSSDZ,Moss thickness,m,,invalid,invalid,invalid,invalid,invalid,double,
5555
NDRAIN,N losses from drainage (AVLN),g/m2/time,invalid,invalid,invalid,invalid,invalid,invalid,double,
5656
NETNMIN,Soil net N mineralization,g/m2/time,,,invalid,invalid,invalid,,double,
@@ -64,7 +64,7 @@ NUPTAKEST,Structural N uptake by plants,g/m2/time,,,invalid,,,invalid,double,
6464
ORGN,Total soil organic N,g/m2,,,invalid,invalid,invalid,,double,
6565
PERCOLATION,Percolation by layer,,invalid,invalid,,invalid,invalid,forced,double,
6666
PERMAFROST,Permafrost (1 or 0),,,invalid,invalid,invalid,invalid,invalid,int,
67-
PET,Potential ET,mm/m2/time,,,,,invalid,invalid,double,
67+
PET,Potential ET,mm/m2/time,,,,invalid,invalid,invalid,double,
6868
QDRAINAGE,Water drainage quotient (~ratio),,,,invalid,invalid,invalid,invalid,double,
6969
QDRAINLAYER,Qdrain per layer,mm,invalid,invalid,,invalid,invalid,forced,double,
7070
QINFILTRATION,Water infiltration quotient (~ratio),,,,invalid,invalid,invalid,invalid,double,
@@ -107,7 +107,9 @@ TMINEC,Temperature bottom mineral,degree_C,,,,invalid,invalid,invalid,double,
107107
TRANSPIRATION,Transpiration,mm/day,,,,invalid,invalid,invalid,double,
108108
TSHLW,Temperature in fibrous horizon,degree_C,,,,invalid,invalid,invalid,double,
109109
VEGC,Total veg. biomass C,g/m2,,,invalid,,,invalid,double,
110-
VEGN,Total veg. biomass N,g/m2,,,invalid,,,invalid,double,
110+
VEGNTOT,Total veg. biomass N (structural and labile),g/m2,,,invalid,invalid,invalid,invalid,double,
111+
VEGNLAB,Veg. biomass labile N,g/m2,,,invalid,invalid,invalid,invalid,double,
112+
VEGNSTR,Veg. biomass structural N,g/m2,,,invalid,,,invalid,double,
111113
VWCDEEP,VWC in amorphous horizon,m3/m3,,,,invalid,invalid,invalid,double,
112114
VWCLAYER,VWC by layer,m3/m3,,,invalid,invalid,invalid,forced,double,
113115
VWCMINEA,VWC top mineral,m3/m3,,,,invalid,invalid,invalid,double,

docs_src/sphinx/source/examples_and_tutorials/basic_model_run.rst

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@ and visualization, see the :ref:`Plotting Example
2020
For users who have Docker and Git installed and some familiarity with the
2121
command line.
2222

23+
.. note::
24+
25+
These instructions should work for users with `Podman <https://podman.io>`_
26+
rather than Docker, but several additional steps may be necessary to ensure
27+
that Podman can run with non-root access. See this
28+
`issue <https://github.com/uaf-arctic-eco-modeling/dvm-dos-tem/issues/776>`_
29+
for more information.
30+
31+
2332
The settings shown here will use the input data that is shipped with the code
2433
in the repository's ``demo-data/`` directory. The run will output a single
2534
variable (GPP), and will run for 2 pixels.
@@ -148,6 +157,14 @@ The dependencies for a piece of software are isolated inside the container. This
148157
isolation allows software with conflicting dependencies to run on the host
149158
system.
150159

160+
.. hint::
161+
162+
These instructions should work for users with `Podman <https://podman.io>`_
163+
rather than Docker, but several additional steps may be necessary to ensure
164+
that Podman can run with non-root access. See this
165+
`issue <https://github.com/uaf-arctic-eco-modeling/dvm-dos-tem/issues/776>`_
166+
for more information.
167+
151168
There are other ways you can get the environment necessary for running,
152169
compiling and developing ``dvmdostem``, such as a native installation, or using
153170
a virtual machine (e.g. with Vagrant and Virtual Box or VMWare). Each path to a

include/BgcData.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ class BgcData {
7272
void soil_beginOfMonth();
7373
void soil_endOfMonth(const int currmind);
7474

75+
void soil_updatePools(const int currmind);
7576
private:
7677

7778

include/EnvData.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ class EnvData {
144144
void grnd_beginOfDay();
145145

146146
// accumulating/averaging monthly variables at the end of day
147-
void atm_endOfDay(const int & dinm);
147+
void atm_endOfDay(const int & dinm, const int & dayidx);
148148
void veg_endOfDay(const int & dinm);
149149
void grnd_endOfDay(const int & dinm, const int & doy);
150150

include/OutputHolder.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ class OutputHolder{
3939
std::vector<double> deepc_for_output;
4040
std::vector<double> dwdc_for_output;
4141
std::vector<double> minec_for_output;
42-
std::vector<double> mossdeathc_for_output;
43-
std::vector<double> mossdeathn_for_output;
42+
std::vector<double> lfnvc_for_output; //non-vascular litterfall C
43+
std::vector<double> lfnvn_for_output; //non-vascular litterfall N
4444
std::vector<double> mossdz_for_output;
4545
std::vector<double> qdrain_for_output;
4646
std::vector<double> qinfil_for_output;
@@ -105,10 +105,10 @@ class OutputHolder{
105105
std::vector<std::array<double, NUM_PFT>> gpp_pft_for_output;
106106
std::vector<std::array<std::array<double, NUM_PFT>, NUM_PFT_PART>> gpp_for_output;
107107

108-
std::vector<double> ltrfalc_tot_for_output;
109-
std::vector<std::array<double, NUM_PFT_PART>> ltrfalc_part_for_output;
110-
std::vector<std::array<double, NUM_PFT>> ltrfalc_pft_for_output;
111-
std::vector<std::array<std::array<double, NUM_PFT>, NUM_PFT_PART>> ltrfalc_for_output;
108+
std::vector<double> lfvc_tot_for_output;
109+
std::vector<std::array<double, NUM_PFT_PART>> lfvc_part_for_output;
110+
std::vector<std::array<double, NUM_PFT>> lfvc_pft_for_output;
111+
std::vector<std::array<std::array<double, NUM_PFT>, NUM_PFT_PART>> lfvc_for_output;
112112

113113
std::vector<double> ingpp_tot_for_output;
114114
std::vector<std::array<double, NUM_PFT_PART>> ingpp_part_for_output;

scripts/simulation_comparison_report.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -737,43 +737,48 @@ def vegdynamic(simpath,simlist,vlist,sclist,oname,stage):
737737

738738
os.mkdir(os.path.join(POD,'results'))
739739

740+
stage = 'eq'
741+
740742
print("Generating timeseries flux plots...")
741-
VARlist=['RHSOM','GPP','NPP','LTRFALC','RG','RM']
742-
ts_flux(POD,PODlist,VARlist,scenariolist,colorlist,widthlist,'carbon','Yearly Carbon Flux Time Series','eq')
743+
VARlist=['RHSOM','GPP','NPP','LFVC','RG','RM']
744+
ts_flux(POD,PODlist,VARlist,scenariolist,colorlist,widthlist,'carbon','Yearly Carbon Flux Time Series',stage)
743745

744-
VARlist=['NUPTAKEST','NUPTAKELAB','NRESORB','NIMMOB','NETNMIN','LTRFALN']
745-
ts_flux(POD,PODlist,VARlist,scenariolist,colorlist,widthlist,'nitrogen','Yearly Nitrogen Flux Time Series', 'eq')
746+
VARlist=['NUPTAKEST','NUPTAKELAB','NRESORB','NIMMOB','NETNMIN','LFVN']
747+
ts_flux(POD,PODlist,VARlist,scenariolist,colorlist,widthlist,'nitrogen','Yearly Nitrogen Flux Time Series', stage)
746748

747749
VARlist=['BURNSOIL2AIRC','BURNVEG2AIRC','BURNVEG2DEADC','RHDWD', 'BURNAIR2SOILN','BURNSOIL2AIRN','BURNVEG2AIRN','BURNVEG2DEADN']
748-
ts_flux(POD,PODlist,VARlist,scenariolist,colorlist,widthlist, 'fire', 'Yearly Wildfire Flux Time Series', 'eq')
750+
ts_flux(POD,PODlist,VARlist,scenariolist,colorlist,widthlist, 'fire', 'Yearly Wildfire Flux Time Series', stage)
749751

750752
print("Generating ts stock plots...")
751753
VARlist=['SHLWC','DEEPC','MINEC','SOMRAWC','SOMA','SOMPR','SOMCR','VEGC']
752-
ts_stock(POD,PODlist,VARlist,scenariolist,colorlist,widthlist, 'carbon','Yearly Carbon Stock Time Series', 'eq')
754+
ts_stock(POD,PODlist,VARlist,scenariolist,colorlist,widthlist, 'carbon','Yearly Carbon Stock Time Series', stage)
753755

754-
VARlist=['AVLN','ORGN','VEGN','NETNMIN','LTRFALN']
755-
ts_stock(POD,PODlist,VARlist,scenariolist,colorlist,widthlist,'nitrogen','Yearly Nitrogen Stock Time Series','eq')
756+
VARlist=['AVLN','ORGN','VEGNSTR','NETNMIN','LFVN']
757+
ts_stock(POD,PODlist,VARlist,scenariolist,colorlist,widthlist,'nitrogen','Yearly Nitrogen Stock Time Series',stage)
756758

757759
VARlist=['DEADC','DWDC','DEADN','DWDN']
758-
ts_stock(POD,PODlist,VARlist,scenariolist,colorlist,widthlist,'wildfire','Yearly Burned C, N Stock in Time series', 'eq')
760+
ts_stock(POD,PODlist,VARlist,scenariolist,colorlist,widthlist,'wildfire','Yearly Burned C, N Stock in Time series', stage)
759761

760762
print("Generating seasonality plots...")
761763
VARlist=['GPP','RHSOM','LAI']
762-
seasonality(POD,PODlist,VARlist,scenariolist,colorlist,'Seas_Bio','eq')
764+
seasonality(POD,PODlist,VARlist,scenariolist,colorlist,'Seas_Bio',stage)
763765

764-
VARlist=['SNOWTHICK','EET','PET','TRANSPIRATION','WATERTAB']
765-
seasonality(POD,PODlist,VARlist,scenariolist,colorlist,'Seas_Env', 'eq')
766+
#Commented out when EET by PFT was disabled. This will need to
767+
# be modified to work with ecosystem EET or wait until EET by
768+
# PFT is fixed.
769+
#VARlist=['SNOWTHICK','EET','PET','TRANSPIRATION','WATERTAB']
770+
#seasonality(POD,PODlist,VARlist,scenariolist,colorlist,'Seas_Env', stage)
766771

767772
print("Generating soil CN plots...")
768-
soilcnprofile(POD,PODlist,scenariolist,'eq')
773+
soilcnprofile(POD,PODlist,scenariolist,stage)
769774

770775
print("Generating soil env plots...")
771776
VARlist=['TLAYER','VWCLAYER']
772-
soilenvprofile(POD,PODlist,VARlist,scenariolist,'Profile','eq')
777+
soilenvprofile(POD,PODlist,VARlist,scenariolist,'Profile',stage)
773778

774779
print("Generating vegetation dynamic plots...")
775-
VARlist=['VEGC','VEGN']
776-
vegdynamic(POD,PODlist,VARlist,scenariolist,'Veg_Dyn','eq')
780+
VARlist=['VEGC','VEGNSTR']
781+
vegdynamic(POD,PODlist,VARlist,scenariolist,'Veg_Dyn',stage)
777782

778783

779784

scripts/tests/m2y_analysis_hg.py

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
#!/usr/bin/env python
2+
3+
#### Run command
4+
### 1. Prepare the output_spec.csv files for four scenarios (yearly/ecosystem, monthly/ecosystem, monthly/pft/layer, monthly/pft/part)
5+
### 2. cd /data/workflows/TILE_testing/
6+
### 3. cp ./run-mask.nc ./run-mask_original.nc
7+
### 4. ncap2 -O -h -s'run(:,:) = 0' ./run-mask.nc ./run-mask.nc
8+
### 5. ncap2 -O -h -s'run(0,0) = 1' ./run-mask.nc ./run-mask.nc
9+
### 6. cp output_spec_scenario.csv output_spec.csv
10+
### 7. /work/dvmdostem -l err -f ./config/config.js -p 100 -e 200 -s 10 -t 3
11+
### 8. mv -r ./output ./output_scenario
12+
### 9. mkdir ./output
13+
14+
#### Analysis of the results
15+
16+
import os
17+
import xarray as xr
18+
import pandas as pd
19+
20+
tolerance = 0.000001
21+
outdir = 'temp_outputs/reco_output_debugging/3_outputs_for_analysis/'
22+
sc_list = ('y', 'm', 'm_pft_layer', 'm_pft_part')
23+
24+
25+
26+
27+
28+
29+
### Month to year test
30+
31+
32+
varlist = ('AVLN','DEEPC','EET','GPP','HKDEEP','LAI','LFVC','LFVN','MINEC','NETNMIN','NIMMOB','NPP','NRESORB','NUPTAKELAB','NUPTAKEST','ORGN','PET','QDRAINAGE','QINFILTRATION','QRUNOFF','RAINFALL','RG','RHSOM','RM','SHLWC','SNOWFALL','SNOWTHICK','SOMA','SOMCR','SOMPR','SOMRAWC','SWE','TCDEEP','TDEEP','TRANSPIRATION','TSHLW','VEGC','VEGNSTR','VWCDEEP','WATERTAB')
33+
statlist = ('stock','stock','flux','flux','mean','mean','flux','flux','stock','flux','flux','flux','flux','flux','flux','stock','flux','flux','flux','flux','flux','flux','flux','flux','stock','flux','stock','stock','stock','stock','stock','mean','mean','mean','flux','mean','stock','stock','mean','mean')
34+
35+
sc = 'y'
36+
yearly = pd.DataFrame(columns = ['year'])
37+
for i, var in enumerate(varlist):
38+
print(var)
39+
dd = xr.open_dataset(os.path.join(outdir,'output_'+str(sc), var + '_yearly_tr.nc')).isel(x=0, y=0)
40+
dd['time'] = dd.indexes['time'].to_datetimeindex()
41+
dd = dd.to_dataframe()
42+
dd.reset_index(inplace=True)
43+
dd['year'] = dd['time'].dt.year
44+
dd = dd.drop(columns=['time'])
45+
dd = dd.drop(columns=['albers_conical_equal_area'])
46+
yearly = pd.merge(yearly, dd, on=['year'], how='outer')
47+
48+
49+
sc = 'm'
50+
monthly = pd.DataFrame(columns = ['year','month'])
51+
m2y = pd.DataFrame(columns = ['year'])
52+
for i, var in enumerate(varlist):
53+
dd = xr.open_dataset(os.path.join(outdir,'output_'+str(sc), var + '_monthly_tr.nc')).isel(x=0, y=0)
54+
dd['time'] = dd.indexes['time'].to_datetimeindex()
55+
dd = dd.to_dataframe()
56+
dd.reset_index(inplace=True)
57+
dd['year'] = dd['time'].dt.year
58+
dd['month'] = dd['time'].dt.month
59+
dd = dd.drop(columns=['time'])
60+
dd = dd.drop(columns=['albers_conical_equal_area'])
61+
monthly = pd.merge(monthly, dd, on=['year','month'], how='outer')
62+
if statlist[i] == 'flux':
63+
dy = pd.DataFrame(dd.groupby('year')[var].sum())
64+
if statlist[i] == 'mean':
65+
dy = pd.DataFrame(dd.groupby('year')[var].mean())
66+
if statlist[i] == 'stock':
67+
dy = dd[dd['month'] == 12]
68+
dy = dy.drop(columns=['month'])
69+
dy.reset_index(inplace=True)
70+
if 'index' in dy.columns:
71+
dy = dy.drop(columns=['index'])
72+
# dy = dy.rename(columns={var: var + '_m2y'})
73+
m2y = pd.merge(m2y, dy, on=['year'], how='outer')
74+
75+
76+
test = pd.DataFrame((m2y-yearly).mean())
77+
test.reset_index(inplace=True)
78+
test = test.rename(columns={'index': 'varname', 0:'diffmean'})
79+
80+
test[abs(test['diffmean']) > tolerance]
81+
82+
print("Monthly to yearly")
83+
print(varlist)
84+
print(test)
85+
86+
87+
### pft to ecosystem test
88+
89+
varlist = ('EET','GPP','LAI','LFVC','LFVN','NPP','NRESORB','NUPTAKELAB','NUPTAKEST','PET','RG','RM','VEGC','VEGNSTR')
90+
91+
sc = 'm_pft_layer'
92+
pft = pd.DataFrame(columns = ['year','month','pft'])
93+
for i, var in enumerate(varlist):
94+
dd = xr.open_dataset(os.path.join(outdir,'output_'+str(sc), var + '_monthly_tr.nc')).isel(x=0, y=0)
95+
dd['time'] = dd.indexes['time'].to_datetimeindex()
96+
dd = dd.to_dataframe()
97+
dd.reset_index(inplace=True)
98+
dd['year'] = dd['time'].dt.year
99+
dd['month'] = dd['time'].dt.month
100+
dd = dd.drop(columns=['time'])
101+
dd = dd.drop(columns=['albers_conical_equal_area'])
102+
pft = pd.merge(pft, dd, on=['year','month','pft'], how='outer')
103+
104+
pft2eco = pft.groupby(['year','month']).sum()
105+
pft2eco.reset_index(inplace=True)
106+
pft2eco = pft2eco.drop(columns=['pft'])
107+
108+
test = pd.DataFrame((pft2eco-monthly).mean())
109+
test.reset_index(inplace=True)
110+
test = test.rename(columns={'index': 'varname', 0:'diffmean'})
111+
112+
test[abs(test['diffmean']) > tolerance]
113+
114+
#breakpoint()
115+
116+
print("PFT to Ecosystem")
117+
print(varlist)
118+
print(test)
119+
120+
121+
122+
123+
### part to pft test
124+
125+
varlist = ('GPP','LFVC','LFVN','NPP','NRESORB','NUPTAKEST','RG','RM','VEGC','VEGNSTR')
126+
127+
sc = 'm_pft_part'
128+
part = pd.DataFrame(columns = ['year','month','pft','pftpart'])
129+
for i, var in enumerate(varlist):
130+
dd = xr.open_dataset(os.path.join(outdir,'output_'+str(sc), var + '_monthly_tr.nc')).isel(x=0, y=0)
131+
dd['time'] = dd.indexes['time'].to_datetimeindex()
132+
dd = dd.to_dataframe()
133+
dd.reset_index(inplace=True)
134+
dd['year'] = dd['time'].dt.year
135+
dd['month'] = dd['time'].dt.month
136+
dd = dd.drop(columns=['time'])
137+
dd = dd.drop(columns=['albers_conical_equal_area'])
138+
part = pd.merge(part, dd, on=['year','month','pft','pftpart'], how='outer')
139+
140+
part2pft = part.groupby(['year','month','pft']).sum()
141+
part2pft.reset_index(inplace=True)
142+
part2pft = part2pft.drop(columns=['pftpart'])
143+
144+
test = pd.DataFrame((part2pft-pft).mean())
145+
test.reset_index(inplace=True)
146+
test = test.rename(columns={'index': 'varname', 0:'diffmean'})
147+
148+
test[abs(test['diffmean']) > tolerance]
149+
150+
#breakpoint()
151+
print("Compartment to PFT")
152+
print(varlist)
153+
print(test)
154+
155+
156+
157+
### layer to column test
158+
159+
varlist = ('AVLN','NETNMIN','NIMMOB','ORGN','RHSOM','SOMA','SOMCR','SOMPR','SOMRAWC')
160+
161+
sc = 'm_pft_layer'
162+
layer = pd.DataFrame(columns = ['year','month','layer'])
163+
for i, var in enumerate(varlist):
164+
dd = xr.open_dataset(os.path.join(outdir,'output_'+str(sc), var + '_monthly_tr.nc')).isel(x=0, y=0)
165+
dd['time'] = dd.indexes['time'].to_datetimeindex()
166+
dd = dd.to_dataframe()
167+
dd.reset_index(inplace=True)
168+
dd['year'] = dd['time'].dt.year
169+
dd['month'] = dd['time'].dt.month
170+
dd = dd.drop(columns=['time'])
171+
dd = dd.drop(columns=['albers_conical_equal_area'])
172+
layer = pd.merge(layer, dd, on=['year','month','layer'], how='outer')
173+
174+
layer2column = layer.groupby(['year','month']).sum()
175+
layer2column.reset_index(inplace=True)
176+
layer2column = layer2column.drop(columns=['layer'])
177+
178+
test = pd.DataFrame((layer2column-monthly).mean())
179+
test.reset_index(inplace=True)
180+
test = test.rename(columns={'index': 'varname', 0:'diffmean'})
181+
182+
test[abs(test['diffmean']) > tolerance]
183+
184+
#breakpoint()
185+
print("Layer to Ecosystem")
186+
print(varlist)
187+
print(test)

0 commit comments

Comments
 (0)