00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _DATAITERATOR_H_
00012 #define _DATAITERATOR_H_
00013
00014 #include "Vector.H"
00015 #include "DataIndex.H"
00016 #include "BoxLayout.H"
00017 #include "SPMD.H"
00018 #include "LayoutIterator.H"
00019 #include "NamespaceHeader.H"
00020
00021
00022 #ifdef CH_MPI
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 class DataIterator
00040 {
00041
00042 public:
00043
00044
00045 DataIterator();
00046
00047 DataIterator(const BoxLayout& a_layout)
00048 {
00049 *this = a_layout.dataIterator();
00050 }
00051
00052 virtual ~DataIterator()
00053 {}
00054
00055
00056
00057 const DataIndex& operator()() const ;
00058
00059
00060
00061 DataIndex i() const
00062 {
00063 return this->operator()();
00064 }
00065
00066 DataIndex operator[](int ivec) const
00067 {
00068 return (DataIndex)((*m_indices)[ivec]);
00069 }
00070
00071
00072
00073 virtual void operator++();
00074
00075
00076 void incr()
00077 {
00078 ++(*this);
00079 }
00080
00081
00082 virtual bool ok() const;
00083
00084
00085 void begin();
00086
00087
00088 void reset();
00089
00090
00091
00092 void end();
00093
00094 int size() const
00095 {
00096 return m_indices->size();
00097 }
00098
00099
00100
00101
00102 void clearTime();
00103
00104
00105 void clearPeak();
00106
00107
00108 Vector<unsigned long long> getTime() const
00109 {
00110 return m_time;
00111 }
00112
00113
00114 Vector<unsigned long long> getPeak() const
00115 {
00116 return m_peak;
00117 }
00118
00119 Vector<Box> getBoxes()
00120 {
00121 return m_layout.boxArray();
00122 }
00123
00124
00125 void enableTime()
00126 {
00127
00128 defineTime();
00129 m_timeEnabled = true;
00130 }
00131
00132
00133 void enablePeak()
00134 {
00135
00136 definePeak();
00137 m_peakEnabled = true;
00138 }
00139
00140
00141 void disableTime()
00142 {
00143 m_timeEnabled = false;
00144 }
00145
00146
00147 void disablePeak()
00148 {
00149 m_peakEnabled = false;
00150 }
00151
00152
00153 void mergeTime();
00154
00155
00156 void mergePeak();
00157
00158 private:
00159
00160 friend class BoxLayout;
00161 friend class DisjointBoxLayout;
00162 friend class TimedDataIterator;
00163
00164 DataIterator(const BoxLayout& boxlayout, const int* layoutID);
00165
00166 BoxLayout m_layout;
00167
00168 protected:
00169 const Vector<DataIndex>* m_indices;
00170
00171 int m_current;
00172
00173 void defineTime();
00174 void definePeak();
00175
00176 Vector<unsigned long long> m_time;
00177 Vector<unsigned long long> m_peak;
00178
00179 bool m_timeEnabled;
00180 bool m_timeDefined;
00181
00182 bool m_peakEnabled;
00183 bool m_peakDefined;
00184 unsigned long long m_startTime;
00185 unsigned long long m_startPeak;
00186 };
00187 #else
00188
00189
00190 class DataIterator : public LayoutIterator
00191 {
00192 public:
00193 virtual ~DataIterator()
00194 {}
00195
00196 DataIterator()
00197 {}
00198
00199 DataIterator(const BoxLayout& a_layout)
00200 {
00201 *this = a_layout.dataIterator();
00202 }
00203
00204
00205
00206 const DataIndex& operator()() const
00207 {
00208 return (const DataIndex&)(LayoutIterator::operator()());
00209 };
00210
00211
00212
00213 DataIndex i() const
00214 {
00215 return this->operator()();
00216 }
00217
00218 int size() const
00219 {
00220 return this->m_layout.size();
00221 }
00222
00223 DataIndex operator[](int ivec) const
00224 {
00225 return (DataIndex)((*m_indicies)[ivec]);
00226 }
00227
00228
00229
00230 void clearTime()
00231 {
00232 }
00233
00234
00235 void clearPeak()
00236 {
00237 }
00238
00239
00240 Vector<unsigned long long> getTime() const
00241 {
00242 Vector<unsigned long long> retval(m_layout.size(), 1.);
00243 return retval;
00244 }
00245
00246 Vector<unsigned long long> getPeak() const
00247 {
00248 Vector<unsigned long long> retval(m_layout.size(), 1.);
00249 return retval;
00250 }
00251
00252 Vector<Box> getBoxes()
00253 {
00254 return m_layout.boxArray();
00255 }
00256
00257
00258 void enableTime()
00259 {
00260 }
00261
00262 void enablePeak()
00263 {
00264 }
00265
00266
00267 void disableTime()
00268 {
00269 }
00270
00271 void disablePeak()
00272 {
00273 }
00274
00275
00276 void mergeTime()
00277 {
00278 }
00279
00280 void mergePeak()
00281 {
00282 }
00283 private:
00284 friend class BoxLayout;
00285 friend class DisjointBoxLayout;
00286 friend class TimedDataIterator;
00287
00288 protected:
00289 DataIterator(const BoxLayout& boxlayout, const int* layoutID)
00290 :LayoutIterator(boxlayout, layoutID)
00291 {}
00292 };
00293
00294
00295
00296 #define DATAITERATOR(CLASS, BOXLAYOUT) \
00297 DataIterator dit = BOXLAYOUT .dataIterator(); \
00298 for (dit.begin(); dit.ok(); ++dit) \
00299 { \
00300 DataIndex di = dit(); \
00301 MT_BEGIN1(CLASS, DataIndex, di)
00302
00303 #define ENDITERATOR(CLASS) \
00304 MT_END1(CLASS, DataIndex, di) \
00305 }
00306
00307 #define DATAITERATOR1(CLASS, BOXLAYOUT, TYPE1, VAL1) \
00308 DataIterator dit = BOXLAYOUT .dataIterator(); \
00309 for (dit.begin(); dit.ok(); ++dit) \
00310 { \
00311 DataIndex di = dit(); \
00312 MT_BEGIN2(CLASS, TYPE1, VAL1, DataIndex, di)
00313
00314 #define ENDITERATOR1(CLASS, TYPE1, VAL1) \
00315 MT_END2(CLASS, TYPE1, VAL1, DataIndex, di) \
00316 }
00317
00318 #define DATAITERATOR2(CLASS, BOXLAYOUT, TYPE1, VAL1, TYPE2, VAL2) \
00319 DataIterator dit = BOXLAYOUT .dataIterator(); \
00320 for (dit.begin(); dit.ok(); ++dit) \
00321 { \
00322 DataIndex di = dit(); \
00323 MT_BEGIN3(CLASS, TYPE1, VAL1, TYPE2, VAL2, DataIndex, di)
00324
00325 #define ENDITERATOR2(CLASS, TYPE1, VAL1, TYPE2, VAL2) \
00326 MT_END3(CLASS, TYPE1, VAL1, TYPE2, VAL2, DataIndex, di) \
00327 }
00328
00329 #endif
00330
00331 #include "NamespaceFooter.H"
00332 #endif