15#include <distances_EF.h>
19double norm_3D_vit1(
const DoubleTab& vit,
int fac,
int num1,
21 double& val1,
double& val2,
double& val3)
23 const DoubleTab& face_normale = domaine.face_normales();
26 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
27 int nsom = domaine.nb_som_face();
28 ArrOfDouble vit_face(3);
30 for(
int comp=0; comp<3; comp++)
32 for(
int jsom=0; jsom<nsom; jsom++)
34 int num_som = domaine.face_sommets(num1, jsom);
35 vit_face[comp]+=vit(num_som,comp);
38 double v1=vit_face[0]/nsom;
39 double v2=vit_face[1]/nsom;
40 double v3=vit_face[2]/nsom;
41 double norm_vit = vitesse_tangentielle(v1,v2,v3,r0,r1,r2);
43 double psc = r0*v1+r1*v2+r2*v3;
45 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
46 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
47 val3=(v3-psc*r2)/(norm_vit+DMINFLOAT);
52double norm_2D_vit1_k(
const DoubleTab& vit,
int fac,
int num1,
54 double& val1,
double& val2)
56 const DoubleTab& face_normale = domaine.face_normales();
59 calcule_r0r1(face_normale,fac,r0,r1);
60 int nsom = domaine.nb_som_face();
61 ArrOfDouble vit_face(2);
63 for(
int comp=0; comp<2; comp++)
65 for(
int jsom=0; jsom<nsom; jsom++)
67 int num_som = domaine.face_sommets(num1, jsom);
68 vit_face[comp]+=vit(num_som,comp);
71 double v1=vit_face[0]/nsom;
72 double v2=vit_face[1]/nsom;
73 double norm_vit = vitesse_tangentielle(v1,v2,r0,r1);
75 double psc = r0*v1+r1*v2;
78 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
79 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
84double norm_3D_vit2(
const DoubleTab& vit,
int fac,
int num1,
86 double& val1,
double& val2,
double& val3)
88 const DoubleTab& face_normale = domaine.face_normales();
91 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
93 int nsom = domaine.nb_som_face();
94 ArrOfDouble vit_face(3);
95 ArrOfDouble vit_face2(3);
98 for(
int comp=0; comp<3; comp++)
100 for(
int jsom=0; jsom<nsom; jsom++)
102 int num_som = domaine.face_sommets(num1, jsom);
103 vit_face[comp]+=vit(num_som,comp);
104 int num_som2 = domaine.face_sommets(fac, jsom);
105 vit_face2[comp]+=vit(num_som2,comp);
108 double v1=(vit_face[0]-vit_face2[0])/nsom;
109 double v2=(vit_face[1]-vit_face2[1])/nsom;
110 double v3=(vit_face[2]-vit_face2[2])/nsom;
111 double norm_vit = vitesse_tangentielle(v1,v2,v3,r0,r1,r2);
113 double psc = r0*v1+r1*v2+r2*v3;
114 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
115 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
116 val3=(v3-psc*r2)/(norm_vit+DMINFLOAT);
121double norm_2D_vit2_k(
const DoubleTab& vit,
int fac,
int num1,
123 double& val1,
double& val2)
125 const DoubleTab& face_normale = domaine.face_normales();
128 calcule_r0r1(face_normale,fac,r0,r1);
130 int nsom = domaine.nb_som_face();
131 ArrOfDouble vit_face(2);
132 ArrOfDouble vit_face2(2);
135 for(
int comp=0; comp<2; comp++)
137 for(
int jsom=0; jsom<nsom; jsom++)
139 int num_som = domaine.face_sommets(num1, jsom);
140 vit_face[comp]+=vit(num_som,comp);
141 int num_som2 = domaine.face_sommets(fac, jsom);
142 vit_face2[comp]+=vit(num_som2,comp);
145 double v1=(vit_face[0]-vit_face2[0])/nsom;
146 double v2=(vit_face[1]-vit_face2[1])/nsom;
147 double norm_vit = vitesse_tangentielle(v1,v2,r0,r1);
149 double psc = r0*v1+r1*v2;
150 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
151 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
156double distance_2D(
int fac,
int elem,
const Domaine_EF& domaine)
158 const DoubleTab& xp = domaine.xp();
159 const DoubleTab& xv = domaine.xv();
161 const DoubleTab& face_normale = domaine.face_normales();
163 calcule_r0r1(face_normale,fac,r0,r1);
167 double x1=xp(elem,0);
168 double y1=xp(elem,1);
170 return fabs(r0*(x1-x0)+r1*(y1-y0));
173double distance_3D(
int fac,
int elem,
const Domaine_EF& domaine)
175 const DoubleTab& xp = domaine.xp();
176 const DoubleTab& xv = domaine.xv();
177 const DoubleTab& face_normale = domaine.face_normales();
179 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
183 double x1=xp(elem,0);
184 double y1=xp(elem,1);
185 double z1=xp(elem,2);
187 return fabs(r0*(x1-x0)+r1*(y1-y0)+r2*(z1-z0));
190double norm_vit_lp(
const ArrOfDouble& vit,
int face,
const Domaine_EF& domaine,ArrOfDouble& val)
193 const DoubleTab& face_normale = domaine.face_normales();
198 for(
int i=0; i<dim; i++) r[i]=face_normale(face,i);
201 psc = dotproduct_array(r,vit);
203 if(dim==3) norm_vit = vitesse_tangentielle(vit[0],vit[1],vit[2],r[0],r[1],r[2]);
204 else norm_vit = vitesse_tangentielle(vit[0],vit[1],r[0],r[1]);
206 for(
int i=0; i<dim; i++) val[i]=(vit[i]-psc*r[i])/(norm_vit+DMINFLOAT);
211double norm_vit_lp_k(
const DoubleTab& vit,
int face,
int face_b,
const Domaine_EF& domaine,ArrOfDouble& val,
int is_defilante)
217 return norm_3D_vit1(vit,face_b,face,domaine,val[0],val[1],val[2]);
219 return norm_2D_vit1_k(vit,face_b,face,domaine,val[0],val[1]);
224 return norm_3D_vit2(vit,face_b,face,domaine,val[0],val[1],val[2]);
226 return norm_2D_vit2_k(vit,face_b,face,domaine,val[0],val[1]);
230double distance_face_elem(
int fac,
int elem,
const Domaine_EF& domaine)
234 return distance_3D(fac,elem,domaine);
236 return distance_2D(fac,elem,domaine);