10#ifndef _TEUCHOS_SERIALBANDDENSESOLVER_HPP_ 
   11#define _TEUCHOS_SERIALBANDDENSESOLVER_HPP_ 
   27#ifdef HAVE_TEUCHOSNUMERICS_EIGEN 
  133  template<
typename OrdinalType, 
typename ScalarType>
 
  135                                public LAPACK<OrdinalType, ScalarType>
 
  141#ifdef HAVE_TEUCHOSNUMERICS_EIGEN 
  142    typedef typename Eigen::Matrix<ScalarType,Eigen::Dynamic,Eigen::Dynamic,Eigen::ColMajor> 
EigenMatrix;
 
  143    typedef typename Eigen::internal::BandMatrix<ScalarType,Eigen::Dynamic,Eigen::Dynamic,Eigen::ColMajor> 
EigenBandMatrix;
 
  144    typedef typename Eigen::Matrix<ScalarType,Eigen::Dynamic,1> 
EigenVector;
 
  147    typedef typename Eigen::Map<EigenVector,0,EigenInnerStride > 
EigenVectorMap;
 
  149    typedef typename Eigen::Map<EigenMatrix,0,EigenOuterStride > 
EigenMatrixMap;
 
  151    typedef typename Eigen::PermutationMatrix<Eigen::Dynamic,Eigen::Dynamic,OrdinalType> 
EigenPermutationMatrix;
 
  154    typedef typename Eigen::Array<ScalarType,Eigen::Dynamic,1> 
EigenScalarArray;
 
  322    std::vector<OrdinalType> 
IPIV()
  const {
return(IPIV_);}
 
  325    MagnitudeType 
ANORM()
  const {
return(ANORM_);}
 
  328    MagnitudeType 
RCOND()
  const {
return(RCOND_);}
 
  333    MagnitudeType 
ROWCND()
  const {
return(ROWCND_);}
 
  338    MagnitudeType 
COLCND()
  const {
return(COLCND_);}
 
  341    MagnitudeType 
AMAX()
  const {
return(AMAX_);}
 
  344    std::vector<MagnitudeType> 
FERR()
  const {
return(FERR_);}
 
  347    std::vector<MagnitudeType> 
BERR()
  const {
return(BERR_);}
 
  350    std::vector<MagnitudeType> 
R()
  const {
return(R_);}
 
  353    std::vector<MagnitudeType> 
C()
  const {
return(C_);}
 
  359    void Print(std::ostream& os) 
const;
 
  363    void allocateWORK() { LWORK_ = 3*N_; WORK_.resize( LWORK_ ); 
return;}
 
  369    bool shouldEquilibrate_;
 
  374    bool estimateSolutionErrors_;
 
  375    bool solutionErrorsEstimated_;
 
  377    bool reciprocalConditionEstimated_;
 
  378    bool refineSolution_;
 
  379    bool solutionRefined_;
 
  393    std::vector<OrdinalType> IPIV_;
 
  394    std::vector<int> IWORK_;
 
  396    MagnitudeType ANORM_;
 
  397    MagnitudeType RCOND_;
 
  398    MagnitudeType ROWCND_;
 
  399    MagnitudeType COLCND_;
 
  402    RCP<SerialBandDenseMatrix<OrdinalType, ScalarType> > Matrix_;
 
  403    RCP<SerialDenseMatrix<OrdinalType, ScalarType> > LHS_;
 
  404    RCP<SerialDenseMatrix<OrdinalType, ScalarType> > RHS_;
 
  405    RCP<SerialBandDenseMatrix<OrdinalType, ScalarType> > Factor_;
 
  409    std::vector<MagnitudeType> FERR_;
 
  410    std::vector<MagnitudeType> BERR_;
 
  411    std::vector<ScalarType> WORK_;
 
  412    std::vector<MagnitudeType> R_;
 
  413    std::vector<MagnitudeType> C_;
 
  414#ifdef HAVE_TEUCHOSNUMERICS_EIGEN 
  415    Eigen::PartialPivLU<EigenMatrix> lu_;
 
 
  431template<
typename OrdinalType, 
typename ScalarType>
 
  435    shouldEquilibrate_(
false),
 
  436    equilibratedA_(
false),
 
  437    equilibratedB_(
false),
 
  440    estimateSolutionErrors_(
false),
 
  441    solutionErrorsEstimated_(
false),
 
  443    reciprocalConditionEstimated_(
false),
 
  444    refineSolution_(
false),
 
  445    solutionRefined_(
false),
 
 
  468template<
typename OrdinalType, 
typename ScalarType>
 
  474template<
typename OrdinalType, 
typename ScalarType>
 
  477  LHS_ = Teuchos::null;
 
  478  RHS_ = Teuchos::null;
 
  479  reciprocalConditionEstimated_ = 
false;
 
  480  solutionRefined_ = 
false;
 
  482  solutionErrorsEstimated_ = 
false;
 
  483  equilibratedB_ = 
false;
 
  487template<
typename OrdinalType, 
typename ScalarType>
 
  488void SerialBandDenseSolver<OrdinalType,ScalarType>::resetMatrix()
 
  491  equilibratedA_ = 
false;
 
  513template<
typename OrdinalType, 
typename ScalarType>
 
  524                     "SerialBandDenseSolver<T>::setMatrix: A is an empty SerialBandDenseMatrix<T>!");
 
  533  Min_MN_ = TEUCHOS_MIN(M_,N_);
 
 
  543template<
typename OrdinalType, 
typename ScalarType>
 
  549                     "SerialBandDenseSolver<T>::setVectors: X and B are not the same size!");
 
  551                     "SerialBandDenseSolver<T>::setVectors: B is an empty SerialDenseMatrix<T>!");
 
  553                     "SerialBandDenseSolver<T>::setVectors: X is an empty SerialDenseMatrix<T>!");
 
  555                     "SerialBandDenseSolver<T>::setVectors: B has an invalid stride!");
 
  557                     "SerialBandDenseSolver<T>::setVectors: X has an invalid stride!");
 
 
  566template<
typename OrdinalType, 
typename ScalarType>
 
  569  estimateSolutionErrors_ = 
flag;
 
  572  refineSolution_ = refineSolution_ || 
flag;
 
 
  576template<
typename OrdinalType, 
typename ScalarType>
 
  579  if (factored()) 
return(0); 
 
  581  ANORM_ = Matrix_->normOne(); 
 
  587    if (refineSolution_ ) {
 
  589      AF_ = Factor_->values();
 
  590      LDAF_ = Factor_->stride();
 
  594  if (equilibrate_) 
ierr = equilibrateMatrix();
 
  598  if (IPIV_.size()==0) IPIV_.resize( N_ ); 
 
  602#ifdef HAVE_TEUCHOSNUMERICS_EIGEN 
  606    for (
OrdinalType i=TEUCHOS_MAX(0,
j-KU_); 
i<=TEUCHOS_MIN(M_-1, 
j+KL_); 
i++) {
 
  616  p = 
lu_.permutationP();
 
  624  this->GBTRF(M_, N_, KL_, KU_, AF_, LDAF_, &IPIV_[0], &INFO_);
 
 
  634template<
typename OrdinalType, 
typename ScalarType>
 
  644    ierr = equilibrateRHS();
 
  649                     "SerialBandDenseSolver<T>::solve: No right-hand side vector (RHS) has been set for the linear system!");
 
  651                     "SerialBandDenseSolver<T>::solve: No solution vector (LHS) has been set for the linear system!");
 
  653  if (!factored()) factor(); 
 
  656                     std::logic_error, 
"SerialBandDenseSolver<T>::solve: Matrix and vectors must be similarly scaled!");
 
  658  if (shouldEquilibrate() && !equilibratedA_)
 
  659    std::cout << 
"WARNING!  SerialBandDenseSolver<T>::solve: System should be equilibrated!" << std::endl;
 
  661  if (RHS_->values()!=LHS_->values()) {
 
  666#ifdef HAVE_TEUCHOSNUMERICS_EIGEN 
  683  this->GBTRS(ETranspChar[TRANS_], N_, KL_, KU_, RHS_->numCols(), AF_, LDAF_, &IPIV_[0], LHS_->values(), LHS_->stride(), &INFO_);
 
  686  if (INFO_!=0) 
return(INFO_);
 
  690  if (refineSolution_) 
ierr1 = applyRefinement();
 
  694  if (equilibrate_) 
ierr1 = unequilibrateLHS();
 
 
  700template<
typename OrdinalType, 
typename ScalarType>
 
  704                     "SerialBandDenseSolver<T>::applyRefinement: Must have an existing solution!");
 
  706                     "SerialBandDenseSolver<T>::applyRefinement: Cannot apply refinement if no original copy of A!");
 
  708#ifdef HAVE_TEUCHOSNUMERICS_EIGEN 
  714  FERR_.resize( 
NRHS );
 
  715  BERR_.resize( 
NRHS );
 
  719  std::vector<typename details::lapack_traits<ScalarType>::iwork_type> 
GBRFS_WORK( N_ );
 
  720  this->GBRFS(ETranspChar[TRANS_], N_, KL_, KU_, 
NRHS, A_+KL_, LDA_, AF_, LDAF_, &IPIV_[0],
 
  721              RHS_->values(), RHS_->stride(), LHS_->values(), LHS_->stride(),
 
  722              &FERR_[0], &BERR_[0], &WORK_[0], &
GBRFS_WORK[0], &INFO_);
 
  724  solutionErrorsEstimated_ = 
true;
 
  725  reciprocalConditionEstimated_ = 
true;
 
  726  solutionRefined_ = 
true;
 
 
  734template<
typename OrdinalType, 
typename ScalarType>
 
  737  if (R_.size()!=0) 
return(0); 
 
  743  this->GBEQU (M_, N_, KL_, KU_, AF_+KL_, LDAF_, &R_[0], &C_[0], &ROWCND_, &COLCND_, &AMAX_, &INFO_);
 
  748    shouldEquilibrate_ = 
true;
 
 
  755template<
typename OrdinalType, 
typename ScalarType>
 
  761  if (equilibratedA_) 
return(0); 
 
  762  if (R_.size()==0) 
ierr = computeEquilibrateScaling(); 
 
  768    for (
j=0; 
j<N_; 
j++) {
 
  769      ptr = A_ + KL_ + 
j*LDA_ + TEUCHOS_MAX(KU_-
j, 0);
 
  771      for (
i=TEUCHOS_MAX(0,
j-KU_); 
i<=TEUCHOS_MIN(M_-1,
j+KL_); 
i++) {
 
  781    for (
j=0; 
j<N_; 
j++) {
 
  782      ptr = A_ + KL_ + 
j*LDA_ + TEUCHOS_MAX(KU_-
j, 0);
 
  784      for (
i=TEUCHOS_MAX(0,
j-KU_); 
i<=TEUCHOS_MIN(M_-1,
j+KL_); 
i++) {
 
  789    for (
j=0; 
j<N_; 
j++) {
 
  790      ptrU = AF_ + 
j*LDAF_ + TEUCHOS_MAX(KL_+KU_-
j, 0);
 
  791      ptrL = AF_ + KL_ + KU_ + 1 + 
j*LDAF_;
 
  793      for (
i=TEUCHOS_MAX(0,
j-(KL_+KU_)); 
i<=TEUCHOS_MIN(M_-1,
j); 
i++) {
 
  797      for (
i=TEUCHOS_MAX(0,
j); 
i<=TEUCHOS_MIN(M_-1,
j+KL_); 
i++) {
 
  804  equilibratedA_ = 
true;
 
 
  811template<
typename OrdinalType, 
typename ScalarType>
 
  817  if (equilibratedB_) 
return(0); 
 
  818  if (R_.size()==0) 
ierr = computeEquilibrateScaling(); 
 
  821  MagnitudeType * 
R_tmp = &R_[0];
 
  822  if (transpose_) 
R_tmp = &C_[0];
 
  829    for (
i=0; 
i<M_; 
i++) {
 
  835  equilibratedB_ = 
true;
 
 
  843template<
typename OrdinalType, 
typename ScalarType>
 
  848  if (!equilibratedB_) 
return(0); 
 
  850  MagnitudeType * 
C_tmp = &C_[0];
 
  851  if (transpose_) 
C_tmp = &R_[0];
 
  858    for (
i=0; 
i<N_; 
i++) {
 
 
  869template<
typename OrdinalType, 
typename ScalarType>
 
  872#ifdef HAVE_TEUCHOSNUMERICS_EIGEN 
  877  if (reciprocalConditionEstimated()) {
 
  885  if (!factored()) 
ierr = factor(); 
 
  892  std::vector<typename details::lapack_traits<ScalarType>::iwork_type> 
GBCON_WORK( N_ );
 
  893  this->GBCON( 
'1', N_, KL_, KU_, AF_, LDAF_, &IPIV_[0], ANORM_, &RCOND_, &WORK_[0], &
GBCON_WORK[0], &INFO_);
 
  894  reciprocalConditionEstimated_ = 
true;
 
 
  902template<
typename OrdinalType, 
typename ScalarType>
 
  905  if (Matrix_!=Teuchos::null) os << 
"Solver Matrix"          << std::endl << *Matrix_ << std::endl;
 
  906  if (Factor_!=Teuchos::null) os << 
"Solver Factored Matrix" << std::endl << *Factor_ << std::endl;
 
  907  if (LHS_   !=Teuchos::null) os << 
"Solver LHS"             << std::endl << *LHS_    << std::endl;
 
  908  if (RHS_   !=Teuchos::null) os << 
"Solver RHS"             << std::endl << *RHS_    << std::endl;
 
 
Templated interface class to BLAS routines.
 
Object for storing data and providing functionality that is common to all computational classes.
 
Teuchos header file which uses auto-configuration information to include necessary C++ headers.
 
Templated interface class to LAPACK routines.
 
Reference-counted pointer class and non-member templated function implementations.
 
Defines basic traits for the scalar field type.
 
Templated serial dense matrix class.
 
Templated serial dense matrix class.
 
Templated class for solving dense linear problems.
 
Functionality and data that is common to all computational classes.
 
The Templated LAPACK Wrapper Class.
 
Smart reference counting pointer class for automatic garbage collection.
 
RCP< T > rcp(const boost::shared_ptr< T > &sptr)
Conversion function that takes in a boost::shared_ptr object and spits out a Teuchos::RCP object.
 
Ptr< T > ptr() const
Get a safer wrapper raw C++ pointer to the underlying object.
 
A class for representing and solving banded dense linear systems.
 
bool equilibratedA()
Returns true if factor is equilibrated (factor available via AF() and LDAF()).
 
void estimateSolutionErrors(bool flag)
Causes all solves to estimate the forward and backward solution error.
 
void solveWithTranspose(bool flag)
 
MagnitudeType ANORM() const
Returns the 1-Norm of the this matrix (returns -1 if not yet computed).
 
bool shouldEquilibrate()
Returns true if the LAPACK general rules for equilibration suggest you should equilibrate the system.
 
MagnitudeType ROWCND() const
Ratio of smallest to largest row scale factors for the this matrix (returns -1 if not yet computed).
 
RCP< SerialDenseMatrix< OrdinalType, ScalarType > > getRHS() const
Returns pointer to current RHS.
 
OrdinalType numRows() const
Returns row dimension of system.
 
int setVectors(const RCP< SerialDenseMatrix< OrdinalType, ScalarType > > &X, const RCP< SerialDenseMatrix< OrdinalType, ScalarType > > &B)
Sets the pointers for left and right hand side vector(s).
 
bool factored()
Returns true if matrix is factored (factor available via AF() and LDAF()).
 
std::vector< OrdinalType > IPIV() const
Returns pointer to pivot vector (if factorization has been computed), zero otherwise.
 
int applyRefinement()
Apply Iterative Refinement.
 
bool solutionErrorsEstimated()
Returns true if forward and backward error estimated have been computed (available via FERR() and BER...
 
OrdinalType numLower() const
Returns lower bandwidth of system.
 
bool solved()
Returns true if the current set of vectors has been solved.
 
MagnitudeType RCOND() const
Returns the reciprocal of the condition number of the this matrix (returns -1 if not yet computed).
 
OrdinalType numUpper() const
Returns upper bandwidth of system.
 
virtual ~SerialBandDenseSolver()
SerialBandDenseSolver destructor.
 
int setMatrix(const RCP< SerialBandDenseMatrix< OrdinalType, ScalarType > > &AB)
Sets the pointer for coefficient matrix.
 
RCP< SerialDenseMatrix< OrdinalType, ScalarType > > getLHS() const
Returns pointer to current LHS.
 
std::vector< MagnitudeType > FERR() const
Returns a pointer to the forward error estimates computed by LAPACK.
 
void factorWithEquilibration(bool flag)
 
int factor()
Computes the in-place LU factorization of the matrix using the LAPACK routine _GBTRF.
 
std::vector< MagnitudeType > BERR() const
Returns a pointer to the backward error estimates computed by LAPACK.
 
std::vector< MagnitudeType > R() const
Returns a pointer to the row scaling vector used for equilibration.
 
bool transpose()
Returns true if transpose of this matrix has and will be used.
 
MagnitudeType AMAX() const
Returns the absolute value of the largest entry of the this matrix (returns -1 if not yet computed).
 
std::vector< MagnitudeType > C() const
Returns a pointer to the column scale vector used for equilibration.
 
MagnitudeType COLCND() const
Ratio of smallest to largest column scale factors for the this matrix (returns -1 if not yet computed...
 
int computeEquilibrateScaling()
Computes the scaling vector S(i) = 1/sqrt(A(i,i)) of the this matrix.
 
RCP< SerialBandDenseMatrix< OrdinalType, ScalarType > > getFactoredMatrix() const
Returns pointer to factored matrix (assuming factorization has been performed).
 
bool reciprocalConditionEstimated()
Returns true if the condition number of the this matrix has been computed (value available via Recipr...
 
int reciprocalConditionEstimate(MagnitudeType &Value)
Returns the reciprocal of the 1-norm condition number of the this matrix.
 
int unequilibrateLHS()
Unscales the solution vectors if equilibration was used to solve the system.
 
bool equilibratedB()
Returns true if RHS is equilibrated (RHS available via B() and LDB()).
 
void Print(std::ostream &os) const
Print service methods; defines behavior of ostream << operator.
 
int equilibrateMatrix()
Equilibrates the this matrix.
 
bool solutionRefined()
Returns true if the current set of vectors has been refined.
 
OrdinalType numCols() const
Returns column dimension of system.
 
int equilibrateRHS()
Equilibrates the current RHS.
 
void solveWithTransposeFlag(Teuchos::ETransp trans)
 
RCP< SerialBandDenseMatrix< OrdinalType, ScalarType > > getMatrix() const
Returns pointer to current matrix.
 
int solve()
Computes the solution X to AX = B for the this matrix and the B provided to SetVectors()....
 
void solveToRefinedSolution(bool flag)
Set whether or not to use iterative refinement to improve solutions to linear systems.
 
SerialBandDenseSolver()
Default constructor; matrix should be set using setMatrix(), LHS and RHS set with setVectors().
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
 
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
 
Teuchos implementation details.
 
This structure defines some basic traits for a scalar field type.
 
static T one()
Returns representation of one for this scalar type.
 
T magnitudeType
Mandatory typedef for result of magnitude.