cantera/include/cantera/numerics/GeneralMatrix.h
2017-02-12 19:22:33 -05:00

191 lines
6 KiB
C++

/**
* @file GeneralMatrix.h
* Declarations for the class GeneralMatrix which is a virtual base class for matrices handled by solvers
* (see class \ref numerics and \link Cantera::GeneralMatrix GeneralMatrix\endlink).
*/
// This file is part of Cantera. See License.txt in the top-level directory or
// at http://www.cantera.org/license.txt for license and copyright information.
#ifndef CT_GENERALMATRIX_H
#define CT_GENERALMATRIX_H
#include "cantera/base/ct_defs.h"
#include "cantera/base/ctexceptions.h"
#include "cantera/base/global.h"
namespace Cantera
{
//! Generic matrix
class GeneralMatrix
{
public:
//! Base Constructor
GeneralMatrix() : m_factored(false) {}
virtual ~GeneralMatrix() {}
//! Zero the matrix elements
virtual void zero() = 0;
//! Multiply A*b and write result to prod.
/*!
* @param b Vector to do the rh multiplication
* @param prod OUTPUT vector to receive the result
*/
virtual void mult(const doublereal* b, doublereal* prod) const = 0;
//! Multiply b*A and write result to prod.
/*!
* @param b Vector to do the lh multiplication
* @param prod OUTPUT vector to receive the result
*/
virtual void leftMult(const doublereal* const b, doublereal* const prod) const = 0;
//! Factors the A matrix, overwriting A.
/*!
* We flip m_factored boolean to indicate that the matrix is now A-1.
*/
virtual int factor() = 0;
//! Factors the A matrix using the QR algorithm, overwriting A
/*!
* we set m_factored to 2 to indicate the matrix is now QR factored
*
* @returns the info variable from LAPACK
*/
virtual int factorQR() {
throw NotImplementedError("GeneralMatrix::factorQR");
}
//! Returns an estimate of the inverse of the condition number for the matrix
/*!
* The matrix must have been previously factored using the QR algorithm
*
* @returns the inverse of the condition number
*/
virtual doublereal rcondQR() {
throw NotImplementedError("GeneralMatrix::rcondQR");
}
//! Returns an estimate of the inverse of the condition number for the matrix
/*!
* The matrix must have been previously factored using the LU algorithm
*
* @param a1norm Norm of the matrix
* @returns the inverse of the condition number
*/
virtual doublereal rcond(doublereal a1norm) = 0;
//! Change the way the matrix is factored
/*!
* @param fAlgorithm integer
* 0 LU factorization
* 1 QR factorization
*/
virtual void useFactorAlgorithm(int fAlgorithm) {
throw NotImplementedError("GeneralMatrix::useFactorAlgorithm");
};
//! Return the factor algorithm used
virtual int factorAlgorithm() const = 0;
//! Calculate the one norm of the matrix
virtual doublereal oneNorm() const = 0;
//! Return the number of rows in the matrix
virtual size_t nRows() const = 0;
//! clear the factored flag
virtual void clearFactorFlag() {
m_factored = 0;
};
//! Solves the Ax = b system returning x in the b spot.
/*!
* @param b Vector for the RHS of the equation system
* @param nrhs Number of right-hand sides to solve, default 1
* @param ldb Leading dimension of the right-hand side array. Defaults to
* nRows()
*/
virtual int solve(doublereal* b, size_t nrhs=1, size_t ldb=0) = 0;
//! true if the current factorization is up to date with the matrix
virtual bool factored() const {
return (m_factored != 0);
}
//! Return a pointer to the top of column j, columns are assumed to be
//! contiguous in memory
/*!
* @param j Value of the column
* @returns a pointer to the top of the column
*/
virtual doublereal* ptrColumn(size_t j) = 0;
//! Index into the (i,j) element
/*!
* @param i row
* @param j column
* @returns a changeable reference to the matrix entry
*/
virtual doublereal& operator()(size_t i, size_t j) = 0;
//! Constant Index into the (i,j) element
/*!
* @param i row
* @param j column
* @returns an unchangeable reference to the matrix entry
*/
virtual doublereal operator()(size_t i, size_t j) const = 0;
//! Return an iterator pointing to the first element
/*!
* We might drop this later
*/
virtual vector_fp::iterator begin() = 0;
//! Return a const iterator pointing to the first element
/*!
* We might drop this later
*/
virtual vector_fp::const_iterator begin() const = 0;
//! Return a vector of const pointers to the columns
/*!
* Note the value of the pointers are protected by their being const.
* However, the value of the matrix is open to being changed.
*
* @returns a vector of pointers to the top of the columns of the matrices.
*/
virtual doublereal* const* colPts() = 0;
//! Check to see if we have any zero rows in the Jacobian
/*!
* This utility routine checks to see if any rows are zero. The smallest row
* is returned along with the largest coefficient in that row
*
* @param valueSmall OUTPUT value of the largest coefficient in the smallest row
* @return index of the row that is most nearly zero
*/
virtual size_t checkRows(doublereal& valueSmall) const = 0;
//! Check to see if we have any zero columns in the Jacobian
/*!
* This utility routine checks to see if any columns are zero. The smallest
* column is returned along with the largest coefficient in that column
*
* @param valueSmall OUTPUT value of the largest coefficient in the smallest column
* @return index of the column that is most nearly zero
*/
virtual size_t checkColumns(doublereal& valueSmall) const = 0;
protected:
//! Indicates whether the matrix is factored. 0 for unfactored; Non-zero
//! values indicate a particular factorization (LU=1, QR=2).
int m_factored;
};
}
#endif