16#include <Hexaedre_VEF.h>
27template <
typename _SIZE_>
39template <
typename _SIZE_>
49template <
typename _SIZE_>
52 static Nom nom=
"VOXEL8";
58template <
typename _SIZE_>
59bool Hexaedre_VEF_32_64<_SIZE_>::entre_faces(
const ArrOfDouble& pos, int_t Asom0_, int_t Asom1_, int_t Asom2_,
60 int_t Bsom0_, int_t Bsom1_, int_t Bsom2_)
const
62 const Domaine_t& dom = this->mon_dom.valeur();
64 const DoubleTab_t& coord=dom.les_sommets();
67 double vecA1[3], vecA2[3], AP[3];
69 for (
int i=0; i<3; i++)
71 double ref=coord(Asom0_,i);
72 vecA1[i]=coord(Asom1_,i)-ref;
73 vecA2[i]=coord(Asom2_,i)-ref;
76 normaleA[0]=(vecA1[1]*vecA2[2]-vecA1[2]*vecA2[1]);
77 normaleA[1]=(vecA1[2]*vecA2[0]-vecA1[0]*vecA2[2]);
78 normaleA[2]=(vecA1[0]*vecA2[1]-vecA1[1]*vecA2[0]);
80 for (
int i=0; i<3; i++)
81 prodA+=normaleA[i]*AP[i];
84 double vecB1[3], vecB2[3], BP[3];
86 for (
int i=0; i<3; i++)
88 double ref=coord(Bsom0_,i);
89 vecB1[i]=coord(Bsom1_,i)-ref;
90 vecB2[i]=coord(Bsom2_,i)-ref;
93 normaleB[0]=(vecB1[1]*vecB2[2]-vecB1[2]*vecB2[1]);
94 normaleB[1]=(vecB1[2]*vecB2[0]-vecB1[0]*vecB2[2]);
95 normaleB[2]=(vecB1[0]*vecB2[1]-vecB1[1]*vecB2[0]);
97 for (
int i=0; i<3; i++)
98 prodB+=normaleB[i]*BP[i];
105 double rap=prodA/prodB;
106 if (rap>1) rap=prodB/prodA;
116template <
typename _SIZE_>
117bool Hexaedre_VEF_32_64<_SIZE_>::contient_Tetra(
const ArrOfDouble& pos, int_t som0_, int_t som1_, int_t som2_, int_t som3_,
int aff)
const
119 const Domaine_t& dom = this->mon_dom.valeur();
121 int_t som0, som1, som2, som3;
126 double vec0[3], vec1[3], vec2[3];
127 double vecx0[3], vecx1[3], vecx2[3];
131 Cerr<<
"Test contient_Tetra nodes="<<som0_<<
" "<<som1_<<
" "<<som2_<<
" "<<som3_<<finl;
132 Cerr<<
" position="<<pos[0]<<
" "<<pos[1]<<
" "<<pos[2]<<finl;
135 if( ( est_egal(dom.coord(som0,0),pos[0]) && est_egal(dom.coord(som0,1),pos[1]) && est_egal(dom.coord(som0,2),pos[2]) )
136 || (est_egal(dom.coord(som1,0),pos[0]) && est_egal(dom.coord(som1,1),pos[1]) && est_egal(dom.coord(som1,2),pos[2]))
137 || (est_egal(dom.coord(som2,0),pos[0]) && est_egal(dom.coord(som2,1),pos[1]) && est_egal(dom.coord(som2,2),pos[2]))
138 || (est_egal(dom.coord(som3,0),pos[0]) && est_egal(dom.coord(som3,1),pos[1]) && est_egal(dom.coord(som3,2),pos[2])) )
141 for (
int j=0; j<4; j++)
173 vec0[0] = dom.coord(som1,0) - dom.coord(som0,0);
174 vec0[1] = dom.coord(som1,1) - dom.coord(som0,1);
175 vec0[2] = dom.coord(som1,2) - dom.coord(som0,2);
176 vec1[0] = dom.coord(som2,0) - dom.coord(som0,0);
177 vec1[1] = dom.coord(som2,1) - dom.coord(som0,1);
178 vec1[2] = dom.coord(som2,2) - dom.coord(som0,2);
179 vec2[0] = dom.coord(som3,0) - dom.coord(som0,0);
180 vec2[1] = dom.coord(som3,1) - dom.coord(som0,1);
181 vec2[2] = dom.coord(som3,2) - dom.coord(som0,2);
182 vecx0[0] = dom.coord(som1,0) - pos[0];
183 vecx0[1] = dom.coord(som1,1) - pos[1];
184 vecx0[2] = dom.coord(som1,2) - pos[2];
185 vecx1[0] = dom.coord(som2,0) - pos[0];
186 vecx1[1] = dom.coord(som2,1) - pos[1];
187 vecx1[2] = dom.coord(som2,2) - pos[2];
188 vecx2[0] = dom.coord(som3,0) - pos[0];
189 vecx2[1] = dom.coord(som3,1) - pos[1];
190 vecx2[2] = dom.coord(som3,2) - pos[2];
191 prod1 = vec0[0]*vec1[1]*vec2[2] + vec0[1]*vec1[2]*vec2[0] + vec0[2]*vec1[0]*vec2[1]
192 - vec0[0]*vec1[2]*vec2[1] - vec0[1]*vec1[0]*vec2[2] - vec0[2]*vec1[1]*vec2[0];
193 prod2 = vecx0[0]*vecx1[1]*vecx2[2] + vecx0[1]*vecx1[2]*vecx2[0] + vecx0[2]*vecx1[0]*vecx2[1]
194 - vecx0[0]*vecx1[2]*vecx2[1] - vecx0[1]*vecx1[0]*vecx2[2] - vecx0[2]*vecx1[1]*vecx2[0];
198 Cerr<<
" test "<<som0<<
" "<<som1<<
" "<<som2<<
" "<<som3<<finl;
199 Cerr<<
" node0="<<som0<<
" : "<<dom.coord(som0,0)<<
" "<<dom.coord(som0,1)<<
" "<<dom.coord(som0,2)<<finl;
200 Cerr<<
" node1="<<som1<<
" : "<<dom.coord(som1,0)<<
" "<<dom.coord(som1,1)<<
" "<<dom.coord(som1,2)<<finl;
201 Cerr<<
" node2="<<som2<<
" : "<<dom.coord(som2,0)<<
" "<<dom.coord(som2,1)<<
" "<<dom.coord(som2,2)<<finl;
202 Cerr<<
" node3="<<som3<<
" : "<<dom.coord(som3,0)<<
" "<<dom.coord(som3,1)<<
" "<<dom.coord(som3,2)<<finl;
203 Cerr<<
" position : "<<pos[0]<<
" "<<pos[1]<<
" "<<pos[2]<<finl;
204 Cerr<<
" prod1="<<prod1<<
" prod2="<<prod2<<finl;
209 double norm_v0=0,norm_v1=0,norm_v2=0;
210 for (
int ii=0; ii<3; ii++)
212 norm_v0+=vec0[ii]*vec0[ii];
213 norm_v1+=vec1[ii]*vec1[ii];
214 norm_v2+=vec2[ii]*vec2[ii];
218 Cerr<<
"Test contient_Tetra ERROR : coplanar nodes"<<finl;
219 Cerr<<
" node0="<<som0<<
" : "<<dom.coord(som0,0)<<
" "<<dom.coord(som0,1)<<
" "<<dom.coord(som0,2)<<finl;
220 Cerr<<
" node1="<<som1<<
" : "<<dom.coord(som1,0)<<
" "<<dom.coord(som1,1)<<
" "<<dom.coord(som1,2)<<finl;
221 Cerr<<
" node2="<<som2<<
" : "<<dom.coord(som2,0)<<
" "<<dom.coord(som2,1)<<
" "<<dom.coord(som2,2)<<finl;
222 Cerr<<
" node3="<<som3<<
" : "<<dom.coord(som3,0)<<
" "<<dom.coord(som3,1)<<
" "<<dom.coord(som3,2)<<finl;
223 Cerr<<
" position : "<<pos[0]<<
" "<<pos[1]<<
" "<<pos[2]<<finl;
224 Process::Process::exit();
232 Cerr<<
" CONTAINS=0"<<finl;
239 Cerr<<
" CONTAINS=1"<<finl;
253template <
typename _SIZE_>
257 const Domaine_t& dom=this->mon_dom.valeur();
268 bool new_algo =
true;
271 if (entre_faces(pos, som0, som1, som2, som4, som5, som6))
272 if (entre_faces(pos, som0, som1, som4, som2, som3, som6))
273 if (entre_faces(pos, som0, som2, som4, som1, som3, som5))
283 if (contient_Tetra(pos, som0, som1, som2, som4, aff) ||
284 contient_Tetra(pos, som1, som2, som3, som6, aff) ||
285 contient_Tetra(pos, som1, som2, som4, som6, aff) ||
286 contient_Tetra(pos, som3, som5, som6, som7, aff) ||
287 contient_Tetra(pos, som1, som4, som5, som6, aff) ||
288 contient_Tetra(pos, som1, som3, som5, som6, aff))
305template <
typename _SIZE_>
308 const Domaine_t& dom=this->mon_dom.valeur();
326template <
typename _SIZE_>
329 const Domaine_t& dom=this->mon_dom.valeur();
331 face_sommet_global.
resize(6,4);
339 int_t som0,som1,som2,som3,som4,som5,som6,som7;
345 for (
int_t num_poly=0; num_poly<size_tot; num_poly++)
371 face_sommet_global(0,0) =som0;
372 face_sommet_global(0,1) =som1;
373 face_sommet_global(0,2) =som2;
374 face_sommet_global(0,3) =som3;
376 face_sommet_global(1,0) =som4;
377 face_sommet_global(1,1) =som5;
378 face_sommet_global(1,2) =som6;
379 face_sommet_global(1,3) =som7;
381 face_sommet_global(2,0) =som0;
382 face_sommet_global(2,1) =som4;
383 face_sommet_global(2,2) =som2;
384 face_sommet_global(2,3) =som6;
386 face_sommet_global(3,0) =som1;
387 face_sommet_global(3,1) =som5;
388 face_sommet_global(3,2) =som3;
389 face_sommet_global(3,3) =som7;
391 face_sommet_global(4,0) =som0;
392 face_sommet_global(4,1) =som4;
393 face_sommet_global(4,2) =som1;
394 face_sommet_global(4,3) =som5;
396 face_sommet_global(5,0) =som2;
397 face_sommet_global(5,1) =som6;
398 face_sommet_global(5,2) =som3;
399 face_sommet_global(5,3) =som7;
417 s1 = face_sommet_global(k,0);
418 s2 = face_sommet_global(k,1);
419 s3 = face_sommet_global(k,2);
420 s4 = face_sommet_global(k,3);
428 x1 = dom.
coord(s1,0);
429 y1 = dom.
coord(s1,1);
430 z1 = dom.
coord(s1,2);
432 x2 = dom.
coord(s2,0);
433 y2 = dom.
coord(s2,1);
434 z2 = dom.
coord(s2,2);
436 x3 = dom.
coord(s4,0);
437 y3 = dom.
coord(s4,1);
438 z3 = dom.
coord(s4,2);
444 volume += std::fabs((x1-x0)*((y2-y0)*(z3-z0)-(y3-y0)*(z2-z0))-
445 (x2-x0)*((y1-y0)*(z3-z0)-(y3-y0)*(z1-z0))+
446 (x3-x0)*((y1-y0)*(z2-z0)-(y2-y0)*(z1-z0)))/6;
448 x1 = dom.
coord(s1,0);
449 y1 = dom.
coord(s1,1);
450 z1 = dom.
coord(s1,2);
452 x2 = dom.
coord(s4,0);
453 y2 = dom.
coord(s4,1);
454 z2 = dom.
coord(s4,2);
456 x3 = dom.
coord(s3,0);
457 y3 = dom.
coord(s3,1);
458 z3 = dom.
coord(s3,2);
464 volume += std::fabs((x1-x0)*((y2-y0)*(z3-z0)-(y3-y0)*(z2-z0))-
465 (x2-x0)*((y1-y0)*(z3-z0)-(y3-y0)*(z1-z0))+
466 (x3-x0)*((y1-y0)*(z2-z0)-(y2-y0)*(z1-z0)))/6;
469 volumes[num_poly] = volume;
474template <
typename _SIZE_>
475int Hexaedre_VEF_32_64<_SIZE_>::reordonne(
int i0,
int i1,
int i2,
int i3,
const DoubleTab_t& coord,IntTab_t& elem, int_t& num_poly,
int test,
476 DoubleTab& v, ArrOfDouble& prod_,ArrOfDouble& prod_v, ArrOfDouble& dist, DoubleTab& prod_v2)
479 s[0]=elem(num_poly,i0);
480 s[1]=elem(num_poly,i1);
481 s[2]=elem(num_poly,i2);
482 s[3]=elem(num_poly,i3);
484 for (
int i=1; i<4; i++)
485 for (
int dir=0; dir<3; dir++)
486 v(i-1,dir)=coord(s[i],dir)-coord(s[0],dir);
495 prod_v[0]=v(op,1)*v(i,2)-v(op,2)*v(i,1);
496 prod_v[1]=v(op,2)*v(i,0)-v(op,0)*v(i,2);
497 prod_v[2]=v(op,0)*v(i,1)-v(op,1)*v(i,0);
500 for (
int j=0; j<8; j++)
502 for (
int dir=0; dir<3; dir++)
503 dist[j]+=prod_v[dir]*(coord(elem(num_poly,j),dir)-coord(s[0],dir));
508 double min_dist=1e25;
509 for (
int j=0; j<8; j++)
511 if ((j!=i0)&&(j!=i1)&&(j!=i2))
512 if (std::fabs(dist[j])<min_dist)
515 min_dist=std::fabs(dist[j]);
528 Cerr<<
"we do not have a plan "<<finl;
529 Process::Process::exit();
535 for (
int op=0; op<3; op++)
538 for (
int i=0; i<3; i++)
540 prod_v2(i,0)=v(op,1)*v(i,2)-v(op,2)*v(i,1);
541 prod_v2(i,1)=v(op,2)*v(i,0)-v(op,0)*v(i,2);
542 prod_v2(i,2)=v(op,0)*v(i,1)-v(op,1)*v(i,0);
545 int i1bis=-1,j2bis=-1;
561 for (
int dir=0; dir<3; dir++)
562 prod+=(prod_v2(i1bis,dir)*prod_v2(j2bis,dir));
576 if ((test==0)&& ((opp==3)||(opp==-1)))
578 Cerr<<
" this does not seem to be a plan "<<finl;
579 Process::Process::exit();
581 if ((opp!=2)&&(opp!=-2))
587 int_t tmp=elem(num_poly,i2b);
588 elem(num_poly,i2b)=elem(num_poly,i3);
589 elem(num_poly,i3)=tmp;
592 Cerr <<
"Permutation of local nodes "<<i2b<<
" and "<<i3<<
" on the element " <<num_poly<<
" prod "<<prod_<<finl;
600template <
typename _SIZE_>
656 ArrOfDouble prod_(3);
657 ArrOfDouble prod_v(3);
659 DoubleTab prod_v2(3,3);
662 for (
int_t num_poly=0; num_poly<nb_elem; num_poly++)
667 permutations+=reordonne(0,1,2,3,coord,elem,num_poly,0, v,prod_, prod_v, dist, prod_v2);
668 permutations+=reordonne(4,5,6,7,coord,elem,num_poly,0, v,prod_, prod_v, dist, prod_v2);
669 for (
int i=0; i<8; i++)
670 sa[i]=elem(num_poly,i);
679 for (
int i=4; i<8; i++)
680 elem(num_poly,i)=sa[perm(j,i-4)+4];
683 permutations+=reordonne(2,0,3,1,coord,elem,num_poly,test, v,prod_, prod_v, dist, prod_v2);
684 permutations+=reordonne(3,1,7,5,coord,elem,num_poly,test, v,prod_, prod_v, dist, prod_v2);
685 permutations+=reordonne(7,5,6,4,coord,elem,num_poly,test, v,prod_, prod_v, dist, prod_v2);
686 permutations+=reordonne(6,4,2,0,coord,elem,num_poly,test, v,prod_, prod_v, dist, prod_v2);
687 permutations+=reordonne(2,3,6,7,coord,elem,num_poly,test, v,prod_, prod_v, dist, prod_v2);
688 permutations+=reordonne(4,5,0,1,coord,elem,num_poly,test, v,prod_, prod_v, dist, prod_v2);
692 Cerr<<
" former permutation "<< perm_valid<<
" new permutation "<<j<<finl;
699 Cerr <<
"Failure of the algorithm in Hexaedre_VEF_32_64<_SIZE_>::reordonner" << finl;
700 Cerr <<
"Here is the connectivity element-node of the cell " << num_poly <<
" that raises problem:" << finl;
701 for (
int i=0; i<8; i++)
702 Cerr << sa[i] <<
" ";
708 Cerr<<
"Failure of the algorithm in Hexaedre_VEF_32_64<_SIZE_>::reordonner"<<finl;
709 Cerr<<
"many permutations possibles"<<finl;
710 Cerr <<
"Here is the connectivity element-node of the cell " << num_poly <<
" that raises problem:" << finl;
711 for (
int i=0; i<8; i++)
712 Cerr << sa[i] <<
" ";
714 Cerr <<
"Here is the new connectivity element-node of the cell " << num_poly <<
" that raises problem:" << finl;
715 for (
int i=0; i<8; i++)
716 Cerr << elem(num_poly,i) <<
" ";
721 for (
int i=4; i<8; i++)
722 elem(num_poly,i)=sa[perm(perm_valid,i-4)+4];
725 Cerr<<
" we carried out the permutation "<<perm_valid<<
" on the element "<<num_poly<<finl;
730static int faces_sommets_hexa_vef[6][4] =
743template <
typename _SIZE_>
746 faces_som_local.
resize(6,4);
747 for (
int i=0; i<6; i++)
748 for (
int j=0; j<4; j++)
749 faces_som_local(i,j) = faces_sommets_hexa_vef[i][j];
int_t nb_elem_tot() const
DoubleTab_t & les_sommets()
double coord(int_t i, int j) const
int_t sommet_elem(int_t i, int j) const
Renvoie le numero (global) du j-ieme sommet du i-ieme element.
Classe Elem_geom_base Cette classe est la classe de base pour la definition d'elements.
Class defining operators and methods for all reading operation in an input flow (file,...
Classe Hexaedre_VEF Cette classe represente l'element geometrique Hexaedre_VEF.
int get_tab_faces_sommets_locaux(IntTab &faces_som_local) const override
voir ElemGeomBase::get_tab_faces_sommets_locaux
int nb_faces(int=0) const override
Renvoie le nombre de faces du type specifie que possede l'element geometrique.
int contient(const ArrOfDouble &pos, int_t elem) const override
Renvoie 1 si l'element ielem du domaine associe a l'element geometrique contient le point.
DoubleTab_T< _SIZE_ > DoubleTab_t
IntTab_T< _SIZE_ > IntTab_t
const Nom & nom_lml() const override
Renvoie le nom LML d'un Hexaedre_VEF = "HEXA8".
DoubleVect_T< _SIZE_ > DoubleVect_t
void reordonner() override
void calculer_volumes(DoubleVect_t &vols) const override
Calcule les volumes des elements du domaine associe.
SmallArrOfTID_T< _SIZE_ > SmallArrOfTID_t
Domaine_32_64< _SIZE_ > Domaine_t
class Nom Une chaine de caractere pour nommer les objets de TRUST
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
static double precision_geom
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
_SIZE_ size_array() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ size_totale() const