Skip to content
Snippets Groups Projects
Commit b993cd38 authored by Éric Béchet's avatar Éric Béchet
Browse files

No commit message

No commit message
parent ef4ff9b8
No related branches found
No related tags found
No related merge requests found
...@@ -60,16 +60,19 @@ template<class T> class Function // Fonction au sens EF du terme. ...@@ -60,16 +60,19 @@ template<class T> class Function // Fonction au sens EF du terme.
public: public:
// typedef std::tr1::shared_ptr<Function<T> > FunctionPtr; // typedef std::tr1::shared_ptr<Function<T> > FunctionPtr;
virtual ~Function(){} virtual ~Function(){}
virtual void GetVal (double uvw[],MElement *e, T& Val)const=0; virtual void GetVal (double uvw[3],MElement *e, T& Val)const=0;
virtual void GetGrad(double uvw[],MElement *e,typename TensorialTraits<T>::GradType &Grad) const =0; virtual void GetGrad(double uvw[3],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 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: public:
virtual void GetVal(double uvw[],MElement *e, double& Val) virtual void GetVal(double uvw[],MElement *e, T& Val)
{ {
// double s[100]; // double s[100];
// _e->getShapeFunctions(uvw[0], uvw[1], uvw[2], s); // _e->getShapeFunctions(uvw[0], uvw[1], uvw[2], s);
...@@ -84,46 +87,54 @@ class LagrangeShapeFunction: public Function<double> ...@@ -84,46 +87,54 @@ class LagrangeShapeFunction: public Function<double>
class SpaceBase // renvoie des clefs des dofs class SpaceBase // renvoie des clefs des dofs
{ {
protected:
int _iField;
public: 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 template<class T> class Space : public SpaceBase // renvoie des clefs de dofs et des fonctions de formes
{ {
public: public:
Space(){}; Space(int iField=0):SpaceBase(iField){};
virtual ~Space(){}; virtual ~Space(){};
virtual void getDofsandSFs(MElement *e,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(std::vector<std::pair< Dof, Function<T>* > > &vecDFF)=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: private:
int _iField;
Dof getLocalDof(MElement *e, int i) const Dof getLocalDof(MElement *e, int i) const
{ {
int iComp = i / e->getNumVertices(); int iComp = i / e->getNumVertices();
int ithLocalVertex = i % e->getNumVertices(); int ithLocalVertex = i % e->getNumVertices();
return Dof(e->getVertex(ithLocalVertex)->getNum(), return Dof(e->getVertex(ithLocalVertex)->getNum(),
Dof::createTypeWithTwoInts(iComp, _iField)); Dof::createTypeWithTwoInts(iComp,Space<T>::getId()));
} }
public: public:
SpaceLagrange(int iField):_iField(iField){}; SpaceLagrange(int iField=0):Space<T>(iField){};
virtual ~SpaceLagrange(){}; virtual ~SpaceLagrange(){};
virtual void getDofsandSFs(MElement *e,std::vector<std::pair< Dof, Function<T>* > > &vecDFF){} 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 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; int ndofs= e->getNumVertices()*TensorialTraits<T>::nb_basis_vectors;
for (int i=0;i<ndofs;++i) for (int i=0;i<ndofs;++i)
vecD.push_back(getLocalDof(e,i)); vecD.push_back(getLocalDof(e,i));
} }
virtual int getNumberDofs(MElement *e) const {return 0;}
}; };
...@@ -146,7 +157,7 @@ public: ...@@ -146,7 +157,7 @@ public:
SpaceXfem(int iEnrich,Space<T>& SpaceBase):_iEnrich(iEnrich), _SpaceBase(SpaceBase){}; 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 getDofsandSFs(MElement *e,std::vector<std::pair< Dof, Function<T>* > > &vecDFF){}
virtual void getSFs(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); _SpaceBase.getDofs(e,vecD);
} }
...@@ -243,7 +254,14 @@ void Construct(FormZero &Z,Region &R,Integrator &I); ...@@ -243,7 +254,14 @@ void Construct(FormZero &Z,Region &R,Integrator &I);
void Assemble(FormZero &Z,Region &R,Assembler &A,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 // 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 // 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 // Soit tous les elements/pts de gauss ont le meme terme , allocateur unique (pas de stockage aux pts de
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment