16#include <Op_Diff_VDF_Elem_base.h>
17#include <Echange_contact_VDF.h>
18#include <Champ_P0_VDF.h>
19#include <Matrix_tools.h>
20#include <Array_tools.h>
21#include <Perf_counters.h>
44 double dt_stab = DMAXFLOAT;
51 if (
equation().diffusion_multi_scalaire())
53 const int nb_comp =
static_cast<int>(std::sqrt(diffu.
line_size()));
54 std::vector<double> diff_vect(nb_comp);
56 for (
int i = 0; i < nb_comp; i++)
57 for (
int j = 0; j < nb_comp; j++)
58 diff_vect[i] += std::abs(diffu(0, nb_comp * i + j));
60 alpha = *std::max_element(diff_vect.begin(), diff_vect.end());
65 alpha = max_array(diffu);
68 double coef = 1 / (domaine_VDF.
h_x() * domaine_VDF.
h_x()) + 1 / (domaine_VDF.
h_y() * domaine_VDF.
h_y());
71 coef += 1 / (domaine_VDF.
h_z() * domaine_VDF.
h_z());
76 dt_stab = 0.5 / (alpha * coef);
81 if (
equation().diffusion_multi_scalaire())
90 const IntTab& f_e = domaine.face_voisins();
95 for (
int i = 0; i < domaine.nb_front_Cl(); i++)
98 if (!la_cl->que_suis_je().debute_par(
"Paroi_Echange_contact"))
continue;
102 std::map<int, std::pair<int, int>> f2e;
105 if ((l = cl.
item(j)) >= 0)
108 int e = f_e(f, 0) == -1 ? f_e(f, 1) : f_e(f, 0);
109 f2e[f] = std::make_pair(e, l);
111 iter_->ajouter_contribution_autre_pb(inco, matrice, la_cl, f2e);
119 const IntTab& f_e = domaine.face_voisins();
120 const Conds_lim& cls = iter_->domaine_Cl().les_conditions_limites();
123 Stencil stencil(0, 2);
125 for (i = 0; i < cls.size(); i++)
134 if ((l = cl.
item(j)) >= 0)
137 int e = f_e(f, 0) == -1 ? f_e(f, 1) : f_e(f, 0);
138 for (n = 0; n < N; n++) stencil.
append_line(N * e + n, N * l + n);
142 tableau_trier_retirer_doublons(stencil);
149 if (semi_impl.count(nom_inco))
return;
152 int n_ext = (int)
op_ext.size();
154 std::vector<Matrice_Morse *> mat(n_ext);
155 std::vector<int> N(n_ext);
156 for (
int i = 0; i < n_ext; i++)
158 N[i] =
op_ext[i]->equation().inconnue().valeurs().line_size();
160 std::string nom_mat = i ? nom_inco +
"/" +
op_ext[i]->equation().probleme().le_nom().getString() : nom_inco;
161 mat[i] = matrices.count(nom_mat) ? matrices.at(nom_mat) :
nullptr;
162 if(!mat[i])
continue;
167 int nl = N[0] * iter_->domaine().nb_elem_tot();
168 int nc = N[i] *
op_ext[i]->equation().domaine_dis().nb_elem_tot();
171 mat[i]->nb_colonnes() ? *mat[i] += mat2 : *mat[i] = mat2;
180 iter_->ajouter_blocs(matrices, secmem, semi_impl);
186 if ((
int)
op_ext.size() > 1) ajouter_blocs_pour_monolithique(matrices, secmem, semi_impl);
189void Op_Diff_VDF_Elem_base::ajouter_blocs_pour_monolithique(matrices_t matrices, DoubleTab& secmem,
const tabs_t& semi_impl)
const
192 int n_ext = (int)
op_ext.size() - 1;
193 std::vector<Matrice_Morse *> mat(n_ext);
194 std::vector<const DoubleTab *> inco(n_ext);
196 for (
int i = 0; i < n_ext; i++)
198 std::string nom_mat = nom_inco +
"/" +
op_ext[i + 1]->equation().probleme().le_nom().getString();
199 mat[i] = matrices.count(nom_mat) ? matrices.at(nom_mat) :
nullptr;
202 inco[i] = semi_impl.count(nom_mat) ? &semi_impl.at(nom_mat) : &
op_ext[i + 1]->equation().inconnue().valeurs();
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Champ_P0_VDF Classe qui represente un champ discret P0 par element associe a un domaine discre...
virtual DoubleTab & valeurs()=0
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Champ_Inc_base & inconnue() const =0
const Nom & le_nom() const override
Renvoie le nom du champ.
int num_face(const int) const
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
const std::string & getString() const
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
class Op_Diff_VDF_Elem_base Cette classe represente l'operateur de diffusion associe a une equation d...
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl) const override
void contribuer_termes_croises(const DoubleTab &inco, const Probleme_base &autre_pb, const DoubleTab &autre_inco, Matrice_Morse &matrice) const override
void dimensionner_termes_croises(Matrice_Morse &, const Probleme_base &autre_pb, int nl, int nc) const override
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl) const override
double calculer_dt_stab() const override
Calcul dt_stab.
class Op_Diff_VDF_base Classe de base des operateurs de diffusion VDF
double calculer_dt_stab_(const Domaine_VDF &zone_VDF) const
void init_op_ext() const override
void ajoute_terme_pour_axi(matrices_t, DoubleTab &, const tabs_t &) const
void dimensionner(const Domaine_VDF &, const Domaine_Cl_VDF &, Matrice_Morse &, const bool) const
std::vector< const Operateur_Diff_base * > op_ext
virtual const Champ_base & diffusivite() const =0
virtual const Champ_base & diffusivite_pour_pas_de_temps() const
Renvoie le champ_don correspondant a la vraie diffusivite du milieu qui sert pour le calcul du pas de...
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
static double mp_min(double)
Classe de base des flux de sortie.
virtual int has_champ_masse_volumique() const
Renvoie 1 si la masse volumique a ete associee, 0 sinon.
_SIZE_ dimension(int d) const