Salome HOME
building the version 1.4.0 of the module: update in the main trunk just
[modules/med.git] / src / MEDMEM / INTERPOLATION / MEDMEM_InterpolationHighLevelObjects.hxx.old
1 #ifndef MEDMEM_INTERPOLATION_HIGHLEVEL_OBJECTS_HXX
2
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"
11
12 // DECLARATIONS
13
14 template <int DIMENSION> class Meta_dTree : public dTree<Wrapper_Noeud<DIMENSION>,Wrapper_Nuage_Noeud<DIMENSION>,DIMENSION>
15 {
16 protected :
17         Wrapper_Nuage_Noeud<DIMENSION> * nuagetmp;
18 public :
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);
22 };
23
24 class Meta_Nuage_Maille : public Wrapper_Nuage_Maille<Wrapper_Med_Connectivity>
25 {
26 protected :
27         Wrapper_Med_Connectivity * connectivite_med;
28 public :
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;}
32 };
33
34
35 typedef Wrapper_Maillage<Meta_Nuage_Maille> Meta_Maillage;
36
37 template <int DIMENSION> class Meta_Mapping : public Mapping<Meta_Maillage,Meta_Nuage_Maille,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,DIMENSION>
38 {
39 protected : 
40         Wrapper_Nuage_Noeud<DIMENSION> * wrapping_nuage_source;
41         Wrapper_Nuage_Noeud<DIMENSION> * wrapping_nuage_cible;
42 public :
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);
47 };
48
49 // CODE
50
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))
54         {
55         }
56
57 template <int DIMENSION> inline int Meta_dTree<DIMENSION>::trouve_plus_proche_point(double *node)
58         {
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));
62         }
63         
64 //*     
65 Meta_Nuage_Maille::Meta_Nuage_Maille(CONNECTIVITY * conmed):Wrapper_Nuage_Maille<Wrapper_Med_Connectivity>(connectivite_med=new Wrapper_Med_Connectivity(conmed))
66         {
67         }
68 //*/
69
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>
72 (mb,
73 wrapping_nuage_source=new Wrapper_Nuage_Noeud<DIMENSION>(ns,noeudssource),
74 wrapping_nuage_cible=new Wrapper_Nuage_Noeud<DIMENSION>(nc,noeudscible))
75         {
76         }
77
78 template <int DIMENSION> inline int Meta_Mapping<DIMENSION>::Trouve_Maille_Contenant_Noeud(double * node,int num_maille,int flag_convexe)
79         {
80         int interdit=num_maille;
81         int max_loop=100;
82         int nme=0;
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);
86         }
87 template <int DIMENSION> double Meta_Mapping<DIMENSION>::donne_valeur_interpolee_P1(double * node,vector<double> vals)
88         {
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);
92         int i;
93         int num_som;
94         for (i=0;i<valeurs.size();i++) 
95                 {
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];
99                 }
100         
101         return valeur_interpol;
102         }
103
104 #endif