Skip to content

Commit de1ac5e

Browse files
authored
Merge pull request #430 from wwieder/clm-diags
add CERES obs, SOILWATER, more regions
2 parents 6e1c368 + a9fd0ee commit de1ac5e

File tree

5 files changed

+63
-25
lines changed

5 files changed

+63
-25
lines changed

config_clm_unstructured_plots.yaml

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -140,29 +140,30 @@ diag_cam_climo:
140140
cam_overwrite_climo: false
141141

142142
#Name of CAM case (or CAM run name):
143-
cam_case_name: ctsm5.4.CMIP7_ciso_ctsm5.3.075_ne30_123_HIST_popDens
143+
cam_case_name: b.e30_alpha07c_cesm.B1850C_LTso.ne30_t232_wgx3.247
144144

145145
#Case nickname
146146
#NOTE: if nickname starts with '0' - nickname must be in quotes!
147147
# ie '026a' as opposed to 026a
148148
#If missing or left blank, will default to cam_case_name
149-
case_nickname: '123_popDens'
149+
case_nickname: 'B_247'
150150

151151
#Location of CAM history (h0) files:
152-
cam_hist_loc: /glade/derecho/scratch/wwieder/archive/${diag_cam_climo.cam_case_name}/lnd/hist/
152+
cam_hist_loc: /glade/campaign/cesm/development/cross-wg/diagnostic_framework/CESM_output_for_testing/${diag_cam_climo.cam_case_name}/lnd/hist/
153+
# /glade/derecho/scratch/wwieder/archive/${diag_cam_climo.cam_case_name}/lnd/hist/
153154

154155
# If unstructured_plotting, a mesh file is required!
155156
mesh_file: /glade/campaign/cesm/cesmdata/inputdata/share/meshes/ne30pg3_ESMFmesh_cdf5_c20211018.nc
156157

157158
#model year when time series files should start:
158159
#Note: Leaving this entry blank will make time series
159160
# start at earliest available year.
160-
start_year: 1850
161-
climo_start_year: 2004
161+
start_year: 1
162+
climo_start_year: 85
162163
#model year when time series files should end:
163164
#Note: Leaving this entry blank will make time series
164165
# end at latest available year.
165-
end_year: 2023
166+
end_year: 104
166167

167168
#Do time series files exist?
168169
#If True, then diagnostics assumes that model files are already time series.
@@ -202,17 +203,18 @@ diag_cam_baseline_climo:
202203
cam_overwrite_climo: false
203204

204205
#Name of CAM baseline case:
205-
cam_case_name: ctsm5.4_5.3.068_PPEcal115_116_HIST
206+
cam_case_name: b.e30_alpha07c_cesm.B1850C_LTso.ne30_t232_wgx3.234
206207

207208
#Baseline case nickname
208209
#NOTE: if nickname starts with '0' - nickname must be in quotes!
209210
# ie '026a' as opposed to 026a
210211
#If missing or left blank, will default to cam_case_name
211-
case_nickname: '116'
212+
case_nickname: 'B_234'
212213

213214
#Location of CAM baseline history (h0) files:
214215
#Example test files
215-
cam_hist_loc: /glade/derecho/scratch/wwieder/archive/${diag_cam_baseline_climo.cam_case_name}/lnd/hist/
216+
cam_hist_loc: /glade/campaign/cesm/development/cross-wg/diagnostic_framework/CESM_output_for_testing/${diag_cam_baseline_climo.cam_case_name}/lnd/hist/
217+
# /glade/derecho/scratch/wwieder/archive/${diag_cam_baseline_climo.cam_case_name}/lnd/hist/
216218

217219
# If unstructured_plotting, a mesh file is required!
218220
mesh_file: /glade/campaign/cesm/cesmdata/inputdata/share/meshes/ne30pg3_ESMFmesh_cdf5_c20211018.nc
@@ -223,13 +225,13 @@ diag_cam_baseline_climo:
223225
#model year when time series files should start:
224226
#Note: Leaving this entry blank will make time series
225227
# start at earliest available year.
226-
start_year: 1850
227-
climo_start_year: 2004
228+
start_year: 1
229+
climo_start_year: 61
228230

229231
#model year when time series files should end:
230232
#Note: Leaving this entry blank will make time series
231233
# end at latest available year.
232-
end_year: 2023
234+
end_year: 80
233235

234236
#Do time series files need to be generated?
235237
#If True, then diagnostics assumes that model files are already time series.
@@ -313,9 +315,10 @@ diag_var_list:
313315
- TOTECOSYSC
314316
- TOTSOMC_1m
315317
- ALTMAX
316-
- FAREA_BURNED
317318
- TWS
319+
- SOILWATER_10CM
318320
- GRAINC_TO_FOOD
321+
- FAREA_BURNED
319322
#- C13_GPP_pm
320323
# - C13_TOTVEGC_pm
321324
#- C14_GPP_pm
@@ -341,12 +344,14 @@ region_list:
341344
- Western US
342345
- Central US
343346
- Eastern US
347+
- CONUS
344348
- Europe
345349
- Mediterranean
346350
- Central America
347351
- Amazonia
348352
- Central Africa
349353
- Indonesia
354+
- S America
350355
- Brazil
351356
- Sahel
352357
- Southern Africa

lib/ldf_variable_defaults.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,18 @@ FLDS: # atmospheric longwave radiation
122122
label : "W m$^{-2}$"
123123
pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100]
124124
pct_diff_colormap: "PuOr_r"
125+
obs_file: "/glade/campaign/cgd/tss/people/oleson/FROM_LMWG/diag/lnd_diag4.2/obs_data/CERESed4.2-rlds_ALLMONS_climo.nc"
126+
obs_name: "CERESed4.2"
127+
obs_var_name: "rlds" #W/m2
125128

126129
FSDS: # atmospheric incident solar radiation
127130
category: "Atmosphere"
128131
pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100]
129132
pct_diff_colormap: "PuOr_r"
130133
new_unit: "W m$^{-2}$"
134+
obs_file: "/glade/campaign/cgd/tss/people/oleson/FROM_LMWG/diag/lnd_diag4.2/obs_data/CERESed4.2-rsds_ALLMONS_climo.nc"
135+
obs_name: "CERESed4.2"
136+
obs_var_name: "rsds" #W/m2
131137

132138
WIND: # atmospheric air temperature
133139
category: "Atmosphere"
@@ -296,6 +302,10 @@ TOTRUNOFF: # total liquid runoff
296302
colorbar:
297303
label : "mm d$^{-1}$"
298304

305+
SOILWATER_10CM: # soil liquid water + ice in top 10cm of soil
306+
category: "Hydrology"
307+
colormap: "Blues"
308+
299309
TWS: # Terrestrial water storage
300310
category: "Hydrology"
301311
colormap: "Blues"

lib/regions_lnd.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ Eastern US:
8383
lat_bounds: [30, 50]
8484
lon_bounds: [-90, -70]
8585
region_category: Temperate
86+
CONUS:
87+
lat_bounds: [25, 55]
88+
lon_bounds: [-125, -70]
89+
region_category: Temperate
8690
Europe:
8791
lat_bounds: [45, 60]
8892
lon_bounds: [-10, 30]
@@ -107,6 +111,10 @@ Indonesia:
107111
lat_bounds: [-10, 10]
108112
lon_bounds: [90, 150]
109113
region_category: Tropical
114+
S America:
115+
lat_bounds: [-30, 5]
116+
lon_bounds: [-85, -35]
117+
region_category: Tropical
110118
Brazil:
111119
lat_bounds: [-23.5, -10]
112120
lon_bounds: [-65, -30]

scripts/plotting/regional_climatology.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def regional_climatology(adfobj):
7878
regional_climo_var_list = ['TSA','PREC','ELAI',
7979
'FSDS','FLDS','SNOWDP','ASA',
8080
'FSH','QRUNOFF_TO_COUPLER','ET','FCTR',
81-
'GPP','TWS','FCEV','FAREA_BURNED',
81+
'GPP','TWS','SOILWATER_10CM','FAREA_BURNED',
8282
]
8383

8484
# Extract variables:
@@ -332,6 +332,10 @@ def regional_climatology(adfobj):
332332
map_ax.set_extent([-180, 179, -89, 3],crs=ccrs.PlateCarree())
333333
elif region_list[iReg]=='Polar':
334334
map_ax.set_extent([-180, 179, 45, 90],crs=ccrs.PlateCarree())
335+
elif region_list[iReg]=='CONUS':
336+
map_ax.set_extent([-140, -55, 10, 70],crs=ccrs.PlateCarree())
337+
elif region_list[iReg]=='S America':
338+
map_ax.set_extent([-100, -20, -45, 20],crs=ccrs.PlateCarree())
335339
else:
336340
if ((box_south >= 30) & (box_east<=-5) ):
337341
map_ax.set_extent([-180, 0, 30, 90],crs=ccrs.PlateCarree())
@@ -358,17 +362,18 @@ def regional_climatology(adfobj):
358362
print('Missing file for ', field)
359363
continue
360364
else:
361-
axs[plt_counter].plot(np.arange(12)+1, case_var_wgtd,
362-
label=case_nickname, linewidth=2)
363365
axs[plt_counter].plot(np.arange(12)+1, base_var_wgtd,
364366
label=base_nickname, linewidth=2)
367+
axs[plt_counter].plot(np.arange(12)+1, case_var_wgtd,
368+
label=case_nickname, linewidth=2)
365369
if plot_obs[field] == True:
366370
axs[plt_counter].plot(np.arange(12)+1, obs_var_wgtd,
367371
label=obs_name[field], color='black', linewidth=2)
372+
axs[plt_counter].legend()
373+
368374
axs[plt_counter].set_title(field)
369375
axs[plt_counter].set_ylabel(base_data[field].units)
370376
axs[plt_counter].set_xticks(np.arange(1, 13, 2))
371-
axs[plt_counter].legend()
372377

373378

374379
plt_counter = plt_counter+1
@@ -437,6 +442,12 @@ def getRegion_xarray(varDS, varName,
437442

438443
if varName not in varDS:
439444
varName = obs_var_name
445+
446+
if varDS.lon.values.min() < 0:
447+
# Convert lon to [0,360] if necessary
448+
longitude = varDS['lon']
449+
varDS = varDS.assign_coords(lon= (longitude + 180) % 360)
450+
print(f"Converted lon to [0,360] for variable {varName}")
440451

441452
# TODO is there a less brittle way to do this?
442453
if (area is not None) and (landfrac is not None):
@@ -455,7 +466,7 @@ def getRegion_xarray(varDS, varName,
455466
weight = weight * varDS['datamask']
456467
else:
457468
raise ValueError("No valid weight, area, or landmask found in {varName} dataset.")
458-
469+
459470
# check we have a data array for the variable
460471
if isinstance(varDS, xr.Dataset):
461472
varDS = varDS[varName]
@@ -478,7 +489,6 @@ def getRegion_xarray(varDS, varName,
478489
lon=(west_of_0 | east_of_0))
479490

480491
wgt_subset = weight_subset / weight_subset.sum()
481-
weight_subset = weight.sel
482492
return domain_subset,wgt_subset
483493

484494
def get_region_boundaries(regions, region_name):

scripts/plotting/regional_timeseries.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@ def regional_timeseries(adfobj):
7979
regional_ts_var_list = ['TSA','PREC','ELAI',
8080
'FSDS','FLDS','SNOWDP','ASA',
8181
'FSH','QRUNOFF_TO_COUPLER','ET','FCTR',
82-
'GPP','TWS','FCEV','FAREA_BURNED',
82+
'GPP','TWS','SOILWATER_10CM','FAREA_BURNED',
8383
]
8484

8585
# Extract variables:
86-
baseline_name = adfobj.get_baseline_info("cam_case_name", required=True)
87-
input_ts_baseline = Path(adfobj.get_baseline_info("cam_ts_loc", required=True))
86+
#baseline_name = adfobj.get_baseline_info("cam_case_name", required=True)
87+
#input_ts_baseline = Path(adfobj.get_baseline_info("cam_ts_loc", required=True))
8888
# TODO hard wired for single case name:
8989
case_name = adfobj.get_cam_info("cam_case_name", required=True)[0]
90-
input_ts_case = Path(adfobj.get_cam_info("cam_ts_loc", required=True)[0])
90+
#input_ts_case = Path(adfobj.get_cam_info("cam_ts_loc", required=True)[0])
9191

9292
# Get grid file
9393
mesh_file = adfobj.mesh_files["baseline_mesh_file"]
@@ -132,7 +132,7 @@ def regional_timeseries(adfobj):
132132
obs_var_name = {}
133133
plot_obs = {}
134134

135-
var_obs_dict = adfobj.var_obs_dict
135+
#var_obs_dict = adfobj.var_obs_dict
136136

137137
# First, load all variable data once (instead of inside nested loops)
138138
for field in regional_ts_var_list:
@@ -333,6 +333,10 @@ def regional_timeseries(adfobj):
333333
map_ax.set_extent([-180, 179, -89, 3],crs=ccrs.PlateCarree())
334334
elif region_list[iReg]=='Polar':
335335
map_ax.set_extent([-180, 179, 45, 90],crs=ccrs.PlateCarree())
336+
elif region_list[iReg]=='CONUS':
337+
map_ax.set_extent([-140, -55, 10, 70],crs=ccrs.PlateCarree())
338+
elif region_list[iReg]=='S America':
339+
map_ax.set_extent([-100, -20, -45, 20],crs=ccrs.PlateCarree())
336340
else:
337341
if ((box_south >= 30) & (box_east<=-5) ):
338342
map_ax.set_extent([-180, 0, 30, 90],crs=ccrs.PlateCarree())
@@ -370,7 +374,8 @@ def regional_timeseries(adfobj):
370374
# label=obs_name[field], color='black', linewidth=2)
371375
axs[plt_counter].set_title(field)
372376
axs[plt_counter].set_ylabel(base_data[field].units)
373-
axs[plt_counter].legend()
377+
if plt_counter == 3 or plt_counter == 7 or plt_counter ==11 or plt_counter ==15:
378+
axs[plt_counter].legend()
374379

375380
plt_counter = plt_counter+1
376381

0 commit comments

Comments
 (0)