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_EPETRA_GROUP_H
00043 #define LOCA_EPETRA_GROUP_H
00044
00045 #include "LOCA_Abstract_Group.H"
00046 #include "LOCA_Abstract_TransposeSolveGroup.H"
00047 #include "NOX_Epetra_Group.H"
00048 #include "LOCA_Parameter_Vector.H"
00049 #include "NOX_Common.H"
00050 #include "LOCA_Epetra_Interface_TimeDependent.H"
00051 #include "LOCA_Epetra_Interface_TimeDependentMatrixFree.H"
00052
00053
00054 namespace Teuchos {
00055 class ParameterList;
00056 }
00057 namespace LOCA {
00058 namespace Epetra {
00059 namespace Interface {
00060 class Required;
00061 }
00062 namespace TransposeLinearSystem {
00063 class AbstractStrategy;
00064 }
00065 }
00066 }
00067 namespace EpetraExt {
00068 class BlockCrsMatrix;
00069 class BlockVector;
00070 }
00071 class Epetra_BlockMap;
00072
00073 namespace LOCA {
00074
00076 namespace Epetra {
00077
00079
00104 class Group : public virtual NOX::Epetra::Group,
00105 public virtual LOCA::Abstract::Group,
00106 public virtual LOCA::Abstract::TransposeSolveGroup {
00107
00108 public:
00110
00116 Group(const Teuchos::RCP<LOCA::GlobalData>& global_data,
00117 Teuchos::ParameterList& printingParams,
00118 const Teuchos::RCP<LOCA::Epetra::Interface::Required>& i,
00119 NOX::Epetra::Vector& initialGuess,
00120 const LOCA::ParameterVector& p);
00121
00123
00128 Group(const Teuchos::RCP<LOCA::GlobalData>& global_data,
00129 Teuchos::ParameterList& printingParams,
00130 const Teuchos::RCP<LOCA::Epetra::Interface::Required>& i,
00131 NOX::Epetra::Vector& initialGuess,
00132 const Teuchos::RCP<NOX::Epetra::LinearSystem>& linSys,
00133 const LOCA::ParameterVector& p);
00134
00136
00146 Group(
00147 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00148 Teuchos::ParameterList& printingParams,
00149 const Teuchos::RCP<LOCA::Epetra::Interface::TimeDependent>& i,
00150 NOX::Epetra::Vector& initialGuess,
00151 const Teuchos::RCP<NOX::Epetra::LinearSystem>& linSys,
00152 const Teuchos::RCP<NOX::Epetra::LinearSystem>& shiftedLinSys,
00153 const LOCA::ParameterVector& p);
00154
00164 Group(
00165 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00166 Teuchos::ParameterList& printingParams,
00167 const Teuchos::RCP<LOCA::Epetra::Interface::TimeDependentMatrixFree>& i,
00168 NOX::Epetra::Vector& initialGuess,
00169 const Teuchos::RCP<NOX::Epetra::LinearSystem>& linSys,
00170 const Teuchos::RCP<NOX::Epetra::LinearSystem>& shiftedLinSys,
00171 const LOCA::ParameterVector& p);
00172
00173
00178 Group(const Group& source, NOX::CopyType type = NOX::DeepCopy);
00179
00181 virtual ~Group();
00182
00184 virtual Group& operator=(const Group& source);
00185
00190
00192 virtual NOX::Abstract::Group&
00193 operator=(const NOX::Abstract::Group& source);
00194
00196 virtual NOX::Abstract::Group&
00197 operator=(const NOX::Epetra::Group& source);
00198
00200 virtual Teuchos::RCP<NOX::Abstract::Group>
00201 clone(NOX::CopyType type = NOX::DeepCopy) const;
00202
00204
00207 virtual NOX::Abstract::Group::ReturnType
00208 computeF();
00209
00211
00214 virtual NOX::Abstract::Group::ReturnType
00215 computeJacobian();
00216
00218
00223
00225
00246 virtual NOX::Abstract::Group::ReturnType
00247 applyJacobianTransposeInverse(Teuchos::ParameterList& params,
00248 const NOX::Abstract::Vector& input,
00249 NOX::Abstract::Vector& result) const;
00250
00252
00273 virtual NOX::Abstract::Group::ReturnType
00274 applyJacobianTransposeInverseMultiVector(
00275 Teuchos::ParameterList& params,
00276 const NOX::Abstract::MultiVector& input,
00277 NOX::Abstract::MultiVector& result) const;
00278
00280
00285
00287 virtual void copy(const NOX::Abstract::Group& source);
00288
00290 virtual void setParams(const ParameterVector& p);
00291
00293 virtual void setParam(int paramID, double val);
00294
00296 virtual void setParam(string paramID, double val);
00297
00299 const LOCA::ParameterVector& getParams() const;
00300
00302 virtual double getParam(int paramID) const;
00303
00305 virtual double getParam(string paramID) const;
00306
00308
00313 virtual void
00314 preProcessContinuationStep(
00315 LOCA::Abstract::Iterator::StepStatus stepStatus);
00316
00318
00323 virtual void
00324 postProcessContinuationStep(
00325 LOCA::Abstract::Iterator::StepStatus stepStatus);
00326
00328
00338 virtual void projectToDraw(const NOX::Abstract::Vector& x,
00339 double *px) const;
00340
00342
00346 virtual int projectToDrawDimension() const;
00347
00349
00358 virtual double
00359 computeScaledDotProduct(const NOX::Abstract::Vector& a,
00360 const NOX::Abstract::Vector& b) const;
00361
00363 virtual void printSolution(const double conParam) const;
00364
00366 virtual void printSolution(const NOX::Abstract::Vector& x,
00367 const double conParam) const;
00368
00370
00379 virtual void
00380 scaleVector(NOX::Abstract::Vector& x) const;
00381
00383
00388
00393 virtual NOX::Abstract::Group::ReturnType
00394 augmentJacobianForHomotopy(double a, double b);
00395
00397
00402
00404 virtual NOX::Abstract::Group::ReturnType
00405 computeShiftedMatrix(double alpha, double beta);
00406
00408 virtual NOX::Abstract::Group::ReturnType
00409 applyShiftedMatrix(const NOX::Abstract::Vector& input,
00410 NOX::Abstract::Vector& result) const;
00411
00413 virtual NOX::Abstract::Group::ReturnType
00414 applyShiftedMatrixMultiVector(
00415 const NOX::Abstract::MultiVector& input,
00416 NOX::Abstract::MultiVector& result) const;
00417
00422 virtual NOX::Abstract::Group::ReturnType
00423 applyShiftedMatrixInverseMultiVector(
00424 Teuchos::ParameterList& params,
00425 const NOX::Abstract::MultiVector& input,
00426 NOX::Abstract::MultiVector& result) const;
00428
00433
00435 virtual bool isComplex() const;
00436
00438
00441 virtual NOX::Abstract::Group::ReturnType
00442 computeComplex(double frequency);
00443
00445 virtual NOX::Abstract::Group::ReturnType
00446 applyComplex(const NOX::Abstract::Vector& input_real,
00447 const NOX::Abstract::Vector& input_imag,
00448 NOX::Abstract::Vector& result_real,
00449 NOX::Abstract::Vector& result_imag) const;
00450
00452 virtual NOX::Abstract::Group::ReturnType
00453 applyComplexMultiVector(
00454 const NOX::Abstract::MultiVector& input_real,
00455 const NOX::Abstract::MultiVector& input_imag,
00456 NOX::Abstract::MultiVector& result_real,
00457 NOX::Abstract::MultiVector& result_imag) const;
00458
00460 virtual NOX::Abstract::Group::ReturnType
00461 applyComplexInverseMultiVector(
00462 Teuchos::ParameterList& params,
00463 const NOX::Abstract::MultiVector& input_real,
00464 const NOX::Abstract::MultiVector& input_imag,
00465 NOX::Abstract::MultiVector& result_real,
00466 NOX::Abstract::MultiVector& result_imag) const;
00467
00469
00474
00479 virtual NOX::Abstract::Group::ReturnType
00480 applyComplexTranspose(const NOX::Abstract::Vector& input_real,
00481 const NOX::Abstract::Vector& input_imag,
00482 NOX::Abstract::Vector& result_real,
00483 NOX::Abstract::Vector& result_imag) const;
00484
00489 virtual NOX::Abstract::Group::ReturnType
00490 applyComplexTransposeMultiVector(
00491 const NOX::Abstract::MultiVector& input_real,
00492 const NOX::Abstract::MultiVector& input_imag,
00493 NOX::Abstract::MultiVector& result_real,
00494 NOX::Abstract::MultiVector& result_imag) const;
00495
00497 virtual NOX::Abstract::Group::ReturnType
00498 applyComplexTransposeInverseMultiVector(
00499 Teuchos::ParameterList& params,
00500 const NOX::Abstract::MultiVector& input_real,
00501 const NOX::Abstract::MultiVector& input_imag,
00502 NOX::Abstract::MultiVector& result_real,
00503 NOX::Abstract::MultiVector& result_imag) const;
00504
00506
00508 virtual Teuchos::RCP<NOX::Epetra::Interface::Required>
00509 getUserInterface();
00510
00512 virtual void printSolution(const NOX::Epetra::Vector& x,
00513 const double conParam) const;
00514
00516 void setScaleVector(const NOX::Abstract::Vector& s);
00517
00519 void setJacobianOperatorForSolve(
00520 const Teuchos::RCP<const Epetra_Operator>& op) const;
00521
00523 virtual Teuchos::RCP<const NOX::Epetra::LinearSystem>
00524 getComplexLinearSystem() const;
00525
00527 virtual Teuchos::RCP<NOX::Epetra::LinearSystem>
00528 getComplexLinearSystem();
00529
00530 virtual void
00531 getComplexMaps(Teuchos::RCP<const Epetra_BlockMap>& baseMap,
00532 Teuchos::RCP<const Epetra_BlockMap>& globalMap) const;
00533
00534 protected:
00535
00537 virtual void resetIsValid();
00538
00539 protected:
00540
00542 Teuchos::RCP<LOCA::GlobalData> globalData;
00543
00545 Teuchos::ParameterList& printParams;
00546
00548 LOCA::ParameterVector params;
00549
00551 Teuchos::RCP<LOCA::Epetra::Interface::Required> userInterface;
00552
00554 Teuchos::RCP<LOCA::Epetra::Interface::TimeDependent> userInterfaceTime;
00555
00557 Teuchos::RCP<LOCA::Epetra::Interface::TimeDependentMatrixFree> userInterfaceTimeMF;
00558
00560 Teuchos::RCP< NOX::SharedObject<NOX::Epetra::LinearSystem,
00561 LOCA::Epetra::Group> > shiftedSharedLinearSystem;
00562
00564 mutable bool isValidShiftedPrec;
00565
00567 double alpha_;
00568
00570 double beta_;
00571
00573
00576 Teuchos::RCP<Epetra_Vector> tmpVectorPtr2;
00577
00579 Teuchos::RCP<NOX::Abstract::Vector> scaleVecPtr;
00580
00582 mutable Teuchos::RCP<LOCA::Epetra::TransposeLinearSystem::AbstractStrategy> tls_strategy;
00583
00585 mutable Teuchos::RCP< NOX::SharedObject<NOX::Epetra::LinearSystem, LOCA::Epetra::Group> > complexSharedLinearSystem;
00586
00588 Teuchos::RCP<EpetraExt::BlockCrsMatrix> complexMatrix;
00589
00591 Teuchos::RCP<EpetraExt::BlockVector> complexVec;
00592
00594 bool isValidComplex;
00595
00597 mutable bool isValidComplexPrec;
00598
00599 };
00600
00601 }
00602 }
00603
00604
00605 #endif