Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ArrayExpressionImpl.cc
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/* ArrayExpressionImpl.cc (C) 2000-2005 */
9/* */
10/* Expression traitant un tableau. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14
15#include "arcane/utils/ArcanePrecomp.h"
16
17#include "arcane/datatype/ArrayVariant.h"
18
19#include "arcane/expr/ArrayExpressionImpl.h"
20#include "arcane/expr/OperatorMng.h"
21#include "arcane/expr/BadOperationException.h"
22
23#include "arcane/MathUtils.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28ARCANE_BEGIN_NAMESPACE
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
39{
40 public:
41 virtual ~ArrayOperator() {}
42 public:
43 virtual void assign(ExpressionResult* res, ArrayVariant* var)=0;
44 virtual void evaluate(ExpressionResult* res, ArrayVariant* var)=0;
45};
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50template<class T>
52: public ArrayOperator
53{
54 public:
55 virtual void assign(ExpressionResult* res,ArrayVariant* var)
56 {
57 // Notons que la taille de la variable peut être plus importante
58 // que celle du résultat suivant les indices retenus (cf WhereExpression)
59 Integer size = res->size();
60
61 // recuperation des valeurs du resultat et de la variable
63 res->data()->value(res_val);
66 var_res.data()->value(var_val);
68
69 for( Integer i=0 ; i<size ; ++i)
71 }
72
73 virtual void evaluate(ExpressionResult* res,ArrayVariant* var)
74 {
75 // Notons que la taille de la variable peut être plus importante
76 // que celle du résultat suivant les indices retenus (cf WhereExpression)
77 Integer size = res->size();
78 Integer vsize = var->size();
79 cerr << "** SIZE res=" << size << " var=" << vsize << " res=" << res << '\n';
80 Integer max_size = math::min(size,vsize);
81 //if (size > var->size())
82 //throw BadOperandException("VariableOperatorT::evaluate");
83
84 // allocation du résultat en fonction du type de la variable
85 VariantBase::eType type = var->type();
86 res->allocate(type);
87
88 // recuperation des valeurs des operandes
90 res->data()->value(res_val);
93 var_res.data()->value(var_val);
95
96 for( Integer i=0 ; i<max_size ; ++i)
98 }
99};
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
103
104ArrayExpressionImpl::
105ArrayExpressionImpl(ArrayVariant* variant)
107, m_variant(variant)
108, m_op(0)
109{
110 switch(variant->type()){
111 case VariantBase::TReal:
112 m_op = new ArrayOperatorT<Real>();
113 break;
114 default:
115 throw BadOperationException("ArrayExpressionImpl::ArrayExpressionImpl",
116 "bad type",variant->type());
117 }
118}
119
120/*---------------------------------------------------------------------------*/
121/*---------------------------------------------------------------------------*/
122
123ArrayExpressionImpl::
124~ArrayExpressionImpl()
125{
126 //TODO Le delete fait planter...
127 //delete m_variant;
128 delete m_op;
129}
130
131/*---------------------------------------------------------------------------*/
132/*---------------------------------------------------------------------------*/
133
134void ArrayExpressionImpl::
135assign(IExpressionImpl* expr)
136{
137 ExpressionResult result(m_variant);
138 expr->apply(&result);
139}
140
141/*---------------------------------------------------------------------------*/
142/*---------------------------------------------------------------------------*/
143
144void ArrayExpressionImpl::
145assign(IExpressionImpl* expr,ConstArrayView<Integer> indices)
146{
147 ExpressionResult result(indices);
148 result.allocate(m_variant->type());
149 expr->apply(&result);
150 m_op->assign(&result, m_variant);
151}
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
156void ArrayExpressionImpl::
157apply(ExpressionResult* result)
158{
159 m_op->evaluate(result, m_variant);
160}
161
162/*---------------------------------------------------------------------------*/
163/*---------------------------------------------------------------------------*/
164
166vectorSize() const
167{
168 return m_variant->size();
169}
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173
174ARCANE_END_NAMESPACE
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
178
virtual Integer vectorSize() const
Nombre d'éléments du vecteur.
Operateur binaire generique pour les expressions.
Type de base polymorphe pour les tableaux (dimension 1).
Exception sur une opération des expressions.
Classe de base de l'implémentation d'une expression.
Type de base polymorphe d'une expression.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Vue constante d'un tableau de type T.