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_PITCHFORK_MINIMALLYAUGMENTED_EXTENDEDGROUP_H
00043 #define LOCA_PITCHFORK_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 Pitchfork {
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 Pitchfork {
00077
00078 namespace MinimallyAugmented {
00079
00205 class ExtendedGroup :
00206 public virtual LOCA::Extended::MultiAbstractGroup,
00207 public virtual LOCA::MultiContinuation::AbstractGroup,
00208 public virtual LOCA::BorderedSystem::AbstractGroup {
00209
00210 public:
00211
00213
00220 ExtendedGroup(
00221 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00222 const Teuchos::RCP<LOCA::Parameter::SublistParser>& topParams,
00223 const Teuchos::RCP<Teuchos::ParameterList>& pfParams,
00224 const Teuchos::RCP<LOCA::Pitchfork::MinimallyAugmented::AbstractGroup>& grp);
00225
00227 ExtendedGroup(const ExtendedGroup& source,
00228 NOX::CopyType type = NOX::DeepCopy);
00229
00231 virtual ~ExtendedGroup();
00232
00234 double getBifParam() const;
00235
00240
00242 virtual NOX::Abstract::Group&
00243 operator=(const NOX::Abstract::Group& source);
00244
00246 virtual Teuchos::RCP<NOX::Abstract::Group>
00247 clone(NOX::CopyType type = NOX::DeepCopy) const;
00248
00250 virtual void setX(const NOX::Abstract::Vector& y);
00251
00256 virtual void computeX(const NOX::Abstract::Group& g,
00257 const NOX::Abstract::Vector& d,
00258 double step);
00259
00261 virtual NOX::Abstract::Group::ReturnType computeF();
00262
00264 virtual NOX::Abstract::Group::ReturnType computeJacobian();
00265
00267 virtual NOX::Abstract::Group::ReturnType computeGradient();
00268
00270 virtual NOX::Abstract::Group::ReturnType
00271 computeNewton(Teuchos::ParameterList& params);
00272
00274 virtual NOX::Abstract::Group::ReturnType
00275 applyJacobian(const NOX::Abstract::Vector& input,
00276 NOX::Abstract::Vector& result) const;
00277
00279 virtual NOX::Abstract::Group::ReturnType
00280 applyJacobianTranspose(const NOX::Abstract::Vector& input,
00281 NOX::Abstract::Vector& result) const;
00282
00284 virtual NOX::Abstract::Group::ReturnType
00285 applyJacobianInverse(Teuchos::ParameterList& params,
00286 const NOX::Abstract::Vector& input,
00287 NOX::Abstract::Vector& result) const;
00288
00290 virtual NOX::Abstract::Group::ReturnType
00291 applyJacobianMultiVector(const NOX::Abstract::MultiVector& input,
00292 NOX::Abstract::MultiVector& result) const;
00293
00295 virtual NOX::Abstract::Group::ReturnType
00296 applyJacobianTransposeMultiVector(
00297 const NOX::Abstract::MultiVector& input,
00298 NOX::Abstract::MultiVector& result) const;
00299
00301 virtual NOX::Abstract::Group::ReturnType
00302 applyJacobianInverseMultiVector(
00303 Teuchos::ParameterList& params,
00304 const NOX::Abstract::MultiVector& input,
00305 NOX::Abstract::MultiVector& result) const;
00306
00308 virtual bool isF() const;
00309
00311 virtual bool isJacobian() const;
00312
00314 virtual bool isGradient() const;
00315
00317 virtual bool isNewton() const;
00318
00320 virtual const NOX::Abstract::Vector& getX() const;
00321
00323 virtual const NOX::Abstract::Vector& getF() const;
00324
00326 virtual double getNormF() const;
00327
00329 virtual const NOX::Abstract::Vector& getGradient() const;
00330
00332 virtual const NOX::Abstract::Vector& getNewton() const;
00333
00335 virtual double getNormNewtonSolveResidual() const;
00336
00338
00344
00346 virtual
00347 Teuchos::RCP<const LOCA::MultiContinuation::AbstractGroup>
00348 getUnderlyingGroup() const;
00349
00351 virtual
00352 Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup>
00353 getUnderlyingGroup();
00354
00356
00362
00364 virtual void copy(const NOX::Abstract::Group& source);
00365
00367 virtual void setParamsMulti(
00368 const vector<int>& paramIDs,
00369 const NOX::Abstract::MultiVector::DenseMatrix& vals);
00370
00372 virtual void setParams(const ParameterVector& p);
00373
00375 virtual void setParam(int paramID, double val);
00376
00378 virtual void setParam(string paramID, double val);
00379
00381 virtual const ParameterVector& getParams() const;
00382
00384 virtual double getParam(int paramID) const;
00385
00387 virtual double getParam(string paramID) const;
00388
00395 virtual NOX::Abstract::Group::ReturnType
00396 computeDfDpMulti(const vector<int>& paramIDs,
00397 NOX::Abstract::MultiVector& dfdp,
00398 bool isValidF);
00399
00401
00405 virtual void
00406 preProcessContinuationStep(
00407 LOCA::Abstract::Iterator::StepStatus stepStatus);
00408
00410
00414 virtual void
00415 postProcessContinuationStep(
00416 LOCA::Abstract::Iterator::StepStatus stepStatus);
00417
00419 virtual void projectToDraw(const NOX::Abstract::Vector& x,
00420 double *px) const;
00421
00423 virtual int projectToDrawDimension() const;
00424
00426 virtual double
00427 computeScaledDotProduct(const NOX::Abstract::Vector& a,
00428 const NOX::Abstract::Vector& b) const;
00429
00431 virtual void printSolution(const double conParam) const;
00432
00434 virtual void printSolution(const NOX::Abstract::Vector& x,
00435 const double conParam) const;
00436
00438 virtual void
00439 scaleVector(NOX::Abstract::Vector& x) const;
00440
00442
00448
00450 virtual int getBorderedWidth() const;
00451
00453 virtual Teuchos::RCP<const NOX::Abstract::Group>
00454 getUnborderedGroup() const;
00455
00457 virtual bool isCombinedAZero() const;
00458
00460 virtual bool isCombinedBZero() const;
00461
00463 virtual bool isCombinedCZero() const;
00464
00469 virtual void
00470 extractSolutionComponent(const NOX::Abstract::MultiVector& v,
00471 NOX::Abstract::MultiVector& v_x) const;
00472
00478 virtual void
00479 extractParameterComponent(
00480 bool use_transpose,
00481 const NOX::Abstract::MultiVector& v,
00482 NOX::Abstract::MultiVector::DenseMatrix& v_p) const;
00483
00489 virtual void
00490 loadNestedComponents(
00491 const NOX::Abstract::MultiVector& v_x,
00492 const NOX::Abstract::MultiVector::DenseMatrix& v_p,
00493 NOX::Abstract::MultiVector& v) const;
00494
00496 virtual void fillA(NOX::Abstract::MultiVector& A) const;
00497
00499 virtual void fillB(NOX::Abstract::MultiVector& B) const;
00500
00502 virtual void fillC(NOX::Abstract::MultiVector::DenseMatrix& C) const;
00503
00505
00506 protected:
00507
00509 virtual void resetIsValid();
00510
00512 virtual void setupViews();
00513
00515 void setBifParam(double param);
00516
00518 void getInitialVectors(
00519 Teuchos::RCP<NOX::Abstract::Vector>& aVecPtr,
00520 Teuchos::RCP<NOX::Abstract::Vector>& bVecPtr,
00521 bool isSymmetric);
00522
00523 private:
00524
00526 ExtendedGroup& operator=(const ExtendedGroup& source);
00527
00528 protected:
00529
00531 Teuchos::RCP<LOCA::GlobalData> globalData;
00532
00534 Teuchos::RCP<LOCA::Parameter::SublistParser> parsedParams;
00535
00537 Teuchos::RCP<Teuchos::ParameterList> pitchforkParams;
00538
00540 Teuchos::RCP<LOCA::Pitchfork::MinimallyAugmented::AbstractGroup> grpPtr;
00541
00543 Teuchos::RCP<LOCA::BorderedSystem::AbstractGroup> bordered_grp;
00544
00546 Teuchos::RCP<LOCA::Pitchfork::MinimallyAugmented::Constraint> constraintsPtr;
00547
00549 LOCA::MultiContinuation::ExtendedMultiVector xMultiVec;
00550
00552 LOCA::MultiContinuation::ExtendedMultiVector fMultiVec;
00553
00555 LOCA::MultiContinuation::ExtendedMultiVector newtonMultiVec;
00556
00558 LOCA::MultiContinuation::ExtendedMultiVector gradientMultiVec;
00559
00561 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> xVec;
00562
00564 Teuchos::RCP<NOX::Abstract::Vector> psiVec;
00565
00567 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> fVec;
00568
00570 Teuchos::RCP<LOCA::MultiContinuation::ExtendedMultiVector> ffMultiVec;
00571
00573 Teuchos::RCP<LOCA::MultiContinuation::ExtendedMultiVector> dfdpMultiVec;
00574
00576 Teuchos::RCP<LOCA::MultiContinuation::ExtendedMultiVector> fBifMultiVec;
00577
00579 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> newtonVec;
00580
00582 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> gradientVec;
00583
00584
00585 Teuchos::RCP<LOCA::BorderedSolver::JacobianOperator> jacOp;
00586
00588 Teuchos::RCP<LOCA::BorderedSolver::AbstractStrategy> borderedSolver;
00589
00591 vector<int> index_f;
00592
00594 vector<int> index_dfdp;
00595
00597 int bifParamID;
00598
00600 bool isValidF;
00601
00603 bool isValidJacobian;
00604
00606 bool isValidNewton;
00607
00609 bool isValidGradient;
00610
00612 bool isBordered;
00613
00614 };
00615
00616 }
00617
00618 }
00619
00620 }
00621
00622 #endif // LOCA_PITCHFORK_MINIMALLYAUGMENTED_EXTENDEDGROUP_H