1 #ifndef DEF_COMMON_NOXGROUP 2 #define DEF_COMMON_NOXGROUP 4 #include <NOX_Common.H> 5 #include <NOX_Abstract_Group.H> 8 #include <Eigen/Geometry> 13 template <
typename T_Q,
int T_SIZE_MULTIVECT = 1>
14 class NOXGroup :
public virtual NOX::Abstract::Group {
18 m_xVector(step.getInitialGuess())
28 m_xVector = g.m_xVector;
30 m_isValidF = g.m_isValidF;
31 m_isValidJacobian = g.m_isValidJacobian;
32 m_isValidGradient = g.m_isValidGradient;
33 m_isValidNewton = g.m_isValidNewton;
36 m_fVector = g.m_fVector;
38 if (m_isValidJacobian)
39 m_jacobianMatrix = g.m_jacobianMatrix;
41 if (m_isValidGradient)
42 m_gradientVector = g.m_gradientVector;
45 m_newtonVector = g.m_newtonVector;
52 operator= (
const NOX::Abstract::Group& g)
63 setX (
const NOX::Abstract::Vector& x)
70 m_xVector = grp.m_xVector + step*d;
74 computeX (
const NOX::Abstract::Group& grp,
const NOX::Abstract::Vector& d,
double step)
81 NOX::Abstract::Group::ReturnType
85 return NOX::Abstract::Group::Ok;
87 m_isValidF = m_step.computeF(m_fVector,m_xVector);
89 return (m_isValidF) ? (NOX::Abstract::Group::Ok) : (NOX::Abstract::Group::Failed);
92 NOX::Abstract::Group::ReturnType
95 if (m_isValidJacobian)
96 return NOX::Abstract::Group::Ok;
98 m_isValidJacobian = m_step.computeJacobian(m_jacobianMatrix,m_xVector);
100 return (m_isValidJacobian) ? (NOX::Abstract::Group::Ok) : (NOX::Abstract::Group::Failed);
103 NOX::Abstract::Group::ReturnType
106 if (m_isValidGradient)
107 return NOX::Abstract::Group::Ok;
111 <<
"ERROR: NOXGroup::computeGradient() - F is out of date wrt X" 113 return NOX::Abstract::Group::BadDependency;
116 if (!m_isValidJacobian) {
118 <<
"ERROR: NOXGroup::computeGradient() - Jacobian is out of date wrt X" 120 return NOX::Abstract::Group::BadDependency;
123 m_gradientVector = m_jacobianMatrix.transpose()*m_fVector;
124 m_isValidGradient =
true;
126 return NOX::Abstract::Group::Ok;
129 NOX::Abstract::Group::ReturnType
130 computeNewton (Teuchos::ParameterList& p)
133 return NOX::Abstract::Group::Ok;
137 <<
"ERROR: NOXGroup::computeNewton() - invalid F" 142 if (!m_isValidJacobian) {
144 <<
"ERROR: NOXGroup::computeNewton() - invalid Jacobian" 149 NOX::Abstract::Group::ReturnType status = applyJacobianInverse(p,m_fVector,m_newtonVector);
150 m_isValidNewton = (status == NOX::Abstract::Group::Ok);
152 m_newtonVector = -m_newtonVector;
157 NOX::Abstract::Group::ReturnType
161 if (!m_isValidJacobian)
162 return NOX::Abstract::Group::BadDependency;
163 result = m_jacobianMatrix*input;
164 return NOX::Abstract::Group::Ok;
167 NOX::Abstract::Group::ReturnType
168 applyJacobian (
const NOX::Abstract::Vector& input,
169 NOX::Abstract::Vector& result)
const 173 return applyJacobian(v,res);
176 NOX::Abstract::Group::ReturnType
180 if (!m_isValidJacobian)
181 return NOX::Abstract::Group::BadDependency;
182 result = m_jacobianMatrix.transpose()*input;
183 return NOX::Abstract::Group::Ok;
186 NOX::Abstract::Group::ReturnType
187 applyJacobianTranspose (
const NOX::Abstract::Vector& input,
188 NOX::Abstract::Vector& result)
const 194 return applyJacobianTranspose(v,res);
197 NOX::Abstract::Group::ReturnType
198 applyJacobianInverse ( Teuchos::ParameterList& p,
202 if (!m_isValidJacobian) {
204 <<
"ERROR: NOXGroup::applyJacobianInverse() - invalid Jacobian" 209 result = m_jacobianMatrix.inverse()*input;
210 return NOX::Abstract::Group::Ok;
213 NOX::Abstract::Group::ReturnType
214 applyJacobianInverse ( Teuchos::ParameterList& p,
215 const NOX::Abstract::Vector& input,
216 NOX::Abstract::Vector& result)
const 222 return applyJacobianInverse(p,v,res);
230 {
return m_isValidF; }
234 {
return m_isValidJacobian; }
238 {
return m_isValidGradient; }
242 {
return m_isValidNewton; }
244 const NOX::Abstract::Vector&
246 {
return m_xVector; }
248 const NOX::Abstract::Vector&
250 {
return m_fVector; }
257 <<
"ERROR: NOXGroup::getNormF() - invalid F, please call computeF() first" 261 return m_fVector.norm();
264 const NOX::Abstract::Vector&
266 {
return m_gradientVector; }
268 const NOX::Abstract::Vector&
270 {
return m_newtonVector; }
272 Teuchos::RCP<const NOX::Abstract::Vector>
274 {
return Teuchos::RCP<const NOX::Abstract::Vector>(&m_xVector,
false); }
276 Teuchos::RCP<const NOX::Abstract::Vector>
278 {
return Teuchos::RCP<const NOX::Abstract::Vector>(&m_fVector,
false); }
280 Teuchos::RCP<const NOX::Abstract::Vector>
281 getGradientPtr ()
const 282 {
return Teuchos::RCP<const NOX::Abstract::Vector>(&m_gradientVector,
false); }
284 Teuchos::RCP<const NOX::Abstract::Vector>
285 getNewtonPtr ()
const 286 {
return Teuchos::RCP<const NOX::Abstract::Vector>(&m_newtonVector,
false); }
288 Teuchos::RCP<NOX::Abstract::Group>
289 clone (NOX::CopyType type = NOX::DeepCopy)
const 291 Teuchos::RCP<NOX::Abstract::Group> tmp;
299 std::cout <<
"x = " << m_xVector << std::endl;
301 std::cout <<
"F(x) = " << m_fVector << std::endl;
303 std::cout <<
"F(x) has not been computed" << std::endl;
305 std::cout << std::endl;
313 m_isValidJacobian =
false;
314 m_isValidGradient =
false;
315 m_isValidNewton =
false;
323 Eigen::Matrix<double,T_Q::DOF*T_SIZE_MULTIVECT,T_Q::DOF*T_SIZE_MULTIVECT> m_jacobianMatrix;
328 bool m_isValidJacobian;
329 bool m_isValidGradient;
330 bool m_isValidNewton;
Definition: NOXGroup.hpp:14