Arcane  4.2.3.0
Developer documentation
Loading...
Searching...
No Matches
MeshSectionService.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/* MeshSectionService.cc (C) 2000-2026 */
9/* */
10/* Service allowing the creation of a mesh with a section of another mesh. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArgumentException.h"
15
16#include "arcane/core/IMesh.h"
17#include "arcane/core/IMeshFactoryMng.h"
18#include "arcane/core/IMeshMng.h"
19#include "arcane/core/IMeshModifier.h"
20#include "arcane/core/IPrimaryMesh.h"
21#include "arcane/core/MeshBuildInfo.h"
22#include "arcane/core/IMeshSection.h"
23#include "arcane/core/IVariableMng.h"
24#include "arcane/core/VariableMetaData.h"
25
26#include "arcane/core/internal/IVariableInternal.h"
27#include "arcane/core/internal/IVariableMngInternal.h"
28
29#include "arcane/std/MeshSection_axl.h"
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34namespace Arcane
35{
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
40namespace
41{
42
43 template <class T>
44struct VariableGroup
45{
46 UniqueArray<ArrayView<T>> dim1;
47 UniqueArray<Array2View<T>> dim2;
48};
49
50template <class T>
51struct VariableGroupType
52{
53 bool isUnknownUsed() { return !(unknown.dim1.empty() && unknown.dim2.empty()); }
54 bool isCellsUsed() { return !(cells.dim1.empty() && cells.dim2.empty()); }
55 bool isFacesUsed() { return !(faces.dim1.empty() && faces.dim2.empty()); }
56 bool isNodesUsed() { return !(nodes.dim1.empty() && nodes.dim2.empty()); }
57
58 VariableGroup<T> unknown;
59 VariableGroup<T> cells;
60 VariableGroup<T> faces;
61 VariableGroup<T> nodes;
62};
63
64template <class T>
65struct VariableOriClone
66{
67 VariableGroupType<T> ori;
68 VariableGroupType<T> clone;
69};
70} // namespace
71
72/*---------------------------------------------------------------------------*/
73/*---------------------------------------------------------------------------*/
74
84class MeshSectionService
86{
87 public:
88
89 explicit MeshSectionService(const ServiceBuildInfo& sbi)
91 , m_creation_type(sbi.creationType())
92 {}
93
94 public:
95
96 void addPlane(const Real3& p0, const Real3& normal) override;
97
100 void setServiceMeshUniqueId(Int32 unique_id) override;
101 void updateSection() override;
102
104 {
105 return m_cloned_mesh->handle();
106 }
107
108 private:
109
110 void _createMesh();
111 void _createVariables();
112 void _createCells(Int32& nb_cell, UniqueArray<Int64>& cells_infos, Int32& nb_face, UniqueArray<Int64>& faces_infos, std::unordered_map<Int64, Real3>& pos_node, UniqueArray<Cell>& ori_cells);
113 void _compute();
114 void _updateVariables(UniqueArray<Cell>& ori_cells);
115
116 template <class T>
117 void _updateVariablesT(UniqueArray<Cell>& ori_cells, Int32 type, T);
118
119 template <class T>
120 void _updateArrayVariable(UniqueArray<Cell>& ori_cells, T, VariableOriClone<T>& voc);
121
122 private:
123
124 VariableCollection m_variables_ori;
125 VariableCollection m_variables_cloned;
126 IPrimaryMesh* m_cloned_mesh = nullptr;
128 Int32 m_mesh_uid = -1;
129 eServiceType m_creation_type;
130};
131
132/*---------------------------------------------------------------------------*/
133/*---------------------------------------------------------------------------*/
134
135ARCANE_REGISTER_SERVICE_MESHSECTION(MeshSection, MeshSectionService);
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
142
144addPlane(const Real3& p0, const Real3& normal)
145{
146 m_plans.add({ p0, math::normalizeReal3(normal) });
147}
148
149/*---------------------------------------------------------------------------*/
150/*---------------------------------------------------------------------------*/
151
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
162variables()
163{
164 return m_variables_cloned;
165}
166
167/*---------------------------------------------------------------------------*/
168/*---------------------------------------------------------------------------*/
169
172{
173 m_mesh_uid = unique_id;
174}
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
178
181{
182 _createMesh();
183 _compute();
184}
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
188
189void MeshSectionService::
190_createMesh()
191{
192 if (m_cloned_mesh != nullptr) {
193 m_cloned_mesh->modifier()->clearItems();
194 }
195
196 IMeshMng* mm = subDomain()->meshMng();
197
198 if (m_mesh_uid == -1) {
199 if (m_creation_type == ST_CaseOption) {
200 m_mesh_uid = options()->getUniqueIdServiceMesh();
201 }
202 else {
203 m_mesh_uid = 0;
204 }
205 }
206
207 String service_mesh_name = mesh()->name() + "_MeshSection" + m_mesh_uid;
208
209 MeshHandle* mesh_handle = mm->findMeshHandle(service_mesh_name, false);
210
211 if (mesh_handle == nullptr) {
212 IParallelMng* pm = subDomain()->parallelMng();
213 MeshBuildInfo mbi(service_mesh_name);
214 mbi.addParallelMng(makeRef(pm));
215 m_cloned_mesh = mm->meshFactoryMng()->createMesh(mbi);
216 m_cloned_mesh->modifier()->setDynamic(true);
217 m_cloned_mesh->setDimension(mesh()->dimension());
218 m_cloned_mesh->endAllocate();
219 }
220 else {
221 m_cloned_mesh = mesh_handle->mesh()->toPrimaryMesh();
222 m_cloned_mesh->modifier()->clearItems();
223 }
224 _createVariables();
225}
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
229
230void MeshSectionService::
231_createVariables()
232{
233 IVariableMng* variable_mng = m_cloned_mesh->variableMng();
234 for (VariableCollection::Enumerator i(m_variables_ori); ++i;) {
235 IVariable* var = *i;
236 Ref vmd(var->createMetaDataRef());
237 const String& mesh_name = vmd->meshName();
238 if (mesh_name.null()) {
239 ARCANE_FATAL("Only variables with support are supported.");
240 }
241 if (vmd->isPartial()) {
242 ARCANE_FATAL("Partial variables are not supported.");
243 }
244 const String& full_type = vmd->fullType();
245 const String& base_name = vmd->baseName();
246 Integer property = vmd->property();
247 const String& family_name = vmd->itemFamilyName();
248
249 // info() << "Clone variable : " << vmd->fullName();
250
251 VariableBuildInfo vbi(m_cloned_mesh, base_name, family_name, property);
252 VariableRef* variable_ref = variable_mng->_internalApi()->createVariableFromType(full_type, vbi);
253
254 // info() << "Cloned variable : " << variable_ref->variable()->fullName();
255 m_variables_cloned.add(variable_ref->variable());
256 }
257}
258
259/*---------------------------------------------------------------------------*/
260/*---------------------------------------------------------------------------*/
261
262void MeshSectionService::
263_createCells(Int32& sd_nb_cell, UniqueArray<Int64>& cells_infos, Int32& sd_nb_face, UniqueArray<Int64>& faces_infos, std::unordered_map<Int64, Real3>& pos_node, UniqueArray<Cell>& ori_cells)
264{
265 VariableNodeReal3& node_coord = mesh()->nodesCoordinates();
266
267 VariableFaceBool is_added(VariableBuildInfo(mesh(), "IsAdded"));
268 is_added.fill(false);
269
270 ENUMERATE_ (Cell, icell, ownCells()) {
271 {
272 Real3 b{ 0 };
273 for (Node node : icell->nodes()) {
274 b += node_coord[node];
275 }
276 b /= icell->nbNode();
277
278 bool in_plan = true;
279 for (auto& [p0, normal] : m_plans) {
280 const Real dist = math::dot({ b - p0 }, normal);
281 if (dist < 0) {
282 in_plan = false;
283 break;
284 }
285 }
286
287 if (!in_plan)
288 continue;
289 }
290
291 ori_cells.add(*icell);
292
293 Int16 cell_type = icell->itemTypeId();
294 cells_infos.add(cell_type);
295
296 Int64 cell_uid = icell->uniqueId().asInt64();
297 cells_infos.add(cell_uid);
298
299 for (Node node : icell->nodes()) {
300 Int64 node_uid = node.uniqueId().asInt64();
301 cells_infos.add(node_uid);
302 pos_node[node.uniqueId()] = node_coord[node];
303 }
304 ++sd_nb_cell;
305
306 for (Face face : icell->faces()) {
307 if (is_added[face]) continue;
308 is_added[face] = true;
309
310 Int16 face_type = face.itemTypeId();
311 faces_infos.add(face_type);
312
313 Int64 face_uid = face.uniqueId().asInt64();
314 faces_infos.add(face_uid);
315
316 for (Node node : face.nodes()) {
317 Int64 node_uid = node.uniqueId().asInt64();
318 faces_infos.add(node_uid);
319 pos_node[node.uniqueId()] = node_coord[node];
320 }
321 ++sd_nb_face;
322 }
323 }
324}
325
326/*---------------------------------------------------------------------------*/
327/*---------------------------------------------------------------------------*/
328
329void MeshSectionService::
330_compute()
331{
332 UniqueArray<Int64> cells_infos;
333 cells_infos.reserve(10000);
334
335 UniqueArray<Int64> faces_infos;
336 faces_infos.reserve(10000);
337
338 UniqueArray<Cell> ori_cells;
339
340 std::unordered_map<Int64, Real3> coord_map;
341
342 Int32 nb_cell = 0;
343 Int32 nb_face = 0;
344
345 _createCells(nb_cell, cells_infos, nb_face, faces_infos, coord_map, ori_cells);
346
347 m_cloned_mesh->modifier()->addFaces(nb_face, faces_infos);
348 m_cloned_mesh->modifier()->addCells(nb_cell, cells_infos);
349 m_cloned_mesh->modifier()->endUpdate();
350
351 {
352 VariableNodeReal3& node_coords(m_cloned_mesh->nodesCoordinates());
353 ENUMERATE_ (Node, inode, m_cloned_mesh->allNodes()) {
354 node_coords[inode] = coord_map[inode->uniqueId()];
355 }
356 }
357
358 _updateVariables(ori_cells);
359
360 info() << "New mesh -- NbNode : " << m_cloned_mesh->nbNode() << " -- NbCells : " << m_cloned_mesh->nbCell();
361}
362
363/*---------------------------------------------------------------------------*/
364/*---------------------------------------------------------------------------*/
365
366void MeshSectionService::
367_updateVariables(UniqueArray<Cell>& ori_cells)
368{
369 for (Int32 type = 0; type < NB_ARCANE_DATA_TYPE; ++type) {
370 switch (type) {
371 case DT_Byte: {
372 _updateVariablesT(ori_cells, type, Byte());
373 } break;
374 case DT_Real: {
375 _updateVariablesT(ori_cells, type, Real());
376 } break;
377 case DT_Real2: {
378 _updateVariablesT(ori_cells, type, Real2());
379 } break;
380 case DT_Real2x2: {
381 _updateVariablesT(ori_cells, type, Real2x2());
382 } break;
383 case DT_Real3: {
384 _updateVariablesT(ori_cells, type, Real3());
385 } break;
386 case DT_Real3x3: {
387 _updateVariablesT(ori_cells, type, Real3x3());
388 } break;
389 case DT_Int8: {
390 _updateVariablesT(ori_cells, type, Int8());
391 } break;
392 case DT_Int16: {
393 _updateVariablesT(ori_cells, type, Int16());
394 } break;
395 case DT_Int32: {
396 _updateVariablesT(ori_cells, type, Int32());
397 } break;
398 case DT_Int64: {
399 _updateVariablesT(ori_cells, type, Int64());
400 } break;
401 case DT_Float32: {
402 _updateVariablesT(ori_cells, type, Float32());
403 } break;
404 case DT_Float16: {
405 _updateVariablesT(ori_cells, type, Float16());
406 } break;
407 case DT_BFloat16: {
408 _updateVariablesT(ori_cells, type, BFloat16());
409 } break;
410 default:
411 break;
412 }
413 }
414}
415
416/*---------------------------------------------------------------------------*/
417/*---------------------------------------------------------------------------*/
418
419template <class T>
420void MeshSectionService::
421_updateVariablesT(UniqueArray<Cell>& ori_cells, Int32 type, T)
422{
423 VariableOriClone<T> voc;
424
425 if (m_variables_cloned.count() != m_variables_ori.count()) {
426 ARCANE_FATAL("Bad size");
427 }
428
429 VariableCollection::Enumerator iclone(m_variables_cloned);
430 VariableCollection::Enumerator iori(m_variables_ori);
431
432 while (++iclone && ++iori) {
433 IVariable* ori = *iori;
434 if (ori->dataType() == type) {
435 IVariable* clone = *iclone;
436 if (ori->dimension() == 1) {
437 auto* ori_data = ARCANE_CHECK_POINTER(dynamic_cast<IArrayDataT<T>*>(ori->data()));
438 auto* clo_data = ARCANE_CHECK_POINTER(dynamic_cast<IArrayDataT<T>*>(clone->data()));
439
440 if (ori->itemKind() == IK_Unknown) {
441 voc.ori.unknown.dim1.add(ori_data->view());
442 voc.clone.unknown.dim1.add(clo_data->view());
443 }
444 else if (ori->itemKind() == IK_Cell) {
445 voc.ori.cells.dim1.add(ori_data->view());
446 voc.clone.cells.dim1.add(clo_data->view());
447 }
448 else if (ori->itemKind() == IK_Face) {
449 voc.ori.faces.dim1.add(ori_data->view());
450 voc.clone.faces.dim1.add(clo_data->view());
451 }
452 else if (ori->itemKind() == IK_Node) {
453 voc.ori.nodes.dim1.add(ori_data->view());
454 voc.clone.nodes.dim1.add(clo_data->view());
455 }
456 else {
457 ARCANE_FATAL("Variable type not supported -- Type : {0}", ori->itemKind());
458 }
459 }
460 else if (ori->dimension() == 2) {
461 // if (ori->itemKind() == IK_Unknown) {
462 // VariableResizeArgs vra(ori->nbElement());
463 // clone->_internalApi()->resize(vra);
464 // auto* ori_data = ARCANE_CHECK_POINTER(dynamic_cast<IArray2DataT<T>*>(ori->data()));
465 // auto* clo_data = ARCANE_CHECK_POINTER(dynamic_cast<IArray2DataT<T>*>(clone->data()));
466 // voc.ori.unknown.dim2.add(ori_data->view());
467 // voc.clone.unknown.dim2.add(clo_data->view());
468 // }
469 // else
470 if (ori->itemKind() == IK_Cell) {
471 VariableResizeArgs vra(-1);
472 vra.setNewSizeDim2(ori->nbElement() / mesh()->nbCell());
473 clone->_internalApi()->resize(vra);
474 auto* ori_data = ARCANE_CHECK_POINTER(dynamic_cast<IArray2DataT<T>*>(ori->data()));
475 auto* clo_data = ARCANE_CHECK_POINTER(dynamic_cast<IArray2DataT<T>*>(clone->data()));
476 voc.ori.cells.dim2.add(ori_data->view());
477 voc.clone.cells.dim2.add(clo_data->view());
478 }
479 else if (ori->itemKind() == IK_Face) {
480 VariableResizeArgs vra(-1);
481 vra.setNewSizeDim2(ori->nbElement() / mesh()->nbFace());
482 clone->_internalApi()->resize(vra);
483 auto* ori_data = ARCANE_CHECK_POINTER(dynamic_cast<IArray2DataT<T>*>(ori->data()));
484 auto* clo_data = ARCANE_CHECK_POINTER(dynamic_cast<IArray2DataT<T>*>(clone->data()));
485 voc.ori.faces.dim2.add(ori_data->view());
486 voc.clone.faces.dim2.add(clo_data->view());
487 }
488 else if (ori->itemKind() == IK_Node) {
489 VariableResizeArgs vra(-1);
490 vra.setNewSizeDim2(ori->nbElement() / mesh()->nbNode());
491 clone->_internalApi()->resize(vra);
492 auto* ori_data = ARCANE_CHECK_POINTER(dynamic_cast<IArray2DataT<T>*>(ori->data()));
493 auto* clo_data = ARCANE_CHECK_POINTER(dynamic_cast<IArray2DataT<T>*>(clone->data()));
494 voc.ori.nodes.dim2.add(ori_data->view());
495 voc.clone.nodes.dim2.add(clo_data->view());
496 }
497 }
498 else {
499 ARCANE_FATAL("Variable dim not supported -- Dim : {0}", ori->dimension());
500 }
501 }
502 }
503
504 _updateArrayVariable(ori_cells, T(), voc);
505}
506
507/*---------------------------------------------------------------------------*/
508/*---------------------------------------------------------------------------*/
509
510template <class T>
511void MeshSectionService::
512_updateArrayVariable(UniqueArray<Cell>& ori_cells, T, VariableOriClone<T>& voc)
513{
514 if (voc.ori.isUnknownUsed()) {
515 for (Int32 i = 0; i < voc.ori.unknown.dim1.size(); ++i) {
516 voc.clone.unknown.dim1[i].copy(voc.ori.unknown.dim1[i]);
517 }
518 for (Int32 i = 0; i < voc.ori.unknown.dim2.size(); ++i) {
519 for (Int32 j = 0; j < voc.ori.unknown.dim2[i].dim2Size(); ++j) {
520 voc.clone.unknown.dim2[i][j].copy(voc.ori.unknown.dim2[i][j]);
521 }
522 }
523 }
524
525 ENUMERATE_ (Cell, icell, m_cloned_mesh->ownCells()) {
526 Cell ori_cell = ori_cells[icell.localId()];
527 if (voc.ori.isCellsUsed()) {
528 for (Int32 i = 0; i < voc.ori.cells.dim1.size(); ++i) {
529 voc.clone.cells.dim1[i][icell.localId()] = voc.ori.cells.dim1[i][ori_cell.localId()];
530 }
531 for (Int32 i = 0; i < voc.ori.cells.dim2.size(); ++i) {
532 voc.clone.cells.dim2[i][icell.localId()].copy(voc.ori.cells.dim2[i][ori_cell.localId()]);
533 }
534 }
535
536 if (voc.ori.isNodesUsed()) {
537 for (Int32 i = 0; i < icell->nbNode(); ++i) {
538 Node ori_node = ori_cell.node(i);
539 Node cloned_node = icell->node(i);
540
541 for (Int32 j = 0; j < voc.ori.nodes.dim1.size(); ++j) {
542 voc.clone.nodes.dim1[j][cloned_node.localId()] = voc.ori.nodes.dim1[j][ori_node.localId()];
543 }
544 for (Int32 j = 0; j < voc.ori.nodes.dim2.size(); ++j) {
545 voc.clone.nodes.dim2[j][cloned_node.localId()].copy(voc.ori.nodes.dim2[j][ori_node.localId()]);
546 }
547 }
548 }
549
550 if (voc.ori.isFacesUsed()) {
551 for (Int32 i = 0; i < icell->nbFace(); ++i) {
552 Face ori_face = ori_cell.face(i);
553 Face cloned_face = icell->face(i);
554
555 for (Int32 j = 0; j < voc.ori.faces.dim1.size(); ++j) {
556 voc.clone.faces.dim1[j][cloned_face.localId()] = voc.ori.faces.dim1[j][ori_face.localId()];
557 }
558 for (Int32 j = 0; j < voc.ori.faces.dim2.size(); ++j) {
559 voc.clone.faces.dim2[j][cloned_face.localId()].copy(voc.ori.faces.dim2[j][ori_face.localId()]);
560 }
561 }
562 }
563 }
564}
565
566/*---------------------------------------------------------------------------*/
567/*---------------------------------------------------------------------------*/
568
569} // namespace Arcane
570
571/*---------------------------------------------------------------------------*/
572/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro returning the pointer ptr if it is not null or throwing an exception if it is null.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
#define ENUMERATE_(type, name, group)
Generic enumerator for an entity group.
ArcaneMeshSectionObject(const Arcane::ServiceBuildInfo &sbi)
Constructeur.
CaseOptionsMeshSection * options() const
Options du jeu de données du service.
virtual MeshHandle * findMeshHandle(const String &name, bool throw_exception)=0
Searches for the mesh with name name.
virtual void clearItems()=0
Deletes all entities of all families in this mesh.
virtual IMeshModifier * modifier()=0
Associated modifier interface.
virtual IMeshMng * meshMng() const =0
Returns the mesh manager.
CellGroup ownCells() const
Returns the group containing all cells specific to this domain.
Integer nbNode() const
Returns the number of nodes in the mesh.
Integer nbCell() const
Returns the number of cells in the mesh.
Integer nbFace() const
Returns the number of faces in the mesh.
Handle on a mesh.
Definition MeshHandle.h:48
void addPlane(const Real3 &p0, const Real3 &normal) override
Method allowing to add a plane to the cut service. The use of these planes depends on the service.
void updateSection() override
Method allowing to update the mesh section with all planes.
MeshHandle meshSection() override
Méthod allowing to get the mesh section.
VariableCollection variables() override
Method allowing to get a set of variables copied on the new mesh.
void setVariables(VariableCollection variables) override
Method allowing to add a set of variables to copy on the new mesh.
void setServiceMeshUniqueId(Int32 unique_id) override
Method allowing to set a unique id allowing to create multiple section services for a mesh.
Class managing a 3-dimensional real vector.
eServiceType creationType() const
Type of service that can be created by this instance.
Structure containing the information to create a service.
TraceMessage info() const
Flow for an information message.
1D data vector with value semantics (STL style).
__host__ __device__ Real dot(Real2 u, Real2 v)
Dot product of u by v in .
Definition MathUtils.h:94
__host__ __device__ Real3 normalizeReal3(Real3 v)
Normalization of a Real3.
Definition MathUtils.h:778
MeshVariableScalarRefT< Face, Byte > VariableFaceBool
Quantity at the face of boolean type.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Coordinate type quantity at node.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int8_t Int8
Signed integer type of 8 bits.
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
eServiceType
Service type.
@ ST_CaseOption
The service is used at the dataset level.
@ IK_Node
Node mesh entity.
@ IK_Cell
Cell mesh entity.
@ IK_Unknown
Unknown or uninitialized mesh entity.
@ IK_Face
Face mesh entity.
std::int16_t Int16
Signed integer type of 16 bits.
double Real
Type representing a real number.
unsigned char Byte
Type of a byte.
Definition BaseTypes.h:42
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Creates a reference on a pointer.
float Float32
IEEE-753 single-precision floating-point type.
@ DT_Float32
'Float32' data type
Definition DataTypes.h:54
@ DT_Real2x2
2x2 tensor data type
Definition DataTypes.h:50
@ DT_Int16
16-bit integer data type
Definition DataTypes.h:44
@ DT_Int8
8-bit integer data type
Definition DataTypes.h:55
@ DT_Real3x3
3x3 tensor data type
Definition DataTypes.h:51
@ DT_Int32
32-bit integer data type
Definition DataTypes.h:45
@ DT_Real3
Vector 3 data type.
Definition DataTypes.h:49
@ DT_Float16
'Float16' data type
Definition DataTypes.h:53
@ DT_Int64
64-bit integer data type
Definition DataTypes.h:46
@ DT_BFloat16
'BFloat16' data type
Definition DataTypes.h:52
@ DT_Real2
Vector 2 data type.
Definition DataTypes.h:48
@ DT_Real
Real data type.
Definition DataTypes.h:43
@ DT_Byte
Byte data type.
Definition DataTypes.h:42
@ Cell
The mesh is AMR by cell.
Definition MeshKind.h:53
std::int32_t Int32
Signed integer type of 32 bits.
Arcane::BFloat16 BFloat16
Type 'Brain Float16'.