17#ifndef Op_Diff_EF_included
18#define Op_Diff_EF_included
20#include <Op_Diff_EF_base.h>
21#include <Op_EF_base.h>
46 DoubleTab&
ajouter(
const DoubleTab& , DoubleTab& )
const override;
47 DoubleTab&
ajouter_new(
const DoubleTab& , DoubleTab& )
const;
48 DoubleTab&
calculer(
const DoubleTab& , DoubleTab& )
const override;
52 void calculer_von_mises(
const DoubleTab& deplacement, DoubleTab& deformation, DoubleTab& contraintes, DoubleTab& von_mises)
const override;
60 void ajouter_bords(
const DoubleTab&, DoubleTab& ,
int contrib_interne=1)
const;
78 template<AJOUTE_SCAL _T_>
85 template<AJOUTE_VECT _T_>
91 void ajouter_contribution_diffusivite_volumique(
int N,
Matrice_Morse& matrice)
const;
92 void ajouter_contribution_axisymetrique(
int N,
Matrice_Morse& matrice)
const;
100template<AJOUTE_SCAL _T_>
103 static constexpr bool IS_GEN = (_T_ == AJOUTE_SCAL::GEN), IS_D3_8 = (_T_ == AJOUTE_SCAL::D3_8), IS_D2_4 = (_T_ == AJOUTE_SCAL::D2_4);
107 const int N = IS_GEN ? resu.
line_size() : 1;
108 const int nb_som_elem = IS_D3_8 ? 8 : ( IS_D2_4 ? 4 : domaine_ef.
domaine().nb_som_elem() );
110 const int dim_fois_nbn = nb_som_elem * const_dimension;
114 const DoubleTab& bij = domaine_ef.
Bij();
118 const double *bij_ptr = bij.
addr();
119 const double *inco_ptr = tab_inconnue.
addr();
121#define bij_(elem,i,j) bij_ptr[elem*dim_fois_nbn+i*const_dimension+j]
122#define inconnue_(som,a) inco_ptr[som * N + a]
123#define resu_(som,a) resu_ptr[som * N + a]
126 for (
int elem = 0; elem < nb_elem_tot; elem++)
129 double pond = volumes_thilde(elem) / volumes(elem) / volumes(elem) *
nu_(elem);
131 for (
int i1 = 0; i1 < nb_som_elem; i1++)
133 int glob = elems(elem, i1);
134 for (
int yy = 0; yy < N; yy++)
136 for (
int i2 = 0; i2 < nb_som_elem; i2++)
138 int glob2 = elems(elem, i2);
142 for (
int b = 0; b < const_dimension; b++)
144 prod += bij_(elem,i1,b)*bij_(elem,i2,b);
146 for (
int n = 0; n < N; n++) pr[n] += prod * inconnue_(glob2, n);
149 resu(glob) -= pr[0] * pond;
162template<AJOUTE_VECT _T_>
165 static constexpr bool IS_GEN = (_T_ == AJOUTE_VECT::GEN), IS_D3_8 = (_T_ == AJOUTE_VECT::D3_8), IS_D2_4 = (_T_ == AJOUTE_VECT::D2_4);
169 const int N = IS_D3_8 ? 3 : (IS_D2_4 ? 2 : resu.
line_size() );
171 const int nb_som_elem = IS_D3_8 ? 8 : (IS_D2_4 ? 4 : domaine_ef.
domaine().nb_som_elem() );
172 const int dim_fois_nbn = nb_som_elem * const_dimension;
174 ArrOfInt marqueur_neuman;
175 remplir_marqueur_sommet_neumann(marqueur_neuman, domaine_ef, la_zcl_EF.valeur(),
transpose_partout_);
179 const DoubleTab& bij = domaine_ef.
Bij();
183 const double *bij_ptr = bij.
addr();
184 const double *inco_ptr = tab_inconnue.
addr();
185 double *resu_ptr = resu.
addr();
187#define bij_(elem,i,j) bij_ptr[elem*dim_fois_nbn+i*const_dimension+j]
188#define inconnue_(som,a) inco_ptr[som * N + a]
189#define resu_(som,a) resu_ptr[som * N + a]
193 for (
int elem = 0; elem < nb_elem_tot; elem++)
196 double pond = volumes_thilde(elem) / volumes(elem) / volumes(elem) *
nu_(elem);
198 for (
int i1 = 0; i1 < nb_som_elem; i1++)
200 int glob = elems(elem, i1);
201 for (
int yy = 0; yy < N; yy++)
203 int transpose = (marqueur_neuman[glob] == 1 || N == 1) ? 0 :
transpose_;
204 for (
int i2 = 0; i2 < nb_som_elem; i2++)
206 int glob2 = elems(elem, i2);
211 for (
int b = 0; b < const_dimension; b++)
213 prod += bij_(elem,i1,b)*bij_(elem,i2,b);
215 prod2+=bij_(elem,i1,b)*inconnue_(glob2,b);
217 for (
int n = 0; n < N; n++) pr[n] += prod * inconnue_(glob2, n) + prod2 * bij_(elem, i2, n);
220 for (
int n = 0; n < N; n++) resu_(glob, n)-= pr[n] * pond;
classe Champ_base Cette classe est la base de la hierarchie des champs.
int_t nb_elem_tot() const
const DoubleTab & Bij() const
const DoubleVect & volumes_thilde() const
double volumes(int i) const
const Domaine & domaine() 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.
class Op_Diff_EF_base Classe de base des operateurs de diffusion EF
class Op_Diff_EF Cette classe represente l'operateur de diffusion
void ajouter_contribution_new(const DoubleTab &, Matrice_Morse &) const
void contribuer_a_avec(const DoubleTab &inco, Matrice_Morse &matrice) const override
DOES NOTHING - to override in derived classes.
void modifier_pour_Cl(Matrice_Morse &matrice, DoubleTab &secmem) const override
DOES NOTHING - to override in derived classes.
OBS_PTR(Champ_base) diffusivite_volumique_
DoubleTab & ajouter_vectoriel_dim3_nbn_8(const DoubleTab &, DoubleTab &) const
OBS_PTR(Champ_base) diffusivite_
DoubleTab & ajouter_scalaire_template(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_vectoriel_gen(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_vectoriel_dim2_nbn_4(const DoubleTab &, DoubleTab &) const
const Champ_base & diffusivite() const override
void remplir_lambda(DoubleTab &) const
DoubleTab & ajouter_new(const DoubleTab &, DoubleTab &) const
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
void contribuer_au_second_membre(DoubleTab &) const override
DOES NOTHING - to override in derived classes.
DoubleTab & ajouter_scalaire_gen(const DoubleTab &, DoubleTab &) const
void remplir_nu(DoubleTab &) const override
void ajouter_cas_vectoriel(const DoubleTab &inconnue, DoubleTab &resu, DoubleTab &flux_bords, DoubleTab &nu, const Domaine_Cl_EF &domaine_Cl_EF, const Domaine_EF &domaine_EF, int nb_comp) const
void dimensionner(Matrice_Morse &matrice) const override
DOES NOTHING - to override in derived classes.
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
void ajouter_contribution(const DoubleTab &, Matrice_Morse &) const
void ajouter_cas_scalaire(const DoubleTab &inconnue, DoubleTab &resu, DoubleTab &flux_bords, DoubleTab &nu, const Domaine_Cl_EF &domaine_Cl_EF, const Domaine_EF &domaine_EF) const
void ajouter_bords(const DoubleTab &, DoubleTab &, int contrib_interne=1) const
DoubleTab & ajouter_scalaire_dim3_nbn_8(const DoubleTab &, DoubleTab &) const
void associer_diffusivite_volumique(const Champ_base &) override
void associer_diffusivite(const Champ_base &) override
associe le champ de diffusivite
const Champ_base & diffusivite_volumique() const
DoubleTab & ajouter_vectoriel_template(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_scalaire_dim2_nbn_4(const DoubleTab &, DoubleTab &) const
void calculer_von_mises(const DoubleTab &deplacement, DoubleTab &deformation, DoubleTab &contraintes, DoubleTab &von_mises) const override
void ajouter_contributions_bords(Matrice_Morse &matrice) const
void dimensionner(const Domaine_EF &, const Domaine_Cl_EF &, Matrice_Morse &) const
Dimensionnement de la matrice qui devra recevoir les coefficients provenant de la convection,...
int elem_contribue(const int elem) const
void modifier_pour_Cl(const Domaine_EF &, const Domaine_Cl_EF &, Matrice_Morse &, DoubleTab &) const
Modification des coef de la matrice et du second membre pour les conditions de Dirichlet.