Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__mg_level_object_h
00013 #define __deal2__mg_level_object_h
00014
00015 #include <deal.II/base/subscriptor.h>
00016 #include <vector>
00017
00018 #include <deal.II/base/std_cxx1x/shared_ptr.h>
00019
00020 DEAL_II_NAMESPACE_OPEN
00021
00022
00037 template<class Object>
00038 class MGLevelObject : public Subscriptor
00039 {
00040 public:
00047 MGLevelObject (const unsigned int minlevel = 0,
00048 const unsigned int maxlevel = 0);
00049
00053 Object & operator[] (const unsigned int level);
00054
00059 const Object & operator[] (const unsigned int level) const;
00060
00068 void resize (const unsigned int new_minlevel,
00069 const unsigned int new_maxlevel);
00070
00078 MGLevelObject<Object> & operator = (const double d);
00079
00088 void clear();
00089
00093 unsigned int min_level () const;
00094
00098 unsigned int max_level () const;
00099
00103 unsigned int get_minlevel () const;
00104
00108 unsigned int get_maxlevel () const;
00109
00113 std::size_t memory_consumption () const;
00114
00115 private:
00119 unsigned int minlevel;
00120
00124 std::vector<std_cxx1x::shared_ptr<Object> > objects;
00125 };
00126
00127
00128
00129
00130
00131 template<class Object>
00132 MGLevelObject<Object>::MGLevelObject(const unsigned int min,
00133 const unsigned int max)
00134 :
00135 minlevel(0)
00136 {
00137 resize (min, max);
00138 }
00139
00140
00141 template<class Object>
00142 Object &
00143 MGLevelObject<Object>::operator[] (const unsigned int i)
00144 {
00145 Assert((i>=minlevel) && (i<minlevel+objects.size()),
00146 ExcIndexRange (i, minlevel, minlevel+objects.size()));
00147 return *objects[i-minlevel];
00148 }
00149
00150
00151 template<class Object>
00152 const Object &
00153 MGLevelObject<Object>::operator[] (const unsigned int i) const
00154 {
00155 Assert((i>=minlevel) && (i<minlevel+objects.size()),
00156 ExcIndexRange (i, minlevel, minlevel+objects.size()));
00157 return *objects[i-minlevel];
00158 }
00159
00160
00161 template<class Object>
00162 void
00163 MGLevelObject<Object>::resize (const unsigned int new_minlevel,
00164 const unsigned int new_maxlevel)
00165 {
00166 Assert (new_minlevel <= new_maxlevel, ExcInternalError());
00167
00168
00169
00170
00171 objects.clear ();
00172
00173 minlevel = new_minlevel;
00174 for (unsigned int i=0; i<new_maxlevel-new_minlevel+1; ++i)
00175 objects.push_back(std_cxx1x::shared_ptr<Object> (new Object));
00176 }
00177
00178
00179 template<class Object>
00180 MGLevelObject<Object> &
00181 MGLevelObject<Object>::operator = (const double d)
00182 {
00183 typename std::vector<std_cxx1x::shared_ptr<Object> >::iterator v;
00184 for (v = objects.begin(); v != objects.end(); ++v)
00185 **v=d;
00186 return *this;
00187 }
00188
00189
00190 template<class Object>
00191 void
00192 MGLevelObject<Object>::clear ()
00193 {
00194 typename std::vector<std_cxx1x::shared_ptr<Object> >::iterator v;
00195 for (v = objects.begin(); v != objects.end(); ++v)
00196 (*v)->clear();
00197 }
00198
00199
00200 template<class Object>
00201 unsigned int
00202 MGLevelObject<Object>::get_minlevel () const
00203 {
00204 return minlevel;
00205 }
00206
00207
00208 template<class Object>
00209 unsigned int
00210 MGLevelObject<Object>::get_maxlevel () const
00211 {
00212 return minlevel + objects.size() - 1;
00213 }
00214
00215
00216 template<class Object>
00217 unsigned int
00218 MGLevelObject<Object>::min_level () const
00219 {
00220 return minlevel;
00221 }
00222
00223
00224 template<class Object>
00225 unsigned int
00226 MGLevelObject<Object>::max_level () const
00227 {
00228 return minlevel + objects.size() - 1;
00229 }
00230
00231
00232 template<class Object>
00233 std::size_t
00234 MGLevelObject<Object>::memory_consumption () const
00235 {
00236 std::size_t result = sizeof(*this);
00237 typedef typename std::vector<std_cxx1x::shared_ptr<Object> >::const_iterator Iter;
00238 const Iter end = objects.end();
00239 for (Iter o=objects.begin(); o!=end; ++o)
00240 result += (*o)->memory_consumption();
00241
00242 return result;
00243 }
00244
00245 DEAL_II_NAMESPACE_CLOSE
00246
00247 #endif
00248