TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Convection_Diffusion_Fluide_Dilatable_Proto.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 <Convection_Diffusion_Fluide_Dilatable_base.h>
17#include <Convection_Diffusion_Fluide_Dilatable_Proto.h>
18#include <Navier_Stokes_Fluide_Dilatable_base.h>
19#include <Fluide_Weakly_Compressible.h>
20#include <Convection_Diffusion_std.h>
21#include <EcritureLectureSpecial.h>
22#include <Op_Conv_negligeable.h>
23#include <Discretisation_base.h>
24#include <Schema_Temps_base.h>
25#include <Champ_Uniforme.h>
26#include <Probleme_base.h>
27#include <Matrice_Morse.h>
28#include <TRUST_2_PDI.h>
29#include <TRUSTTrav.h>
30#include <Operateur.h>
31#include <Domaine.h>
32#include <Avanc.h>
33#include <Device.h>
34#include <Perf_counters.h>
35
37(DoubleTab& Div, const Convection_Diffusion_Fluide_Dilatable_base& eqn) const
38{
39 const Operateur& op_conv = eqn.operateur(1);
40 // No convective operator:
41 if (sub_type(Op_Conv_negligeable,op_conv.l_op_base()))
42 {
43 Div=0;
44 return;
45 }
46
47 // on cherche a changer temporairement le domaine_cl
48 if (!ch_unite_)
49 {
50 ch_unite_ = eqn.inconnue();
51 ch_unite_->valeurs() = 1.0;
52 }
53 ref_cast_non_const(Operateur_Conv_base,op_conv.l_op_base()).associer_champ_temp(ch_unite_, true);
54
55 if (eqn.discretisation().que_suis_je() != "VDF")
56 ref_cast_non_const(Operateur_base,op_conv.l_op_base()).associer_domaine_cl_dis(eqn.domaine_cl_modif());
57
58 op_conv.ajouter(ch_unite_->valeurs(), Div);
59 ref_cast_non_const(Operateur_Conv_base,op_conv.l_op_base()).associer_champ_temp(eqn.inconnue(), false);
60
61 if (eqn.discretisation().que_suis_je() != "VDF")
62 ref_cast_non_const(Operateur_base,op_conv.l_op_base()).associer_domaine_cl_dis(eqn.domaine_Cl_dis());
63}
64
65/*! @brief Renvoie la derivee en temps de l'inconnue de l'equation.
66 *
67 * Le calcul est le suivant:
68 * d(inconnue)/dt = M^{-1} * (sources - somme(Op_{i}(inconnue))) / rho
69 *
70 * @param (DoubleTab& derivee) le tableau des valeurs de la derivee en temps du champ inconnu
71 * @return (DoubleTab&) le tableau des valeurs de la derivee en temps du champ inconnu
72 */
74(Convection_Diffusion_Fluide_Dilatable_base& eqn, DoubleTab& derivee, const bool is_expl)
75{
76 /*
77 * ATTENTION : THIS IS A GENERIC METHOD THAT IS USED TO SOLVE EXPLICITLY (OR DIFFUSION IMPLICIT)
78 * A THERMAL OR SPECIES CONV/DIFF EQUATION. SO THE VARIABLE CAN EITHER BE THE TEMPERATURE T OR
79 * THE MASS FRACTION Y.
80 *
81 * For the species equation for example, we have :
82 * d(rho Y)/dt + div( rho*u*Y ) = div( rho*D*grad(Y) )
83 *
84 * With a non conservative formulation we write:
85 * rho d(Y)/dt + Y d(rho)/dt + Y div (rho*u) + rho*u grad(Y) = div( rho*D*grad(Y) )
86 *
87 * Using the mass equation, we get :
88 * rho d(Y)/dt + rho*u grad(Y) = div( rho*D*grad(Y) )
89 *
90 * divide by rho => d(Y)/dt = ( div( rho*D*grad(Y) ) + S ) / rho - u grad(Y)
91 *
92 * This is what we code here with derivee = d(Y)/dt
93 *
94 *
95 * Similarly for the temperature equation, we code
96 *
97 * derivee = d(T)/dt = ( div( lambda*grad(T) ) + S ) / (rho*Cp) - u grad(T)
98 */
99
100 const Schema_Temps_base& sch = eqn.schema_temps();
101 int diffusion_implicite=sch.diffusion_implicite();
102 eqn.domaine_Cl_dis().les_conditions_limites().set_modifier_val_imp(0);
103
104 /*
105 * FIRST TERM : diffusive
106 * derivee = div( rho*D*grad(Y) ) or div( lambda*grad(T) )
107 */
108 Fluide_Dilatable_base& fluide_dil = eqn.fluide();
109 if ( !is_thermal() /* species equation */ || (is_thermal() && fluide_dil.type_fluide()=="Gaz_Parfait" ))
110 {
111 if (!diffusion_implicite) eqn.operateur(0).ajouter(derivee);
112 }
113 else // Thermal equation + Gaz reel => No diffusion implicit ...
114 {
115 eqn.operateur(0).ajouter(fluide_dil.temperature(),derivee);
116 if (diffusion_implicite)
117 {
118 Cerr << "Error: diffusion implicit not implemented in Convection_Diffusion_Chaleur_Fluide_Dilatable_base" << finl;
120 }
121 }
122
123 eqn.domaine_Cl_dis().les_conditions_limites().set_modifier_val_imp(1);
124 derivee.echange_espace_virtuel();
125
126 // Add source term (if any, but for temperatur eit is sure !!! )
127 eqn.sources().ajouter(derivee);
128
129 // On divise derivee par rho si espece ou gaz reel... sinon par rho*Cp !
130 bool flag = is_thermal() && fluide_dil.type_fluide()=="Gaz_Parfait";
131 if (flag) fluide_dil.update_rho_cp(sch.temps_courant());
132 const DoubleTab& array = flag ? eqn.get_champ("rho_cp_comme_T").valeurs() : fluide_dil.masse_volumique().valeurs();
133 tab_divide_any_shape(derivee, array);
134 derivee.echange_espace_virtuel();
135
136 /*
137 * SECOND TERM : convective
138 * = - u grad(Y) = [ Y div (rho*u) - div( rho*u*Y ) ] / rho
139 * or
140 * = - u grad(T) = [ T div (rho*u) - div( rho*u*T ) ] / rho*Cp
141 */
142 DoubleTrav convection(derivee);
143
144 // Add Y div (rho*u) or T div (rho*u)
145 const DoubleTab& inco = eqn.inconnue().valeurs();
146 calculer_div_u_ou_div_rhou(convection);
147
148 tab_multiply_any_shape(convection, inco);
149 convection*=-1;
150
151 // Add convection operator: - div( rho*u*Y ) or -div ( rho*u*T )
152 eqn.operateur(1).ajouter(convection);
153
154 // Divide by rho if necessary
155 if (is_generic())
156 {
157 const DoubleTab& tab_rho = fluide_dil.masse_volumique().valeurs();
158 tab_divide_any_shape(convection, tab_rho);
159 }
160
161 // Complete with special source terms from mass equation (if any)
162 DoubleTrav mass_source_term(derivee);
163 mass_source_term = 0.0;
164
165 const bool has_mass_flux = (sub_type(Navier_Stokes_Fluide_Dilatable_base, fluide_dil.vitesse().equation())) ?
166 ref_cast(Navier_Stokes_Fluide_Dilatable_base, fluide_dil.vitesse().equation()).has_source_masse() : false;
167
168 if (!is_thermal() && has_mass_flux) /* species equation */
169 {
170 const Source_Masse_Fluide_Dilatable_base& src_masse = ref_cast(Navier_Stokes_Fluide_Dilatable_base, fluide_dil.vitesse().equation()).source_masse();
171 src_masse.ajouter_eq_espece(eqn, fluide_dil, is_expl, mass_source_term);
172 }
173
174 /*
175 * TOTAL TERM : diffusive + convective + sources
176 */
177 derivee+=convection;
178
179 // si schema implicite
180 if (!is_expl && has_mass_flux)
181 derivee += mass_source_term; // pour ca on traite le volume par le solveur de masse plus tard ...
182
183 if (diffusion_implicite)
184 {
185 const DoubleTab& Tfutur=eqn.inconnue().futur();
186 DoubleTrav secmem(derivee);
187 secmem=derivee; // sans contribution terme source
188 eqn.solv_masse().appliquer(secmem);
189
190 if (has_mass_flux)
191 secmem += mass_source_term ; // ajoute contribution terme source (deja divise par V)
192
193 derivee = Tfutur;
194
195 is_thermal() ? eqn.solv_masse().set_name_of_coefficient_temporel("rho_cp_comme_T") :
196 eqn.solv_masse().set_name_of_coefficient_temporel("masse_volumique");
197
198 eqn.Gradient_conjugue_diff_impl(secmem,derivee);
200 }
201
202 // 100% explicite
203 if (!sch.diffusion_implicite() && is_expl)
204 {
205 eqn.solv_masse().appliquer(derivee);
206
207 if (has_mass_flux)
208 derivee += mass_source_term; // ajoute contribution terme source (deja divise par V)
209
210 derivee.echange_espace_virtuel();
211 }
212
213 return derivee;
214} /* END derivee_en_temps_inco_sans_solveur_masse_impl */
215
218 Matrice_Morse& matrice_morse, const DoubleTab& inco, DoubleTab& resu)
219{
220 /*
221 * ATEENTION : THIS IS A GENERIC METHOD THAT IS USED TO SOLVE IMPLICITLY A THERMAL OR SPECIES
222 * CONV/DIFF EQUATION. SO THE VARIABLE CAN EITHER BE THE TEMPERATURE T OR THE MASS FRACTION Y.
223 *
224 * See the previous method derivee_en_temps_inco_sans_solveur_masse_impl for more description
225 * of the treated equations.
226 */
227
228 // Elie Saikali
229 // Je garde ce test pour debug ... TODO : a voir si on peut virer tout ca...
230 int test_op=0;
231 {
232 char* theValue = getenv("TRUST_TEST_OPERATEUR_IMPLICITE");
233 if (theValue != nullptr) test_op=2;
234 }
235 {
236 char* theValue = getenv("TRUST_TEST_OPERATEUR_IMPLICITE_BLOQUANT");
237 if (theValue != nullptr) test_op=1;
238 }
239
240 Fluide_Dilatable_base& fluide_dil = eqn.fluide();
241 const DoubleTab& tab_rho = fluide_dil.masse_volumique().valeurs();
242 const int n = tab_rho.dimension(0);
243
244 // ajout diffusion (avec rho, D et Y / ou lambda et T)
245 eqn.operateur(0).l_op_base().contribuer_a_avec(inco, matrice_morse);
246
247 // Add source term (if any)
248 eqn.sources().contribuer_a_avec(inco,matrice_morse);
249
250 // Really we need to copy ?
251 tab_coeff_diffusif_ = matrice_morse.get_set_coeff();
252
253 // on calcule les coefficients de l'op de convection on obtient les coeff de div (rho*u*Y)
254 // ou div(rho*u*T). dans le cas thermique, il faudrait multiplier par cp puis divisier par rho cp
255 // on le fera d'un coup...
256 matrice_morse.get_set_coeff()=0.;
257 eqn.operateur(1).l_op_base().contribuer_a_avec(inco, matrice_morse);
258
259 // on calcule div(rho * u)
260 DoubleTrav tab_derivee2(resu);
261 calculer_div_u_ou_div_rhou(tab_derivee2);
262
263 if (!is_thermal()) //espece
264 {
265 ToDo_Kokkos("critical");
266 const auto& tab1 = matrice_morse.get_tab1();
267 auto& coeff = matrice_morse.get_set_coeff();
268 for (int som=0 ; som<n ; som++)
269 {
270 double inv_rho = 1. / tab_rho(som);
271 for (auto k=tab1(som)-1; k<tab1(som+1)-1; k++)
272 coeff(k)= (coeff(k)*inv_rho+tab_coeff_diffusif_(k)*inv_rho);
273
274 matrice_morse(som,som)+=tab_derivee2(som)*inv_rho;
275 }
276 }
277 else if (is_thermal() && fluide_dil.type_fluide()=="Gaz_Parfait")
278 {
279 fluide_dil.update_rho_cp(eqn.schema_temps().temps_courant());
280 // ToDo add tab1, tab2, coeff() methods to Matrice_morse_View avoid list of accessors...
281 CDoubleArrView rhoCp = static_cast<const ArrOfDouble&>(eqn.get_champ("rho_cp_comme_T").valeurs()).view_ro();
282 CDoubleArrView rho = static_cast<const ArrOfDouble&>(tab_rho).view_ro();
283 CDoubleArrView derivee2 = static_cast<const ArrOfDouble&>(tab_derivee2).view_ro();
284 auto tab1 = matrice_morse.get_tab1().view_ro();
285 CDoubleArrView coeff_diffusif = tab_coeff_diffusif_.view_ro();
286 DoubleArrView coeff = matrice_morse.get_set_coeff().view_wo();
287 bool is_not_generic = !is_generic();
288 Matrice_Morse_View matrice;
289 matrice.set(matrice_morse);
290 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_1D(0, n), KOKKOS_LAMBDA(const int som)
291 {
292 double inv_rho = 1. / rho(som);
293 if (is_not_generic) inv_rho = 1.;
294 double rapport = 1. / rhoCp(som);
295
296 // il faut multiplier toute la ligne de la matrice par rapport
297 for (auto k=tab1(som)-1; k<tab1(som+1)-1; k++)
298 coeff(k)= (coeff(k)*inv_rho+coeff_diffusif(k)*rapport);
299
300 // ajout de Tdiv(rhou )/rho
301 matrice.add(som,som,derivee2(som)*inv_rho);
302 });
303 end_gpu_timer(__KERNEL_NAME__);
304 }
305 else
306 {
307 Cerr<<"The implicit algorithm is available only for perfect gas."<<finl;
309 }
310
311 // on a la matrice approchee on recalcule le residu;
312 resu=0;
313 derivee_en_temps_inco_sans_solveur_masse_impl(eqn,resu,false /* implicit */);
314 matrice_morse.ajouter_multvect(inco,resu);
315
316 if (test_op)
317 {
318 DoubleTrav diff(resu), conv(resu);
321 eqn.sources().ajouter(diff);
322 double Cp = -5.;
323 int is_cp_unif= sub_type(Champ_Uniforme,fluide_dil.capacite_calorifique());
324 const DoubleTab& tab_cp = fluide_dil.capacite_calorifique().valeurs();
325 if (is_cp_unif) Cp=tab_cp(0,0);
326
327 for (int som=0 ; som<n ; som++)
328 {
329 if (!is_cp_unif) Cp=tab_cp(som);
330 double inv_rho=1./tab_rho(som);
331 if (!is_generic()) inv_rho=1;
332 double rapport=1./(tab_rho(som)*Cp);
333 diff(som)=resu(som)-conv(som)*inv_rho-diff(som)*rapport;
334 }
335 eqn.solv_masse().appliquer(diff);
336 double err=mp_max_abs_vect(diff);
337 Cerr << eqn.que_suis_je() <<" : Erreur assemblage = " << err << finl;;
338
339 if (err > 1.e-5)
340 {
341 DoubleVect& diff_=diff;
342 Cerr<<" size "<< diff_.size()<<finl;
343 for (int i=0; i<diff_.size(); i++)
344 if (std::fabs(diff_(i))>1e-5) Cerr<<i << " "<< diff_(i)<< " "<<finl;
345
346 if (test_op==1)
347 {
348 Cerr<<" pb max case "<<imin_array(diff)<<" ou " <<imax_array(diff)<<finl;
350 }
351 }
352 }
353} /* END assembler_impl */
354
355void Convection_Diffusion_Fluide_Dilatable_Proto::assembler_blocs(Convection_Diffusion_Fluide_Dilatable_base& eqn,matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl)
356{
357 const std::string& nom_inco = eqn.inconnue().le_nom().getString();
358 Matrice_Morse *mat = matrices.count(nom_inco)?matrices.at(nom_inco):nullptr;
359
360 Fluide_Dilatable_base& fluide_dil = eqn.fluide();
361 const DoubleTab& tab_rho = fluide_dil.masse_volumique().valeurs();
362 const int n = tab_rho.dimension(0);
363
364 Matrice_Morse mat_diff(*mat);
365 DoubleTab secmem_tmp(secmem);
366 eqn.operateur(0).l_op_base().ajouter_blocs({{nom_inco, &mat_diff}}, secmem_tmp, semi_impl);
367 statistics().end_count(STD_COUNTERS::ajouter_blocs);
368
369 statistics().begin_count(STD_COUNTERS::source_terms,statistics().get_last_opened_counter_level()+1);
370 for (int i = 0; i < eqn.sources().size(); i++)
371 eqn.sources()(i)->ajouter_blocs({{nom_inco, &mat_diff}}, secmem_tmp, semi_impl);
372 statistics().end_count(STD_COUNTERS::source_terms);
373
374 statistics().begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
375 auto& coeff_diffusif = mat_diff.get_set_coeff();
376
377 const auto& tab1 = mat->get_tab1();
378 auto& coeff = mat->get_set_coeff();
379 coeff = 0;
380 eqn.operateur(1).l_op_base().ajouter_blocs(matrices, secmem_tmp, semi_impl);
381
382 // on calcule div(rho * u)
384
385 if (!is_thermal()) //espece
386 {
387 for (int som=0 ; som<n ; som++)
388 {
389 double inv_rho = 1. / tab_rho(som);
390 for (auto k=tab1(som)-1; k<tab1(som+1)-1; k++) coeff(k)= (coeff(k)*inv_rho+coeff_diffusif(k)*inv_rho);
391
392 if(mat) (*mat)(som,som)+=secmem(som)*inv_rho;
393 }
394 }
395 else if (is_thermal() && fluide_dil.type_fluide()=="Gaz_Parfait")
396 {
397 fluide_dil.update_rho_cp(eqn.schema_temps().temps_courant());
398 const DoubleTab& rhoCp = eqn.get_champ("rho_cp_comme_T").valeurs();
399
400 for (int som=0 ; som<n ; som++)
401 {
402 double inv_rho = 1. / tab_rho(som);
403 if (!is_generic()) inv_rho = 1.;
404 double rapport = 1. / rhoCp(som);
405
406 // il faut multiplier toute la ligne de la matrice par rapport
407 for (auto k=tab1(som)-1; k<tab1(som+1)-1; k++) coeff(k)= (coeff(k)*inv_rho+coeff_diffusif(k)*rapport);
408
409 // ajout de Tdiv(rhou )/rho
410 if(mat) (*mat)(som,som) += secmem(som)*inv_rho;
411 }
412 }
413 else
414 {
415 Cerr<<"The implicit algorithm is available only for perfect gas."<<finl;
417 }
418
419 // on a la matrice approchee on recalcule le residu;
420 secmem=0;
421 derivee_en_temps_inco_sans_solveur_masse_impl(eqn,secmem,false /* implicit */);
422 if(mat) mat->ajouter_multvect(eqn.inconnue().valeurs(),secmem);
423}
424
425/*
426 * Methodes statiques
427 */
428
430{
431 std::vector<YAML_data> data = eq.data_a_sauvegarder_base();
432
433 Fluide_Weakly_Compressible& FWC = ref_cast_non_const(Fluide_Weakly_Compressible,fld);
434 OWN_PTR(Champ_Inc_base) p_tab = FWC.inco_chaleur(); // Initialize with same discretization
435 std::string name = eq.probleme().le_nom().getString() + "_Pression_EOS";
436 int nb_dim = p_tab->valeurs().nb_dim();
437 YAML_data pressure(name, "double", nb_dim);
438 data.push_back(pressure);
439 return data;
440}
441
443 const Convection_Diffusion_std& eq,
444 const Fluide_Dilatable_base& fld)
445{
446 int bytes=0,a_faire,special;
447 bytes += eq.sauvegarder_base(os); // XXX : voir Convection_Diffusion_std
449
450 Fluide_Weakly_Compressible& FWC = ref_cast_non_const(Fluide_Weakly_Compressible,fld);
451 if (a_faire)
452 {
453 OWN_PTR(Champ_Inc_base) p_tab = FWC.inco_chaleur(); // Initialize with same discretization
454 p_tab->nommer("Pression_EOS");
455 p_tab->valeurs() = FWC.pression_th_tab(); // Use good values
456 if (special && Process::is_parallel())
457 Cerr << "ATTENTION : For a parallel calculation, the field Pression_EOS is not saved in xyz format ... " << finl;
458 else
459 bytes += p_tab->sauvegarder(os);
460 }
462 {
463 // Different treatment with PDI as the backup will be triggered later, so we can't share a temporary pointer...
464 const DoubleTab& p_th_tab = FWC.pression_th_tab();
465 std::string name = eq.probleme().le_nom().getString() + "_Pression_EOS";
466
467 // Sharing the dimensions of the unknown field with PDI
468 TRUST_2_PDI pdi_interface;
469 pdi_interface.share_TRUSTTab_dimensions(p_th_tab, name, 1 /*write mode*/);
470 // Sharing the unknown field with PDI
471 if( p_th_tab.dimension_tot(0) )
472 pdi_interface.TRUST_start_sharing(name, p_th_tab.addr());
473 else
474 {
475 ArrOfDouble garbage( p_th_tab.nb_dim() );
476 pdi_interface.TRUST_start_sharing(name, garbage.addr());
477 }
478
479 bytes = 8 * p_th_tab.size_array();
480 }
481
482 return bytes;
483}
484
486 double temps,
489 Champ_Inc_base& inco,
490 Probleme_base& pb)
491{
492 // start resuming
493 eq.reprendre_base(is); // XXX : voir Convection_Diffusion_std
494
495 // XXX : should be set so that Pression_EOS is read and not initialized from data file
497 FWC.set_resume_flag();
498 // resume EOS pressure field
499 OWN_PTR(Champ_Inc_base) p_tab = FWC.inco_chaleur(); // Initialize with same discretization
500
501 p_tab->nommer("Pression_EOS");
503 {
504 Cerr << "Error in Convection_Diffusion_Espece_Binaire_WC::reprendre !" << finl;
505 Cerr << "Use the sauv file to resume a parallel WC calculation (Pression_EOS is required) ... " << finl;
507 }
508 else
509 {
511 {
512 Nom field_tag(p_tab->le_nom());
513 field_tag += p_tab->que_suis_je();
514 field_tag += pb.domaine().le_nom();
515 field_tag += Nom(temps,pb.reprise_format_temps());
517 {
518 Nom field_tag_syno = eq.create_polymacfamily_syno(field_tag);
519 avancer_fichier_with_syno(is,field_tag,field_tag_syno);
520 }
521 // end of the backward compatibility
522 else
523 avancer_fichier(is,field_tag);
524 }
525 p_tab->reprendre(is);
526 }
527
528 // set good field
529 FWC.set_pression_th_tab(p_tab->valeurs());
530
531 return 1;
532}
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
Classe Champ_Inc_base.
DoubleTab & futur(int i=1) override
Renvoie les valeurs du champs a l'instant t+i.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
void calculer_div_rho_u_impl(DoubleTab &res, const Convection_Diffusion_Fluide_Dilatable_base &eqn) const
static std::vector< YAML_data > data_a_sauvegarder(const Convection_Diffusion_std &eq, const Fluide_Dilatable_base &fld)
DoubleTab & derivee_en_temps_inco_sans_solveur_masse_impl(Convection_Diffusion_Fluide_Dilatable_base &eqn, DoubleTab &derivee, const bool is_expl)
Renvoie la derivee en temps de l'inconnue de l'equation.
public_for_cuda void assembler_impl(Convection_Diffusion_Fluide_Dilatable_base &eqn, Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem)
static int Reprendre_WC(Entree &is, double temps, Convection_Diffusion_std &eq, Fluide_Dilatable_base &fld, Champ_Inc_base &inco, Probleme_base &pb)
virtual void calculer_div_u_ou_div_rhou(DoubleTab &res) const =0
static int Sauvegarder_WC(Sortie &os, const Convection_Diffusion_std &eq, const Fluide_Dilatable_base &fld)
void assembler_blocs(Convection_Diffusion_Fluide_Dilatable_base &eqn, matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl)
classe Convection_Diffusion_Fluide_Dilatable_base pour un fluide dilatable
classe Convection_Diffusion_std Cette classe est la base des equations modelisant le transport
std::vector< YAML_data > data_a_sauvegarder_base() const
const Operateur & operateur(int) const override
Renvoie l'operateur specifie par son index: renvoie terme_diffusif si i = 0.
virtual bool is_poly_family() const
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
static int is_ecriture_special(int &special, int &a_faire)
indique si le format special a ete demande en lecture active par sauvegarde xyz .
static int is_lecture_special()
indique si le format special a ete demande en lecture active par reprise xyz .
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
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.
Nom create_polymacfamily_syno(const Nom &field_tag) const
Create a synonym of a field name in order to ensure backward compatibility with old names of the Poly...
const Champ_base & get_champ(const Motcle &nom) const override
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
void Gradient_conjugue_diff_impl(DoubleTrav &secmem, DoubleTab &solution)
const Nom & le_nom() const override
Renvoie le nom du champ.
void nommer(const Nom &) override
Donne un nom au champ.
classe Fluide_Dilatable_base Cette classe represente un d'un fluide dilatable,
const DoubleTab & temperature() const
Renvoie le tableau des valeurs de le temperature.
const Champ_Inc_base & inco_chaleur() const
void update_rho_cp(double temps) override
const Champ_Inc_base & vitesse() const
const Nom type_fluide() const
classe Fluide_Weakly_Compressible Cette classe represente un d'un fluide faiblement compressible
const DoubleTab & pression_th_tab() const
void set_pression_th_tab(DoubleTab &Pth_tab)
virtual DoubleVect & ajouter_multvect(const DoubleVect &x, DoubleVect &r) const
Operation de multiplication-accumulation (saxpy) matrice vecteur.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const auto & get_tab1() const
auto & get_set_coeff()
virtual const Champ_Don_base & capacite_calorifique() const
Renvoie la capacite calorifique du milieu.
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
classe Navier_Stokes_Fluide_Dilatable_base Cette classe basse porte les termes de l'equation de la dy...
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
const std::string & getString() const
Definition Nom.h:92
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual int sauvegarder(Sortie &) const
Sauvegarde d'un Objet_U sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:352
Classe Op_Conv_negligeable Cette classe represente un opperateur de convection negligeable.
classe Operateur_Conv_base Cette classe est la base de la hierarchie des operateurs representant
classe Operateur_base Classe est la base de la hierarchie des objets representant un
virtual void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
virtual void contribuer_au_second_membre(DoubleTab &) const
DOES NOTHING - to override in derived classes.
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={ }) const
classe Operateur Classe generique de la hierarchie des operateurs.
Definition Operateur.h:39
virtual Operateur_base & l_op_base()=0
virtual DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const =0
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Probleme_U.h:109
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
const Discretisation_base & discretisation() const
Renvoie la discretisation associee au probleme.
const char * reprise_format_temps() const
static bool is_parallel()
Definition Process.cpp:110
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
class Schema_Temps_base
int diffusion_implicite() const
Renvoie 1 si le schema en temps a ete lu diffusion_implicite.
double temps_courant() const
Renvoie le temps courant.
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
void set_name_of_coefficient_temporel(const Nom &)
permet de choisir le nom du coefficient temporelle que l'on veut utiliser pour appliquer
Classe de base des flux de sortie.
Definition Sortie.h:52
: classe Source_Masse_Fluide_Dilatable_base Une source speciale pour l'equation de masse (utilisee se...
virtual void ajouter_eq_espece(const Convection_Diffusion_Fluide_Dilatable_base &eqn, const Fluide_Dilatable_base &fluide, const bool is_expl, DoubleVect &resu) const =0
void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
contribution a la matrice implicite des termes sources par defaut pas de contribution
Definition Sources.cpp:201
DoubleTab & ajouter(DoubleTab &) const
Ajoute la contribution de toutes les sources de la liste au tableau passe en parametre,...
Definition Sources.cpp:85
_SIZE_ size_array() const
_TYPE_ * addr()
int nb_dim() const
Definition TRUSTTab.h:199
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size() const
Definition TRUSTVect.tpp:45
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
classe TRUST_2_PDI Encapsulation of PDI methods (library used for IO operations). See the website pdi...
Definition TRUST_2_PDI.h:59
static int is_PDI_checkpoint()
static int is_PDI_restart()
void share_TRUSTTab_dimensions(const DoubleTab &tab, const Nom &name, int write)
Generic method to share the dimensions of a TRUST DoubleTab with PDI.
void TRUST_start_sharing(const std::string &name, const void *data)
classe YAML_data : collection of all needed information for data to save/restore in order to write th...
Definition YAML_data.h:26