42 #ifndef __Epetra_TsqrAdaptor_hpp 43 #define __Epetra_TsqrAdaptor_hpp 59 #include <Tpetra_ConfigDefs.hpp> 61 #if defined(HAVE_TPETRA_EPETRA) && defined(HAVE_TPETRA_TSQR) 63 #include <Kokkos_DefaultNode.hpp> 64 #include <Tsqr_NodeTsqrFactory.hpp> 66 #include <Tsqr_DistTsqr.hpp> 67 #include <Epetra_Comm.h> 71 #include <Epetra_MultiVector.h> 72 #include <Teuchos_ParameterListAcceptorDefaultBase.hpp> 102 class TsqrAdaptor :
public Teuchos::ParameterListAcceptorDefaultBase {
104 typedef Epetra_MultiVector MV;
120 typedef int ordinal_type;
136 typedef Teuchos::SerialDenseMatrix<ordinal_type, scalar_type> dense_matrix_type;
143 typedef double magnitude_type;
146 typedef TSQR::MatView<ordinal_type, scalar_type> matview_type;
147 typedef TSQR::NodeTsqrFactory<node_type, scalar_type, ordinal_type> node_tsqr_factory_type;
150 typedef node_tsqr_factory_type::node_tsqr_type node_tsqr_type;
151 typedef TSQR::DistTsqr<ordinal_type, scalar_type> dist_tsqr_type;
152 typedef TSQR::Tsqr<ordinal_type, scalar_type, node_tsqr_type> tsqr_type;
161 TsqrAdaptor (
const Teuchos::RCP<Teuchos::ParameterList>& plist) :
162 nodeTsqr_ (new node_tsqr_type),
163 distTsqr_ (new dist_tsqr_type),
164 tsqr_ (new tsqr_type (nodeTsqr_, distTsqr_)),
167 setParameterList (plist);
172 nodeTsqr_ (new node_tsqr_type),
173 distTsqr_ (new dist_tsqr_type),
174 tsqr_ (new tsqr_type (nodeTsqr_, distTsqr_)),
177 setParameterList (Teuchos::null);
180 Teuchos::RCP<const Teuchos::ParameterList>
181 getValidParameters ()
const 185 using Teuchos::ParameterList;
186 using Teuchos::parameterList;
188 if (defaultParams_.is_null()) {
189 RCP<ParameterList> params = parameterList (
"TSQR implementation");
190 params->set (
"NodeTsqr", *(nodeTsqr_->getValidParameters ()));
191 params->set (
"DistTsqr", *(distTsqr_->getValidParameters ()));
192 defaultParams_ = params;
194 return defaultParams_;
198 setParameterList (
const Teuchos::RCP<Teuchos::ParameterList>& plist)
200 using Teuchos::ParameterList;
201 using Teuchos::parameterList;
203 using Teuchos::sublist;
205 RCP<ParameterList> params = plist.is_null() ?
206 parameterList (*getValidParameters ()) : plist;
207 nodeTsqr_->setParameterList (sublist (params,
"NodeTsqr"));
208 distTsqr_->setParameterList (sublist (params,
"DistTsqr"));
210 this->setMyParamList (params);
235 factorExplicit (MV& A,
237 dense_matrix_type& R,
238 const bool forceNonnegativeDiagonal=
false)
240 typedef KokkosClassic::MultiVector<scalar_type, node_type> KMV;
243 KMV A_view = getNonConstView (A);
244 KMV Q_view = getNonConstView (Q);
245 tsqr_->factorExplicit (A_view, Q_view, R,
false,
246 forceNonnegativeDiagonal);
281 dense_matrix_type& R,
282 const magnitude_type& tol)
284 typedef KokkosClassic::MultiVector<scalar_type, node_type> KMV;
291 KMV Q_view = getNonConstView (Q);
292 return tsqr_->revealRank (Q_view, R, tol,
false);
297 Teuchos::RCP<node_tsqr_type> nodeTsqr_;
300 Teuchos::RCP<dist_tsqr_type> distTsqr_;
303 Teuchos::RCP<tsqr_type> tsqr_;
306 mutable Teuchos::RCP<const Teuchos::ParameterList> defaultParams_;
330 prepareTsqr (
const MV& mv)
333 prepareDistTsqr (mv);
334 prepareNodeTsqr (mv);
343 prepareNodeTsqr (
const MV& mv)
348 Teuchos::ParameterList plist;
349 Teuchos::RCP<node_type> node (
new node_type (plist));
350 node_tsqr_factory_type::prepareNodeTsqr (nodeTsqr_, node);
360 prepareDistTsqr (
const MV& mv)
364 using TSQR::Epetra::makeTsqrMessenger;
365 typedef TSQR::MessengerBase<scalar_type> base_mess_type;
370 RCP<const Epetra_Comm> comm = rcp (mv.Comm().Clone());
371 RCP<base_mess_type> messBase = makeTsqrMessenger<scalar_type> (comm);
372 distTsqr_->init (messBase);
387 static KokkosClassic::MultiVector<scalar_type, node_type>
388 getNonConstView (MV& A)
395 TEUCHOS_TEST_FOR_EXCEPTION(! A.ConstantStride(), std::invalid_argument,
396 "TSQR does not currently support Epetra_MultiVector " 397 "inputs that do not have constant stride.");
398 const int numRows = A.MyLength();
399 const int numCols = A.NumVectors();
400 const int stride = A.Stride();
404 Teuchos::ArrayRCP<double> A_ptr (A.Values(), 0, numRows*stride,
false);
406 typedef KokkosClassic::MultiVector<scalar_type, node_type> KMV;
412 Teuchos::ParameterList plist;
413 Teuchos::RCP<node_type> node (
new node_type (plist));
415 A_kmv.initializeValues (numRows, numCols, A_ptr, stride);
422 #endif // defined(HAVE_TPETRA_EPETRA) && defined(HAVE_TPETRA_TSQR) 424 #endif // __Epetra_TsqrAdaptor_hpp KokkosClassic::DefaultNode::DefaultNodeType node_type
Default value of Node template parameter.
Function for wrapping Epetra_Comm in a communicator wrapper that TSQR can use.
double scalar_type
Default value of Scalar template parameter.