TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Champ_Ostwald_VEF.cpp
1/****************************************************************************
2* Copyright (c) 2024, 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 <Navier_Stokes_std.h>
17#include <Champ_Ostwald_VEF.h>
18#include <Champ_Uniforme.h>
19#include <Fluide_Ostwald.h>
20#include <Domaine_VEF.h>
21
22Implemente_instanciable(Champ_Ostwald_VEF, "Champ_Ostwald_VEF", Champ_Ostwald);
23
24Sortie& Champ_Ostwald_VEF::printOn(Sortie& os) const { return os << valeurs()(0, 0); }
25
26Entree& Champ_Ostwald_VEF::readOn(Entree& is) { return is; }
27
28/*! @brief met le parametre mu a jour
29 *
30 * @param (double)
31 */
38
39/*! @brief Calcul la viscosite mu en fonction de la consistance et de l'indice de structure en utilisant la loi d'Ostwald.
40 *
41 * Pour
42 * des viscsites tres faible et tres fortes on utilise une regression
43 *
44 * @param (DoubleTab&) les viscosite au temps precedent
45 */
46
47void Champ_Ostwald_VEF::calculer_mu(DoubleTab& mu_tab)
48{
49 const double d_n = mon_fluide_->indice_struct().valeurs()(0, 0);
50
51 for (int i = 0; i < nb_valeurs_nodales(); i++)
52 {
53 if (sub_type(Champ_Uniforme, mon_fluide_->consistance()))
54 {
55 const double d_k = mon_fluide_->consistance().valeurs()(0, 0);
56 if (mu_tab[i] < 1.E-4)
57 mu_tab[i] = d_k * pow(0.5 * 1.E-4, (d_n - 1.) / 2.);
58 else if (mu_tab[i] > 1.E16)
59 mu_tab[i] = d_k * pow(0.5 * 1.E16, (d_n - 1.) / 2.);
60 else
61 mu_tab[i] = d_k * pow(0.5 * mu_tab[i], (d_n - 1.) / 2.);
62 }
63 else // K varie en fonction de la temperature
64 {
65 const DoubleTab& K_tab = mon_fluide_->consistance().valeurs();
66 if (mu_tab[i] < 1.E-4)
67 mu_tab[i] = K_tab[i] * pow(0.5 * 1.E-4, (d_n - 1.) / 2.);
68 else if (mu_tab[i] > 1.E16)
69 mu_tab[i] = K_tab[i] * pow(0.5 * 1.E16, (d_n - 1.) / 2.);
70 else
71 mu_tab[i] = K_tab[i] * pow(0.5 * mu_tab[i], (d_n - 1.) / 2.);
72 }
73 }
74}
75
77{
78 eq_hydraulique = ref_cast(Navier_Stokes_std, eq);
79}
80
82{
83 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF,domaine_vf());
84 const Domaine_Cl_VEF& zcl_VEF = ref_cast(Domaine_Cl_VEF, eq_hydraulique->domaine_Cl_dis());
85 const DoubleTab& vit = eq_hydraulique->inconnue().valeurs();
86 int nb_elem = domaine_VEF.nb_elem();
87 int nb_elem_tot = domaine_VEF.nb_elem_tot();
88
89 int elem;
90
91 DoubleTab gradient_elem(nb_elem_tot, dimension, dimension);
92 Champ_P1NC::calcul_gradient(vit, gradient_elem, zcl_VEF);
93
94 if (dimension == 2)
95 for (elem = 0; elem < nb_elem; elem++)
96 {
97 dscald(elem) = 4. * (gradient_elem(elem, 0, 0) * gradient_elem(elem, 0, 0) + gradient_elem(elem, 1, 1) * gradient_elem(elem, 1, 1))
98 + 2. * ((gradient_elem(elem, 0, 1) + gradient_elem(elem, 1, 0)) * (gradient_elem(elem, 0, 1) + gradient_elem(elem, 1, 0)));
99 }
100 else if (dimension == 3)
101 for (elem = 0; elem < nb_elem; elem++)
102 {
103 dscald(elem) = 4. * (gradient_elem(elem, 0, 0) * gradient_elem(elem, 0, 0) + gradient_elem(elem, 1, 1) * gradient_elem(elem, 1, 1) + gradient_elem(elem, 2, 2) * gradient_elem(elem, 2, 2))
104 + 2.
105 * (((gradient_elem(elem, 0, 1) + gradient_elem(elem, 1, 0)) * (gradient_elem(elem, 0, 1) + gradient_elem(elem, 1, 0)))
106 + ((gradient_elem(elem, 2, 0) + gradient_elem(elem, 0, 2)) * (gradient_elem(elem, 2, 0) + gradient_elem(elem, 0, 2)))
107 + ((gradient_elem(elem, 2, 1) + gradient_elem(elem, 1, 2)) * (gradient_elem(elem, 2, 1) + gradient_elem(elem, 1, 2))));
108 }
109}
110
111/*! @brief Calcul le champ Ostwald : calcul de D::D
112 *
113 * puis calcul de mu
114 *
115 * @param (double) temps ou le calcul est effectue
116 */
117
119{
120 if (temps_ != tps)
121 {
124 }
125}
126
127/*! @brief Initialise le champs
128 *
129 */
130void Champ_Ostwald_VEF::init_mu(DoubleTab& mu_tab)
131{
132 const DoubleTab& K_tab = mon_fluide_->consistance().valeurs();
133 for (int i = 0; i < nb_valeurs_nodales(); i++) mu_tab[i] = K_tab[i];
134}
135
136int Champ_Ostwald_VEF::initialiser(const double un_temps)
137{
138 mettre_a_jour(un_temps);
139 return 1;
140}
void mettre_a_jour(double temps) override
Mise a jour en temps.
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
int nb_valeurs_nodales() const override
Renvoie le nombre de degre de liberte par composante: le nombre de noeuds.
virtual const Domaine_VF & domaine_vf() const
classe Champ_Ostwald_VEF Represente un champ en discretisation VEF qui varie en fonction
void calculer_mu(DoubleTab &)
Calcul la viscosite mu en fonction de la consistance et de l'indice de structure en utilisant la loi ...
void init_mu(DoubleTab &)
Initialise le champs.
int initialiser(const double temps) override
NE FAIT RIEN.
void associer_eqn(const Navier_Stokes_std &)
void me_calculer(double tps) override
Calcul le champ Ostwald : calcul de D::D.
void calculer_dscald(DoubleTab &)
void mettre_a_jour(double temps) override
met le parametre mu a jour
classe Champ_Ostwald Represente un champ qui varie en fonction de la consistance et
static DoubleTab & calcul_gradient(const DoubleTab &, DoubleTab &, const Domaine_Cl_VEF &)
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
double temps_
Definition Champ_base.h:123
virtual double changer_temps(const double t)
Fixe le temps auquel se situe le champ.
class Domaine_VEF
Definition Domaine_VEF.h:54
int nb_elem_tot() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
static int dimension
Definition Objet_U.h:99
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 de base des flux de sortie.
Definition Sortie.h:52