Flow123d  release_2.2.0-19-g1279b7e
Public Types | Public Member Functions | Static Public Member Functions | Protected Types | Protected Attributes | Static Protected Attributes | Private Member Functions | Private Attributes | Friends | List of all members
LinSys Class Referenceabstract

Abstract linear system class. More...

#include <la_linsys_new.hh>

Inheritance diagram for LinSys:
Inheritance graph
[legend]
Collaboration diagram for LinSys:
Collaboration graph
[legend]

Public Types

enum  SetValuesMode {
  INSERT =INSERT_VALUES, ADD =ADD_VALUES, ALLOCATE, DONE,
  NONE
}
 

Public Member Functions

 LinSys (const Distribution *rows_ds)
 
 LinSys (LinSys &other)
 
unsigned int size ()
 
unsigned int vec_lsize ()
 
virtual const Mat * get_matrix ()
 
virtual const Vec * get_rhs ()
 
void set_matrix_changed ()
 
void set_rhs_changed ()
 
virtual void set_tolerances (double r_tol, double a_tol, unsigned int max_it)=0
 
bool is_matrix_changed ()
 
bool is_rhs_changed ()
 
virtual PetscErrorCode set_matrix (Mat &matrix, MatStructure str)
 
virtual PetscErrorCode set_rhs (Vec &rhs)
 
virtual PetscErrorCode mat_zero_entries ()
 
virtual PetscErrorCode rhs_zero_entries ()
 
const Vec & get_solution ()
 
void set_solution (double *sol_array)
 
double * get_solution_array ()
 
virtual void start_allocation ()
 
virtual void start_add_assembly ()
 
virtual void start_insert_assembly ()
 
virtual void finish_assembly ()=0
 
virtual void mat_set_values (int nrow, int *rows, int ncol, int *cols, double *vals)=0
 
void mat_set_value (int row, int col, double val)
 
virtual void rhs_set_values (int nrow, int *rows, double *vals)=0
 
void rhs_set_value (int row, double val)
 
void set_values (int nrow, int *rows, int ncol, int *cols, PetscScalar *mat_vals, PetscScalar *rhs_vals)
 Set values in the system matrix and values in the right-hand side vector on corresponding rows. More...
 
void set_values (std::vector< int > &row_dofs, std::vector< int > &col_dofs, const arma::mat &matrix, const arma::vec &rhs, const arma::vec &row_solution, const arma::vec &col_solution)
 
void add_constraint (int row, double value)
 
virtual void apply_constrains (double scalar)=0
 
virtual int solve ()=0
 
double get_residual_norm ()
 
virtual double compute_residual ()=0
 
double get_relative_accuracy ()
 
virtual double get_absolute_accuracy ()
 
void set_symmetric (bool flag=true)
 
bool is_symmetric ()
 
void set_positive_definite (bool flag=true)
 
void set_negative_definite (bool flag=true)
 
bool is_positive_definite ()
 
bool is_negative_definite ()
 
bool is_new ()
 
bool is_preallocated ()
 
void set_spd_via_symmetric_general (bool flag=true)
 
bool is_spd_via_symmetric_general ()
 
virtual void view ()
 
virtual void set_from_input (const Input::Record in_rec)
 
virtual double get_solution_precision ()=0
 
virtual ~LinSys ()
 

Static Public Member Functions

static Input::Type::Abstractget_input_type ()
 

Protected Types

typedef std::pair< unsigned, double > Constraint_
 
typedef std::vector< Constraint_ConstraintVec_
 

Protected Attributes

double r_tol_
 relative tolerance of linear solver More...
 
double a_tol_
 absolute tolerance of linear solver More...
 
unsigned int max_it_
 maximum number of iterations of linear solver More...
 
MPI_Comm comm_
 
SetValuesMode status_
 Set value status of the linear system. More...
 
const unsigned lsize_
 local number of matrix rows (non-overlapping division of rows) More...
 
unsigned size_
 global number of matrix rows, i.e. problem size More...
 
const Distributionrows_ds_
 final distribution of rows of MH matrix More...
 
bool symmetric_
 
bool positive_definite_
 
bool negative_definite_
 
bool spd_via_symmetric_general_
 
bool matrix_changed_
 true if the matrix was changed since the last solve More...
 
bool rhs_changed_
 true if the right hand side was changed since the last solve More...
 
Vec solution_
 PETSc vector constructed with vb array. More...
 
double * v_solution_
 local solution array pointing into Vec solution_ More...
 
bool own_solution_
 Indicates if the solution array has been allocated by this class. More...
 
double residual_norm_
 local solution array pointing into Vec solution_ More...
 
ConstraintVec_ constraints_
 
std::vector< double > globalSolution_
 global solution in numbering for linear system More...
 
Input::Record in_rec_
 

Static Protected Attributes

static constexpr double default_r_tol_ = 1e-7
 
static constexpr double default_a_tol_ = 1e-11
 
static constexpr unsigned int default_max_it_ = 1000
 

Private Member Functions

LinSysblock (i, j) MatrixArray *matrix() virtual solve(Vector solution
 

Private Attributes

LinSys Vector RHS
 

Friends

class SchurComplement
 

Detailed Description

Abstract linear system class.

LinSys - matrix and a particular way how to compute solution for given RHS, i.e. this class can perform action of the matrix inverse

This is abstract class for members of possible hierarchical tree of the whole system.

Linear system consists of Matrix, RHS and solution. It provides general methods for:

Method operates on the system as single object. But some methods for matrix only manipulation can be provided until we have matrix as separate class.

TODO:

Definition at line 169 of file la_linsys_new.hh.

Member Typedef Documentation

typedef std::pair<unsigned,double> LinSys::Constraint_
protected

Definition at line 89 of file linsys.hh.

Definition at line 90 of file linsys.hh.

Member Enumeration Documentation

Enumerator
INSERT 
ADD 
ALLOCATE 
DONE 
NONE 

Definition at line 80 of file linsys.hh.

Constructor & Destructor Documentation

LinSys::LinSys ( const Distribution rows_ds)
inline

Constructor. Constructor of abstract class should not be called directly, but is used for initialization of member common to all particular solvers.

Parameters
comm- MPI communicator

TODO: Vector solution_ is now initialized to NULL, but it should be rather allocated in the constructor instead of the method set_solution().

Definition at line 103 of file linsys.hh.

Here is the caller graph for this function:

LinSys::LinSys ( LinSys other)
inline

Copy constructor.

Definition at line 122 of file linsys.hh.

virtual LinSys::~LinSys ( )
inlinevirtual

Definition at line 565 of file linsys.hh.

Here is the caller graph for this function:

Member Function Documentation

void LinSys::add_constraint ( int  row,
double  value 
)
inline

Adds Dirichlet constrain.

Parameters
row- global number of row that should be eliminated.
value- solution value at the given row

Definition at line 427 of file linsys.hh.

virtual void LinSys::apply_constrains ( double  scalar)
pure virtual

Apply constrains to assembled matrix. Constrains are given by pairs: global row index, value. i.e. typedef pair<unsigned int, double> Constrain;

What is th meaning of ( const double factor ) form Cambridge code?

Implemented in LinSys_PETSC, and LinSys_BDDC.

Here is the caller graph for this function:

LinSys* LinSys::block ( ,
 
)
private
virtual double LinSys::compute_residual ( )
pure virtual

Explicitly compute residual and its norm for current solution.

Implemented in LinSys_PETSC, SchurComplement, and LinSys_BDDC.

Here is the caller graph for this function:

virtual void LinSys::finish_assembly ( )
pure virtual

Finish assembly of the whole system. For PETSC this should call MatEndAssembly with MAT_FINAL_ASSEMBLY

Implemented in LinSys_PETSC, and LinSys_BDDC.

Here is the caller graph for this function:

virtual double LinSys::get_absolute_accuracy ( )
inlinevirtual

Returns information on absolute solver accuracy

Reimplemented in LinSys_PETSC.

Definition at line 467 of file linsys.hh.

it::Abstract & LinSys::get_input_type ( )
static

Definition at line 29 of file linsys.cc.

Here is the caller graph for this function:

virtual const Mat* LinSys::get_matrix ( )
inlinevirtual

Returns PETSC matrix (only for PETSC solvers)

If matrix is changed, method set_matrix_changed() must be called. Example: MatDiagonalSet(schur->get_matrix(), new_diagonal, ADD_VALUES); schur->set_matrix_changed();

Reimplemented in LinSys_PETSC.

Definition at line 162 of file linsys.hh.

double LinSys::get_relative_accuracy ( )
inline

Returns information on relative solver accuracy

Definition at line 460 of file linsys.hh.

double LinSys::get_residual_norm ( )
inline

Returns norm of the initial right hand side

Definition at line 448 of file linsys.hh.

virtual const Vec* LinSys::get_rhs ( )
inlinevirtual

Returns RHS vector (only for PETSC solvers)

If vector is changed, method set_rhs_changed() must be called. Example: VecScale(schur->get_rhs(), -1.0); schur->set_rhs_changed();

Reimplemented in LinSys_PETSC.

Definition at line 178 of file linsys.hh.

const Vec& LinSys::get_solution ( )
inline

Returns PETSC vector with solution. Underlying array can be provided on construction.

Definition at line 257 of file linsys.hh.

Here is the caller graph for this function:

double* LinSys::get_solution_array ( )
inline

Returns PETSC subarray with solution. Underlying array can be provided on construction.

Definition at line 281 of file linsys.hh.

Here is the caller graph for this function:

virtual double LinSys::get_solution_precision ( )
pure virtual

Get precision of solving

Implemented in LinSys_PETSC, SchurComplement, and LinSys_BDDC.

Here is the caller graph for this function:

bool LinSys::is_matrix_changed ( )
inline

Returns true if the system matrix has changed since the last solve.

Definition at line 208 of file linsys.hh.

bool LinSys::is_negative_definite ( )
inline

Definition at line 513 of file linsys.hh.

Here is the caller graph for this function:

bool LinSys::is_new ( )
inline

TODO: In fact we want to know if the matrix is already preallocated However to do this we need explicit finalisation of preallocating cycle.

Definition at line 518 of file linsys.hh.

bool LinSys::is_positive_definite ( )
inline

Definition at line 510 of file linsys.hh.

Here is the caller graph for this function:

bool LinSys::is_preallocated ( )
inline

Definition at line 522 of file linsys.hh.

bool LinSys::is_rhs_changed ( )
inline

Returns true if the system RHS has changed since the last solve.

Definition at line 214 of file linsys.hh.

bool LinSys::is_spd_via_symmetric_general ( )
inline

Definition at line 538 of file linsys.hh.

bool LinSys::is_symmetric ( )
inline

Definition at line 483 of file linsys.hh.

void LinSys::mat_set_value ( int  row,
int  col,
double  val 
)
inline

Shortcut for assembling just one element into the matrix. Similarly we can provide method accepting armadillo matrices.

Definition at line 325 of file linsys.hh.

Here is the caller graph for this function:

virtual void LinSys::mat_set_values ( int  nrow,
int *  rows,
int  ncol,
int *  cols,
double *  vals 
)
pure virtual

Assembly full rectangular submatrix into the system matrix. Should be virtual, implemented differently in particular solvers.

Implemented in LinSys_PETSC, and LinSys_BDDC.

Here is the caller graph for this function:

virtual PetscErrorCode LinSys::mat_zero_entries ( )
inlinevirtual

Clears entries of the matrix

Reimplemented in LinSys_PETSC, and LinSys_BDDC.

Definition at line 239 of file linsys.hh.

Here is the caller graph for this function:

void LinSys::rhs_set_value ( int  row,
double  val 
)
inline

Shorcut for assembling just one element into RHS vector.

Definition at line 337 of file linsys.hh.

Here is the caller graph for this function:

virtual void LinSys::rhs_set_values ( int  nrow,
int *  rows,
double *  vals 
)
pure virtual

Set values of the system right-hand side. Should be virtual, implemented differently in particular solvers.

Implemented in LinSys_PETSC, and LinSys_BDDC.

Here is the caller graph for this function:

virtual PetscErrorCode LinSys::rhs_zero_entries ( )
inlinevirtual

Clears entries of the right-hand side

Reimplemented in LinSys_PETSC, and LinSys_BDDC.

Definition at line 248 of file linsys.hh.

Here is the caller graph for this function:

virtual void LinSys::set_from_input ( const Input::Record  in_rec)
inlinevirtual

Sets basic parameters of LinSys defined by user in input file and used to calculate

Reimplemented in LinSys_PETSC, SchurComplement, and LinSys_BDDC.

Definition at line 554 of file linsys.hh.

Here is the caller graph for this function:

virtual PetscErrorCode LinSys::set_matrix ( Mat &  matrix,
MatStructure  str 
)
inlinevirtual

Sets PETSC matrix (only for PETSC solvers)

Reimplemented in LinSys_PETSC.

Definition at line 221 of file linsys.hh.

Here is the caller graph for this function:

void LinSys::set_matrix_changed ( )
inline

Sets matrix changed flag.

Definition at line 187 of file linsys.hh.

Here is the caller graph for this function:

void LinSys::set_negative_definite ( bool  flag = true)
inline

Provides user knowledge about negative definiteness.

Definition at line 501 of file linsys.hh.

Here is the caller graph for this function:

void LinSys::set_positive_definite ( bool  flag = true)
inline

Provides user knowledge about positive definiteness.

Definition at line 489 of file linsys.hh.

Here is the caller graph for this function:

virtual PetscErrorCode LinSys::set_rhs ( Vec &  rhs)
inlinevirtual

Sets RHS vector (only for PETSC solvers)

Reimplemented in LinSys_PETSC.

Definition at line 230 of file linsys.hh.

Here is the caller graph for this function:

void LinSys::set_rhs_changed ( )
inline

Sets rhs changed flag (only for PETSC solvers)

Definition at line 193 of file linsys.hh.

Here is the caller graph for this function:

void LinSys::set_solution ( double *  sol_array)
inline

Create PETSc solution

Definition at line 265 of file linsys.hh.

Here is the caller graph for this function:

void LinSys::set_spd_via_symmetric_general ( bool  flag = true)
inline

Provides user knowledge about positive definiteness via symmetric general approach. This is useful for solving Darcy flow by mixed hybrid method, where blocks on subdomains are saddle point but interface among subdomains is only at the block of Lagrange multipliers and is symmetric positive definite. Problem condensed to interface can thus be solved by PCG method, although original problem is saddle point.

Definition at line 532 of file linsys.hh.

void LinSys::set_symmetric ( bool  flag = true)
inline

Provides user knowledge about symmetry.

Definition at line 474 of file linsys.hh.

Here is the caller graph for this function:

virtual void LinSys::set_tolerances ( double  r_tol,
double  a_tol,
unsigned int  max_it 
)
pure virtual

Set relative tolerance, absolute tolerance, and maximum number of iterations of the linear solver.

For each of these three parameters we first look for the value at user input if not set we use the value provided to this method and finally the default values are set by the call of this method in the constructor.

Implemented in SchurComplement, LinSys_BDDC, and LinSys_PETSC.

Here is the caller graph for this function:

void LinSys::set_values ( int  nrow,
int *  rows,
int  ncol,
int *  cols,
PetscScalar *  mat_vals,
PetscScalar *  rhs_vals 
)
inline

Set values in the system matrix and values in the right-hand side vector on corresponding rows.

Definition at line 342 of file linsys.hh.

Here is the caller graph for this function:

void LinSys::set_values ( std::vector< int > &  row_dofs,
std::vector< int > &  col_dofs,
const arma::mat &  matrix,
const arma::vec &  rhs,
const arma::vec &  row_solution,
const arma::vec &  col_solution 
)
inline

Shortcut to assembly into matrix and RHS in one call, possibly apply Dirichlet boundary conditions. row_dofs - are global indices of rows of dense matrix and rows of dense vector in global system col_dofs - are global indices of columns of the matrix, and possibly

Application of Dirichlet conditions: 1) Rows with negative dofs are set to zero. 2) Cols with negative dofs are eliminated. 3) If there are entries on global diagonal. We determine value K either from diagonal of local matrix, or (if it is zero) from diagonal average.

Caveats:

  • can not set dirichlet condition on zero dof
  • Armadillo stores matrix in column first form (Fortran like) which makes it not well suited for passing local matrices.

Definition at line 365 of file linsys.hh.

unsigned int LinSys::size ( )
inline

Returns global system size.

Definition at line 138 of file linsys.hh.

virtual int LinSys::solve ( )
pure virtual

Solve the system and return convergence reason.

Implemented in SchurComplement, LinSys_PETSC, and LinSys_BDDC.

Here is the caller graph for this function:

virtual void LinSys::start_add_assembly ( )
inlinevirtual

Switch linear system into adding assembly. (the only one supported by triplets ??)

Reimplemented in LinSys_PETSC.

Definition at line 297 of file linsys.hh.

Here is the caller graph for this function:

virtual void LinSys::start_allocation ( )
inlinevirtual

Switch linear system into allocating assembly. (only for PETSC_MPIAIJ_preallocate_by_assembly)

Reimplemented in LinSys_PETSC.

Definition at line 289 of file linsys.hh.

Here is the caller graph for this function:

virtual void LinSys::start_insert_assembly ( )
inlinevirtual

Switch linear system into insert assembly. (not currently used)

Reimplemented in LinSys_PETSC.

Definition at line 305 of file linsys.hh.

Here is the caller graph for this function:

unsigned int LinSys::vec_lsize ( )
inline

Returns local system size. (for partitioning of solution vectors) for PETSC_MPIAIJ it is also partitioning of the matrix

Definition at line 147 of file linsys.hh.

Here is the caller graph for this function:

virtual void LinSys::view ( )
inlinevirtual

Output the system in the Matlab format possibly with given ordering. Rather we shoud provide output operator <<, since it is more flexible.

Reimplemented in LinSys_PETSC.

Definition at line 546 of file linsys.hh.

Here is the caller graph for this function:

Friends And Related Function Documentation

friend class SchurComplement
friend

Definition at line 75 of file linsys.hh.

Member Data Documentation

double LinSys::a_tol_
protected

absolute tolerance of linear solver

Definition at line 579 of file linsys.hh.

MPI_Comm LinSys::comm_
protected

Definition at line 582 of file linsys.hh.

ConstraintVec_ LinSys::constraints_
protected

Definition at line 604 of file linsys.hh.

constexpr double LinSys::default_a_tol_ = 1e-11
staticprotected

Definition at line 575 of file linsys.hh.

constexpr unsigned int LinSys::default_max_it_ = 1000
staticprotected

Definition at line 576 of file linsys.hh.

constexpr double LinSys::default_r_tol_ = 1e-7
staticprotected

Definition at line 574 of file linsys.hh.

std::vector<double> LinSys::globalSolution_
protected

global solution in numbering for linear system

Definition at line 606 of file linsys.hh.

Input::Record LinSys::in_rec_
protected

Definition at line 608 of file linsys.hh.

const unsigned LinSys::lsize_
protected

local number of matrix rows (non-overlapping division of rows)

Definition at line 585 of file linsys.hh.

bool LinSys::matrix_changed_
protected

true if the matrix was changed since the last solve

Definition at line 595 of file linsys.hh.

unsigned int LinSys::max_it_
protected

maximum number of iterations of linear solver

Definition at line 580 of file linsys.hh.

bool LinSys::negative_definite_
protected

Definition at line 592 of file linsys.hh.

bool LinSys::own_solution_
protected

Indicates if the solution array has been allocated by this class.

Definition at line 600 of file linsys.hh.

bool LinSys::positive_definite_
protected

Definition at line 591 of file linsys.hh.

double LinSys::r_tol_
protected

relative tolerance of linear solver

Definition at line 578 of file linsys.hh.

double LinSys::residual_norm_
protected

local solution array pointing into Vec solution_

Definition at line 602 of file linsys.hh.

LinSys Vector LinSys::RHS
private

Definition at line 173 of file la_linsys_new.hh.

bool LinSys::rhs_changed_
protected

true if the right hand side was changed since the last solve

Definition at line 596 of file linsys.hh.

const Distribution* LinSys::rows_ds_
protected

final distribution of rows of MH matrix

Definition at line 588 of file linsys.hh.

unsigned LinSys::size_
protected

global number of matrix rows, i.e. problem size

Definition at line 586 of file linsys.hh.

Vec LinSys::solution_
protected

PETSc vector constructed with vb array.

Definition at line 598 of file linsys.hh.

bool LinSys::spd_via_symmetric_general_
protected

Definition at line 593 of file linsys.hh.

SetValuesMode LinSys::status_
protected

Set value status of the linear system.

Definition at line 583 of file linsys.hh.

bool LinSys::symmetric_
protected

Definition at line 590 of file linsys.hh.

double* LinSys::v_solution_
protected

local solution array pointing into Vec solution_

Definition at line 599 of file linsys.hh.


The documentation for this class was generated from the following files: