16#include <Analyse_Angle.h>
18#include <Linear_algebra_tools_impl.h>
30template <
typename _SIZE_>
36template <
typename _SIZE_>
43double largest_angle(
const DoubleTab& coords)
47 Cerr<<
" case not provided"<<finl;
54 for (
int n=0; n<nb_face; n++)
60 for (
int s=0; s<nb_face; s++)
62 if ((s!=n) && (s!=prem))
64 edge[compteur].
set(coords(s,0)-coords(prem,0),
65 coords(s,1)-coords(prem,1),
66 coords(s,2)-coords(prem,2));
70 if (compteur!=nb_face-2) abort();
71 opp.
set(coords(n,0)-coords(prem,0),
72 coords(n,1)-coords(prem,1),
73 coords(n,2)-coords(prem,2));
76 double l = normals[n].
length();
77 normals[n]*=(l>0 ? 1./l : 0);
82 double max_pscal=-100;
83 for (
int n1=0; n1<nb_face; n1++)
84 for (
int n2=n1+1; n2<nb_face; n2++)
91 double tet=acos(max_pscal<=1. ? max_pscal : 1.)/acos(-1.)*180;
97template <
typename _SIZE_>
103 histogramme_angle(this->
domaine(), Cout, nb_histo);
107template <
typename _SIZE_>
110 using IntTab_t = IntTab_T<_SIZE_>;
111 using DoubleTab_t = DoubleTab_T<_SIZE_>;
112 out<<finl<<
"Histogram of the largest angle of each element found into the mesh "<<dom.
le_nom()<<
" :" << finl;
120 ArrOfInt histo(nb_histo+1);
123 const IntTab_t& les_elems=dom.
les_elems();
125 int nb_som_elem=(int)les_elems.dimension(1);
126 DoubleTab coords(nb_som_elem,3);
127 ToDo_Kokkos(
"critical");
128 for (_SIZE_ elem=0; elem<nb_elem; elem++)
130 for (
int s=0; s<nb_som_elem; s++)
132 _SIZE_ sommet=les_elems(elem,s);
133 for (
int dir=0; dir<dim_space; dir++)
134 coords(s,dir)=som(sommet,dir);
136 double teta=largest_angle(coords);
138 int test=(int)(teta/180*nb_histo);
141 Cerr <<
"Error, the mesh cell " << elem <<
" is flat. Fix your mesh." << finl;
143 if (histo[nb_histo]>0)
148 double obtuse_cells_proportion=0;
149 for (
int h=0; h<nb_histo; h++)
153 if (180/nb_histo*h>=60)
155 obtuse_cells_proportion=histo[h]*100./(double)nb_elem_tot;
156 int angle=180/nb_histo*h;
157 out <<
"Between "<<angle<<
" degrees and " << 180/nb_histo*(h+1)<<
" degrees : "<<histo[h]<<
" elements ( "<<obtuse_cells_proportion<<
" %)"<<finl;
161 if (obtuse_cells_proportion>20)
164 Cerr <<
"Warning:" << finl;
165 Cerr <<
"Your mesh has too much obtuse cells for a TRUST calculation." << finl;
166 Cerr <<
"Check the mesh requirements." << finl;
Entree & interpreter_(Entree &) override
classe Domaine_32_64 un Domaine est un maillage compose d'un ensemble d'elements geometriques de meme...
DoubleTab_t & les_sommets()
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Class defining operators and methods for all reading operation in an input flow (file,...
classe Interprete_geometrique_base .
void associer_domaine(Nom &nom_dom)
Domaine_t & domaine(int i=0)
Une chaine de caractere (Nom) en majuscules.
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
_SIZE_ dimension(int d) const
static double produit_scalaire(const Vecteur3 &x, const Vecteur3 &y)
static void produit_vectoriel(const Vecteur3 &x, const Vecteur3 &y, Vecteur3 &resu)
void set(double x, double y, double z)