14#ifndef _ZOLTAN2_XPETRATRAITS_HPP_
15#define _ZOLTAN2_XPETRATRAITS_HPP_
20#include <Xpetra_TpetraCrsGraph.hpp>
21#include <Xpetra_TpetraCrsMatrix.hpp>
22#include <Xpetra_TpetraVector.hpp>
23#include <Tpetra_Vector.hpp>
48template <
typename User>
72 size_t numLocalRows,
const gno_t *myNewRows)
78#ifndef DOXYGEN_SHOULD_SKIP_THIS
82template <
typename scalar_t,
86struct XpetraTraits<Tpetra::CrsMatrix<scalar_t, lno_t, gno_t, node_t> >
88 typedef typename Xpetra::CrsMatrix<scalar_t,lno_t,gno_t,node_t>
xmatrix_t;
89 typedef typename Xpetra::TpetraCrsMatrix<scalar_t,lno_t,gno_t,node_t> xtmatrix_t;
90 typedef typename Tpetra::CrsMatrix<scalar_t,lno_t,gno_t,node_t>
tmatrix_t;
94 return rcp(
new xtmatrix_t(a));
98 size_t numLocalRows,
const gno_t *myNewRows)
100 typedef Tpetra::Map<lno_t, gno_t, node_t>
map_t;
103 const RCP<const map_t> &smap = from.getRowMap();
104 gno_t numGlobalRows = smap->getGlobalNumElements();
105 gno_t base = smap->getMinAllGlobalIndex();
108 ArrayView<const gno_t> rowList(myNewRows, numLocalRows);
109 const RCP<const Teuchos::Comm<int> > &comm = from.getComm();
110 RCP<const map_t> tmap = rcp(
new map_t(numGlobalRows, rowList, base, comm));
113 Tpetra::Import<lno_t, gno_t, node_t> importer(smap, tmap);
130 from.importAndFillComplete(M, importer, tmap, tmap);
168template <
typename scalar_t,
172struct XpetraTraits<Xpetra::CrsMatrix<scalar_t, lno_t, gno_t, node_t> >
174 typedef Xpetra::CrsMatrix<scalar_t, lno_t, gno_t, node_t> x_matrix_t;
175 typedef Xpetra::TpetraCrsMatrix<scalar_t, lno_t, gno_t, node_t> xt_matrix_t;
176 typedef Tpetra::CrsMatrix<scalar_t,lno_t,gno_t,node_t> t_matrix_t;
178 static inline RCP<x_matrix_t>
convertToXpetra(
const RCP<x_matrix_t > &a)
183 static RCP<x_matrix_t>
doMigration(
const x_matrix_t &from,
184 size_t numLocalRows,
const gno_t *myNewRows)
188 const xt_matrix_t *xtm =
dynamic_cast<const xt_matrix_t *
>(&from);
189 RCP<const t_matrix_t> tm = xtm->getTpetra_CrsMatrix();
192 *tm, numLocalRows, myNewRows);
204template <
typename node_t>
205struct XpetraTraits<Xpetra::CrsMatrix<double, int, int, node_t> >
207 typedef double scalar_t;
210 typedef Xpetra::CrsMatrix<scalar_t, lno_t, gno_t, node_t> x_matrix_t;
211 typedef Xpetra::TpetraCrsMatrix<scalar_t, lno_t, gno_t, node_t> xt_matrix_t;
212 typedef Tpetra::CrsMatrix<scalar_t,lno_t,gno_t,node_t> t_matrix_t;
214 static inline RCP<x_matrix_t>
convertToXpetra(
const RCP<x_matrix_t > &a)
219 static RCP<x_matrix_t>
doMigration(
const x_matrix_t &from,
220 size_t numLocalRows,
const gno_t *myNewRows)
222 Xpetra::UnderlyingLib lib = from.getRowMap()->lib();
226 const xt_matrix_t *xtm =
dynamic_cast<const xt_matrix_t *
>(&from);
227 RCP<const t_matrix_t> tm = xtm->getTpetra_CrsMatrix();
230 *tm, numLocalRows, myNewRows);
242template <
typename lno_t,
245struct XpetraTraits<Tpetra::CrsGraph<lno_t, gno_t, node_t> >
247 typedef typename Xpetra::CrsGraph<lno_t, gno_t, node_t>
xgraph_t;
248 typedef typename Xpetra::TpetraCrsGraph<lno_t, gno_t, node_t> xtgraph_t;
249 typedef typename Tpetra::CrsGraph<lno_t, gno_t, node_t>
tgraph_t;
253 return rcp(
new xtgraph_t(a));
257 size_t numLocalRows,
const gno_t *myNewRows)
259 typedef Tpetra::Map<lno_t, gno_t, node_t>
map_t;
262 const RCP<const map_t> &smap = from.getRowMap();
263 int oldNumElts = smap->getLocalNumElements();
264 gno_t numGlobalRows = smap->getGlobalNumElements();
265 gno_t base = smap->getMinAllGlobalIndex();
268 ArrayView<const gno_t> rowList(myNewRows, numLocalRows);
269 const RCP<const Teuchos::Comm<int> > &comm = from.getComm();
270 RCP<const map_t> tmap = rcp(
new map_t(numGlobalRows, rowList, base, comm));
273 Tpetra::Import<lno_t, gno_t, node_t> importer(smap, tmap);
276 typedef Tpetra::Vector<gno_t, lno_t, gno_t, node_t> vector_t;
277 vector_t numOld(smap);
278 vector_t numNew(tmap);
279 for (
int lid=0; lid < oldNumElts; lid++){
280 numOld.replaceGlobalValue(smap->getGlobalElement(lid),
281 from.getNumEntriesInLocalRow(lid));
283 numNew.doImport(numOld, importer, Tpetra::INSERT);
285 size_t numElts = tmap->getLocalNumElements();
286 ArrayRCP<const gno_t> nnz;
288 nnz = numNew.getData(0);
290 ArrayRCP<const size_t> nnz_size_t;
292 if (numElts &&
sizeof(
gno_t) !=
sizeof(
size_t)){
293 size_t *vals =
new size_t [numElts];
294 nnz_size_t = arcp(vals, 0, numElts,
true);
295 for (
size_t i=0; i < numElts; i++){
296 vals[i] =
static_cast<size_t>(nnz[i]);
300 nnz_size_t = arcp_reinterpret_cast<const size_t>(nnz);
304 RCP<tgraph_t> G = rcp(
new tgraph_t(tmap, nnz_size_t()));
306 G->doImport(from, importer, Tpetra::INSERT);
317template <
typename lno_t,
320struct XpetraTraits<Xpetra::CrsGraph<lno_t, gno_t, node_t> >
322 typedef Xpetra::CrsGraph<lno_t, gno_t, node_t> x_graph_t;
323 typedef Xpetra::TpetraCrsGraph<lno_t, gno_t, node_t> xt_graph_t;
324 typedef Tpetra::CrsGraph<lno_t,gno_t,node_t> t_graph_t;
331 static RCP<x_graph_t>
doMigration(
const x_graph_t &from,
332 size_t numLocalRows,
const gno_t *myNewRows)
336 const xt_graph_t *xtg =
dynamic_cast<const xt_graph_t *
>(&from);
337 RCP<const t_graph_t> tg = xtg->getTpetra_CrsGraph();
340 *tg, numLocalRows, myNewRows);
351template <
typename node_t>
352struct XpetraTraits<Xpetra::CrsGraph<int, int, node_t> >
356 typedef Xpetra::CrsGraph<lno_t, gno_t, node_t> x_graph_t;
357 typedef Xpetra::TpetraCrsGraph<lno_t, gno_t, node_t> xt_graph_t;
358 typedef Tpetra::CrsGraph<lno_t,gno_t,node_t> t_graph_t;
365 static RCP<x_graph_t>
doMigration(
const x_graph_t &from,
366 size_t numLocalRows,
const gno_t *myNewRows)
368 Xpetra::UnderlyingLib lib = from.getRowMap()->lib();
372 const xt_graph_t *xtg =
dynamic_cast<const xt_graph_t *
>(&from);
373 RCP<const t_graph_t> tg = xtg->getTpetra_CrsGraph();
376 *tg, numLocalRows, myNewRows);
387template <
typename scalar_t,
391struct XpetraTraits<Tpetra::
Vector<scalar_t, lno_t, gno_t, node_t> >
393 typedef Tpetra::Vector<scalar_t, lno_t, gno_t, node_t> t_vector_t;
394 typedef Xpetra::TpetraVector<scalar_t, lno_t, gno_t, node_t> xt_vector_t;
395 typedef Xpetra::Vector<scalar_t, lno_t, gno_t, node_t> x_vector_t;
397 static inline RCP<x_vector_t>
convertToXpetra(
const RCP<t_vector_t> &a)
399 return rcp(
new xt_vector_t(a));
402 static RCP<t_vector_t>
doMigration(
const t_vector_t &from,
403 size_t numLocalElts,
const gno_t *myNewElts)
405 typedef Tpetra::Map<lno_t, gno_t, node_t>
map_t;
408 const RCP<const map_t> &smap = from.getMap();
409 gno_t numGlobalElts = smap->getGlobalNumElements();
410 gno_t base = smap->getMinAllGlobalIndex();
413 ArrayView<const gno_t> eltList(myNewElts, numLocalElts);
414 const RCP<const Teuchos::Comm<int> > comm = from.getMap()->getComm();
415 RCP<const map_t> tmap = rcp(
new map_t(numGlobalElts, eltList, base, comm));
418 Tpetra::Import<lno_t, gno_t, node_t> importer(smap, tmap);
422 Tpetra::createVector<scalar_t,lno_t,gno_t,node_t>(tmap);
423 V->doImport(from, importer, Tpetra::INSERT);
432template <
typename scalar_t,
436struct XpetraTraits<Xpetra::
Vector<scalar_t, lno_t, gno_t, node_t> >
438 typedef Xpetra::Vector<scalar_t, lno_t, gno_t, node_t> x_vector_t;
439 typedef Xpetra::TpetraVector<scalar_t, lno_t, gno_t, node_t> xt_vector_t;
440 typedef Tpetra::Vector<scalar_t, lno_t, gno_t, node_t> t_vector_t;
442 static inline RCP<x_vector_t>
convertToXpetra(
const RCP<x_vector_t> &a)
447 static RCP<x_vector_t>
doMigration(
const x_vector_t &from,
448 size_t numLocalRows,
const gno_t *myNewRows)
452 const xt_vector_t *xtv =
dynamic_cast<const xt_vector_t *
>(&from);
453 RCP<const t_vector_t> tv = xtv->getTpetra_Vector();
456 *tv, numLocalRows, myNewRows);
467template <
typename node_t>
468struct XpetraTraits<Xpetra::
Vector<double, int, int, node_t> >
470 typedef double scalar_t;
473 typedef Xpetra::Vector<scalar_t, lno_t, gno_t, node_t> x_vector_t;
474 typedef Xpetra::TpetraVector<scalar_t, lno_t, gno_t, node_t> xt_vector_t;
475 typedef Tpetra::Vector<scalar_t, lno_t, gno_t, node_t> t_vector_t;
477 static inline RCP<x_vector_t>
convertToXpetra(
const RCP<x_vector_t> &a)
482 static RCP<x_vector_t>
doMigration(
const x_vector_t &from,
483 size_t numLocalRows,
const gno_t *myNewRows)
485 Xpetra::UnderlyingLib lib = from.getMap()->lib();
489 const xt_vector_t *xtv =
dynamic_cast<const xt_vector_t *
>(&from);
490 RCP<t_vector_t> tv = xtv->getTpetra_Vector();
493 *tv, numLocalRows, myNewRows);
504template <
typename scalar_t,
508struct XpetraTraits<Tpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> >
510 typedef Tpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> t_vector_t;
511 typedef Xpetra::TpetraMultiVector<scalar_t, lno_t, gno_t, node_t> xt_vector_t;
512 typedef Xpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> x_vector_t;
514 static inline RCP<x_vector_t>
convertToXpetra(
const RCP<t_vector_t> &a)
516 return rcp(
new xt_vector_t(a));
519 static RCP<t_vector_t>
doMigration(
const t_vector_t &from,
520 size_t numLocalElts,
const gno_t *myNewElts)
522 typedef Tpetra::Map<lno_t, gno_t, node_t>
map_t;
525 const RCP<const map_t> &smap = from.getMap();
526 gno_t numGlobalElts = smap->getGlobalNumElements();
527 gno_t base = smap->getMinAllGlobalIndex();
530 ArrayView<const gno_t> eltList(myNewElts, numLocalElts);
531 const RCP<const Teuchos::Comm<int> > comm = from.getMap()->getComm();
532 RCP<const map_t> tmap = rcp(
new map_t(numGlobalElts, eltList, base, comm));
535 Tpetra::Import<lno_t, gno_t, node_t> importer(smap, tmap);
538 RCP<t_vector_t> MV = rcp(
539 new t_vector_t(tmap, from.getNumVectors(),
true));
540 MV->doImport(from, importer, Tpetra::INSERT);
549template <
typename scalar_t,
553struct XpetraTraits<Xpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> >
555 typedef Xpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> x_mvector_t;
556 typedef Xpetra::TpetraMultiVector<scalar_t, lno_t, gno_t, node_t> xt_mvector_t;
557 typedef Tpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> t_mvector_t;
559 static inline RCP<x_mvector_t>
convertToXpetra(
const RCP<x_mvector_t> &a)
564 static RCP<x_mvector_t>
doMigration(
const x_mvector_t &from,
565 size_t numLocalRows,
const gno_t *myNewRows)
569 const xt_mvector_t *xtv =
dynamic_cast<const xt_mvector_t *
>(&from);
570 RCP<t_mvector_t> tv = xtv->getTpetra_MultiVector();
573 *tv, numLocalRows, myNewRows);
584template <
typename node_t>
585struct XpetraTraits<Xpetra::MultiVector<double, int, int, node_t> >
587 typedef double scalar_t;
590 typedef Xpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> x_mvector_t;
591 typedef Xpetra::TpetraMultiVector<scalar_t, lno_t, gno_t, node_t> xt_mvector_t;
592 typedef Tpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> t_mvector_t;
594 static inline RCP<x_mvector_t>
convertToXpetra(
const RCP<x_mvector_t> &a)
599 static RCP<x_mvector_t>
doMigration(
const x_mvector_t &from,
600 size_t numLocalRows,
const gno_t *myNewRows)
602 Xpetra::UnderlyingLib lib = from.getMap()->lib();
606 const xt_mvector_t *xtv =
dynamic_cast<const xt_mvector_t *
>(&from);
607 RCP<t_mvector_t> tv = xtv->getTpetra_MultiVector();
610 *tv, numLocalRows, myNewRows);
Gathering definitions used in software development.
Tpetra::Vector< z2TestScalar, z2TestLO, z2TestGO > Vector
map_t::local_ordinal_type lno_t
map_t::global_ordinal_type gno_t
Created by mbenlioglu on Aug 31, 2020.
::Tpetra::Details::DefaultTypes::local_ordinal_type default_lno_t
::Tpetra::Details::DefaultTypes::global_ordinal_type default_gno_t
Defines the traits required for Tpetra, Eptra and Xpetra objects.
static RCP< User > doMigration(const User &from, size_t numLocalRows, const gno_t *myNewRows)
Migrate the object Given a user object and a new row distribution, create and return a new user objec...
static RCP< User > convertToXpetra(const RCP< User > &a)
Convert the object to its Xpetra wrapped version.
default_gno_t gno_t
The objects global ordinal data type.
default_lno_t lno_t
The objects local ordinal data type.