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_MULTICONTINUATION_CONSTRAINEDGROUP_H
00043 #define LOCA_MULTICONTINUATION_CONSTRAINEDGROUP_H
00044
00045 #include "Teuchos_RCP.hpp"
00046
00047 #include "LOCA_Extended_MultiAbstractGroup.H"
00048 #include "LOCA_MultiContinuation_AbstractGroup.H"
00049 #include "LOCA_BorderedSystem_AbstractGroup.H"
00050 #include "LOCA_Abstract_TransposeSolveGroup.H"
00051 #include "LOCA_MultiContinuation_ExtendedVector.H"
00052 #include "LOCA_MultiContinuation_ExtendedMultiVector.H"
00053
00054
00055 namespace Teuchos {
00056 class ParameterList;
00057 }
00058 namespace LOCA {
00059 class GlobalData;
00060 namespace Parameter {
00061 class SublistParser;
00062 }
00063 namespace MultiContinuation {
00064 class ConstraintInterface;
00065 }
00066 namespace BorderedSolver {
00067 class AbstractStrategy;
00068 class JacobianOperator;
00069 }
00070 }
00071
00072 namespace LOCA {
00073
00074 namespace MultiContinuation {
00075
00096 class ConstrainedGroup :
00097 public virtual LOCA::Extended::MultiAbstractGroup,
00098 public virtual LOCA::MultiContinuation::AbstractGroup,
00099 public virtual LOCA::BorderedSystem::AbstractGroup,
00100 public virtual LOCA::Abstract::TransposeSolveGroup {
00101
00102 public:
00103
00105
00116 ConstrainedGroup(
00117 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00118 const Teuchos::RCP<LOCA::Parameter::SublistParser>& topParams,
00119 const Teuchos::RCP<Teuchos::ParameterList>& constraintParams,
00120 const Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup>& grp,
00121 const Teuchos::RCP<LOCA::MultiContinuation::ConstraintInterface>& constraints,
00122 const vector<int>& paramIDs,
00123 bool skip_dfdp = false);
00124
00126 ConstrainedGroup(const ConstrainedGroup& source,
00127 NOX::CopyType type = NOX::DeepCopy);
00128
00130 virtual ~ConstrainedGroup();
00131
00133 virtual void setConstraintParameter(int i, double val);
00134
00136 virtual double getConstraintParameter(int i) const;
00137
00139 virtual const vector<int>&
00140 getConstraintParamIDs() const;
00141
00146
00148 virtual NOX::Abstract::Group&
00149 operator=(const NOX::Abstract::Group& source);
00150
00152 virtual Teuchos::RCP<NOX::Abstract::Group>
00153 clone(NOX::CopyType type = NOX::DeepCopy) const;
00154
00156 virtual void setX(const NOX::Abstract::Vector& y);
00157
00162 virtual void computeX(const NOX::Abstract::Group& g,
00163 const NOX::Abstract::Vector& d,
00164 double step);
00165
00167 virtual NOX::Abstract::Group::ReturnType computeF();
00168
00170 virtual NOX::Abstract::Group::ReturnType computeJacobian();
00171
00173 virtual NOX::Abstract::Group::ReturnType computeGradient();
00174
00176 virtual NOX::Abstract::Group::ReturnType
00177 computeNewton(Teuchos::ParameterList& params);
00178
00180 virtual NOX::Abstract::Group::ReturnType
00181 applyJacobian(const NOX::Abstract::Vector& input,
00182 NOX::Abstract::Vector& result) const;
00183
00185 virtual NOX::Abstract::Group::ReturnType
00186 applyJacobianTranspose(const NOX::Abstract::Vector& input,
00187 NOX::Abstract::Vector& result) const;
00188
00190 virtual NOX::Abstract::Group::ReturnType
00191 applyJacobianInverse(Teuchos::ParameterList& params,
00192 const NOX::Abstract::Vector& input,
00193 NOX::Abstract::Vector& result) const;
00194
00196 virtual NOX::Abstract::Group::ReturnType
00197 applyJacobianMultiVector(const NOX::Abstract::MultiVector& input,
00198 NOX::Abstract::MultiVector& result) const;
00199
00201 virtual NOX::Abstract::Group::ReturnType
00202 applyJacobianTransposeMultiVector(
00203 const NOX::Abstract::MultiVector& input,
00204 NOX::Abstract::MultiVector& result) const;
00205
00207 virtual NOX::Abstract::Group::ReturnType
00208 applyJacobianInverseMultiVector(
00209 Teuchos::ParameterList& params,
00210 const NOX::Abstract::MultiVector& input,
00211 NOX::Abstract::MultiVector& result) const;
00212
00214 virtual bool isF() const;
00215
00217 virtual bool isJacobian() const;
00218
00220 virtual bool isGradient() const;
00221
00223 virtual bool isNewton() const;
00224
00226 virtual const NOX::Abstract::Vector& getX() const;
00227
00229 virtual const NOX::Abstract::Vector& getF() const;
00230
00232 virtual double getNormF() const;
00233
00235 virtual const NOX::Abstract::Vector& getGradient() const;
00236
00238 virtual const NOX::Abstract::Vector& getNewton() const;
00239
00241 virtual double getNormNewtonSolveResidual() const;
00242
00244
00250
00252 virtual
00253 Teuchos::RCP<const LOCA::MultiContinuation::AbstractGroup>
00254 getUnderlyingGroup() const;
00255
00257 virtual
00258 Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup>
00259 getUnderlyingGroup();
00260
00262
00268
00270 virtual void copy(const NOX::Abstract::Group& source);
00271
00273 virtual void setParamsMulti(
00274 const vector<int>& paramIDs,
00275 const NOX::Abstract::MultiVector::DenseMatrix& vals);
00276
00278 virtual void setParams(const ParameterVector& p);
00279
00281 virtual void setParam(int paramID, double val);
00282
00284 virtual void setParam(string paramID, double val);
00285
00287 virtual const ParameterVector& getParams() const;
00288
00290 virtual double getParam(int paramID) const;
00291
00293 virtual double getParam(string paramID) const;
00294
00301 virtual NOX::Abstract::Group::ReturnType
00302 computeDfDpMulti(const vector<int>& paramIDs,
00303 NOX::Abstract::MultiVector& dfdp,
00304 bool isValidF);
00305
00307
00311 virtual void
00312 preProcessContinuationStep(
00313 LOCA::Abstract::Iterator::StepStatus stepStatus);
00314
00316
00320 virtual void
00321 postProcessContinuationStep(
00322 LOCA::Abstract::Iterator::StepStatus stepStatus);
00323
00325 virtual void projectToDraw(const NOX::Abstract::Vector& x,
00326 double *px) const;
00327
00329 virtual int projectToDrawDimension() const;
00330
00331
00332
00334 virtual double
00335 computeScaledDotProduct(const NOX::Abstract::Vector& a,
00336 const NOX::Abstract::Vector& b) const;
00337
00339 virtual void printSolution(const double conParam) const;
00340
00342 virtual void printSolution(const NOX::Abstract::Vector& x,
00343 const double conParam) const;
00344
00346 virtual void
00347 scaleVector(NOX::Abstract::Vector& x) const;
00348
00350
00356
00358 virtual int getBorderedWidth() const;
00359
00361 virtual Teuchos::RCP<const NOX::Abstract::Group>
00362 getUnborderedGroup() const;
00363
00365 virtual bool isCombinedAZero() const;
00366
00368 virtual bool isCombinedBZero() const;
00369
00371 virtual bool isCombinedCZero() const;
00372
00377 virtual void
00378 extractSolutionComponent(const NOX::Abstract::MultiVector& v,
00379 NOX::Abstract::MultiVector& v_x) const;
00380
00386 virtual void
00387 extractParameterComponent(
00388 bool use_transpose,
00389 const NOX::Abstract::MultiVector& v,
00390 NOX::Abstract::MultiVector::DenseMatrix& v_p) const;
00391
00397 virtual void
00398 loadNestedComponents(const NOX::Abstract::MultiVector& v_x,
00399 const NOX::Abstract::MultiVector::DenseMatrix& v_p,
00400 NOX::Abstract::MultiVector& v) const;
00401
00403 virtual void fillA(NOX::Abstract::MultiVector& A) const;
00404
00406 virtual void fillB(NOX::Abstract::MultiVector& B) const;
00407
00409 virtual void fillC(NOX::Abstract::MultiVector::DenseMatrix& C) const;
00410
00412
00418
00420 virtual NOX::Abstract::Group::ReturnType
00421 applyJacobianTransposeInverse(Teuchos::ParameterList& params,
00422 const NOX::Abstract::Vector& input,
00423 NOX::Abstract::Vector& result) const;
00424
00426 virtual NOX::Abstract::Group::ReturnType
00427 applyJacobianTransposeInverseMultiVector(
00428 Teuchos::ParameterList& params,
00429 const NOX::Abstract::MultiVector& input,
00430 NOX::Abstract::MultiVector& result) const;
00431
00433
00435 virtual Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup>
00436 getGroup();
00437
00439 virtual
00440 Teuchos::RCP<LOCA::MultiContinuation::ConstraintInterface>
00441 getConstraints();
00442
00443 protected:
00444
00446 virtual void resetIsValid();
00447
00449 virtual void setupViews();
00450
00451 private:
00452
00454 ConstrainedGroup& operator=(const ConstrainedGroup& source);
00455
00456 protected:
00457
00459 Teuchos::RCP<LOCA::GlobalData> globalData;
00460
00462 Teuchos::RCP<LOCA::Parameter::SublistParser> parsedParams;
00463
00465 Teuchos::RCP<Teuchos::ParameterList> constraintParams;
00466
00468 Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup> grpPtr;
00469
00471 Teuchos::RCP<LOCA::BorderedSystem::AbstractGroup> bordered_grp;
00472
00474 Teuchos::RCP<LOCA::MultiContinuation::ConstraintInterface> constraintsPtr;
00475
00477 int numParams;
00478
00480 LOCA::MultiContinuation::ExtendedMultiVector xMultiVec;
00481
00483 LOCA::MultiContinuation::ExtendedMultiVector fMultiVec;
00484
00486 LOCA::MultiContinuation::ExtendedMultiVector newtonMultiVec;
00487
00489 LOCA::MultiContinuation::ExtendedMultiVector gradientMultiVec;
00490
00492 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> xVec;
00493
00495 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> fVec;
00496
00498 Teuchos::RCP<LOCA::MultiContinuation::ExtendedMultiVector> ffMultiVec;
00499
00501 Teuchos::RCP<LOCA::MultiContinuation::ExtendedMultiVector> dfdpMultiVec;
00502
00504 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> newtonVec;
00505
00507 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> gradientVec;
00508
00509
00510 Teuchos::RCP<LOCA::BorderedSolver::JacobianOperator> jacOp;
00511
00513 Teuchos::RCP<LOCA::BorderedSolver::AbstractStrategy> borderedSolver;
00514
00516 vector<int> index_f;
00517
00519 vector<int> index_dfdp;
00520
00522 vector<int> constraintParamIDs;
00523
00525 bool isValidF;
00526
00528 bool isValidJacobian;
00529
00531 bool isValidNewton;
00532
00534 bool isValidGradient;
00535
00537 bool isBordered;
00538
00540 bool skipDfDp;
00541
00542 };
00543
00544 }
00545
00546 }
00547
00548 #endif // LOCA_CONSTRAINEDSYSTEM_CONSTRAINEDGROUP_H