8 #ifndef MUELU_QR_INTERFACEEX_DEF_HPP_ 9 #define MUELU_QR_INTERFACEEX_DEF_HPP_ 17 template <
class Scalar,
class LocalOrdinal>
22 lapack.
ORGQR(myAggSize, intFineNSDim, intFineNSDim, localQR.
getRawPtr(),
27 template <
class LocalOrdinal>
29 LocalOrdinal myAggSize,
int intFineNSDim,
ArrayRCP<std::complex<double> > &localQR,
31 LocalOrdinal &workSize, LocalOrdinal &info)
33 lapack.UNGQR(myAggSize, intFineNSDim, intFineNSDim, localQR.getRawPtr(),
34 myAggSize, tau.getRawPtr(), work.getRawPtr(), workSize, &info );
37 template <
class Scalar,
class LocalOrdinal>
43 template <
class Scalar,
class LocalOrdinal>
45 bool bIsZeroColumn =
true;
46 for(LocalOrdinal r = 0; r < myAggSize; ++r) {
47 if(localQR[ myAggSize*nspCol + r ]!=0.0) {
48 bIsZeroColumn =
false;
55 template <
class Scalar,
class LocalOrdinal>
71 for(LocalOrdinal j = 0; j<NSDim_; ++j) {
72 if(!isZeroNspColumn(myAggSize, localQR, j))
73 nonZeroCols_.push_back(j);
77 internalNSDim_ = Teuchos::as<LocalOrdinal>(nonZeroCols_.size());
82 workSize_ = internalNSDim_;
87 for(
size_t j = 0; j<internalNSDim_; ++j) {
88 for(
size_t r = 0; r<myAggSize; ++r) {
89 internalLocalQR_[j*myAggSize+r] = localQR[nonZeroCols_[j]*myAggSize+r];
103 lapack_.GEQRF( myAggSize, Teuchos::as<int>(internalNSDim_), internalLocalQR_.getRawPtr(), myAggSize,
104 tau_.getRawPtr(), work_.
getRawPtr(), workSize_, &info_ );
106 std::string msg =
"QR_InterfaceEx: dgeqrf (LAPACK QR routine) returned error code " +
Teuchos::toString(info_);
121 for(
size_t j = 0; j<internalNSDim_; ++j) {
122 for(
size_t r = 0; r<internalNSDim_; ++r) {
123 localQR[nonZeroCols_[j]*myAggSize+nonZeroCols_[r]] = internalLocalQR_[j*myAggSize+r];
138 template <
class Scalar,
class LocalOrdinal>
145 localQR[0] = tau_[0];
147 for (LocalOrdinal i=0; i<myAggSize; ++i)
154 LapackQR( lapack_, myAggSize, Teuchos::as<int>(internalNSDim_), internalLocalQR_, tau_, work_, workSize_, info_ );
156 std::string msg =
"QR_InterfaceEx: dorgqr (LAPACK auxiliary QR routine) returned error code " +
Teuchos::toString(info_);
169 for(
size_t j = 0; j<internalNSDim_; ++j) {
170 for(
size_t r = 0; r<myAggSize; ++r) {
171 localQR[nonZeroCols_[j]*myAggSize+r] = internalLocalQR_[j*myAggSize+r];
QR_InterfaceEx(const size_t nullSpaceDimension)
Constructor.
Namespace for MueLu classes and methods.
void ORGQR(const OrdinalType m, const OrdinalType n, const OrdinalType k, ScalarType *A, const OrdinalType lda, const ScalarType *TAU, ScalarType *WORK, const OrdinalType lwork, OrdinalType *info) const
ArrayRCP< Scalar > tau_
Internal LAPACK variables.
void ExtractQ(LocalOrdinal const &myAggSize, ArrayRCP< Scalar > &localQR)
Calculate the Q factor.
ArrayRCP< Scalar > work_
Temporary work space.
void Compute(LocalOrdinal const &myAggSize, ArrayRCP< Scalar > &localQR)
Compute the QR factorization.
void LapackQR(Teuchos::LAPACK< LocalOrdinal, Scalar > &lapack, LocalOrdinal myAggSize, int intFineNSDim, ArrayRCP< Scalar > &localQR, ArrayRCP< Scalar > &tau, ArrayRCP< Scalar > &work, LocalOrdinal &workSize, LocalOrdinal &info)
Non-member templated function to handle extracting Q from QR factorization.
static magnitudeType magnitude(T a)
bool isZeroNspColumn(LocalOrdinal const &myAggSize, ArrayRCP< Scalar > &localQR, LocalOrdinal nspCol)
Exception throws to report errors in the internal logical of the program.
std::string toString(const T &t)