TrioCFD 1.9.8
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
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
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
Sources & sources()
Renvoie les termes sources asssocies a l'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()
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.
void calculer_rho(const bool init=false)
Calcule rho_n+1 pour utilisation dans la pression.
Une chaine de caractere (Nom) en majuscules.
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
Renvoie le milieu physique de l'equation (le Fluide_base upcaste en Milieu_base).
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
friend class Entree
Definition Objet_U.h:76
friend class Sortie
Definition Objet_U.h:75
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
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
Renvoie 1 si le schema en temps a ete lu diffusion_implicite.
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.
int & set_niter_max_diffusion_implicite()
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.
double seuil_diffusion_implicite() const
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 niter_max_diffusion_implicite() const
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_++).
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
Renvoie une reference sur le nombre de pas maxi.
double facteur_securite_pas() const
Renvoie le facteur de securite ou multiplicateur de delta_t.
Classe de base des flux de sortie.
Definition Sortie.h:52
class Source_Con_Phase_field_base
virtual void premier_demi_dt()=0
class Sources Sources represente une liste de Source.
Definition Sources.h:31