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)
224 const xt_matrix_t *xtm =
dynamic_cast<const xt_matrix_t *
>(&from);
225 RCP<const t_matrix_t> tm = xtm->getTpetra_CrsMatrix();
228 *tm, numLocalRows, myNewRows);
240template <
typename lno_t,
243struct XpetraTraits<Tpetra::CrsGraph<lno_t, gno_t, node_t> >
245 typedef typename Xpetra::CrsGraph<lno_t, gno_t, node_t>
xgraph_t;
246 typedef typename Xpetra::TpetraCrsGraph<lno_t, gno_t, node_t> xtgraph_t;
247 typedef typename Tpetra::CrsGraph<lno_t, gno_t, node_t>
tgraph_t;
251 return rcp(
new xtgraph_t(a));
255 size_t numLocalRows,
const gno_t *myNewRows)
257 typedef Tpetra::Map<lno_t, gno_t, node_t>
map_t;
260 const RCP<const map_t> &smap = from.getRowMap();
261 int oldNumElts = smap->getLocalNumElements();
262 gno_t numGlobalRows = smap->getGlobalNumElements();
263 gno_t base = smap->getMinAllGlobalIndex();
266 ArrayView<const gno_t> rowList(myNewRows, numLocalRows);
267 const RCP<const Teuchos::Comm<int> > &comm = from.getComm();
268 RCP<const map_t> tmap = rcp(
new map_t(numGlobalRows, rowList, base, comm));
271 Tpetra::Import<lno_t, gno_t, node_t> importer(smap, tmap);
274 typedef Tpetra::Vector<gno_t, lno_t, gno_t, node_t> vector_t;
275 vector_t numOld(smap);
276 vector_t numNew(tmap);
277 for (
int lid=0; lid < oldNumElts; lid++){
278 numOld.replaceGlobalValue(smap->getGlobalElement(lid),
279 from.getNumEntriesInLocalRow(lid));
281 numNew.doImport(numOld, importer, Tpetra::INSERT);
283 size_t numElts = tmap->getLocalNumElements();
284 ArrayRCP<const gno_t> nnz;
286 nnz = numNew.getData(0);
288 ArrayRCP<const size_t> nnz_size_t;
290 if (numElts &&
sizeof(
gno_t) !=
sizeof(
size_t)){
291 size_t *vals =
new size_t [numElts];
292 nnz_size_t = arcp(vals, 0, numElts,
true);
293 for (
size_t i=0; i < numElts; i++){
294 vals[i] =
static_cast<size_t>(nnz[i]);
298 nnz_size_t = arcp_reinterpret_cast<const size_t>(nnz);
302 RCP<tgraph_t> G = rcp(
new tgraph_t(tmap, nnz_size_t()));
304 G->doImport(from, importer, Tpetra::INSERT);
315template <
typename lno_t,
318struct XpetraTraits<Xpetra::CrsGraph<lno_t, gno_t, node_t> >
320 typedef Xpetra::CrsGraph<lno_t, gno_t, node_t> x_graph_t;
321 typedef Xpetra::TpetraCrsGraph<lno_t, gno_t, node_t> xt_graph_t;
322 typedef Tpetra::CrsGraph<lno_t,gno_t,node_t> t_graph_t;
329 static RCP<x_graph_t>
doMigration(
const x_graph_t &from,
330 size_t numLocalRows,
const gno_t *myNewRows)
334 const xt_graph_t *xtg =
dynamic_cast<const xt_graph_t *
>(&from);
335 RCP<const t_graph_t> tg = xtg->getTpetra_CrsGraph();
338 *tg, numLocalRows, myNewRows);
349template <
typename node_t>
350struct XpetraTraits<Xpetra::CrsGraph<int, int, node_t> >
354 typedef Xpetra::CrsGraph<lno_t, gno_t, node_t> x_graph_t;
355 typedef Xpetra::TpetraCrsGraph<lno_t, gno_t, node_t> xt_graph_t;
356 typedef Tpetra::CrsGraph<lno_t,gno_t,node_t> t_graph_t;
363 static RCP<x_graph_t>
doMigration(
const x_graph_t &from,
364 size_t numLocalRows,
const gno_t *myNewRows)
368 const xt_graph_t *xtg =
dynamic_cast<const xt_graph_t *
>(&from);
369 RCP<const t_graph_t> tg = xtg->getTpetra_CrsGraph();
372 *tg, numLocalRows, myNewRows);
383template <
typename scalar_t,
387struct XpetraTraits<Tpetra::
Vector<scalar_t, lno_t, gno_t, node_t> >
389 typedef Tpetra::Vector<scalar_t, lno_t, gno_t, node_t> t_vector_t;
390 typedef Xpetra::TpetraVector<scalar_t, lno_t, gno_t, node_t> xt_vector_t;
391 typedef Xpetra::Vector<scalar_t, lno_t, gno_t, node_t> x_vector_t;
393 static inline RCP<x_vector_t>
convertToXpetra(
const RCP<t_vector_t> &a)
395 return rcp(
new xt_vector_t(a));
398 static RCP<t_vector_t>
doMigration(
const t_vector_t &from,
399 size_t numLocalElts,
const gno_t *myNewElts)
401 typedef Tpetra::Map<lno_t, gno_t, node_t>
map_t;
404 const RCP<const map_t> &smap = from.getMap();
405 gno_t numGlobalElts = smap->getGlobalNumElements();
406 gno_t base = smap->getMinAllGlobalIndex();
409 ArrayView<const gno_t> eltList(myNewElts, numLocalElts);
410 const RCP<const Teuchos::Comm<int> > comm = from.getMap()->getComm();
411 RCP<const map_t> tmap = rcp(
new map_t(numGlobalElts, eltList, base, comm));
414 Tpetra::Import<lno_t, gno_t, node_t> importer(smap, tmap);
418 Tpetra::createVector<scalar_t,lno_t,gno_t,node_t>(tmap);
419 V->doImport(from, importer, Tpetra::INSERT);
428template <
typename scalar_t,
432struct XpetraTraits<Xpetra::
Vector<scalar_t, lno_t, gno_t, node_t> >
434 typedef Xpetra::Vector<scalar_t, lno_t, gno_t, node_t> x_vector_t;
435 typedef Xpetra::TpetraVector<scalar_t, lno_t, gno_t, node_t> xt_vector_t;
436 typedef Tpetra::Vector<scalar_t, lno_t, gno_t, node_t> t_vector_t;
438 static inline RCP<x_vector_t>
convertToXpetra(
const RCP<x_vector_t> &a)
443 static RCP<x_vector_t>
doMigration(
const x_vector_t &from,
444 size_t numLocalRows,
const gno_t *myNewRows)
448 const xt_vector_t *xtv =
dynamic_cast<const xt_vector_t *
>(&from);
449 RCP<const t_vector_t> tv = xtv->getTpetra_Vector();
452 *tv, numLocalRows, myNewRows);
463template <
typename node_t>
464struct XpetraTraits<Xpetra::
Vector<double, int, int, node_t> >
466 typedef double scalar_t;
469 typedef Xpetra::Vector<scalar_t, lno_t, gno_t, node_t> x_vector_t;
470 typedef Xpetra::TpetraVector<scalar_t, lno_t, gno_t, node_t> xt_vector_t;
471 typedef Tpetra::Vector<scalar_t, lno_t, gno_t, node_t> t_vector_t;
473 static inline RCP<x_vector_t>
convertToXpetra(
const RCP<x_vector_t> &a)
478 static RCP<x_vector_t>
doMigration(
const x_vector_t &from,
479 size_t numLocalRows,
const gno_t *myNewRows)
483 const xt_vector_t *xtv =
dynamic_cast<const xt_vector_t *
>(&from);
484 RCP<t_vector_t> tv = xtv->getTpetra_Vector();
487 *tv, numLocalRows, myNewRows);
498template <
typename scalar_t,
502struct XpetraTraits<Tpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> >
504 typedef Tpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> t_vector_t;
505 typedef Xpetra::TpetraMultiVector<scalar_t, lno_t, gno_t, node_t> xt_vector_t;
506 typedef Xpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> x_vector_t;
508 static inline RCP<x_vector_t>
convertToXpetra(
const RCP<t_vector_t> &a)
510 return rcp(
new xt_vector_t(a));
513 static RCP<t_vector_t>
doMigration(
const t_vector_t &from,
514 size_t numLocalElts,
const gno_t *myNewElts)
516 typedef Tpetra::Map<lno_t, gno_t, node_t>
map_t;
519 const RCP<const map_t> &smap = from.getMap();
520 gno_t numGlobalElts = smap->getGlobalNumElements();
521 gno_t base = smap->getMinAllGlobalIndex();
524 ArrayView<const gno_t> eltList(myNewElts, numLocalElts);
525 const RCP<const Teuchos::Comm<int> > comm = from.getMap()->getComm();
526 RCP<const map_t> tmap = rcp(
new map_t(numGlobalElts, eltList, base, comm));
529 Tpetra::Import<lno_t, gno_t, node_t> importer(smap, tmap);
532 RCP<t_vector_t> MV = rcp(
533 new t_vector_t(tmap, from.getNumVectors(),
true));
534 MV->doImport(from, importer, Tpetra::INSERT);
543template <
typename scalar_t,
547struct XpetraTraits<Xpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> >
549 typedef Xpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> x_mvector_t;
550 typedef Xpetra::TpetraMultiVector<scalar_t, lno_t, gno_t, node_t> xt_mvector_t;
551 typedef Tpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> t_mvector_t;
553 static inline RCP<x_mvector_t>
convertToXpetra(
const RCP<x_mvector_t> &a)
558 static RCP<x_mvector_t>
doMigration(
const x_mvector_t &from,
559 size_t numLocalRows,
const gno_t *myNewRows)
563 const xt_mvector_t *xtv =
dynamic_cast<const xt_mvector_t *
>(&from);
564 RCP<t_mvector_t> tv = xtv->getTpetra_MultiVector();
567 *tv, numLocalRows, myNewRows);
578template <
typename node_t>
579struct XpetraTraits<Xpetra::MultiVector<double, int, int, node_t> >
581 typedef double scalar_t;
584 typedef Xpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> x_mvector_t;
585 typedef Xpetra::TpetraMultiVector<scalar_t, lno_t, gno_t, node_t> xt_mvector_t;
586 typedef Tpetra::MultiVector<scalar_t, lno_t, gno_t, node_t> t_mvector_t;
588 static inline RCP<x_mvector_t>
convertToXpetra(
const RCP<x_mvector_t> &a)
593 static RCP<x_mvector_t>
doMigration(
const x_mvector_t &from,
594 size_t numLocalRows,
const gno_t *myNewRows)
598 const xt_mvector_t *xtv =
dynamic_cast<const xt_mvector_t *
>(&from);
599 RCP<t_mvector_t> tv = xtv->getTpetra_MultiVector();
602 *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.