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;
59: TraceAccessor(
mm->traceMng())
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;
108bool MeshMaterialBackup::
122void MeshMaterialBackup::
125 if (!m_compressor_service_name.
null())
135 info(4) <<
"NB_EXPECTED_VALUE=" <<
nb_value;
137 MeshMaterialMng*
mm =
dynamic_cast<MeshMaterialMng*
>(m_material_mng);
146 if (
mv->keepOnChange() &&
mv->globalVariable()->isUsed())
149 for( IMeshMaterialVariable* mv : m_vars ){
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 ){
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.
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.
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 empty() const
Vrai si la chaîne est vide (nulle ou "")
bool null() const
Retourne true si la chaîne est nulle.
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.