00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #ifndef XPETRA_MAPFACTORY_HPP
00047 #define XPETRA_MAPFACTORY_HPP
00048
00049 #include "Xpetra_ConfigDefs.hpp"
00050
00051 #include "Xpetra_Map.hpp"
00052
00053 #ifdef HAVE_XPETRA_TPETRA
00054 #include "Xpetra_TpetraMap.hpp"
00055 #endif
00056 #ifdef HAVE_XPETRA_EPETRA
00057 #include "Xpetra_EpetraMap.hpp"
00058 #endif
00059
00060 #include "Xpetra_Exceptions.hpp"
00061
00062
00063
00064 namespace Xpetra {
00065
00066 template <class LocalOrdinal, class GlobalOrdinal = LocalOrdinal, class Node = Kokkos::DefaultNode::DefaultNodeType>
00067 class MapFactory {
00068
00069 private:
00071 MapFactory() {}
00072
00073 public:
00074
00076 static Teuchos::RCP<Map<LocalOrdinal,GlobalOrdinal, Node> > Build(UnderlyingLib lib, global_size_t numGlobalElements, GlobalOrdinal indexBase, const Teuchos::RCP<const Teuchos::Comm<int> > &comm, LocalGlobal lg=Xpetra::GloballyDistributed, const Teuchos::RCP<Node> &node = Kokkos::DefaultNode::getDefaultNode()) {
00077 XPETRA_MONITOR("MapFactory::Build");
00078
00079 #ifdef HAVE_XPETRA_TPETRA
00080 if (lib == UseTpetra)
00081 return Teuchos::rcp( new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (numGlobalElements, indexBase, comm, lg, node) );
00082 #endif
00083
00084 XPETRA_FACTORY_ERROR_IF_EPETRA(lib);
00085 XPETRA_FACTORY_END;
00086 }
00087
00089 static Teuchos::RCP<Map<LocalOrdinal,GlobalOrdinal, Node> > Build(UnderlyingLib lib, global_size_t numGlobalElements, size_t numLocalElements, GlobalOrdinal indexBase, const Teuchos::RCP<const Teuchos::Comm<int> > &comm, const Teuchos::RCP<Node> &node = Kokkos::DefaultNode::getDefaultNode()) {
00090 XPETRA_MONITOR("MapFactory::Build");
00091
00092 #ifdef HAVE_XPETRA_TPETRA
00093 if (lib == UseTpetra)
00094 return rcp( new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (numGlobalElements, numLocalElements, indexBase, comm, node) );
00095 #endif
00096
00097 XPETRA_FACTORY_ERROR_IF_EPETRA(lib);
00098 XPETRA_FACTORY_END;
00099 }
00100
00102 static Teuchos::RCP<Map<LocalOrdinal,GlobalOrdinal, Node> > Build(UnderlyingLib lib, global_size_t numGlobalElements, const Teuchos::ArrayView<const GlobalOrdinal> &elementList, GlobalOrdinal indexBase, const Teuchos::RCP<const Teuchos::Comm<int> > &comm, const Teuchos::RCP<Node> &node = Kokkos::DefaultNode::getDefaultNode()) {
00103 XPETRA_MONITOR("MapFactory::Build");
00104
00105 #ifdef HAVE_XPETRA_TPETRA
00106 if (lib == UseTpetra)
00107 return rcp( new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (numGlobalElements, elementList, indexBase, comm, node) );
00108 #endif
00109
00110 XPETRA_FACTORY_ERROR_IF_EPETRA(lib);
00111 XPETRA_FACTORY_END;
00112 }
00113
00115 static Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal, Node> >
00116 createLocalMap(UnderlyingLib lib, size_t numElements, const Teuchos::RCP< const Teuchos::Comm< int > > &comm) {
00117 XPETRA_MONITOR("MapFactory::Build");
00118
00119 #ifdef HAVE_XPETRA_TPETRA
00120 if (lib == UseTpetra)
00121 return rcp(new Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal>(Tpetra::createLocalMap<LocalOrdinal,GlobalOrdinal>(numElements, comm)));
00122 #endif
00123
00124 XPETRA_FACTORY_ERROR_IF_EPETRA(lib);
00125 XPETRA_FACTORY_END;
00126 }
00127
00129 static Teuchos::RCP< const Map<LocalOrdinal,GlobalOrdinal, Node> >
00130 createLocalMapWithNode(UnderlyingLib lib, size_t numElements, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, const Teuchos::RCP< Node > &node) {
00131 XPETRA_MONITOR("MapFactory::Build");
00132
00133 #ifdef HAVE_XPETRA_TPETRA
00134 if (lib == UseTpetra)
00135 return rcp(new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(numElements, comm, node)));
00136 #endif
00137
00138 XPETRA_FACTORY_ERROR_IF_EPETRA(lib);
00139 XPETRA_FACTORY_END;
00140 }
00141
00143 static Teuchos::RCP< const Map<LocalOrdinal,GlobalOrdinal, Node> >
00144 createUniformContigMapWithNode(UnderlyingLib lib, global_size_t numElements,
00145 const Teuchos::RCP< const Teuchos::Comm< int > > &comm, const Teuchos::RCP< Node > &node) {
00146 XPETRA_MONITOR("MapFactory::Build");
00147
00148 #ifdef HAVE_XPETRA_TPETRA
00149 if (lib == UseTpetra)
00150 return rcp(new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(numElements, comm, node)));
00151 #endif
00152
00153 XPETRA_FACTORY_ERROR_IF_EPETRA(lib);
00154 XPETRA_FACTORY_END;
00155 }
00156
00158 static Teuchos::RCP< const Map<LocalOrdinal,GlobalOrdinal, Node> >
00159 createUniformContigMap(UnderlyingLib lib, global_size_t numElements, const Teuchos::RCP< const Teuchos::Comm< int > > &comm) {
00160 XPETRA_MONITOR("MapFactory::Build");
00161
00162 #ifdef HAVE_XPETRA_TPETRA
00163 if (lib == UseTpetra)
00164 return rcp(new Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal>(Tpetra::createUniformContigMap<LocalOrdinal,GlobalOrdinal>(numElements, comm)));
00165 #endif
00166
00167 XPETRA_FACTORY_ERROR_IF_EPETRA(lib);
00168 XPETRA_FACTORY_END;
00169 }
00170
00172 static Teuchos::RCP< const Map<LocalOrdinal,GlobalOrdinal, Node> >
00173 createContigMap(UnderlyingLib lib, global_size_t numElements, size_t localNumElements, const Teuchos::RCP< const Teuchos::Comm< int > > &comm) {
00174 XPETRA_MONITOR("MapFactory::Build");
00175
00176 #ifdef HAVE_XPETRA_TPETRA
00177 if (lib == UseTpetra)
00178 return rcp(new Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal>(Tpetra::createContigMap<LocalOrdinal,GlobalOrdinal>(numElements, localNumElements, comm)));
00179 #endif
00180
00181 XPETRA_FACTORY_ERROR_IF_EPETRA(lib);
00182 XPETRA_FACTORY_END;
00183 }
00184
00186 static Teuchos::RCP< const Map<LocalOrdinal,GlobalOrdinal, Node> >
00187 createContigMapWithNode(UnderlyingLib lib, global_size_t numElements, size_t localNumElements,
00188 const Teuchos::RCP< const Teuchos::Comm< int > > &comm, const Teuchos::RCP< Node > &node) {
00189 XPETRA_MONITOR("MapFactory::Build");
00190
00191 #ifdef HAVE_XPETRA_TPETRA
00192 if (lib == UseTpetra)
00193 return rcp(new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (Tpetra::createContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(numElements, localNumElements, comm, node)));
00194 #endif
00195
00196 XPETRA_FACTORY_ERROR_IF_EPETRA(lib);
00197 XPETRA_FACTORY_END;
00198 }
00199
00200 };
00201
00202 template <>
00203 class MapFactory<int, int> {
00204
00205 typedef int LocalOrdinal;
00206 typedef int GlobalOrdinal;
00207 typedef Kokkos::DefaultNode::DefaultNodeType Node;
00208
00209 private:
00211 MapFactory() {}
00212
00213 public:
00214
00215 static RCP<Map<LocalOrdinal,GlobalOrdinal, Node> > Build(UnderlyingLib lib, global_size_t numGlobalElements, int indexBase, const Teuchos::RCP<const Teuchos::Comm<int> > &comm, LocalGlobal lg=GloballyDistributed, const Teuchos::RCP<Kokkos::DefaultNode::DefaultNodeType> &node = Kokkos::DefaultNode::getDefaultNode()) {
00216 XPETRA_MONITOR("MapFactory::Build");
00217
00218 #ifdef HAVE_XPETRA_TPETRA
00219 if (lib == UseTpetra)
00220 return rcp( new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (numGlobalElements, indexBase, comm, lg, node) );
00221 #endif
00222
00223 #ifdef HAVE_XPETRA_EPETRA
00224 if (lib == UseEpetra)
00225 return rcp( new EpetraMap(numGlobalElements, indexBase, comm, lg, node) );
00226 #endif
00227
00228 XPETRA_FACTORY_END;
00229 }
00230
00231 static RCP<Map<LocalOrdinal,GlobalOrdinal, Node> > Build(UnderlyingLib lib, global_size_t numGlobalElements, size_t numLocalElements, int indexBase, const Teuchos::RCP<const Teuchos::Comm<int> > &comm, const Teuchos::RCP<Kokkos::DefaultNode::DefaultNodeType> &node = Kokkos::DefaultNode::getDefaultNode()) {
00232 XPETRA_MONITOR("MapFactory::Build");
00233
00234 #ifdef HAVE_XPETRA_TPETRA
00235 if (lib == UseTpetra)
00236 return rcp( new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (numGlobalElements, numLocalElements, indexBase, comm, node) );
00237 #endif
00238
00239 #ifdef HAVE_XPETRA_EPETRA
00240 if (lib == UseEpetra)
00241 return rcp( new EpetraMap(numGlobalElements, numLocalElements, indexBase, comm, node) );
00242 #endif
00243
00244 XPETRA_FACTORY_END;
00245 }
00246
00247 static RCP<Map<LocalOrdinal,GlobalOrdinal, Node> > Build(UnderlyingLib lib, global_size_t numGlobalElements, const Teuchos::ArrayView<const int> &elementList, int indexBase, const Teuchos::RCP<const Teuchos::Comm<int> > &comm, const Teuchos::RCP<Kokkos::DefaultNode::DefaultNodeType> &node = Kokkos::DefaultNode::getDefaultNode()) {
00248 XPETRA_MONITOR("MapFactory::Build");
00249
00250 #ifdef HAVE_XPETRA_TPETRA
00251 if (lib == UseTpetra)
00252 return rcp( new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (numGlobalElements, elementList, indexBase, comm, node) );
00253 #endif
00254
00255 #ifdef HAVE_XPETRA_EPETRA
00256 if (lib == UseEpetra)
00257 return rcp( new EpetraMap(numGlobalElements, elementList, indexBase, comm, node) );
00258 #endif
00259
00260 XPETRA_FACTORY_END;
00261 }
00262
00263 static Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal, Node> >
00264 createLocalMap(UnderlyingLib lib, size_t numElements, const Teuchos::RCP< const Teuchos::Comm< int > > &comm) {
00265 XPETRA_MONITOR("MapFactory::Build");
00266
00267 #ifdef HAVE_XPETRA_TPETRA
00268 if (lib == UseTpetra)
00269 return rcp( new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (Tpetra::createLocalMap<int,int>(numElements, comm)));
00270 #endif
00271
00272 #ifdef HAVE_XPETRA_EPETRA
00273 if (lib == UseEpetra)
00274 return MapFactory<int, int, Kokkos::DefaultNode::DefaultNodeType>::createLocalMapWithNode(lib, numElements, comm, Kokkos::DefaultNode::getDefaultNode());
00275 #endif
00276
00277 XPETRA_FACTORY_END;
00278 }
00279
00280 static Teuchos::RCP< const Map<LocalOrdinal,GlobalOrdinal, Node> >
00281 createLocalMapWithNode(UnderlyingLib lib, size_t numElements, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, const Teuchos::RCP<Kokkos::DefaultNode::DefaultNodeType> &node) {
00282 XPETRA_MONITOR("MapFactory::Build");
00283
00284 #ifdef HAVE_XPETRA_TPETRA
00285 if (lib == UseTpetra)
00286 return rcp(new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (Tpetra::createLocalMapWithNode<int,int,Kokkos::DefaultNode::DefaultNodeType>(numElements, comm, node)));
00287 #endif
00288
00289 #ifdef HAVE_XPETRA_EPETRA
00290 if (lib == UseEpetra)
00291 {
00292
00293 Teuchos::RCP< EpetraMap > map;
00294 map = Teuchos::rcp( new EpetraMap((Xpetra::global_size_t)numElements,
00295 0,
00296 comm, LocallyReplicated, node));
00297 return map.getConst();
00298 }
00299 #endif
00300
00301 XPETRA_FACTORY_END;
00302 }
00303
00304 static Teuchos::RCP< const Map<LocalOrdinal,GlobalOrdinal, Node> >
00305 createUniformContigMapWithNode(UnderlyingLib lib, global_size_t numElements,
00306 const Teuchos::RCP< const Teuchos::Comm< int > > &comm, const Teuchos::RCP<Kokkos::DefaultNode::DefaultNodeType> &node) {
00307 XPETRA_MONITOR("MapFactory::Build");
00308
00309 #ifdef HAVE_XPETRA_TPETRA
00310 if (lib == UseTpetra)
00311 return rcp(new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (Tpetra::createUniformContigMapWithNode<int,int,Kokkos::DefaultNode::DefaultNodeType>(numElements, comm, node)));
00312 #endif
00313
00314 #ifdef HAVE_XPETRA_EPETRA
00315 if (lib == UseEpetra)
00316 {
00317
00318 Teuchos::RCP< EpetraMap > map;
00319 map = Teuchos::rcp( new EpetraMap(numElements,
00320 0,
00321 comm, GloballyDistributed, node));
00322 return map.getConst();
00323 }
00324 #endif
00325
00326 XPETRA_FACTORY_END;
00327 }
00328
00329 static Teuchos::RCP< const Map<LocalOrdinal,GlobalOrdinal, Node> >
00330 createUniformContigMap(UnderlyingLib lib, global_size_t numElements, const Teuchos::RCP< const Teuchos::Comm< int > > &comm) {
00331 XPETRA_MONITOR("MapFactory::Build");
00332
00333 #ifdef HAVE_XPETRA_TPETRA
00334 if (lib == UseTpetra)
00335 return rcp( new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (Tpetra::createUniformContigMap<int,int>(numElements, comm)));
00336 #endif
00337
00338 #ifdef HAVE_XPETRA_EPETRA
00339 if (lib == UseEpetra)
00340 return MapFactory<int, int, Kokkos::DefaultNode::DefaultNodeType>::createUniformContigMapWithNode(lib, numElements, comm, Kokkos::DefaultNode::getDefaultNode());
00341 #endif
00342
00343 XPETRA_FACTORY_END;
00344 }
00345
00346 static Teuchos::RCP< const Map<LocalOrdinal,GlobalOrdinal, Node> >
00347 createContigMap(UnderlyingLib lib, global_size_t numElements, size_t localNumElements, const Teuchos::RCP< const Teuchos::Comm< int > > &comm) {
00348 XPETRA_MONITOR("MapFactory::Build");
00349
00350 #ifdef HAVE_XPETRA_TPETRA
00351 if (lib == UseTpetra)
00352 return rcp( new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (Tpetra::createContigMap<int,int>(numElements, localNumElements, comm)));
00353 #endif
00354
00355 #ifdef HAVE_XPETRA_EPETRA
00356 if (lib == UseEpetra)
00357 return MapFactory<int, int, Kokkos::DefaultNode::DefaultNodeType>::createContigMapWithNode(lib, numElements, localNumElements, comm, Kokkos::DefaultNode::getDefaultNode() );
00358 #endif
00359
00360 XPETRA_FACTORY_END;
00361 }
00362
00363 static Teuchos::RCP< const Map<LocalOrdinal,GlobalOrdinal, Node> >
00364 createContigMapWithNode(UnderlyingLib lib, global_size_t numElements, size_t localNumElements,
00365 const Teuchos::RCP< const Teuchos::Comm< int > > &comm, const Teuchos::RCP<Kokkos::DefaultNode::DefaultNodeType> &node) {
00366 XPETRA_MONITOR("MapFactory::Build");
00367
00368 #ifdef HAVE_XPETRA_TPETRA
00369 if (lib == UseTpetra)
00370 return rcp( new TpetraMap<LocalOrdinal,GlobalOrdinal, Node> (Tpetra::createContigMapWithNode<int,int,Kokkos::DefaultNode::DefaultNodeType>(numElements, localNumElements, comm, node)));
00371 #endif
00372
00373 #ifdef HAVE_XPETRA_EPETRA
00374 if (lib == UseEpetra)
00375 {
00376
00377 Teuchos::RCP< EpetraMap > map;
00378 map = Teuchos::rcp( new EpetraMap(numElements,localNumElements,
00379 0,
00380 comm, node) );
00381 return map.getConst();
00382 }
00383 #endif
00384
00385 XPETRA_FACTORY_END;
00386 }
00387
00388 };
00389
00390 }
00391
00392 #define XPETRA_MAPFACTORY_SHORT
00393 #endif
00394