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
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
00058
00065 template<uint dim>
00066 class ArrayCoord {};
00067
00068
00069
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
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
00116
00121 template<int gdim, int ldim>
00122 class ArrayJacobian {
00123 };
00124
00125
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
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
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 }
00212
00213
00214 #endif // geometryArrays_hh