Skip to content

Commit f084c21

Browse files
authored
Cofunction: in-place assignment (#4683)
* Cofunction: in-place assignment
1 parent d1411cb commit f084c21

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

firedrake/cofunction.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ def assign(self, expr, subset=None, expr_from_assemble=False):
195195
`CofunctionAssignBlock`.
196196
"""
197197
expr = ufl.as_ufl(expr)
198-
if isinstance(expr, ufl.classes.Zero):
198+
if isinstance(expr, (ufl.classes.Zero, ufl.ZeroBaseForm)):
199199
with stop_annotating(modifies=(self,)):
200200
self.dat.zero(subset=subset)
201201
return self
@@ -209,6 +209,10 @@ def assign(self, expr, subset=None, expr_from_assemble=False):
209209
self.block_variable = self.create_block_variable()
210210
self.block_variable._checkpoint = DelegatedFunctionCheckpoint(
211211
expr.block_variable)
212+
# We set CofunctionAssignBlock(..., rhs_from_assemble=True)
213+
# so that we do not annotate the recursive call to assign
214+
# within Cofunction.assign(BaseForm, subset=...).
215+
# But we currently do not implement annotation for subset != None.
212216
get_working_tape().add_block(
213217
CofunctionAssignBlock(
214218
self, expr, rhs_from_assemble=expr_from_assemble)
@@ -220,10 +224,11 @@ def assign(self, expr, subset=None, expr_from_assemble=False):
220224
# Enable c.assign(B) where c is a Cofunction and B an appropriate
221225
# BaseForm object. If annotation is enabled, the following
222226
# operation will result in an assemble block on the Pyadjoint tape.
223-
assembled_expr = firedrake.assemble(expr)
224-
return self.assign(
225-
assembled_expr, subset=subset,
226-
expr_from_assemble=True)
227+
if subset is None:
228+
return firedrake.assemble(expr, tensor=self)
229+
else:
230+
assembled_expr = firedrake.assemble(expr)
231+
return self.assign(assembled_expr, subset=subset, expr_from_assemble=True)
227232
else:
228233
from firedrake.assign import Assigner
229234
Assigner(self, expr, subset).assign()

0 commit comments

Comments
 (0)