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