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 #ifndef NOX_EPETRA_FINITEDIFFERENCE_H
00040 #define NOX_EPETRA_FINITEDIFFERENCE_H
00041
00042 #include "Epetra_RowMatrix.h"
00043 #include "NOX_Epetra_Interface_Jacobian.H"
00044 #include "NOX_Epetra_Interface_Preconditioner.H"
00045
00046 #include "NOX_Epetra_Interface_Required.H"
00047 #include "NOX_Common.H"
00048 #include "Teuchos_RCP.hpp"
00049 #include "Epetra_Vector.h"
00050
00051
00052 class Epetra_Comm;
00053 class Epetra_Map;
00054 class Epetra_Import;
00055 class Epetra_Vector;
00056 class Epetra_CrsGraph;
00057 class Epetra_CrsMatrix;
00058
00059 namespace NOX {
00060 namespace Abstract {
00061 class Group;
00062 }
00063 namespace Epetra {
00064 class Vector;
00065 }
00066 }
00067
00068 namespace NOX {
00069
00070 namespace Epetra {
00071
00090 class FiniteDifference : public Epetra_RowMatrix,
00091 public NOX::Epetra::Interface::Jacobian,
00092 public NOX::Epetra::Interface::Preconditioner {
00093
00094 public:
00095
00097 enum DifferenceType {Forward, Backward, Centered};
00098
00100 FiniteDifference(Teuchos::ParameterList& printingParams,
00101 const Teuchos::RCP<NOX::Epetra::Interface::Required>& i,
00102 const NOX::Epetra::Vector& initialGuess,
00103 double beta = 1.0e-6,
00104 double alpha = 1.0e-4);
00105
00107 FiniteDifference(Teuchos::ParameterList& printingParams,
00108 const Teuchos::RCP<NOX::Epetra::Interface::Required>& i,
00109 const NOX::Epetra::Vector& initialGuess,
00110 const Teuchos::RCP<const Epetra_Vector>& beta,
00111 double alpha = 1.0e-4);
00112
00114 FiniteDifference(Teuchos::ParameterList& printingParams,
00115 const Teuchos::RCP<NOX::Epetra::Interface::Required>& i,
00116 const NOX::Epetra::Vector& initialGuess,
00117 const Teuchos::RCP<Epetra_CrsGraph>& g,
00118 double beta = 1.0e-6,
00119 double alpha = 1.0e-4);
00120
00122 FiniteDifference(Teuchos::ParameterList& printingParams,
00123 const Teuchos::RCP<NOX::Epetra::Interface::Required>& i,
00124 const NOX::Epetra::Vector& initialGuess,
00125 const Teuchos::RCP<Epetra_CrsGraph>& g,
00126 const Teuchos::RCP<const Epetra_Vector>& beta,
00127 double alpha = 1.0e-4);
00128
00130 virtual ~FiniteDifference();
00131
00133 virtual const char* Label () const;
00134
00136 virtual int SetUseTranspose(bool UseTranspose);
00137
00139 virtual int Apply(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const;
00140
00142 virtual int ApplyInverse(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const;
00143
00145 virtual bool UseTranspose() const;
00146
00148 virtual bool HasNormInf() const;
00149
00151 virtual const Epetra_Map & OperatorDomainMap() const;
00152
00154 virtual const Epetra_Map & OperatorRangeMap() const;
00155
00157 virtual bool Filled() const;
00158
00160 virtual int NumMyRowEntries(int MyRow, int & NumEntries) const;
00161
00163 virtual int MaxNumEntries() const;
00164
00166 virtual int ExtractMyRowCopy(int MyRow, int Length, int & NumEntries, double *Values, int * Indices) const;
00167
00169 virtual int ExtractDiagonalCopy(Epetra_Vector & Diagonal) const;
00170
00172 virtual int Multiply(bool TransA, const Epetra_MultiVector& X, Epetra_MultiVector& Y) const;
00173
00175 virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal, const Epetra_MultiVector& X, Epetra_MultiVector& Y) const;
00176
00178 virtual int InvRowSums(Epetra_Vector& x) const;
00179
00181 virtual int LeftScale(const Epetra_Vector& x);
00182
00184 virtual int InvColSums(Epetra_Vector& x) const;
00185
00187 virtual int RightScale(const Epetra_Vector& x);
00188
00190 virtual double NormInf() const;
00191
00193 virtual double NormOne() const;
00194
00196 virtual int NumGlobalNonzeros() const;
00197
00199 virtual int NumGlobalRows() const;
00200
00202 virtual int NumGlobalCols() const;
00203
00205 virtual int NumGlobalDiagonals() const;
00206
00208 virtual int NumMyNonzeros() const;
00209
00211 virtual int NumMyRows() const;
00212
00214 virtual int NumMyCols() const;
00215
00217 virtual int NumMyDiagonals() const;
00218
00220 virtual bool LowerTriangular() const;
00221
00223 virtual bool UpperTriangular() const;
00224
00226 virtual const Epetra_Comm & Comm() const;
00227
00229 virtual const Epetra_Map & RowMatrixRowMap() const;
00230
00232 virtual const Epetra_Map & RowMatrixColMap() const;
00233
00235 virtual const Epetra_Import * RowMatrixImporter() const;
00236
00238 virtual const Epetra_BlockMap& Map() const;
00239
00241 virtual bool computeJacobian(const Epetra_Vector& x, Epetra_Operator& Jac);
00242
00244 virtual bool computeJacobian(const Epetra_Vector& x);
00245
00247 virtual bool computePreconditioner(const Epetra_Vector& x,
00248 Epetra_Operator& Prec,
00249 Teuchos::ParameterList* precParams = 0);
00250
00252 virtual void setDifferenceMethod( DifferenceType type );
00253
00255 virtual Epetra_CrsMatrix& getUnderlyingMatrix() const;
00256
00258 virtual void Print(ostream&) const;
00259
00261 void setGroupForComputeF(NOX::Abstract::Group& group);
00262
00263 protected:
00264
00266 Teuchos::RCP<Epetra_CrsMatrix>
00267 createGraphAndJacobian(Interface::Required& i, const Epetra_Vector& x);
00268
00269 bool computeF(const Epetra_Vector& input, Epetra_Vector& result,
00270 NOX::Epetra::Interface::Required::FillType);
00271
00272 protected:
00273
00275 const NOX::Utils utils;
00276
00278 Teuchos::RCP<Epetra_CrsGraph> graph;
00279
00281 Teuchos::RCP<Epetra_CrsMatrix> jacobian;
00282
00284 Teuchos::RCP<NOX::Epetra::Interface::Required> interface;
00285
00287 mutable Epetra_Vector x_perturb;
00288
00290 mutable Epetra_Vector fo;
00291
00293 mutable Epetra_Vector fp;
00294
00296 Teuchos::RCP<Epetra_Vector> fmPtr;
00297
00299 mutable Epetra_Vector Jc;
00300
00302 double alpha;
00303
00305 double beta;
00306
00308 Teuchos::RCP<const Epetra_Vector> betaVector;
00309
00311 enum BetaType {Scalar, Vector};
00312
00314 BetaType betaType;
00315
00317 DifferenceType diffType;
00318
00320 string label;
00321
00323 bool useGroupForComputeF;
00324
00326 Teuchos::RCP<NOX::Abstract::Group> groupPtr;
00327
00328 };
00329 }
00330 }
00331
00332 #endif