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_LAPACK_GROUP_H
00043 #define LOCA_LAPACK_GROUP_H
00044
00045 #include "LOCA_Abstract_Group.H"
00046 #include "LOCA_Abstract_TransposeSolveGroup.H"
00047 #include "NOX_LAPACK_Group.H"
00048 #include "LOCA_Parameter_Vector.H"
00049 #include "LOCA_LAPACK_Interface.H"
00050
00051 namespace LOCA {
00052
00054 namespace LAPACK {
00055
00057
00092 class Group :
00093 public NOX::LAPACK::Group,
00094 public LOCA::Abstract::Group,
00095 public virtual LOCA::Abstract::TransposeSolveGroup {
00096
00097 public:
00098
00100 Group(const Teuchos::RCP<LOCA::GlobalData>& global_data,
00101 LOCA::LAPACK::Interface& i);
00102
00104 Group(const LOCA::LAPACK::Group& source,
00105 NOX::CopyType type = NOX::DeepCopy);
00106
00108 ~Group();
00109
00111 LOCA::LAPACK::Group& operator=(const LOCA::LAPACK::Group& source);
00112
00117
00119 NOX::Abstract::Group& operator=(const NOX::Abstract::Group& source);
00120
00122 NOX::LAPACK::Group& operator=(const NOX::LAPACK::Group& source);
00123
00125 Teuchos::RCP<NOX::Abstract::Group>
00126 clone(NOX::CopyType type = NOX::DeepCopy) const;
00127
00129
00132 NOX::Abstract::Group::ReturnType computeF();
00133
00135
00138 NOX::Abstract::Group::ReturnType computeJacobian();
00139
00141
00146
00148 virtual NOX::Abstract::Group::ReturnType
00149 applyJacobianTransposeInverse(Teuchos::ParameterList& params,
00150 const NOX::Abstract::Vector& input,
00151 NOX::Abstract::Vector& result) const;
00152
00154 virtual NOX::Abstract::Group::ReturnType
00155 applyJacobianTransposeInverseMultiVector(
00156 Teuchos::ParameterList& params,
00157 const NOX::Abstract::MultiVector& input,
00158 NOX::Abstract::MultiVector& result) const;
00159
00161
00166
00168 virtual void copy(const NOX::Abstract::Group& source);
00169
00171 void setParams(const LOCA::ParameterVector& p);
00172
00174 virtual void setParam(int paramID, double val);
00175
00177 virtual void setParam(string paramID, double val);
00178
00180 const LOCA::ParameterVector& getParams() const;
00181
00183 virtual double getParam(int paramID) const;
00184
00186 virtual double getParam(string paramID) const;
00187
00189
00199 virtual void projectToDraw(const NOX::Abstract::Vector& x,
00200 double *px) const;
00201
00203
00207 virtual int projectToDrawDimension() const;
00208
00210
00213 virtual double
00214 computeScaledDotProduct(const NOX::Abstract::Vector& a,
00215 const NOX::Abstract::Vector& b) const;
00216
00218 void printSolution(const double conParam) const;
00219
00221 void printSolution(const NOX::Abstract::Vector& x_,
00222 const double conParam) const;
00223
00225
00228 virtual void
00229 scaleVector(NOX::Abstract::Vector& x) const;
00230
00232
00237
00239 virtual NOX::Abstract::Group::ReturnType
00240 computeShiftedMatrix(double alpha, double beta);
00241
00243 virtual NOX::Abstract::Group::ReturnType
00244 applyShiftedMatrix(const NOX::Abstract::Vector& input,
00245 NOX::Abstract::Vector& result) const;
00246
00248 virtual NOX::Abstract::Group::ReturnType
00249 applyShiftedMatrixMultiVector(
00250 const NOX::Abstract::MultiVector& input,
00251 NOX::Abstract::MultiVector& result) const;
00252
00257 virtual NOX::Abstract::Group::ReturnType
00258 applyShiftedMatrixInverseMultiVector(
00259 Teuchos::ParameterList& params,
00260 const NOX::Abstract::MultiVector& input,
00261 NOX::Abstract::MultiVector& result) const;
00262
00264
00269
00271 virtual bool isComplex() const;
00272
00274
00277 virtual NOX::Abstract::Group::ReturnType
00278 computeComplex(double frequency);
00279
00281 virtual NOX::Abstract::Group::ReturnType
00282 applyComplex(const NOX::Abstract::Vector& input_real,
00283 const NOX::Abstract::Vector& input_imag,
00284 NOX::Abstract::Vector& result_real,
00285 NOX::Abstract::Vector& result_imag) const;
00286
00288 virtual NOX::Abstract::Group::ReturnType
00289 applyComplexMultiVector(const NOX::Abstract::MultiVector& input_real,
00290 const NOX::Abstract::MultiVector& input_imag,
00291 NOX::Abstract::MultiVector& result_real,
00292 NOX::Abstract::MultiVector& result_imag) const;
00293
00295 virtual NOX::Abstract::Group::ReturnType
00296 applyComplexInverseMultiVector(
00297 Teuchos::ParameterList& params,
00298 const NOX::Abstract::MultiVector& input_real,
00299 const NOX::Abstract::MultiVector& input_imag,
00300 NOX::Abstract::MultiVector& result_real,
00301 NOX::Abstract::MultiVector& result_imag) const;
00302
00304
00309
00314 virtual NOX::Abstract::Group::ReturnType
00315 applyComplexTranspose(const NOX::Abstract::Vector& input_real,
00316 const NOX::Abstract::Vector& input_imag,
00317 NOX::Abstract::Vector& result_real,
00318 NOX::Abstract::Vector& result_imag) const;
00319
00324 virtual NOX::Abstract::Group::ReturnType
00325 applyComplexTransposeMultiVector(
00326 const NOX::Abstract::MultiVector& input_real,
00327 const NOX::Abstract::MultiVector& input_imag,
00328 NOX::Abstract::MultiVector& result_real,
00329 NOX::Abstract::MultiVector& result_imag) const;
00330
00332 virtual NOX::Abstract::Group::ReturnType
00333 applyComplexTransposeInverseMultiVector(
00334 Teuchos::ParameterList& params,
00335 const NOX::Abstract::MultiVector& input_real,
00336 const NOX::Abstract::MultiVector& input_imag,
00337 NOX::Abstract::MultiVector& result_real,
00338 NOX::Abstract::MultiVector& result_imag) const;
00339
00341
00350 virtual NOX::Abstract::Group::ReturnType
00351 augmentJacobianForHomotopy(double a, double b);
00352
00354
00356 NOX::LAPACK::Matrix<double>& getJacobianMatrix() {
00357 return jacSolver.getMatrix();
00358 }
00359
00361 const NOX::LAPACK::Matrix<double>& getJacobianMatrix() const {
00362 return jacSolver.getMatrix();
00363 }
00364
00366 NOX::LAPACK::Matrix<double>& getShiftedMatrix() {
00367 return shiftedSolver.getMatrix();
00368 }
00369
00371 const NOX::LAPACK::Matrix<double>& getShiftedMatrix() const {
00372 return shiftedSolver.getMatrix();
00373 }
00374
00376 NOX::LAPACK::Matrix< std::complex<double> >& getComplexMatrix() {
00377 return complexSolver.getMatrix();
00378 }
00379
00381 const NOX::LAPACK::Matrix< std::complex<double> >&
00382 getComplexMatrix() const {
00383 return complexSolver.getMatrix();
00384 }
00385
00386 protected:
00387
00389 void resetIsValid();
00390
00391 protected:
00392
00394 Teuchos::RCP<LOCA::GlobalData> globalData;
00395
00397 LOCA::LAPACK::Interface& locaProblemInterface;
00398
00400 ParameterVector params;
00401
00403 mutable NOX::LAPACK::LinearSolver<double> shiftedSolver;
00404
00406 double freq;
00407
00409 bool isValidComplex;
00410
00412 mutable NOX::LAPACK::LinearSolver< std::complex<double> > complexSolver;
00413
00414 };
00415
00416 }
00417 }
00418
00419
00420 #endif