1
1
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2
2
// -----------------------------------------------------------------------------
3
- // Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3
+ // Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4
4
// See the top-level COPYRIGHT file for details.
5
5
// SPDX-License-Identifier: Apache-2.0
6
6
// -----------------------------------------------------------------------------
7
7
/* ---------------------------------------------------------------------------*/
8
- /* VtkHdfV2PostProcessor.cc (C) 2000-2024 */
8
+ /* VtkHdfV2PostProcessor.cc (C) 2000-2025 */
9
9
/* */
10
10
/* Pos-traitement au format VTK HDF. */
11
11
/* ---------------------------------------------------------------------------*/
30
30
#include " arcane/core/IMesh.h"
31
31
#include " arcane/core/internal/VtkCellTypes.h"
32
32
33
+ #include " arcane/core/materials/IMeshMaterialMng.h"
34
+ #include " arcane/core/materials/IMeshEnvironment.h"
35
+
33
36
#include " arcane/hdf5/Hdf5Utils.h"
34
37
#include " arcane/hdf5/VtkHdfV2PostProcessor_axl.h"
35
38
66
69
namespace Arcane
67
70
{
68
71
using namespace Hdf5Utils ;
72
+ using namespace Materials ;
69
73
70
74
namespace
71
75
{
@@ -93,6 +97,15 @@ class VtkHdfV2DataWriter
93
97
*/
94
98
struct DatasetGroupAndName
95
99
{
100
+ public:
101
+
102
+ DatasetGroupAndName (HGroup& group_, const String& name_)
103
+ : group(group_)
104
+ , name(name_)
105
+ {}
106
+
107
+ public:
108
+
96
109
HGroup& group;
97
110
String name;
98
111
};
@@ -215,7 +228,7 @@ class VtkHdfV2DataWriter
215
228
216
229
public:
217
230
218
- VtkHdfV2DataWriter (IMesh* mesh, const ItemGroupCollection& groups, bool use_collective_io );
231
+ VtkHdfV2DataWriter (IMesh* mesh, const ItemGroupCollection& groups, bool is_collective_io );
219
232
220
233
public:
221
234
@@ -232,8 +245,12 @@ class VtkHdfV2DataWriter
232
245
233
246
private:
234
247
248
+ // ! Maillage associé
235
249
IMesh* m_mesh = nullptr ;
236
250
251
+ // ! Gestionnaire de matériaux associé (peut-être nul)
252
+ IMeshMaterialMng* m_material_mng = nullptr ;
253
+
237
254
// ! Liste des groupes à sauver
238
255
ItemGroupCollection m_groups;
239
256
@@ -276,6 +293,7 @@ class VtkHdfV2DataWriter
276
293
277
294
ItemGroupCollectiveInfo m_all_cells_info;
278
295
ItemGroupCollectiveInfo m_all_nodes_info;
296
+ UniqueArray<Ref<ItemGroupCollectiveInfo>> m_materials_groups;
279
297
280
298
/* !
281
299
* \brief Taille maximale (en kilo-octet) pour une écriture.
@@ -328,6 +346,7 @@ class VtkHdfV2DataWriter
328
346
void _initializeOffsets ();
329
347
void _initializeItemGroupCollectiveInfos (ItemGroupCollectiveInfo& group_info);
330
348
WritePartInfo _computeWritePartInfo (Int64 local_size);
349
+ void _writeConstituentsGroups ();
331
350
};
332
351
333
352
/* ---------------------------------------------------------------------------*/
@@ -352,6 +371,9 @@ beginWrite(const VariableCollection& vars)
352
371
{
353
372
ARCANE_UNUSED (vars);
354
373
374
+ // Récupère le gestionnaire de matériaux s'il existe
375
+ m_material_mng = IMeshMaterialMng::getReference (m_mesh, false );
376
+
355
377
IParallelMng* pm = m_mesh->parallelMng ();
356
378
const Int32 nb_rank = pm->commSize ();
357
379
m_is_parallel = nb_rank > 1 ;
@@ -361,7 +383,7 @@ beginWrite(const VariableCollection& vars)
361
383
const bool is_first_call = (time_index < 2 );
362
384
m_is_first_call = is_first_call;
363
385
if (is_first_call)
364
- pwarning () << " L'implémentation au format 'VtkHdfV2' est expérimentale" ;
386
+ info () << " WARNING: L'implémentation au format 'VtkHdfV2' est expérimentale" ;
365
387
366
388
String filename = _getFileName ();
367
389
@@ -372,17 +394,19 @@ beginWrite(const VariableCollection& vars)
372
394
373
395
HInit ();
374
396
375
- // Il est possible d'utiliser le mode collectif de HDF5 via MPI-IO dans les cas suivants:
376
- // - Hdf5 a été compilé avec MPI
377
- // - on est en mode MPI pure (ni mode mémoire partagé, ni mode hybride)
397
+ // Il est possible d'utiliser le mode collectif de HDF5 via MPI-IO dans les cas suivants :
398
+ // * Hdf5 a été compilé avec MPI,
399
+ // * on est en mode MPI pure (ni mode mémoire partagé, ni mode hybride).
378
400
m_is_collective_io = m_is_collective_io && (pm->isParallel () && HInit::hasParallelHdf5 ());
379
401
if (pm->isHybridImplementation () || pm->isThreadImplementation ())
380
402
m_is_collective_io = false ;
381
403
382
404
if (is_first_call) {
383
405
info () << " VtkHdfV2DataWriter: using collective MPI/IO ?=" << m_is_collective_io;
384
406
info () << " VtkHdfV2DataWriter: max_write_size (kB) =" << m_max_write_size;
407
+ info () << " VtkHdfV2DataWriter: has_material?=" << (m_material_mng != nullptr );
385
408
}
409
+
386
410
// Vrai si on doit participer aux écritures
387
411
// Si on utilise MPI/IO avec HDF5, il faut tout de même que tous
388
412
// les rangs fassent toutes les opérations d'écriture pour garantir
@@ -511,10 +535,10 @@ beginWrite(const VariableCollection& vars)
511
535
points[index ][2 ] = pos.z ;
512
536
}
513
537
514
- // Sauve l'uniqueId de chaque noeud dans le dataset "GlobalNodeId".
538
+ // Sauve l'uniqueId de chaque nœud dans le dataset "GlobalNodeId".
515
539
_writeDataSet1DCollective<Int64>({ { m_node_data_group, " GlobalNodeId" }, m_cell_offset_info }, nodes_uid);
516
540
517
- // Sauve les informations sur le type de noeud (réel ou fantôme).
541
+ // Sauve les informations sur le type de nœud (réel ou fantôme).
518
542
_writeDataSet1DCollective<unsigned char >({ { m_node_data_group, " vtkGhostType" }, m_cell_offset_info }, nodes_ghost_type);
519
543
520
544
// Sauve les coordonnées des noeuds.
@@ -529,7 +553,6 @@ beginWrite(const VariableCollection& vars)
529
553
_writeDataSet1DCollective<Int64>({ { m_cell_data_group, " GlobalCellId" }, m_cell_offset_info }, cells_uid);
530
554
531
555
if (m_is_writer) {
532
-
533
556
// Liste des temps.
534
557
Real current_time = m_times[time_index - 1 ];
535
558
_writeDataSet1D<Real>({ { m_steps_group, " Values" }, m_time_offset_info }, asConstSpan (¤t_time));
@@ -541,6 +564,33 @@ beginWrite(const VariableCollection& vars)
541
564
// Nombre de temps
542
565
_addInt64Attribute (m_steps_group, " NSteps" , time_index);
543
566
}
567
+
568
+ _writeConstituentsGroups ();
569
+ }
570
+
571
+ /* ---------------------------------------------------------------------------*/
572
+ /* ---------------------------------------------------------------------------*/
573
+
574
+ void VtkHdfV2DataWriter::
575
+ _writeConstituentsGroups ()
576
+ {
577
+ if (!m_material_mng)
578
+ return ;
579
+
580
+ // Remplit les informations des groupes liés aux constituents
581
+ // NOTE : Pour l'instant, on ne traite que les milieux.
582
+ for (IMeshEnvironment* env : m_material_mng->environments ()) {
583
+ CellGroup cells = env->cells ();
584
+ Ref<ItemGroupCollectiveInfo> group_info_ref = createRef<ItemGroupCollectiveInfo>(cells);
585
+ m_materials_groups.add (group_info_ref);
586
+ ItemGroupCollectiveInfo& group_info = *group_info_ref.get ();
587
+ _initializeItemGroupCollectiveInfos (group_info);
588
+ ConstArrayView<Int32> groups_ids = cells.view ().localIds ();
589
+ DatasetGroupAndName dataset_group_name (m_top_group, String (" Constituent_" ) + cells.name ());
590
+ if (m_is_first_call)
591
+ info () << " Writing infos for group '" << cells.name () << " '" ;
592
+ _writeDataSet1DCollective<Int32>({ dataset_group_name, m_cell_offset_info }, groups_ids);
593
+ }
544
594
}
545
595
546
596
/* ---------------------------------------------------------------------------*/
@@ -1140,21 +1190,22 @@ _readAndSetOffset(DatasetInfo& offset_info, Int32 wanted_step)
1140
1190
void VtkHdfV2DataWriter::
1141
1191
_initializeOffsets ()
1142
1192
{
1143
- // Il y a 5 valeurs d'offset utilisées:
1193
+ // Il y a 5 valeurs d'offset utilisées :
1194
+ //
1144
1195
// - offset sur le nombre de mailles (CellOffsets). Cet offset a pour nombre d'éléments
1145
1196
// le nombre de temps sauvés et est augmenté à chaque sortie du nombre de mailles. Cet offset
1146
- // est aussi utiliser pour les variables aux mailles
1147
- // - offset sur le nombre de noeuds (PointOffsets). Il équivalent à 'CellOffsets' mais
1197
+ // est aussi utilisé pour les variables aux mailles
1198
+ // - offset sur le nombre de noeuds (PointOffsets). Il est équivalent à 'CellOffsets' mais
1148
1199
// pour les noeuds.
1149
1200
// - offset pour "NumberOfCells", "NumberOfPoints" et "NumberOfConnectivityIds". Pour chacun
1150
1201
// de ces champs il y a NbPart valeurs par temps, avec 'NbPart' le nombre de parties (donc
1151
- // le nombre de sous-domaines si on ne fait pas de regroupement). Il y a donc au total
1202
+ // le nombre de sous-domaines si on ne fait pas de regroupement). Il y a ainsi au total
1152
1203
// NbPart * NbTimeStep dans ce champ d'offset.
1153
1204
// - offset pour le champ "Connectivity" qui s'appelle "ConnectivityIdOffsets".
1154
1205
// Cet offset a pour nombre d'éléments le nombre de temps sauvés.
1155
1206
// - offset pour le champ "Offsets". "Offset" contient pour chaque maille l'offset dans
1156
- // "Connectivity" de la connectivité des noeuds de la maille. Cet offset n'est pas sauvés
1157
- // mais comme ce champ à un nombre de valeur égale au nombre de mailles plus 1 il est possible
1207
+ // "Connectivity" de la connectivité des noeuds de la maille. Cet offset n'est pas sauvés,
1208
+ // mais comme ce champ à un nombre de valeurs égal au nombre de mailles plus un il est possible
1158
1209
// de le déduire de "CellOffsets" (il vaut "CellOffsets" plus l'index du temps courant).
1159
1210
1160
1211
m_cell_offset_info = DatasetInfo (m_steps_group, " CellOffsets" );
0 commit comments