TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Matrice_Base.h
1/****************************************************************************
2* Copyright (c) 2026, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#ifndef Matrice_Base_included
17#define Matrice_Base_included
18
19#include <TRUSTTab.h>
20#include <Matrix_tools.h>
21
22/*! @brief Classe Matrice_Base Classe de base de la hierarchie des matrices.
23 *
24 * Cette classe definie l'interface generique d'une matrice telle
25 * qu'elle est utilisee dans Trio-U. En consequence elle n'est pas
26 * instanciable. Toutes les types de matrices devront deriver de cette
27 * classe de base et implementer ses methodes abstraites.
28 *
29 * Dans les commentaires des methodes A represente un objet Matrice_base.
30 *
31 * @sa Classe abstraite, Methodes abstraites:, DoubleVect& multvect_(const DoubleVect&, DoubleVect& ) const, int ordre() const
32 */
33
34class Matrice_Base : public Objet_U
35{
36
37 Declare_base(Matrice_Base);
38
39public :
40 /// If square matrix, returns number of lines, otherwise 0
41 virtual int ordre() const=0;
42 /// Return local number of lines (=size on the current proc)
43 virtual int nb_lignes() const=0;
44 /// Return local number of columns (=size on the current proc)
45 virtual int nb_colonnes() const=0;
46
47 // Methodes pour le calcul de r+=Ax codees dans les classes filles
48 virtual DoubleVect& ajouter_multvect_(const DoubleVect& x, DoubleVect& r) const =0;
49 virtual DoubleVect& ajouter_multvectT_(const DoubleVect& x, DoubleVect& r) const =0;
50 virtual DoubleTab& ajouter_multTab_(const DoubleTab& x, DoubleTab& r) const =0;
51 // Methodes pour le calcul de r+=Ax avec echange_espace_virtuel() codees dans Matrice_Base
52 virtual inline DoubleVect& ajouter_multvect(const DoubleVect& x, DoubleVect& r) const;
53 virtual inline DoubleVect& ajouter_multvectT(const DoubleVect& x, DoubleVect& r) const;
54 virtual inline DoubleTab& ajouter_multTab(const DoubleTab& , DoubleTab& r) const;
55 // Methodes pour le calcul de r=Ax codees dans Matrice_Base
56 virtual inline DoubleVect& multvect_(const DoubleVect&, DoubleVect& ) const;
57 virtual inline DoubleVect& multvect(const DoubleVect&, DoubleVect& ) const;
58 virtual inline DoubleVect& multvectT_(const DoubleVect&, DoubleVect& ) const;
59 virtual inline DoubleVect& multvectT(const DoubleVect&, DoubleVect& ) const;
60 virtual inline DoubleTab& multTab(const DoubleTab& , DoubleTab& r) const;
61 // Methodes d'impression d'une matrice
62 virtual inline Sortie& imprimer(Sortie&) const;
63 virtual inline Sortie& imprimer_formatte(Sortie& s) const;
64
65 friend DoubleVect operator*(const Matrice_Base&, const DoubleVect&);
66
67 virtual void scale(const double x) =0;
68
69 // Mise a zero des valeurs de la matrice
70 virtual void clean() { Process::exit("Matrice_base::clean() not implemented.");};
71
72 virtual void get_stencil(Stencil& stencil) const;
73
74 virtual void get_symmetric_stencil(Stencil& stencil) const;
75
76 virtual void get_stencil_and_coefficients(Stencil& stencil, StencilCoeffs& coefficients) const;
77 virtual void get_stencil_and_coeff_ptrs(Stencil& stencil, std::vector<const double *>& coeff_ptr) const;
78
79 virtual void get_symmetric_stencil_and_coefficients(Stencil& stencil, StencilCoeffs& coefficients) const;
80
81 int get_stencil_size() const ;
82 virtual void build_stencil();
83
84 void set_stencil( const Stencil& stencil );
85
86 bool is_stencil_up_to_date() const ;
87
88protected:
90 Stencil stencil_ ;
91};
92
93
94
95/*! @brief Multiplication d'un vecteur par la matrice.
96 *
97 * Operation: r = A*x
98 *
99 * @param (DoubleVect& x) le vecteur a multiplier
100 * @param (DoubleVect& r) le vecteur resultat de l'operation
101 * @return (DoubleVect&) le vecteur resultat de l'operation
102 */
103inline DoubleVect& Matrice_Base::
104multvect(const DoubleVect& x, DoubleVect& r) const
105{
106 multvect_(x,r);
108 return r;
109}
110
111inline DoubleVect& Matrice_Base::
112multvect_(const DoubleVect& x, DoubleVect& r) const
113{
114 r=0;
116 return r;
117}
118
119/*! @brief Multiplication d'un vecteur par la matrice transposee.
120 *
121 * Operation: r = AT*x
122 *
123 * @param (DoubleVect& x) le vecteur a multiplier
124 * @param (DoubleVect& r) le vecteur resultat de l'operation
125 * @return (DoubleVect&) le vecteur resultat de l'operation
126 */
127inline DoubleVect& Matrice_Base::
128multvectT(const DoubleVect& x, DoubleVect& r) const
129{
130 multvectT_(x,r);
132 return r;
133}
134
135inline DoubleVect& Matrice_Base::
136multvectT_(const DoubleVect& x, DoubleVect& r) const
137{
138 r=0;
140 return r;
141}
142
143/*! @brief NON CODE Multiplication d'une matrice representee par un tableau par la matrice.
144 *
145 * Operation: R = A*X
146 *
147 * @param (DoubleTab&) la matrice a multiplier
148 * @param (DoubleTab& r) la matrice resultat de l'operation
149 * @return (DoubleTab&) la matrice resultat de l'operation
150 * @throws NON CODE
151 */
152inline DoubleTab& Matrice_Base::
153multTab(const DoubleTab& x, DoubleTab& r) const
154{
155 r=0;
156 ajouter_multTab_(x,r);
158 return r;
159}
160
161
162/*! @brief Operation de multiplication-accumulation (saxpy) matrice vecteur.
163 *
164 * Operation: r = r + A*x
165 *
166 * @param (DoubleVect& x) le vecteur a multiplier
167 * @param (DoubleVect& r) le vecteur resultat de l'operation
168 * @return (DoubleVect&) le vecteur resultat de l'operation
169 */
170inline DoubleVect& Matrice_Base::
171ajouter_multvect(const DoubleVect& x, DoubleVect& r) const
172{
175 return r;
176}
177
178/*! @brief Operation de multiplication-accumulation (saxpy) matrice vecteur.
179 *
180 * Operation: r = r + A*x
181 *
182 * @param (DoubleVect& x) le vecteur a multiplier
183 * @param (DoubleVect& r) le vecteur resultat de l'operation
184 * @return (DoubleVect&) le vecteur resultat de l'operation
185 */
186inline DoubleVect& Matrice_Base::
187ajouter_multvectT(const DoubleVect& x, DoubleVect& r) const
188{
191 return r;
192}
193
194/*! @brief NON CODE Operation de multiplication-accumulation (saxpy) matrice matrice
195 *
196 * (matrice represente par un tableau)
197 * Operation: R = R + A*X
198 *
199 * @param (DoubleTab&) la matrice a multiplier
200 * @param (DoubleTab& r) la matrice resultat de l'operation
201 * @return (DoubleTab&) la matrice resultat de l'operation
202 * @throws NON CODE
203 */
204inline DoubleTab& Matrice_Base::
205ajouter_multTab(const DoubleTab& x, DoubleTab& r) const
206{
207 ajouter_multTab_(x,r);
209 return r;
210}
211
212
213/*! @brief Fonction (hors classe) amie de la classe Matrice_Base.
214 *
215 * Operateur de multiplication: renvoie (A*vect)
216 *
217 * @param (Matrice_Base& A) la matrice multiplicatrice
218 * @param (DoubleVect& vect) le vecteur a multiplier
219 * @return (DoubleVect) le vecteur resultat de l'operation
220 */
221DoubleVect operator * (const Matrice_Base& A, const DoubleVect& vect);
222
223
225{
226 return os<<*this;
227}
228
230{
231 return os<<*this;
232}
233
234#endif
Classe Matrice_Base Classe de base de la hierarchie des matrices.
int get_stencil_size() const
virtual DoubleTab & ajouter_multTab(const DoubleTab &, DoubleTab &r) const
NON CODE Operation de multiplication-accumulation (saxpy) matrice matrice.
void set_stencil(const Stencil &stencil)
virtual void get_symmetric_stencil(Stencil &stencil) const
virtual DoubleVect & multvectT(const DoubleVect &, DoubleVect &) const
Multiplication d'un vecteur par la matrice transposee.
virtual DoubleVect & ajouter_multvectT(const DoubleVect &x, DoubleVect &r) const
Operation de multiplication-accumulation (saxpy) matrice vecteur.
virtual void get_stencil(Stencil &stencil) const
bool is_stencil_up_to_date_
virtual DoubleVect & multvect_(const DoubleVect &, DoubleVect &) const
virtual DoubleVect & ajouter_multvect_(const DoubleVect &x, DoubleVect &r) const =0
virtual DoubleTab & ajouter_multTab_(const DoubleTab &x, DoubleTab &r) const =0
friend DoubleVect operator*(const Matrice_Base &, const DoubleVect &)
Fonction (hors classe) amie de la classe Matrice_Base.
virtual int nb_lignes() const =0
Return local number of lines (=size on the current proc).
virtual int nb_colonnes() const =0
Return local number of columns (=size on the current proc).
virtual DoubleVect & multvectT_(const DoubleVect &, DoubleVect &) const
virtual DoubleVect & multvect(const DoubleVect &, DoubleVect &) const
Multiplication d'un vecteur par la matrice.
Stencil stencil_
virtual void get_symmetric_stencil_and_coefficients(Stencil &stencil, StencilCoeffs &coefficients) const
virtual void get_stencil_and_coeff_ptrs(Stencil &stencil, std::vector< const double * > &coeff_ptr) const
virtual void get_stencil_and_coefficients(Stencil &stencil, StencilCoeffs &coefficients) const
virtual int ordre() const =0
If square matrix, returns number of lines, otherwise 0.
virtual void build_stencil()
virtual DoubleTab & multTab(const DoubleTab &, DoubleTab &r) const
NON CODE Multiplication d'une matrice representee par un tableau par la matrice.
virtual void scale(const double x)=0
virtual Sortie & imprimer_formatte(Sortie &s) const
virtual DoubleVect & ajouter_multvect(const DoubleVect &x, DoubleVect &r) const
Operation de multiplication-accumulation (saxpy) matrice vecteur.
virtual DoubleVect & ajouter_multvectT_(const DoubleVect &x, DoubleVect &r) const =0
virtual void clean()
virtual Sortie & imprimer(Sortie &) const
bool is_stencil_up_to_date() const
friend class Sortie
Definition Objet_U.h:75
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
Definition Objet_U.cpp:55
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")