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 #ifndef LOCA_EPETRA_AUGMENTEDOP_H
00040 #define LOCA_EPETRA_AUGMENTEDOP_H
00041
00042 #include "Teuchos_RCP.hpp"
00043
00044 #include "Epetra_Operator.h"
00045 #include "Epetra_LocalMap.h"
00046 #include "Epetra_MultiVector.h"
00047
00048 #include "NOX_Common.H"
00049 #include "NOX_Abstract_MultiVector.H"
00050
00051 #include "Teuchos_LAPACK.hpp"
00052
00053
00054 namespace LOCA {
00055 class GlobalData;
00056 }
00057
00058 namespace LOCA {
00059
00060 namespace Epetra {
00061
00116 class AugmentedOp : public Epetra_Operator {
00117
00118 public:
00119
00121
00126 AugmentedOp(const Teuchos::RCP<LOCA::GlobalData>& global_data,
00127 const Teuchos::RCP<Epetra_Operator>& jac,
00128 const Teuchos::RCP<const Epetra_MultiVector>& a,
00129 const Teuchos::RCP<const Epetra_MultiVector>& b,
00130 const Teuchos::RCP<const NOX::Abstract::MultiVector::DenseMatrix> c);
00131
00133 virtual ~AugmentedOp();
00134
00136
00140 virtual int SetUseTranspose(bool UseTranspose);
00141
00164 virtual int Apply(const Epetra_MultiVector& Input,
00165 Epetra_MultiVector& Result) const;
00166
00198 virtual int ApplyInverse(const Epetra_MultiVector& X,
00199 Epetra_MultiVector& Y) const;
00200
00202
00207 virtual double NormInf() const;
00208
00210 virtual const char* Label () const;
00211
00213 virtual bool UseTranspose() const;
00214
00219 virtual bool HasNormInf() const;
00220
00225 virtual const Epetra_Comm & Comm() const;
00226
00231 virtual const Epetra_Map& OperatorDomainMap () const;
00232
00237 virtual const Epetra_Map& OperatorRangeMap () const;
00238
00240 virtual void init(const Epetra_MultiVector& x);
00241
00251 virtual Teuchos::RCP<Epetra_MultiVector>
00252 buildEpetraAugmentedMultiVec(
00253 const Epetra_MultiVector& x,
00254 const NOX::Abstract::MultiVector::DenseMatrix *y,
00255 bool doCopy) const;
00256
00264 virtual void
00265 setEpetraAugmentedMultiVec(Epetra_MultiVector& x,
00266 NOX::Abstract::MultiVector::DenseMatrix& y,
00267 const Epetra_MultiVector& augMultiVec) const;
00268
00269 protected:
00270
00272 void buildExtendedMap(const Epetra_BlockMap& map,
00273 Epetra_Map*& extMapPtr, bool buildImporter,
00274 bool haveParam);
00275
00277 int blockMap2PointMap(const Epetra_BlockMap& BlockMap,
00278 Epetra_Map*& PointMap) const;
00279
00280 private:
00281
00283 AugmentedOp(const AugmentedOp&);
00284
00286 AugmentedOp& operator=(const AugmentedOp&);
00287
00288 protected:
00289
00291 Teuchos::RCP<LOCA::GlobalData> globalData;
00292
00294 string label;
00295
00297 Teuchos::RCP<Epetra_Operator> jacOperator;
00298
00300 const Epetra_BlockMap& underlyingMap;
00301
00303 const Epetra_Comm& underlyingComm;
00304
00306 Epetra_LocalMap localMap;
00307
00309 Teuchos::RCP<const Epetra_MultiVector> a;
00310
00312 Teuchos::RCP<const Epetra_MultiVector> b;
00313
00315 Epetra_MultiVector c;
00316
00318 int underlyingLength;
00319
00321 int numConstraints;
00322
00324 Epetra_Map* extendedMapPtr;
00325
00327 Epetra_Map* extendedImportMapPtr;
00328
00330 Epetra_Import* extendedImporter;
00331
00333 Epetra_MultiVector* importedInput;
00334
00336 Epetra_MultiVector* result_y;
00337
00339 Epetra_MultiVector* tmp;
00340
00342 bool haveParamComponent;
00343
00345 bool useTranspose;
00346
00348 Teuchos::LAPACK<int,double> dlapack;
00349
00350 };
00351 }
00352 }
00353
00354 #endif