16#include <Solveur_Masse_Elem_proto.h>
17#include <Op_Diff_negligeable.h>
18#include <Domaine_Cl_dis_base.h>
19#include <Champ_Inc_P0_base.h>
20#include <Equation_base.h>
21#include <Probleme_base.h>
22#include <Neumann_paroi.h>
23#include <Matrix_tools.h>
24#include <Milieu_base.h>
26#include <Domaine_VF.h>
36 solv_mass_->equation().init_champ_conserve();
42 const DoubleVect& ve = domaine.
volumes(), &pe = solv_mass_->equation().milieu().porosite_elem();
43 const DoubleTab& der = solv_mass_->equation().champ_conserve().derivees().at(solv_mass_->equation().inconnue().le_nom().getString());
45 int e, ne_tot = domaine.nb_elem_tot(), n, N = sm.
line_size();
49 for (e = 0; e < ne_tot; e++)
50 for (n = 0; n < N; n++)
51 if (std::abs(der(e, n)) > 1e-10)
52 sm(e, n) /= pe(e) * ve(e) * der(e, n);
61 solv_mass_->equation().init_champ_conserve();
67 for (
auto &&i_m : matrices)
71 const DoubleTab& col = solv_mass_->equation().probleme().get_champ(i_m.first.c_str()).valeurs();
74 Stencil stencil(0, 2);
77 for (e = 0; e < ne; e++)
78 for (n = 0, m = 0; n < N; n++, m += (M > 1)) stencil.
append_line(N * e + n, M * e + m);
81 i_m.second->nb_colonnes() ? *i_m.second += mat : *i_m.second = mat;
89 const Conds_lim& cls = solv_mass_->equation().domaine_Cl_dis().les_conditions_limites();
91 const DoubleTab& present = cc.
valeurs(), &passe = cc.
passe();
92 const DoubleVect& ve = domaine.volumes(), &pe = solv_mass_->equation().milieu().porosite_elem(), &fs = domaine.face_surfaces();
96 for (e = 0; e < ne; e++)
98 const double fac_ale = domaine.domaine().deformable() ? domaine.domaine().old_volumes()(e) / ve(e) : 1.0;
99 for (n = 0; n < N; n++)
100 secmem(e, n) += pe(e) * ve(e) * (passe(e, n) * fac_ale - resoudre_en_increments * present(e, n)) / dt;
105 for (f = 0; f < domaine.premiere_face_int(); f++)
107 for (e = f_e(f, f_e(f, 0) == -1), n = 0; n < N; n++)
108 secmem(e, n) += fs(f) * ref_cast(
Neumann_paroi, cls[fcl(f, 1)].valeur()).flux_impose(fcl(f, 2), n);
111 for (
auto &&i_m : matrices)
114 int m, M = solv_mass_->equation().probleme().get_champ(i_m.first.c_str()).valeurs().line_size();
115 const DoubleTab& der = cc.
derivees().at(i_m.first);
116 for (e = 0; e < ne; e++)
117 for (n = 0, m = 0; n < N; n++, m += (M > 1))
118 (*i_m.second)(N * e + n, M * e + m) += pe(e) * ve(e) * der(e, n) / dt;
: class Champ_Inc_P0_base
DoubleTab & passe(int i=1) override
Renvoie les valeurs du champs a l'instant t-i.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
const tabs_t & derivees() const
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
double volumes(int i) const
Champ_Inc_base & champ_conserve() const
virtual const Champ_Inc_base & inconnue() const =0
virtual const Operateur & operateur(int) const =0
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.
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
Classe Op_Diff_negligeable Cette classe represente un operateur de diffusion negligeable.
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
virtual Operateur_base & l_op_base()=0
void preparer_calcul_proto()
void associer_masse_proto(const Solveur_Masse_base &, const Domaine_VF &)
void dimensionner_blocs_proto(matrices_t, const tabs_t &semi_impl={}) const
void ajouter_blocs_proto(matrices_t, DoubleTab &, double, const tabs_t &, int) const
DoubleTab & appliquer_impl_proto(DoubleTab &) const
classe Solveur_Masse_base Represente la matrice de masse d'une equation.
_SIZE_ dimension_tot(int) const override