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 #ifndef LOCA_EPETRA_LOWRANKUPDATEOP_H
00043 #define LOCA_EPETRA_LOWRANKUPDATEOP_H
00044
00045 #include "Teuchos_RCP.hpp"
00046 #include "Teuchos_LAPACK.hpp"
00047
00048 #include "Epetra_Operator.h"
00049 #include "Epetra_LocalMap.h"
00050 #include "Epetra_MultiVector.h"
00051 #include "NOX_Common.H"
00052
00053
00054 namespace LOCA {
00055 class GlobalData;
00056 }
00057
00058 namespace LOCA {
00059
00060 namespace Epetra {
00061
00071 class LowRankUpdateOp : public virtual Epetra_Operator {
00072
00073 public:
00074
00076
00082 LowRankUpdateOp(
00083 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00084 const Teuchos::RCP<Epetra_Operator>& jacOperator,
00085 const Teuchos::RCP<const Epetra_MultiVector>& U_multiVec,
00086 const Teuchos::RCP<const Epetra_MultiVector>& V_multiVec,
00087 bool setup_for_solve);
00088
00090 virtual ~LowRankUpdateOp();
00091
00093 virtual int SetUseTranspose(bool UseTranspose);
00094
00099 virtual int Apply(const Epetra_MultiVector& Input,
00100 Epetra_MultiVector& Result) const;
00101
00105 virtual int ApplyInverse(const Epetra_MultiVector& X,
00106 Epetra_MultiVector& Y) const;
00107
00109
00114 virtual double NormInf() const;
00115
00117 virtual const char* Label () const;
00118
00120 virtual bool UseTranspose() const;
00121
00126 virtual bool HasNormInf() const;
00127
00132 virtual const Epetra_Comm & Comm() const;
00133
00138 virtual const Epetra_Map& OperatorDomainMap () const;
00139
00144 virtual const Epetra_Map& OperatorRangeMap () const;
00145
00146 private:
00147
00149 LowRankUpdateOp(const LowRankUpdateOp&);
00150
00152 LowRankUpdateOp& operator=(const LowRankUpdateOp&);
00153
00154 protected:
00155
00157 Teuchos::RCP<LOCA::GlobalData> globalData;
00158
00160 string label;
00161
00163 Epetra_LocalMap localMap;
00164
00166 Teuchos::RCP<Epetra_Operator> J;
00167
00169 Teuchos::RCP<const Epetra_MultiVector> U;
00170
00172 Teuchos::RCP<const Epetra_MultiVector> V;
00173
00175 bool useTranspose;
00176
00178 mutable Teuchos::RCP<Epetra_MultiVector> tmpMat;
00179
00181 Teuchos::RCP<Epetra_MultiVector> JinvU;
00182
00184 Teuchos::RCP<Epetra_MultiVector> lu;
00185
00187 std::vector<int> ipiv;
00188
00190 Teuchos::LAPACK<int,double> lapack;
00191
00192 };
00193 }
00194 }
00195
00196 #endif