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.
void Input(Level &level, const std::string &varName) const
T Get(Level &level, const std::string &varName) const
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.
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.