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_HOMOTOPY_DEFAULTEDGROUP_H
00043 #define LOCA_HOMOTOPY_DEFAULTEDGROUP_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 #include "LOCA_Parameter_Vector.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 Homotopy {
00064 class AbstractGroup;
00065 }
00066 namespace BorderedSolver {
00067 class AbstractStrategy;
00068 class JacobianOperator;
00069 }
00070 }
00071
00072 namespace LOCA {
00073
00074 namespace Homotopy {
00075
00124 class DeflatedGroup :
00125 public virtual LOCA::Extended::MultiAbstractGroup,
00126 public virtual LOCA::MultiContinuation::AbstractGroup,
00127 public virtual LOCA::BorderedSystem::AbstractGroup {
00128
00129 public:
00130
00132
00138 DeflatedGroup(
00139 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00140 const Teuchos::RCP<Teuchos::ParameterList>& topParams,
00141 const Teuchos::RCP<Teuchos::ParameterList>& hParams,
00142 const Teuchos::RCP<LOCA::Homotopy::AbstractGroup>& grp,
00143 const Teuchos::RCP<const NOX::Abstract::Vector>& start_vec,
00144 const std::vector< Teuchos::RCP<const NOX::Abstract::Vector> >& prev_solns,
00145 const double identity_sign = 1.0);
00146
00148 DeflatedGroup(const DeflatedGroup& source,
00149 NOX::CopyType type = NOX::DeepCopy);
00150
00152 virtual ~DeflatedGroup();
00153
00155 double getHomotopyParam() const;
00156
00161
00163 virtual NOX::Abstract::Group&
00164 operator=(const NOX::Abstract::Group& source);
00165
00167 virtual Teuchos::RCP<NOX::Abstract::Group>
00168 clone(NOX::CopyType type = NOX::DeepCopy) const;
00169
00171 virtual void setX(const NOX::Abstract::Vector& y);
00172
00177 virtual void computeX(const NOX::Abstract::Group& g,
00178 const NOX::Abstract::Vector& d,
00179 double step);
00180
00182 virtual NOX::Abstract::Group::ReturnType computeF();
00183
00185 virtual NOX::Abstract::Group::ReturnType computeJacobian();
00186
00188 virtual NOX::Abstract::Group::ReturnType computeGradient();
00189
00191 virtual NOX::Abstract::Group::ReturnType
00192 computeNewton(Teuchos::ParameterList& params);
00193
00195 virtual NOX::Abstract::Group::ReturnType
00196 applyJacobian(const NOX::Abstract::Vector& input,
00197 NOX::Abstract::Vector& result) const;
00198
00200 virtual NOX::Abstract::Group::ReturnType
00201 applyJacobianTranspose(const NOX::Abstract::Vector& input,
00202 NOX::Abstract::Vector& result) const;
00203
00205 virtual NOX::Abstract::Group::ReturnType
00206 applyJacobianInverse(Teuchos::ParameterList& params,
00207 const NOX::Abstract::Vector& input,
00208 NOX::Abstract::Vector& result) const;
00209
00211 virtual NOX::Abstract::Group::ReturnType
00212 applyJacobianMultiVector(const NOX::Abstract::MultiVector& input,
00213 NOX::Abstract::MultiVector& result) const;
00214
00216 virtual NOX::Abstract::Group::ReturnType
00217 applyJacobianTransposeMultiVector(
00218 const NOX::Abstract::MultiVector& input,
00219 NOX::Abstract::MultiVector& result) const;
00220
00222 virtual NOX::Abstract::Group::ReturnType
00223 applyJacobianInverseMultiVector(
00224 Teuchos::ParameterList& params,
00225 const NOX::Abstract::MultiVector& input,
00226 NOX::Abstract::MultiVector& result) const;
00227
00229 virtual bool isF() const;
00230
00232 virtual bool isJacobian() const;
00233
00235 virtual bool isGradient() const;
00236
00238 virtual bool isNewton() const;
00239
00241 virtual const NOX::Abstract::Vector& getX() const;
00242
00244 virtual const NOX::Abstract::Vector& getF() const;
00245
00247 virtual double getNormF() const;
00248
00250 virtual const NOX::Abstract::Vector& getGradient() const;
00251
00253 virtual const NOX::Abstract::Vector& getNewton() const;
00254
00256 virtual double getNormNewtonSolveResidual() const;
00257
00259
00265
00267 virtual
00268 Teuchos::RCP<const LOCA::MultiContinuation::AbstractGroup>
00269 getUnderlyingGroup() const;
00270
00272 virtual
00273 Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup>
00274 getUnderlyingGroup();
00275
00277
00283
00285 virtual void copy(const NOX::Abstract::Group& source);
00286
00288 virtual void setParamsMulti(
00289 const vector<int>& paramIDs,
00290 const NOX::Abstract::MultiVector::DenseMatrix& vals);
00291
00293 virtual void setParams(const ParameterVector& p);
00294
00296 virtual void setParam(int paramID, double val);
00297
00299 virtual void setParam(string paramID, double val);
00300
00302 virtual const ParameterVector& getParams() const;
00303
00305 virtual double getParam(int paramID) const;
00306
00308 virtual double getParam(string paramID) const;
00309
00316 virtual NOX::Abstract::Group::ReturnType
00317 computeDfDpMulti(const vector<int>& paramIDs,
00318 NOX::Abstract::MultiVector& dfdp,
00319 bool isValidF);
00320
00322
00326 virtual void
00327 preProcessContinuationStep(
00328 LOCA::Abstract::Iterator::StepStatus stepStatus);
00329
00331
00335 virtual void
00336 postProcessContinuationStep(
00337 LOCA::Abstract::Iterator::StepStatus stepStatus);
00338
00340 virtual void projectToDraw(const NOX::Abstract::Vector& x,
00341 double *px) const;
00342
00344 virtual int projectToDrawDimension() const;
00345
00347 virtual double
00348 computeScaledDotProduct(const NOX::Abstract::Vector& a,
00349 const NOX::Abstract::Vector& b) const;
00350
00352 virtual void printSolution(const double conParam) const;
00353
00355 virtual void printSolution(const NOX::Abstract::Vector& x,
00356 const double conParam) const;
00357
00359 virtual void
00360 scaleVector(NOX::Abstract::Vector& x) const;
00361
00363
00369
00371 virtual int getBorderedWidth() const;
00372
00374 virtual Teuchos::RCP<const NOX::Abstract::Group>
00375 getUnborderedGroup() const;
00376
00378 virtual bool isCombinedAZero() const;
00379
00381 virtual bool isCombinedBZero() const;
00382
00384 virtual bool isCombinedCZero() const;
00385
00390 virtual void
00391 extractSolutionComponent(const NOX::Abstract::MultiVector& v,
00392 NOX::Abstract::MultiVector& v_x) const;
00393
00399 virtual void
00400 extractParameterComponent(
00401 bool use_transpose,
00402 const NOX::Abstract::MultiVector& v,
00403 NOX::Abstract::MultiVector::DenseMatrix& v_p) const;
00404
00410 virtual void
00411 loadNestedComponents(
00412 const NOX::Abstract::MultiVector& v_x,
00413 const NOX::Abstract::MultiVector::DenseMatrix& v_p,
00414 NOX::Abstract::MultiVector& v) const;
00415
00417 virtual void fillA(NOX::Abstract::MultiVector& A) const;
00418
00420 virtual void fillB(NOX::Abstract::MultiVector& B) const;
00421
00423 virtual void fillC(NOX::Abstract::MultiVector::DenseMatrix& C) const;
00424
00426
00427 protected:
00428
00430 virtual void resetIsValid();
00431
00433 virtual void setupViews();
00434
00436 void setHomotopyParam(double param);
00437
00439 void setStepperParameters(Teuchos::ParameterList& topParams);
00440
00441 private:
00442
00444 DeflatedGroup& operator=(const DeflatedGroup& source);
00445
00446 protected:
00447
00449 Teuchos::RCP<LOCA::GlobalData> globalData;
00450
00452 Teuchos::RCP<LOCA::Parameter::SublistParser> parsedParams;
00453
00455 Teuchos::RCP<Teuchos::ParameterList> homotopyParams;
00456
00458 Teuchos::RCP<LOCA::Homotopy::AbstractGroup> grpPtr;
00459
00461 Teuchos::RCP<LOCA::BorderedSystem::AbstractGroup> bordered_grp;
00462
00464 LOCA::MultiContinuation::ExtendedMultiVector xMultiVec;
00465
00467 LOCA::MultiContinuation::ExtendedMultiVector fMultiVec;
00468
00470 LOCA::MultiContinuation::ExtendedMultiVector newtonMultiVec;
00471
00473 LOCA::MultiContinuation::ExtendedMultiVector gradientMultiVec;
00474
00476 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> xVec;
00477
00479 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> fVec;
00480
00482 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> newtonVec;
00483
00485 Teuchos::RCP<LOCA::MultiContinuation::ExtendedVector> gradientVec;
00486
00488 Teuchos::RCP<const NOX::Abstract::Vector> startVec;
00489
00491 double identitySign;
00492
00494 std::vector< Teuchos::RCP<const NOX::Abstract::Vector> > solns;
00495
00497 Teuchos::RCP<NOX::Abstract::Vector> distVec;
00498
00500 Teuchos::RCP<NOX::Abstract::MultiVector> totalDistMultiVec;
00501
00503 Teuchos::RCP<NOX::Abstract::Vector> totalDistVec;
00504
00506 Teuchos::RCP<NOX::Abstract::MultiVector> underlyingF;
00507
00508
00509 Teuchos::RCP<LOCA::BorderedSolver::JacobianOperator> jacOp;
00510
00512 Teuchos::RCP<LOCA::BorderedSolver::AbstractStrategy> borderedSolver;
00513
00515 Teuchos::RCP<NOX::Abstract::MultiVector::DenseMatrix> minusOne;
00516
00518 int numSolns;
00519
00521 std::vector<double> distances;
00522
00524 double distProd;
00525
00527 vector<int> index_f;
00528
00530
00531 LOCA::ParameterVector paramVec;
00532
00534
00537 double conParam;
00538
00540 int conParamID;
00541
00546 const string conParamLabel;
00547
00554 bool augmentJacForHomotopyNotImplemented;
00555
00557 bool isValidF;
00558
00560 bool isValidJacobian;
00561
00563 bool isValidNewton;
00564
00566 bool isValidGradient;
00567
00569 bool isBordered;
00570
00571 };
00572
00573 }
00574
00575 }
00576
00577 #endif // LOCA_HOMOTOPY_DEFLATEDGROUP_H