6969#include "libmesh/mesh_refinement.h"
7070#include "libmesh/newton_solver.h"
7171#include "libmesh/numeric_vector.h"
72+ #include "libmesh/petsc_diff_solver.h"
7273#include "libmesh/steady_solver.h"
7374#include "libmesh/system_norm.h"
7475#include "libmesh/enum_solver_package.h"
@@ -187,6 +188,16 @@ void set_system_parameters(LaplaceSystem & system, FEMParameters & param)
187188 system .time_solver = std ::make_unique < SteadySolver > (system );
188189
189190 // Nonlinear solver options
191+ if (param .use_petsc_snes )
192+ {
193+ #ifdef LIBMESH_HAVE_PETSC
194+ PetscDiffSolver * solver = new PetscDiffSolver (system );
195+ system .time_solver -> diff_solver ().reset (solver );
196+ #else
197+ libmesh_error_msg ("This example requires libMesh to be compiled with PETSc support." );
198+ #endif
199+ }
200+ else
190201 {
191202 NewtonSolver * solver = new NewtonSolver (system );
192203 system .time_solver -> diff_solver () = std ::unique_ptr < DiffSolver > (solver );
@@ -203,6 +214,7 @@ void set_system_parameters(LaplaceSystem & system, FEMParameters & param)
203214 solver -> continue_after_max_iterations = true;
204215 solver -> continue_after_backtrack_failure = true;
205216 }
217+ system .set_constrain_in_solver (param .constrain_in_solver );
206218
207219 // And the linear solver options
208220 solver -> max_linear_iterations = param .max_linear_iterations ;
0 commit comments