From: Roy S. <roy...@ic...> - 2017-07-07 15:31:45
|
On Fri, 7 Jul 2017, Manav Bhatia wrote: > I am working on a case where I need to dynamically add/remove constraints on dofs. > > I see the method DofMap::add_constraint_row to add a constraint > row. Is there a corresponding method to delete these constraints > for the dofmap? Not a good one, IIRC, and I'm sure you'd have seen it if there was one I'm forgetting. I think all you could do at the moment is clear everything then re-add the constraints you want to retain, which sounds like an awful idea, until you read about the alternatives below... We'd be happy to add a patch which adds this functionality (assuming it comes with a lot of unit testing so we don't break it again out from under you!), but I'm afraid that at the moment it's probably much harder than you're imagining to get it right in the general case: For efficiency's sake, we currently pre-expand constraints. So e.g. if DoF A depends on B and C, and C depends on D and E, and E depends on F and G, after (re-)initialization time the final constraint row will have A depending on B, D, F, and G. If you were to then remove the constraint on C, the constraint on A would now be incorrect, and what's worse, there would be no easy way to tell it was incorrect, because in the expanded version there is no remaining A->C connection! It would be reasonable to (optionally) forgo this pre-expansion, but a bit of other code would have to be added to handle the unexpanded case. Dependency constraint equations would have to be communicated properly on DistributedMesh while leaving the dependent constraints unmodified, the send_list construction would have to be able to handle indirect dependencies, and enforce_constraints_exactly() would have to either walk through dependency trees or iterate up to the maximum tree depth, just off the top of my head. Alternatively, we could keep two constraints data structures, one pre-expanded and one unexpanded, and use the latter to regenerate (just the relevant parts of) the former whenever a constraint is removed. I'm not sure whether this would be easier or harder than the first option. --- Roy |