27 #ifdef LIBMESH_HAVE_PETSC 53 <<
", |residual|_2 = " << fnorm << std::endl;
58 ierr = SNESGetSolutionUpdate(snes, &petsc_delta_u);
64 ierr = SNESGetSolution(snes, &petsc_u);
76 delta_u, delta_u.l2_norm(),
78 res, res.l2_norm(), its);
100 *cast_ptr<PetscVector<Number> *>(sys.
solution.get());
102 *cast_ptr<PetscVector<Number> *>(sys.
rhs);
109 X_input.
swap(X_system);
110 R_input.swap(R_system);
123 X_input.swap(X_system);
124 R_input.swap(R_system);
134 #
if PETSC_RELEASE_LESS_THAN(3,5,0)
135 Mat * libmesh_dbg_var(j),
137 MatStructure * msflag,
139 Mat libmesh_dbg_var(j),
157 *cast_ptr<PetscVector<Number> *>(sys.
solution.get());
160 #if PETSC_RELEASE_LESS_THAN(3,5,0) 166 *cast_ptr<PetscMatrix<Number> *>(sys.
matrix);
172 X_input.
swap(X_system);
173 J_input.swap(J_system);
186 X_input.swap(X_system);
187 J_input.swap(J_system);
189 #if PETSC_RELEASE_LESS_THAN(3,5,0) 190 *msflag = SAME_NONZERO_PATTERN;
207 LOG_SCOPE(
"init()",
"PetscDiffSolver");
225 LOG_SCOPE(
"clear()",
"PetscDiffSolver");
228 LIBMESH_CHKERR(ierr);
235 LOG_SCOPE(
"reinit()",
"PetscDiffSolver");
253 case SNES_CONVERGED_FNORM_ABS:
255 case SNES_CONVERGED_FNORM_RELATIVE:
257 #if PETSC_VERSION_LESS_THAN(3,2,1) 258 case SNES_CONVERGED_PNORM_RELATIVE:
260 case SNES_CONVERGED_SNORM_RELATIVE:
263 case SNES_CONVERGED_ITS:
264 case SNES_CONVERGED_TR_DELTA:
266 case SNES_DIVERGED_FUNCTION_DOMAIN:
267 case SNES_DIVERGED_FUNCTION_COUNT:
268 case SNES_DIVERGED_FNORM_NAN:
269 #if !PETSC_VERSION_LESS_THAN(3,3,0) 270 case SNES_DIVERGED_INNER:
272 case SNES_DIVERGED_LINEAR_SOLVE:
273 case SNES_DIVERGED_LOCAL_MIN:
275 case SNES_DIVERGED_MAX_IT:
277 #if PETSC_VERSION_LESS_THAN(3,2,0) 278 case SNES_DIVERGED_LS_FAILURE:
280 case SNES_DIVERGED_LINE_SEARCH:
288 case SNES_CONVERGED_ITERATING:
300 LOG_SCOPE(
"solve()",
"PetscDiffSolver");
307 *(cast_ptr<PetscVector<Number> *>(
_system.
rhs));
311 ierr = SNESSetFunction (
_snes, r.
vec(),
313 LIBMESH_CHKERR(ierr);
315 ierr = SNESSetJacobian (
_snes, jac.
mat(), jac.
mat(),
317 LIBMESH_CHKERR(ierr);
319 ierr = SNESSolve (
_snes, PETSC_NULL, x.
vec());
320 LIBMESH_CHKERR(ierr);
322 #ifdef LIBMESH_ENABLE_CONSTRAINTS 326 SNESConvergedReason reason;
327 SNESGetConvergedReason(
_snes, &reason);
336 ierr = SNESCreate(this->
comm().
get(),&
_snes);
337 LIBMESH_CHKERR(ierr);
341 LIBMESH_CHKERR(ierr);
346 LIBMESH_CHKERR(ierr);
349 ierr = SNESSetFromOptions(
_snes);
350 LIBMESH_CHKERR(ierr);
353 ierr = SNESGetKSP(
_snes, &my_ksp);
354 LIBMESH_CHKERR(ierr);
357 ierr = KSPGetPC(my_ksp, &my_pc);
358 LIBMESH_CHKERR(ierr);
365 #endif // LIBMESH_HAVE_PETSC
void petsc_auto_fieldsplit(PC my_pc, const System &sys)
NumericVector interface to PETSc Vec.
virtual void reinit() libmesh_override
virtual ~PetscDiffSolver()
virtual void init() libmesh_override
const class libmesh_nullptr_t libmesh_nullptr
DiffSolver::SolveResult convert_solve_result(SNESConvergedReason r)
NumericVector< Number > * rhs
void swap(PetscMatrix< T > &)
const std::string & name() const
PetscDiffSolver(sys_type &system)
virtual void assembly(bool, bool, bool=false, bool=false)
const DofMap & get_dof_map() const
const sys_type & system() const
std::unique_ptr< NumericVector< Number > > solution
PetscErrorCode __libmesh_petsc_diff_solver_jacobian(SNES, Vec x,#if PETSC_RELEASE_LESS_THAN(3, 5, 0) Mat *libmesh_dbg_var(j), Mat *pc, MatStructure *msflag,#else Mat libmesh_dbg_var(j), Mat pc,#endif void *ctx)
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=libmesh_nullptr, bool homogeneous=false) const
virtual void close() libmesh_override
virtual unsigned int solve() libmesh_override
bool on_command_line(const std::string &arg)
const Parallel::Communicator & comm() const
SparseMatrix< Number > * matrix
SparseMatrix interface to PETSc Mat.
std::unique_ptr< NumericVector< Number > > current_local_solution
virtual void swap(NumericVector< T > &v) libmesh_override
PetscErrorCode __libmesh_petsc_diff_solver_residual(SNES, Vec x, Vec r, void *ctx)
OStreamProxy out(std::cout)
std::unique_ptr< LinearSolutionMonitor > linear_solution_monitor
PetscErrorCode __libmesh_petsc_diff_solver_monitor(SNES snes, PetscInt its, PetscReal fnorm, void *ctx)
Used for solving implicit systems of equations.