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
25namespace Arcane::mesh
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31ParticleFamilySerializer::
32ParticleFamilySerializer(ParticleFamily* family)
33: TraceAccessor(family->traceMng())
34, m_family(family)
35{
36}
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40
41void ParticleFamilySerializer::
43{
44 const Integer nb_item = local_ids.size();
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 {
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 {
64 for( Integer z=0; z<nb_item; ++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
81void ParticleFamilySerializer::
82deserializeItems(ISerializer* sbuf,Int32Array* local_ids)
83{
84 // NOTE: les mailles doivent avoir été désérialisées avant.
89 IMesh* mesh = m_family->mesh();
92
93 Int64 nb_item = sbuf->getInt64();
94 particles_uid.resize(nb_item);
95 sbuf->getSpan(particles_uid);
97 cells_local_id.resize(nb_item);
98 sbuf->getSpan(cells_unique_id);
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){
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 ){
134 Int32 cell_lid = cells_local_id[zz];
135 if (cell_lid!=NULL_ITEM_LOCAL_ID){
137 m_family->setParticleCell(p,c);
138 }
139 else
140 m_family->setParticleCell(p,Cell());
141 }
142}
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
146
147IItemFamily* ParticleFamilySerializer::
148family() const
149{
150 return m_family;
151}
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
156}
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
Tableau d'items de types quelconques.
Vue sur les informations des mailles.
Maille d'un maillage.
Definition Item.h:1178
Interface d'une famille d'entités.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
Vue sur une liste pour obtenir des informations sur les entités.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition Item.h:216
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Particule.
Definition Item.h:1383
bool hasCell() const
Vrai si la particule est dans une maille du maillage.
Definition Item.h:1450
Cell cell() const
Maille à laquelle appartient la particule. Il faut appeler setCell() avant d'appeler cette fonction....
Definition Item.h:1444
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
Vecteur 1D de données avec sémantique par valeur (style STL).
@ DT_Int64
Donnée de type entier 64 bits.
Definition DataTypes.h:44