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 ):
31 map_ = Teuchos::RCP(
new TpetraMap_Type(mapIn.getGlobalNumElements(), mapIn.getNodeElementList(),mapIn.getIndexBase(), mapIn.getComm()));
35template <
class LO,
class GO,
class NO>
36Map<LO,GO,NO>::Map(GO numGlobalElements,
37 const Teuchos::ArrayView<const GO> &elementList,
39 const CommConstPtr_Type &comm):
42 map_ = Teuchos::RCP(
new TpetraMap_Type(numGlobalElements, elementList, indexBase, comm));
45template <
class LO,
class GO,
class NO>
46Map<LO,GO,NO>::Map(GO numGlobalElements,
49 const CommConstPtr_Type &comm):
52 map_ = Teuchos::RCP(
new TpetraMap_Type(numGlobalElements, numLocalElements, indexBase, comm));
56template <
class LO,
class GO,
class NO>
62template <
class LO,
class GO,
class NO>
63GO Map<LO,GO,NO>::getGlobalElement(LO
id)
const{
64 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
65 return map_->getGlobalElement(
id);
68template <
class LO,
class GO,
class NO>
69LO Map<LO,GO,NO>::getLocalElement(GO
id)
const{
70 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
71 return map_->getLocalElement(
id);
74template <
class LO,
class GO,
class NO>
75LO Map<LO,GO,NO>::getNodeNumElements()
const{
76 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
77 return map_->getLocalNumElements();
80template <
class LO,
class GO,
class NO>
81GO Map<LO,GO,NO>::getGlobalNumElements()
const{
82 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
83 return map_->getGlobalNumElements();
86template <
class LO,
class GO,
class NO>
87typename Map<LO,GO,NO>::CommConstPtr_Type Map<LO,GO,NO>::getComm()
const{
89 return map_->getComm();
92template <
class LO,
class GO,
class NO>
93GO Map<LO,GO,NO>::getIndexBase()
const{
94 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
95 return map_->getIndexBase();
98template <
class LO,
class GO,
class NO>
99Teuchos::ArrayView< const GO > Map<LO,GO,NO>::getNodeElementList()
const{
100 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
101 return map_->getLocalElementList();
104template <
class LO,
class GO,
class NO>
105typename Map<LO,GO,NO>::MapPtr_Type Map<LO,GO,NO>::buildVecFieldMap(UN numDofs, std::string ordering)
const{
107 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
108 TEUCHOS_TEST_FOR_EXCEPTION(ordering.compare(
"NodeWise"), std::logic_error,
"Select a valid ordering: NodeWise");
109 Teuchos::ArrayView<const GO> elementList = map_->getLocalElementList();
110 Teuchos::Array<GO> elementListField( numDofs * elementList.size() );
111 for (UN i=0; i<elementList.size(); i++) {
112 for (UN dof=0; dof<numDofs; dof++)
113 elementListField[ numDofs * i + dof ] = numDofs * elementList[i] + dof;
115 typedef Teuchos::OrdinalTraits<GO> GOOT;
116 return Teuchos::rcp(
new Map_Type(GOOT::invalid(), elementListField(), map_->getIndexBase(), map_->getComm() ) );
120template <
class LO,
class GO,
class NO>
121typename Map<LO,GO,NO>::TpetraMapConstPtr_Type Map<LO,GO,NO>::getTpetraMap()
const{
123 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"getTpetraMap(): map_ is null.");
128template <
class LO,
class GO,
class NO>
129typename Map<LO,GO,NO>::XpetraMapConstPtr_Type Map<LO,GO,NO>::getXpetraMap() {
131 TEUCHOS_TEST_FOR_EXCEPTION(mapX_.is_null(),std::runtime_error,
"getXpetraMap(): map_ is null.");
136template <
class LO,
class GO,
class NO>
137GO Map<LO,GO,NO>::getMaxAllGlobalIndex()
const{
138 return map_->getMaxAllGlobalIndex();
141template <
class LO,
class GO,
class NO>
142LO Map<LO,GO,NO>::getMaxLocalIndex()
const{
143 return map_->getMaxLocalIndex();
146template <
class LO,
class GO,
class NO>
147void Map<LO,GO,NO>::print(Teuchos::EVerbosityLevel verbLevel)
const{
149 Teuchos::RCP<Teuchos::FancyOStream> out = Teuchos::VerboseObjectBase::getDefaultOStream();
150 map_->describe(*out,verbLevel);
153template <
class LO,
class GO,
class NO>
154typename Map<LO,GO,NO>::ThyraVSBConstPtr_Type Map<LO,GO,NO>::getThyraVectorSpaceBase()
const{
156 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"getThyraVectorSpaceBase(): map_ is null.");
158 Teuchos::RCP<Thyra::TpetraVectorSpace<default_sc,LO,GO,NO> > thyraTpetraMap = Thyra::tpetraVectorSpace<default_sc,LO,GO,NO>(map_);
159 return thyraTpetraMap;
162template <
class LO,
class GO,
class NO>
163typename Map<LO,GO,NO>::CommPtr_Type Map<LO,GO,NO>::getCommNonConst() {
164 CommConstPtr_Type commConst = map_->getComm();
165 return Teuchos::rcp_const_cast<Comm_Type>(commConst);
168template <
class LO,
class GO,
class NO>
171 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
172 if (numFreeProcs==0) {
174 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > myIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(map_));
175 myIndices->putScalar(map_->getComm()->getRank()+1);
177 TpetraMapPtr_Type linearMap = Teuchos::RCP(
new TpetraMap_Type( map_->getMaxAllGlobalIndex()+1, 0, map_->getComm()));
178 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > globalIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(linearMap));
180 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>( map_,linearMap));
181 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer2 = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>(linearMap, map_));
182 globalIndices->doImport(*myIndices,*importer,Tpetra::INSERT);
183 myIndices->putScalar(0);
184 myIndices->doImport(*globalIndices,*importer2,Tpetra::ADD);
186 Teuchos::Array<GO> uniqueVector;
187 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
188 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
189 uniqueVector.push_back(map_->getGlobalElement(i));
192 TpetraMapPtr_Type mapTpetra = Teuchos::RCP(
new TpetraMap_Type(-1, uniqueVector(),0,map_->getComm()));
193 Teuchos::RCP<Map<LO,GO,NO> > map = Teuchos::rcp(
new Map<LO,GO,NO>( mapTpetra ) );
197 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > myIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(map_));
198 myIndices->putScalar(map_->getComm()->getRank()+1);
199 GO maxGID = map_->getMaxAllGlobalIndex();
200 int numAvailableRanks = map_->getComm()->getSize() - numFreeProcs;
201 int numElementsForAvailRank = (int) ( ( (maxGID+1) / numAvailableRanks ) + 100.*std::numeric_limits<double>::epsilon() );
203 int remainingElement = maxGID+1 - numAvailableRanks * numElementsForAvailRank;
204 bool hasOneMoreElement =
false;
206 if ( remainingElement > map_->getComm()->getRank() ) {
207 numElementsForAvailRank++;
208 hasOneMoreElement =
true;
211 if ( map_->getComm()->getRank() + 1 > map_->getComm()->getSize() - numFreeProcs){
212 numElementsForAvailRank = 0;
215 Teuchos::Array<GO> myElements( numElementsForAvailRank );
216 GO offset = numElementsForAvailRank * map_->getComm()->getRank();
217 if (!hasOneMoreElement) {
218 offset += remainingElement;
220 for (
int i=0; i<myElements.size(); i++) {
221 myElements[i] = i + offset;
224 TpetraMapPtr_Type linearMapAvailRanks = Teuchos::RCP(
new TpetraMap_Type(Teuchos::OrdinalTraits<GO>::invalid(), myElements(), 0, map_->getComm()));
225 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > globalIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(linearMapAvailRanks));
227 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>(map_, linearMapAvailRanks ));
228 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer2 = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>( linearMapAvailRanks, map_));
230 globalIndices->doImport(*myIndices,*importer,Tpetra::INSERT);
232 myIndices->putScalar(0);
233 myIndices->doImport(*globalIndices,*importer2,Tpetra::ADD);
235 Teuchos::Array<GO> uniqueVector;
236 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
237 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
238 uniqueVector.push_back(map_->getGlobalElement(i));
241 TpetraMapPtr_Type mapTpetra = Teuchos::RCP(
new TpetraMap_Type(-1, uniqueVector(),0,map_->getComm()));
242 Teuchos::RCP<Map<LO,GO,NO> > map = Teuchos::rcp(
new Map<LO,GO,NO>( mapTpetra ) );
249template <
class LO,
class GO,
class NO>
252 TEUCHOS_TEST_FOR_EXCEPTION(map_.is_null(),std::runtime_error,
"map is null.");
253 int rank = map_->getComm()->getRank();
254 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > myIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(map_));
256 myIndices->putScalar(rank + 1);
257 GO maxGID = map_->getMaxAllGlobalIndex();
259 int numAvailableRanks = std::get<1>(rankRange) - std::get<0>(rankRange) + 1;
260 int numElementsForAvailRank = (int) ( ( (maxGID+1) / numAvailableRanks ) + 100.*std::numeric_limits<double>::epsilon() );
262 int remainingElement = maxGID+1 - numAvailableRanks * numElementsForAvailRank;
263 bool hasOneMoreElement =
false;
265 if ( remainingElement > map_->getComm()->getRank() - std::get<0>(rankRange) ) {
266 numElementsForAvailRank++;
267 hasOneMoreElement =
true;
269 if ( map_->getComm()->getRank() < std::get<0>(rankRange) || map_->getComm()->getRank() > std::get<1>(rankRange) )
270 numElementsForAvailRank = 0;
273 Teuchos::Array<GO> myElements( numElementsForAvailRank );
274 GO offset = numElementsForAvailRank * ( map_->getComm()->getRank() - std::get<0>(rankRange) );
276 if (!hasOneMoreElement)
277 offset += remainingElement;
279 for (
int i=0; i<myElements.size(); i++)
280 myElements[i] = i + offset;
282 TpetraMapPtr_Type linearMapAvailRanks = Teuchos::RCP(
new TpetraMap_Type( Teuchos::OrdinalTraits<GO>::invalid(), myElements(), 0, map_->getComm()));
283 Teuchos::RCP<Tpetra::Vector<GO,LO,GO,NO> > globalIndices = Teuchos::RCP(
new Tpetra::Vector<GO,LO,GO,NO>(linearMapAvailRanks));
285 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>( map_,linearMapAvailRanks));
286 Teuchos::RCP<Tpetra::Import<LO,GO,NO> > importer2 = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>(linearMapAvailRanks, map_));
288 globalIndices->doImport(*myIndices,*importer,Tpetra::INSERT);
290 myIndices->putScalar(0);
291 myIndices->doImport(*globalIndices,*importer2,Tpetra::ADD);
293 Teuchos::Array<GO> uniqueVector;
294 for (
unsigned i=0; i<myIndices->getLocalLength(); i++) {
295 if (myIndices->getData(0)[i] == map_->getComm()->getRank()+1) {
296 uniqueVector.push_back(map_->getGlobalElement(i));
300 TpetraMapPtr_Type mapTpetra = Teuchos::RCP(
new TpetraMap_Type(-1, uniqueVector(),0,map_->getComm()));
301 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:169
Adaptive Mesh Refinement.
Definition AdaptiveMeshRefinement_decl.hpp:33