Flow123d  jenkins-Flow123d-linux-release-multijob-282
Public Types | Public Member Functions | Static Public Attributes | Protected Types | 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 ()
 
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 ()
 
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 Attributes

static Input::Type::AbstractRecord input_type
 

Protected Types

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

Protected Attributes

double r_tol_
 
double a_tol_
 
int max_it_
 
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_
 

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 182 of file la_linsys_new.hh.

Member Typedef Documentation

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

Definition at line 101 of file linsys.hh.

Definition at line 102 of file linsys.hh.

Member Enumeration Documentation

Enumerator
INSERT 
ADD 
ALLOCATE 
DONE 
NONE 

Definition at line 92 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 115 of file linsys.hh.

LinSys::LinSys ( LinSys other)
inline

Copy constructor.

Definition at line 130 of file linsys.hh.

virtual LinSys::~LinSys ( )
inlinevirtual

Definition at line 563 of file linsys.hh.

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 426 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.

LinSys* LinSys::block ( ,
 
)
private
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.

virtual double LinSys::get_absolute_accuracy ( )
inlinevirtual

Returns information on absolute solver accuracy

Reimplemented in LinSys_PETSC.

Definition at line 461 of file linsys.hh.

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 170 of file linsys.hh.

double LinSys::get_relative_accuracy ( )
inline

Returns information on relative solver accuracy

Definition at line 454 of file linsys.hh.

double LinSys::get_residual_norm ( )
inline

Returns norm of the initial right hand side

Definition at line 447 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 186 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 256 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 280 of file linsys.hh.

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 207 of file linsys.hh.

bool LinSys::is_negative_definite ( )
inline

Definition at line 507 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 512 of file linsys.hh.

bool LinSys::is_positive_definite ( )
inline

Definition at line 504 of file linsys.hh.

Here is the caller graph for this function:

bool LinSys::is_preallocated ( )
inline

Definition at line 516 of file linsys.hh.

Here is the caller graph for this function:

bool LinSys::is_rhs_changed ( )
inline

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

Definition at line 213 of file linsys.hh.

bool LinSys::is_spd_via_symmetric_general ( )
inline

Definition at line 532 of file linsys.hh.

bool LinSys::is_symmetric ( )
inline

Definition at line 477 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 324 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 238 of file linsys.hh.

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

Shorcut for assembling just one element into RHS vector.

Definition at line 336 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 247 of file linsys.hh.

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, and LinSys_BDDC.

Definition at line 548 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 220 of file linsys.hh.

void LinSys::set_matrix_changed ( )
inline

Sets matrix changed flag.

Definition at line 195 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 495 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 483 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 229 of file linsys.hh.

void LinSys::set_rhs_changed ( )
inline

Sets rhs changed flag (only for PETSC solvers)

Definition at line 201 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 264 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 526 of file linsys.hh.

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

Provides user knowledge about symmetry.

Definition at line 468 of file linsys.hh.

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 341 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 364 of file linsys.hh.

unsigned int LinSys::size ( )
inline

Returns global system size.

Definition at line 146 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 296 of file linsys.hh.

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 288 of file linsys.hh.

virtual void LinSys::start_insert_assembly ( )
inlinevirtual

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

Reimplemented in LinSys_PETSC.

Definition at line 304 of file linsys.hh.

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 155 of file linsys.hh.

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 540 of file linsys.hh.

Friends And Related Function Documentation

friend class SchurComplement
friend

Definition at line 87 of file linsys.hh.

Member Data Documentation

double LinSys::a_tol_
protected

Definition at line 572 of file linsys.hh.

MPI_Comm LinSys::comm_
protected

Definition at line 575 of file linsys.hh.

ConstraintVec_ LinSys::constraints_
protected

Definition at line 597 of file linsys.hh.

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

global solution in numbering for linear system

Definition at line 599 of file linsys.hh.

Input::Record LinSys::in_rec_
protected

Definition at line 601 of file linsys.hh.

it::AbstractRecord LinSys::input_type
static
Initial value:
= it::AbstractRecord("LinSys", "Linear solver setting.")
.declare_key("r_tol", it::Double(0.0, 1.0), it::Default("1.0e-7"),
"Relative residual tolerance (to initial error).")
.declare_key("max_it", it::Integer(0), it::Default("10000"),
"Maximum number of outer iterations of the linear solver.")

Definition at line 90 of file linsys.hh.

const unsigned LinSys::lsize_
protected

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

Definition at line 578 of file linsys.hh.

bool LinSys::matrix_changed_
protected

true if the matrix was changed since the last solve

Definition at line 588 of file linsys.hh.

int LinSys::max_it_
protected

Definition at line 573 of file linsys.hh.

bool LinSys::negative_definite_
protected

Definition at line 585 of file linsys.hh.

bool LinSys::own_solution_
protected

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

Definition at line 593 of file linsys.hh.

bool LinSys::positive_definite_
protected

Definition at line 584 of file linsys.hh.

double LinSys::r_tol_
protected

Definition at line 571 of file linsys.hh.

double LinSys::residual_norm_
protected

local solution array pointing into Vec solution_

Definition at line 595 of file linsys.hh.

LinSys Vector LinSys::RHS
private

Definition at line 186 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 589 of file linsys.hh.

const Distribution* LinSys::rows_ds_
protected

final distribution of rows of MH matrix

Definition at line 581 of file linsys.hh.

unsigned LinSys::size_
protected

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

Definition at line 579 of file linsys.hh.

Vec LinSys::solution_
protected

PETSc vector constructed with vb array.

Definition at line 591 of file linsys.hh.

bool LinSys::spd_via_symmetric_general_
protected

Definition at line 586 of file linsys.hh.

SetValuesMode LinSys::status_
protected

Set value status of the linear system.

Definition at line 576 of file linsys.hh.

bool LinSys::symmetric_
protected

Definition at line 583 of file linsys.hh.

double* LinSys::v_solution_
protected

local solution array pointing into Vec solution_

Definition at line 592 of file linsys.hh.


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