https://mooseframework.inl.gov
Loading...
Searching...
No Matches
PhysicsBasedPreconditioner.h
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#pragma once
11
12// MOOSE includes
13#include "MoosePreconditioner.h"
14
15// libMesh includes
16#include "libmesh/preconditioner.h"
17#include "libmesh/linear_implicit_system.h"
18#include "libmesh/enum_preconditioner_type.h"
19
20// C++ includes
21#include <vector>
22
23// Forward declarations
29 public libMesh::Preconditioner<Number>
30{
31public:
36
39
44 // FIXME: use better name
45 void addSystem(unsigned int var,
46 std::vector<unsigned int> off_diag,
48
53 virtual void apply(const NumericVector<Number> & x, NumericVector<Number> & y);
54
58 virtual void clear();
59
63 virtual void init();
64
70 virtual void setup();
71
72protected:
76 std::vector<libMesh::LinearImplicitSystem *> _systems;
78 std::vector<std::unique_ptr<libMesh::Preconditioner<Number>>> _preconditioners;
80 std::vector<unsigned int> _solve_order;
82 std::vector<libMesh::PreconditionerType> _pre_type;
84 std::vector<std::vector<unsigned int>> _off_diag;
85
93 std::vector<std::vector<libMesh::SparseMatrix<Number> *>> _off_diag_mats;
94};
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
Base class for MOOSE preconditioners.
Nonlinear system to be solved.
Implements a segregated solve preconditioner.
virtual void setup()
This is called every time the "operator might have changed".
std::vector< unsigned int > _solve_order
Holds the order the blocks are solved for.
virtual void clear()
Release all memory and clear data structures.
static InputParameters validParams()
Constructor.
std::vector< std::vector< libMesh::SparseMatrix< Number > * > > _off_diag_mats
Holds pointers to the off-diagonal matrices.
NonlinearSystemBase & _nl
The nonlinear system this PBP is associated with (convenience reference)
virtual void apply(const NumericVector< Number > &x, NumericVector< Number > &y)
Computes the preconditioned vector "y" based on input "x".
std::vector< libMesh::LinearImplicitSystem * > _systems
List of linear system that build up the preconditioner.
std::vector< std::unique_ptr< libMesh::Preconditioner< Number > > > _preconditioners
Holds one Preconditioner object per small system to solve.
std::vector< libMesh::PreconditionerType > _pre_type
Which preconditioner to use for each solve.
std::vector< std::vector< unsigned int > > _off_diag
Holds which off diagonal blocks to compute.
void addSystem(unsigned int var, std::vector< unsigned int > off_diag, libMesh::PreconditionerType type=libMesh::AMG_PRECOND)
Add a diagonal system + possibly off-diagonals ones as well, also specifying type of preconditioning.
virtual void init()
Initialize data structures if not done so already.
PreconditionerType type() const
PreconditionerType