16#include <Assembleur_P_EF.h>
17#include <Domaine_Cl_EF.h>
18#include <Domaine_EF.h>
19#include <Neumann_sortie_libre.h>
21#include <Matrice_Bloc.h>
23#include <Array_tools.h>
25#include <Connectivite_som_elem.h>
26#include <Static_Int_Lists.h>
27#include <Champ_Fonc_Q1_EF.h>
42void calculer_inv_volume_special(DoubleTab& inv_volumes_som,
const Domaine_Cl_EF& domaine_Cl_EF,
const DoubleTab& volumes_som,
const DoubleTab& marqueur)
44 inv_volumes_som=volumes_som;
48 for (
int i=0; i<taille; i++)
52 double marq_norm2 = 0.;
53 for (
int comp=0; comp<
Objet_U::dimension; comp++) marq_norm2 += marqueur(i,comp)*marqueur(i,comp);
56 inv_volumes_som(i,comp)=1./volumes_som(i,comp);
60void calculer_inv_volume(DoubleTab& inv_volumes_som,
const Domaine_Cl_EF& domaine_Cl_EF,
const DoubleVect& volumes_som)
65 const DoubleTab* doubleT =
dynamic_cast<const DoubleTab*
>(&volumes_som);
68 DoubleTab marqueur(*doubleT);
71 calculer_inv_volume_special(inv_volumes_som, domaine_Cl_EF,*doubleT,marqueur);
76 marqueur=(volumes_som);
83 for (
int i=0; i<taille; i++)
86 inv_volumes_som(i,comp)=1./volumes_som(i);
113 Cerr <<
"La masse volumique n'est pas aux sommets dans Assembleur_P_EF::assembler_rho_variable." << finl;
116 const DoubleVect& volumes_som=ref_cast(
Domaine_EF, le_dom_EF.valeur()).volumes_sommets_thilde();
117 const DoubleVect& masse_volumique=rho.
valeurs();
118 DoubleVect quantitee_som(volumes_som);
120 for (
int i=0; i<size; i++)
121 quantitee_som(i)=(volumes_som(i)*masse_volumique(i));
131 DoubleTab inv_volumes_som;
132 calculer_inv_volume(inv_volumes_som, le_dom_Cl_EF.valeur(), volumes_som);
135 Cerr <<
"Assemblage de la matrice de pression en cours..." << finl;
151 const Domaine_EF& le_dom = le_dom_EF.valeur();
164 Static_Int_Lists som_elem;
165 construire_connectivite_som_elem(nb_sommets_tot,le_dom.
domaine().
les_elems(),som_elem,1);
174 la_matrice.typer(
"Matrice_Bloc");
177 matrice.
get_bloc(0,0).typer(
"Matrice_Morse_Sym");
178 matrice.
get_bloc(0,1).typer(
"Matrice_Morse");
191 int nb_som_elem=sommets_elem.
dimension(1);
192 for (
int elem1=0; elem1<n1; elem1++)
193 for (
int s=0; s<nb_som_elem; s++)
195 int num_som=sommets_elem(elem1,s);
197 for (
int i2=0; i2<nb_voisin; i2++)
199 elem2 = som_elem(num_som,i2);
219 IntTab indice_rr(nb_coeff_rr,2);
220 IntTab indice_rv(nb_coeff_rv,2);
223 for (
int elem1=0; elem1<n1; elem1++)
224 for (
int s=0; s<nb_som_elem; s++)
226 int num_som=sommets_elem(elem1,s);
228 for (
int i2=0; i2<nb_voisin; i2++)
230 elem2 = som_elem(num_som,i2);
235 indice_rr(nb_coeff_rr,0)=elem2;
236 indice_rr(nb_coeff_rr,1)=elem1;
241 indice_rv(nb_coeff_rv,0)=elem2;
242 indice_rv(nb_coeff_rv,1)=elem1;
250 indice_rr(nb_coeff_rr,0)=elem1;
251 indice_rr(nb_coeff_rr,1)=elem2;
258 indice_rv(nb_coeff_rv,0)=elem1;
259 indice_rv(nb_coeff_rv,1)=elem2;
265 tableau_trier_retirer_doublons(indice_rr);
267 tableau_trier_retirer_doublons(indice_rv);
268 for (
int ii=0; ii<indice_rv.
dimension(0); ii++) indice_rv(ii,1)-=n2;
270 if (indice_rv.
size()>0)
276 for (
int elem1=0; elem1<n1; elem1++)
277 for (
int s=0; s<nb_som_elem; s++)
279 int num_som=sommets_elem(elem1,s);
281 for (
int i2=0; i2<nb_voisin; i2++)
283 elem2 = som_elem(num_som,i2);
285 while ((s2<nb_som_elem)&&(num_som!=sommets_elem(elem2,s2))) s2++;
286 assert(num_som==sommets_elem(elem2,s2));
289 val+=Bthilde(elem1,s,dir)*Bthilde(elem2,s2,dir)*inv_volumes_som(num_som,dir);
293 const double r_s = xs(num_som, 0);
294 const double r_e1 = le_dom.
xp(elem1, 0);
295 const double r_e2 = le_dom.
xp(elem2, 0);
296 const double w = r_s / (r_e1 * r_e2);
304 MBrr(elem1,elem2)+=val;
309 MBrv.
coef(elem1,elem2-n2)+=val;
315 DoubleTab test(n1),res(n2);
319 Cerr<<
" laplacien 1 "<<mp_max_abs_vect(res)<<finl;
335 for (
int n_bord=0; n_bord<le_dom.
nb_front_Cl(); n_bord++)
371 for (
int num_som=0; num_som<nb_som; num_som++)
376 if (type_sommet[num_som]==1)
377 for (
int i2=0; i2<nb_voisin; i2++)
379 elem2 = som_elem(num_som,i2);
382 for (
int i1=0; i1<nb_voisin; i1++)
384 int elem1 = som_elem(num_som,i1);
386 while ((s1<nb_som_elem)&&(num_som!=sommets_elem(elem1,s1))) s1++;
388 while ((s2<nb_som_elem)&&(num_som!=sommets_elem(elem2,s2))) s2++;
389 assert(num_som==sommets_elem(elem2,s2));
390 assert(num_som==sommets_elem(elem1,s1));
397 grad[comp]=Bthilde(elem2,s2,comp);
402 val-=Bthilde(elem1,s1,dir)*grad_mod[dir]*inv_volumes_som(num_som,dir);
410 const double r_s = xs(num_som, 0);
411 const double r_e1 = le_dom.
xp(elem1, 0);
412 const double r_e2 = le_dom.
xp(elem2, 0);
413 const double w = r_s / (r_e1 * r_e2);
421 MBrr(elem1,elem2)+=val;
426 MBrv.
coef(elem1,elem2-n2)+=val;
441 Cerr<<
"Pas de pression imposee --> P(0)=0"<<finl;
450 DoubleTab test(n1),res(n2);
454 Cerr<<
" laplacien 1 "<<mp_max_abs_vect(res)<<finl;
463 Cerr <<
"Fin de l'assemblage de la matrice de pression" << finl;
475 Cerr <<
"Assemblage de la matrice de pression pour Quasi Compressible en cours..." << finl;
483 Cerr<<
"Pas de pression imposee --> P(0)=0"<<finl;
485 la_matrice(0,0) *= 2;
489 Cerr <<
"Fin de l'assemblage de la matrice de pression" << finl;
497 const Domaine_EF& le_dom = le_dom_EF.valeur();
504 for (i=0; i<nb_cond_lim; i++)
510 int nfin = ndeb + la_front_dis.
nb_faces();
520 for (
int num_face=ndeb; num_face<nfin; num_face++)
524 secmem[face_voisins(num_face,0)] += coef;
530 bool ch_unif = (Gpt.
nb_dim()==1);
531 for (
int num_face=ndeb; num_face<nfin; num_face++)
536 double Gpoint = ch_unif ? Gpt(k) : Gpt(num_face - ndeb, k);
539 secmem(face_voisins(num_face,0)) += Stt;
559 int n,nb_elem=le_dom_EF->domaine().nb_elem();
560 for(n=0; n<nb_elem; n++)
561 if (pression[n] < press_0)
562 press_0 = pression[n];
565 for(n=0; n<nb_elem; n++)
566 pression[n] -=press_0;
568 pression.echange_espace_virtuel();
575 return le_dom_EF.valeur();
580 return le_dom_Cl_EF.valeur();
const Domaine_dis_base & domaine_dis_base() const override
void associer_domaine_cl_dis_base(const Domaine_Cl_dis_base &) override
void associer_domaine_dis_base(const Domaine_dis_base &) override
const Domaine_Cl_dis_base & domaine_Cl_dis_base() const override
void completer(const Equation_base &) override
int modifier_solution(DoubleTab &) override
DoubleTab les_coeff_pression
int assembler(Matrice &) override
int assembler_QC(const DoubleTab &, Matrice &) override
Assemble la matrice de pression pour un fluide quasi compressible laplacein(P) est remplace par div(g...
int assembler_mat(Matrice &, const DoubleVect &, int incr_pression, int resoudre_en_u) override
int modifier_secmem(DoubleTab &) override
int assembler_rho_variable(Matrice &, const Champ_Don_base &rho) override
Assemblage de la matrice div( porosite/rho * grad P ) Le type du champ "rho" a fournir depend de la d...
int get_resoudre_en_u() const
Renvoie la valeur du drapeau resoudre_en_u_ (0 ou 1) Renvoie -1 si le drapeau n'a pas ete initialise.
int set_resoudre_en_u(int flag)
Definit la valeur du drapeau resoudre_en_u__.
int get_resoudre_increment_pression() const
Renvoie la valeur du drapeau resoudre_increment_pression_ (0 ou 1) Renvoie -1 si le drapeau n'a pas e...
int set_resoudre_increment_pression(int flag)
Definit la valeur du drapeau resoudre_increment_pression_.
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_front_base Classe de base pour la hierarchie des champs aux frontieres.
virtual const DoubleTab & derivee_en_temps() const
virtual bool instationnaire() const
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
Champ_front_base & champ_front()
classe Cond_lim Classe generique servant a representer n'importe quelle classe
static void verifier(const char *const msg, double)
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
int_t nb_elem_tot() const
DoubleTab_t & les_sommets()
int_t nb_som_tot() const
Renvoie le nombre total de sommets du domaine i.e. le nombre de sommets reels et virtuels sur le proc...
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
const ArrOfInt & get_type_sommet() const
void modifie_gradient(ArrOfDouble &grad_mod, const ArrOfDouble &grad, int num_som) const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
const DoubleTab & Bij_thilde() const
const DoubleVect & volumes_sommets_thilde() const
virtual double face_normales(int face, int comp) const
double xp(int num_elem, int k) const
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
int num_premiere_face() const
virtual DoubleVect & multvect(const DoubleVect &, DoubleVect &) const
Multiplication d'un vecteur par la matrice.
virtual void dimensionner(int N, int M)
virtual const Matrice & get_bloc(int i, int j) const
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
Sortie & imprimer_formatte(Sortie &s) const override
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.
double coef(int i, int j) const
void set_est_definie(int)
int get_est_definie() const
Classe Matrice Classe generique de la hierarchie des matrices.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
virtual double flux_impose(int i) const
Renvoie la valeur du flux impose sur la i-eme composante du champ representant le flux a la frontiere...
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 double mp_min(double)
static double mp_max(double)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
virtual DoubleTab & appliquer_impl(DoubleTab &x) const =0
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
Classe de base des flux de sortie.
int_t get_list_size(int_t i_liste) const
renvoie le nombre d'elements de la liste i
_SIZE_ size_array() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
_SIZE_ dimension(int d) const
_SIZE_ size_totale() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")