Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemRefinement.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ItemRefinement.cc (C) 2000-2023 */
9/* */
10/* liste de méthodes de manipulation d'un maillage AMR. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/mesh/ItemRefinement.h"
15
17#include "arcane/utils/Real3.h"
18#include "arcane/utils/ArgumentException.h"
19
20#include "arcane/IParallelMng.h"
21
22#include "arcane/IMesh.h"
23#include "arcane/IMeshModifier.h"
24#include "arcane/IItemFamily.h"
25#include "arcane/Item.h"
26#include "arcane/ItemRefinementPattern.h"
27#include "arcane/VariableTypes.h"
28#include "arcane/GeometricUtilities.h"
29#include "arcane/ItemPrinter.h"
30#include "arcane/SharedVariable.h"
31#include "arcane/ItemVector.h"
32
33#include <vector>
34#include "arcane/mesh/MeshRefinement.h"
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38
39namespace Arcane::mesh
40{
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44// \brief only compile these functions if the user requests AMR support
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50const Real ItemRefinement::TOLERENCE = 10.0e-6;
51
52/*---------------------------------------------------------------------------*/
53/*---------------------------------------------------------------------------*/
54// Il semble que le calcul de 'cell_hmin' soit légèrement différent (au niveau
55// de l'epsilon machine) en fonction du découpage et du nombre de sous-domaines.
56// On indique donc que la variable 'AMRCellHMin' est dépendente du nombre
57// de sous-domaine pour éviter des faux positifs dans les comparaisons bit à bit.
58
59// Mesh refinement methods
62: TraceAccessor(mesh->traceMng())
63, m_mesh(mesh)
64, m_cell_hmin(VariableBuildInfo(mesh,"AMRCellHMin",IVariable::PSubDomainDepend))
65, m_orig_nodes_coords(mesh->nodesCoordinates())
66, m_refine_factor(2)
67, m_nb_cell_to_add(0)
68, m_nb_face_to_add(0)
69, m_nb_node_to_add(0)
70{
71}
72
73/*---------------------------------------------------------------------------*/
74/*---------------------------------------------------------------------------*/
77{
78 //delete m_irp;
79}
80
81/*---------------------------------------------------------------------------*/
82/*---------------------------------------------------------------------------*/
83
84Real3 ItemRefinement::
86{
87 Face face(iface);
88 Real3 pfc = Real3::null();
89 for( Node node : face.nodes() ){
90 pfc += nodes_coords[node];
91 }
92 pfc /= static_cast<Real> (face.nbNode());
93 return pfc ;
94}
95
96/*---------------------------------------------------------------------------*/
97/*---------------------------------------------------------------------------*/
98
99void ItemRefinement::
100initHMin()
101{
102 ENUMERATE_CELL(item,m_mesh->allCells()){
103 Real h_min=1.e30;
104 for (Integer i=0; i<item->nbNode(); i++)
105 for (Integer j=i+1; j<item->nbNode(); j++){
106 Real3 diff = (m_orig_nodes_coords[item->node(i)] - m_orig_nodes_coords[item->node(j)]) ;
107 h_min = std::min(h_min,diff.normL2());
108 }
109 m_cell_hmin[item] = h_min;
110 }
111}
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
115
116void ItemRefinement::
117updateChildHMin(ArrayView<ItemInternal*> refine_cells)
118{
119 for (Integer k=0; k<refine_cells.size(); k++){
120 Cell parent = refine_cells[k];
121 for (UInt32 i = 0, nc = parent.nbHChildren(); i < nc; i++){
122 Cell item = parent.hChild(i) ;
123 Real h_min=1.e30;
124 for (Integer i=0; i<item.nbNode(); i++)
125 for (Integer j=i+1; j<item.nbNode(); j++){
126 Real3 diff = (m_orig_nodes_coords[item.node(i)] - m_orig_nodes_coords[item.node(j)]) ;
127 h_min = std::min(h_min,diff.normL2());
128 }
129 m_cell_hmin[item] = h_min;
130 }
131 }
132}
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
136
137Real ItemRefinement::
138hmin(Cell item) const
139{
140 Real h_min=1.e30;
141 for (Integer i=0; i<item.nbNode(); i++)
142 for (Integer j=i+1; j<item.nbNode(); j++){
143 Real3 diff = (m_orig_nodes_coords[item.node(i)] - m_orig_nodes_coords[item.node(j)]) ;
144 h_min = std::min(h_min,diff.normL2());
145 }
146
147 return h_min;
148}
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
153template <int typeID> void ItemRefinement::
155{
156 ItemTypeMng* itm = m_mesh->itemTypeMng();
157 const Int32 nb_hChildren = itm->nbHChildrenByItemType(item.type());
158 const Int32 nb_nodes = item.nbNode();
159 ARCANE_ASSERT((item.itemBase().flags() & ItemFlags::II_Refine), ("Item is not flagged for refinement"));
160 ARCANE_ASSERT((item.isActive()), ("Refine non-active item is forbidden!"));
161
162 debug(Trace::High) << "[refineOneCell] nb_hChildren=" << nb_hChildren;
163 debug(Trace::High) << "[refineOneCell] nb_nodes=" << nb_nodes;
165
166 bool has_hChildren = item.hasHChildren();
167 debug(Trace::Highest) << "[refineOneCell] has_hChildren=" << has_hChildren;
168
169 m_nb_cell_to_add = 0;
170 m_nb_face_to_add = 0;
171 m_nb_node_to_add = 0;
172
173 if (!has_hChildren){
174 // Creation des enfants
176 debug()<<"[ItemRefinement::refineOneCell] "<<m_nb_cell_to_add<<" new cells, "
177 <<m_nb_node_to_add<<" new nodes & "<<m_nb_face_to_add<<" faces";
178
179 // Créé les noeuds et positionne leur coordonnées
180 {
181 m_nodes_lid.resize(m_nb_node_to_add);
182 m_mesh->modifier()->addNodes(m_nodes_unique_id, m_nodes_lid);
183 m_mesh->nodeFamily()->endUpdate();
184 NodeInfoListView nodes(m_mesh->nodeFamily());
185 for (Integer i = 0; i < m_nb_node_to_add; ++i) {
186 m_orig_nodes_coords[nodes[m_nodes_lid[i]]] = m_nodes_to_create_coords[i];
187 }
188 }
189
190 // Créé les faces
191 {
192 m_faces_lid.resize(m_nb_face_to_add);
193 m_mesh->modifier()->addFaces(m_nb_face_to_add, m_faces_infos, m_faces_lid);
194 }
195
196 // Créé les mailles
197 {
198 m_cells_lid.resize(m_nb_cell_to_add);
199 m_mesh->modifier()->addHChildrenCells(item, m_nb_cell_to_add, m_cells_infos, m_cells_lid);
201 ItemInfoListView cells(m_mesh->cellFamily());
202 for (Integer i = 0; i < m_nb_cell_to_add; ++i){
203 Item child = cells[m_cells_lid[i]];
205 }
206 }
207 }
208 else{
209 for (Integer c = 0; c < nb_hChildren; c++){
210 Cell child = item.hChild(c);
211 //debug() << "[refineOneCell] child #"<<child->localId();
212 ARCANE_ASSERT((child.isSubactive()), ("child must be a sub active item!"));
213 Integer f = child.mutableItemBase().flags();
215 f &= ~ItemFlags::II_Inactive;
216 child.mutableItemBase().setFlags(f);
217 }
218 }
219
220 // Maintenant, Unset le flag de raffinement de l'item
221 //debug(Trace::High) << "[refineOneCell] et on flush le flag";
222 Integer f = item.itemBase().flags();
223 f &= ~ItemFlags::II_Refine;
226 item.mutableItemBase().setFlags(f);
227#if defined(ARCANE_DEBUG_ASSERT)
228 for (Integer c = 0; c < nb_hChildren; c++){
229 Cell hParent = item.hChild(c).hParent();
230 //debug() << "[refineOneCell] child #"<<c;
231 ARCANE_ASSERT((hParent == item), ("parent-child relationship is not consistent"));
232 ARCANE_ASSERT((item.hChild(c).isActive()), ("children must be active"));
233 }
234 ARCANE_ASSERT((item.isAncestor()), ("current item must be an ancestor!"));
235#endif
236}
237
238/*---------------------------------------------------------------------------*/
239/*---------------------------------------------------------------------------*/
241template <int typeID> void ItemRefinement::
243{
246
247 ARCANE_ASSERT ( (item.itemBase().flags() & ItemFlags::II_CoarsenInactive), ("Item is not for coarsening!"));
248 ARCANE_ASSERT ( (!item.isActive()), ("Item is active!"));
249 //debug(Trace::High) << "[coarsenOneCell] "<<item_internal->uniqueId();
250 // ATT: Nous ne supprimons pas les enfants jusqu'à contraction via MeshRefinement::contract()
251
252 // re-calcul des noeuds hanging
253 IParallelMng* pm = m_mesh->parallelMng();
254 const Integer sid = pm->commRank();
256
257 for (Integer c=0; c<item.nbHChildren(); c++){
258 Cell mychild = item.hChild(c);
259 //debug(Trace::High) << "\t[coarsenOneCell] child #"<<c << ' ' << mychild->uniqueId() << " " << mychild->owner();
260
261 if (mychild.owner() != sid)
262 continue;
263 Integer f = mychild.itemBase().flags();
264 ARCANE_ASSERT ((f & ItemFlags::II_Coarsen),("Item is not flagged for coarsening"));
265 f &= ~ItemFlags::II_Coarsen;
267 // f |= ItemFlags::II_NeedRemove; // TODO activer le flag de suppression
268 mychild.mutableItemBase().setFlags(f);
269 }
270 Integer f = item.itemBase().flags();
271 f &= ~ItemFlags::II_Inactive; // TODO verify if this condition is needed
272 f &= ~ItemFlags::II_CoarsenInactive;
274 //debug(Trace::High) << "[coarsenOneCell] item_internal->flags()="<<f;
275 item.mutableItemBase().setFlags(f);
276
277 ARCANE_ASSERT ( (item.isActive()), ("item must be active!"));
278 //debug() << "[coarsenOneCell] done";
279}
280
281/*---------------------------------------------------------------------------*/
282/*---------------------------------------------------------------------------*/
283
284template <int typeID> void ItemRefinement::
285computeHChildren(Cell item, MeshRefinement& mesh_refinement)
286{
287 debug(Trace::High) << "[refineOneCell] Computing new coordinates";
288
289 const ItemRefinementPatternT<typeID>& rp = mesh_refinement.getRefinementPattern<typeID>();
290 const Int32 nb_hChildren = rp.getNbHChildren();
291
292 m_p.resize(nb_hChildren);
293 m_nodes_uid.resize(nb_hChildren);
294
295 const Int32 nb_nodes = item.nbNode();
296 m_coord.resize(nb_nodes);
297 for (Integer i = 0; i < nb_nodes; ++i)
298 m_coord[i] = m_orig_nodes_coords[item.node(i)];
299
300 const Integer head_size = 2;
301 m_cells_infos.clear();
302 m_cells_infos.reserve(nb_hChildren * (head_size + nb_nodes));
303 debug(Trace::High) << "[refineOneCell] cells_infos reserved size is " << (nb_hChildren * (head_size + nb_nodes));
304
305 Int64 first_cell_uid = mesh_refinement.getFirstChildNewUid();
306 debug(Trace::Highest) << "[refineOneCell] first_cell_uid=" << first_cell_uid;
307
308 m_faces_infos.clear();
309 m_faces_infos.reserve(m_nb_face_to_add * ((m_mesh->dimension() == 3) ? 6 : (m_mesh->dimension() == 2) ? 4 : -1));
310
311 const Real tol = m_cell_hmin[item] * TOLERENCE;
312
313 typedef std::set<Int64> NodesSet;
315 Integer nb_cnodes_max_total = 0;
316
317 ItemTypeMng* itm = m_mesh->itemTypeMng();
318 for (Integer c = 0; c < nb_hChildren; c++){
319 const Integer c_type_id = rp.hChildrenTypeId(c);
320 ItemTypeInfo* c_type = itm->typeFromId(c_type_id);
321
322 const Integer nb_cnodes = c_type->nbLocalNode();
324 m_p[c].resize(nb_cnodes);
325 m_nodes_uid[c].resize(nb_cnodes);
326
327 for (Integer nc = 0; nc < nb_cnodes; nc++){
328 // initialisation
329 m_p[c][nc] = Real3::null();
330 m_nodes_uid[c][nc] = NULL_ITEM_ID;
331
332 for (Integer n = 0; n < nb_nodes; n++){
333 // La valeur à partir de la matrice de raffinement
334 const Real em_val = rp.refine_matrix(c, nc, n);
335
336 if (em_val != 0.){
337 m_p[c][nc] += m_coord[n] * em_val;
338
339 //nous avons pu trouver le noeud, dans ce cas nous
340 //n'aurons pas besoin de le chercher plus tard ni de le creer.
341 if (em_val == 1.){
342 m_nodes_uid[c][nc] = item.node(n).uniqueId().asInt64();
343 nodes_set.insert(m_nodes_uid[c][nc]);
344 }
345 }
346 }
347
348 // assignation des noeuds aux enfants
349 if (m_nodes_uid[c][nc] == NULL_ITEM_ID){
350 m_nodes_uid[c][nc] = mesh_refinement.findOrAddNodeUid(m_p[c][nc], tol);
351 debug(Trace::Highest) << "\t[refineOneCell] assigning node " << nc << " to l'uid:" << m_nodes_uid[c][nc];
352 }
353 m_nb_node_to_add = m_nb_node_to_add + 1;
354 }
355
356 // Création des mailles
357
358 // Infos pour la création des mailles
359 // par maille: 1 pour son unique id,
360 // 1 pour son type,
361 // nb_nodes pour les uid de ses noeuds
362
363 Int64 cell_unique_id = first_cell_uid + c;
364 debug(Trace::Highest) << "[refineOneCell] CELL TYPE:" << c_type_id << ", uid=" << cell_unique_id;
365
366 m_cells_infos.add(c_type_id);
367 m_cells_infos.add(cell_unique_id);
368 for (Integer nc = 0; nc < nb_cnodes; nc++)
369 m_cells_infos.add(m_nodes_uid[c][nc]);
370 m_nb_cell_to_add = m_nb_cell_to_add + 1;
371
372 // Création des faces
373
374 // Infos pour la création des faces
375 // par face: 1 pour son unique id,
376 // 1 pour son type,
377 // nb_nodes pour ses noeuds
378
379 const Integer nb_cface = c_type->nbLocalFace();
380 debug(Trace::High) << "[refineOneCell] nb faces à créer:" << nb_cface;
381
382 for (Integer f = 0; f < nb_cface; f++){
383 const Integer nb_node_face = c_type->localFace(f).nbNode();
384 m_face.resize(nb_node_face);
385 Real3 pfc = Real3::null();
386 for (Integer nc = 0; nc < nb_node_face; nc++){
387 const Integer node_face_rank = c_type->localFace(f).node(nc);
388 m_face[nc] = m_nodes_uid[c][node_face_rank];
389 pfc += m_p[c][node_face_rank];
390 }
391 pfc /= static_cast<Real>(nb_node_face);
392
393 bool is_added = false;
394 Int64 new_face_uid = mesh_refinement.findOrAddFaceUid(pfc, tol, is_added);
395 debug(Trace::Highest) << "\t[refineOneCell] FACE TYPE:" << c_type->localFace(f).typeId();
396 if (is_added) {
397 m_faces_infos.add(c_type->localFace(f).typeId());
398 m_faces_infos.add(new_face_uid);
399 for (Integer nc = 0; nc < nb_node_face; nc++)
400 m_faces_infos.add(m_face[nc]);
401 m_nb_face_to_add = m_nb_face_to_add + 1;
402 }
403 }
404 }
405
406 m_nodes_to_create_coords.clear();
407 m_nodes_to_create_coords.reserve(nb_cnodes_max_total);
408 m_nodes_unique_id.clear();
409 m_nodes_unique_id.reserve(nb_cnodes_max_total);
410
411 Integer node_local_id = 0;
412 debug(Trace::High) << "[refineOneCell] Create nodes and set their coordinates";
413 for (Integer c = 0; c < nb_hChildren; c++){
414 const Integer c_type_id = rp.hChildrenTypeId(c);
415 ItemTypeInfo* c_type = itm->typeFromId(c_type_id);
416
417 const Int32 nb_cnodes = c_type->nbLocalNode();
418 for (Integer nc = 0; nc < nb_cnodes; nc++){
419 const Int64 uid = m_nodes_uid[c][nc];
420 if (nodes_set.find(uid) != nodes_set.end())
421 continue;
422 else{
423 nodes_set.insert(uid);
424 m_nodes_to_create_coords.add(m_p[c][nc]);
425 m_nodes_unique_id.add(uid);
426 ++node_local_id;
427 }
428 }
429 }
430 m_nb_node_to_add = node_local_id;
431}
432
433/*---------------------------------------------------------------------------*/
434/*---------------------------------------------------------------------------*/
435
436template <int typeID> void ItemRefinement::
437computeOrigNodesCoords(Cell item, const ItemRefinementPatternT<typeID>& rp, const Integer sid)
438{
439 const Integer nb_nodes = item.nbNode();
440 m_coord.resize(nb_nodes);
441 for (Integer i = 0; i < nb_nodes; ++i)
442 m_coord[i] = m_orig_nodes_coords[item.node(i)];
443
444 for (Integer c = 0; c < item.nbHChildren(); c++){
445 //debug() << "[coarsenOneCell] child #"<<c;
446 Cell mychild = item.hChild(c);
447 if (mychild.owner() != sid)
448 continue;
449 for (Integer nc = 0; nc < mychild.nbNode(); nc++){
450 //debug() << "\t[coarsenOneCell] node #"<<nc;
451 Real3 new_pos = Real3::null();
452 bool calculated_new_pos = false;
453
454 for (Integer n = 0; n < nb_nodes; n++){
455 //debug() << "\t\t[coarsenOneCell] pos #"<<n;
456 // La valeur à partir de la matrice de raffinement
457 const Real em_val = rp.refine_matrix(c, nc, n);
458
459 // La position du noeud est quelque part entre les sommets existants
460 if ((em_val != 0.) && (em_val != 1.)){
461 new_pos += em_val * m_coord[n];
462 calculated_new_pos = true;
463 }
464 }
465
466 if (calculated_new_pos)
467 //Déplacement du noeud existant de nouveau dans sa position d'origine
468 m_orig_nodes_coords[mychild.node(nc)] = new_pos;
469 }
470 }
471}
472
473/*---------------------------------------------------------------------------*/
474/*---------------------------------------------------------------------------*/
475
476#define ARCANE_INSTANTIATE(typeID) \
477template void ItemRefinement::refineOneCell<typeID>(Cell item_internal, MeshRefinement& mesh_refinement);\
478template void ItemRefinement::coarsenOneCell<typeID>(Cell item_internal, const ItemRefinementPatternT<typeID>& rp);\
479template void ItemRefinement::computeHChildren<typeID>(Cell item, MeshRefinement& mesh_refinement); \
480template void ItemRefinement::computeOrigNodesCoords<typeID>(Cell item, const ItemRefinementPatternT<typeID>& rp, const Integer sid)
481
482ARCANE_INSTANTIATE(IT_Quad4);
483ARCANE_INSTANTIATE(IT_Tetraedron4);
484ARCANE_INSTANTIATE(IT_Pyramid5);
485ARCANE_INSTANTIATE(IT_Pentaedron6);
486ARCANE_INSTANTIATE(IT_Hexaedron8);
487ARCANE_INSTANTIATE(IT_HemiHexa7);
488ARCANE_INSTANTIATE(IT_HemiHexa6);
489ARCANE_INSTANTIATE(IT_HemiHexa5);
490ARCANE_INSTANTIATE(IT_AntiWedgeLeft6);
491ARCANE_INSTANTIATE(IT_AntiWedgeRight6);
492ARCANE_INSTANTIATE(IT_DiTetra5);
493
494/*---------------------------------------------------------------------------*/
495/*---------------------------------------------------------------------------*/
496
497} // End namespace Arcane::mesh
498
499/*---------------------------------------------------------------------------*/
500/*---------------------------------------------------------------------------*/
501
#define ENUMERATE_CELL(name, group)
Enumérateur générique d'un groupe de mailles.
Déclarations des types utilisés dans Arcane.
Maille d'un maillage.
Definition Item.h:1178
Int32 nbHChildren() const
Nombre d'enfants pour l'AMR.
Definition Item.h:1293
bool isAncestor() const
Definition Item.h:1315
Cell hChild(Int32 i) const
i-ème enfant AMR
Definition Item.h:1296
bool hasHChildren() const
Definition Item.h:1321
bool isActive() const
Definition Item.h:1306
Cell hParent() const
Definition Item.h:1287
Face d'une maille.
Definition Item.h:932
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual IMeshModifier * modifier()=0
Interface de modification associée.
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
Interface d'une variable.
Definition IVariable.h:54
Int32 flags() const
Flags de l'entité
Flags pour les caractéristiques des entités.
Definition ItemFlags.h:31
@ II_Inactive
L'entité est inactive //COARSEN_INACTIVE,.
Definition ItemFlags.h:66
@ II_Refine
L'entité est marquée pour raffinement.
Definition ItemFlags.h:63
@ II_JustAdded
L'entité vient d'être ajoutée.
Definition ItemFlags.h:54
@ II_JustRefined
L'entité vient d'être raffinée.
Definition ItemFlags.h:64
@ II_CoarsenInactive
L'entité est inactive et a des enfants tagués pour déraffinement.
Definition ItemFlags.h:67
@ II_Coarsen
L'entité est marquée pour déraffinement.
Definition ItemFlags.h:61
@ II_JustCoarsened
L'entité vient d'être déraffiné
Definition ItemFlags.h:65
Vue sur une liste pour obtenir des informations sur les entités.
Structure interne d'une entité de maillage.
Integer node(Integer i) const
Indice locale dans la maille du i-ème noeud de la face.
Integer typeId() const
Type de l'entité face.
Integer nbNode() const
Nombre de noeuds de la face.
Infos sur un type d'entité du maillage.
LocalFace localFace(Integer id) const
Connectivité locale de la i-ème face de la maille.
Integer nbLocalFace() const
Nombre de faces de l'entité
Gestionnaire des types d'entités de maillage.
Definition ItemTypeMng.h:66
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
Node node(Int32 i) const
i-ème noeud de l'entité
Definition Item.h:768
Int32 nbNode() const
Nombre de noeuds de l'entité
Definition Item.h:765
Classe de base d'un élément de maillage.
Definition Item.h:83
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
Definition Item.h:365
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition Item.h:216
impl::ItemBase itemBase() const
Partie interne de l'entité.
Definition Item.h:354
Int16 type() const
Type de l'entité
Definition Item.h:232
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
void setFlags(Int32 f)
Positionne les flags de l'entité
void addFlags(Int32 added_flags)
Ajoute les flags \added_flags à ceux de l'entité
Vue sur les informations des noeuds.
Noeud d'un maillage.
Definition Dom.h:204
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Paramètres nécessaires à la construction d'une variable.
static const Real TOLERENCE
AMR.
void refineOneCell(Cell item, MeshRefinement &mesh_refinement)
void coarsenOneCell(Cell item, const ItemRefinementPatternT< typeID > &rp)
Implémentation des algorithmes d'adaptation par raffinement de maillages non-structuré.
Int64 findOrAddFaceUid(const Real3 &face_center, const Real &tol, bool &is_added)
Int64 findOrAddNodeUid(const Real3 &p, const Real &tol)
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void clear()
Supprime les éléments du tableau.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
Int32 Integer
Type représentant un entier.