TrioCFD 1.9.9_beta
TrioCFD documentation
Loading...
Searching...
No Matches
Schema_Phase_field.cpp
1/****************************************************************************
2* Copyright (c) 2021, 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 <Source_Con_Phase_field_base.h>
17#include <Navier_Stokes_phase_field.h>
18#include <Milieu_Phase_field.h>
19#include <Schema_Phase_field.h>
20#include <Equation_base.h>
21#include <Probleme_base.h>
22#include <Param.h>
23
24Implemente_instanciable(Schema_Phase_field,"Schema_Phase_field",Schema_Temps_base);
25// XD schema_phase_field schema_temps_base schema_phase_field INHERITS_BRACE Keyword for the only available Scheme for
26// XD_CONT time discretization of the Phase Field problem.
27// XD attr schema_ch schema_temps_base schema_ch OPT Time scheme for the Cahn-Hilliard equation.
28// XD attr schema_ns schema_temps_base schema_ns OPT Time scheme for the Navier-Stokes equation.
29
31
33
34/*! @brief Renvoie le nombre de valeurs temporelles a conserver.
35 *
36 * Ici : le max des deux schemas utilises.
37 *
38 */
40{
41 return std::max(sch_CH_->nb_valeurs_temporelles(), sch_NS_->nb_valeurs_temporelles());
42}
43
44/*! @brief Renvoie le nombre de valeurs temporelles futures.
45 *
46 * Ici : la valeur commune aux deux schemas utilises.
47 *
48 */
50{
51 int n = sch_CH_->nb_valeurs_futures();
52 assert(n == sch_NS_->nb_valeurs_futures());
53 return n;
54}
55
56/*! @brief Renvoie le le temps a la i-eme valeur future.
57 *
58 * Ici : la valeur commune aux deux schemas utilises.
59 *
60 */
62{
63 double t = sch_CH_->temps_futur(i);
64 assert(est_egal(t, sch_NS_->temps_futur(i), pas_temps_min()));
65 return t;
66}
67
68/*! @brief Renvoie le le temps le temps que doivent rendre les champs a l'appel de valeurs()
69 *
70 * Ici : la valeur commune aux deux schemas utilises.
71 *
72 */
74{
75 double t = sch_CH_->temps_defaut();
76 assert(est_egal(t, sch_NS_->temps_defaut(), pas_temps_min()));
77 return t;
78}
79
80/////////////////////////////////////////
81// //
82// Fin des caracteristiques du schema //
83// //
84/////////////////////////////////////////
85
87{
88 sch_CH_->initialize();
89 sch_NS_->initialize();
91}
92
94{
95 sch_CH_->initTimeStep(dt);
96 sch_NS_->initTimeStep(dt);
98}
99
100/*! @brief Mise a jour du temps courant (t+=dt) et du nombre de pas de temps effectue (nb_pas_dt_++).
101 *
102 * @return (int) retourne mettre_a_jour de la classe mere
103 */
105{
106 sch_CH_->mettre_a_jour();
107 sch_NS_->mettre_a_jour();
108
110}
111
112/*! @brief Appel a l'objet sous-jacent Change le temps courant
113 *
114 * @param (double& t) la nouvelle valeur du temps courant
115 */
117{
118 sch_CH_->changer_temps_courant(t);
119 sch_NS_->changer_temps_courant(t);
120
122}
123
124/*! @brief Appel a l'objet sous-jacent Renvoie 1 si il y lieu de stopper le calcul pour differente raisons:
125 *
126 * - le temps final est atteint
127 * - le nombre de pas de temps maximum est depasse
128 * - l'etat stationnaire est atteint
129 * - indicateur d'arret fichier
130 * Renvoie 0 sinon
131 *
132 * @return (entier) 1 si il y a lieu de s'arreter 0 sinon
133 */
135{
136 int ls2 = sch_CH_->stop();
137 int ls3 = sch_NS_->stop();
138
139 return (ls2 | ls3 | Schema_Temps_base::stop());
140}
141
142/*! @brief Appel a l'objet sous-jacent Imprime le schema en temp sur un flot de sortie (si il y a lieu).
143 *
144 * @param (Sortie& os) le flot de sortie
145 */
147{
148 sch_CH_->imprimer(os);
149 sch_NS_->imprimer(os);
150
152}
153
154/*! @brief Corrige le pas de temps dt_min <= dt <= dt_max
155 *
156 * @return (int) 1 si il faut faire une sauvegarde 0 sinon
157 * @return (int) retourne corriger_pas_temps de la classe mere
158 */
160{
161 bool ok = sch_CH_->corriger_dt_calcule(dt);
162 ok = ok && sch_NS_->corriger_dt_calcule(dt);
164 return ok;
165}
166
167/*! @brief Complete les attributs de sch2
168 *
169 * @return retourne toujours 1
170 */
172{
173 Schema_Temps_base& le_sch2 = sch_CH_.valeur();
174 le_sch2.set_temps_init() = temps_init();
175 le_sch2.set_temps_max() = temps_max();
176 le_sch2.set_temps_courant() = temps_courant();
177 le_sch2.set_nb_pas_dt() = nb_pas_dt();
178 le_sch2.set_nb_pas_dt_max() = nb_pas_dt_max();
179 le_sch2.set_dt_min() = pas_temps_min();
180 le_sch2.set_dt_max() = pas_temps_max();
181 le_sch2.set_dt_sauv() = temps_sauv();
182 le_sch2.set_dt_impr() = temps_impr();
183 le_sch2.set_facsec() = facteur_securite_pas();
184 le_sch2.set_seuil_statio() = seuil_statio();
189 le_sch2.set_dt() = pas_de_temps();
190 le_sch2.set_mode_dt_start() = mode_dt_start();
193 le_sch2.set_lu() = lu();
194
195 Schema_Temps_base& le_sch3 = sch_NS_.valeur();
196 le_sch3.set_temps_init() = temps_init();
197 le_sch3.set_temps_max() = temps_max();
198 le_sch3.set_temps_courant() = temps_courant();
199 le_sch3.set_nb_pas_dt() = nb_pas_dt();
200 le_sch3.set_nb_pas_dt_max() = nb_pas_dt_max();
201 le_sch3.set_dt_min() = pas_temps_min();
202 le_sch3.set_dt_max() = pas_temps_max();
203 le_sch3.set_dt_sauv() = temps_sauv();
204 le_sch3.set_dt_impr() = temps_impr();
205 le_sch3.set_facsec() = facteur_securite_pas();
206 le_sch3.set_seuil_statio() = seuil_statio();
211 le_sch3.set_dt() = pas_de_temps();
212 le_sch3.set_mode_dt_start() = mode_dt_start();
215 le_sch3.set_lu() = lu();
216}
217
218/*! @brief Lecture du nombre d'iterations pour l'etape de relaxation du Schema_Phase_field
219 *
220 * @param (const Motcle& mot) un mot cle
221 * @param (Entree& is) un flot d'entree
222 */
224{
225 Cerr << "mot=" << mot << finl;
226 if (mot == "schema_CH")
227 {
228 Nom type_sch;
229 Cerr << "Lecture du schema utilise dans l'equation Phase_field" << finl;
230 is >> type_sch;
231 sch_CH_.typer(type_sch);
232 is >> sch_CH_.valeur();
233 }
234 else if (mot == "schema_NS")
235 {
236 Nom type_sch;
237 Cerr << "Lecture du schema utilise dans l'equation Navier-Stokes" << finl;
238 is >> type_sch;
239 sch_NS_.typer(type_sch);
240 is >> sch_NS_.valeur();
241 }
242 else
244 return 1;
245
246}
248{
249 param.ajouter_non_std("schema_ch", this);
250 param.ajouter_non_std("Schema_NS", this);
252}
253
254/*! @brief Effectue un pas de temps sur l'equation passee en parametre.
255 *
256 * Le pas de temps effectue n'est pas standard si l'equation
257 * est de type Convection_Diffusion_Phase_field
258 *
259 * @param (Equation_base& eqn) l'equation que l'on veut faire avancer d'un pas de temps
260 * @return (int) renvoie toujours 1
261 */
263{
264 if (eqn.que_suis_je() == "Convection_Diffusion_Phase_field")
265 {
268 }
269 else
270 {
272 Milieu_Phase_field& mil = ref_cast(Milieu_Phase_field, eq_ns.milieu());
273 mil.calculer_rho();
274 sch_NS_->set_dt() = pas_de_temps();
275 sch_NS_->faire_un_pas_de_temps_eqn_base(eqn);
276 set_stationnaire_atteint() = sch_NS_->isStationary();
277 return 1;
278 }
279}
280
281/*! @brief faire_un_pas_de_temps_pb_base avec NS = equation(0) et CH = equation(1) Sert a calculer l'equation de Cahn-Hilliard en premier puis Navier-Stokes, en appelant
282 *
283 * equation(1) d'abord puis equation(0) pour obtenir les couplages voulus.
284 * (dans le cas nb_eqn=2)
285 *
286 * @param (Pb_base& eqn) Pb a resoudre
287 * @return (int) renvoie toujours 1
288 */
290{
291 Probleme_base& prob = pb_base();
292 double temps = temps_courant_ + dt_;
293 int nb_eqn = prob.nombre_d_equations();
294 // On resout dans l'ordre inverse des equations du probleme
295 for (int i = nb_eqn - 1; i > -1; i--)
296 {
297 Equation_base& eqn_i = prob.equation(i);
298 if (eqn_i.equation_non_resolue())
299 {
300 Cout << "====================================================" << finl;
301 Cout << eqn_i.que_suis_je() << " equation is not solved." << finl;
302 Cout << "====================================================" << finl;
303 // On calcule une fois la derivee pour avoir les flux bord
304 if (eqn_i.schema_temps().nb_pas_dt() == 0)
305 {
306 DoubleTab inconnue_valeurs(eqn_i.inconnue().valeurs());
307 eqn_i.derivee_en_temps_inco(inconnue_valeurs);
308 }
309 }
310 else
311 {
312 eqn_i.domaine_Cl_dis().mettre_a_jour(temps);
314 }
315 }
316 converged = true;
317 return true;
318}
319
320/*! @brief Effectue un pas de temps sur l'equation de type Convection_Diffusion_Phase_field.
321 *
322 * @param (Convection_Diffusion_Phase_field& eq_c) l'equation que l'on veut faire avancer d'un pas de temps
323 * @return (int) renvoie toujours 1
324 */
332
333/*! @brief Effectue le premier demi-pas de temps1 sur l'equation de type Convection_Diffusion_Phase_field.
334 *
335 * @param (Convection_Diffusion_Phase_field& eq_c) l'equation que l'on veut faire avancer d'un demi-pas de temps
336 * @return (int) renvoie toujours 1
337 */
339{
340 Sources& list_sources = eq_c.sources();
341 Source_Con_Phase_field_base& source_pf = ref_cast(Source_Con_Phase_field_base, list_sources(0).valeur());
342
343 // Calcule c_demi
344 source_pf.premier_demi_dt();
345
346 return 1;
347}
348
349/*! @brief Effectue le deuxieme demi-pas de temps sur l'equation de type Convection_Diffusion_Phase_field.
350 *
351 * @param (Convection_Diffusion_Phase_field& eq_c) l'equation que l'on veut faire avancer d'un demi-pas de temps
352 * @return (int) renvoie toujours 1
353 */
355{
356 DoubleTab& present = eq_c.inconnue().valeurs();
357 DoubleTab intermediaire(present);
358 intermediaire = present;
359
360 sch_CH_->set_dt() = pas_de_temps();
361
362 present = eq_c.get_c_demi();
363 //Cerr << "present = "<<present<<finl;
364
365 sch_CH_->faire_un_pas_de_temps_eqn_base(eq_c);
366 set_stationnaire_atteint() = sch_CH_->isStationary();
367 present = intermediaire;
368 //Cerr << "present apres = "<<present<<finl;
369
370 return 1;
371}
372
374{
376 sch_CH_->associer_pb(un_probleme);
377 sch_NS_->associer_pb(un_probleme);
378}
DoubleTab & valeurs() override
Returns the array of field values at the current time.
const Champ_Inc_base & inconnue() const override
Returns the unknown field of the equation: the concentration.
classe Convection_Diffusion_Phase_field Cas particulier de Convection_Diffusion_Concentration
virtual void mettre_a_jour(double temps)
Performs a time update of all boundary conditions.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
class Equation_base The role of an equation is the calculation of one or more fields....
virtual int equation_non_resolue() const
Sources & sources()
Returns the source terms associated with the equation.
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()
Returns the discretized boundary condition domain associated with the equation.
Schema_Temps_base & schema_temps()
Returns the time scheme associated with the equation.
void calculer_rho(const bool init=false)
Calcule rho_n+1 pour utilisation dans la pression.
A character string (Nom) in uppercase.
Definition Motcle.h:26
classe Navier_Stokes_phase_field Cette classe porte les termes de l'equation de la dynamique
const Milieu_base & milieu() const override
Returns the physical medium of the equation (Fluide_base upcast to Milieu_base).
class Nom: a character string for naming TRUST objects.
Definition Nom.h:31
friend class Entree
Definition Objet_U.h:71
friend class Sortie
Definition Objet_U.h:70
const Nom & que_suis_je() const
Returns the string identifying the class.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
Definition Objet_U.cpp:289
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
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
class Probleme_base It is a Probleme_U that is not a coupling.
virtual int nombre_d_equations() const =0
virtual const Equation_base & equation(int) const =0
classe Schema_Phase_field
bool iterateTimeStep(bool &converged) override
faire_un_pas_de_temps_pb_base avec NS = equation(0) et CH = equation(1) Sert a calculer l'equation de...
virtual int faire_un_pas_de_temps_C_D_Phase_field(Convection_Diffusion_Phase_field &)
Effectue un pas de temps sur l'equation de type Convection_Diffusion_Phase_field.
void changer_temps_courant(const double) override
Appel a l'objet sous-jacent Change le temps courant.
int mettre_a_jour() override
Mise a jour du temps courant (t+=dt) et du nombre de pas de temps effectue (nb_pas_dt_++).
void completer() override
Complete les attributs de sch2.
int faire_un_pas_de_temps_eqn_base(Equation_base &) override
Effectue un pas de temps sur l'equation passee en parametre.
int stop() const override
Appel a l'objet sous-jacent Renvoie 1 si il y lieu de stopper le calcul pour differente raisons:
bool initTimeStep(double dt) override
int nb_valeurs_temporelles() const override
Renvoie le nombre de valeurs temporelles a conserver.
bool corriger_dt_calcule(double &) const override
Corrige le pas de temps dt_min <= dt <= dt_max.
void set_param(Param &titi) const override
virtual int premier_dt(Convection_Diffusion_Phase_field &eq_c)
Effectue le premier demi-pas de temps1 sur l'equation de type Convection_Diffusion_Phase_field.
virtual int deuxieme_dt(Convection_Diffusion_Phase_field &eq_c)
Effectue le deuxieme demi-pas de temps sur l'equation de type Convection_Diffusion_Phase_field.
void associer_pb(const Probleme_base &) override
void imprimer(Sortie &) const override
Appel a l'objet sous-jacent Imprime le schema en temp sur un flot de sortie (si il y a lieu).
void initialize() override
double temps_defaut() const override
Renvoie le le temps le temps que doivent rendre les champs a l'appel de valeurs().
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture du nombre d'iterations pour l'etape de relaxation du Schema_Phase_field.
double temps_futur(int i) const override
Renvoie le le temps a la i-eme valeur future.
int nb_valeurs_futures() const override
Renvoie le nombre de valeurs temporelles futures.
class Schema_Temps_base
int diffusion_implicite() const
Returns 1 if the time scheme has been read with diffusion_implicite.
bool & set_indice_nb_pas_dt_max_atteint()
virtual bool isStationary() const
Returns 1 if during the last time step, the problem has not evolved.
double temps_courant() const
Returns the current time.
virtual bool corriger_dt_calcule(double &dt) const
Corrects the computed time step passed as parameter and verifies it is not "too" small (< dt_min_).
double temps_sauv() const
Returns a reference to the checkpoint time interval.
double temps_impr() const
Returns a reference to the output time interval.
virtual void set_param(Param &titi) const override
double dt_
Computation time step.
double pas_temps_max() const
Returns the maximum time step.
virtual void associer_pb(const Probleme_base &)
double temps_max() const
Returns a reference to the maximum time.
virtual void changer_temps_courant(const double)
Changes the current time.
int indice_tps_final_atteint() const
virtual int stop() const
Returns 1 if it is necessary to stop the computation for various reasons:
int & set_niter_max_diffusion_implicite()
Probleme_base & pb_base()
int lire_motcle_non_standard(const Motcle &, Entree &) override
Reads non-simple-type parameters of an Objet_U from an input stream.
double pas_temps_min() const
Returns the minimum time step.
double pas_de_temps() const
Returns the current time step (delta_t).
double seuil_diffusion_implicite() const
virtual void imprimer(Sortie &os) const
Prints the time step to an output stream if appropriate.
virtual void initialize()
virtual bool initTimeStep(double dt)
double seuil_statio() const
Returns a reference to the stationarity threshold.
int niter_max_diffusion_implicite() const
int nb_pas_dt() const
Returns the number of time steps performed.
double mode_dt_start() const
double temps_init() const
Returns the initial time.
virtual int mettre_a_jour()
Updates the current time (t+=dt) and the number of time steps performed (nb_pas_dt_++).
double & set_seuil_diffusion_implicite()
int indice_nb_pas_dt_max_atteint() const
bool & set_indice_tps_final_atteint()
int nb_pas_dt_max() const
Returns a reference to the maximum number of time steps.
double facteur_securite_pas() const
Returns the safety factor or multiplier of delta_t.
Base class for output streams.
Definition Sortie.h:52
class Source_Con_Phase_field_base
virtual void premier_demi_dt()=0
class Sources Sources represents a list of Source objects.
Definition Sources.h:31