Blockstructured Adaptive Mesh Refinement in object-oriented C++
00001 #ifndef AMROC_VECTOR16_H 00002 #define AMROC_VECTOR16_H 00003 00011 #include "CompConf.h" 00012 #include "generic.h" 00013 #include <iostream.h> 00014 #include <assert.h> 00015 00016 #ifndef VectorName 00017 #define Vector(dim) name2(Vector,dim) 00018 #define VectorName 00019 #endif 00020 00028 template <class DataType> 00029 class Vector(16) { 00030 typedef Vector(16)<DataType> TVector; 00031 00032 public: 00033 typedef DataType InternalDataType; 00034 00035 Vector(16)() {} 00036 Vector(16)(const TVector& x) { 00037 memcpy((void *) data_, (void *) x.data_, sizeof(TVector)); 00038 } 00039 Vector(16)(const DataType& v) { 00040 data_[0] = v; 00041 data_[1] = v; 00042 data_[2] = v; 00043 data_[3] = v; 00044 data_[4] = v; 00045 data_[5] = v; 00046 data_[6] = v; 00047 data_[7] = v; 00048 data_[8] = v; 00049 data_[9] = v; 00050 data_[10] = v; 00051 data_[11] = v; 00052 data_[12] = v; 00053 data_[13] = v; 00054 data_[14] = v; 00055 data_[15] = v; 00056 } 00057 00058 ~Vector(16)() {} 00059 00060 DataType * data() { return data_; } 00061 const DataType * data() const { return data_; } 00062 int length() const { return 16; } 00063 static int Length() { return 16; } 00064 00065 inline DataType operator()(int i) const { 00066 #ifdef DEBUG_PRINT 00067 assert((i >= 0) && (i < 16)); 00068 #endif 00069 return data_[i]; 00070 } 00071 inline DataType& operator()(int i) { 00072 #ifdef DEBUG_PRINT 00073 assert((i >= 0) && (i < 16)); 00074 #endif 00075 return data_[i]; 00076 } 00077 00078 inline DataType operator[](int i) const { 00079 #ifdef DEBUG_PRINT 00080 assert((i >= 0) && (i < 16)); 00081 #endif 00082 return data_[i]; 00083 } 00084 inline DataType& operator[](int i) { 00085 #ifdef DEBUG_PRINT 00086 assert((i >= 0) && (i < 16)); 00087 #endif 00088 return data_[i]; 00089 } 00090 00091 inline TVector& operator=(const TVector& x) { 00092 memcpy((void *) data_, (void *) x.data_, sizeof(TVector)); 00093 return *this; 00094 } 00095 inline TVector& operator=(const DataType& v) { 00096 data_[0] = v; 00097 data_[1] = v; 00098 data_[2] = v; 00099 data_[3] = v; 00100 data_[4] = v; 00101 data_[5] = v; 00102 data_[6] = v; 00103 data_[7] = v; 00104 data_[8] = v; 00105 data_[9] = v; 00106 data_[10] = v; 00107 data_[11] = v; 00108 data_[12] = v; 00109 data_[13] = v; 00110 data_[14] = v; 00111 data_[15] = v; 00112 return *this; 00113 } 00114 00115 #define Vector_Vector_Operator(ope,op) \ 00116 inline TVector& operator ope (const TVector &x) \ 00117 { \ 00118 data_[0] ope x.data_[0]; \ 00119 data_[1] ope x.data_[1]; \ 00120 data_[2] ope x.data_[2]; \ 00121 data_[3] ope x.data_[3]; \ 00122 data_[4] ope x.data_[4]; \ 00123 data_[5] ope x.data_[5]; \ 00124 data_[6] ope x.data_[6]; \ 00125 data_[7] ope x.data_[7]; \ 00126 data_[8] ope x.data_[8]; \ 00127 data_[9] ope x.data_[9]; \ 00128 data_[10] ope x.data_[10]; \ 00129 data_[11] ope x.data_[11]; \ 00130 data_[12] ope x.data_[12]; \ 00131 data_[13] ope x.data_[13]; \ 00132 data_[14] ope x.data_[14]; \ 00133 data_[15] ope x.data_[15]; \ 00134 return(*this); \ 00135 } \ 00136 inline TVector operator op (const TVector &x) const \ 00137 { \ 00138 TVector ret(*this); \ 00139 ret.data_[0] ope x.data_[0]; \ 00140 ret.data_[1] ope x.data_[1]; \ 00141 ret.data_[2] ope x.data_[2]; \ 00142 ret.data_[3] ope x.data_[3]; \ 00143 ret.data_[4] ope x.data_[4]; \ 00144 ret.data_[5] ope x.data_[5]; \ 00145 ret.data_[6] ope x.data_[6]; \ 00146 ret.data_[7] ope x.data_[7]; \ 00147 ret.data_[8] ope x.data_[8]; \ 00148 ret.data_[9] ope x.data_[9]; \ 00149 ret.data_[10] ope x.data_[10]; \ 00150 ret.data_[11] ope x.data_[11]; \ 00151 ret.data_[12] ope x.data_[12]; \ 00152 ret.data_[13] ope x.data_[13]; \ 00153 ret.data_[14] ope x.data_[14]; \ 00154 ret.data_[15] ope x.data_[15]; \ 00155 return(ret); \ 00156 } 00157 Vector_Vector_Operator(+=,+) 00158 Vector_Vector_Operator(-=,-) 00159 Vector_Vector_Operator(*=,*) 00160 Vector_Vector_Operator(/=,/) 00161 #undef Vector_Vector_Operator 00162 00163 #define Vector_Scalar_Operator(ope,op) \ 00164 inline TVector& operator ope (const DataType &v) \ 00165 { \ 00166 data_[0] ope v; \ 00167 data_[1] ope v; \ 00168 data_[2] ope v; \ 00169 data_[3] ope v; \ 00170 data_[4] ope v; \ 00171 data_[5] ope v; \ 00172 data_[6] ope v; \ 00173 data_[7] ope v; \ 00174 data_[8] ope v; \ 00175 data_[9] ope v; \ 00176 data_[10] ope v; \ 00177 data_[11] ope v; \ 00178 data_[12] ope v; \ 00179 data_[13] ope v; \ 00180 data_[14] ope v; \ 00181 data_[15] ope v; \ 00182 return(*this); \ 00183 } \ 00184 inline TVector operator op (const DataType &v) const \ 00185 { \ 00186 TVector ret(*this); \ 00187 ret.data_[0] ope v; \ 00188 ret.data_[1] ope v; \ 00189 ret.data_[2] ope v; \ 00190 ret.data_[3] ope v; \ 00191 ret.data_[4] ope v; \ 00192 ret.data_[5] ope v; \ 00193 ret.data_[6] ope v; \ 00194 ret.data_[7] ope v; \ 00195 ret.data_[8] ope v; \ 00196 ret.data_[9] ope v; \ 00197 ret.data_[10] ope v; \ 00198 ret.data_[11] ope v; \ 00199 ret.data_[12] ope v; \ 00200 ret.data_[13] ope v; \ 00201 ret.data_[14] ope v; \ 00202 ret.data_[15] ope v; \ 00203 return(ret); \ 00204 } 00205 Vector_Scalar_Operator(+=,+) 00206 Vector_Scalar_Operator(-=,-) 00207 Vector_Scalar_Operator(*=,*) 00208 Vector_Scalar_Operator(/=,/) 00209 #undef Vector_Scalar_Operator 00210 00211 /* Define the negation operator */ 00212 inline TVector operator - () const 00213 { 00214 TVector ret; 00215 ret.data_[0] = -data_[0]; 00216 ret.data_[1] = -data_[1]; 00217 ret.data_[2] = -data_[2]; 00218 ret.data_[3] = -data_[3]; 00219 ret.data_[4] = -data_[4]; 00220 ret.data_[5] = -data_[5]; 00221 ret.data_[6] = -data_[6]; 00222 ret.data_[7] = -data_[7]; 00223 ret.data_[8] = -data_[8]; 00224 ret.data_[9] = -data_[9]; 00225 ret.data_[10] = -data_[10]; 00226 ret.data_[11] = -data_[11]; 00227 ret.data_[12] = -data_[12]; 00228 ret.data_[13] = -data_[13]; 00229 ret.data_[14] = -data_[14]; 00230 ret.data_[15] = -data_[15]; 00231 return(ret); 00232 } 00233 00234 #define Vector_Vector_RelOperator(op) \ 00235 inline int operator op (const TVector &x) const \ 00236 { return( \ 00237 (data_[0] op x.data_[0]) \ 00238 && (data_[1] op x.data_[1]) \ 00239 && (data_[2] op x.data_[2]) \ 00240 && (data_[3] op x.data_[3]) \ 00241 && (data_[4] op x.data_[4]) \ 00242 && (data_[5] op x.data_[5]) \ 00243 && (data_[6] op x.data_[6]) \ 00244 && (data_[7] op x.data_[7]) \ 00245 && (data_[8] op x.data_[8]) \ 00246 && (data_[9] op x.data_[9]) \ 00247 && (data_[10] op x.data_[10]) \ 00248 && (data_[11] op x.data_[11]) \ 00249 && (data_[12] op x.data_[12]) \ 00250 && (data_[13] op x.data_[13]) \ 00251 && (data_[14] op x.data_[14]) \ 00252 && (data_[15] op x.data_[15]) \ 00253 ) ; } 00254 00255 Vector_Vector_RelOperator(==) 00256 Vector_Vector_RelOperator(!=) 00257 #undef Vector_Vector_RelOperator 00258 00259 #define Vector_Vector_RelOperator(op) \ 00260 inline int operator op (const TVector &x) const \ 00261 { return( \ 00262 (data_[0] op x.data_[0]) \ 00263 || (data_[1] op x.data_[1]) \ 00264 || (data_[2] op x.data_[2]) \ 00265 || (data_[3] op x.data_[3]) \ 00266 || (data_[4] op x.data_[4]) \ 00267 || (data_[5] op x.data_[5]) \ 00268 || (data_[6] op x.data_[6]) \ 00269 || (data_[7] op x.data_[7]) \ 00270 || (data_[8] op x.data_[8]) \ 00271 || (data_[9] op x.data_[9]) \ 00272 || (data_[10] op x.data_[10]) \ 00273 || (data_[11] op x.data_[11]) \ 00274 || (data_[12] op x.data_[12]) \ 00275 || (data_[13] op x.data_[13]) \ 00276 || (data_[14] op x.data_[14]) \ 00277 || (data_[15] op x.data_[15]) \ 00278 ) ; } 00279 00280 Vector_Vector_RelOperator(>) 00281 Vector_Vector_RelOperator(<) 00282 Vector_Vector_RelOperator(>=) 00283 Vector_Vector_RelOperator(<=) 00284 #undef Vector_Vector_RelOperator 00285 00286 #define Vector_Scalar_RelOperator(op) \ 00287 inline int operator op (const DataType &v) const \ 00288 { return( \ 00289 (data_[0] op v) \ 00290 && (data_[1] op v) \ 00291 && (data_[2] op v) \ 00292 && (data_[3] op v) \ 00293 && (data_[4] op v) \ 00294 && (data_[5] op v) \ 00295 && (data_[6] op v) \ 00296 && (data_[7] op v) \ 00297 && (data_[8] op v) \ 00298 && (data_[9] op v) \ 00299 && (data_[10] op v) \ 00300 && (data_[11] op v) \ 00301 && (data_[12] op v) \ 00302 && (data_[13] op v) \ 00303 && (data_[14] op v) \ 00304 && (data_[15] op v) \ 00305 ); } 00306 00307 Vector_Scalar_RelOperator(==) 00308 Vector_Scalar_RelOperator(!=) 00309 #undef Vector_Scalar_RelOperator 00310 00311 #define Vector_Scalar_RelOperator(op) \ 00312 inline int operator op (const DataType &v) const \ 00313 { return( \ 00314 (data_[0] op v) \ 00315 || (data_[1] op v) \ 00316 || (data_[2] op v) \ 00317 || (data_[3] op v) \ 00318 || (data_[4] op v) \ 00319 || (data_[5] op v) \ 00320 || (data_[6] op v) \ 00321 || (data_[7] op v) \ 00322 || (data_[8] op v) \ 00323 || (data_[9] op v) \ 00324 || (data_[10] op v) \ 00325 || (data_[11] op v) \ 00326 || (data_[12] op v) \ 00327 || (data_[13] op v) \ 00328 || (data_[14] op v) \ 00329 || (data_[15] op v) \ 00330 ); } 00331 00332 Vector_Scalar_RelOperator(>) 00333 Vector_Scalar_RelOperator(<) 00334 Vector_Scalar_RelOperator(>=) 00335 Vector_Scalar_RelOperator(<=) 00336 #undef Vector_Scalar_RelOperator 00337 00338 /* Define elementwise minimum and maximum functions for Vectors */ 00339 inline void min(const TVector &x) { 00340 data_[0] = (data_[0] < x.data_[0]) ? data_[0] : x.data_[0]; 00341 data_[1] = (data_[1] < x.data_[1]) ? data_[1] : x.data_[1]; 00342 data_[2] = (data_[2] < x.data_[2]) ? data_[2] : x.data_[2]; 00343 data_[3] = (data_[3] < x.data_[3]) ? data_[3] : x.data_[3]; 00344 data_[4] = (data_[4] < x.data_[4]) ? data_[4] : x.data_[4]; 00345 data_[5] = (data_[5] < x.data_[5]) ? data_[5] : x.data_[5]; 00346 data_[6] = (data_[6] < x.data_[6]) ? data_[6] : x.data_[6]; 00347 data_[7] = (data_[7] < x.data_[7]) ? data_[7] : x.data_[7]; 00348 data_[8] = (data_[8] < x.data_[8]) ? data_[8] : x.data_[8]; 00349 data_[9] = (data_[9] < x.data_[9]) ? data_[9] : x.data_[9]; 00350 data_[10] = (data_[10] < x.data_[10]) ? data_[10] : x.data_[10]; 00351 data_[11] = (data_[11] < x.data_[11]) ? data_[11] : x.data_[11]; 00352 data_[12] = (data_[12] < x.data_[12]) ? data_[12] : x.data_[12]; 00353 data_[13] = (data_[13] < x.data_[13]) ? data_[13] : x.data_[13]; 00354 data_[14] = (data_[14] < x.data_[14]) ? data_[14] : x.data_[14]; 00355 data_[15] = (data_[15] < x.data_[15]) ? data_[15] : x.data_[15]; 00356 } 00357 inline void max(const TVector &x) { 00358 data_[0] = (data_[0] > x.data_[0]) ? data_[0] : x.data_[0]; 00359 data_[1] = (data_[1] > x.data_[1]) ? data_[1] : x.data_[1]; 00360 data_[2] = (data_[2] > x.data_[2]) ? data_[2] : x.data_[2]; 00361 data_[3] = (data_[3] > x.data_[3]) ? data_[3] : x.data_[3]; 00362 data_[4] = (data_[4] > x.data_[4]) ? data_[4] : x.data_[4]; 00363 data_[5] = (data_[5] > x.data_[5]) ? data_[5] : x.data_[5]; 00364 data_[6] = (data_[6] > x.data_[6]) ? data_[6] : x.data_[6]; 00365 data_[7] = (data_[7] > x.data_[7]) ? data_[7] : x.data_[7]; 00366 data_[8] = (data_[8] > x.data_[8]) ? data_[8] : x.data_[8]; 00367 data_[9] = (data_[9] > x.data_[9]) ? data_[9] : x.data_[9]; 00368 data_[10] = (data_[10] > x.data_[10]) ? data_[10] : x.data_[10]; 00369 data_[11] = (data_[11] > x.data_[11]) ? data_[11] : x.data_[11]; 00370 data_[12] = (data_[12] > x.data_[12]) ? data_[12] : x.data_[12]; 00371 data_[13] = (data_[13] > x.data_[13]) ? data_[13] : x.data_[13]; 00372 data_[14] = (data_[14] > x.data_[14]) ? data_[14] : x.data_[14]; 00373 data_[15] = (data_[15] > x.data_[15]) ? data_[15] : x.data_[15]; 00374 } 00375 00376 /* Define minimum and maximum of components */ 00377 inline DataType mincomp() const { 00378 DataType min; 00379 min = data_[0]; 00380 if (data_[1] < min) min = data_[1]; 00381 if (data_[2] < min) min = data_[2]; 00382 if (data_[3] < min) min = data_[3]; 00383 if (data_[4] < min) min = data_[4]; 00384 if (data_[5] < min) min = data_[5]; 00385 if (data_[6] < min) min = data_[6]; 00386 if (data_[7] < min) min = data_[7]; 00387 if (data_[8] < min) min = data_[8]; 00388 if (data_[9] < min) min = data_[9]; 00389 if (data_[10] < min) min = data_[10]; 00390 if (data_[11] < min) min = data_[11]; 00391 if (data_[12] < min) min = data_[12]; 00392 if (data_[13] < min) min = data_[13]; 00393 if (data_[14] < min) min = data_[14]; 00394 if (data_[15] < min) min = data_[15]; 00395 return min; 00396 } 00397 inline DataType maxcomp() const { 00398 DataType max; 00399 max = data_[0]; 00400 if (data_[1] > max) max = data_[1]; 00401 if (data_[2] > max) max = data_[2]; 00402 if (data_[3] > max) max = data_[3]; 00403 if (data_[4] > max) max = data_[4]; 00404 if (data_[5] > max) max = data_[5]; 00405 if (data_[6] > max) max = data_[6]; 00406 if (data_[7] > max) max = data_[7]; 00407 if (data_[8] > max) max = data_[8]; 00408 if (data_[9] > max) max = data_[9]; 00409 if (data_[10] > max) max = data_[10]; 00410 if (data_[11] > max) max = data_[11]; 00411 if (data_[12] > max) max = data_[12]; 00412 if (data_[13] > max) max = data_[13]; 00413 if (data_[14] > max) max = data_[14]; 00414 if (data_[15] > max) max = data_[15]; 00415 return max; 00416 } 00417 00418 inline double abs() const { 00419 DataType s = data_[0]*data_[0]; 00420 s += data_[1]*data_[1]; 00421 s += data_[2]*data_[2]; 00422 s += data_[3]*data_[3]; 00423 s += data_[4]*data_[4]; 00424 s += data_[5]*data_[5]; 00425 s += data_[6]*data_[6]; 00426 s += data_[7]*data_[7]; 00427 s += data_[8]*data_[8]; 00428 s += data_[9]*data_[9]; 00429 s += data_[10]*data_[10]; 00430 s += data_[11]*data_[11]; 00431 s += data_[12]*data_[12]; 00432 s += data_[13]*data_[13]; 00433 s += data_[14]*data_[14]; 00434 s += data_[15]*data_[15]; 00435 return (sqrt(double(s))); 00436 } 00437 00438 inline TVector getmin(const TVector &x) const 00439 { TVector ret(*this); ret.min(x); return(ret); } 00440 inline TVector getmax(const TVector &x) const 00441 { TVector ret(*this); ret.max(x); return(ret); } 00442 00443 public: 00444 DataType data_[16]; 00445 }; 00446 00447 00448 template <class DataType> 00449 inline ostream& operator << (ostream& os, const Vector(16)<DataType> &v) { 00450 os << "(" 00451 << v.data_[0] 00452 << "," << v.data_[1] 00453 << "," << v.data_[2] 00454 << "," << v.data_[3] 00455 << "," << v.data_[4] 00456 << "," << v.data_[5] 00457 << "," << v.data_[6] 00458 << "," << v.data_[7] 00459 << "," << v.data_[8] 00460 << "," << v.data_[9] 00461 << "," << v.data_[10] 00462 << "," << v.data_[11] 00463 << "," << v.data_[12] 00464 << "," << v.data_[13] 00465 << "," << v.data_[14] 00466 << "," << v.data_[15] 00467 << ")"; 00468 return os; 00469 } 00470 00471 template <class DataType> 00472 inline Vector(16)<DataType> Min(const Vector(16)<DataType> &x, 00473 const Vector(16)<DataType> &y) 00474 { Vector(16)<DataType> ret(x); ret.min(y); return(ret); } 00475 00476 template <class DataType> 00477 inline Vector(16)<DataType> Max(const Vector(16)<DataType> &x, 00478 const Vector(16)<DataType> &y) 00479 { Vector(16)<DataType> ret(x); ret.max(y); return(ret); } 00480 00481 template <class DataType> 00482 inline double abs(const Vector(16)<DataType> &x) 00483 { return (x.abs()); } 00484 00485 template <class DataType> 00486 inline DataType mincomp(const Vector(16)<DataType> &x) 00487 { return(x.mincomp()); } 00488 00489 template <class DataType> 00490 inline DataType maxcomp(const Vector(16)<DataType> &x) 00491 { return(x.maxcomp()); } 00492 00493 00494 #define Global_Vector_Scalar_Operator(op) \ 00495 template <class DataType> \ 00496 inline Vector(16)<DataType> operator op (const DataType &v, \ 00497 const Vector(16)<DataType> &x) \ 00498 { return(x op v); } 00499 00500 Global_Vector_Scalar_Operator(+) 00501 Global_Vector_Scalar_Operator(-) 00502 Global_Vector_Scalar_Operator(*) 00503 Global_Vector_Scalar_Operator(/) 00504 #undef Global_Vector_Scalar_Operator 00505 00506 00507 #define Global_Vector_Function(fct) \ 00508 template <class DataType> \ 00509 inline Vector(16)<DataType> fct(const Vector(16)<DataType> &x) \ 00510 { \ 00511 Vector(16)<DataType> ret; \ 00512 ret[0] = fct(x[0]); \ 00513 ret[1] = fct(x[1]); \ 00514 ret[2] = fct(x[2]); \ 00515 ret[3] = fct(x[3]); \ 00516 ret[4] = fct(x[4]); \ 00517 ret[5] = fct(x[5]); \ 00518 ret[6] = fct(x[6]); \ 00519 ret[7] = fct(x[7]); \ 00520 ret[8] = fct(x[8]); \ 00521 ret[9] = fct(x[9]); \ 00522 ret[10] = fct(x[10]); \ 00523 ret[11] = fct(x[11]); \ 00524 ret[12] = fct(x[12]); \ 00525 ret[13] = fct(x[13]); \ 00526 ret[14] = fct(x[14]); \ 00527 ret[15] = fct(x[15]); \ 00528 return(ret); \ 00529 } 00530 00531 Global_Vector_Function(fabs) 00532 Global_Vector_Function(sqrt) 00533 #undef Global_Vector_Function 00534 00535 00536 #define Vector_Vector_Functions(NameTo,NameFrom,ope) \ 00537 template <class DataType, class VectorType> \ 00538 inline void NameTo (Vector(16)<DataType> &x, const VectorType &y) \ 00539 { \ 00540 x(0) ope y(0); \ 00541 x(1) ope y(1); \ 00542 x(2) ope y(2); \ 00543 x(3) ope y(3); \ 00544 x(4) ope y(4); \ 00545 x(5) ope y(5); \ 00546 x(6) ope y(6); \ 00547 x(7) ope y(7); \ 00548 x(8) ope y(8); \ 00549 x(9) ope y(9); \ 00550 x(10) ope y(10); \ 00551 x(11) ope y(11); \ 00552 x(12) ope y(12); \ 00553 x(13) ope y(13); \ 00554 x(14) ope y(14); \ 00555 x(15) ope y(15); \ 00556 } \ 00557 template <class DataType, class VectorType> \ 00558 inline void NameFrom (VectorType &x, const Vector(16)<DataType> &y) \ 00559 { \ 00560 x(0) ope y(0); \ 00561 x(1) ope y(1); \ 00562 x(2) ope y(2); \ 00563 x(3) ope y(3); \ 00564 x(4) ope y(4); \ 00565 x(5) ope y(5); \ 00566 x(6) ope y(6); \ 00567 x(7) ope y(7); \ 00568 x(8) ope y(8); \ 00569 x(9) ope y(9); \ 00570 x(10) ope y(10); \ 00571 x(11) ope y(11); \ 00572 x(12) ope y(12); \ 00573 x(13) ope y(13); \ 00574 x(14) ope y(14); \ 00575 x(15) ope y(15); \ 00576 } 00577 00578 Vector_Vector_Functions(equals_to,equals_from,=) 00579 Vector_Vector_Functions(plus_to,plus_from,+=) 00580 Vector_Vector_Functions(minus_to,minus_from,-=) 00581 Vector_Vector_Functions(multiply_to,multiply_from,*=) 00582 Vector_Vector_Functions(divide_to,divide_from,/=) 00583 #undef Vector_Vector_Functions 00584 00585 00586 #endif
Quickstart Users Guide Programmers Reference Installation Examples Download
AMROC Main Home Contactlast update: 06/01/04