Arcane  4.2.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
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 permettant la création d'un maillage avec une section d'un */
11/* autre maillage. */
12/*---------------------------------------------------------------------------*/
13/*---------------------------------------------------------------------------*/
14
15#include "arcane/utils/ArgumentException.h"
16
17#include "arcane/core/IMesh.h"
18#include "arcane/core/IMeshFactoryMng.h"
19#include "arcane/core/IMeshMng.h"
20#include "arcane/core/IMeshModifier.h"
21#include "arcane/core/IPrimaryMesh.h"
22#include "arcane/core/MeshBuildInfo.h"
23#include "arcane/core/IMeshSection.h"
24#include "arcane/core/IVariableMng.h"
25#include "arcane/core/VariableMetaData.h"
26
27#include "arcane/core/internal/IVariableInternal.h"
28#include "arcane/core/internal/IVariableMngInternal.h"
29
30#include "arcane/std/MeshSection_axl.h"
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35namespace Arcane
36{
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40
41namespace
42{
43
44 template <class T>
45struct VariableGroup
46{
47 UniqueArray<ArrayView<T>> dim1;
48 UniqueArray<Array2View<T>> dim2;
49};
50
51template <class T>
52struct VariableGroupType
53{
54 bool isUnknownUsed() { return !(unknown.dim1.empty() && unknown.dim2.empty()); }
55 bool isCellsUsed() { return !(cells.dim1.empty() && cells.dim2.empty()); }
56 bool isFacesUsed() { return !(faces.dim1.empty() && faces.dim2.empty()); }
57 bool isNodesUsed() { return !(nodes.dim1.empty() && nodes.dim2.empty()); }
58
59 VariableGroup<T> unknown;
60 VariableGroup<T> cells;
61 VariableGroup<T> faces;
62 VariableGroup<T> nodes;
63};
64
65template <class T>
66struct VariableOriClone
67{
68 VariableGroupType<T> ori;
69 VariableGroupType<T> clone;
70};
71} // namespace
72
73/*---------------------------------------------------------------------------*/
74/*---------------------------------------------------------------------------*/
75
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 retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_(type, name, group)
Enumérateur générique d'un groupe d'entité
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
Recherche le maillage de nom name.
virtual void clearItems()=0
Supprime toutes les entitées de toutes les familles de ce maillage.
virtual IMeshModifier * modifier()=0
Interface de modification associée.
virtual IMeshMng * meshMng() const =0
Retourne le gestionnaire de maillage.
CellGroup ownCells() const
Retourne le groupe contenant toutes les mailles propres à ce domaine.
Integer nbNode() const
Retourne le nombre de noeuds du maillage.
Integer nbCell() const
Retourne le nombre de mailles du maillage.
Integer nbFace() const
Retourne le nombre de faces du maillage.
Handle sur un maillage.
Definition MeshHandle.h:48
void addPlane(const Real3 &p0, const Real3 &normal) override
Méthode permettant d'ajouter un plan au service de coupe. L'utilisation de ces plans dépend du servic...
void updateSection() override
Méthode permettant de mettre à jour la section du maillage avec tous les plans.
MeshHandle meshSection() override
Méthode permettant d'obtenir la section du maillage.
VariableCollection variables() override
Méthode permettant d'obtenir un ensemble de variables copiées sur le nouveau maillage.
void setVariables(VariableCollection variables) override
Méthode permettant d'ajouter un ensemble de variables à copier sur le nouveau maillage.
void setServiceMeshUniqueId(Int32 unique_id) override
Méthode permettant de définir un identifiant unique pour créer plusieurs services de section pour un ...
Classe gérant un vecteur réel de 3 dimensions.
eServiceType creationType() const
Type du service pouvant être créé par cette instance.
Structure contenant les informations pour créer un service.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
Collection de variables.
__host__ __device__ Real dot(Real2 u, Real2 v)
Produit scalaire de u par v dans .
Definition MathUtils.h:94
__host__ __device__ Real3 normalizeReal3(Real3 v)
Normalisation d'un Real3.
Definition MathUtils.h:777
MeshVariableScalarRefT< Face, Byte > VariableFaceBool
Grandeur aux faces de type booléen.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int8_t Int8
Type entier signé sur 8 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
eServiceType
Type du service.
@ ST_CaseOption
Le service s'utilise au niveau du jeu de données.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ IK_Face
Entité de maillage de genre face.
std::int16_t Int16
Type entier signé sur 16 bits.
double Real
Type représentant un réel.
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:42
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
float Float32
Type flottant IEEE-753 simple précision.
@ DT_Float32
Donnée de type 'Float32'.
Definition DataTypes.h:52
@ DT_Real2x2
Donnée de type tenseur 3x3.
Definition DataTypes.h:48
@ DT_Int16
Donnée de type entier 16 bits.
Definition DataTypes.h:42
@ DT_Int8
Donnée de type entier sur 8 bits.
Definition DataTypes.h:53
@ DT_Real3x3
Donnée de type tenseur 3x3.
Definition DataTypes.h:49
@ DT_Int32
Donnée de type entier 32 bits.
Definition DataTypes.h:43
@ DT_Real3
Donnée de type vecteur 3.
Definition DataTypes.h:47
@ DT_Float16
Donnée de type 'Float16'.
Definition DataTypes.h:51
@ DT_Int64
Donnée de type entier 64 bits.
Definition DataTypes.h:44
@ DT_BFloat16
Donnée de type 'BFloat16'.
Definition DataTypes.h:50
@ DT_Real2
Donnée de type vecteur 2.
Definition DataTypes.h:46
@ DT_Real
Donnée de type réel.
Definition DataTypes.h:41
@ DT_Byte
Donnée de type octet.
Definition DataTypes.h:40
@ Cell
Le maillage est AMR par maille.
Definition MeshKind.h:52
std::int32_t Int32
Type entier signé sur 32 bits.
Arcane::BFloat16 BFloat16
Type 'Brain Float16'.