TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
QDM_Multiphase.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 <Operateur_Diff_base.h>
17#include <Discretisation_base.h>
18#include <Schema_Temps_base.h>
19#include <Pb_Multiphase_HEM.h>
20#include <Champ_Composite.h>
21#include <TRUSTTab_parts.h>
22#include <QDM_Multiphase.h>
23#include <Discret_Thyd.h>
24#include <Fluide_base.h>
25#include <EChaine.h>
26#include <Param.h>
27#include <vector>
28#include <Nom.h>
29
30Implemente_instanciable(QDM_Multiphase,"QDM_Multiphase",Navier_Stokes_std);
31// XD QDM_Multiphase eqn_base QDM_Multiphase INHERITS_BRACE Momentum conservation equation for a multi-phase problem
32// XD_CONT where the unknown is the velocity
33// XD attr solveur_pression solveur_sys_base solveur_pression OPT Linear pressure system resolution method.
34// XD attr evanescence bloc_lecture evanescence OPT Management of the vanishing phase (when alpha tends to 0 or 1)
35
36// evanescence interprete evanescence 1 Management of the vanishing phase (when alpha tends to 0 or 1)
37// attr homogene chaine homogene 1 Vanishing phases management : tends to homogeneous model when a phase vanishes (vl = vg)
38// attr bloc_val bloc_lecture bloc_val 1 not set
39
40// bloc_lecture interprete nul 1 not set
41// attr alpha_res_min flottant alpha_res_min 0 Activation threshold for full replacement of vanishing phase equation (default value : 0)
42// attr alpha_res flottant alpha_res 0 Activation threshold for gradual replacement of vanishing phase equation (tends to full replacement when alpha tends to alpha_res_min)
43
45{
46 return Equation_base::printOn(is);
47}
48
49/*! @brief Appel Equation_base::readOn(Entree& is) En sortie verifie que l'on a bien lu:
50 *
51 * - le terme diffusif,
52 * - le terme convectif,
53 * - le solveur en pression
54 *
55 * @param (Entree& is) un flot d'entree
56 * @return (Entree&) le flot d'entree modifie
57 * @throws terme diffusif non specifie dans jeu de donnees, specifier
58 * un type negligeable pour l'operateur si il est a negliger
59 * @throws terme convectif non specifie dans jeu de donnees, specifier
60 * un type negligeable pour l'operateur si il est a negliger
61 * @throws solveur pression non defini dans jeu de donnees
62 */
63
65{
66 evanescence_.associer_eqn(*this);
68 assert(le_fluide);
69 if (!sub_type(Fluide_base,le_fluide.valeur()))
70 {
71 Cerr<<"ERROR : the QDM_Multiphase equation can be associated only to a fluid."<<finl;
72 exit();
73 }
74 divergence.set_description((Nom)"Mass flow rate=Integral(rho*u*ndS) [kg.s-1]");
75 terme_convectif->set_incompressible(0);
76
77 const Pb_Multiphase& pb = ref_cast(Pb_Multiphase, probleme());
78 if (!evanescence_ && pb.nb_phases() > 1)
79 {
80 // Special treatment for Pb_Multiphase_HEM : We enforce the evanescence to a specific value
81 if (sub_type(Pb_Multiphase_HEM, probleme()))
82 {
83 EChaine eva("{ homogene { alpha_res 1 alpha_res_min 0.5 } }");
84 eva >> evanescence_;
85 }
86 else
87 {
88 EChaine eva("{ homogene { alpha_res 1e-6 } }");
89 eva >> evanescence_;
90 }
91 }
92
93 /* champs de vitesse par phase pour le postpro */
94 noms_vit_phases_.dimensionner(pb.nb_phases()), vit_phases_.resize(pb.nb_phases());
95 for (int i = 0; i < pb.nb_phases(); i++)
96 noms_vit_phases_[i] = Nom("vitesse_") + pb.nom_phase(i);
97
98 noms_grad_vit_phases_.dimensionner(pb.nb_phases()), grad_vit_phases_.resize(pb.nb_phases());
99 for (int i = 0; i < pb.nb_phases(); i++)
100 noms_grad_vit_phases_[i] = Nom("gradient_vitesse_") + pb.nom_phase(i);
101
102 return is;
103}
104
106{
108 param.ajouter_non_std("evanescence|vanishing",(this));
109}
110
112{
113 if (mot=="evanescence") is >> evanescence_;
115 return 1;
116}
117
123
125{
127 if (evanescence_) ok &= evanescence_->has_interface_blocs();
128 return ok;
129}
130
131/* l'evanescence passe en dernier */
132void QDM_Multiphase::dimensionner_blocs(matrices_t matrices, const tabs_t& semi_impl) const
133{
134 Navier_Stokes_std::dimensionner_blocs(matrices, semi_impl);
135 if (evanescence_) evanescence_->dimensionner_blocs(matrices, semi_impl);
136}
137
138void QDM_Multiphase::assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl)
139{
140 Navier_Stokes_std::assembler_blocs_avec_inertie(matrices, secmem, semi_impl);
141 if (evanescence_) evanescence_->ajouter_blocs(matrices, secmem, semi_impl);
142}
143
145{
146 Equation_base::mettre_a_jour(temps); //on saute celui de Navier_Stokes_std
147 pression().mettre_a_jour(temps);
148 pression_pa().mettre_a_jour(temps);
149
150 int i, j, n, N = ref_cast(Pb_Multiphase, probleme()).nb_phases(), d, D = dimension;
151 for (n = 0; n < N; n++)
152 if (vit_phases_[n])
153 {
154 vit_phases_[n]->mettre_a_jour(temps);
155 DoubleTab_parts psrc(inconnue().valeurs()), pdst(vit_phases_[n]->valeurs());
156 for (i = 0; i < std::min(psrc.size(), pdst.size()); i++)
157 {
158 DoubleTab& src = psrc[i], &dst = pdst[i];
159 if (src.line_size() == N) /* une colonne par composante */
160 for (j = 0; j < src.dimension_tot(0); j++) dst(j) = src(j, n);
161 else if (src.line_size() == N * D) /* stockage N * d + n */
162 for (j = 0; j < src.dimension_tot(0); j++)
163 for (d = 0; d < D; d++)
164 dst(j, d) = src(j, N * d + n);
165 else abort(); //on ne connait pas
166 }
167 }
168
169 if (grad_u) grad_u->mettre_a_jour(temps);
170 if (la_vorticite) la_vorticite->mettre_a_jour(temps);
171 if (Taux_cisaillement) Taux_cisaillement->mettre_a_jour(temps);
172
173 const bool is_vdf = discretisation().is_vdf();
174 for (n = 0; n < N; n++)
175 if (grad_vit_phases_[n])
176 {
177 if (is_vdf)
178 {
179 for (int e = 0; e < domaine_dis().nb_elem(); e++)
180 for (i = 0; i < D; i++)
181 for (j = 0; j < D; j++)
182 grad_vit_phases_[n]->valeurs()(e, D * i + j) = grad_u->valeurs()(e, N * (D * i + j) + n);
183 }
184 else
185 {
186 DoubleTab_parts psrc(grad_u->valeurs()), pdst(grad_vit_phases_[n]->valeurs());
187 for (i = 0; i < psrc.size(); i++)
188 for (j = 0; j < pdst.size(); j++)
189 {
190 DoubleTab& src = psrc[i], &dst = pdst[j];
191 if (src.line_size() == N * D * D && dst.line_size() == D * D) /* une colonne par composante */
192 {
193 for (int k = 0; k < src.dimension_tot(0); k++)
194 for (int dU = 0; dU < D; dU++)
195 for (int dX = 0; dX < D; dX++)
196 dst(k, dX + D * dU) = src(k, dX, dU + n * D); // Les lignes et les colonnes sont inversees quand on passe dans DoubleTab_parts
197 }
198 }
199 }
200 grad_vit_phases_[n]->mettre_a_jour(temps);
201 }
202 if (gradient_P)
203 {
204 gradient_P->valeurs() = 0;
205 gradient->ajouter(la_pression->valeurs(), gradient_P->valeurs());
207 }
208}
209
211{
213 ConstDoubleTab_parts ppart(pression().valeurs());
214 /* si pression_pa() est plus petit que pression() (ex. : variables auxiliaires PolyMAC_HFV), alors on ne copie que la 1ere partie */
215 const DoubleTab& p_red = pression_pa().valeurs().dimension_tot(0) < pression().valeurs().dimension_tot(0) ? ppart[0] : pression().valeurs();
216 for (int i=1; i<=sch.nb_valeurs_futures(); i++)
217 {
218 // Mise a jour du temps dans la pression
222 pression_pa().futur(i) = p_red;
223 }
225}
226
231
233{
234 const Discret_Thyd& dis=ref_cast(Discret_Thyd, discretisation());
235 dis.vitesse(schema_temps(), domaine_dis(), la_vitesse, ref_cast(Pb_Multiphase, probleme()).nb_phases());
236}
237
239{
240// Ne fait rien ! Est appele par defaut dans Navier_Stokes_std.discretiser() mais pas requis en Pb_Multiphase
241// La dicretisation par dans le QDM_Multiphase.creer_champ()
242}
243
245{
246 return le_fluide->viscosite_dynamique();
247}
248
250{
251 return le_fluide->viscosite_cinematique();
252}
253
255{
256 return la_vitesse;
257}
258
259/*! @brief Complete l'equation base, associe la pression a l'equation,
260 *
261 * complete la divergence, le gradient et le solveur pression.
262 * Ajout de 2 termes sources: l'un representant la force centrifuge
263 * dans le cas axi-symetrique,l'autre intervenant dans la resolution
264 * en 2D axisymetrique
265 *
266 */
268{
269 Cerr<<" Navier_Stokes_std::completer_deb"<<finl;
271 Cerr<<" Navier_Stokes_std::completer_fin"<<finl;
272 Cerr<<"unknow field type "<<inconnue().que_suis_je()<<finl;
273 Cerr<<"unknow field name "<<inconnue().le_nom()<<finl;
274 Cerr<<"equation type "<<inconnue().equation().que_suis_je()<<finl;
275
276 /* liste des choses qui doivent etre compatibles avec le multiphase */
277 std::vector<const MorEqn*> morceaux = { &solveur_masse.valeur(), &les_sources, &terme_convectif.valeur(), &terme_diffusif.valeur(), &gradient.valeur() };
278 for (auto mor : morceaux) mor->check_multiphase_compatibility();
279}
280
282{
284
285 Noms noms_compris;
286 const Pb_Multiphase& pb = ref_cast(Pb_Multiphase, probleme());
287 for (int i = 0; i < pb.nb_phases(); i++)
288 {
289 noms_compris.add(noms_grad_vit_phases_[i]);
290 noms_compris.add(noms_vit_phases_[i]);
291 }
292 if (opt==DESCRIPTION)
293 Cerr<<" QDM_Multiphase : "<< noms_compris <<finl;
294 else
295 noms.add(noms_compris);
296}
297
299{
301 if (la_vorticite)
302 if (!grad_u) creer_champ("gradient_vitesse");
303 int i = noms_vit_phases_.rang(motlu);
304 if (i >= 0 && !vit_phases_[i])
305 {
307 champs_compris_.ajoute_champ(vit_phases_[i]);
308 }
309 i = noms_grad_vit_phases_.rang(motlu);
310 if (i >= 0 && !grad_vit_phases_[i])
311 {
312 int D = dimension ;
313 Noms noms(D * D), unites(D * D);
314 std::vector<Nom> composantsVitesse({Nom("dU"), Nom("dV"), Nom("dW")});
315 std::vector<Nom> composantsDerivee({Nom("dx"), Nom("dy"), Nom("dz")});
316 for (int dU = 0 ; dU< D ; dU++)
317 for (int dX = 0 ; dX < D ; dX++)
318 {
319 noms[ D * dU + dX]=Nom(composantsVitesse[dU] + composantsDerivee[dX]);
320 unites[ D * dU + dX] = Nom("m2/s");
321 }
322 noms[0] = noms_grad_vit_phases_[i]; // Pour lui donner le bon nom dans discretiser_champ ; consequence : la premiere coordonnee en sortie n'a pas le bon nom
323 Motcle typeChamp = "champ_elem" ;
324 discretisation().discretiser_champ(typeChamp, domaine_dis(), multi_scalaire, noms , unites, D*D, 0, grad_vit_phases_[0]);
325 champs_compris_.ajoute_champ(grad_vit_phases_[i]);
326 }
327
328 if (motlu == "gradient_pression")
329 {
330 if (!gradient_P)
331 {
332 const Discret_Thyd& dis=ref_cast(Discret_Thyd, discretisation());
333 dis.gradient_P(schema_temps(), domaine_dis(), gradient_P, ref_cast(Pb_Multiphase, probleme()).nb_phases());
334 champs_compris_.ajoute_champ(gradient_P);
335 }
336 }
337
338}
339
341{
342 Cerr << "Reading of initial conditions\n";
343 Nom nom;
344 is >> nom;
345 if (nom != "{")
346 {
347 Cerr << que_suis_je() << ": expected { instead of " << nom << finl;
349 }
350 int vit_lu = 0, press_lu = 0;
351 for (is >> nom; nom != "}"; is >> nom)
352 if (nom == "vitesse" || nom == "velocity")
353 {
355 is >> src;
356
357 if (src->que_suis_je() == "Champ_Composite")
358 {
359 const int nb_phases = ref_cast(Pb_Multiphase, probleme()).nb_phases(), nb_dim = ref_cast(Champ_Composite,src.valeur()).get_champ_composite_dim();
360 if ( nb_dim != nb_phases)
361 {
362 Cerr << que_suis_je() << ": velocity initial condition Champ_Composite should have "<< nb_phases << " fields and not " << nb_dim << " !" << finl;
364 }
365 }
366
367 verifie_ch_init_nb_comp(la_vitesse, src->nb_comp());
368 la_vitesse->affecter(src), vit_lu = 1;
369 la_vitesse->passe() = la_vitesse->valeurs();
370 }
371 else if (nom == "pression" || nom == "pressure")
372 {
374 is >> src, verifie_ch_init_nb_comp(la_pression, src->nb_comp());
375 la_pression->affecter(src);
376 la_pression_en_pa->passe() = la_pression_en_pa->valeurs() = la_pression->passe() = la_pression->valeurs();
377 press_lu = 1;
378 }
379 else
380 {
381 Cerr << que_suis_je() << ": expected vitesse|velocity|pression|pressure instead of " << nom << finl;
383 }
384
385 if (!vit_lu)
386 {
387 Cerr << que_suis_je() << ": velocity initial condition not found." << finl;
389 }
390 if (!press_lu)
391 {
392 Cerr << que_suis_je() << ": pressure initial condition not found." << finl;
394 }
395
396 return is;
397}
398
400{
401 Equation_base::preparer_calcul(); //pour eviter Navier_Stokes_std::preparer_calcul() !
402
403 // XXX Elie Saikali : utile pour cas reprise !
404 const double temps = schema_temps().temps_courant();
405 pression().changer_temps(temps);
406 pression_pa().changer_temps(temps);
407
408 if (evanescence_)
409 evanescence_->preparer_calcul();
410
411 return 1;
412}
413
415{
416 const Pb_Multiphase& pb = ref_cast(Pb_Multiphase, probleme());
417 if (pb.nb_phases() == 1) return 0.;
418 if (!evanescence_) Process::exit( "QDM_Multiphase::alpha_res : the evanescence operator should have been created already !" );
419 if sub_type(Operateur_Evanescence_base, evanescence_.valeur()) return ref_cast(Operateur_Evanescence_base, evanescence_.valeur()).alpha_res();
420 return -1.;
421}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & futur(int i=1) override
Renvoie les valeurs du champs a l'instant t+i.
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps du champ inconnue.
double changer_temps(const double temps) override
Fixe le temps du champ.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
double changer_temps_futur(double, int i=1)
Fixe le temps du ieme champ futur.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
classe Discret_Thyd Cette classe est la classe de base representant une discretisation
void gradient_P(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&, int nb_comp=1) const
void vitesse(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&, int nb_comp=1) const
virtual bool is_vdf() const
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual void assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={})
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
virtual void abortTimeStep()
Reinitialiser ce qui doit l'etre.
Sources les_sources
virtual int preparer_calcul()
Tout ce qui ne depend pas des autres problemes eventuels.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
virtual void verifie_ch_init_nb_comp(const Champ_Inc_base &ch_ref, const int nb_comp) const
Verification du nombre de composantes lues pour la specification d un champ.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual bool initTimeStep(double dt)
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
Champs_compris champs_compris_
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
Operateur_Diff terme_diffusif
void dimensionner_matrice_sans_mem(Matrice_Morse &matrice) override
Operateur_Grad gradient
Operateur_Conv terme_convectif
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
void creer_champ(const Motcle &motlu) override
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
void completer() override
Complete l'equation base, associe la pression a l'equation,.
Champ_Inc_base & pression_pa()
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
Operateur_Div divergence
int has_interface_blocs() const override
void set_param(Param &titi) const override
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
OWN_PTR(Assembleur_base) &assembleur_pression()
Champ_Inc_base & pression()
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
friend class Entree
Definition Objet_U.h:76
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 Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
classe Operateur_Evanescence Classe generique de la hierarchie des operateurs representant un terme
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
const Nom & nom_phase(int i) const
int nb_phases() const
static void abort()
Routine de sortie de Trio-U sur une erreur abort().
Definition Process.cpp:570
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
classe QDM_Multiphase Cette classe porte les termes de l'equation de la dynamique
void completer() override
Complete l'equation base, associe la pression a l'equation,.
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
Operateur_Evanescence evanescence_
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
const Champ_Don_base & diffusivite_pour_transport() const override
void creer_champ(const Motcle &motlu) override
Motcles noms_grad_vit_phases_
void discretiser_vitesse() override
std::vector< OWN_PTR(Champ_Inc_base)> vit_phases_
const Champ_base & vitesse_pour_transport() const override
void discretiser_grad_p() override
void abortTimeStep() override
Reinitialiser ce qui doit l'etre.
int preparer_calcul() override
cf Equation_base::preparer_calcul() Assemblage du solveur pression et
void assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) override
double alpha_res() const
Entree & lire_cond_init(Entree &) override
Lecture des conditions initiales dans un flot d'entree.
void set_param(Param &param) const override
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps de l'equation.
std::vector< OWN_PTR(Champ_Fonc_base)> grad_vit_phases_
int has_interface_blocs() const override
Motcles noms_vit_phases_
const Champ_base & diffusivite_pour_pas_de_temps() const override
void dimensionner_matrice_sans_mem(Matrice_Morse &matrice) override
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
class Schema_Temps_base
double temps_courant() const
Renvoie le temps courant.
virtual double temps_futur(int i) const =0
virtual int nb_valeurs_futures() const =0
virtual DoubleTab & appliquer_impl(DoubleTab &x) const =0
Classe de base des flux de sortie.
Definition Sortie.h:52
int size() const
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
int line_size() const
Definition TRUSTVect.tpp:67