14#include "arcane/std/SimpleMeshGenerator.h"
16#include "arcane/utils/ITraceMng.h"
17#include "arcane/utils/Real3.h"
18#include "arcane/utils/FixedArray.h"
20#include "arcane/core/XmlNode.h"
21#include "arcane/core/Item.h"
22#include "arcane/core/IPrimaryMesh.h"
23#include "arcane/core/IItemFamily.h"
24#include "arcane/core/MeshVariable.h"
25#include "arcane/core/IMeshModifier.h"
26#include "arcane/core/internal/IMeshModifierInternal.h"
28#include <arcane/utils/SmallArray.h>
43, m_mesh_modifier_internal(
mesh->modifier()->_modifierInternalApi())
59 Integer current_id = m_nodes_unique_id.size();
60 m_nodes_unique_id.add(current_id);
61 m_nodes_coords.add(pos);
84void SimpleMeshGenerator::
87 Integer current_id = m_current_nb_cell;
97void SimpleMeshGenerator::
100 Integer current_id = m_current_nb_cell;
102 const Int32 nb_node = nodes_coords.
size();
104 for (
Int32 i = 0; i < nb_node; ++i)
105 nodes_unique_id[i] =
_addNode(nodes_coords[i]);
106 m_mesh_modifier_internal->addCell(
ItemUniqueId(current_id), type_id, nodes_unique_id);
112bool SimpleMeshGenerator::
117 if (m_mode < 1 || m_mode > 4) {
118 info() <<
"Bad syntax for <meshgenerator>";
119 info() <<
"Expected is <meshgenerator><simple><mode>mode</simple></meshgenerator>";
120 info() <<
"with mode between 1 and 3";
121 error() <<
"Bad syntax for <meshgenerator>";
130void SimpleMeshGenerator::
131_createSimpleHemiHexa7(Real x0, Real y0, Real z1, Real z2)
133 FixedArray<Int64, 7> ids;
134 ids[0] = _addNode(x0, y0, z1);
135 ids[1] = _addNode(x0 + 1., y0, z1);
136 ids[2] = _addNode(x0 + 1., y0, z2);
137 ids[3] = _addNode(x0 + 1., y0 + 1., z2);
138 ids[4] = _addNode(x0, y0 + 1., z2);
139 ids[5] = _addNode(x0, y0 + 1., z1);
140 ids[6] = _addNode(x0 + 1., y0 + 1., z1);
141 _addCell(IT_HemiHexa7, ids.view());
147void SimpleMeshGenerator::
148_createSimpleHemiHexa6(Real x0, Real y0, Real z1, Real z2)
150 FixedArray<Int64, 6> ids;
151 ids[0] = _addNode(x0, y0, z1);
152 ids[1] = _addNode(x0 + 1., y0, z1);
153 ids[2] = _addNode(x0 + 1., y0, z2);
154 ids[3] = _addNode(x0 + 1., y0 + 1., z1);
155 ids[4] = _addNode(x0, y0 + 1., z2);
156 ids[5] = _addNode(x0, y0 + 1., z1);
157 _addCell(IT_HemiHexa6, ids.view());
163void SimpleMeshGenerator::
164_createSimpleHemiHexa5(Real x0, Real y0, Real z1, Real z2)
166 FixedArray<Int64, 5> ids;
167 ids[0] = _addNode(x0, y0, z1);
168 ids[1] = _addNode(x0 + 1., y0, z1);
169 ids[2] = _addNode(x0 + 1., y0, z2);
170 ids[3] = _addNode(x0 + 1., y0 + 1., z1);
171 ids[4] = _addNode(x0, y0 + 1., z1);
172 _addCell(IT_HemiHexa5, ids.view());
178void SimpleMeshGenerator::
179_createSimpleAntiWedgeLeft6(Real x0, Real y0, Real z1, Real z2)
181 FixedArray<Int64, 6> ids;
182 ids[0] = _addNode(x0, y0, z1);
183 ids[1] = _addNode(x0, y0 + 1., z1);
184 ids[2] = _addNode(x0, y0 + .5, z2);
185 ids[3] = _addNode(x0 + 1., y0, z1);
186 ids[4] = _addNode(x0 + 1., y0 + 1., z1);
187 ids[5] = _addNode(x0 + 1., y0 + .5, (z1 + z2) / 2);
188 _addCell(IT_AntiWedgeLeft6, ids.view());
194void SimpleMeshGenerator::
195_createSimpleAntiWedgeRight6(Real x0, Real y0, Real z1, Real z2)
197 FixedArray<Int64, 6> ids;
198 ids[0] = _addNode(x0, y0, z1);
199 ids[1] = _addNode(x0, y0 + 1., z1);
200 ids[2] = _addNode(x0, y0 + .5, (z1 + z2) / 2);
201 ids[3] = _addNode(x0 + 1., y0, z1);
202 ids[4] = _addNode(x0 + 1., y0 + 1., z1);
203 ids[5] = _addNode(x0 + 1., y0 + .5, z2);
204 _addCell(IT_AntiWedgeRight6, ids.view());
210void SimpleMeshGenerator::
211_createSimpleDiTetra5(Real x0, Real y0, Real z1, Real z2)
213 FixedArray<Int64, 5> ids;
214 ids[0] = _addNode(x0, y0, z2);
215 ids[1] = _addNode(x0 + 1., y0, z1);
216 ids[2] = _addNode(x0 + 2., y0, z2);
217 ids[3] = _addNode(x0 + 1., y0 + 1., (z2 + z1) / 2);
218 ids[4] = _addNode(x0 + 1., y0 - 1., (z2 + z1) / 2);
219 _addCell(IT_DiTetra5, ids.view());
225void SimpleMeshGenerator::
226_fillHexaedronCoordinates(ItemTypeId type_id, ArrayView<Real3> coords, Real x0, Real y0, Real z1, Real z2)
228 coords[0] = Real3(x0, y0, z1);
229 coords[1] = Real3(x0 + 1., y0, z1);
230 coords[2] = Real3(x0 + 1., y0 + 1., z1);
231 coords[3] = Real3(x0, y0 + 1., z1);
232 coords[4] = Real3(x0, y0, z2);
233 coords[5] = Real3(x0 + 1., y0, z2);
234 coords[6] = Real3(x0 + 1., y0 + 1., z2);
235 coords[7] = Real3(x0, y0 + 1., z2);
238 if (type_id == ITI_Hexaedron20 || type_id == ITI_Hexaedron27) {
240 coords[8] = _center(coords, 0, 1);
241 coords[9] = _center(coords, 1, 2);
242 coords[10] = _center(coords, 2, 3);
243 coords[11] = _center(coords, 3, 0);
244 coords[12] = _center(coords, 4, 5);
245 coords[13] = _center(coords, 5, 6);
246 coords[14] = _center(coords, 6, 7);
247 coords[15] = _center(coords, 7, 4);
248 coords[16] = _center(coords, 0, 4);
249 coords[17] = _center(coords, 1, 5);
250 coords[18] = _center(coords, 2, 6);
251 coords[19] = _center(coords, 3, 7);
253 if (type_id == ITI_Hexaedron27) {
257 coords[20] = _center(coords, 0, 4, 7, 3);
258 coords[21] = _center(coords, 1, 2, 6, 5);
259 coords[22] = _center(coords, 0, 1, 5, 4);
260 coords[23] = _center(coords, 2, 3, 7, 6);
261 coords[24] = _center(coords, 0, 3, 2, 1);
262 coords[25] = _center(coords, 4, 5, 6, 7);
266 for (Int32 i = 0; i < 8; ++i)
276void SimpleMeshGenerator::
277_createSimpleHexaedron(ItemTypeId type_id, Real x0, Real y0, Real z1, Real z2)
279 if (type_id != ITI_Hexaedron8 && type_id != ITI_Hexaedron27 && type_id != ITI_Hexaedron20)
281 FixedArray<Real3, 27> coords_array;
282 Int32 nb_node = m_item_type_mng->typeFromId(type_id)->nbLocalNode();
283 ArrayView<Real3> coords(coords_array.view().subView(0, nb_node));
284 _fillHexaedronCoordinates(type_id, coords, x0, y0, z1, z2);
285 _addCell(type_id, coords);
291void SimpleMeshGenerator::
292_createSimpleHexaedron8(Real x0, Real y0, Real z1, Real z2)
294 _createSimpleHexaedron(ITI_Hexaedron8, x0, y0, z1, z2);
300void SimpleMeshGenerator::
301_createSimpleOctaedron12(Real x0, Real y0, Real z1, Real z2)
303 FixedArray<Int64, 12> ids;
304 ids[0] = _addNode(x0, y0 + 0.5, z1);
305 ids[1] = _addNode(x0 + 0.25, y0, z1);
306 ids[2] = _addNode(x0 + 0.75, y0, z1);
307 ids[3] = _addNode(x0 + 1.0, y0 + 0.5, z1);
308 ids[4] = _addNode(x0 + 0.75, y0 + 1., z1);
309 ids[5] = _addNode(x0 + 0.25, y0 + 1., z1);
311 ids[6] = _addNode(x0, y0 + 0.5, z2);
312 ids[7] = _addNode(x0 + 0.25, y0, z2);
313 ids[8] = _addNode(x0 + 0.75, y0, z2);
314 ids[9] = _addNode(x0 + 1., y0 + 0.5, z2);
315 ids[10] = _addNode(x0 + 0.75, y0 + 1., z2);
316 ids[11] = _addNode(x0 + 0.25, y0 + 1., z2);
317 _addCell(IT_Octaedron12, ids.view());
323void SimpleMeshGenerator::
324_createSimpleHeptaedron10(Real x0, Real y0, Real z1, Real z2)
326 FixedArray<Int64, 10> ids;
327 ids[0] = _addNode(x0, y0 + 0.5, z1);
328 ids[1] = _addNode(x0 + 1. / 2., y0, z1);
329 ids[2] = _addNode(x0 + 2. / 2., y0 + 0.25, z1);
330 ids[3] = _addNode(x0 + 2. / 2., y0 + 0.75, z1);
331 ids[4] = _addNode(x0 + 1. / 2., y0 + 1, z1);
333 ids[5] = _addNode(x0, y0 + 0.5, z2);
334 ids[6] = _addNode(x0 + 1. / 2., y0, z2);
335 ids[7] = _addNode(x0 + 2. / 2., y0 + 0.25, z2);
336 ids[8] = _addNode(x0 + 2. / 2., y0 + 0.75, z2);
337 ids[9] = _addNode(x0 + 1. / 2., y0 + 1., z2);
338 _addCell(IT_Heptaedron10, ids.view());
344void SimpleMeshGenerator::
345_createSimplePentaedron6(Real x0, Real y0, Real z1, Real z2)
347 FixedArray<Int64, 6> ids;
348 ids[0] = _addNode(x0, y0, z1);
349 ids[1] = _addNode(x0 + 1., y0 + 1. / 2., z1);
350 ids[2] = _addNode(x0, y0 + 1., z1);
351 ids[3] = _addNode(x0, y0, z2);
352 ids[4] = _addNode(x0 + 1., y0 + 1. / 2., z2);
353 ids[5] = _addNode(x0, y0 + 1., z2);
354 _addCell(IT_Pentaedron6, ids.view());
360void SimpleMeshGenerator::
361_createSimplePyramid5(Real x0, Real y0, Real z1, Real z2)
363 FixedArray<Int64, 5> ids;
364 ids[0] = _addNode(x0, y0, z1);
365 ids[1] = _addNode(x0 + 1., y0, z1);
366 ids[2] = _addNode(x0 + 1., y0 + 1., z1);
367 ids[3] = _addNode(x0, y0 + 1., z1);
368 ids[4] = _addNode(x0 + 0.5, y0 + 0.5, z2);
369 _addCell(IT_Pyramid5, ids.view());
375void SimpleMeshGenerator::
376_createSimpleTetraedron4(Real x0, Real y0, Real z1, Real z2)
378 FixedArray<Int64, 4> ids;
379 ids[0] = _addNode(x0, y0, z1);
380 ids[1] = _addNode(x0 + 1., y0, z1);
381 ids[2] = _addNode(x0 + 0.5, y0 + 1., z1);
382 ids[3] = _addNode(x0 + 0.5, y0 + 0.5, z2);
383 _addCell(IT_Tetraedron4, ids.view());
389bool SimpleMeshGenerator::
392 IPrimaryMesh* mesh = m_mesh;
394 info() <<
"Using simple mesh generator";
395 mesh->setDimension(3);
396 m_item_type_mng = mesh->itemTypeMng();
399 _createSimpleHexaedron8(2., 0., 0., 1.);
400 _createSimpleOctaedron12(4., 0., 0., 1.);
401 _createSimpleHeptaedron10(6., 0., 0., 1.);
402 _createSimplePentaedron6(8., 0., 0., 1.);
403 _createSimplePyramid5(10., 0., 0., 1.);
404 _createSimpleTetraedron4(12., 0., 0., 1.);
405 _createSimpleHemiHexa7(14., 0., 0., 1.);
406 _createSimpleHemiHexa6(16., 0., 0., 1.);
407 _createSimpleHemiHexa5(18., 0., 0., 1.);
408 _createSimpleAntiWedgeLeft6(20., 0., 0., 1.);
409 _createSimpleAntiWedgeRight6(22., 0., 0., 1.);
410 _createSimpleDiTetra5(24., 0., 0., 1.);
414 _createSimpleHexaedron8(0., 0., 0., 1.);
415 _createSimpleHemiHexa7(0., 0., 1., 2.);
416 _createSimpleHexaedron8(1., 0., 0., 1.);
418 _createSimpleHexaedron8(2., 0., 0., 1.);
419 _createSimpleHemiHexa6(2., 0., 1., 2.);
420 _createSimpleHexaedron8(3., 0., 0., 1.);
422 _createSimpleHexaedron8(4., 0., 0., 1.);
423 _createSimpleHemiHexa5(4., 0., 1., 2.);
424 _createSimpleHexaedron8(5., 0., 0., 1.);
426 _createSimpleHexaedron8(6., 0., 0., 1.);
427 _createSimpleAntiWedgeLeft6(6., 0., 1., 2.);
428 _createSimpleHexaedron8(7., 0., 0., 1.);
430 _createSimpleHexaedron8(8., 0., 0., 1.);
431 _createSimpleAntiWedgeRight6(8., 0., 1., 2.);
432 _createSimpleHexaedron8(9., 0., 0., 1.);
434 _createSimpleHexaedron8(10., 0., 0., 1.);
435 _createSimplePyramid5(10., 0., 1., 2.);
436 _createSimpleHexaedron8(11., 0., 0., 1.);
440 _createSimpleHexaedron8(2., 0., 0., 1.);
441 _createSimpleOctaedron12(4., 0., 0., 1.);
442 _createSimpleHeptaedron10(6., 0., 0., 1.);
443 _createSimplePentaedron6(8., 0., 0., 1.);
444 _createSimplePyramid5(10., 0., 0., 1.);
445 _createSimpleTetraedron4(12., 0., 0., 1.);
449 _createSimpleHexaedron(ITI_Hexaedron20, 0., 0., 0., 1.);
450 _createSimpleHexaedron(ITI_Hexaedron20, 1., 0., 0., 1.);
451 _createSimpleHexaedron(ITI_Hexaedron27, 2., 0., 0., 1.);
452 _createSimpleHexaedron(ITI_Hexaedron27, 3., 0., 0., 1.);
455 UniqueArray<Int64> cells_infos(m_cells_infos.size());
456 for (Integer i = 0; i < m_cells_infos.size(); ++i)
457 cells_infos[i] = m_cells_infos[i];
460 UniqueArray<Int64> nodes_unique_id(m_nodes_unique_id.size());
461 for (Integer i = 0; i < m_nodes_unique_id.size(); ++i)
462 nodes_unique_id[i] = m_nodes_unique_id[i];
467 UniqueArray<Int32> nodes_local_id(nodes_unique_id.size());
468 IItemFamily* family = mesh->itemFamily(IK_Node);
469 family->itemsUniqueIdToLocalId(nodes_local_id, nodes_unique_id);
470 NodeInfoListView nodes_internal(family);
471 Integer nb_node_local_id = nodes_local_id.size();
472 for (Integer i = 0; i < nb_node_local_id; ++i) {
473 Node node = nodes_internal[nodes_local_id[i]];
475 nodes_coord_var[node] = m_nodes_coords[i];
479 nodes_coord_var.synchronize();
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Type d'une entité (Item).
Identifiant unique d'une entité.
Classe gérant un vecteur de réel de dimension 3.
Integer _addNode(Real3 position)
Ajoute ou récupère le nœud ayant pour coordonnées pos.
Real3Map m_coords_to_uid
Mapping Coordonnées --> Indice unique. Pour la fusion automatique des noeuds aux mêmes coordonnées,...
Tableau 1D de données avec buffer pré-alloué sur la pile.
Chaîne de caractères unicode.
Classe d'accès aux traces.
XmlNode child(const String &name) const
Noeud fils de celui-ci de nom name.
Integer valueAsInteger(bool throw_exception=false) const
Valeur du noeud convertie en entier.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
std::int16_t Int16
Type entier signé sur 16 bits.
double Real
Type représentant un réel.
std::int32_t Int32
Type entier signé sur 32 bits.