16#include <Masse_DG_base.h>
17#include <Domaine_Cl_DG.h>
18#include <Domaine_DG.h>
19#include <Equation_base.h>
20#include <Milieu_base.h>
21#include <BasisFunction.h>
29 le_dom_dg_ = ref_cast(
Domaine_DG, le_dom_dis_base);
61 ConstDoubleTab_parts val_parts(coeff.valeurs());
62 values.
ref(val_parts[0]);
68 values.
ref(coeff.valeurs());
75 ref_coeff->valeur_aux(nodes,values);
77 tab_multiply_any_shape(coef, values, VECT_REAL_ITEMS);
99 if (!matrices.count(nom_inco.
getString()))
return;
104 const BasisFunction& bfunc = le_dom_dg_->get_basisFunction(order);
105 const int nb_bfunc = bfunc.
nb_bfunc();
108 const int nb_elem_tot = le_dom_dg_->nb_elem_tot();
110 int size_indices = le_dom_dg_->gram_schmidt() ? nb_elem_tot*dim*nb_bfunc : nb_elem_tot*dim*nb_bfunc*nb_bfunc;
112 IntTab indice(size_indices, 2);
113 int current_indice = 0;
114 if (le_dom_dg_->gram_schmidt())
116 for (
int e = 0; e < nb_elem_tot; e++)
118 for (
int d = 0; d<dim; d++)
120 for (
int i = 0; i < nb_bfunc; i++ )
122 indice(current_indice+i, 0) = current_indice+i;
123 indice(current_indice+i, 1) = current_indice+i;
125 current_indice+=nb_bfunc;
132 for (
int e = 0; e < nb_elem_tot; e++)
134 for (
int d = 0; d<dim; d++)
136 for (
int i = 0; i < nb_bfunc; i++ )
137 for (
int j = 0; j < nb_bfunc; j++ )
139 indice(index, 0) = current_indice+i;
140 indice(index, 1) = current_indice+j;
143 current_indice+=nb_bfunc;
186 const DoubleTab& passe = semi_impl.count(nom_inco_str) ? semi_impl.at(nom_inco_str) :
equation().
inconnue().
passe();
188 Matrice_Morse *mat = matrices.count(nom_inco_str) ? matrices.at(nom_inco_str) :
nullptr;
193 const BasisFunction& bfunc = le_dom_dg_->get_basisFunction(order);
194 const int nb_bfunc = bfunc.
nb_bfunc();
196 assert(nb_bfunc*dim == inco.
line_size());
201 const DoubleVect& volume = le_dom_dg_->volumes();
207 DoubleTab fbase(nb_bfunc, nb_pts_integ_max);
208 DoubleTab product(nb_pts_integ_max);
210 DoubleTrav coef(
equation().milieu().porosite_elem());
214 int current_indice = 0;
215 if (le_dom_dg_->gram_schmidt())
217 for (
int e = 0; e < nb_elem_tot; e++)
219 for (
int i=0; i<nb_bfunc; i++)
221 for (
int d = 0; d<dim; d++)
224 (*mat)(current_indice+i+d*nb_bfunc, current_indice+i+d*nb_bfunc) += coef[e]*volume[e] / dt;
225 secmem(e,i+d*nb_bfunc) += coef[e]*volume[e]*(passe(e,i+d*nb_bfunc) - resoudre_en_increments*inco(e,i+d*nb_bfunc))/ dt;
228 current_indice+=nb_bfunc*dim;
233 for (
int e = 0; e < nb_elem_tot; e++)
236 for (
int d = 0; d<dim; d++)
239 (*mat)(current_indice+d, current_indice+d) += coef[e]*volume[e] / dt;
240 secmem(e,d) += coef[e]*volume[e]*(passe(e,d)-resoudre_en_increments*inco(e,d)) / dt;
241 current_indice+=nb_bfunc;
249 for (
int i=0; i<nb_bfunc; i++)
251 for (
int j=0; j<nb_bfunc; j++)
254 for (
int k = 0; k < tab_pts_integ(e) ; k++)
255 product(k) = fbase(i, k) * fbase(j, k);
259 for (
int d = 0; d<dim; d++)
262 (*mat)(current_indice+i+d*nb_bfunc, current_indice+j+d*nb_bfunc) += coef[e]*integral / dt;
263 secmem(e,i+d*nb_bfunc) += coef[e]*integral*(passe(e,j+d*nb_bfunc) - resoudre_en_increments*inco(e,j+d*nb_bfunc)) / dt;
267 current_indice+=nb_bfunc*dim;
Manages the local polynomial basis functions for Discontinuous Galerkin elements.
void eval_bfunc(const Quadrature_base &quad, const int &nelem, DoubleTab &fbasis) const
Evaluates all basis functions at the element quadrature points.
const int & nb_bfunc() const
const int & get_default_quadrature_order() const
classe Champ_Don_base classe de base des Champs donnes (non calcules)
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
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.
virtual DoubleTab & remplir_coord_noeuds(DoubleTab &) const =0
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Champ_Inc_base & inconnue() const =0
const Champ_base & get_champ(const Motcle &nom) const override
const Nom & le_nom() const override
Renvoie le nom du champ.
Abstract base class for the DG mass matrix operator.
void associer_domaine_cl_dis_base(const Domaine_Cl_dis_base &) override
OBS_PTR(Domaine_DG) le_dom_dg_
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl) const override
Builds the sparsity pattern of the mass matrix block.
void associer_domaine_dis_base(const Domaine_dis_base &) override
void appliquer_coef(DoubleVect &coef) const
Multiplies the mass coefficient vector element-wise by an optional temporal field.
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, double dt, const tabs_t &semi_impl, int resoudre_en_increments) const override
Assembles the mass matrix contribution (M/dt) into the matrix and right-hand side.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
class Nom Une chaine de caractere pour nommer les objets de TRUST
virtual int debute_par(const char *const n) const
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 const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static int Get_order_for(const Nom &n)
int nb_pts_integ_max() const
const IntTab & get_tab_nb_pts_integ() const
double compute_integral_on_elem(int num_elem, Parser_U &parser) const
classe Solveur_Masse_base Represente la matrice de masse d'une equation.
int has_coefficient_temporel_
Nom name_of_coefficient_temporel_
Classe de base des flux de sortie.
virtual void ref(const TRUSTTab &)
_SIZE_ dimension_tot(int) const override