17#ifndef MUELU_COARSEMAPFACTORY_DEF_HPP_
18#define MUELU_COARSEMAPFACTORY_DEF_HPP_
20#include <Teuchos_Array.hpp>
22#include <Xpetra_MultiVector.hpp>
23#include <Xpetra_StridedMapFactory.hpp>
27#include "MueLu_Aggregates.hpp"
32template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
35template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
38template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
40 RCP<ParameterList> validParamList = rcp(
new ParameterList());
42 validParamList->set<RCP<const FactoryBase> >(
"Aggregates", Teuchos::null,
"Generating factory for aggregates.");
43 validParamList->set<RCP<const FactoryBase> >(
"Nullspace", Teuchos::null,
"Generating factory for null space.");
45 validParamList->set<std::string>(
"Striding info",
"{}",
"Striding information");
46 validParamList->set<
LocalOrdinal>(
"Strided block id", -1,
"Strided block id");
56 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.");
58 return validParamList;
61template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
63 Input(currentLevel,
"Aggregates");
64 Input(currentLevel,
"Nullspace");
67template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
70 stridingInfo_ = stridingInfo;
74 std::string strStridingInfo;
75 strStridingInfo.clear();
76 SetParameter(
"Striding info", ParameterEntry(strStridingInfo));
79template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
83 GlobalOrdinal domainGIDOffset = GetDomainGIDOffset(currentLevel);
84 BuildCoarseMap(currentLevel, domainGIDOffset);
87template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
90 RCP<Aggregates> aggregates = Get<RCP<Aggregates> >(currentLevel,
"Aggregates");
92 RCP<const Map> aggMap = aggregates->GetMap();
94 RCP<MultiVector> nullspace = Get<RCP<MultiVector> >(currentLevel,
"Nullspace");
96 const size_t NSDim = nullspace->getNumVectors();
97 RCP<const Teuchos::Comm<int> > comm = aggMap->getComm();
98 const ParameterList& pL = GetParameterList();
104 if (pL.isParameter(
"Striding info")) {
105 std::string strStridingInfo = pL.get<std::string>(
"Striding info");
106 if (strStridingInfo.empty() ==
false) {
107 Teuchos::Array<size_t> arrayVal = Teuchos::fromStringToArray<size_t>(strStridingInfo);
108 stridingInfo_ = Teuchos::createVector(arrayVal);
112 CheckForConsistentStridingInformation(stridedBlockId, NSDim);
114 GetOStream(
Statistics2) <<
"domainGIDOffset: " << domainGIDOffset <<
" block size: " << getFixedBlockSize() <<
" stridedBlockId: " << stridedBlockId << std::endl;
120 RCP<const Map> coarseMap = StridedMapFactory::Build(aggMap->lib(),
121 Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),
129 Set(currentLevel,
"CoarseMap", coarseMap);
132template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
134 Level& currentLevel)
const {
135 GlobalOrdinal domainGidOffset = Teuchos::ScalarTraits<GlobalOrdinal>::zero();
137 std::vector<GlobalOrdinal> domainGidOffsets;
138 domainGidOffsets.clear();
139 const ParameterList& pL = GetParameterList();
140 if (pL.isParameter(
"Domain GID offsets")) {
141 std::string strDomainGIDs = pL.get<std::string>(
"Domain GID offsets");
142 if (strDomainGIDs.empty() ==
false) {
143 Teuchos::Array<GlobalOrdinal> arrayVal = Teuchos::fromStringToArray<GlobalOrdinal>(strDomainGIDs);
144 domainGidOffsets = Teuchos::createVector(arrayVal);
145 if (currentLevel.
GetLevelID() < Teuchos::as<int>(domainGidOffsets.size())) {
146 domainGidOffset = domainGidOffsets[currentLevel.
GetLevelID()];
151 return domainGidOffset;
154template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
156 const LocalOrdinal stridedBlockId,
const size_t nullspaceDimension)
const {
158 if (stridedBlockId == -1) {
160 TEUCHOS_TEST_FOR_EXCEPTION(stridingInfo_.size() > 1,
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): stridingInfo_.size() but must be one");
161 stridingInfo_.clear();
162 stridingInfo_.push_back(nullspaceDimension);
163 TEUCHOS_TEST_FOR_EXCEPTION(stridingInfo_.size() != 1,
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): stridingInfo_.size() but must be one");
167 TEUCHOS_TEST_FOR_EXCEPTION(stridedBlockId > Teuchos::as<LO>(stridingInfo_.size() - 1),
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): it is stridingInfo_.size() <= stridedBlockId_. error.");
168 size_t stridedBlockSize = stridingInfo_[stridedBlockId];
169 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.