16#include <Domaine_VDF.h>
17#include <Domaine_Cl_VDF.h>
22#include <Periodique.h>
23#include <Dirichlet_entree_fluide_leaves.h>
24#include <Neumann_sortie_libre.h>
25#include <EcrFicCollecte.h>
36 os <<
"orientation_" << orientation_ << finl;
37 os <<
"nb_faces_X_" << nb_faces_X_ << finl;
38 os <<
"nb_faces_Y_" << nb_faces_Y_ << finl;
39 os <<
"nb_faces_Z_" << nb_faces_Z_ << finl;
40 os <<
"nb_aretes_" << nb_aretes_ << finl;
41 os <<
"nb_aretes_joint_" << nb_aretes_joint_ << finl;
42 os <<
"nb_aretes_coin_" << nb_aretes_coin_ << finl;
43 os <<
"nb_aretes_bord_" << nb_aretes_bord_ << finl;
44 os <<
"nb_aretes_mixtes_" << nb_aretes_mixtes_ << finl;
45 os <<
"nb_aretes_internes_" << nb_aretes_internes_ << finl;
46 Qdm_.ecrit(os <<
"Qdm : ");
47 os << h_x_ <<
" " << h_y_ <<
" " << h_z_ << finl;
59 is >> nb_aretes_joint_;
60 is >> nb_aretes_coin_;
61 is >> nb_aretes_bord_;
62 is >> nb_aretes_mixtes_;
63 is >> nb_aretes_internes_;
65 is >> h_x_ >> h_y_ >> h_z_;
102 for (
int i = 0; i < nb_faces_front; i++)
108 for (
int i=nb_faces_front; i <
nb_faces; i++)
110 const int ori = orientation_[i];
111 sort_key(i, 0) = ori *
nb_faces + i;
126 IntVect old_orien(orientation_);
127 for (
int i=nb_faces_front; i <
nb_faces; i++)
129 const int idx = sort_key(i, 1);
130 orientation_[i] = old_orien[idx];
149 Domaine& domaine_geom=
domaine();
153 const Elem_geom_base& elem_geom = domaine_geom.type_elem().valeur();
157 if (!sub_type(Rectangle,elem_geom))
159 Cerr <<
" Le type de l'element geometrique " << elem_geom.
que_suis_je() <<
" est incorrect" << finl;
160 Cerr <<
" Seul le type Rectangle et Rectangle_Axi sont compatibles avec la discretisation VDF en dimension 2" << finl;
166 if (!sub_type(Hexaedre,elem_geom))
168 Cerr <<
" Le type de l'element geometrique " << elem_geom.
que_suis_je() <<
" est incorrect" << finl;
169 Cerr <<
" Seul le type Hexaedre ou Hexadre_Axi sont compatibles avec la discretisation VDF en dimension 3" << finl;
178 orientation_.echange_espace_virtuel();
179 orientation_.set_md_vector(md_nul);
186 for (
int i_face = 0; i_face < nbr_faces_tot; i_face++)
190 const int ori = orientation_[i_face];
191 const double x_face =
xv(i_face, ori);
197 delta = x_face -
xp(elem0, ori);
202 delta =
xp(elem1, ori) - x_face;
216 remplir_face_normales();
217 Cerr <<
"L'objet de type Domaine_VDF a ete rempli avec succes " << finl;
221void Domaine_VDF::remplir_face_normales()
242 Cerr <<
"On calcule les volumes entrelaces" << finl;
249 for (
int num_face = 0; num_face<nbf; num_face++)
251 const double f = (num_face < nb_faces_front) ? 2. : 1.;
252 for (
int dir = 0; dir < 2; dir ++)
257 if ((
axi) && (orientation_[num_face]==0))
259 else if ((
bidim_axi) && (orientation_[num_face]==0))
272static inline int face_vois(
const Domaine_VDF& zvdf,
const Domaine& domaine,
int face,
int i)
277 face=domaine.face_bords_interne_conjuguee(face);
290void Domaine_VDF::genere_aretes()
292 Cerr <<
"On genere les aretes" << finl;
299 int nb_aretes_plus=-1;
301 nb_aretes_plus = mon_dom.
nb_som();
303 nb_aretes_plus = mon_dom.
nb_som()*3;
304 Cerr <<
"Creation des aretes " << finl;
305 Aretes les_aretes(nb_aretes_plus);
308 int el1, el2, el3, el4;
309 int face12, face13, face34, face24;
314 IntVect gauche(nb_dir);
321 IntVect droite(nb_dir);
328 IntVect haut(nb_dir);
352 ArrOfDouble P1(3), P2(3);
361 P1[i] =
xv(face, i) + (ori == i ? eps : 0);
362 P2[i] =
xv(face, i) - (ori == i ? eps : 0);
366 if (elem1 >= 0 && elem2 >= 0 && elem1 != elem2)
369 est_une_plaque(face) = 1;
373 est_une_plaque.echange_espace_virtuel();
375 for(
int dir=0; dir<nb_dir; dir++)
376 for (el1=0; el1<nb_poly_tot; el1++)
382 el2=face_vois(*
this, mon_dom, face12, 1);
389 el3=face_vois(*
this, mon_dom, face13, 1);
396 if( (el2>-1) && (el3>-1))
397 el4=face_vois(*
this, mon_dom, face24, 1);
399 el4=face_vois(*
this, mon_dom, face24, 1);
401 el4=face_vois(*
this, mon_dom, face34, 1);
405 if ( (el2==-1) && (el4>=0) )
407 if ( (el3==-1) && (el4>=0) )
411 if (el2 > -1 && el3 > -1 && el4 > -1)
412 les_aretes.affecter(nb_aretes_, dir, interne, nb_f, face13, face24, face12, face34, est_une_plaque);
413 else if ( (el3 > -1 && el4 > -1) ||
414 (el2 > -1 && el4 > -1) ||
415 (el2 > -1 && el3 > -1) )
416 les_aretes.affecter(nb_aretes_, dir, mixte, nb_f, face13, face24, face12, face34, est_une_plaque);
418 les_aretes.affecter(nb_aretes_, dir, bord, nb_f, face13, face24, face12, 1, est_une_plaque);
420 les_aretes.affecter(nb_aretes_, dir, bord, nb_f, face12, face34, face13, 1, est_une_plaque);
422 les_aretes.affecter(nb_aretes_, dir, coin, nb_f, face13, face24, face12, face34, est_une_plaque);
428 el3 = face_vois(*
this, mon_dom, face13, 0);
435 el4 = face_vois(*
this, mon_dom, face24, 0);
437 les_aretes.affecter(nb_aretes_, dir, bord, nb_f, face13, face24, face12, -1, est_une_plaque);
441 if (face_vois(*
this, mon_dom, face34, 0) == -1)
442 les_aretes.affecter(nb_aretes_, dir, mixte, nb_f, face13, face24, face34, face12, est_une_plaque);
446 les_aretes.affecter(nb_aretes_, dir, coin, nb_f, face13, -1, -1, face12, est_une_plaque);
452 el3 = face_vois(*
this, mon_dom, face13, 0);
457 el2 = face_vois(*
this, mon_dom, face12, 1);
461 el4 = face_vois(*
this, mon_dom, face24, 0);
463 les_aretes.affecter(nb_aretes_, dir, bord, nb_f, face13, face24, face12, -1, est_une_plaque);
466 les_aretes.affecter(nb_aretes_, dir, coin, nb_f, -1, face12, -1, face13, est_une_plaque);
472 el2 = face_vois(*
this, mon_dom, face12, 0);
474 el3 = face_vois(*
this, mon_dom, face13, 0);
475 if ((el2 < 0) && (el3 < 0))
477 les_aretes.affecter(nb_aretes_, dir, coin, nb_f, face13, -1, face12, -1, est_une_plaque);
482 les_aretes.dimensionner(nb_aretes_);
484 les_aretes.trier(nb_aretes_coin_,
487 nb_aretes_internes_);
488#ifdef SORT_POUR_DEBOG
490 les_aretes.trier_pour_debog(nb_aretes_coin_,
493 nb_aretes_internes_,
xv());
496 assert(nb_aretes_==nb_aretes_coin_+nb_aretes_bord_+nb_aretes_mixtes_
497 +nb_aretes_internes_+nb_aretes_joint_);
498 Qdm_.ref(les_aretes.faces());
521void Domaine_VDF::calcul_h()
523 Domaine& domaine_geom=
domaine();
525 const double deux_pi = M_PI * 2.0;
528 for (
int e = 0; e < domaine_geom.
nb_elem(); e++)
533 h_x_ = std::min(h_x_,
xv_(numfa[D], 0) -
xv_(numfa[0], 0));
537 double d_teta =
xv_(numfa[D + 1], 1) -
xv_(numfa[1], 1);
538 if (d_teta < 0) d_teta += deux_pi;
539 hy_loc = d_teta *
xv_(numfa[1], 0);
541 else hy_loc =
xv_(numfa[D + 1], 1) -
xv_(numfa[1], 1);
542 h_y_ = std::min(h_y_, hy_loc);
543 if (
dimension == 3) h_z_ = std::min(h_z_,
xv_(numfa[5], 2) -
xv_(numfa[2], 2));
556 int nb_cond_lim=conds_lim.size();
558 aretes_coin_traitees = -1;
560 for (
int num_cond_lim=0; num_cond_lim<nb_cond_lim; num_cond_lim++)
574 int fac1,fac2,sign,num_face,elem1,n_type;
575 for (
int n_arete=ndeb_arete; n_arete<ndeb_arete+
nb_aretes_bord(); n_arete++)
583 fac1 = Qdm_(n_arete,0);
584 fac2 = Qdm_(n_arete,1);
585 fac3 = Qdm_(n_arete,2);
586 sign = Qdm_(n_arete,3);
590 int nfin = ndeb + la_frontiere_dis.
nb_faces();
591 if ( ( ( ndeb <= fac1) && (fac1 < nfin) ) ||
592 ( ( ndeb <= fac2) && (fac2 < nfin) )
603 Qdm_(n_arete,3) = fac3;
613 Cerr <<
"Modifications de Qdm pour les aretes coins num_cond_lim=" << num_cond_lim << finl;
616 for (
int n_arete=ndeb_arete_coin; n_arete<ndeb_arete_coin+
nb_aretes_coin(); n_arete++)
618 if (aretes_coin_traitees[n_arete] != 1)
620 fac1 = Qdm_(n_arete,0);
621 fac2 = Qdm_(n_arete,1);
622 fac3 = Qdm_(n_arete,2);
623 fac4 = Qdm_(n_arete,3);
654 int nfin = ndeb + la_frontiere_dis.
nb_faces();
655 int elem, fac,dim0,dim1,indic_f0=-100,indic_f1=-100;
658 dim1 = orientation_[f(1)];
659 dim0 = orientation_[f(0)];
661 for (
int j=0; j<2; j++)
662 for (
int k=0; k<2; k++)
671 if ((f(0) >= ndeb)&&(f(0) < nfin))
673 Qdm_(n_arete,2)=f(0);
674 Qdm_(n_arete,indic_f0)=f(1);
678 Qdm_(n_arete,1-indic_f0)=fac;
680 Qdm_(n_arete,3)=1-2*indic_f1;
683 aretes_coin_traitees[n_arete] = 1;
687 if ((f(1) >= ndeb)&&(f(1) < nfin))
689 Qdm_(n_arete,2)=f(1);
690 Qdm_(n_arete,indic_f1)=f(0);
694 Qdm_(n_arete,1-indic_f1)=fac;
696 Qdm_(n_arete,3)=1-2*indic_f0;
699 aretes_coin_traitees[n_arete] = 1;
711 if ((f(0) >= ndeb)&&(f(0) < nfin))
713 Qdm_(n_arete,2+indic_f1)=f(0);
714 Qdm_(n_arete,indic_f0)=f(1);
718 Qdm_(n_arete,1-indic_f0)=fac;
722 Qdm_(n_arete,3-indic_f1)=fac;
725 aretes_coin_traitees[n_arete] = 1;
729 if ((f(1) >= ndeb)&&(f(1) < nfin))
731 Qdm_(n_arete,2+indic_f0)=f(1);
732 Qdm_(n_arete,indic_f1)=f(0);
736 Qdm_(n_arete,1-indic_f1)=fac;
740 Qdm_(n_arete,3-indic_f0)=fac;
743 aretes_coin_traitees[n_arete] = 1;
750 Cerr <<
"Attention : les cas concernant d autres types d aretes coin " << finl;
751 Cerr <<
"que perio-perio ou perio-paroi ne sont pas traites!!" << finl;
764 int fac1,fac2,n_type;
766 Cerr <<
"Modifications de Qdm pour les aretes coins touchant une paroi num_cond_lim=" << num_cond_lim << finl;
769 for (
int n_arete=ndeb_arete_coin; n_arete<ndeb_arete_coin+
nb_aretes_coin(); n_arete++)
771 if (aretes_coin_traitees[n_arete] != 1)
773 fac1 = Qdm_(n_arete,0);
774 fac2 = Qdm_(n_arete,1);
775 fac3 = Qdm_(n_arete,2);
776 fac4 = Qdm_(n_arete,3);
807 int nfin = ndeb + la_frontiere_dis.
nb_faces();
808 int indic_f0=-100,indic_f1=-100;
812 for (
int j=0; j<2; j++)
813 for (
int k=0; k<2; k++)
822 if ((f(0) >= ndeb)&&(f(0) < nfin))
824 Qdm_(n_arete,0)=f(1);
825 Qdm_(n_arete,1)=f(1);
826 Qdm_(n_arete,2)=f(0);
827 Qdm_(n_arete,3)=1-2*indic_f1;
828 aretes_coin_traitees[n_arete] = 1;
832 if ((f(1) >= ndeb)&&(f(1) < nfin))
834 Qdm_(n_arete,0)=f(0);
835 Qdm_(n_arete,1)=f(0);
836 Qdm_(n_arete,2)=f(1);
837 Qdm_(n_arete,3)=1-2*indic_f0;
838 aretes_coin_traitees[n_arete] = 1;
872 Cerr <<
"Domaine_VDF::creer_elements_fictifs()" << finl;
890 for (face=ndeb; face<nfin; face++)
908 for (
int n_bord=0; n_bord<les_bords_.size(); n_bord++)
911 if (fr_vf.
le_nom() == nom_bord)
915 for (
int face=ndeb; face<ndeb+fr_vf.
nb_faces(); face++)
922 for (
int n_bord=0; n_bord<les_bords_.size(); n_bord++)
925 if (fr_vf.
le_nom() == nom_bord)
929 for (
int face=ndeb; face<ndeb+fr_vf.
nb_faces(); face++)
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limites discretisee dont l'objet fait partie.
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
classe Dirichlet_entree_fluide Cette classe represente une condition aux limite imposant une grandeur
int_t nb_elem_tot() const
SmallArrOfTID_t & chercher_elements(const DoubleTab &pos, SmallArrOfTID_t &elem, int reel=0) const
Recherche des elements contenant les points dont les coordonnees sont specifiees.
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_t nb_faces_frontiere() const
Renvoie le nombre de faces frontiere du domaine (somme des nombres de bords, de raccords et de bords ...
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
int type_arete_bord(int num_arete) const
const int & type_arete_coin(int num_arete) const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
int nb_aretes_coin() const
void compute_sort_key(Faces &, IntTab &sort_key) override
Override. Compute sorting key so that internal faces are sorted by their orientation first (X,...
double dist_norm_bord_axi(int num_face) const
IntVect & orientation()
inline double Domaine_VDF::porosite_face(int i) const {
Faces * creer_faces() override
renvoie un Faces_VDF* !
void prepare_elem_non_std(Faces &) override
double dim_elem(int, int) const
std::map< std::array< int, 2 >, int > virt_e_map
void creer_elements_fictifs(const Domaine_Cl_dis_base &) override
remplit le tableau face_voisins_fictifs_ ne CREE PAS d elts fictifs!!!
int premiere_arete_bord() const
void discretiser() override
appel a Domaine_VF::discretiser() calcul des centres de gravite des elements
int premiere_arete_coin() const
int nb_aretes_bord() const
void modifier_pour_Cl(const Conds_lim &cl) override
void init_virt_e_map() const
void renumber_faces(Faces &les_faces, IntTab &sort_key) override
Override to also renumber orientation_ member.
void calculer_volumes_entrelaces()
remplissage des volumes entrelaces
double dist_norm_bord(int num_face) const override
virtual const DoubleVect & face_surfaces() const
int nb_faces() const
renvoie le nombre global de faces.
DoubleVect volumes_entrelaces_
double volume_entrelace_axi(double r_face, double r_elem, double axis_length) const
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.
void modifier_pour_Cl(const Conds_lim &) override
IntTab & elem_faces()
renvoie le tableau de connectivite element/faces
virtual void renumber_faces(Faces &les_faces, IntTab &sort_key)
Re-index faces according to the new order given by 'sort_key'.
IntTab face_voisins_fictifs_
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
DoubleTab volumes_entrelaces_dir_
int nb_faces_bord() const
renvoie le nombre de faces sur lesquelles sont appliquees les conditions limites :
const Front_VF & front_VF(int i) const
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
Class defining operators and methods for all reading operation in an input flow (file,...
void calculer_orientation(IntVect &, int &, int &, int &)
int num_premiere_face() const
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
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.
static double precision_geom
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.
static double mp_min(double)
static int me()
renvoie mon rang dans le groupe de communication courant.
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)
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")