Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
core/materials/MatItemEnumerator.h
Aller à la documentation de ce fichier.
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/* MatItemEnumerator.h (C) 2000-2024 */
9/* */
10/* Enumérateurs sur les mailles materiaux. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_MATERIALS_MATITEMENUMERATOR_H
13#define ARCANE_CORE_MATERIALS_MATITEMENUMERATOR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16/*!
17 * \file MatItemEnumerator.h
18 *
19 * Ce fichier contient les différents types d'itérateur et macros
20 * pour itérer sur les mailles matériaux et milieux.
21 */
22#include "arcane/utils/FatalErrorException.h"
23
24#include "arcane/core/materials/MatItem.h"
25#include "arcane/core/materials/IEnumeratorTracer.h"
26
27#include "arcane/EnumeratorTraceWrapper.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31//! Active toujours les traces dans les parties Arcane concernant les matériaux.
32#ifdef ARCANE_COMPONENT_arcane_materials
33#ifndef ARCANE_TRACE_ENUMERATOR
34#define ARCANE_TRACE_ENUMERATOR
35#endif
36#endif
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40
41namespace Arcane::Materials
42{
43
44/*---------------------------------------------------------------------------*/
45/*---------------------------------------------------------------------------*/
46
47class MatCellVector;
48class EnvCellVector;
49class ComponentItemVector;
50class ComponentItemVectorView;
51class ComponentPartItemVectorView;
52class MatItemVectorView;
53class EnvItemVectorView;
54
55// Les 4 classes suivantes servent uniquement pour spécialiser
56// ComponentItemEnumeratorTraitsT
57class MatPartCell {};
58class EnvPartCell {};
61
62template<typename T> class ComponentItemEnumeratorTraitsT;
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
66/*!
67 * \internal
68 * \brief Vue sur une liste de mailles avec infos sur les milieux.
69 *
70 * Comme toute vue, cet objet n'est valide que tant que le conteneur
71 * associé (en général un CellGroup) n'est pas modifié.
72 */
73class ARCANE_CORE_EXPORT AllEnvCellVectorView
74{
75 friend class MeshMaterialMng;
76
77 protected:
78
80 ComponentItemSharedInfo* shared_info)
81 : m_local_ids(local_ids)
82 , m_shared_info(shared_info)
83 {
84 }
85
86 public:
87
88 //! Nombre d'éléments.
89 constexpr ARCCORE_HOST_DEVICE Integer size() const { return m_local_ids.size(); }
90
91 // \i ème maille du vecteur
92 ARCCORE_HOST_DEVICE AllEnvCell operator[](Integer index) const
93 {
94 return AllEnvCell(m_shared_info->_item(ConstituentItemIndex(m_local_ids[index])));
95 }
96
97 // localId() de la \i ème maille du vecteur
98 ARCCORE_HOST_DEVICE Int32 localId(Integer index) const { return m_local_ids[index]; }
99
100 private:
101
102 Int32ConstArrayView m_local_ids;
103 ComponentItemSharedInfo* m_shared_info = nullptr;
104};
105
106/*---------------------------------------------------------------------------*/
107/*---------------------------------------------------------------------------*/
108/*!
109 * \brief Enumérateur sur une partie des mailles d'un composant (matériau ou milieu)
110 */
111class ARCANE_CORE_EXPORT ComponentCellEnumerator
112{
113 friend class EnumeratorTracer;
114
115 protected:
116
118
119 public:
120
121 static ComponentCellEnumerator create(IMeshComponent* component);
122 static ComponentCellEnumerator create(const ComponentItemVector& v);
124
125 public:
126
127 void operator++()
128 {
129 ++m_index;
130#ifdef ARCANE_CHECK
131 if (m_index<m_size)
132 _check();
133#endif
134 }
135 bool hasNext() const { return m_index<m_size; }
136
138 {
139 return ComponentCell(m_constituent_list_view._constituenItemBase(m_index));
140 }
141
142 Integer index() const { return m_index; }
143 MatVarIndex _varIndex() const { return m_matvar_indexes[m_index]; }
144
145 operator ComponentItemLocalId() const
146 {
147 return ComponentItemLocalId(m_matvar_indexes[m_index]);
148 }
149
150 protected:
151
152 Int32 _varArrayIndex() const { return m_matvar_indexes[m_index].arrayIndex(); }
153 Int32 _varValueIndex() const { return m_matvar_indexes[m_index].valueIndex(); }
154
155 protected:
156
157 void _check() const
158 {
159 MatVarIndex mvi = m_constituent_list_view._matVarIndex(m_index);
160 Int32 i_var_array_index = mvi.arrayIndex();
161 Int32 mv_array_index = _varArrayIndex();
162 if (i_var_array_index!=mv_array_index)
163 ARCANE_FATAL("Bad 'var_array_index' in ComponentCell matvar='{0}' registered='{1}' index={2}",
164 mvi,m_matvar_indexes[m_index],m_index);
165 Int32 i_var_value_index = mvi.valueIndex();
166 Int32 mv_value_index = _varValueIndex();
167 if (i_var_value_index!=mv_value_index)
168 ARCANE_FATAL("Bad 'var_value_index' for ComponentCell matvar='{0}' registered='{1}' index={2}",
169 mvi,m_matvar_indexes[m_index],m_index);
170 }
171
172 protected:
173
174 Int32 m_index;
175 Int32 m_size;
176 ConstituentItemLocalIdListView m_constituent_list_view;
177 ConstArrayView<MatVarIndex> m_matvar_indexes;
178 IMeshComponent* m_component;
179
180 protected:
181
182 matimpl::ConstituentItemBase _currentConstituentItemBase() const
183 {
184 return m_constituent_list_view._constituenItemBase(m_index);
185 }
186};
187
188/*---------------------------------------------------------------------------*/
189/*---------------------------------------------------------------------------*/
190/*!
191 * \brief Enumérateur sur une partie des mailles d'un seul matériau.
192 */
193class ARCANE_CORE_EXPORT MatCellEnumerator
195{
196 protected:
197
200 {
201 }
202
203 public:
204
205 static MatCellEnumerator create(IMeshMaterial* mat);
206 static MatCellEnumerator create(const MatCellVector& miv);
207 static MatCellEnumerator create(MatItemVectorView v);
208
209 public:
210
211 MatCell operator*() const
212 {
213#ifdef ARCANE_CHECK
214 _check();
215#endif
216 return MatCell(_currentConstituentItemBase());
217 }
218
219 private:
220};
221
222/*---------------------------------------------------------------------------*/
223/*---------------------------------------------------------------------------*/
224/*!
225 * \brief Enumérateur sur les mailles d'un milieu
226 */
227class ARCANE_CORE_EXPORT EnvCellEnumerator
229{
230 protected:
231
234 {
235 }
236
237 public:
238
239 static EnvCellEnumerator create(IMeshEnvironment* mat);
240 static EnvCellEnumerator create(const EnvCellVector& miv);
241 static EnvCellEnumerator create(EnvItemVectorView v);
242
243 public:
244
245 EnvCell operator*() const
246 {
247#ifdef ARCANE_CHECK
248 _check();
249#endif
250 return EnvCell(_currentConstituentItemBase());
251 }
252};
253
254/*---------------------------------------------------------------------------*/
255/*---------------------------------------------------------------------------*/
256/*!
257 * \brief Enumérateur sur une sous-partie (pure ou partielle) d'un
258 * sous-ensemble des mailles d'un composant (matériau ou milieu)
259 */
260class ARCANE_CORE_EXPORT ComponentPartCellEnumerator
261{
262 protected:
263
264 ComponentPartCellEnumerator(const ComponentPartItemVectorView& view,Integer base_index);
265
266 public:
267
270
271 public:
272
273 void operator++()
274 {
275 ++m_index;
276 }
277 bool hasNext() const { return m_index<m_size; }
278
279 MatVarIndex _varIndex() const { return MatVarIndex(m_var_idx,m_value_indexes[m_index]); }
280
281 operator ComponentItemLocalId() const
282 {
283 return ComponentItemLocalId(_varIndex());
284 }
285
287 {
288 return ComponentCell(m_constituent_list_view._constituenItemBase(m_item_indexes[m_index]));
289 }
290
291 protected:
292
293 Integer m_index;
294 Integer m_size;
295 Integer m_var_idx;
296 Integer m_base_index;
297 Int32ConstArrayView m_value_indexes;
298 Int32ConstArrayView m_item_indexes;
299 ConstituentItemLocalIdListView m_constituent_list_view;
300 IMeshComponent* m_component;
301
302 protected:
303
304 matimpl::ConstituentItemBase _currentConstituentItemBase() const
305 {
306 return m_constituent_list_view._constituenItemBase(m_item_indexes[m_index]);
307 }
308};
309
310/*---------------------------------------------------------------------------*/
311/*---------------------------------------------------------------------------*/
312/*!
313 * \brief Enumérateur les entités pures ou impures d'un matériau.
314 */
315class ARCANE_CORE_EXPORT MatPartCellEnumerator
317{
318 public:
320 public:
322 static MatPartCellEnumerator create(IMeshMaterial* mat,eMatPart part);
323 public:
324
325 MatCell operator*() const
326 {
327 return MatCell(_currentConstituentItemBase());
328 }
329};
330
331/*---------------------------------------------------------------------------*/
332/*---------------------------------------------------------------------------*/
333/*!
334 * \brief Enumérateur sur les entités pures ou impures d'un milieu.
335 */
336class ARCANE_CORE_EXPORT EnvPartCellEnumerator
338{
339 public:
341 public:
343 static EnvPartCellEnumerator create(IMeshEnvironment* env,eMatPart part);
344 public:
345
346 EnvCell operator*() const
347 {
348 return EnvCell(_currentConstituentItemBase());
349 }
350};
351
352/*---------------------------------------------------------------------------*/
353/*---------------------------------------------------------------------------*/
354/*!
355 * \brief Enumérateur sur les mailles d'un milieu
356 */
357class ARCANE_CORE_EXPORT CellGenericEnumerator
358{
359 public:
360 static EnvCellEnumerator create(IMeshEnvironment* env);
361 static EnvCellEnumerator create(const EnvCellVector& ecv);
362 static EnvCellEnumerator create(EnvItemVectorView v);
363
364 static MatCellEnumerator create(IMeshMaterial* mat);
365 static MatCellEnumerator create(const MatCellVector& miv);
366 static MatCellEnumerator create(MatItemVectorView v);
367
368 static CellEnumerator create(CellVectorView v);
369 static CellEnumerator create(const CellGroup& v);
370};
371
372/*---------------------------------------------------------------------------*/
373/*---------------------------------------------------------------------------*/
374/*!
375 * \brief Enumérateur sur les mailles milieux
376 */
377class ARCANE_CORE_EXPORT AllEnvCellEnumerator
378{
379 friend class EnumeratorTracer;
380 protected:
382 : m_index(0), m_size(items.size()), m_items(items) { }
383 public:
384 static AllEnvCellEnumerator create(AllEnvCellVectorView items);
385 static AllEnvCellEnumerator create(IMeshMaterialMng* mng,const CellGroup& group);
386 static AllEnvCellEnumerator create(IMeshMaterialMng* mng,const CellVectorView& view);
387 static AllEnvCellEnumerator create(IMeshBlock* block);
388 public:
389 void operator++() { ++m_index; }
390 bool hasNext() const { return m_index<m_size; }
391 AllEnvCell operator*() { return m_items[m_index]; }
392 Integer index() const { return m_index; }
393 public:
394 Integer m_index;
395 Integer m_size;
396 AllEnvCellVectorView m_items;
397};
398
399/*---------------------------------------------------------------------------*/
400/*---------------------------------------------------------------------------*/
401/*!
402 * \brief Enumérateur sur des composants
403 */
404class ARCANE_CORE_EXPORT ComponentEnumerator
405{
406 friend class EnumeratorTracer;
407
408 public:
409
411
412 public:
413
414 bool hasNext() const { return m_index<m_size; }
415 void operator++() { ++m_index; }
416 IMeshComponent* operator*() const { return m_components[m_index]; }
417
418 private:
419
421 Integer m_index;
422 Integer m_size;
423};
424
425/*---------------------------------------------------------------------------*/
426/*---------------------------------------------------------------------------*/
427/*!
428 * \brief Enumérateur sur des matériaux
429 */
430class ARCANE_CORE_EXPORT MatEnumerator
431{
432 public:
433
434 explicit MatEnumerator(IMeshMaterialMng* mng);
435 explicit MatEnumerator(IMeshEnvironment* env);
437
438 public:
439
440 bool hasNext() const { return m_index<m_size; }
441 void operator++() { ++m_index; }
442 IMeshMaterial* operator*() const { return m_mats[m_index]; }
443
444 private:
445
447 Integer m_index;
448 Integer m_size;
449};
450
451/*---------------------------------------------------------------------------*/
452/*---------------------------------------------------------------------------*/
453/*!
454 * \brief Enumérateur sur des milieux
455 */
456class ARCANE_CORE_EXPORT EnvEnumerator
457{
458 public:
459
463
464 public:
465
466 bool hasNext() const { return m_index<m_size; }
467 void operator++() { ++m_index; }
468 IMeshEnvironment* operator*() const { return m_envs[m_index]; }
469
470 private:
471
473 Integer m_index;
474 Integer m_size;
475};
476
477/*---------------------------------------------------------------------------*/
478/*---------------------------------------------------------------------------*/
479
480template<>
486template<>
492template<>
498template<>
504template<>
510template<>
516template<>
522
523/*---------------------------------------------------------------------------*/
524/*---------------------------------------------------------------------------*/
525
526#if defined(ARCANE_TRACE_ENUMERATOR)
527#define A_TRACE_COMPONENT(_EnumeratorClassName) \
528 ::Arcane::EnumeratorTraceWrapper< ::Arcane::Materials::_EnumeratorClassName, ::Arcane::Materials::IEnumeratorTracer >
529#else
530#define A_TRACE_COMPONENT(_EnumeratorClassName) \
531 ::Arcane::Materials::_EnumeratorClassName
532#endif
533
534#define A_ENUMERATE_COMPONENTCELL(_EnumeratorClassName,iname,...) \
535 for( A_TRACE_COMPONENT(_EnumeratorClassName) iname(Arcane::Materials::_EnumeratorClassName::create(__VA_ARGS__) A_TRACE_ENUMERATOR_WHERE); iname.hasNext(); ++iname )
536
537#define A_ENUMERATE_COMPONENT(_EnumeratorClassName,iname,container) \
538 for( A_TRACE_COMPONENT(_EnumeratorClassName) iname((::Arcane::Materials::_EnumeratorClassName)(container) A_TRACE_ENUMERATOR_WHERE); iname.hasNext(); ++iname )
539
540#define A_ENUMERATE_CELL_COMPONENTCELL(_EnumeratorClassName,iname,component_cell) \
541 for( ::Arcane::Materials::_EnumeratorClassName iname((::Arcane::Materials::_EnumeratorClassName)(component_cell)); iname.hasNext(); ++iname )
542
543/*---------------------------------------------------------------------------*/
544/*---------------------------------------------------------------------------*/
545
546/*!
547 * \brief Macro générique pour itérer sur les entités d'un matériau ou d'un milieu.
548 *
549 * \param enumerate_class_name nom de la classe de l'énumérateur
550 * \param iname nom de la variable contenant l'itérateur
551 * \param ... Les arguments supplémentaires sont passés à la méthode statique create() de
552 * la classe de l'énumérateur.
553 */
554#define ENUMERATE_COMPONENTITEM(enumerator_class_name,iname,...) \
555 A_ENUMERATE_COMPONENTCELL(ComponentItemEnumeratorTraitsT<enumerator_class_name>::EnumeratorType,iname,__VA_ARGS__)
556
557/*---------------------------------------------------------------------------*/
558/*---------------------------------------------------------------------------*/
559
560/*!
561 * \brief Macro pour itérer sur toutes les mailles AllEnvCell d'un groupe.
562 *
563 * Il existe deux possibilités pour utiliser cette macro. La première
564 * est obsolète et utilise la méthode IMeshMaterialMng::view(). La seconde
565 * utilise trois arguments:
566 * \param iname nom de l'itérateur, de type \a AllEnvCellEnumerator.
567 * \param matmng gestionnaire de materiaux de type \a IMeshMaterialMng.
568 * \param igroup groupe de maille, de type \a CellGroup.
569 */
570#define ENUMERATE_ALLENVCELL(iname,...) \
571 for( A_TRACE_COMPONENT(AllEnvCellEnumerator) iname( ::Arcane::Materials::AllEnvCellEnumerator::create(__VA_ARGS__) ); iname.hasNext(); ++iname )
572
573/*!
574 * \brief Macro pour itérer sur toutes les mailles d'un matériau.
575 *
576 * \param iname nom de l'itérateur, de type MatCellEnumerator.
577 * \param mat matériau, de type IMeshMaterial*
578 */
579#define ENUMERATE_MATCELL(iname,mat) \
580 A_ENUMERATE_COMPONENTCELL(MatCellEnumerator,iname,mat)
581
582/*!
583 * \brief Macro pour itérer sur toutes les mailles d'un milieu.
584 *
585 * \param iname nom de l'itérateur, de type EnvCellEnumerator.
586 * \param env milieu, de type IMeshEnvironment*
587 */
588#define ENUMERATE_ENVCELL(iname,env) \
589 A_ENUMERATE_COMPONENTCELL(EnvCellEnumerator,iname,env)
590
591/*!
592 * \brief Macro pour itérer sur toutes les mailles d'un composant.
593 *
594 * \param iname nom de l'itérateur, de type EnvCellEnumerator.
595 * \param component composant, de type IMeshComponent*
596 */
597#define ENUMERATE_COMPONENTCELL(iname,component) \
598 A_ENUMERATE_COMPONENTCELL(ComponentCellEnumerator,iname,component)
599
600/*!
601 * \brief Macro pour itérer sur une liste de composants
602 *
603 * \a icomponent nom de l'itérateur.
604 * \a container peut être un objet du type suivant:
605 * - ConstArrayView<IMeshComponent*> pour itérer sur une liste spécifique de composants
606 */
607#define ENUMERATE_COMPONENT(icomponent,container) \
608 A_ENUMERATE_COMPONENT(ComponentEnumerator,icomponent,container)
609
610/*!
611 * \brief Macro pour itérer sur une liste de matériaux
612 *
613 * \a imat nom de l'itérateur.
614 * \a container peut être un objet du type suivant:
615 * - IMeshMaterialMng* pour itérer sur tous les matériaux
616 * - IMeshEnvironment* pour itérer sur tous les matériaux d'un milieu
617 * - ConstArrayView<IMeshMaterial*> pour itérer sur une liste spécifique de matériaux
618 */
619#define ENUMERATE_MAT(imat,container) \
620 A_ENUMERATE_COMPONENT(MatEnumerator,imat,container)
621
622/*!
623 * \brief Macro pour itérer sur une liste de milieux.
624 *
625 * \a ienv est le nom de l'énumérateur.
626 * \a container peut être un objet du type suivant:
627 * - IMeshMaterialMng* pour itérer sur tous les milieux
628 * - IMeshBlock* pour itérer sur tous les milieux du bloc
629 * - ConstArrayView<IMeshEnvironment*> pour itérer sur une liste spécifique de milieux.
630 */
631#define ENUMERATE_ENV(ienv,container) \
632 A_ENUMERATE_COMPONENT(EnvEnumerator,ienv,container)
633
634/*!
635 * \brief Macro pour itérer sur tous les composants d'une maille.
636 *
637 * \param iname nom de l'itérateur, de type CellComponentCellEnumerator.
638 * \param component_cell maille composant, de type ComponentCell.
639 */
640#define ENUMERATE_CELL_COMPONENTCELL(iname,component_cell) \
641 A_ENUMERATE_CELL_COMPONENTCELL(CellComponentCellEnumerator,iname,component_cell)
642
643/*!
644 * \brief Macro pour itérer sur tous les matériaux d'une maille.
645 *
646 * \param iname nom de l'itérateur, de type CellMatCellEnumerator.
647 * \param env_cell maille milieu, de type EnvCell.
648 */
649#define ENUMERATE_CELL_MATCELL(iname,env_cell) \
650 A_ENUMERATE_CELL_COMPONENTCELL(CellMatCellEnumerator,iname,env_cell)
651
652/*!
653 * \brief Macro pour itérer sur tous les milieux d'une maille.
654 *
655 * \param iname nom de l'itérateur, de type CellEnvCellEnumerator.
656 * \param all_env_cell maille avec infos sur les milieux, de type AllEnvCell.
657 */
658#define ENUMERATE_CELL_ENVCELL(iname,all_env_cell) \
659 A_ENUMERATE_CELL_COMPONENTCELL(CellEnvCellEnumerator,iname,all_env_cell)
660
661/*---------------------------------------------------------------------------*/
662/*---------------------------------------------------------------------------*/
663
664/*!
665 * \brief Macro pour itérer de manière générique sur les matériaux,
666 * milieux ou les mailles
667 *
668 * \param iname nom de l'itérateur, de type CellEnvCellEnumerator.
669 * \param mat_or_env_or_group un objet qui peut être passé en argument de
670 * ENUMERATE_CELL, ENUMERATE_MATCELL ou ENUMERATE_ENVCELL.
671 */
672#define ENUMERATE_GENERIC_CELL(iname,mat_or_env_or_group) \
673 for( auto iname = ::Arcane::Materials::CellGenericEnumerator::create(mat_or_env_or_group); iname.hasNext(); ++iname )
674
675/*---------------------------------------------------------------------------*/
676/*---------------------------------------------------------------------------*/
677
678} // End namespace Arcane::Materials
679
680/*---------------------------------------------------------------------------*/
681/*---------------------------------------------------------------------------*/
682
683#endif
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Enumérateur SIMD sur une sous-partie (pure ou partielle) d'un sous-ensemble des mailles d'un composan...
Vue sur un tableau typé d'entités.
constexpr __host__ __device__ Integer size() const
Nombre d'éléments.
Maille arcane avec info matériaux et milieux.
Enumérateur sur les mailles d'un milieu.
Enumérateur sur une partie des mailles d'un composant (matériau ou milieu)
Représente un composant d'une maille multi-matériau.
Index d'un Item matériaux dans une variable.
Vue sur un vecteur sur les entités d'un composant.
Enumérateur sur une sous-partie (pure ou partielle) d'un sous-ensemble des mailles d'un composant (ma...
Vue sur une partie pure ou partielles des entités d'un composant.
Enumérateur sur les mailles d'un milieu.
Vecteur sur les entités d'un milieu.
Maille arcane d'un milieu.
Vue sur un vecteur sur les entités d'un milieu.
Enumérateur sur les entités pures ou impures d'un milieu.
Vue sur une partie pure ou partielles des entités d'un milieu.
Interface d'un bloc d'un maillage.
Interface d'un composant (matériau ou milieu) d'un maillage.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
Interface d'un matériau d'un maillage.
Enumérateur sur une partie des mailles d'un seul matériau.
Vecteur sur les entités d'un matériau.
Représente un matériau d'une maille multi-matériau.
Vue sur un vecteur sur les entités d'un matériau.
Enumérateur les entités pures ou impures d'un matériau.
Vue sur une partie pure ou partielles des entités d'un matériau.
Représente un index sur les variables matériaux et milieux.
constexpr __host__ __device__ Int32 arrayIndex() const
Retourne l'indice du tableau de valeur dans la liste des variables.
constexpr __host__ __device__ Int32 valueIndex() const
Retourne l'indice dans le tableau de valeur.
Vue constante d'un tableau de type T.
ItemEnumeratorT< Cell > CellEnumerator
Enumérateurs sur des mailles.
Definition ItemTypes.h:271
Active toujours les traces dans les parties Arcane concernant les matériaux.
eMatPart
Partie d'un composant.
Real2 operator*(Real sca, const Real2Proxy &vec)
Multiplication par un scalaire.
Definition Real2Proxy.h:241