diff --git a/devito/finite_differences/derivative.py b/devito/finite_differences/derivative.py index 1019ba8672..c73c1071de 100644 --- a/devito/finite_differences/derivative.py +++ b/devito/finite_differences/derivative.py @@ -307,7 +307,8 @@ def _xreplace(self, subs): if self in subs: new = subs.pop(self) try: - return new._xreplace(subs) + new, flag = new._xreplace(subs) + return new, True except AttributeError: return new, True diff --git a/devito/finite_differences/tools.py b/devito/finite_differences/tools.py index 5856a767ef..9d65cf59f1 100644 --- a/devito/finite_differences/tools.py +++ b/devito/finite_differences/tools.py @@ -265,7 +265,7 @@ def generate_indices(expr, dim, order, side=None, matvec=None, x0=None, nweights if nweights > 0: do, dw = order + 1 + order % 2, nweights if do < dw: - raise ValueError(f"More weights ({nweights}) provided than the maximum" + raise ValueError(f"More weights ({nweights}) provided than the maximum " f"stencil size ({order + 1}) for order {order} scheme") elif do > dw: warning(f"Less weights ({nweights}) provided than the stencil size" diff --git a/devito/types/equation.py b/devito/types/equation.py index ad3e62f0e2..19c14305bf 100644 --- a/devito/types/equation.py +++ b/devito/types/equation.py @@ -90,6 +90,7 @@ def _apply_coeffs(cls, expr, coefficients): for coeff in coefficients.coefficients: derivs = [d for d in retrieve_derivatives(expr) if coeff.dimension in d.dims and + coeff.function in d.expr._functions and coeff.deriv_order == d.deriv_order.get(coeff.dimension, None)] if not derivs: continue diff --git a/tests/test_symbolic_coefficients.py b/tests/test_symbolic_coefficients.py index 872995ff68..7ba877d88b 100644 --- a/tests/test_symbolic_coefficients.py +++ b/tests/test_symbolic_coefficients.py @@ -344,3 +344,31 @@ def test_spacing(self): df_s = f.dx(weights=coeffs1) assert sp.simplify(df_s.evaluate - df.evaluate) == 0 + + def test_backward_compat_mixed(self): + + grid = Grid(shape=(11,)) + x, = grid.dimensions + + f = Function(name='f', grid=grid, space_order=8) + g = Function(name='g', grid=grid, space_order=2) + + coeffs0 = np.arange(0, 9) + + coeffs = Coefficient(1, f, x, coeffs0) + + eq = Eq(f, f.dx * g.dxc, coefficients=Substitutions(coeffs)) + + derivs = retrieve_derivatives(eq.rhs) + + assert len(derivs) == 2 + df = [d for d in derivs if d.expr == f][0] + dg = [d for d in derivs if d.expr == g][0] + + assert np.all(df.weights == coeffs0) + assert dg.weights is None + + eqe = eq.evaluate + assert '7.0*f(x + 3*h_x)' in str(eqe.rhs) + assert '0.5*g(x + h_x)' in str(eqe.rhs) + assert 'g(x + 2*h_x)' not in str(eqe.rhs)