53#ifndef MUELU_COARSEMAPFACTORY_DEF_HPP_
54#define MUELU_COARSEMAPFACTORY_DEF_HPP_
56#include <Teuchos_Array.hpp>
58#include <Xpetra_MultiVector.hpp>
59#include <Xpetra_StridedMapFactory.hpp>
63#include "MueLu_Aggregates.hpp"
68 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
71 RCP<ParameterList> validParamList = rcp(
new ParameterList());
73 validParamList->set< RCP<const FactoryBase> >(
"Aggregates", Teuchos::null,
"Generating factory for aggregates.");
74 validParamList->set< RCP<const FactoryBase> >(
"Nullspace", Teuchos::null,
"Generating factory for null space.");
76 validParamList->set< std::string >(
"Striding info",
"{}",
"Striding information");
77 validParamList->set<
LocalOrdinal >(
"Strided block id", -1,
"Strided block id");
87 validParamList->set< std::string > (
"Domain GID offsets",
"{0}",
"vector with offsets for GIDs for each level. If no offset GID value is given for the level we use 0 as default.");
89 return validParamList;
92 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
95 Input(currentLevel,
"Aggregates");
96 Input(currentLevel,
"Nullspace");
99 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
103 stridingInfo_ = stridingInfo;
107 std::string strStridingInfo; strStridingInfo.clear();
108 SetParameter(
"Striding info", ParameterEntry(strStridingInfo));
111 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
116 GlobalOrdinal domainGIDOffset = GetDomainGIDOffset(currentLevel);
117 BuildCoarseMap(currentLevel, domainGIDOffset);
120 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
124 RCP<Aggregates> aggregates = Get< RCP<Aggregates> >(currentLevel,
"Aggregates");
125 RCP<MultiVector> nullspace = Get< RCP<MultiVector> >(currentLevel,
"Nullspace");
128 const size_t NSDim = nullspace->getNumVectors();
129 RCP<const Teuchos::Comm<int> > comm = aggregates->GetMap()->getComm();
130 const ParameterList & pL = GetParameterList();
136 if(pL.isParameter(
"Striding info")) {
137 std::string strStridingInfo = pL.get<std::string>(
"Striding info");
138 if(strStridingInfo.empty() ==
false) {
139 Teuchos::Array<size_t> arrayVal = Teuchos::fromStringToArray<size_t>(strStridingInfo);
140 stridingInfo_ = Teuchos::createVector(arrayVal);
144 CheckForConsistentStridingInformation(stridedBlockId, NSDim);
146 GetOStream(
Statistics2) <<
"domainGIDOffset: " << domainGIDOffset <<
" block size: " << getFixedBlockSize() <<
" stridedBlockId: " << stridedBlockId << std::endl;
150 GlobalOrdinal indexBase = aggregates->GetMap()->getIndexBase();
152 RCP<const Map> coarseMap = StridedMapFactory::Build(aggregates->GetMap()->lib(),
153 Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),
161 Set(currentLevel,
"CoarseMap", coarseMap);
164 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
166 Level& currentLevel)
const
168 GlobalOrdinal domainGidOffset = Teuchos::ScalarTraits<GlobalOrdinal>::zero();
170 std::vector<GlobalOrdinal> domainGidOffsets;
171 domainGidOffsets.clear();
172 const ParameterList & pL = GetParameterList();
173 if(pL.isParameter(
"Domain GID offsets")) {
174 std::string strDomainGIDs = pL.get<std::string>(
"Domain GID offsets");
175 if(strDomainGIDs.empty() ==
false) {
176 Teuchos::Array<GlobalOrdinal> arrayVal = Teuchos::fromStringToArray<GlobalOrdinal>(strDomainGIDs);
177 domainGidOffsets = Teuchos::createVector(arrayVal);
178 if(currentLevel.
GetLevelID() < Teuchos::as<int>(domainGidOffsets.size()) ) {
179 domainGidOffset = domainGidOffsets[currentLevel.
GetLevelID()];
184 return domainGidOffset;
187 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
189 const LocalOrdinal stridedBlockId,
const size_t nullspaceDimension)
const
192 if (stridedBlockId == -1) {
194 TEUCHOS_TEST_FOR_EXCEPTION(stridingInfo_.size() > 1,
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): stridingInfo_.size() but must be one");
195 stridingInfo_.clear();
196 stridingInfo_.push_back(nullspaceDimension);
197 TEUCHOS_TEST_FOR_EXCEPTION(stridingInfo_.size() != 1,
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): stridingInfo_.size() but must be one");
201 TEUCHOS_TEST_FOR_EXCEPTION(stridedBlockId > Teuchos::as<LO>(stridingInfo_.size() - 1),
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): it is stridingInfo_.size() <= stridedBlockId_. error.");
202 size_t stridedBlockSize = stridingInfo_[stridedBlockId];
203 TEUCHOS_TEST_FOR_EXCEPTION(stridedBlockSize != nullspaceDimension ,
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): dimension of strided block != nullspaceDimension. error.");
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultGlobalOrdinal GlobalOrdinal
virtual void BuildCoarseMap(Level ¤tLevel, const GlobalOrdinal domainGIDOffset) const
Build the coarse map using the domain GID offset.
virtual void CheckForConsistentStridingInformation(LocalOrdinal stridedBlockId, const size_t nullspaceDimension) const
RCP< const ParameterList > GetValidParameterList() const override
Return a const parameter list of valid parameters that setParameterList() will accept.
virtual GlobalOrdinal GetDomainGIDOffset(Level ¤tLevel) const
Extract domain GID offset from user data.
void Build(Level ¤tLevel) const override
Build an object with this factory.
virtual void setStridingData(std::vector< size_t > stridingInfo)
setStridingData set striding vector for the domain DOF map (= coarse map), e.g. (2,...
void DeclareInput(Level ¤tLevel) const override
Specifies the data that this class needs, and the factories that generate that data.
Exception throws to report errors in the internal logical of the program.
Timer to be used in factories. Similar to Monitor but with additional timers.
Class that holds all level-specific information.
int GetLevelID() const
Return level number.
Namespace for MueLu classes and methods.
@ Statistics2
Print even more statistics.