AMROC Main     Blockstructured Adaptive Mesh Refinement in object-oriented C++


Main Page   Class Hierarchy   Compound List   File List  

Vector27.h

Go to the documentation of this file.
00001 #ifndef AMROC_VECTOR27_H
00002 #define AMROC_VECTOR27_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(27) {
00030   typedef Vector(27)<DataType> TVector;
00031 
00032 public:
00033   typedef DataType InternalDataType;
00034 
00035   Vector(27)() {}
00036   Vector(27)(const TVector& x) { 
00037     memcpy((void *) data_, (void *) x.data_, sizeof(TVector));
00038   }
00039   Vector(27)(const DataType& v) { 
00040     for (int n=0; n<27; n++)
00041       data_[n] = v; 
00042   }
00043 
00044   ~Vector(27)() {}
00045   
00046   DataType * data() { return data_; }
00047   const DataType * data() const { return data_; }
00048   int length() const { return 27; }
00049   static int Length() { return 27; }
00050 
00051   inline DataType operator()(int i) const {
00052 #ifdef DEBUG_PRINT
00053     assert((i >= 0) && (i < 27)); 
00054 #endif
00055     return data_[i];
00056   }
00057   inline DataType& operator()(int i) { 
00058 #ifdef DEBUG_PRINT
00059     assert((i >= 0) && (i < 27)); 
00060 #endif
00061     return data_[i];
00062   }
00063 
00064   inline DataType operator[](int i) const {
00065 #ifdef DEBUG_PRINT
00066     assert((i >= 0) && (i < 27)); 
00067 #endif
00068     return data_[i];
00069   }
00070   inline DataType& operator[](int i) { 
00071 #ifdef DEBUG_PRINT
00072     assert((i >= 0) && (i < 27)); 
00073 #endif
00074     return data_[i];
00075   }
00076 
00077   inline TVector& operator=(const TVector& x) { 
00078     memcpy((void *) data_, (void *) x.data_, sizeof(TVector));
00079     return *this; 
00080   }
00081   inline TVector& operator=(const DataType& v) { 
00082     for (int n=0; n<27; n++)
00083       data_[n] = v; 
00084     return *this; 
00085   }
00086 
00087 #define Vector_Vector_Operator(ope,op)                          \
00088    inline TVector& operator ope (const TVector &x)              \
00089      {                                                          \
00090        for (int n=0; n<27; n++)                                 \
00091          data_[n] ope x.data_[n];                               \
00092        return(*this);                                           \
00093      }                                                          \
00094    inline TVector operator op (const TVector &x) const          \
00095      {                                                          \
00096        TVector ret(*this);                                      \
00097        for (int n=0; n<27; n++)                                 \
00098          ret.data_[n] ope x.data_[n];                           \
00099        return(ret);                                             \
00100      }
00101    Vector_Vector_Operator(+=,+)
00102    Vector_Vector_Operator(-=,-)
00103    Vector_Vector_Operator(*=,*)
00104    Vector_Vector_Operator(/=,/)
00105 #undef Vector_Vector_Operator
00106 
00107 #define Vector_Scalar_Operator(ope,op)                          \
00108    inline TVector& operator ope (const DataType &v)             \
00109      {                                                          \
00110        for (int n=0; n<27; n++)                                 \
00111          data_[n] ope v;                                        \
00112        return(*this);                                           \
00113      }                                                          \
00114    inline TVector operator op (const DataType &v) const         \
00115      {                                                          \
00116        TVector ret(*this);                                      \
00117        for (int n=0; n<27; n++)                                 \
00118          ret.data_[n] ope v;                                    \
00119        return(ret);                                             \
00120      }
00121    Vector_Scalar_Operator(+=,+)
00122    Vector_Scalar_Operator(-=,-)
00123    Vector_Scalar_Operator(*=,*)
00124    Vector_Scalar_Operator(/=,/)
00125 #undef Vector_Scalar_Operator
00126 
00127    /* Define the negation operator */
00128    inline TVector operator - () const
00129      { 
00130        TVector ret;
00131        for (int n=0; n<27; n++)
00132          ret.data_[n] = -data_[n];
00133        return(ret);
00134      }
00135 
00136 #define Vector_Vector_RelOperator(op)                           \
00137    inline int operator op (const TVector &x) const              \
00138      {                                                          \
00139        bool ret = (data_[0] op x.data_[0]);                     \
00140        for (int n=1; n<27; n++)                                 \
00141          ret = ret && (data_[n] op x.data_[n]);                 \
00142        return(ret);                                             \
00143      }                     
00144 
00145    Vector_Vector_RelOperator(==)
00146    Vector_Vector_RelOperator(!=)
00147 #undef Vector_Vector_RelOperator
00148 
00149 #define Vector_Vector_RelOperator(op)                           \
00150    inline int operator op (const TVector &x) const              \
00151      {                                                          \
00152        bool ret = (data_[0] op x.data_[0]);                     \
00153        for (int n=1; n<27; n++)                                 \
00154          ret = ret || (data_[n] op x.data_[n]);                 \
00155        return(ret);                                             \
00156      }                     
00157 
00158    Vector_Vector_RelOperator(>)
00159    Vector_Vector_RelOperator(<)
00160    Vector_Vector_RelOperator(>=)
00161    Vector_Vector_RelOperator(<=)
00162 #undef Vector_Vector_RelOperator
00163 
00164 #define Vector_Scalar_RelOperator(op)                          \
00165    inline int operator op (const DataType &v) const            \
00166      {                                                         \
00167        bool ret = (data_[0] op v);                             \
00168        for (int n=1; n<27; n++)                                \
00169          ret = ret && (data_[n] op v);                         \
00170        return(ret);                                            \
00171      }                     
00172 
00173    Vector_Scalar_RelOperator(==)
00174    Vector_Scalar_RelOperator(!=)
00175 #undef Vector_Scalar_RelOperator
00176 
00177 #define Vector_Scalar_RelOperator(op)                          \
00178    inline int operator op (const DataType &v) const            \
00179      {                                                         \
00180        bool ret = (data_[0] op v);                             \
00181        for (int n=1; n<27; n++)                                \
00182          ret = ret || (data_[n] op v);                         \
00183        return(ret);                                            \
00184      }                     
00185 
00186    Vector_Scalar_RelOperator(>)
00187    Vector_Scalar_RelOperator(<)
00188    Vector_Scalar_RelOperator(>=)
00189    Vector_Scalar_RelOperator(<=)
00190 #undef Vector_Scalar_RelOperator
00191 
00192    /* Define elementwise minimum and maximum functions for Vectors */
00193    inline void min(const TVector &x) { 
00194      for (int n=0; n<27; n++)                             
00195        data_[n] = (data_[n] < x.data_[n]) ? data_[n] : x.data_[n]; 
00196    }
00197    inline void max(const TVector &x) {
00198      for (int n=0; n<27; n++)                             
00199        data_[n] = (data_[n] > x.data_[n]) ? data_[n] : x.data_[n]; 
00200    }
00201 
00202    /* Define minimum and maximum of components */
00203    inline DataType mincomp() const { 
00204      DataType min = data_[0];
00205      for (int n=1; n<27; n++)                             
00206        if (data_[n] < min) min = data_[n]; 
00207      return min;
00208    }
00209    inline DataType maxcomp() const { 
00210      DataType max = data_[0];
00211      for (int n=1; n<27; n++)                             
00212        if (data_[n] > max) max = data_[n]; 
00213      return max;
00214    }
00215 
00216    inline double abs() const {
00217      DataType s = data_[0]*data_[0];
00218      for (int n=1; n<27; n++)     
00219        s += data_[n]*data_[n]; 
00220      return (sqrt(double(s)));
00221    }
00222 
00223    inline TVector getmin(const TVector &x) const
00224      { TVector ret(*this); ret.min(x); return(ret); }
00225    inline TVector getmax(const TVector &x) const
00226      { TVector ret(*this); ret.max(x); return(ret); }
00227 
00228 public:
00229    DataType data_[27];
00230 };
00231 
00232 
00233 template <class DataType>
00234 inline ostream&  operator << (ostream& os, const Vector(27)<DataType> &v) {
00235   os << "(" << v.data_[0];
00236   for (int n=1; n<27; n++)     
00237     os << "," << v.data_[n]; 
00238   os << ")";
00239   return os;
00240 }
00241 
00242 
00243 #define Global_Vector_Scalar_Operator(op)                                  \
00244 template <class DataType>                                                  \
00245 inline Vector(27)<DataType> operator op (const DataType &v,                \
00246    const Vector(27)<DataType> &x)                                          \
00247    { return(x op v); }
00248 
00249 Global_Vector_Scalar_Operator(+)
00250 Global_Vector_Scalar_Operator(-)
00251 Global_Vector_Scalar_Operator(*)
00252 Global_Vector_Scalar_Operator(/)
00253 #undef Global_Vector_Scalar_Operator
00254 
00255 
00256 #define Global_Vector_Function(fct)                                       \
00257 template <class DataType>                                                 \
00258 inline Vector(27)<DataType> fct(const Vector(27)<DataType> &x)            \
00259    {                                                                      \
00260      Vector(27)<DataType> ret;                                            \
00261      for (int n=0; n<27; n++)                                             \
00262        ret[n] = fct(x[n]);                                                \
00263      return(ret);                                                         \
00264    }
00265 
00266 Global_Vector_Function(fabs)
00267 Global_Vector_Function(sqrt)
00268 #undef Global_Vector_Function
00269 
00270 
00271 template <class DataType>
00272 inline Vector(27)<DataType> Min(const Vector(27)<DataType> &x, 
00273                                    const Vector(27)<DataType> &y) 
00274   { Vector(27)<DataType> ret(x); ret.min(y); return(ret); }
00275 
00276 template <class DataType>
00277 inline Vector(27)<DataType> Max(const Vector(27)<DataType> &x, 
00278                                    const Vector(27)<DataType> &y) 
00279   { Vector(27)<DataType> ret(x); ret.max(y); return(ret); }
00280 
00281 template <class DataType>
00282 inline double abs(const Vector(27)<DataType> &x) 
00283   { return (x.abs()); }
00284 
00285 template <class DataType>
00286 inline DataType mincomp(const Vector(27)<DataType> &x) 
00287   { return(x.mincomp()); }
00288 
00289 template <class DataType>
00290 inline DataType maxcomp(const Vector(27)<DataType> &x) 
00291   { return(x.maxcomp()); }
00292 
00293 
00294 #define Vector_Vector_Functions(NameTo,NameFrom,ope)                      \
00295   template <class DataType, class VectorType>                             \
00296   inline void NameTo (Vector(27)<DataType> &x, const VectorType &y)       \
00297     {                                                                     \
00298       for (int n=0; n<27; n++)                                            \
00299         x(n) ope y(n);                                                    \
00300     }                                                                     \
00301   template <class DataType, class VectorType>                             \
00302   inline void NameFrom (VectorType &x, const Vector(27)<DataType> &y)     \
00303     {                                                                     \
00304       for (int n=0; n<27; n++)                                            \
00305         x(n) ope y(n);                                                    \
00306     }
00307 
00308    Vector_Vector_Functions(equals_to,equals_from,=)
00309    Vector_Vector_Functions(plus_to,plus_from,+=)
00310    Vector_Vector_Functions(minus_to,minus_from,-=)
00311    Vector_Vector_Functions(multiply_to,multiply_from,*=)
00312    Vector_Vector_Functions(divide_to,divide_from,/=)
00313 #undef Vector_Vector_Functions
00314 
00315 
00316 #endif


Quickstart     Users Guide     Programmers Reference     Installation      Examples     Download



AMROC Main      Home      Contact
last update: 06/01/04