16#include <Linear_algebra_tools_impl.h>
26template <
typename _SIZE_>
37template <
typename _SIZE_>
41 s<< FacesIndex_ <<finl;
42 s<< PolyhedronIndex_ <<finl;
43 s<< nb_som_elem_max_ <<finl;
44 s<< nb_face_elem_max_ <<finl;
45 s<< nb_som_face_max_ <<finl;;
50template <
typename _SIZE_>
62template <
typename _SIZE_>
65 const Domaine_t& domaine=mon_dom.valeur();
66 const IntTab_t& elem=domaine.les_elems();
72 nb_elem = domaine.nb_elem_tot();
79 for (
int_t num_poly=0; num_poly<nb_elem; num_poly++)
85 for (nb_som_reel=0; nb_som_reel<nb_som_max; nb_som_reel++)
87 int_t n=elem(num_poly,nb_som_reel);
90 Vecteur3 S(coord(n,0),coord(n,1),coord(n,2));
102 int_t n3=elem(num_poly,somm_loc3);
103 Vecteur3 S3(coord(n3,0),coord(n3,1),coord(n3,2));
109 int_t n1=elem(num_poly,somm_loc1);
110 int somm_loc2=
Nodes_[s+1];
111 int_t n2=elem(num_poly,somm_loc2);
112 Vecteur3 S1(coord(n1,0),coord(n1,1),coord(n1,2));
113 Vecteur3 S2(coord(n2,0),coord(n2,1),coord(n2,2));
122 double vol_l= std::fabs(
123 S1[0] * ( S2[1] * S3[2] - S3[1] * S2[2] )
124 + S2[0] * ( S3[1] * S1[2] - S1[1] * S3[2] )
125 + S3[0] * ( S1[1] * S2[2] - S2[1] * S1[2] ) );
132 xp(num_poly,0)=vraixg[0];
133 xp(num_poly,1)=vraixg[1];
134 xp(num_poly,2)=vraixg[2];
138template <
typename _SIZE_>
141 const IntTab_t& les_Polys = mon_dom->les_elems();
142 const Domaine_t& le_domaine = mon_dom.valeur();
146 while (les_Polys(num_elem,nb_som_reel-1)==-1) nb_som_reel--;
147 for(
int s=0; s<nb_som_reel; s++)
149 int_t num_som = les_Polys(num_elem,s);
151 xp(i) += le_domaine.
coord(num_som,i)/nb_som_reel;
161template <
typename _SIZE_>
183template <
typename _SIZE_>
187 const Domaine_t& domaine = mon_dom.valeur();
188 const IntTab_t& elem=domaine.les_elems();
194 for (nb_som_reel=0; nb_som_reel<nb_som_max; nb_som_reel++)
196 int_t n=elem(num_poly,nb_som_reel);
199 Vecteur3 S(coord(n,0),coord(n,1),coord(n,2));
208 int_t n3=elem(num_poly,somm_loc3);
209 Vecteur3 moinsS3(-coord(n3,0),-coord(n3,1),-coord(n3,2));
214 int_t n1=elem(num_poly,somm_loc1);
215 int somm_loc2=
Nodes_[s+1];
216 int_t n2=elem(num_poly,somm_loc2);
217 Vecteur3 S1(coord(n1,0),coord(n1,1),coord(n1,2));
218 Vecteur3 S2(coord(n2,0),coord(n2,1),coord(n2,2));
249template <
typename _SIZE_>
261template <
typename _SIZE_>
264 const Domaine_t& domaine=mon_dom.valeur();
265 const IntTab_t& elem=domaine.les_elems();
268 int_t size_tot = domaine.nb_elem_tot();
270 for (
int_t num_poly=0; num_poly<size_tot; num_poly++)
276 for (nb_som_reel=0; nb_som_reel<nb_som_max; nb_som_reel++)
278 int_t n=elem(num_poly,nb_som_reel);
281 Vecteur3 S(coord(n,0),coord(n,1),coord(n,2));
290 int_t n3=elem(num_poly,somm_loc3);
291 Vecteur3 S3(coord(n3,0),coord(n3,1),coord(n3,2));
296 int_t n1=elem(num_poly,somm_loc1);
297 int somm_loc2=
Nodes_[s+1];
298 int_t n2=elem(num_poly,somm_loc2);
299 Vecteur3 S1(coord(n1,0),coord(n1,1),coord(n1,2));
300 Vecteur3 S2(coord(n2,0),coord(n2,1),coord(n2,2));
304 S1[0] * ( S2[1] * S3[2] - S3[1] * S2[2] )
305 + S2[0] * ( S3[1] * S1[2] - S1[1] * S3[2] )
306 + S3[0] * ( S1[1] * S2[2] - S2[1] * S1[2] ) );
309 volumes(num_poly)=volume/6.;
326template <
typename _SIZE_>
332template <
typename _SIZE_>
348 faces_som_local(fl,sl)=somm_loc;
360template <
typename _SIZE_>
369 for (
int_t ele=0; ele<nelem; ele++)
372 int nbf=(int)(PolyhedronIndex[ele+1]-PolyhedronIndex[ele]);
374 for (
int_t f=PolyhedronIndex[ele]; f<PolyhedronIndex[ele+1]; f++)
377 int nbs=(int)(FacesIndex[f+1]-FacesIndex[f]);
379 for (
int_t s=FacesIndex[f]; s<FacesIndex[f+1]; s++)
382 int nbsom=prov.
size();
392 for (
int_t ele=0; ele<nelem; ele++)
395 for (
int_t f=PolyhedronIndex[ele]; f<PolyhedronIndex[ele+1]; f++)
396 for (
int_t s=FacesIndex[f]; s<FacesIndex[f+1]; s++)
398 int nbsom=prov.
size();
405 for (
int i=0; i<nbsom-1; i++)
406 if (prov[i]>prov[i+1])
414 for (
int s=0; s<nbsom; s++)
415 les_elems(ele,s)=prov[s];
423 for (
int_t ele=0; ele<nelem; ele++)
424 for (
int_t f=PolyhedronIndex[ele]; f<PolyhedronIndex[ele+1]; f++)
425 for (
int_t s=FacesIndex[f]; s<FacesIndex[f+1]; s++)
427 int_t somm_glob=Nodes[s];
429 if (les_elems(ele,sl)==somm_glob)
435 assert(min_array(
Nodes_)>-1);
438template <
typename _SIZE_>
443 for (
int_t ele=0; ele<nelem; ele++)
448 Nodes_glob[s]=les_elems(ele,somm_loc);
455template <
typename _SIZE_>
466 for (
int_t el=0; el<nb_new_elem; el++)
468 for (
int s=0; s<nb_som_new_elem; s++)
469 les_elems(nb_old_elem+el,s)=new_elems(el,s);
471 for (
int s=nb_som_new_elem; s<nb_som_old_elem; s++)
472 les_elems(nb_old_elem+el,s)=-1;
475 IntTab faces_som_local;
477 int nb_face_new_elem=faces_som_local.
dimension(0);
478 int nb_som_face_new_elem=faces_som_local.
dimension(1);
485 FacesIndex_.resize_array(old_faces_index+nb_new_elem*nb_face_new_elem);
488 Nodes_.resize_array(old_nodes_index+nb_new_elem*nb_face_new_elem*nb_som_face_new_elem);
491 for (
int_t el=0; el<nb_new_elem; el++)
494 for (
int f=0; f<nb_face_new_elem; f++)
496 int nb_som_face_this_elem=0;
497 for (
int s=0; s<nb_som_face_new_elem; s++)
498 if (faces_som_local(f,s)!=-1)
500 Nodes_[old_nodes_index+new_s++]=faces_som_local(f,s);
501 nb_som_face_this_elem++;
503 if (nb_som_face_this_elem==4)
506 int_t last=old_nodes_index+new_s-1;
509 FacesIndex_[old_faces_index+(el*nb_face_new_elem)+f]=
510 FacesIndex_[old_faces_index+(el*nb_face_new_elem)+f-1]+nb_som_face_this_elem;
513 Nodes_.resize_array(old_nodes_index+new_s);
519template <
typename _SIZE_>
522 type_elem.typer(
"Polyedre");
529 ArrOfInt& N = reduced.
Nodes_;
533 int_t e = elems_sous_part[i];
544template <
typename _SIZE_>
551 mon_dom->creer_tableau_elements(faces_som);
553 IntTab faces_som_local;
554 int_t nb_elem=mon_dom->nb_elem();
555 int_t nb_elem_tot=mon_dom->nb_elem_tot();
556 for (
int_t ele=0; ele<nb_elem; ele++)
561 faces_som(ele,k,l)=faces_som_local(k,l);
563 faces_som.echange_espace_virtuel();
569 for (
int_t ele=nb_elem; ele<nb_elem_tot; ele++)
574 if (faces_som(ele,k,0)!=-1)
578 if (faces_som(ele,k,l)!=-1)
587 Nodes_.resize(nbs_old+nbs);
591 for (
int_t ele=nb_elem; ele<nb_elem_tot; ele++)
596 if (faces_som(ele,k,l)!=-1)
598 Nodes_[nbs]=faces_som(ele,k,l);
601 if (faces_som(ele,k,0)!=-1)
609 for (
int_t ele=nb_elem; ele<nb_elem_tot; ele++)
615 int_t ind1=faces_som(ele,k,l),
616 ind2=faces_som_local(k,l);
619 Cerr <<
"PPPPB "<< ele<<
" k " <<k <<
" l "<< l<<
" iiii "<<ind1<<
" "<<ind2<<finl;
626template <
typename _SIZE_>
double coord(int_t i, int j) const
Classe Elem_geom_base Cette classe est la classe de base pour la definition d'elements.
virtual int get_tab_faces_sommets_locaux(IntTab &faces_som_local) const
remplit le tableau faces_som_local(i,j) qui donne pour 0 <= i < nb_faces() et 0 <= j < nb_som_face(i)...
Class defining operators and methods for all reading operation in an input flow (file,...
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.
Base class for polyedrons and polygons. Connectivity is stored in descending mode:
int get_nb_som_elem_max() const
Classe Polyedre Cette represente l'element geometrique Polyedre.
int get_tab_faces_sommets_locaux(IntTab &faces_som_local) const override
remplit le tableau faces_som_local(i,j)
int_t get_somme_nb_faces_elem() const override
void affecte_connectivite_numero_global(const ArrOfInt_t &Nodes, const ArrOfInt_t &FacesIndex, const ArrOfInt_t &PolyhedronIndex, IntTab_t &les_elems)
int nb_som() const override
Renvoie le nombre de sommets d'un Polyedre.
const Nom & nom_lml() const override
Renvoie le nom LML d'un polyedre = "POLYEDRE_"+nb_som_max.
void compute_virtual_index() override
DoubleTab_T< _SIZE_ > DoubleTab_t
void calculer_centres_gravite(DoubleTab_t &xp) const override
Compute all centers of mass of all elements in the domain.
friend class Polyedre_32_64
DoubleVect_T< _SIZE_ > DoubleVect_t
void ajouter_elements(const Elem_geom_base_32_64< _SIZE_ > &new_elem, const IntTab_t &new_elems, IntTab_t &les_elems)
on va ajouter les elements de type new_elem aux elements deja presents dans les_elems et dans new_ele...
void build_reduced(OWN_PTR(Elem_geom_base_32_64< int >)&type_elem, const ArrOfInt_t &elems_sous_part) const override
SmallArrOfTID_T< _SIZE_ > SmallArrOfTID_t
int contient(const ArrOfDouble &pos, int_t elem) const override
NE FAIT RIEN: A CODER, renvoie toujours 0.
void calculer_un_centre_gravite(const int_t elem, DoubleVect &xp) const override
BigArrOfInt_t Nodes_
Nodes_[s] local index (in the reference frame of an element) of the vertex of a given face,...
void remplir_Nodes_glob(ArrOfInt_t &Nodes_glob, const IntTab_t &les_elems) const
ArrOfInt_T< _SIZE_ > ArrOfInt_t
IntTab_T< _SIZE_ > IntTab_t
Domaine_32_64< _SIZE_ > Domaine_t
ArrOfInt_t PolyhedronIndex_
void calculer_volumes(DoubleVect_t &vols) const override
NE FAIT RIEN: A CODER Calcule les volumes des elements du domaine associe.
static double mp_max(double)
static void abort()
Routine de sortie de Trio-U sur une erreur abort().
Classe de base des flux de sortie.
void append_array(_TYPE_ valeur)
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
: Classe qui sert a representer une liste de reels int/double precision.
TRUSTList & add_if_not(_TYPE_)
Ajout d'un element a la liste ssi il n'existe pas deja.
void vide()
Vide la liste.
: Tableau a n entrees pour n<= 4.
int dimension_int(int d) const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
_SIZE_ dimension(int d) const
_SIZE_ size_totale() const
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
static double produit_scalaire(const Vecteur3 &x, const Vecteur3 &y)
static void produit_vectoriel(const Vecteur3 &x, const Vecteur3 &y, Vecteur3 &resu)