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
virtual GlobalOrdinal GetDomainGIDOffset(Level ¤tLevel) const
Extract domain GID offset from user data.
Timer to be used in factories. Similar to Monitor but with additional timers.
virtual void BuildCoarseMap(Level ¤tLevel, const GlobalOrdinal domainGIDOffset) const
Build the coarse map using the domain GID offset.
Namespace for MueLu classes and methods.
RCP< const ParameterList > GetValidParameterList() const override
Return a const parameter list of valid parameters that setParameterList() will accept.
Print even more statistics.
int GetLevelID() const
Return level number.
MueLu::DefaultGlobalOrdinal GlobalOrdinal
Class that holds all level-specific information.
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,1) for 2 velocity dofs and 1 pressure dof
Exception throws to report errors in the internal logical of the program.
virtual void CheckForConsistentStridingInformation(LocalOrdinal stridedBlockId, const size_t nullspaceDimension) const
void DeclareInput(Level ¤tLevel) const override
Specifies the data that this class needs, and the factories that generate that data.