1 #ifndef MEDMEM_INTERPOLATION_HIGHLEVEL_OBJECTS_HXX
3 #define MEDMEM_INTERPOLATION_HIGHLEVEL_OBJECTS_HXX
4 #include "MEDMEM_Connectivity.hxx"
5 #include "MEDMEM_WrapperConnectivity.hxx"
6 #include "MEDMEM_dTree.hxx"
7 #include "MEDMEM_WrapperNodes.hxx"
8 #include "MEDMEM_WrapperMesh.hxx"
9 #include "MEDMEM_WrapperCells.hxx"
10 #include "MEDMEM_Mapping.hxx"
14 template <int DIMENSION> class Meta_dTree : public dTree<Wrapper_Noeud<DIMENSION>,Wrapper_Nuage_Noeud<DIMENSION>,DIMENSION>
17 Wrapper_Nuage_Noeud<DIMENSION> * nuagetmp;
19 Meta_dTree(int nn,double * fullinterlace);
20 ~Meta_dTree() {if ((etat==DTREE_RACINE)&&(nuagetmp)) delete nuagetmp;}
21 inline int trouve_plus_proche_point(double *node);
24 class Meta_Nuage_Maille : public Wrapper_Nuage_Maille<Wrapper_Med_Connectivity>
27 Wrapper_Med_Connectivity * connectivite_med;
29 Meta_Nuage_Maille(CONNECTIVITY * connmed);
30 Meta_Nuage_Maille():Wrapper_Nuage_Maille<Wrapper_Med_Connectivity>(connectivite_med=new Wrapper_Med_Connectivity) {}
31 ~Meta_Nuage_Maille() {if (connectivite_med) delete connectivite_med;}
35 typedef Wrapper_Maillage<Meta_Nuage_Maille> Meta_Maillage;
37 template <int DIMENSION> class Meta_Mapping : public Mapping<Meta_Maillage,Meta_Nuage_Maille,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,DIMENSION>
40 Wrapper_Nuage_Noeud<DIMENSION> * wrapping_nuage_source;
41 Wrapper_Nuage_Noeud<DIMENSION> * wrapping_nuage_cible;
43 Meta_Mapping(Meta_Maillage * mb,double * noeudssource,int ns,double * noeudscible,int nc);
44 ~Meta_Mapping() {if (wrapping_nuage_source) delete wrapping_nuage_source;if (wrapping_nuage_cible) delete wrapping_nuage_cible;}
45 inline int Trouve_Maille_Contenant_Noeud(double * node,int num_maille, int flag_convexe=0);
46 double donne_valeur_interpolee_P1(double * node,vector<double> vals);
51 template <int DIMENSION> Meta_dTree<DIMENSION>::Meta_dTree(int nn,double * fullinterlace)
52 :dTree<Wrapper_Noeud<DIMENSION>,Wrapper_Nuage_Noeud<DIMENSION>,DIMENSION>
53 (nuagetmp=new Wrapper_Nuage_Noeud<DIMENSION>(nn,fullinterlace))
57 template <int DIMENSION> inline int Meta_dTree<DIMENSION>::trouve_plus_proche_point(double *node)
59 static Wrapper_Noeud<DIMENSION> nodetmp;
60 nodetmp.positionne(node);
61 return dTree<Wrapper_Noeud<DIMENSION>,Wrapper_Nuage_Noeud<DIMENSION>,DIMENSION>::trouve_plus_proche_point(Wrapper_Noeud<DIMENSION>(nodetmp));
65 Meta_Nuage_Maille::Meta_Nuage_Maille(CONNECTIVITY * conmed):Wrapper_Nuage_Maille<Wrapper_Med_Connectivity>(connectivite_med=new Wrapper_Med_Connectivity(conmed))
70 template <int DIMENSION> Meta_Mapping<DIMENSION>::Meta_Mapping(Meta_Maillage * mb,double * noeudssource,int ns,double * noeudscible,int nc)
71 :Mapping<Meta_Maillage,Meta_Nuage_Maille,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,DIMENSION>
73 wrapping_nuage_source=new Wrapper_Nuage_Noeud<DIMENSION>(ns,noeudssource),
74 wrapping_nuage_cible=new Wrapper_Nuage_Noeud<DIMENSION>(nc,noeudscible))
78 template <int DIMENSION> inline int Meta_Mapping<DIMENSION>::Trouve_Maille_Contenant_Noeud(double * node,int num_maille,int flag_convexe)
80 int interdit=num_maille;
83 static Wrapper_Noeud<DIMENSION> nodetmp;
84 nodetmp.positionne(node);
85 return Mapping<Meta_Maillage,Meta_Nuage_Maille,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,DIMENSION>::Trouve_Maille_Contenant_Point_Mth_Co(nodetmp,num_maille,interdit,max_loop,nme,flag_convexe);
87 template <int DIMENSION> double Meta_Mapping<DIMENSION>::donne_valeur_interpolee_P1(double * node,vector<double> vals)
89 int num_maille_contenant=Trouve_Maille_Contenant_Noeud(node,0);
90 double valeur_interpol=0;
91 vector<double> valeurs=CB->Calcule_Coord_Baryc(num_maille_contenant,node);
94 for (i=0;i<valeurs.size();i++)
96 cout<<"Lambda(M):"<<i<<" = "<<valeurs[i]<<endl;
97 num_som=mailles_back->DONNE_SOMMET_MAILLE(num_maille_contenant,i);
98 valeur_interpol+=vals[num_som]*valeurs[i];
101 return valeur_interpol;