diff --git a/contrib/arc/highlevel.h b/contrib/arc/highlevel.h index c681f5e3dd93dd66e4bbb31aad175abce601cb99..bbe919d35e7ab788f732bf1b25e9fc291d385424 100644 --- a/contrib/arc/highlevel.h +++ b/contrib/arc/highlevel.h @@ -14,9 +14,11 @@ #include <vector> #include <complex> +#include <iostream> #include "dofManager.h" #include "SVector3.h" +#include "MElement.h" @@ -24,45 +26,42 @@ typedef SVector3 Vector; class Tensor2{}; class Tensor4{}; -template<class T> struct TensorialTraits{}; - -template<> struct TensorialTraits<double> +template<class T> struct TensorialTraits { - typedef double ValType; - typedef Vector GradType; - typedef Tensor2 HessType; + typedef T ValType; + typedef T GradType[3]; + typedef T HessType[3][3]; }; -template<> struct TensorialTraits<std::complex<double> > +/*template<> struct TensorialTraits<double> { - typedef std::complex<double> ValType; + typedef double ValType; typedef Vector GradType; typedef Tensor2 HessType; }; - template<> struct TensorialTraits<Vector> { typedef Vector ValType; typedef Tensor2 GradType; - typedef Tensor4 HessType; + typedef Tensor3 HessType; }; - +*/ template<class T> class Function // Fonction au sens EF du terme. // renvoie valeur , gradient, hessien, etc...pour un element donné et un point donné { public: 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[],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; }; class SpaceBase // renvoie des clefs de dofs { public: - virtual void getDofs(MElement *e,std::vector<Dof> &vecD)=0; + virtual void getDofs(MElement *e,std::vector<Dof> &vecD){};//=0; }; template<class T> class Space : public SpaceBase // renvoie des clefs de dofs et des fonctions de formes @@ -71,7 +70,7 @@ public: Space(){}; virtual ~Space(){}; virtual void getDofsandSFs(MElement *e,std::vector<std::pair< Dof, Function<T>* > > &vecDFF) {} - virtual void getSFs(std::vector<std::pair< Dof, Function<T>* > > &vecDFF)=0; + virtual void getSFs(std::vector<std::pair< Dof, Function<T>* > > &vecDFF){};//=0; }; @@ -90,19 +89,69 @@ template<class T1,class T2> class TermBilinear // terme associe a un "element" // soit ils ont qqc a stockuer et sont tous distincts // on peut utiliser des membres statiques pour ce qui est constant pour tous les instances { - TermBilinear(); - virtual double getTerm(double uvw[],MElement &e,Function<T1> &SF,Function<T2> &TF) = 0; - virtual void Update(double uvw[],MElement &e,Function<T1> &SF,Function<T2> &TF) = 0; +public: + typedef void Stype; +// TermBilinear(){}; + virtual double getTerm(double uvw[],MElement &e,Function<T1> &SF,Function<T2> &TF,Stype* info) {}; + virtual void Update(double uvw[],MElement &e,Function<T1> &SF,Function<T2> &TF) {}; +// toute fonctios utiles . prevoir un algorithme ad hoc pour l'appliquer sur ts les pts de gauss ... +}; + + +class TermBilinearMeca : public TermBilinear<double,double> +{ +public: +// typedef Tensor Stype; +// TermBilinear(){}; +// virtual double getTerm(double uvw[],MElement &e,Function<double> &SF,Function<double> &TF,Stype* info) {}; +// virtual void Update(double uvw[],MElement &e,Function<T1> &SF,Function<T2> &TF) {}; // toute fonctios utiles . prevoir un algorithme }; -class FormBilinear {}; // Renvoie des matrices élémentaires (ff) +class TermBilinearMecaNL : public TermBilinearMeca +{ +public: + typedef Tensor2 Stype; +// TermBilinear(){}; +// virtual double getTerm(double uvw[],MElement &e,Function<double> &SF,Function<double> &TF,Stype* info) {}; +// virtual void Update(double uvw[],MElement &e,Function<T1> &SF,Function<T2> &TF) {}; +// toute fonctios utiles . prevoir un algorithme +}; + + + +class FormBilinearBase +{ + public: + template <class T> void allocate(T *p) {p=new T[10];std::cout << "10" << std::endl;} + template <class T> void get(T* tab, T *p, int ndx) {p=&tab[ndx];} +}; + +template <> void FormBilinearBase::allocate(void *p) {p=NULL; std::cout << "null" << std::endl;} +template <> void FormBilinearBase::get(void *tab,void *p, int ndx) {p=NULL;} + +template <class Term> class FormBilinear : public FormBilinearBase + // Renvoie des matrices élémentaires (ff) // Accessoirement stocke des pointeurs vers les termes pour chaque element // Doit etre initialisée AVANT toute opération (pour l'allocation) // en principe ce truc ne devrait pas ^etre reimplemente // il devrait donc dependre d'un parametre template TermBilinear // elle sait "integrer" dans un elemeent +{ + + typedef typename Term::Stype Stype; // le truc a stocker + Term instance; // une instance du terme. E.g. utile pour toute initialisation (calcul tenseur materiel, etc...) + Stype *p; + MElement *e; + Function<double> *a; + Function<double> *b; + double uvw[3]; + public: + void func(void) { allocate(p);} + void func2(void) { instance.getTerm(uvw,*e,*a,*b,p); } +}; + class FormLinear{}; // renvoie des vecteurs élémentaires // on devrait pouvoir construire une forme lin à partir d'une forme bilin pour les pb "matrix free" diff --git a/contrib/arc/mainElasticity.cpp b/contrib/arc/mainElasticity.cpp index 32dcfc9aa16f8dda1773f1a5aefe26bb83809984..5edae94b705e06246349e8c96af4d98c98fa1be5 100644 --- a/contrib/arc/mainElasticity.cpp +++ b/contrib/arc/mainElasticity.cpp @@ -3,13 +3,26 @@ #include "PView.h" #include "PViewData.h" #include "highlevel.h" -int main (int argc, char* argv[]){ +int main (int argc, char* argv[]) +{ if (argc != 2){ printf("usage : elasticity input_file_name\n"); return -1; } + + + FormBilinear<TermBilinearMeca> f; + f.func(); + f.func2(); + + + FormBilinear<TermBilinearMecaNL> fnl; + fnl.func(); + fnl.func2(); + + // globals are still present in Gmsh GmshInitialize(argc, argv);