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>
107 std::string strStridingInfo; strStridingInfo.clear();
108 SetParameter(
"Striding info", ParameterEntry(strStridingInfo));
111 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
120 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
127 RCP<const Map> aggMap = aggregates->GetMap();
131 const size_t NSDim = nullspace->getNumVectors();
132 RCP<const Teuchos::Comm<int> > comm = aggMap->getComm();
139 if(pL.isParameter(
"Striding info")) {
140 std::string strStridingInfo = pL.get<std::string>(
"Striding info");
141 if(strStridingInfo.empty() ==
false) {
142 Teuchos::Array<size_t> arrayVal = Teuchos::fromStringToArray<size_t>(strStridingInfo);
147 CheckForConsistentStridingInformation(stridedBlockId, NSDim);
149 GetOStream(
Statistics2) <<
"domainGIDOffset: " << domainGIDOffset <<
" block size: " << getFixedBlockSize() <<
" stridedBlockId: " << stridedBlockId << std::endl;
155 RCP<const Map> coarseMap = StridedMapFactory::Build(aggMap->lib(),
156 Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),
164 Set(currentLevel,
"CoarseMap", coarseMap);
167 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
169 Level& currentLevel)
const
171 GlobalOrdinal domainGidOffset = Teuchos::ScalarTraits<GlobalOrdinal>::zero();
173 std::vector<GlobalOrdinal> domainGidOffsets;
174 domainGidOffsets.clear();
176 if(pL.isParameter(
"Domain GID offsets")) {
177 std::string strDomainGIDs = pL.get<std::string>(
"Domain GID offsets");
178 if(strDomainGIDs.empty() ==
false) {
179 Teuchos::Array<GlobalOrdinal> arrayVal = Teuchos::fromStringToArray<GlobalOrdinal>(strDomainGIDs);
180 domainGidOffsets = Teuchos::createVector(arrayVal);
181 if(currentLevel.
GetLevelID() < Teuchos::as<int>(domainGidOffsets.size()) ) {
182 domainGidOffset = domainGidOffsets[currentLevel.
GetLevelID()];
187 return domainGidOffset;
190 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
192 const LocalOrdinal stridedBlockId,
const size_t nullspaceDimension)
const
195 if (stridedBlockId == -1) {
204 TEUCHOS_TEST_FOR_EXCEPTION(stridedBlockId > Teuchos::as<LO>(
stridingInfo_.size() - 1),
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): it is stridingInfo_.size() <= stridedBlockId_. error.");
206 TEUCHOS_TEST_FOR_EXCEPTION(stridedBlockSize != nullspaceDimension ,
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): dimension of strided block != nullspaceDimension. error.");
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultGlobalOrdinal GlobalOrdinal
std::vector< size_t > stridingInfo_
Vector with size of strided blocks (dofs).
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.
void Input(Level &level, const std::string &varName) const
T Get(Level &level, const std::string &varName) const
Class that holds all level-specific information.
int GetLevelID() const
Return level number.
virtual const Teuchos::ParameterList & GetParameterList() const
void SetParameter(const std::string &name, const ParameterEntry &entry)
Set a parameter directly as a ParameterEntry.
Namespace for MueLu classes and methods.
@ Statistics2
Print even more statistics.