TrioCFD 1.9.9_beta
TrioCFD documentation
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 possibility to use harmonic mean (stability)
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 review penalization: replace h_T by 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 Assembles the pressure matrix for a quasi-compressible fluid: laplacian(P) is replaced by div(grad(P)/rho).
370 *
371 * @param tab_rho The density field.
372 * @return Always 1.
373 */
374int Assembleur_P_DG::assembler_QC(const DoubleTab& tab_rho, Matrice& matrice)
375{
376 Cerr << "[DG] Starting the pressure matrix assembly for Quasi Compressible" << finl;
377 assembler(matrice);
380 abort();
381 Matrice_Bloc& matrice_bloc = ref_cast(Matrice_Bloc, matrice.valeur());
382 Matrice_Morse_Sym& la_matrice = ref_cast(Matrice_Morse_Sym, matrice_bloc.get_bloc(0, 0).valeur());
383 if ((la_matrice.get_est_definie() != 1) && (1))
384 {
385 Cerr << "[DG] No imposed pressure --> P(0)=0" << finl;
386// if (je_suis_maitre())
387// la_matrice(0, 0) *= 2; //TODO dg a adapter
388 la_matrice.set_est_definie(1);
389 }
390
391 Cerr << "[DG] End of pressure matrix assembly" << finl;
392 return 1;
393}
394
396{
397 return 1;
398}
399
400/**
401 * @brief Removes the arbitrary pressure constant by pinning the minimum pressure to zero.
402 *
403 * @details When no Dirichlet pressure reference is imposed (has_P_ref == 0), the
404 * pressure field is defined only up to a constant. This method makes the solution
405 * unique by subtracting the global minimum pressure value (computed consistently
406 * across MPI processes via mp_min) from all elements, then exchanges ghost values.
407 * If a pressure reference is already set (has_P_ref == 1), the method is a no-op.
408 *
409 * @param pression The pressure field to modify in-place.
410 * @return Always 1.
411 */
413{
414 // Projection :
415 double press_0;
416 if(!has_P_ref)
417 {
418 // Use the minimum pressure as the reference pressure
419 // to ensure the same pressure reference in sequential and parallel runs
420 press_0=DMAXFLOAT;
421 int nb_elem=le_dom_dg_->domaine().nb_elem();
422 for(int n=0; n<nb_elem; n++)
423 if (pression(n,0) < press_0)
424 press_0 = pression(n,0);
425 press_0 = mp_min(press_0);
426 for(int n=0; n<nb_elem; n++)
427 pression(n,0) -=press_0;
428 pression.echange_espace_virtuel();
429 }
430 return 1;
431}
432
434{
435 return le_dom_dg_.valeur();
436}
437
439{
440 return le_dom_Cl_dg_.valeur();
441}
442
444{
445 le_dom_dg_ = ref_cast(Domaine_DG, le_dom_dis);
446}
447
449{
450 le_dom_Cl_dg_ = ref_cast(Domaine_Cl_DG, le_dom_Cl_dis);
451}
452
454{
455 mon_equation = Eqn;
456 stencil_done = 0;
457}
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
Assembles the pressure matrix for a quasi-compressible fluid: laplacian(P) is replaced by div(grad(P)...
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
Assembly of the matrix div(porosity/rho * grad P) The type of the "rho" field to be provided depends ...
int set_resoudre_en_u(int flag)
Sets the value of the resoudre_en_u__ flag.
int set_resoudre_increment_pression(int flag)
Sets the value of the resoudre_increment_pression_ flag.
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
class Champ_Don_base base class of Given Fields (not calculated)
const IntTab & fcl() const
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
class Equation_base The role of an equation is the calculation of one or more fields....
virtual const Matrice & get_bloc(int i, int j) const
Matrice_Morse_Sym class - Represents a sparse symmetric matrix M stored in Morse format.
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
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
Matrice class - Generic class in the matrix hierarchy.
Definition Matrice.h:34
Navier_Stokes_std This class carries the terms of the momentum equation.
static int dimension
Definition Objet_U.h:94
const Nom & que_suis_je() const
Returns the string identifying the class.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
Definition Objet_U.cpp:289
virtual const Nom & le_nom() const
Returns the name of the Objet_U. Virtual method to override: returns "neant" in this implementation.
Definition Objet_U.cpp:317
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
static int Get_order_for(const Nom &n)
Definition Option_DG.cpp:70
static double mp_min(double)
Definition Process.cpp:391
static void abort()
Abort routine for TRUST on a fatal error.
Definition Process.cpp:573
int nb_pts_integ(int e) const
double compute_integral_on_facet(int num_facet, Parser_U &parser) const
Compute the integral of a function on each triangle with its value on integration points.
int nb_pts_integ_max() const
double compute_integral_on_elem(int num_elem, Parser_U &parser) const
Compute the integral of a function on one triangle.
int nb_pts_integ_facets() const
Base class for output streams.
Definition Sortie.h:52
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133