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())
89 for(
Node node : face.nodes() ){
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;
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);
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]];
212 ARCANE_ASSERT((child.isSubactive()), (
"child must be a sub active item!"));
227#if defined(ARCANE_DEBUG_ASSERT)
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!"));
263 Integer f =
mychild.itemBase().flags();
268 mychild.mutableItemBase().setFlags(f);
277 ARCANE_ASSERT ( (item.
isActive()), (
"item must be active!"));
284template <
int typeID>
void ItemRefinement::
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();
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));
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++){
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);
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())
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();
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.
Int32 nbHChildren() const
Nombre d'enfants pour l'AMR.
Cell hChild(Int32 i) const
i-ème enfant AMR
bool hasHChildren() const
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.
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 nbLocalFace() const
Nombre de faces de l'entité
Gestionnaire des types d'entités de maillage.
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é.
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é
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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.
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 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.
Classe d'accès aux traces.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
@ Highest
Niveau le plus élevé
Int32 Integer
Type représentant un entier.