16#include <Verifier_Qualite_Raffinements.h>
18#include <TRUSTArray.h>
25template <
typename _SIZE_>
32template <
typename _SIZE_>
39static void compute_triangle_side_lengths(
const ArrOfDouble& x,
const ArrOfDouble& y,ArrOfDouble& l)
41 for (
int i=0; i<3; ++i)
43 const double dx = x[(i+1)%3] - x[i];
44 const double dy = y[(i+1)%3] - y[i];
45 l[i] = sqrt(dx*dx + dy*dy);
49template <
typename _SIZE_>
50static void compute_cell_qualities_for_triangle(
const Domaine_32_64<_SIZE_>& domain, ArrOfDouble_T<_SIZE_>& quality)
53 using IntTab_t = IntTab_T<_SIZE_>;
54 using DoubleTab_t = DoubleTab_T<_SIZE_>;
56 const IntTab_t& cells = domain.
les_elems();
59 const int_t nb_cells = cells.
dimension(0);
67 for (int_t cell=0; cell<nb_cells; ++cell)
70 for (
int i=0; i<3; ++i)
72 x[i] = nodes(cells(cell,i),0);
73 y[i] = nodes(cells(cell,i),1);
76 compute_triangle_side_lengths(x,y,l);
78 const double p = l[0]+l[1]+l[2];
79 const double r = sqrt(p*(p-l[0])*(p-l[1])*(p-l[2]))/p;
80 const double h = (l[0] > l[1]) ? ( (l[0]>l[2]) ? l[0] : l[2]) : ( (l[1]>l[2]) ? l[1] : l[2] );
82 quality[cell] = ( h / r );
86static double compute_tetrahedron_diameter(
const ArrOfDouble& x,
const ArrOfDouble& y,
const ArrOfDouble& z)
89 for (
int i=0; i<4; ++i)
91 for (
int j=i+1; j<4; ++j)
93 const double dx = x[j]-x[i];
94 const double dy = y[j]-y[i];
95 const double dz = z[j]-z[i];
96 const double l = dx*dx + dy*dy + dz*dz;
97 diameter = (diameter < l) ? l : diameter;
100 return sqrt(diameter);
103static double compute_tetrahedron_volume(
const ArrOfDouble& x,
const ArrOfDouble& y,
const ArrOfDouble& z)
105 double volume = (x[1]-x[0]) * (y[2]-y[0]) * (z[3]-z[0]) +
106 (x[2]-x[0]) * (y[3]-y[0]) * (z[1]-z[0]) +
107 (x[3]-x[0]) * (y[1]-y[0]) * (z[2]-z[0]) -
108 (z[1]-z[0]) * (y[2]-y[0]) * (x[3]-x[0]) -
109 (x[2]-x[0]) * (z[3]-z[0]) * (y[1]-y[0]) -
110 (y[3]-y[0]) * (x[1]-x[0]) * (z[2]-z[0]);
113 if (volume<0.) volume=-volume;
114 assert( volume > 0. );
116 return (volume / 6.);
120static double compute_tetrahedron_surface(
const ArrOfDouble& x,
const ArrOfDouble& y,
const ArrOfDouble& z)
133 surface += 0.5 * sqrt( ( ( (u[1]*v[2]) - (u[2]*v[1]) ) * ( (u[1]*v[2]) - (u[2]*v[1]) ) ) +
134 ( ( (u[2]*v[0]) - (u[0]*v[2]) ) * ( (u[2]*v[0]) - (u[0]*v[2]) ) ) +
135 ( ( (u[0]*v[1]) - (u[1]*v[0]) ) * ( (u[0]*v[1]) - (u[1]*v[0]) ) ) );
144 surface += 0.5 * sqrt( ( ( (u[1]*v[2]) - (u[2]*v[1]) ) * ( (u[1]*v[2]) - (u[2]*v[1]) ) ) +
145 ( ( (u[2]*v[0]) - (u[0]*v[2]) ) * ( (u[2]*v[0]) - (u[0]*v[2]) ) ) +
146 ( ( (u[0]*v[1]) - (u[1]*v[0]) ) * ( (u[0]*v[1]) - (u[1]*v[0]) ) ) );
155 surface += 0.5 * sqrt( ( ( (u[1]*v[2]) - (u[2]*v[1]) ) * ( (u[1]*v[2]) - (u[2]*v[1]) ) ) +
156 ( ( (u[2]*v[0]) - (u[0]*v[2]) ) * ( (u[2]*v[0]) - (u[0]*v[2]) ) ) +
157 ( ( (u[0]*v[1]) - (u[1]*v[0]) ) * ( (u[0]*v[1]) - (u[1]*v[0]) ) ) );
167 surface += 0.5 * sqrt( ( ( (u[1]*v[2]) - (u[2]*v[1]) ) * ( (u[1]*v[2]) - (u[2]*v[1]) ) ) +
168 ( ( (u[2]*v[0]) - (u[0]*v[2]) ) * ( (u[2]*v[0]) - (u[0]*v[2]) ) ) +
169 ( ( (u[0]*v[1]) - (u[1]*v[0]) ) * ( (u[0]*v[1]) - (u[1]*v[0]) ) ) );
174template <
typename _SIZE_>
175static void compute_cell_qualities_for_tetrahedron(
const Domaine_32_64<_SIZE_>& domain, ArrOfDouble_T<_SIZE_>& quality)
177 using int_t = _SIZE_;
178 using IntTab_t = IntTab_T<_SIZE_>;
179 using DoubleTab_t = DoubleTab_T<_SIZE_>;
181 const IntTab_t& cells = domain.
les_elems();
184 const int_t nb_cells = cells.
dimension(0);
191 for (int_t cell=0; cell<nb_cells; ++cell)
194 for (
int i=0; i<4; ++i)
196 x[i] = nodes(cells(cell,i),0);
197 y[i] = nodes(cells(cell,i),1);
198 z[i] = nodes(cells(cell,i),2);
201 const double h = compute_tetrahedron_diameter(x,y,z);
202 const double v = compute_tetrahedron_volume(x,y,z);
203 const double s = compute_tetrahedron_surface(x,y,z);
205 quality[cell] = ( (h*s) / v );
209template <
typename _SIZE_>
210static void compute_cell_qualities(
const Domaine_32_64<_SIZE_>& domain, ArrOfDouble_T<_SIZE_>& quality)
214 Motcles understood_keywords(2);
215 understood_keywords[0] =
"Triangle";
216 understood_keywords[1] =
"Tetraedre";
218 int rank = understood_keywords.search(cell_type);
222 compute_cell_qualities_for_triangle(domain,quality);
225 compute_cell_qualities_for_tetrahedron(domain,quality);
228 Cerr <<
"Error in Verifier_Qualite_Raffinements.cpp 'compute_cell_qualities()'" << finl;
229 Cerr <<
" Unknown cell type : " << cell_type << finl;
230 Cerr <<
" Verifier_Qualite_Raffinements can only check Triangles and Tetrahedrons" << finl;
235template <
typename _SIZE_>
238 const int nb_domains = this->domaines().size() ;
239 assert( nb_domains > 1 );
241 for (
int i=0; i<nb_domains; ++i)
244 compute_cell_qualities(this->
domaine(i),qualities);
246 Nom filename(
"quality_");
248 filename +=
Nom(
".gnu");
252 for (
int_t cell=0; cell<nb_cells; ++cell)
254 os << qualities[cell] << finl;
260template <
typename _SIZE_>
264 is >> nb_refinements;
266 for (
int i=0; i<nb_refinements; ++i)
classe Domaine_32_64 un Domaine est un maillage compose d'un ensemble d'elements geometriques de meme...
DoubleTab_t & les_sommets()
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)
Un tableau d'objets de la classe Motcle.
class Nom Une chaine de caractere pour nommer les objets de TRUST
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 void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
Classe de base des flux de sortie.
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
: class Verifier_Qualite_Raffinements
Entree & interpreter_(Entree &is) override
void verifier_qualite_raffinements()
ArrOfDouble_T< _SIZE_ > ArrOfDouble_t