TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Fermeture_Phase_field_base.h
1/****************************************************************************
2* Copyright (c) 2025, 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 Fermeture_Phase_field_base_included
17#define Fermeture_Phase_field_base_included
18
19#include <Table.h>
20
21#define PI 3.14159265
22
24{
25 Declare_base(Fermeture_Phase_field_base);
26public:
27 inline int get_type_systeme_naire() const { return type_systeme_naire_; }
29 inline int get_nb_constituants() const { return nb_constituants_; }
30 inline int get_type_kappa() const { return type_kappa_; }
32 inline int get_kappa_ind() const { return kappa_ind_; }
33
34 inline double get_mult_kappa() const { return mult_kappa_; }
35 inline double get_kappa() const { return kappa_; }
36 inline double get_alpha() const { return alpha_; }
37 inline double get_beta() const { return beta_; }
38 inline double get_molarVolume() const { return molarVolume_; }
39 inline double get_prefactor() const { return prefactor_; }
40 inline double get_temperature() const { return temperature_; }
41
42 inline const DoubleVect& get_alphaMatrix() const { return alphaMatrix_; }
43 inline const DoubleVect& get_betaMatrix() const { return betaMatrix_; }
44 inline const DoubleVect& get_kappaMatrix() const { return kappaMatrix_; }
45
46 double call_kappa_func_c(const double d) const { return (this->*kappa_func_c)(d); }
47 DoubleTab call_kappa_func_c_naire(const DoubleTab& d) const { return (this->*kappa_func_c_naire)(d); }
48
49 double (Fermeture_Phase_field_base::*kappa_func_c)(const double) const;
50 DoubleTab (Fermeture_Phase_field_base::*kappa_func_c_naire)(const DoubleTab&) const;
51
52 double kappa_func_c_defaut(const double) const;
53 double kappa_func_c_general(const double) const;
54 DoubleTab kappa_func_c_naire_general(const DoubleTab&) const;
55 DoubleTab kappa_func_auto_diffusion(const DoubleTab&) const;
56 DoubleTab kappa_func_c_naire_defaut(const DoubleTab&) const;
57
58 double call_dWdc(const double d) const { return (this->*dWdc)(d); }
59 DoubleTab call_dWdc_naire(const DoubleTab& d) const { return (this->*dWdc_naire)(d); }
60
61 double (Fermeture_Phase_field_base::*dWdc)(const double) const;
62 DoubleTab (Fermeture_Phase_field_base::*dWdc_naire)(const DoubleTab&) const;
63
64 double dWdc_defaut(const double) const;
65 double dWdc_general(const double) const;
66 DoubleTab dWdc_naire_general(const DoubleTab&) const;
67 DoubleTab dWdc_naire_defaut(const DoubleTab&) const;
68 DoubleTab dWdc_naire_analytique_ternaire(const DoubleTab&) const;
69 DoubleTab dWdc_naire_analytique_quaternaire(const DoubleTab&) const;
70
71protected:
75
76 double alpha_ = -123., beta_ = -123., kappa_ = -123.;
77 double alpha_ref_ = -123., angle_alphaMatrix_ = -123.;
78 double diagonal_coeff_ = -123., mult_kappa_ = -123.;
79 double temperature_ = -123., molarVolume_ = -123., prefactor_ = -123.;
80
82
86};
87
88inline double Fermeture_Phase_field_base::dWdc_general(const double c) const
89{
90 return potentiel_chimique_expr_.val(c, 0);
91}
92
93inline DoubleTab Fermeture_Phase_field_base::dWdc_naire_general(const DoubleTab& c) const
94{
95 DoubleTab dWdc_tab(c);
96 dWdc_tab = 0;
97 for (int i = 0; i < c.dimension(0); i++)
98 dWdc_tab(i, 0) = potentiel_chimique_expr_.val(c(i, 0), 0.);
99 return dWdc_tab;
100}
101
102inline double Fermeture_Phase_field_base::kappa_func_c_general(const double c) const
103{
104 return std::max(mult_kappa_ * kappa_ * kappa_forme_expr_.val(c, 0), 0.);
105}
106
107inline DoubleTab Fermeture_Phase_field_base::kappa_func_c_naire_general(const DoubleTab& c) const
108{
109 DoubleTab kappaMatrix_tab(c.dimension(0), 1);
110 for (int i = 0; i < c.dimension(0); i++)
111 kappaMatrix_tab(i, 0) = std::max(mult_kappa_ * kappa_ * kappa_forme_expr_.val(c(i, 0), 0), 0.);
112 return kappaMatrix_tab;
113}
114
115inline double Fermeture_Phase_field_base::dWdc_defaut(const double c) const
116{
117 return 4 * c * (c + 0.5) * (c - 0.5);
118 //return 2*c*(1-c)*(1-2*c);
119 //return 2*(c-0)*(c-0.68)*(2*c-0-0.68);
120}
121
122inline DoubleTab Fermeture_Phase_field_base::dWdc_naire_defaut(const DoubleTab& c) const
123{
124 DoubleTab dWdc_(c);
125 dWdc_ = 0;
126 for (int j = 0; j < c.line_size(); j++)
127 {
128 for (int i = 0; i < c.dimension(0); i++)
129 {
130 dWdc_(i, j) = 2 * (c(i, j) - eq1_(j)) * (c(i, j) - eq2_(j)) * (2 * c(i, j) - eq1_(j) - eq2_(j));
131 }
132 }
133 return dWdc_;
134}
135
136inline DoubleTab Fermeture_Phase_field_base::dWdc_naire_analytique_ternaire(const DoubleTab& c) const
137{
138 DoubleTab dWdc_(c);
139 dWdc_ = 0;
140 DoubleTab P(c.dimension(0), 2);
141 P = 0;
142
143 DoubleTab dPdxU(P);
144 DoubleTab dPdxZr(P);
145
146 //here j defines oxide and metal
147 for (int j = 0; j < 2; j++)
148 {
149 for (int i = 0; i < c.dimension(0); i++)
150 {
151 P(i, j) = pow(((cos(angle_psi_(j) * PI / 180.0) * (c(i, 0) - x0Eq_(j)) + sin(angle_psi_(j) * PI / 180.0) * (c(i, 1) - x1Eq_(j))) / (a0Eq_(j))), 2)
152 + pow(((-sin(angle_psi_(j) * PI / 180.0) * (c(i, 0) - x0Eq_(j)) + cos(angle_psi_(j) * PI / 180.0) * (c(i, 1) - x1Eq_(j))) / (a1Eq_(j))), 2);
153 }
154 }
155
156 //here j defines oxide and metal
157 for (int j = 0; j < 2; j++)
158 {
159 for (int i = 0; i < c.dimension(0); i++)
160 {
161 dPdxU(i, j) = 2 * (c(i, 0) - x0Eq_(j)) * ((pow(cos(angle_psi_(j) * PI / 180.0) / (a0Eq_(j)), 2) + pow(sin(angle_psi_(j) * PI / 180.0) / (a1Eq_(j)), 2)))
162 + 2 * (c(i, 1) - x1Eq_(j)) * ((cos(angle_psi_(j) * PI / 180.0) * sin(angle_psi_(j) * PI / 180.0)) / (pow(a0Eq_(j), 2)) - (sin(angle_psi_(j) * PI / 180.0) * cos(angle_psi_(j) * PI / 180.0)) / (pow(a1Eq_(j), 2)));
163 dPdxZr(i, j) = 2 * (-(c(i, 0) - x0Eq_(j)) * sin(angle_psi_(j) * PI / 180.0) + (c(i, 1) - x1Eq_(j)) * cos(angle_psi_(j) * PI / 180.0)) * cos(angle_psi_(j) * PI / 180.0) / pow(a1Eq_(j), 2)
164 + 2 * ((c(i, 0) - x0Eq_(j)) * cos(angle_psi_(j) * PI / 180.0) + (c(i, 1) - x1Eq_(j)) * sin(angle_psi_(j) * PI / 180.0)) * sin(angle_psi_(j) * PI / 180.0) / pow(a0Eq_(j), 2);
165
166 }
167 }
168 for (int i = 0; i < c.dimension(0); i++)
169 {
170 dWdc_(i, 0) = prefactor_ * (P(i, 0) * dPdxU(i, 1) + P(i, 1) * dPdxU(i, 0));
171 dWdc_(i, 1) = prefactor_ * (P(i, 0) * dPdxZr(i, 1) + P(i, 1) * dPdxZr(i, 0));
172 }
173
174 return dWdc_;
175}
176
178{
179 DoubleTab dWdc_(c);
180 dWdc_ = 0;
181 DoubleTab P(c.dimension(0), 2);
182 P = 0;
183 DoubleTab dPdx0(P);
184 DoubleTab dPdx1(P);
185 DoubleTab dPdx2(P);
186
187 for (int j = 0; j < 2; j++)
188 {
189 for (int i = 0; i < c.dimension(0); i++)
190 {
191 P(i, j) = pow(
192 ((cos(angle_psi_(j) * PI / 180.0) * (c(i, 0) - x0Eq_(j)) + sin(angle_psi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0) * (c(i, 1) - x1Eq_(j))
193 + sin(angle_psi_(j) * PI / 180.0) * sin(angle_phi_(j) * PI / 180.0) * (c(i, 2) - x2Eq_(j))) / (a0Eq_(j))), 2)
194 + pow(
195 ((-sin(angle_psi_(j) * PI / 180.0) * (c(i, 0) - x0Eq_(j)) + cos(angle_psi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0) * (c(i, 1) - x1Eq_(j))
196 + cos(angle_psi_(j) * PI / 180.0) * sin(angle_phi_(j) * PI / 180.0) * (c(i, 2) - x2Eq_(j))) / (a1Eq_(j))), 2)
197 + pow(((-sin(angle_phi_(j) * PI / 180.0) * (c(i, 1) - x1Eq_(j)) + cos(angle_phi_(j) * PI / 180.0) * (c(i, 2) - x2Eq_(j))) / (a2Eq_(j))), 2);
198 }
199 }
200 for (int j = 0; j < 2; j++)
201 {
202 for (int i = 0; i < c.dimension(0); i++)
203 {
204 dPdx0(i, j) = 2 * (c(i, 0) - x0Eq_(j)) * ((pow(cos(angle_psi_(j) * PI / 180.0) / (a0Eq_(j)), 2) + pow(sin(angle_psi_(j) * PI / 180.0) / (a1Eq_(j)), 2)))
205 + 2 * (c(i, 1) - x1Eq_(j))
206 * ((cos(angle_psi_(j) * PI / 180.0) * sin(angle_psi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0)) / (pow(a0Eq_(j), 2))
207 - (cos(angle_psi_(j) * PI / 180.0) * sin(angle_psi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0)) / (pow(a1Eq_(j), 2)))
208 + 2 * (c(i, 2) - x2Eq_(j))
209 * ((cos(angle_psi_(j) * PI / 180.0) * sin(angle_psi_(j) * PI / 180.0) * sin(angle_phi_(j) * PI / 180.0)) / (pow(a0Eq_(j), 2))
210 - (cos(angle_psi_(j) * PI / 180.0) * sin(angle_psi_(j) * PI / 180.0) * sin(angle_phi_(j) * PI / 180.0)) / (pow(a1Eq_(j), 2)));
211 dPdx1(i, j) = 2 * (c(i, 0) - x0Eq_(j))
212 * ((sin(angle_psi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0)) / (pow(a0Eq_(j), 2))
213 - (sin(angle_psi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0)) / (pow(a1Eq_(j), 2)))
214 + 2 * (c(i, 1) - x1Eq_(j))
215 * ((pow(sin(angle_psi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0) / (a0Eq_(j)), 2) + pow(cos(angle_psi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0) / (a1Eq_(j)), 2))
216 + pow(sin(angle_phi_(j) * PI / 180.0) / (a2Eq_(j)), 2))
217 + 2 * (c(i, 2) - x2Eq_(j))
218 * ((pow(sin(angle_psi_(j) * PI / 180.0), 2) * cos(angle_phi_(j) * PI / 180.0) * sin(angle_phi_(j) * PI / 180.0) / (pow(a0Eq_(j), 2)))
219 + pow(cos(angle_psi_(j) * PI / 180.0), 2) * cos(angle_phi_(j) * PI / 180.0) * sin(angle_phi_(j) * PI / 180.0) / (pow(a1Eq_(j), 2))
220 + (sin(angle_phi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0) / (pow(a2Eq_(j), 2))));
221 dPdx2(i, j) = 2 * (c(i, 0) - x0Eq_(j))
222 * ((sin(angle_psi_(j) * PI / 180.0) * sin(angle_phi_(j) * PI / 180.0) * cos(angle_psi_(j) * PI / 180.0)) / (pow(a0Eq_(j), 2))
223 - (sin(angle_psi_(j) * PI / 180.0) * sin(angle_phi_(j) * PI / 180.0) * cos(angle_psi_(j) * PI / 180.0)) / (pow(a1Eq_(j), 2)))
224 + 2 * (c(i, 1) - x1Eq_(j))
225 * ((pow(sin(angle_psi_(j) * PI / 180.0), 2) * sin(angle_phi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0) / (pow(a0Eq_(j), 2)))
226 + pow(cos(angle_psi_(j) * PI / 180.0), 2) * sin(angle_phi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0) / (pow(a1Eq_(j), 2))
227 + (-sin(angle_phi_(j) * PI / 180.0) * cos(angle_phi_(j) * PI / 180.0) / (pow(a2Eq_(j), 2))))
228 + 2 * (c(i, 2) - x2Eq_(j))
229 * (pow(sin(angle_psi_(j) * PI / 180.0) * sin(angle_phi_(j) * PI / 180.0) / (a0Eq_(j)), 2) + pow(cos(angle_psi_(j) * PI / 180.0) * sin(angle_phi_(j) * PI / 180.0) / (a1Eq_(j)), 2)
230 + pow(cos(angle_phi_(j) * PI / 180.0) / (a2Eq_(j)), 2));
231 }
232 }
233 for (int i = 0; i < c.dimension(0); i++)
234 {
235 dWdc_(i, 0) = prefactor_ * (P(i, 0) * dPdx0(i, 1) + P(i, 1) * dPdx0(i, 0)); //+muUeq a rajouter
236 dWdc_(i, 1) = prefactor_ * (P(i, 0) * dPdx1(i, 1) + P(i, 1) * dPdx1(i, 0)); //+muZrEq a rajouter
237 dWdc_(i, 2) = prefactor_ * (P(i, 0) * dPdx2(i, 1) + P(i, 1) * dPdx2(i, 0)); //+muFeEq a rajouter
238 }
239
240 return dWdc_;
241}
242inline double Fermeture_Phase_field_base::kappa_func_c_defaut(const double c) const
243{
244 return std::max(mult_kappa_ * kappa_ * (c + 0.5) * (0.5 - c), 0.);
245}
246
247inline DoubleTab Fermeture_Phase_field_base::kappa_func_c_naire_defaut(const DoubleTab& c) const
248{
249 DoubleTab kappaMatrix_tab(c.dimension(0), 1);
250 for (int i = 0; i < c.dimension(0); i++)
251 kappaMatrix_tab(i, 0) = std::max(mult_kappa_ * kappa_ * (c(i, 0) + 0.5) * (0.5 - c(i, 0)), 0.);
252 return kappaMatrix_tab;
253
254}
255
256inline DoubleTab Fermeture_Phase_field_base::kappa_func_auto_diffusion(const DoubleTab& c) const
257{
258 DoubleTab temp_c(c.dimension(0), c.line_size() + 1);
259 DoubleTab temp_kappa(c.dimension(0), nb_constituants_, nb_constituants_); //define temp to avoid resize here
260 DoubleTab kappaMat = temp_kappa;
261 kappaMat = 0;
262 DoubleTab kappa_ij(temp_kappa);
263 DoubleTab somme_c(c.dimension(0));
264 somme_c = 0;
265 DoubleTab kappaMatrix_tab(c.dimension(0), nb_constituants_ * nb_constituants_);
266
267 // creation d'un tableau temp_c qui contiendra toutes les concentrations des n composants non pas les n-1 seulements (n-1 eqs).
268 //La derniere colonne correspondra a 1-somme sur (n-1) des concentrations
269
270 for (int k = 0; k < c.line_size(); k++)
271 for (int l = 0; l < c.dimension(0); l++)
272 {
273 temp_c(l, k) = c(l, k);
274 somme_c(l) += c(l, k);
275 temp_c(l, c.line_size()) = 1.0 - somme_c(l);
276 }
277
278 // calcul de la mobilite kappa dans un doubleTab (n1,n2,n3)
279 for (int k = 0; k < nb_constituants_ + 1; k++)
280 {
281 for (int j = 0; j < nb_constituants_; j++)
282 for (int i = 0; i < nb_constituants_; i++)
283 for (int l = 0; l < c.dimension(0); l++)
284 {
285 // kappa_ij(l,i,j) = (j==k) ? 1-temp_c(l,j) : -temp_c(l,j);
286 // kappa_ij(l,i,j) *= (i==k) ? 1-temp_c(l,i) : -temp_c(l,i);
287 // kappa_ij(l,i,j) *= temp_c(l,k)*coeff_auto_diff(k);
288 //
289 if (j == k)
290 kappa_ij(l, i, j) = 1 - temp_c(l, j);
291 else
292 kappa_ij(l, i, j) = -temp_c(l, j);
293 if (i == k)
294 kappa_ij(l, i, j) *= 1 - temp_c(l, i);
295 else
296 kappa_ij(l, i, j) *= -temp_c(l, i);
297 kappa_ij(l, i, j) *= temp_c(l, k) * coeff_auto_diffusion_(k);
298 }
299 kappaMat += kappa_ij;
300 }
301
302 //retour vers un DoubleTab (n1,n2)
303 for (int j = 0; j < nb_constituants_; j++)
304 for (int i = 0; i < nb_constituants_; i++)
305 for (int l = 0; l < c.dimension(0); l++)
306 kappaMatrix_tab(l, i + nb_constituants_ * j) = kappaMat(l, i, j);
307
308 kappaMatrix_tab *= molarVolume_ / prefactor_ * 8.314 * temperature_;
309 return kappaMatrix_tab;
310
311}
312
313#endif /* Fermeture_Phase_field_base_included */
double kappa_func_c_general(const double) const
DoubleTab dWdc_naire_general(const DoubleTab &) const
double(Fermeture_Phase_field_base::* kappa_func_c)(const double) const
DoubleTab dWdc_naire_defaut(const DoubleTab &) const
const DoubleVect & get_kappaMatrix() const
DoubleTab call_dWdc_naire(const DoubleTab &d) const
DoubleTab call_kappa_func_c_naire(const DoubleTab &d) const
DoubleTab kappa_func_c_naire_defaut(const DoubleTab &) const
DoubleTab(Fermeture_Phase_field_base::* kappa_func_c_naire)(const DoubleTab &) const
double(Fermeture_Phase_field_base::* dWdc)(const double) const
DoubleTab dWdc_naire_analytique_quaternaire(const DoubleTab &) const
DoubleTab(Fermeture_Phase_field_base::* dWdc_naire)(const DoubleTab &) const
DoubleTab kappa_func_c_naire_general(const DoubleTab &) const
double kappa_func_c_defaut(const double) const
DoubleTab dWdc_naire_analytique_ternaire(const DoubleTab &) const
double call_kappa_func_c(const double d) const
double dWdc_defaut(const double) const
double call_dWdc(const double d) const
const DoubleVect & get_betaMatrix() const
DoubleTab kappa_func_auto_diffusion(const DoubleTab &) const
const DoubleVect & get_alphaMatrix() const
double dWdc_general(const double) const
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
Definition Objet_U.cpp:55
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
int line_size() const
Definition TRUSTVect.tpp:67
Definition Table.h:29