48class ARCANE_CORE_EXPORT CartesianGridDimension
50 friend mesh::DynamicMeshCartesian2DBuilder;
51 friend mesh::DynamicMeshCartesian3DBuilder;
52 friend mesh::CartesianFaceUniqueIdBuilder;
53 friend class CartesianMeshUniqueIdRenumbering;
54 friend class CartesianMeshCoarsening;
55 friend class CartesianMeshCoarsening2;
63 class NodeUniqueIdComputer2D
67 NodeUniqueIdComputer2D(
Int64 base_offset,
Int64 nb_node_x)
68 : m_base_offset(base_offset)
69 , m_nb_node_x(nb_node_x)
76 return m_base_offset + x + y * m_nb_node_x;
79 std::array<Int64, 4> computeForCell(
Int64 x,
Int64 y)
81 std::array<Int64, 4> node_uids;
82 node_uids[0] = compute(x + 0, y + 0);
83 node_uids[1] = compute(x + 1, y + 0);
84 node_uids[2] = compute(x + 1, y + 1);
85 node_uids[3] = compute(x + 0, y + 1);
99 class CellUniqueIdComputer2D
103 CellUniqueIdComputer2D(
Int64 base_offset,
Int64 all_nb_cell_x)
104 : m_base_offset(base_offset)
105 , m_all_nb_cell_x(all_nb_cell_x)
112 return m_base_offset + x + y * m_all_nb_cell_x;
114 Int64x3 compute(
Int64 unique_id)
116 Int64 uid = unique_id - m_base_offset;
117 const Int64 y = uid / m_all_nb_cell_x;
118 const Int64 x = uid % m_all_nb_cell_x;
119 return Int64x3(x, y, 0);
125 Int64 m_all_nb_cell_x;
132 class FaceUniqueIdComputer2D
136 FaceUniqueIdComputer2D(
Int64 base_offset,
Int64 nb_cell_x,
Int64 nb_face_x,
Int64 nb_face_dir_x)
137 : m_base_offset(base_offset)
138 , m_nb_cell_x(nb_cell_x)
139 , m_nb_face_x(nb_face_x)
140 , m_nb_face_dir_x(nb_face_dir_x)
146 std::array<Int64, 4> computeForCell(
Int64 x,
Int64 y)
148 std::array<Int64, 4> face_uids;
151 face_uids[0] = m_base_offset + (x + 0) + ((y + 0) * m_nb_cell_x) + m_nb_face_dir_x;
152 face_uids[2] = m_base_offset + (x + 0) + ((y + 1) * m_nb_cell_x) + m_nb_face_dir_x;
155 face_uids[1] = m_base_offset + (x + 1) + (y + 0) * m_nb_face_x;
156 face_uids[3] = m_base_offset + (x + 0) + (y + 0) * m_nb_face_x;
166 Int64 m_nb_face_dir_x;
173 class NodeUniqueIdComputer3D
177 NodeUniqueIdComputer3D(
Int64 base_offset,
Int64 nb_node_x,
Int64 nb_node_xy)
178 : m_base_offset(base_offset)
179 , m_nb_node_x(nb_node_x)
180 , m_nb_node_xy(nb_node_xy)
187 return m_base_offset + x + y * m_nb_node_x + z * m_nb_node_xy;
192 std::array<Int64, 8> node_uids;
193 node_uids[0] = compute(x + 0, y + 0, z + 0);
194 node_uids[1] = compute(x + 1, y + 0, z + 0);
195 node_uids[2] = compute(x + 1, y + 1, z + 0);
196 node_uids[3] = compute(x + 0, y + 1, z + 0);
197 node_uids[4] = compute(x + 0, y + 0, z + 1);
198 node_uids[5] = compute(x + 1, y + 0, z + 1);
199 node_uids[6] = compute(x + 1, y + 1, z + 1);
200 node_uids[7] = compute(x + 0, y + 1, z + 1);
215 class CellUniqueIdComputer3D
219 CellUniqueIdComputer3D(
Int64 base_offset,
Int64 all_nb_cell_x,
Int64 all_nb_cell_xy)
220 : m_base_offset(base_offset)
221 , m_all_nb_cell_x(all_nb_cell_x)
222 , m_all_nb_cell_xy(all_nb_cell_xy)
230 return m_base_offset + x + y * m_all_nb_cell_x + z * m_all_nb_cell_xy;
233 Int64x3 compute(
Int64 unique_id)
235 Int64 uid = unique_id - m_base_offset;
236 Int64 z = uid / m_all_nb_cell_xy;
237 Int64 v = uid - (z * m_all_nb_cell_xy);
238 Int64 y = v / m_all_nb_cell_x;
239 Int64 x = v % m_all_nb_cell_x;
240 return Int64x3(x, y, z);
246 Int64 m_all_nb_cell_x;
247 Int64 m_all_nb_cell_xy;
254 class FaceUniqueIdComputer3D
258 FaceUniqueIdComputer3D(
Int64 base_offset,
Int64 nb_cell_x,
Int64 nb_face_x, Int64x3 nb_face_dir,
259 Int64 total_nb_face_xy,
Int64 total_nb_face_x)
260 : m_base_offset(base_offset)
261 , m_nb_cell_x(nb_cell_x)
262 , m_nb_face_x(nb_face_x)
263 , m_nb_face_dir(nb_face_dir)
264 , m_total_nb_face_xy(total_nb_face_xy)
265 , m_total_nb_face_x(total_nb_face_x)
273 std::array<Int64, 6> face_uids;
276 face_uids[0] = (x + 0) + ((y + 0) * m_nb_cell_x) + ((z + 0) * m_nb_face_dir.z) + m_total_nb_face_xy;
277 face_uids[3] = (x + 0) + ((y + 0) * m_nb_cell_x) + ((z + 1) * m_nb_face_dir.z) + m_total_nb_face_xy;
280 face_uids[1] = (x + 0) + ((y + 0) * m_nb_face_x) + ((z + 0) * m_nb_face_dir.x);
281 face_uids[4] = (x + 1) + ((y + 0) * m_nb_face_x) + ((z + 0) * m_nb_face_dir.x);
284 face_uids[2] = (x + 0) + ((y + 0) * m_nb_cell_x) + ((z + 0) * m_nb_face_dir.y) + m_total_nb_face_x;
285 face_uids[5] = (x + 0) + ((y + 1) * m_nb_cell_x) + ((z + 0) * m_nb_face_dir.y) + m_total_nb_face_x;
287 for (
Int32 i = 0; i < 6; ++i)
288 face_uids[i] += m_base_offset;
298 Int64x3 m_nb_face_dir;
299 Int64 m_total_nb_face_xy;
300 Int64 m_total_nb_face_x;
305 CartesianGridDimension() =
default;
307 CartesianGridDimension(
Int64 nb_cell_x,
Int64 nb_cell_y);
309 CartesianGridDimension(
Int64 nb_cell_x,
Int64 nb_cell_y,
Int64 nb_cell_z);
311 explicit CartesianGridDimension(
const Int64x2& dims);
313 explicit CartesianGridDimension(
const Int64x3& dims);
315 explicit CartesianGridDimension(
const Int32x2& dims);
317 explicit CartesianGridDimension(
const Int32x3& dims);
322 constexpr Int64x3
nbCell()
const {
return m_nb_cell; }
325 constexpr Int64x3
nbNode()
const {
return m_nb_node; }
328 constexpr Int64x3
nbFace()
const {
return m_nb_face; }
339 NodeUniqueIdComputer2D getNodeComputer2D(
Int64 offset)
const
341 return { offset, m_nb_node.x };
344 NodeUniqueIdComputer3D getNodeComputer3D(Int64 offset)
const
346 return { offset, m_nb_node.x, m_nb_node.x * m_nb_node.y };
349 CellUniqueIdComputer2D getCellComputer2D(Int64 offset)
const
351 return { offset, m_nb_cell.x };
354 CellUniqueIdComputer3D getCellComputer3D(Int64 offset)
const
356 return { offset, m_nb_cell.x, m_nb_cell.x * m_nb_cell.y };
359 FaceUniqueIdComputer2D getFaceComputer2D(Int64 offset)
const
361 Int64x3 nb_face_dir = nbFaceParallelToDirection();
362 return { offset, m_nb_cell.x, m_nb_face.x, nb_face_dir.x };
365 FaceUniqueIdComputer3D getFaceComputer3D(Int64 offset)
const
367 Int64x3 nb_face_dir = nbFaceParallelToDirection();
368 Int64 total_nb_face_xy = (nb_face_dir.x + nb_face_dir.y) * m_nb_cell.z;
369 Int64 total_nb_face_x = (nb_face_dir.x * m_nb_cell.z);
370 return { offset, m_nb_cell.x, m_nb_face.x, nb_face_dir, total_nb_face_xy, total_nb_face_x };
382 Int64x3 m_nb_face_oriented;
384 Int64 m_nb_cell_xy = 0;
385 Int64 m_total_nb_cell = 0;