Skip to content

Commit bd39274

Browse files
authored
Merge pull request #2885 from devitocodes/io-zero
api: add support for no interp (interp_order=0)
2 parents 5be06e1 + 93546d8 commit bd39274

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

devito/types/basic.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,11 @@ def _evaluate(self, **kwargs):
10741074
io = self.interp_order
10751075
retval = self.subs({i.subs(subs): self.indices_ref[d]
10761076
for d, i in mapper.items()})
1077+
1078+
if io == 0:
1079+
# No interpolation, just substitution (e.g nearest grid point)
1080+
return retval
1081+
10771082
if self.is_harmonic:
10781083
retval = retval._inv(retval, safe=self.is_harmonic_safe)
10791084

devito/types/dense.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,8 +1095,6 @@ def __init_finalize__(self, *args, **kwargs):
10951095
interp_order = kwargs.get('interp_order', 2)
10961096
if not is_integer(interp_order):
10971097
raise TypeError("`interp_order` must be an integer")
1098-
elif interp_order < 1:
1099-
raise ValueError("`interp_order` must be >= 2")
11001098
elif interp_order > self._space_order and self._space_order > 1:
11011099
raise ValueError("`interp_order` must be <= `space_order`")
11021100
self._interp_order = interp_order
@@ -1121,7 +1119,7 @@ def _fd_priority(self):
11211119
return 1 if self.staggered.on_node else 2
11221120

11231121
def _eval_at(self, func):
1124-
if self.staggered == func.staggered:
1122+
if self.staggered == func.staggered or self.interp_order == 0:
11251123
return self
11261124

11271125
mapper = {}

tests/test_differentiable.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,6 @@ def test_avg_mode(ndim, io):
111111
with pytest.raises(ValueError):
112112
# interp_order > space_order
113113
Function(name="a", grid=grid, interp_order=8, space_order=4)
114-
with pytest.raises(ValueError):
115-
# interp_order < 1
116-
Function(name="a", grid=grid, interp_order=0, space_order=4)
117114
with pytest.raises(TypeError):
118115
# interp_order not int
119116
Function(name="a", grid=grid, interp_order=2.5, space_order=4)
@@ -152,3 +149,19 @@ def test_avg_mode(ndim, io):
152149
assert sympy.simplify(b_avg.args[0] - expected) == 0
153150
assert isinstance(b_avg, SafeInv)
154151
assert b_avg.base == b
152+
153+
154+
def test_no_interp():
155+
grid = Grid((10, 10))
156+
x = grid.dimensions[0]
157+
a = Function(name="a", grid=grid, staggered=NODE, interp_order=0)
158+
sa = Function(name="as", grid=grid, staggered=x)
159+
160+
assert a._eval_at(sa) == a
161+
assert sa._eval_at(a) == sa._subs(x, x - x.spacing/2)
162+
assert (a*sa)._eval_at(sa) == a*sa
163+
assert (a + sa)._eval_at(sa) == a + sa
164+
165+
a_shift = a._subs(x, x + x.spacing / 2)
166+
# Should just do nearest grid point, so shift back to original
167+
assert a_shift.evaluate == a

0 commit comments

Comments
 (0)