42 #ifndef _TEUCHOS_SERIALQRDENSESOLVER_MP_VECTOR_HPP_
43 #define _TEUCHOS_SERIALQRDENSESOLVER_MP_VECTOR_HPP_
49 #include "Teuchos_SerialQRDenseSolver.hpp"
59 template<
typename OrdinalType,
typename Storage>
85 int setMatrix(
const RCP<SerialDenseMatrix<OrdinalType, ScalarType> >& A);
91 int setVectors(
const RCP<SerialDenseMatrix<OrdinalType, ScalarType> >& X,
92 const RCP<SerialDenseMatrix<OrdinalType, ScalarType> >& B);
102 base_QR_.factorWithEquilibration(flag);
107 base_QR_.solveWithTranspose(flag);
112 base_QR_.solveWithTranspose(trans);
124 int factor() {
return base_QR_.factor(); }
130 int solve() {
return base_QR_.solve(); }
137 return base_QR_.computeEquilibrateScaling();
177 int multiplyQ (ETransp transq, SerialDenseMatrix<OrdinalType, ScalarType> &C);
183 int solveR (ETransp transr, SerialDenseMatrix<OrdinalType, ScalarType> &C);
205 bool solved() {
return base_QR_.solved(); }
219 RCP<SerialDenseMatrix<OrdinalType, ScalarType> >
getMatrix()
const {
return(Matrix_);}
225 RCP<SerialDenseMatrix<OrdinalType, ScalarType> >
getQ()
const {
return(FactorQ_);}
228 RCP<SerialDenseMatrix<OrdinalType, ScalarType> >
getR()
const {
return(FactorR_);}
231 RCP<SerialDenseMatrix<OrdinalType, ScalarType> >
getLHS()
const {
return(LHS_);}
234 RCP<SerialDenseMatrix<OrdinalType, ScalarType> >
getRHS()
const {
return(RHS_);}
243 std::vector<ScalarType>
tau()
const {
return base_QR_.tau(); }
252 void Print(std::ostream& os)
const;
260 typedef SerialDenseMatrix<OrdinalType, ScalarType>
MatrixType;
264 RCP<BaseMatrixType> createBaseMatrix(
const RCP<MatrixType>& mat)
const;
265 RCP<MatrixType> createMatrix(
const RCP<BaseMatrixType>& base_mat)
const;
300 template <
typename Ordinal,
typename Value,
typename Device>
317 new (v_vec+i)
Vector(vector_size, v+i*vector_size,
false);
323 template <
typename Ordinal,
typename Value,
typename Device,
int Num>
330 return reinterpret_cast<Value*
>(v);
335 return reinterpret_cast<Vector*
>(v);
342 using namespace details;
346 template<
typename OrdinalType,
typename Storage>
350 Object(
"Teuchos::SerialQRDenseSolver"),
359 template<
typename OrdinalType,
typename Storage>
363 LHS_ = Teuchos::null;
364 RHS_ = Teuchos::null;
368 template<
typename OrdinalType,
typename Storage>
378 template<
typename OrdinalType,
typename Storage>
382 const RCP<SerialDenseMatrix<OrdinalType,ScalarType> >& mat)
const
386 mat->values(), mat->stride()*mat->numCols());
387 RCP<BaseMatrixType> base_mat =
390 mat->stride()*SacadoSize_,
391 mat->numRows()*SacadoSize_,
397 template<
typename OrdinalType,
typename Storage>
398 RCP<SerialDenseMatrix<OrdinalType, Sacado::MP::Vector<Storage> > >
401 const RCP<SerialDenseMatrix<OrdinalType,BaseScalarType> >& base_mat)
const
405 base_mat->values(), base_mat->stride()*base_mat->numCols(), SacadoSize_);
406 RCP<MatrixType> mat =
409 base_mat->stride()/SacadoSize_,
410 base_mat->numRows()/SacadoSize_,
411 base_mat->numCols()));
416 template<
typename OrdinalType,
typename Storage>
418 setMatrix(
const RCP<SerialDenseMatrix<OrdinalType,ScalarType> >& A)
420 TEUCHOS_TEST_FOR_EXCEPTION(
421 A->numRows() < A->numCols(), std::invalid_argument,
422 "SerialQRDenseSolver<T>::setMatrix: the matrix A must have A.numRows() >= A.numCols()!");
431 if (Storage::is_static)
432 SacadoSize_ = Storage::static_size;
433 else if (M_ > 0 && N_ > 0)
434 SacadoSize_ = (*A)(0,0).size();
438 return base_QR_.setMatrix( createBaseMatrix(A) );
442 template<
typename OrdinalType,
typename Storage>
445 const RCP<SerialDenseMatrix<OrdinalType,ScalarType> >& X,
446 const RCP<SerialDenseMatrix<OrdinalType,ScalarType> >& B)
449 TEUCHOS_TEST_FOR_EXCEPTION(
450 B->numCols() != X->numCols(), std::invalid_argument,
451 "SerialQRDenseSolver<T>::setVectors: X and B have different numbers of columns!");
452 TEUCHOS_TEST_FOR_EXCEPTION(
453 B->values()==0, std::invalid_argument,
454 "SerialQRDenseSolver<T>::setVectors: B is an empty SerialDenseMatrix<T>!");
455 TEUCHOS_TEST_FOR_EXCEPTION(
456 X->values()==0, std::invalid_argument,
457 "SerialQRDenseSolver<T>::setVectors: X is an empty SerialDenseMatrix<T>!");
458 TEUCHOS_TEST_FOR_EXCEPTION(
459 B->stride()<1, std::invalid_argument,
460 "SerialQRDenseSolver<T>::setVectors: B has an invalid stride!");
461 TEUCHOS_TEST_FOR_EXCEPTION(
462 X->stride()<1, std::invalid_argument,
463 "SerialQRDenseSolver<T>::setVectors: X has an invalid stride!");
469 return base_QR_.setVectors( createBaseMatrix(X), createBaseMatrix(B) );
474 template<
typename OrdinalType,
typename Storage>
477 int ret = base_QR_.formQ();
478 FactorQ_ = createMatrix( base_QR_.getQ() );
484 template<
typename OrdinalType,
typename Storage>
487 int ret = base_QR_.formR();
488 FactorR_ = createMatrix( base_QR_.getR() );
489 Factor_ = createMatrix( base_QR_.getFactoredMatrix() );
495 template<
typename OrdinalType,
typename Storage>
497 multiplyQ(ETransp transq, SerialDenseMatrix<OrdinalType, ScalarType> &C)
499 return base_QR_.multiplyQ(transq, createBaseMatrix(C));
504 template<
typename OrdinalType,
typename Storage>
506 solveR(ETransp transr, SerialDenseMatrix<OrdinalType, ScalarType> &C)
508 return base_QR_.solveR(transr, createBaseMatrix(C));
513 template<
typename OrdinalType,
typename Storage>
515 Print(std::ostream& os)
const {
517 if (Matrix_!=Teuchos::null) os <<
"Solver Matrix" << std::endl << *Matrix_ << std::endl;
518 if (Factor_!=Teuchos::null) os <<
"Solver Factored Matrix" << std::endl << *Factor_ << std::endl;
519 if (LHS_ !=Teuchos::null) os <<
"Solver LHS" << std::endl << *LHS_ << std::endl;
520 if (RHS_ !=Teuchos::null) os <<
"Solver RHS" << std::endl << *RHS_ << std::endl;