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"
49 Integer data_index = 0;
63 m_compressor_service_name =
mm->dataCompressorServiceName();
72 for(
const auto& iter : m_saved_data )
79void MeshMaterialBackup::
88void MeshMaterialBackup::
100 m_compressor_service_name = name;
122void MeshMaterialBackup::
125 if (!m_compressor_service_name.
null())
144 for(
const auto& i :
mm->m_full_name_variable_map){
146 if (
mv->keepOnChange() &&
mv->globalVariable()->isUsed())
150 info(4) <<
"SAVE MVAR=" <<
mv->name() <<
" is_used?=" <<
mv->globalVariable()->isUsed();
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 ){
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;
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];
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;
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.
Classe pour gérer la compression/décompression des données.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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 MeshComponentList components() const =0
Liste de tous les composants.
virtual IMesh * mesh()=0
Maillage associé.
virtual IMeshMaterialMngInternal * _internalApi() const =0
API interne à Arcane.
Interface d'une variable matériau d'un maillage.
bool _isValidComponent(IMeshMaterialVariable *var, IMeshComponent *component)
Indique si la variable var est définie sur le composant component.
void setCompressorServiceName(const String &name)
Nom du service utilisé pour compresser les données.
Implémentation d'un gestion des matériaux.
Chaîne de caractères unicode.
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
bool null() const
Retourne true si la chaîne est nulle.
Classe d'accès aux traces.
TraceMessage info() const
Flot pour un message d'information.
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....
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.