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>
74 std::string strStridingInfo;
75 strStridingInfo.clear();
76 SetParameter(
"Striding info", ParameterEntry(strStridingInfo));
79template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
87template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
92 RCP<const Map> aggMap = aggregates->GetMap();
96 const size_t NSDim = nullspace->getNumVectors();
97 RCP<const Teuchos::Comm<int> > comm = aggMap->getComm();
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);
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();
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) {
167 TEUCHOS_TEST_FOR_EXCEPTION(stridedBlockId > Teuchos::as<LO>(
stridingInfo_.size() - 1),
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): it is stridingInfo_.size() <= stridedBlockId_. error.");
169 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.