@@ -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