47 #include "Epetra/Teko_StridedEpetraOperator.hpp"
48 #include "Epetra/Teko_StridedMappingStrategy.hpp"
49 #include "Epetra/Teko_ReorderedMappingStrategy.hpp"
51 #include "Teuchos_VerboseObject.hpp"
53 #include "Thyra_LinearOpBase.hpp"
54 #include "Thyra_EpetraLinearOp.hpp"
55 #include "Thyra_EpetraThyraWrappers.hpp"
56 #include "Thyra_DefaultProductMultiVector.hpp"
57 #include "Thyra_DefaultProductVectorSpace.hpp"
58 #include "Thyra_DefaultBlockedLinearOp.hpp"
59 #include "Thyra_get_Epetra_Operator.hpp"
61 #include "Epetra_Vector.h"
62 #include "EpetraExt_MultiVectorOut.h"
63 #include "EpetraExt_RowMatrixOut.h"
72 using Teuchos::rcp_dynamic_cast;
74 StridedEpetraOperator::StridedEpetraOperator(
int numVars,
75 const Teuchos::RCP<const Epetra_Operator>& content,
76 const std::string& label)
77 : Teko::Epetra::EpetraOperatorWrapper(), label_(label) {
78 std::vector<int> vars;
81 for (
int i = 0; i < numVars; i++) vars.push_back(1);
83 SetContent(vars, content);
86 StridedEpetraOperator::StridedEpetraOperator(
const std::vector<int>& vars,
87 const Teuchos::RCP<const Epetra_Operator>& content,
88 const std::string& label)
89 : Teko::Epetra::EpetraOperatorWrapper(), label_(label) {
90 SetContent(vars, content);
93 void StridedEpetraOperator::SetContent(
const std::vector<int>& vars,
94 const Teuchos::RCP<const Epetra_Operator>& content) {
95 fullContent_ = content;
96 stridedMapping_ = rcp(
new StridedMappingStrategy(
97 vars, Teuchos::rcpFromRef(fullContent_->OperatorDomainMap()), fullContent_->Comm()));
98 SetMapStrategy(stridedMapping_);
101 BuildBlockedOperator();
104 void StridedEpetraOperator::BuildBlockedOperator() {
105 TEUCHOS_ASSERT(stridedMapping_ != Teuchos::null);
108 const RCP<const Epetra_CrsMatrix> crsContent =
109 rcp_dynamic_cast<
const Epetra_CrsMatrix>(fullContent_);
112 if (stridedOperator_ == Teuchos::null) {
113 stridedOperator_ = stridedMapping_->buildBlockedThyraOp(crsContent, label_);
115 const RCP<Thyra::BlockedLinearOpBase<double> > blkOp =
116 rcp_dynamic_cast<Thyra::BlockedLinearOpBase<double> >(stridedOperator_,
true);
117 stridedMapping_->rebuildBlockedThyraOp(crsContent, blkOp);
121 SetOperator(stridedOperator_,
false);
124 if (reorderManager_ != Teuchos::null) Reorder(*reorderManager_);
127 const Teuchos::RCP<const Epetra_Operator> StridedEpetraOperator::GetBlock(
int i,
int j)
const {
128 const RCP<const Thyra::BlockedLinearOpBase<double> > blkOp =
129 Teuchos::rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<double> >(getThyraOp());
131 return Thyra::get_Epetra_Operator(*blkOp->getBlock(i, j));
137 void StridedEpetraOperator::Reorder(
const BlockReorderManager& brm) {
138 reorderManager_ = rcp(
new BlockReorderManager(brm));
141 RCP<const MappingStrategy> reorderMapping =
142 rcp(
new ReorderedMappingStrategy(*reorderManager_, stridedMapping_));
143 RCP<const Thyra::BlockedLinearOpBase<double> > blockOp =
144 rcp_dynamic_cast<
const Thyra::BlockedLinearOpBase<double> >(stridedOperator_);
146 RCP<const Thyra::LinearOpBase<double> > A = buildReorderedLinearOp(*reorderManager_, blockOp);
149 SetMapStrategy(reorderMapping);
150 SetOperator(A,
false);
154 void StridedEpetraOperator::RemoveReording() {
155 SetMapStrategy(stridedMapping_);
156 SetOperator(stridedOperator_,
false);
157 reorderManager_ = Teuchos::null;
162 void StridedEpetraOperator::WriteBlocks(
const std::string& prefix)
const {
163 RCP<Thyra::PhysicallyBlockedLinearOpBase<double> > blockOp =
164 rcp_dynamic_cast<Thyra::PhysicallyBlockedLinearOpBase<double> >(stridedOperator_);
167 int rows = Teko::blockRowCount(blockOp);
169 for (
int i = 0; i < rows; i++) {
170 for (
int j = 0; j < rows; j++) {
172 RCP<const Epetra_RowMatrix> mat = Teuchos::rcp_dynamic_cast<
const Epetra_RowMatrix>(
173 Thyra::get_Epetra_Operator(*blockOp->getBlock(i, j)));
176 EpetraExt::RowMatrixToMatrixMarketFile(formatBlockName(prefix, i, j, rows).c_str(), *mat);
188 std::string StridedEpetraOperator::PrintNorm(
const eNormType& nrmType,
const char newline) {
189 BlockedLinearOp blockOp = toBlockedLinearOp(stridedOperator_);
192 int rowCount = Teko::blockRowCount(blockOp);
193 int colCount = Teko::blockRowCount(blockOp);
195 std::stringstream ss;
197 ss << std::scientific;
198 for (
int row = 0; row < rowCount; row++) {
199 for (
int col = 0; col < colCount; col++) {
201 RCP<const Epetra_CrsMatrix> mat = Teuchos::rcp_dynamic_cast<
const Epetra_CrsMatrix>(
202 Thyra::get_Epetra_Operator(*blockOp->getBlock(row, col)));
207 case Inf: norm = mat->NormInf();
break;
208 case One: norm = mat->NormOne();
break;
209 case Frobenius: norm = mat->NormFrobenius();
break;
211 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
212 "StridedEpetraOperator::eNormType incorrectly specified");
223 bool StridedEpetraOperator::testAgainstFullOperator(
int count,
double tol)
const {
224 Epetra_Vector xf(OperatorRangeMap());
225 Epetra_Vector xs(OperatorRangeMap());
226 Epetra_Vector y(OperatorDomainMap());
230 double diffNorm = 0.0, trueNorm = 0.0;
231 for (
int i = 0; i < count; i++) {
238 fullContent_->Apply(y, xf);
241 xs.Update(-1.0, xf, 1.0);
246 result &= (diffNorm / trueNorm < tol);