15#include <distances_VEF.h>
20double norm_2D_vit1(
const DoubleTab& vit,
int num1,
int num2,
int fac,
const Domaine_VEF& domaine,
double& u)
22 const DoubleTab& face_normale = domaine.face_normales();
23 const Domaine& domaine_geom = domaine.domaine();
28 calcule_r0r1(face_normale,fac,r0,r1);
30 double v1=(vit(num1,0)+vit(num2,0))/nfac;
31 double v2=(vit(num1,1)+vit(num2,1))/nfac;
32 double v = vitesse_tangentielle(v1,v2,r0,r1);
41double norm_2D_vit1(
const DoubleTab& vit,
int num1,
int num2,
int fac,
const Domaine_VEF& domaine,
double& val1,
double& val2)
43 const DoubleTab& face_normale = domaine.face_normales();
44 const Domaine& domaine_geom = domaine.domaine();
49 calcule_r0r1(face_normale,fac,r0,r1);
51 double v1=(vit(num1,0)+vit(num2,0))/nfac;
52 double v2=(vit(num1,1)+vit(num2,1))/nfac;
53 double v = vitesse_tangentielle(v1,v2,r0,r1);
54 double psc = r0*v1+r1*v2;
57 val1=(v1-psc*r0)/(v+DMINFLOAT);
58 val2=(v2-psc*r1)/(v+DMINFLOAT);
64double norm_2D_vit1_lp(
const DoubleTab& vit,
int fac,
int num1,
int num2,
const Domaine_VEF& domaine,
double& val1,
double& val2)
70 const DoubleTab& face_normale = domaine.face_normales();
84 calcule_r0r1(face_normale,fac,r0,r1);
86 double v0=(c1*vit(num1,0)+c2*vit(num2,0))/(c1+c2);
87 double v1=(c1*vit(num1,1)+c2*vit(num2,1))/(c1+c2);
89 double psc = r0 * v0 + r1 * v1;
90 double norm_vit = vitesse_tangentielle(v0,v1,r0,r1);
92 val1 = (v0-psc*r0)/(norm_vit+DMINFLOAT);
93 val2 = (v1-psc*r1)/(norm_vit+DMINFLOAT);
99double norm_2D_vit1(
const DoubleTab& vit,
int num1,
int num2,
int num3,
int fac,
const Domaine_VEF& domaine,
double& u)
101 const DoubleTab& face_normale = domaine.face_normales();
102 const Domaine& domaine_geom = domaine.domaine();
107 calcule_r0r1(face_normale,fac,r0,r1);
108 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0))/nfac;
109 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1))/nfac;
110 double v = vitesse_tangentielle(v1,v2,r0,r1);
119double norm_2D_vit1(
const DoubleTab& vit,
int num1,
int num2,
int num3,
int num4,
int fac,
const Domaine_VEF& domaine,
double& u)
121 const DoubleTab& face_normale = domaine.face_normales();
122 const Domaine& domaine_geom = domaine.domaine();
127 calcule_r0r1(face_normale,fac,r0,r1);
128 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0)+vit(num4,0))/nfac;
129 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1)+vit(num4,1))/nfac;
130 double v = vitesse_tangentielle(v1,v2,r0,r1);
139double norm_2D_vit2(
const DoubleTab& vit,
int num1,
int num2,
int fac,
const Domaine_VEF& domaine,
double& u)
141 const DoubleTab& face_normale = domaine.face_normales();
142 const Domaine& domaine_geom = domaine.domaine();
146 calcule_r0r1(face_normale,fac,r0,r1);
147 double v1=(vit(num1,0)+vit(num2,0)-2.*vit(fac,0))/nfac;
148 double v2=(vit(num1,1)+vit(num2,1)-2.*vit(fac,1))/nfac;
149 double v = vitesse_tangentielle(v1,v2,r0,r1);
157double norm_2D_vit2(
const DoubleTab& vit,
int num1,
int num2,
int num3,
int fac,
const Domaine_VEF& domaine,
double& u)
159 const DoubleTab& face_normale = domaine.face_normales();
160 const Domaine& domaine_geom = domaine.domaine();
164 calcule_r0r1(face_normale,fac,r0,r1);
165 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0)-3.*vit(fac,0))/nfac;
166 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1)-3.*vit(fac,1))/nfac;
167 double v = vitesse_tangentielle(v1,v2,r0,r1);
175double norm_2D_vit2(
const DoubleTab& vit,
int num1,
int num2,
int num3,
int num4,
int fac,
const Domaine_VEF& domaine,
double& u)
177 const DoubleTab& face_normale = domaine.face_normales();
178 const Domaine& domaine_geom = domaine.domaine();
183 calcule_r0r1(face_normale,fac,r0,r1);
184 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0)+vit(num4,0)-4.*vit(fac,0))/nfac;
185 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1)+vit(num4,1)-4.*vit(fac,1))/nfac;
186 double v = vitesse_tangentielle(v1,v2,r0,r1);
195double distance_2D(
int fac,
int elem,
const Domaine_VEF& domaine)
197 const DoubleTab& xp = domaine.xp();
198 const DoubleTab& xv = domaine.xv();
200 const DoubleTab& face_normale = domaine.face_normales();
202 calcule_r0r1(face_normale,fac,r0,r1);
206 double x1=xp(elem,0);
207 double y1=xp(elem,1);
209 return std::fabs(r0*(x1-x0)+r1*(y1-y0));
213double norm_2D_vit1_k(
const DoubleTab& vit,
int fac,
int num1,
215 double& val1,
double& val2)
217 const DoubleTab& face_normale = domaine.face_normales();
220 calcule_r0r1(face_normale,fac,r0,r1);
221 double v1=vit(num1,0);
222 double v2=vit(num1,1);
223 double norm_vit = vitesse_tangentielle(v1,v2,r0,r1);
225 double psc = r0*v1+r1*v2;
228 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
229 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
235double norm_3D_vit1_k(
const DoubleTab& vit,
int fac,
int num1,
237 double& val1,
double& val2,
double& val3)
239 const DoubleTab& face_normale = domaine.face_normales();
242 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
243 double v1=vit(num1,0);
244 double v2=vit(num1,1);
245 double v3=vit(num1,2);
246 double norm_vit = vitesse_tangentielle(v1,v2,v3,r0,r1,r2);
248 double psc = r0*v1+r1*v2+r2*v3;
250 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
251 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
252 val3=(v3-psc*r2)/(norm_vit+DMINFLOAT);
258double norm_3D_vit1(
const DoubleTab& vit,
int fac,
int num1,
int num2,
int num3,
260 double& val1,
double& val2,
double& val3)
262 const DoubleTab& face_normale = domaine.face_normales();
263 const Domaine& domaine_geom = domaine.domaine();
267 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
268 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0))/nfac;
269 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1))/nfac;
270 double v3=(vit(num1,2)+vit(num2,2)+vit(num3,2))/nfac;
271 double norm_vit = vitesse_tangentielle(v1,v2,v3,r0,r1,r2);
273 double psc = r0*v1+r1*v2+r2*v3;
274 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
275 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
276 val3=(v3-psc*r2)/(norm_vit+DMINFLOAT);
281double norm_3D_vit1(
const DoubleTab& vit,
int fac,
int num1,
int num2,
int num3,
int num4,
283 double& val1,
double& val2,
double& val3)
285 const DoubleTab& face_normale = domaine.face_normales();
286 const Domaine& domaine_geom = domaine.domaine();
290 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
291 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0)+vit(num4,0))/nfac;
292 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1)+vit(num4,1))/nfac;
293 double v3=(vit(num1,2)+vit(num2,2)+vit(num3,2)+vit(num4,2))/nfac;
294 double norm_vit = vitesse_tangentielle(v1,v2,v3,r0,r1,r2);
296 double psc = r0*v1+r1*v2+r2*v3;
297 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
298 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
299 val3=(v3-psc*r2)/(norm_vit+DMINFLOAT);
302double norm_3D_vit1(
const DoubleTab& vit,
int fac,
int num1,
int num2,
int num3,
int num4,
304 double& val1,
double& val2,
double& val3)
306 const DoubleTab& face_normale = domaine.face_normales();
307 const Domaine& domaine_geom = domaine.domaine();
311 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
312 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0)+vit(num4,0)+vit(num5,0))/nfac;
313 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1)+vit(num4,1)+vit(num5,1))/nfac;
314 double v3=(vit(num1,2)+vit(num2,2)+vit(num3,2)+vit(num4,2)+vit(num5,2))/nfac;
315 double norm_vit = vitesse_tangentielle(v1,v2,v3,r0,r1,r2);
317 double psc = r0*v1+r1*v2+r2*v3;
318 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
319 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
320 val3=(v3-psc*r2)/(norm_vit+DMINFLOAT);
325double norm_2D_vit2_k(
const DoubleTab& vit,
int fac,
int num1,
327 double& val1,
double& val2)
329 const DoubleTab& face_normale = domaine.face_normales();
332 calcule_r0r1(face_normale,fac,r0,r1);
334 double v1=vit(num1,0)-vit(fac,0);
335 double v2=vit(num1,1)-vit(fac,1);
336 double norm_vit = vitesse_tangentielle(v1,v2,r0,r1);
338 double psc = r0*v1+r1*v2;
339 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
340 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
344double norm_3D_vit2_k(
const DoubleTab& vit,
int fac,
int num1,
346 double& val1,
double& val2,
double& val3)
348 const DoubleTab& face_normale = domaine.face_normales();
351 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
352 double v1=vit(num1,0)-vit(fac,0);
353 double v2=vit(num1,1)-vit(fac,1);
354 double v3=vit(num1,2)-vit(fac,2);
355 double norm_vit = vitesse_tangentielle(v1,v2,v3,r0,r1,r2);
357 double psc = r0*v1+r1*v2+r2*v3;
358 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
359 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
360 val3=(v3-psc*r2)/(norm_vit+DMINFLOAT);
365double norm_3D_vit2(
const DoubleTab& vit,
int fac,
int num1,
int num2,
int num3,
367 double& val1,
double& val2,
double& val3)
369 const DoubleTab& face_normale = domaine.face_normales();
370 const Domaine& domaine_geom = domaine.domaine();
374 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
375 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0)-(nfac-1)*vit(fac,0))/nfac;
376 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1)-(nfac-1)*vit(fac,1))/nfac;
377 double v3=(vit(num1,2)+vit(num2,2)+vit(num3,2)-(nfac-1)*vit(fac,2))/nfac;
378 double norm_vit = vitesse_tangentielle(v1,v2,v3,r0,r1,r2);
380 double psc = r0*v1+r1*v2+r2*v3;
381 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
382 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
383 val3=(v3-psc*r2)/(norm_vit+DMINFLOAT);
387double norm_3D_vit1_lp(
const DoubleTab& vit,
int fac,
int num1,
int num2,
int num3,
389 double& val1,
double& val2,
double& val3)
395 const DoubleTab& face_normale = domaine.face_normales();
414 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
415 double v0=(c1*vit(num1,0)+c2*vit(num2,0)+c3*vit(num3,0))/(c1+c2+c3);
416 double v1=(c1*vit(num1,1)+c2*vit(num2,1)+c3*vit(num3,1))/(c1+c2+c3);
417 double v2=(c1*vit(num1,2)+c2*vit(num2,2)+c3*vit(num3,2))/(c1+c2+c3);
419 double psc = r0 * v0 + r1 * v1 + r2 * v2;
420 double norm_vit = vitesse_tangentielle(v0,v1,v2,r0,r1,r2);
422 val1 = (v0-psc*r0)/(norm_vit+DMINFLOAT);
423 val2 = (v1-psc*r1)/(norm_vit+DMINFLOAT);
424 val3 = (v2-psc*r2)/(norm_vit+DMINFLOAT);
429double norm_3D_vit2(
const DoubleTab& vit,
int fac,
int num1,
int num2,
int num3,
int num4,
431 double& val1,
double& val2,
double& val3)
433 const DoubleTab& face_normale = domaine.face_normales();
434 const Domaine& domaine_geom = domaine.domaine();
438 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
440 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0)+vit(num4,0)-nfac*vit(fac,0))/nfac;
441 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1)+vit(num4,1)-nfac*vit(fac,1))/nfac;
442 double v3=(vit(num1,2)+vit(num2,2)+vit(num3,2)+vit(num4,2)-nfac*vit(fac,2))/nfac;
443 double norm_vit = vitesse_tangentielle(v1,v2,v3,r0,r1,r2);
445 double psc = r0*v1+r1*v2+r2*v3;
446 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
447 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
448 val3=(v3-psc*r2)/(norm_vit+DMINFLOAT);
452double norm_3D_vit2(
const DoubleTab& vit,
int fac,
int num1,
int num2,
int num3,
int num4,
454 double& val1,
double& val2,
double& val3)
456 const DoubleTab& face_normale = domaine.face_normales();
457 const Domaine& domaine_geom = domaine.domaine();
461 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
463 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0)+vit(num4,0)+vit(num5,0)-nfac*vit(fac,0))/nfac;
464 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1)+vit(num4,1)+vit(num5,1)-nfac*vit(fac,1))/nfac;
465 double v3=(vit(num1,2)+vit(num2,2)+vit(num3,2)+vit(num4,2)+vit(num5,2)-nfac*vit(fac,2))/nfac;
466 double norm_vit = vitesse_tangentielle(v1,v2,v3,r0,r1,r2);
468 double psc = r0*v1+r1*v2+r2*v3;
469 val1=(v1-psc*r0)/(norm_vit+DMINFLOAT);
470 val2=(v2-psc*r1)/(norm_vit+DMINFLOAT);
471 val3=(v3-psc*r2)/(norm_vit+DMINFLOAT);
477double distance_3D(
int fac,
int elem,
const Domaine_VEF& domaine)
479 const DoubleTab& xp = domaine.xp();
480 const DoubleTab& xv = domaine.xv();
481 const DoubleTab& face_normale = domaine.face_normales();
483 calcule_r0r1r2(face_normale,fac,r0,r1,r2);
487 double x1=xp(elem,0);
488 double y1=xp(elem,1);
489 double z1=xp(elem,2);
491 return std::fabs(r0*(x1-x0)+r1*(y1-y0)+r2*(z1-z0));
496DoubleVect& calcul_longueur_filtre(DoubleVect& longueur_filtre,
const Motcle& methode,
const Domaine_VEF& domaine)
498 int nbr_element=domaine.nb_elem_tot();
501 const Domaine& domaine_geom = domaine.domaine();
503 if (longueur_filtre.
size() != nbr_element)
505 Cerr <<
"erreur dans la taille du DoubleVect valeurs de la longueur du filtre" << finl;
509 if (methode ==
Motcle(
"volume") || methode ==
Motcle(
"volume_sans_lissage"))
513 const DoubleVect& volume = domaine.volumes();
514 for (element=0; element<nbr_element; element ++)
516 longueur_filtre(element) = exp(log(volume[element])/
double(dim));
519 else if (methode ==
Motcle(
"arete"))
523 const IntTab& les_sommets = domaine_geom.
les_elems();
524 int som1,som2,som_1,som_2;
527 for (element=0; element<nbr_element; element ++)
528 for (som1=0; som1<dim; som1++)
529 for (som2=som1; som2<dim+1; som2++)
531 som_1 = les_sommets(element, som1);
532 som_2 = les_sommets(element, som2);
534 distance = distance_sommets(som_1, som_2, domaine);
536 longueur_filtre(element) = std::max(longueur_filtre(element), distance);
539 else if (methode ==
Motcle(
"Scotti"))
543 const IntTab& les_sommets = domaine_geom.
les_elems();
544 int som0,som1,som2,som3;
545 int som_0,som_1,som_2,som_3;
549 int nbr_elementb=domaine.nb_elem_tot();
552 const DoubleVect& volume = domaine.volumes();
554 for (elementb=0; elementb<nbr_elementb; elementb ++)
556 longueur_filtre(elementb) = exp(log(volume[elementb])/
double(dim));
563 double dist_tot,dist_min,dist_max,dist_moy;
564 double a1,a2,f_scotti;
571 for (element=0; element<nbr_element; element ++)
573 som0 = les_sommets(element, 0);
574 som1 = les_sommets(element, 1);
575 som2 = les_sommets(element, 2);
576 som3 = les_sommets(element, 3);
578 psc[0] = som_pscal(som0,som1,som2,som3,domaine);
579 psc[1] = som_pscal(som1,som0,som2,som3,domaine);
580 psc[2] = som_pscal(som2,som0,som1,som3,domaine);
581 psc[3] = som_pscal(som3,som0,som1,som2,domaine);
583 const int indice_min = imin_array(psc);
613 dist[0]=distance_sommets(som_0,som_1,domaine);
614 dist[1]=distance_sommets(som_0,som_2,domaine);
615 dist[2]=distance_sommets(som_0,som_3,domaine);
617 dist_tot=dist[0]+dist[1]+dist[2];
619 dist_min=min_array(dist);
620 dist_max=max_array(dist);
621 dist_moy=dist_tot-dist_min-dist_max;
623 a1=dist_min/dist_max;
624 a2=dist_moy/dist_max;
626 f_scotti=cosh(sqrt((4./27.)*( log(a1)*log(a1) - log(a1)*log(a2) + log(a2)*log(a2) )));
628 longueur_filtre(element) = f_scotti * exp(log(dist_min*dist_max*dist_moy)/3.);
634 Cerr <<
"calcul_longueur_filtre.cpp n'a pas reconnu l'argument : " << methode << finl;
635 Cerr <<
"les arguments possibles sont : \"volume\", \"volume_sans_lissage\", \"Scotti\", \"arete\"." << finl;
641 if ( ! (methode ==
Motcle(
"volume_sans_lissage")) )
643 const Domaine& dom=domaine.domaine();
644 const IntTab& les_sommets = domaine_geom.
les_elems();
645 int nb_sommet = domaine.nb_som_tot();
646 ArrOfDouble longueur_filtre_sommet(nb_sommet);
650 longueur_filtre_sommet=-1.;
652 for (element=0; element<nbr_element; element ++)
653 for (som1=0; som1<dim+1; som1++)
655 som_0 = les_sommets(element, som1);
657 longueur_filtre_sommet[som_1] = std::max(longueur_filtre(element), longueur_filtre_sommet[som_1]);
662 for (element=0; element<nbr_element; element ++)
663 for (som1=0; som1<dim+1; som1++)
665 som_0 = les_sommets(element, som1);
667 longueur_filtre(element) = std::max (longueur_filtre(element), longueur_filtre_sommet[som_1]);
671 assert(nbr_element == 0 || min_array(longueur_filtre)>0.);
673 return longueur_filtre;
676double distance_sommets(
const int sommet1,
const int sommet2,
const Domaine_VEF& domaine)
678 const Domaine& domaine_geom = domaine.domaine();
680 double x1 = xs(sommet1,0);
681 double y1 = xs(sommet1,1);
682 double x2 = xs(sommet2,0);
683 double y2 = xs(sommet2,1);
687 double z1 = xs(sommet1,2);
688 double z2 = xs(sommet2,2);
689 return sqrt( carre(x2-x1) + carre(y2-y1) + carre(z2-z1) );
693 return sqrt( carre(x2-x1) + carre(y2-y1) );
697double som_pscal(
const int som0,
const int som1,
const int som2,
const int som3,
const Domaine_VEF& domaine)
699 const Domaine& domaine_geom = domaine.domaine();
702 ArrOfDouble v1(3),v2(3),v3(3);
707 v1[i]=xs(som1,i)-xs(som0,i);
708 v2[i]=xs(som2,i)-xs(som0,i);
709 v3[i]=xs(som3,i)-xs(som0,i);
720 double som_psc=std::fabs(dotproduct_array(v1,v2))+std::fabs(dotproduct_array(v2,v3))+std::fabs(dotproduct_array(v3,v1));
724double norm_vit_lp_k(
const DoubleTab& vit,
int face,
int face_b,
const Domaine_VEF& domaine,ArrOfDouble& val,
int is_defilante)
730 return norm_3D_vit1_k(vit,face_b,face,domaine,val[0],val[1],val[2]);
732 return norm_2D_vit1_k(vit,face_b,face,domaine,val[0],val[1]);
737 return norm_3D_vit2_k(vit,face_b,face,domaine,val[0],val[1],val[2]);
739 return norm_2D_vit2_k(vit,face_b,face,domaine,val[0],val[1]);
743double distance_face_elem(
int fac,
int elem,
const Domaine_VEF& domaine)
747 return distance_3D(fac,elem,domaine);
749 return distance_2D(fac,elem,domaine);
int_t get_renum_som_perio(int_t i) const
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
const DoubleTab_t & coord_sommets() const
Une chaine de caractere (Nom) en majuscules.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.