TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Source_Con_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 <Convection_Diffusion_Phase_field.h>
17#include <Source_Qdm_VDF_Phase_field.h>
18#include <Navier_Stokes_phase_field.h>
19#include <Source_Con_Phase_field.h>
20#include <Check_espace_virtuel.h>
21#include <MD_Vector_composite.h>
22#include <Milieu_Phase_field.h>
23#include <Champ_Fonc_Tabule.h>
24#include <Domaine_Cl_VDF.h>
25#include <TRUSTTab_parts.h>
26#include <Champ_Uniforme.h>
27#include <Equation_base.h>
28#include <Probleme_base.h>
29#include <Domaine_VDF.h>
30#include <Milieu_base.h>
31#include <SolveurSys.h>
32#include <Dimension.h>
33#include <EChaine.h>
34#include <Param.h>
35
36Implemente_base(Source_Con_Phase_field,"Source_Con_Phase_field_VDF_P0_VDF",Source_Con_Phase_field_base);
37
38// XD source_con_phase_field source_base source_con_phase_field BRACE Keyword to define the source term of the
39// XD_CONT Cahn-Hilliard equation.
40// XD attr systeme_naire systeme_naire_deriv systeme_naire OPT not_set
41// XD attr temps_d_affichage entier temps_d_affichage REQ Time during the caracteristics of the problem are shown before
42// XD_CONT calculation.
43// XD attr moyenne_de_kappa chaine moyenne_de_kappa REQ To define how mobility kappa is calculated on faces of the mesh
44// XD_CONT according to cell-centered values (chaine is arithmetique/harmonique/geometrique).
45// XD attr multiplicateur_de_kappa floattant multiplicateur_de_kappa REQ To define the parameter of the mobility
46// XD_CONT expression when mobility depends on C.
47// XD attr couplage_NS_CH chaine couplage_NS_CH REQ Evaluating time choosen for the term source calculation into the
48// XD_CONT Navier Stokes equation (chaine is mutilde(n+1/2)/mutilde(n), in order to be conservative, the first choice
49// XD_CONT seems better).
50// XD attr implicitation_CH chaine(into=["oui","non"]) implicitation_CH REQ To define if the Cahn-Hilliard will be
51// XD_CONT solved using a implicit algorithm or not.
52// XD attr seuil_residu_jfnk floattant seuil_residu_jfnk REQ Convergence threshold (an option of the Newton-Krylov
53// XD_CONT method).
54// XD attr dimension_espace_de_krylov entier dimension_espace_de_krylov REQ Vector numbers used in the method (an option
55// XD_CONT of the Newton-Krylov method).
56// XD attr nb_iterations_jfnk entier nb_iterations_jfnk REQ Maximal iteration (an option of the Newton-Krylov method).
57// XD attr residu_min_jfnk floattant residu_min_jfnk REQ Minimal convergence threshold (an option of the Newton-Krylov
58// XD_CONT method).
59// XD attr residu_max_jfnk floattant residu_max_jfnk REQ Maximal convergence threshold (an option of the Newton-Krylov
60// XD_CONT method).
61
62// XD bloc_kappa_variable objet_lecture nul NO_BRACE if the parameter of the mobility, kappa, depends on C
63// XD attr expr bloc_lecture expr REQ choice for kappa_variable
64
65// XD bloc_potentiel_chim objet_lecture nul NO_BRACE if the chemical potential function is an univariate function
66// XD attr expr bloc_lecture expr REQ choice for potentiel_chimique
67
68// XD systeme_naire_deriv objet_lecture systeme_naire_deriv INHERITS_BRACE not_set
69// XD systeme_naire_non systeme_naire_deriv non BRACE not_set
70// XD attr alpha floattant alpha REQ Internal capillary coefficient alfa.
71// XD attr beta floattant beta REQ Parameter beta of the model.
72// XD attr kappa floattant kappa REQ Mobility coefficient kappa0.
73// XD attr kappa_variable bloc_kappa_variable kappa_variable REQ To define a mobility which depends on concentration C.
74// XD attr potentiel_chimique bloc_potentiel_chim potentiel_chimique OPT chemical potential function
75
77{
78 return s << que_suis_je();
79}
80
82{
83 Param param(que_suis_je());
84 param.ajouter("Temps_d_affichage", &tpsaff_, Param::REQUIRED);
85 param.ajouter("absolute_tol", &atol_, Param::REQUIRED);
86 param.ajouter("relative_tol", &rtol_, Param::REQUIRED);
87 param.ajouter("stagn_tol", &stol_, Param::REQUIRED);
88 param.ajouter("max_it_newton", &maxit_newton_, Param::REQUIRED);
89 param.ajouter("max_it_GMRES", &maxit_gmres_, Param::REQUIRED);
90 param.ajouter("dimension_espace_de_krylov", &nkr_, Param::REQUIRED);
91 param.ajouter("matrix_free_erel", &erel_, Param::REQUIRED);
92 param.ajouter("matrix_free_umin", &umin_, Param::REQUIRED);
93 param.ajouter_non_std("moyenne_de_kappa", (this), Param::REQUIRED);
94 param.ajouter_non_std("couplage_NS_CH", (this), Param::REQUIRED);
95 param.ajouter_non_std("implicitation_CH", (this), Param::REQUIRED);
96 param.ajouter_non_std("mobilite_explicite", (this), Param::REQUIRED);
97 param.ajouter_non_std("resolution_petsc", (this), Param::REQUIRED);
98
99 param.lire_avec_accolades_depuis(is);
100
102 {
103 Cerr << "Source_Con_Phase_field::readOn: Temps_d_affichage should be in the range 0 - 100 seconds." << finl;
105 }
106 return is;
107}
108
110{
111 Motcle temp;
112 if (mot == "implicitation_CH")
113 {
114 is >> temp;
115 if (temp == "oui")
116 implicitation_ = 1;
117 else
118 implicitation_ = 0;
119 return 1;
120 }
121 else if (mot == "mobilite_explicite")
122 {
123 is >> temp;
124 if (temp == "oui")
126 else
128 return 1;
129 }
130 else if (mot == "resolution_petsc")
131 {
132 is >> temp;
133 if (temp == "oui")
134 with_petsc_ = 1;
135 else
136 with_petsc_ = 0;
137 return 1;
138 }
139 else if (mot == "couplage_NS_CH")
140 {
141 is >> temp;
142 if (temp == "mutilde(n)")
143 couplage_ = 0;
144 else
145 couplage_ = 1;
146 return 1;
147 }
148 else if (mot == "moyenne_de_kappa")
149 {
150 is >> temp;
151 if (temp == "arithmetique")
152 kappa_moy_ = 0;
153 else if (temp == "harmonique")
154 kappa_moy_ = 1;
155 else
156 kappa_moy_ = 2;
157 return 1;
158 }
159 return -1;
160}
161
163{
164 pb_ = pb;
165 Navier_Stokes_phase_field& eq_ns = ref_cast(Navier_Stokes_phase_field, pb_->equation(0));
166 Convection_Diffusion_Phase_field& eq_c = ref_cast(Convection_Diffusion_Phase_field, pb_->equation(1));
167 const Milieu_Phase_field& mil = ref_cast(Milieu_Phase_field, pb_->milieu());
168 rho0_ = mil.rho0();
169 drhodc_ = mil.drhodc();
170 // Dans le modele binaire cette derivee est constante - On la calcule au debut selon que l'approx boussi soit utilisee ou non.
171
172 // UPDATE Luis: C'est ici que le cas du système binaire ou du système n-aire est testé par rapport aux fermetures --------------------------
173 if (mil.get_fermeture().get_type_systeme_naire() == 0)
174 {
175 if ((this->que_suis_je() != "Source_Con_Phase_field_Binaire_VDF_P0_VDF") && (this->que_suis_je() != "Source_Con_Phase_field_Binaire_Compact_VDF_P0_VDF"))
176 {
177 Cerr << "Source term is of type " << this->que_suis_je() << finl;
178 Cerr << "** Error: Closure type does not fit with phase field source term... **" << finl;
179 Cerr << "** Check if they are both for binary systems. **" << finl;
181 }
182 }
183 else if ((mil.get_fermeture().get_type_systeme_naire() == 1) && (this->que_suis_je() != "Source_Con_Phase_field_Naire_VDF_P0_VDF"))
184 {
185 Cerr << "Source term is of type " << this->que_suis_je() << finl;
186 Cerr << "** Error: Closure type does not fit with phase field source term... **" << finl;
187 Cerr << "** Check if they are both for n-ary systems. **" << finl;
189 }
190 // -----------------------------------------------------------------------------------------------------------------------------------------
191
192 boussi_ = mil.get_boussi();
193 if (boussi_ != 1 && boussi_ != 0)
194 {
195 Cerr << "Erreur dans le choix du parametre boussi_" << finl;
197 }
198
199 // diff_boussi==1 si la viscosite dynamique n'est pas constante (variation de la viscosite en fonction de la concentration c)
201 if (diff_boussi_ != 1 && diff_boussi_ != 0)
202 {
203 Cerr << "Erreur dans le choix du parametre diff_boussi_" << finl;
205 }
206
207 g_ = mil.gravite().valeurs();
208
209 // mutype==1 si c'est avec energie cinetique (dans l'expression du potentiel chimique generalise)
210 mutype_ = eq_c.get_mutype_();
211 if (mutype_ != 0 && mutype_ != 1)
212 {
213 Cerr << "Erreur dans le choix du parametre mutype_" << finl;
215 }
216
217 if (implicitation_ != 0 && implicitation_ != 1)
218 {
219 Cerr << "=================================================" << finl;
220 Cerr << "Choix de l'implicitation incorrect ! (ni 0, ni 1)" << finl;
221 Cerr << "=================================================" << finl;
223 }
224
225 //choix de la methode de calcul de la moyenne des mobilites vis a vis du gradient de mutilde dans le cas implicite
226 if (implicitation_ == 1)
227 {
228 if (kappa_moy_ != 0 && kappa_moy_ != 1 && kappa_moy_ != 2)
229 {
230 Cerr << "Erreur dans le choix de la moyenne de kappa !" << finl;
232 }
233 }
234
235 // Recapitulatif des parametres
236
237 Nom choix_boussi;
238 if (boussi_ == 1)
239 choix_boussi = "oui";
240 else
241 choix_boussi = "non";
242
243 Nom choix_diff_boussi;
244 if (diff_boussi_ == 1)
245 choix_diff_boussi = "oui";
246 else
247 choix_diff_boussi = "non";
248 if (boussi_ == 1 && diff_boussi_ == 1)
249 Cerr << "ATTENTION : les options 'approximation de Boussinesq' et" << "'approximation de Boussinesq dans le terme de diffusion' ne devrait pas etre utilisees simultanement'."
250 << "(voir Source_Con_Phase_field.cpp)" << finl;
251
252 const int terme_source = eq_ns.getset_terme_source();
253
254 Nom choix_source;
255 if (terme_source == 1)
256 choix_source = "c grad(mutilde)";
257 else if (terme_source == 2)
258 choix_source = "c grad(laplacien(c))";
259 else if (terme_source == 3)
260 choix_source = "c grad(laplacien(c))-div((grad(c))^2)/2";
261 else if (terme_source == 4)
262 choix_source = "-laplacien(c) grad(c)";
263
264 Nom choix_implicite;
265 if (implicitation_ == 1)
266 choix_implicite = "oui";
267 else
268 choix_implicite = "non";
269
270 Nom type_implicite;
271 type_implicite = "JFNK";
272
273 Nom mutilde_d;
274 if (mutype_ == 1)
275 mutilde_d = "avec le terme d'Ec";
276 else
277 mutilde_d = "sans le terme d'Ec";
278
279 Nom type_couplage;
280 if (couplage_ == 1)
281 type_couplage = "potentiel au temps n+1/2";
282 else
283 type_couplage = "potentiel au temps n";
284 Nom mobilite_variable;
285 Nom moyenne_kappa;
286
288 mobilite_variable = "oui";
289 else
290 mobilite_variable = "non";
291
292 if (kappa_moy_ == 0)
293 moyenne_kappa = "arithmetique (+)";
294 else if (kappa_moy_ == 1)
295 moyenne_kappa = "harmonique (/)";
296 else if (kappa_moy_ == 2)
297 moyenne_kappa = "geometrique (*)";
298
300
301
302 Cerr << "" << finl;
303 Cerr << "" << finl;
304 Cerr << "******************************************************************************" << finl;
305 Cerr << "*********************** RECAPITULATIF DU PARAMETRAGE *************************" << finl;
306 Cerr << "" << finl;
307 Cerr << "1) Equation de Navier-Stokes" << finl;
308 Cerr << " - approximation de Boussinesq : " << choix_boussi << finl;
309 if (boussi_ == 0)
310 {
311 Cerr << " - approximation de Boussinesq dans la diffusion : " << choix_diff_boussi << finl;
312 }
313 else
314 {
315 Cerr << " - masse volumique de reference : " << rho0_ << " kg/m3" << finl;
316 }
317 Cerr << " Dans le cas ou la viscosite dynamique est variable : " << finl;
318 Cerr << " - terme source : " << choix_source << finl;
319 Cerr << " - intensite du champ de gravite : " << norme_array(g_) << " m/s^2" << finl;
320 Cerr << "" << finl;
321 Cerr << "2) Equation de Cahn-Hilliard" << finl;
322 Cerr << " - discretisation implicite : " << choix_implicite << finl;
323 if (implicitation_ == 1)
324 {
325 Cerr << " - algorithme implicite : " << type_implicite << finl;
326 }
327 Cerr << " - potentiel chimique generalise : " << mutilde_d << finl;
328 Cerr << " - couplage NS / CH via le potentiel chimique : " << type_couplage << finl;
329
330 Cerr << " - mobilite variable : " << mobilite_variable << finl;
332 {
333 Cerr << " - type de moyenne pour la mobilite : " << moyenne_kappa << finl;
334 Cerr << " - multiplicateur de la mobilite : " << mil.get_fermeture().get_mult_kappa() << finl;
335 }
336
337 if (implicitation_ == 1)
338 {
339 Cerr << " - dans le cas de l'algorithme de JFNK ... " << finl;
340 if (with_petsc_ == 1)
341 {
342 Cerr << " === USING PETSc - SNES LIBRARY === " << finl;
343 Cerr << " Absolute tolerance on the residual : " << atol_ << finl;
344 Cerr << " Relative tolerance on the residual : " << rtol_ << finl;
345 Cerr << " Stagnation tolerance on the residual : " << rtol_ << finl;
346 Cerr << " Krylov space dimension : " << nkr_ << finl;
347 Cerr << " Maximum number of Newton iterations : " << maxit_newton_ << finl;
348 Cerr << " Maximum number of GMRES iterations : " << maxit_gmres_ << finl;
349 Cerr << " Differencing step parameter erel : " << erel_ << finl;
350 Cerr << " Differencing step parameter umin : " << umin_ << finl;
351 }
352 else
353 {
354 Cerr << " === USING ADHOC JFNK SOLVER === " << finl;
355 Cerr << " seuil du residu a convergence : " << atol_ << finl;
356 Cerr << " dimension de l'espace de Krylov : " << nkr_ << finl;
357 Cerr << " nombre d'iterations maximal de l'algorithme : " << maxit_gmres_ << finl;
358 Cerr << " residu minimum de convergence : " << rtol_ << finl;
359 Cerr << " residu maximum de convergence : " << stol_ << finl;
360 }
361
362 }
363 Cerr << "" << finl;
364 Cerr << "********************** Ce message persistera " << tpsaff_ << " secondes *********************" << finl;
365 Cerr << "*************** Pour continuer avant les " << tpsaff_ << " secondes : Ctrl + C **************" << finl;
366 Cerr << "******************************************************************************" << finl;
367 Cerr << "" << finl;
368 Cerr << "" << finl;
369
370 Nom tps_sleep = "sleep ";
371 tps_sleep += Nom(tpsaff_);
372 Cerr << (int) system(tps_sleep) << finl;
373}
374
376{
377 le_dom_VDF_ = ref_cast(Domaine_VDF, domaine_dis);
378 le_dom_Cl_VDF_ = ref_cast(Domaine_Cl_VDF, domaine_Cl_dis);
379}
380
381DoubleTab& Source_Con_Phase_field::ajouter(DoubleTab& resu) const
382{
383 resu += accr_;
384 return resu;
385}
386
387DoubleTab& Source_Con_Phase_field::calculer(DoubleTab& resu) const
388{
389 resu = 0.;
390 return ajouter(resu);
391}
392
394{
395 Cerr << "Temps : " << temps << " s" << finl;
396 Cerr << "" << finl;
397
398 Convection_Diffusion_Phase_field& eq_c = ref_cast(Convection_Diffusion_Phase_field, pb_->equation(1));
399 Champ_Fonc_base& ch = eq_c.set_mutilde_();
400 ch.mettre_a_jour(temps);
401}
402
404{
405 const Navier_Stokes_std& eq_ns = ref_cast(Navier_Stokes_std, pb_->equation(0));
406 const Convection_Diffusion_Phase_field& eq_c = ref_cast(Convection_Diffusion_Phase_field, pb_->equation(1));
407 const DoubleTab& u = eq_ns.inconnue().valeurs();
408 const DoubleTab& c = eq_c.inconnue().valeurs();
409
410 DoubleVect u2;
411
412 u_carre = c;
413 u_carre = 0.;
414
415 u2 = u;
416 u2.carre(VECT_ALL_ITEMS);
417
418 // u2 est calcule aux faces. mutildes, pression_thermo et c au centre des elements.
419 // On doit donc interpoler u2 pour tout calculer au elements.
420
421 // Interpolation de u2, sortie dans u_carre :
422 // ------------------------------------------
423
424 // Interpolation aux elements de u^2 (a partir de Discretisation_SG_VDF::calculer_tenS_capil)
425 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
426 const IntTab& elem_faces = domaine_VDF.elem_faces();
427 const IntTab& face_sommets = domaine_VDF.face_sommets();
428 const DoubleTab& positions = domaine_VDF.xp();
429 const Domaine& domaine_geom = domaine_VDF.domaine();
430 const int nb_elem = domaine_VDF.nb_elem_tot();
431 int f0, f1, som0, som1;
432 double psi, val0, val1;
433 DoubleTab u2_elem(nb_elem, dimension);
434 const int nb_compo_ = u2_elem.line_size();
435
436 // Boucle sur le nombre d'elements
437 for (int elem = 0; elem < nb_elem; elem++)
438 {
439 // Boucle sur le nombre de composantes du vecteur
440 for (int ncomp = 0; ncomp < nb_compo_; ncomp++)
441 {
442 f0 = elem_faces(elem, ncomp);
443 f1 = elem_faces(elem, dimension + ncomp);
444
445 val0 = u2(f0);
446 val1 = u2(f1);
447
448 som0 = face_sommets(f0, 0);
449 som1 = face_sommets(f1, 0);
450
451 psi = (positions(elem, ncomp) - domaine_geom.coord(som0, ncomp)) / (domaine_geom.coord(som1, ncomp) - domaine_geom.coord(som0, ncomp));
452
453 if (std::fabs(psi) < 1.e-12)
454 u2_elem(elem, ncomp) = val0;
455 else if (std::fabs(1. - psi) < 1.e-12)
456 u2_elem(elem, ncomp) = val1;
457 else
458 u2_elem(elem, ncomp) = val0 + psi * (val1 - val0);
459 }
460 }
461
462 // Pour chaque element, on additionne les composantes de u2_elem
463 double tmp;
464 for (int elem = 0; elem < nb_elem; elem++)
465 {
466 for (int dim = 0; dim < dimension; dim++)
467 {
468 tmp = u2_elem(elem, dim);
469 u_carre(elem) += tmp;
470 }
471 }
472
473 u_carre.echange_espace_virtuel();
474
475}
476
477/*! @brief Calcul de alpha*(Grad(C))^2 au centre des elements
478 *
479 * @param (DoubleTab& alpha_gradC_carre) alpha*(Grad(C))^2 au centre des elements
480 */
481void Source_Con_Phase_field::calculer_alpha_gradC_carre(DoubleTab& alpha_gradC_carre) const
482{
483 //Cette methode n'est pas utilisee dans cette version systeme multicomposant.(mr264902)
484
485 const Navier_Stokes_std& eq_ns = ref_cast(Navier_Stokes_std, pb_->equation(0));
486 const Convection_Diffusion_Phase_field& eq_c = ref_cast(Convection_Diffusion_Phase_field, pb_->equation(1));
487 const DoubleTab& c = eq_c.inconnue().valeurs();
488 const Operateur_Grad& opgrad = eq_ns.operateur_gradient();
489 const Milieu_Phase_field& mil = ref_cast(Milieu_Phase_field, pb_->milieu());
490
491 DoubleTab& prov_face = ref_cast_non_const(DoubleTab, prov_face_);
492 if (prov_face.size() == 0)
493 prov_face = eq_ns.inconnue().valeurs();
494 prov_face = 0.;
495
496 // On calcule Grad(c) que l'on met dans prov_face
497 opgrad.calculer(c, prov_face);
498 eq_ns.solv_masse().appliquer(prov_face);
499
500 // On calcule (Grad(c))^2 sur les faces que l'on met dans gradc2
501 DoubleVect gradc2;
502 gradc2 = prov_face;
503 gradc2.carre();
504
505 // Interpolation aux elements de (Grad(c))^2 (a partir de Discretisation_SG_VDF::calculer_tenS_capil)
506 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
507 const IntTab& elem_faces = domaine_VDF.elem_faces();
508 const IntTab& face_sommets = domaine_VDF.face_sommets();
509 const DoubleTab& positions = domaine_VDF.xp();
510 const Domaine& domaine_geom = domaine_VDF.domaine();
511 const int nb_elem = domaine_VDF.nb_elem();
512 int nb_compo_;
513 int elem;
514 int f0, f1;
515 int som0, som1;
516 double psi, val0, val1;
517
518 DoubleTab gradc2_elem(nb_elem, dimension); //***a dimensionner avec le nombre de composants des elements concentration
519
520 // Nombre de composantes du vecteur gradc2
521 if (gradc2_elem.nb_dim() == 1)
522 nb_compo_ = 1;
523 else
524 nb_compo_ = gradc2_elem.dimension(1);
525
526 // Boucle sur le nombre d'elements
527 for (elem = 0; elem < nb_elem; elem++)
528 {
529 // Boucle sur le nombre de composantes du vecteur
530 //*** composantes issues de dimension (si 2 donc x et y), faudrait-il mettre prob_dimension a la place de nb_compo et ncomp
531 //*** pour eviter toute confusion avec le nombre de composants des elements c1 c2 c3 etc//***
532 for (int ncomp = 0; ncomp < nb_compo_; ncomp++)
533 {
534 f0 = elem_faces(elem, ncomp);
535 f1 = elem_faces(elem, dimension + ncomp);
536
537 val0 = gradc2(f0);
538 val1 = gradc2(f1);
539
540 som0 = face_sommets(f0, 0);
541 som1 = face_sommets(f1, 0);
542
543 psi = (positions(elem, ncomp) - domaine_geom.coord(som0, ncomp)) / (domaine_geom.coord(som1, ncomp) - domaine_geom.coord(som0, ncomp));
544
545 if (std::fabs(psi) < 1.e-12)
546 gradc2_elem(elem, ncomp) = val0;
547 else if (std::fabs(1. - psi) < 1.e-12)
548 gradc2_elem(elem, ncomp) = val1;
549 else
550 gradc2_elem(elem, ncomp) = val0 + psi * (val1 - val0);
551 }
552 }
553
554 // Pour chaque element, on additionne les composantes de gradc2_elem
555 int dim;
556 double tmp;
557 for (elem = 0; elem < nb_elem; elem++)
558 {
559 for (dim = 0; dim < dimension; dim++)
560 {
561 tmp = gradc2_elem(elem, dim);
562 alpha_gradC_carre(elem) += tmp;
563 }
564 }
565
566 alpha_gradC_carre *= mil.get_fermeture().get_alpha();
567 // Ajout B.M suite a plantage dans assert_espace_virtuel_vect dans op_conv...
568 alpha_gradC_carre.echange_espace_virtuel();
569}
570
571/*! @brief Calcul de la pression thermodynamique aux elements
572 *
573 * @param (DoubleTab& pression_thermo) pression thermodynamique aux elements
574 */
575void Source_Con_Phase_field::calculer_pression_thermo(DoubleTab& pression_thermo) const
576{
577 //Cette methode n'est pas utilisee dans cette version systeme multicomposant.(mr264902)
578
579 const Convection_Diffusion_Phase_field& eq_c = ref_cast(Convection_Diffusion_Phase_field, pb_->equation(1));
580 const Navier_Stokes_std& eq_ns = ref_cast(Navier_Stokes_std, pb_->equation(0));
581 const DoubleTab& c = eq_c.inconnue().valeurs();
582 const DoubleTab& div_alpha_gradC = eq_c.get_div_alpha_gradC();
583
584 // Recuperation de la pression en Pascal de l'etape de projection
585 //---------------------------------------------------------------
586 const DoubleTab& P_Pa = eq_ns.pression_pa().valeurs();
587
588 const int taille = pression_thermo.size();
589
590 for (int i = 0; i < taille; i++)
591 pression_thermo(i) = P_Pa(i) - c(i) * div_alpha_gradC(i);
592}
593
594void Source_Con_Phase_field::calculer_champ_fonc_c(const double t, Champ_Don_base& champ_fonc_c, const DoubleTab& val_c) const
595{
596 if (sub_type(Champ_Fonc_Tabule, champ_fonc_c))
597 {
598 const Champ_Fonc_Tabule& ch_champ_fonc_c = ref_cast(Champ_Fonc_Tabule, champ_fonc_c);
599 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
600 const Table& table = ch_champ_fonc_c.table();
601 const int isfct = table.isfonction();
602 DoubleTab& mes_valeurs = champ_fonc_c.valeurs();
603 // code ci-dessous adapte de Champ_Fonc_Tabule_P0_VDF.mettre_a_jour
604 if (!(val_c.nb_dim() == mes_valeurs.nb_dim()))
605 {
606 Cerr << "Erreur a l'initialisation d'un Champ_Fonc_Tabule" << finl;
607 Cerr << "Le champ parametre et le champ a initialiser ne sont pas compatibles" << finl;
609 }
610 if (isfct != 2)
611 {
612 int nb_elems = domaine_VDF.nb_elem();
613 if (val_c.line_size() == 1)
614 for (int num_elem = 0; num_elem < nb_elems; num_elem++)
615 mes_valeurs(num_elem, 0) = table.val(val_c(num_elem));
616 else
617 {
618 int nb_comps = val_c.nb_dim();
619 for (int num_elem = 0; num_elem < nb_elems; num_elem++)
620 for (int ncomp = 0; ncomp < nb_comps; ncomp++)
621 mes_valeurs(num_elem, ncomp) = table.val(val_c(num_elem, ncomp));
622 }
623 }
624 else
625 {
626 const DoubleTab& centres_de_gravites = domaine_VDF.xp();
627 table.valeurs(val_c, centres_de_gravites, t, mes_valeurs);
628 }
629 }
630}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
Classe Champ_Fonc_Tabule Classe derivee de Champ_Fonc_base qui represente les.
const Table & table() const
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
void mettre_a_jour(double temps) override
Mise a jour en temps du champ.
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
double coord(int_t i, int j) const
Definition Domaine.h:110
class Domaine_Cl_VDF
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
class Domaine_VDF
Definition Domaine_VDF.h:64
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
Definition Domaine_VF.h:583
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
Definition Domaine_VF.h:543
double xp(int num_elem, int k) const
Definition Domaine_VF.h:77
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
int nb_elem_tot() const
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
const double & rho0() const
const Champ_Don_base & drhodc() const
const Fermeture_Phase_field_base & get_fermeture() const
virtual const Champ_Don_base & gravite() const
Renvoie la gravite du milieu si elle a ete associe provoque une erreur sinon.
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
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
Champ_Inc_base & pression_pa()
Operateur_Grad & operateur_gradient()
Renvoie l'operateur de calcul du gradient associe a l'equation.
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
friend class Entree
Definition Objet_U.h:76
static int dimension
Definition Objet_U.h:99
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
Classe Operateur_Grad Classe generique de la hierarchie des operateurs calculant le gradient.
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
Initialise le tableau passe en parametre avec la contribution de l'operateur.
@ REQUIRED
Definition Param.h:115
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
Classe de base des flux de sortie.
Definition Sortie.h:52
class Source_Con_Phase_field_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.
void calculer_alpha_gradC_carre(DoubleTab &) const
Calcul de alpha*(Grad(C))^2 au centre des elements.
DoubleTab & ajouter(DoubleTab &) const override
void calculer_pression_thermo(DoubleTab &) const
Calcul de la pression thermodynamique aux elements.
virtual void calculer_u2_elem(DoubleVect &)
void mettre_a_jour(double) override
DOES NOTHING - to override in derived classes.
void associer_domaines(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
void associer_pb(const Probleme_base &) override
void calculer_champ_fonc_c(const double t, Champ_Don_base &champ_fonc_c, const DoubleTab &val_c) const override
DoubleTab & calculer(DoubleTab &) const override
int nb_dim() const
Definition TRUSTTab.h:199
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
void carre(Mp_vect_options opt=VECT_ALL_ITEMS)
Definition TRUSTVect.h:133
_SIZE_ size() const
Definition TRUSTVect.tpp:45
int line_size() const
Definition TRUSTVect.tpp:67
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
Definition Table.h:29
double val(const double val_param, int ncomp=0) const
Definition Table.cpp:145
const int & isfonction() const
Definition Table.h:74
DoubleTab & valeurs(const DoubleTab &val_param, const DoubleTab &pos, const double tps, DoubleTab &val) const
Definition Table.cpp:292