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 map_ = Xpetra::MapFactory<LO,GO,NO>::Build( Xpetra::UseTpetra, mapIn.getGlobalNumElements(), mapIn.getNodeElementList(), mapIn.getIndexBase(), mapIn.getComm() );
36template <
class LO,
class GO,
class NO>
37Map_Xpetra<LO,GO,NO>::Map_Xpetra(
39 const Teuchos::ArrayView<const GO> &elementList,
41 const CommConstPtr_Type &comm):
44 map_ = Xpetra::MapFactory<LO,GO,NO>::Build( Xpetra::UseTpetra, numGlobalElements, elementList, indexBase, comm);
47template <
class LO,
class GO,
class NO>
48Map_Xpetra<LO,GO,NO>::Map_Xpetra(
52 const CommConstPtr_Type &comm):
55 map_ = Xpetra::MapFactory<LO,GO,NO>::Build( Xpetra::UseTpetra, numGlobalElements, numLocalElements, indexBase, comm);
58template <
class LO,
class GO,
class NO>
59Map_Xpetra<LO,GO,NO>::~Map_Xpetra(){
63template <
class LO,
class GO,
class NO>
64typename Map_Xpetra<LO,GO,NO>::MapPtr_Type Map_Xpetra<LO,GO,NO>::buildVecFieldMap(UN numDofs, std::string ordering)
const{
66 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
67 TEUCHOS_TEST_FOR_EXCEPTION(ordering.compare(
"NodeWise"), std::logic_error,
"Select a valid ordering: NodeWise");
68 Teuchos::ArrayView<const GO> elementList = map_->getLocalElementList();
69 Teuchos::Array<GO> elementListField( numDofs * elementList.size() );
70 for (UN i=0; i<elementList.size(); i++) {
71 for (UN dof=0; dof<numDofs; dof++)
72 elementListField[ numDofs * i + dof ] = numDofs * elementList[i] + dof;
74 typedef Teuchos::OrdinalTraits<GO> GOOT;
75 return Teuchos::rcp(
new Map_Type( GOOT::invalid(), elementListField(), map_->getIndexBase(), map_->getComm() ) );
78template <
class LO,
class GO,
class NO>
79typename Map_Xpetra<LO,GO,NO>::XpetraMapConstPtr_Type Map_Xpetra<LO,GO,NO>::getXpetraMap()
const{
81 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"getXpetraMap(): map_ is null.");
85template <
class LO,
class GO,
class NO>
86typename Map_Xpetra<LO,GO,NO>::ThyraVSBConstPtr_Type Map_Xpetra<LO,GO,NO>::getThyraVectorSpaceBase()
const{
88 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"getThyraVectorSpaceBase(): map_ is null.");
89 return Xpetra::ThyraUtils<default_sc,LO,GO,NO>::toThyra( map_ );
93template <
class LO,
class GO,
class NO>
94GO Map_Xpetra<LO,GO,NO>::getGlobalElement(LO
id)
const{
95 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
96 return map_->getGlobalElement(
id);
99template <
class LO,
class GO,
class NO>
100LO Map_Xpetra<LO,GO,NO>::getLocalElement(GO
id)
const{
101 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
102 return map_->getLocalElement(
id);
105template <
class LO,
class GO,
class NO>
106LO Map_Xpetra<LO,GO,NO>::getNodeNumElements()
const{
107 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
108 return map_->getLocalNumElements();
111template <
class LO,
class GO,
class NO>
112GO Map_Xpetra<LO,GO,NO>::getGlobalNumElements()
const{
113 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
114 return map_->getGlobalNumElements();
117template <
class LO,
class GO,
class NO>
118Teuchos::ArrayView< const GO > Map_Xpetra<LO,GO,NO>::getNodeElementList()
const{
119 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
120 return map_->getLocalElementList();
123template <
class LO,
class GO,
class NO>
124GO Map_Xpetra<LO,GO,NO>::getMaxAllGlobalIndex()
const{
125 return map_->getMaxAllGlobalIndex();
128template <
class LO,
class GO,
class NO>
129LO Map_Xpetra<LO,GO,NO>::getMaxLocalIndex()
const{
130 return map_->getMaxLocalIndex();
133template <
class LO,
class GO,
class NO>
134void Map_Xpetra<LO,GO,NO>::print(Teuchos::EVerbosityLevel verbLevel)
const{
136 Teuchos::RCP<Teuchos::FancyOStream> out = Teuchos::VerboseObjectBase::getDefaultOStream();
137 map_->describe(*out,verbLevel);
140template <
class LO,
class GO,
class NO>
141typename Map_Xpetra<LO,GO,NO>::CommConstPtr_Type Map_Xpetra<LO,GO,NO>::getComm()
const{
143 return map_->getComm();
146template <
class LO,
class GO,
class NO>
147typename Map_Xpetra<LO,GO,NO>::CommPtr_Type Map_Xpetra<LO,GO,NO>::getCommNonConst() {
148 CommConstPtr_Type commConst = map_->getComm();
149 return Teuchos::rcp_const_cast<Comm_Type>(commConst);
152template <
class LO,
class GO,
class NO>
155 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
156 if (numFreeProcs==0) {
158 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > myIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(map_);
159 myIndices->putScalar(map_->getComm()->getRank()+1);
161 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > linearMap = Xpetra::MapFactory<LO,GO,NO>::Build(Xpetra::UseTpetra,map_->getMaxAllGlobalIndex()+1,0,map_->getComm());
162 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > globalIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(linearMap);
164 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer = Xpetra::ImportFactory<LO,GO,NO>::Build(map_,linearMap);
165 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer2 = Xpetra::ImportFactory<LO,GO,NO>::Build(linearMap,map_);
166 globalIndices->doImport(*myIndices,*importer,Xpetra::INSERT);
167 myIndices->putScalar(0);
168 myIndices->doImport(*globalIndices,*importer2,Xpetra::ADD);
170 Teuchos::Array<GO> uniqueVector;
171 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
172 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
173 uniqueVector.push_back(map_->getGlobalElement(i));
176 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > mapXpetra = Xpetra::MapFactory<LO,GO,NO>::Build(Xpetra::UseTpetra,-1,uniqueVector(),0,map_->getComm());
177 Teuchos::RCP<Map_Xpetra<LO,GO,NO> > map = Teuchos::rcp(
new Map_Xpetra<LO,GO,NO>( mapXpetra ) );
181 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > myIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(map_);
182 myIndices->putScalar(map_->getComm()->getRank()+1);
183 GO maxGID = map_->getMaxAllGlobalIndex();
184 int numAvailableRanks = map_->getComm()->getSize() - numFreeProcs;
185 int numElementsForAvailRank = (int) ( ( (maxGID+1) / numAvailableRanks ) + 100.*std::numeric_limits<double>::epsilon() );
187 int remainingElement = maxGID+1 - numAvailableRanks * numElementsForAvailRank;
188 bool hasOneMoreElement =
false;
190 if ( remainingElement > map_->getComm()->getRank() ) {
191 numElementsForAvailRank++;
192 hasOneMoreElement =
true;
195 if ( map_->getComm()->getRank() + 1 > map_->getComm()->getSize() - numFreeProcs){
196 numElementsForAvailRank = 0;
199 Teuchos::Array<GO> myElements( numElementsForAvailRank );
200 GO offset = numElementsForAvailRank * map_->getComm()->getRank();
201 if (!hasOneMoreElement) {
202 offset += remainingElement;
204 for (
int i=0; i<myElements.size(); i++) {
205 myElements[i] = i + offset;
208 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > linearMapAvailRanks = Xpetra::MapFactory<LO,GO,NO>::Build( Xpetra::UseTpetra,Teuchos::OrdinalTraits<GO>::invalid(), myElements(), 0, map_->getComm() );
210 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > globalIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(linearMapAvailRanks);
212 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer = Xpetra::ImportFactory<LO,GO,NO>::Build( map_, linearMapAvailRanks );
213 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer2 = Xpetra::ImportFactory<LO,GO,NO>::Build( linearMapAvailRanks, map_ );
215 globalIndices->doImport(*myIndices,*importer,Xpetra::INSERT);
217 myIndices->putScalar(0);
218 myIndices->doImport(*globalIndices,*importer2,Xpetra::ADD);
220 Teuchos::Array<GO> uniqueVector;
221 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
222 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
223 uniqueVector.push_back(map_->getGlobalElement(i));
226 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > mapXpetra = Xpetra::MapFactory<LO,GO,NO>::Build(Xpetra::UseTpetra,-1,uniqueVector(),0,map_->getComm());
227 Teuchos::RCP<Map_Xpetra<LO,GO,NO> > map = Teuchos::rcp(
new Map_Xpetra<LO,GO,NO>( mapXpetra ) );
234template <
class LO,
class GO,
class NO>
237 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
238 int rank = map_->getComm()->getRank();
239 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > myIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(map_);
240 myIndices->putScalar(rank + 1);
241 GO maxGID = map_->getMaxAllGlobalIndex();
243 int numAvailableRanks = std::get<1>(rankRange) - std::get<0>(rankRange) + 1;
244 int numElementsForAvailRank = (int) ( ( (maxGID+1) / numAvailableRanks ) + 100.*std::numeric_limits<double>::epsilon() );
246 int remainingElement = maxGID+1 - numAvailableRanks * numElementsForAvailRank;
247 bool hasOneMoreElement =
false;
249 if ( remainingElement > map_->getComm()->getRank() - std::get<0>(rankRange) ) {
250 numElementsForAvailRank++;
251 hasOneMoreElement =
true;
253 if ( map_->getComm()->getRank() < std::get<0>(rankRange) || map_->getComm()->getRank() > std::get<1>(rankRange) )
254 numElementsForAvailRank = 0;
257 Teuchos::Array<GO> myElements( numElementsForAvailRank );
258 GO offset = numElementsForAvailRank * ( map_->getComm()->getRank() - std::get<0>(rankRange) );
260 if (!hasOneMoreElement)
261 offset += remainingElement;
263 for (
int i=0; i<myElements.size(); i++)
264 myElements[i] = i + offset;
267 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > linearMapAvailRanks = Xpetra::MapFactory<LO,GO,NO>::Build( Xpetra::UseTpetra,Teuchos::OrdinalTraits<GO>::invalid(), myElements(), 0, map_->getComm() );
269 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > globalIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(linearMapAvailRanks);
271 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer = Xpetra::ImportFactory<LO,GO,NO>::Build( map_, linearMapAvailRanks );
272 Teuchos::RCP<Xpetra::Import<LO,GO,NO> > importer2 = Xpetra::ImportFactory<LO,GO,NO>::Build( linearMapAvailRanks, map_ );
274 globalIndices->doImport(*myIndices,*importer,Xpetra::INSERT);
276 myIndices->putScalar(0);
277 myIndices->doImport(*globalIndices,*importer2,Xpetra::ADD);
279 Teuchos::Array<GO> uniqueVector;
280 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
281 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
282 uniqueVector.push_back(map_->getGlobalElement(i));
285 Teuchos::RCP<Xpetra::Map<LO,GO,NO> > mapXpetra = Xpetra::MapFactory<LO,GO,NO>::Build(Xpetra::UseTpetra,-1,uniqueVector(),0,map_->getComm());
286 Teuchos::RCP<Map_Xpetra<LO,GO,NO> > map = Teuchos::rcp(
new Map_Xpetra<LO,GO,NO>( mapXpetra ) );
292template <
class LO,
class GO,
class NO>
293GO Map_Xpetra<LO,GO,NO>::getIndexBase()
const{
294 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
295 return map_->getIndexBase();
Teuchos::RCP< Map_Xpetra< LO, GO, NO > > buildUniqueMap(int numFreeProcs=0) const
Definition Map_Xpetra_def.hpp:153
Adaptive Mesh Refinement.
Definition AdaptiveMeshRefinement_decl.hpp:33