Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CellDirectionMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* CellDirectionMng.cc (C) 2000-2023 */
9/* */
10/* Infos sur les mailles d'une direction X Y ou Z d'un maillage structuré. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/FatalErrorException.h"
15#include "arcane/utils/ArgumentException.h"
16#include "arcane/utils/ITraceMng.h"
17#include "arcane/utils/PlatformUtils.h"
18
19#include "arcane/IItemFamily.h"
20#include "arcane/ItemGroup.h"
21#include "arcane/IMesh.h"
22#include "arcane/UnstructuredMeshConnectivity.h"
23
24#include "arcane/cartesianmesh/CellDirectionMng.h"
25#include "arcane/cartesianmesh/ICartesianMesh.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
37{
38 public:
39
41
42 public:
43
44 CellGroup m_inner_all_items;
45 CellGroup m_outer_all_items;
46 CellGroup m_all_items;
47 ICartesianMesh* m_cartesian_mesh = nullptr;
48 Integer m_patch_index = -1;
50 Int32 m_sub_domain_offset = -1;
51 Int32 m_own_nb_cell = -1;
52 Int64 m_global_nb_cell = -1;
53 Int64 m_own_cell_offset = -1;
54};
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58
61: m_direction(MD_DirInvalid)
62, m_next_face_index(-1)
63, m_previous_face_index(-1)
64{
65 for( Integer i=0; i<MAX_NB_NODE; ++i )
66 m_nodes_indirection[i] = (-1);
67}
68
69/*---------------------------------------------------------------------------*/
70/*---------------------------------------------------------------------------*/
71
72void CellDirectionMng::
73_internalInit(ICartesianMesh* cm,eMeshDirection dir,Integer patch_index)
74{
75 if (m_p)
76 ARCANE_FATAL("Initialisation already done");
77 m_p = new Impl();
78 m_direction = dir;
79 m_p->m_cartesian_mesh = cm;
80 m_p->m_patch_index = patch_index;
81}
82
83/*---------------------------------------------------------------------------*/
84/*---------------------------------------------------------------------------*/
85
86void CellDirectionMng::
87_internalDestroy()
88{
89 delete m_p;
90 m_p = nullptr;
91}
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
95
97_internalResizeInfos(Int32 new_size)
98{
99 m_p->m_infos.resize(new_size);
100 m_infos_view = m_p->m_infos.view();
101}
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
105
106void CellDirectionMng::
107_internalComputeInnerAndOuterItems(const ItemGroup& items)
108{
109 Int32UniqueArray inner_lids;
110 Int32UniqueArray outer_lids;
111 IItemFamily* family = items.itemFamily();
112 ENUMERATE_ITEM(iitem,items){
113 Int32 lid = iitem.itemLocalId();
114 Int32 i1 = m_infos_view[lid].m_next_lid;
115 Int32 i2 = m_infos_view[lid].m_previous_lid;
116 if (i1==NULL_ITEM_LOCAL_ID || i2==NULL_ITEM_LOCAL_ID)
117 outer_lids.add(lid);
118 else
119 inner_lids.add(lid);
120 }
121 int dir = (int)m_direction;
122 String base_group_name = String("Direction")+dir;
123 if (m_p->m_patch_index>=0)
124 base_group_name = base_group_name + String("AMRPatch")+m_p->m_patch_index;
125 m_p->m_inner_all_items = family->createGroup(String("AllInner")+base_group_name,inner_lids,true);
126 m_p->m_outer_all_items = family->createGroup(String("AllOuter")+base_group_name,outer_lids,true);
127 m_p->m_all_items = items;
128 m_cells = CellInfoListView(family);
129
130 UnstructuredMeshConnectivityView mesh_connectivity;
131 mesh_connectivity.setMesh(m_p->m_cartesian_mesh->mesh());
132 m_cell_node_view = mesh_connectivity.cellNode();
133 m_cell_face_view = mesh_connectivity.cellFace();
134}
135
136/*---------------------------------------------------------------------------*/
137/*---------------------------------------------------------------------------*/
138
140allCells() const
141{
142 return m_p->m_all_items;
143}
144
145/*---------------------------------------------------------------------------*/
146/*---------------------------------------------------------------------------*/
147
149innerCells() const
150{
151 return m_p->m_inner_all_items;
152}
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
158outerCells() const
159{
160 return m_p->m_outer_all_items;
161}
162
163/*---------------------------------------------------------------------------*/
164/*---------------------------------------------------------------------------*/
165
166void CellDirectionMng::
167setNodesIndirection(ConstArrayView<Int8> nodes_indirection)
168{
169 for( Integer i=0; i<MAX_NB_NODE; ++i )
170 m_nodes_indirection[i] = nodes_indirection[i];
171
172 ITraceMng* tm = m_p->m_cartesian_mesh->traceMng();
173
174 tm->info(4) << "Set computed indirection dir=" << (int)m_direction;
175 for( Integer i=0; i<MAX_NB_NODE; ++i ){
176 tm->info(5) << "Indirection i=" << i << " v=" << (int)m_nodes_indirection[i];
177 }
178}
179
180/*---------------------------------------------------------------------------*/
181/*---------------------------------------------------------------------------*/
182
184globalNbCell() const
185{
186 return (m_p) ? m_p->m_global_nb_cell : -1;
187}
188
189/*---------------------------------------------------------------------------*/
190/*---------------------------------------------------------------------------*/
191
193ownNbCell() const
194{
195 return (m_p) ? m_p->m_own_nb_cell : -1;
196}
197
198/*---------------------------------------------------------------------------*/
199/*---------------------------------------------------------------------------*/
200
202subDomainOffset() const
203{
204 return (m_p) ? m_p->m_sub_domain_offset : -1;
205}
206
207/*---------------------------------------------------------------------------*/
208/*---------------------------------------------------------------------------*/
209
211ownCellOffset() const
212{
213 return (m_p) ? m_p->m_own_cell_offset : -1;
214}
215
216/*---------------------------------------------------------------------------*/
217/*---------------------------------------------------------------------------*/
218
219void CellDirectionMng::
220_internalSetOffsetAndNbCellInfos(Int64 global_nb_cell, Int32 own_nb_cell,
221 Int32 sub_domain_offset, Int64 own_cell_offset)
222{
223 m_p->m_global_nb_cell = global_nb_cell;
224 m_p->m_own_nb_cell = own_nb_cell;
225 m_p->m_sub_domain_offset = sub_domain_offset;
226 m_p->m_own_cell_offset = own_cell_offset;
227}
228
229/*---------------------------------------------------------------------------*/
230/*---------------------------------------------------------------------------*/
231
232} // End namespace Arcane
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
CellGroup outerCells() const
Groupe de toutes les mailles externes dans la direction.
CellGroup allCells() const
Groupe de toutes les mailles dans la direction.
Int64 ownCellOffset() const
Offset dans cette direction de la première maille propre de ce sous-domaine.
Int64 globalNbCell() const
Nombre global de mailles dans cette direction.
CellGroup innerCells() const
Groupe de toutes les mailles internes dans la direction.
CellDirectionMng()
Créé une instance vide.
Int32 subDomainOffset() const
Offset dans cette direction du sous-domaine.
Int32 ownNbCell() const
Nombre de mailles propres dans cette direction.
void _internalResizeInfos(Int32 new_size)
Redimensionne le conteneur contenant les ItemDirectionInfo.
Interface d'un maillage cartésien.
virtual ITraceMng * traceMng() const =0
Gestionnaire de trace associé.
virtual IMesh * mesh() const =0
Maillage associé à ce maillage cartésien.
Interface d'une famille d'entités.
virtual ItemGroup createGroup(const String &name, Int32ConstArrayView local_ids, bool do_override=false)=0
Créé un groupe d'entités de nom name contenant les entités local_ids.
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
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
ArrayView< T > view() const
Vue mutable sur ce tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
IMemoryAllocator * getDefaultDataAllocator()
Allocateur par défaut pour les données.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eMeshDirection
Type de la direction pour un maillage structuré
@ MD_DirInvalid
Direction invalide ou non initialisée.