Skip to content

Commit e011f96

Browse files
committed
DiffSystem::set_constrain_in_solver()
This should let us play with the option easily in FEMSystem codes, which should be good for verification purposes.
1 parent d7745bd commit e011f96

3 files changed

Lines changed: 38 additions & 7 deletions

File tree

include/systems/diff_system.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,16 @@ class DifferentiableSystem : public ImplicitSystem,
378378
*/
379379
bool print_element_jacobians;
380380

381+
/**
382+
* set_constrain_in_solver to false to apply constraints only via
383+
* residual terms in the systems to be solved.
384+
*/
385+
virtual void set_constrain_in_solver(bool enable);
386+
387+
virtual bool get_constrain_in_solver() {
388+
return _constrain_in_solver;
389+
}
390+
381391
protected:
382392

383393
/**
@@ -412,6 +422,12 @@ class DifferentiableSystem : public ImplicitSystem,
412422
void add_dot_var_dirichlet_bcs( unsigned int var_idx, unsigned int dot_var_idx);
413423
#endif
414424

425+
/**
426+
* _constrain_in_solver defaults to true; if false then we apply
427+
* constraints only via residual terms in the systems to be solved.
428+
*/
429+
bool _constrain_in_solver;
430+
415431
private:
416432
/**
417433
* Stack of pointers to objects to use for physics assembly

src/systems/diff_system.C

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ DifferentiableSystem::DifferentiableSystem(EquationSystems & es,
4848
print_element_solutions(false),
4949
print_element_residuals(false),
5050
print_element_jacobians(false),
51+
_constrain_in_solver(true),
5152
_diff_physics(),
5253
_diff_qoi()
5354
{
@@ -417,6 +418,11 @@ void DifferentiableSystem::pop_physics ()
417418
}
418419

419420

421+
void DifferentiableSystem::set_constrain_in_solver(bool enable)
422+
{
423+
_constrain_in_solver = enable;
424+
this->time_solver->diff_solver()->set_exact_constraint_enforcement(enable);
425+
}
420426

421427

422428
} // namespace libMesh

src/systems/fem_system.C

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -266,20 +266,22 @@ void add_element_system(FEMSystem & _sys,
266266
libMesh::out.precision(old_precision);
267267
}
268268

269-
// We turn off the asymmetric constraint application;
270-
// enforce_constraints_exactly() should be called in the solver
269+
// We turn off the asymmetric constraint application iff we expect
270+
// enforce_constraints_exactly() to be called in the solver
271+
const bool constrain_in_solver = _sys.get_constrain_in_solver();
272+
271273
if (_get_residual && _get_jacobian)
272274
{
273275
if (_constrain_heterogeneously)
274276
_sys.get_dof_map().heterogenously_constrain_element_matrix_and_vector
275277
(_femcontext.get_elem_jacobian(),
276278
_femcontext.get_elem_residual(),
277-
_femcontext.get_dof_indices(), false);
279+
_femcontext.get_dof_indices(), !constrain_in_solver);
278280
else if (!_no_constraints)
279281
_sys.get_dof_map().constrain_element_matrix_and_vector
280282
(_femcontext.get_elem_jacobian(),
281283
_femcontext.get_elem_residual(),
282-
_femcontext.get_dof_indices(), false);
284+
_femcontext.get_dof_indices(), !constrain_in_solver);
283285
// Do nothing if (_no_constraints)
284286
}
285287
else if (_get_residual)
@@ -288,10 +290,11 @@ void add_element_system(FEMSystem & _sys,
288290
_sys.get_dof_map().heterogenously_constrain_element_vector
289291
(_femcontext.get_elem_jacobian(),
290292
_femcontext.get_elem_residual(),
291-
_femcontext.get_dof_indices(), false);
293+
_femcontext.get_dof_indices(), !constrain_in_solver);
292294
else if (!_no_constraints)
293295
_sys.get_dof_map().constrain_element_vector
294-
(_femcontext.get_elem_residual(), _femcontext.get_dof_indices(), false);
296+
(_femcontext.get_elem_residual(),
297+
_femcontext.get_dof_indices(), !constrain_in_solver);
295298
// Do nothing if (_no_constraints)
296299
}
297300
else if (_get_jacobian)
@@ -302,8 +305,14 @@ void add_element_system(FEMSystem & _sys,
302305
if (!_no_constraints)
303306
_sys.get_dof_map().constrain_element_matrix (_femcontext.get_elem_jacobian(),
304307
_femcontext.get_dof_indices(),
305-
false);
308+
!constrain_in_solver);
306309
}
310+
311+
if (_get_residual && !_no_constraints && !constrain_in_solver)
312+
_sys.get_dof_map().residual_constrain_element_vector
313+
(_femcontext.get_elem_residual(),
314+
_femcontext.get_dof_indices(),
315+
*_sys.current_local_solution);
307316
#else
308317
libmesh_ignore(_constrain_heterogeneously, _no_constraints);
309318
#endif // #ifdef LIBMESH_ENABLE_CONSTRAINTS

0 commit comments

Comments
 (0)