TrioCFD 1.9.9_beta
TrioCFD documentation
Loading...
Searching...
No Matches
Chimie.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 <Chimie.h>
17#include <Probleme_base.h>
18#include <Motcle.h>
19#include <Param.h>
20#include <Parser_U.h>
21#include <Domaine_VF.h>
22#include <Discretisation_base.h>
23#include <Convection_Diffusion_Concentration.h>
24#include <dlsinterf.h>
25#include <Constituant.h>
26
27// XD reactions listobj nul BRACE reaction COMMA list of reactions
28
29Implemente_instanciable(Chimie,"Chimie",Objet_U_With_Params);
30// XD chimie objet_u chimie BRACE Keyword to describe the chmical reactions
31
32
34{
35 os<<(*this).le_nom()<<finl;
36 os<<reactions_<<finl;
37 return os;
38}
39
40void Chimie::set_param(Param& param) const
41{
42 param.ajouter("reactions",&reactions_,Param::REQUIRED); // XD attr reactions reactions reactions REQ list of reactions
43 param.ajouter("modele_micro_melange",&modele_micro_melange_); // XD attr modele_micro_melange entier modele_micro_melange OPT modele_micro_melange (0 by default)
44 param.ajouter("constante_modele_micro_melange",&constante_modele_micro_melange_); // XD attr constante_modele_micro_melange floattant constante_modele_micro_melange OPT constante of modele (1 by default)
45 param.ajouter("espece_en_competition_micro_melange",&espece_en_competition_micro_melange_); // XD attr espece_en_competition_micro_melange chaine espece_en_competition_micro_melange OPT espece in competition in reactions
46}
47
49{
50 double dt=1e30;
51 double dt_reaction;
52 for (int i=0; i<reactions_.size(); i++) // loop over all reactions
53 {
54 dt_reaction=reactions_[i].calculer_pas_de_temps();
55 if(i==0) Cout<<"Pour le(s) reaction(s), dt_max = ";
56 Cout<<dt_reaction<<" ";
57 if (i==(reactions_.size()-1)) Cout<<finl;
58 dt=std::min(dt,dt_reaction);
59 }
60 // double dt_n=pb_->schema_temps().pas_de_temps();
61 // Butterworth filter:
62 // alpha=1 -> no filter
63 // alpha->0 -> heavily filtered
64 // double alpha_Butterworth=1.;
65 // return (dt_n*(1.-alpha_Butterworth)+alpha_Butterworth*dt);
66 return dt;
67}
68
69
70
72{
73 // if no reaction, do nothing
74 if (reactions_.size()==0)
75 return;
76 pb_=pb;
77 // 1) determine the number of FM
78 int nb_fm=0;
79 int nb_grains=0;
80 int nb_concentration=0;
81 // Motcles alias;
82 ArrOfDouble masses_molaires;
83 for (int n=0; n<pb.nombre_d_equations(); n ++)
84 {
85
87 nb_concentration++;
88
89 }
90
91 // 2) store aliases and molar masses
92 masses_molaires.resize_array(nb_grains+nb_fm+nb_concentration);
93 alias.dimensionner(nb_grains+nb_fm+nb_concentration);
94 nb_grains_=nb_grains;
95 int nb=0;
96 for (int n=0; n<pb.nombre_d_equations(); n ++)
97 {
99 {
101 masses_molaires[nb]=eq.masse_molaire();
102 alias[nb]=eq.inconnue().le_nom();
104 inco = eq.inconnue();
105 liste_C_.add(inco);
106 nb++;
107 }
108 }
109 assert(liste_ai_.size()==nb_grains_);
110 // check uniqueness of aliases
112 {
113 LIST(Nom) test;
114 for (int n=0; n<alias.size(); n++)
115 {
116 int deja=test.contient(alias[n]);
117 if (!deja)
118 test.add(alias[n]);
119 else
120 {
121 Cerr<<alias[n] <<" defini plusieurs fois !!!!!"<<finl;
122 //Cerr<<test<< " "<<alias<<finl;
123 exit();
124 }
126 {
129 }
130 }
131 assert(test.size()==nb_fm+nb_grains_+nb_concentration);
132 }
134 {
136 {
137 Cerr<<" espece_en_competition_micro_melange not found: "<< espece_en_competition_micro_melange_<<finl;
138 exit();
139 }
140 else
141 Cerr<<" marqueur_espece_en_competition_micro_melange "<<marqueur_espece_en_competition_micro_melange_<<finl;
142 }
143 if(min_array(masses_molaires)<0)
144 {
145 Cerr<< "problem with masses_molaires "<<masses_molaires<<finl;
146 exit();
147 }
148 if (liste_Y_.size()>0)
149 {
150 Puissance_volumique_=(liste_Y_[0]->valeurs()); // array sizing...
152 }
153 else
154 {
155 assert(liste_C_.size()!=0);
156 }
157 //alias_=alias;
158 for (int i=0; i<reactions_.size(); i++)
159 {
160 reactions_[i].completer(alias,masses_molaires);
161 }
162}
163
165{
166 for (int i=0; i<reactions_.size(); i++)
167 {
168 Nom test("omega_");
169 test+=Nom(i);
170 reactions_[i].discretiser_omega(pb,test);
171 }
172}
173
175{
176 return 1;
177}
178
179
180
181void Chimie::mettre_a_jour(double temps)
182{
183 if (reactions_.size()==0) // no reaction
184 return;
185
186 double dt=pb_->schema_temps().pas_de_temps();
187
188 if (liste_C_.size())
189 {
190 // We assume there is no temperature for now...
191 int old=0;
192 int nbr=reactions_.size();
193 if (old)
194 {
195 for (int i=0; i<nbr; i++)
196 {
197 Reaction& reaction=reactions_[i];
198 int nb_sous_pas_de_temps_reaction=reaction.nb_sous_pas_de_temps_reaction();
199
200 const double dt_chimie=dt/nb_sous_pas_de_temps_reaction;
201 for (int n=0; n<nb_sous_pas_de_temps_reaction; n++)
202 reaction.reagir(liste_C_,dt_chimie);
203 }
204
205 for (int i=0; i<liste_C_.size(); i++)
206 liste_C_[i]->valeurs().echange_espace_virtuel();
207 return;
208 }
209 const int vef = (int)pb_->discretisation().is_vef();
210 Domaine_VF& zvf = ref_cast(Domaine_VF,liste_C_[0]->equation().domaine_dis());
211
212 const IntTab& face_voisins = zvf.face_voisins();
213 const ArrOfDouble& volume=zvf.volumes();
214 int newd=1;
215 if (newd)
216 {
217 int nbrtot=0;
218 ArrOfInt marq_contre(2*nbr);
219 for (int i=0; i<nbr; i++)
220 {
221 Reaction& reaction=reactions_[i];
222 marq_contre[nbrtot++]=i+1;
223 if (reaction.contre_reaction_>0)
224 marq_contre[nbrtot++]=-(i+1);
225
226 if ((reaction.beta_!=0)||(reaction.Ea_!=0)||((reaction.c_r_Ea_!=0)&&(reaction.contre_reaction_>0)))
227 {
228 Cerr<<"Reaction: Data incompatible with the fact that there is no temperature"<<finl;
229 Cerr<<reaction<<finl;
230 exit();
231 }
232 }
233 marq_contre.resize_array(nbrtot);
234
235 int nbc=liste_C_.size();
236
237 F77NAME(INITTAILLECOMMON)(&nbrtot,&nbc);
238 ArrOfDouble pstochio(nbc);
239 ArrOfInt pactivite(nbc);
241 for (int i=0; i<nbrtot; i++)
242 {
243 int ir=marq_contre[i];
244 int ir2=ir;
245 if (ir<0) ir2=-ir2;
246 ir2-=1;
247 Reaction& reaction=reactions_[ir2];
248 pstochio=reaction.coeff_stoechio_;
249 pactivite=0;
250
251 double cw=reaction.constante_taux_reaction_;
252 if (ir<0)
253 {
254 pstochio*=-1;
255 assert(reaction.contre_reaction_>0);
256 cw/=reaction.contre_reaction_;
257 }
258 for (int ic=0; ic<nbc; ic++)
259 {
260 if (pstochio[ic]>0)
261 pactivite[ic]=(int)reaction.coeff_activite_[ic];
262 }
263 int ii=i+1;
264 int avec_contre_reaction=(reaction.contre_reaction_>0);
265 F77NAME(INITREACTIONCOMMON)(&(ii), pstochio.addr(), pactivite.addr(),&avec_contre_reaction) ;
266 F77NAME(SETCWREACTION)(&(ii), &cw);
267
268 }
269 // F77NAME(PRINT_COMMON)();
270 // abort();
271 int mf=21;
272 int lrw;
273 int liw;
274 if (mf==21)
275 {
276 liw=20+nbc;
277 lrw=22+9*nbc+nbc*nbc;
278 }
279 else
280 throw;
281 assert(mf==21);
282
283
284 ArrOfDouble rwork(lrw);
285 ArrOfInt iwork(liw);
286
287
288 DoubleTab tau_mel;
290 {
291
292 const DoubleTab& visc_turb=liste_C_[0]->equation().probleme().get_champ("viscosite_turbulente").valeurs();
293 tau_mel=visc_turb;
294 const DoubleTab& D_moleculaire = ref_cast(Convection_Diffusion_Concentration,liste_C_[0]->equation()).constituant().diffusivite_constituant().valeurs();
295 double D_mol=0.;
296 if (D_moleculaire.dimension(0) == 1)
297 D_mol = D_moleculaire(0, 0);
298 else
299 {
300 Cerr << "D_mol not implemented for non-uniform field" << finl;
301 exit();
302 }
303 double invsct=1./0.9;
304 for (int element=0; element<visc_turb.dimension(0); element++)
305 {
306 double delta=exp(log(volume[element])/double(dimension));
307 // Cerr<<" iii "<<delta<<" "<<D_mol<<finl;
308 tau_mel(element)=constante_modele_micro_melange_*delta*delta/(D_mol+visc_turb(element)*invsct);
309 }
310 tau_mel.echange_espace_virtuel();
311 }
312 int nb_elem=liste_C_[0]->valeurs().size();
313 ArrOfDouble C(nbc);
314
315 for (int elem=0; elem<nb_elem; elem++)
316 {
317
318 double tau_melange=-1;
320 {
321 if (vef==0)
322 tau_melange=tau_mel(elem);
323 else
324 {
325 if (face_voisins(elem,1)!=-1)
326 tau_melange = 0.5*(tau_mel(face_voisins(elem,0))+tau_mel(face_voisins(elem,1)));
327 else
328 tau_melange = (tau_mel(face_voisins(elem,0)));
329 }
330 }
331 // tau_melange <0 not taken into account
332 // retrieval of initial values
333 for (int i=0; i<nbc; i++)
334 {
335 C[i]=liste_C_[i]->valeurs()(elem);
336
337 }
338 for (int i=0; i<nbc; i++)
339 {
340 if (C[i]<0)
341 {
342 if (C[i]<-1e-5)
343 {
344 Cerr<<" clipping C_"<<i<<" in cell "<<elem<<" in the chemistry !!!!!! "<<C[i]<<finl;
345 exit();
346 }
347 C[i]=0;
348 }
349 }
350 int init=1;
351 if (init)
352 {
353
354 }
355 double t=0,tout=dt;
356 int itol=1;
357 double rtol=0;
358 double atol=1e-10;
359 F77NAME(DLSODECHIMIES)(&nbc, C.addr(),&t, &tout,&tau_melange, &itol, &rtol, &atol, rwork.addr(), &lrw, iwork.addr(), &liw);
360 // update unknowns
361 for (int i=0; i<liste_C_.size(); i++)
362 liste_C_[i]->valeurs()(elem)=C[i];
363 }
364 for (int i=0; i<liste_C_.size(); i++)
365 liste_C_[i]->valeurs().echange_espace_virtuel();
366 return;
367 }
368 // compute nb_sous_pas_temps_max
369 int nb_sous_pas_de_temps_reaction_max=1;
370 int nbr_directe=0;
371
372 ArrOfInt marq_directe(nbr);
373 for (int i=0; i<nbr; i++)
374 {
375 Reaction& reaction=reactions_[i];
376 int nb_sous_pas_de_temps_reaction=reaction.nb_sous_pas_de_temps_reaction();
377 if (nb_sous_pas_de_temps_reaction>nb_sous_pas_de_temps_reaction_max)
378 nb_sous_pas_de_temps_reaction_max=nb_sous_pas_de_temps_reaction;
379 if (reaction.contre_reaction_<=0)
380 marq_directe[nbr_directe++]=i;
381
382 if ((reaction.beta_!=0)||(reaction.Ea_!=0)||((reaction.c_r_Ea_!=0)&&(reaction.contre_reaction_>0)))
383 {
384 Cerr<<"Reaction: Data incompatible with the fact that there is no temperature"<<finl;
385 Cerr<<reaction<<finl;
386 exit();
387 }
388 }
389 const double dt_chimie=dt/nb_sous_pas_de_temps_reaction_max;
390
391 int nbc=liste_C_.size();
392
393
394 // double R_gaz_parfait=8.3143;
395
396 ArrOfDouble C(nbc),C_tmp(nbc), proportion_eq(nbr_directe);
397
398 int nb_elem=liste_C_[0]->valeurs().size();
399 for (int elem=0; elem<nb_elem; elem++)
400 {
401
402
403 // retrieval of initial values
404 for (int i=0; i<nbc; i++)
405 {
406 C[i]=liste_C_[i]->valeurs()(elem);
407 }
408 for (int n=0; n<nb_sous_pas_de_temps_reaction_max; n++)
409 {
410 // clamp negative values if any
411 for (int i=0; i<nbc; i++)
412 if (C[i]<0)
413 {
414 if (C[i]<-1e-5)
415 {
416 Cerr<<" clipping C_"<<i<<" in cell "<<elem<<" in the chemistry !!!!!! "<<C[i]<<finl;
417 exit();
418 }
419 C[i]=0;
420 }
421 // compute initial proportions for non-equilibrium reactions
422
423 for (int i=0; i<nbr_directe; i++)
424 {
425 Reaction& reaction=reactions_[marq_directe[i]];
426 assert(reaction.contre_reaction_<=0);
427
428 double proportion_directe;
429 reaction.calcul_proportion_implicite(C_tmp,C,dt_chimie,1e-7,proportion_directe);
430 if (0)
431 {
432 double proportion_directe2;
433 reaction.calcul_proportion_implicite(C_tmp,C,dt_chimie,1e9,proportion_directe2);
434 if (proportion_directe==proportion_directe2)
435
436 {
437 exit();
438 }
439 }
440 // use proportion_directe to avoid the security limitation
441 proportion_eq[i]=proportion_directe;
442
443
444 }
445 // for each constituent, check whether limiting is needed...
446 double securite=1-1e-6;
447 for (int c=0; c<nbc; c++)
448 {
449 double St=0;
450 for (int i=0; i<nbr_directe; i++)
451 {
452 Reaction& reaction=reactions_[marq_directe[i]];
453 assert(reaction.contre_reaction_<=0);
454 if (reaction.coeff_Y_[c]>0.)
455 St+=proportion_eq[i]*reaction.coeff_stoechio_[c];
456 }
457
458 double rapport=St/(securite);
459 // Cerr<< c<<" ici0b "<< rapport <<" st "<<St<<" "<<C(c)<<finl;
460
461 if (rapport>C[c])
462 {
463 // risk of consuming too much... limiting.
464 Cerr<< c<<" limite ici0 "<< rapport <<" st "<<St<<" "<<C[c]<<" "<<C[c]/rapport<<finl;
465 // exit();
466 for (int i=0; i<nbr_directe; i++)
467 {
468 Reaction& reaction=reactions_[marq_directe[i]];
469 assert(reaction.contre_reaction_<=0);
470
471 if (reaction.coeff_Y_[c]>0.)
472 proportion_eq[i]*=C[c]/rapport;
473
474 }
475 }
476 }
477 // apply direct reactions C(c)-=St;
478 for (int c=0; c<nbc; c++)
479 {
480 double St=0;
481 for (int i=0; i<nbr_directe; i++)
482 {
483 Reaction& reaction=reactions_[marq_directe[i]];
484 assert(reaction.contre_reaction_<=0);
485 if (reaction.coeff_Y_[c]!=0.)
486 St+=proportion_eq[i]*reaction.coeff_stoechio_[c];
487 }
488
489 // Cerr<<C(c)<<" "<< c<< " la st "<<St<<" ";
490 //assert(St<=(C(c)*securite));
491 C[c]-=St;
492 assert(C[c]>=0);
493 // Cerr<< C(c)<<finl;
494
495 }
496 // now process equilibrium reactions one by one
497
498 securite=0.5;
499 for (int reac=0; reac<nbr; reac++)
500 {
501 Reaction& reaction=reactions_[reac];
502
503 if (reaction.contre_reaction_>0)
504 {
505 double proportion_directe;
506 double proportion=reaction.calcul_proportion_implicite(C_tmp, C,dt_chimie,1e-7,proportion_directe);
507 for (int i=0; i<nbc; i++)
508 if (reaction.coeff_Y_[i]!=0.) // it is a reactant or a product
509 {
510 C[i]=C[i]-proportion*reaction.coeff_stoechio_[i];
511 }
512 }
513 }
514 }
515 // reaction.reagir(liste_C_,dt_chimie);
516 for (int i=0; i<liste_C_.size(); i++)
517 liste_C_[i]->valeurs()(elem)=C[i];
518
519 }
520
521 for (int i=0; i<liste_C_.size(); i++)
522 liste_C_[i]->valeurs().echange_espace_virtuel();
523
524 return;
525 }
526 Cerr<<"Chimie available only with concentrations"<<finl;
527 exit();
528
529}
530
531bool Chimie::has_champ(const Motcle& nom, OBS_PTR(Champ_base)& ref_champ) const
532{
533 for (int i = 0; i < reactions_.size(); i++)
534 {
535 Nom test("omega_");
536 test += Nom(i);
537 if (nom == test)
538 {
539 ref_champ = reactions_[i].get_omega();
540 return true;
541 }
542 }
543
544 return false; /* nothing found */
545}
546
547bool Chimie::has_champ(const Motcle& nom) const
548{
549 for (int i = 0; i < reactions_.size(); i++)
550 {
551 Nom test("omega_");
552 test += Nom(i);
553 if (nom == test)
554 return true;
555 }
556
557 return false; /* nothing found */
558}
559
560const Champ_base& Chimie::get_champ(const Motcle& nom) const
561{
562 for (int i = 0; i < reactions_.size(); i++)
563 {
564 Nom test("omega_");
565 test += Nom(i);
566 if (nom == test)
567 return reactions_[i].get_omega();
568 }
569
570 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
571}
572
574{
575 if (opt==DESCRIPTION)
576 Cerr<<" Chimie :";
577 int nb_reac=reactions_.size();
578 for (int i=0; i<nb_reac; i++)
579 {
580 Nom test("omega_");
581 test+=Nom(i);
582 if (opt==DESCRIPTION)
583 Cerr<< test;
584 else
585 nom.add(test);
586 }
587 if (opt==DESCRIPTION)
588 Cerr<<finl;
589}
590
592{
593 return 1;
594}
595
597{
598 return 1;
599}
600
Class Champ_Inc_base.
class Champ_base This class is the base of the fields hierarchy.
Definition Champ_base.h:43
int sauvegarder(Sortie &) const override
Saves an Objet_U to an output stream. Virtual method to override.
Definition Chimie.cpp:591
Motcle espece_en_competition_micro_melange_
Definition Chimie.h:58
void discretiser(const Probleme_base &)
Definition Chimie.cpp:164
liste_ai_
Definition Chimie.h:53
int reprendre(Entree &) override
Restores an Objet_U from an input stream. Virtual method to override.
Definition Chimie.cpp:596
virtual bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const
virtual int preparer_calcul()
Definition Chimie.cpp:174
int modele_micro_melange_
Definition Chimie.h:56
virtual const Champ_base & get_champ(const Motcle &nom) const
Definition Chimie.cpp:560
double calculer_pas_de_temps() const
Definition Chimie.cpp:48
void mettre_a_jour(double temps)
Definition Chimie.cpp:181
virtual void completer(const Probleme_base &pb)
Definition Chimie.cpp:71
int marqueur_espece_en_competition_micro_melange_
Definition Chimie.h:59
OBS_PTR(Probleme_base) pb_
LIST(Reaction) reactions_
Motcles alias
Definition Chimie.h:52
liste_C_
Definition Chimie.h:53
DoubleTab Puissance_volumique_
Definition Chimie.h:55
int nb_grains_
Definition Chimie.h:54
double constante_modele_micro_melange_
Definition Chimie.h:57
virtual void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const
Definition Chimie.cpp:573
Convection_Diffusion_Concentration Special case of Convection_Diffusion_std.
const Champ_Inc_base & inconnue() const override
Returns the unknown field of the equation: the concentration.
class Domaine_VF
Definition Domaine_VF.h:44
double volumes(int i) const
Definition Domaine_VF.h:113
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
Definition Domaine_VF.h:418
const Nom & le_nom() const override
Returns the name of the field.
A character string (Nom) in uppercase.
Definition Motcle.h:26
class Nom: a character string for naming TRUST objects.
Definition Nom.h:31
const std::string & getString() const
Definition Nom.h:92
An array of character strings (VECT(Nom)).
Definition Noms.h:26
Inherits from Objet_U, adds the very common method set_param for the Objet_U hierarchy.
virtual void set_param(Param &) const
Definition Objet_U.h:130
friend class Entree
Definition Objet_U.h:71
static int dimension
Definition Objet_U.h:94
friend class Sortie
Definition Objet_U.h:70
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
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
class Probleme_base It is a Probleme_U that is not a coupling.
virtual int nombre_d_equations() const =0
virtual const Equation_base & equation(int) const =0
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466
ArrOfDouble coeff_Y_
Definition Reaction.h:66
double contre_reaction_
Definition Reaction.h:61
double Ea_
Definition Reaction.h:64
ArrOfDouble coeff_activite_
Definition Reaction.h:67
double c_r_Ea_
Definition Reaction.h:62
double constante_taux_reaction_
Definition Reaction.h:59
double beta_
Definition Reaction.h:65
const int & nb_sous_pas_de_temps_reaction() const
Definition Reaction.h:48
void reagir(VECT(OBS_PTR(Champ_Inc_base))&liste_c, const double deltat) const
Definition Reaction.cpp:182
ArrOfDouble coeff_stoechio_
Definition Reaction.h:66
double calcul_proportion_implicite(ArrOfDouble &C_temp, const ArrOfDouble &C0, double deltat, double seuil, double &poroportion_directe) const
Definition Reaction.cpp:240
Base class for output streams.
Definition Sortie.h:52
_TYPE_ * addr()
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")