1#ifndef MAP_XPETRA_DEF_hpp
2#define MAP_XPETRA_DEF_hpp
3#include "Map_Xpetra_decl.hpp"
15template <
class LO,
class GO,
class NO>
16Map_Xpetra<LO,GO,NO>::Map_Xpetra():
22template <
class LO,
class GO,
class NO>
23Map_Xpetra<LO,GO,NO>::Map_Xpetra( XpetraMapConstPtrConst_Type& xpetraMapPtrIn ):
29template <
class LO,
class GO,
class NO>
30Map_Xpetra<LO,GO,NO>::Map_Xpetra(
const Map_Type& mapIn ):
33 Xpetra::UnderlyingLib ulib;
34 if (!mapIn.getUnderlyingLib().compare(
"Epetra"))
35 ulib = Xpetra::UseEpetra;
36 else if (!mapIn.getUnderlyingLib().compare(
"Tpetra"))
37 ulib = Xpetra::UseTpetra;
39 map_ = Xpetra::MapFactory<LO,GO,NO>::Build( ulib, mapIn.getGlobalNumElements(), mapIn.getNodeElementList(), mapIn.getIndexBase(), mapIn.getComm() );
42template <
class LO,
class GO,
class NO>
43Map_Xpetra<LO,GO,NO>::Map_Xpetra(std::string lib,
45 const Teuchos::ArrayView<const GO> &elementList,
47 const CommConstPtr_Type &comm):
50 Xpetra::UnderlyingLib ulib;
51 if (!lib.compare(
"Epetra"))
52 ulib = Xpetra::UseEpetra;
53 else if (!lib.compare(
"Tpetra"))
54 ulib = Xpetra::UseTpetra;
55 map_ = Xpetra::MapFactory<LO,GO,NO>::Build( ulib, numGlobalElements, elementList, indexBase, comm);
58template <
class LO,
class GO,
class NO>
59Map_Xpetra<LO,GO,NO>::Map_Xpetra(std::string lib,
63 const CommConstPtr_Type &comm):
66 Xpetra::UnderlyingLib ulib;
67 if (!lib.compare(
"Epetra"))
68 ulib = Xpetra::UseEpetra;
69 else if (!lib.compare(
"Tpetra"))
70 ulib = Xpetra::UseTpetra;
72 map_ = Xpetra::MapFactory<LO,GO,NO>::Build( ulib, numGlobalElements, numLocalElements, indexBase, comm);
75template <
class LO,
class GO,
class NO>
76Map_Xpetra<LO,GO,NO>::~Map_Xpetra(){
80template <
class LO,
class GO,
class NO>
81std::string Map_Xpetra<LO,GO,NO>::getUnderlyingLib( )
const{
82 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
84 if (map_->lib() == Xpetra::UseEpetra)
86 else if (map_->lib() == Xpetra::UseTpetra)
89 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"Unknown underlying lib");
93template <
class LO,
class GO,
class NO>
94typename Map_Xpetra<LO,GO,NO>::MapPtr_Type Map_Xpetra<LO,GO,NO>::buildVecFieldMap(UN numDofs, std::string ordering)
const{
96 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
97 TEUCHOS_TEST_FOR_EXCEPTION(ordering.compare(
"NodeWise"), std::logic_error,
"Select a valid ordering: NodeWise");
98 Teuchos::ArrayView<const GO> elementList = map_->getLocalElementList();
99 Teuchos::Array<GO> elementListField( numDofs * elementList.size() );
100 for (UN i=0; i<elementList.size(); i++) {
101 for (UN dof=0; dof<numDofs; dof++)
102 elementListField[ numDofs * i + dof ] = numDofs * elementList[i] + dof;
104 typedef Teuchos::OrdinalTraits<GO> GOOT;
105 return Teuchos::rcp(
new Map_Type( this->getUnderlyingLib(), GOOT::invalid(), elementListField(), map_->getIndexBase(), map_->getComm() ) );
108template <
class LO,
class GO,
class NO>
109typename Map_Xpetra<LO,GO,NO>::XpetraMapConstPtr_Type Map_Xpetra<LO,GO,NO>::getXpetraMap()
const{
111 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"getXpetraMap(): map_ is null.");
115template <
class LO,
class GO,
class NO>
116typename Map_Xpetra<LO,GO,NO>::ThyraVSBConstPtr_Type Map_Xpetra<LO,GO,NO>::getThyraVectorSpaceBase()
const{
118 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"getThyraVectorSpaceBase(): map_ is null.");
119 return Xpetra::ThyraUtils<default_sc,LO,GO,NO>::toThyra( map_ );
123template <
class LO,
class GO,
class NO>
124GO Map_Xpetra<LO,GO,NO>::getGlobalElement(LO
id)
const{
125 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
126 return map_->getGlobalElement(
id);
129template <
class LO,
class GO,
class NO>
130LO Map_Xpetra<LO,GO,NO>::getLocalElement(GO
id)
const{
131 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
132 return map_->getLocalElement(
id);
135template <
class LO,
class GO,
class NO>
136LO Map_Xpetra<LO,GO,NO>::getNodeNumElements()
const{
137 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
138 return map_->getLocalNumElements();
141template <
class LO,
class GO,
class NO>
142GO Map_Xpetra<LO,GO,NO>::getGlobalNumElements()
const{
143 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
144 return map_->getGlobalNumElements();
147template <
class LO,
class GO,
class NO>
148Teuchos::ArrayView< const GO > Map_Xpetra<LO,GO,NO>::getNodeElementList()
const{
149 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
150 return map_->getLocalElementList();
153template <
class LO,
class GO,
class NO>
154GO Map_Xpetra<LO,GO,NO>::getMaxAllGlobalIndex()
const{
155 return map_->getMaxAllGlobalIndex();
158template <
class LO,
class GO,
class NO>
159LO Map_Xpetra<LO,GO,NO>::getMaxLocalIndex()
const{
160 return map_->getMaxLocalIndex();
163template <
class LO,
class GO,
class NO>
164void Map_Xpetra<LO,GO,NO>::print(Teuchos::EVerbosityLevel verbLevel)
const{
166 Teuchos::RCP<Teuchos::FancyOStream> out = Teuchos::VerboseObjectBase::getDefaultOStream();
167 map_->describe(*out,verbLevel);
170template <
class LO,
class GO,
class NO>
171typename Map_Xpetra<LO,GO,NO>::CommConstPtr_Type Map_Xpetra<LO,GO,NO>::getComm()
const{
173 return map_->getComm();
176template <
class LO,
class GO,
class NO>
177typename Map_Xpetra<LO,GO,NO>::CommPtr_Type Map_Xpetra<LO,GO,NO>::getCommNonConst() {
178 CommConstPtr_Type commConst = map_->getComm();
179 return Teuchos::rcp_const_cast<Comm_Type>(commConst);
182template <
class LO,
class GO,
class NO>
185 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
186 if (numFreeProcs==0) {
188 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > myIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(map_);
189 myIndices->putScalar(map_->getComm()->getRank()+1);
191 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > linearMap = Xpetra::MapFactory<LO,GO,NO>::Build(map_->lib(),map_->getMaxAllGlobalIndex()+1,0,map_->getComm());
192 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > globalIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(linearMap);
194 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer = Xpetra::ImportFactory<LO,GO,NO>::Build(map_,linearMap);
195 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer2 = Xpetra::ImportFactory<LO,GO,NO>::Build(linearMap,map_);
196 globalIndices->doImport(*myIndices,*importer,Xpetra::INSERT);
197 myIndices->putScalar(0);
198 myIndices->doImport(*globalIndices,*importer2,Xpetra::ADD);
200 Teuchos::Array<GO> uniqueVector;
201 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
202 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
203 uniqueVector.push_back(map_->getGlobalElement(i));
206 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > mapXpetra = Xpetra::MapFactory<LO,GO,NO>::Build(map_->lib(),-1,uniqueVector(),0,map_->getComm());
207 Teuchos::RCP<Map_Xpetra<LO,GO,NO> > map = Teuchos::rcp(
new Map_Xpetra<LO,GO,NO>( mapXpetra ) );
211 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > myIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(map_);
212 myIndices->putScalar(map_->getComm()->getRank()+1);
213 GO maxGID = map_->getMaxAllGlobalIndex();
214 int numAvailableRanks = map_->getComm()->getSize() - numFreeProcs;
215 int numElementsForAvailRank = (int) ( ( (maxGID+1) / numAvailableRanks ) + 100.*std::numeric_limits<double>::epsilon() );
217 int remainingElement = maxGID+1 - numAvailableRanks * numElementsForAvailRank;
218 bool hasOneMoreElement =
false;
220 if ( remainingElement > map_->getComm()->getRank() ) {
221 numElementsForAvailRank++;
222 hasOneMoreElement =
true;
225 if ( map_->getComm()->getRank() + 1 > map_->getComm()->getSize() - numFreeProcs){
226 numElementsForAvailRank = 0;
229 Teuchos::Array<GO> myElements( numElementsForAvailRank );
230 GO offset = numElementsForAvailRank * map_->getComm()->getRank();
231 if (!hasOneMoreElement) {
232 offset += remainingElement;
234 for (
int i=0; i<myElements.size(); i++) {
235 myElements[i] = i + offset;
238 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > linearMapAvailRanks = Xpetra::MapFactory<LO,GO,NO>::Build( map_->lib(),Teuchos::OrdinalTraits<GO>::invalid(), myElements(), 0, map_->getComm() );
240 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > globalIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(linearMapAvailRanks);
242 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer = Xpetra::ImportFactory<LO,GO,NO>::Build( map_, linearMapAvailRanks );
243 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer2 = Xpetra::ImportFactory<LO,GO,NO>::Build( linearMapAvailRanks, map_ );
245 globalIndices->doImport(*myIndices,*importer,Xpetra::INSERT);
247 myIndices->putScalar(0);
248 myIndices->doImport(*globalIndices,*importer2,Xpetra::ADD);
250 Teuchos::Array<GO> uniqueVector;
251 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
252 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
253 uniqueVector.push_back(map_->getGlobalElement(i));
256 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > mapXpetra = Xpetra::MapFactory<LO,GO,NO>::Build(map_->lib(),-1,uniqueVector(),0,map_->getComm());
257 Teuchos::RCP<Map_Xpetra<LO,GO,NO> > map = Teuchos::rcp(
new Map_Xpetra<LO,GO,NO>( mapXpetra ) );
264template <
class LO,
class GO,
class NO>
267 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
268 int rank = map_->getComm()->getRank();
269 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > myIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(map_);
270 myIndices->putScalar(rank + 1);
271 GO maxGID = map_->getMaxAllGlobalIndex();
273 int numAvailableRanks = std::get<1>(rankRange) - std::get<0>(rankRange) + 1;
274 int numElementsForAvailRank = (int) ( ( (maxGID+1) / numAvailableRanks ) + 100.*std::numeric_limits<double>::epsilon() );
276 int remainingElement = maxGID+1 - numAvailableRanks * numElementsForAvailRank;
277 bool hasOneMoreElement =
false;
279 if ( remainingElement > map_->getComm()->getRank() - std::get<0>(rankRange) ) {
280 numElementsForAvailRank++;
281 hasOneMoreElement =
true;
283 if ( map_->getComm()->getRank() < std::get<0>(rankRange) || map_->getComm()->getRank() > std::get<1>(rankRange) )
284 numElementsForAvailRank = 0;
287 Teuchos::Array<GO> myElements( numElementsForAvailRank );
288 GO offset = numElementsForAvailRank * ( map_->getComm()->getRank() - std::get<0>(rankRange) );
290 if (!hasOneMoreElement)
291 offset += remainingElement;
293 for (
int i=0; i<myElements.size(); i++)
294 myElements[i] = i + offset;
297 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > linearMapAvailRanks = Xpetra::MapFactory<LO,GO,NO>::Build( map_->lib(),Teuchos::OrdinalTraits<GO>::invalid(), myElements(), 0, map_->getComm() );
299 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > globalIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(linearMapAvailRanks);
301 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer = Xpetra::ImportFactory<LO,GO,NO>::Build( map_, linearMapAvailRanks );
302 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer2 = Xpetra::ImportFactory<LO,GO,NO>::Build( linearMapAvailRanks, map_ );
304 globalIndices->doImport(*myIndices,*importer,Xpetra::INSERT);
306 myIndices->putScalar(0);
307 myIndices->doImport(*globalIndices,*importer2,Xpetra::ADD);
309 Teuchos::Array<GO> uniqueVector;
310 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
311 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
312 uniqueVector.push_back(map_->getGlobalElement(i));
315 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > mapXpetra = Xpetra::MapFactory<LO,GO,NO>::Build(map_->lib(),-1,uniqueVector(),0,map_->getComm());
316 Teuchos::RCP<Map_Xpetra<LO,GO,NO> > map = Teuchos::rcp(
new Map_Xpetra<LO,GO,NO>( mapXpetra ) );
322template <
class LO,
class GO,
class NO>
323GO Map_Xpetra<LO,GO,NO>::getIndexBase()
const{
324 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
325 return map_->getIndexBase();
Teuchos::RCP< Map_Xpetra< LO, GO, NO > > buildUniqueMap(int numFreeProcs=0) const
Definition Map_Xpetra_def.hpp:183
Adaptive Mesh Refinement.
Definition AdaptiveMeshRefinement.cpp:5