16#ifndef Op_Dift_EF_Q1_included
17#define Op_Dift_EF_Q1_included
19#include <Op_Dift_EF_base.h>
20#include <Op_EF_base.h>
48 DoubleTab&
ajouter(
const DoubleTab& , DoubleTab& )
const override;
49 DoubleTab&
ajouter_new(
const DoubleTab& , DoubleTab& )
const;
50 DoubleTab&
calculer(
const DoubleTab& , DoubleTab& )
const override;
62 void ajouter_bords(
const DoubleTab&, DoubleTab& ,
int contrib_interne=1)
const;
80 template<AJOUTE_SCAL _T_>
87 template<AJOUTE_VECT _T_>
96template<AJOUTE_SCAL _T_>
99 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);
103 const int N = IS_GEN ? resu.
line_size() : 1;
104 const int nb_som_elem = IS_D3_8 ? 8 : ( IS_D2_4 ? 4 : domaine_ef.
domaine().nb_som_elem() );
106 const int dim_fois_nbn = nb_som_elem * const_dimension;
110 const DoubleTab& bij = domaine_ef.
Bij();
116 DoubleTab diffu(
nu_);
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) * (diffu[elem] + diffu_turb[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++) pr[yy] = 0;
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_);
176 ArrOfInt marqueur_paroi;
181 const DoubleTab& bij = domaine_ef.
Bij();
187 DoubleTab diffu(
nu_);
189 const double *bij_ptr = bij.
addr();
190 const double *inco_ptr = tab_inconnue.
addr();
191 double *resu_ptr = resu.
addr();
193#define bij_(elem,i,j) bij_ptr[elem*dim_fois_nbn+i*const_dimension+j]
194#define inconnue_(som,a) inco_ptr[som * N + a]
195#define resu_(som,a) resu_ptr[som * N + a]
199 for (
int elem = 0; elem < nb_elem_tot; elem++)
202 double pond = volumes_thilde(elem) / volumes(elem) / volumes(elem) * (diffu[elem] + diffu_turb[elem]);
204 for (
int i1 = 0; i1 < nb_som_elem; i1++)
206 int glob = elems(elem, i1);
207 for (
int yy = 0; yy < N; yy++)
209 int transpose = (marqueur_neuman[glob] == 1 || N == 1) ? 0 :
transpose_;
210 for (
int i2 = 0; i2 < nb_som_elem; i2++)
212 int glob2 = elems(elem, i2);
217 for (
int b = 0; b < const_dimension; b++)
219 prod += bij_(elem,i1,b)*bij_(elem,i2,b);
221 prod2+=bij_(elem,i1,b)*inconnue_(glob2,b);
223 for (
int n = 0; n < N; n++) pr[n] += prod * inconnue_(glob2, n) + prod2 * bij_(elem, i2, n);
226 for (
int n = 0; n < N; n++) resu_(glob, n)-= pr[n] * pond;
virtual DoubleTab & valeurs()=0
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 Nom Une chaine de caractere pour nommer les objets de TRUST
const Champ_Fonc_base & diffusivite_turbulente() const
class Op_Dift_EF_Q1 Cette classe represente l'operateur de diffusion
void calculer_pour_post(Champ_base &espace_stockage, const Nom &option, int comp) const override
const Champ_base & diffusivite() const override
DoubleTab & ajouter_vectoriel_template(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
DoubleTab & ajouter_scalaire_dim2_nbn_4(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_scalaire_template(const DoubleTab &, DoubleTab &) 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
void ajouter_contribution_new(const DoubleTab &, Matrice_Morse &) const
void ajouter_contribution(const DoubleTab &, Matrice_Morse &) const
OBS_PTR(Champ_base) diffusivite_
double calculer_dt_stab() const override
Calcul dt_stab.
void ajouter_contributions_bords(Matrice_Morse &matrice) const
void associer_diffusivite(const Champ_base &) override
associe le champ de diffusivite
void contribuer_au_second_membre(DoubleTab &) const override
DOES NOTHING - to override in derived classes.
DoubleTab & ajouter_vectoriel_dim2_nbn_4(const DoubleTab &, DoubleTab &) const
void remplir_nu(DoubleTab &) const override
DoubleTab & ajouter_vectoriel_gen(const DoubleTab &, DoubleTab &) const
double diffusivite(int) const
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
DoubleTab & ajouter_scalaire_gen(const DoubleTab &, DoubleTab &) const
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
void dimensionner(Matrice_Morse &matrice) const override
DOES NOTHING - to override in derived classes.
DoubleTab & ajouter_new(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_scalaire_dim3_nbn_8(const DoubleTab &, DoubleTab &) const
void remplir_marqueur_elem_CL_paroi(ArrOfInt &, const Domaine_EF &, const Domaine_Cl_EF &) const
DoubleTab & ajouter_vectoriel_dim3_nbn_8(const DoubleTab &, DoubleTab &) const
void modifier_pour_Cl(Matrice_Morse &matrice, DoubleTab &secmem) const override
DOES NOTHING - to override in derived classes.
void contribuer_a_avec(const DoubleTab &inco, Matrice_Morse &matrice) const override
DOES NOTHING - to override in derived classes.
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.