16#include <interface_INITGAUSS.h>
17#include <interface_CALCULBIJ.h>
18#include <Domaine_Cl_dis_base.h>
19#include <Quadrangle_VEF.h>
20#include <Domaine_Cl_EF.h>
21#include <Equation_base.h>
22#include <Hexaedre_VEF.h>
23#include <Milieu_base.h>
24#include <Domaine_EF.h>
25#include <Periodique.h>
26#include <Segment_EF.h>
45 os <<
"____ h_carre "<<finl;
46 os << h_carre << finl;
47 os <<
"____ type_elem_ "<<finl;
48 os << type_elem_.valeur() << finl;
49 os <<
"____ nb_elem_std_ "<<finl;
51 os <<
"____ volumes_entrelaces_ "<<finl;
53 os <<
"____ face_normales_ "<<finl;
55 os <<
"____ nb_faces_std_ "<<finl;
57 os <<
"____ rang_elem_non_std_ "<<finl;
66 os << h_carre << finl;
67 os << type_elem_.valeur() << finl;
88 type_elem_ = Tri_EF();
89 else if (type ==
"Tetra_EF")
90 type_elem_ = Tetra_EF();
91 else if (type ==
"Quadri_EF")
92 type_elem_ = Quadri_EF();
93 else if (type ==
"Hexa_EF")
94 type_elem_ = Hexa_EF();
97 Cerr << type <<
" n'est pas un Elem_EF !" << finl;
116 if (
IPhi_.size() == 0)
IPhi_.resize(nbelem,nb_som_elem);
123 for (
int elem=0; elem<nbelem; elem++)
126 for (
int s=0; s<nb_som_elem; s++)
132 IPhi_.echange_espace_virtuel();
147 DoubleVect volumes_som_prov(volumes_sommets_thilde_);
154 int s_glob=les_elems(elem,s);
155 volumes_sommets_thilde_(s_glob)+=vol;
156 volumes_som_prov(s_glob)+=
IPhi_(elem,s);
161 volumes_sommets_thilde_.echange_espace_virtuel();
162 if (porosite_sommets_.size_array()==0)
165 porosite_sommets_=volumes_sommets_thilde_;
167 for (
int som=0; som<
nb_som(); som++)
169 porosite_sommets_(som)=volumes_sommets_thilde_(som)/volumes_som_prov(som);
171 porosite_sommets_.echange_espace_virtuel();
176 porosite_sommets_.resize(0);
177 DoubleVect volumes_som_prov(volumes_sommets_thilde_);
178 DoubleVect volumes_som_prov_b(volumes_sommets_thilde_);
180 volumes_som_prov_b=0;
187 double v2=
IPhi_(elem,s);
188 int s_glob=les_elems(elem,s);
189 volumes_som_prov(s_glob)+=v2/vol;
190 volumes_som_prov_b(s_glob)+=1;
193 Cerr<<mp_max_vect(porosite_elem_)<<
" "<<mp_min_vect( porosite_elem_)<<finl;
194 Cerr<<mp_max_vect(volumes_som_prov)<<
" "<<mp_min_vect( volumes_som_prov)<<finl;
195 Cerr<<mp_max_vect(volumes_som_prov_b)<<
" "<<mp_min_vect( volumes_som_prov_b)<<finl;
197 if (porosite_sommets_.size_array()==0)
200 porosite_sommets_=volumes_sommets_thilde_;
202 for (
int som=0; som<
nb_som(); som++)
204 porosite_sommets_(som)=1./volumes_som_prov(som)*volumes_som_prov_b(som);
207 porosite_sommets_.echange_espace_virtuel();
209 Cerr<<mp_max_vect( porosite_sommets_)<<
" "<<mp_min_vect( porosite_sommets_)<<finl;
230 const Elem_geom_base& elem_geom = domaine_geom.type_elem().valeur();
231 if (sub_type(Rectangle, elem_geom))
232 domaine_geom.
typer(
"Quadrangle");
233 else if (sub_type(Hexaedre, elem_geom))
234 domaine_geom.
typer(
"Hexaedre_VEF");
236 const Nom& type_elem_geom = domaine_geom.type_elem()->
que_suis_je();
239 if (type_elem_geom ==
"Triangle")
241 else if (type_elem_geom ==
"Tetraedre")
243 else if (type_elem_geom ==
"Quadrangle")
245 else if (type_elem_geom ==
"Hexaedre_VEF")
247 else if (type_elem_geom ==
"Segment")
249 else if (type_elem_geom ==
"Segment_axi")
250 type =
"Segment_EF_axi";
251 else if (type_elem_geom ==
"Point")
255 Cerr <<
"probleme de typage dans Domaine_EF::typer_elem => type geometrique : " << type_elem_geom << finl;
258 type_elem_.typer(type);
265 Cerr <<
"*****************************************************************************" << finl;
267 Cerr <<
" is not compatible" << finl;
268 Cerr <<
" with the discretisation EF. " << finl;
269 Cerr <<
" Please use the discretization EF_axi or define a domain of type Domaine." << finl;
270 Cerr <<
"*****************************************************************************" << finl;
279 Domaine& domaine_geom=
domaine();
281 Elem_geom_base& elem_geom = domaine_geom.type_elem().valeur();
296 for (
int i = debut; i < fin; i++)
300 face_vois(i, 0) = face_vois(i, 1);
301 face_vois(i, 1) = -1;
312 if (!sub_type(Segment,elem_geom))
314 Cerr <<
" Le type de l'element geometrique " << elem_geom.
que_suis_je() <<
" est incorrect" << finl;
318 else if (sub_type(
Tri_EF,type_elem_.valeur()))
320 if (!sub_type(Triangle,elem_geom))
322 Cerr <<
" Le type de l'element geometrique " <<
323 elem_geom.
que_suis_je() <<
" est incorrect" << finl;
324 Cerr <<
" Seul le type Triangle est compatible avec la discretisation EF en dimension 2" << finl;
325 Cerr <<
" Il faut trianguler le domaine lorsqu'on utilise le mailleur interne" ;
326 Cerr <<
" en utilisant l'instruction: Trianguler nom_dom" << finl;
330 else if (sub_type(
Tetra_EF,type_elem_.valeur()))
332 if (!sub_type(Tetraedre,elem_geom))
334 Cerr <<
" Le type de l'element geometrique " <<
335 elem_geom.
que_suis_je() <<
" est incorrect" << finl;
336 Cerr <<
" Seul le type Tetraedre est compatible avec la discretisation EF en dimension 3" << finl;
337 Cerr <<
" Il faut tetraedriser le domaine lorsqu'on utilise le mailleur interne";
338 Cerr <<
" en utilisant l'instruction: Tetraedriser nom_dom" << finl;
343 else if (sub_type(
Quadri_EF,type_elem_.valeur()))
346 if (!sub_type(Quadrangle_VEF,elem_geom))
348 Cerr <<
" Le type de l'element geometrique " << elem_geom.
que_suis_je() <<
" est incorrect" << finl;
352 else if (sub_type(
Hexa_EF,type_elem_.valeur()))
355 if (!sub_type(Hexaedre_VEF,elem_geom))
357 Cerr <<
" Le type de l'element geometrique " << elem_geom.
que_suis_je() <<
" est incorrect" << finl;
381 for (num_face = 0; num_face < n_tot; num_face++)
383 type_elem_->normale(num_face,
385 face_som, face_vois, elem_face, domaine_geom);
401 for (
int elem=0; elem<nbelem; elem++)
402 for (
int i=0; i<nbsom_elem; i++)
405 for (
int f=0; f<nbface_elem; f++)
407 int face=elemfaces(elem,f);
408 const double ratio =
bidim_axi &&
xv_(face, 0) > 1e-10 ?
xp_(elem, 0) /
xv_(face, 0) : 1.0;
409 for (
int s=0; s<nbsom_face; s++)
439 for (
int elem=0; elem<nbelem; elem++)
440 for (
int i=0; i<nbsom_elem; i++)
442 int som_glob=elems(elem,i);;
445 Bij_thilde_(elem,i,j)=bij(elem,i,j)*porosite_sommets_(som_glob);
453 for (
int elem=0; elem<nbelem; elem++)
454 for (
int i=0; i<nbsom_elem; i++)
464 Cout<< elem<<
" "<<i<<
" "<<j<<
" "<<Bij_thilde_(elem,i2,j)<<
" uuu ";
465 bthilde >> ele>> ii >> jj >> Bij_thilde_(elem,i2,j);
466 Cout<< Bij_thilde_(elem,i2,j)<<finl;
476 volumes_sommets_thilde_=0;
478 Bij_thilde_.resize(nbelem,nbsom_elem,
dimension);
494 DoubleTab xgau(npgau,3),frgau(npgau,nbnn),dfrgau(npgau,nbnn,(
int)3),poigau(npgau);
495 DoubleVect volumes_sommets_(volumes_sommets_thilde_);
498 init_gauss.
Compute(dim,nbnn,npgau,xgau,frgau,dfrgau,poigau);
502 DoubleTab detj(npgau),ajm1(npgau*9),aj(npgau*9),df(npgau*nbnn*3),iphi(nbnn);
505 for (
int elem=0; elem<nbelem; elem++)
507 for (
int i=0; i<nbnn; i++)
508 num[i]=les_elems(elem,filter[i]);
509 for (
int i=0; i<nbnn; i++)
512 xl(d,i)=coord(num[i],d);
518 CALCULBIJ.Compute(nbnn,nbsom_tot, xl, num, bijl,
519 porosite_sommets_, ip,
520 npgau, xgau, frgau, dfrgau,
521 poigau,detj, ajm1, aj, df,vol,volumes_sommets_,iphi);
522 if (!est_egal(
volumes_(elem),vol,1e-5))
524 Cerr<<
"Erreur volume "<<elem<<
" vol: "<<
volumes_(elem)<<
" new "<<vol<<
" delta "<<
volumes_(elem)-vol;
527 for (
int i=0; i<nbnn; i++)
531 bij(elem,filter[i],d)=bijl(d,(i));
532 IPhi_(elem,filter[i])=iphi(i);
537 CALCULBIJ.Compute(nbnn, nbsom_tot, xl, num, bijl,
538 porosite_sommets_, ip,
539 npgau, xgau, frgau, dfrgau,
540 poigau,detj, ajm1, aj, df,volumes_thilde_(elem),volumes_sommets_thilde_,iphi);
542 for (
int i=0; i<nbnn; i++)
546 Bij_thilde_(elem,filter[i],d)=bijl(d,(i));
556 for (
int elem=0; elem<nbelem; elem++)
558 for (
int i=0; i<nbsom_elem; i++)
561 Cerr<<
" BIJ "<<elem<<
" "<< i<<
" "<<d<<
" "<<bij(elem,i,d)<<
" "<<Bij_thilde_(elem,i,d)<<finl;
564 Cerr<<
"vol elem "<<
volumes_(elem)<<
" "<<volumes_thilde_(elem)<<finl;
566 for (
int elem=0; elem<volumes_sommets_thilde_.size_array(); elem++)
567 Cerr<<elem<<
" vol som "<< volumes_sommets_thilde_(elem)<<finl;
570 Cerr<<
"max/min/max_abs bij "<<mp_max_vect(bij)<<
" "<<mp_min_vect(bij)<<
" "<<mp_max_abs_vect(bij)<<finl;
573 for (
int elem=0; elem<nbelem; elem++)
577 for (
int i=0; i<nbsom_elem; i++)
579 if (!est_egal(tot,0))
582 Cerr<<
" pb elem "<< elem<<
" direction "<<j<<
" : "<<tot<<finl;
593 porosite_sommets_.resize(
nb_som());
605 for (
int num_elem=0; num_elem<nbe; num_elem++)
608 for (
int i=0; i<nb_faces_elem; i++)
610 double surf = surfaces(
elem_faces(num_elem,i));
611 surf_max = (surf > surf_max)? surf : surf_max;
613 double vol =
volumes(num_elem)/surf_max;
615 h_carre_(num_elem) = vol;
616 h_carre = ( vol < h_carre )? vol : h_carre;
650 if (Bij_.nb_dim()==1)
654 Cerr <<
"le Domaine_EF a ete rempli avec succes" << finl;
666 Journal() <<
"Domaine_EF::Modifier_pour_Cl" << finl;
667 for (
auto& itr : conds_lim)
681 int num_derniere_face = num_premiere_face+nfin;
683 int nbr_faces_bord = la_front_dis.
nb_faces();
697 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
700 face = la_front_dis.
num_face(ind_face);
704 if (ind_face<nbr_faces_bord)
706 assert(faassociee>=num_premiere_face);
707 assert(faassociee<num_derniere_face);
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.
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
int_t nb_elem_tot() const
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
void typer(const Nom &)
Type les elements du domaine avec le nom passe en parametre.
const DoubleTab_t & coord_sommets() const
virtual void creer_tableau_sommets(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
Cree un tableau ayant une "ligne" par sommet du maillage.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
void calculer_volumes_sommets(const Domaine_Cl_dis_base &zcl)
virtual void calculer_Bij_gen(DoubleTab &bij)
void modifier_pour_Cl(const Conds_lim &) override
void calculer_porosites_sommets()
void discretiser() override
virtual void verifie_compatibilite_domaine()
void calculer_volumes_entrelaces()
void typer_elem(Domaine &domaine_geom) override
virtual void calculer_IPhi(const Domaine_Cl_dis_base &zcl)
IntVect rang_elem_non_std_
virtual const DoubleVect & face_surfaces() const
int nb_faces() const
renvoie le nombre global de faces.
IntTab & face_sommets() override
renvoie le tableau de connectivite faces/sommets.
DoubleVect volumes_entrelaces_
int nb_faces_tot() const
renvoie le nombre total de faces.
void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
void discretiser() override
Genere les faces construits les frontieres.
IntTab & elem_faces()
renvoie le tableau de connectivite element/faces
int nb_som_face() const
renvoie le nombre de sommets par face.
int oriente_normale(int f, int e) const
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
virtual DoubleTab & face_normales()
IntTab & face_voisins() override
renvoie le tableaux des volumes des connectivites face elements cf au dessus.
void marquer_faces_double_contrib(const Conds_lim &)
const Domaine & domaine() const
Fichier en lecture Cette classe est a la classe C++ ifstream ce que la classe Entree est a la.
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
int num_premiere_face() const
int num_face(const int) const
DoubleVect & porosite_elem()
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 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 Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ size_totale() const
void Compute(const int idimg, const int nbnn, const int npgau, ArrOfDouble &xgau, ArrOfDouble &frgau, ArrOfDouble &dfrgau, ArrOfDouble &poigau) const