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>
34#include <Perf_counters.h>
58 op_conv.
ajouter(ch_unite_->valeurs(), Div);
116 if (diffusion_implicite)
118 Cerr <<
"Error: diffusion implicit not implemented in Convection_Diffusion_Chaleur_Fluide_Dilatable_base" << finl;
133 tab_divide_any_shape(derivee, array);
142 DoubleTrav convection(derivee);
148 tab_multiply_any_shape(convection, inco);
158 tab_divide_any_shape(convection, tab_rho);
162 DoubleTrav mass_source_term(derivee);
163 mass_source_term = 0.0;
180 if (!is_expl && has_mass_flux)
181 derivee += mass_source_term;
183 if (diffusion_implicite)
186 DoubleTrav secmem(derivee);
191 secmem += mass_source_term ;
208 derivee += mass_source_term;
218 Matrice_Morse& matrice_morse,
const DoubleTab& inco, DoubleTab& resu)
232 char* theValue = getenv(
"TRUST_TEST_OPERATEUR_IMPLICITE");
233 if (theValue !=
nullptr) test_op=2;
236 char* theValue = getenv(
"TRUST_TEST_OPERATEUR_IMPLICITE_BLOQUANT");
237 if (theValue !=
nullptr) test_op=1;
260 DoubleTrav tab_derivee2(resu);
265 ToDo_Kokkos(
"critical");
266 const auto& tab1 = matrice_morse.
get_tab1();
268 for (
int som=0 ; som<n ; som++)
270 double inv_rho = 1. / tab_rho(som);
271 for (
auto k=tab1(som)-1; k<tab1(som+1)-1; k++)
274 matrice_morse(som,som)+=tab_derivee2(som)*inv_rho;
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();
286 DoubleArrView coeff = matrice_morse.
get_set_coeff().view_wo();
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)
292 double inv_rho = 1. / rho(som);
293 if (is_not_generic) inv_rho = 1.;
294 double rapport = 1. / rhoCp(som);
297 for (
auto k=tab1(som)-1; k<tab1(som+1)-1; k++)
298 coeff(k)= (coeff(k)*inv_rho+coeff_diffusif(k)*rapport);
301 matrice.add(som,som,derivee2(som)*inv_rho);
303 end_gpu_timer(__KERNEL_NAME__);
307 Cerr<<
"The implicit algorithm is available only for perfect gas."<<finl;
318 DoubleTrav diff(resu), conv(resu);
325 if (is_cp_unif) Cp=tab_cp(0,0);
327 for (
int som=0 ; som<n ; som++)
329 if (!is_cp_unif) Cp=tab_cp(som);
330 double inv_rho=1./tab_rho(som);
332 double rapport=1./(tab_rho(som)*Cp);
333 diff(som)=resu(som)-conv(som)*inv_rho-diff(som)*rapport;
336 double err=mp_max_abs_vect(diff);
337 Cerr << eqn.
que_suis_je() <<
" : Erreur assemblage = " << err << finl;;
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;
348 Cerr<<
" pb max case "<<imin_array(diff)<<
" ou " <<imax_array(diff)<<finl;
358 Matrice_Morse *mat = matrices.count(nom_inco)?matrices.at(nom_inco):
nullptr;
365 DoubleTab secmem_tmp(secmem);
367 statistics().end_count(STD_COUNTERS::ajouter_blocs);
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);
374 statistics().begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
387 for (
int som=0 ; som<n ; som++)
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);
392 if(mat) (*mat)(som,som)+=secmem(som)*inv_rho;
400 for (
int som=0 ; som<n ; som++)
402 double inv_rho = 1. / tab_rho(som);
404 double rapport = 1. / rhoCp(som);
407 for (
auto k=tab1(som)-1; k<tab1(som+1)-1; k++) coeff(k)= (coeff(k)*inv_rho+coeff_diffusif(k)*rapport);
410 if(mat) (*mat)(som,som) += secmem(som)*inv_rho;
415 Cerr<<
"The implicit algorithm is available only for perfect gas."<<finl;
436 int nb_dim = p_tab->valeurs().nb_dim();
437 YAML_data pressure(name,
"double", nb_dim);
438 data.push_back(pressure);
446 int bytes=0,a_faire,special;
454 p_tab->
nommer(
"Pression_EOS");
457 Cerr <<
"ATTENTION : For a parallel calculation, the field Pression_EOS is not saved in xyz format ... " << finl;
475 ArrOfDouble garbage( p_th_tab.
nb_dim() );
501 p_tab->
nommer(
"Pression_EOS");
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;
512 Nom field_tag(p_tab->le_nom());
519 avancer_fichier_with_syno(is,field_tag,field_tag_syno);
523 avancer_fichier(is,field_tag);
525 p_tab->reprendre(is);
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
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
void calculer_div_rho_u_impl(DoubleTab &res, const Convection_Diffusion_Fluide_Dilatable_base &eqn) const
virtual bool is_generic() const =0
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.
virtual bool is_thermal() const =0
public_for_cuda void assembler_impl(Convection_Diffusion_Fluide_Dilatable_base &eqn, Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem)
OWN_PTR(Champ_Inc_base) ch_unite_
DoubleVect tab_coeff_diffusif_
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
const Fluide_Dilatable_base & fluide() const
const Champ_Inc_base & inconnue() const override
const Domaine_Cl_dis_base & domaine_cl_modif() const
classe Convection_Diffusion_std Cette classe est la base des equations modelisant le transport
std::vector< YAML_data > data_a_sauvegarder_base() const
int reprendre_base(Entree &)
int sauvegarder_base(Sortie &) 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,...
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
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.
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
const std::string & getString() const
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual int sauvegarder(Sortie &) const
Sauvegarde d'un Objet_U sur un flot de sortie Methode a surcharger.
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.
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.
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()
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
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.
: 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
DoubleTab & ajouter(DoubleTab &) const
Ajoute la contribution de toutes les sources de la liste au tableau passe en parametre,...
_SIZE_ size_array() const
_SIZE_ dimension_tot(int) const override
_SIZE_ dimension(int d) const
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...
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...