Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemPairGroup.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* ItemPairGroup.cc (C) 2000-2024 */
9/* */
10/* Tableau de listes d'entités. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/IFunctor.h"
15#include "arcane/utils/NotImplementedException.h"
16
17#include "arcane/core/ItemPairGroup.h"
18#include "arcane/core/IItemFamily.h"
19#include "arcane/core/ItemGroup.h"
20#include "arcane/core/ItemPairEnumerator.h"
21#include "arcane/core/ItemPairGroupBuilder.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31/*!
32 * \class ItemPairGroup
33 * \ingroup Mesh
34 * \brief Tableau de listes d'entités.
35 *
36 * Cette classe permet de gérer une liste d'entités associée à chaque entité
37 * d'un groupe d'entité (ItemGroup). Par exemple pour chaque noeud d'un groupe l'ensemble
38 * des mailles connectées à ce noeud par les faces.
39 *
40 * Cette classe a une sémantique par référence de la même manière que la
41 * classe ItemGroup.
42 *
43 * %Arcane fournit un ensemble prédéfini de méthodes pour calculer les connectivités
44 * des entités connectées à d'autres entités par un genre spécifique
45 * d'entité. Pour utiliser ces méthodes il faut utiliser le
46 * constructeur suivant:
47 * ItemPairGroup(const ItemGroup& group,const ItemGroup& sub_item_group,
48 * #eItemKind link_kind). \a link_kind indique alors le genre d'entité
49 * qui le lien. Par exemple:
50 *
51 \code
52 * CellGroup cells1;
53 * CellGroup cells2;
54 * // g1 contient pour chaque maille de \a cells1 les mailles qui lui
55 * // sont connectés par les noeuds et qui appartiennent au groupe \a cells2
56 * CellCellGroup g1(cells1,cells2,IK_Node);
57 * ENUMERATE_ITEMPAIR(Cell,Cell,iitem,ad_list){
58 * Cell cell = *iitem;
59 * // Itère sur les mailles connectées à 'cell'
60 * ENUMERATE_SUB_ITEM(Cell,isubitem,iitem){
61 * Cell sub_cell = *iitem;
62 * ...
63 * }
64 * }
65 \endcode
66 *
67 * Il est possible pour l'utilisateur de spécifier une manière particulière
68 * de calcul des connectivités en spécifiant un fonctor de type
69 * ItemPairGroup::CustomFunctor comme argument du constructeur.
70 *
71 * \warning Le fonctor passé en argument doit être alloué par
72 * l'opérateur new et sera détruit en même temps que le ItemPairGroup associé.
73 *
74 * Voici un exemple complet qui calcule les mailles
75 * connectées aux mailles via les faces:
76 *
77 \code
78 * auto f = [](ItemPairGroupBuilder& builder)
79 * {
80 * const ItemPairGroup& pair_group = builder.group();
81 * const ItemGroup& items = pair_group.itemGroup();
82 * const ItemGroup& sub_items = pair_group.subItemGroup();
83
84 * // Marque toutes les entités qui n'ont pas le droit d'appartenir à
85 * // la liste des connectivités car elles ne sont pas dans \a sub_items;
86 * std::set<Int32> allowed_ids;
87 * ENUMERATE_CELL(iitem,sub_items) {
88 * allowed_ids.insert(iitem.itemLocalId());
89 * }
90
91 * Int32Array local_ids;
92 * local_ids.reserve(8);
93
94 * // Liste des entités déjà traitées pour la maille courante
95 * std::set<Int32> already_in_list;
96 * ENUMERATE_CELL(icell,items){
97 * Cell cell = *icell;
98 * local_ids.clear();
99 * Int32 current_local_id = icell.itemLocalId();
100 * already_in_list.clear();
101
102 * // Pour ne pas s'ajouter à sa propre liste de connectivité
103 * already_in_list.insert(current_local_id);
104
105 * for( FaceEnumerator iface(cell.faces()); iface.hasNext(); ++iface ){
106 * Face face = *iface;
107 * for( CellEnumerator isubcell(face.cells()); isubcell.hasNext(); ++isubcell ){
108 * const Int32 sub_local_id = isubcell.itemLocalId();
109 * // Vérifie qu'on est dans la liste des mailles autorisées et qu'on
110 * // n'a pas encore été traité.
111 * if (allowed_ids.find(sub_local_id)==allowed_ids.end())
112 * continue;
113 * if (already_in_list.find(sub_local_id)!=already_in_list.end())
114 * continue;
115 * // Cette maille doit être ajoutée. On la marque pour ne pas
116 * // la parcourir et on l'ajoute à la liste.
117 * already_in_list.insert(sub_local_id);
118 * local_ids.add(sub_local_id);
119 * }
120 * }
121 * builder.addNextItem(local_ids);
122 * }
123 * };
124 *
125 * // Créé un groupe qui calcule les connectivités sur toutes les mailles.
126 * ItemPairGroupT<Cell,Cell> ad_list(allCells(),allCells(),functor::makePointer(f));
127 \endcode
128 */
129/*---------------------------------------------------------------------------*/
130/*---------------------------------------------------------------------------*/
131/*!
132 * \internal
133 * \brief Wrapper sur un fonctor ItemPairGroup::CustomFunctor.
134 */
136: public IFunctor
137{
138 public:
139 CustomFunctorWrapper(ItemPairGroupImpl* g,ItemPairGroup::CustomFunctor* f)
140 : m_group(g), m_functor(f){}
141 ~CustomFunctorWrapper()
142 {
143 delete m_functor;
144 }
145 public:
146 void executeFunctor() override
147 {
148 ItemPairGroupBuilder builder(m_group);
149 m_functor->executeFunctor(builder);
150 }
151 public:
152 ItemPairGroupImpl* m_group;
154};
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
160ItemPairGroup(const ItemGroup& group,const ItemGroup& sub_item_group,
161 eItemKind link_kind)
162: m_impl(nullptr)
163{
164 IItemFamily* item_family = group.itemFamily();
165 ItemPairGroup v = item_family->findAdjacencyItems(group, sub_item_group, link_kind, 1);
166 m_impl = v.internal();
167}
168
169/*---------------------------------------------------------------------------*/
170/*---------------------------------------------------------------------------*/
171
173ItemPairGroup(const ItemGroup& group,const ItemGroup& sub_item_group,
174 CustomFunctor* functor)
175: m_impl(nullptr)
176{
177 ARCANE_CHECK_POINTER(functor);
178 m_impl = new ItemPairGroupImpl(group,sub_item_group);
179 IFunctor* f = new CustomFunctorWrapper(m_impl.get(),functor);
180 m_impl->setComputeFunctor(f);
181 m_impl->invalidate(true);
182}
183
184/*---------------------------------------------------------------------------*/
185/*---------------------------------------------------------------------------*/
186
192
193/*---------------------------------------------------------------------------*/
194/*---------------------------------------------------------------------------*/
195
198: m_impl(ItemPairGroupImpl::checkSharedNull())
199{
200}
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
205ItemPairEnumerator ItemPairGroup::
206enumerator() const
207{
208 return ItemPairEnumerator(*this);
209}
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
213
214}
215
216/*---------------------------------------------------------------------------*/
217/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Interface d'une famille d'entités.
Definition IItemFamily.h:84
virtual ItemPairGroup findAdjacencyItems(const ItemGroup &group, const ItemGroup &sub_group, eItemKind link_kind, Integer nb_layer)
Cherche une liste d'adjacence.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:123
Enumérateur sur un tableau de tableaux d'entités du maillage.
Construction des listes des entités des ItemPairGroup.
void executeFunctor() override
Exécute la méthode associé
IFunctorWithArgumentT< ItemPairGroupBuilder & > CustomFunctor
Functor pour un calcul personnalisé des connectivités.
ItemPairGroup()
Construit un tableau vide.
AutoRefT< ItemPairGroupImpl > m_impl
Représentation interne du groupe.
ItemPairGroupImpl * internal() const
Retourne l'implémentation du groupe.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eItemKind
Genre d'entité de maillage.