14#include "arcane/materials/MeshMaterialVariable.h"
16#include "arcane/utils/NotImplementedException.h"
17#include "arcane/utils/ScopedPtr.h"
18#include "arcane/utils/ITraceMng.h"
19#include "arcane/utils/NumericTypes.h"
20#include "arcane/utils/CheckedConvert.h"
22#include "arcane/materials/MaterialVariableBuildInfo.h"
23#include "arcane/materials/IMeshMaterial.h"
24#include "arcane/materials/MatItemEnumerator.h"
25#include "arcane/materials/MeshMaterialVariableSynchronizerList.h"
26#include "arcane/materials/ItemMaterialVariableBaseT.H"
27#include "arcane/materials/IMeshMaterialVariableSynchronizer.h"
28#include "arcane/materials/internal/MeshMaterialVariablePrivate.h"
30#include "arcane/core/IItemFamily.h"
31#include "arcane/core/IMesh.h"
32#include "arcane/core/IParallelMng.h"
33#include "arcane/core/ISubDomain.h"
34#include "arcane/core/IApplication.h"
35#include "arcane/core/IDataFactoryMng.h"
36#include "arcane/core/IParallelExchanger.h"
37#include "arcane/core/ISerializer.h"
38#include "arcane/core/ISerializeMessage.h"
39#include "arcane/core/internal/IVariableInternal.h"
40#include "arcane/core/materials/internal/IMeshComponentInternal.h"
41#include "arcane/core/VariableInfo.h"
42#include "arcane/core/VariableRefArray.h"
43#include "arcane/core/MeshVariable.h"
44#include "arcane/core/VariableArray.h"
45#include "arcane/core/ItemPrinter.h"
46#include "arcane/core/IVariableSynchronizer.h"
47#include "arcane/core/internal/IDataInternal.h"
48#include "arcane/core/Timer.h"
49#include "arcane/core/parallel/IStat.h"
50#include "arcane/core/datatype/DataTypeTraits.h"
51#include "arcane/core/datatype/DataStorageBuildInfo.h"
64template<
typename DataType>
void
65MaterialVariableScalarTraits<DataType>::
66saveData(IMeshComponent* component,IData* data,
67 Array<ContainerViewType>& cviews)
69 ConstArrayView<ArrayView<DataType>> views = cviews;
70 auto* true_data =
dynamic_cast<ValueDataType*
>(data);
72 ContainerType& values = true_data->_internal()->_internalDeprecatedValue();
74 MatVarIndex mvi = icell._varIndex();
75 values.add(views[mvi.arrayIndex()][mvi.valueIndex()]);
85template <
typename DataType>
void
86MaterialVariableScalarTraits<DataType>::
87copyTo(SmallSpan<const DataType> input, SmallSpan<const Int32> input_indexes,
88 SmallSpan<DataType> output, SmallSpan<const Int32> output_indexes,
89 const RunQueue& queue)
92 Integer nb_value = input_indexes.size();
101 output[output_indexes[i]] = input[input_indexes[i]];
108template<
typename DataType>
void
109MaterialVariableScalarTraits<DataType>::
110resizeAndFillWithDefault(ValueDataType* data,ContainerType& container,Integer dim1_size)
115 container.resize(dim1_size,DataType());
121template<
typename DataType>
void
122MaterialVariableScalarTraits<DataType>::
123resizeWithReserve(PrivatePartType* var, Integer dim1_size,
Real reserve_ratio)
128 Int32 nb_add =
static_cast<Int32>(dim1_size * reserve_ratio);
129 var->_internalApi()->resizeWithReserve(dim1_size, nb_add);
135template<
typename DataType> ItemMaterialVariableScalar<DataType>::
136ItemMaterialVariableScalar(
const MaterialVariableBuildInfo& v,
137 PrivatePartType* global_var,
139: BaseClass(v,global_var,global_var_ref,mvs)
160template<
typename DataType>
void
169 setValue(
mvi,values[index]);
188template<
typename DataType>
void
195 for( Integer i=0; i<
nb_index; ++i ){
197 setValue(
mvi,values[i]);
215template<
typename DataType>
void
223 values[index] = this->operator[](
mvi);
242template<
typename DataType>
void
248 for( Integer i=0; i<
nb_index; ++i ){
250 values[i] = this->operator[](
mvi);
259template<
typename DataType>
void
265 Integer
nb_var = m_vars.size();
266 for( Integer i=1; i<
nb_var; ++i ){
268 m_vars[i]->fill(value);
275template<
typename DataType> Int32
279 return (Int32)
sizeof(DataType);
285template<
typename DataType>
void
301template<
typename DataType>
void
302ItemMaterialVariableScalar<DataType>::
303copyToBuffer(ConstArrayView<MatVarIndex> matvar_indexes,ByteArrayView bytes)
const
305 auto* ptr =
reinterpret_cast<std::byte*
>(bytes.data());
306 return _copyToBufferLegacy(matvar_indexes,{ptr,bytes.size()});
312template<
typename DataType>
void
313ItemMaterialVariableScalar<DataType>::
314_copyFromBufferLegacy(SmallSpan<const MatVarIndex> matvar_indexes,Span<const std::byte> bytes)
318 const Int32 value_size = CheckedConvert::toInt32(bytes.size() /
sizeof(DataType));
319 ConstArrayView<DataType> values(value_size,
reinterpret_cast<const DataType*
>(bytes.data()));
320 for( Integer z=0; z<value_size; ++z ){
321 setValue(matvar_indexes[z],values[z]);
328template<
typename DataType>
void
329ItemMaterialVariableScalar<DataType>::
330copyFromBuffer(ConstArrayView<MatVarIndex> matvar_indexes,ByteConstArrayView bytes)
332 auto* ptr =
reinterpret_cast<const std::byte*
>(bytes.data());
333 return _copyFromBufferLegacy(matvar_indexes,{ptr,bytes.size()});
339template<
typename DataType>
void
343 IParallelMng* pm = m_p->materialMng()->mesh()->parallelMng();
356template<
typename DataType> Int64
361 Integer sync_version = m_p->materialMng()->synchronizeVariableVersion();
363 if (m_p->space()==MatVarSpace::Environment){
367 if (sync_version>=6){
373 else if (sync_version==5 || sync_version==4 || sync_version==3){
376 else if (sync_version==2){
387template<
typename DataType>
void
388ItemMaterialVariableScalar<DataType>::
389synchronize(MeshMaterialVariableSynchronizerList& sync_list)
391 Integer sync_version = m_p->materialMng()->synchronizeVariableVersion();
392 if (sync_version>=6){
402template<
typename DataType>
void
403ItemMaterialVariableScalar<DataType>::
423 IMeshMaterialMng* material_mng = m_p->materialMng();
424 IMesh* mesh = material_mng->mesh();
427 IItemFamily* family = mesh->cellFamily();
428 IParallelMng* pm = mesh->parallelMng();
431 ItemGroup all_items = family->allItems();
433 UniqueArray<DataType> saved_values;
436 ConstArrayView<DataType> var_values = m_global_variable->valueView();
437 saved_values.resize(var_values.size());
438 saved_values.copy(var_values);
442 IMeshEnvironment* env = *ienv;
444 IMeshMaterial* mat = *imat;
447 ArrayView<DataType> var_values = m_global_variable->valueView();
450 MatCell mc = *imatcell;
451 Cell c = mc.globalCell();
452 MatVarIndex mvi = mc._varIndex();
453 var_values[c.localId()] = this->operator[](mvi);
456 m_global_variable->synchronize();
458 ConstArrayView<DataType> var_values = m_global_variable->valueView();
461 MatCell mc = *imatcell;
462 Cell c = mc.globalCell();
463 MatVarIndex mvi = mc._varIndex();
464 setValue(mvi,var_values[c.localId()]);
472 ArrayView<DataType> var_values = m_global_variable->valueView();
475 EnvCell ec = *ienvcell;
476 Cell c = ec.globalCell();
477 MatVarIndex mvi = ec._varIndex();
478 var_values[c.localId()] = this->operator[](mvi);
481 m_global_variable->synchronize();
483 ConstArrayView<DataType> var_values = m_global_variable->valueView();
486 EnvCell ec = *ienvcell;
487 Cell c = ec.globalCell();
488 MatVarIndex mvi = ec._varIndex();
489 setValue(mvi,var_values[c.localId()]);
496 ArrayView<DataType> var_values = m_global_variable->valueView();
497 var_values.copy(saved_values);
499 m_global_variable->synchronize();
505template<
typename DataType>
void
506ItemMaterialVariableScalar<DataType>::
526 IMeshMaterialMng* material_mng = m_p->materialMng();
527 IMesh* mesh = material_mng->mesh();
530 IItemFamily* family = mesh->cellFamily();
531 IParallelMng* pm = mesh->parallelMng();
534 ItemGroup all_items = family->allItems();
536 tm->
info(4) <<
"MAT_SYNCHRONIZE_V2 name=" << this->name();
537 IDataFactoryMng* df = m_global_variable->dataFactoryMng();
539 DataStorageTypeInfo storage_type_info(VariableInfo::_internalGetStorageTypeInfo(m_global_variable->dataType(),2,0));
540 DataStorageBuildInfo storage_build_info(tm);
541 String storage_full_type = storage_type_info.fullName();
543 Ref<IData> xdata(df->createSimpleDataRef(storage_full_type,storage_build_info));
544 auto* data =
dynamic_cast< IArray2DataT<DataType>*
>(xdata.get());
548 ConstArrayView<MeshMaterialVariableIndexer*> indexers = material_mng->_internalApi()->variablesIndexer();
549 Integer nb_indexer = indexers.size();
550 data->_internal()->_internalDeprecatedValue().resize(family->maxLocalId(),nb_indexer+1);
551 Array2View<DataType> values(data->view());
554 for( MeshMaterialVariableIndexer* indexer : indexers ){
555 ConstArrayView<MatVarIndex> matvar_indexes = indexer->matvarIndexes();
556 ConstArrayView<Int32> local_ids = indexer->localIds();
557 for( Integer j=0, n=matvar_indexes.size(); j<n; ++j ){
558 MatVarIndex mvi = matvar_indexes[j];
559 values[local_ids[j]][mvi.arrayIndex()] = this->operator[](mvi);
562 family->allItemsSynchronizer()->synchronizeData(data);
565 for( MeshMaterialVariableIndexer* indexer : indexers ){
566 ConstArrayView<MatVarIndex> matvar_indexes = indexer->matvarIndexes();
567 ConstArrayView<Int32> local_ids = indexer->localIds();
568 for( Integer j=0, n=matvar_indexes.size(); j<n; ++j ){
569 MatVarIndex mvi = matvar_indexes[j];
570 setValue(mvi,values[local_ids[j]][mvi.arrayIndex()]);
574 m_global_variable->synchronize();
580template<
typename DataType>
void
581ItemMaterialVariableScalar<DataType>::
592 IMeshMaterialMng* material_mng = m_p->materialMng();
594 IMeshMaterialVariableSynchronizer* mmvs = material_mng->_internalApi()->allCellsMatEnvSynchronizer();
595 IVariableSynchronizer* var_syncer = mmvs->variableSynchronizer();
596 IParallelMng* pm = var_syncer->parallelMng();
601 mmvs->checkRecompute();
605 tm->
info(4) <<
"MAT_SYNCHRONIZE_V5 name=" << this->name();
610 Integer nb_rank = ranks.size();
611 std::vector< UniqueArray<DataType> > shared_values(nb_rank);
612 std::vector< UniqueArray<DataType> > ghost_values(nb_rank);
614 UniqueArray<Parallel::Request> requests;
618 for( Integer i=0; i<nb_rank; ++i ){
619 Int32 rank = ranks[i];
620 ConstArrayView<MatVarIndex> ghost_matcells(mmvs->ghostItems(i));
621 Integer total = ghost_matcells.size();
622 ghost_values[i].resize(total);
623 Integer total_byte = CheckedConvert::multiply(total,data_type_size);
624 ByteArrayView bytes(total_byte,(Byte*)(ghost_values[i].unguardedBasePointer()));
625 requests.add(pm->
recv(bytes,rank,
false));
629 for( Integer i=0; i<nb_rank; ++i ){
630 Int32 rank = ranks[i];
631 ConstArrayView<MatVarIndex> shared_matcells(mmvs->sharedItems(i));
632 Integer total = shared_matcells.size();
633 shared_values[i].resize(total);
634 ArrayView<DataType> values(shared_values[i]);
635 for( Integer z=0; z<total; ++z ){
636 values[z] = this->operator[](shared_matcells[z]);
638 Integer total_byte = CheckedConvert::multiply(total,data_type_size);
639 ByteArrayView bytes(total_byte,(Byte*)(values.unguardedBasePointer()));
640 requests.add(pm->send(bytes,rank,
false));
646 for( Integer i=0; i<nb_rank; ++i ){
647 ConstArrayView<MatVarIndex> ghost_matcells(mmvs->ghostItems(i));
648 Integer total = ghost_matcells.size();
649 ConstArrayView<DataType> values(ghost_values[i].constView());
650 for( Integer z=0; z<total; ++z ){
651 setValue(ghost_matcells[z],values[z]);
660template<
typename DataType>
void
664 ostr <<
"Dumping values for material variable name=" << this->name() <<
'\n';
670 ostr <<
"env_value=" << value(
evi) <<
", mvi=" <<
evi <<
'\n';
673 ostr <<
"mat_value=" << value(
mvi) <<
", mvi=" <<
mvi <<
'\n';
682template<
typename DataType>
void
686 ostr <<
"Dumping values for material variable name=" << this->name() <<
'\n';
687 IItemFamily* family = m_global_variable->itemFamily();
697template<
typename DataType>
void
701 IItemFamily* family = m_global_variable->itemFamily();
710 bool has_mat = this->space()!=MatVarSpace::Environment;
711 switch(
sbuf->mode()){
712 case ISerializer::ModeReserve:
728 case ISerializer::ModePut:
733 values.add(value(
ienvcell._varIndex()));
736 values.add(value(
imatcell._varIndex()));
748 case ISerializer::ModeGet:
782template<
typename ItemType,
typename DataType>
794template<
typename ItemType,
typename DataType>
806#define ARCANE_INSTANTIATE_MAT(type) \
807 template class ItemMaterialVariableBase< MaterialVariableScalarTraits<type> >;\
808 template class ItemMaterialVariableScalar<type>;\
809 template class MeshMaterialVariableScalar<Cell,type>;\
810 template class MeshMaterialVariableCommonStaticImpl<MeshMaterialVariableScalar<Cell,type>>
812ARCANE_INSTANTIATE_MAT(
Byte);
813ARCANE_INSTANTIATE_MAT(
Int16);
814ARCANE_INSTANTIATE_MAT(
Int32);
815ARCANE_INSTANTIATE_MAT(
Int64);
816ARCANE_INSTANTIATE_MAT(
Real);
817ARCANE_INSTANTIATE_MAT(Real2);
818ARCANE_INSTANTIATE_MAT(Real3);
819ARCANE_INSTANTIATE_MAT(Real2x2);
820ARCANE_INSTANTIATE_MAT(Real3x3);
#define ARCANE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr)
Macro qui vérifie en mode check si ptr est accessible pour une RunQueue ou un Runner.
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle sur accélérateur avec arguments supplémentaires pour les réductions.
Interface d'une famille d'entités.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual ITraceMng * traceMng() const =0
Gestionnaire de trace associé
virtual ItemVectorView view(Int32ConstArrayView local_ids)=0
Vue sur les entités.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual IStat * stat()=0
Gestionnaire des statistiques.
virtual void recv(ArrayView< char > values, Int32 rank)=0
virtual void waitAllRequests(ArrayView< Request > rvalues)=0
Bloque en attendant que les requêtes rvalues soient terminées.
virtual ITimerMng * timerMng() const =0
Gestionnaire de timers.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Classe utilitaire pour imprimer les infos sur une entité.
Vue sur un vecteur d'entités.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Vue sur une liste de mailles avec infos sur les milieux.
Maille arcane avec info matériaux et milieux.
Enumérateur sur les constituants d'une maille.
Maille arcane d'un milieu.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
Interface d'un matériau d'un maillage.
Variable scalaire sur un matériau du maillage.
Représente un matériau d'une maille multi-matériau.
Représente un index sur les variables matériaux et milieux.
Variable scalaire sur un matériau du maillage.
Synchronisation d'une liste de variables matériaux.
Sentinelle pour le timer. La sentinelle associée à un timer permet de déclancher celui-ci au moment d...
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface d'un sérialiseur.
Interface du gestionnaire de traces.
Exception lorsqu'une opération n'est pas supportée.
TraceMessage info() const
Flot pour un message d'information.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
Active toujours les traces dans les parties Arcane concernant les matériaux.
MatVarSpace
Espace de définition d'une variable matériau.
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.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.
unsigned char Byte
Type d'un octet.
eDataType
Type d'une donnée.
@ DT_Int64
Donnée de type entier 64 bits.
Int32 Integer
Type représentant un entier.