Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)

geometry/arrays.hh
Go to the documentation of this file.
00001 
00006 #include "toolbox/array.hh"
00007 #include "cell1D.hh"
00008 #include "cell2D.hh"
00009 #include "cell3D.hh"
00010 
00011 #ifndef geometryArrays_hh
00012 #define geometryArrays_hh
00013 
00014 namespace concepts {
00015 
00016 
00017   // ************************************************************* makeArray **
00018 
00024   template<class F, class G>
00025   void makeArray(const F& cell, const Array<Real>& p,
00026                   G (F::*fun)(Real) const, Array<G>& array)
00027   {
00028     array.resize(p.size());
00029     G* coord = array;
00030     const Real* pAcc = p;
00031     for (uint i = 0; i < p.size(); ++i)
00032       *coord++ = (cell.*fun)(*pAcc++);
00033   }
00034 
00041   template<class F, class G>
00042   void makeArray(const F& cell, const Array<Real>& pX, const Array<Real>& pY,
00043                   G (F::*fun)(Real, Real) const, Array<G>& array)
00044   {
00045     array.resize(pX.size() * pY.size());
00046     G* coord = array;
00047     const Real* pxAcc = pX;
00048     for (uint i = 0; i < pX.size(); ++i) {
00049       const Real* pyAcc = pY;
00050       for (uint j = 0; j < pY.size(); ++j)
00051         *coord++ = (cell.*fun)(*pxAcc, *pyAcc++);
00052       pxAcc++;
00053     }
00054   }
00055 
00056 
00057   // ************************************************************ ArrayCoord **
00058 
00065   template<uint dim>
00066   class ArrayCoord {};
00067 
00068 
00069   // ********************************************************* ArrayCoord<1> **
00070 
00075   template<>
00076   class ArrayCoord<1> : public Array<Real> {
00077   public:
00083     ArrayCoord(const Edge1d& edge,
00084                const Array<Real>& p);
00085   };
00086 
00087 
00088   // ********************************************************* ArrayCoord<2> **
00089 
00094   template<>
00095   class ArrayCoord<2> : public Array<Real2d> {
00096   public:
00102     ArrayCoord(const Quad2d& quad,
00103                const Array<Real>& qX,
00104                const Array<Real>& qY);
00110     ArrayCoord(const Edge2d& edge,
00111                const Array<Real>& p);
00112   };
00113 
00114 
00115   // ********************************************************* ArrayJacobian **
00116 
00121   template<int gdim, int ldim>
00122   class ArrayJacobian {
00123   };
00124 
00125   // **************************************************** ArrayJacobian<1,1> **
00126   
00131   template<>
00132   class ArrayJacobian<1,1> : public Array<Real> {
00133   public:
00139     ArrayJacobian(const EdgeNd& edge,
00140                   const Array<Real>& p);
00146     ArrayJacobian(const Quad2d& quad,
00147                   const Array<Real>& qX,
00148                   const Array<Real>& qY);
00149   };
00150 
00151   // **************************************************** ArrayJacobian<2,2> **
00152 
00157   template<>
00158   class ArrayJacobian<2,2> : public Array<Mapping<Real,2> > {
00159   public:
00165     ArrayJacobian(const Quad2d& quad,
00166                   const Array<Real>& qX,
00167                   const Array<Real>& qY);
00168 
00177     ArrayJacobian(const Quad2d& quad, uint k,
00178                   const Array<Real>& q);
00179   };
00180 
00181   // ******************************************************** ArrayLocalCoord **
00182 
00187   class ArrayLocalCoord : public Array<Real> {
00188   public:
00200     ArrayLocalCoord(const Quad2d& quad, uint k, uint dim,
00201                     const Array<Real>& q);
00202   private:
00203     inline bool alongEdge(uint k, uint dim)
00204     {
00205       return 
00206         (k == 0 && dim == 1) || (k == 3 && dim == 0) || 
00207         (k == 1 && dim == 0) || (k == 2 && dim == 1);
00208     }
00209   };
00210 
00211 } // namespace concepts
00212 
00213 
00214 #endif // geometryArrays_hh

Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)