Skip to content

Commit 7055117

Browse files
committed
dev
1 parent 7983e57 commit 7055117

5 files changed

Lines changed: 195 additions & 9 deletions

File tree

Changelog.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Version NEXTVERSION
66
* New keyword parameter to `cf.Field.regrids` and `cf.Field.regridc`:
77
``max_masked`` (https://github.com/NCAS-CMS/cf-python/issues/???)
88

9-
----
9+
----
1010

1111
Version 3.20.0
1212
--------------

cf/data/dask_regrid.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def regrid(
169169
of ``w_ji`` for all non-masked source grid cells i is
170170
strictly less than *min_weight*.
171171
172-
max_masked, `int`, optional
172+
max_masked: `int`, optional
173173
For linear regridding only. Ignored for all other
174174
regridding methods.
175175
@@ -607,16 +607,13 @@ def _regrid(
607607
continue
608608

609609
w = data[i0:i1]
610-
print(j, where(w[mask] >= min_weight)[0], w, mask, max_masked)
611610
if where(w[mask] >= min_weight)[0].size > max_masked:
612-
print(j, "> mm")
613611
# There are more masked src cells than allowed
614612
dst_mask[j] = True
615613
else:
616614
# The number of masked src cells does not exceed
617615
# the minimum masked-cells threshold
618616
non_masked_indices = where((~mask) & (w >= min_weight))[0]
619-
print(non_masked_indices)
620617
if non_masked_indices.size == 1:
621618
# There areis exactly one non-masked src cell
622619
# with weight above the minimum weights

cf/field.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13864,7 +13864,7 @@ def regrids(
1386413864

1386513865
.. versionadded:: 3.14.0
1386613866

13867-
{{max_masked, `int`, optional}}
13867+
{{max_masked: `int`, optional}}
1386813868

1386913869
.. versionadded:: NEXTVERSION
1387013870

@@ -14198,7 +14198,7 @@ def regridc(
1419814198

1419914199
.. versionadded:: 3.14.0
1420014200

14201-
{{max_masked, `int`, optional}}
14201+
{{max_masked: `int`, optional}}
1420214202

1420314203
.. versionadded:: NEXTVERSION
1420414204

@@ -14347,7 +14347,7 @@ def regridc(
1434714347
return_operator=return_operator,
1434814348
check_coordinates=check_coordinates,
1434914349
min_weight=min_weight,
14350-
max_masked=0,
14350+
max_masked=max_masked,
1435114351
weights_file=weights_file,
1435214352
src_z=src_z,
1435314353
dst_z=dst_z,

cf/regrid/regrid.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ def regrid(
295295
of ``w_ji`` for all non-masked source grid cells i is
296296
strictly less than *min_weight*.
297297
298-
max_masked, `int`, optional
298+
max_masked: `int`, optional
299299
For linear regridding only. Ignored for all other
300300
regridding methods.
301301

cf/test/test_regrid.py

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,195 @@ def test_return_esmpy_regrid_operator(self):
837837
self.assertIsInstance(opers, esmpy.api.regrid.Regrid)
838838
self.assertIsInstance(operc, esmpy.api.regrid.Regrid)
839839

840+
@unittest.skipUnless(esmpy_imported, "Requires esmpy/ESMF package.")
841+
def test_regrids_max_masked(self):
842+
"""Test max_masked keyword to regrids."""
843+
self.assertFalse(cf.regrid_logging())
844+
845+
# Source grid
846+
s = cf.example_field(0)
847+
848+
# Destination grid
849+
d = s[1:, :]
850+
x = d.dimension_coordinate("X")
851+
y = d.dimension_coordinate("Y")
852+
x.del_bounds()
853+
y.del_bounds()
854+
x[...] = [0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0]
855+
y[...] = [-60.0, -22.5, 22.5, 60.0]
856+
857+
# No missing values
858+
x = s.regrids(d, method="linear")
859+
self.assertEqual(x.data.count().array, 32)
860+
861+
# Create some masked source cells
862+
for i in range(5):
863+
s[i, i:] = cf.masked
864+
865+
self.assertTrue(
866+
np.array_equal(
867+
s.data.mask,
868+
[
869+
[True, True, True, True, True, True, True, True],
870+
[False, True, True, True, True, True, True, True],
871+
[False, False, True, True, True, True, True, True],
872+
[False, False, False, True, True, True, True, True],
873+
[False, False, False, False, True, True, True, True],
874+
],
875+
)
876+
)
877+
878+
x = s.regrids(d, method="linear", use_dst_mask=False, max_masked=0)
879+
self.assertTrue(
880+
np.array_equal(
881+
x.data.mask,
882+
[
883+
[True, True, True, True, True, True, True, True],
884+
[True, True, True, True, True, True, True, True],
885+
[True, False, True, True, True, True, True, True],
886+
[True, False, False, True, True, True, True, True],
887+
],
888+
)
889+
)
890+
891+
x = s.regrids(d, method="linear", use_dst_mask=False, max_masked=1)
892+
self.assertTrue(
893+
np.array_equal(
894+
x.data.mask,
895+
[
896+
[True, True, True, True, True, True, True, True],
897+
[True, False, True, True, True, True, True, True],
898+
[True, False, False, True, True, True, True, True],
899+
[True, False, False, False, True, True, True, True],
900+
],
901+
)
902+
)
903+
904+
x = s.regrids(d, method="linear", use_dst_mask=False, max_masked=2)
905+
self.assertTrue(
906+
np.array_equal(
907+
x.data.mask,
908+
[
909+
[True, True, True, True, True, True, True, True],
910+
[False, False, True, True, True, True, True, True],
911+
[False, False, False, True, True, True, True, True],
912+
[False, False, False, False, True, True, True, True],
913+
],
914+
)
915+
)
916+
917+
x = s.regrids(d, method="linear", use_dst_mask=False, max_masked=3)
918+
self.assertTrue(
919+
np.array_equal(
920+
x.data.mask,
921+
[
922+
[False, False, True, True, True, True, True, True],
923+
[False, False, False, True, True, True, True, True],
924+
[False, False, False, False, True, True, True, True],
925+
[False, False, False, False, False, True, True, True],
926+
],
927+
)
928+
)
929+
930+
def test_regridc_max_masked(self):
931+
"""Test max_masked keyword to regridc."""
932+
self.assertFalse(cf.regrid_logging())
933+
934+
# Source grid
935+
s = cf.example_field(0)
936+
937+
# Destination grid
938+
d = s[1:, :]
939+
x = d.dimension_coordinate("X")
940+
y = d.dimension_coordinate("Y")
941+
x.del_bounds()
942+
y.del_bounds()
943+
x[...] = [0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0]
944+
y[...] = [-60.0, -22.5, 22.5, 60.0]
945+
946+
# No missing values
947+
x = s.regrids(d, method="linear")
948+
self.assertEqual(x.data.count().array, 32)
949+
950+
# Create some masked source cells
951+
for i in range(5):
952+
s[i, i:] = cf.masked
953+
954+
self.assertTrue(
955+
np.array_equal(
956+
s.data.mask,
957+
[
958+
[True, True, True, True, True, True, True, True],
959+
[False, True, True, True, True, True, True, True],
960+
[False, False, True, True, True, True, True, True],
961+
[False, False, False, True, True, True, True, True],
962+
[False, False, False, False, True, True, True, True],
963+
],
964+
)
965+
)
966+
967+
axes = ["Y", "X"]
968+
969+
x = s.regridc(
970+
d, axes=axes, method="linear", use_dst_mask=False, max_masked=0
971+
)
972+
self.assertTrue(
973+
np.array_equal(
974+
x.data.mask,
975+
[
976+
[True, True, True, True, True, True, True, True],
977+
[True, True, True, True, True, True, True, True],
978+
[True, False, True, True, True, True, True, True],
979+
[True, False, False, True, True, True, True, True],
980+
],
981+
)
982+
)
983+
984+
x = s.regridc(
985+
d, axes=axes, method="linear", use_dst_mask=False, max_masked=1
986+
)
987+
self.assertTrue(
988+
np.array_equal(
989+
x.data.mask,
990+
[
991+
[True, True, True, True, True, True, True, True],
992+
[True, False, True, True, True, True, True, True],
993+
[True, False, False, True, True, True, True, True],
994+
[True, False, False, False, True, True, True, True],
995+
],
996+
)
997+
)
998+
999+
x = s.regridc(
1000+
d, axes=axes, method="linear", use_dst_mask=False, max_masked=2
1001+
)
1002+
self.assertTrue(
1003+
np.array_equal(
1004+
x.data.mask,
1005+
[
1006+
[True, True, True, True, True, True, True, True],
1007+
[True, False, True, True, True, True, True, True],
1008+
[True, False, False, True, True, True, True, True],
1009+
[True, False, False, False, True, True, True, True],
1010+
],
1011+
)
1012+
)
1013+
1014+
x = s.regridc(
1015+
d, axes=axes, method="linear", use_dst_mask=False, max_masked=3
1016+
)
1017+
self.assertTrue(
1018+
np.array_equal(
1019+
x.data.mask,
1020+
[
1021+
[True, False, True, True, True, True, True, True],
1022+
[True, False, False, True, True, True, True, True],
1023+
[True, False, False, False, True, True, True, True],
1024+
[True, False, False, False, False, True, True, True],
1025+
],
1026+
)
1027+
)
1028+
8401029

8411030
if __name__ == "__main__":
8421031
print("Run date:", datetime.datetime.now())

0 commit comments

Comments
 (0)