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 d'un 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.
 
@ Cell
Le maillage est AMR par maille.
 
std::int32_t Int32
Type entier signé sur 32 bits.