16#include <Champ_P1_isoP1Bulle.h>
17#include <LecFicDistribueBin.h>
18#include <Matrice_Morse_Sym.h>
19#include <Champ_Uniforme.h>
20#include <Op_Diff_RotRot.h>
22#include <Domaine_Cl_VEF.h>
43 curl_.associer(domaine_dis, domaine_Cl_dis, inco);
44 rot_.associer(domaine_dis, domaine_Cl_dis, inco);
48 vorticite_.typer(
"Champ_P1_isoP1Bulle");
52 vorticite.
nommer(
"vorticite");
78 return ajouter(vitesse, diffusion);
86 Cerr <<
"je suis dans OpDiffRotRot" << finl;
89 curl_.calculer(vitesse, curl);
92 rot_.calculer(vorticite_->valeurs(), diffusion);
94 Cerr <<
"je sors de OpDiffRotRot" << finl;
116 DoubleTab solution_temporaire(la_matrice.
ordre());
118 assert(solution_temporaire.
size() == solution.
size() - 1);
119 assert(curl.
size() == solution_temporaire.
size());
130 for (
int i = 0; i < solution_temporaire.
size(); i++)
131 solution[i] = solution_temporaire[i];
134 int sommet = domaine.nb_som() - 1;
136 for (
int i = 0; i <
curl_.elem_som_size(sommet); i++)
137 solution[sommet] += solution_temporaire[
curl_.elements_pour_sommet(sommet, i)];
160 int colonne_a_remplir_tab2, colonne_a_remplir_coeff;
162 Cerr <<
"Assemblage de la matrice de vorticite en cours..." << finl;
163 matrice.typer(
"Matrice_Morse_Sym");
177 int nombre_coeff_non_nuls = (2 *
dimension + 3) * domaine.nb_elem() + (domaine.nb_som() - 1) * (domaine.nb_som() - 1);
179 Matrice_Morse la_matrice(domaine.nb_elem() + domaine.nb_som() - 1, nombre_coeff_non_nuls);
182 Nom nomfic(
"Vorticite.sv");
184 int fic_vorticite_existe;
186 if (vorticite.
ouvrir(nomfic))
187 fic_vorticite_existe = 1;
189 fic_vorticite_existe = 0;
191 if (fic_vorticite_existe)
193 Cerr <<
"Relecture de la matrice de vorticite sur le fichier: " << nomfic << finl;
194 vorticite >> la_matrice;
196 Cerr <<
"Fin de la relecture de la matrice de vorticite." << finl;
200 Cerr <<
"Assemblage de la matrice de vorticite " << nomfic << finl;
210 nombre_coeff_non_nuls = 1;
211 colonne_a_remplir_tab2 = 0;
212 colonne_a_remplir_coeff = 0;
216 for (
int numero_elem = 0; numero_elem < domaine.nb_elem(); numero_elem++)
221 Tri(sommets_pour_elem);
224 la_matrice.
get_set_tab1()(numero_elem) = nombre_coeff_non_nuls;
230 la_matrice.
get_set_tab2()(colonne_a_remplir_tab2) = numero_elem + 1;
235 nombre_coeff_non_nuls++;
239 colonne_a_remplir_tab2++;
240 colonne_a_remplir_coeff++;
243 for (
int i = 0; i < domaine.nb_som_elem(); i++)
247 if (sommets_pour_elem[i] != domaine.nb_som() - 1)
249 la_matrice.
get_set_tab2()(colonne_a_remplir_tab2) = domaine.nb_elem() + sommets_pour_elem[i] + 1;
254 nombre_coeff_non_nuls++;
258 colonne_a_remplir_tab2++;
259 colonne_a_remplir_coeff++;
271 for (
int numero_som = 0; numero_som < domaine.nb_som() - 1; numero_som++)
276 IntList Sommets_voisins =
sommets_voisins(numero_som, Elem_pour_sommet);
277 Tri(Elem_pour_sommet);
278 Tri(Sommets_voisins);
282 la_matrice.
get_set_tab1()(domaine.nb_elem() + numero_som) = nombre_coeff_non_nuls;
287 for (
int i = 0; i < Elem_pour_sommet.
size(); i++)
290 la_matrice.
get_set_tab2()(colonne_a_remplir_tab2) = Elem_pour_sommet[i] + 1;
295 nombre_coeff_non_nuls++;
298 colonne_a_remplir_tab2++;
299 colonne_a_remplir_coeff++;
306 for (
int i = 0; i < Sommets_voisins.
size(); i++)
309 int numero_som_global = Sommets_voisins[i];
314 if (numero_som_global != domaine.nb_som() - 1)
317 la_matrice.
get_set_tab2()(colonne_a_remplir_tab2) = domaine.nb_elem() + Sommets_voisins[i] + 1;
322 nombre_coeff_non_nuls++;
325 colonne_a_remplir_tab2++;
326 colonne_a_remplir_coeff++;
339 la_matrice.
get_set_tab1()(domaine.nb_elem() + domaine.nb_som() - 1) = nombre_coeff_non_nuls;
346 la_matrice_sym = la_matrice;
348 Cerr <<
"Fin de l'assemblage de la matrice de vorticite. " << finl;
358 int numero_global_sommet = 0;
365 for (
int i = 0; i < domaine.nb_som_elem(); i++)
367 numero_global_sommet = domaine.sommet_elem(numero_elem, i);
379 int numero_global_som;
391 for (
int numero_elem = 0; numero_elem < domaine.nb_elem(); numero_elem++)
392 for (
int numero_som = 0; numero_som < domaine.nb_som_elem(); numero_som++)
394 numero_global_som = domaine.sommet_elem(numero_elem, numero_som);
395 if (numero_sommet == numero_global_som)
411 int numero_global_som;
417 for (
int numero_elem_loc = 0; numero_elem_loc < liste.
size(); numero_elem_loc++)
418 for (
int numero_som = 0; numero_som < domaine.nb_som_elem(); numero_som++)
420 numero_global_som = domaine.sommet_elem(liste[numero_elem_loc], numero_som);
439 Cerr <<
"Erreur dans Op_Diff_RotRot::Tri()." << finl;
440 Cerr <<
"La liste a trier est vide: sortie du programme." << finl;
449 minimum = liste_a_trier[0];
451 for (
int i = 0; i < liste_a_trier.
size(); i++)
452 minimum = (minimum <= liste_a_trier[i] ? minimum : liste_a_trier[i]);
455 liste_a_trier.
suppr(minimum);
458 for (
int i = 0; i < temporaire.
size(); i++)
497 double resultat = 0.;
502 if (numero_som == sommet_voisin)
504 for (
int i = 0; i < elem_voisins.
size(); i++)
518 for (
int i = 0; i < elem_voisins.
size(); i++)
533 Cerr <<
"Erreur Op_Diff_RotRot::remplir_som_som_EF." << finl;
534 Cerr <<
"sommet_voisin n'est pas dans le voisinage de numero_voisin." << finl;
535 Cerr <<
"Sortie du programme." << finl;
547 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
550 for (
int composante = 0; composante <
dimension; composante++)
554 return le_vecteur_normal;
573 DoubleTab resultat(la_matrice.
ordre());
575 DoubleTab secmem(la_matrice.
ordre());
576 DoubleTab secmem1(la_matrice.
ordre());
579 secmem[4] = -0.0833333;
580 secmem[5] = -0.0833333;
581 secmem1 = 1e-10 + 1e-15;
589 Cerr <<
"Resultat de l'inversion" << finl;
590 for (
int i = 0; i < 8; i++)
591 Cerr << resultat[i] <<
" ; ";
595 Cerr <<
"Resultat de l'inversion" << finl;
596 for (
int i = 0; i < 8; i++)
597 Cerr << resultat[i] <<
" ; ";
void associer_domaine_dis_base(const Domaine_dis_base &) override
int fixer_nb_valeurs_nodales(int) override
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
virtual double face_normales(int face, int comp) const
double volumes(int i) const
int oriente_normale(int f, int e) const
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,...
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
void nommer(const Nom &) override
Donne un nom au champ.
virtual const Nom & fixer_unite(const Nom &)
Specifie l'unite d'un champ scalaire ou dont toutes les composantes ont la meme unite.
Lecture dans un fichier au format binaire.
int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::in) override
Ouvre le fichier avec les parametres mode et prot donnes Ces parametres sont les parametres de la met...
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.
int ordre() const override
Renvoie l'ordre de la matrice: - le nombre de lignes si la matrice est carree.
Classe Matrice Classe generique de la hierarchie des matrices.
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.
double remplir_elem_som_EF(const int numero_elem, const int numero_som) const
IntList sommets_voisins(int numero_som, const IntList &liste) const
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
void Tri(IntList &liste_a_trier) const
IntList elements_pour_sommet(int numero_som) const
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &) override
const Domaine_VEF & domaine_vef() const
DoubleTab vecteur_normal(const int face, const int elem) const
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
void associer_diffusivite(const Champ_base &) override
int assembler_matrice(Matrice &)
double remplir_elem_elem_EF(const int numero_elem) const
const Champ_base & diffusivite() const override
Matrice matrice_vorticite_
double remplir_som_som_EF(const int numero_som, const int sommet_voisin, const IntList &) const
OWN_PTR(Champ_Inc_base) vorticite_
double remplir_som_elem_EF(const int numero_elem, const int numero_som) const
IntList sommets_pour_element(int numero_elem) const
int calculer_vorticite(DoubleTab &, const DoubleTab &) const
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static bool is_sequential()
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
int resoudre_systeme(const Matrice_Base &, const DoubleVect &, DoubleVect &) override
Classe de base des flux de sortie.
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.
void vide()
Vide la liste.