47 #ifndef MUELU_SUBBLOCKAFACTORY_DEF_HPP_
48 #define MUELU_SUBBLOCKAFACTORY_DEF_HPP_
53 #include <Xpetra_MapExtractor.hpp>
55 #include <Xpetra_StridedMapFactory.hpp>
62 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
68 validParamList->
set<
int>(
"block row", 0,
"Block row of subblock matrix A");
69 validParamList->
set<
int>(
"block col", 0,
"Block column of subblock matrix A");
71 validParamList->
set<std::string>(
"Range map: Striding info",
"{}",
"Striding information for range map");
72 validParamList->
set<
LocalOrdinal>(
"Range map: Strided block id", -1,
"Strided block id for range map");
73 validParamList->
set<std::string>(
"Domain map: Striding info",
"{}",
"Striding information for domain map");
74 validParamList->
set<
LocalOrdinal>(
"Domain map: Strided block id", -1,
"Strided block id for domain map");
76 return validParamList;
79 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
81 Input(currentLevel,
"A");
84 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
89 size_t row = Teuchos::as<size_t>(pL.
get<
int>(
"block row"));
90 size_t col = Teuchos::as<size_t>(pL.
get<
int>(
"block col"));
108 if (bOp != Teuchos::null) {
110 if (bOp->Rows() == 1 && bOp->Cols() == 1) {
112 Op = bOp->getCrsMatrix();
114 "SubBlockAFactory::Build: sub block A[" << row <<
"," << col <<
"] must be a single block CrsMatrixWrap object!");
119 GetOStream(
Statistics1) <<
"A(" << row <<
"," << col <<
") is a " << bOp->Rows() <<
"x" << bOp->Cols() <<
" block matrix" << std::endl;
120 GetOStream(
Statistics2) <<
"with altogether " << bOp->getGlobalNumRows() <<
"x" << bOp->getGlobalNumCols() <<
" rows and columns." << std::endl;
121 currentLevel.
Set(
"A", Op,
this);
138 "SubBlockAFactory::Build: sub block A[" << row <<
"," << col <<
"] is NOT a BlockedCrsMatrix, but also NOT a CrsMatrixWrap object. This cannot be.");
145 std::vector<size_t> rangeStridingInfo;
146 std::vector<size_t> domainStridingInfo;
149 bool bRangeUserSpecified = CheckForUserSpecifiedBlockInfo(
true, rangeStridingInfo, rangeStridedBlockId);
150 bool bDomainUserSpecified = CheckForUserSpecifiedBlockInfo(
false, domainStridingInfo, domainStridedBlockId);
152 "MueLu::SubBlockAFactory[" << row <<
"," << col <<
"]: the user has to specify either both domain and range map or none.");
162 if (bRangeUserSpecified)
163 stridedRangeMap =
rcp(
new StridedMap(rangeMap, rangeStridingInfo, rangeMap->getIndexBase(), rangeStridedBlockId, 0));
165 stridedRangeMap = rcp_dynamic_cast<
const StridedMap>(rangeMap);
167 if (bDomainUserSpecified)
168 stridedDomainMap =
rcp(
new StridedMap(domainMap, domainStridingInfo, domainMap->getIndexBase(), domainStridedBlockId, 0));
170 stridedDomainMap = rcp_dynamic_cast<
const StridedMap>(domainMap);
175 if (stridedRangeMap.
is_null()) {
180 std::vector<size_t> stridedData = stridedFullRangeMap->getStridingData();
181 if (stridedData.size() == 1 && row > 0) {
183 stridedRangeMap = StridedMapFactory::Build(rangeMap, stridedData, 0, stridedFullRangeMap->getOffset());
187 stridedRangeMap = StridedMapFactory::Build(rangeMap, stridedData, row, stridedFullRangeMap->getOffset());
191 if (stridedDomainMap.
is_null()) {
196 std::vector<size_t> stridedData = stridedFullDomainMap->getStridingData();
197 if (stridedData.size() == 1 && col > 0) {
199 stridedDomainMap = StridedMapFactory::Build(domainMap, stridedData, 0, stridedFullDomainMap->getOffset());
203 stridedDomainMap = StridedMapFactory::Build(domainMap, stridedData, col, stridedFullDomainMap->getOffset());
210 GetOStream(
Statistics1) <<
"A(" << row <<
"," << col <<
") is a single block and has strided maps:"
211 <<
"\n range map fixed block size = " << stridedRangeMap->getFixedBlockSize() <<
", strided block id = " << stridedRangeMap->getStridedBlockId()
212 <<
"\n domain map fixed block size = " << stridedDomainMap->getFixedBlockSize() <<
", strided block id = " << stridedDomainMap->getStridedBlockId() << std::endl;
213 GetOStream(
Statistics2) <<
"A(" << row <<
"," << col <<
") has " << Op->getGlobalNumRows() <<
"x" << Op->getGlobalNumCols() <<
" rows and columns." << std::endl;
216 if (Op->IsView(
"stridedMaps") ==
true)
217 Op->RemoveView(
"stridedMaps");
218 Op->CreateView(
"stridedMaps", stridedRangeMap, stridedDomainMap);
222 currentLevel.
Set(
"A", Op,
this);
225 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
239 str = std::string(
"Range map: Striding info");
241 str = std::string(
"Domain map: Striding info");
244 std::string strStridingInfo = pL.
get<std::string>(str);
245 if (strStridingInfo.empty() ==
false) {
246 Array<size_t> arrayVal = Teuchos::fromStringToArray<size_t>(strStridingInfo);
247 stridingInfo = Teuchos::createVector(arrayVal);
251 if (stridingInfo.size() > 0)
return true;
Exception indicating invalid cast attempted.
MueLu::DefaultLocalOrdinal LocalOrdinal
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access). Usage: Level->Get< RCP<Matrix> >("A", factory) if factory == NULL => use default factory.
RCP< const ParameterList > GetValidParameterList() const override
Input.
T & get(const std::string &name, T def_value)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
Timer to be used in factories. Similar to Monitor but with additional timers.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void Build(Level ¤tLevel) const override
Build an object with this factory.
bool CheckForUserSpecifiedBlockInfo(bool bRange, std::vector< size_t > &stridingInfo, LocalOrdinal &stridedBlockId) const
Print even more statistics.
bool isParameter(const std::string &name) const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Class that holds all level-specific information.
void Set(const std::string &ename, const T &entry, const FactoryBase *factory=NoFactory::get())
Exception throws to report errors in the internal logical of the program.
void DeclareInput(Level ¤tLevel) const override
Specifies the data that this class needs, and the factories that generate that data.
static const RCP< const NoFactory > getRCP()
Static Get() functions.