TrioCFD 1.9.8
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
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
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
Reinitialiser ce qui doit l'etre.
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 et initialisation de l'inconnue et des CLs jusqu'a 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).
classe Champ_Don_base classe de base des Champs donnes (non calcules)
Classe Champ_Inc_base.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
classe Fermeture_Thermo_base
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
friend class Entree
Definition Objet_U.h:76
friend class Sortie
Definition Objet_U.h:75
classe Operateur_Diff Classe generique de la hierarchie des operateurs representant un terme
classe Operateur Classe generique de la hierarchie des operateurs.
Definition Operateur.h:39
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
class Schema_Temps_base