Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Real3x3Proxy.h
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/* Real3x3Proxy.h (C) 2000-2008 */
9/* */
10/* Proxy d'un 'Real3x3'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_REAL3X3PROXY_H
13#define ARCANE_UTILS_REAL3X3PROXY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Real3x3.h"
18#include "arcane/utils/Real3Proxy.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23ARCANE_BEGIN_NAMESPACE
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27/**
28 * \brief Proxy d'un 'Real3x3'.
29*/
30class ARCANE_UTILS_EXPORT Real3x3Proxy
31{
32 public:
33
34 //! Construit le triplet (ax,ay,az)
36 : x(value.x,info), y(value.y,info), z(value.z,info), m_value(value), m_info(info) {}
37 //! Construit un triplet identique à \a f
39 : x(f.x), y(f.y), z(f.z), m_value(f.m_value), m_info(f.m_info) {}
40 const Real3x3& operator=(const Real3x3Proxy f)
41 { x=f.x; y=f.y; z=f.z; return m_value; }
42 const Real3x3& operator=(Real3x3 f)
43 { x=f.x; y=f.y; z=f.z; return m_value; }
44 //! Affecte à l'instance le triplet (v,v,v).
45 const Real3x3& operator= (Real v)
46 { x = y = z = v; return m_value; }
47 operator const Real3x3&() const
48 {
49 return getValue();
50 }
51 //operator Real3x3()
52 //{
53 // return getValueMutable();
54 //}
55
56 public:
57
58 Real3Proxy x; //!< premier élément du triplet
59 Real3Proxy y; //!< premier élément du triplet
60 Real3Proxy z; //!< premier élément du triplet
61
62 private:
63
64 Real3x3& m_value;
65 MemoryAccessInfo m_info;
66
67 public:
68
69 //! Retourne une copie du triplet.
70 Real3x3 copy() const { return m_value; }
71 //! Réinitialise le triplet avec les constructeurs par défaut.
72 Real3x3Proxy& reset() { x.reset(); y.reset(); z.reset(); return (*this); }
73 //! Affecte à l'instance le triplet (ax,ay,az)
75 { x = ax; y = ay; z = az; return (*this); }
76 //! Copie le triplet \a f
78 { x = f.x; y = f.y; z = f.z; return (*this); }
79 /*!
80 * \brief Compare la matrice avec la matrice nulle.
81 *
82 * La matrice est nulle si et seulement si chacune de ses composant
83 * est inférieure à un espilon donné. La valeur de l'epsilon utilisée est celle
84 * de float_info<value_type>::nearlyEpsilon():
85 * \f[A=0 \Leftrightarrow |A.x|<\epsilon,|A.y|<\epsilon,|A.z|<\epsilon \f]
86 *
87 * \retval true si la matrice est égale à la matrice nulle,
88 * \retval false sinon.
89 */
90 bool isNearlyZero() const
91 { return x.isNearlyZero() && y.isNearlyZero() && z.isNearlyZero(); }
92 /*!
93 * \brief Lit la matrice sur le flot \a i
94 * La matrice est lue sous la forme de trois Real3.
95 */
96 std::istream& assign(std::istream& i);
97 //! Ecrit le triplet sur le flot \a o lisible par un assign()
98 std::ostream& print(std::ostream& o) const;
99 //! Ecrit le triplet sur le flot \a o sous la forme (x,y,z)
100 std::ostream& printXyz(std::ostream& o) const;
101
102 //! Ajoute \a b au triplet
103 Real3x3Proxy& add(Real3x3 b) { x += b.x; y += b.y; z += b.z; return (*this); }
104 //! Soustrait \a b au triplet
105 Real3x3Proxy& sub(Real3x3 b) { x -= b.x; y -= b.y; z -= b.z; return (*this); }
106 //! Ajoute \a b à chaque composante du triplet
107 Real3x3Proxy& addSame(Real3 b) { x += b; y += b; z += b; return (*this); }
108 //! Soustrait \a b à chaque composante du triplet
109 Real3x3Proxy& subSame(Real3 b) { x -= b; y -= b; z -= b; return (*this); }
110 //! Multiplie chaque composante du triplet par \a b
111 Real3x3Proxy& mulSame(Real3 b) { x *= b; y *= b; z *= b; return (*this); }
112 //! Divise chaque composante du triplet par \a b
113 Real3x3Proxy& divSame(Real3 b) { x /= b; y /= b; z /= b; return (*this); }
114 //! Ajoute \a b au triplet.
115 Real3x3Proxy& operator+= (Real3x3 b) { return add(b); }
116 //! Soustrait \a b au triplet
117 Real3x3Proxy& operator-= (Real3x3 b) { return sub(b); }
118 //! Multiple chaque composante de la matrice par le réel \a b
119 void operator*= (Real b) { x *= b; y *= b; z *= b; }
120 //! Divise chaque composante de la matrice par le réel \a b
121 void operator/= (Real b) { x /= b; y /= b; z /= b; }
122 //! Créé un triplet qui vaut ce triplet ajouté à \a b
123 Real3x3 operator+(Real3x3 b) const { return Real3x3(x+b.x,y+b.y,z+b.z); }
124 //! Créé un triplet qui vaut \a b soustrait de ce triplet
125 Real3x3 operator-(Real3x3 b) const { return Real3x3(x-b.x,y-b.y,z-b.z); }
126 //! Créé un tenseur opposé au tenseur actuel
127 Real3x3 operator-() const { return Real3x3(-x,-y,-z); }
128
129 public:
130 const Real3x3& getValue() const
131 {
132 m_info.setRead();
133 return m_value;
134 }
135 Real3x3& getValueMutable()
136 {
137 m_info.setReadOrWrite();
138 return m_value;
139 }
140 private:
141
142 /*!
143 * \brief Compare les valeurs de \a a et \a b avec le comparateur TypeEqualT
144 * \retval true si \a a et \a b sont égaux,
145 * \retval false sinon.
146 */
147 static bool _eq(Real a,Real b)
148 { return TypeEqualT<Real>::isEqual(a,b); }
149};
150
151/*---------------------------------------------------------------------------*/
152/*---------------------------------------------------------------------------*/
153/*!
154 * \brief Ecrit le triplet \a t sur le flot \a o
155 * \relates Real3
156 */
157inline std::ostream&
158operator<< (std::ostream& o,Real3x3Proxy t)
159{
160 return t.printXyz(o);
161}
162/*!
163 * \brief Lit le triplet \a t à partir du flot \a o.
164 * \relates Real3
165 */
166inline std::istream&
167operator>> (std::istream& i,Real3x3Proxy& t)
168{
169 return t.assign(i);
170}
171
172/*---------------------------------------------------------------------------*/
173/*---------------------------------------------------------------------------*/
174
175inline bool
176operator==(const Real3x3& a,const Real3x3Proxy& b)
177{
178 return a==b.getValue();
179}
180inline bool
181operator==(const Real3x3Proxy& a,const Real3x3& b)
182{
183 return a.getValue()==b;
184}
185inline bool
186operator==(const Real3x3Proxy& a,const Real3x3Proxy& b)
187{
188 return a.getValue()==b.getValue();
189}
190
191/*---------------------------------------------------------------------------*/
192/*---------------------------------------------------------------------------*/
193
194inline bool
195operator!=(const Real3x3& a,const Real3x3Proxy& b)
196{
197 return a!=b.getValue();
198}
199inline bool
200operator!=(const Real3x3Proxy& a,const Real3x3& b)
201{
202 return a.getValue()!=b;
203}
204inline bool
205operator!=(const Real3x3Proxy& a,const Real3x3Proxy& b)
206{
207 return a.getValue()!=b.getValue();
208}
209
210/*---------------------------------------------------------------------------*/
211/*---------------------------------------------------------------------------*/
212/*! \brief Multiplication par un scalaire. */
213inline Real3x3
215{
216 return Real3x3(vec.x*sca,vec.y*sca,vec.z*sca);
217}
218
219/*---------------------------------------------------------------------------*/
220/*---------------------------------------------------------------------------*/
221/*! \brief Multiplication par un scalaire. */
222inline Real3x3
223operator*(const Real3x3Proxy& vec,Real sca)
224{
225 return Real3x3(vec.x*sca,vec.y*sca,vec.z*sca);
226}
227
228/*---------------------------------------------------------------------------*/
229/*---------------------------------------------------------------------------*/
230/*! \brief Division par un scalaire. */
231inline Real3x3
232operator/(const Real3x3Proxy& vec,Real sca)
233{
234 return Real3x3(vec.x/sca,vec.y/sca,vec.z/sca);
235}
236
237/*---------------------------------------------------------------------------*/
238/*---------------------------------------------------------------------------*/
239/*!
240 * \brief Opérateur de comparaison.
241 *
242 * Cet opérateur permet de trier les Real3 pour les utiliser par exemple
243 * dans les std::set
244 */
245inline bool
247{
248 if (v1.x==v2.x){
249 if (v1.y==v2.y)
250 return v1.z<v2.z;
251 else
252 return v1.y<v2.y;
253 }
254 return (v1.x<v2.x);
255}
256
257/*---------------------------------------------------------------------------*/
258/*---------------------------------------------------------------------------*/
259
260ARCANE_END_NAMESPACE
261
262/*---------------------------------------------------------------------------*/
263/*---------------------------------------------------------------------------*/
264
265#endif
Proxy d'un Real3.
Definition Real3Proxy.h:37
RealProxy x
première composante du triplet
Definition Real3Proxy.h:63
Real3Proxy & reset()
Réinitialise le triplet avec les constructeurs par défaut.
Definition Real3Proxy.h:77
bool isNearlyZero() const
Compare le triplet avec le triplet nul.
Definition Real3Proxy.h:99
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Proxy d'un 'Real3x3'.
Real3x3Proxy & subSame(Real3 b)
Soustrait b à chaque composante du triplet.
std::ostream & printXyz(std::ostream &o) const
Ecrit le triplet sur le flot o sous la forme (x,y,z)
Definition Real3x3.cc:81
Real3x3Proxy & addSame(Real3 b)
Ajoute b à chaque composante du triplet.
Real3x3Proxy & divSame(Real3 b)
Divise chaque composante du triplet par b.
Real3x3Proxy(const Real3x3Proxy &f)
Construit un triplet identique à f.
Real3Proxy z
premier élément du triplet
Real3x3Proxy & add(Real3x3 b)
Ajoute b au triplet.
Real3x3Proxy & mulSame(Real3 b)
Multiplie chaque composante du triplet par b.
Real3x3Proxy & reset()
Réinitialise le triplet avec les constructeurs par défaut.
Real3x3Proxy & sub(Real3x3 b)
Soustrait b au triplet.
Real3x3Proxy(Real3x3 &value, const MemoryAccessInfo &info)
Construit le triplet (ax,ay,az)
Real3x3 operator+(Real3x3 b) const
Créé un triplet qui vaut ce triplet ajouté à b.
Real3x3Proxy & assign(Real3x3 f)
Copie le triplet f.
Real3Proxy x
premier élément du triplet
Real3x3 copy() const
Retourne une copie du triplet.
Real3x3 operator-(Real3x3 b) const
Créé un triplet qui vaut b soustrait de ce triplet.
Real3Proxy y
premier élément du triplet
Real3x3 operator-() const
Créé un tenseur opposé au tenseur actuel.
bool isNearlyZero() const
Compare la matrice avec la matrice nulle.
Real3x3Proxy & assign(Real3 ax, Real3 ay, Real3 az)
Affecte à l'instance le triplet (ax,ay,az)
Classe gérant une matrice de réel de dimension 3x3.
Definition Real3x3.h:66
Real3 z
premier élément du triplet
Definition Real3x3.h:119
Real3 y
premier élément du triplet
Definition Real3x3.h:118
Real3 x
premier élément du triplet
Definition Real3x3.h:117
Real2 operator*(Real sca, const Real2Proxy &vec)
Multiplication par un scalaire.
Definition Real2Proxy.h:241
bool operator<(const Item &item1, const Item &item2)
Compare deux entités.
Definition Item.h:533
Real2 operator/(const Real2Proxy &vec, Real sca)
Division par un scalaire.
Definition Real2Proxy.h:263