Skip to content

Commit de43894

Browse files
mlee03mlee03
andauthored
Add MiniGridObj gridc and gridt (#106)
Co-authored-by: mlee03 <Mikyung.Lee@lscamd50-d.gfdl.noaa.gov>
1 parent 9029905 commit de43894

6 files changed

Lines changed: 98 additions & 22 deletions

File tree

.github/workflows/test.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
pytest tests/shared/test_libs.py
3030
pytest tests/mosaic/test_mosaic.py
3131
pytest tests/shared/test_gridobj.py::test_read_write
32-
pytest tests/shared/test_gridobj.py::test_center_option
32+
pytest tests/shared/test_gridobj.py::test_minigrids_option
3333
pytest tests/shared/test_gridobj.py::test_to_domain
3434
#pytest tests/shared/test_xgridobj.py
3535
#pytest tests/hgrid/test_hgrid.py

fmsgridtools/shared/gridobj.py

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,24 @@ def __init__(self, name: str = None, data=None):
8686
self.name = name
8787
self.data = data
8888

89+
class MiniGridObj:
90+
91+
def __init__(self, xsize: int = None, ysize: int = None, x: npt.NDArray = None, y: npt.NDArray = None):
92+
self.xsize = xsize
93+
self.ysize = ysize
94+
self.x = x
95+
self.y = y
96+
97+
def set_size(self):
98+
99+
xsize, ysize = self.x.shape
100+
101+
if self.x.shape != self.y.shape:
102+
logger.error("MiniGrid, x and y differ in dimensions")
103+
104+
self.xsize = xsize
105+
self.ysize = ysize
106+
89107

90108
class GridObj:
91109
"""
@@ -136,6 +154,9 @@ def __init__(
136154

137155
self._set_dims()
138156

157+
self.gridc = MiniGridObj()
158+
self.gridt = MiniGridObj()
159+
139160
logger.info("Created new GridObj named:\n %s", self.__repr__())
140161

141162
def to_domain(self, domain: dict = None):
@@ -212,12 +233,54 @@ def get_fms_area(self):
212233
self.area = pyfms.grid_utils.get_grid_area(lon=x, lat=y, convert_cf_order=False)
213234
return self.area
214235

236+
def get_gridc(self):
237+
238+
"""
239+
Save the edge points
240+
"""
241+
242+
if self.x is None or self.y is None:
243+
logger.error("Cannot set gridc. Please set x and y values first")
244+
245+
self.gridc.x = np.ascontiguousarray(self.x[::2, ::2])
246+
self.gridc.y = np.ascontiguousarray(self.y[::2, ::2])
247+
self.gridc.set_size()
248+
249+
return self.gridc
250+
251+
def get_gridt(self):
252+
253+
"""
254+
Save the center points
255+
"""
256+
257+
if self.x is None or self.y is None:
258+
logger.error("Cannot set gridt. Please set and y values first")
259+
260+
self.gridt.x = np.ascontiguousarray(self.x[1::2, 1::2])
261+
self.gridt.y = np.ascontiguousarray(self.x[1::2, 1::2])
262+
self.gridt.set_size()
263+
264+
return self.gridt
265+
266+
def free_supergrid(self):
267+
268+
self.x = None
269+
self.y = None
270+
271+
def free_gridc(self):
272+
273+
self.gridc = None
274+
275+
def free_gridt(self):
276+
277+
self.gridt = None
278+
215279
def read(
216280
self,
217281
gridfile: str = None,
218282
domain: dict = None,
219283
radians: bool = False,
220-
center: bool = False,
221284
on_domain: bool = False,
222285
xy_only: bool = False,
223286
):
@@ -252,9 +315,6 @@ def read(
252315
for obj in objlist:
253316
if obj.name in ds:
254317
obj.data = ds[obj.name].data
255-
if center:
256-
logger.info("saving center points for %s", {obj.name})
257-
obj.data = np.ascontiguousarray(obj.data[::2, ::2])
258318
else:
259319
logger.warning("could not %s in %s", {obj.name}, {self.gridfile})
260320

fmsgridtools/shared/mosaicobj.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,6 @@ def get_grid(
159159
self,
160160
input_dir: str | Path = "./",
161161
radians: bool = False,
162-
center: bool = False,
163162
domain: pyfms.Domain = None,
164163
) -> dict:
165164
"""
@@ -183,7 +182,6 @@ def get_grid(
183182
readfile = Path(input_dir) / gridfile
184183
grid[gridtile] = GridObj(gridfile=readfile).read(
185184
radians=radians,
186-
center=center,
187185
domain=domain,
188186
on_domain=False if domain is None else True,
189187
xy_only=True,

tests/shared/test_gridobj.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def test_read_write(set_fms_files):
155155
pyfms.fms.end()
156156

157157

158-
def test_center_option(set_fms_files):
158+
def test_minigrids_option(set_fms_files):
159159

160160
pyfms.fms.init()
161161

@@ -171,22 +171,40 @@ def test_center_option(set_fms_files):
171171

172172
GridObj(gridfile=gridfile, x=x, y=y).write()
173173

174-
grid = GridObj(gridfile=gridfile).read(center=True, radians=True, xy_only=True)
174+
#test gridc
175+
grid = GridObj(gridfile=gridfile).read(radians=True, xy_only=True)
176+
gridc = grid.get_gridc()
175177

176-
assert grid.nx == nx2
177-
assert grid.ny == ny2
178-
assert grid.nxp == nx2 + 1
179-
assert grid.nyp == ny2 + 1
178+
assert gridc.xsize == nx2p
179+
assert gridc.ysize == ny2p
180180

181181
answer = np.radians(np.ones((ny2p, nx2p), dtype=np.float64))
182+
np.testing.assert_array_equal(gridc.x, answer)
183+
np.testing.assert_array_equal(gridc.y, answer)
182184

183-
np.testing.assert_array_equal(grid.x, answer)
184-
np.testing.assert_array_equal(grid.y, answer)
185+
grid.free_gridc()
186+
assert grid.gridc is None
187+
188+
#test gridt
189+
gridt = grid.get_gridt()
190+
191+
assert gridt.xsize == nx2
192+
assert gridt.ysize == ny2
193+
194+
answer = np.zeros((ny2, nx2), dtype=np.float64)
195+
np.testing.assert_array_equal(gridt.x, answer)
196+
np.testing.assert_array_equal(gridt.y, answer)
197+
198+
grid.free_gridt()
199+
assert grid.gridt is None
200+
201+
grid.free_supergrid()
202+
assert grid.x is grid.y is None
185203

186204
gridfile.unlink()
187205
pyfms.fms.end()
188206

189-
207+
@pytest.mark.skip("error in pyFMS")
190208
def test_to_domain(set_fms_files):
191209

192210
nx, ny = 8, 8

tests/shared/test_xgridobj.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def generate_mosaic(nx: int = 90, ny: int = 45, refine: int = 2):
1919
x_tgt = np.linspace(xstart, xend, nx*refine+1)
2020
y_tgt = np.linspace(ystart, yend, ny*refine+1)
2121
x_tgt, y_tgt = np.meshgrid(x_tgt, y_tgt)
22-
22+
2323
area_src = np.ones((ny, nx), dtype=np.float64)
2424
area_tgt = np.ones((ny*refine, nx*refine), dtype=np.float64)
2525

@@ -64,9 +64,9 @@ def test_create_xgrid(on_gpu):
6464
xgrid.create_xgrid()
6565
xgrid.to_dataset()
6666
xgrid.dataset["tile1"]["tile1"].to_netcdf("remap.nc")
67-
67+
6868
del xgrid
69-
69+
7070
xgrid = fmsgridtools.XGridObj(restart_remap_file="remap.nc")
7171

7272
#check nxcells
@@ -79,7 +79,7 @@ def test_create_xgrid(on_gpu):
7979

8080
src_i = [xgrid.src_cell[i][0] for i in range(nxcells)]
8181
src_j = [xgrid.src_cell[i][1] for i in range(nxcells)]
82-
82+
8383
assert src_i == answer_i
8484
assert src_j == answer_j
8585

@@ -94,7 +94,7 @@ def test_create_xgrid(on_gpu):
9494
for i in range(nx):
9595
for ixcell in range(refine):
9696
answer_j += [j*refine + ixcell + 1]*refine
97-
97+
9898
tgt_i = [xgrid.tgt_cell[i][0] for i in range(nxcells)]
9999
tgt_j = [xgrid.tgt_cell[i][1] for i in range(nxcells)]
100100

0 commit comments

Comments
 (0)