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_HOPF_MINIMALLYAUGMENTED_EXTENDEDGROUP_H
00043 #define LOCA_HOPF_MINIMALLYAUGMENTED_EXTENDEDGROUP_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_MultiContinuation_ExtendedVector.H"
00051 #include "LOCA_MultiContinuation_ExtendedMultiVector.H"
00052
00053
00054 namespace Teuchos {
00055 class ParameterList;
00056 }
00057 namespace LOCA {
00058 class GlobalData;
00059 namespace Parameter {
00060 class SublistParser;
00061 }
00062 namespace Hopf {
00063 namespace MinimallyAugmented {
00064 class AbstractGroup;
00065 class Constraint;
00066 }
00067 }
00068 namespace BorderedSolver {
00069 class AbstractStrategy;
00070 class JacobianOperator;
00071 }
00072 }
00073
00074 namespace LOCA {
00075
00076 namespace Hopf {
00077
00078 namespace MinimallyAugmented {
00079
00216 class ExtendedGroup :
00217 public virtual LOCA::Extended::MultiAbstractGroup,
00218 public virtual LOCA::MultiContinuation::AbstractGroup,
00219 public virtual LOCA::BorderedSystem::AbstractGroup {
00220
00221 public:
00222
00224
00231 ExtendedGroup(
00232 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00233 const Teuchos::RCP<LOCA::Parameter::SublistParser>& topParams,
00234 const Teuchos::RCP<Teuchos::ParameterList>& hpfParams,
00235 const Teuchos::RCP<LOCA::Hopf::MinimallyAugmented::AbstractGroup>& grp);
00236
00238 ExtendedGroup(const ExtendedGroup& source,
00239 NOX::CopyType type = NOX::DeepCopy);
00240
00242 virtual ~ExtendedGroup();
00243
00245 double getBifParam() const;
00246
00251
00253 virtual NOX::Abstract::Group&
00254 operator=(const NOX::Abstract::Group& source);
00255
00257 virtual Teuchos::RCP<NOX::Abstract::Group>
00258 clone(NOX::CopyType type = NOX::DeepCopy) const;
00259
00261 virtual void setX(const NOX::Abstract::Vector& y);
00262
00267 virtual void computeX(const NOX::Abstract::Group& g,
00268 const NOX::Abstract::Vector& d,
00269 double step);
00270
00272 virtual NOX::Abstract::Group::ReturnType computeF();
00273
00275 virtual NOX::Abstract::Group::ReturnType computeJacobian();
00276
00278 virtual NOX::Abstract::Group::ReturnType computeGradient();
00279
00281 virtual NOX::Abstract::Group::ReturnType
00282 computeNewton(Teuchos::ParameterList& params);
00283
00285 virtual NOX::Abstract::Group::ReturnType
00286 applyJacobian(const NOX::Abstract::Vector& input,
00287 NOX::Abstract::Vector& result) const;
00288
00290 virtual NOX::Abstract::Group::ReturnType
00291 applyJacobianTranspose(const NOX::Abstract::Vector& input,
00292 NOX::Abstract::Vector& result) const;
00293
00295 virtual NOX::Abstract::Group::ReturnType
00296 applyJacobianInverse(Teuchos::ParameterList& params,
00297 const NOX::Abstract::Vector& input,
00298 NOX::Abstract::Vector& result) const;
00299
00301 virtual NOX::Abstract::Group::ReturnType
00302 applyJacobianMultiVector(const NOX::Abstract::MultiVector& input,
00303 NOX::Abstract::MultiVector& result) const;
00304
00306 virtual NOX::Abstract::Group::ReturnType
00307 applyJacobianTransposeMultiVector(
00308 const NOX::Abstract::MultiVector& input,
00309 NOX::Abstract::MultiVector& result) const;
00310
00312 virtual NOX::Abstract::Group::ReturnType
00313 applyJacobianInverseMultiVector(
00314 Teuchos::ParameterList& params,
00315 const NOX::Abstract::MultiVector& input,
00316 NOX::Abstract::MultiVector& result) const;
00317
00319 virtual bool isF() const;
00320
00322 virtual bool isJacobian() const;
00323
00325 virtual bool isGradient() const;
00326
00328 virtual bool isNewton() const;
00329
00331 virtual const NOX::Abstract::Vector& getX() const;
00332
00334 virtual const NOX::Abstract::Vector& getF() const;
00335
00337 virtual double getNormF() const;
00338
00340 virtual const NOX::Abstract::Vector& getGradient() const;
00341
00343 virtual const NOX::Abstract::Vector& getNewton() const;
00344
00346 virtual double getNormNewtonSolveResidual() const;
00347
00349
00355
00357 virtual
00358 Teuchos::RCP<const LOCA::MultiContinuation::AbstractGroup>
00359 getUnderlyingGroup() const;
00360
00362 virtual
00363 Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup>
00364 getUnderlyingGroup();
00365
00367
00373
00375 virtual void copy(const NOX::Abstract::Group& source);
00376
00378 virtual void setParamsMulti(
00379 const vector<int>& paramIDs,
00380 const NOX::Abstract::MultiVector::DenseMatrix& vals);
00381
00383 virtual void setParams(const ParameterVector& p);
00384
00386 virtual void setParam(int paramID, double val);
00387
00389 virtual void setParam(string paramID, double val);
00390
00392 virtual const ParameterVector& getParams() const;
00393
00395 virtual double getParam(int paramID) const;
00396
00398 virtual double getParam(string paramID) const;
00399
00406 virtual NOX::Abstract::Group::ReturnType
00407 computeDfDpMulti(const vector<int>& paramIDs,
00408 NOX::Abstract::MultiVector& dfdp,
00409 bool isValidF);
00410
00412
00416 virtual void
00417 preProcessContinuationStep(
00418 LOCA::Abstract::Iterator::StepStatus stepStatus);
00419
00421
00425 virtual void
00426 postProcessContinuationStep(
00427 LOCA::Abstract::Iterator::StepStatus stepStatus);
00428
00430 virtual void projectToDraw(const NOX::Abstract::Vector& x,
00431 double *px) const;
00432
00434 virtual int projectToDrawDimension() const;
00435
00437 virtual double
00438 computeScaledDotProduct(const NOX::Abstract::Vector& a,
00439 const NOX::Abstract::Vector& b) const;
00440
00442 virtual void printSolution(const double conParam) const;
00443
00445 virtual void printSolution(const NOX::Abstract::Vector& x,
00446 const double conParam) const;
00447
00449 virtual void
00450 scaleVector(NOX::Abstract::Vector& x) const;
00451
00453
00459
00461 virtual int getBorderedWidth() const;
00462
00464 virtual Teuchos::RCP<const NOX::Abstract::Group>
00465 getUnborderedGroup() const;
00466
00468 virtual bool isCombinedAZero() const;
00469
00471 virtual bool isCombinedBZero() const;
00472
00474 virtual bool isCombinedCZero() const;
00475
00480 virtual void
00481 extractSolutionComponent(const NOX::Abstract::MultiVector& v,
00482 NOX::Abstract::MultiVector& v_x) const;
00483
00489 virtual void
00490 extractParameterComponent(
00491 bool use_transpose,
00492 const NOX::Abstract::MultiVector& v,
00493 NOX::Abstract::MultiVector::DenseMatrix& v_p) const;
00494
00500 virtual void
00501 loadNestedComponents(
00502 const NOX::Abstract::MultiVector& v_x,
00503 const NOX::Abstract::MultiVector::DenseMatrix& v_p,
00504 NOX::Abstract::MultiVector& v) const;
00505
00507 virtual void fillA(NOX::Abstract::MultiVector& A) const;
00508
00510 virtual void fillB(NOX::Abstract::MultiVector& B) const;
00511
00513 virtual void fillC(NOX::Abstract::MultiVector::DenseMatrix& C) const;
00514
00516
00517 protected:
00518
00520 virtual void resetIsValid();
00521
00523 virtual void setupViews();
00524
00526 void setBifParam(double param);
00527
00529 void getInitialVectors(
00530 Teuchos::RCP<NOX::Abstract::Vector>& aVecPtr_real,
00531 Teuchos::RCP<NOX::Abstract::Vector>& aVecPtr_imag,
00532 Teuchos::RCP<NOX::Abstract::Vector>& bVecPtr_real,
00533 Teuchos::RCP<NOX::Abstract::Vector>& bVecPtr_imag,
00534 bool isSymmetric);
00535
00536 private:
00537
00539 ExtendedGroup& operator=(const ExtendedGroup& source);
00540
00541 protected:
00542
00544 Teuchos::RCP<LOCA::GlobalData> globalData;
00545
00547 Teuchos::RCP<LOCA::Parameter::SublistParser> parsedParams;
00548
00550 Teuchos::RCP<Teuchos::ParameterList> hopfParams;
00551
00553 Teuchos::RCP<LOCA::Hopf::MinimallyAugmented::AbstractGroup> grpPtr;
00554
00556 Teuchos::RCP<LOCA::BorderedSystem::AbstractGroup> bordered_grp;
00557
00559 Teuchos::RCP<LOCA::Hopf::MinimallyAugmented::Constraint> constraintsPtr;
00560
00562 LOCA::MultiContinuation::ExtendedMultiVector xMultiVec;
00563
00565 LOCA::MultiContinuation::ExtendedMultiVector fMultiVec;
00566
00568 LOCA::MultiContinuation::ExtendedMultiVector newtonMultiVec;
00569
00571 LOCA::MultiContinuation::ExtendedMultiVector gradientMultiVec;
00572
00574 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> xVec;
00575
00577 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> fVec;
00578
00580 Teuchos::RCP<LOCA::MultiContinuation::ExtendedMultiVector> ffMultiVec;
00581
00583 Teuchos::RCP<LOCA::MultiContinuation::ExtendedMultiVector> dfdpMultiVec;
00584
00586 Teuchos::RCP<LOCA::MultiContinuation::ExtendedMultiVector> fBifMultiVec;
00587
00589 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> newtonVec;
00590
00592 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> gradientVec;
00593
00594
00595 Teuchos::RCP<LOCA::BorderedSolver::JacobianOperator> jacOp;
00596
00598 Teuchos::RCP<LOCA::BorderedSolver::AbstractStrategy> borderedSolver;
00599
00601 vector<int> index_f;
00602
00604 vector<int> index_dfdp;
00605
00607 int bifParamID;
00608
00610 bool isValidF;
00611
00613 bool isValidJacobian;
00614
00616 bool isValidNewton;
00617
00619 bool isValidGradient;
00620
00622 bool isBordered;
00623
00624 };
00625
00626 }
00627
00628 }
00629
00630 }
00631
00632 #endif // LOCA_HOPF_MINIMALLYAUGMENTED_EXTENDEDGROUP_H