Memosa-FVM  0.2
MultiFieldMatrix.h
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #ifndef _MULTIFIELDMATRIX_H_
6 #define _MULTIFIELDMATRIX_H_
7 
8 #ifdef FVM_PARALLEL
9 #include <mpi.h>
10 #endif
11 
12 #include "Matrix.h"
13 #include "MultiField.h"
14 #include "MultiFieldReduction.h"
15 
16 #include <set>
17 
18 //UnorderedSet doesn't duplicate and sort elements
20 {
21  public :
24 
25  void insert( int x ) {
26 
27  if ( _dataSet.count(x) == 0 ){
28  _data.push_back(x);
29  _dataSet.insert(x);
30  }
31  };
32 
33  const vector<int>& getData() const { return _data;};
34  int size() const { return _data.size(); };
35 
36  private :
37  vector<int> _data;
38  set<int> _dataSet;
39 
40 
41 };
42 
43 class Connectivity;
44 class IContainer;
45 class OneToOneIndexMap;
46 class SpikeStorage;
47 class LinearSystem;
48 
50 {
51 public:
52 
53  friend class LinearSystem;
54  friend class LinearSystemMerger;
55 
57 
58  typedef pair<Index,Index> EntryIndex;
59  typedef pair<const StorageSite*, const StorageSite*> SSPair;
60 
61  typedef map<EntryIndex,shared_ptr<Matrix> > MatrixMap;
62  typedef map<Index,int> MatrixSizeMap;
63 
64  typedef map<SSPair,shared_ptr<Array<int> > > MatrixMappersMap;
65 
66  typedef map<Index,shared_ptr<StorageSite> > StorageSiteMap;
67  typedef map<const StorageSite*,shared_ptr<StorageSite> > GhostStorageSiteMap;
68 
69  typedef map<Index,shared_ptr<CRConnectivity> > CoarseToFineMappingMap;
70  typedef map<EntryIndex,shared_ptr<CRConnectivity> > CoarseConnectivitiesMap;
71 
73  virtual ~MultiFieldMatrix();
74 
75  DEFINE_TYPENAME("MultiFieldMatrix");
76 
77  void initAssembly();
78 
79  virtual void multiply(IContainer& yB, const IContainer& xB) const;
80 
81  virtual void multiplyAndAdd(IContainer& yB, const IContainer& xB) const;
82 
83  virtual void forwardGS(IContainer& xB, const IContainer& bB, IContainer& temp) const;
84 
85  virtual void reverseGS(IContainer& xB, const IContainer& bB, IContainer& temp) const;
86 
87  virtual void Jacobi(IContainer& xB, const IContainer& bB, IContainer& tempB) const;
88 
89  virtual void iluSolve(IContainer& xB, const IContainer& bB, IContainer& tempB) const;
90  virtual void spikeSolve(IContainer& xB, const IContainer& bB, IContainer& tempB, const SpikeStorage& spike_storage) const;
91 
92  virtual void solveBoundary(IContainer& xB, const IContainer& bB, IContainer& temp) const;
93 
94  virtual void
95  computeResidual(const IContainer& xB, const IContainer& bB,
96  IContainer& rB) const;
97 
98  bool hasMatrix(const Index& rowIndex,
99  const Index& colIndex) const;
100  Matrix& getMatrix(const Index& rowIndex,const Index& colIndex);
101  const Matrix& getMatrix(const Index& rowIndex,const Index& colIndex) const;
102 
103  void removeMatrix(const Index& rowIndex, const Index& colIndex);
104 
105  void createCoarsening(MultiField& coarseIndex,
106  const int groupSize,
107  const double weightRatioThreshold);
108 
109  void syncGhostCoarsening(MultiField& coarseIndexField);
110 
111  void createCoarseToFineMapping(const MultiField& coarseIndexField);
112 
113  void createCoarseConnectivity(MultiField& coarseIndex);
114 
115  void createCoarseMatrices(MultiField& coarseIndex);
116 
117  void transpose();
118 
119  void
120  injectResidual(const MultiField& coarseIndex,
121  const MultiField& fineResidualField,
122  MultiField& coarseBField);
123 
124  void
125  correctSolution(const MultiField& coarseIndex,
126  MultiField& fineSolutionField,
127  MFRPtr scaleField,
128  const MultiField& coarseSolutionField);
129 #ifdef FVM_PARALLEL
130  int getMinSize( const MPI::Intracomm& comm ) const;
131  int getMergeSize( const MPI::Intracomm& comm ) const;
132 
133 #endif
134  int getSize( ) const;
135  int getLocalSize() const;
136 
137  void addMatrix(const Index& rowI, const Index& colI, shared_ptr<Matrix> m)
138  {
139  EntryIndex e(rowI,colI);
140  _matrices[e] = m;
141  }
142 
143  MFRPtr quadProduct(const MultiField& x) const;
144 
145  //MatrixMap& getMatrixMap() { return _matrices;}
146 
147 private:
153 
158 };
159 
160 
161 #endif
MatrixSizeMap _coarseGhostSizes
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
virtual ~MultiFieldMatrix()
virtual void iluSolve(IContainer &xB, const IContainer &bB, IContainer &tempB) const
map< Index, shared_ptr< StorageSite > > StorageSiteMap
void createCoarseToFineMapping(const MultiField &coarseIndexField)
void correctSolution(const MultiField &coarseIndex, MultiField &fineSolutionField, MFRPtr scaleField, const MultiField &coarseSolutionField)
virtual void forwardGS(IContainer &xB, const IContainer &bB, IContainer &temp) const
map< const StorageSite *, shared_ptr< StorageSite > > GhostStorageSiteMap
void createCoarseConnectivity(MultiField &coarseIndex)
bool hasMatrix(const Index &rowIndex, const Index &colIndex) const
vector< int > _data
void createCoarsening(MultiField &coarseIndex, const int groupSize, const double weightRatioThreshold)
map< Index, int > MatrixSizeMap
CoarseToFineMappingMap _coarseToFineMappings
void insert(int x)
StorageSiteMap _coarseSites
virtual void multiplyAndAdd(IContainer &yB, const IContainer &xB) const
int getLocalSize() const
map< Index, shared_ptr< CRConnectivity > > CoarseToFineMappingMap
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
virtual void spikeSolve(IContainer &xB, const IContainer &bB, IContainer &tempB, const SpikeStorage &spike_storage) const
MultiField::ArrayIndex Index
virtual void reverseGS(IContainer &xB, const IContainer &bB, IContainer &temp) const
MatrixMap _coarseMatrices
virtual void computeResidual(const IContainer &xB, const IContainer &bB, IContainer &rB) const
set< int > _dataSet
int size() const
Definition: Matrix.h:16
virtual void Jacobi(IContainer &xB, const IContainer &bB, IContainer &tempB) const
void createCoarseMatrices(MultiField &coarseIndex)
void removeMatrix(const Index &rowIndex, const Index &colIndex)
CoarseConnectivitiesMap _coarseConnectivities
friend class LinearSystemMerger
MatrixMappersMap _coarseGatherMaps
const vector< int > & getData() const
map< EntryIndex, shared_ptr< Matrix > > MatrixMap
void addMatrix(const Index &rowI, const Index &colI, shared_ptr< Matrix > m)
MatrixMappersMap _coarseScatterMaps
shared_ptr< MultiFieldReduction > MFRPtr
pair< Index, Index > EntryIndex
virtual void multiply(IContainer &yB, const IContainer &xB) const
void syncGhostCoarsening(MultiField &coarseIndexField)
MatrixSizeMap _coarseSizes
map< SSPair, shared_ptr< Array< int > > > MatrixMappersMap
pair< const StorageSite *, const StorageSite * > SSPair
void injectResidual(const MultiField &coarseIndex, const MultiField &fineResidualField, MultiField &coarseBField)
DEFINE_TYPENAME("MultiFieldMatrix")
virtual void solveBoundary(IContainer &xB, const IContainer &bB, IContainer &temp) const
MFRPtr quadProduct(const MultiField &x) const
map< EntryIndex, shared_ptr< CRConnectivity > > CoarseConnectivitiesMap