TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Refine_Mesh.cpp
1/****************************************************************************
2* Copyright (c) 2024, 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 <Array_tools.h>
17#include <Refine_Mesh.h>
18#include <Sous_Domaine.h>
19#include <Domaine.h>
20#include <Scatter.h>
21#include <SChaine.h>
22#include <EChaine.h>
23
24Implemente_instanciable(Refine_Mesh, "Refine_Mesh", Interprete_geometrique_base);
25
26Sortie& Refine_Mesh::printOn(Sortie& os) const { return Interprete::printOn(os); }
27
29
30// XD refine_mesh interprete refine_mesh NO_BRACE not_set
31// XD attr domaine ref_domaine domaine REQ not_set
33{
35 apply();
36 return is;
37}
38
40{
41 Cerr << "Refining domain " << domaine().le_nom() << finl;
42
45
46 if (Objet_U::dimension == 2)
47 {
48 apply_2D();
49 }
50 else
51 {
52 apply_3D();
53 }
54
55 Cerr << "Refinement... OK" << finl;
56}
57
59{
60 if (!((Objet_U::dimension == 2) || (Objet_U::dimension == 3)))
61 {
62 Cerr << "Error in 'Refine_Mesh::check_dimension()':" << finl;
63 Cerr << " Invalid dimension: " << Objet_U::dimension << finl;
64 Cerr << " Refine_Mesh can only deal 2D or 3D domains" << finl;
66 }
67}
68
70{
71 const Nom& cell_type = domaine().type_elem()->que_suis_je();
72
73 if (!((cell_type == Motcle("Triangle")) || (cell_type == Motcle("Tetraedre"))))
74 {
75 Cerr << "Error in 'Refine_Mesh::check_cell_type()':" << finl;
76 Cerr << " Invalid cell type: " << cell_type << finl;
77 Cerr << " Refine_Mesh can only deal with triangles and tetrahedrons" << finl;
79 }
80}
81
83{
84 Domaine& domain = domaine();
86
87 assert(domain.type_elem()->que_suis_je() == Motcle("Triangle"));
88
89 IntTab nodes_of_edges;
90 IntTab edges_of_cells;
91 build_edges_2D(nodes_of_edges, edges_of_cells);
92
93 DoubleTab new_nodes;
94 build_new_nodes(new_nodes, nodes_of_edges);
95
96 IntTab new_cells;
97 build_new_cells_2D(new_cells, edges_of_cells);
98
99 Noms new_sub_domaines_descriptions;
100 build_new_sub_domaines_descriptions(new_sub_domaines_descriptions);
101
102 Static_Int_Lists incidence_from_node_to_edges;
103 build_incidence_from_node_to_edges(new_nodes.dimension(0), nodes_of_edges, incidence_from_node_to_edges);
104
105 IntTabs new_nodes_of_boundary_faces;
106 IntTabs new_cells_of_boundary_faces;
107 build_new_boundary_faces_2D(new_nodes_of_boundary_faces, new_cells_of_boundary_faces, incidence_from_node_to_edges);
108
109 IntTabs new_nodes_of_connector_faces;
110 IntTabs new_cells_of_connector_faces;
111 build_new_connector_faces_2D(new_nodes_of_connector_faces, new_cells_of_connector_faces, incidence_from_node_to_edges);
112
113 IntTabs new_nodes_of_internal_frontier_faces;
114 IntTabs new_cells_of_internal_frontier_faces;
115 build_new_internal_frontier_faces_2D(new_nodes_of_internal_frontier_faces, new_cells_of_internal_frontier_faces, incidence_from_node_to_edges);
116
117 update_domain(Nom("Triangle"), Type_Face::segment_2D, new_nodes, new_cells, new_sub_domaines_descriptions, new_nodes_of_boundary_faces, new_cells_of_boundary_faces, new_nodes_of_connector_faces,
118 new_cells_of_connector_faces, new_nodes_of_internal_frontier_faces, new_cells_of_internal_frontier_faces);
119
121}
122
124{
125 Domaine& domain = domaine();
127
128 assert(domain.type_elem()->que_suis_je() == Motcle("Tetraedre"));
129
130 IntTab nodes_of_edges;
131 IntTab edges_of_cells;
132 build_edges_3D(nodes_of_edges, edges_of_cells);
133
134 DoubleTab new_nodes;
135 build_new_nodes(new_nodes, nodes_of_edges);
136
137 IntTab new_cells;
138 build_new_cells_3D(new_cells, edges_of_cells);
139
140 Noms new_sub_domaines_descriptions;
141 build_new_sub_domaines_descriptions(new_sub_domaines_descriptions);
142
143 Static_Int_Lists incidence_from_node_to_edges;
144 build_incidence_from_node_to_edges(new_nodes.dimension(0), nodes_of_edges, incidence_from_node_to_edges);
145
146 IntTabs new_nodes_of_boundary_faces;
147 IntTabs new_cells_of_boundary_faces;
148 build_new_boundary_faces_3D(new_nodes_of_boundary_faces, new_cells_of_boundary_faces, incidence_from_node_to_edges);
149
150 IntTabs new_nodes_of_connector_faces;
151 IntTabs new_cells_of_connector_faces;
152 build_new_connector_faces_3D(new_nodes_of_connector_faces, new_cells_of_connector_faces, incidence_from_node_to_edges);
153
154 IntTabs new_nodes_of_internal_frontier_faces;
155 IntTabs new_cells_of_internal_frontier_faces;
156 build_new_internal_frontier_faces_3D(new_nodes_of_internal_frontier_faces, new_cells_of_internal_frontier_faces, incidence_from_node_to_edges);
157
158 update_domain(Nom("Tetraedre"), Type_Face::triangle_3D, new_nodes, new_cells, new_sub_domaines_descriptions, new_nodes_of_boundary_faces, new_cells_of_boundary_faces, new_nodes_of_connector_faces,
159 new_cells_of_connector_faces, new_nodes_of_internal_frontier_faces, new_cells_of_internal_frontier_faces);
160
162}
163
164void Refine_Mesh::build_edges_2D(IntTab& nodes_of_edges, IntTab& edges_of_cells) const
165{
166 const int nb_edges_per_cell = 3;
167 const int nb_nodes_per_edge = 2;
168
169 IntTab local_nodes_of_edges(nb_edges_per_cell, nb_nodes_per_edge);
170 local_nodes_of_edges(0, 0) = 0;
171 local_nodes_of_edges(0, 1) = 1;
172 local_nodes_of_edges(1, 0) = 0;
173 local_nodes_of_edges(1, 1) = 2;
174 local_nodes_of_edges(2, 0) = 1;
175 local_nodes_of_edges(2, 1) = 2;
176
177 build_edges(nodes_of_edges, edges_of_cells, nb_edges_per_cell, nb_nodes_per_edge, local_nodes_of_edges);
178}
179
180void Refine_Mesh::build_edges_3D(IntTab& nodes_of_edges, IntTab& edges_of_cells) const
181{
182 const int nb_edges_per_cell = 6;
183 const int nb_nodes_per_edge = 2;
184
185 IntTab local_nodes_of_edges(nb_edges_per_cell, nb_nodes_per_edge);
186 local_nodes_of_edges(0, 0) = 0;
187 local_nodes_of_edges(0, 1) = 1;
188 local_nodes_of_edges(1, 0) = 0;
189 local_nodes_of_edges(1, 1) = 2;
190 local_nodes_of_edges(2, 0) = 0;
191 local_nodes_of_edges(2, 1) = 3;
192 local_nodes_of_edges(3, 0) = 1;
193 local_nodes_of_edges(3, 1) = 2;
194 local_nodes_of_edges(4, 0) = 1;
195 local_nodes_of_edges(4, 1) = 3;
196 local_nodes_of_edges(5, 0) = 2;
197 local_nodes_of_edges(5, 1) = 3;
198
199 build_edges(nodes_of_edges, edges_of_cells, nb_edges_per_cell, nb_nodes_per_edge, local_nodes_of_edges);
200}
201
202void Refine_Mesh::build_edges(IntTab& nodes_of_edges, IntTab& edges_of_cells, int nb_edges_per_cell, int nb_nodes_per_edge, const IntTab& local_nodes_of_edges) const
203{
204 const IntTab& cells = domaine().les_elems();
205
206 const int nb_cells = cells.dimension(0);
207
208 int size = nb_cells * nb_edges_per_cell;
209 IntTab nodes_of_edges_tmp(size, nb_nodes_per_edge);
210 edges_of_cells.resize(nb_cells, nb_edges_per_cell);
211 ArrOfInt global_nodes_of_edge(nb_nodes_per_edge);
212
213 for (int c = 0; c < nb_cells; ++c)
214 {
215 for (int e = 0; e < nb_edges_per_cell; ++e)
216 {
217 const int idx = c * nb_edges_per_cell + e;
218
219 for (int n = 0; n < nb_nodes_per_edge; ++n)
220 {
221 global_nodes_of_edge[n] = cells(c, local_nodes_of_edges(e, n));
222 }
223
224 nodes_of_edges_tmp(idx, 0) = (global_nodes_of_edge[0] < global_nodes_of_edge[1]) ? global_nodes_of_edge[0] : global_nodes_of_edge[1];
225 nodes_of_edges_tmp(idx, 1) = (global_nodes_of_edge[0] < global_nodes_of_edge[1]) ? global_nodes_of_edge[1] : global_nodes_of_edge[0];
226
227 edges_of_cells(c, e) = idx;
228 }
229 }
230
231 ArrOfInt renum;
232 ArrOfInt renum_inverse;
233 calculer_renum_sans_doublons(nodes_of_edges_tmp, renum, renum_inverse);
234
235 const int nb_edges = renum_inverse.size_array();
236 nodes_of_edges.resize(nb_edges, nb_nodes_per_edge);
237 for (int e = 0; e < nb_edges; ++e)
238 {
239 for (int n = 0; n < nb_nodes_per_edge; ++n)
240 {
241 nodes_of_edges(e, n) = nodes_of_edges_tmp(renum_inverse[e], n);
242 }
243 }
244
245 for (int c = 0; c < nb_cells; ++c)
246 {
247 for (int e = 0; e < nb_edges_per_cell; ++e)
248 {
249 edges_of_cells(c, e) = renum[edges_of_cells(c, e)];
250 }
251 }
252}
253
254void Refine_Mesh::build_new_nodes(DoubleTab& new_nodes, const IntTab& nodes_of_edges) const
255{
256 const DoubleTab& nodes = domaine().les_sommets();
257
258 const int nb_nodes = nodes.dimension(0);
259 const int nb_edges = nodes_of_edges.dimension(0);
260
261 new_nodes.resize(nb_nodes + nb_edges, Objet_U::dimension);
262 for (int n = 0; n < nb_nodes; ++n)
263 {
264 for (int i = 0; i < Objet_U::dimension; ++i)
265 {
266 new_nodes(n, i) = nodes(n, i);
267 }
268 }
269
270 for (int e = 0; e < nb_edges; ++e)
271 {
272 for (int i = 0; i < Objet_U::dimension; ++i)
273 {
274 new_nodes(e + nb_nodes, i) = 0.5 * (nodes(nodes_of_edges(e, 0), i) + nodes(nodes_of_edges(e, 1), i));
275 }
276 }
277}
278
279void Refine_Mesh::build_new_cells_2D(IntTab& new_cells, const IntTab& edges_of_cells) const
280{
281 const DoubleTab& nodes = domaine().les_sommets();
282 const IntTab& cells = domaine().les_elems();
283
284 const int nb_cells = cells.dimension(0);
285 const int nb_nodes = nodes.dimension(0);
286
287 new_cells.resize(4 * nb_cells, 3);
288
289 int n0, n1, n2, n01, n02, n12;
290 for (int c = 0; c < nb_cells; ++c)
291 {
292 n0 = cells(c, 0);
293 n1 = cells(c, 1);
294 n2 = cells(c, 2);
295 n01 = nb_nodes + edges_of_cells(c, 0);
296 n02 = nb_nodes + edges_of_cells(c, 1);
297 n12 = nb_nodes + edges_of_cells(c, 2);
298
299 new_cells(4 * c + 0, 0) = n0;
300 new_cells(4 * c + 0, 1) = n01;
301 new_cells(4 * c + 0, 2) = n02;
302 new_cells(4 * c + 1, 0) = n01;
303 new_cells(4 * c + 1, 1) = n1;
304 new_cells(4 * c + 1, 2) = n12;
305 new_cells(4 * c + 2, 0) = n02;
306 new_cells(4 * c + 2, 1) = n12;
307 new_cells(4 * c + 2, 2) = n2;
308 new_cells(4 * c + 3, 0) = n12;
309 new_cells(4 * c + 3, 1) = n02;
310 new_cells(4 * c + 3, 2) = n01;
311 }
312}
313
314void Refine_Mesh::build_new_cells_3D(IntTab& new_cells, const IntTab& edges_of_cells) const
315{
316 const DoubleTab& nodes = domaine().les_sommets();
317 const IntTab& cells = domaine().les_elems();
318
319 const int nb_cells = cells.dimension(0);
320 const int nb_nodes = nodes.dimension(0);
321
322 new_cells.resize(8 * nb_cells, 4);
323
324 int n0, n1, n2, n3, n01, n02, n03, n12, n13, n23;
325 for (int c = 0; c < nb_cells; ++c)
326 {
327 n0 = cells(c, 0);
328 n1 = cells(c, 1);
329 n2 = cells(c, 2);
330 n3 = cells(c, 3);
331 n01 = nb_nodes + edges_of_cells(c, 0);
332 n02 = nb_nodes + edges_of_cells(c, 1);
333 n03 = nb_nodes + edges_of_cells(c, 2);
334 n12 = nb_nodes + edges_of_cells(c, 3);
335 n13 = nb_nodes + edges_of_cells(c, 4);
336 n23 = nb_nodes + edges_of_cells(c, 5);
337
338 new_cells(8 * c + 0, 0) = n0;
339 new_cells(8 * c + 0, 1) = n01;
340 new_cells(8 * c + 0, 2) = n02;
341 new_cells(8 * c + 0, 3) = n03;
342 new_cells(8 * c + 1, 0) = n01;
343 new_cells(8 * c + 1, 1) = n1;
344 new_cells(8 * c + 1, 2) = n12;
345 new_cells(8 * c + 1, 3) = n13;
346 new_cells(8 * c + 2, 0) = n02;
347 new_cells(8 * c + 2, 1) = n12;
348 new_cells(8 * c + 2, 2) = n2;
349 new_cells(8 * c + 2, 3) = n23;
350 new_cells(8 * c + 3, 0) = n03;
351 new_cells(8 * c + 3, 1) = n13;
352 new_cells(8 * c + 3, 2) = n23;
353 new_cells(8 * c + 3, 3) = n3;
354 new_cells(8 * c + 4, 0) = n02;
355 new_cells(8 * c + 4, 1) = n23;
356 new_cells(8 * c + 4, 2) = n13;
357 new_cells(8 * c + 4, 3) = n12;
358 new_cells(8 * c + 5, 0) = n23;
359 new_cells(8 * c + 5, 1) = n13;
360 new_cells(8 * c + 5, 2) = n03;
361 new_cells(8 * c + 5, 3) = n02;
362 new_cells(8 * c + 6, 0) = n13;
363 new_cells(8 * c + 6, 1) = n03;
364 new_cells(8 * c + 6, 2) = n02;
365 new_cells(8 * c + 6, 3) = n01;
366 new_cells(8 * c + 7, 0) = n12;
367 new_cells(8 * c + 7, 1) = n02;
368 new_cells(8 * c + 7, 2) = n01;
369 new_cells(8 * c + 7, 3) = n13;
370 }
371}
372
373void Refine_Mesh::build_new_sub_domaines_descriptions(Noms& sub_domaines_descriptions) const
374{
375 const int nb_sub_domaines = domaine().nb_ss_domaines();
376 sub_domaines_descriptions.dimensionner(nb_sub_domaines);
377
378 const int nb_new_cells_per_old_cell = (Objet_U::dimension == 2) ? 4 : 8;
379
380 for (int i = 0; i < nb_sub_domaines; ++i)
381 {
382 const Sous_Domaine& sub_domaine = domaine().ss_domaine(i);
383 const int old_nb_cells_in_sub_domaine = sub_domaine.nb_elem_tot();
384 const int new_nb_cells_in_sub_domaine = old_nb_cells_in_sub_domaine * nb_new_cells_per_old_cell;
385 IntVect new_sub_domaine_cells(new_nb_cells_in_sub_domaine);
386 int idx = 0;
387 for (int c = 0; c < old_nb_cells_in_sub_domaine; ++c)
388 {
389 const int old_cell = sub_domaine[c];
390 for (int j = 0; j < nb_new_cells_per_old_cell; ++j)
391 {
392 new_sub_domaine_cells[idx] = old_cell * nb_new_cells_per_old_cell + j;
393 ++idx;
394 }
395 }
396
397 SChaine os;
398 os << " { Liste " << new_sub_domaine_cells << " } ";
399 sub_domaines_descriptions[i] = Nom(os.get_str());
400 }
401}
402
403void Refine_Mesh::build_incidence_from_node_to_edges(int nb_nodes, const IntTab& nodes_of_edges, Static_Int_Lists& incidence) const
404{
405 const int nb_edges = nodes_of_edges.dimension(0);
406 const int nb_nodes_per_edge = nodes_of_edges.dimension(1);
407
408 ArrOfInt nb_incident_edges(nb_nodes);
409
410 for (int edge = 0; edge < nb_edges; ++edge)
411 {
412 for (int n = 0; n < nb_nodes_per_edge; ++n)
413 {
414 const int node = nodes_of_edges(edge, n);
415 ++nb_incident_edges[node];
416 }
417 }
418
419 incidence.set_list_sizes(nb_incident_edges);
420
421 nb_incident_edges = 0;
422 for (int edge = 0; edge < nb_edges; ++edge)
423 {
424 for (int n = 0; n < nb_nodes_per_edge; ++n)
425 {
426 const int node = nodes_of_edges(edge, n);
427 const int index = nb_incident_edges[node];
428 incidence.set_value(node, index, edge);
429 ++nb_incident_edges[node];
430 }
431 }
432
433 incidence.trier_liste(-1);
434}
435
436void Refine_Mesh::build_new_boundary_faces_2D(IntTabs& new_nodes_of_boundary_faces, IntTabs& new_cells_of_boundary_faces, const Static_Int_Lists& incidence_from_node_to_edges) const
437{
438 const int nb_boundaries = domaine().nb_bords();
439 new_nodes_of_boundary_faces.dimensionner(nb_boundaries);
440 new_cells_of_boundary_faces.dimensionner(nb_boundaries);
441
442 int boundary = 0;
443 for (const auto &itr : domaine().faces_bord())
444 {
445 IntTab& nodes = new_nodes_of_boundary_faces[boundary];
446 IntTab& cells = new_cells_of_boundary_faces[boundary];
447 build_new_frontier_faces_2D(nodes, cells, incidence_from_node_to_edges, itr.faces());
448 ++boundary;
449 }
450}
451
452void Refine_Mesh::build_new_boundary_faces_3D(IntTabs& new_nodes_of_boundary_faces, IntTabs& new_cells_of_boundary_faces, const Static_Int_Lists& incidence_from_node_to_edges) const
453{
454 const int nb_boundaries = domaine().nb_bords();
455 new_nodes_of_boundary_faces.dimensionner(nb_boundaries);
456 new_cells_of_boundary_faces.dimensionner(nb_boundaries);
457
458 int boundary = 0;
459 for (const auto &itr : domaine().faces_bord())
460 {
461 IntTab& nodes = new_nodes_of_boundary_faces[boundary];
462 IntTab& cells = new_cells_of_boundary_faces[boundary];
463 build_new_frontier_faces_3D(nodes, cells, incidence_from_node_to_edges, itr.faces());
464 ++boundary;
465 }
466}
467
468void Refine_Mesh::build_new_connector_faces_2D(IntTabs& new_nodes_of_connector_faces, IntTabs& new_cells_of_connector_faces, const Static_Int_Lists& incidence_from_node_to_edges) const
469{
470 const int nb_connectors = domaine().nb_raccords();
471 new_nodes_of_connector_faces.dimensionner(nb_connectors);
472 new_cells_of_connector_faces.dimensionner(nb_connectors);
473
474 int connector = 0;
475 for (const auto &itr : domaine().faces_raccord())
476 {
477 IntTab& nodes = new_nodes_of_connector_faces[connector];
478 IntTab& cells = new_cells_of_connector_faces[connector];
479 build_new_frontier_faces_2D(nodes, cells, incidence_from_node_to_edges, itr->faces());
480 ++connector;
481 }
482}
483
484void Refine_Mesh::build_new_connector_faces_3D(IntTabs& new_nodes_of_connector_faces, IntTabs& new_cells_of_connector_faces, const Static_Int_Lists& incidence_from_node_to_edges) const
485{
486 const int nb_connectors = domaine().nb_raccords();
487 new_nodes_of_connector_faces.dimensionner(nb_connectors);
488 new_cells_of_connector_faces.dimensionner(nb_connectors);
489
490 int connector = 0;
491 for (const auto &itr : domaine().faces_raccord())
492 {
493 IntTab& nodes = new_nodes_of_connector_faces[connector];
494 IntTab& cells = new_cells_of_connector_faces[connector];
495 build_new_frontier_faces_3D(nodes, cells, incidence_from_node_to_edges, itr->faces());
496 ++connector;
497 }
498}
499
500void Refine_Mesh::build_new_internal_frontier_faces_2D(IntTabs& new_nodes_of_internal_frontier_faces, IntTabs& new_cells_of_internal_frontier_faces,
501 const Static_Int_Lists& incidence_from_node_to_edges) const
502{
503 const int nb_internal_frontier = domaine().nb_frontieres_internes();
504 new_nodes_of_internal_frontier_faces.dimensionner(nb_internal_frontier);
505 new_cells_of_internal_frontier_faces.dimensionner(nb_internal_frontier);
506
507 int internal_frontier = 0;
508 for (const auto& itr : domaine().bords_int())
509 {
510 IntTab& nodes = new_nodes_of_internal_frontier_faces[internal_frontier];
511 IntTab& cells = new_cells_of_internal_frontier_faces[internal_frontier];
512 build_new_frontier_faces_2D(nodes, cells, incidence_from_node_to_edges, itr.faces());
513 ++internal_frontier;
514 }
515}
516
517void Refine_Mesh::build_new_internal_frontier_faces_3D(IntTabs& new_nodes_of_internal_frontier_faces, IntTabs& new_cells_of_internal_frontier_faces,
518 const Static_Int_Lists& incidence_from_node_to_edges) const
519{
520 const int nb_internal_frontier = domaine().nb_frontieres_internes();
521 new_nodes_of_internal_frontier_faces.dimensionner(nb_internal_frontier);
522 new_cells_of_internal_frontier_faces.dimensionner(nb_internal_frontier);
523
524 int internal_frontier = 0;
525 for (const auto& itr : domaine().bords_int())
526 {
527 IntTab& nodes = new_nodes_of_internal_frontier_faces[internal_frontier];
528 IntTab& cells = new_cells_of_internal_frontier_faces[internal_frontier];
529 build_new_frontier_faces_3D(nodes, cells, incidence_from_node_to_edges, itr.faces());
530 ++internal_frontier;
531 }
532}
533
534void Refine_Mesh::build_new_frontier_faces_2D(IntTab& new_nodes_of_frontier_faces, IntTab& new_cells_of_frontier_faces, const Static_Int_Lists& incidence_from_node_to_edges,
535 const Faces& old_frontier_faces) const
536{
537 const int nb_nodes = domaine().les_sommets().dimension(0);
538
539 const int old_nb_faces = old_frontier_faces.nb_faces();
540 const int new_nb_faces = old_nb_faces * 2;
541
542 const IntTab& old_nodes_of_frontier_faces = old_frontier_faces.les_sommets();
543
544 new_nodes_of_frontier_faces.resize(new_nb_faces, 2);
545 for (int f = 0; f < old_nb_faces; ++f)
546 {
547 const int node0 = old_nodes_of_frontier_faces(f, 0);
548 const int node1 = old_nodes_of_frontier_faces(f, 1);
549 const int edge = find_edge(incidence_from_node_to_edges, node0, node1);
550
551 new_nodes_of_frontier_faces(2 * f + 0, 0) = node0;
552 new_nodes_of_frontier_faces(2 * f + 0, 1) = nb_nodes + edge;
553
554 new_nodes_of_frontier_faces(2 * f + 1, 0) = nb_nodes + edge;
555 new_nodes_of_frontier_faces(2 * f + 1, 1) = node1;
556 }
557
558 new_cells_of_frontier_faces.resize(new_nb_faces, 2);
559 new_cells_of_frontier_faces = -1;
560}
561
562void Refine_Mesh::build_new_frontier_faces_3D(IntTab& new_nodes_of_frontier_faces, IntTab& new_cells_of_frontier_faces, const Static_Int_Lists& incidence_from_node_to_edges,
563 const Faces& old_frontier_faces) const
564{
565 const int nb_nodes = domaine().les_sommets().dimension(0);
566
567 const int old_nb_faces = old_frontier_faces.nb_faces();
568 const int new_nb_faces = old_nb_faces * 4;
569
570 const IntTab old_nodes_of_frontier_faces = old_frontier_faces.les_sommets();
571
572 new_nodes_of_frontier_faces.resize(new_nb_faces, 3);
573 for (int f = 0; f < old_nb_faces; ++f)
574 {
575 const int node0 = old_nodes_of_frontier_faces(f, 0);
576 const int node1 = old_nodes_of_frontier_faces(f, 1);
577 const int node2 = old_nodes_of_frontier_faces(f, 2);
578
579 const int edge0 = find_edge(incidence_from_node_to_edges, node1, node2);
580 const int edge1 = find_edge(incidence_from_node_to_edges, node2, node0);
581 const int edge2 = find_edge(incidence_from_node_to_edges, node0, node1);
582
583 new_nodes_of_frontier_faces(4 * f + 0, 0) = node0;
584 new_nodes_of_frontier_faces(4 * f + 0, 1) = nb_nodes + edge2;
585 new_nodes_of_frontier_faces(4 * f + 0, 2) = nb_nodes + edge1;
586
587 new_nodes_of_frontier_faces(4 * f + 1, 0) = nb_nodes + edge2;
588 new_nodes_of_frontier_faces(4 * f + 1, 1) = node1;
589 new_nodes_of_frontier_faces(4 * f + 1, 2) = nb_nodes + edge0;
590
591 new_nodes_of_frontier_faces(4 * f + 2, 0) = nb_nodes + edge1;
592 new_nodes_of_frontier_faces(4 * f + 2, 1) = nb_nodes + edge0;
593 new_nodes_of_frontier_faces(4 * f + 2, 2) = node2;
594
595 new_nodes_of_frontier_faces(4 * f + 3, 0) = nb_nodes + edge0;
596 new_nodes_of_frontier_faces(4 * f + 3, 1) = nb_nodes + edge1;
597 new_nodes_of_frontier_faces(4 * f + 3, 2) = nb_nodes + edge2;
598 }
599
600 new_cells_of_frontier_faces.resize(new_nb_faces, 2);
601 new_cells_of_frontier_faces = -1;
602}
603
604int Refine_Mesh::find_edge(const Static_Int_Lists& incidence_from_node_to_edges, int node0, int node1) const
605{
606 ArrOfInt edges0;
607 incidence_from_node_to_edges.copy_list_to_array(node0, edges0);
608
609 ArrOfInt edges1;
610 incidence_from_node_to_edges.copy_list_to_array(node1, edges1);
611
612 array_calculer_intersection(edges0, edges1);
613
614 assert(edges0.size_array() == 1);
615 return edges0[0];
616}
617
618void Refine_Mesh::update_domain(const Nom& cell_type, const Type_Face& face_type, const DoubleTab& new_nodes, const IntTab& new_cells, const Noms& new_sub_domaines_descriptions,
619 const IntTabs& new_nodes_of_boundary_faces, const IntTabs& new_cells_of_boundary_faces, const IntTabs& new_nodes_of_connector_faces,
620 const IntTabs& new_cells_of_connector_faces, const IntTabs& new_nodes_of_internal_frontier_faces, const IntTabs& new_cells_of_internal_frontier_faces)
621{
622 update_nodes(new_nodes);
623 update_cells(new_cells);
624 update_octree(cell_type);
625 update_sub_domaines(new_sub_domaines_descriptions);
626 update_boundary_faces(face_type, new_nodes_of_boundary_faces, new_cells_of_boundary_faces);
627 update_connector_faces(face_type, new_nodes_of_connector_faces, new_cells_of_connector_faces);
628 update_internal_frontier_faces(face_type, new_nodes_of_internal_frontier_faces, new_cells_of_internal_frontier_faces);
629}
630
631void Refine_Mesh::update_nodes(const DoubleTab& new_nodes)
632{
633 domaine().les_sommets().ref(new_nodes);
634}
635
636void Refine_Mesh::update_cells(const IntTab& new_cells)
637{
638 domaine().les_elems().ref(new_cells);
639}
640
641void Refine_Mesh::update_octree(const Nom& cell_type)
642{
644 domaine().typer(cell_type);
646}
647
648void Refine_Mesh::update_sub_domaines(const Noms& new_sub_domaines_descriptions)
649{
650 const int nb_sub_domaines = domaine().nb_ss_domaines();
651 for (int i = 0; i < nb_sub_domaines; ++i)
652 {
653 Sous_Domaine& sub_domaine = domaine().ss_domaine(i);
654 const Nom& description = new_sub_domaines_descriptions[i];
655 EChaine is(description.getChar());
656 is >> sub_domaine;
657 }
658}
659
660void Refine_Mesh::update_boundary_faces(const Type_Face& face_type, const IntTabs& new_nodes_of_boundary_faces, const IntTabs& new_cells_of_boundary_faces)
661{
662 int boundary = 0;
663 for (auto &itr : domaine().faces_bord())
664 {
665 Faces& faces = itr.faces();
666 faces.typer(face_type);
667 faces.les_sommets().ref(new_nodes_of_boundary_faces[boundary]);
668 faces.voisins().ref(new_cells_of_boundary_faces[boundary]);
669 ++boundary;
670 }
671}
672
673void Refine_Mesh::update_connector_faces(const Type_Face& face_type, const IntTabs& new_nodes_of_connector_faces, const IntTabs& new_cells_of_connector_faces)
674{
675 int connector = 0;
676 for (auto &itr : domaine().faces_raccord())
677 {
678 Faces& faces = itr->faces();
679 faces.typer(face_type);
680 faces.les_sommets().ref(new_nodes_of_connector_faces[connector]);
681 faces.voisins().ref(new_cells_of_connector_faces[connector]);
682 ++connector;
683 }
684}
685
686void Refine_Mesh::update_internal_frontier_faces(const Type_Face& face_type, const IntTabs& new_nodes_of_internal_frontier_faces, const IntTabs& new_cells_of_internal_frontier_faces)
687{
688 int internal_frontier = 0;
689 for (auto &itr : domaine().bords_int())
690 {
691 Faces& faces = itr.faces();
692 faces.typer(face_type);
693 faces.les_sommets().ref(new_nodes_of_internal_frontier_faces[internal_frontier]);
694 faces.voisins().ref(new_cells_of_internal_frontier_faces[internal_frontier]);
695 ++internal_frontier;
696 }
697}
const Sous_Domaine_t & ss_domaine(int i) const
Definition Domaine.h:290
const OctreeRoot_t & construit_octree() const
Definition Domaine.cpp:817
DoubleTab_t & les_sommets()
Definition Domaine.h:113
int nb_frontieres_internes() const
Definition Domaine.h:235
int nb_ss_domaines() const
Definition Domaine.h:289
IntTab_t & les_elems()
Definition Domaine.h:129
void invalide_octree()
Definition Domaine.cpp:810
int nb_bords() const
Definition Domaine.h:192
void typer(const Nom &)
Type les elements du domaine avec le nom passe en parametre.
Definition Domaine.h:457
int nb_raccords() const
Definition Domaine.h:247
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Une entree dont la source est une chaine de caracteres.
Definition EChaine.h:31
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
void typer(const Motcle &)
Type les faces.
Definition Faces.cpp:390
IntTab_t & voisins()
Renvoie le tableau des voisins (des faces).
Definition Faces.h:89
int_t nb_faces() const
Definition Faces.h:66
const IntTab_t & les_sommets() const
Renvoie le tableau des sommets de toutes les faces.
Definition Faces.h:74
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
const char * getChar() const
Definition Nom.h:91
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
friend class Entree
Definition Objet_U.h:76
static int dimension
Definition Objet_U.h:99
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
: class Refine_Mesh
Definition Refine_Mesh.h:27
void update_cells(const IntTab &new_cells)
void check_cell_type() const
void build_new_internal_frontier_faces_2D(IntTabs &new_nodes_of_internal_frontier_faces, IntTabs &new_cells_of_internal_frontier_faces, const Static_Int_Lists &incidence_from_node_to_edges) const
Entree & interpreter_(Entree &is) override
void build_new_connector_faces_3D(IntTabs &new_nodes_of_connector_faces, IntTabs &new_cells_of_connector_faces, const Static_Int_Lists &incidence_from_node_to_edges) const
void update_internal_frontier_faces(const Type_Face &face_type, const IntTabs &new_nodes_of_internal_frontier_faces, const IntTabs &new_cells_of_internal_frontier_faces)
void build_incidence_from_node_to_edges(int nb_nodes, const IntTab &nodes_of_edges, Static_Int_Lists &incidence) const
void update_octree(const Nom &cell_type)
void update_domain(const Nom &cell_type, const Type_Face &face_type, const DoubleTab &new_nodes, const IntTab &new_cells, const Noms &new_sub_domaines_descriptions, const IntTabs &new_nodes_of_boundary_faces, const IntTabs &new_cells_of_boundary_faces, const IntTabs &new_nodes_of_connector_faces, const IntTabs &new_cells_of_connector_faces, const IntTabs &new_nodes_of_internal_frontier_faces, const IntTabs &new_cells_of_internal_frontier_faces)
void build_new_boundary_faces_3D(IntTabs &new_nodes_of_boundary_faces, IntTabs &new_cells_of_boundary_faces, const Static_Int_Lists &incidence_from_node_to_edges) const
void update_sub_domaines(const Noms &new_sub_domaines_descriptions)
void build_new_internal_frontier_faces_3D(IntTabs &new_nodes_of_internal_frontier_faces, IntTabs &new_cells_of_internal_frontier_faces, const Static_Int_Lists &incidence_from_node_to_edges) const
void build_new_cells_2D(IntTab &new_cells, const IntTab &edges_of_cells) const
void update_nodes(const DoubleTab &new_nodes)
void build_edges_3D(IntTab &nodes_of_edges, IntTab &edges_of_cells) const
void check_dimension() const
void build_new_connector_faces_2D(IntTabs &new_nodes_of_connector_faces, IntTabs &new_cells_of_connector_faces, const Static_Int_Lists &incidence_from_node_to_edges) const
void build_new_cells_3D(IntTab &new_cells, const IntTab &edges_of_cells) const
int find_edge(const Static_Int_Lists &incidence_from_node_to_edges, int node0, int node1) const
void update_boundary_faces(const Type_Face &face_type, const IntTabs &new_nodes_of_boundary_faces, const IntTabs &new_cells_of_boundary_faces)
void update_connector_faces(const Type_Face &face_type, const IntTabs &new_nodes_of_connector_faces, const IntTabs &new_cells_of_connector_faces)
void build_new_nodes(DoubleTab &new_nodes, const IntTab &nodes_of_edges) const
void build_edges_2D(IntTab &nodes_of_edges, IntTab &edges_of_cells) const
void build_new_frontier_faces_3D(IntTab &new_nodes_of_frontier_faces, IntTab &new_cells_of_frontier_faces, const Static_Int_Lists &incidence_from_node_to_edges, const Faces &old_frontier_faces) const
void build_new_sub_domaines_descriptions(Noms &new_sub_domaines_descriptions) const
void build_new_frontier_faces_2D(IntTab &new_nodes_of_frontier_faces, IntTab &new_cells_of_frontier_faces, const Static_Int_Lists &incidence_from_node_to_edges, const Faces &old_frontier_faces) const
void build_new_boundary_faces_2D(IntTabs &new_nodes_of_boundary_faces, IntTabs &new_cells_of_boundary_faces, const Static_Int_Lists &incidence_from_node_to_edges) const
void apply_2D()
void build_edges(IntTab &nodes_of_edges, IntTab &edges_of_cells, int nb_edges_per_cell, int nb_nodes_per_edge, const IntTab &local_nodes_of_edges) const
Cette classe derivee de Sortie empile ce qu'on lui envoie dans une chaine de caracteres.
Definition SChaine.h:26
const char * get_str() const
returns a copy of the string stored by the SChaine
Definition SChaine.cpp:72
static void init_sequential_domain(Domaine_32_64< _SIZE_ > &dom)
Create parallel descriptors for the vertex and element arrays of the domain (necessary because Scatte...
Definition Scatter.cpp:2742
static void uninit_sequential_domain(Domaine_32_64< _SIZE_ > &dom)
methode utilisee par les interpretes qui modifient le domaine (sequentiel), detruit les descripteurs ...
Definition Scatter.cpp:2757
Classe de base des flux de sortie.
Definition Sortie.h:52
int_t nb_elem_tot() const
void copy_list_to_array(int_t i_liste, ArrOfInt_t &array) const
copie la i-ieme liste dans le tableau fourni Le tableau array doit etre resizable.
void set_value(int_t i_liste, int_t i_element, int_t valeur)
affecte la "valeur" au j-ieme element de la i-ieme liste avec 0 <= i < get_nb_lists() et 0 <= j < get...
void trier_liste(int_t i)
tri par ordre croissant des valeurs de la i-ieme liste.
void set_list_sizes(const ArrOfInt_t &sizes)
detruit les listes existantes et en cree de nouvelles.
_SIZE_ size_array() const
virtual void ref(const TRUSTTab &)
Definition TRUSTTab.tpp:308
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
void dimensionner(int i)