42 #ifndef _TEUCHOS_SERIALQRDENSESOLVER_UQ_PCE_HPP_
43 #define _TEUCHOS_SERIALQRDENSESOLVER_UQ_PCE_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>
320 new (v_pce+i)
pce_type(
cijk, vector_size, v+i*vector_size,
false);
329 using namespace details;
333 template<
typename OrdinalType,
typename Storage>
337 Object(
"Teuchos::SerialQRDenseSolver"),
346 template<
typename OrdinalType,
typename Storage>
350 LHS_ = Teuchos::null;
351 RHS_ = Teuchos::null;
355 template<
typename OrdinalType,
typename Storage>
365 template<
typename OrdinalType,
typename Storage>
369 const RCP<SerialDenseMatrix<OrdinalType,ScalarType> >& mat)
const
373 mat->values(), mat->stride()*mat->numCols());
374 RCP<BaseMatrixType> base_mat =
377 mat->stride()*SacadoSize_,
378 mat->numRows()*SacadoSize_,
384 template<
typename OrdinalType,
typename Storage>
385 RCP<SerialDenseMatrix<OrdinalType, Sacado::UQ::PCE<Storage> > >
388 const RCP<SerialDenseMatrix<OrdinalType,BaseScalarType> >& base_mat)
const
392 base_mat->values(), base_mat->stride()*base_mat->numCols(), SacadoSize_);
393 RCP<MatrixType> mat =
396 base_mat->stride()/SacadoSize_,
397 base_mat->numRows()/SacadoSize_,
398 base_mat->numCols()));
403 template<
typename OrdinalType,
typename Storage>
405 setMatrix(
const RCP<SerialDenseMatrix<OrdinalType,ScalarType> >& A)
407 TEUCHOS_TEST_FOR_EXCEPTION(
408 A->numRows() < A->numCols(), std::invalid_argument,
409 "SerialQRDenseSolver<T>::setMatrix: the matrix A must have A.numRows() >= A.numCols()!");
418 if (Storage::is_static)
419 SacadoSize_ = Storage::static_size;
420 else if (M_ > 0 && N_ > 0)
421 SacadoSize_ = (*A)(0,0).size();
425 return base_QR_.setMatrix( createBaseMatrix(A) );
429 template<
typename OrdinalType,
typename Storage>
432 const RCP<SerialDenseMatrix<OrdinalType,ScalarType> >& X,
433 const RCP<SerialDenseMatrix<OrdinalType,ScalarType> >& B)
436 TEUCHOS_TEST_FOR_EXCEPTION(
437 B->numCols() != X->numCols(), std::invalid_argument,
438 "SerialQRDenseSolver<T>::setVectors: X and B have different numbers of columns!");
439 TEUCHOS_TEST_FOR_EXCEPTION(
440 B->values()==0, std::invalid_argument,
441 "SerialQRDenseSolver<T>::setVectors: B is an empty SerialDenseMatrix<T>!");
442 TEUCHOS_TEST_FOR_EXCEPTION(
443 X->values()==0, std::invalid_argument,
444 "SerialQRDenseSolver<T>::setVectors: X is an empty SerialDenseMatrix<T>!");
445 TEUCHOS_TEST_FOR_EXCEPTION(
446 B->stride()<1, std::invalid_argument,
447 "SerialQRDenseSolver<T>::setVectors: B has an invalid stride!");
448 TEUCHOS_TEST_FOR_EXCEPTION(
449 X->stride()<1, std::invalid_argument,
450 "SerialQRDenseSolver<T>::setVectors: X has an invalid stride!");
456 return base_QR_.setVectors( createBaseMatrix(X), createBaseMatrix(B) );
461 template<
typename OrdinalType,
typename Storage>
464 int ret = base_QR_.formQ();
465 FactorQ_ = createMatrix( base_QR_.getQ() );
471 template<
typename OrdinalType,
typename Storage>
474 int ret = base_QR_.formR();
475 FactorR_ = createMatrix( base_QR_.getR() );
476 Factor_ = createMatrix( base_QR_.getFactoredMatrix() );
482 template<
typename OrdinalType,
typename Storage>
484 multiplyQ(ETransp transq, SerialDenseMatrix<OrdinalType, ScalarType> &C)
486 return base_QR_.multiplyQ(transq, createBaseMatrix(C));
491 template<
typename OrdinalType,
typename Storage>
493 solveR(ETransp transr, SerialDenseMatrix<OrdinalType, ScalarType> &C)
495 return base_QR_.solveR(transr, createBaseMatrix(C));
500 template<
typename OrdinalType,
typename Storage>
502 Print(std::ostream& os)
const {
504 if (Matrix_!=Teuchos::null) os <<
"Solver Matrix" << std::endl << *Matrix_ << std::endl;
505 if (Factor_!=Teuchos::null) os <<
"Solver Factored Matrix" << std::endl << *Factor_ << std::endl;
506 if (LHS_ !=Teuchos::null) os <<
"Solver LHS" << std::endl << *LHS_ << std::endl;
507 if (RHS_ !=Teuchos::null) os <<
"Solver RHS" << std::endl << *RHS_ << std::endl;