Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MeshMaterialVariableScalar.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* MeshMaterialVariableScalar.cc (C) 2000-2024 */
9/* */
10/* Variable scalaire sur un matériau du maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/materials/MeshMaterialVariable.h"
15
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"
21
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"
29
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"
52
53#include <vector>
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57
58namespace Arcane::Materials
59{
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
63
64template<typename DataType> void
65MaterialVariableScalarTraits<DataType>::
66saveData(IMeshComponent* component,IData* data,
67 Array<ContainerViewType>& cviews)
68{
69 ConstArrayView<ArrayView<DataType>> views = cviews;
70 auto* true_data = dynamic_cast<ValueDataType*>(data);
71 ARCANE_CHECK_POINTER(true_data);
72 ContainerType& values = true_data->_internal()->_internalDeprecatedValue();
73 ENUMERATE_COMPONENTCELL(icell,component){
74 MatVarIndex mvi = icell._varIndex();
75 values.add(views[mvi.arrayIndex()][mvi.valueIndex()]);
76 }
77}
78
79/*---------------------------------------------------------------------------*/
80/*---------------------------------------------------------------------------*/
81
82/*---------------------------------------------------------------------------*/
83/*---------------------------------------------------------------------------*/
84
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)
90{
91 // TODO: vérifier tailles des indexes identiques
92 Integer nb_value = input_indexes.size();
93 auto command = makeCommand(queue);
94 ARCANE_CHECK_ACCESSIBLE_POINTER(queue, output.data());
95 ARCANE_CHECK_ACCESSIBLE_POINTER(queue, input.data());
96 ARCANE_CHECK_ACCESSIBLE_POINTER(queue, input_indexes.data());
97 ARCANE_CHECK_ACCESSIBLE_POINTER(queue, output_indexes.data());
98 command << RUNCOMMAND_LOOP1(iter, nb_value)
99 {
100 auto [i] = iter();
101 output[output_indexes[i]] = input[input_indexes[i]];
102 };
103}
104
105/*---------------------------------------------------------------------------*/
106/*---------------------------------------------------------------------------*/
107
108template<typename DataType> void
109MaterialVariableScalarTraits<DataType>::
110resizeAndFillWithDefault(ValueDataType* data,ContainerType& container,Integer dim1_size)
111{
112 ARCANE_UNUSED(data);
113 //TODO: faire une version de Array2 qui spécifie une valeur à donner
114 // pour initialiser lors d'un resize() (comme pour Array::resize()).
115 container.resize(dim1_size,DataType());
116}
117
118/*---------------------------------------------------------------------------*/
119/*---------------------------------------------------------------------------*/
120
121template<typename DataType> void
122MaterialVariableScalarTraits<DataType>::
123resizeWithReserve(PrivatePartType* var, Integer dim1_size, Real reserve_ratio)
124{
125 // Pour éviter de réallouer à chaque fois qu'il y a une augmentation du
126 // nombre de mailles matériaux, alloue un petit peu plus que nécessaire.
127 // Par défaut, on alloue 5% de plus.
128 Int32 nb_add = static_cast<Int32>(dim1_size * reserve_ratio);
129 var->_internalApi()->resizeWithReserve(dim1_size, nb_add);
130}
131
132/*---------------------------------------------------------------------------*/
133/*---------------------------------------------------------------------------*/
134
135template<typename DataType> ItemMaterialVariableScalar<DataType>::
136ItemMaterialVariableScalar(const MaterialVariableBuildInfo& v,
137 PrivatePartType* global_var,
138 VariableRef* global_var_ref,MatVarSpace mvs)
139: BaseClass(v,global_var,global_var_ref,mvs)
140{
141}
142
143/*---------------------------------------------------------------------------*/
144/*---------------------------------------------------------------------------*/
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148/*!
149 * \brief Remplit les valeurs de la variable pour un matériau à partir d'un tableau.
150 *
151 * Cette méthode effectue l'opération suivante:
152 \code
153 * Integer index=0;
154 * ENUMERATE_MATCELL(imatcell,mat){
155 * matvar[imatcell] = values[index];
156 * ++index;
157 * }
158 \endcode
159*/
160template<typename DataType> void
163{
164 // TODO: faire une version avec IMeshComponent
165 Integer index = 0;
166 ENUMERATE_COMPONENTITEM(MatCell,imatcell,mat){
167 MatCell mc = *imatcell;
168 MatVarIndex mvi = mc._varIndex();
169 setValue(mvi,values[index]);
170 ++index;
171 }
172}
173
174/*---------------------------------------------------------------------------*/
175/*---------------------------------------------------------------------------*/
176/*!
177 * \brief Remplit les valeurs de la variable pour un matériau à partir d'un tableau.
178 *
179 * Cette méthode effectue l'opération suivante:
180 \code
181 * Integer index=0;
182 * ENUMERATE_MATCELL(imatcell,mat){
183 * matvar[imatcell] = values[index];
184 * ++index;
185 * }
186 \endcode
187*/
188template<typename DataType> void
191 Int32ConstArrayView indexes)
192{
193 ConstArrayView<MatVarIndex> mat_indexes = mat->_internalApi()->variableIndexer()->matvarIndexes();
194 Integer nb_index = indexes.size();
195 for( Integer i=0; i<nb_index; ++i ){
196 MatVarIndex mvi = mat_indexes[indexes[i]];
197 setValue(mvi,values[i]);
198 }
199}
200
201/*---------------------------------------------------------------------------*/
202/*---------------------------------------------------------------------------*/
203/*!
204 * \brief Remplit un tableau à partir des valeurs de la variable pour un matériau.
205 *
206 * Cette méthode effectue l'opération suivante:
207 \code
208 * Integer index=0;
209 * ENUMERATE_MATCELL(imatcell,mat){
210 * values[index] = matvar[imatcell];
211 * ++index;
212 * }
213 \endcode
214*/
215template<typename DataType> void
218{
219 Integer index=0;
220 ENUMERATE_COMPONENTITEM(MatCell,imatcell,mat){
221 MatCell mc = *imatcell;
222 MatVarIndex mvi = mc._varIndex();
223 values[index] = this->operator[](mvi);
224 ++index;
225 }
226}
227
228/*---------------------------------------------------------------------------*/
229/*---------------------------------------------------------------------------*/
230/*!
231 * \brief Remplit un tableau à partir des valeurs de la variable pour un matériau.
232 *
233 * Cette méthode effectue l'opération suivante:
234 \code
235 * Integer index=0;
236 * ENUMERATE_MATCELL(imatcell,mat){
237 * values[index] = matvar[imatcell];
238 * ++index;
239 * }
240 \endcode
241*/
242template<typename DataType> void
245{
246 ConstArrayView<MatVarIndex> mat_indexes = mat->_internalApi()->variableIndexer()->matvarIndexes();
247 Integer nb_index = indexes.size();
248 for( Integer i=0; i<nb_index; ++i ){
249 MatVarIndex mvi = mat_indexes[indexes[i]];
250 values[i] = this->operator[](mvi);
251 }
252}
253
254/*---------------------------------------------------------------------------*/
255/*---------------------------------------------------------------------------*/
256/*!
257 * \brief Remplit les valeurs partielles avec la valeur \a value.
258 */
259template<typename DataType> void
261fillPartialValues(const DataType& value)
262{
263 // La variable d'indice 0 correspondant à la variable globale.
264 // Il ne faut donc pas la prendre en compte.
265 Integer nb_var = m_vars.size();
266 for( Integer i=1; i<nb_var; ++i ){
267 if (m_vars[i])
268 m_vars[i]->fill(value);
269 }
270}
271
272/*---------------------------------------------------------------------------*/
273/*---------------------------------------------------------------------------*/
274
275template<typename DataType> Int32
277dataTypeSize() const
278{
279 return (Int32)sizeof(DataType);
280}
281
282/*---------------------------------------------------------------------------*/
283/*---------------------------------------------------------------------------*/
284
285template<typename DataType> void
288{
289 // TODO: Vérifier que la taille est un multiple de sizeof(DataType) et que
290 // l'alignement est correct.
291 const Integer value_size = arcaneCheckArraySize(bytes.size() / sizeof(DataType));
292 ArrayView<DataType> values(value_size,reinterpret_cast<DataType*>(bytes.data()));
293 for( Integer z=0; z<value_size; ++z ){
294 values[z] = this->operator[](matvar_indexes[z]);
295 }
296}
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300
301template<typename DataType> void
302ItemMaterialVariableScalar<DataType>::
303copyToBuffer(ConstArrayView<MatVarIndex> matvar_indexes,ByteArrayView bytes) const
304{
305 auto* ptr = reinterpret_cast<std::byte*>(bytes.data());
306 return _copyToBufferLegacy(matvar_indexes,{ptr,bytes.size()});
307}
308
309/*---------------------------------------------------------------------------*/
310/*---------------------------------------------------------------------------*/
311
312template<typename DataType> void
313ItemMaterialVariableScalar<DataType>::
314_copyFromBufferLegacy(SmallSpan<const MatVarIndex> matvar_indexes,Span<const std::byte> bytes)
315{
316 // TODO: Vérifier que la taille est un multiple de sizeof(DataType) et que
317 // l'alignement est correct.
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]);
322 }
323}
324
325/*---------------------------------------------------------------------------*/
326/*---------------------------------------------------------------------------*/
327
328template<typename DataType> void
329ItemMaterialVariableScalar<DataType>::
330copyFromBuffer(ConstArrayView<MatVarIndex> matvar_indexes,ByteConstArrayView bytes)
331{
332 auto* ptr = reinterpret_cast<const std::byte*>(bytes.data());
333 return _copyFromBufferLegacy(matvar_indexes,{ptr,bytes.size()});
334}
335
336/*---------------------------------------------------------------------------*/
337/*---------------------------------------------------------------------------*/
338
339template<typename DataType> void
342{
343 IParallelMng* pm = m_p->materialMng()->mesh()->parallelMng();
344 Timer timer(pm->timerMng(),"MatTimer",Timer::TimerReal);
345 Int64 message_size = 0;
346 {
347 Timer::Sentry ts(&timer);
348 message_size = _synchronize2();
349 }
350 pm->stat()->add("MaterialSync",timer.lastActivationTime(),message_size);
351}
352
353/*---------------------------------------------------------------------------*/
354/*---------------------------------------------------------------------------*/
355
356template<typename DataType> Int64
359{
360 Int64 message_size = 0;
361 Integer sync_version = m_p->materialMng()->synchronizeVariableVersion();
362 // Seules les versions 6 et ultérieures sont disponibles pour les variables milieux.
363 if (m_p->space()==MatVarSpace::Environment){
364 if (sync_version<6)
365 sync_version = 6;
366 }
367 if (sync_version>=6){
368 MeshMaterialVariableSynchronizerList mmvsl(m_p->materialMng());
369 mmvsl.add(this);
370 mmvsl.apply();
371 message_size = mmvsl.totalMessageSize();
372 }
373 else if (sync_version==5 || sync_version==4 || sync_version==3){
374 _synchronizeV5();
375 }
376 else if (sync_version==2){
377 _synchronizeV2();
378 }
379 else
380 _synchronizeV1();
381 return message_size;
382}
383
384/*---------------------------------------------------------------------------*/
385/*---------------------------------------------------------------------------*/
386
387template<typename DataType> void
388ItemMaterialVariableScalar<DataType>::
389synchronize(MeshMaterialVariableSynchronizerList& sync_list)
390{
391 Integer sync_version = m_p->materialMng()->synchronizeVariableVersion();
392 if (sync_version>=6){
393 sync_list.add(this);
394 }
395 else
396 this->synchronize();
397}
398
399/*---------------------------------------------------------------------------*/
400/*---------------------------------------------------------------------------*/
401
402template<typename DataType> void
403ItemMaterialVariableScalar<DataType>::
404_synchronizeV1()
405{
406 // Synchronisation:
407 // Pour l'instant, algorithme non optimisée qui effectue plusieurs
408 // synchros. On utilise la variable globale pour cela et il faut
409 // donc la sauvegarder en début de fonction et la restorer en fin.
410 // Le principe est simple: pour chaque materiau et milieu, on
411 // recopie dans la variable globale la valeur partielle correspondante
412 // et on fait une synchro de la variable globale. Il faut ensuite
413 // recopier depuis la valeur globale dans la valeur partielle.
414 // Cela signifie qu'on a autant de synchros que de matériaux et milieux
415
416 // TODO: vérifier que la liste des matériaux est cohérente entre
417 // les sous-domaines. Cela n'est pas nécessaire avec cet algo simplifié
418 // mais le sera avec l'algo final. Pour ce test, il suffit de mettre
419 // une valeur spéciale dans la variable globale pour chaque synchro
420 // (par exemple MIN_FLOAT) et apres synchro de regarder pour chaque
421 // maille dont la valeur est différente de MIN_FLOAT
422 // si elle est bien dans notre matériau
423 IMeshMaterialMng* material_mng = m_p->materialMng();
424 IMesh* mesh = material_mng->mesh();
425 //TODO: Utiliser autre type que cellFamily() pour permettre autre genre
426 // d'élément.
427 IItemFamily* family = mesh->cellFamily();
428 IParallelMng* pm = mesh->parallelMng();
429 if (!pm->isParallel())
430 return;
431 ItemGroup all_items = family->allItems();
432
433 UniqueArray<DataType> saved_values;
434 // Sauve les valeurs de la variable globale car on va les changer
435 {
436 ConstArrayView<DataType> var_values = m_global_variable->valueView();
437 saved_values.resize(var_values.size());
438 saved_values.copy(var_values);
439 }
440
441 ENUMERATE_ENV(ienv,material_mng){
442 IMeshEnvironment* env = *ienv;
443 ENUMERATE_MAT(imat,env){
444 IMeshMaterial* mat = *imat;
445
446 {
447 ArrayView<DataType> var_values = m_global_variable->valueView();
448 // Copie valeurs du matériau dans la variable globale puis synchro
449 ENUMERATE_MATCELL(imatcell,mat){
450 MatCell mc = *imatcell;
451 Cell c = mc.globalCell();
452 MatVarIndex mvi = mc._varIndex();
453 var_values[c.localId()] = this->operator[](mvi);
454 }
455 }
456 m_global_variable->synchronize();
457 {
458 ConstArrayView<DataType> var_values = m_global_variable->valueView();
459 // Copie valeurs depuis la variable globale vers la partie materiau
460 ENUMERATE_MATCELL(imatcell,mat){
461 MatCell mc = *imatcell;
462 Cell c = mc.globalCell();
463 MatVarIndex mvi = mc._varIndex();
464 setValue(mvi,var_values[c.localId()]);
465 }
466 }
467
468 }
469
470 // Effectue la même chose pour le milieu
471 {
472 ArrayView<DataType> var_values = m_global_variable->valueView();
473 // Copie valeurs du milieu dans la variable globale puis synchro
474 ENUMERATE_ENVCELL(ienvcell,env){
475 EnvCell ec = *ienvcell;
476 Cell c = ec.globalCell();
477 MatVarIndex mvi = ec._varIndex();
478 var_values[c.localId()] = this->operator[](mvi);
479 }
480 }
481 m_global_variable->synchronize();
482 {
483 ConstArrayView<DataType> var_values = m_global_variable->valueView();
484 // Copie valeurs depuis la variable globale vers la partie milieu
485 ENUMERATE_ENVCELL(ienvcell,env){
486 EnvCell ec = *ienvcell;
487 Cell c = ec.globalCell();
488 MatVarIndex mvi = ec._varIndex();
489 setValue(mvi,var_values[c.localId()]);
490 }
491 }
492 }
493
494 // Restore les valeurs de la variable globale.
495 {
496 ArrayView<DataType> var_values = m_global_variable->valueView();
497 var_values.copy(saved_values);
498 }
499 m_global_variable->synchronize();
500}
501
502/*---------------------------------------------------------------------------*/
503/*---------------------------------------------------------------------------*/
504
505template<typename DataType> void
506ItemMaterialVariableScalar<DataType>::
507_synchronizeV2()
508{
509 // Synchronisation:
510 // Pour l'instant, algorithme non optimisée qui effectue plusieurs
511 // synchros. On utilise la variable globale pour cela et il faut
512 // donc la sauvegarder en début de fonction et la restorer en fin.
513 // Le principe est simple: pour chaque materiau et milieu, on
514 // recopie dans la variable globale la valeur partielle correspondante
515 // et on fait une synchro de la variable globale. Il faut ensuite
516 // recopier depuis la valeur globale dans la valeur partielle.
517 // Cela signifie qu'on a autant de synchros que de matériaux et milieux
518
519 // TODO: vérifier que la liste des matériaux est cohérente entre
520 // les sous-domaines. Cela n'est pas nécessaire avec cet algo simplifié
521 // mais le sera avec l'algo final. Pour ce test, il suffit de mettre
522 // une valeur spéciale dans la variable globale pour chaque synchro
523 // (par exemple MIN_FLOAT) et apres synchro de regarder pour chaque
524 // maille dont la valeur est différente de MIN_FLOAT
525 // si elle est bien dans notre matériau
526 IMeshMaterialMng* material_mng = m_p->materialMng();
527 IMesh* mesh = material_mng->mesh();
528 //TODO: Utiliser autre type que cellFamily() pour permettre autre genre
529 // d'élément.
530 IItemFamily* family = mesh->cellFamily();
531 IParallelMng* pm = mesh->parallelMng();
532 if (!pm->isParallel())
533 return;
534 ItemGroup all_items = family->allItems();
535 ITraceMng* tm = pm->traceMng();
536 tm->info(4) << "MAT_SYNCHRONIZE_V2 name=" << this->name();
537 IDataFactoryMng* df = m_global_variable->dataFactoryMng();
538
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();
542
543 Ref<IData> xdata(df->createSimpleDataRef(storage_full_type,storage_build_info));
544 auto* data = dynamic_cast< IArray2DataT<DataType>* >(xdata.get());
545 if (!data)
546 ARCANE_FATAL("Bad type");
547
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());
552
553 // Recopie les valeurs partielles dans le tableau.
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);
560 }
561 }
562 family->allItemsSynchronizer()->synchronizeData(data);
563
564 // Recopie du tableau synchronisé dans les valeurs partielles.
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()]);
571 }
572 }
573
574 m_global_variable->synchronize();
575}
576
577/*---------------------------------------------------------------------------*/
578/*---------------------------------------------------------------------------*/
579
580template<typename DataType> void
581ItemMaterialVariableScalar<DataType>::
582_synchronizeV5()
583{
584 // Version de la synchronisation qui envoie uniquement
585 // les valeurs des matériaux et des milieux pour les mailles
586 // partagées.
587 // NOTE: Cette version nécessite que les matériaux soient correctement
588 // synchronisés entre les sous-domaines.
589
590 // Cette version est similaire à V4 dans son principe mais
591 // fait les send/receive directement sans utiliser de sérialiser.
592 IMeshMaterialMng* material_mng = m_p->materialMng();
593
594 IMeshMaterialVariableSynchronizer* mmvs = material_mng->_internalApi()->allCellsMatEnvSynchronizer();
595 IVariableSynchronizer* var_syncer = mmvs->variableSynchronizer();
596 IParallelMng* pm = var_syncer->parallelMng();
597
598 if (!pm->isParallel())
599 return;
600
601 mmvs->checkRecompute();
602
603 //ItemGroup all_items = family->allItems();
604 ITraceMng* tm = pm->traceMng();
605 tm->info(4) << "MAT_SYNCHRONIZE_V5 name=" << this->name();
606 //tm->info() << "STACK="<< platform::getStackTrace();
607 const Integer data_type_size = (Integer)sizeof(DataType);
608 {
609 Int32ConstArrayView ranks = var_syncer->communicatingRanks();
610 Integer nb_rank = ranks.size();
611 std::vector< UniqueArray<DataType> > shared_values(nb_rank);
612 std::vector< UniqueArray<DataType> > ghost_values(nb_rank);
613
614 UniqueArray<Parallel::Request> requests;
615
616 // Poste les receive.
617 Int32UniqueArray recv_ranks(nb_rank);
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));
626 }
627
628 // Poste les send
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]);
637 }
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));
641 }
642
643 pm->waitAllRequests(requests);
644
645 // Recopie les données recues dans les mailles fantomes.
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]);
652 }
653 }
654 }
655}
656
657/*---------------------------------------------------------------------------*/
658/*---------------------------------------------------------------------------*/
659
660template<typename DataType> void
662dumpValues(std::ostream& ostr,AllEnvCellVectorView view)
663{
664 ostr << "Dumping values for material variable name=" << this->name() << '\n';
665 ENUMERATE_ALLENVCELL(iallenvcell,view){
666 AllEnvCell all_env_cell = *iallenvcell;
667 ostr << "Cell uid=" << ItemPrinter(all_env_cell.globalCell()) << " v=" << value(all_env_cell._varIndex()) << '\n';
668 for( CellComponentCellEnumerator ienvcell(all_env_cell); ienvcell.hasNext(); ++ienvcell ){
669 MatVarIndex evi = ienvcell._varIndex();
670 ostr << "env_value=" << value(evi) << ", mvi=" << evi << '\n';
671 for( CellComponentCellEnumerator imatcell(*ienvcell); imatcell.hasNext(); ++imatcell ){
672 MatVarIndex mvi = imatcell._varIndex();
673 ostr << "mat_value=" << value(mvi) << ", mvi=" << mvi << '\n';
674 }
675 }
676 }
677}
678
679/*---------------------------------------------------------------------------*/
680/*---------------------------------------------------------------------------*/
681
682template<typename DataType> void
684dumpValues(std::ostream& ostr)
685{
686 ostr << "Dumping values for material variable name=" << this->name() << '\n';
687 IItemFamily* family = m_global_variable->itemFamily();
688 if (!family)
689 return;
690 IMeshMaterialMng* material_mng = m_p->materialMng();
691 dumpValues(ostr,material_mng->view(family->allItems()));
692}
693
694/*---------------------------------------------------------------------------*/
695/*---------------------------------------------------------------------------*/
696
697template<typename DataType> void
700{
701 IItemFamily* family = m_global_variable->itemFamily();
702 if (!family)
703 return;
704 ITraceMng* tm = family->traceMng();
705 IMeshMaterialMng* mat_mng = m_p->materialMng();
706 const Integer nb_count = DataTypeTraitsT<DataType>::nbBasicType();
707 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
709 ItemVectorView ids_view(family->view(ids));
710 bool has_mat = this->space()!=MatVarSpace::Environment;
711 switch(sbuf->mode()){
712 case ISerializer::ModeReserve:
713 {
714 Integer nb_val = 0;
715 ENUMERATE_ALLENVCELL(iallenvcell,mat_mng,ids_view){
716 ENUMERATE_CELL_ENVCELL(ienvcell,(*iallenvcell)){
717 EnvCell envcell = *ienvcell;
718 ++nb_val; // 1 valeur pour le milieu
719 if (has_mat)
720 nb_val += envcell.nbMaterial(); // 1 valeur par matériau du milieu.
721 }
722 }
723 tm->info() << "RESERVE: nb_value=" << 1 << " size=" << (nb_val*nb_count);
724 sbuf->reserve(DT_Int64,1); // Pour le nombre de valeurs.
725 sbuf->reserveSpan(data_type,nb_val*nb_count); // Pour le nombre de valeurs.
726 }
727 break;
728 case ISerializer::ModePut:
729 {
731 ENUMERATE_ALLENVCELL(iallenvcell,mat_mng,ids_view){
732 ENUMERATE_CELL_ENVCELL(ienvcell,(*iallenvcell)){
733 values.add(value(ienvcell._varIndex()));
734 if (has_mat){
735 ENUMERATE_CELL_MATCELL(imatcell,(*ienvcell)){
736 values.add(value(imatcell._varIndex()));
737 }
738 }
739 }
740 }
741 Integer nb_value = values.size();
742 ConstArrayView<BasicType> basic_values(nb_value*nb_count, reinterpret_cast<BasicType*>(values.data()));
743 tm->info() << "PUT: nb_value=" << nb_value << " size=" << basic_values.size();
744 sbuf->putInt64(nb_value);
745 sbuf->putSpan(basic_values);
746 }
747 break;
748 case ISerializer::ModeGet:
749 {
750 UniqueArray<BasicType> basic_values;
751 Int64 nb_value = sbuf->getInt64();
752 basic_values.resize(nb_value*nb_count);
753 sbuf->getSpan(basic_values);
754 Span<const DataType> data_values(reinterpret_cast<DataType*>(basic_values.data()),nb_value);
755 Integer index = 0;
756 ENUMERATE_ALLENVCELL(iallenvcell,mat_mng,ids_view){
757 ENUMERATE_CELL_ENVCELL(ienvcell,(*iallenvcell)){
758 EnvCell envcell = *ienvcell;
759 setValue(ienvcell._varIndex(),data_values[index]);
760 ++index;
761 if (has_mat){
762 ENUMERATE_CELL_MATCELL(imatcell,envcell){
763 setValue(imatcell._varIndex(),data_values[index]);
764 ++index;
765 }
766 }
767 }
768 }
769 }
770 break;
771 default:
772 throw NotSupportedException(A_FUNCINFO,"Invalid serialize");
773 }
774}
775
776/*---------------------------------------------------------------------------*/
777/*---------------------------------------------------------------------------*/
778
779/*---------------------------------------------------------------------------*/
780/*---------------------------------------------------------------------------*/
781
782template<typename ItemType,typename DataType>
784MeshMaterialVariableScalar(const MaterialVariableBuildInfo& v,PrivatePartType* global_var,
785 VariableRefType* global_var_ref,MatVarSpace mvs)
786: ItemMaterialVariableScalar<DataType>(v,global_var,global_var_ref,mvs)
787, m_true_global_variable_ref(global_var_ref) // Sera détruit par la classe de base
788{
789}
790
791/*---------------------------------------------------------------------------*/
792/*---------------------------------------------------------------------------*/
793
794template<typename ItemType,typename DataType>
797{
798}
799
800/*---------------------------------------------------------------------------*/
801/*---------------------------------------------------------------------------*/
802
803/*---------------------------------------------------------------------------*/
804/*---------------------------------------------------------------------------*/
805
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>>
811
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);
821
822/*---------------------------------------------------------------------------*/
823/*---------------------------------------------------------------------------*/
824
825} // End namespace Arcane::materials
826
827/*---------------------------------------------------------------------------*/
828/*---------------------------------------------------------------------------*/
#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 IStat * stat()=0
Gestionnaire des statistiques.
virtual ITimerMng * timerMng() const =0
Gestionnaire de timers.
Classe utilitaire pour imprimer les infos sur une entité.
Definition ItemPrinter.h:35
Vue sur un vecteur d'entités.
Maille arcane avec info matériaux et milieux.
Enumérateur sur les constituants d'une maille.
Maille arcane d'un milieu.
virtual IMeshComponentInternal * _internalApi()=0
API interne.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
virtual AllEnvCellVectorView view(const CellGroup &cells)=0
Vue sur les mailles milieux correspondant au groupe cells.
Interface d'un matériau d'un maillage.
Représente un matériau d'une maille multi-matériau.
Représente un index sur les variables matériaux et milieux.
virtual void add(const String &name, double elapsed_time, Int64 msg_size)=0
Ajoute une statistique.
Sentinelle pour le timer. La sentinelle associée à un timer permet de déclancher celui-ci au moment d...
Definition Timer.h:89
Gestion d'un timer.
Definition Timer.h:62
Real lastActivationTime() const
Retourne le temps (en secondes) passé lors de la dernière activation du timer.
Definition Timer.h:219
Integer size() const
Nombre d'éléments du vecteur.
Vue modifiable d'un tableau d'un type T.
const T * data() const
Accès à la racine du tableau hors toute protection.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
virtual void reserveSpan(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n valeurs de dt.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual Int64 getInt64()=0
Récupère une taille.
virtual void reserve(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n objets de type dt.
virtual eMode mode() const =0
Mode de fonctionnement actuel.
virtual void putInt64(Int64 value)=0
Ajoute l'entier value.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Vue d'un tableau d'éléments de type T.
Definition Span.h:670
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:209
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:419
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
Vecteur 1D de données avec sémantique par valeur (style STL).
#define ENUMERATE_ENV(ienv, container)
Macro pour itérer sur une liste de milieux.
#define ENUMERATE_ENVCELL(iname, env)
Macro pour itérer sur toutes les mailles d'un milieu.
#define ENUMERATE_COMPONENTITEM(enumerator_class_name, iname,...)
Macro générique pour itérer sur les entités d'un matériau ou d'un milieu.
#define ENUMERATE_CELL_MATCELL(iname, env_cell)
Macro pour itérer sur tous les matériaux d'une maille.
#define ENUMERATE_CELL_ENVCELL(iname, all_env_cell)
Macro pour itérer sur tous les milieux d'une maille.
#define ENUMERATE_MATCELL(iname, mat)
Macro pour itérer sur toutes les mailles d'un matériau.
#define ENUMERATE_ALLENVCELL(iname,...)
Macro pour itérer sur toutes les mailles AllEnvCell d'un groupe.
#define ENUMERATE_COMPONENTCELL(iname, component)
Macro pour itérer sur toutes les mailles d'un composant.
#define ENUMERATE_MAT(imat, container)
Macro pour itérer sur une liste de matériaux.
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.
Definition UtilsTypes.h:640
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:515
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:605
unsigned char Byte
Type d'un octet.
Definition UtilsTypes.h:142
eDataType
Type d'une donnée.
Definition DataTypes.h:39
@ DT_Int64
Donnée de type entier 64 bits.
Definition DataTypes.h:44
Int32 Integer
Type représentant un entier.