Arcane  v4.1.2.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
AMRZonePosition.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* AMRZonePosition.cc (C) 2000-2025 */
9/* */
10/* Definition d'une zone 2D ou 3D d'un maillage. */
11/*---------------------------------------------------------------------------*/
12
13#include "arcane/cartesianmesh/AMRZonePosition.h"
14
15#include "arcane/utils/FixedArray.h"
16#include "arcane/utils/ITraceMng.h"
17
18#include "arcane/core/IMesh.h"
19#include "arcane/core/MeshKind.h"
20#include "arcane/core/IParallelMng.h"
21
22#include "arcane/cartesianmesh/AMRPatchPosition.h"
23#include "arcane/cartesianmesh/ICartesianMesh.h"
24
25#include "arcane/cartesianmesh/internal/ICartesianMeshInternal.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
37cellsInPatch(IMesh* mesh, UniqueArray<Int32>& cells_local_id) const
38{
39 VariableNodeReal3& nodes_coord = mesh->nodesCoordinates();
40 // Parcours les mailles actives et ajoute dans la liste des mailles
41 // à raffiner celles qui sont contenues dans la boîte englobante.
42 Real3 min_pos = m_position;
43 Real3 max_pos = min_pos + m_length;
44 //Int32 level = -10;
45 cells_local_id.clear();
46 ENUMERATE_ (Cell, icell, mesh->allActiveCells()) {
47 Cell cell = *icell;
48 Real3 center;
49 for (const Node node : cell.nodes())
50 center += nodes_coord[node];
51 center /= cell.nbNode();
52 bool is_inside_x = center.x > min_pos.x && center.x < max_pos.x;
53 bool is_inside_y = center.y > min_pos.y && center.y < max_pos.y;
54 bool is_inside_z = (center.z > min_pos.z && center.z < max_pos.z) || !m_is_3d;
55 if (is_inside_x && is_inside_y && is_inside_z) {
56 //if (level == -10) level = cell.level();
57 //else if (level != cell.level()) ARCANE_FATAL("Level pb"); // TODO plus clair.
58 cells_local_id.add(icell.itemLocalId());
59 }
60 }
61}
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
68{
69 if (mesh->mesh()->meshKind().meshAMRKind() != eMeshAMRKind::PatchCartesianMeshOnly) {
70 cellsInPatch(mesh->mesh(), cells_local_id);
71 return;
72 }
73 auto numbering = mesh->_internalApi()->cartesianMeshNumberingMngInternal();
74
76 min_n_max[0] = INT32_MAX;
77 min_n_max[1] = INT32_MAX;
78 min_n_max[2] = INT32_MAX;
79 min_n_max[3] = -1;
80 min_n_max[4] = -1;
81 min_n_max[5] = -1;
82 ArrayView min(min_n_max.view().subView(0, 3));
83 ArrayView max(min_n_max.view().subView(3, 3));
84 Int64 nb_cells = 0;
85
86 VariableNodeReal3& nodes_coord = mesh->mesh()->nodesCoordinates();
87 // Parcours les mailles actives et ajoute dans la liste des mailles
88 // à raffiner celles qui sont contenues dans la boîte englobante.
89 Real3 min_pos = m_position;
90 Real3 max_pos = min_pos + m_length;
91 Int32 level = -1;
92 cells_local_id.clear();
93 ENUMERATE_ (Cell, icell, mesh->mesh()->allActiveCells()) {
94 Cell cell = *icell;
95 Real3 center;
96 for (const Node node : cell.nodes())
97 center += nodes_coord[node];
98 center /= cell.nbNode();
99 bool is_inside_x = center.x > min_pos.x && center.x < max_pos.x;
100 bool is_inside_y = center.y > min_pos.y && center.y < max_pos.y;
101 bool is_inside_z = (center.z > min_pos.z && center.z < max_pos.z) || !m_is_3d;
102 if (is_inside_x && is_inside_y && is_inside_z) {
103 if (level == -1)
104 level = cell.level();
105 else if (level != cell.level())
106 ARCANE_FATAL("Level pb -- Level recorded before : {0} -- Cell Level : {1} -- CellUID : {2}", level, cell.level(), cell.uniqueId());
107 cells_local_id.add(icell.itemLocalId());
108
109 if (icell->isOwn())
110 nb_cells++;
111
112 CartCoord3Type pos = numbering->cellUniqueIdToCoord(cell);
113 if (pos.x < min[MD_DirX])
114 min[MD_DirX] = pos.x;
115 if (pos.x > max[MD_DirX])
116 max[MD_DirX] = pos.x;
117
118 if (pos.y < min[MD_DirY])
119 min[MD_DirY] = pos.y;
120 if (pos.y > max[MD_DirY])
121 max[MD_DirY] = pos.y;
122
123 if (pos.z < min[MD_DirZ])
124 min[MD_DirZ] = pos.z;
125 if (pos.z > max[MD_DirZ])
126 max[MD_DirZ] = pos.z;
127 }
128 }
129 mesh->mesh()->parallelMng()->reduce(MessagePassing::ReduceMin, min);
130 mesh->mesh()->parallelMng()->reduce(MessagePassing::ReduceMax, max);
131 nb_cells = mesh->mesh()->parallelMng()->reduce(MessagePassing::ReduceSum, nb_cells);
132 Int32 level_r = mesh->mesh()->parallelMng()->reduce(MessagePassing::ReduceMax, level);
133
134 if (level != -1 && level != level_r) {
135 ARCANE_FATAL("Bad level reduced");
136 }
137
138 max[MD_DirX] += 1;
139 max[MD_DirY] += 1;
140 max[MD_DirZ] += 1;
141
142 {
143 Int64 nb_cells_patch = static_cast<Int64>(max[MD_DirX] - min[MD_DirX]) * (max[MD_DirY] - min[MD_DirY]) * (max[MD_DirZ] - min[MD_DirZ]);
144 if (nb_cells != nb_cells_patch) {
145 ARCANE_FATAL("Not regular patch");
146 }
147 }
148 position.setMinPoint({ min[MD_DirX], min[MD_DirY], min[MD_DirZ] });
149 position.setMaxPoint({ max[MD_DirX], max[MD_DirY], max[MD_DirZ] });
150 position.setLevel(level_r);
151}
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
158{
159 if (mesh->mesh()->meshKind().meshAMRKind() != eMeshAMRKind::PatchCartesianMeshOnly) {
160 ARCANE_FATAL("Reserved to AMR type 3");
161 }
162
164 auto numbering = mesh->_internalApi()->cartesianMeshNumberingMngInternal();
165
167 min_n_max[0] = INT32_MAX;
168 min_n_max[1] = INT32_MAX;
169 min_n_max[2] = INT32_MAX;
170 min_n_max[3] = -1;
171 min_n_max[4] = -1;
172 min_n_max[5] = -1;
173 ArrayView min(min_n_max.view().subView(0, 3));
174 ArrayView max(min_n_max.view().subView(3, 3));
175 Int64 nb_cells = 0;
176
177 VariableNodeReal3& nodes_coord = mesh->mesh()->nodesCoordinates();
178 // Parcours les mailles actives et ajoute dans la liste des mailles
179 // à raffiner celles qui sont contenues dans la boîte englobante.
180 const Real3 min_pos = m_position;
181 const Real3 max_pos = min_pos + m_length;
182 Int32 level = -1;
183
184 ENUMERATE_ (Cell, icell, mesh->mesh()->allActiveCells()) {
185 Cell cell = *icell;
186 Real3 center;
187 for (const Node node : cell.nodes())
188 center += nodes_coord[node];
189 center /= cell.nbNode();
190 bool is_inside_x = center.x > min_pos.x && center.x < max_pos.x;
191 bool is_inside_y = center.y > min_pos.y && center.y < max_pos.y;
192 bool is_inside_z = (center.z > min_pos.z && center.z < max_pos.z) || !m_is_3d;
193 if (is_inside_x && is_inside_y && is_inside_z) {
194 if (level == -1)
195 level = cell.level();
196 else if (level != cell.level())
197 ARCANE_FATAL("Level pb -- Level recorded before : {0} -- Cell Level : {1} -- CellUID : {2}", level, cell.level(), cell.uniqueId());
198
199 if (icell->isOwn())
200 nb_cells++;
201
202 const CartCoord3Type pos = numbering->cellUniqueIdToCoord(cell);
203 if (pos.x < min[MD_DirX])
204 min[MD_DirX] = pos.x;
205 if (pos.x > max[MD_DirX])
206 max[MD_DirX] = pos.x;
207
208 if (pos.y < min[MD_DirY])
209 min[MD_DirY] = pos.y;
210 if (pos.y > max[MD_DirY])
211 max[MD_DirY] = pos.y;
212
213 if (pos.z < min[MD_DirZ])
214 min[MD_DirZ] = pos.z;
215 if (pos.z > max[MD_DirZ])
216 max[MD_DirZ] = pos.z;
217 }
218 }
219 mesh->mesh()->parallelMng()->reduce(MessagePassing::ReduceMin, min);
220 mesh->mesh()->parallelMng()->reduce(MessagePassing::ReduceMax, max);
221 nb_cells = mesh->mesh()->parallelMng()->reduce(MessagePassing::ReduceSum, nb_cells);
222 Int32 level_r = mesh->mesh()->parallelMng()->reduce(MessagePassing::ReduceMax, level);
223
224 if (level != -1 && level != level_r) {
225 ARCANE_FATAL("Bad level reduced");
226 }
227
228 // Min inclus / Max exclu
229 max[MD_DirX] += 1;
230 max[MD_DirY] += 1;
231 max[MD_DirZ] += 1;
232
233 {
234 const Int64 nb_cells_patch = static_cast<Int64>(max[MD_DirX] - min[MD_DirX]) * (max[MD_DirY] - min[MD_DirY]) * (max[MD_DirZ] - min[MD_DirZ]);
235 if (nb_cells != nb_cells_patch) {
236 ARCANE_FATAL("Not regular patch");
237 }
238 }
239 position.setMinPoint({ min[MD_DirX], min[MD_DirY], min[MD_DirZ] });
240 position.setMaxPoint({ max[MD_DirX], max[MD_DirY], max[MD_DirZ] });
241 position.setLevel(level_r);
242
243 mesh->traceMng()->info() << "Position test -- Min : " << position.minPoint() << " -- Max : " << position.maxPoint() << " -- Level : " << position.level();
244
245 return position;
246}
247
248/*---------------------------------------------------------------------------*/
249/*---------------------------------------------------------------------------*/
250
251} // End namespace Arcane
252
253/*---------------------------------------------------------------------------*/
254/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_(type, name, group)
Enumérateur générique d'un groupe d'entité
Classe permettant de définir la position d'un patch dans le maillage cartésien.
void cellsInPatch(IMesh *mesh, UniqueArray< Int32 > &cells_local_id) const
Méthode permettant de retrouver les mailles incluses dans la zone.
Real3 position() const
Méthode permettant de retrouver la position de la zone.
AMRPatchPosition toAMRPatchPosition(ICartesianMesh *mesh) const
Méthode permettant de convertir ce AMRZonePosition en AMRPatchPosition.
Vue modifiable d'un tableau d'un type T.
void clear()
Supprime les éléments du tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Maille d'un maillage.
Definition Item.h:1214
Int32 level() const
Definition Item.h:1368
constexpr __host__ __device__ ArrayView< T > view()
Vue modifiable sur le tableau.
Interface d'un maillage cartésien.
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
Definition Item.h:794
Int32 nbNode() const
Nombre de noeuds de l'entité
Definition Item.h:788
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition Item.h:225
Noeud d'un maillage.
Definition Item.h:582
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Vecteur 1D de données avec sémantique par valeur (style STL).
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
@ ReduceSum
Somme des valeurs.
@ ReduceMin
Minimum des valeurs.
@ ReduceMax
Maximum des valeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
@ MD_DirZ
Direction Z.
@ MD_DirY
Direction Y.
@ MD_DirX
Direction X.
@ PatchCartesianMeshOnly
Le maillage est AMR par patch cartésien (rectangulaire)
Definition MeshKind.h:56
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