13template <
class LO,
class GO,
class NO>
20template <
class LO,
class GO,
class NO>
21Map<LO,GO,NO>::Map( TpetraMapConstPtrConst_Type& tpetraMapPtrIn ):
27template <
class LO,
class GO,
class NO>
28Map<LO,GO,NO>::Map(
const Map_Type& mapIn ):
32 map_ = Teuchos::RCP(
new TpetraMap_Type(mapIn.getGlobalNumElements(), mapIn.getNodeElementList(),mapIn.getIndexBase(), mapIn.getComm()));
36template <
class LO,
class GO,
class NO>
37Map<LO,GO,NO>::Map(GO numGlobalElements,
38 const Teuchos::ArrayView<const GO> &elementList,
40 const CommConstPtr_Type &comm):
43 map_ = Teuchos::RCP(
new TpetraMap_Type(numGlobalElements, elementList, indexBase, comm));
46template <
class LO,
class GO,
class NO>
47Map<LO,GO,NO>::Map(GO numGlobalElements,
50 const CommConstPtr_Type &comm):
53 map_ = Teuchos::RCP(
new TpetraMap_Type(numGlobalElements, numLocalElements, indexBase, comm));
57template <
class LO,
class GO,
class NO>
63template <
class LO,
class GO,
class NO>
64GO Map<LO,GO,NO>::getGlobalElement(LO
id)
const{
65 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
66 return map_->getGlobalElement(
id);
69template <
class LO,
class GO,
class NO>
70LO Map<LO,GO,NO>::getLocalElement(GO
id)
const{
71 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
72 return map_->getLocalElement(
id);
75template <
class LO,
class GO,
class NO>
76LO Map<LO,GO,NO>::getNodeNumElements()
const{
77 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
78 return map_->getLocalNumElements();
81template <
class LO,
class GO,
class NO>
82GO Map<LO,GO,NO>::getGlobalNumElements()
const{
83 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
84 return map_->getGlobalNumElements();
87template <
class LO,
class GO,
class NO>
88typename Map<LO,GO,NO>::CommConstPtr_Type Map<LO,GO,NO>::getComm()
const{
90 return map_->getComm();
93template <
class LO,
class GO,
class NO>
94GO Map<LO,GO,NO>::getIndexBase()
const{
95 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
96 return map_->getIndexBase();
99template <
class LO,
class GO,
class NO>
100Teuchos::ArrayView< const GO > Map<LO,GO,NO>::getNodeElementList()
const{
101 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
102 return map_->getLocalElementList();
105template <
class LO,
class GO,
class NO>
106std::string Map<LO,GO,NO>::getUnderlyingLib( )
const{
107 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
115template <
class LO,
class GO,
class NO>
116typename Map<LO,GO,NO>::MapPtr_Type Map<LO,GO,NO>::buildVecFieldMap(UN numDofs, std::string ordering)
const{
118 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
119 TEUCHOS_TEST_FOR_EXCEPTION(ordering.compare(
"NodeWise"), std::logic_error,
"Select a valid ordering: NodeWise");
120 Teuchos::ArrayView<const GO> elementList = map_->getLocalElementList();
121 Teuchos::Array<GO> elementListField( numDofs * elementList.size() );
122 for (UN i=0; i<elementList.size(); i++) {
123 for (UN dof=0; dof<numDofs; dof++)
124 elementListField[ numDofs * i + dof ] = numDofs * elementList[i] + dof;
126 typedef Teuchos::OrdinalTraits<GO> GOOT;
127 return Teuchos::rcp(
new Map_Type(GOOT::invalid(), elementListField(), map_->getIndexBase(), map_->getComm() ) );
131template <
class LO,
class GO,
class NO>
132typename Map<LO,GO,NO>::TpetraMapConstPtr_Type Map<LO,GO,NO>::getTpetraMap()
const{
134 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"getTpetraMap(): map_ is null.");
139template <
class LO,
class GO,
class NO>
140typename Map<LO,GO,NO>::XpetraMapConstPtr_Type Map<LO,GO,NO>::getXpetraMap() {
142 TEUCHOS_TEST_FOR_EXCEPTION(mapX_.is_null(),std::runtime_error,
"getXpetraMap(): map_ is null.");
147template <
class LO,
class GO,
class NO>
148GO Map<LO,GO,NO>::getMaxAllGlobalIndex()
const{
149 return map_->getMaxAllGlobalIndex();
152template <
class LO,
class GO,
class NO>
153LO Map<LO,GO,NO>::getMaxLocalIndex()
const{
154 return map_->getMaxLocalIndex();
157template <
class LO,
class GO,
class NO>
158void Map<LO,GO,NO>::print(Teuchos::EVerbosityLevel verbLevel)
const{
160 Teuchos::RCP<Teuchos::FancyOStream> out = Teuchos::VerboseObjectBase::getDefaultOStream();
161 map_->describe(*out,verbLevel);
164template <
class LO,
class GO,
class NO>
165typename Map<LO,GO,NO>::ThyraVSBConstPtr_Type Map<LO,GO,NO>::getThyraVectorSpaceBase()
const{
167 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"getThyraVectorSpaceBase(): map_ is null.");
169 Teuchos::RCP<Thyra::TpetraVectorSpace<default_sc,LO,GO,NO> > thyraTpetraMap = Thyra::tpetraVectorSpace<default_sc,LO,GO,NO>(map_);
170 return thyraTpetraMap;
173template <
class LO,
class GO,
class NO>
174typename Map<LO,GO,NO>::CommPtr_Type Map<LO,GO,NO>::getCommNonConst() {
175 CommConstPtr_Type commConst = map_->getComm();
176 return Teuchos::rcp_const_cast<Comm_Type>(commConst);
179template <
class LO,
class GO,
class NO>
182 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
183 if (numFreeProcs==0) {
185 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > myIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(map_));
186 myIndices->putScalar(map_->getComm()->getRank()+1);
188 TpetraMapPtr_Type linearMap = Teuchos::RCP(
new TpetraMap_Type( map_->getMaxAllGlobalIndex()+1, 0, map_->getComm()));
189 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > globalIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(linearMap));
191 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>( map_,linearMap));
192 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer2 = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>(linearMap, map_));
193 globalIndices->doImport(*myIndices,*importer,Tpetra::INSERT);
194 myIndices->putScalar(0);
195 myIndices->doImport(*globalIndices,*importer2,Tpetra::ADD);
197 Teuchos::Array<GO> uniqueVector;
198 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
199 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
200 uniqueVector.push_back(map_->getGlobalElement(i));
203 TpetraMapPtr_Type mapTpetra = Teuchos::RCP(
new TpetraMap_Type(-1, uniqueVector(),0,map_->getComm()));
204 Teuchos::RCP<Map<LO,GO,NO> > map = Teuchos::rcp(
new Map<LO,GO,NO>( mapTpetra ) );
208 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > myIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(map_));
209 myIndices->putScalar(map_->getComm()->getRank()+1);
210 GO maxGID = map_->getMaxAllGlobalIndex();
211 int numAvailableRanks = map_->getComm()->getSize() - numFreeProcs;
212 int numElementsForAvailRank = (int) ( ( (maxGID+1) / numAvailableRanks ) + 100.*std::numeric_limits<double>::epsilon() );
214 int remainingElement = maxGID+1 - numAvailableRanks * numElementsForAvailRank;
215 bool hasOneMoreElement =
false;
217 if ( remainingElement > map_->getComm()->getRank() ) {
218 numElementsForAvailRank++;
219 hasOneMoreElement =
true;
222 if ( map_->getComm()->getRank() + 1 > map_->getComm()->getSize() - numFreeProcs){
223 numElementsForAvailRank = 0;
226 Teuchos::Array<GO> myElements( numElementsForAvailRank );
227 GO offset = numElementsForAvailRank * map_->getComm()->getRank();
228 if (!hasOneMoreElement) {
229 offset += remainingElement;
231 for (
int i=0; i<myElements.size(); i++) {
232 myElements[i] = i + offset;
235 TpetraMapPtr_Type linearMapAvailRanks = Teuchos::RCP(
new TpetraMap_Type(Teuchos::OrdinalTraits<GO>::invalid(), myElements(), 0, map_->getComm()));
236 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > globalIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(linearMapAvailRanks));
238 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>(map_, linearMapAvailRanks ));
239 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer2 = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>( linearMapAvailRanks, map_));
241 globalIndices->doImport(*myIndices,*importer,Tpetra::INSERT);
243 myIndices->putScalar(0);
244 myIndices->doImport(*globalIndices,*importer2,Tpetra::ADD);
246 Teuchos::Array<GO> uniqueVector;
247 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
248 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
249 uniqueVector.push_back(map_->getGlobalElement(i));
252 TpetraMapPtr_Type mapTpetra = Teuchos::RCP(
new TpetraMap_Type(-1, uniqueVector(),0,map_->getComm()));
253 Teuchos::RCP<Map<LO,GO,NO> > map = Teuchos::rcp(
new Map<LO,GO,NO>( mapTpetra ) );
260template <
class LO,
class GO,
class NO>
263 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
264 int rank = map_->getComm()->getRank();
265 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > myIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(map_));
267 myIndices->putScalar(rank + 1);
268 GO maxGID = map_->getMaxAllGlobalIndex();
270 int numAvailableRanks = std::get<1>(rankRange) - std::get<0>(rankRange) + 1;
271 int numElementsForAvailRank = (int) ( ( (maxGID+1) / numAvailableRanks ) + 100.*std::numeric_limits<double>::epsilon() );
273 int remainingElement = maxGID+1 - numAvailableRanks * numElementsForAvailRank;
274 bool hasOneMoreElement =
false;
276 if ( remainingElement > map_->getComm()->getRank() - std::get<0>(rankRange) ) {
277 numElementsForAvailRank++;
278 hasOneMoreElement =
true;
280 if ( map_->getComm()->getRank() < std::get<0>(rankRange) || map_->getComm()->getRank() > std::get<1>(rankRange) )
281 numElementsForAvailRank = 0;
284 Teuchos::Array<GO> myElements( numElementsForAvailRank );
285 GO offset = numElementsForAvailRank * ( map_->getComm()->getRank() - std::get<0>(rankRange) );
287 if (!hasOneMoreElement)
288 offset += remainingElement;
290 for (
int i=0; i<myElements.size(); i++)
291 myElements[i] = i + offset;
293 TpetraMapPtr_Type linearMapAvailRanks = Teuchos::RCP(
new TpetraMap_Type( Teuchos::OrdinalTraits<GO>::invalid(), myElements(), 0, map_->getComm()));
294 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > globalIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(linearMapAvailRanks));
296 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>( map_,linearMapAvailRanks));
297 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer2 = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>(linearMapAvailRanks, map_));
299 globalIndices->doImport(*myIndices,*importer,Tpetra::INSERT);
301 myIndices->putScalar(0);
302 myIndices->doImport(*globalIndices,*importer2,Tpetra::ADD);
304 Teuchos::Array<GO> uniqueVector;
305 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
306 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
307 uniqueVector.push_back(map_->getGlobalElement(i));
311 TpetraMapPtr_Type mapTpetra = Teuchos::RCP(
new TpetraMap_Type(-1, uniqueVector(),0,map_->getComm()));
312 Teuchos::RCP<Map<LO,GO,NO> > map = Teuchos::rcp(
new Map<LO,GO,NO>( mapTpetra ) );
Teuchos::RCP< Map< LO, GO, NO > > buildUniqueMap(int numFreeProcs=0) const
Definition Map_def.hpp:180
Adaptive Mesh Refinement.
Definition AdaptiveMeshRefinement.cpp:5