NOX_Playa_Group.hpp
00001
00002
00003
00004
00005
00006
00007
00008 #ifndef NOX_Playa_GROUP_H
00009 #define NOX_Playa_GROUP_H
00010
00011 #include "NOX_Abstract_Group.H"
00012 #include "Teuchos_ParameterList.hpp"
00013
00014 #include "NOX_Common.H"
00015 #include "NOX_Playa_Vector.hpp"
00016 #include "Teuchos_RCP.hpp"
00017 #include "PlayaVectorType.hpp"
00018 #include "PlayaVectorSpaceDecl.hpp"
00019 #include "PlayaLinearSolverDecl.hpp"
00020 #include "PlayaLinearOperatorDecl.hpp"
00021 #include "PlayaNonlinearOperator.hpp"
00022
00023
00024 namespace Teuchos
00025 {
00026 namespace Parameter
00027 {
00028 class List;
00029 }
00030 }
00031
00032 namespace NOX {
00033 namespace NOXPlaya {
00034
00035 using Teuchos::rcp;
00036 using Teuchos::rcp_dynamic_cast;
00037
00038 class Group : public virtual NOX::Abstract::Group
00039 {
00040
00041 public:
00042
00048 Group(const Playa::Vector<double>& initcond,
00049 const Playa::NonlinearOperator<double>& nonlinOp,
00050 const Playa::LinearSolver<double>& solver);
00051
00057 Group(const Playa::NonlinearOperator<double>& nonlinOp,
00058 const Playa::LinearSolver<double>& solver);
00059
00065 Group(const Playa::Vector<double>& initcond,
00066 const Playa::NonlinearOperator<double>& nonlinOp,
00067 const Playa::LinearSolver<double>& solver,
00068 int numdigits);
00069
00075 Group(const Playa::NonlinearOperator<double>& nonlinOp,
00076 const Playa::LinearSolver<double>& solver,
00077 int numdigits);
00078
00079
00080
00081
00086 Group(const NOX::NOXPlaya::Group& source, NOX::CopyType type = DeepCopy);
00087
00089 ~Group();
00090
00091
00092 NOX::Abstract::Group& operator=(const NOX::Abstract::Group& source);
00094 NOX::Abstract::Group& operator=(const NOX::NOXPlaya::Group& source);
00095
00098
00099 void setX(const NOX::Abstract::Vector& y);
00101 void setX(const NOX::NOXPlaya::Vector& y);
00102
00103 void computeX(const NOX::Abstract::Group& grp,
00104 const NOX::Abstract::Vector& d,
00105 double step);
00107 void computeX(const NOX::NOXPlaya::Group& grp,
00108 const NOX::NOXPlaya::Vector& d,
00109 double step);
00110
00111 NOX::Abstract::Group::ReturnType computeF();
00112
00113 NOX::Abstract::Group::ReturnType computeJacobian();
00114
00115 NOX::Abstract::Group::ReturnType computeGradient();
00116
00117 NOX::Abstract::Group::ReturnType computeNewton(Teuchos::ParameterList& params);
00118
00120
00127
00128 NOX::Abstract::Group::ReturnType
00129 applyJacobian(const NOX::NOXPlaya::Vector& input,
00130 NOX::NOXPlaya::Vector& result) const;
00131
00133 NOX::Abstract::Group::ReturnType
00134 applyJacobian(const NOX::Abstract::Vector& input,
00135 NOX::Abstract::Vector& result) const;
00136
00137 NOX::Abstract::Group::ReturnType
00138 applyJacobianTranspose(const NOX::NOXPlaya::Vector& input,
00139 NOX::NOXPlaya::Vector& result) const;
00140
00142 NOX::Abstract::Group::ReturnType
00143 applyJacobianTranspose(const NOX::Abstract::Vector& input,
00144 NOX::Abstract::Vector& result) const;
00145
00146 NOX::Abstract::Group::ReturnType
00147 applyJacobianInverse(Teuchos::ParameterList& params,
00148 const NOX::NOXPlaya::Vector& input,
00149 NOX::NOXPlaya::Vector& result) const;
00150
00151 NOX::Abstract::Group::ReturnType
00152 applyJacobianInverse(Teuchos::ParameterList& params,
00153 const NOX::Abstract::Vector& input,
00154 NOX::Abstract::Vector& result) const;
00155
00157
00165
00166 bool isF() const;
00167 bool isJacobian() const;
00168 bool isGradient() const;
00169 bool isNewton() const;
00170
00172
00178
00179 const NOX::Abstract::Vector& getX() const;
00180
00181 const NOX::Abstract::Vector& getF() const;
00182
00183 double getNormF() const;
00184
00185 const NOX::Abstract::Vector& getGradient() const;
00186
00187 const NOX::Abstract::Vector& getNewton() const;
00188
00190 virtual Teuchos::RCP< const NOX::Abstract::Vector > getXPtr() const
00191 {return rcp_dynamic_cast<const NOX::Abstract::Vector>(xVector);}
00192
00194 virtual Teuchos::RCP< const NOX::Abstract::Vector > getFPtr() const
00195 {return rcp_dynamic_cast<const NOX::Abstract::Vector>(fVector);}
00196
00197
00198
00200 virtual Teuchos::RCP< const NOX::Abstract::Vector > getGradientPtr() const
00201 {return rcp_dynamic_cast<const NOX::Abstract::Vector>(gradientVector);}
00202
00204 virtual Teuchos::RCP< const NOX::Abstract::Vector > getNewtonPtr() const
00205 {return rcp_dynamic_cast<const NOX::Abstract::Vector>(newtonVector);}
00207
00208 #ifdef TRILINOS_6
00209 virtual NOX::Abstract::Group* clone(NOX::CopyType type = NOX::DeepCopy) const;
00210 #else
00211 virtual RCP<NOX::Abstract::Group> clone(NOX::CopyType type = NOX::DeepCopy) const;
00212 #endif
00213
00215 void print() const;
00216
00217 protected:
00218
00220 void resetIsValid();
00221
00222 protected:
00223
00225 int precision;
00226
00229
00230 RCP<NOX::NOXPlaya::Vector> xVector;
00232 RCP<NOX::NOXPlaya::Vector> fVector;
00234 RCP<NOX::NOXPlaya::Vector> newtonVector;
00236 RCP<NOX::NOXPlaya::Vector> gradientVector;
00238
00240 mutable Playa::LinearSolver<double> solver;
00241
00243 Playa::LinearOperator<double> jacobian;
00244
00245
00247 Playa::NonlinearOperator<double> nonlinearOp;
00248
00254 bool isValidF;
00255 bool isValidJacobian;
00256 bool isValidGradient;
00257 bool isValidNewton;
00259
00261 double normF;
00262
00263 };
00264
00265 }
00266 }
00267
00268
00269 #endif