53 #ifndef MUELU_COARSEMAPFACTORY_DEF_HPP_ 54 #define MUELU_COARSEMAPFACTORY_DEF_HPP_ 56 #include <Teuchos_Array.hpp> 63 #include "MueLu_Aggregates.hpp" 68 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
71 stridingInfo_.clear();
74 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
77 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
79 RCP<ParameterList> validParamList = rcp(
new ParameterList());
81 validParamList->set< RCP<const FactoryBase> >(
"Aggregates", Teuchos::null,
"Generating factory for aggregates.");
82 validParamList->set< RCP<const FactoryBase> >(
"Nullspace", Teuchos::null,
"Generating factory for null space.");
84 validParamList->set< std::string >(
"Striding info",
"{}",
"Striding information");
85 validParamList->set< LocalOrdinal >(
"Strided block id", -1,
"Strided block id");
95 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.");
97 return validParamList;
100 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
102 Input(currentLevel,
"Aggregates");
103 Input(currentLevel,
"Nullspace");
106 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
109 stridingInfo_ = stridingInfo;
113 std::string strStridingInfo; strStridingInfo.clear();
114 SetParameter(
"Striding info", ParameterEntry(strStridingInfo));
117 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
121 RCP<Aggregates> aggregates = Get< RCP<Aggregates> >(currentLevel,
"Aggregates");
122 RCP<MultiVector> nullspace = Get< RCP<MultiVector> >(currentLevel,
"Nullspace");
124 GlobalOrdinal numAggs = aggregates->GetNumAggregates();
125 const size_t NSDim = nullspace->getNumVectors();
126 RCP<const Teuchos::Comm<int> > comm = aggregates->GetMap()->getComm();
129 GlobalOrdinal domainGidOffset = 0;
130 std::vector<GlobalOrdinal> domainGidOffsets;
131 domainGidOffsets.clear();
132 const ParameterList & pL = GetParameterList();
133 if(pL.isParameter(
"Domain GID offsets")) {
134 std::string strDomainGIDs = pL.get<std::string>(
"Domain GID offsets");
135 if(strDomainGIDs.empty() ==
false) {
136 Teuchos::Array<GlobalOrdinal> arrayVal = Teuchos::fromStringToArray<GlobalOrdinal>(strDomainGIDs);
137 domainGidOffsets = Teuchos::createVector(arrayVal);
138 if(currentLevel.GetLevelID() < Teuchos::as<int>(domainGidOffsets.size()) ) {
139 domainGidOffset = domainGidOffsets[currentLevel.GetLevelID()];
144 LocalOrdinal stridedBlockId = pL.get<LocalOrdinal>(
"Strided block id");
149 if(pL.isParameter(
"Striding info")) {
150 std::string strStridingInfo = pL.get<std::string>(
"Striding info");
151 if(strStridingInfo.empty() ==
false) {
152 Teuchos::Array<size_t> arrayVal = Teuchos::fromStringToArray<size_t>(strStridingInfo);
153 stridingInfo_ = Teuchos::createVector(arrayVal);
159 if (stridedBlockId== -1) {
161 TEUCHOS_TEST_FOR_EXCEPTION(stridingInfo_.size() > 1,
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): stridingInfo_.size() but must be one");
162 stridingInfo_.clear();
163 stridingInfo_.push_back(NSDim);
164 TEUCHOS_TEST_FOR_EXCEPTION(stridingInfo_.size() != 1,
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): stridingInfo_.size() but must be one");
168 TEUCHOS_TEST_FOR_EXCEPTION(stridedBlockId > Teuchos::as<LO>(stridingInfo_.size() - 1) ,
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): it is stridingInfo_.size() <= stridedBlockId_. error.");
169 size_t stridedBlockSize = stridingInfo_[stridedBlockId];
170 TEUCHOS_TEST_FOR_EXCEPTION(stridedBlockSize != NSDim ,
Exceptions::RuntimeError,
"MueLu::CoarseMapFactory::Build(): dimension of strided block != NSDim. error.");
173 GetOStream(
Statistics2) <<
"domainGIDOffset: " << domainGidOffset <<
" block size: " << getFixedBlockSize() <<
" stridedBlockId: " << stridedBlockId << std::endl;
176 GlobalOrdinal nCoarseDofs = numAggs * getFixedBlockSize();
177 GlobalOrdinal indexBase = aggregates->GetMap()->getIndexBase();
179 RCP<const Map> coarseMap = StridedMapFactory::Build(aggregates->GetMap()->lib(),
180 Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid(),
188 Set(currentLevel,
"CoarseMap", coarseMap);
CoarseMapFactory()
Constructor.
void Build(Level ¤tLevel) const
Build an object with this factory.
Timer to be used in factories. Similar to Monitor but with additional timers.
Namespace for MueLu classes and methods.
virtual ~CoarseMapFactory()
Destructor.
Print even more statistics.
Class that holds all level-specific information.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
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.
void DeclareInput(Level ¤tLevel) const
Specifies the data that this class needs, and the factories that generate that data.