00001 /* _______ __ 00002 / ___/ / ___ __ _ / / ___ 00003 / /__/ _ \/ _ \/ ' \/ _ \/ _ \ 00004 \___/_//_/\___/_/_/_/_.__/\___/ 00005 */ 00006 // 00007 // This software is copyright (C) by the Lawrence Berkeley 00008 // National Laboratory. Permission is granted to reproduce 00009 // this software for non-commercial purposes provided that 00010 // this notice is left intact. 00011 // 00012 // It is acknowledged that the U.S. Government has rights to 00013 // this software under Contract DE-AC03-765F00098 between 00014 // the U.S. Department of Energy and the University of 00015 // California. 00016 // 00017 // This software is provided as a professional and academic 00018 // contribution for joint exchange. Thus it is experimental, 00019 // is provided ``as is'', with no warranties of any kind 00020 // whatsoever, no support, no promise of updates, or printed 00021 // documentation. By using this software, you acknowledge 00022 // that the Lawrence Berkeley National Laboratory and 00023 // Regents of the University of California shall have no 00024 // liability with respect to the infringement of other 00025 // copyrights by any part of this software. 00026 // 00027 // DTGraves 00028 00029 #ifndef _BOX_ITERATOR_H_ 00030 #define _BOX_ITERATOR_H_ 00031 00032 #include <cstdlib> 00033 00034 #include "Box.H" 00035 #include "REAL.H" 00036 #include "SPACE.H" 00037 #include "Tuple.H" 00038 #include "IntVect.H" 00039 00041 00057 class BoxIterator 00058 { 00059 public: 00060 00062 00064 00068 BoxIterator () 00069 { 00070 icur = 0; 00071 for(int idir = 0; idir < SpaceDim; idir++) 00072 { 00073 nx[idir] = 0; 00074 len[idir] = 0; 00075 iloc[idir] = 0; 00076 } 00077 } 00078 00080 00088 BoxIterator(const Box& bx) 00089 { 00090 define(bx); 00091 } 00092 00093 void setBox(const Box& bx) 00094 { 00095 define(bx); 00096 } 00098 00106 void define (const Box& bx) 00107 { 00108 icur = 0; 00109 box_ptr = bx; 00110 current= bx.smallEnd(); 00111 offset = current; 00112 int idir = 0; 00113 for(idir = 0; idir < SpaceDim; idir++) 00114 { 00115 nx[idir] = bx.size(idir); 00116 iloc[idir] = 0; 00117 } 00118 len[0] = 1; 00119 for(idir = 1; idir < SpaceDim; idir++) 00120 { 00121 len[idir] = len[idir-1]*nx[idir-1]; 00122 } 00123 reset(); 00124 } 00125 00127 00135 BoxIterator (const BoxIterator& tx) 00136 { 00137 icur = tx.icur; 00138 box_ptr = tx.box_ptr; 00139 current= tx.current; 00140 offset = tx.offset; 00141 for(int idir = 0; idir < SpaceDim; idir++) 00142 { 00143 len[idir] = tx.len[idir]; 00144 nx[idir] = tx.nx[idir]; 00145 iloc[idir] = tx.iloc[idir]; 00146 } 00147 } 00148 00150 00153 ~BoxIterator () 00154 {} 00155 00157 00159 00168 void begin() 00169 { 00170 icur = 0; 00171 current= box_ptr.smallEnd(); 00172 for(int idir = 0; idir < SpaceDim; idir++) 00173 { 00174 iloc[idir] = 0; 00175 } 00176 } 00177 00179 00188 void reset() 00189 { 00190 begin(); 00191 } 00192 00194 00203 void operator++() 00204 { 00205 next(); 00206 } 00207 00208 void next() 00209 { 00210 icur++; 00211 //compute where in grid we are, then add offset 00212 //mea culpa, i cannot figure out any easy way 00213 //to make this dimension-independent 00214 #if (CH_SPACEDIM == 1) 00215 iloc[0] = icur/len[0]; 00216 IntVect ivdiff(iloc[0]); 00217 #elif (CH_SPACEDIM == 2) 00218 iloc[1] = icur/len[1]; 00219 iloc[0] = (icur-iloc[1]*len[1])/len[0]; 00220 IntVect ivdiff(iloc[0],iloc[1]); 00221 #elif (CH_SPACEDIM == 3) 00222 iloc[2] = icur/len[2]; 00223 iloc[1] = (icur-iloc[2]*len[2])/len[1]; 00224 iloc[0] = (icur-iloc[1]*len[1]-iloc[2]*len[2])/len[0]; 00225 IntVect ivdiff(iloc[0],iloc[1],iloc[2]); 00226 #else 00227 #error CH_SPACEDIM must be either 1,2 or 3. 00228 #endif 00229 ivdiff += offset; 00230 current = ivdiff; 00231 } 00232 00233 00234 00236 00238 00246 const IntVect& operator() () const 00247 { 00248 assert(current <= box_ptr.bigEnd()); 00249 assert(current >= box_ptr.smallEnd()); 00250 return current; 00251 } 00252 00254 00262 bool ok() 00263 { 00264 return (current <= box_ptr.bigEnd()); 00265 } 00266 00267 protected: 00268 00269 Box box_ptr; 00270 Tuple<int, SpaceDim> nx; 00271 Tuple<int, SpaceDim> iloc; 00272 Tuple<int, SpaceDim> len; 00273 IntVect current; 00274 IntVect offset; 00275 int icur; 00276 }; 00277 00278 #endif