15#ifndef ANASAZI_BASIC_ORTHOMANAGER_HPP
16#define ANASAZI_BASIC_ORTHOMANAGER_HPP
29#include "Teuchos_TimeMonitor.hpp"
30#include "Teuchos_LAPACK.hpp"
31#include "Teuchos_BLAS.hpp"
32#ifdef ANASAZI_BASIC_ORTHO_DEBUG
33# include <Teuchos_FancyOStream.hpp>
38 template<
class ScalarType,
class MV,
class OP>
42 typedef typename Teuchos::ScalarTraits<ScalarType>::magnitudeType MagnitudeType;
43 typedef Teuchos::ScalarTraits<ScalarType> SCT;
53 typename Teuchos::ScalarTraits<ScalarType>::magnitudeType
kappa = 1.41421356 ,
54 typename Teuchos::ScalarTraits<ScalarType>::magnitudeType
eps = 0.0,
55 typename Teuchos::ScalarTraits<ScalarType>::magnitudeType
tol = 0.20 );
107 Teuchos::Array<Teuchos::RCP<const MV> > Q,
108 Teuchos::Array<Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > >
C
109 = Teuchos::tuple(Teuchos::RCP< Teuchos::SerialDenseMatrix<int,ScalarType> >(Teuchos::null)),
110 Teuchos::RCP<MV> MX = Teuchos::null,
111 Teuchos::Array<Teuchos::RCP<const MV> >
MQ = Teuchos::tuple(Teuchos::RCP<const MV>(Teuchos::null))
155 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
B = Teuchos::null,
156 Teuchos::RCP<MV> MX = Teuchos::null
221 Teuchos::Array<Teuchos::RCP<const MV> > Q,
222 Teuchos::Array<Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > >
C
223 = Teuchos::tuple(Teuchos::RCP< Teuchos::SerialDenseMatrix<int,ScalarType> >(Teuchos::null)),
224 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
B = Teuchos::null,
225 Teuchos::RCP<MV> MX = Teuchos::null,
226 Teuchos::Array<Teuchos::RCP<const MV> >
MQ = Teuchos::tuple(Teuchos::RCP<const MV>(Teuchos::null))
238 typename Teuchos::ScalarTraits<ScalarType>::magnitudeType
245 typename Teuchos::ScalarTraits<ScalarType>::magnitudeType
257 typename Teuchos::ScalarTraits<ScalarType>::magnitudeType
getKappa()
const {
return kappa_; }
263 MagnitudeType kappa_;
268 int findBasis(MV &X, Teuchos::RCP<MV> MX,
269 Teuchos::SerialDenseMatrix<int,ScalarType> &
B,
275 Teuchos::RCP<Teuchos::Time> timerReortho_;
282 template<
class ScalarType,
class MV,
class OP>
284 typename Teuchos::ScalarTraits<ScalarType>::magnitudeType
kappa,
285 typename Teuchos::ScalarTraits<ScalarType>::magnitudeType
eps,
286 typename Teuchos::ScalarTraits<ScalarType>::magnitudeType
tol ) :
293 "Anasazi::BasicOrthoManager::BasicOrthoManager(): argument \"eps\" must be non-negative.");
295 Teuchos::LAPACK<int,MagnitudeType>
lapack;
297 eps_ = Teuchos::ScalarTraits<MagnitudeType>::pow(eps_,.75);
300 tol_ < SCT::magnitude(SCT::zero()) || tol_ > SCT::magnitude(SCT::one()),
301 std::invalid_argument,
302 "Anasazi::BasicOrthoManager::BasicOrthoManager(): argument \"tol\" must be in [0,1].");
309 template<
class ScalarType,
class MV,
class OP>
310 typename Teuchos::ScalarTraits<ScalarType>::magnitudeType
312 const ScalarType ONE = SCT::one();
313 int rank = MVT::GetNumberVecs(X);
314 Teuchos::SerialDenseMatrix<int,ScalarType>
xTx(
rank,
rank);
319 return xTx.normFrobenius();
326 template<
class ScalarType,
class MV,
class OP>
327 typename Teuchos::ScalarTraits<ScalarType>::magnitudeType
329 int r1 = MVT::GetNumberVecs(
X1);
330 int r2 = MVT::GetNumberVecs(
X2);
331 Teuchos::SerialDenseMatrix<int,ScalarType>
xTx(
r1,
r2);
333 return xTx.normFrobenius();
339 template<
class ScalarType,
class MV,
class OP>
342 Teuchos::Array<Teuchos::RCP<const MV> > Q,
343 Teuchos::Array<Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > >
C,
345 Teuchos::Array<Teuchos::RCP<const MV> >
MQ
362#ifdef ANASAZI_BASIC_ORTHO_DEBUG
364 Teuchos::RCP<Teuchos::FancyOStream>
365 out = Teuchos::getFancyOStream(Teuchos::rcpFromRef(std::cout));
366 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
367 *
out <<
"Entering Anasazi::BasicOrthoManager::projectMat(...)\n";
370 ScalarType ONE = SCT::one();
372 int xc = MVT::GetNumberVecs( X );
375 std::vector<int>
qcs(
nq);
377 if (
nq == 0 ||
xc == 0 ||
xr == 0) {
378#ifdef ANASAZI_BASIC_ORTHO_DEBUG
379 *
out <<
"Leaving Anasazi::BasicOrthoManager::projectMat(...)\n";
392#ifdef ANASAZI_BASIC_ORTHO_DEBUG
393 *
out <<
"Allocating MX...\n";
395 if (MX == Teuchos::null) {
397 MX = MVT::Clone(X,MVT::GetNumberVecs(X));
398 OPT::Apply(*(this->_Op),X,*MX);
399 this->_OpCounter += MVT::GetNumberVecs(X);
404 MX = Teuchos::rcpFromRef(X);
406 int mxc = MVT::GetNumberVecs( *MX );
411 "Anasazi::BasicOrthoManager::projectMat(): MVT returned negative dimensions for X,MX" );
414 "Anasazi::BasicOrthoManager::projectMat(): Size of X not consistent with MX,Q" );
417 for (
int i=0;
i<
nq;
i++) {
419 "Anasazi::BasicOrthoManager::projectMat(): Q lengths not mutually consistent" );
420 qcs[
i] = MVT::GetNumberVecs( *Q[
i] );
422 "Anasazi::BasicOrthoManager::projectMat(): Q has less rows than columns" );
424 if (
C[
i] == Teuchos::null ) {
425 C[
i] = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(
qcs[
i],
xc) );
429 "Anasazi::BasicOrthoManager::projectMat(): Size of Q not consistent with size of C" );
436 std::vector<ScalarType>
oldDot(
xc );
437 MVT::MvDot( X, *MX,
oldDot );
438#ifdef ANASAZI_BASIC_ORTHO_DEBUG
439 *
out <<
"oldDot = { ";
440 std::copy(
oldDot.begin(),
oldDot.end(), std::ostream_iterator<ScalarType>(*
out,
" "));
446 for (
int i=0;
i<
nq;
i++) {
450#ifdef ANASAZI_BASIC_ORTHO_DEBUG
451 *
out <<
"Applying projector P_Q[" <<
i <<
"]...\n";
453 MVT::MvTimesMatAddMv( -ONE, *Q[
i], *
C[
i], ONE, X );
458 if (
MQ[
i] == Teuchos::null) {
459#ifdef ANASAZI_BASIC_ORTHO_DEBUG
460 *
out <<
"Updating MX via M*X...\n";
462 OPT::Apply( *(this->_Op), X, *MX);
463 this->_OpCounter += MVT::GetNumberVecs(X);
466#ifdef ANASAZI_BASIC_ORTHO_DEBUG
467 *
out <<
"Updating MX via M*Q...\n";
469 MVT::MvTimesMatAddMv( -ONE, *
MQ[
i], *
C[
i], ONE, *MX );
476 MVT::MvDot( X, *MX,
newDot );
477#ifdef ANASAZI_BASIC_ORTHO_DEBUG
478 *
out <<
"newDot = { ";
479 std::copy(
newDot.begin(),
newDot.end(), std::ostream_iterator<ScalarType>(*
out,
" "));
484 for (
int j = 0;
j <
xc; ++
j) {
486 if ( SCT::magnitude(kappa_*
newDot[
j]) < SCT::magnitude(
oldDot[
j]) ) {
487#ifdef ANASAZI_BASIC_ORTHO_DEBUG
488 *
out <<
"kappa_*newDot[" <<
j<<
"] == " << kappa_*
newDot[
j] <<
"... another step of Gram-Schmidt.\n";
490#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
491 Teuchos::TimeMonitor
lcltimer( *timerReortho_ );
493 for (
int i=0;
i<
nq;
i++) {
499#ifdef ANASAZI_BASIC_ORTHO_DEBUG
500 *
out <<
"Applying projector P_Q[" <<
i <<
"]...\n";
502 MVT::MvTimesMatAddMv( -ONE, *Q[
i],
C2, ONE, X );
506 if (
MQ[
i] == Teuchos::null) {
507#ifdef ANASAZI_BASIC_ORTHO_DEBUG
508 *
out <<
"Updating MX via M*X...\n";
510 OPT::Apply( *(this->_Op), X, *MX);
511 this->_OpCounter += MVT::GetNumberVecs(X);
514#ifdef ANASAZI_BASIC_ORTHO_DEBUG
515 *
out <<
"Updating MX via M*Q...\n";
517 MVT::MvTimesMatAddMv( -ONE, *
MQ[
i],
C2, ONE, *MX );
525#ifdef ANASAZI_BASIC_ORTHO_DEBUG
526 *
out <<
"Leaving Anasazi::BasicOrthoManager::projectMat(...)\n";
534 template<
class ScalarType,
class MV,
class OP>
537 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
B,
538 Teuchos::RCP<MV> MX)
const {
542 int xc = MVT::GetNumberVecs(X);
548 if (MX == Teuchos::null) {
550 MX = MVT::Clone(X,
xc);
551 OPT::Apply(*(this->_Op),X,*MX);
552 this->_OpCounter += MVT::GetNumberVecs(X);
558 if (
B == Teuchos::null ) {
559 B = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(
xc,
xc) );
562 int mxc = (this->_hasOp) ? MVT::GetNumberVecs( *MX ) :
xc;
563 ptrdiff_t mxr = (this->_hasOp) ? MVT::GetGlobalLength( *MX ) :
xr;
567 "Anasazi::BasicOrthoManager::normalizeMat(): X must be non-empty" );
569 "Anasazi::BasicOrthoManager::normalizeMat(): Size of X not consistent with size of B" );
571 "Anasazi::BasicOrthoManager::normalizeMat(): Size of X not consistent with size of MX" );
573 "Anasazi::BasicOrthoManager::normalizeMat(): Size of X not feasible for normalization" );
575 return findBasis(X, MX, *
B,
true );
582 template<
class ScalarType,
class MV,
class OP>
585 Teuchos::Array<Teuchos::RCP<const MV> > Q,
586 Teuchos::Array<Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > >
C,
587 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> >
B,
589 Teuchos::Array<Teuchos::RCP<const MV> >
MQ
592#ifdef ANASAZI_BASIC_ORTHO_DEBUG
594 Teuchos::RCP<Teuchos::FancyOStream>
595 out = Teuchos::getFancyOStream(Teuchos::rcpFromRef(std::cout));
596 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
597 *
out <<
"Entering Anasazi::BasicOrthoManager::projectAndNormalizeMat(...)\n";
601 int xc = MVT::GetNumberVecs( X );
608 if (
B == Teuchos::null ) {
609 B = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(
xc,
xc) );
614 if (MX == Teuchos::null) {
616#ifdef ANASAZI_BASIC_ORTHO_DEBUG
617 *
out <<
"Allocating MX...\n";
619 MX = MVT::Clone(X,MVT::GetNumberVecs(X));
620 OPT::Apply(*(this->_Op),X,*MX);
621 this->_OpCounter += MVT::GetNumberVecs(X);
626 MX = Teuchos::rcpFromRef(X);
629 int mxc = MVT::GetNumberVecs( *MX );
632 TEUCHOS_TEST_FOR_EXCEPTION(
xc == 0 ||
xr == 0, std::invalid_argument,
"Anasazi::BasicOrthoManager::projectAndNormalizeMat(): X must be non-empty" );
635 for (
int i=0;
i<
nq;
i++) {
636 numbas += MVT::GetNumberVecs( *Q[
i] );
641 "Anasazi::BasicOrthoManager::projectAndNormalizeMat(): Size of X must be consistent with size of B" );
644 "Anasazi::BasicOrthoManager::projectAndNormalizeMat(): MVT returned negative dimensions for X,MX" );
647 "Anasazi::BasicOrthoManager::projectAndNormalizeMat(): Size of X must be consistent with size of MX" );
650 "Anasazi::BasicOrthoManager::projectAndNormalizeMat(): Orthogonality constraints not feasible" );
653#ifdef ANASAZI_BASIC_ORTHO_DEBUG
654 *
out <<
"Orthogonalizing X against Q...\n";
656 projectMat(X,Q,
C,MX,
MQ);
658 Teuchos::SerialDenseMatrix<int,ScalarType>
oldCoeff(
xc,1);
669#ifdef ANASAZI_BASIC_ORTHO_DEBUG
670 *
out <<
"Attempting to find orthonormal basis for X...\n";
680 for (
int i=0;
i<
xc;
i++) {
694 for (
int i=0;
i<
xc;
i++) {
702#ifdef ANASAZI_BASIC_ORTHO_DEBUG
703 *
out <<
"Finished computing basis.\n";
709 "Anasazi::BasicOrthoManager::projectAndNormalizeMat(): basis lost rank; this shouldn't happen");
727#ifdef ANASAZI_BASIC_ORTHO_DEBUG
728 *
out <<
"Randomizing X[" <<
rank <<
"]...\n";
731 std::vector<int>
ind(1);
733 curX = MVT::CloneViewNonConst(X,
ind);
734 MVT::MvRandom(*
curX);
736#ifdef ANASAZI_BASIC_ORTHO_DEBUG
737 *
out <<
"Applying operator to random vector.\n";
739 curMX = MVT::CloneViewNonConst(*MX,
ind);
740 OPT::Apply( *(this->_Op), *
curX, *
curMX );
741 this->_OpCounter += MVT::GetNumberVecs(*
curX);
749 Teuchos::Array<Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > >
dummyC(0);
757 "Anasazi::BasicOrthoManager::projectAndNormalizeMat(): Debug error in rank variable." );
759#ifdef ANASAZI_BASIC_ORTHO_DEBUG
760 *
out <<
"Leaving Anasazi::BasicOrthoManager::projectAndNormalizeMat(...)\n";
771 template<
class ScalarType,
class MV,
class OP>
773 MV &X, Teuchos::RCP<MV> MX,
774 Teuchos::SerialDenseMatrix<int,ScalarType> &
B,
792#ifdef ANASAZI_BASIC_ORTHO_DEBUG
794 Teuchos::RCP<Teuchos::FancyOStream>
795 out = Teuchos::getFancyOStream(Teuchos::rcpFromRef(std::cout));
796 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
797 *
out <<
"Entering Anasazi::BasicOrthoManager::findBasis(...)\n";
800 const ScalarType ONE = SCT::one();
801 const MagnitudeType ZERO = SCT::magnitude(SCT::zero());
803 int xc = MVT::GetNumberVecs( X );
813 "Anasazi::BasicOrthoManager::findBasis(): calling routine did not specify MS.");
815 "Anasazi::BasicOrthoManager::findBasis(): Invalid howMany parameter" );
831 for (
int i=
j+1;
i<
xc; ++
i) {
836 std::vector<int> index(1);
838 Teuchos::RCP<MV>
Xj = MVT::CloneViewNonConst( X, index );
839 Teuchos::RCP<MV>
MXj;
840 if ((this->_hasOp)) {
842 MXj = MVT::CloneViewNonConst( *MX, index );
867#ifdef ANASAZI_BASIC_ORTHO_DEBUG
868 *
out <<
"Trial " <<
numTrials <<
" for vector " <<
j <<
"\n";
872 Teuchos::SerialDenseMatrix<int,ScalarType>
product(
numX, 1);
878 Teuchos::RCP<MV>
oldMXj = MVT::CloneCopy( *
MXj );
880#ifdef ANASAZI_BASIC_ORTHO_DEBUG
892#ifdef ANASAZI_BASIC_ORTHO_DEBUG
893 *
out <<
"Orthogonalizing X[" <<
j <<
"]...\n";
902#ifdef ANASAZI_BASIC_ORTHO_DEBUG
903 *
out <<
"Updating MX[" <<
j <<
"]...\n";
912#ifdef ANASAZI_BASIC_ORTHO_DEBUG
919#ifdef ANASAZI_BASIC_ORTHO_DEBUG
924 *
out <<
"eps*origNorm == " << eps_*
origNorm[0] <<
"... another step of Gram-Schmidt.\n";
929 Teuchos::SerialDenseMatrix<int,ScalarType>
P2(
numX,1);
932#ifdef ANASAZI_BASIC_ORTHO_DEBUG
933 *
out <<
"Orthogonalizing X[" <<
j <<
"]...\n";
935 MVT::MvTimesMatAddMv( -ONE, *
prevX,
P2, ONE, *
Xj );
936 if ((this->_hasOp)) {
937#ifdef ANASAZI_BASIC_ORTHO_DEBUG
938 *
out <<
"Updating MX[" <<
j <<
"]...\n";
940 MVT::MvTimesMatAddMv( -ONE, *
prevMX,
P2, ONE, *
MXj );
945#ifdef ANASAZI_BASIC_ORTHO_DEBUG
951#ifdef ANASAZI_BASIC_ORTHO_DEBUG
956 *
out <<
"newNorm2 > newNorm... setting vector to zero.\n";
959 *
out <<
"eps*origNorm == " << eps_*
origNorm[0] <<
"... setting vector to zero.\n";
962 MVT::MvInit(*
Xj,ZERO);
963 if ((this->_hasOp)) {
964#ifdef ANASAZI_BASIC_ORTHO_DEBUG
965 *
out <<
"Setting MX[" <<
j <<
"] to zero as well.\n";
967 MVT::MvInit(*
MXj,ZERO);
983#ifdef ANASAZI_BASIC_ORTHO_DEBUG
984 *
out <<
"Normalizing X[" <<
j <<
"], norm(X[" <<
j <<
"]) = " <<
newNorm[0] <<
"\n";
990#ifdef ANASAZI_BASIC_ORTHO_DEBUG
991 *
out <<
"Normalizing M*X[" <<
j <<
"]...\n";
1007#ifdef ANASAZI_BASIC_ORTHO_DEBUG
1008 *
out <<
"Not normalizing M*X[" <<
j <<
"]...\n";
1017#ifdef ANASAZI_BASIC_ORTHO_DEBUG
1018 *
out <<
"Inserting random vector in X[" <<
j <<
"]...\n";
1020 MVT::MvRandom( *
Xj );
1022#ifdef ANASAZI_BASIC_ORTHO_DEBUG
1023 *
out <<
"Updating M*X[" <<
j <<
"]...\n";
1025 OPT::Apply( *(this->_Op), *
Xj, *
MXj );
1026 this->_OpCounter += MVT::GetNumberVecs(*
Xj);
1039 "Anasazi::BasicOrthoManager::findBasis(): Unable to complete basis" );
1040#ifdef ANASAZI_BASIC_ORTHO_DEBUG
1041 *
out <<
"Returning early, rank " <<
j <<
" from Anasazi::BasicOrthoManager::findBasis(...)\n";
1048#ifdef ANASAZI_BASIC_ORTHO_DEBUG
1049 *
out <<
"Returning " <<
xc <<
" from Anasazi::BasicOrthoManager::findBasis(...)\n";
Anasazi header file which uses auto-configuration information to include necessary C++ headers.
Templated virtual class for providing orthogonalization/orthonormalization methods with matrix-based ...
Declaration of basic traits for the multivector type.
Virtual base class which defines basic traits for the operator type.
An implementation of the Anasazi::MatOrthoManager that performs orthogonalization using (potentially)...
int normalizeMat(MV &X, Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > B=Teuchos::null, Teuchos::RCP< MV > MX=Teuchos::null) const
This method takes a multivector X and attempts to compute an orthonormal basis for ,...
Teuchos::ScalarTraits< ScalarType >::magnitudeType getKappa() const
Return parameter for re-orthogonalization threshold.
~BasicOrthoManager()
Destructor.
int projectAndNormalizeMat(MV &X, Teuchos::Array< Teuchos::RCP< const MV > > Q, Teuchos::Array< Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > > C=Teuchos::tuple(Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > >(Teuchos::null)), Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > B=Teuchos::null, Teuchos::RCP< MV > MX=Teuchos::null, Teuchos::Array< Teuchos::RCP< const MV > > MQ=Teuchos::tuple(Teuchos::RCP< const MV >(Teuchos::null))) const
Given a set of bases Q[i] and a multivector X, this method computes an orthonormal basis for .
void setKappa(typename Teuchos::ScalarTraits< ScalarType >::magnitudeType kappa)
Set parameter for re-orthogonalization threshold.
void projectMat(MV &X, Teuchos::Array< Teuchos::RCP< const MV > > Q, Teuchos::Array< Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > > C=Teuchos::tuple(Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > >(Teuchos::null)), Teuchos::RCP< MV > MX=Teuchos::null, Teuchos::Array< Teuchos::RCP< const MV > > MQ=Teuchos::tuple(Teuchos::RCP< const MV >(Teuchos::null))) const
Given a list of mutually orthogonal and internally orthonormal bases Q, this method projects a multiv...
Teuchos::ScalarTraits< ScalarType >::magnitudeType orthonormErrorMat(const MV &X, Teuchos::RCP< const MV > MX=Teuchos::null) const
This method computes the error in orthonormality of a multivector, measured as the Frobenius norm of ...
Teuchos::ScalarTraits< ScalarType >::magnitudeType orthogErrorMat(const MV &X1, const MV &X2, Teuchos::RCP< const MV > MX1, Teuchos::RCP< const MV > MX2) const
This method computes the error in orthogonality of two multivectors, measured as the Frobenius norm o...
BasicOrthoManager(Teuchos::RCP< const OP > Op=Teuchos::null, typename Teuchos::ScalarTraits< ScalarType >::magnitudeType kappa=1.41421356, typename Teuchos::ScalarTraits< ScalarType >::magnitudeType eps=0.0, typename Teuchos::ScalarTraits< ScalarType >::magnitudeType tol=0.20)
Constructor specifying re-orthogonalization tolerance.
Anasazi's templated virtual class for providing routines for orthogonalization and orthonormalization...
void normMat(const MV &X, std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > &normvec, Teuchos::RCP< const MV > MX=Teuchos::null) const
Provides the norm induced by the matrix-based inner product.
void innerProdMat(const MV &X, const MV &Y, Teuchos::SerialDenseMatrix< int, ScalarType > &Z, Teuchos::RCP< const MV > MX=Teuchos::null, Teuchos::RCP< const MV > MY=Teuchos::null) const
Provides a matrix-based inner product.
Anasazi's templated virtual class for constructing an operator that can interface with the OperatorTr...
Operator()
Default constructor.
Exception thrown to signal error in an orthogonalization manager method.
Namespace Anasazi contains the classes, structs, enums and utilities used by the Anasazi package.