Finite Element Domain Decomposition Library
FEDDLib
Loading...
Searching...
No Matches
Map_Xpetra_def.hpp
1#ifndef MAP_XPETRA_DEF_hpp
2#define MAP_XPETRA_DEF_hpp
3#include "Map_Xpetra_decl.hpp"
4
13
14namespace FEDD {
15template < class LO, class GO, class NO>
16Map_Xpetra<LO,GO,NO>::Map_Xpetra():
17map_()
18{
19
20}
21
22template <class LO, class GO, class NO>
23Map_Xpetra<LO,GO,NO>::Map_Xpetra( XpetraMapConstPtrConst_Type& xpetraMapPtrIn ):
24map_( xpetraMapPtrIn )
25{
26
27}
28
29template < class LO, class GO, class NO>
30Map_Xpetra<LO,GO,NO>::Map_Xpetra( const Map_Type& mapIn ):
31map_()
32{
33 map_ = Xpetra::MapFactory<LO,GO,NO>::Build( Xpetra::UseTpetra, mapIn.getGlobalNumElements(), mapIn.getNodeElementList(), mapIn.getIndexBase(), mapIn.getComm() );
34}
35
36template < class LO, class GO, class NO>
37Map_Xpetra<LO,GO,NO>::Map_Xpetra(
38 GO numGlobalElements,
39 const Teuchos::ArrayView<const GO> &elementList,
40 GO indexBase,
41 const CommConstPtr_Type &comm):
42map_()
43{
44 map_ = Xpetra::MapFactory<LO,GO,NO>::Build( Xpetra::UseTpetra, numGlobalElements, elementList, indexBase, comm);
45}
46
47template < class LO, class GO, class NO>
48Map_Xpetra<LO,GO,NO>::Map_Xpetra(
49 GO numGlobalElements,
50 LO numLocalElements,
51 GO indexBase,
52 const CommConstPtr_Type &comm):
53map_()
54{
55 map_ = Xpetra::MapFactory<LO,GO,NO>::Build( Xpetra::UseTpetra, numGlobalElements, numLocalElements, indexBase, comm);
56}
57
58template < class LO, class GO, class NO>
59Map_Xpetra<LO,GO,NO>::~Map_Xpetra(){
60
61}
62
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{
65
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;
73 }
74 typedef Teuchos::OrdinalTraits<GO> GOOT;
75 return Teuchos::rcp(new Map_Type( GOOT::invalid(), elementListField(), map_->getIndexBase(), map_->getComm() ) );
76}
77
78template < class LO, class GO, class NO>
79typename Map_Xpetra<LO,GO,NO>::XpetraMapConstPtr_Type Map_Xpetra<LO,GO,NO>::getXpetraMap() const{
80
81 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,"getXpetraMap(): map_ is null.");
82
83 return map_;
84}
85template < class LO, class GO, class NO>
86typename Map_Xpetra<LO,GO,NO>::ThyraVSBConstPtr_Type Map_Xpetra<LO,GO,NO>::getThyraVectorSpaceBase() const{
87
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_ );
90}
91
92
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);
98
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);
103}
104
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();
109}
110
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();
115}
116
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();
121}
122
123template < class LO, class GO, class NO>
124GO Map_Xpetra<LO,GO,NO>::getMaxAllGlobalIndex() const{
125 return map_->getMaxAllGlobalIndex();
126}
127
128template < class LO, class GO, class NO>
129LO Map_Xpetra<LO,GO,NO>::getMaxLocalIndex() const{
130 return map_->getMaxLocalIndex();
131}
132
133template < class LO, class GO, class NO>
134void Map_Xpetra<LO,GO,NO>::print(Teuchos::EVerbosityLevel verbLevel) const{
135
136 Teuchos::RCP<Teuchos::FancyOStream> out = Teuchos::VerboseObjectBase::getDefaultOStream();
137 map_->describe(*out,verbLevel);
138}
139
140template < class LO, class GO, class NO>
141typename Map_Xpetra<LO,GO,NO>::CommConstPtr_Type Map_Xpetra<LO,GO,NO>::getComm() const{
142
143 return map_->getComm();
144}
145
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);
150}
151
152template <class LO,class GO,class NO>
153Teuchos::RCP<Map_Xpetra<LO,GO,NO> > Map_Xpetra<LO,GO,NO>::buildUniqueMap( int numFreeProcs ) const
154{
155 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,"map is null.");
156 if (numFreeProcs==0) {
157
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);
160
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);
163
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);
169
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));
174 }
175 }
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 ) );
178 return map;
179 }
180 else{
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() );
186
187 int remainingElement = maxGID+1 - numAvailableRanks * numElementsForAvailRank;
188 bool hasOneMoreElement = false;
189
190 if ( remainingElement > map_->getComm()->getRank() ) {
191 numElementsForAvailRank++;
192 hasOneMoreElement = true;
193 }
194
195 if ( map_->getComm()->getRank() + 1 > map_->getComm()->getSize() - numFreeProcs){
196 numElementsForAvailRank = 0;
197 }
198
199 Teuchos::Array<GO> myElements( numElementsForAvailRank );
200 GO offset = numElementsForAvailRank * map_->getComm()->getRank();
201 if (!hasOneMoreElement) {
202 offset += remainingElement;
203 }
204 for (int i=0; i<myElements.size(); i++) {
205 myElements[i] = i + offset;
206 }
207
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() );
209
210 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > globalIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(linearMapAvailRanks);
211
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_ );
214
215 globalIndices->doImport(*myIndices,*importer,Xpetra::INSERT);
216
217 myIndices->putScalar(0);
218 myIndices->doImport(*globalIndices,*importer2,Xpetra::ADD);
219
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));
224 }
225 }
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 ) );
228 return map;
229 }
230
231}
232
233//merge with above function
234template <class LO,class GO,class NO>
235Teuchos::RCP<Map_Xpetra<LO,GO,NO> > Map_Xpetra<LO,GO,NO>::buildUniqueMap( tuple_intint_Type rankRange ) const
236{
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();
242
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() );
245
246 int remainingElement = maxGID+1 - numAvailableRanks * numElementsForAvailRank;
247 bool hasOneMoreElement = false;
248
249 if ( remainingElement > map_->getComm()->getRank() - std::get<0>(rankRange) ) {
250 numElementsForAvailRank++;
251 hasOneMoreElement = true;
252 }
253 if ( map_->getComm()->getRank() < std::get<0>(rankRange) || map_->getComm()->getRank() > std::get<1>(rankRange) )
254 numElementsForAvailRank = 0;
255
256
257 Teuchos::Array<GO> myElements( numElementsForAvailRank );
258 GO offset = numElementsForAvailRank * ( map_->getComm()->getRank() - std::get<0>(rankRange) );
259
260 if (!hasOneMoreElement)
261 offset += remainingElement;
262
263 for (int i=0; i<myElements.size(); i++)
264 myElements[i] = i + offset;
265
266
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() );
268
269 Teuchos::RCP<Xpetra::Vector<GO,LO,GO,NO> > globalIndices = Xpetra::VectorFactory<GO,LO,GO,NO>::Build(linearMapAvailRanks);
270
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_ );
273
274 globalIndices->doImport(*myIndices,*importer,Xpetra::INSERT);
275
276 myIndices->putScalar(0);
277 myIndices->doImport(*globalIndices,*importer2,Xpetra::ADD);
278
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));
283 }
284 }
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 ) );
287
288 return map;
289
290}
291
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();
296}
297}
298#endif
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