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
00043
00044
00045
00046
00047
00048 Group(const Playa::Vector<double>& initcond,
00049 const Playa::NonlinearOperator<double>& nonlinOp,
00050 const Playa::LinearSolver<double>& solver);
00051
00052
00053
00054
00055
00056
00057 Group(const Playa::NonlinearOperator<double>& nonlinOp,
00058 const Playa::LinearSolver<double>& solver);
00059
00060
00061
00062
00063
00064
00065 Group(const Playa::Vector<double>& initcond,
00066 const Playa::NonlinearOperator<double>& nonlinOp,
00067 const Playa::LinearSolver<double>& solver,
00068 int numdigits);
00069
00070
00071
00072
00073
00074
00075 Group(const Playa::NonlinearOperator<double>& nonlinOp,
00076 const Playa::LinearSolver<double>& solver,
00077 int numdigits);
00078
00079
00080
00081
00082
00083
00084
00085
00086 Group(const NOX::NOXPlaya::Group& source, NOX::CopyType type = DeepCopy);
00087
00088
00089 ~Group();
00090
00091
00092 NOX::Abstract::Group& operator=(const NOX::Abstract::Group& source);
00093
00094 NOX::Abstract::Group& operator=(const NOX::NOXPlaya::Group& source);
00095
00096
00097
00098
00099 void setX(const NOX::Abstract::Vector& y);
00100
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);
00106
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
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 NOX::Abstract::Group::ReturnType
00129 applyJacobian(const NOX::NOXPlaya::Vector& input,
00130 NOX::NOXPlaya::Vector& result) const;
00131
00132
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
00141
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
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 bool isF() const;
00167 bool isJacobian() const;
00168 bool isGradient() const;
00169 bool isNewton() const;
00170
00171
00172
00173
00174
00175
00176
00177
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
00189
00190 virtual Teuchos::RCP< const NOX::Abstract::Vector > getXPtr() const
00191 {return rcp_dynamic_cast<const NOX::Abstract::Vector>(xVector);}
00192
00193
00194 virtual Teuchos::RCP< const NOX::Abstract::Vector > getFPtr() const
00195 {return rcp_dynamic_cast<const NOX::Abstract::Vector>(fVector);}
00196
00197
00198
00199
00200 virtual Teuchos::RCP< const NOX::Abstract::Vector > getGradientPtr() const
00201 {return rcp_dynamic_cast<const NOX::Abstract::Vector>(gradientVector);}
00202
00203
00204 virtual Teuchos::RCP< const NOX::Abstract::Vector > getNewtonPtr() const
00205 {return rcp_dynamic_cast<const NOX::Abstract::Vector>(newtonVector);}
00206
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
00214
00215 void print() const;
00216
00217 protected:
00218
00219
00220 void resetIsValid();
00221
00222 protected:
00223
00224
00225 int precision;
00226
00227
00228
00229
00230 RCP<NOX::NOXPlaya::Vector> xVector;
00231
00232 RCP<NOX::NOXPlaya::Vector> fVector;
00233
00234 RCP<NOX::NOXPlaya::Vector> newtonVector;
00235
00236 RCP<NOX::NOXPlaya::Vector> gradientVector;
00237
00238
00239
00240 mutable Playa::LinearSolver<double> solver;
00241
00242
00243 Playa::LinearOperator<double> jacobian;
00244
00245
00246
00247 Playa::NonlinearOperator<double> nonlinearOp;
00248
00249
00250
00251
00252
00253
00254 bool isValidF;
00255 bool isValidJacobian;
00256 bool isValidGradient;
00257 bool isValidNewton;
00258
00259
00260
00261 double normF;
00262
00263 };
00264
00265 }
00266 }
00267
00268
00269 #endif