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