Memosa-FVM  0.2
FloatVarDict.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 _FLOATVARDICT_H_
6 #define _FLOATVARDICT_H_
7 
8 #include <map>
9 #include "misc.h"
10 class Field;
11 
20 template<class T>
21 struct FloatVal
22 {
23  FloatVal(T constant_) :
24  constant(constant_),
25  field(0)
26  {}
27 
28  FloatVal(Field* field_) :
29  constant(0),
30  field(field_)
31  {}
32 
35 };
36 
44 template<typename T>
45 class FloatVarDict : public map<string, FloatVal<T> >
46 {
47 public:
48 
49  typedef map<string,FloatVal<T> > T_Parent;
50 
51  bool hasVar(const string varName) const
52  {
53  typename T_Parent::const_iterator pos = this->find(varName);
54  return pos != this->end();
55  }
56 
57  T operator[](const string varName) const
58  {
59  typename T_Parent::const_iterator pos = this->find(varName);
60  if (pos != this->end())
61  {
62  if (pos->second.field)
63  throw CException(varName + " value is a Field");
64  return pos->second.constant;
65  }
66  throw CException("uknown var " + varName);
67  }
68 
69  bool isField(const string varName) const
70  {
71  typename T_Parent::const_iterator pos = this->find(varName);
72  if (pos != this->end())
73  return (pos->second.field!=0);
74  throw CException("uknown var " + varName);
75  }
76 
77  Field& getField(const string varName) const
78  {
79  typename T_Parent::const_iterator pos = this->find(varName);
80  if (pos != this->end())
81  return *(pos->second.field);
82  throw CException("uknown var " + varName);
83  }
84 
85  FloatVal<T> getVal(const string varName) const
86  {
87  typename T_Parent::const_iterator pos = this->find(varName);
88  if (pos != this->end())
89  return pos->second;
90  throw CException("uknown var " + varName);
91  }
92 
93  protected:
94  void defineVar(const string varName, const T defaultValue)
95  {
96  this->insert(make_pair(varName,defaultValue));
97  }
98 };
99 
109 template <class T>
111 {
112 public:
113  FloatValEvaluator(const FloatVal<T>& fval, const StorageSite& site) :
114  _constant(fval.constant),
115  _isField(fval.field != 0),
116  _arrayPtr()
117  {
118  if (_isField)
119  _arrayPtr = dynamic_pointer_cast<Array<T> >(fval.field->getArrayPtr(site));
120 
121  }
122 
123  FloatValEvaluator(const T val) :
124  _constant(val),
125  _isField(false),
126  _arrayPtr(0)
127  {}
128 
129  T operator[](const int i) const
130  {
131  return (_isField ? (*_arrayPtr)[i] : _constant);
132  }
133 
134 private:
135  const T _constant;
136  const bool _isField;
137  shared_ptr<Array<T> > _arrayPtr;
138 };
139 
140 
152 template <class T>
154 {
155 public:
157  const FloatVal<T>& fval1,
158  const FloatVal<T>& fval2,
159  const StorageSite& site) :
160  _isField0(fval0.field != 0),
161  _isField1(fval1.field != 0),
162  _isField2(fval2.field != 0),
163  _arrayPtr0(),
164  _arrayPtr1(),
165  _arrayPtr2()
166  {
167  if (_isField0)
168  _arrayPtr0 = dynamic_pointer_cast<Array<T> >(fval0.field->getArrayPtr(site));
169  else
170  _constant[0] = fval0.constant;
171 
172  if (_isField1)
173  _arrayPtr1 = dynamic_pointer_cast<Array<T> >(fval1.field->getArrayPtr(site));
174  else
175  _constant[1] = fval1.constant;
176 
177  if (_isField2)
178  _arrayPtr2 = dynamic_pointer_cast<Array<T> >(fval2.field->getArrayPtr(site));
179  else
180  _constant[2] = fval2.constant;
181  }
182 
184  _constant(val),
185  _isField0(false),
186  _isField1(false),
187  _isField2(false),
188  _arrayPtr0(0),
189  _arrayPtr1(0),
190  _arrayPtr2(0)
191  {}
192 
193  const Vector<T,3>& operator[](const int i) const
194  {
195  if (_isField0) _constant[0] = (*_arrayPtr0)[i];
196  if (_isField1) _constant[1] = (*_arrayPtr1)[i];
197  if (_isField2) _constant[2] = (*_arrayPtr2)[i];
198 
199  return _constant;
200  }
201 
202 private:
204  const bool _isField0;
205  const bool _isField1;
206  const bool _isField2;
207  shared_ptr<Array<T> > _arrayPtr0;
208  shared_ptr<Array<T> > _arrayPtr1;
209  shared_ptr<Array<T> > _arrayPtr2;
210 };
211 
212 #endif
Field * field
Definition: FloatVarDict.h:34
FloatValEvaluator(const FloatVal< T > &fval0, const FloatVal< T > &fval1, const FloatVal< T > &fval2, const StorageSite &site)
Definition: FloatVarDict.h:156
Definition: Vector.h:19
Definition: Field.h:14
const Vector< T, 3 > & operator[](const int i) const
Definition: FloatVarDict.h:193
T operator[](const int i) const
Definition: FloatVarDict.h:129
shared_ptr< Array< T > > _arrayPtr0
Definition: FloatVarDict.h:207
shared_ptr< Array< T > > _arrayPtr
Definition: FloatVarDict.h:137
FloatVal< T > getVal(const string varName) const
Definition: FloatVarDict.h:85
void defineVar(const string varName, const T defaultValue)
Definition: FloatVarDict.h:94
FloatVal(Field *field_)
Definition: FloatVarDict.h:28
Field & getField(const string varName) const
Definition: FloatVarDict.h:77
FloatValEvaluator(const FloatVal< T > &fval, const StorageSite &site)
Definition: FloatVarDict.h:113
map< string, FloatVal< T > > T_Parent
Definition: FloatVarDict.h:49
shared_ptr< Array< T > > _arrayPtr1
Definition: FloatVarDict.h:208
shared_ptr< Array< T > > _arrayPtr2
Definition: FloatVarDict.h:209
const bool _isField
Definition: FloatVarDict.h:136
FloatVal(T constant_)
Definition: FloatVarDict.h:23
bool isField(const string varName) const
Definition: FloatVarDict.h:69
T operator[](const string varName) const
Definition: FloatVarDict.h:57
bool hasVar(const string varName) const
Definition: FloatVarDict.h:51
Definition: Array.h:14
FloatValEvaluator(const Vector< T, 3 > &val)
Definition: FloatVarDict.h:183
shared_ptr< ArrayBase > getArrayPtr(const StorageSite &)
Definition: Field.cpp:63
FloatValEvaluator(const T val)
Definition: FloatVarDict.h:123