Arcane  v4.1.4.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
NodeDirectionMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* NodeDirectionMng.cc (C) 2000-2026 */
9/* */
10/* Infos sur les mailles d'une direction X Y ou Z d'un maillage structuré. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/cartesianmesh/NodeDirectionMng.h"
15
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/ArgumentException.h"
18#include "arcane/utils/ITraceMng.h"
19#include "arcane/utils/Real3.h"
20#include "arcane/utils/PlatformUtils.h"
21
22#include "arcane/core/IItemFamily.h"
23#include "arcane/core/ItemGroup.h"
24#include "arcane/core/IMesh.h"
25#include "arcane/core/VariableTypes.h"
26#include "arcane/core/UnstructuredMeshConnectivity.h"
27
28#include "arcane/cartesianmesh/ICartesianMesh.h"
29#include "arcane/cartesianmesh/CellDirectionMng.h"
30#include "arcane/cartesianmesh/internal/ICartesianMeshInternal.h"
31
32#include <set>
33
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
36
37namespace Arcane
38{
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
44{
45 public:
46
47 Impl() : m_infos(platform::getDefaultDataAllocator()){}
48
49 public:
50
51 NodeGroup m_inner_all_items;
52 NodeGroup m_outer_all_items;
53 NodeGroup m_inpatch_all_items;
54 NodeGroup m_overlap_all_items;
55 NodeGroup m_all_items;
56 ICartesianMesh* m_cartesian_mesh = nullptr;
57 Integer m_patch_index = -1;
59};
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
63
66: m_direction(MD_DirInvalid)
67, m_p(nullptr)
68{
69}
70
71/*---------------------------------------------------------------------------*/
72/*---------------------------------------------------------------------------*/
73
74/*---------------------------------------------------------------------------*/
75/*---------------------------------------------------------------------------*/
76
79{
80 if (m_p)
81 ARCANE_FATAL("Initialisation already done");
82 m_p = new Impl();
83 m_direction = dir;
84 m_nodes = NodeInfoListView(cm->mesh()->nodeFamily());
85 m_p->m_cartesian_mesh = cm;
86 m_p->m_patch_index = patch_index;
87}
88
89/*---------------------------------------------------------------------------*/
90/*---------------------------------------------------------------------------*/
91
94{
95 delete m_p;
96 m_p = nullptr;
97}
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
104{
105 m_p->m_infos.resize(new_size);
106 m_infos_view = m_p->m_infos.view();
107}
108
109/*---------------------------------------------------------------------------*/
110/*---------------------------------------------------------------------------*/
111
113_internalComputeInfos(const CellDirectionMng& cell_dm,const NodeGroup& all_nodes,
114 const VariableCellReal3& cells_center)
115{
116 Node null_node;
117 m_infos_view.fill(NodeDirectionMng::ItemDirectionInfo());
118
119 Integer mesh_dim = m_p->m_cartesian_mesh->mesh()->dimension();
120 //TODO: ne garder que les noeuds de notre patch
121
122 // Calcul les infos de direction pour les noeuds
123 ENUMERATE_CELL(icell,cell_dm.allCells()){
124 Cell cell = *icell;
125 DirCellNode cn(cell_dm.cellNode(cell));
126
127 NodeLocalId node_next_left = cn.nextLeftId();
128 NodeLocalId node_next_right = cn.nextRightId();
129
130 NodeLocalId node_previous_left = cn.previousLeftId();
131 NodeLocalId node_previous_right = cn.previousRightId();
132
133 m_infos_view[node_previous_left].m_next_lid = node_next_left;
134 m_infos_view[node_next_left].m_previous_lid = node_previous_left;
135
136 m_infos_view[node_previous_right].m_next_lid = node_next_right;
137 m_infos_view[node_next_right].m_previous_lid = node_previous_right;
138
139 if (mesh_dim==3){
140 NodeLocalId top_node_next_left = cn.topNextLeftId();
141 NodeLocalId top_node_next_right = cn.topNextRightId();
142
143 NodeLocalId top_node_previous_left = cn.topPreviousLeftId();
144 NodeLocalId top_node_previous_right = cn.topPreviousRightId();
145
146 m_infos_view[top_node_previous_left].m_next_lid = top_node_next_left;
147 m_infos_view[top_node_next_left].m_previous_lid = top_node_previous_left;
148
149 m_infos_view[top_node_previous_right].m_next_lid = top_node_next_right;
150 m_infos_view[top_node_next_right].m_previous_lid = top_node_previous_right;
151 }
152 }
153
154 Int32UniqueArray inner_lids;
155 Int32UniqueArray outer_lids;
156 IItemFamily* family = all_nodes.itemFamily();
157 ENUMERATE_ITEM (iitem, all_nodes) {
158 Int32 lid = iitem.itemLocalId();
159 Int32 i1 = m_infos_view[lid].m_next_lid;
160 Int32 i2 = m_infos_view[lid].m_previous_lid;
161 if (i1 == NULL_ITEM_LOCAL_ID || i2 == NULL_ITEM_LOCAL_ID)
162 outer_lids.add(lid);
163 else
164 inner_lids.add(lid);
165 }
166 int dir = (int)m_direction;
167 String base_group_name = String("Direction")+dir;
168 if (m_p->m_patch_index>=0)
169 base_group_name = base_group_name + String("AMRPatch")+m_p->m_patch_index;
170 m_p->m_inner_all_items = family->createGroup(String("AllInner")+base_group_name,inner_lids,true);
171 m_p->m_outer_all_items = family->createGroup(String("AllOuter")+base_group_name,outer_lids,true);
172 m_p->m_all_items = all_nodes;
173
174 _filterNodes();
175 _computeNodeCellInfos(cell_dm,cells_center);
176
177 {
178 UnstructuredMeshConnectivityView mesh_connectivity;
179 mesh_connectivity.setMesh(m_p->m_cartesian_mesh->mesh());
180 m_node_cell_view = mesh_connectivity.nodeCell();
181 }
182}
183
184/*---------------------------------------------------------------------------*/
185/*---------------------------------------------------------------------------*/
186
188_internalComputeInfos(const CellDirectionMng& cell_dm, const NodeGroup& all_nodes)
189{
190 m_infos_view.fill(ItemDirectionInfo());
191
192 Integer mesh_dim = m_p->m_cartesian_mesh->mesh()->dimension();
193 //TODO: ne garder que les noeuds de notre patch
194
195 // Calcul les infos de direction pour les noeuds
196 ENUMERATE_CELL (icell, cell_dm.allCells()) {
197 Cell cell = *icell;
198 DirCellNode cn(cell_dm.cellNode(cell));
199
200 NodeLocalId node_next_left = cn.nextLeftId();
201 NodeLocalId node_next_right = cn.nextRightId();
202
203 NodeLocalId node_previous_left = cn.previousLeftId();
204 NodeLocalId node_previous_right = cn.previousRightId();
205
206 m_infos_view[node_previous_left].m_next_lid = node_next_left;
207 m_infos_view[node_next_left].m_previous_lid = node_previous_left;
208
209 m_infos_view[node_previous_right].m_next_lid = node_next_right;
210 m_infos_view[node_next_right].m_previous_lid = node_previous_right;
211
212 if (mesh_dim == 3) {
213 NodeLocalId top_node_next_left = cn.topNextLeftId();
214 NodeLocalId top_node_next_right = cn.topNextRightId();
215
216 NodeLocalId top_node_previous_left = cn.topPreviousLeftId();
217 NodeLocalId top_node_previous_right = cn.topPreviousRightId();
218
219 m_infos_view[top_node_previous_left].m_next_lid = top_node_next_left;
220 m_infos_view[top_node_next_left].m_previous_lid = top_node_previous_left;
221
222 m_infos_view[top_node_previous_right].m_next_lid = top_node_next_right;
223 m_infos_view[top_node_next_right].m_previous_lid = top_node_previous_right;
224 }
225 }
226
227 UniqueArray<Int32> inner_cells_lid;
228 UniqueArray<Int32> outer_cells_lid;
229 cell_dm.innerCells().view().fillLocalIds(inner_cells_lid);
230 cell_dm.outerCells().view().fillLocalIds(outer_cells_lid);
231
232 UniqueArray<Int32> inner_lids;
233 UniqueArray<Int32> outer_lids;
234 // UniqueArray<Int32> inpatch_lids;
235 // UniqueArray<Int32> overlap_lids;
236 IItemFamily* family = all_nodes.itemFamily();
237 ENUMERATE_ (Node, inode, all_nodes) {
238 Int32 lid = inode.itemLocalId();
239 Integer nb_inner_cells = 0;
240 Integer nb_outer_cells = 0;
241 for (Cell cell : inode->cells()) {
242 if (inner_cells_lid.contains(cell.localId())) {
243 nb_inner_cells++;
244 }
245 else if (outer_cells_lid.contains(cell.localId())) {
246 nb_outer_cells++;
247 }
248 }
249 if (nb_inner_cells + nb_outer_cells == inode->nbCell()) {
250 inner_lids.add(lid);
251 }
252 else if (nb_outer_cells != 0) {
253 outer_lids.add(lid);
254 }
255
256 // if (inode->hasFlags(ItemFlags::II_InPatch)) {
257 // inpatch_lids.add(lid);
258 // }
259 // if (inode->hasFlags(ItemFlags::II_Overlap)) {
260 // overlap_lids.add(lid);
261 // }
262 }
263 int dir = (int)m_direction;
264 String base_group_name = String("Direction") + dir;
265 if (m_p->m_patch_index >= 0)
266 base_group_name = base_group_name + String("AMRPatch") + m_p->m_patch_index;
267 m_p->m_inner_all_items = family->createGroup(String("AllInner") + base_group_name, inner_lids, true);
268 m_p->m_outer_all_items = family->createGroup(String("AllOuter") + base_group_name, outer_lids, true);
269 // m_p->m_inpatch_all_items = family->createGroup(String("AllInPatch") + base_group_name, inpatch_lids, true);
270 // m_p->m_overlap_all_items = family->createGroup(String("AllOverlap") + base_group_name, overlap_lids, true);
271 m_p->m_inpatch_all_items = cell_dm.inPatchCells().nodeGroup();
272 m_p->m_overlap_all_items = cell_dm.overlapCells().nodeGroup();
273 m_p->m_all_items = all_nodes;
274
275 _filterNodes();
277
278 {
279 UnstructuredMeshConnectivityView mesh_connectivity;
280 mesh_connectivity.setMesh(m_p->m_cartesian_mesh->mesh());
281 m_node_cell_view = mesh_connectivity.nodeCell();
282 }
283}
284
285/*---------------------------------------------------------------------------*/
286/*---------------------------------------------------------------------------*/
287
294{
295 // Ensemble contenant uniquement les noeuds de notre patch
296 std::set<NodeLocalId> nodes_set;
297 ENUMERATE_NODE(inode,allNodes()){
298 nodes_set.insert(NodeLocalId(inode.itemLocalId()));
299 }
300
301 for( ItemDirectionInfo& idi : m_infos_view ){
302 {
303 Int32 next_lid = idi.m_next_lid;
304 if (next_lid!=NULL_ITEM_LOCAL_ID)
305 if (nodes_set.find(NodeLocalId(next_lid))==nodes_set.end())
306 idi.m_next_lid = NodeLocalId{};
307 }
308 {
309 Int32 prev_lid = idi.m_previous_lid;
310 if (prev_lid!=NULL_ITEM_LOCAL_ID)
311 if (nodes_set.find(NodeLocalId(prev_lid))==nodes_set.end())
312 idi.m_previous_lid = NodeLocalId{};
313 }
314 }
315}
316
317/*---------------------------------------------------------------------------*/
318/*---------------------------------------------------------------------------*/
319
323void NodeDirectionMng::
324_computeNodeCellInfos(const CellDirectionMng& cell_dm,const VariableCellReal3& cells_center)
325{
326 // TODO: ne traiter que les mailles de notre patch.
327 IndexType indexes_ptr[8];
328 ArrayView<IndexType> indexes(8,indexes_ptr);
329
330 NodeDirectionMng& node_dm = *this;
331 NodeGroup dm_all_nodes = node_dm.allNodes();
332 eMeshDirection dir = m_direction;
333 IMesh* mesh = m_p->m_cartesian_mesh->mesh();
334 Integer mesh_dim = mesh->dimension();
335 VariableNodeReal3& nodes_coord = mesh->nodesCoordinates();
336 if (mesh_dim!=2 && mesh_dim!=3)
337 ARCANE_FATAL("Invalid mesh dimension '{0}'. Valid dimensions are 2 or 3",mesh_dim);
338
339 // Ensemble contenant uniquement les mailles de notre patch
340 // Cela sert à filtrer pour ne garder que ces mailles là dans la connectivité
341 std::set<CellLocalId> inside_cells;
342 ENUMERATE_CELL(icell,cell_dm.allCells()){
343 inside_cells.insert(CellLocalId(icell.itemLocalId()));
344 }
345
346 ENUMERATE_NODE(inode,dm_all_nodes){
347 Node node = *inode;
348 Integer nb_cell = node.nbCell();
349 Real3 node_pos = nodes_coord[node];
350 indexes.fill(DirNode::NULL_CELL);
351 for( Integer i=0; i<nb_cell; ++i ){
352 const IndexType bi = (IndexType)i;
353 Cell cell = node.cell(i);
354 if (inside_cells.find(CellLocalId(cell.localId()))==inside_cells.end())
355 continue;
356
357 Real3 center = cells_center[cell];
358 Real3 wanted_cell_pos;
359 Real3 wanted_node_pos;
360 if (dir==MD_DirX){
361 wanted_cell_pos = center;
362 wanted_node_pos = node_pos;
363 } else if (dir==MD_DirY){
364 wanted_cell_pos = Real3(center.y, -center.x, center.z);
365 wanted_node_pos = Real3(node_pos.y, -node_pos.x, node_pos.z);
366 } else if (dir==MD_DirZ){
367 // TODO: à vérifier pour Y et Z
368 wanted_cell_pos = Real3(center.z, -center.y, center.x);
369 wanted_node_pos = Real3(node_pos.z, -node_pos.y, node_pos.x);
370 }
371 bool is_top = ((wanted_cell_pos.z > wanted_node_pos.z) && mesh_dim==3);
372 if (!is_top){
373 if (wanted_cell_pos.x > wanted_node_pos.x ){
374 if (wanted_cell_pos.y > wanted_node_pos.y )
375 indexes_ptr[CNP_NextLeft] = bi;
376 else
377 indexes_ptr[CNP_NextRight] = bi;
378 }
379 else{
380 if (wanted_cell_pos.y > wanted_node_pos.y )
381 indexes_ptr[CNP_PreviousLeft] = bi;
382 else
383 indexes_ptr[CNP_PreviousRight] = bi;
384 }
385 }
386 else{
387 if (wanted_cell_pos.x > wanted_node_pos.x ){
388 if (wanted_cell_pos.y > wanted_node_pos.y )
389 indexes_ptr[CNP_TopNextLeft] = bi;
390 else
391 indexes_ptr[CNP_TopNextRight] = bi;
392 }
393 else{
394 if (wanted_cell_pos.y > wanted_node_pos.y )
395 indexes_ptr[CNP_TopPreviousLeft] = bi;
396 else
397 indexes_ptr[CNP_TopPreviousRight] = bi;
398 }
399 }
400 }
401 m_infos_view[node.localId()].setCellIndexes(indexes_ptr);
402 }
403}
404
405/*---------------------------------------------------------------------------*/
406/*---------------------------------------------------------------------------*/
407
408void NodeDirectionMng::
409_computeNodeCellInfos() const
410{
412
413 IndexType indexes_ptr[8];
414 ArrayView indexes(8, indexes_ptr);
415
416 NodeGroup dm_all_nodes = this->allNodes();
417 eMeshDirection dir = m_direction;
418 IMesh* mesh = m_p->m_cartesian_mesh->mesh();
419 Integer mesh_dim = mesh->dimension();
420
421 if (mesh_dim == 2) {
422 constexpr Integer nb_cells_max = 4;
423
424 Int64 uids[nb_cells_max];
425 ArrayView av_uids(nb_cells_max, uids);
426
427 // DirX (Previous->X=0 / Next->X=1 / Right->Y=0 / Left->Y=1)
428 // DirY (Previous->Y=0 / Next->Y=1 / Right->X=1 / Left->X=0)
429
430 // Le CartesianMeshNumberingMng nous donne toujours les mailles autour du noeud dans le même ordre :
431 //
432 // |2|3|
433 // .
434 // |0|1|
435 //
436 // y
437 // ^
438 // |->x
439 //
440 // Lire : le UID de la maille dans le tableau av_uids à la position 0 rempli par
441 // "numbering->cellUniqueIdsAroundNode(av_uids, node)" correspond, dans la direction X,
442 // à la position CNP_PreviousRight.
443 constexpr Int32 dir_x_pos_2d[nb_cells_max] = { CNP_PreviousRight, CNP_NextRight, CNP_PreviousLeft, CNP_NextLeft };
444 constexpr Int32 dir_y_pos_2d[nb_cells_max] = { CNP_PreviousLeft, CNP_PreviousRight, CNP_NextLeft, CNP_NextRight };
445
446 ENUMERATE_ (Node, inode, dm_all_nodes) {
447 Node node = *inode;
448 numbering->cellUniqueIdsAroundNode(node, av_uids);
449 Integer nb_cell = node.nbCell();
450
451 indexes.fill(DirNode::NULL_CELL);
452
453 for (Integer i = 0; i < nb_cell; ++i) {
454 Cell cell = node.cell(i);
455 Integer pos = 0;
456 for (; pos < nb_cells_max; ++pos) {
457 if (cell.uniqueId() == av_uids[pos])
458 break;
459 }
460 if (pos == nb_cells_max)
461 continue;
462
463 const IndexType bi = (IndexType)i;
464 if (dir == MD_DirX) {
465 indexes[dir_x_pos_2d[pos]] = bi;
466 }
467 else if (dir == MD_DirY) {
468 indexes[dir_y_pos_2d[pos]] = bi;
469 }
470 }
471 m_infos_view[node.localId()].setCellIndexes(indexes_ptr);
472 }
473 }
474 else if (mesh_dim == 3) {
475 constexpr Integer nb_cells_max = 8;
476
477 Int64 uids[nb_cells_max];
478 ArrayView av_uids(nb_cells_max, uids);
479
480 // DirX (Top->Z=1 / Previous->X=0 / Next->X=1 / Right->Y=0 / Left->Y=1)
481 // DirY (Top->Z=1 / Previous->Y=0 / Next->Y=1 / Right->X=1 / Left->X=0)
482 // DirZ (Top->Y=1 / Previous->Z=0 / Next->Z=1 / Right->X=1 / Left->X=0)
483
484 // Le CartesianMeshNumberingMng nous donne toujours les mailles autour du noeud dans le même ordre :
485 //
486 // z = 0 | z = 1
487 // |2|3| | |6|7|
488 // . | .
489 // |0|1| | |4|5|
490 //
491 // y
492 // ^
493 // |->x
494 //
495 // Lire : le UID de la maille dans le tableau av_uids à la position 2 rempli par
496 // "numbering->cellUniqueIdsAroundNode(av_uids, node)" correspond, dans la direction Z,
497 // à la position CNP_TopPreviousLeft.
498 constexpr Int32 dir_x_pos_3d[nb_cells_max] = { CNP_PreviousRight, CNP_NextRight, CNP_PreviousLeft, CNP_NextLeft, CNP_TopPreviousRight, CNP_TopNextRight, CNP_TopPreviousLeft, CNP_TopNextLeft };
499 constexpr Int32 dir_y_pos_3d[nb_cells_max] = { CNP_PreviousLeft, CNP_PreviousRight, CNP_NextLeft, CNP_NextRight, CNP_TopPreviousLeft, CNP_TopPreviousRight, CNP_TopNextLeft, CNP_TopNextRight };
500 constexpr Int32 dir_z_pos_3d[nb_cells_max] = { CNP_PreviousLeft, CNP_PreviousRight, CNP_TopPreviousLeft, CNP_TopPreviousRight, CNP_NextLeft, CNP_NextRight, CNP_TopNextLeft, CNP_TopNextRight };
501
502 ENUMERATE_ (Node, inode, dm_all_nodes) {
503 Node node = *inode;
504 numbering->cellUniqueIdsAroundNode(node, av_uids);
505 Integer nb_cell = node.nbCell();
506
507 indexes.fill(DirNode::NULL_CELL);
508
509 for (Integer i = 0; i < nb_cell; ++i) {
510 Cell cell = node.cell(i);
511 Integer pos = 0;
512 for (; pos < nb_cells_max; ++pos) {
513 if (cell.uniqueId() == av_uids[pos])
514 break;
515 }
516 if (pos == nb_cells_max)
517 continue;
518
519 const IndexType bi = (IndexType)i;
520
521 if (dir == MD_DirX) {
522 indexes[dir_x_pos_3d[pos]] = bi;
523 }
524 else if (dir == MD_DirY) {
525 indexes[dir_y_pos_3d[pos]] = bi;
526 }
527 else if (dir == MD_DirZ) {
528 indexes[dir_z_pos_3d[pos]] = bi;
529 }
530
531 m_infos_view[node.localId()].setCellIndexes(indexes_ptr);
532 }
533 }
534 }
535 else {
536 ARCANE_FATAL("Invalid mesh dimension '{0}'. Valid dimensions are 2 or 3", mesh_dim);
537 }
538}
539
540/*---------------------------------------------------------------------------*/
541/*---------------------------------------------------------------------------*/
542
544allNodes() const
545{
546 return m_p->m_all_items;
547}
548
549/*---------------------------------------------------------------------------*/
550/*---------------------------------------------------------------------------*/
551
553overlapNodes() const
554{
555 return m_p->m_overlap_all_items;
556}
557
558/*---------------------------------------------------------------------------*/
559/*---------------------------------------------------------------------------*/
560
562inPatchNodes() const
563{
564 return m_p->m_inpatch_all_items;
565}
566
567/*---------------------------------------------------------------------------*/
568/*---------------------------------------------------------------------------*/
569
571innerNodes() const
572{
573 return m_p->m_inner_all_items;
574}
575
576/*---------------------------------------------------------------------------*/
577/*---------------------------------------------------------------------------*/
578
580outerNodes() const
581{
582 return m_p->m_outer_all_items;
583}
584
585/*---------------------------------------------------------------------------*/
586/*---------------------------------------------------------------------------*/
587
588} // End namespace Arcane
589
590/*---------------------------------------------------------------------------*/
591/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_(type, name, group)
Enumérateur générique d'un groupe d'entité
#define ENUMERATE_CELL(name, group)
Enumérateur générique d'un groupe de mailles.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
#define ENUMERATE_NODE(name, group)
Enumérateur générique d'un groupe de noeuds.
Vue modifiable d'un tableau d'un type T.
void fill(const T &o) noexcept
Remplit le tableau avec la valeur o.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Infos sur les mailles d'une direction spécifique X,Y ou Z d'un maillage structuré.
CellGroup outerCells() const
Groupe de toutes les mailles externes dans la direction.
CellGroup allCells() const
Groupe de toutes les mailles dans la direction.
CellGroup overlapCells() const
Groupe de toutes les mailles de recouvrement dans la direction.
DirCellNode cellNode(Cell c) const
Maille avec infos directionnelles aux noeuds correspondant à la maille c.
CellGroup innerCells() const
Groupe de toutes les mailles internes dans la direction.
CellGroup inPatchCells() const
Groupe de toutes les mailles du patch dans la direction.
Maille d'un maillage.
Definition Item.h:1214
Maille avec info directionnelle des noeuds.
NodeLocalId topNextLeftId() const
Noeud devant à gauche dans la direction.
NodeLocalId nextRightId() const
Noeud devant à droite dans la direction.
NodeLocalId topNextRightId() const
Noeud devant à droite dans la direction.
NodeLocalId nextLeftId() const
Noeud devant à gauche dans la direction.
NodeLocalId topPreviousLeftId() const
Noeud derrière à gauche dans la direction.
NodeLocalId topPreviousRightId() const
Noeud derrière à droite dans la direction.
NodeLocalId previousLeftId() const
Noeud derrière à gauche dans la direction.
NodeLocalId previousRightId() const
Noeud derrière à droite dans la direction.
virtual Ref< ICartesianMeshNumberingMngInternal > cartesianMeshNumberingMngInternal()=0
Méthode permettant de récupérer l'instance de CartesianMeshNumberingMngInternal.
Interface d'un maillage cartésien.
virtual IMesh * mesh() const =0
Maillage associé à ce maillage cartésien.
virtual ICartesianMeshInternal * _internalApi()=0
API interne à Arcane.
Interface d'une famille d'entités.
Definition IItemFamily.h:84
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.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
NodeGroup nodeGroup() const
Groupe des noeuds des éléments de ce groupe.
Definition ItemGroup.cc:230
ItemVectorView view() const
Vue sur les entités du groupe.
Definition ItemGroup.cc:583
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:123
void fillLocalIds(Array< Int32 > &ids) const
Ajoute à ids la liste des localIds() du vecteur.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:219
void _internalComputeInfos(const CellDirectionMng &cell_dm, const NodeGroup &all_nodes, const VariableCellReal3 &cells_center)
Calcule les informations sur les noeuds associées aux mailles de la direction cell_dm....
NodeGroup innerNodes() const
Groupe de tous les noeuds internes dans la direction.
void _filterNodes()
Filtre les noeuds devant/derrière pour ne garder que les noeuds de notre patch.
NodeDirectionMng()
Créé une instance vide.
NodeGroup outerNodes() const
Groupe de tous les noeuds externes dans la direction.
void _internalInit(ICartesianMesh *cm, eMeshDirection dir, Integer patch_index)
void _computeNodeCellInfos(const CellDirectionMng &cell_dm, const VariableCellReal3 &cells_center)
Calcul des connectivités noeuds/mailles par direction.
NodeGroup overlapNodes() const
Groupe de tous les noeuds de recouvrement dans la direction.
NodeGroup allNodes() const
Groupe de tous les noeuds dans la direction.
DirNode node(Node n) const
Noeud direction correspondant au noeud n.
NodeGroup inPatchNodes() const
Groupe de tous les noeuds du patch dans la direction.
void _internalResizeInfos(Int32 new_size)
Redimensionne le conteneur contenant les ItemDirectionInfo.
Vue sur les informations des noeuds.
Noeud d'un maillage.
Definition Item.h:582
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Référence à une instance.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
Vue sur les connectivités standards d'un maillage non structuré.
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
Definition ItemTypes.h:167
MeshVariableScalarRefT< Cell, Real3 > VariableCellReal3
Grandeur au centre des mailles de type coordonnées.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
IMemoryAllocator * getDefaultDataAllocator()
Allocateur par défaut pour les données.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
eMeshDirection
Type de la direction pour un maillage structuré
@ MD_DirInvalid
Direction invalide ou non initialisée.
@ MD_DirZ
Direction Z.
@ MD_DirY
Direction Y.
@ MD_DirX
Direction X.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:341
@ Cell
Le maillage est AMR par maille.
Definition MeshKind.h:52
std::int32_t Int32
Type entier signé sur 32 bits.
Real y
deuxième composante du triplet
Definition Real3.h:36
Real z
troisième composante du triplet
Definition Real3.h:37
Real x
première composante du triplet
Definition Real3.h:35