Arcane  v3.14.10.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-2022 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-2016 */
9/* */
10/* Tableau de listes d'entités. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArcanePrecomp.h"
15#include "arcane/utils/IFunctor.h"
16#include "arcane/utils/NotImplementedException.h"
17
18#include "arcane/ItemPairGroup.h"
19#include "arcane/IItemFamily.h"
20#include "arcane/ItemGroup.h"
21#include "arcane/ItemPairEnumerator.h"
22#include "arcane/ItemPairGroupBuilder.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27ARCANE_BEGIN_NAMESPACE
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:
140 : m_group(g), m_functor(f){}
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
159ItemPairGroup::
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->findAdjencyItems(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
189: m_impl(p)
190{
191}
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
214ARCANE_END_NAMESPACE
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.
virtual ItemPairGroup findAdjencyItems(const ItemGroup &group, const ItemGroup &sub_group, eItemKind link_kind, Integer nb_layer)=0
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é
Tableau de listes d'entités.
ItemPairGroup()
Construit un tableau vide.
AutoRefT< ItemPairGroupImpl > m_impl
Représentation interne du groupe.
ItemPairGroupImpl * internal() const
Retourne l'implémentation du groupe.
Interface d'un fonctor avec argument mais sans valeur de retour.
eItemKind
Genre d'entité de maillage.