Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemLoop.h
Aller à la documentation de ce fichier.
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* ItemLoop.h (C) 2000-2018 */
9/* */
10/* Classes utilitaires pour gérer les boucles sur les entités. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ITEMLOOP_H
13#define ARCANE_ITEMLOOP_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/ItemEnumerator.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21/*!
22 * \file ItemLoop.h
23 *
24 * \brief Types et macros pour gérer les boucles sur les entités du maillage.
25 */
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane
30{
31/*!
32 * \brief Espace de nom contenant les différentes classes gérant les boucles
33 * sur les entités.
34 */
35namespace Loop
36{
37/*!
38 * \internal
39 * \brief Fonctor de boucle d'entité permettant de supprimer les
40 * indirections si les indices locaux de \a view sont consécutifs.
41 */
42template<typename IterType,typename Lambda> inline void
43_InternalSimpleItemLoop(ItemVectorView view,const Lambda& lambda)
44{
45 if (view.size()==0)
46 return;
47 bool is_contigous = view.indexes().isContigous();
48 //is_contigous = false;
49 if (is_contigous){
50 Int32 x0 = view.localIds()[0];
51 // Suppose que les itérations sont indépendantes
52 ARCANE_PRAGMA_IVDEP
53 for( Int32 i=0, n=view.size(); i<n; ++i )
54 lambda(IterType(x0+i));
55 }
56 else{
57 ENUMERATE_ITEM(iitem,view){
58 lambda(IterType(iitem.localId()));
59 }
60 }
61}
62/*!
63 * \brief Classe template pour encapsuler une boucle sur les entités.
64 */
65template<typename ItemType>
67{
68 public:
69 typedef typename ItemType::Index IterType;
72 typedef ItemLoopFunctor<ItemType> ThatClass;
73 private:
75 : m_items(items){}
76 public:
77 static ThatClass create(const ItemGroupType& items)
78 { return ThatClass(items.view()); }
79 static ThatClass create(VectorViewType items)
80 { return ThatClass(items); }
81 public:
82 template<typename Lambda>
83 void operator<<(Lambda&& lambda)
84 {
85 _InternalSimpleItemLoop<IterType>(m_items,lambda);
86 }
87 private:
88 ItemVectorView m_items;
89};
90
91typedef ItemLoopFunctor<Cell> ItemLoopFunctorCell;
92typedef ItemLoopFunctor<Node> ItemLoopFunctorNode;
93
94} // End of namespace Loop
95
96} // End of namespace Arcane
97
98/*---------------------------------------------------------------------------*/
99/*---------------------------------------------------------------------------*/
100/*!
101 * \brief Enumérateur sur une entité via une fonction lambda.
102 *
103 * \param item_type type de l'entité (Arcane::Node, Arcane::Cell, Arcane::Edge, ....)
104 * \param iter nom de l'itérateur
105 * \param container conteneur associé (de type Arcane::ItemGroup ou Arcane::ItemVectorView).
106 *
107 * Cette macro génère une lambda et il faut donc terminer
108 * l'expression par un ';'.
109 *
110 * Par exemple, pour itérer sur toutes les mailles:
111 * \code
112 * Real gamma = 1.4;
113 * ENUMERATE_ITEM_LAMBDA(Cell,icell,allCells()){
114 * Real pressure = pressure[icell];
115 * Real adiabatic_cst = adiabatic_cst[icell];
116 * Real density = density[icell];
117 * internal_energy[icell] = pressure / ((gamma-1.0) * density);
118 * };
119 * \endcode
120 * L'itérateur est de type \a item_type :: Index (par exemple Cell::Index
121 * pour une maille). Il ne dispose donc pas des méthodes classiques
122 * sur les entités (comme par exemple Arcane::Cell::nbNode()). L'itérateur
123 * permet uniquement d'accéder aux valeurs des variables.
124 *
125 * La lambda est déclarée avec [=] et il est donc interdit de modifier
126 * les variables capturées.
127 *
128 * \warning La syntaxe et la sémantique de cette macro sont expérimentales.
129 * Cette macro ne doit être utilisée que pour des tests.
130 */
131#define ENUMERATE_ITEM_LAMBDA(item_type,iter,container) \
132 Arcane::Loop:: ItemLoopFunctor ## item_type :: create ( (container) ) << [=]( Arcane::Loop:: ItemLoopFunctor ## item_type :: IterType iter)
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
140#endif
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
Référence à un groupe d'un genre donné.
Definition ItemGroup.h:398
ItemVectorView view() const
Vue sur les entités du groupe.
Definition ItemGroup.cc:582
bool isContigous() const
Vrai si les localIds() sont contigüs.
Vue sur un tableau typé d'entités.
Vue sur un vecteur d'entités.
Int32 size() const
Nombre d'éléments du vecteur.
ItemIndexArrayView indexes() const
Vue sur le tableau des indices.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
Classe template pour encapsuler une boucle sur les entités.
Definition ItemLoop.h:67
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-