Arcane
v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ParticleFamilySerializer.cc
1
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2
//-----------------------------------------------------------------------------
3
// Copyright 2000-2023 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
/* ParticleFamilySerializer.cc (C) 2000-2023 */
9
/* */
10
/* Sérialisation/Désérialisation des familles de particules. */
11
/*---------------------------------------------------------------------------*/
12
/*---------------------------------------------------------------------------*/
13
14
#include "arcane/ISerializer.h"
15
#include "arcane/ItemPrinter.h"
16
#include "arcane/IMesh.h"
17
#include "arcane/IParallelMng.h"
18
19
#include "arcane/mesh/ParticleFamilySerializer.h"
20
#include "arcane/mesh/ParticleFamily.h"
21
22
/*---------------------------------------------------------------------------*/
23
/*---------------------------------------------------------------------------*/
24
25
namespace
Arcane::mesh
26
{
27
28
/*---------------------------------------------------------------------------*/
29
/*---------------------------------------------------------------------------*/
30
31
ParticleFamilySerializer::
32
ParticleFamilySerializer(ParticleFamily* family)
33
: TraceAccessor(family->traceMng())
34
, m_family(family)
35
{
36
}
37
38
/*---------------------------------------------------------------------------*/
39
/*---------------------------------------------------------------------------*/
40
41
void
ParticleFamilySerializer::
42
serializeItems(
ISerializer
*
sbuf
,
Int32ConstArrayView
local_ids
)
43
{
44
const
Integer
nb_item
=
local_ids
.size();
45
ItemInfoListView
items_internal
(m_family);
46
47
switch
(
sbuf
->mode()){
48
case
ISerializer::ModeReserve:
49
sbuf
->reserve(
DT_Int64
,1);
// Pour le nombre de particules
50
sbuf
->reserveSpan(
DT_Int64
,
nb_item
);
// Pour les uniqueId() des particules.
51
sbuf
->reserveSpan(
DT_Int64
,
nb_item
);
// Pour les uniqueId() des mailles dans lesquelles se trouve les particules
52
break
;
53
case
ISerializer::ModePut:
54
sbuf
->putInt64(
nb_item
);
55
{
56
Int64UniqueArray
particle_unique_ids
(
nb_item
);
57
for
( Integer z=0; z<
nb_item
; ++z ){
58
particle_unique_ids
[z] =
items_internal
.uniqueId(
local_ids
[z]).asInt64();
59
}
60
sbuf
->putSpan(
particle_unique_ids
);
61
}
62
{
63
Int64UniqueArray
particles_cell_uid
(
nb_item
);
64
for
( Integer z=0; z<
nb_item
; ++z ){
65
Particle
item(
items_internal
[
local_ids
[z]]);
66
bool
has_cell
= item.
hasCell
();
67
particles_cell_uid
[z] = (
has_cell
) ? item.
cell
().
uniqueId
() : NULL_ITEM_UNIQUE_ID;
68
}
69
sbuf
->putSpan(
particles_cell_uid
);
70
}
71
break
;
72
case
ISerializer::ModeGet:
73
deserializeItems(
sbuf
,
nullptr
);
74
break
;
75
}
76
}
77
78
/*---------------------------------------------------------------------------*/
79
/*---------------------------------------------------------------------------*/
80
81
void
ParticleFamilySerializer::
82
deserializeItems(
ISerializer
*
sbuf
,
Int32Array
*
local_ids
)
83
{
84
// NOTE: les mailles doivent avoir été désérialisées avant.
85
Int64UniqueArray
particles_uid
;
86
Int64UniqueArray
cells_unique_id
;
87
Int32UniqueArray
cells_local_id
;
88
Int32UniqueArray
particles_owner
;
89
IMesh
* mesh = m_family->mesh();
90
IItemFamily
*
cell_family
= mesh->
cellFamily
();
91
CellInfoListView
internal_cells
(
cell_family
);
92
93
Int64
nb_item
=
sbuf
->getInt64();
94
particles_uid
.resize(
nb_item
);
95
sbuf
->getSpan(
particles_uid
);
96
cells_unique_id
.resize(
nb_item
);
97
cells_local_id
.resize(
nb_item
);
98
sbuf
->getSpan(
cells_unique_id
);
99
Int32UniqueArray
temporary_particles_local_id
;
100
Int32Array
*
particles_local_id
= (
local_ids
) ?
local_ids
: &
temporary_particles_local_id
;
101
particles_local_id
->resize(
nb_item
);
102
Int32ArrayView
local_ids_view
=
particles_local_id
->view();
103
cell_family
->itemsUniqueIdToLocalId(
cells_local_id
,
cells_unique_id
,
true
);
104
105
// Si on gère les particules fantômes, alors les particules ont un propriétaire
106
// et dans ce cas il faut créér les particules avec cette information.
107
// On suppose alors que le propriétaire d'une particule est la maille dans laquelle
108
// elle se trouve.
109
// NOTE: dans la version actuelle, le support des particules fantômes implique
110
// que ces dernières aient une table de hashage pour les uniqueId()
111
// (c'est à dire particle_family->hasUniqueIdMap() == true).
112
if
(!m_family->getEnableGhostItems()){
113
m_family->addParticles(
particles_uid
,
local_ids_view
);
114
}
115
else
{
116
particles_owner
.resize(
nb_item
) ;
117
for
( Integer
zz
=0;
zz
<
nb_item
; ++
zz
){
118
Int32
cell_lid
=
cells_local_id
[
zz
];
119
if
(
cell_lid
!=NULL_ITEM_LOCAL_ID){
120
Cell
c
=
internal_cells
[
cell_lid
];
121
particles_owner
[
zz
] =
c
.owner() ;
122
}
123
else
124
particles_owner
[
zz
] = NULL_SUB_DOMAIN_ID;
125
}
126
127
m_family->addParticles2(
particles_uid
,
particles_owner
,
local_ids_view
);
128
}
129
130
// IMPORTANT: il faut le faire ici car cela peut changer via le endUpdate()
131
ItemInternalList
internal_particles
(m_family->itemsInternal());
132
for
( Integer
zz
=0;
zz
<
nb_item
; ++
zz
){
133
Particle
p
=
internal_particles
[
local_ids_view
[
zz
] ];
134
Int32
cell_lid
=
cells_local_id
[
zz
];
135
if
(
cell_lid
!=NULL_ITEM_LOCAL_ID){
136
Cell
c
=
internal_cells
[
cell_lid
];
137
m_family->setParticleCell(
p
,
c
);
138
}
139
else
140
m_family->setParticleCell(
p
,
Cell
());
141
}
142
}
143
144
/*---------------------------------------------------------------------------*/
145
/*---------------------------------------------------------------------------*/
146
147
IItemFamily
* ParticleFamilySerializer::
148
family()
const
149
{
150
return
m_family;
151
}
152
153
/*---------------------------------------------------------------------------*/
154
/*---------------------------------------------------------------------------*/
155
156
}
157
158
/*---------------------------------------------------------------------------*/
159
/*---------------------------------------------------------------------------*/
Arcane::Array
Tableau d'items de types quelconques.
Definition
AnyItemArray.h:55
Arcane::CellInfoListView
Vue sur les informations des mailles.
Definition
ItemInfoListView.h:215
Arcane::Cell
Maille d'un maillage.
Definition
Item.h:1178
Arcane::IItemFamily
Interface d'une famille d'entités.
Definition
IItemFamily.h:111
Arcane::IMeshBase::cellFamily
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
Arcane::IMesh
Definition
IMesh.h:59
Arcane::ItemInfoListView
Vue sur une liste pour obtenir des informations sur les entités.
Definition
ItemInfoListView.h:41
Arcane::Item::uniqueId
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition
Item.h:216
Arcane::LimaWrapper
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition
Lima.cc:120
Arcane::Particle
Particule.
Definition
Item.h:1383
Arcane::Particle::hasCell
bool hasCell() const
Vrai si la particule est dans une maille du maillage.
Definition
Item.h:1450
Arcane::Particle::cell
Cell cell() const
Maille à laquelle appartient la particule. Il faut appeler setCell() avant d'appeler cette fonction....
Definition
Item.h:1444
Arccore::ArrayView
Vue modifiable d'un tableau d'un type T.
Definition
arccore/src/base/arccore/base/ArrayView.h:94
Arccore::ConstArrayView
Vue constante d'un tableau de type T.
Definition
arccore/src/base/arccore/base/ArrayView.h:533
Arccore::ISerializer
Interface d'un sérialiseur.
Definition
arccore/src/serialize/arccore/serialize/ISerializer.h:57
Arccore::UniqueArray
Vecteur 1D de données avec sémantique par valeur (style STL).
Definition
arccore/src/collections/arccore/collections/Array.h:1807
Arcane::mesh
AMR.
Definition
CartesianGridDimension.h:32
Arcane::DT_Int64
@ DT_Int64
Donnée de type entier 64 bits.
Definition
DataTypes.h:44
arcane
mesh
ParticleFamilySerializer.cc
Généré le Lundi 18 Novembre 2024 03:01:40 pour Arcane par
1.9.8