00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #ifndef __Teko_StridedEpetraOperator_hpp__
00048 #define __Teko_StridedEpetraOperator_hpp__
00049
00050
00051 #include "Epetra_Operator.h"
00052
00053
00054 #include "Teuchos_RCP.hpp"
00055
00056 #include "Thyra_LinearOpBase.hpp"
00057
00058
00059 #include "Teko_BlockedReordering.hpp"
00060 #include "Teko_EpetraOperatorWrapper.hpp"
00061 #include "Teko_StridedMappingStrategy.hpp"
00062
00063 namespace Teko {
00064 namespace Epetra {
00065
00066 class StridedEpetraOperator : public EpetraOperatorWrapper {
00067 public:
00068 enum eNormType { Inf, One, Frobenius};
00069
00070 StridedEpetraOperator(int numVars,const Teuchos::RCP<const Epetra_Operator> & content,
00071 const std::string & label="<ANYM>");
00072 StridedEpetraOperator(const std::vector<int> & vars,const Teuchos::RCP<const Epetra_Operator> & content,
00073 const std::string & label="<ANYM>");
00074
00075 virtual void SetContent(const std::vector<int> & vars,const Teuchos::RCP<const Epetra_Operator> & content);
00076
00077 virtual void RebuildOps()
00078 { BuildBlockedOperator(); }
00079
00080 virtual const Teuchos::RCP<const Epetra_Operator> GetContent() const
00081 { return fullContent_; }
00082
00083
00084
00085
00086 const Teuchos::RCP<const Epetra_Operator> GetBlock(int i,int j) const;
00087
00091 void Reorder(const BlockReorderManager & brm);
00092
00094 void RemoveReording();
00095
00098 virtual void WriteBlocks(const std::string & prefix) const;
00099
00107 virtual std::string PrintNorm(const eNormType & nrmType=Frobenius,const char newline='\n');
00108
00109
00111
00112
00113 virtual ~StridedEpetraOperator() {}
00114
00115
00116
00117
00118 virtual int SetUseTranspose(bool useTranspose)
00119 { return -1; }
00120
00121 virtual int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
00122 { TEUCHOS_ASSERT(false); return -1; }
00123
00124 virtual double NormInf() const
00125 { TEUCHOS_ASSERT(false); return 0.0; }
00126
00127
00128 virtual bool UseTranspose() const { return false; }
00129 virtual bool HasNormInf() const { return false; }
00130 virtual const Epetra_Comm & Comm() const { return fullContent_->Comm(); }
00131
00132
00133 #ifndef Teko_DEBUG_OFF
00134
00135 bool testAgainstFullOperator(int count,double tol) const;
00136 #endif
00137
00138 protected:
00139
00140 Teuchos::RCP<const Epetra_Operator> fullContent_;
00141 Teuchos::RCP<StridedMappingStrategy> stridedMapping_;
00142 Teuchos::RCP<Thyra::LinearOpBase<double> > stridedOperator_;
00143 Teuchos::RCP<const BlockReorderManager> reorderManager_;
00144
00145 std::string label_;
00146
00147 void BuildBlockedOperator();
00148 };
00149
00150 }
00151 }
00152
00153 #endif