Skip to content

Compilation issue when trying to use time-dependent coefficient #1717

@tjb900

Description

@tjb900

This may not be the right way to approach this... but the code below generates a pretty funky and not-very-helpful error :)

from devito import Grid, Function, TimeFunction, Operator, Eq, left, right, solve

nx = 50
ny = 50
nz = 50

grid = Grid(shape=(nx + 2, ny + 2, nz + 2,), extent=(2.0, 2.0, 2.0),)
u = TimeFunction(name="u", grid=grid, space_order=1)
time_dim = grid.time_dim
array_func = Function(name="array_func", shape=(10,), dimensions=(time_dim,))
t0 = Function(name="t0", grid=grid, space_order=1)
t1 = Function(name="t1", grid=grid, space_order=1)

eq = Eq(u.dt, array_func * ((t0 * u.dx).dx + (t1 * u.dy).dx), subdomain=grid.interior,)
stencil = solve(eq, u.forward)
eq_stencil = Eq(u.forward, stencil)

# -----ERRORS HERE!-----
op = Operator([eq_stencil])

Traceback below:

Traceback (most recent call last):
  File "test_crash_devito3.py", line 19, in <module>
    op = Operator([eq_stencil])
  File "/redacted/devito/operator/operator.py", line 157, in __new__
    op = cls._build(expressions, **kwargs)
  File "/redacted/devito/operator/operator.py", line 181, in _build
    expressions = cls._lower_exprs(expressions, **kwargs)
  File "/redacted/devito/tools/timing.py", line 76, in __call__
    retval = self.func(*args, **kwargs)
  File "/redacted/devito/operator/operator.py", line 278, in _lower_exprs
    expressions = flatten([i.evaluate for i in expressions])
  File "/redacted/devito/operator/operator.py", line 278, in <listcomp>
    expressions = flatten([i.evaluate for i in expressions])
  File "/redacted/lib/python3.9/site-packages/cached_property.py", line 36, in __get__
    value = obj.__dict__[self.func.__name__] = self.func(obj)
  File "/redacted/devito/types/equation.py", line 86, in evaluate
    lhs, rhs = self.lhs.evaluate, self.rhs._eval_at(self.lhs).evaluate
  File "/redacted/devito/types/lazy.py", line 47, in evaluate
    args = self._evaluate_args()
  File "/redacted/devito/types/lazy.py", line 42, in _evaluate_args 
    return [Evaluable._evaluate_maybe_nested(i) for i in self.args]
  File "/redacted/devito/types/lazy.py", line 42, in <listcomp>
    return [Evaluable._evaluate_maybe_nested(i) for i in self.args]
  File "/redacted/devito/types/lazy.py", line 16, in _evaluate_maybe_nested
    return maybe_evaluable.evaluate
  File "/redacted/devito/finite_differences/derivative.py", line 319, in evaluate 
    return self._eval_fd(self.expr)
  File "/redacted/devito/finite_differences/derivative.py", line 352, in _eval_fd 
    res = generic_derivative(expr, *self.dims, self.fd_order, self.deriv_order,
  File "/redacted/devito/finite_differences/tools.py", line 50, in wrapper
    return S.Zero if expr.is_Number else func(expr, *args, **kwargs)
  File "/redacted/devito/finite_differences/tools.py", line 67, in wrapper
    return func(expr, *args, **kwargs)
  File "/redacted/devito/finite_differences/finite_difference.py", line 261, in generic_derivative 
    return indices_weights_to_fd(expr, dim, indices, c, matvec=matvec.val)
  File "/redacted/devito/finite_differences/finite_difference.py", line 283, in indices_weights_to_fd 
    terms.append(expr._subs(dim, iloc - (expr.indices_ref[dim] - dim)) * c)
  File "/redacted/devito/tools/data_structures.py", line 47, in __getitem__
    return self.__getitem_hook__(key)
  File "/redacted/devito/types/utils.py", line 27, in __getitem_hook__
    raise KeyError
KeyError

Bizarrely, it depends on the name of the array_func. If I change it to e.g. time_varying_func, there is no issue.

Any help would be much appreciated!

Thanks,
Tim

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions