14#include "arcane/mesh/ItemRefinement.h"
17#include "arcane/utils/Real3.h"
18#include "arcane/utils/ArgumentException.h"
20#include "arcane/IParallelMng.h"
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"
34#include "arcane/mesh/MeshRefinement.h"
65, m_orig_nodes_coords(
mesh->nodesCoordinates())
88 Real3 pfc = Real3::null();
89 for(
Node node : face.nodes() ){
90 pfc += nodes_coords[node];
92 pfc /=
static_cast<Real> (face.nbNode());
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());
109 m_cell_hmin[item] = h_min;
117updateChildHMin(ArrayView<ItemInternal*> refine_cells)
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) ;
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());
129 m_cell_hmin[item] = h_min;
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());
160 ARCANE_ASSERT((item.
isActive()), (
"Refine non-active item is forbidden!"));
169 m_nb_cell_to_add = 0;
170 m_nb_face_to_add = 0;
171 m_nb_node_to_add = 0;
175 computeHChildren<typeID>(item, mesh_refinement);
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";
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();
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];
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);
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);
202 for (
Integer i = 0; i < m_nb_cell_to_add; ++i){
203 Item child = cells[m_cells_lid[i]];
209 for (
Integer c = 0; c < nb_hChildren; c++){
212 ARCANE_ASSERT((child.isSubactive()), (
"child must be a sub active item!"));
227#if defined(ARCANE_DEBUG_ASSERT)
228 for (
Integer c = 0; c < nb_hChildren; c++){
231 ARCANE_ASSERT((hParent == item), (
"parent-child relationship is not consistent"));
232 ARCANE_ASSERT((item.
hChild(c).
isActive()), (
"children must be active"));
234 ARCANE_ASSERT((item.
isAncestor()), (
"current item must be an ancestor!"));
248 ARCANE_ASSERT ( (!item.
isActive()), (
"Item is active!"));
255 computeOrigNodesCoords<typeID>(item,rp,sid);
261 if (mychild.
owner() != sid)
277 ARCANE_ASSERT ( (item.
isActive()), (
"item must be active!"));
284template <
int typeID>
void ItemRefinement::
290 const Int32 nb_hChildren = rp.getNbHChildren();
292 m_p.resize(nb_hChildren);
293 m_nodes_uid.resize(nb_hChildren);
297 for (
Integer i = 0; i < nb_nodes; ++i)
298 m_coord[i] = m_orig_nodes_coords[item.
node(i)];
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));
308 m_faces_infos.
clear();
313 typedef std::set<Int64> NodesSet;
315 Integer nb_cnodes_max_total = 0;
318 for (
Integer c = 0; c < nb_hChildren; c++){
319 const Integer c_type_id = rp.hChildrenTypeId(c);
323 nb_cnodes_max_total += nb_cnodes;
324 m_p[c].resize(nb_cnodes);
325 m_nodes_uid[c].resize(nb_cnodes);
327 for (
Integer nc = 0; nc < nb_cnodes; nc++){
329 m_p[c][nc] = Real3::null();
330 m_nodes_uid[c][nc] = NULL_ITEM_ID;
332 for (
Integer n = 0; n < nb_nodes; n++){
334 const Real em_val = rp.refine_matrix(c, nc, n);
337 m_p[c][nc] += m_coord[n] * em_val;
343 nodes_set.insert(m_nodes_uid[c][nc]);
349 if (m_nodes_uid[c][nc] == NULL_ITEM_ID){
351 debug(
Trace::Highest) <<
"\t[refineOneCell] assigning node " << nc <<
" to l'uid:" << m_nodes_uid[c][nc];
353 m_nb_node_to_add = m_nb_node_to_add + 1;
363 Int64 cell_unique_id = first_cell_uid + c;
364 debug(
Trace::Highest) <<
"[refineOneCell] CELL TYPE:" << c_type_id <<
", uid=" << cell_unique_id;
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;
382 for (
Integer f = 0; f < nb_cface; f++){
384 m_face.resize(nb_node_face);
385 Real3 pfc = Real3::null();
386 for (
Integer nc = 0; nc < nb_node_face; nc++){
388 m_face[nc] = m_nodes_uid[c][node_face_rank];
389 pfc += m_p[c][node_face_rank];
391 pfc /=
static_cast<Real>(nb_node_face);
393 bool is_added =
false;
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;
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);
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);
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())
423 nodes_set.insert(uid);
424 m_nodes_to_create_coords.add(m_p[c][nc]);
425 m_nodes_unique_id.add(uid);
430 m_nb_node_to_add = node_local_id;
436template <
int typeID>
void ItemRefinement::
437computeOrigNodesCoords(Cell item,
const ItemRefinementPatternT<typeID>& rp,
const Integer sid)
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)];
444 for (
Integer c = 0; c < item.nbHChildren(); c++){
446 Cell mychild = item.hChild(c);
447 if (mychild.owner() != sid)
449 for (
Integer nc = 0; nc < mychild.nbNode(); nc++){
451 Real3 new_pos = Real3::null();
452 bool calculated_new_pos =
false;
454 for (
Integer n = 0; n < nb_nodes; n++){
457 const Real em_val = rp.refine_matrix(c, nc, n);
460 if ((em_val != 0.) && (em_val != 1.)){
461 new_pos += em_val * m_coord[n];
462 calculated_new_pos =
true;
466 if (calculated_new_pos)
468 m_orig_nodes_coords[mychild.node(nc)] = new_pos;
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)
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);
Déclarations des types utilisés dans Arcane.
void clear()
Supprime les éléments du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
Int32 nbHChildren() const
Nombre d'enfants pour l'AMR.
Cell hChild(Int32 i) const
i-ème enfant AMR
bool hasHChildren() const
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
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.
Int32 flags() const
Flags de l'entité
Flags pour les caractéristiques des entités.
@ II_Inactive
L'entité est inactive //COARSEN_INACTIVE,.
@ II_Refine
L'entité est marquée pour raffinement.
@ II_JustAdded
L'entité vient d'être ajoutée.
@ II_JustRefined
L'entité vient d'être raffinée.
@ II_CoarsenInactive
L'entité est inactive et a des enfants tagués pour déraffinement.
@ II_Coarsen
L'entité est marquée pour déraffinement.
@ II_JustCoarsened
L'entité vient d'être déraffiné
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 nbLocalNode() const
Nombre de noeuds de l'entité
Integer nbLocalFace() const
Nombre de faces de l'entité
Gestionnaire des types d'entités de maillage.
static Int32 nbHChildrenByItemType(Integer type)
AMR.
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
Node node(Int32 i) const
i-ème noeud de l'entité
Int32 nbNode() const
Nombre de noeuds de l'entité
Classe de base d'un élément de maillage.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
impl::ItemBase itemBase() const
Partie interne de l'entité.
Int16 type() const
Type de l'entité
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.
Classe gérant un vecteur de réel de dimension 3.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
ITraceMng * traceMng() const
Gestionnaire de trace.
Paramètres nécessaires à la construction d'une variable.
ItemRefinement(IMesh *mesh)
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 getFirstChildNewUid()
const ItemRefinementPatternT< typeID > & getRefinementPattern() const
Int64 findOrAddNodeUid(const Real3 &p, const Real &tol)
@ Highest
Niveau le plus élevé
std::uint32_t UInt32
Type entier non signé sur 32 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
SharedMeshVariableScalarRefT< Node, Real3 > SharedVariableNodeReal3
Grandeur au noeud de type coordonnées.
double Real
Type représentant un réel.
std::int32_t Int32
Type entier signé sur 32 bits.