TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Assembleur_P_DG.cpp
1/****************************************************************************
2* Copyright (c) 2025, 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* Copyright (c) 2025, CEA
17* All rights reserved.
18*
19* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
20* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
21* 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.
22* 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.
23*
24* 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.
25* 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;
26* 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.
27*
28*****************************************************************************/
29
30#include <Neumann_sortie_libre.h>
31#include <Assembleur_P_DG.h>
32#include <Domaine_Cl_DG.h>
33#include <Champ_Elem_DG.h>
34#include <Matrice_Diagonale.h>
35#include <Matrice_Morse_Sym.h>
36#include <Matrice_Bloc_Sym.h>
37#include <Static_Int_Lists.h>
38#include <Domaine_DG.h>
39#include <TRUSTTab_parts.h>
40#include <Operateur_Grad.h>
41#include <Matrix_tools.h>
42#include <Milieu_base.h>
43#include <Array_tools.h>
44#include <Dirichlet.h>
45#include <Debog.h>
46#include <Perf_counters.h>
47#include <BasisFunction.h>
48#include <Navier_Stokes_std.h>
49
50Implemente_instanciable(Assembleur_P_DG,"Assembleur_P_DG",Assembleur_base);
51
52Sortie& Assembleur_P_DG::printOn(Sortie& s) const { return s << que_suis_je() << " " << le_nom(); }
53
55
57{
58 DoubleVect rien;
59 return assembler_mat(la_matrice, rien, 1, 1);
60}
61
63{
64 abort();
65 return 0;
66}
67
68/**
69 * @brief Core routine that builds the SIP pressure Laplacian matrix.
70 *
71 * @details The assembly follows the same three-term SIP structure as Op_Diff_DG_Elem
72 * but with unit diffusivity (no nu weighting) and acting on the pressure unknown only.
73 * It proceeds in three stages:
74 *
75 * **1. Sparsity pattern construction**
76 * tab1 (row pointers) and tab2 (column indices) are filled in two passes using the
77 * pre-computed sorted face-neighbour stencil, yielding a pressure x pressure matrix
78 * of size size_p x size_p where each element block couples to all its face-neighbours.
79 *
80 * **2. Volume stiffness term**
81 * For each element:
82 * mat(i, j) += integral of grad(phi_i).grad(phi_j)
83 *
84 * **3. Internal face SIP terms**
85 * For each internal face shared by elem0 and elem1:
86 * - *Penalty term*: (eta_F/h_T) * integral of phi_i * phi_j, added to the diagonal
87 * blocks and subtracted from the off-diagonal (cross-element) blocks.
88 * - *Consistency + symmetry terms*: 0.5 * integral of grad(phi_i).n * phi_j,
89 * assembled into all four block combinations with signs ensuring global symmetry.
90 *
91 * **4. Boundary face SIP terms** (Dirichlet faces: fcl flag 6 or 7)
92 * The same penalty and consistency terms are applied to the single adjacent element,
93 * weakly enforcing the Dirichlet pressure condition in the SIP sense.
94 *
95 * @param la_matrice The output matrix (typed as Matrice_Morse).
96 * @param diag Unused diagonal coefficient vector (kept for interface compatibility).
97 * @param incr_pression If 1, the solver works on pressure increments.
98 * @param resoudre_en_u If 1, the solver works in velocity units.
99 * @return Always 1.
100 */
101int Assembleur_P_DG::assembler_mat(Matrice& la_matrice, const DoubleVect& diag, int incr_pression, int resoudre_en_u)
102{
103 set_resoudre_increment_pression(incr_pression);
104 set_resoudre_en_u(resoudre_en_u);
105 Cerr << "[DG] Starting the pressure matrix assembly ... ";
106 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
107 la_matrice.typer("Matrice_Morse");
108 Matrice_Morse& mat = ref_cast(Matrice_Morse, la_matrice.valeur());
109
110 const Domaine_DG& domaine = ref_cast(Domaine_DG, le_dom_dg_.valeur());
111 const Champ_Elem_DG& ch = ref_cast(Champ_Elem_DG, ref_cast(Navier_Stokes_std, equation()).pression());
112
113 int nordre = Option_DG::Get_order_for("pression");
114
115 const BasisFunction& bfunc = domaine.get_basisFunction(nordre);
116 const int nb_basis_func = bfunc.nb_bfunc();
117
118 const IntTab& indices_glob_elem = bfunc.indices_glob_elem();
119
120 int nb_elem_tot = le_dom_dg_->nb_elem_tot();
121 int size_inc = indices_glob_elem(nb_elem_tot);
122
123 const Stencil& stencil_sorted = domaine.get_stencil_sorted();
124 const int nb_stencil_max = stencil_sorted.dimension(1);
125
126 mat.dimensionner(size_inc, size_inc, 0);
127 auto& tab1 = mat.get_set_tab1();
128 auto& tab2 = mat.get_set_tab2();
129
130 int nb_indices_line;
131 int row, col, indice;
132
133 tab1(0) = 1;
134 for (int nelem = 0; nelem < nb_elem_tot; nelem++)
135 {
136 nb_indices_line = 0;
137 for (int k = 0; k < nb_stencil_max; k++)
138 {
139 if (stencil_sorted(nelem, k) < 0)
140 break;
141 nb_indices_line += nb_basis_func;
142 }
143 for (int k = 0; k < nb_basis_func; k++)
144 tab1(indices_glob_elem(nelem) + k + 1) = nb_indices_line + tab1(indices_glob_elem(nelem) + k);
145 }
146
147 mat.dimensionner(size_inc, tab1(size_inc) - 1);
148
149 for (int nelem = 0; nelem < nb_elem_tot; nelem++)
150 {
151 row = tab1[indices_glob_elem(nelem)] - 1;
152 nb_indices_line = tab1[indices_glob_elem(nelem) + 1] - tab1[indices_glob_elem(nelem)];
153 indice = 0;
154 for (int k = 0; k < nb_stencil_max; k++)
155 {
156 if (stencil_sorted(nelem,k) < 0) break;
157 col = indices_glob_elem(stencil_sorted(nelem,k))+1;
158 for (int j=0; j<nb_basis_func; j++)
159 for (int i=0; i<nb_basis_func; i++)
160 tab2[row+indice+j+nb_indices_line*i] = col+j;
161 indice += nb_basis_func;
162 }
163 }
164 mat.sort_stencil();
165
166 const DoubleTab& eta_F = bfunc.get_eta_facet(); // Compute the penalisation coefficient
167
168 const int quad_order = bfunc.get_default_quadrature_order();
169 const Quadrature_base& quad = domaine.get_quadrature(quad_order);
170 int nb_pts_integ_max = quad.nb_pts_integ_max();
171 double coeff;
172
173 DoubleTab grad_fbase_elem(nb_basis_func, nb_pts_integ_max, Objet_U::dimension);
174 DoubleTab divergence(nb_pts_integ_max);
175
176 for (int e = 0; e < le_dom_dg_->nb_elem(); e++)
177 {
178 bfunc.eval_grad_bfunc(quad, e, grad_fbase_elem);
179 int ind_elem = indices_glob_elem(e);
180 for (int i = 0; i < nb_basis_func; i++)
181 for (int j = 0; j < nb_basis_func; j++)
182 {
183 divergence = 0.;
184 for (int k = 0; k < quad.nb_pts_integ(e) ; k++)
185 for (int d=0; d<Objet_U::dimension; d++)
186 divergence(k) += grad_fbase_elem(i,k,d) * grad_fbase_elem(j,k,d);
187
188 coeff = quad.compute_integral_on_elem(e, divergence);
189 mat(ind_elem+i, ind_elem+j) += coeff;
190 }
191 }
192
193 int nb_pts_int_fac = quad.nb_pts_integ_facets();
194 const IntTab& face_voisins = domaine.face_voisins();
195
196 int premiere_face_int = domaine.premiere_face_int();
197 const DoubleTab& face_normales = domaine.face_normales();
198
199 int elem0, elem1;
200
201 DoubleTab product(nb_pts_int_fac);
202 DoubleTab scalar_product(nb_pts_int_fac);
203
204 DoubleTab fbase0(nb_basis_func, nb_pts_int_fac);
205 DoubleTab fbase1(nb_basis_func, nb_pts_int_fac);
206
207 DoubleTab grad_fbase0(nb_basis_func, nb_pts_int_fac, Objet_U::dimension);
208 DoubleTab grad_fbase1(nb_basis_func, nb_pts_int_fac, Objet_U::dimension);
209
210 for (int f = premiere_face_int; f < domaine.nb_faces(); f++)
211 {
212
213 elem0 = face_voisins(f, 0);
214 elem1 = face_voisins(f, 1);
215
216 int ind_elem0 = indices_glob_elem(elem0);
217 int ind_elem1 = indices_glob_elem(elem1);
218
219 double sur_f = domaine.face_surfaces(f);
220
221 double h_T = sqrt(std::min(domaine.carre_pas_maille(elem0), domaine.carre_pas_maille(elem1))); // TODO possibilite de prendre moyenne harmonique (stabilite)
222 double invh_T = 1. / h_T;
223
224 //*****************//
225 // penalizing term //
226 //*****************//
227 for (int i_elem = 0; i_elem < 2; i_elem++)
228 {
229 int elem = face_voisins(f, i_elem);
230 int ind_elem = indices_glob_elem(elem);
231
232 bfunc.eval_bfunc_on_facets(quad, elem, f, fbase0);
233
234 for (int i = 0; i < nb_basis_func; i++)
235 for (int j = 0; j < nb_basis_func; j++)
236 {
237 for (int k = 0; k < nb_pts_int_fac; k++)
238 product(k) = fbase0(i, k) * fbase0(j, k); // TODO DG kronecker ?
239
240 coeff = eta_F(f) * invh_T * quad.compute_integral_on_facet(f, product);
241 mat(ind_elem + i, ind_elem + j) += coeff;
242 }
243 }
244
245 // crossed_term
246 bfunc.eval_bfunc_on_facets(quad, elem0, f, fbase0);
247 bfunc.eval_bfunc_on_facets(quad, elem1, f, fbase1);
248
249 for (int i = 0; i < nb_basis_func; i++)
250 for (int j = 0; j < nb_basis_func; j++)
251 {
252 for (int k = 0; k < nb_pts_int_fac; k++)
253 product(k) = fbase0(i, k) * fbase1(j, k);
254
255 double integral = quad.compute_integral_on_facet(f, product);
256 coeff = eta_F(f) * invh_T *integral;
257 mat(ind_elem0 + i, ind_elem1 + j) -= coeff;
258 mat(ind_elem1 + j, ind_elem0 + i) -= coeff; //symmetry
259 }
260
261 //****************//
262 // symmetric term //
263 //****************//
264 bfunc.eval_grad_bfunc_on_facets(quad, elem0, f, grad_fbase0);
265 bfunc.eval_grad_bfunc_on_facets(quad, elem1, f, grad_fbase1);
266
267 for (int i = 0; i < nb_basis_func; i++)
268 {
269 scalar_product = 0.;
270 for (int k = 0; k < nb_pts_int_fac; k++)
271 for (int d = 0; d < Objet_U::dimension; d++)
272 scalar_product(k) += face_normales(f, d) / sur_f * grad_fbase0(i, k, d);
273
274 for (int j = 0; j < nb_basis_func; j++)
275 {
276 for (int k = 0; k < nb_pts_int_fac; k++)
277 product(k) = scalar_product(k) * fbase0(j, k);
278 double integral = quad.compute_integral_on_facet(f, product);
279
280 mat(ind_elem0 + i, ind_elem0 + j) -= 0.5 *integral;
281 mat(ind_elem0 + j, ind_elem0 + i) -= 0.5 *integral; //symmetry
282 }
283
284 for (int j = 0; j < nb_basis_func; j++)
285 {
286 for (int k = 0; k < nb_pts_int_fac; k++)
287 product(k) = scalar_product(k) * fbase1(j, k);
288 double integral = quad.compute_integral_on_facet(f, product);
289
290 mat(ind_elem0 + i, ind_elem1 + j) += 0.5 *integral;
291 mat(ind_elem1 + j, ind_elem0 + i) += 0.5 *integral; //symmetry
292
293 }
294
295 scalar_product = 0.;
296 for (int k = 0; k < nb_pts_int_fac; k++)
297 for (int d = 0; d < Objet_U::dimension; d++)
298 scalar_product(k) += face_normales(f, d) / sur_f * grad_fbase1(i, k, d);
299
300 for (int j = 0; j < nb_basis_func; j++)
301 {
302 for (int k = 0; k < nb_pts_int_fac; k++)
303 product(k) = scalar_product(k) * fbase1(j, k);
304 double integral = quad.compute_integral_on_facet(f, product);
305 mat(ind_elem1 + i, ind_elem1 + j) += 0.5 *integral;
306 mat(ind_elem1 + j, ind_elem1 + i) += 0.5 *integral; //symmetry
307 }
308
309 for (int j = 0; j < nb_basis_func; j++)
310 {
311 for (int k = 0; k < nb_pts_int_fac; k++)
312 product(k) = scalar_product(k) * fbase0(j, k);
313 double integral = quad.compute_integral_on_facet(f, product);
314
315 mat(ind_elem1 + i, ind_elem0 + j) -= 0.5 *integral;
316 mat(ind_elem0 + j, ind_elem1 + i) -= 0.5 *integral; //symmetry
317
318 }
319 }
320 }
321
322 for (int f = 0; f < premiere_face_int; f++) // For the boundary
323 {
324
325 if ((ch.fcl()(f, 0)==6)||(ch.fcl()(f, 0)==7))
326 {
327 int elem = face_voisins(f, 0); // The cell that have one facet on the boundary
328 int ind_elem = indices_glob_elem(elem);
329
330 bfunc.eval_bfunc_on_facets(quad, elem, f, fbase0);
331 bfunc.eval_grad_bfunc_on_facets(quad, elem, f, grad_fbase0);
332
333 double h_T = sqrt(domaine.carre_pas_maille(elem));
334 double invh_T = 1. / h_T; //TODO regarder penalisation remplacer h_T par h_F
335 double sur_f = domaine.face_surfaces(f);
336
337 for (int i = 0; i < nb_basis_func; i++)
338 {
339 scalar_product = 0.;
340 for (int k = 0; k < nb_pts_int_fac; k++)
341 for (int d = 0; d < Objet_U::dimension; d++)
342 scalar_product(k) += face_normales(f, d) / sur_f * grad_fbase0(i, k, d);
343
344 for (int j = 0; j < nb_basis_func; j++)
345 {
346 for (int k = 0; k < nb_pts_int_fac; k++)
347 product(k) = fbase0(i, k) * fbase0(j, k); // TODO DG kronecker ?
348
349 coeff = eta_F(f) * invh_T * quad.compute_integral_on_facet(f, product);
350 mat(ind_elem + i, ind_elem + j) += coeff;
351
352 for (int k = 0; k < nb_pts_int_fac; k++)
353 product(k) = scalar_product(k) * fbase0(j, k);
354
355 double integral = quad.compute_integral_on_facet(f, product);
356 mat(ind_elem + i, ind_elem + j) -= integral;
357 mat(ind_elem + j, ind_elem + i) -= integral;
358 }
359 }
360 }
361 }
362
363
364 Cerr << statistics().get_time_since_last_open(STD_COUNTERS::matrix_assembly) << " s" << finl;
365 statistics().end_count(STD_COUNTERS::matrix_assembly);
366 return 1;
367}
368
369/*! @brief Assemble la matrice de pression pour un fluide quasi compressible laplacein(P) est remplace par div(grad(P)/rho).
370 *
371 * @param (DoubleTab& tab_rho) mass volumique Valeurs par dDGaut:
372 * @return (int) renvoie toujours 1
373 * @throws DGfets de bord:
374 */
375int Assembleur_P_DG::assembler_QC(const DoubleTab& tab_rho, Matrice& matrice)
376{
377 Cerr << "[DG] Starting the pressure matrix assembly for Quasi Compressible" << finl;
378 assembler(matrice);
381 abort();
382 Matrice_Bloc& matrice_bloc = ref_cast(Matrice_Bloc, matrice.valeur());
383 Matrice_Morse_Sym& la_matrice = ref_cast(Matrice_Morse_Sym, matrice_bloc.get_bloc(0, 0).valeur());
384 if ((la_matrice.get_est_definie() != 1) && (1))
385 {
386 Cerr << "[DG] No imposed pressure --> P(0)=0" << finl;
387// if (je_suis_maitre())
388// la_matrice(0, 0) *= 2; //TODO dg a adapter
389 la_matrice.set_est_definie(1);
390 }
391
392 Cerr << "[DG] End of pressure matrix assembly" << finl;
393 return 1;
394}
395
397{
398 return 1;
399}
400
401/**
402 * @brief Removes the arbitrary pressure constant by pinning the minimum pressure to zero.
403 *
404 * @details When no Dirichlet pressure reference is imposed (has_P_ref == 0), the
405 * pressure field is defined only up to a constant. This method makes the solution
406 * unique by subtracting the global minimum pressure value (computed consistently
407 * across MPI processes via mp_min) from all elements, then exchanges ghost values.
408 * If a pressure reference is already set (has_P_ref == 1), the method is a no-op.
409 *
410 * @param pression The pressure field to modify in-place.
411 * @return Always 1.
412 */
414{
415 // Projection :
416 double press_0;
417 if(!has_P_ref)
418 {
419 // On prend la pression minimale comme pression de reference
420 // afin d'avoir la meme pression de reference en sequentiel et parallele
421 press_0=DMAXFLOAT;
422 int nb_elem=le_dom_dg_->domaine().nb_elem();
423 for(int n=0; n<nb_elem; n++)
424 if (pression(n,0) < press_0)
425 press_0 = pression(n,0);
426 press_0 = mp_min(press_0);
427 for(int n=0; n<nb_elem; n++)
428 pression(n,0) -=press_0;
429 pression.echange_espace_virtuel();
430 }
431 return 1;
432}
433
435{
436 return le_dom_dg_.valeur();
437}
438
440{
441 return le_dom_Cl_dg_.valeur();
442}
443
445{
446 le_dom_dg_ = ref_cast(Domaine_DG, le_dom_dis);
447}
448
450{
451 le_dom_Cl_dg_ = ref_cast(Domaine_Cl_DG, le_dom_Cl_dis);
452}
453
455{
456 mon_equation = Eqn;
457 stencil_done = 0;
458}
Assembles the pressure Laplacian matrix for the DG incompressible Navier-Stokes solver.
void associer_domaine_dis_base(const Domaine_dis_base &) override
int assembler_mat(Matrice &, const DoubleVect &, int incr_pression, int resoudre_en_u) override
Core routine that builds the SIP pressure Laplacian matrix.
const Domaine_Cl_dis_base & domaine_Cl_dis_base() const override
int modifier_secmem(DoubleTab &) override
const Equation_base & equation() const
void completer(const Equation_base &) override
int modifier_solution(DoubleTab &) override
Removes the arbitrary pressure constant by pinning the minimum pressure to zero.
const Domaine_dis_base & domaine_dis_base() const override
int assembler_QC(const DoubleTab &, Matrice &) override
Assemble la matrice de pression pour un fluide quasi compressible laplacein(P) est remplace par div(g...
int assembler(Matrice &) override
void associer_domaine_cl_dis_base(const Domaine_Cl_dis_base &) override
int assembler_rho_variable(Matrice &, const Champ_Don_base &rho) override
Assemblage de la matrice div( porosite/rho * grad P ) Le type du champ "rho" a fournir depend de la d...
int set_resoudre_en_u(int flag)
Definit la valeur du drapeau resoudre_en_u__.
int set_resoudre_increment_pression(int flag)
Definit la valeur du drapeau resoudre_increment_pression_.
Manages the local polynomial basis functions for Discontinuous Galerkin elements.
void eval_grad_bfunc(const Quadrature_base &quad, const int &nelem, DoubleTab &fbasis) const
Evaluates the gradients of all basis functions at the element quadrature points.
void eval_grad_bfunc_on_facets(const Quadrature_base &quad, const int &nelem, const int &num_face, DoubleTab &grad_fbasis) const
Evaluates the gradients of all basis functions of element nelem at the quadrature points of face num_...
void eval_bfunc_on_facets(const Quadrature_base &quad, const int &nelem, const int &num_face, DoubleTab &grad_fbasis) const
Evaluates all basis functions of element nelem at the quadrature points of face num_face.
const IntTab & indices_glob_elem(const int dim=1) const
const DoubleTab & get_eta_facet() const
const int & nb_bfunc() const
const int & get_default_quadrature_order() const
classe Champ_Don_base classe de base des Champs donnes (non calcules)
const IntTab & fcl() const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Matrice & get_bloc(int i, int j) const
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
auto & get_set_tab2()
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
auto & get_set_tab1()
void set_est_definie(int)
int get_est_definie() const
Classe Matrice Classe generique de la hierarchie des matrices.
Definition Matrice.h:34
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
static int dimension
Definition Objet_U.h:99
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Objet_U.cpp:319
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static int Get_order_for(const Nom &n)
Definition Option_DG.cpp:70
static double mp_min(double)
Definition Process.cpp:386
static void abort()
Routine de sortie de Trio-U sur une erreur abort().
Definition Process.cpp:570
int nb_pts_integ(int e) const
double compute_integral_on_facet(int num_facet, Parser_U &parser) const
int nb_pts_integ_max() const
double compute_integral_on_elem(int num_elem, Parser_U &parser) const
int nb_pts_integ_facets() const
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133