10#ifndef PACKAGES_MUELU_IMPORT_UTILS_HPP_
11#define PACKAGES_MUELU_IMPORT_UTILS_HPP_
13#include "Xpetra_ConfigDefs.hpp"
14#include "Xpetra_Exceptions.hpp"
15#include "Xpetra_Map.hpp"
16#include "Xpetra_Import.hpp"
17#include "Teuchos_Array.hpp"
18#include "Teuchos_ArrayView.hpp"
22#ifdef HAVE_XPETRA_EPETRA
23#include "Epetra_Util.h"
24#include "Xpetra_EpetraImport.hpp"
27#ifdef HAVE_XPETRA_TPETRA
28#include "Xpetra_TpetraImport.hpp"
29#include "Tpetra_Import_Util.hpp"
43 class Node = Tpetra::KokkosClassic::DefaultNode::DefaultNodeType>
45#undef MUELU_IMPORTUTILS_SHORT
55 getPidGidPairs(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
56 Teuchos::Array<std::pair<int, GlobalOrdinal> >& gpids,
57 bool use_minus_one_for_local) {
58 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
59 if (lib == Xpetra::UseEpetra) {
60#if defined(HAVE_XPETRA_EPETRA)
61 throw(Xpetra::Exceptions::RuntimeError(
"Xpetra::ImportUtils only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)"));
63 }
else if (lib == Xpetra::UseTpetra) {
64#ifdef HAVE_XPETRA_TPETRA
65 Tpetra::Import_Util::getPidGidPairs(Xpetra::toTpetra(Importer), gpids, use_minus_one_for_local);
72 getPids(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
73 Teuchos::Array<int>& pids,
74 bool use_minus_one_for_local) {
75 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
76 if (lib == Xpetra::UseEpetra) {
77#if defined(HAVE_XPETRA_EPETRA)
78 throw(Xpetra::Exceptions::RuntimeError(
"Xpetra::ImportUtils only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)"));
80 }
else if (lib == Xpetra::UseTpetra) {
81#ifdef HAVE_XPETRA_TPETRA
82 Tpetra::Import_Util::getPids(Xpetra::toTpetra(Importer), pids, use_minus_one_for_local);
90 getPids(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
91 Teuchos::ArrayView<int>& pids,
92 bool use_minus_one_for_local) {
93 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
94 if (lib == Xpetra::UseEpetra) {
95#if defined(HAVE_XPETRA_EPETRA)
96 throw(Xpetra::Exceptions::RuntimeError(
"Xpetra::ImportUtils only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)"));
98 }
else if (lib == Xpetra::UseTpetra) {
99#ifdef HAVE_XPETRA_TPETRA
100 Tpetra::Import_Util::getPids(Xpetra::toTpetra(Importer), pids, use_minus_one_for_local);
108 getRemotePIDs(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
109 Teuchos::Array<int>& RemotePIDs) {
110 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
111 if (lib == Xpetra::UseEpetra) {
112#if defined(HAVE_XPETRA_EPETRA)
113 throw(Xpetra::Exceptions::RuntimeError(
"Xpetra::ImportUtils only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)"));
115 }
else if (lib == Xpetra::UseTpetra) {
116#ifdef HAVE_XPETRA_TPETRA
117 Tpetra::Import_Util::getRemotePIDs(Xpetra::toTpetra(Importer), RemotePIDs);
124#ifdef HAVE_XPETRA_EPETRA
130 typedef Xpetra::EpetraNode
Node;
131#undef MUELU_IMPORTUTILS_SHORT
135 getPidGidPairs(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
136 Teuchos::Array<std::pair<int, GlobalOrdinal> >& gpids,
137 bool use_minus_one_for_local) {
138 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
139 if (lib == Xpetra::UseEpetra) {
140 RCP<const Epetra_Import> e_Importer =
dynamic_cast<const Xpetra::EpetraImportT<GlobalOrdinal, Node>*
>(&Importer)->getEpetra_Import();
141 std::vector<std::pair<int, GlobalOrdinal> > gpids_v(gpids.size());
143 std::copy(gpids_v.begin(), gpids_v.end(), gpids.begin());
144 }
else if (lib == Xpetra::UseTpetra) {
145#ifdef HAVE_XPETRA_TPETRA
146 Tpetra::Import_Util::getPidGidPairs(Xpetra::toTpetra(Importer), gpids, use_minus_one_for_local);
153 getPids(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
154 Teuchos::Array<int>& pids,
155 bool use_minus_one_for_local) {
156 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
157 if (lib == Xpetra::UseEpetra) {
158 RCP<const Epetra_Import> e_Importer =
dynamic_cast<const Xpetra::EpetraImportT<GlobalOrdinal, Node>*
>(&Importer)->getEpetra_Import();
159 std::vector<int> pids_v(pids.size());
161 std::copy(pids_v.begin(), pids_v.end(), pids.begin());
162 }
else if (lib == Xpetra::UseTpetra) {
163#ifdef HAVE_XPETRA_TPETRA
164 Tpetra::Import_Util::getPids(Xpetra::toTpetra(Importer), pids, use_minus_one_for_local);
172 getPids(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
173 Teuchos::ArrayView<int>& pids,
174 bool use_minus_one_for_local) {
175 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
176 if (lib == Xpetra::UseEpetra) {
177 RCP<const Epetra_Import> e_Importer =
dynamic_cast<const Xpetra::EpetraImportT<GlobalOrdinal, Node>*
>(&Importer)->getEpetra_Import();
178 std::vector<int> pids_v(pids.begin(), pids.end());
180 }
else if (lib == Xpetra::UseTpetra) {
181#ifdef HAVE_XPETRA_TPETRA
182 Tpetra::Import_Util::getPids(Xpetra::toTpetra(Importer), pids, use_minus_one_for_local);
190 getRemotePIDs(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
191 Teuchos::Array<int>& RemotePIDs) {
192 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
193 if (lib == Xpetra::UseEpetra) {
194 RCP<const Epetra_Import> e_Importer =
dynamic_cast<const Xpetra::EpetraImportT<GlobalOrdinal, Node>*
>(&Importer)->getEpetra_Import();
195 std::vector<int> pids_v(RemotePIDs.size());
197 std::copy(pids_v.begin(), pids_v.end(), RemotePIDs.begin());
198 }
else if (lib == Xpetra::UseTpetra) {
199#ifdef HAVE_XPETRA_TPETRA
200 Tpetra::Import_Util::getRemotePIDs(Xpetra::toTpetra(Importer), RemotePIDs);
212 typedef Xpetra::EpetraNode
Node;
213#undef MUELU_IMPORTUTILS_SHORT
217 getPidGidPairs(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
218 Teuchos::Array<std::pair<int, GlobalOrdinal> >& gpids,
219 bool use_minus_one_for_local) {
220 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
221 if (lib == Xpetra::UseEpetra) {
222 RCP<const Epetra_Import> e_Importer =
dynamic_cast<const Xpetra::EpetraImportT<GlobalOrdinal, Node>*
>(&Importer)->getEpetra_Import();
223 std::vector<std::pair<int, GlobalOrdinal> > gpids_v(gpids.size());
225 std::copy(gpids_v.begin(), gpids_v.end(), gpids.begin());
227 }
else if (lib == Xpetra::UseTpetra) {
228#ifdef HAVE_XPETRA_TPETRA
229 Tpetra::Import_Util::getPidGidPairs(Xpetra::toTpetra(Importer), gpids, use_minus_one_for_local);
236 getPids(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
237 Teuchos::Array<int>& pids,
238 bool use_minus_one_for_local) {
239 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
240 if (lib == Xpetra::UseEpetra) {
241 RCP<const Epetra_Import> e_Importer =
dynamic_cast<const Xpetra::EpetraImportT<GlobalOrdinal, Node>*
>(&Importer)->getEpetra_Import();
242 std::vector<int> pids_v(pids.size());
244 std::copy(pids_v.begin(), pids_v.end(), pids.begin());
245 }
else if (lib == Xpetra::UseTpetra) {
246#ifdef HAVE_XPETRA_TPETRA
247 Tpetra::Import_Util::getPids(Xpetra::toTpetra(Importer), pids, use_minus_one_for_local);
255 getPids(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
256 Teuchos::ArrayView<int>& pids,
257 bool use_minus_one_for_local) {
258 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
259 if (lib == Xpetra::UseEpetra) {
260 RCP<const Epetra_Import> e_Importer =
dynamic_cast<const Xpetra::EpetraImportT<GlobalOrdinal, Node>*
>(&Importer)->getEpetra_Import();
261 std::vector<int> pids_v(pids.size());
263 std::copy(pids_v.begin(), pids_v.end(), pids.begin());
264 }
else if (lib == Xpetra::UseTpetra) {
265#ifdef HAVE_XPETRA_TPETRA
266 Tpetra::Import_Util::getPids(Xpetra::toTpetra(Importer), pids, use_minus_one_for_local);
274 getRemotePIDs(
const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer,
275 Teuchos::Array<int>& RemotePIDs) {
276 Xpetra::UnderlyingLib lib = Importer.getSourceMap()->lib();
277 if (lib == Xpetra::UseEpetra) {
278 RCP<const Epetra_Import> e_Importer =
dynamic_cast<const Xpetra::EpetraImportT<GlobalOrdinal, Node>*
>(&Importer)->getEpetra_Import();
279 std::vector<int> pids_v(RemotePIDs.size());
281 std::copy(pids_v.begin(), pids_v.end(), RemotePIDs.begin());
282 }
else if (lib == Xpetra::UseTpetra) {
283#ifdef HAVE_XPETRA_TPETRA
284 Tpetra::Import_Util::getRemotePIDs(Xpetra::toTpetra(Importer), RemotePIDs);
294#define MUELU_IMPORTUTILS_SHORT
Tpetra::KokkosCompat::KokkosSerialWrapperNode EpetraNode
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultGlobalOrdinal GlobalOrdinal
static int GetRemotePIDs(const Epetra_Import &Importer, std::vector< int > &RemotePIDs)
static int GetPidGidPairs(const Epetra_Import &Importer, std::vector< std::pair< int, int > > &gpids, bool use_minus_one_for_local)
static int GetPids(const Epetra_Import &Importer, std::vector< int > &pids, bool use_minus_one_for_local)
MueLu utility class for Import-related routines.
void getRemotePIDs(const Xpetra::Import< LocalOrdinal, GlobalOrdinal, Node > &Importer, Teuchos::Array< int > &RemotePIDs)
Get a list of remote PIDs from an importer in the order corresponding to the remote LIDs.
void getPids(const Xpetra::Import< LocalOrdinal, GlobalOrdinal, Node > &Importer, Teuchos::ArrayView< int > &pids, bool use_minus_one_for_local)
Like getPidGidPairs, but just gets the PIDs, ordered by the column Map.
void getPidGidPairs(const Xpetra::Import< LocalOrdinal, GlobalOrdinal, Node > &Importer, Teuchos::Array< std::pair< int, GlobalOrdinal > > &gpids, bool use_minus_one_for_local)
For each GID in the TargetMap, find who owns the GID in the SourceMap.
void getPids(const Xpetra::Import< LocalOrdinal, GlobalOrdinal, Node > &Importer, Teuchos::Array< int > &pids, bool use_minus_one_for_local)
Like getPidGidPairs, but just gets the PIDs, ordered by the column Map.
Namespace for MueLu classes and methods.