14#include "arcane/materials/MeshMaterialBackup.h"
16#include "arcane/utils/IDataCompressor.h"
18#include "arcane/core/IVariable.h"
19#include "arcane/core/IData.h"
20#include "arcane/core/IMesh.h"
21#include "arcane/core/IItemFamily.h"
22#include "arcane/core/ServiceBuilder.h"
23#include "arcane/core/internal/IDataInternal.h"
24#include "arcane/core/materials/IMeshMaterialMng.h"
25#include "arcane/core/materials/IMeshMaterialVariable.h"
27#include "arcane/core/materials/internal/IMeshMaterialVariableInternal.h"
28#include "arcane/core/materials/internal/IMeshMaterialMngInternal.h"
30#include "arcane/materials/internal/MeshMaterialMng.h"
31#include "arcane/materials/internal/MeshMaterialVariableIndexer.h"
50 DataCompressionBuffer m_data_buffer;
61, m_use_unique_ids(use_unique_ids)
72 for(
const auto& iter : m_saved_data )
79void MeshMaterialBackup::
88void MeshMaterialBackup::
100 m_compressor_service_name = name;
108bool MeshMaterialBackup::
122void MeshMaterialBackup::
125 if (!m_compressor_service_name.
null())
132 for(
Integer i=0; i<nb_index; ++i )
133 nb_value += indexers[i]->cells().size();
135 info(4) <<
"NB_EXPECTED_VALUE=" << nb_value;
137 MeshMaterialMng* mm =
dynamic_cast<MeshMaterialMng*
>(m_material_mng);
143 m_vars.reserve(max_nb_var);
144 for(
const auto& i : mm->m_full_name_variable_map){
149 for( IMeshMaterialVariable* mv : m_vars ){
151 VarData* vd =
new VarData(mv->_internalApi()->internalCreateSaveDataRef(nb_value));
152 m_saved_data.insert(std::make_pair(mv,vd));
164void MeshMaterialBackup::
168 IMeshComponent* c = *ic;
170 for( IMeshMaterialVariable* var : m_vars ){
171 if (_isValidComponent(var,c))
172 var->_internalApi()->saveData(c,m_saved_data[var]->data.get());
180void MeshMaterialBackup::
183 IMesh* mesh = m_material_mng->mesh();
184 ServiceBuilder<IDataCompressor> sb(mesh->handle().application());
185 Ref<IDataCompressor> compressor_ref;
186 if (!m_compressor_service_name.empty())
187 compressor_ref = sb.createReference(m_compressor_service_name);
188 IDataCompressor* compressor = compressor_ref.get();
189 auto components = m_material_mng->components();
192 IMeshComponent* c = *ic;
196 for( IMeshMaterialVariable* var : m_vars ){
197 VarData* var_data = m_saved_data[var];
198 IData* saved_data = var_data->data.get();
200 var_data->m_compressor = compressor_ref;
201 var_data->m_data_buffer.m_compressor = compressor;
204 IMeshComponent* c = *ic;
205 if (_isValidComponent(var,c)){
206 var->_internalApi()->saveData(c,saved_data);
210 IDataInternal* d = saved_data->_commonInternal();
211 d->compressAndClear(var_data->m_data_buffer);
219void MeshMaterialBackup::
220_saveIds(IMeshComponent* component)
222 if (m_use_unique_ids){
223 auto& ids = m_unique_ids_array[component];
225 ComponentCell ec = *icell;
226 ids.add(ec.globalCell().uniqueId());
228 info(4) <<
"SAVE (uid) for component name=" << component->name()
229 <<
" nb=" << ids.size();
234 ComponentCell ec = *icell;
235 ids.add(ec.globalCell().localId());
237 info(4) <<
"SAVE (lid) for component name=" << component->name()
238 <<
" nb=" << ids.size();
245void MeshMaterialBackup::
248 if (m_use_unique_ids){
249 info(4) <<
"RESTORE using uniqueIds()";
250 IItemFamily* cell_family = m_material_mng->mesh()->cellFamily();
254 for(
const auto& iter : m_unique_ids_array ){
255 IMeshComponent* component = iter.first;
256 auto& unique_ids = m_unique_ids_array[component];
257 auto& local_ids = m_ids_array[component];
258 local_ids.resize(unique_ids.size());
259 cell_family->itemsUniqueIdToLocalId(local_ids,unique_ids,
false);
272void MeshMaterialBackup::
277 bool allow_null_id = m_use_unique_ids;
280 IMeshComponent* c = *ic;
282 info(4) <<
"RESTORE for component name=" << c->name() <<
" nb=" << ids.size();
283 for( IMeshMaterialVariable* var : m_vars ){
284 VarData* vd = m_saved_data[var];
285 if (_isValidComponent(var,c)){
286 var->_internalApi()->restoreData(c,vd->data.get(),vd->data_index,ids,allow_null_id);
287 vd->data_index += ids.size();
296void MeshMaterialBackup::
301 bool allow_null_id = m_use_unique_ids;
303 auto components = m_material_mng->components();
305 for( IMeshMaterialVariable* var : m_vars ){
306 VarData* vd = m_saved_data[var];
308 IDataCompressor* compressor = vd->m_data_buffer.m_compressor;
310 info(5) <<
"RESTORE decompress variable name=" << var->
name();
311 IDataInternal* d = vd->data->_commonInternal();
312 d->decompressAndFill(vd->m_data_buffer);
314 info(4) <<
"RESTORE for variable name=" << var->
name();
316 IMeshComponent* c = *ic;
318 if (_isValidComponent(var,c)){
319 var->_internalApi()->restoreData(c,vd->data.get(),vd->data_index,ids,allow_null_id);
320 vd->data_index += ids.size();
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
virtual bool isUsed() const =0
Etat d'utilisation de la variable.
Interface d'un composant (matériau ou milieu) d'un maillage.
virtual bool isEnvironment() const =0
Vrai si le composant est un milieu.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
virtual String dataCompressorServiceName() const =0
virtual Nom du service utilisé pour compresser les données
virtual IMeshMaterialMngInternal * _internalApi() const =0
API interne à Arcane.
Interface d'une variable matériau d'un maillage.
virtual bool keepOnChange() const =0
Indique si on souhaite conserver la valeur de la variable apres un changement de la liste des matéria...
virtual MatVarSpace space() const =0
Espace de définition de la variable (matériau+milieu ou milieu uniquement)
virtual IVariable * globalVariable() const =0
Variable globale sur le maillage associée.
virtual String name() const =0
Nom de la variable.
void setCompressorServiceName(const String &name)
Nom du service utilisé pour compresser les données.
Référence à une instance.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
ITraceMng * traceMng() const
Gestionnaire de trace.
Active toujours les traces dans les parties Arcane concernant les matériaux.
MatVarSpace
Espace de définition d'une variable matériau.
@ Environment
Variable ayant des valeurs uniquement sur les milieux.
@ MaterialAndEnvironment
Variable ayant des valeurs sur les milieux et matériaux.
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.