Skip to content

Commit d54994e

Browse files
committed
Interpolate: map dual argument to reference values for codegen
1 parent 15bdd53 commit d54994e

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

tsfc/driver.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -215,20 +215,28 @@ def compile_expression_dual_evaluation(expression, to_element, ufl_element, *,
215215
if isinstance(to_element, (PhysicallyMappedElement, DirectlyDefinedElement)):
216216
raise NotImplementedError("Don't know how to interpolate onto zany spaces, sorry")
217217

218+
if domain is None:
219+
domain = extract_unique_domain(expression)
220+
assert domain is not None
221+
218222
orig_coefficients = extract_coefficients(expression)
219-
if isinstance(expression, ufl.Interpolate):
220-
v, operand = expression.argument_slots()
221-
else:
222-
operand = expression
223-
v = ufl.FunctionSpace(extract_unique_domain(operand), ufl_element)
223+
v, operand = expression.argument_slots()
224224

225-
# Map into reference space
225+
# Map v into reference space
226+
if ufl_element.mapping() != "identity":
227+
Vref = ufl.FunctionSpace(domain, finat.ufl.WithMapping(ufl_element, "identity"))
228+
if isinstance(v, ufl.Cofunction):
229+
v = ufl.Cofunction(Vref.dual())
230+
else:
231+
v = ufl.Coargument(Vref.dual(), number=v.number())
232+
233+
# Map operand into reference space
226234
operand = apply_mapping(operand, ufl_element, domain)
227235

228236
# Apply UFL preprocessing
229237
operand = ufl_utils.preprocess_expression(operand, complex_mode=complex_mode)
230238

231-
# Reconstructed Interpolate with mapped operand
239+
# Reconstructed Interpolate in the reference space
232240
expression = ufl.Interpolate(operand, v)
233241

234242
# Initialise kernel builder
@@ -243,9 +251,6 @@ def compile_expression_dual_evaluation(expression, to_element, ufl_element, *,
243251
assert len(argument_multiindices) == len(arguments)
244252

245253
# Replace coordinates (if any) unless otherwise specified by kwarg
246-
if domain is None:
247-
domain = extract_unique_domain(expression)
248-
assert domain is not None
249254
builder._domain_integral_type_map = {domain: "cell"}
250255

251256
# Collect required coefficients and determine numbering
@@ -259,6 +264,7 @@ def compile_expression_dual_evaluation(expression, to_element, ufl_element, *,
259264

260265
elements = [f.ufl_element() for f in (*coefficients, *arguments)]
261266

267+
# Replace coordinates (if any) unless otherwise specified by kwarg
262268
needs_external_coords = False
263269
if has_type(expression, GeometricQuantity) or any(map(fem.needs_coordinate_mapping, elements)):
264270
# Create a fake coordinate coefficient for a domain.

0 commit comments

Comments
 (0)