43#include "Thyra_VectorStdOps.hpp"
44#include "Thyra_ProductVectorSpaceBase.hpp"
45#include "Thyra_TpetraLinearOp.hpp"
47#include "Tpetra_CrsMatrix.hpp"
52template <
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
60 bool x_matches=
false, f_matches=
false, dxdt_matches=
false;
63 RCP<const VectorSpaceBase<ScalarT> > range = get_A()->range();
64 RCP<const VectorSpaceBase<ScalarT> > domain = get_A()->domain();
67 x_matches = range->isCompatible(*get_x()->space());
72 dxdt_matches = range->isCompatible(*get_dxdt()->space());
77 f_matches = range->isCompatible(*get_f()->space());
81 else if(get_x()!=null && get_dxdt()!=null) {
83 x_matches = get_x()->space()->isCompatible(*get_dxdt()->space());
84 dxdt_matches = x_matches;
87 f_matches = x_matches = dxdt_matches =
true;
90 return x_matches && dxdt_matches && f_matches;
93template <
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
98 using Thyra::PhysicallyBlockedLinearOpBase;
99 using Thyra::ProductVectorSpaceBase;
101 using Teuchos::rcp_dynamic_cast;
103 if(get_x()!=Teuchos::null) Thyra::assign<ScalarT>(x.ptr(),0.0);
104 if(get_dxdt()!=Teuchos::null) Thyra::assign<ScalarT>(get_dxdt().ptr(),0.0);
105 if(get_f()!=Teuchos::null) Thyra::assign<ScalarT>(get_f().ptr(),0.0);
106 if(get_A()!=Teuchos::null) {
107 RCP<PhysicallyBlockedLinearOpBase<ScalarT> > Amat
108 = rcp_dynamic_cast<PhysicallyBlockedLinearOpBase<ScalarT> >(get_A(),
true);
109 RCP<const ProductVectorSpaceBase<ScalarT> > range = Amat->productRange();
110 RCP<const ProductVectorSpaceBase<ScalarT> > domain = Amat->productDomain();
113 for(
int i=0;i<range->numBlocks();i++) {
114 for(
int j=0;j<domain->numBlocks();j++) {
115 RCP<LinearOpBase<ScalarT> > block = Amat->getNonconstBlock(i,j);
116 if(block!=Teuchos::null) {
117 RCP<Tpetra::Operator<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> > t_block =
118 rcp_dynamic_cast<Thyra::TpetraLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >(block,
true)->getTpetraOperator();
120 RCP<const MapType> map_i = t_block->getRangeMap();
121 RCP<const MapType> map_j = t_block->getDomainMap();
123 RCP<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> > mat =
124 rcp_dynamic_cast<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >(t_block,
true);
127 mat->setAllToScalar(0.0);
128 mat->fillComplete(map_j,map_i);
135template <
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
140 using Thyra::PhysicallyBlockedLinearOpBase;
141 using Thyra::ProductVectorSpaceBase;
143 using Teuchos::rcp_dynamic_cast;
145 if(get_A()!=Teuchos::null) {
146 RCP<PhysicallyBlockedLinearOpBase<ScalarT> > Amat
147 = rcp_dynamic_cast<PhysicallyBlockedLinearOpBase<ScalarT> >(get_A(),
true);
148 RCP<const ProductVectorSpaceBase<ScalarT> > range = Amat->productRange();
149 RCP<const ProductVectorSpaceBase<ScalarT> > domain = Amat->productDomain();
152 for(
int i=0;i<range->numBlocks();i++) {
153 for(
int j=0;j<domain->numBlocks();j++) {
154 RCP<LinearOpBase<ScalarT> > block = Amat->getNonconstBlock(i,j);
155 if(block!=Teuchos::null) {
156 RCP<Tpetra::Operator<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> > t_block =
157 rcp_dynamic_cast<Thyra::TpetraLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >(block,
true)->getTpetraOperator();
160 RCP<const MapType> map_i = t_block->getRangeMap();
161 RCP<const MapType> map_j = t_block->getDomainMap();
163 RCP<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> > mat =
164 rcp_dynamic_cast<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >(t_block,
true);
167 mat->setAllToScalar(value);
168 mat->fillComplete(map_j,map_i);
175template <
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
179 set_x(Teuchos::null);
180 set_dxdt(Teuchos::null);
181 set_f(Teuchos::null);
182 set_A(Teuchos::null);
185template <
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
190 using Thyra::PhysicallyBlockedLinearOpBase;
191 using Thyra::ProductVectorSpaceBase;
193 using Teuchos::rcp_dynamic_cast;
195 if(get_A()!=Teuchos::null) {
196 RCP<PhysicallyBlockedLinearOpBase<ScalarT> > Amat
197 = rcp_dynamic_cast<PhysicallyBlockedLinearOpBase<ScalarT> >(get_A(),
true);
198 RCP<const ProductVectorSpaceBase<ScalarT> > range = Amat->productRange();
199 RCP<const ProductVectorSpaceBase<ScalarT> > domain = Amat->productDomain();
202 for(
int i=0;i<range->numBlocks();i++) {
203 for(
int j=0;j<domain->numBlocks();j++) {
204 RCP<LinearOpBase<ScalarT> > block = Amat->getNonconstBlock(i,j);
205 if(block!=Teuchos::null) {
206 RCP<Tpetra::Operator<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> > t_block =
207 rcp_dynamic_cast<Thyra::TpetraLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >(block,
true)->getTpetraOperator();
209 RCP<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> > mat =
210 rcp_dynamic_cast<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >(t_block,
true);
219template <
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
224 using Thyra::PhysicallyBlockedLinearOpBase;
225 using Thyra::ProductVectorSpaceBase;
227 using Teuchos::rcp_dynamic_cast;
229 if(get_A()!=Teuchos::null) {
230 RCP<PhysicallyBlockedLinearOpBase<ScalarT> > Amat
231 = rcp_dynamic_cast<PhysicallyBlockedLinearOpBase<ScalarT> >(get_A(),
true);
232 RCP<const ProductVectorSpaceBase<ScalarT> > range = Amat->productRange();
233 RCP<const ProductVectorSpaceBase<ScalarT> > domain = Amat->productDomain();
236 for(
int i=0;i<range->numBlocks();i++) {
237 for(
int j=0;j<domain->numBlocks();j++) {
238 RCP<LinearOpBase<ScalarT> > block = Amat->getNonconstBlock(i,j);
239 if(block!=Teuchos::null) {
240 RCP<Tpetra::Operator<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> > t_block =
241 rcp_dynamic_cast<Thyra::TpetraLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >(block,
true)->getTpetraOperator();
243 RCP<const MapType> map_i = t_block->getRangeMap();
244 RCP<const MapType> map_j = t_block->getDomainMap();
246 RCP<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> > mat =
247 rcp_dynamic_cast<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >(t_block,
true);
249 mat->fillComplete(map_j,map_i);
virtual void initialize()
bool checkCompatibility() const
Make sure row and column spaces match up.
void initializeMatrix(ScalarT value)
Put a particular scalar in the matrix.