src/INTERPOLATION/MEDMEM_InterpolationTools.hxx

Go to the documentation of this file.
00001 // Copyright (C) 2005  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00002 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00003 // 
00004 // This library is free software; you can redistribute it and/or
00005 // modify it under the terms of the GNU Lesser General Public
00006 // License as published by the Free Software Foundation; either 
00007 // version 2.1 of the License.
00008 // 
00009 // This library is distributed in the hope that it will be useful 
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
00012 // Lesser General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU Lesser General Public  
00015 // License along with this library; if not, write to the Free Software 
00016 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00017 //
00018 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00019 //
00020 #ifndef MEDMEM_INTERPOLATION_TOOLS_HXX
00021 #define MEDMEM_INTERPOLATION_TOOLS_HXX
00022 
00023 #include "MEDMEM_define.hxx"
00024 
00025 #define _TEMPLATE_ template <class CHAMP,class VALEURCHAMP,class NUAGENOEUD, class NOEUD, class NUAGEMAILLE>
00026 #define _PARAM_ CHAMP,VALEURCHAMP,NUAGENOEUD,NOEUD,NUAGEMAILLE
00027 
00028 // ces macros définissent pour une face carrée plane la fonction projection sur cette face, non normalisée, la numérotation est dans le cas d'un hexaedre
00029 #define   face2367(x,y,z) ((x6*(-y2 + y3) + x3*(y2 - y6) + x2*(-y3 + y6))*z - x6*y3*z2 + x3*y6*z2 + x6*y2*z3 - x2*y6*z3 - x3*y2*z6 + x2*y3*z6 + y*(x6*(z2 - z3) + x2*(z3 - z6) + x3*(-z2 + z6)) + x*(y6*(-z2 + z3) + y3*(z2 - z6) + y2*(-z3 + z6)))
00030 #define   face4567(x,y,z) ((x6*(-y4 + y5) + x5*(y4 - y6) + x4*(-y5 + y6))*z - x6*y5*z4 + x5*y6*z4 + x6*y4*z5 - x4*y6*z5 - x5*y4*z6 + x4*y5*z6 + y*(x6*(z4 - z5) + x4*(z5 - z6) + x5*(-z4 + z6)) + x*(y6*(-z4 + z5) + y5*(z4 - z6) + y4*(-z5 + z6)))
00031 #define   face1256(x,y,z) ((x5*(-y1 + y2) + x2*(y1 - y5) + x1*(-y2 + y5))*z - x5*y2*z1 + x2*y5*z1 + x5*y1*z2 - x1*y5*z2 - x2*y1*z5 + x1*y2*z5 + y*(x5*(z1 - z2) + x1*(z2 - z5) + x2*(-z1 + z5)) + x*(y5*(-z1 + z2) + y2*(z1 - z5) + y1*(-z2 + z5)))
00032 #define   face0347(x,y,z) ((x4*(-y0 + y3) + x3*(y0 - y4) + x0*(-y3 + y4))*z - x4*y3*z0 + x3*y4*z0 + x4*y0*z3 - x0*y4*z3 - x3*y0*z4 + x0*y3*z4 + y*(x4*(z0 - z3) + x0*(z3 - z4) + x3*(-z0 + z4)) + x*(y4*(-z0 + z3) + y3*(z0 - z4) + y0*(-z3 + z4)))
00033 #define   face0145(x,y,z) ((x4*(-y0 + y1) + x1*(y0 - y4) + x0*(-y1 + y4))*z - x4*y1*z0 + x1*y4*z0 + x4*y0*z1 - x0*y4*z1 - x1*y0*z4 + x0*y1*z4 + y*(x4*(z0 - z1) + x0*(z1 - z4) + x1*(-z0 + z4)) + x*(y4*(-z0 + z1) + y1*(z0 - z4) + y0*(-z1 + z4)))
00034 #define   face0123(x,y,z) ((x2*(-y0 + y1) + x1*(y0 - y2) + x0*(-y1 + y2))*z - x2*y1*z0 + x1*y2*z0 + x2*y0*z1 - x0*y2*z1 - x1*y0*z2 + x0*y1*z2 + y*(x2*(z0 - z1) + x0*(z1 - z2) + x1*(-z0 + z2)) + x*(y2*(-z0 + z1) + y1*(z0 - z2) + y0*(-z1 + z2)))
00035 // des macros définissent pour une face triangulaire orientée vers l'extérieur de la maille la fonction de projection, non normalisée ( =(12^13).1M )
00036 #define face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x,y,z)  ( ((y2-y1)*(z3-z1)-(z2-z1)*(y3-y1))*(x-x1)+((z2-z1)*(x3-x1)-(x2-x1)*(z3-z1))*(y-y1)+((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1))*(z-z1) )
00037 #define projection(x1,y1,z1,x2,y2,z2,x3,y3,z3,x0,y0,z0,x,y,z) (face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x,y,z)/face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x0,y0,z0))
00038 
00039 // DECLARATION
00040 
00041 _TEMPLATE_ class Calcul_Interpolation
00042 {
00043 protected :
00044      NUAGENOEUD * noeuds;
00045      NUAGEMAILLE * mailles;
00046      CHAMP * champ;
00047 public : 
00048      Calcul_Interpolation():noeuds(NULL),mailles(NULL),champ(NULL) {}
00049      Calcul_Interpolation(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):noeuds(nn),mailles(nm),champ(c) {}
00050      ~Calcul_Interpolation() {}
00051      virtual VALEURCHAMP operator() (const NOEUD & n, int num_maille) {cerr<<"APPEL OPERATOR() DE LA CLASSE MERE CALCUL_INTERPOLATION => EXIT(-1)"<<endl;exit(-1);}
00052 };
00053 
00054 _TEMPLATE_ class Calcul_Interpolation_P0;
00055 
00056 _TEMPLATE_ class Calcul_Interpolation_Tria3;
00057 _TEMPLATE_ class Calcul_Interpolation_Tria6;
00058 _TEMPLATE_ class Calcul_Interpolation_Quad4;
00059 _TEMPLATE_ class Calcul_Interpolation_Quad8;
00060 _TEMPLATE_ class Calcul_Interpolation_Tetra4;
00061 _TEMPLATE_ class Calcul_Interpolation_Tetra10;
00062 _TEMPLATE_ class Calcul_Interpolation_Hexa8;
00063 _TEMPLATE_ class Calcul_Interpolation_Hexa20;
00064 _TEMPLATE_ class Calcul_Interpolation_Penta6;
00065 _TEMPLATE_ class Calcul_Interpolation_Penta15;
00066 _TEMPLATE_ class Calcul_Interpolation_Pyra5;
00067 _TEMPLATE_ class Calcul_Interpolation_Pyra13;
00068 
00069 _TEMPLATE_ class Calcul_Hybride
00070 {
00071 protected :
00072      NUAGEMAILLE * mailles;
00073      map<int,Calcul_Interpolation<_PARAM_> *> fonctions;
00074 public : 
00075      Calcul_Hybride():mailles(NULL) {}
00076      Calcul_Hybride(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c);
00077      ~Calcul_Hybride() {}
00078      VALEURCHAMP operator() (const NOEUD & n, int num_maille);
00079 };
00080 
00081 //CODE
00082 
00083 _TEMPLATE_ Calcul_Hybride<_PARAM_>::Calcul_Hybride(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):mailles(nm)
00084      {
00085      fonctions[ MED_EN::MED_TRIA3  ]=new Calcul_Interpolation_Tria3  <_PARAM_>(nn,nm,c);
00086      fonctions[ MED_EN::MED_TRIA6  ]=new Calcul_Interpolation_Tria6  <_PARAM_>(nn,nm,c);
00087      fonctions[ MED_EN::MED_QUAD4  ]=new Calcul_Interpolation_Quad4  <_PARAM_>(nn,nm,c);
00088      fonctions[ MED_EN::MED_QUAD8  ]=new Calcul_Interpolation_Quad8  <_PARAM_>(nn,nm,c);
00089      fonctions[ MED_EN::MED_TETRA4 ]=new Calcul_Interpolation_Tetra4 <_PARAM_>(nn,nm,c);
00090      fonctions[ MED_EN::MED_TETRA10]=new Calcul_Interpolation_Tetra10<_PARAM_>(nn,nm,c);
00091      fonctions[ MED_EN::MED_HEXA8  ]=new Calcul_Interpolation_Hexa8  <_PARAM_>(nn,nm,c);
00092      fonctions[ MED_EN::MED_HEXA20 ]=new Calcul_Interpolation_Hexa20 <_PARAM_>(nn,nm,c);
00093      fonctions[ MED_EN::MED_PENTA6 ]=new Calcul_Interpolation_Penta6 <_PARAM_>(nn,nm,c);
00094      fonctions[ MED_EN::MED_PENTA15]=new Calcul_Interpolation_Penta15<_PARAM_>(nn,nm,c);
00095      fonctions[ MED_EN::MED_PYRA5  ]=new Calcul_Interpolation_Pyra5  <_PARAM_>(nn,nm,c);
00096      fonctions[ MED_EN::MED_PYRA13 ]=new Calcul_Interpolation_Pyra13 <_PARAM_>(nn,nm,c);
00097      }
00098 
00099 _TEMPLATE_ VALEURCHAMP Calcul_Hybride<_PARAM_>::operator() (const NOEUD & n, int num_maille)
00100      {
00101      return fonctions[(*mailles)[num_maille].DONNE_TYPE_MED_MAILLE()]->operator()(n,num_maille);
00102      }
00103 
00104 _TEMPLATE_ class Calcul_Interpolation_P0      : public Calcul_Interpolation<_PARAM_>
00105 {
00106 public : Calcul_Interpolation_P0(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00107 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00108      {
00109      return (*Calcul_Interpolation<_PARAM_>::champ)[num_maille];
00110      }
00111 };
00112 _TEMPLATE_ class Calcul_Interpolation_Tria3   : public Calcul_Interpolation<_PARAM_>
00113 {
00114 public : Calcul_Interpolation_Tria3(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00115 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00116      {
00117      int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
00118      int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
00119      int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
00120      
00121      double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];
00122      double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];
00123      double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];
00124      double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];
00125      double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];
00126      double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];
00127      
00128      VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
00129      VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
00130      VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
00131      
00132      double x=n[0];
00133      double y=n[1];
00134      
00135      double lambda0=(y1-y2)*x+(x2-x1)*y+(x1*y2-x2*y1);
00136      double lambda1=(y2-y0)*x+(x0-x2)*y+(x2*y0-x0*y2);
00137      double lambda2=(y0-y1)*x+(x1-x0)*y+(x0*y1-x1*y0);
00138      
00139      double delta = (x2-x1)*y0+(x0-x2)*y1+(x1-x0)*y2;
00140      
00141      VALEURCHAMP retour(v0.SIZE());
00142                
00143      retour=(1/delta)*(lambda0*v0+lambda1*v1+lambda2*v2);
00144      
00145      return retour; //
00146      }
00147 };
00148 _TEMPLATE_ class Calcul_Interpolation_Tria6   : public Calcul_Interpolation<_PARAM_>
00149 {
00150 public : Calcul_Interpolation_Tria6(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00151 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00152      {
00153      // ON SUPPOSE IMPLICITEMENT QUE LES NOEUDS SUPPLEMENTAIRES SONT BIEN DES NOEUDS MILIEUX
00154      int num0 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
00155      int num1 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
00156      int num2 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
00157      int num01=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
00158      int num12=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][4];
00159      int num20=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][5];
00160      
00161      double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];
00162      double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];
00163      double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];
00164      double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];
00165      double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];
00166      double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];
00167      
00168      VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
00169      VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
00170      VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
00171      VALEURCHAMP v01=(*Calcul_Interpolation<_PARAM_>::champ)[num01];
00172      VALEURCHAMP v12=(*Calcul_Interpolation<_PARAM_>::champ)[num12];
00173      VALEURCHAMP v20=(*Calcul_Interpolation<_PARAM_>::champ)[num20];
00174      
00175      double x=n[0];
00176      double y=n[1];
00177      
00178      double lambda0=(y1-y2)*x+(x2-x1)*y+(x1*y2-x2*y1);
00179      double lambda1=(y2-y0)*x+(x0-x2)*y+(x2*y0-x0*y2);
00180      double lambda2=(y0-y1)*x+(x1-x0)*y+(x0*y1-x1*y0);
00181      
00182      double delta = (x2-x1)*y0+(x0-x2)*y1+(x1-x0)*y2;
00183 
00184 
00185      // VALEURCHAMP retour(v0.SIZE()); //         
00186 
00187      return  2*(lambda0*lambda0*v0+
00188                 lambda1*lambda1*v1+
00189                 lambda2*lambda2*v2+
00190                 2*(lambda0*lambda1*v01+
00191                    lambda1*lambda2*v12+
00192                    lambda2*lambda0*v20))/(delta*delta)+
00193              (lambda0*v0+lambda1*v1+lambda2*v2)/(-delta);
00194 
00195      // return retour; //
00196      }
00197 };
00198 _TEMPLATE_ class Calcul_Interpolation_Quad4   : public Calcul_Interpolation<_PARAM_>
00199 {
00200 public : Calcul_Interpolation_Quad4(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00201 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00202      {
00203      int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
00204      int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
00205      int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
00206      int num3=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
00207      
00208      double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];
00209      double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];
00210      double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];
00211      double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];
00212      double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];
00213      double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];
00214      double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];
00215      double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];
00216      
00217      VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
00218      VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
00219      VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
00220      VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];
00221      
00222      double x=n[0];
00223      double y=n[1];
00224      
00225      
00226      double mu0=-((x3*(y1-y2)+x1*(y2-y3)+x2*(y3-y1))*x*y+(x2*y2*(y1-y3)+x3*(-y1+y2)*y3+x1*y1*(y3-y2))*x+(x2*x3*(y2-y3)+x1*(x2*(y1-y2)+x3*(y3-y1)))*y+(x2*x3*y1*(y3-y2)+x1*(x3*y2*(y1-y3)+x2*(y2-y1)*y3)));
00227      double mu1=(x0*(y2-y3)+x2*(y3-y0)+x3*(y0-y2))*x*y+(x3*y3*(y2-y0)+x0*(-y2+y3)*y0+x2*y2*(y0-y3))*x+(x3*x0*(y3-y0)+x2*(x3*(y2-y3)+x0*(y0-y2)))*y+(x2*x0*y2*(y0-y2)+x2*(x0*y2*(y2-y0)+x3*(y3-y2)*y0));
00228      double mu2=-((x1*(y3-y0)+x3*(y0-y1)+x0*(y1-y3))*x*y+(x0*y0*(y3-y1)+x1*(-y3+y0)*y1+x3*y3*(y1-y0))*x+(x0*x1*(y0-y1)+x3*(x0*(y3-y0)+x1*(y1-y3)))*y+(x3*x1*y3*(y1-y2)+x3*(x1*y2*(y3-y1)+x0*(y0-y3)*y1)));
00229      double mu3=(x2*(y0-y1)+x0*(y1-y2)+x1*(y2-y0))*x*y+(x1*y1*(y0-y2)+x2*(-y0+y1)*y2+x0*y0*(y2-y1))*x+(x1*x2*(y1-y2)+x0*(x1*(y0-y1)+x2*(y2-y0)))*y+(x0*x2*y0*(y2-y2)+x0*(x2*y2*(y0-y2)+x1*(y1-y0)*y2));
00230      
00231      double delta=(y0-y2)*(y1-y3)*(x0*x2+x1*x3)-(x1*x2+x0*x3)*(y1-y2)*(y0-y3)-(x0*x1+x2*x3)*(y0-y1)*(y2-y3);
00232 
00233      /*
00234      cout<<"  ### Pour ( "<<x<<" , "<<y<<" )"<<endl;
00235      cout<<"  ### delta = "<<delta<<endl;
00236      cout<<"  ### Mu0 = "<<mu0<<endl;
00237      cout<<"  ### Mu1 = "<<mu1<<endl;
00238      cout<<"  ### Mu2 = "<<mu2<<endl;
00239      cout<<"  ### Mu3 = "<<mu3<<endl;
00240      */
00241      VALEURCHAMP retour(v0.SIZE()); //       
00242 
00243      retour=(mu0*v0+mu1*v1+mu2*v2+mu3*v3)/delta;
00244 
00245      return retour; //
00246      }
00247 };
00248 _TEMPLATE_ class Calcul_Interpolation_Quad8   : public Calcul_Interpolation<_PARAM_>
00249 {
00250 public : Calcul_Interpolation_Quad8(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00251 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00252      {
00253      cerr<<"Interpolation Q2 pas encore implémentée"<<endl;
00254      exit(-1);
00255      }
00256 };
00257 _TEMPLATE_ class Calcul_Interpolation_Tetra4  : public Calcul_Interpolation<_PARAM_>
00258 {
00259 public : Calcul_Interpolation_Tetra4(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00260 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00261      {
00262      int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
00263      int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
00264      int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
00265      int num3=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
00266      
00267      double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];
00268      double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];
00269      double z0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][2];
00270      double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];
00271      double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];
00272      double z1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][2];
00273      double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];
00274      double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];
00275      double z2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][2];
00276      double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];
00277      double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];
00278      double z3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][2];
00279      
00280      VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
00281      VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
00282      VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
00283      VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];
00284      
00285      double x=n[0];
00286      double y=n[1];
00287      double z=n[2];
00288      
00289      double lambda0=face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x,y,z)/face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x0,y0,z0);
00290      double lambda1=face(x0,y0,z0,x2,y2,z2,x3,y3,z3,x,y,z)/face(x0,y0,z0,x2,y2,z2,x3,y3,z3,x1,y1,z1);
00291      double lambda2=face(x1,y1,z1,x0,y0,z0,x3,y3,z3,x,y,z)/face(x1,y1,z1,x0,y0,z0,x3,y3,z3,x2,y2,z2);
00292      double lambda3=face(x1,y1,z1,x2,y2,z2,x0,y0,z0,x,y,z)/face(x1,y1,z1,x2,y2,z2,x0,y0,z0,x3,y3,z3);
00293      
00294      VALEURCHAMP retour(v0.SIZE()); //       
00295 
00296      retour=(lambda0*v0+lambda1*v1+lambda2*v2+lambda3*v3);
00297 
00298      return retour; //
00299      }
00300 };
00301 _TEMPLATE_ class Calcul_Interpolation_Tetra10 : public Calcul_Interpolation<_PARAM_>
00302 {
00303 public : Calcul_Interpolation_Tetra10(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00304 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00305      {
00306      // ON SUPPOSE IMPLICITEMENT QUE LES NOEUDS SUPPLEMENTAIRES SONT BIEN DES NOEUDS MILIEUX
00307      int num0 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
00308      int num1 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
00309      int num2 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
00310      int num3 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
00311      int num01=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][4];
00312      int num02=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][6];
00313      int num03=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][7];
00314      int num12=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][5];
00315      int num13=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][8];
00316      int num23=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][9];
00317      
00318      double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];double z0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][2];
00319      double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];double z1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][2];
00320      double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];double z2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][2];
00321      double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];double z3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][2];
00322      
00323      VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];  
00324      VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];  
00325      VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];  
00326      VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];  
00327      VALEURCHAMP v01=(*Calcul_Interpolation<_PARAM_>::champ)[num01];
00328      VALEURCHAMP v02=(*Calcul_Interpolation<_PARAM_>::champ)[num02];
00329      VALEURCHAMP v03=(*Calcul_Interpolation<_PARAM_>::champ)[num03];
00330      VALEURCHAMP v12=(*Calcul_Interpolation<_PARAM_>::champ)[num12];
00331      VALEURCHAMP v13=(*Calcul_Interpolation<_PARAM_>::champ)[num13];
00332      VALEURCHAMP v23=(*Calcul_Interpolation<_PARAM_>::champ)[num23];
00333      
00334      double x=n[0];
00335      double y=n[1];
00336      double z=n[2];
00337      
00338      double lambda0=face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x,y,z)/face(x1,y1,z1,x2,y2,z2,x3,y3,z3,x0,y0,z0);
00339      double lambda1=face(x0,y0,z0,x2,y2,z2,x3,y3,z3,x,y,z)/face(x0,y0,z0,x2,y2,z2,x3,y3,z3,x1,y1,z1);
00340      double lambda2=face(x1,y1,z1,x0,y0,z0,x3,y3,z3,x,y,z)/face(x1,y1,z1,x0,y0,z0,x3,y3,z3,x2,y2,z2);
00341      double lambda3=face(x1,y1,z1,x2,y2,z2,x0,y0,z0,x,y,z)/face(x1,y1,z1,x2,y2,z2,x0,y0,z0,x3,y3,z3);
00342      
00343      /*
00344      cout<<"  ### Pour ( "<<x<<" , "<<y<<" , "<<z<<" )"<<endl;
00345      cout<<"  ### Lambda0 = "<<lambda0<<endl;
00346      cout<<"  ### Lambda1 = "<<lambda1<<endl;
00347      cout<<"  ### Lambda2 = "<<lambda2<<endl;
00348      cout<<"  ### Lambda3 = "<<lambda3<<endl;
00349      cout<<"  ### Controle = "<<(lambda0+lambda1+lambda2+lambda3)<<endl;
00350      */
00351 
00352      VALEURCHAMP retour(v0.SIZE()); //       
00353 
00354      retour=2*(lambda0*lambda0*v0+
00355                lambda1*lambda1*v1+
00356                lambda2*lambda2*v2+
00357                lambda3*lambda3*v3+
00358                2*(lambda0*lambda1*v01+
00359                   lambda0*lambda2*v02+
00360                   lambda0*lambda3*v03+
00361                   lambda1*lambda2*v12+
00362                   lambda1*lambda3*v13+
00363                   lambda2*lambda3*v23))+
00364             (-1.0)*(lambda0*v0+lambda1*v1+lambda2*v2+lambda3*v3);
00365 
00366      return retour; //
00367      }
00368 };
00369 _TEMPLATE_ class Calcul_Interpolation_Hexa8   : public Calcul_Interpolation<_PARAM_>
00370 {
00371 public : Calcul_Interpolation_Hexa8(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00372 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00373      {
00374      
00375      // Tres probablement numériquement mauvais, à revoir
00376      
00377      int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
00378      int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
00379      int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
00380      int num3=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
00381      int num4=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][4];
00382      int num5=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][5];
00383      int num6=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][6];
00384      int num7=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][7];
00385      
00386      
00387      double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];double z0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][2];
00388      double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];double z1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][2];
00389      double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];double z2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][2];
00390      double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];double z3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][2];
00391      double x4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][0];double y4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][1];double z4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][2];
00392      double x5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][0];double y5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][1];double z5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][2];
00393      double x6=(*Calcul_Interpolation<_PARAM_>::noeuds)[num6][0];double y6=(*Calcul_Interpolation<_PARAM_>::noeuds)[num6][1];double z6=(*Calcul_Interpolation<_PARAM_>::noeuds)[num6][2];
00394      double x7=(*Calcul_Interpolation<_PARAM_>::noeuds)[num7][0];double y7=(*Calcul_Interpolation<_PARAM_>::noeuds)[num7][1];double z7=(*Calcul_Interpolation<_PARAM_>::noeuds)[num7][2];
00395      
00396      
00397      VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
00398      VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
00399      VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
00400      VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];
00401      VALEURCHAMP v4=(*Calcul_Interpolation<_PARAM_>::champ)[num4];
00402      VALEURCHAMP v5=(*Calcul_Interpolation<_PARAM_>::champ)[num5];
00403      VALEURCHAMP v6=(*Calcul_Interpolation<_PARAM_>::champ)[num6];
00404      VALEURCHAMP v7=(*Calcul_Interpolation<_PARAM_>::champ)[num7];
00405 
00406      double x=n[0];
00407      double y=n[1];
00408      double z=n[2];
00409      
00410      // double mu0=face1256(x,y,z)*face2367(x,y,z)*face4567(x,y,z)/(face1256(x0,y0,z0)*face2367(x0,y0,z0)*face4567(x0,y0,z0));
00411      // double mu1=face0347(x,y,z)*face2367(x,y,z)*face4567(x,y,z)/(face0347(x1,y1,z1)*face2367(x1,y1,z1)*face4567(x1,y1,z1));
00412      // double mu2=face0347(x,y,z)*face0145(x,y,z)*face4567(x,y,z)/(face0347(x2,y2,z2)*face0145(x2,y2,z2)*face4567(x2,y2,z2));
00413      // double mu3=face1256(x,y,z)*face0145(x,y,z)*face4567(x,y,z)/(face1256(x3,y3,z3)*face0145(x3,y3,z3)*face4567(x3,y3,z3));
00414      // double mu4=face1256(x,y,z)*face2367(x,y,z)*face0123(x,y,z)/(face1256(x4,y4,z4)*face2367(x4,y4,z4)*face0123(x4,y4,z4));
00415      // double mu5=face0347(x,y,z)*face2367(x,y,z)*face0123(x,y,z)/(face0347(x5,y5,z5)*face2367(x5,y5,z5)*face0123(x5,y5,z5));
00416      // double mu6=face0347(x,y,z)*face0145(x,y,z)*face0123(x,y,z)/(face0347(x6,y6,z6)*face0145(x6,y6,z6)*face0123(x6,y6,z6));
00417      // double mu7=face1256(x,y,z)*face0145(x,y,z)*face0123(x,y,z)/(face1256(x7,y7,z7)*face0145(x7,y7,z7)*face0123(x7,y7,z7));
00418 
00419      double mu0=projection(x1,y1,z1,x2,y2,z2,x6,y6,z6,x0,y0,z0,x,y,z)*projection(x2,y2,z2,x3,y3,z3,x7,y7,z7,x0,y0,z0,x,y,z)*projection(x4,y4,z4,x5,y5,z5,x6,y6,z6,x0,y0,z0,x,y,z);
00420      double mu1=projection(x0,y0,z0,x3,y3,z3,x7,y7,z7,x1,y1,z1,x,y,z)*projection(x2,y2,z2,x3,y3,z3,x7,y7,z7,x1,y1,z1,x,y,z)*projection(x4,y4,z4,x5,y5,z5,x6,y6,z6,x1,y1,z1,x,y,z);
00421      double mu2=projection(x0,y0,z0,x3,y3,z3,x7,y7,z7,x2,y2,z2,x,y,z)*projection(x0,y0,z0,x1,y1,z1,x5,y5,z5,x2,y2,z2,x,y,z)*projection(x4,y4,z4,x5,y5,z5,x6,y6,z6,x2,y2,z2,x,y,z);
00422      double mu3=projection(x1,y1,z1,x2,y2,z2,x6,y6,z6,x3,y3,z3,x,y,z)*projection(x0,y0,z0,x1,y1,z1,x5,y5,z5,x3,y3,z3,x,y,z)*projection(x4,y4,z4,x6,y6,z6,x7,y7,z7,x3,y3,z3,x,y,z);
00423      double mu4=projection(x2,y2,z2,x6,y6,z6,x5,y5,z5,x4,y4,z4,x,y,z)*projection(x2,y2,z2,x3,y3,z3,x7,y7,z7,x4,y4,z4,x,y,z)*projection(x0,y0,z0,x1,y1,z1,x2,y2,z2,x4,y4,z4,x,y,z);
00424      double mu5=projection(x3,y3,z3,x7,y7,z7,x4,y4,z4,x5,y5,z5,x,y,z)*projection(x2,y2,z2,x3,y3,z3,x6,y6,z6,x5,y5,z5,x,y,z)*projection(x0,y0,z0,x1,y1,z1,x2,y2,z2,x5,y5,z5,x,y,z);
00425      double mu6=projection(x3,y3,z3,x7,y7,z7,x4,y4,z4,x6,y6,z6,x,y,z)*projection(x1,y1,z1,x5,y5,z5,x4,y4,z4,x6,y6,z6,x,y,z)*projection(x0,y0,z0,x1,y1,z1,x2,y2,z2,x6,y6,z6,x,y,z);
00426      double mu7=projection(x2,y2,z2,x6,y6,z6,x5,y5,z5,x7,y7,z7,x,y,z)*projection(x1,y1,z1,x5,y5,z5,x4,y4,z4,x7,y7,z7,x,y,z)*projection(x0,y0,z0,x1,y1,z1,x3,y3,z3,x7,y7,z7,x,y,z);
00427              
00428      VALEURCHAMP retour(v0.SIZE()); //       
00429 
00430      retour=(mu0*v0+mu1*v1+mu2*v2+mu3*v3+mu4*v4+mu5*v5+mu6*v6+mu7*v7);
00431 
00432      return retour; //
00433      }
00434 };
00435 _TEMPLATE_ class Calcul_Interpolation_Hexa20  : public Calcul_Interpolation<_PARAM_>
00436 {
00437 public : Calcul_Interpolation_Hexa20(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00438 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00439      {
00440      cerr<<"Interpolation H2 pasencore implémentée"<<endl;
00441      exit(-1);
00442      }
00443 };
00444 _TEMPLATE_ class Calcul_Interpolation_Penta6  : public Calcul_Interpolation<_PARAM_>
00445 {
00446 public : Calcul_Interpolation_Penta6(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00447 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00448      {
00449      int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
00450      int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
00451      int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
00452      int num3=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
00453      int num4=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][4];
00454      int num5=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][5];    
00455      
00456      double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];double z0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][2];
00457      double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];double z1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][2];
00458      double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];double z2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][2];
00459      double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];double z3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][2];
00460      double x4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][0];double y4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][1];double z4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][2];
00461      double x5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][0];double y5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][1];double z5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][2];     
00462      
00463      VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
00464      VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
00465      VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
00466      VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];
00467      VALEURCHAMP v4=(*Calcul_Interpolation<_PARAM_>::champ)[num4];
00468      VALEURCHAMP v5=(*Calcul_Interpolation<_PARAM_>::champ)[num5];
00469 
00470      double x=n[0];
00471      double y=n[1];
00472      double z=n[2];
00473      
00474      double mu0=face(x1,y1,z1,x2,y2,z2,x5,y5,z5,x,y,z)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x,y,z)/(face(x1,y1,z1,x2,y2,z2,x5,y5,z5,x0,y0,z0)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x0,y0,z0));
00475      double mu1=face(x0,y0,z0,x2,y2,z2,x5,y5,z5,x,y,z)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x,y,z)/(face(x0,y0,z0,x2,y2,z2,x5,y5,z5,x1,y1,z1)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x1,y1,z1));
00476      double mu2=face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x,y,z)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x,y,z)/(face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x2,y2,z2)*face(x3,y3,z3,x4,y4,z4,x5,y5,z5,x2,y2,z2));
00477      double mu3=face(x1,y1,z1,x2,y2,z2,x5,y5,z5,x,y,z)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x,y,z)/(face(x1,y1,z1,x2,y2,z2,x5,y5,z5,x3,y3,z3)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3));
00478      double mu4=face(x0,y0,z0,x2,y2,z2,x5,y5,z5,x,y,z)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x,y,z)/(face(x0,y0,z0,x2,y2,z2,x5,y5,z5,x4,y4,z4)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x4,y4,z4));
00479      double mu5=face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x,y,z)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x,y,z)/(face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x5,y5,z5)*face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x5,y5,z5));
00480 
00481      VALEURCHAMP retour(v0.SIZE()); //       
00482 
00483      retour=(mu0*v0+mu1*v1+mu2*v2+mu3*v3+mu4*v4+mu5*v5);
00484 
00485      return retour; //
00486      }
00487 };
00488 _TEMPLATE_ class Calcul_Interpolation_Penta15 : public Calcul_Interpolation<_PARAM_>
00489 {
00490 public : Calcul_Interpolation_Penta15(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00491 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00492      {
00493      cerr<<"Interpolation Pe2 pasencore implémentée"<<endl;
00494      exit(-1);
00495      }
00496 };
00497 _TEMPLATE_ class Calcul_Interpolation_Pyra5   : public Calcul_Interpolation<_PARAM_>
00498 {
00499 public : Calcul_Interpolation_Pyra5(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00500 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00501      {
00502      // NON TESTE
00503      int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
00504      int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
00505      int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
00506      int num3=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
00507      int num4=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][4];
00508      
00509      double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];double z0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][2];
00510      double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];double z1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][2];
00511      double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];double z2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][2];
00512      double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];double z3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][2];
00513      double x4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][0];double y4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][1];double z4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][2];
00514      
00515      VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
00516      VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
00517      VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
00518      VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];
00519      VALEURCHAMP v4=(*Calcul_Interpolation<_PARAM_>::champ)[num4];
00520 
00521      double x=n[0];
00522      double y=n[1];
00523      double z=n[2];
00524      
00525      double mu0=face(x1,y1,z1,x2,y2,z2,x4,y4,z4,x,y,z)*face(x2,y2,z2,x3,y3,z3,x4,y4,z4,x,y,z)/(face(x1,y1,z1,x2,y2,z2,x4,y4,z4,x0,y0,z0)*face(x2,y2,z2,x3,y3,z3,x4,y4,z4,x0,y0,z0));
00526      double mu1=face(x0,y0,z0,x3,y3,z3,x4,y4,z4,x,y,z)*face(x2,y2,z2,x3,y3,z3,x4,y4,z4,x,y,z)/(face(x0,y0,z0,x3,y3,z3,x4,y4,z4,x1,y1,z1)*face(x2,y2,z2,x3,y3,z3,x4,y4,z4,x1,y1,z1));
00527      double mu2=face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x,y,z)*face(x0,y0,z0,x3,y3,z3,x4,y4,z4,x,y,z)/(face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x2,y2,z2)*face(x0,y0,z0,x3,y3,z3,x4,y4,z4,x2,y2,z2));
00528      double mu3=face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x,y,z)*face(x1,y1,z1,x2,y2,z2,x4,y4,z4,x,y,z)/(face(x0,y0,z0,x1,y1,z1,x4,y4,z4,x3,y3,z3)*face(x1,y1,z1,x2,y2,z2,x4,y4,z4,x3,y3,z3));
00529      double mu4=face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x,y,z)/face(x0,y0,z0,x1,y1,z1,x2,y2,z2,x4,y4,z4);
00530 
00531      VALEURCHAMP retour(v0.SIZE()); //       
00532 
00533      retour=(mu0*v0+mu1*v1+mu2*v2+mu3*v3+mu4*v4);
00534 
00535      return retour; //
00536      }
00537 };
00538 _TEMPLATE_ class Calcul_Interpolation_Pyra13  : public Calcul_Interpolation<_PARAM_>
00539 {
00540 public : Calcul_Interpolation_Pyra13(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
00541 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
00542      {
00543      cerr<<"Interpolation Py2 pasencore implémentée"<<endl;
00544      exit(-1);
00545      }
00546 };
00547 
00548 #undef _TEMPLATE_ 
00549 #undef _PARAM_
00550 
00551 #endif