TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Verifier_Qualite_Raffinements.cpp
1/****************************************************************************
2* Copyright (c) 2026, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Verifier_Qualite_Raffinements.h>
17#include <Domaine.h>
18#include <TRUSTArray.h>
19#include <SFichier.h>
20
21Implemente_instanciable_32_64(Verifier_Qualite_Raffinements_32_64,"Verifier_Qualite_Raffinements",Interprete_geometrique_base_32_64<_T_>) ;
22// XD verifier_qualite_raffinements interprete verifier_qualite_raffinements NO_BRACE not_set
23// XD attr domain_names vect_nom domain_names REQ not_set
24
25template <typename _SIZE_>
27{
29 return os;
30}
31
32template <typename _SIZE_>
34{
36 return is;
37}
38
39static void compute_triangle_side_lengths(const ArrOfDouble& x,const ArrOfDouble& y,ArrOfDouble& l)
40{
41 for (int i=0; i<3; ++i)
42 {
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);
46 }
47}
48
49template <typename _SIZE_>
50static void compute_cell_qualities_for_triangle(const Domaine_32_64<_SIZE_>& domain, ArrOfDouble_T<_SIZE_>& quality)
51{
52 using int_t = _SIZE_;
53 using IntTab_t = IntTab_T<_SIZE_>;
54 using DoubleTab_t = DoubleTab_T<_SIZE_>;
55
56 const IntTab_t& cells = domain.les_elems();
57 const DoubleTab_t& nodes = domain.les_sommets();
58
59 const int_t nb_cells = cells.dimension(0);
60 quality.resize_array(nb_cells);
61
62
63 ArrOfDouble x(3);
64 ArrOfDouble y(3);
65 ArrOfDouble l(3);
66
67 for (int_t cell=0; cell<nb_cells; ++cell)
68 {
69
70 for (int i=0; i<3; ++i)
71 {
72 x[i] = nodes(cells(cell,i),0);
73 y[i] = nodes(cells(cell,i),1);
74 }
75
76 compute_triangle_side_lengths(x,y,l);
77
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] );
81
82 quality[cell] = ( h / r );
83 }
84}
85
86static double compute_tetrahedron_diameter(const ArrOfDouble& x,const ArrOfDouble& y,const ArrOfDouble& z)
87{
88 double diameter = 0.;
89 for (int i=0; i<4; ++i)
90 {
91 for (int j=i+1; j<4; ++j)
92 {
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;
98 }
99 }
100 return sqrt(diameter);
101}
102
103static double compute_tetrahedron_volume(const ArrOfDouble& x,const ArrOfDouble& y,const ArrOfDouble& z)
104{
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]);
111
112 // GF est ce le lieu pour faire l'assert....
113 if (volume<0.) volume=-volume;
114 assert( volume > 0. );
115
116 return (volume / 6.);
117}
118
119
120static double compute_tetrahedron_surface(const ArrOfDouble& x,const ArrOfDouble& y,const ArrOfDouble& z)
121{
122 ArrOfDouble u(3);
123 ArrOfDouble v(3);
124
125 double surface = 0.;
126 u[0] = x[2] - x[1];
127 v[0] = x[3] - x[1];
128 u[1] = y[2] - y[1];
129 v[1] = y[3] - y[1];
130 u[2] = z[2] - z[1];
131 v[2] = z[3] - z[1];
132
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]) ) ) );
136
137 u[0] = x[3] - x[2];
138 v[0] = x[0] - x[2];
139 u[1] = y[3] - y[2];
140 v[1] = y[0] - y[2];
141 u[2] = z[3] - z[2];
142 v[2] = z[0] - z[2];
143
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]) ) ) );
147
148 u[0] = x[0] - x[3];
149 v[0] = x[1] - x[3];
150 u[1] = y[0] - y[3];
151 v[1] = y[1] - y[3];
152 u[2] = z[0] - z[3];
153 v[2] = z[1] - z[3];
154
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]) ) ) );
158
159
160 u[0] = x[1] - x[0];
161 v[0] = x[2] - x[0];
162 u[1] = y[1] - y[0];
163 v[1] = y[2] - y[0];
164 u[2] = z[1] - z[0];
165 v[2] = z[2] - z[0];
166
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]) ) ) );
170
171 return surface;
172}
173
174template <typename _SIZE_>
175static void compute_cell_qualities_for_tetrahedron(const Domaine_32_64<_SIZE_>& domain, ArrOfDouble_T<_SIZE_>& quality)
176{
177 using int_t = _SIZE_;
178 using IntTab_t = IntTab_T<_SIZE_>;
179 using DoubleTab_t = DoubleTab_T<_SIZE_>;
180
181 const IntTab_t& cells = domain.les_elems();
182 const DoubleTab_t& nodes = domain.les_sommets();
183
184 const int_t nb_cells = cells.dimension(0);
185 quality.resize_array(nb_cells);
186
187 ArrOfDouble x(4);
188 ArrOfDouble y(4);
189 ArrOfDouble z(4);
190
191 for (int_t cell=0; cell<nb_cells; ++cell)
192 {
193
194 for (int i=0; i<4; ++i)
195 {
196 x[i] = nodes(cells(cell,i),0);
197 y[i] = nodes(cells(cell,i),1);
198 z[i] = nodes(cells(cell,i),2);
199 }
200
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);
204
205 quality[cell] = ( (h*s) / v );
206 }
207}
208
209template <typename _SIZE_>
210static void compute_cell_qualities(const Domaine_32_64<_SIZE_>& domain, ArrOfDouble_T<_SIZE_>& quality)
211{
212 const Nom& cell_type = domain.type_elem()->que_suis_je();
213
214 Motcles understood_keywords(2);
215 understood_keywords[0] = "Triangle";
216 understood_keywords[1] = "Tetraedre";
217
218 int rank = understood_keywords.search(cell_type);
219 switch(rank)
220 {
221 case 0 :
222 compute_cell_qualities_for_triangle(domain,quality);
223 break;
224 case 1 :
225 compute_cell_qualities_for_tetrahedron(domain,quality);
226 break;
227 default :
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;
232 }
233}
234
235template <typename _SIZE_>
237{
238 const int nb_domains = this->domaines().size() ;
239 assert( nb_domains > 1 );
240
241 for (int i=0; i<nb_domains; ++i)
242 {
243 ArrOfDouble_t qualities;
244 compute_cell_qualities(this->domaine(i),qualities);
245
246 Nom filename("quality_");
247 filename += Nom(i);
248 filename += Nom(".gnu");
249
250 SFichier os(filename);
251 const int_t nb_cells = qualities.size_array();
252 for (int_t cell=0; cell<nb_cells; ++cell)
253 {
254 os << qualities[cell] << finl;
255 }
256 os.close();
257 }
258}
259
260template <typename _SIZE_>
262{
263 int nb_refinements;
264 is >> nb_refinements;
265
266 for (int i=0; i<nb_refinements; ++i)
267 {
268 this->associer_domaine(is);
269 }
271 return is;
272}
273
275#if INT_is_64_ == 2
277#endif
classe Domaine_32_64 un Domaine est un maillage compose d'un ensemble d'elements geometriques de meme...
Definition Domaine.h:62
DoubleTab_t & les_sommets()
Definition Domaine.h:113
IntTab_t & les_elems()
Definition Domaine.h:129
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Interprete_geometrique_base .
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
friend class Entree
Definition Objet_U.h:76
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
Definition SFichier.h:27
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
: class Verifier_Qualite_Raffinements