TrioCFD 1.9.9_beta
TrioCFD documentation
Loading...
Searching...
No Matches
Cahn_Hilliard.h
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#ifndef Cahn_Hilliard_included
17#define Cahn_Hilliard_included
18
19#include <Equation_base.h>
20#include <Milieu_base.h>
21#include <Fermeture_Thermo_base.h>
22#include <Potentiel_Chimique_base.h>
23#include <Champ_Inc_base.h>
24#include <Operateur_Diff_base.h>
25#include <Operateur_Diff.h>
26#include <Operateur_Conv.h>
27#include <Solveur_non_lineaire.h>
28#include <Matrice_Morse.h>
29#include <Fermeture_Thermo_base.h>
30#include <Milieu_Incompressible_Phase_Field.h>
31
33
34/*! @brief classe Cahn_Hilliard
35 *
36 * Equation de Cahn-Hilliard.
37 * L'équation s'applique à un champ conservé, ici la concentration.
38 * Elle s'écrit : dc / dt = ∇.M ∇(mutilde) où mutilde est le potentiel chimique généralisé.
39 * mutilde = beta*dW/dc - ∇. kappa ∇c
40 *
41 * C'est une équation d'ordre 4, usuellement séparée en deux équations d'ordre 2.
42 * Pour cela, le vecteur d'inconnues est formé de c et mutilde en colonne.
43 * L'opérateur de diffusion est une matrice par blocs.
44 *
45 * @sa Equation_base
46 */
48{
49
50 Declare_instanciable(Cahn_Hilliard);
51
52public:
53 /* ----------------------------------------------
54 * Méthodes de Equation_base à surcharger
55 ------------------------------------------------ */
56
57 void set_param(Param&) const override;
58 int lire_motcle_non_standard(const Motcle&, Entree&) override;
60 const Milieu_base& milieu() const override;
61 Milieu_base& milieu() override;
62 void associer_milieu_base(const Milieu_base& ) override;
63 int nombre_d_operateurs() const override;
64 int nombre_d_operateurs_tot() const override;
65 const Operateur& operateur(int) const override;
66 Operateur& operateur(int) override;
67
68 const Champ_Inc_base& inconnue() const override;
69 Champ_Inc_base& inconnue() override;
70
71 DoubleTab& derivee_en_temps_inco(DoubleTab&) override;
72
73 double calculer_pas_de_temps() const override;
74 void discretiser() override;
75 void completer() override;
76 bool initTimeStep(double dt) override;
77 bool updateGivenFields() override;
78 void mettre_a_jour(double temps) override;
79 void abortTimeStep() override;
80 void resetTime(double time) override;
81
82 std::vector<YAML_data> data_a_sauvegarder() const override;
83 int sauvegarder(Sortie&) const override;
84 int reprendre(Entree&) override;
85
86 void associer_pb_base(const Probleme_base&) override;
87 void associer_sch_tps_base(const Schema_Temps_base&) override;
88 int preparer_calcul() override;
89
90 /////////////////////////////////////////////////////
91
92 const Motcle& domaine_application() const override;
93
94 /* ---------------------------------------------
95 * Nouvelles méthodes
96 ----------------------------------------------*/
97
99
100 inline const Champ_Inc_base& mutilde() const { return mutilde_.valeur(); }
101 inline Champ_Inc_base& mutilde() { return mutilde_.valeur(); }
102
103 inline Domaine_Cl_dis_base& domaine_Cl_dis_mutilde() { assert(le_dom_Cl_dis_mutilde_); return le_dom_Cl_dis_mutilde_.valeur(); }
104 inline const Domaine_Cl_dis_base& domaine_Cl_dis_mutilde() const { assert(le_dom_Cl_dis_mutilde_); return le_dom_Cl_dis_mutilde_.valeur(); }
105 int verif_Cl_mutilde() const;
106
107 void compute_mutilde();
108 DoubleTab compute_mutilde(const DoubleTab&);
109
110 inline Champ_Don_base& kappa() { return kappa_.valeur(); }
111 inline Champ_Don_base& mobilite() { return mobilite_.valeur(); }
112
113 inline const Fermeture_Thermo_base& fermeture() const { return fermeture_.valeur(); }
114 inline Fermeture_Thermo_base& fermeture() { return fermeture_.valeur(); }
115
116 inline bool mobilite_explicite() const { return mobilite_explicite_; }
117
120 void update_terme_mobilite(const DoubleTab&);
121
122 void calculer_contribution_CL_concentration(const DoubleTab&);
123 void calculer_contribution_CL_mutilde(const DoubleTab&);
124
127
128 virtual DoubleTab fonction_residu(const DoubleTab&);
129
130protected:
131
132 void lire_terme_mobilite();
133 void lire_terme_kappa();
134
136 void discretiser_mutilde();
137 void discretiser_kappa();
139
140 void construire_kappa();
141 void construire_mobilite(const DoubleTab&); // Dépend du champ de concentration c
142
143 // Inconnue de l'équation : la concentration
144 // Deuxième inconnue introduite pour résoudre le système d'ordre 4 : le potentiel chimique généralisé
146
147 OWN_PTR(Domaine_Cl_dis_base) le_dom_Cl_dis_mutilde_;
148
150
152
153 // Le milieu : peut être fluide ou solide
154 // Attention : seulement le fluide à N phases a été codé pour l'instant
157
161
162 // Terme diffusif lié à la mobilité
164 // Terme diffusif lié au coefficient de capillarité kappa
166
167 // Matrices liées aux opérateurs
171
172 // Contributions des conditions limites
175
176};
177
178#endif /* Cahn_Hilliard_included */
classe Cahn_Hilliard
int nb_parametres_d_ordre()
bool passer_par_ajouter_mobilite_
const Domaine_Cl_dis_base & domaine_Cl_dis_mutilde() const
bool mobilite_explicite() const
int preparer_calcul() override
cf Equation_base::preparer_calcul()
void discretiser_mobilite()
DoubleTab contribution_CL_concentration_
void calculer_contribution_CL_concentration(const DoubleTab &)
Renvoie la contribution des conditions limites sur la concentration sous forme d'un vecteur (multi-co...
DoubleTab contribution_CL_mutilde_
OWN_PTR(Champ_Inc_base) concentration_
OBS_PTR(Fermeture_Thermo_base) fermeture_
bool matrices_initialisees()
virtual DoubleTab fonction_residu(const DoubleTab &)
Construit la fonction résidu pour un algorithme de Newton :
void discretiser() override
Dicretise l'equation.
Matrice_Morse & matrice_kappa()
void completer() override
Complete l'equation base, associe le potentiel chimique généralisé a l'equation, initialise le vecteu...
void associer_sch_tps_base(const Schema_Temps_base &) override
S'associe au schema_en_temps : peut seulement être Schema_CH_Semi_Implicite pour l'instant.
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps de l'equation.
int lire_motcle_non_standard(const Motcle &, Entree &) override
Reads non-simple-type parameters of an Objet_U from an input stream.
const Milieu_base & milieu() const override
Renvoie le milieu physique de l'equation.
int verif_Cl_mutilde() const
Méthode pour vérifier la compatibilité entre les CL de la concentration et les CL du potentiel.
int sauvegarder(Sortie &) const override
Appelle Equation_base::sauvegarder(Sortie&) et sauvegarde le potentiel chimique sur un flot de sortie...
const Fermeture_Thermo_base & fermeture() const
void associer_milieu_base(const Milieu_base &) override
Associe un mileu physique a l'equation en construisant dynamiquement (cast) un objet de type Milieu_I...
void resetTime(double time) override
Reset current time of the equation. Used from ICoCo. See documentation of Problem_base::resetTime().
void compute_mutilde()
Calcul de mutilde = beta*dW/dc - ∇. kappa ∇c.
Fermeture_Thermo_base & fermeture()
Champ_Inc_base & mutilde()
std::vector< YAML_data > data_a_sauvegarder() const override
for PDI IO: retrieve name, type and dimensions of the fields to save/restore
OWN_PTR(Domaine_Cl_dis_base) le_dom_Cl_dis_mutilde_
bool passer_par_ajouter_kappa_
bool updateGivenFields() override
cf Equation_base::updateGivenFields()
void set_param(Param &) const override
void abortTimeStep() override
Reinitialize what must be.
void construire_mobilite(const DoubleTab &)
Operateur_Diff terme_mobilite_
Operateur_Diff terme_kappa_
Entree & lire_cl_potentiel(Entree &)
Lecture des conditions limites sur un flot d'entree.
int nombre_d_operateurs_tot() const override
bool initTimeStep(double dt) override
Allocation and initialization of the unknown and boundary conditions until present+dt.
void initialiser_matrices()
const Operateur & operateur(int) const override
Renvoie le i-eme operateur de l'equation:
void discretiser_mutilde()
void associer_pb_base(const Probleme_base &) override
S'associe au probleme: apelle Equation_base::associer_pb_base(const Probleme_base&) les deux termes d...
void calculer_contribution_CL_mutilde(const DoubleTab &)
Renvoie la contribution des conditions limites sur le potentiel chimique sous forme d'un vecteur (mul...
OBS_PTR(Milieu_base) milieu_
bool matrices_initialisees_
int reprendre(Entree &) override
Effectue une reprise a partir d'un flot d'entree.
void lire_terme_mobilite()
const Champ_Inc_base & mutilde() const
Matrice_Morse mat_mobilite_
const Motcle & domaine_application() const override
Renvoie le nom du domaine d'application: "Cahn_Hilliard".
int nombre_d_operateurs() const override
Renvoie le nombre d'operateurs de l'equation: Pour Cahn-Hilliard c'est 2.
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...
Domaine_Cl_dis_base & domaine_Cl_dis_mutilde()
Champ_Don_base & kappa()
void update_terme_mobilite(const DoubleTab &)
Matrice_Morse mat_kappa_
double calculer_pas_de_temps() const override
Calcul du prochain pas de temps.
Champ_Don_base & mobilite()
void discretiser_concentration()
Matrice_Morse & matrice_mobilite()
const Champ_Inc_base & inconnue() const override
Renvoie la concentration (champ inconnue de l'equation) (version const).
class Champ_Don_base base class of Given Fields (not calculated)
Class Champ_Inc_base.
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
class Equation_base The role of an equation is the calculation of one or more fields....
classe Fermeture_Thermo_base
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
Milieu_base This class is the base of the (physical) medium hierarchy.
Definition Milieu_base.h:50
A character string (Nom) in uppercase.
Definition Motcle.h:26
friend class Entree
Definition Objet_U.h:71
friend class Sortie
Definition Objet_U.h:70
Operateur_Diff Generic class of the hierarchy of operators representing a diffusion.
class Operateur Generic class of the operator hierarchy.
Definition Operateur.h:39
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
class Probleme_base It is a Probleme_U that is not a coupling.
class Schema_Temps_base