16#include <Convection_Diffusion_Phase_field.h>
17#include <Source_Qdm_VDF_Phase_field.h>
18#include <Navier_Stokes_phase_field.h>
19#include <Source_Con_Phase_field.h>
20#include <Check_espace_virtuel.h>
21#include <MD_Vector_composite.h>
22#include <Milieu_Phase_field.h>
23#include <Champ_Fonc_Tabule.h>
24#include <Domaine_Cl_VDF.h>
25#include <TRUSTTab_parts.h>
26#include <Champ_Uniforme.h>
27#include <Equation_base.h>
28#include <Probleme_base.h>
29#include <Domaine_VDF.h>
30#include <Milieu_base.h>
31#include <SolveurSys.h>
99 param.lire_avec_accolades_depuis(is);
103 Cerr <<
"Source_Con_Phase_field::readOn: Temps_d_affichage should be in the range 0 - 100 seconds." << finl;
112 if (mot ==
"implicitation_CH")
121 else if (mot ==
"mobilite_explicite")
130 else if (mot ==
"resolution_petsc")
139 else if (mot ==
"couplage_NS_CH")
142 if (temp ==
"mutilde(n)")
148 else if (mot ==
"moyenne_de_kappa")
151 if (temp ==
"arithmetique")
153 else if (temp ==
"harmonique")
175 if ((this->
que_suis_je() !=
"Source_Con_Phase_field_Binaire_VDF_P0_VDF") && (this->
que_suis_je() !=
"Source_Con_Phase_field_Binaire_Compact_VDF_P0_VDF"))
177 Cerr <<
"Source term is of type " << this->
que_suis_je() << finl;
178 Cerr <<
"** Error: Closure type does not fit with phase field source term... **" << finl;
179 Cerr <<
"** Check if they are both for binary systems. **" << finl;
185 Cerr <<
"Source term is of type " << this->
que_suis_je() << finl;
186 Cerr <<
"** Error: Closure type does not fit with phase field source term... **" << finl;
187 Cerr <<
"** Check if they are both for n-ary systems. **" << finl;
195 Cerr <<
"Erreur dans le choix du parametre boussi_" << finl;
203 Cerr <<
"Erreur dans le choix du parametre diff_boussi_" << finl;
213 Cerr <<
"Erreur dans le choix du parametre mutype_" << finl;
219 Cerr <<
"=================================================" << finl;
220 Cerr <<
"Choix de l'implicitation incorrect ! (ni 0, ni 1)" << finl;
221 Cerr <<
"=================================================" << finl;
230 Cerr <<
"Erreur dans le choix de la moyenne de kappa !" << finl;
239 choix_boussi =
"oui";
241 choix_boussi =
"non";
243 Nom choix_diff_boussi;
245 choix_diff_boussi =
"oui";
247 choix_diff_boussi =
"non";
249 Cerr <<
"ATTENTION : les options 'approximation de Boussinesq' et" <<
"'approximation de Boussinesq dans le terme de diffusion' ne devrait pas etre utilisees simultanement'."
250 <<
"(voir Source_Con_Phase_field.cpp)" << finl;
255 if (terme_source == 1)
256 choix_source =
"c grad(mutilde)";
257 else if (terme_source == 2)
258 choix_source =
"c grad(laplacien(c))";
259 else if (terme_source == 3)
260 choix_source =
"c grad(laplacien(c))-div((grad(c))^2)/2";
261 else if (terme_source == 4)
262 choix_source =
"-laplacien(c) grad(c)";
266 choix_implicite =
"oui";
268 choix_implicite =
"non";
271 type_implicite =
"JFNK";
275 mutilde_d =
"avec le terme d'Ec";
277 mutilde_d =
"sans le terme d'Ec";
281 type_couplage =
"potentiel au temps n+1/2";
283 type_couplage =
"potentiel au temps n";
284 Nom mobilite_variable;
288 mobilite_variable =
"oui";
290 mobilite_variable =
"non";
293 moyenne_kappa =
"arithmetique (+)";
295 moyenne_kappa =
"harmonique (/)";
297 moyenne_kappa =
"geometrique (*)";
304 Cerr <<
"******************************************************************************" << finl;
305 Cerr <<
"*********************** RECAPITULATIF DU PARAMETRAGE *************************" << finl;
307 Cerr <<
"1) Equation de Navier-Stokes" << finl;
308 Cerr <<
" - approximation de Boussinesq : " << choix_boussi << finl;
311 Cerr <<
" - approximation de Boussinesq dans la diffusion : " << choix_diff_boussi << finl;
315 Cerr <<
" - masse volumique de reference : " <<
rho0_ <<
" kg/m3" << finl;
317 Cerr <<
" Dans le cas ou la viscosite dynamique est variable : " << finl;
318 Cerr <<
" - terme source : " << choix_source << finl;
319 Cerr <<
" - intensite du champ de gravite : " << norme_array(
g_) <<
" m/s^2" << finl;
321 Cerr <<
"2) Equation de Cahn-Hilliard" << finl;
322 Cerr <<
" - discretisation implicite : " << choix_implicite << finl;
325 Cerr <<
" - algorithme implicite : " << type_implicite << finl;
327 Cerr <<
" - potentiel chimique generalise : " << mutilde_d << finl;
328 Cerr <<
" - couplage NS / CH via le potentiel chimique : " << type_couplage << finl;
330 Cerr <<
" - mobilite variable : " << mobilite_variable << finl;
333 Cerr <<
" - type de moyenne pour la mobilite : " << moyenne_kappa << finl;
339 Cerr <<
" - dans le cas de l'algorithme de JFNK ... " << finl;
342 Cerr <<
" === USING PETSc - SNES LIBRARY === " << finl;
343 Cerr <<
" Absolute tolerance on the residual : " <<
atol_ << finl;
344 Cerr <<
" Relative tolerance on the residual : " <<
rtol_ << finl;
345 Cerr <<
" Stagnation tolerance on the residual : " <<
rtol_ << finl;
346 Cerr <<
" Krylov space dimension : " <<
nkr_ << finl;
347 Cerr <<
" Maximum number of Newton iterations : " <<
maxit_newton_ << finl;
348 Cerr <<
" Maximum number of GMRES iterations : " <<
maxit_gmres_ << finl;
349 Cerr <<
" Differencing step parameter erel : " <<
erel_ << finl;
350 Cerr <<
" Differencing step parameter umin : " <<
umin_ << finl;
354 Cerr <<
" === USING ADHOC JFNK SOLVER === " << finl;
355 Cerr <<
" seuil du residu a convergence : " <<
atol_ << finl;
356 Cerr <<
" dimension de l'espace de Krylov : " <<
nkr_ << finl;
357 Cerr <<
" nombre d'iterations maximal de l'algorithme : " <<
maxit_gmres_ << finl;
358 Cerr <<
" residu minimum de convergence : " <<
rtol_ << finl;
359 Cerr <<
" residu maximum de convergence : " <<
stol_ << finl;
364 Cerr <<
"********************** Ce message persistera " <<
tpsaff_ <<
" secondes *********************" << finl;
365 Cerr <<
"*************** Pour continuer avant les " <<
tpsaff_ <<
" secondes : Ctrl + C **************" << finl;
366 Cerr <<
"******************************************************************************" << finl;
370 Nom tps_sleep =
"sleep ";
372 Cerr << (int) system(tps_sleep) << finl;
395 Cerr <<
"Temps : " << temps <<
" s" << finl;
416 u2.
carre(VECT_ALL_ITEMS);
425 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
426 const IntTab& elem_faces = domaine_VDF.
elem_faces();
427 const IntTab& face_sommets = domaine_VDF.
face_sommets();
428 const DoubleTab& positions = domaine_VDF.
xp();
429 const Domaine& domaine_geom = domaine_VDF.
domaine();
431 int f0, f1, som0, som1;
432 double psi, val0, val1;
434 const int nb_compo_ = u2_elem.
line_size();
437 for (
int elem = 0; elem < nb_elem; elem++)
440 for (
int ncomp = 0; ncomp < nb_compo_; ncomp++)
442 f0 = elem_faces(elem, ncomp);
443 f1 = elem_faces(elem,
dimension + ncomp);
448 som0 = face_sommets(f0, 0);
449 som1 = face_sommets(f1, 0);
451 psi = (positions(elem, ncomp) - domaine_geom.
coord(som0, ncomp)) / (domaine_geom.
coord(som1, ncomp) - domaine_geom.
coord(som0, ncomp));
453 if (std::fabs(psi) < 1.e-12)
454 u2_elem(elem, ncomp) = val0;
455 else if (std::fabs(1. - psi) < 1.e-12)
456 u2_elem(elem, ncomp) = val1;
458 u2_elem(elem, ncomp) = val0 + psi * (val1 - val0);
464 for (
int elem = 0; elem < nb_elem; elem++)
466 for (
int dim = 0; dim <
dimension; dim++)
468 tmp = u2_elem(elem, dim);
469 u_carre(elem) += tmp;
491 DoubleTab& prov_face = ref_cast_non_const(DoubleTab,
prov_face_);
492 if (prov_face.
size() == 0)
506 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
507 const IntTab& elem_faces = domaine_VDF.
elem_faces();
508 const IntTab& face_sommets = domaine_VDF.
face_sommets();
509 const DoubleTab& positions = domaine_VDF.
xp();
510 const Domaine& domaine_geom = domaine_VDF.
domaine();
511 const int nb_elem = domaine_VDF.
nb_elem();
516 double psi, val0, val1;
518 DoubleTab gradc2_elem(nb_elem,
dimension);
521 if (gradc2_elem.
nb_dim() == 1)
527 for (elem = 0; elem < nb_elem; elem++)
532 for (
int ncomp = 0; ncomp < nb_compo_; ncomp++)
534 f0 = elem_faces(elem, ncomp);
535 f1 = elem_faces(elem,
dimension + ncomp);
540 som0 = face_sommets(f0, 0);
541 som1 = face_sommets(f1, 0);
543 psi = (positions(elem, ncomp) - domaine_geom.
coord(som0, ncomp)) / (domaine_geom.
coord(som1, ncomp) - domaine_geom.
coord(som0, ncomp));
545 if (std::fabs(psi) < 1.e-12)
546 gradc2_elem(elem, ncomp) = val0;
547 else if (std::fabs(1. - psi) < 1.e-12)
548 gradc2_elem(elem, ncomp) = val1;
550 gradc2_elem(elem, ncomp) = val0 + psi * (val1 - val0);
557 for (elem = 0; elem < nb_elem; elem++)
561 tmp = gradc2_elem(elem, dim);
562 alpha_gradC_carre(elem) += tmp;
588 const int taille = pression_thermo.
size();
590 for (
int i = 0; i < taille; i++)
591 pression_thermo(i) = P_Pa(i) - c(i) * div_alpha_gradC(i);
599 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
602 DoubleTab& mes_valeurs = champ_fonc_c.
valeurs();
606 Cerr <<
"Erreur a l'initialisation d'un Champ_Fonc_Tabule" << finl;
607 Cerr <<
"Le champ parametre et le champ a initialiser ne sont pas compatibles" << finl;
612 int nb_elems = domaine_VDF.
nb_elem();
614 for (
int num_elem = 0; num_elem < nb_elems; num_elem++)
615 mes_valeurs(num_elem, 0) = table.
val(val_c(num_elem));
618 int nb_comps = val_c.
nb_dim();
619 for (
int num_elem = 0; num_elem < nb_elems; num_elem++)
620 for (
int ncomp = 0; ncomp < nb_comps; ncomp++)
621 mes_valeurs(num_elem, ncomp) = table.
val(val_c(num_elem, ncomp));
626 const DoubleTab& centres_de_gravites = domaine_VDF.
xp();
627 table.
valeurs(val_c, centres_de_gravites, t, mes_valeurs);
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
Classe Champ_Fonc_Tabule Classe derivee de Champ_Fonc_base qui represente les.
const Table & table() const
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
void mettre_a_jour(double temps) override
Mise a jour en temps du champ.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
const Champ_Inc_base & inconnue() const override
Renvoie le champ inconnue de l'equation: la concentration.
classe Convection_Diffusion_Phase_field Cas particulier de Convection_Diffusion_Concentration
const DoubleTab & get_div_alpha_gradC() const
Champ_Fonc_base & set_mutilde_()
double coord(int_t i, int j) const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
double xp(int num_elem, int k) const
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
double get_mult_kappa() const
int get_type_kappa_auto_diffusion() const
int get_type_systeme_naire() const
int get_type_kappa() const
int get_nb_constituants() const
int get_diff_boussi() const
const double & rho0() const
const Champ_Don_base & drhodc() const
const Fermeture_Phase_field_base & get_fermeture() const
virtual const Champ_Don_base & gravite() const
Renvoie la gravite du milieu si elle a ete associe provoque une erreur sinon.
Une chaine de caractere (Nom) en majuscules.
classe Navier_Stokes_phase_field Cette classe porte les termes de l'equation de la dynamique
int & getset_terme_source()
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
Champ_Inc_base & pression_pa()
Operateur_Grad & operateur_gradient()
Renvoie l'operateur de calcul du gradient associe a l'equation.
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.
Classe Operateur_Grad Classe generique de la hierarchie des operateurs calculant le gradient.
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
Initialise le tableau passe en parametre avec la contribution de l'operateur.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
Classe de base des flux de sortie.
class Source_Con_Phase_field_base
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 calculer_alpha_gradC_carre(DoubleTab &) const
Calcul de alpha*(Grad(C))^2 au centre des elements.
DoubleTab & ajouter(DoubleTab &) const override
void calculer_pression_thermo(DoubleTab &) const
Calcul de la pression thermodynamique aux elements.
virtual void calculer_u2_elem(DoubleVect &)
void mettre_a_jour(double) override
DOES NOTHING - to override in derived classes.
void associer_domaines(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
void associer_pb(const Probleme_base &) override
void calculer_champ_fonc_c(const double t, Champ_Don_base &champ_fonc_c, const DoubleTab &val_c) const override
DoubleTab & calculer(DoubleTab &) const override
_SIZE_ dimension(int d) const
void carre(Mp_vect_options opt=VECT_ALL_ITEMS)
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
double val(const double val_param, int ncomp=0) const
const int & isfonction() const
DoubleTab & valeurs(const DoubleTab &val_param, const DoubleTab &pos, const double tps, DoubleTab &val) const