Skip to content

Commit b1f0d7f

Browse files
authored
Merge pull request #3519 from roystgnr/residual_constrain_on_elements
Apply constraints via element nonlinear residuals
2 parents b0bf86b + 5d92fb0 commit b1f0d7f

29 files changed

Lines changed: 608 additions & 84 deletions

examples/adjoints/adjoints_ex1/adjoints_ex1.C

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
#include "libmesh/newton_solver.h"
6868
#include "libmesh/numeric_vector.h"
6969
#include "libmesh/partitioner.h"
70+
#include "libmesh/petsc_diff_solver.h"
7071
#include "libmesh/steady_solver.h"
7172
#include "libmesh/system_norm.h"
7273
#include "libmesh/enum_solver_package.h"
@@ -184,6 +185,16 @@ void set_system_parameters(LaplaceSystem & system,
184185
system.time_solver = std::make_unique<SteadySolver>(system);
185186

186187
// Nonlinear solver options
188+
if (param.use_petsc_snes)
189+
{
190+
#ifdef LIBMESH_HAVE_PETSC
191+
PetscDiffSolver *solver = new PetscDiffSolver(system);
192+
system.time_solver->diff_solver().reset(solver);
193+
#else
194+
libmesh_error_msg("This example requires libMesh to be compiled with PETSc support.");
195+
#endif
196+
}
197+
else
187198
{
188199
NewtonSolver * solver = new NewtonSolver(system);
189200
system.time_solver->diff_solver() = std::unique_ptr<DiffSolver>(solver);
@@ -201,6 +212,7 @@ void set_system_parameters(LaplaceSystem & system,
201212
solver->continue_after_max_iterations = true;
202213
solver->continue_after_backtrack_failure = true;
203214
}
215+
system.set_constrain_in_solver(param.constrain_in_solver);
204216

205217
// And the linear solver options
206218
solver->max_linear_iterations = param.max_linear_iterations;

examples/adjoints/adjoints_ex1/femparameters.C

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ FEMParameters::FEMParameters(const Parallel::Communicator & comm_in) :
8181
print_element_residuals(false),
8282
print_element_jacobians(false),
8383

84+
constrain_in_solver(true),
8485
use_petsc_snes(false),
8586
time_solver_quiet(true), solver_quiet(true), solver_verbose(false),
8687
reuse_preconditioner(true),
@@ -686,6 +687,7 @@ void FEMParameters::read(GetPot & input,
686687
GETPOT_INPUT(print_element_jacobians);
687688

688689

690+
GETPOT_INPUT(constrain_in_solver);
689691
GETPOT_INPUT(use_petsc_snes);
690692
GETPOT_INPUT(time_solver_quiet);
691693
GETPOT_INPUT(solver_quiet);

examples/adjoints/adjoints_ex1/femparameters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ class FEMParameters : public libMesh::ParallelObject
125125

126126
// Solver options
127127

128+
bool constrain_in_solver;
128129
bool use_petsc_snes;
129130
bool time_solver_quiet, solver_quiet, solver_verbose,
130131
reuse_preconditioner, require_residual_reduction;

examples/adjoints/adjoints_ex2/adjoints_ex2.C

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
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;

examples/adjoints/adjoints_ex2/femparameters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ class FEMParameters : public libMesh::ParallelObject
125125

126126
// Solver options
127127

128+
bool constrain_in_solver;
128129
bool use_petsc_snes;
129130
bool time_solver_quiet, solver_quiet, solver_verbose,
130131
reuse_preconditioner, require_residual_reduction;

examples/adjoints/adjoints_ex3/adjoints_ex3.C

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@ void set_system_parameters(FEMSystem & system,
579579
solver->continue_after_max_iterations = true;
580580
solver->continue_after_backtrack_failure = true;
581581
}
582+
system.set_constrain_in_solver(param.constrain_in_solver);
582583

583584
// And the linear solver options
584585
solver->max_linear_iterations = param.max_linear_iterations;

examples/adjoints/adjoints_ex3/femparameters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ class FEMParameters : public libMesh::ParallelObject
125125

126126
// Solver options
127127

128+
bool constrain_in_solver;
128129
bool use_petsc_snes;
129130
bool time_solver_quiet, solver_quiet, solver_verbose,
130131
reuse_preconditioner, require_residual_reduction;

examples/adjoints/adjoints_ex4/adjoints_ex4.C

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
#include "libmesh/mesh_refinement.h"
6666
#include "libmesh/newton_solver.h"
6767
#include "libmesh/numeric_vector.h"
68+
#include "libmesh/petsc_diff_solver.h"
6869
#include "libmesh/steady_solver.h"
6970
#include "libmesh/system_norm.h"
7071
#include "libmesh/enum_solver_package.h"
@@ -177,6 +178,16 @@ void set_system_parameters(LaplaceSystem & system,
177178
system.time_solver = std::make_unique<SteadySolver>(system);
178179

179180
// Nonlinear solver options
181+
if (param.use_petsc_snes)
182+
{
183+
#ifdef LIBMESH_HAVE_PETSC
184+
PetscDiffSolver *solver = new PetscDiffSolver(system);
185+
system.time_solver->diff_solver().reset(solver);
186+
#else
187+
libmesh_error_msg("This example requires libMesh to be compiled with PETSc support.");
188+
#endif
189+
}
190+
else
180191
{
181192
NewtonSolver * solver = new NewtonSolver(system);
182193
system.time_solver->diff_solver() = std::unique_ptr<DiffSolver>(solver);
@@ -193,6 +204,7 @@ void set_system_parameters(LaplaceSystem & system,
193204
solver->continue_after_max_iterations = true;
194205
solver->continue_after_backtrack_failure = true;
195206
}
207+
system.set_constrain_in_solver(param.constrain_in_solver);
196208

197209
// And the linear solver options
198210
solver->max_linear_iterations = param.max_linear_iterations;

examples/adjoints/adjoints_ex4/femparameters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ class FEMParameters : public libMesh::ParallelObject
125125

126126
// Solver options
127127

128+
bool constrain_in_solver;
128129
bool use_petsc_snes;
129130
bool time_solver_quiet, solver_quiet, solver_verbose,
130131
reuse_preconditioner, require_residual_reduction;

examples/adjoints/adjoints_ex5/adjoints_ex5.C

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
#include "libmesh/euler_solver.h"
9999
#include "libmesh/euler2_solver.h"
100100
#include "libmesh/newton_solver.h"
101+
#include "libmesh/petsc_diff_solver.h"
101102
#include "libmesh/twostep_time_solver.h"
102103

103104
#include "libmesh/getpot.h"
@@ -338,6 +339,7 @@ void set_system_parameters(HeatSystem &system, FEMParameters &param)
338339
solver->continue_after_max_iterations = true;
339340
solver->continue_after_backtrack_failure = true;
340341
}
342+
system.set_constrain_in_solver(param.constrain_in_solver);
341343

342344
// And the linear solver options
343345
solver->max_linear_iterations = param.max_linear_iterations;

0 commit comments

Comments
 (0)