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
00043
00044
00045
00046
00047 #ifndef __Teko_BlockedReordering_hpp__
00048 #define __Teko_BlockedReordering_hpp__
00049
00050 #include <string>
00051 #include <vector>
00052
00053 #include "Teuchos_RCP.hpp"
00054
00055 #include "Thyra_LinearOpBase.hpp"
00056 #include "Thyra_LinearOpDefaultBase.hpp"
00057 #include "Thyra_BlockedLinearOpBase.hpp"
00058 #include "Thyra_ProductMultiVectorBase.hpp"
00059
00060 namespace Teko {
00061
00109 class BlockReorderManager {
00110 public:
00112
00113
00115 BlockReorderManager() : children_(0) {}
00116
00118 BlockReorderManager(int sz) : children_(sz,Teuchos::null) {}
00119
00121 BlockReorderManager(const BlockReorderManager & bmm)
00122 : children_(bmm.children_.size())
00123 { for(unsigned int i=0;i<children_.size();i++) children_[i] = bmm.children_[i]->Copy(); }
00124
00126 virtual ~BlockReorderManager() {}
00127
00129
00131 virtual Teuchos::RCP<BlockReorderManager> Copy() const
00132 { return Teuchos::rcp(new BlockReorderManager(*this)); }
00133
00135 virtual void SetNumBlocks(int sz)
00136 { children_.clear(); children_.resize(sz); }
00137
00139 virtual int GetNumBlocks() const
00140 { return children_.size(); }
00141
00150 virtual void SetBlock(int blockIndex,int reorder);
00151
00164 virtual void SetBlock(int blockIndex,const Teuchos::RCP<BlockReorderManager> & reorder);
00165
00181 virtual const Teuchos::RCP<BlockReorderManager> GetBlock(int blockIndex);
00182
00197 virtual const Teuchos::RCP<const BlockReorderManager> GetBlock(int blockIndex) const;
00198
00200 virtual std::string toString() const;
00201
00203 virtual int LargestIndex() const;
00204
00205 protected:
00207 std::vector<Teuchos::RCP<BlockReorderManager> > children_;
00208 };
00209
00214 class BlockReorderLeaf : public BlockReorderManager {
00215 public:
00217
00218
00220 BlockReorderLeaf(int ind) : value_(ind) { }
00221
00223 BlockReorderLeaf(const BlockReorderLeaf & brl)
00224 : value_(brl.value_) {}
00226
00228 virtual Teuchos::RCP<BlockReorderManager> Copy() const
00229 { return Teuchos::rcp(new BlockReorderLeaf(*this)); }
00230
00232 virtual int GetNumBlocks() const { return 0; }
00233
00235 virtual void SetNumBlocks(int sz) {}
00236
00238 virtual void SetBlock(int blockIndex,int reorder) { }
00239
00241 virtual const Teuchos::RCP<BlockReorderManager> GetBlock(int blockIndex)
00242 { return Teuchos::null; }
00243
00245 virtual const Teuchos::RCP<const BlockReorderManager> GetBlock(int blockIndex) const
00246 { return Teuchos::null; }
00247
00249 int GetIndex() const { return value_; }
00250
00252 virtual std::string toString() const
00253 { std::stringstream ss; ss << value_; return ss.str(); }
00254
00256 virtual int LargestIndex() const { return value_; }
00257
00258 protected:
00260 int value_;
00261
00262 private:
00263 BlockReorderLeaf();
00264 };
00265
00288 Teuchos::RCP<const Thyra::LinearOpBase<double> >
00289 buildReorderedLinearOp(const BlockReorderManager & bmm,
00290 const Teuchos::RCP<const Thyra::BlockedLinearOpBase<double> > & blkOp);
00291
00315 Teuchos::RCP<const Thyra::LinearOpBase<double> >
00316 buildReorderedLinearOp(const BlockReorderManager & rowMgr,const BlockReorderManager & colMgr,
00317 const Teuchos::RCP<const Thyra::BlockedLinearOpBase<double> > & blkOp);
00318
00340 Teuchos::RCP<const Thyra::VectorSpaceBase<double> >
00341 buildReorderedVectorSpace(const BlockReorderManager & mgr,
00342 const Teuchos::RCP<const Thyra::ProductVectorSpaceBase<double> > & blkSpc);
00343
00355 Teuchos::RCP<Thyra::MultiVectorBase<double> >
00356 buildReorderedMultiVector(const BlockReorderManager & mgr,
00357 const Teuchos::RCP<Thyra::ProductMultiVectorBase<double> > & blkVec);
00358
00370 Teuchos::RCP<const Thyra::MultiVectorBase<double> >
00371 buildReorderedMultiVector(const BlockReorderManager & mgr,
00372 const Teuchos::RCP<const Thyra::ProductMultiVectorBase<double> > & blkVec);
00373
00386 Teuchos::RCP<Thyra::MultiVectorBase<double> >
00387 buildFlatMultiVector(const BlockReorderManager & mgr,
00388 const Teuchos::RCP<Thyra::ProductMultiVectorBase<double> > & blkVec);
00389
00402 Teuchos::RCP<const Thyra::MultiVectorBase<double> >
00403 buildFlatMultiVector(const BlockReorderManager & mgr,
00404 const Teuchos::RCP<const Thyra::ProductMultiVectorBase<double> > & blkVec);
00405
00408 Teuchos::RCP<const Thyra::VectorSpaceBase<double> >
00409 buildFlatVectorSpace(const BlockReorderManager & mgr,
00410 const Teuchos::RCP<const Thyra::VectorSpaceBase<double> > & blkSpc);
00411
00425 Teuchos::RCP<const BlockReorderManager> blockedReorderFromString(std::string & reorder);
00426
00427 }
00428
00429 #endif