15#include <Op_Diff_VEF_Face_Penalise.h>
16#include <Dirichlet_paroi_fixe.h>
36 Cerr<<
"je suis dans Op_Diff_VEF_Face_Penalise::readOn()"<<finl;
43 Cerr <<
"Erreur dans Op_Diff_VEF_Face_Penalise::readOn()" << finl;
44 Cerr <<
"La dimension du probleme doit etre 2" << finl;
63calculer(
const DoubleTab& inconnue, DoubleTab& resu)
const
81ajouter(
const DoubleTab& inconnue, DoubleTab& resu)
const
84 int nb_composante,numero_global_face,local;
85 int face_penalisation,face;
87 IntList voisinage_ordre1,voisinage_ordre1_strict;
88 IntList voisinage_ordre2,voisinage_ordre2_strict;
89 IntList ensemble_faces;
95 for (nb_composante = 0; nb_composante <
dimension; nb_composante++)
101 voisinage(numero_global_face,voisinage_ordre1);
102 voisinage(voisinage_ordre1,voisinage_ordre2);
103 reduction(voisinage_ordre1,voisinage_ordre2,voisinage_ordre2_strict);
110 for (local = 0 ; local < voisinage_ordre2_strict.
size(); local++)
112 face = voisinage_ordre2_strict[local];
127 for (
int mm = 0; mm < ensemble_faces.
size(); mm++)
129 face_penalisation = ensemble_faces[mm];
131 resu(numero_global_face,nb_composante) +=
132 inconnue(face,nb_composante)*
133 signe(numero_global_face,face)*
144 for (local = 0 ; local < voisinage_ordre1_strict.
size(); local++)
146 assert(voisinage_ordre1_strict.
size() == 2
147 || voisinage_ordre1_strict.
size() == 4);
149 face = voisinage_ordre1_strict[local];
150 face_penalisation =
autre_face(numero_global_face,face);
152 resu(numero_global_face,nb_composante) +=
153 inconnue(face,nb_composante)*
162 if (numero_global_face <
domaine_vef().nb_faces_bord())
163 for (local = 0; local < voisinage_ordre1.
size(); local++)
165 assert(voisinage_ordre1.
size() == 3);
167 face_penalisation = voisinage_ordre1[local];
169 if (numero_global_face == face_penalisation)
174 resu(numero_global_face,nb_composante) +=
175 inconnue(numero_global_face,nb_composante) *
183 for (local = 0; local < voisinage_ordre1_strict.
size(); local++)
185 assert( voisinage_ordre1_strict.
size() == 4);
187 face_penalisation = voisinage_ordre1_strict[local];
189 resu(numero_global_face,nb_composante) +=
190 inconnue(numero_global_face,nb_composante) *
218voisinage(
const int Numero_face, IntList& Voisinage)
const
232 const int nb_faces_element = domaine().nb_faces_elem();
244 for (numero_local = 0; numero_local < nb_faces_element; numero_local++)
249 const int numero_global_face =
261 for (numero_local = 0; numero_local < nb_faces_element; numero_local++)
266 const int numero_global_face =
291voisinage(
const IntList& Ensemble_faces, IntList& Voisinage)
const
299 int nb_elements_Ensemble_faces,nb_elements_liste_temporaire;
300 IntList liste_temporaire;
302 for (nb_elements_Ensemble_faces = 0;
303 nb_elements_Ensemble_faces < Ensemble_faces.
size();
304 nb_elements_Ensemble_faces++)
307 const int numero_face_dans_Ensemble_faces =
308 Ensemble_faces[nb_elements_Ensemble_faces];
311 if (! liste_temporaire.
est_vide() ) liste_temporaire.
vide();
316 voisinage(numero_face_dans_Ensemble_faces,liste_temporaire);
320 for (nb_elements_liste_temporaire = 0;
321 nb_elements_liste_temporaire < liste_temporaire.
size();
322 nb_elements_liste_temporaire++)
326 const int numero_face_dans_liste_temporaire =
327 liste_temporaire[nb_elements_liste_temporaire];
330 Voisinage.
add_if_not(numero_face_dans_liste_temporaire);
349signe(
const int Face1,
const int Face2)
const
363 IntList sommets_Face2;
365 for (numero_local = 0 ; numero_local < nb_sommets_par_face ; numero_local++)
366 sommets_Face2.
add(domaine_vef().face_sommets(Face2,numero_local));
372 for (numero_local = 0; numero_local < nb_sommets_par_face ; numero_local++)
373 if ( sommets_Face2.
contient(domaine_vef().face_sommets(Face1,numero_local)))
398 double coefficientpenalisation = 0.;
406 if (voisin1 == -1 && voisin2 == -1)
408 Cerr <<
"Erreur dans Op_Dift_standard_Face_VEF_penalise::"
409 <<
"coefficient_penalisation()" << finl;
413 if (voisin1 != -1 && voisin2 != -1)
416 coefficientpenalisation = 1./
diametre(voisin1);
419 coefficientpenalisation = std::min(coefficientpenalisation,eta);
423 coefficientpenalisation = 1./
diametre(voisin2);
426 coefficientpenalisation = 1./
diametre(voisin1);
428 return coefficientpenalisation;
445 IntList& Faces_communes)
const
450 if (! Faces_communes.
est_vide() ) Faces_communes.
vide();
453 IntList voisinage_Face1,voisinage_Face2;
454 int nb_element_voisinage_Face2;
461 for (nb_element_voisinage_Face2 = 0;
462 nb_element_voisinage_Face2 < voisinage_Face2.
size();
463 nb_element_voisinage_Face2++)
465 const int numero_face_voisinage_Face2 =
466 voisinage_Face2[nb_element_voisinage_Face2];
468 if (voisinage_Face1.
contient(numero_face_voisinage_Face2))
469 Faces_communes.
add_if_not(numero_face_voisinage_Face2);
485reduction(
const IntList& Liste1,
const IntList& Liste2,
486 IntList& Liste_reduite)
const
493 const IntList *liste_de_plus_petite_taille,*liste_de_plus_grande_taille;
494 int nb_element_dans_liste;
501 liste_de_plus_petite_taille = &Liste2;
502 liste_de_plus_grande_taille = &Liste1;
506 liste_de_plus_petite_taille = &Liste1;
507 liste_de_plus_grande_taille = &Liste2;
514 for (
int ll = 0 ; ll < (*liste_de_plus_grande_taille).size() ; ll++)
515 Liste_reduite.
add( (*liste_de_plus_grande_taille)[ll] );
517 for (nb_element_dans_liste = 0;
518 nb_element_dans_liste < (*liste_de_plus_petite_taille).size();
519 nb_element_dans_liste++)
521 (Liste_reduite.
contient( (*liste_de_plus_petite_taille)
522 [nb_element_dans_liste] ) )
523 Liste_reduite.
suppr( (*liste_de_plus_petite_taille)
524 [nb_element_dans_liste] );
555 if (voisin1_Face1 != -1)
556 if (voisin1_Face1 == voisin1_Face2 || voisin1_Face1 == voisin2_Face2)
557 return voisin1_Face1;
559 if (voisin2_Face1 != -1)
560 if (voisin2_Face1 == voisin1_Face2 || voisin2_Face1 == voisin2_Face2)
561 return voisin2_Face1;
563 Cerr <<
" Op_Diff_VEF_Face_Penalise::element_commun()" << finl;
564 Cerr <<
"Attention: la face " << Face1 <<
" et la face " << Face2
565 <<
"n'ont pas d'element commun" << finl;
566 Cerr <<
"Je sors de elements_communs" << finl;
590 int numero_local,lautre_face=-1;
597 if (elem_commun == -1)
599 Cerr <<
"Fonction element_commun" << finl;
600 Cerr <<
"Les 2 faces n'appartiennent pas au meme element." << finl;
605 const int nb_faces_element = domaine().nb_faces_elem();
607 for (numero_local = 0; numero_local < nb_faces_element; numero_local++)
613 const int numero_global_face =
616 if ( numero_global_face != Face1 && numero_global_face != Face2)
618 lautre_face = numero_global_face;
int nb_faces() const
renvoie le nombre global de faces.
int nb_som_face() const
renvoie le nombre de sommets par face.
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Class defining operators and methods for all reading operation in an input flow (file,...
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.
void reduction(const IntList &Liste1, const IntList &Liste2, IntList &Liste_reduite) const
void faces_communes(const int Face1, const int Face2, IntList &Face_commune) const
fonction membre qui renvoie la liste des faces appartenant au voisinage de Face1 ET de Face2.
double signe(const int Face1, const int Face2) const
double diametre(const int Element) const
DoubleTab & ajouter(const DoubleTab &inconnue, DoubleTab &resu) const override
methode qui calcule la vitesse au temps n+1 lorsque le schema explicite est utilise.
void voisinage(const int Numero_face, IntList &Voisinage) const
methode qui calcule le voisinage d'une face.
DoubleTab & calculer(const DoubleTab &inconnue, DoubleTab &resu) const override
methode qui calcule la contribution de l'operateur.
double coefficient_penalisation(const int Numero_face) const
fonction membre qui retourne le coefficient de penalisation associee a chaque face du maillage primai...
double longueur(const int Face) const
int autre_face(const int Face1, const int Face2) const
fonction membre qui retourne la 3eme face de l'element Element si Face1 et Face2 appartiennent au mem...
int element_commun(const int Face1, const int Face2) const
fonction membre qui renvoie le numero de l'element contenant Face1 et Face2 s'il existe et renvoie -1...
class Op_Diff_VEF_Face Cette classe represente l'operateur de diffusion
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
const Domaine_VEF & domaine_vef() const
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
TRUSTList & add(_TYPE_)
insertion en queue
TRUSTList & add_if_not(_TYPE_)
Ajout d'un element a la liste ssi il n'existe pas deja.
void suppr(_TYPE_)
Supprime un element contenu dans la liste.
int contient(_TYPE_) const
Verifie si un element appartient ou non a la liste.
void vide()
Vide la liste.