14#include "arcane/cartesianmesh/FaceDirectionMng.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/Real3.h"
18#include "arcane/utils/PlatformUtils.h"
20#include "arcane/core/IItemFamily.h"
21#include "arcane/core/ItemGroup.h"
22#include "arcane/core/IMesh.h"
23#include "arcane/core/VariableTypes.h"
25#include "arcane/cartesianmesh/ICartesianMesh.h"
26#include "arcane/cartesianmesh/CellDirectionMng.h"
27#include "arcane/cartesianmesh/internal/ICartesianMeshInternal.h"
68void FaceDirectionMng::
75 m_p->m_cartesian_mesh = cm;
76 m_p->m_patch_index = patch_index;
82void FaceDirectionMng::
92void FaceDirectionMng::
93_internalResizeInfos(
Int32 new_size)
95 m_p->m_infos.
resize(new_size);
96 m_infos_view = m_p->m_infos.view();
102void FaceDirectionMng::
106 IMesh* mesh = m_p->m_cartesian_mesh->mesh();
107 IItemFamily* face_family = mesh->faceFamily();
108 IItemFamily* cell_family = mesh->cellFamily();
109 int dir = (int)m_direction;
110 String base_group_name = String(
"Direction")+dir;
111 if (m_p->m_patch_index>=0)
112 base_group_name = base_group_name + String(
"AMRPatch")+m_p->m_patch_index;
118 UniqueArray<Int32> faces_lid;
120 CellGroup all_cells = cell_dm.allCells();
121 faces_lid.reserve(all_cells.size());
123 std::set<Int32> done_faces;
125 DirCellFace dcf(cell_dm.cellFace(*icell));
126 Face next_face = dcf.next();
127 Face prev_face = dcf.previous();
130 Int32 prev_lid = prev_face.localId();
131 if (done_faces.find(prev_lid)==done_faces.end()){
132 faces_lid.add(prev_lid);
133 done_faces.insert(prev_lid);
135 Int32 next_lid = next_face.localId();
136 if (done_faces.find(next_lid)==done_faces.end()){
137 faces_lid.add(next_lid);
138 done_faces.insert(next_lid);
146 UniqueArray<Int32> inner_lids;
147 UniqueArray<Int32> outer_lids;
149 Int32 lid = iitem.itemLocalId();
152 if (
face.nbCell() == 1)
157 m_p->m_inner_all_items = face_family->createGroup(String(
"AllInner")+base_group_name,inner_lids,
true);
158 m_p->m_outer_all_items = face_family->createGroup(String(
"AllOuter")+base_group_name,outer_lids,
true);
159 m_p->m_all_items = all_faces;
160 m_cells = CellInfoListView(cell_family);
162 _computeCellInfos(cell_dm,cells_center,faces_center);
168void FaceDirectionMng::
171 IMesh* mesh = m_p->m_cartesian_mesh->mesh();
172 IItemFamily* face_family = mesh->faceFamily();
173 IItemFamily* cell_family = mesh->cellFamily();
174 int dir = (int)m_direction;
175 String base_group_name = String(
"Direction") + dir;
176 if (m_p->m_patch_index >= 0)
177 base_group_name = base_group_name + String(
"AMRPatch") + m_p->m_patch_index;
183 UniqueArray<Int32> faces_lid;
185 CellGroup all_cells = cell_dm.allCells();
186 faces_lid.reserve(all_cells.size());
188 std::set<Int32> done_faces;
190 DirCellFace dcf(cell_dm.cellFace(*icell));
191 Face next_face = dcf.next();
192 Face prev_face = dcf.previous();
195 Int32 prev_lid = prev_face.localId();
196 if (done_faces.find(prev_lid) == done_faces.end()) {
197 faces_lid.add(prev_lid);
198 done_faces.insert(prev_lid);
200 Int32 next_lid = next_face.localId();
201 if (done_faces.find(next_lid) == done_faces.end()) {
202 faces_lid.add(next_lid);
203 done_faces.insert(next_lid);
209 all_faces.
setItems(faces_lid,
true);
211 UniqueArray<Int32> inner_cells_lid;
212 UniqueArray<Int32> outer_cells_lid;
213 cell_dm.innerCells().view().fillLocalIds(inner_cells_lid);
214 cell_dm.outerCells().view().fillLocalIds(outer_cells_lid);
216 UniqueArray<Int32> inner_lids;
217 UniqueArray<Int32> outer_lids;
218 UniqueArray<Int32> inpatch_lids;
219 UniqueArray<Int32> overall_lids;
221 Int32 lid = iface.itemLocalId();
223 if (
face.nbCell() == 1) {
224 if (outer_cells_lid.contains(
face.cell(0).localId())) {
226 inpatch_lids.add(lid);
229 overall_lids.add(lid);
233 bool c0_inner_cell = inner_cells_lid.contains(
face.cell(0).localId());
234 bool c1_inner_cell = inner_cells_lid.contains(
face.cell(1).localId());
235 if (c0_inner_cell || c1_inner_cell) {
237 inpatch_lids.add(lid);
240 bool c0_outer_cell = outer_cells_lid.contains(
face.cell(0).localId());
241 bool c1_outer_cell = outer_cells_lid.contains(
face.cell(1).localId());
242 if (c0_outer_cell || c1_outer_cell) {
244 inpatch_lids.add(lid);
247 overall_lids.add(lid);
252 m_p->m_inner_all_items = face_family->createGroup(String(
"AllInner") + base_group_name, inner_lids,
true);
253 m_p->m_outer_all_items = face_family->createGroup(String(
"AllOuter") + base_group_name, outer_lids,
true);
254 m_p->m_inpatch_all_items = face_family->createGroup(String(
"AllInPatch") + base_group_name, inpatch_lids,
true);
255 m_p->m_overall_all_items = face_family->createGroup(String(
"AllOverall") + base_group_name, overall_lids,
true);
256 m_p->m_all_items = all_faces;
257 m_cells = CellInfoListView(cell_family);
265bool FaceDirectionMng::
266_hasFace(
Cell cell,
Int32 face_local_id)
const
268 for( FaceLocalId iface_lid : cell.faceIds() ){
269 if (iface_lid==face_local_id)
283void FaceDirectionMng::
292 std::set<Int32> patch_cells_set;
294 patch_cells_set.insert(icell.itemLocalId());
299 Int32 face_lid = iface.itemLocalId();
300 Real3 face_coord = faces_center[iface];
305 if (!front_cell.null())
306 if (patch_cells_set.find(front_cell.localId()) == patch_cells_set.end())
308 if (!back_cell.null())
309 if (patch_cells_set.find(back_cell.localId()) == patch_cells_set.end())
312 bool is_inverse =
false;
313 if (!front_cell.null()){
314 Real3 front_coord = cells_center[front_cell];
316 if (front_coord.x<face_coord.x)
320 if (front_coord.y<face_coord.y)
324 if (front_coord.z<face_coord.z)
329 Real3 back_coord = cells_center[back_cell];
331 if (back_coord.x>face_coord.x)
335 if (back_coord.y>face_coord.y)
339 if (back_coord.z>face_coord.z)
346 if (!back_cell.null() && !front_cell.null()){
347 Int32 back_level = back_cell.level();
348 Int32 front_level = front_cell.level();
349 if (back_level!=front_level){
353 if (!_hasFace(back_cell,face_lid))
355 if (!_hasFace(front_cell,face_lid))
360 m_infos_view[face_lid] = ItemDirectionInfo(back_cell, front_cell);
362 m_infos_view[face_lid] = ItemDirectionInfo(front_cell, back_cell);
369void FaceDirectionMng::
370_computeCellInfos()
const
372 Ref<ICartesianMeshNumberingMngInternal> numbering = m_p->m_cartesian_mesh->_internalApi()->cartesianMeshNumberingMngInternal();
386 bool is_inverse =
false;
387 if (!front_cell.null() && !back_cell.null()) {
392 Int32 front_cell_level = front_cell.level();
393 Int32 back_cell_level = back_cell.level();
394 if (front_cell_level != back_cell_level) {
395 Int32 face_level = numbering->faceLevel(
face.uniqueId());
396 if (front_cell_level != face_level) {
404 if (back_cell.uniqueId() > front_cell.uniqueId()) {
410 if (back_cell.null()) {
412 ArrayView av_uids(numbering->nbFaceByCell(), uids);
413 numbering->cellFaceUniqueIds(av_uids, front_cell);
414 if (m_p->m_cartesian_mesh->mesh()->dimension() == 2) {
416 if (
face.uniqueId() == av_uids[1])
418 else if (
face.uniqueId() != av_uids[3])
419 ARCANE_FATAL(
"Bad connectivity -- Expected : {0} -- Found : {1}", av_uids[3],
face.uniqueId());
422 if (
face.uniqueId() == av_uids[2])
424 else if (
face.uniqueId() != av_uids[0])
425 ARCANE_FATAL(
"Bad connectivity -- Expected : {0} -- Found : {1}", av_uids[0],
face.uniqueId());
428 else if (m_p->m_cartesian_mesh->mesh()->dimension() == 3) {
430 if (
face.uniqueId() == av_uids[4])
432 else if (
face.uniqueId() != av_uids[1])
433 ARCANE_FATAL(
"Bad connectivity -- Expected : {0} -- Found : {1}", av_uids[1],
face.uniqueId());
436 if (
face.uniqueId() == av_uids[5])
438 else if (
face.uniqueId() != av_uids[2])
439 ARCANE_FATAL(
"Bad connectivity -- Expected : {0} -- Found : {1}", av_uids[2],
face.uniqueId());
442 if (
face.uniqueId() == av_uids[3])
444 else if (
face.uniqueId() != av_uids[0])
445 ARCANE_FATAL(
"Bad connectivity -- Expected : {0} -- Found : {1}", av_uids[0],
face.uniqueId());
449 else if (front_cell.null()) {
451 ArrayView av_uids(numbering->nbFaceByCell(), uids);
452 numbering->cellFaceUniqueIds(av_uids, back_cell);
453 if (m_p->m_cartesian_mesh->mesh()->dimension() == 2) {
455 if (
face.uniqueId() == av_uids[3])
457 else if (
face.uniqueId() != av_uids[1])
458 ARCANE_FATAL(
"Bad connectivity -- Expected : {0} -- Found : {1}", av_uids[1],
face.uniqueId());
461 if (
face.uniqueId() == av_uids[0])
463 else if (
face.uniqueId() != av_uids[2])
464 ARCANE_FATAL(
"Bad connectivity -- Expected : {0} -- Found : {1}", av_uids[2],
face.uniqueId());
467 else if (m_p->m_cartesian_mesh->mesh()->dimension() == 3) {
469 if (
face.uniqueId() == av_uids[1])
471 else if (
face.uniqueId() != av_uids[4])
472 ARCANE_FATAL(
"Bad connectivity -- Expected : {0} -- Found : {1}", av_uids[4],
face.uniqueId());
475 if (
face.uniqueId() == av_uids[2])
477 else if (
face.uniqueId() != av_uids[5])
478 ARCANE_FATAL(
"Bad connectivity -- Expected : {0} -- Found : {1}", av_uids[5],
face.uniqueId());
481 if (
face.uniqueId() == av_uids[0])
483 else if (
face.uniqueId() != av_uids[3])
484 ARCANE_FATAL(
"Bad connectivity -- Expected : {0} -- Found : {1}", av_uids[3],
face.uniqueId());
495 m_infos_view[iface.itemLocalId()] = ItemDirectionInfo(back_cell, front_cell);
497 m_infos_view[iface.itemLocalId()] = ItemDirectionInfo(front_cell, back_cell);
507 return m_p->m_all_items;
516 return m_p->m_overall_all_items;
525 return m_p->m_inpatch_all_items;
534 return m_p->m_inner_all_items;
543 return m_p->m_outer_all_items;
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Infos sur les mailles d'une direction spécifique X,Y ou Z d'un maillage structuré.
FaceGroup inPatchFaces() const
Groupe de toutes les faces du patch dans la direction.
DirFace face(Face f) const
Face direction correspondant à la face f.
FaceDirectionMng()
Créé une instance vide.
FaceGroup innerFaces() const
Groupe de toutes les faces internes dans la direction.
FaceGroup overallFaces() const
Groupe de toutes les faces de recouvrement dans la direction.
FaceGroup outerFaces() const
Groupe de toutes les faces externes dans la direction.
FaceGroup allFaces() const
Groupe de toutes les faces dans la direction.
Interface d'un maillage cartésien.
void setItems(Int32ConstArrayView items_local_id)
Positionne les entités du groupe.
Vecteur 1D de données avec sémantique par valeur (style STL).
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
ItemGroupT< Face > FaceGroup
Groupe de faces.
MeshVariableScalarRefT< Cell, Real3 > VariableCellReal3
Grandeur au centre des mailles de type coordonnées.
MeshVariableScalarRefT< Face, Real3 > VariableFaceReal3
Grandeur aux faces de type coordonné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.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eMeshDirection
Type de la direction pour un maillage structuré
@ MD_DirInvalid
Direction invalide ou non initialisée.
@ Cell
Le maillage est AMR par maille.
std::int32_t Int32
Type entier signé sur 32 bits.