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"
44 explicit VarData(Ref<IData> d) : data(d) {}
49 Integer data_index = 0;
50 DataCompressionBuffer m_data_buffer;
51 Ref<IDataCompressor> m_compressor;
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())
130 Integer nb_index = indexers.
size();
131 Integer nb_value = 0;
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()";
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.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
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 MeshComponentList components() const =0
Liste de tous les composants.
virtual String dataCompressorServiceName() const =0
virtual Nom du service utilisé pour compresser les données
virtual IMesh * mesh()=0
Maillage associé.
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.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
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.