diff --git a/contrib/arc/highlevel.h b/contrib/arc/highlevel.h index 70a497433d43967699f0320e6dfec8fa9ade87a2..3db3f5777b3dcaf1564d358ec8bfaa2c8f27b0d1 100644 --- a/contrib/arc/highlevel.h +++ b/contrib/arc/highlevel.h @@ -60,16 +60,19 @@ template<class T> class Function // Fonction au sens EF du terme. public: // typedef std::tr1::shared_ptr<Function<T> > FunctionPtr; virtual ~Function(){} - virtual void GetVal (double uvw[],MElement *e, T& Val)const=0; - virtual void GetGrad(double uvw[],MElement *e,typename TensorialTraits<T>::GradType &Grad) const =0; - virtual void GetHess(double uvw[],MElement *e,typename TensorialTraits<T>::HessType &Hess)const =0; + virtual void GetVal (double uvw[3],MElement *e, T& Val)const=0; + virtual void GetGrad(double uvw[3],MElement *e,typename TensorialTraits<T>::GradType &Grad) const =0; + virtual void GetHess(double uvw[3],MElement *e,typename TensorialTraits<T>::HessType &Hess)const =0; + virtual void GetVal (double uvw[][3],MElement *e, T Val[],int n) { for (int i=0;i<n;++i) GetVal(uvw[i],e,Val[i]); } // par defaut + virtual void GetGrad(double uvw[][3],MElement *e,typename TensorialTraits<T>::GradType Grad[],int n) const { for (int i=0;i<n;++i) GetGrad(uvw[i],e,Grad[i]); } + virtual void GetHess(double uvw[][3],MElement *e,typename TensorialTraits<T>::HessType Hess[],int n)const { for (int i=0;i<n;++i) GetHess(uvw[i],e,Hess[i]); } }; -class LagrangeShapeFunction: public Function<double> +template<class T> class LagrangeShapeFunction: public Function<T> { public: - virtual void GetVal(double uvw[],MElement *e, double& Val) + virtual void GetVal(double uvw[],MElement *e, T& Val) { // double s[100]; // _e->getShapeFunctions(uvw[0], uvw[1], uvw[2], s); @@ -84,46 +87,54 @@ class LagrangeShapeFunction: public Function<double> class SpaceBase // renvoie des clefs des dofs { +protected: +int _iField; public: - virtual void getDofs(MElement *e,std::vector<Dof> &vecD)=0; + SpaceBase(int iField=0):_iField(iField){}; + virtual ~SpaceBase(){}; + virtual int getNumberDofs(MElement *e) const = 0 ; + virtual void getDofs(MElement *e,const Dof *vecD) const {} //=0; + virtual int getId(void) const {return _iField;}; }; template<class T> class Space : public SpaceBase // renvoie des clefs de dofs et des fonctions de formes { + public: - Space(){}; + Space(int iField=0):SpaceBase(iField){}; virtual ~Space(){}; - virtual void getDofsandSFs(MElement *e,std::vector<std::pair< Dof, Function<T>* > > &vecDFF)=0; - virtual void getSFs(std::vector<std::pair< Dof, Function<T>* > > &vecDFF)=0; + virtual void getDofsandSFs(MElement *e,const Dof *VecD, const Function<T>* vecDSF) {} //=0; + virtual void getSFs(const Function<T>* vecDSF) {} //=0; }; -template<class T> class SpaceLagrange : public Space<T> // approximation Lagrange ... +template<class T> class SpaceLagrange : public Space<T> // Lagrange ... 1 dof / node / basis vector { private: - int _iField; + Dof getLocalDof(MElement *e, int i) const { int iComp = i / e->getNumVertices(); int ithLocalVertex = i % e->getNumVertices(); return Dof(e->getVertex(ithLocalVertex)->getNum(), - Dof::createTypeWithTwoInts(iComp, _iField)); + Dof::createTypeWithTwoInts(iComp,Space<T>::getId())); } public: - SpaceLagrange(int iField):_iField(iField){}; + SpaceLagrange(int iField=0):Space<T>(iField){}; virtual ~SpaceLagrange(){}; virtual void getDofsandSFs(MElement *e,std::vector<std::pair< Dof, Function<T>* > > &vecDFF){} virtual void getSFs(std::vector<std::pair< Dof, Function<T>* > > &vecDFF) { }; - virtual void getDofs(MElement *e,std::vector<Dof> &vecD) + virtual void getDofs(MElement *e,std::vector<Dof> &vecD) const { int ndofs= e->getNumVertices()*TensorialTraits<T>::nb_basis_vectors; for (int i=0;i<ndofs;++i) vecD.push_back(getLocalDof(e,i)); } + virtual int getNumberDofs(MElement *e) const {return 0;} }; @@ -146,7 +157,7 @@ public: SpaceXfem(int iEnrich,Space<T>& SpaceBase):_iEnrich(iEnrich), _SpaceBase(SpaceBase){}; virtual void getDofsandSFs(MElement *e,std::vector<std::pair< Dof, Function<T>* > > &vecDFF){} virtual void getSFs(std::vector<std::pair< Dof, Function<T>* > > &vecDFF){}; - virtual void getDofs(MElement *e,std::vector<Dof> &vecD) + virtual void getDofs(MElement *e,std::vector<Dof> &vecD) const { _SpaceBase.getDofs(e,vecD); } @@ -243,7 +254,14 @@ void Construct(FormZero &Z,Region &R,Integrator &I); void Assemble(FormZero &Z,Region &R,Assembler &A,Integrator &I); */ -template<class datamat, class T1,class T2> class TermBilinear // terme associe a un "element" / pt de gauss (contribution élémentaire) +class TermBilinearBase +{ +public: + virtual void GetTerm(MElement *e) {} +}; + + +template<class datamat, class T1,class T2> class TermBilinear : public TermBilinearBase // terme associe a un "element" / pt de gauss (contribution élémentaire) // typiquement celui ci stoque ce qui doit etre stocke. C'est la base configurable du code // on doit associer cela a un allocateur qui renvoie un pointeur sur ce truc // Soit tous les elements/pts de gauss ont le meme terme , allocateur unique (pas de stockage aux pts de