Skip to content

Commit 8b35df7

Browse files
committed
Add area integrated, annual mean fluxes to DIB and DISMF
Instead of normalizing the fluxes, simply add the totals as a new field to each file so they can be normalized later in code.
1 parent dd19986 commit 8b35df7

File tree

4 files changed

+69
-89
lines changed

4 files changed

+69
-89
lines changed

compass/ocean/tests/global_ocean/files_for_e3sm/__init__.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import os
22

33
from compass.io import package_path, symlink
4+
from compass.ocean.tests.global_ocean.files_for_e3sm.add_total_iceberg_ice_shelf_melt import ( # noqa: E501
5+
AddTotalIcebergIceShelfMelt,
6+
)
47
from compass.ocean.tests.global_ocean.files_for_e3sm.diagnostic_maps import (
58
DiagnosticMaps,
69
)
@@ -10,9 +13,6 @@
1013
from compass.ocean.tests.global_ocean.files_for_e3sm.e3sm_to_cmip_maps import (
1114
E3smToCmipMaps,
1215
)
13-
from compass.ocean.tests.global_ocean.files_for_e3sm.normalize_iceberg_ice_shelf_melt import ( # noqa: E501
14-
NormalizeIcebergIceShelfMelt,
15-
)
1616
from compass.ocean.tests.global_ocean.files_for_e3sm.ocean_graph_partition import ( # noqa: E501
1717
OceanGraphPartition,
1818
)
@@ -115,18 +115,10 @@ def __init__(self, test_group, mesh=None, init=None,
115115
self.add_step(E3smToCmipMaps(test_case=self))
116116
self.add_step(DiagnosticMaps(test_case=self))
117117
self.add_step(DiagnosticMasks(test_case=self))
118-
119-
self.add_step(RemapIcebergClimatology(
120-
test_case=self))
121-
118+
self.add_step(RemapIcebergClimatology(test_case=self))
122119
self.add_step(RemapIceShelfMelt(test_case=self, init=init))
123-
124-
self.add_step(NormalizeIcebergIceShelfMelt(
125-
test_case=self))
126-
127-
self.add_step(RemapSeaSurfaceSalinityRestoring(
128-
test_case=self))
129-
120+
self.add_step(AddTotalIcebergIceShelfMelt(test_case=self))
121+
self.add_step(RemapSeaSurfaceSalinityRestoring(test_case=self))
130122
self.add_step(RemapTidalMixing(test_case=self))
131123

132124
if mesh is not None and init is not None:

compass/ocean/tests/global_ocean/files_for_e3sm/normalize_iceberg_ice_shelf_melt.py renamed to compass/ocean/tests/global_ocean/files_for_e3sm/add_total_iceberg_ice_shelf_melt.py

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
)
1111

1212

13-
class NormalizeIcebergIceShelfMelt(FilesForE3SMStep):
13+
class AddTotalIcebergIceShelfMelt(FilesForE3SMStep):
1414
"""
15-
A step for for normalizing data iceberg and ice-shelf melt rates on the
16-
MPAS grid to a total flux of 1.0 and staging them in ``assembled_files``
15+
A step for for adding the total data iceberg and ice-shelf melt rates to
16+
to the data iceberg and ice-shelf melt files and staging them in
17+
``assembled_files``
1718
"""
1819
def __init__(self, test_case):
1920
"""
@@ -24,7 +25,7 @@ def __init__(self, test_case):
2425
test_case : compass.TestCase
2526
The test case this step belongs to
2627
"""
27-
super().__init__(test_case, name='normalize_iceberg_ice_shelf_melt',
28+
super().__init__(test_case, name='add_total_iceberg_ice_shelf_melt',
2829
ntasks=1, min_tasks=1)
2930

3031
filename = 'Iceberg_Climatology_Merino_MPAS.nc'
@@ -41,12 +42,14 @@ def __init__(self, test_case):
4142

4243
def setup(self):
4344
"""
44-
setup input files based on config options
45+
setup output files based on config options
4546
"""
4647
super().setup()
4748
if self.with_ice_shelf_cavities:
48-
self.add_output_file(filename='dib_merino_2020_normalized.nc')
49-
self.add_output_file(filename='dismf_paolo2023_normalized.nc')
49+
self.add_output_file(
50+
filename='Iceberg_Climatology_Merino_MPAS_with_totals.nc')
51+
self.add_output_file(
52+
filename='prescribed_ismf_paolo2023_with_totals.nc')
5053

5154
def run(self):
5255
"""
@@ -59,11 +62,8 @@ def run(self):
5962

6063
logger = self.logger
6164

62-
suffix = f'{self.mesh_short_name}.{self.creation_date}'
63-
6465
ds_dib = xr.open_dataset('Iceberg_Climatology_Merino_MPAS.nc')
6566
ds_dismf = xr.open_dataset('prescribed_ismf_paolo2023.nc')
66-
6767
ds_mesh = xr.open_dataset('restart.nc')
6868

6969
area_cell = ds_mesh.areaCell
@@ -87,39 +87,48 @@ def run(self):
8787
logger.info(f'total_flux: {total_flux:.1f}')
8888
logger.info('')
8989

90-
for var in ['bergFreshwaterFluxData']:
91-
ds_dib[var] = ds_dib[var] / total_flux
90+
for ds in [ds_dib, ds_dismf]:
91+
ntime = ds.sizes['Time']
92+
field = 'areaIntegAnnMeanDataIcebergFreshwaterFlux'
93+
ds[field] = (('Time',), np.ones(ntime) * total_dib_flux.values)
94+
ds[field].attrs['units'] = 'kg s-1'
95+
field = 'areaIntegAnnMeanDataIceShelfFreshwaterFlux'
96+
ds[field] = (('Time',), np.ones(ntime) * total_dismf_flux.values)
97+
ds[field].attrs['units'] = 'kg s-1'
98+
field = 'areaIntegAnnMeanDataIcebergIceShelfFreshwaterFlux'
99+
ds[field] = (('Time',), np.ones(ntime) * total_flux.values)
100+
ds[field].attrs['units'] = 'kg s-1'
92101

93-
write_netcdf(ds_dib, 'dib_merino_2020_normalized.nc')
102+
dib_filename = 'Iceberg_Climatology_Merino_MPAS_with_totals.nc'
103+
write_netcdf(ds_dib, dib_filename)
94104

95-
for var in ['dataLandIceFreshwaterFlux', 'dataLandIceHeatFlux']:
96-
ds_dismf[var] = ds_dismf[var] / total_flux
97-
98-
write_netcdf(ds_dismf, 'dismf_paolo2023_normalized.nc')
105+
dismf_filename = 'prescribed_ismf_paolo2023_with_totals.nc'
106+
write_netcdf(ds_dismf, dismf_filename)
99107

100108
norm_total_dib_flux = (ds_dib.bergFreshwaterFluxData * weights *
101-
area_cell).sum()
109+
area_cell / total_flux).sum()
102110

103111
norm_total_dismf_flux = (ds_dismf.dataLandIceFreshwaterFlux *
104-
area_cell).sum()
112+
area_cell / total_flux).sum()
105113

106114
norm_total_flux = norm_total_dib_flux + norm_total_dismf_flux
107115

108-
logger.info(f'norm_total_dib_flux: {norm_total_dib_flux:.3f}')
109-
logger.info(f'norm_total_dismf_flux: {norm_total_dismf_flux:.3f}')
110-
logger.info(f'norm_total_flux: {norm_total_flux:.3f}')
116+
logger.info(f'norm_total_dib_flux: {norm_total_dib_flux:.16f}')
117+
logger.info(f'norm_total_dismf_flux: {norm_total_dismf_flux:.16f}')
118+
logger.info(f'norm_total_flux: {norm_total_flux:.16f}')
119+
logger.info(f'1 - norm_total_flux: {1 - norm_total_flux:.16g}')
111120
logger.info('')
112121

113-
prefix = 'Iceberg_Climatology_Merino_normalized'
122+
prefix = 'Iceberg_Climatology_Merino'
123+
suffix = f'{self.mesh_short_name}.{self.creation_date}'
114124
dest_filename = f'{prefix}.{suffix}.nc'
115-
116125
symlink(
117-
os.path.abspath('dib_merino_2020_normalized.nc'),
118-
f'{self.ocean_inputdata_dir}/{dest_filename}')
126+
os.path.abspath(dib_filename),
127+
f'{self.seaice_inputdata_dir}/{dest_filename}')
119128

120-
prefix = 'prescribed_ismf_paolo2023_normalized'
129+
prefix = 'prescribed_ismf_paolo2023'
130+
suffix = f'{self.mesh_short_name}.{self.creation_date}'
121131
dest_filename = f'{prefix}.{suffix}.nc'
122-
123132
symlink(
124-
os.path.abspath('dismf_paolo2023_normalized.nc'),
133+
os.path.abspath(dismf_filename),
125134
f'{self.ocean_inputdata_dir}/{dest_filename}')

compass/ocean/tests/global_ocean/files_for_e3sm/remap_ice_shelf_melt.py

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import os
2-
3-
from compass.io import symlink
41
from compass.ocean.tests.global_ocean.files_for_e3sm.files_for_e3sm_step import ( # noqa: E501
52
FilesForE3SMStep,
63
)
@@ -37,13 +34,9 @@ def __init__(self, test_case, init):
3734

3835
def setup(self):
3936
"""
40-
setup input files based on config options
37+
setup input and output files based on config options
4138
"""
4239
super().setup()
43-
if self.init is not None:
44-
# we don't need any files, since we already did this remapping
45-
# during init
46-
return
4740

4841
filename = 'prescribed_ismf_paolo2023.nc'
4942

@@ -72,34 +65,24 @@ def run(self):
7265
"""
7366
super().run()
7467

75-
if not self.with_ice_shelf_cavities:
68+
if not self.with_ice_shelf_cavities or self.init is not None:
7669
return
7770

78-
prefix = 'prescribed_ismf_paolo2023'
79-
suffix = f'{self.mesh_short_name}.{self.creation_date}'
80-
81-
remapped_filename = f'{prefix}.nc'
82-
dest_filename = f'{prefix}.{suffix}.nc'
83-
84-
if self.init is None:
85-
logger = self.logger
86-
config = self.config
87-
ntasks = self.ntasks
88-
in_filename = 'Paolo_2023_ANT_G1920V01_IceShelfMelt.nc'
89-
90-
parallel_executable = config.get('parallel', 'parallel_executable')
71+
logger = self.logger
72+
config = self.config
73+
ntasks = self.ntasks
74+
in_filename = 'Paolo_2023_ANT_G1920V01_IceShelfMelt.nc'
75+
remapped_filename = 'prescribed_ismf_paolo2023.nc'
9176

92-
base_mesh_filename = 'base_mesh.nc'
93-
culled_mesh_filename = 'initial_state.nc'
94-
mesh_name = self.mesh_short_name
95-
land_ice_mask_filename = 'initial_state.nc'
77+
parallel_executable = config.get('parallel', 'parallel_executable')
9678

97-
remap_paolo(in_filename, base_mesh_filename,
98-
culled_mesh_filename, mesh_name,
99-
land_ice_mask_filename, remapped_filename,
100-
logger=logger, mpi_tasks=ntasks,
101-
parallel_executable=parallel_executable)
79+
base_mesh_filename = 'base_mesh.nc'
80+
culled_mesh_filename = 'initial_state.nc'
81+
mesh_name = self.mesh_short_name
82+
land_ice_mask_filename = 'initial_state.nc'
10283

103-
symlink(
104-
os.path.abspath(remapped_filename),
105-
f'{self.ocean_inputdata_dir}/{dest_filename}')
84+
remap_paolo(in_filename, base_mesh_filename,
85+
culled_mesh_filename, mesh_name,
86+
land_ice_mask_filename, remapped_filename,
87+
logger=logger, mpi_tasks=ntasks,
88+
parallel_executable=parallel_executable)

compass/ocean/tests/global_ocean/files_for_e3sm/remap_iceberg_climatology.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from mpas_tools.io import write_netcdf
66
from pyremap import LatLonGridDescriptor, MpasCellMeshDescriptor, Remapper
77

8-
from compass.io import symlink
98
from compass.ocean.tests.global_ocean.files_for_e3sm.files_for_e3sm_step import ( # noqa: E501
109
FilesForE3SMStep,
1110
)
@@ -34,7 +33,13 @@ def __init__(self, test_case):
3433
target='Iceberg_Interannual_Merino.nc',
3534
database='initial_condition_database')
3635

37-
self.add_output_file(filename='Iceberg_Climatology_Merino_MPAS.nc')
36+
def setup(self):
37+
"""
38+
setup output files based on config options
39+
"""
40+
super().setup()
41+
if self.with_ice_shelf_cavities:
42+
self.add_output_file(filename='Iceberg_Climatology_Merino_MPAS.nc')
3843

3944
def run(self):
4045
"""
@@ -48,12 +53,7 @@ def run(self):
4853
ntasks = self.ntasks
4954

5055
in_filename = 'Iceberg_Interannual_Merino.nc'
51-
52-
prefix = 'Iceberg_Climatology_Merino'
53-
suffix = f'{self.mesh_short_name}.{self.creation_date}'
54-
55-
remapped_filename = f'{prefix}_MPAS.nc'
56-
dest_filename = f'{prefix}.{suffix}.nc'
56+
remapped_filename = 'Iceberg_Climatology_Merino_MPAS.nc'
5757

5858
parallel_executable = config.get('parallel', 'parallel_executable')
5959

@@ -69,10 +69,6 @@ def run(self):
6969
logger=logger, mpi_tasks=ntasks,
7070
parallel_executable=parallel_executable)
7171

72-
symlink(
73-
os.path.abspath(remapped_filename),
74-
f'{self.seaice_inputdata_dir}/{dest_filename}')
75-
7672

7773
def remap_iceberg_climo(in_filename, mesh_filename, mesh_name,
7874
land_ice_mask_filename, out_filename, logger,

0 commit comments

Comments
 (0)