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_TURNINGPOINT_MOORESPENCE_EXTENDEDGROUP_H
00043 #define LOCA_TURNINGPOINT_MOORESPENCE_EXTENDEDGROUP_H
00044
00045 #include "Teuchos_RCP.hpp"
00046
00047 #include "LOCA_MultiContinuation_AbstractGroup.H"
00048 #include "LOCA_Extended_MultiAbstractGroup.H"
00049 #include "LOCA_Abstract_TransposeSolveGroup.H"
00050 #include "LOCA_TurningPoint_MooreSpence_ExtendedVector.H"
00051 #include "LOCA_TurningPoint_MooreSpence_ExtendedMultiVector.H"
00052
00053 namespace LOCA {
00054 class ParameterVector;
00055 class GlobalData;
00056 namespace Parameter {
00057 class SublistParser;
00058 }
00059
00060 namespace TurningPoint {
00061 namespace MooreSpence {
00062 class AbstractGroup;
00063 class SolverStrategy;
00064 }
00065 }
00066 }
00067 namespace LOCA {
00068
00069 namespace TurningPoint {
00070
00071 namespace MooreSpence {
00072
00133 class ExtendedGroup
00134 : public virtual LOCA::Extended::MultiAbstractGroup,
00135 public virtual LOCA::MultiContinuation::AbstractGroup,
00136 public virtual LOCA::Abstract::TransposeSolveGroup {
00137
00138 public:
00139
00143 ExtendedGroup(
00144 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00145 const Teuchos::RCP<LOCA::Parameter::SublistParser>& topParams,
00146 const Teuchos::RCP<Teuchos::ParameterList>& tpParams,
00147 const Teuchos::RCP<LOCA::TurningPoint::MooreSpence::AbstractGroup>& g);
00148
00150 ExtendedGroup(const ExtendedGroup& source,
00151 NOX::CopyType type = NOX::DeepCopy);
00152
00154 virtual ~ExtendedGroup();
00155
00160
00162 virtual NOX::Abstract::Group&
00163 operator=(const NOX::Abstract::Group& source);
00164
00166 virtual Teuchos::RCP<NOX::Abstract::Group>
00167 clone(NOX::CopyType type = NOX::DeepCopy) const;
00168
00170 virtual void setX(const NOX::Abstract::Vector& y);
00171
00173 virtual void computeX(const NOX::Abstract::Group& g,
00174 const NOX::Abstract::Vector& d,
00175 double step);
00176
00178
00193 virtual NOX::Abstract::Group::ReturnType computeF();
00194
00196
00213 virtual NOX::Abstract::Group::ReturnType computeJacobian();
00214
00216 virtual NOX::Abstract::Group::ReturnType computeGradient();
00217
00219 virtual NOX::Abstract::Group::ReturnType
00220 computeNewton(Teuchos::ParameterList& params);
00221
00223
00250 virtual NOX::Abstract::Group::ReturnType
00251 applyJacobian(const NOX::Abstract::Vector& input,
00252 NOX::Abstract::Vector& result) const;
00253
00255 virtual NOX::Abstract::Group::ReturnType
00256 applyJacobianTranspose(const NOX::Abstract::Vector& input,
00257 NOX::Abstract::Vector& result) const;
00258
00267 virtual NOX::Abstract::Group::ReturnType
00268 applyJacobianInverse(Teuchos::ParameterList& params,
00269 const NOX::Abstract::Vector& input,
00270 NOX::Abstract::Vector& result) const;
00271
00273 virtual NOX::Abstract::Group::ReturnType
00274 applyJacobianMultiVector(const NOX::Abstract::MultiVector& input,
00275 NOX::Abstract::MultiVector& result) const;
00276
00278 virtual NOX::Abstract::Group::ReturnType
00279 applyJacobianTransposeMultiVector(
00280 const NOX::Abstract::MultiVector& input,
00281 NOX::Abstract::MultiVector& result) const;
00282
00284
00289 virtual NOX::Abstract::Group::ReturnType
00290 applyJacobianInverseMultiVector(
00291 Teuchos::ParameterList& params,
00292 const NOX::Abstract::MultiVector& input,
00293 NOX::Abstract::MultiVector& result) const;
00294
00296 virtual bool isF() const;
00297
00299 virtual bool isJacobian() const;
00300
00302 virtual bool isGradient() const;
00303
00305 virtual bool isNewton() const;
00306
00308 virtual const NOX::Abstract::Vector& getX() const;
00309
00311 virtual const NOX::Abstract::Vector& getF() const;
00312
00314 virtual double getNormF() const;
00315
00317 virtual const NOX::Abstract::Vector& getGradient() const;
00318
00320 virtual const NOX::Abstract::Vector& getNewton() const;
00321
00323 virtual double getNormNewtonSolveResidual() const;
00324
00326
00332
00334 virtual
00335 Teuchos::RCP<const LOCA::MultiContinuation::AbstractGroup>
00336 getUnderlyingGroup() const;
00337
00339 virtual
00340 Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup>
00341 getUnderlyingGroup();
00342
00344
00350
00352 virtual void copy(const NOX::Abstract::Group& source);
00353
00355 virtual void setParamsMulti(
00356 const vector<int>& paramIDs,
00357 const NOX::Abstract::MultiVector::DenseMatrix& vals);
00358
00360 virtual void setParams(const ParameterVector& p);
00361
00363 virtual void setParam(int paramID, double val);
00364
00366 virtual void setParam(string paramID, double val);
00367
00369 virtual const ParameterVector& getParams() const;
00370
00372 virtual double getParam(int paramID) const;
00373
00375 virtual double getParam(string paramID) const;
00376
00383 virtual NOX::Abstract::Group::ReturnType
00384 computeDfDpMulti(const vector<int>& paramIDs,
00385 NOX::Abstract::MultiVector& dfdp,
00386 bool isValidF);
00387
00389
00393 virtual void
00394 preProcessContinuationStep(
00395 LOCA::Abstract::Iterator::StepStatus stepStatus);
00396
00398
00402 virtual void
00403 postProcessContinuationStep(
00404 LOCA::Abstract::Iterator::StepStatus stepStatus);
00405
00407 virtual void projectToDraw(const NOX::Abstract::Vector& x,
00408 double *px) const;
00409
00411 virtual int projectToDrawDimension() const;
00412
00422 virtual void printSolution(const double conParam) const;
00423
00433 virtual void printSolution(const NOX::Abstract::Vector& x_,
00434 const double conParam) const;
00435
00437
00443
00445 virtual NOX::Abstract::Group::ReturnType
00446 applyJacobianTransposeInverse(Teuchos::ParameterList& params,
00447 const NOX::Abstract::Vector& input,
00448 NOX::Abstract::Vector& result) const;
00449
00451 virtual NOX::Abstract::Group::ReturnType
00452 applyJacobianTransposeInverseMultiVector(
00453 Teuchos::ParameterList& params,
00454 const NOX::Abstract::MultiVector& input,
00455 NOX::Abstract::MultiVector& result) const;
00456
00458
00460 double getBifParam() const;
00461
00463 double lTransNorm(const NOX::Abstract::Vector& n) const;
00464
00466
00469 void lTransNorm(const NOX::Abstract::MultiVector& n,
00470 NOX::Abstract::MultiVector::DenseMatrix& result) const;
00471
00473 Teuchos::RCP<NOX::Abstract::Vector>
00474 getLengthVector() const;
00475
00476 protected:
00477
00479 void setBifParam(double param);
00480
00482 void setupViews();
00483
00485 void init(bool perturbSoln = false, double perturbSize = 0.0);
00486
00487 private:
00488
00490 ExtendedGroup& operator=(const ExtendedGroup&);
00491
00492 protected:
00493
00495 Teuchos::RCP<LOCA::GlobalData> globalData;
00496
00498 Teuchos::RCP<LOCA::Parameter::SublistParser> parsedParams;
00499
00501 Teuchos::RCP<Teuchos::ParameterList> turningPointParams;
00502
00504 Teuchos::RCP<LOCA::TurningPoint::MooreSpence::AbstractGroup> grpPtr;
00505
00507 LOCA::TurningPoint::MooreSpence::ExtendedMultiVector xMultiVec;
00508
00510 LOCA::TurningPoint::MooreSpence::ExtendedMultiVector fMultiVec;
00511
00513 LOCA::TurningPoint::MooreSpence::ExtendedMultiVector newtonMultiVec;
00514
00516 Teuchos::RCP<NOX::Abstract::MultiVector> lengthMultiVec;
00517
00519 Teuchos::RCP<LOCA::TurningPoint::MooreSpence::ExtendedVector> xVec;
00520
00522 Teuchos::RCP<LOCA::TurningPoint::MooreSpence::ExtendedVector> fVec;
00523
00525 Teuchos::RCP<LOCA::TurningPoint::MooreSpence::ExtendedMultiVector> ffMultiVec;
00526
00528 Teuchos::RCP<LOCA::TurningPoint::MooreSpence::ExtendedMultiVector> dfdpMultiVec;
00529
00531 Teuchos::RCP<LOCA::TurningPoint::MooreSpence::ExtendedVector> newtonVec;
00532
00534 Teuchos::RCP<NOX::Abstract::Vector> lengthVec;
00535
00537 Teuchos::RCP<LOCA::TurningPoint::MooreSpence::SolverStrategy> solverStrategy;
00538
00540 vector<int> index_f;
00541
00543 vector<int> index_dfdp;
00544
00546 vector<int> bifParamID;
00547
00549 bool isValidF;
00550
00552 bool isValidJacobian;
00553
00555 bool isValidNewton;
00556
00557 };
00558
00559 }
00560
00561 }
00562
00563 }
00564
00565 #endif