69 RCP<ParameterList> validParamList = rcp(
new ParameterList());
73 validParamList->set< std::string > (
"Reorder Type",
"",
"String describing the reordering of blocks");
76 validParamList->set< RCP<const FactoryBase> >(
"Map1", Teuchos::null,
"Generating factory of the fine level map associated with the (1,1) block in your n x n block matrix.");
77 validParamList->set< RCP<const FactoryBase> >(
"Map2", Teuchos::null,
"Generating factory of the fine level map associated with the (2,2) block in your n x n block matrix.");
78 validParamList->set< RCP<const FactoryBase> >(
"Map3", Teuchos::null,
"Generating factory of the fine level map associated with the (3,3) block in your n x n block matrix.");
79 validParamList->set< RCP<const FactoryBase> >(
"Map4", Teuchos::null,
"Generating factory of the fine level map associated with the (4,4) block in your n x n block matrix.");
80 validParamList->set< RCP<const FactoryBase> >(
"Map5", Teuchos::null,
"Generating factory of the fine level map associated with the (5,5) block in your n x n block matrix.");
81 validParamList->set< RCP<const FactoryBase> >(
"Map6", Teuchos::null,
"Generating factory of the fine level map associated with the (6,6) block in your n x n block matrix.");
82 validParamList->set< RCP<const FactoryBase> >(
"Map7", Teuchos::null,
"Generating factory of the fine level map associated with the (7,7) block in your n x n block matrix.");
83 validParamList->set< RCP<const FactoryBase> >(
"Map8", Teuchos::null,
"Generating factory of the fine level map associated with the (8,8) block in your n x n block matrix.");
84 validParamList->set< RCP<const FactoryBase> >(
"Map9", Teuchos::null,
"Generating factory of the fine level map associated with the (9,9) block in your n x n block matrix.");
86 return validParamList;
99 std::string reorderStr = pL.get<std::string>(
"Reorder Type");
103 RCP<BlockedCrsMatrix> A = rcp_dynamic_cast<BlockedCrsMatrix>(Ain);
107 if (A == Teuchos::null && currentLevel.
GetLevelID() == 0)
109 GetOStream(
Warnings0) <<
"Split input matrix (Warning: this is a rather expensive operation)" << std::endl;
111 std::vector<Teuchos::RCP<const Map> > xmaps;
113 for(
int it = 1; it < 10; it++) {
114 std::stringstream ss;
117 RCP<const Map> submap = currentLevel.
Get< RCP<const Map> >(ss.str(),
NoFactory::get());
118 GetOStream(
Runtime1) <<
"Use user-given submap #" << it <<
": length dimension=" << submap->getGlobalNumElements() << std::endl;
119 xmaps.push_back(submap);
123 bool bThyraMode =
false;
124 RCP<const MapExtractor> map_extractor = Xpetra::MapExtractorFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build(Ain->getRowMap(),xmaps,bThyraMode);
131 Teuchos::RCP<Xpetra::BlockedCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > bOp =
132 Xpetra::MatrixUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::SplitMatrix(*Ain,map_extractor,map_extractor,Teuchos::null,bThyraMode);
134 TEUCHOS_TEST_FOR_EXCEPTION(Ain->getGlobalNumRows() != bOp->getGlobalNumRows(),
Exceptions::RuntimeError,
"Split operator not consistent with input operator (different number of rows).");
135 TEUCHOS_TEST_FOR_EXCEPTION(Ain->getLocalNumRows() != bOp->getLocalNumRows(),
Exceptions::RuntimeError,
"Split operator not consistent with input operator (different number of node rows).");
136 TEUCHOS_TEST_FOR_EXCEPTION(Ain->getLocalNumEntries() != bOp->getLocalNumEntries(),
Exceptions::RuntimeError,
"Split operator not consistent with input operator (different number of local entries).");
137 TEUCHOS_TEST_FOR_EXCEPTION(Ain->getGlobalNumEntries() != bOp->getGlobalNumEntries(),
Exceptions::RuntimeError,
"Split operator not consistent with input operator (different number of global entries).");
143 TEUCHOS_TEST_FOR_EXCEPTION(A.is_null(),
Exceptions::BadCast,
"Input matrix A is not a BlockedCrsMatrix.");
144 GetOStream(
Statistics1) <<
"Got a " << A->Rows() <<
"x" << A->Cols() <<
" blocked operator as input" << std::endl;
147 if(reorderStr.empty())
149 GetOStream(
Statistics1) <<
"No reordering information provided. Skipping reordering of A." << std::endl;
153 Teuchos::RCP<const Xpetra::BlockReorderManager> brm = Xpetra::blockedReorderFromString(reorderStr);
154 GetOStream(
Debug) <<
"Reordering A using " << brm->toString() << std::endl;
156 Teuchos::RCP<const ReorderedBlockedCrsMatrix> brop =
157 Teuchos::rcp_dynamic_cast<const ReorderedBlockedCrsMatrix>(
158 Xpetra::buildReorderedBlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(brm, A));
161 "Block reordering of " << A->Rows() <<
"x" << A->Cols()
162 <<
" blocked operator failed.");
164 GetOStream(
Statistics1) <<
"Reordering A using " << brm->toString() <<
" block gives a " << brop->Rows() <<
"x"
165 << brop->Cols() <<
" blocked operator" << std::endl;
166 GetOStream(
Debug) <<
"Reordered operator has " << brop->getRangeMap()->getGlobalNumElements() <<
" rows and "
167 << brop->getDomainMap()->getGlobalNumElements() <<
" columns" << std::endl;
169 << brop->getRangeMapExtractor()->getThyraMode() << std::endl;
172 Teuchos::RCP<ReorderedBlockedCrsMatrix> bret =
173 Teuchos::rcp_const_cast<ReorderedBlockedCrsMatrix>(brop);
178 currentLevel.
Set(
"A", Teuchos::rcp_dynamic_cast<Matrix>(A),
this);
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....