17#include <Convection_Diffusion_Phase_field.h>
18#include <Source_Con_Phase_field_base.h>
19#include <Navier_Stokes_phase_field.h>
20#include <Source_Con_Phase_field.h>
21#include <Operateur_Diff_base.h>
22#include <Milieu_Phase_field.h>
23#include <Champ_Fonc_Tabule.h>
24#include <Assembleur_base.h>
25#include <Probleme_base.h>
26#include <Discret_Thyd.h>
27#include <Perf_counters.h>
28#include <Constituant.h>
29#include <Domaine_VF.h>
54 Cerr <<
"Creation of the buoyancy source term for the Navier_Stokes_phase_field equation" << finl;
59 Cerr <<
"Only VDF discretization is allowed." << finl;
63 Nom type_so =
"Source_Gravite_PF_VDF";
65 so->associer_eqn(*
this);
78 return le_fluide->viscosite_dynamique();
81 Cerr <<
"If the Boussinesq hypothesis is not done," << finl;
82 Cerr <<
"the keyword viscosite_dynamique_constante must be used to indicate" << finl;
83 Cerr <<
"if the dynamical viscosity is constant or c dependent." << finl;
84 Cerr <<
"This selection must be done before reading the diffusion term" << finl;
85 Cerr <<
"of the Navier_Stokes_phase_field equation." << finl;
90 return le_fluide->viscosite_cinematique();
93 Cerr <<
"The use of Boussinesq hypothesis must be indicated" << finl;
94 Cerr <<
"by the keyword approximation_de_boussinesq specification." << finl;
95 Cerr <<
"This selection must be done before reading the diffusion term" << finl;
96 Cerr <<
"of the Navier_Stokes_phase_field equation." << finl;
112 type =
"Assembleur_P_VDF_Phase_Field";
113 Cerr <<
"** Pressure assembling tool : " << type <<
" **" << finl;
114 assembleur_pression_.typer(type);
115 assembleur_pression_->associer_domaine_dis_base(
domaine_dis());
116 assembleur_pression_->set_resoudre_increment_pression(1);
132 Cerr <<
" *--*" << finl;
134 Cerr <<
"Calculation at time : " << tps_courant <<
" s" << finl;
135 Cerr <<
"Time step number : " << num_dt << finl;
139 if (le_schema_en_temps->limpr())
141 Cout <<
"NS_PF : pas de temps de convection : " << 1. / dt << finl;
144 if (le_schema_en_temps->limpr())
146 Cout <<
"NS_PF : pas de temps de diffusion : " << dt_op << finl;
148 dt = dt + 1. / dt_op;
149 dt = std::min(1. / dt, le_schema_en_temps->pas_temps_max());
150 if (le_schema_en_temps->limpr())
152 Cout <<
"NS_PF : pas de temps de calcul : " << dt << finl;
161 double t_passe=statistics().get_time_since_last_open(STD_COUNTERS::total_execution_time);
162 if (tps_courant!=tps_init)
164 t_total = t_passe * ((tps_max - tps_init) / (tps_courant - tps_init));
165 t_remaining = t_total - t_passe;
167 Cerr <<
"**************** ELAPSED TIME FOR THE SIMULATION *******************" << finl;
168 Cerr <<
"Elapsed time of calculation until current time : " << floor(t_passe) <<
" s" << finl;
169 Cerr <<
"Estimated time needed for the remaining part of the calculation : " << floor(t_remaining) <<
" s" << finl;
170 Cerr <<
" --" << finl;
171 Cerr <<
"Estimated time for the complete calculation : " << floor(t_total) <<
" s" << finl;
172 Cerr <<
"********************************************************************" << finl;
185 const DoubleVect& volumes = domaineVF.
volumes();
193 for (
int fac = 0; fac < nbfaces_bord; fac++)
195 el0 = face_voisins(fac, 0);
198 rho_face_P.
valeurs()(fac) = tab_rho(el0);
202 el1 = face_voisins(fac, 1);
203 rho_face_P.
valeurs()(fac) = tab_rho(el1);
207 for (
int fac = nbfaces_bord; fac < nbfaces; fac++)
209 el0 = face_voisins(fac, 0);
210 el1 = face_voisins(fac, 1);
213 rho_face_P.
valeurs()(fac) = (vol0 * tab_rho(el0) + vol1 * tab_rho(el1)) / (vol0 + vol1);
222 Cerr <<
"** Navier_Stokes_phase_field::preparer_calcul **" << finl;
229 rho_face_P.typer(
"Champ_Fonc_Face");
231 const DoubleTab& tab_rho = mil.
rho().
valeurs();
233 assembleur_pression_->assembler_rho_variable(
matrice_pression_, rho_face_P.valeur());
251 Cerr <<
"Projection of initial and boundaries conditions " << finl;
264 if (le_traitement_particulier)
265 le_traitement_particulier->preparer_calcul_particulier();
281 rho_face_P.typer(
"Champ_Fonc_Face");
283 const DoubleTab& tab_rho = mil.
rho().
valeurs();
285 assembleur_pression_->assembler_rho_variable(
matrice_pression_, rho_face_P.valeur());
300 DoubleTrav gradP(la_vitesse->valeurs());
301 double dt = le_schema_en_temps->pas_de_temps();
305 const DoubleTab& tab_rho = mil.
rho().
valeurs();
312 DoubleTab rho_face(nbfaces);
313 int face, elem1, elem2, k;
315 for (face = 0; face < nbfaces_bord; face++)
317 elem1 = face_voisins(face, 0);
319 rho_face[face] = tab_rho[elem1];
322 elem2 = face_voisins(face, 1);
323 rho_face[face] = tab_rho[elem2];
326 for (face = nbfaces_bord; face < nbfaces; face++)
329 elem1 = face_voisins(face, 0);
330 elem2 = face_voisins(face, 1);
331 rho_moyen = (zvf.
volumes(elem1) * tab_rho[elem1] + zvf.
volumes(elem2) * tab_rho[elem2]);
333 rho_face[face] = rho_moyen;
337 divergence.calculer(la_vitesse->valeurs(), secmem);
343 DoubleTrav diff(vpoint);
351 for (face = 0; face < nbfaces; face++)
353 diff(face, 0) *= rho_face[face];
354 diff(face, 0) /= mil.
rho0();
360 for (face = 0; face < nbfaces; face++)
362 drho = rho_face[face];
365 diff(face, k) *= drho;
366 diff(face, k) /= mil.
rho0();
376 DoubleTrav conv(vpoint);
383 for (face = 0; face < nbfaces; face++)
384 conv(face, 0) *= rho_face[face];
389 for (face = 0; face < nbfaces; face++)
391 drho = rho_face[face];
393 conv(face, k) *= drho;
402 for (face = 0; face < nbfaces; face++)
403 vpoint(face, 0) /= rho_face[face];
408 for (face = 0; face < nbfaces; face++)
410 drho = rho_face[face];
412 vpoint(face, k) /= drho;
419 solveur_masse->appliquer(vpoint);
438 const DoubleVect& volumes = domaine_VF.
volumes();
445 rho_face_P.typer(
"Champ_Fonc_Face");
448 for (
int fac = 0; fac < nbfaces_bord; fac++)
450 el0 = face_voisins(fac, 0);
452 rho_face_P->valeurs()(fac) = tab_rho(el0);
455 el1 = face_voisins(fac, 1);
456 rho_face_P->valeurs()(fac) = tab_rho(el1);
460 for (
int fac = nbfaces_bord; fac < nbfaces; fac++)
462 el0 = face_voisins(fac, 0);
463 el1 = face_voisins(fac, 1);
466 rho_face_P->valeurs()(fac) = (vol0 * tab_rho(el0) + vol1 * tab_rho(el1)) / (vol0 + vol1);
469 assembleur_pression_->assembler_rho_variable(
matrice_pression_, rho_face_P.valeur());
470 assembleur_pression_->modifier_secmem(secmem);
475 assembleur_pression_->modifier_solution(
la_pression->valeurs());
483 solveur_masse->appliquer(gradP);
489 for (face = 0; face < nbfaces; face++)
490 gradP(face, 0) /= rho_face[face];
495 for (face = 0; face < nbfaces; face++)
497 drho = rho_face[face];
499 gradP(face, k) /= drho;
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
static void verifier(const char *const msg, double)
int nb_faces() const
renvoie le nombre global de faces.
double volumes(int i) const
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Class defining operators and methods for all reading operation in an input flow (file,...
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
int calculate_time_derivative() const
virtual int preparer_calcul()
Tout ce qui ne depend pas des autres problemes eventuels.
virtual const Champ_Inc_base & derivee_en_temps() const
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Champ_Don_base & rho() const
int get_diff_boussi() const
const double & rho0() const
void update_rho_mu(double temps)
classe Navier_Stokes_phase_field Cette classe porte les termes de l'equation de la dynamique
DoubleTab & derivee_en_temps_inco(DoubleTab &) override
Returns the time derivative of the unknown I of the equation: dI/dt = M-1*(sum(operators(I) + sources...
virtual void rho_aux_faces(const DoubleTab &, Champ_Don_base &)
Interpole la masse volumique aux faces (pour l'assembleur pression en particulier).
int preparer_calcul() override
Dicretise l'equation.
const Champ_Don_base & diffusivite_pour_transport() const override
void discretiser() override
Dicretise l'equation.
double calculer_pas_de_temps() const override
Calcul du prochain pas de temps.
void mettre_a_jour(double) override
La valeur de l'inconnue sur le pas de temps a ete calculee.
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
Operateur_Diff terme_diffusif
const Milieu_base & milieu() const override
Renvoie le milieu physique de l'equation (le Fluide_base upcaste en Milieu_base).
Operateur_Conv terme_convectif
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps de l'equation.
virtual void projeter()
Calcule la solution U des equations: | M(U-V)/dt + BtP = 0.
Matrice matrice_pression_
DoubleTab & derivee_en_temps_inco(DoubleTab &) override
Returns the time derivative of the unknown I of the equation: dI/dt = M-1*(sum(operators(I) + sources...
virtual int projection_a_faire()
void discretiser() override
Dicretise l'equation.
OWN_PTR(Assembleur_base) &assembleur_pression()
SolveurSys solveur_pression_
virtual void calculer_la_pression_en_pa()
Calcul de "la_pression_en_pa" en fonction de "la_pression".
class Nom Une chaine de caractere pour nommer les objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
double temps_courant() const
Renvoie le temps courant.
double temps_max() const
Renvoie une reference sur le temps maximum.
virtual void modifier_second_membre(const Equation_base &eqn, DoubleTab &secmem)
int nb_pas_dt() const
Renvoie le nombre de pas de temps effectues.
double temps_init() const
Renvoie le temps initial.
Classe de base des flux de sortie.
void typer_direct(const Nom &)
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")