TRUST 1.9.8
HPC thermohydraulic platform
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 Lit les specifications d'une perte de charge singuliere a partir d'un flot d'entree.
34 *
35 * @param (Entree& is) un flot d'entree
36 * @return (Entree&) le flot d'entree modifie
37 * @throws mot cle inattendu, on attendait "KX","KY", "KZ" ou "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 << "Erreur syntaxe!" << finl;
66 Cerr << "La formule de regulation de debit passant de:" << finl;
67 Cerr << "K_ *= min(max(|debit|/deb_cible)^2,(1-eps)^dt),(1+eps)^dt);" << finl;
68 Cerr << "a:" << finl;
69 Cerr << "K_ += dt*alpha*(debit-debit_cible);" << finl;
70 Cerr << "Le mot cle eps (valeur comprise entre 0 et 1) n'est plus valide." << finl;
71 Cerr << "L'amplitude de la regulation du debit doit etre specifiee par le mot cle alpha. Si vous aviez une valeur non nulle pour eps, par ex 0.5, remplacer par alpha 10" << finl;
72 Cerr << "et eps 0 doit etre remplace par alpha 0" << finl;
74 }
75 if (alpha_str=="") Process::exit("alpha doit etre specifie pour la 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 << "On attendait le mot cle" << acc_ouverte << " a la place de " << motlu << finl;
98 }
99 is >> motlu;
100 if (motlu != "dir")
101 {
102 Cerr << "On attendait le mot cle dir a la place de " << motlu << finl;
104 }
105 else
106 {
107 is >> motlu;
108 int rang = les_motcles.search(motlu);
109 if (rang == -1)
110 {
111 Cerr << "Erreur a la lecture des donnees de Perte_Charge_Singuliere" << finl;
112 Cerr << "On attendait l'un des mots cles " << les_motcles << finl;
113 Cerr << "a la place de " << 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 << "On attendait le mot cle coeff ou regul a la place de " << motlu << finl;
131 }
132
133 Cerr << " direction_perte_charge_ " << direction_perte_charge_ << finl;
134 Cerr << " perte de charge 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 << "On attendait le mot cle surface a la place de " << motlu << finl;
166 }
167 is >> motlu;
168 if (motlu != acc_ouverte)
169 {
170 Cerr << "On attendait le mot cle" << acc_ouverte << " a la place de " << 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; //on lit un champ pour orienter la surface
249
250 if (motlu != acc_fermee)
251 {
252 Cerr << "On attendait le mot cle" << acc_fermee << " a la place de " << motlu << finl;
254 }
255 if (lire_derniere_accolade)
256 {
257 is >> motlu;
258 if (motlu != acc_fermee)
259 {
260 Cerr << "On attendait le mot cle" << acc_fermee << " a la place de " << 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 pour flica5 car la masse volumique n'est pas dans le 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); //pour bien sommer les debits en parallele
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) ; //produit par la porosite + orientation (si elle n'est pas definie, on compte tout en positif)
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 //pour le fichier de suivi : seulement sur le maitre, car Source_base::imprimer() fait une somme sur les procs
448 if (!Process::me()) bilan(0) = K_, bilan(1) = deb, bilan(2) = deb_cible;
449}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
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
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
Definition Domaine.h:474
int_t nb_elem_tot() const
Definition Domaine.h:132
const OctreeRoot_t & construit_octree() const
Definition Domaine.cpp:817
void calculer_centres_gravite(DoubleTab_t &xp) const
Calcule les centres de gravites des elements du domaine.
Definition Domaine.h:503
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
Definition Domaine.h:484
const DoubleTab_t & coord_sommets() const
Definition Domaine.h:112
int_t sommet_elem(int_t i, int j) const
Renvoie le numero (global) du j-ieme sommet du i-ieme 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
renvoie le numero du ieme sommet de la face num_face.
Definition Domaine_VF.h:583
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
Definition Domaine_VF.h:543
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
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 Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
int_t nb_faces() const
Renvoie le nombre de faces de la frontiere.
Definition Frontiere.h:59
const ArrOfInt_t & get_indices_faces() const
static Objet_U & objet(const Nom &)
Voir Interprete_bloc::objet_global() BM: la classe Interprete n'est pas le meilleur endroit pour cett...
DoubleVect & porosite_face()
Definition Milieu_base.h:62
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:321
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
virtual int debute_par(const char *const n) const
Definition Nom.cpp:319
const Interprete & interprete() const
Definition Objet_U.cpp:212
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
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
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
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 &)
Lit les specifications d'une perte de charge singuliere a partir d'un flot d'entree.
int direction_perte_charge_
int direction_perte_charge() const
Renvoie la direction de perte de charge.
const Champ_base & get_champ(const Motcle &nom) const override
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
static int me()
renvoie mon rang dans le groupe de communication courant.
Definition Process.cpp:125
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
double temps_courant() const
Renvoie le temps courant.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
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