Memosa-FVM  0.2
MultiFieldReduction Class Reference

#include <MultiFieldReduction.h>

Public Types

typedef map< const Field
*, shared_ptr< ArrayBase > > 
ArrayMap
 

Public Member Functions

 MultiFieldReduction ()
 
virtual ~MultiFieldReduction ()
 
 DEFINE_TYPENAME ("MultiFieldReduction")
 
ArrayBaseoperator[] (const Field &)
 
const ArrayBaseoperator[] (const Field &) const
 
MultiFieldReductionoperator+= (const MultiFieldReduction &ofield)
 
void addArray (const Field &aIndex, shared_ptr< ArrayBase > a)
 
bool hasArray (const Field &aIndex) const
 
shared_ptr< ArrayBasegetArrayPtr (const Field &)
 
void reduceSum ()
 
bool operator< (const double tolerance) const
 
shared_ptr< MultiFieldReductionoperator/ (const MultiFieldReduction &o)
 
shared_ptr< MultiFieldReductionnormalize (const MultiFieldReduction &o)
 
shared_ptr< MultiFieldReductionoperator* (const MultiFieldReduction &o)
 
shared_ptr< MultiFieldReductionoperator- () const
 
void setMax (const MultiFieldReduction &o)
 
void limit (const double min, const double max)
 
void print (ostream &os) const
 
void sync ()
 

Private Attributes

ArrayMap _arrays
 

Detailed Description

Definition at line 11 of file MultiFieldReduction.h.

Member Typedef Documentation

typedef map<const Field*,shared_ptr<ArrayBase> > MultiFieldReduction::ArrayMap

Definition at line 14 of file MultiFieldReduction.h.

Constructor & Destructor Documentation

MultiFieldReduction::MultiFieldReduction ( )

Definition at line 15 of file MultiFieldReduction.cpp.

References logCtor.

Referenced by normalize(), operator*(), operator-(), and operator/().

15  :
16  _arrays()
17 {
18  logCtor();
19 }
#define logCtor()
Definition: RLogInterface.h:26
MultiFieldReduction::~MultiFieldReduction ( )
virtual

Definition at line 21 of file MultiFieldReduction.cpp.

References logDtor.

22 {
23  logDtor();
24 }
#define logDtor()
Definition: RLogInterface.h:33

Member Function Documentation

void MultiFieldReduction::addArray ( const Field aIndex,
shared_ptr< ArrayBase a 
)

Definition at line 194 of file MultiFieldReduction.cpp.

References _arrays.

Referenced by operator*().

195 {
196  _arrays[&i]=a;
197 }
MultiFieldReduction::DEFINE_TYPENAME ( "MultiFieldReduction"  )
shared_ptr< ArrayBase > MultiFieldReduction::getArrayPtr ( const Field i)

Definition at line 41 of file MultiFieldReduction.cpp.

References _arrays.

42 {
43  ArrayMap::const_iterator pos = _arrays.find(&i);
44  if (pos != _arrays.end())
45  {
46  return pos->second;
47  }
48 
49  ostringstream e;
50  e << "MultiFieldReduction::operator[] No array found";
51  throw CException(e.str());
52 }
bool MultiFieldReduction::hasArray ( const Field aIndex) const

Definition at line 188 of file MultiFieldReduction.cpp.

References _arrays.

189 {
190  return _arrays.find(&i) != _arrays.end();
191 }
void MultiFieldReduction::limit ( const double  min,
const double  max 
)

Definition at line 157 of file MultiFieldReduction.cpp.

References _arrays.

158 {
159  foreach(const ArrayMap::value_type& pos, _arrays)
160  {
161  pos.second->limit(min,max);
162  }
163 }
double max(double x, double y)
Definition: Octree.cpp:18
double min(double x, double y)
Definition: Octree.cpp:23
MFRPtr MultiFieldReduction::normalize ( const MultiFieldReduction o)

Definition at line 134 of file MultiFieldReduction.cpp.

References _arrays, MultiFieldReduction(), and ArrayBase::normalize().

135 {
136  MFRPtr r(new MultiFieldReduction());
137 
138  foreach(const ArrayMap::value_type& pos, _arrays)
139  {
140  shared_ptr<ArrayBase> aptr = dynamic_pointer_cast<ArrayBase>(pos.second->newCopy());
141  aptr->normalize(o[*pos.first]);
142  r->addArray(*pos.first,aptr);
143  }
144  return r;
145 }
virtual ArrayBase & normalize(const ArrayBase &a)=0
shared_ptr< MultiFieldReduction > MFRPtr
MFRPtr MultiFieldReduction::operator* ( const MultiFieldReduction o)

Definition at line 93 of file MultiFieldReduction.cpp.

References _arrays, addArray(), and MultiFieldReduction().

94 {
95  MFRPtr r(new MultiFieldReduction());
96 
97  foreach(const ArrayMap::value_type& pos, _arrays)
98  {
99  shared_ptr<ArrayBase> aptr = dynamic_pointer_cast<ArrayBase>(pos.second->newCopy());
100  *aptr *= o[*pos.first];
101  r->addArray(*pos.first,aptr);
102  }
103  return r;
104 }
void addArray(const Field &aIndex, shared_ptr< ArrayBase > a)
shared_ptr< MultiFieldReduction > MFRPtr
MultiFieldReduction & MultiFieldReduction::operator+= ( const MultiFieldReduction ofield)

Definition at line 69 of file MultiFieldReduction.cpp.

References _arrays, and operator[]().

70 {
71  for(ArrayMap::const_iterator pos=_arrays.begin();
72  pos!=_arrays.end();
73  ++pos)
74  {
75  ArrayBase& myArray = operator[](*pos->first);
76  const ArrayBase& oArray = ofield[*pos->first];
77  myArray += oArray;
78  }
79  return *this;
80 }
ArrayBase & operator[](const Field &)
MFRPtr MultiFieldReduction::operator- ( ) const

Definition at line 121 of file MultiFieldReduction.cpp.

References _arrays, and MultiFieldReduction().

122 {
123  MFRPtr r(new MultiFieldReduction());
124 
125  foreach(const ArrayMap::value_type& pos, _arrays)
126  {
127  shared_ptr<ArrayBase> aptr = -(*pos.second);
128  r->addArray(*pos.first,aptr);
129  }
130  return r;
131 }
shared_ptr< MultiFieldReduction > MFRPtr
MFRPtr MultiFieldReduction::operator/ ( const MultiFieldReduction o)

Definition at line 107 of file MultiFieldReduction.cpp.

References _arrays, MultiFieldReduction(), and ArrayBase::safeDivide().

108 {
109  MFRPtr r(new MultiFieldReduction());
110 
111  foreach(const ArrayMap::value_type& pos, _arrays)
112  {
113  shared_ptr<ArrayBase> aptr = dynamic_pointer_cast<ArrayBase>(pos.second->newCopy());
114  aptr->safeDivide(o[*pos.first]);
115  r->addArray(*pos.first,aptr);
116  }
117  return r;
118 }
virtual ArrayBase & safeDivide(const ArrayBase &a)=0
shared_ptr< MultiFieldReduction > MFRPtr
bool MultiFieldReduction::operator< ( const double  tolerance) const

Definition at line 83 of file MultiFieldReduction.cpp.

References _arrays.

84 {
85  foreach(const ArrayMap::value_type& pos, _arrays)
86  {
87  if (! (*pos.second < tolerance)) return false;
88  }
89  return true;
90 }
ArrayBase & MultiFieldReduction::operator[] ( const Field i)

Definition at line 27 of file MultiFieldReduction.cpp.

References _arrays.

Referenced by operator+=().

28 {
29  ArrayMap::const_iterator pos = _arrays.find(&i);
30  if (pos != _arrays.end())
31  {
32  return *pos->second;
33  }
34 
35  ostringstream e;
36  e << "MultiFieldReduction::operator[] No array found";
37  throw CException(e.str());
38 }
const ArrayBase & MultiFieldReduction::operator[] ( const Field i) const

Definition at line 55 of file MultiFieldReduction.cpp.

References _arrays.

56 {
57  ArrayMap::const_iterator pos = _arrays.find(&i);
58  if (pos != _arrays.end())
59  {
60  return *pos->second;
61  }
62 
63  ostringstream e;
64  e << "MultiFieldReduction::operator[] No array found";
65  throw CException(e.str());
66 }
void MultiFieldReduction::print ( ostream &  os) const

Definition at line 200 of file MultiFieldReduction.cpp.

References _arrays.

Referenced by operator<<().

201 {
202  os << "[";
203 
204  foreach(const ArrayMap::value_type& pos, _arrays)
205  {
206  os << pos.first->getName() << " : ";
207  pos.second->print(os);
208  }
209 
210  os << "]";
211 }
void MultiFieldReduction::reduceSum ( )

Definition at line 166 of file MultiFieldReduction.cpp.

References _arrays.

167 {
168  shared_ptr<ArrayBase> sum;
169 
170  foreach(const ArrayMap::value_type& pos, _arrays)
171  {
172  shared_ptr<ArrayBase> thisSum = pos.second->reduceSum();
173  if (sum)
174  *sum += *thisSum;
175  else
176  sum = thisSum;
177  }
178 
179  foreach(const ArrayMap::value_type& pos, _arrays)
180  {
181  pos.second->setSum(*sum);
182  }
183 
184 
185 }
void MultiFieldReduction::setMax ( const MultiFieldReduction o)

Definition at line 148 of file MultiFieldReduction.cpp.

References _arrays.

149 {
150  foreach(const ArrayMap::value_type& pos, _arrays)
151  {
152  pos.second->setMax(o[*pos.first]);
153  }
154 }
void MultiFieldReduction::sync ( )

Definition at line 214 of file MultiFieldReduction.cpp.

References _arrays, ArrayBase::getData(), and ArrayBase::getDataSize().

215 {
216 #ifdef FVM_PARALLEL
217  ArrayMap::const_iterator it;
218  for ( it = _arrays.begin(); it != _arrays.end(); it++ ){
219  ArrayBase& myArray = *(it->second);
220  int count = myArray.getDataSize() / sizeof(double);
221  MPI::COMM_WORLD.Allreduce( MPI::IN_PLACE, myArray.getData(), count, MPI::DOUBLE, MPI::SUM);
222  }
223 #endif
224 
225 }
virtual int getDataSize() const =0
virtual void * getData() const =0

Member Data Documentation


The documentation for this class was generated from the following files: