Skip to content

Commit cab53e2

Browse files
authored
Merge pull request MPAS-Dev#836 from xylar/add-normalized-dib-dismf
Add area integrated annual mean to data iceberg and ice-shelf flux files
2 parents 0e79f61 + 8b35df7 commit cab53e2

File tree

5 files changed

+167
-54
lines changed

5 files changed

+167
-54
lines changed

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

Lines changed: 6 additions & 8 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
)
@@ -112,15 +115,10 @@ def __init__(self, test_group, mesh=None, init=None,
112115
self.add_step(E3smToCmipMaps(test_case=self))
113116
self.add_step(DiagnosticMaps(test_case=self))
114117
self.add_step(DiagnosticMasks(test_case=self))
115-
118+
self.add_step(RemapIcebergClimatology(test_case=self))
116119
self.add_step(RemapIceShelfMelt(test_case=self, init=init))
117-
118-
self.add_step(RemapSeaSurfaceSalinityRestoring(
119-
test_case=self))
120-
121-
self.add_step(RemapIcebergClimatology(
122-
test_case=self))
123-
120+
self.add_step(AddTotalIcebergIceShelfMelt(test_case=self))
121+
self.add_step(RemapSeaSurfaceSalinityRestoring(test_case=self))
124122
self.add_step(RemapTidalMixing(test_case=self))
125123

126124
if mesh is not None and init is not None:
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
import os
2+
3+
import numpy as np
4+
import xarray as xr
5+
from mpas_tools.io import write_netcdf
6+
7+
from compass.io import symlink
8+
from compass.ocean.tests.global_ocean.files_for_e3sm.files_for_e3sm_step import ( # noqa: E501
9+
FilesForE3SMStep,
10+
)
11+
12+
13+
class AddTotalIcebergIceShelfMelt(FilesForE3SMStep):
14+
"""
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``
18+
"""
19+
def __init__(self, test_case):
20+
"""
21+
Create a new step
22+
23+
Parameters
24+
----------
25+
test_case : compass.TestCase
26+
The test case this step belongs to
27+
"""
28+
super().__init__(test_case, name='add_total_iceberg_ice_shelf_melt',
29+
ntasks=1, min_tasks=1)
30+
31+
filename = 'Iceberg_Climatology_Merino_MPAS.nc'
32+
subdir = 'remap_iceberg_climatology'
33+
self.add_input_file(
34+
filename=filename,
35+
target=f'../{subdir}/{filename}')
36+
37+
filename = 'prescribed_ismf_paolo2023.nc'
38+
subdir = 'remap_ice_shelf_melt'
39+
self.add_input_file(
40+
filename=filename,
41+
target=f'../{subdir}/{filename}')
42+
43+
def setup(self):
44+
"""
45+
setup output files based on config options
46+
"""
47+
super().setup()
48+
if self.with_ice_shelf_cavities:
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')
53+
54+
def run(self):
55+
"""
56+
Run this step of the test case
57+
"""
58+
super().run()
59+
60+
if not self.with_ice_shelf_cavities:
61+
return
62+
63+
logger = self.logger
64+
65+
ds_dib = xr.open_dataset('Iceberg_Climatology_Merino_MPAS.nc')
66+
ds_dismf = xr.open_dataset('prescribed_ismf_paolo2023.nc')
67+
ds_mesh = xr.open_dataset('restart.nc')
68+
69+
area_cell = ds_mesh.areaCell
70+
71+
days_in_month = np.array(
72+
[31., 28., 31., 30., 31., 30., 31., 31., 30., 31., 30., 31.])
73+
74+
weights = xr.DataArray(data=days_in_month / 365.,
75+
dims=('Time',))
76+
77+
total_dib_flux = (ds_dib.bergFreshwaterFluxData * weights *
78+
area_cell).sum()
79+
80+
total_dismf_flux = (ds_dismf.dataLandIceFreshwaterFlux *
81+
area_cell).sum()
82+
83+
total_flux = total_dib_flux + total_dismf_flux
84+
85+
logger.info(f'total_dib_flux: {total_dib_flux:.1f}')
86+
logger.info(f'total_dismf_flux: {total_dismf_flux:.1f}')
87+
logger.info(f'total_flux: {total_flux:.1f}')
88+
logger.info('')
89+
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'
101+
102+
dib_filename = 'Iceberg_Climatology_Merino_MPAS_with_totals.nc'
103+
write_netcdf(ds_dib, dib_filename)
104+
105+
dismf_filename = 'prescribed_ismf_paolo2023_with_totals.nc'
106+
write_netcdf(ds_dismf, dismf_filename)
107+
108+
norm_total_dib_flux = (ds_dib.bergFreshwaterFluxData * weights *
109+
area_cell / total_flux).sum()
110+
111+
norm_total_dismf_flux = (ds_dismf.dataLandIceFreshwaterFlux *
112+
area_cell / total_flux).sum()
113+
114+
norm_total_flux = norm_total_dib_flux + norm_total_dismf_flux
115+
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}')
120+
logger.info('')
121+
122+
prefix = 'Iceberg_Climatology_Merino'
123+
suffix = f'{self.mesh_short_name}.{self.creation_date}'
124+
dest_filename = f'{prefix}.{suffix}.nc'
125+
symlink(
126+
os.path.abspath(dib_filename),
127+
f'{self.seaice_inputdata_dir}/{dest_filename}')
128+
129+
prefix = 'prescribed_ismf_paolo2023'
130+
suffix = f'{self.mesh_short_name}.{self.creation_date}'
131+
dest_filename = f'{prefix}.{suffix}.nc'
132+
symlink(
133+
os.path.abspath(dismf_filename),
134+
f'{self.ocean_inputdata_dir}/{dest_filename}')

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

Lines changed: 17 additions & 32 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,11 +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 not self.with_ice_shelf_cavities:
44-
return
4540

4641
filename = 'prescribed_ismf_paolo2023.nc'
4742

@@ -70,34 +65,24 @@ def run(self):
7065
"""
7166
super().run()
7267

73-
if not self.with_ice_shelf_cavities:
68+
if not self.with_ice_shelf_cavities or self.init is not None:
7469
return
7570

76-
prefix = 'prescribed_ismf_paolo2023'
77-
suffix = f'{self.mesh_short_name}.{self.creation_date}'
78-
79-
remapped_filename = f'{prefix}.nc'
80-
dest_filename = f'{prefix}.{suffix}.nc'
81-
82-
if self.init is None:
83-
logger = self.logger
84-
config = self.config
85-
ntasks = self.ntasks
86-
in_filename = 'Paolo_2023_ANT_G1920V01_IceShelfMelt.nc'
87-
88-
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'
8976

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

95-
remap_paolo(in_filename, base_mesh_filename,
96-
culled_mesh_filename, mesh_name,
97-
land_ice_mask_filename, remapped_filename,
98-
logger=logger, mpi_tasks=ntasks,
99-
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'
10083

101-
symlink(
102-
os.path.abspath(remapped_filename),
103-
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,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,10 @@ def remap_paolo(in_filename, base_mesh_filename, culled_mesh_filename,
261261

262262
field = 'dataLandIceFreshwaterFlux'
263263
ds_remap[field] = area_ratio * sphere_fwf
264-
ds_remap[field].attrs['units'] = 'kg m^-2 s^-1'
264+
ds_remap[field].attrs['units'] = 'kg m-2 s-1'
265265
field = 'dataLandIceHeatFlux'
266266
ds_remap[field] = area_ratio * ds_remap[field]
267-
ds_remap[field].attrs['units'] = 'W m^-2'
267+
ds_remap[field].attrs['units'] = 'W m-2'
268268

269269
mpas_flux = (ds_remap.dataLandIceFreshwaterFlux *
270270
mpas_area_cell).sum().values

0 commit comments

Comments
 (0)