TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Schema_Cahn_Hilliard_Navier_Stokes.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
17#include <Schema_Cahn_Hilliard_Navier_Stokes.h>
18
19// XD schema_cahn_hilliard_navier_stokes schema_cahn_hilliard schema_cahn_hilliard_navier_stokes INHERITS_BRACE
20// XD_CONT Time-integration scheme coupling the semi-implicit Cahn-Hilliard step with a dedicated convection sub-scheme
21// XD_CONT for the Navier-Stokes equation.
22Implemente_instanciable( Schema_Cahn_Hilliard_Navier_Stokes, "Schema_Cahn_Hilliard_Navier_Stokes", Schema_Cahn_Hilliard ) ;
23
25{
27 return os;
28}
29
31{
32 param.ajouter_non_std("Schema_convection", this); // XD_ADD_P schema_temps_base
33 // XD_CONT Time sub-scheme used to advance the Navier-Stokes convection (e.g. Runge_Kutta_ordre_3,
34 // XD_CONT Schema_Euler_implicite).
36}
37
39{
40 if (mot == "Schema_convection")
41 {
42 Nom type_sch;
43 is >> type_sch;
44 schema_convection_.typer(type_sch);
45 is >> schema_convection_.valeur();
46 }
47 else
49 return 1;
50}
51
53{
54 Schema_Temps_base& sch = schema_convection_.valeur();
55 sch.set_temps_init() = temps_init();
56 sch.set_temps_max() = temps_max();
58 sch.set_nb_pas_dt() = nb_pas_dt();
60 sch.set_dt_min() = pas_temps_min();
61 sch.set_dt_max() = pas_temps_max();
62 sch.set_dt_sauv() = temps_sauv();
63 sch.set_dt_impr() = temps_impr();
67 //sch.set_diffusion_implicite() = diffusion_implicite();
68 //sch.set_seuil_diffusion_implicite() = seuil_diffusion_implicite();
69 //sch.set_niter_max_diffusion_implicite() = niter_max_diffusion_implicite();
70 sch.set_dt() = pas_de_temps();
74 sch.set_lu() = lu();
75 sch.schema_impr() = 0; // in such a way that schema_ does not write in dt_ev output file
77}
78
80{
81 schema_convection_->associer_pb(un_probleme);
83}
84
86{
88 return is;
89}
90
92{
93 schema_convection_->initialize();
95}
96
98{
99 schema_convection_->initTimeStep(dt);
101
102}
103
105{
106 schema_convection_->changer_temps_courant(t);
108}
109
111{
112 Probleme_base& prob = pb_base();
113 double temps = temps_courant_ + dt_;
114 int nb_eqn = prob.nombre_d_equations();
115 for (int i = nb_eqn - 1; i > -1; i--) // Cahn-Hilliard equation first, Navier-Stokes equation afterwards
116 {
117 Equation_base& eqn_i = prob.equation(i);
118 if (eqn_i.equation_non_resolue())
119 {
120 Cout << "====================================================" << finl;
121 Cout << eqn_i.que_suis_je() << " equation is not solved." << finl;
122 Cout << "====================================================" << finl;
123 if (eqn_i.schema_temps().nb_pas_dt() == 0)
124 {
125 DoubleTab inconnue_valeurs(eqn_i.inconnue().valeurs());
126 eqn_i.derivee_en_temps_inco(inconnue_valeurs);
127 }
128 }
129 else
130 {
131 eqn_i.domaine_Cl_dis().mettre_a_jour(temps);
133 }
134 }
135 converged = true;
136 return true;
137}
138
140{
141 if (eqn.que_suis_je() == "Cahn_Hilliard_Convection")
142 {
144 }
145 else
146 {
147 eqn.milieu().mettre_a_jour(eqn.inconnue().temps());
148 schema_convection_->set_dt() = pas_de_temps();
149 schema_convection_->faire_un_pas_de_temps_eqn_base(eqn);
150 set_stationnaire_atteint() = schema_convection_->isStationary();
151 return 1;
152 }
153}
154
156{
157 bool ok = schema_convection_->corriger_dt_calcule(dt);
159 return ok;
160}
161
163{
164 schema_convection_->mettre_a_jour();
166}
167
169{
170 return (schema_convection_->stop() | Schema_Cahn_Hilliard::stop());
171}
172
174{
175 schema_convection_->imprimer(os);
177}
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
double temps() const
Renvoie le temps du champ.
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps de toutes les conditions aux limites.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual int equation_non_resolue() const
virtual const Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
virtual DoubleTab & derivee_en_temps_inco(DoubleTab &)
Returns the time derivative of the unknown I of the equation: dI/dt = M-1*(sum(operators(I) + sources...
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual void mettre_a_jour(double temps)
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual int nombre_d_equations() const =0
virtual const Equation_base & equation(int) const =0
void associer_pb(const Probleme_base &) override
int faire_un_pas_de_temps_eqn_base(Equation_base &) override
Effectue un pas de temps sur l'equation de Cahn-Hilliard, d'où le test sur le sub_type.
bool iterateTimeStep(bool &converged) override
Calculate the U(n+1) unknown for each equation (if solved) of the problem with the selected time sche...
int mettre_a_jour() override
Mise a jour du temps courant (t+=dt) et du nombre de pas de temps effectue (nb_pas_dt_++).
int stop() const override
Renvoie 1 si il y lieu de stopper le calcul pour differente raisons: - le temps final est atteint.
void changer_temps_courant(const double t) override
Change le temps courant.
bool corriger_dt_calcule(double &dt) const override
Corrige le pas de temps calcule que l'on passe en parametre et verifie qu'il n'est pas "trop" petit (...
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 imprimer(Sortie &os) const override
Imprime le pas de temps sur un flot de sortie s'il y a lieu.
class Schema_Cahn_Hilliard. Il herite de schema Euler semi implicite et ne s'applique qu'à Cahn-Hilli...
int faire_un_pas_de_temps_eqn_base(Equation_base &) override
Effectue un pas de temps sur l'equation de Cahn-Hilliard, d'où le test sur le sub_type.
class Schema_Temps_base
bool & set_indice_nb_pas_dt_max_atteint()
virtual bool isStationary() const
Retourne 1 si lors du dernier pas de temps, le probleme n'a pas evolue.
double temps_courant() const
Renvoie le temps courant.
virtual bool corriger_dt_calcule(double &dt) const
Corrige le pas de temps calcule que l'on passe en parametre et verifie qu'il n'est pas "trop" petit (...
double temps_sauv() const
Renvoie une reference sur le temps de sauvegarde.
double temps_impr() const
Renvoie une reference sur le temps d'impression.
virtual void set_param(Param &titi) const override
double dt_
Pas de temps de calcul.
double pas_temps_max() const
Renvoie le pas de temps maximum.
virtual void associer_pb(const Probleme_base &)
double temps_max() const
Renvoie une reference sur le temps maximum.
virtual void changer_temps_courant(const double)
Change le temps courant.
int indice_tps_final_atteint() const
virtual int stop() const
Renvoie 1 si il y lieu de stopper le calcul pour differente raisons: - le temps final est atteint.
Probleme_base & pb_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.
double pas_temps_min() const
Renvoie le pas de temps minimum.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
virtual void imprimer(Sortie &os) const
Imprime le pas de temps sur un flot de sortie s'il y a lieu.
virtual void initialize()
virtual bool initTimeStep(double dt)
double seuil_statio() const
Renvoie une reference sur le seuil stationnaire.
int nb_pas_dt() const
Renvoie le nombre de pas de temps effectues.
double mode_dt_start() const
double temps_init() const
Renvoie le temps initial.
virtual int mettre_a_jour()
Mise a jour du temps courant (t+=dt) et du nombre de pas de temps effectue (nb_pas_dt_++).
int indice_nb_pas_dt_max_atteint() const
bool & set_indice_tps_final_atteint()
int nb_pas_dt_max() const
Renvoie une reference sur le nombre de pas maxi.
double facteur_securite_pas() const
Renvoie le facteur de securite ou multiplicateur de delta_t.
virtual void completer()=0
Classe de base des flux de sortie.
Definition Sortie.h:52