On Mon, 30 Sep 2019, Yuxiang Wang wrote:

> I am trying to adapt the systems_of_equations_ex7.C to heterogeneous
> Dirichlet BC, and I seem to hit a few challenges. Could you please help me
> out here?
>
> 1) My first attempt is simply adding the heterogeneous BC like a linear
> problem and used
> `dof_map.heterogenously_constrain_element_matrix_and_vector (Ke, Fe,
> dof_indices)` instead of the `dof_map.constrain_element_matrix_and_vector
> (Ke, Fe, dof_indices)` in the jacobian() function. Note that I did NOT
> have `system.rhs->add_vector (Fe, dof_indices)` in the jacobian() function.
> The solution seems to be slightly wrong - in the result file, some nodes
> did not have the right prescribed displacements, although their neighboring
> nodes seemed correct. Then I added the `system.rhs->add_vector (Fe,
> dof_indices)` in the jacobian() function then the results diverged.

Treating the heterogeneous BC like a linear problem is tricky if you
don't have control over what the solver's doing under the hood.

What we tend to do now in that case is a cheat: treat the constrained
DoFs as "mutable" in the C++ sense, do enforce_constraints_exactly()
before each residual or Jacobian evaluation, do homogeneous assembly
during the evaluations, then do enforce_constraints_exactly() one
final time after the solver returns.  See petsc_diff_solver.C for
example.

> 2) I noticed that the BCs have to be applied before the es.init().

> However, for NonlinearImplicitSystem we may want to divide the
> solution into multiple steps and we'd then need to update the
> heterogeneous BC per step.  Would this be possible?

If you have nonlinear (or time-varying) heterogeneous Dirichlet BCs,
System::reinit_constraints() can be used to recalculate the constraint
equations from them when you need.
---
Roy


_______________________________________________
Libmesh-users mailing list
Libmesh-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libmesh-users

Reply via email to