Skip to content

Commit d4577b2

Browse files
committed
tests: Enhanced tests for side
1 parent a831848 commit d4577b2

File tree

3 files changed

+57
-22
lines changed

3 files changed

+57
-22
lines changed

devito/finite_differences/differentiable.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -303,14 +303,14 @@ def shift(self, dim, shift):
303303
return self._subs(dim, dim + shift)
304304

305305
@property
306-
def laplace(self, **kwargs):
306+
def laplace(self):
307307
"""
308308
Generates a symbolic expression for the Laplacian, the second
309309
derivative w.r.t all spatial Dimensions.
310310
"""
311-
return self.laplacian(**kwargs)
311+
return self.laplacian()
312312

313-
def laplacian(self, shift=None, order=None, method='FD', **kwargs):
313+
def laplacian(self, shift=None, order=None, method='FD', side=None, **kwargs):
314314
"""
315315
Laplacian of the Differentiable with shifted derivatives and custom
316316
FD order.
@@ -335,7 +335,6 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
335335
weights/w: list, tuple, or dict, optional, default=None
336336
Custom weights for the finite difference coefficients.
337337
"""
338-
side = kwargs.get("side")
339338
w = kwargs.get('weights', kwargs.get('w'))
340339
order = order or self.space_order
341340
space_dims = self.root_dimensions
@@ -345,7 +344,7 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
345344
method=method, fd_order=order, side=side, w=w)
346345
for i, d in enumerate(derivs)])
347346

348-
def div(self, shift=None, order=None, method='FD', **kwargs):
347+
def div(self, shift=None, order=None, method='FD', side=None, **kwargs):
349348
"""
350349
Divergence of the input Function.
351350
@@ -367,7 +366,6 @@ def div(self, shift=None, order=None, method='FD', **kwargs):
367366
weights/w: list, tuple, or dict, optional, default=None
368367
Custom weights for the finite difference coefficients.
369368
"""
370-
side = kwargs.get("side")
371369
w = kwargs.get('weights', kwargs.get('w'))
372370
space_dims = self.root_dimensions
373371
shift_x0 = make_shift_x0(shift, (len(space_dims),))
@@ -377,7 +375,7 @@ def div(self, shift=None, order=None, method='FD', **kwargs):
377375
w=w)
378376
for i, d in enumerate(space_dims)])
379377

380-
def grad(self, shift=None, order=None, method='FD', **kwargs):
378+
def grad(self, shift=None, order=None, method='FD', side=None, **kwargs):
381379
"""
382380
Gradient of the input Function.
383381
@@ -404,7 +402,6 @@ def grad(self, shift=None, order=None, method='FD', **kwargs):
404402
shift_x0 = make_shift_x0(shift, (len(space_dims),))
405403
order = order or self.space_order
406404

407-
side = kwargs.get("side")
408405
w = kwargs.get('weights', kwargs.get('w'))
409406
comps = [getattr(self, f'd{d.name}')(x0=shift_x0(shift, d, None, i),
410407
fd_order=order, method=method, side=side,

devito/types/tensor.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ def values(self):
220220
else:
221221
return super().values()
222222

223-
def div(self, shift=None, order=None, method='FD', **kwargs):
223+
def div(self, shift=None, order=None, method='FD', side=None, **kwargs):
224224
"""
225225
Divergence of the TensorFunction (is a VectorFunction).
226226
@@ -240,7 +240,6 @@ def div(self, shift=None, order=None, method='FD', **kwargs):
240240
weights/w: list, tuple, or dict, optional, default=None
241241
Custom weights for the finite differences.
242242
"""
243-
side = kwargs.get("side")
244243
w = kwargs.get('weights', kwargs.get('w'))
245244
comps = []
246245
func = vec_func(self)
@@ -262,7 +261,7 @@ def laplace(self):
262261
"""
263262
return self.laplacian()
264263

265-
def laplacian(self, shift=None, order=None, method='FD', **kwargs):
264+
def laplacian(self, shift=None, order=None, method='FD', side=None, **kwargs):
266265
"""
267266
Laplacian of the TensorFunction with shifted derivatives and custom
268267
FD order.
@@ -287,7 +286,6 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
287286
weights/w: list, tuple, or dict, optional, default=None
288287
Custom weights for the finite
289288
"""
290-
side = kwargs.get("side")
291289
w = kwargs.get('weights', kwargs.get('w'))
292290
comps = []
293291
func = vec_func(self)
@@ -366,7 +364,7 @@ def __str__(self):
366364

367365
__repr__ = __str__
368366

369-
def div(self, shift=None, order=None, method='FD', **kwargs):
367+
def div(self, shift=None, order=None, method='FD', side=None, **kwargs):
370368
"""
371369
Divergence of the VectorFunction, creates the divergence Function.
372370
@@ -386,7 +384,6 @@ def div(self, shift=None, order=None, method='FD', **kwargs):
386384
weights/w: list, tuple, or dict, optional, default=None
387385
Custom weights for the finite difference coefficients.
388386
"""
389-
side = kwargs.get("side")
390387
w = kwargs.get('weights', kwargs.get('w'))
391388
shift_x0 = make_shift_x0(shift, (len(self.space_dimensions),))
392389
order = order or self.space_order
@@ -403,7 +400,7 @@ def laplace(self):
403400
"""
404401
return self.laplacian()
405402

406-
def laplacian(self, shift=None, order=None, method='FD', **kwargs):
403+
def laplacian(self, shift=None, order=None, method='FD', side=None, **kwargs):
407404
"""
408405
Laplacian of the VectorFunction, creates the Laplacian VectorFunction.
409406
@@ -423,7 +420,6 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
423420
weights/w: list, tuple, or dict, optional, default=None
424421
Custom weights for the finite
425422
"""
426-
side = kwargs.get("side")
427423
w = kwargs.get('weights', kwargs.get('w'))
428424
func = vec_func(self)
429425
shift_x0 = make_shift_x0(shift, (len(self.space_dimensions),))
@@ -436,7 +432,7 @@ def laplacian(self, shift=None, order=None, method='FD', **kwargs):
436432
for s in self]
437433
return func._new(comps)
438434

439-
def curl(self, shift=None, order=None, method='FD', **kwargs):
435+
def curl(self, shift=None, order=None, method='FD', side=None, **kwargs):
440436
"""
441437
Gradient of the (3D) VectorFunction, creates the curl VectorFunction.
442438
@@ -459,7 +455,6 @@ def curl(self, shift=None, order=None, method='FD', **kwargs):
459455
if len(self.space_dimensions) != 3:
460456
raise AttributeError("Curl only supported for 3D VectorFunction")
461457
# The curl of a VectorFunction is a VectorFunction
462-
side = kwargs.get("side")
463458
w = kwargs.get('weights', kwargs.get('w'))
464459
dims = self.root_dimensions
465460
derivs = ['d%s' % d.name for d in dims]
@@ -486,7 +481,7 @@ def curl(self, shift=None, order=None, method='FD', **kwargs):
486481
func = vec_func(self)
487482
return func._new(3, 1, [comp1, comp2, comp3])
488483

489-
def grad(self, shift=None, order=None, method='FD', **kwargs):
484+
def grad(self, shift=None, order=None, method='FD', side=None, **kwargs):
490485
"""
491486
Gradient of the VectorFunction, creates the gradient TensorFunction.
492487
@@ -506,7 +501,6 @@ def grad(self, shift=None, order=None, method='FD', **kwargs):
506501
weights/w: list, tuple, or dict, optional, default=None
507502
Custom weights for the finite difference coefficients.
508503
"""
509-
side = kwargs.get("side")
510504
w = kwargs.get('weights', kwargs.get('w'))
511505
func = tens_func(self)
512506
ndim = len(self.space_dimensions)

tests/test_derivatives.py

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -625,13 +625,13 @@ def test_shifted_grad(self, shift, ndim):
625625
gk = getattr(f, 'd%s' % d.name)(x0=x0, fd_order=order).evaluate
626626
assert gi == gk
627627

628-
# TODO: Repeat all these with vector and tensor functions where defined
629628
@pytest.mark.parametrize('side', [left, right, centered])
630629
def test_grad_w_side(self, side):
631630
grid = Grid(shape=(11, 11))
632631
f = Function(name='f', grid=grid, space_order=2)
633632

634-
# Want to check that it's the same as constructing by hand
633+
# Want to check that it's the same as constructing by hand. Note that
634+
# all the subsequent tests of this flavor work in the same way.
635635
comps = (f.dx(side=side), f.dy(side=side))
636636
expr1 = VectorFunction(name=f"{f.name}_vec", space_order=f.space_order,
637637
components=comps, grid=grid).evaluate
@@ -663,6 +663,21 @@ def test_div_w_side(self, side):
663663
assert expr1 == f.div(side=side).evaluate
664664
assert expr1 == div(f, side=side).evaluate
665665

666+
@pytest.mark.parametrize('side', [left, right, centered])
667+
def test_tensor_div_w_side(self, side):
668+
grid = Grid(shape=(11, 11))
669+
f = TensorFunction(name='f', grid=grid, space_order=2,
670+
staggered=((None, None), (None, None)))
671+
672+
comps = (f[0, 0].dx(side=side) + f[0, 1].dy(side=side),
673+
f[0, 1].dx(side=side) + f[1, 1].dy(side=side))
674+
675+
expr1 = VectorFunction(name=f"{f.name}_vec", space_order=f.space_order,
676+
components=comps, grid=grid).evaluate
677+
678+
assert expr1 == f.div(side=side).evaluate
679+
assert expr1 == div(f, side=side).evaluate
680+
666681
@pytest.mark.parametrize('side', [left, right, centered])
667682
def test_curl_w_side(self, side):
668683
grid = Grid(shape=(11, 11, 11))
@@ -689,6 +704,35 @@ def test_laplace_w_side(self, side):
689704
assert expr1 == f.laplacian(side=side).evaluate
690705
assert expr1 == laplace(f, side=side).evaluate
691706

707+
@pytest.mark.parametrize('side', [left, right, centered])
708+
def test_vector_laplace_w_side(self, side):
709+
grid = Grid(shape=(11, 11))
710+
f = VectorFunction(name='f', grid=grid, space_order=2, staggered=(None, None))
711+
712+
comps = (f[0].dx2(side=side) + f[0].dy2(side=side),
713+
f[1].dx2(side=side) + f[1].dy2(side=side))
714+
715+
expr1 = VectorFunction(name=f"{f.name}_vec", space_order=f.space_order,
716+
components=comps, grid=grid).evaluate
717+
718+
assert expr1 == f.laplacian(side=side).evaluate
719+
assert expr1 == laplace(f, side=side).evaluate
720+
721+
@pytest.mark.parametrize('side', [centered])
722+
def test_tensor_laplace_w_side(self, side):
723+
grid = Grid(shape=(11, 11))
724+
f = TensorFunction(name='f', grid=grid, space_order=2,
725+
staggered=((None, None), (None, None)))
726+
727+
comps = (f[0, 0].dx2(side=side) + f[0, 1].dy2(side=side),
728+
f[0, 1].dx2(side=side) + f[1, 1].dy2(side=side))
729+
730+
expr1 = VectorFunction(name=f"{f.name}_vec", space_order=f.space_order,
731+
components=comps, grid=grid).evaluate
732+
733+
assert expr1 == f.laplacian(side=side).evaluate
734+
assert expr1 == laplace(f, side=side).evaluate
735+
692736
def test_substitution(self):
693737
grid = Grid((11, 11))
694738
f = Function(name="f", grid=grid, space_order=4)

0 commit comments

Comments
 (0)