TrioCFD 1.9.9_beta
TrioCFD documentation
Loading...
Searching...
No Matches
Perte_Charge_Singuliere.cpp
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#include <Perte_Charge_Singuliere.h>
17#include <Motcle.h>
18#include <Domaine.h>
19#include <Domaine_VF.h>
20#include <Sous_Domaine.h>
21#include <Octree.h>
22#include <Source_base.h>
23#include <Param.h>
24#include <Equation_base.h>
25#include <Milieu_base.h>
26#include <Discretisation_base.h>
27#include <EChaine.h>
28#include <Pb_Multiphase.h>
29#include <TRUSTTrav.h>
30
31extern void convert_to(const char *s, double& ob);
32
33/*! @brief Reads the specifications of a singular pressure drop from an input stream.
34 *
35 * @param is an input stream
36 * @return the modified input stream
37 * @throws unexpected keyword, expected "KX","KY", "KZ" or "K"
38 */
39// XD perte_charge_singuliere source_base perte_charge_singuliere BRACE Source term that is used to model a pressure
40// XD_CONT loss over a surface area (transition through a grid, sudden enlargement) defined by the faces of elements
41// XD_CONT located on the intersection of a subzone named subzone_name and a X,Y, or Z plane located at X,Y or Z =
42// XD_CONT location.
43// XD attr dir chaine(into=["kx","ky","kz","K"]) dir REQ KX, KY or KZ designate directional pressure loss coefficients
44// XD_CONT for respectively X, Y or Z direction. Or in the case where you chose a target flow rate with regul. Use K for
45// XD_CONT isotropic pressure loss coefficient
46// XD attr coeff floattant coeff OPT Value (float) of friction coefficient (KX, KY, KZ).
47// XD attr regul bloc_lecture regul OPT option to have adjustable K with flowrate target NL2 { K0 valeur_initiale_de_k
48// XD_CONT deb debit_cible eps intervalle_variation_mutiplicatif}.
49// XD attr surface bloc_lecture surface REQ Three syntaxes are possible for the surface definition block: NL2 For VDF
50// XD_CONT and VEF: { X|Y|Z = location subzone_name } NL2 Only for VEF: { Surface surface_name }. NL2 For PolyMAC_CDO {
51// XD_CONT Surface surface_name Orientation champ_uniforme }
52
54{
55 regul_ = 1;
56 Nom obsolete(""), alpha_str(""), deb_str;
57 Param param("regul");
58 param.ajouter("K0", &K_, Param::REQUIRED);
59 param.ajouter("deb", &deb_str, Param::REQUIRED);
60 param.ajouter("eps", &obsolete);
61 param.ajouter("alpha", &alpha_str);
62 param.lire_avec_accolades(is);
63 if (obsolete != "")
64 {
65 Cerr << "Syntax error!" << finl;
66 Cerr << "The flow rate regulation formula has changed from:" << finl;
67 Cerr << "K_ *= min(max(|debit|/deb_cible)^2,(1-eps)^dt),(1+eps)^dt);" << finl;
68 Cerr << "to:" << finl;
69 Cerr << "K_ += dt*alpha*(debit-debit_cible);" << finl;
70 Cerr << "The keyword eps (value between 0 and 1) is no longer valid." << finl;
71 Cerr << "The amplitude of the flow rate regulation must be specified by the keyword alpha. If you had a non-zero value for eps, e.g. 0.5, replace with alpha 10" << finl;
72 Cerr << "and eps 0 must be replaced by alpha 0" << finl;
74 }
75 if (alpha_str=="") Process::exit("alpha must be specified for the regulation.");
76 deb_cible_.setNbVar(1), alpha_.setNbVar(1);
77 deb_cible_.setString(deb_str), alpha_.setString(alpha_str);
78 deb_cible_.addVar("t"), alpha_.addVar("t");
79 deb_cible_.parseString(), alpha_.parseString();
80 return is;
81}
82
84{
85 Motcle motlu;
86 Motcle acc_ouverte("{");
87 Motcles les_motcles(4);
88 les_motcles[0] = "KX";
89 les_motcles[1] = "KY";
90 les_motcles[2] = "KZ";
91 les_motcles[3] = "K";
92 regul_ = 0;
93 is >> motlu;
94 if (motlu != acc_ouverte)
95 {
96 Cerr << "We expected the keyword" << acc_ouverte << " instead of " << motlu << finl;
98 }
99 is >> motlu;
100 if (motlu != "dir")
101 {
102 Cerr << "We expected the keyword dir instead of " << motlu << finl;
104 }
105 else
106 {
107 is >> motlu;
108 int rang = les_motcles.search(motlu);
109 if (rang == -1)
110 {
111 Cerr << "Error while reading the data of Perte_Charge_Singuliere" << finl;
112 Cerr << "We expected one of the keywords " << les_motcles << finl;
113 Cerr << "instead of " << motlu << finl;
115 }
116 direction_perte_charge_ = rang == 3 ? -1 : rang;
117
118 }
119 is >> motlu;
120 if (motlu == "regul")
121 lire_regul(is);
122 else if (motlu == "coeff")
123 {
124 is >> motlu;
125 convert_to(motlu.getChar(), K_);
126 }
127 else
128 {
129 Cerr << "We expected the keyword coeff or regul instead of " << motlu << finl;
131 }
132
133 Cerr << " direction_perte_charge_ " << direction_perte_charge_ << finl;
134 Cerr << " pressure drop K_ " << K_ << finl;
135
136 return is;
137}
138
139void Perte_Charge_Singuliere::lire_surfaces(Entree& is, const Domaine& le_domaine,
140 const Domaine_dis_base& domaine_dis, IntVect& les_faces, IntVect& sgn, int lire_derniere_accolade)
141{
142 const Domaine_VF& zvf = ref_cast(Domaine_VF,domaine_dis);
143 const IntTab& elem_faces = zvf.elem_faces();
144 const DoubleTab& xv = zvf.xv();
145 int nfe = zvf.domaine().nb_faces_elem();
146 IntTab face_tab; //1 for faces in the surface
147 zvf.creer_tableau_faces(face_tab);
148 OWN_PTR(Champ_Don_base) orientation;
149
150 int algo=-1;
151 Motcle method;
152
153 Motcle motlu;
154 Motcle acc_ouverte("{");
155 Motcle acc_fermee("}");
156
157 Nom nom_ss_domaine, nom_surface;
158 double position;
159
160 /* Read plan */
161 is >> motlu;
162 if (motlu != "surface")
163 {
164 Cerr << "We expected the keyword surface instead of " << motlu << finl;
166 }
167 is >> motlu;
168 if (motlu != acc_ouverte)
169 {
170 Cerr << "We expected the keyword" << acc_ouverte << " instead of " << motlu << finl;
172 }
173 is >> method;
174 if (method=="X" || method=="Y" || method=="Z")
175 {
176 /* Subdomaine algorithm */
177 algo=0;
178 Nom direction=method, egal;
179 if (direction_perte_charge() >= 0 && (((direction=="X") && (direction_perte_charge()!=0))
180 || ((direction=="Y") && (direction_perte_charge()!=1))
181 || ((direction=="Z") && (direction_perte_charge()!=2))))
182 {
183 Nom dir,sect;
184 if (direction_perte_charge() == 0)
185 {
186 dir="KX";
187 sect="X";
188 }
189 else if (direction_perte_charge() == 1)
190 {
191 dir="KY";
192 sect="Y";
193 }
194 else if (direction_perte_charge() == 2)
195 {
196 dir="KZ";
197 sect="Z";
198 }
199 Cerr << "The section specified " << direction << " is not coherent with the coefficient pressure loss direction indicated by " << dir << finl;
200 Cerr << "Here the section to specify is " << sect << "." << finl;
202
203 }
204 is >> egal >> position;
205 is >> nom_ss_domaine;
206 Cerr << " position " << direction << " " << position << finl;
207 identifiant_ = nom_ss_domaine + "_" + direction + "=" + Nom(position);
208 }
209 else if (method=="Surface")
210 {
211 /* Surface algorithm */
212 algo=1;
213 /*
214 if (zvf.dimension!=3)
215 {
216 Cerr << "Error in Perte_Charge_Singuliere::lire_surfaces" << finl;
217 Cerr << "The keyword " << method << " specified for plan definition is only possible in 3D !" << finl;
218 Cerr << "You must used the method of intersection between subdomaine and location of plane." << finl;
219 Process::exit();
220 }
221 */
222 if (domaine_dis.que_suis_je().debute_par("Domaine_VDF"))
223 {
224 Cerr << "Error in Perte_Charge_Singuliere::lire_surfaces" << finl;
225 Cerr << "The keyword " << method << " specified for plan definition is only possible in VEF discretization !" << finl;
226 Cerr << "You must used the method of intersection between subdomaine and location of plane." << finl;
228 }
229 is >> nom_surface;
230 Cerr << " surface " << nom_surface << finl;
231 identifiant_ = nom_surface;
232 }
233 else if (method=="Face_group")
234 {
235 /* Surface algorithm */
236 algo=2;
237 is >> nom_surface;
238 Cerr << " surface " << nom_surface << finl;
239 identifiant_ = nom_surface;
240 }
241 else
242 {
243 Cerr << "Error in Perte_Charge_Singuliere::lire_surfaces" << finl;
244 Cerr << "The keyword " << method << " specified for plan definition is not coherent !" << finl;
246 }
247 is >> motlu;
248 if (motlu == "orientation") is >> orientation, is >> motlu; //read a field to orient the surface
249
250 if (motlu != acc_fermee)
251 {
252 Cerr << "We expected the keyword" << acc_fermee << " instead of " << motlu << finl;
254 }
255 if (lire_derniere_accolade)
256 {
257 is >> motlu;
258 if (motlu != acc_fermee)
259 {
260 Cerr << "We expected the keyword" << acc_fermee << " instead of " << motlu << finl;
262 }
263 }
264 /* Found faces */
265 int compteur=0;
266
267 if (algo==0)
268 {
269 /* Subdomaine algorithm */
270 const Sous_Domaine& ssz = le_domaine.ss_domaine(nom_ss_domaine);
271 int coord = method == "X" ? 0 : method == "Y" ? 1 : 2;
272 for (int poly=0; poly<ssz.nb_elem_tot(); poly++)
273 {
274 for (int j=0; j<nfe; j++)
275 {
276 int numfa = elem_faces(ssz(poly),j);
277 // numfa might be negative in case of polyhedron where number of faces for an elem varies (padding)
278 if (numfa >= 0 && est_egal(xv(numfa,coord),position) )
279 {
280 bool trouve=0;
281 for (int i=0; i<compteur; i++)
282 if (les_faces[i]==numfa)
283 {
284 trouve=1;
285 break;
286 }
287 if (trouve==0) les_faces[compteur++] = numfa, face_tab(numfa) = 1;
288 }
289 }
290 }
291 }
292
293 else if (algo==1)
294 {
295 /* Surface algorithm */
296 const Domaine& le_domaine2D = ref_cast(Domaine,le_domaine.interprete().objet(nom_surface));
297 const DoubleTab& coord_sommets_2D=le_domaine2D.coord_sommets();
298
299 DoubleTab xv2D;
300 le_domaine2D.calculer_centres_gravite(xv2D);
301 const int nb_elem_2D = le_domaine2D.nb_elem_tot();
302 int nse2D = le_domaine2D.nb_som_elem();
303
304 const DoubleTab& coord_sommets=le_domaine.coord_sommets();
305 const IntTab& face_sommets = zvf.face_sommets();
306 const OctreeRoot& octree_vol = le_domaine.construit_octree();
307
308 // Loop on faces on the surface domain
309 Cerr << " Surface " << nom_surface << " with " << nb_elem_2D << " faces" << finl;
310 for (int ind_face=0; ind_face<nb_elem_2D; ind_face++)
311 {
312 // Fill elem_list_vol by elements surrounding the center of gravity
313 ArrOfInt elem_list_vol;
314 double zv2d=0;
315 if (Objet_U::dimension>2)
316 zv2d=xv2D(ind_face,2);
317 octree_vol.rang_elems_sommet(elem_list_vol,xv2D(ind_face,0),xv2D(ind_face,1),zv2d);
318 int nb_elem_vol = elem_list_vol.size_array();
319 // Loop on elements on the volume domain
320 for (int ind_elem=0; ind_elem<nb_elem_vol; ind_elem++)
321 {
322 int elem = elem_list_vol[ind_elem];
323 // Loop on faces of each element on the volume domain
324 for (int j=0, numfa; j < nfe && (numfa = elem_faces(elem,j)) >= 0; j++)
325 {
326 // Test if the same face between surface domain and volum domain
327 int coincide=0;
328 // Loop on vertex of each face of each element on the volume domain
329
330 int nse_reel = 0;
331 for (int k = 0, numso; k < nse2D && (numso = face_sommets(numfa, k)) >= 0; k++)
332 {
333 nse_reel++;
334 double xcoord_vol=coord_sommets(numso,0);
335 double ycoord_vol=coord_sommets(numso,1);
336 //double zcoord_vol=coord_sommets(numso,2);
337 double zcoord_vol=0;
338 if (Objet_U::dimension>2)
339 zcoord_vol=coord_sommets(numso,2);
340
341 for (int i = 0, numso2D; i < nse2D && (numso2D = le_domaine2D.sommet_elem(ind_face, i)) >= 0; i++)
342 {
343 double xcoord_2D=coord_sommets_2D(numso2D,0);
344 double ycoord_2D=coord_sommets_2D(numso2D,1);
345 double zcoord_2D=0;
346 if (Objet_U::dimension>2)
347 zcoord_2D=coord_sommets_2D(numso2D,2);
348 if ( est_egal(xcoord_vol,xcoord_2D)
349 && est_egal(ycoord_vol,ycoord_2D)
350 && est_egal(zcoord_vol,zcoord_2D))
351 {
352 coincide=coincide+1;
353 break;
354 }
355 }
356 }
357 if (coincide == nse_reel)
358 {
359 bool trouve=0;
360 for (int i=0; i<compteur ; i++)
361 if (les_faces[i]==numfa)
362 {
363 trouve=1;
364 break;
365 }
366 if (trouve==0) les_faces[compteur++] = numfa, face_tab(numfa) = 1;
367 }
368 }
369 }
370 }
371 }
372 else if (algo==2)
373 {
374 const Groupe_Faces grp_faces = le_domaine.groupe_faces(nom_surface);
375 int nb_faces = grp_faces.nb_faces();
376 Cerr << "Face group " << nom_surface << " with " << nb_faces << " faces" << finl;
377 const ArrOfInt indice_faces = grp_faces.get_indices_faces();
378 for (int k=0; k < nb_faces; k++)
379 les_faces[k] = indice_faces[k], face_tab(indice_faces[k]) = 1;
380 compteur = nb_faces;
381 }
382
383 trustIdType faces_found=mp_somme_vect(face_tab);
384 if (faces_found==0)
385 {
386 Cerr << "Error in Perte_Charge_Singuliere::lire_surfaces" << finl;
387 Cerr << "No faces has been found !" << finl;
389 }
390 else
391 Cerr << " " << faces_found << " faces have been found for the section." << finl;
392
393 les_faces.resize(compteur);
394 if (orientation)
395 {
396 sgn.resize(compteur);
397 DoubleTrav xvf(compteur, Objet_U::dimension), ori(compteur, Objet_U::dimension);
398 for (int i = 0; i < compteur; i++)
399 for (int j = 0; j < Objet_U::dimension; j++) xvf(i, j) = xv(les_faces(i), j);
400 orientation->valeur_aux(xvf, ori);
401 for (int i = 0; i < compteur; i++)
402 {
403 double scal = 0;
404 for (int j = 0; j < Objet_U::dimension; j++) scal += ori(i, j) * zvf.face_normales(les_faces(i), j);
405 sgn(i) = (scal > 0 ? 1 : -1);
406 }
407 }
408}
409
410double Perte_Charge_Singuliere::calculate_Q(const Equation_base& eqn, const IntVect& num_faces, const IntVect& sgn) const
411{
412 if (sub_type(Pb_Multiphase, eqn.probleme()) && !ref_cast(Pb_Multiphase, eqn.probleme()).equation_masse().has_champ_conserve()) return 0;
413 const Domaine_VF& zvf = ref_cast(Domaine_VF, eqn.domaine_dis());
414 const DoubleTab& vit = eqn.inconnue().valeurs(),
415 &fac = sub_type(Pb_Multiphase, eqn.probleme()) ? ref_cast(Pb_Multiphase, eqn.probleme()).equation_masse().champ_conserve().passe()
416 : eqn.probleme().get_champ("masse_volumique").valeurs(); // get_champ for flica5 because masse_volumique is not in the milieu...
417 const DoubleVect& pf = eqn.milieu().porosite_face(), &fs = zvf.face_surfaces();
418 const IntTab& f_e = zvf.face_voisins();
419 int cF = fac.dimension_tot(0) == 1, i, n, N = fac.line_size(), d, D = Objet_U::dimension;
420
421 DoubleTrav deb_vect;
422 zvf.creer_tableau_faces(deb_vect); //to correctly sum flow rates in parallel
423 for (i = 0; i < num_faces.size(); i++)
424 {
425 int f = num_faces(i), e = f_e(f, f_e(f, 0) < 0); //todo : evaluer fac du bon cote
426 if (vit.line_size() > N)
427 for (d = 0; d < D; d++)
428 for (n = 0; n < N; n++) deb_vect(f) += zvf.face_normales(f, d) * vit(f, N * d + n) * fac(!cF * e, n); //vecteur complet : v . nf
429 else for (n = 0; n < N; n++) deb_vect(f) += fs(f) * vit(f, n) * fac(!cF * e, n); //normale aux faces seule
430 deb_vect(f) *= pf(f) * (sgn.size() ? sgn(i) : deb_vect(f) > 0 ? 1 : -1) ; //multiply by porosity + orientation (if not defined, count everything as positive)
431 }
432 return mp_somme_vect(deb_vect);
433}
434
435void Perte_Charge_Singuliere::update_K(const Equation_base& eqn, double deb, DoubleVect& bilan)
436{
437 if (!regul_) return;
438 double t = eqn.probleme().schema_temps().temps_courant(), dt = eqn.probleme().schema_temps().pas_de_temps();
439 deb_cible_.setVar(0, t), alpha_.setVar(0, t);
440 double deb_cible = deb_cible_.eval();
441 if (std::abs(deb_cible) > 1e-10)
442 {
443 const double alpha = alpha_.eval(), error = (deb - deb_cible) / deb_cible;
444 K_ += dt * alpha * error;
445 }
446
447 //for the monitoring file: only on the master, because Source_base::imprimer() sums over all processes
448 if (!Process::me()) bilan(0) = K_, bilan(1) = deb, bilan(2) = deb_cible;
449}
class Champ_Don_base base class of Given Fields (not calculated)
DoubleTab & valeurs() override
Returns the array of field values at the current time.
virtual DoubleTab & valeurs()=0
const Sous_Domaine_t & ss_domaine(int i) const
Definition Domaine.h:290
Groupe_Faces_t & groupe_faces(int i)
Definition Domaine.h:221
int nb_som_elem() const
Returns the number of vertices of the geometric elements that make up the domain.
Definition Domaine.h:474
int_t nb_elem_tot() const
Definition Domaine.h:132
const OctreeRoot_t & construit_octree() const
Definition Domaine.cpp:816
void calculer_centres_gravite(DoubleTab_t &xp) const
Calculates the centers of gravity of the domain elements.
Definition Domaine.h:503
int nb_faces_elem(int=0) const
Returns the number of faces of type i of the geometric elements that make up the domain.
Definition Domaine.h:484
const DoubleTab_t & coord_sommets() const
Definition Domaine.h:112
int_t sommet_elem(int_t i, int j) const
Returns the (global) number of the j-th vertex of the i-th element.
Definition Domaine.h:136
class Domaine_VF
Definition Domaine_VF.h:44
virtual const DoubleVect & face_surfaces() const
Definition Domaine_VF.h:51
void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
int face_sommets(int i, int j) const
Returns the index of the i-th vertex of face num_face.
Definition Domaine_VF.h:582
int elem_faces(int i, int j) const
Returns the index of the i-th face of element num_elem; the face numbering convention is.
Definition Domaine_VF.h:542
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
Definition Domaine_VF.h:418
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
const Domaine & domaine() const
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 Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Returns the problem associated with the equation.
Domaine_dis_base & domaine_dis()
Returns the discretized domain associated with the equation.
int_t nb_faces() const
Returns the number of faces of the boundary.
Definition Frontiere.h:59
const ArrOfInt_t & get_indices_faces() const
static Objet_U & objet(const Nom &)
See Interprete_bloc::objet_global(). BM: the Interprete class is not the best place for this.
DoubleVect & porosite_face()
Definition Milieu_base.h:62
A character string (Nom) in uppercase.
Definition Motcle.h:26
An array of Motcle objects.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:319
class Nom: a character string for naming TRUST objects.
Definition Nom.h:31
virtual int debute_par(const char *const n) const
Definition Nom.cpp:314
const Interprete & interprete() const
Definition Objet_U.cpp:211
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
void rang_elems_sommet(SmallArrOfTID_t &, double x, double y=0, double z=0) const
Definition Octree.cpp:1003
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
@ REQUIRED
Definition Param.h:115
int lire_avec_accolades(Entree &is)
Alias of lire_avec_accolades_depuis.
Definition Param.h:577
Multiphase thermohydraulics problem of type "3*N equations":
void update_K(const Equation_base &eqn, double deb, DoubleVect &bilan)
double calculate_Q(const Equation_base &eqn, const IntVect &num_faces, const IntVect &sgn) const
virtual void lire_surfaces(Entree &, const Domaine &, const Domaine_dis_base &, IntVect &, IntVect &, int lire_derniere_accolade=1)
Entree & lire_regul(Entree &)
Reads the specifications of a singular pressure drop from an input stream.
int direction_perte_charge_
int direction_perte_charge() const
Returns the pressure drop direction.
const Champ_base & get_champ(const Motcle &nom) const override
const Schema_Temps_base & schema_temps() const
Returns the time scheme associated with the problem.
static int me()
Returns the rank of the local processor in the current communication group. See Comm_Group::rank() an...
Definition Process.cpp:122
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466
double temps_courant() const
Returns the current time.
double pas_de_temps() const
Returns the current time step (delta_t).
int_t nb_elem_tot() const
_SIZE_ size_array() const
_SIZE_ size() const
Definition TRUSTVect.tpp:45
int line_size() const
Definition TRUSTVect.tpp:67
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTVect.tpp:91