16#include <Domaine_Cl_EF.h>
17#include <Domaine_EF.h>
19#include <Dirichlet_homogene.h>
22#include <Neumann_homogene.h>
23#include <Periodique.h>
25#include <Champ_P1_EF.h>
30#include <Equation_base.h>
31#include <Champ_front_txyz.h>
32#include <Champ_front_softanalytique.h>
33#include <Static_Int_Lists.h>
34#include <Probleme_base.h>
35#include <Discretisation_base.h>
36#include <Matrice_Morse.h>
37#include <Dirichlet_paroi_fixe_iso_Genepi2.h>
38#include <Champ_Don_base.h>
64 Cerr <<
"Domaine_Cl_EF::completer() prend comme argument un Domaine_EF " << finl;
68void construit_connectivite_sommet(
int type_cl,Static_Int_Lists& som_face_bord,
const Conds_lim& les_conditions_limites_,
const Domaine_EF& domaine_EF)
73 ArrOfInt face_bords(nb_faces_tot);
75 for(
int i=0; i<les_conditions_limites_.size(); i++)
77 const Cond_lim_base& la_cl=les_conditions_limites_[i].valeur();
83 for (
int ind_face=0; ind_face<num2; ind_face++)
86 face_bords[compt++]=face;
90 face_bords.resize_array(compt);
91 ArrOfInt is_sommet_sur_bord(domaine_EF.
nb_som_tot());
93 int nb_som_face=face_sommets.
dimension(1);
94 for (
int fac=0; fac<compt; fac++)
96 int face=face_bords[fac];
97 for (
int som=0; som<nb_som_face; som++)
99 int sommet=face_sommets(face,som);
100 is_sommet_sur_bord[sommet]++;
111 is_sommet_sur_bord=0;
112 for (
int fac=0; fac<compt; fac++)
114 int face=face_bords[fac];
115 for (
int som=0; som<nb_som_face; som++)
117 int sommet=face_sommets(face,som);
118 int n=(is_sommet_sur_bord[sommet])++;
126static void construire_normale_locale_face(
const DoubleTab& face_normales,
127 const IntTab& faces_sommets,
128 const DoubleTab& coord_sommets,
133 ArrOfDouble& normale_locale)
135 for (
int d = 0; d < dimension; d++)
136 normale_locale[d] = face_normales(face, d);
138 if (!(is_bidim_axi && norme_array(normale_locale) < 1e-12))
141 for (
int d = 0; d < dimension; d++)
142 normale_locale[d] = 0.;
144 const int som0 = faces_sommets(face, 0);
145 const int som1 = faces_sommets(face, 1);
146 const double dx = coord_sommets(som1, 0) - coord_sommets(som0, 0);
147 const double dy = coord_sommets(som1, 1) - coord_sommets(som0, 1);
148 normale_locale[0] = -dy;
149 normale_locale[1] = dx;
157 const Domaine& z = le_dom_EF.
domaine();
160 int nb_som_face=faces_sommets.
dimension(1);
165 IntTab titi(nb_som_tot);
175 for (
int ind_face=0; ind_face<num2; ind_face++)
177 int face=le_bord.
num_face(ind_face);
178 for (
int s=0; s<nb_som_face; s++)
180 int som=faces_sommets(face,s);
191 else if ( (sub_type(
Symetrie,la_cl)))
193 for (
int ind_face=0; ind_face<num2; ind_face++)
195 int face=le_bord.
num_face(ind_face);
196 for (
int s=0; s<nb_som_face; s++)
198 int som=faces_sommets(face,s);
208 for (
int ind_face=0; ind_face<num2; ind_face++)
210 int face=le_bord.
num_face(ind_face);
211 for (
int s=0; s<nb_som_face; s++)
213 int som=faces_sommets(face,s);
221 Cerr<<__FILE__<<
":" <<(int)__LINE__<<
" non code pour cette cl "<<la_cl.
que_suis_je()<<finl;
226 for (
int som=0; som<nb_som_tot; som++)
239 Static_Int_Lists sommet_face_symetrie;
245 for (
int som=0; som<nb_som_tot; som++)
256 for (
int f=0; f<nbf; f++)
258 int face=sommet_face_symetrie(som,f);
259 construire_normale_locale_face(face_normales, faces_sommets, coord_sommets, face,
dimension, nb_som_face,
bidim_axi, normale_locale);
261 n[d]+=normale_locale[d];
265 double norm_n=norme_array(n);
268 normales_symetrie_->valeurs()(som,d)=n[d];
271 for (
int f=0; f<nbf; f++)
273 int face=sommet_face_symetrie(som,f);
274 construire_normale_locale_face(face_normales, faces_sommets, coord_sommets, face,
dimension, nb_som_face,
bidim_axi, normale_locale);
277 prod+=normale_locale[d]*n[d];
284 t1[d]=normale_locale[d]-n[d]*prod;
285 s+=normale_locale[d]*normale_locale[d];
290 if (norme_array(t1)>(1e-4*sqrt(s)))
294 if (std::fabs(min_array(t1))>max_array(t1))
307 for (
int f=0; f<nbf; f++)
309 int face=sommet_face_symetrie(som,f);
310 construire_normale_locale_face(face_normales, faces_sommets, coord_sommets, face,
dimension, nb_som_face,
bidim_axi, normale_locale);
311 double prod=0,prod1=0,s=0;
314 prod+=normale_locale[d]*n[d];
316 prod1+=normale_locale[d]*t1[d];
317 s+=normale_locale[d]*normale_locale[d];
321 t2[d]=normale_locale[d]-n[d]*prod-t1[d]*prod1;
323 if (norme_array(t2)>(1e-4*sqrt(s)))
326 if (std::fabs(min_array(t2))>max_array(t2))
329 Cerr<<face<<
" "<<nbf<<
" sommet "<<som<<
" "<<norme_array(t2)/s<<
" on doit annuler une troiseme direction"<<t2[0] <<
" " <<t2[1]<<
" "<<t2[2]<<finl;
330 Cerr<<som<<
" "<<t1[0] <<
" " <<t1[1]<<
" "<<t1[2]<<finl;
331 Cerr<<som<<
" "<<n[0] <<
" " <<n[1]<<
" "<<n[2]<<finl;
342 normales_symetrie_->valeurs().echange_espace_virtuel();
362 const DoubleTab& n =normales_symetrie_->valeurs();
366 for (
int som=0; som<nb_som_tot; som++)
369 for (
int dir=0; dir<dirmax; dir++)
374 prod+=values(som,d)*nn(som,d);
376 values(som,d)-=prod*nn(som,d);
384 int nb_som_face=faces_sommets.
dimension(1);
387 const DoubleTab& n =normales_symetrie_->valeurs();
394 for (
int n_bord=0; n_bord<nbcond; n_bord++)
402 if (sub_type(
Symetrie,la_cl)&&(a_exclure.
rang(nom_bord)>-1))
404 Cerr<<__FILE__<<(int)__LINE__<<
" on impose pas symetrie sur "<<nom_bord<<finl;
405 for (
int ind_face=0; ind_face<num2; ind_face++)
407 int face=le_bord.
num_face(ind_face);
408 for (
int s=0; s<nb_som_face; s++)
410 int som=faces_sommets(face,s);
411 type_sommet_bis[som]=3;
417 for (
int n_bord=0; n_bord<nbcond; n_bord++)
425 if (sub_type(
Symetrie,la_cl)&&(a_exclure.
rang(nom_bord)<0))
427 Cerr<<__FILE__<<(int)__LINE__<<
" on impose symetrie sur "<<nom_bord<<finl;
428 for (
int ind_face=0; ind_face<num2; ind_face++)
430 int face=le_bord.
num_face(ind_face);
431 for (
int s=0; s<nb_som_face; s++)
433 int som=faces_sommets(face,s);
434 if ( type_sommet_bis[som]==1)
436 for (
int dir=0; dir<dirmax; dir++)
441 prod+=values(som,d)*nn(som,d);
443 values(som,d)-=prod*nn(som,d);
457 const DoubleTab& n =normales_symetrie_->valeurs();
463 for (
int dir=0; dir<dirmax; dir++)
468 prod+=grad[d]*nn(som,d);
470 grad_mod[d]+=prod*nn(som,d);
487 const DoubleTab& n =normales_symetrie_->valeurs();
491 const auto& tab1 = la_matrice.
get_tab1();
492 const auto& tab2 = la_matrice.
get_tab2();
497 for (
int som=0; som<nb_som; som++)
500 for (
int dir=0; dir<dirmax; dir++)
503 for (
int d=0; d<
dimension; d++) normale[d]=nn(som,d);
505 auto nb_coeff_ligne=tab1[som*nb_comp+1] - tab1[som*nb_comp];
506 for (
int k=0; k<nb_coeff_ligne; k++)
508 for (
int comp=0; comp<nb_comp; comp++)
510 int j=tab2[tab1[som*nb_comp+comp]-1+k]-1;
514 const double coef_ij=la_matrice(som*nb_comp+comp,j);
516 int comp2=j-som2*nb_comp;
517 secmem(som,comp)-=coef_ij*champ_inconnue(som2,comp2);
522 for (
int comp=0; comp<nb_comp; comp++)
523 somme_b+=secmem(som,comp)*normale[comp];
526 for (
int comp=0; comp<nb_comp; comp++)
527 secmem(som,comp)-=somme_b*normale[comp];
533 for (
int comp=0; comp<nb_comp; comp++)
536 int j0=som*nb_comp+comp;
537 ref+=la_matrice.
coef(j0,j0);
541 for (
int comp=0; comp<nb_comp; comp++)
543 int j0=som*nb_comp+comp;
544 double rap=ref/la_matrice.
coef(j0,j0);
546 for (
int k=0; k<nb_coeff_ligne; k++)
549 int j=tab2[tab1[j0]-1+k]-1;
550 la_matrice(j0,j)*=rap;
552 assert(est_egal(la_matrice(j0,j0),ref));
560 const double tol = 1e-12;
561 for (
int k=0; k<nb_coeff_ligne; k++)
564 for (
int comp=0; comp<nb_comp; comp++)
565 if (std::fabs(normale[comp])>tol)
567 int j=tab2[tab1[som*nb_comp+comp]-1+k]-1;
568 if (j!=(som*nb_comp+comp))
569 if ((j>=(som*nb_comp))&&(j<(som*nb_comp+nb_comp)))
571 la_matrice(som*nb_comp+comp,j)=0;
579 ArrOfDouble somme((
int)nb_coeff_ligne);
580 for (
int k=0; k<nb_coeff_ligne; k++)
583 int j=tab2[tab1[som*nb_comp]-1+k]-1;
584 for (
int comp=0; comp<nb_comp; comp++)
585 somme[k]+=la_matrice(som*nb_comp+comp,j)*normale[comp];
588 for (
int k=0; k<nb_coeff_ligne; k++)
591 int j=tab2[tab1[som*nb_comp]-1+k]-1;
592 for (
int comp=0; comp<nb_comp; comp++)
593 if ((j<(som*nb_comp))||(j>=(som*nb_comp+nb_comp)))
594 la_matrice(som*nb_comp+comp,j)-=(somme[k])*normale[comp];
598 for (
int k=0; k<nb_coeff_ligne; k++)
600 for (
int comp=0; comp<nb_comp; comp++)
602 int j=tab2[tab1[som*nb_comp+comp]-1+k]-1;
604 int comp2=j-som2*nb_comp;
606 const double coef_ij=la_matrice(som*nb_comp+comp,j);
607 secmem(som,comp)+=coef_ij*champ_inconnue(som2,comp2);
615 for (
int comp=0; comp<nb_comp; comp++)
616 somme_b2+=secmem(som,comp)*normale[comp];
618 if (std::fabs(somme_b2) >= 1e-8)
619 Cerr <<
"Domaine_Cl_EF::imposer_symetrie_matrice_secmem: secmem.n != 0 ("
620 << somme_b2 <<
") au sommet " << som <<
", projection appliquee." << finl;
622 for (
int comp=0; comp<nb_comp; comp++)
623 secmem(som,comp)-=somme_b2*normale[comp];
636 DoubleTab& ch_tab = ch.
valeurs(temps);
640 int nb_som_face=faces_sommets.
dimension(1);
657 for (
int ind_face=0; ind_face<num2; ind_face++)
659 int face=le_bord.
num_face(ind_face);
660 for (
int s=0; s<nb_som_face; s++)
662 int som=faces_sommets(face,s);
669 for (
int ncomp=0; ncomp<nb_comp; ncomp++)
690 int avec_valeur_aux_sommets=0;
697 if (avec_valeur_aux_sommets)
700 for (
int ind_face=0; ind_face<num2; ind_face++)
702 int face=le_bord.
num_face(ind_face);
703 for (
int s=0; s<nb_som_face; s++)
705 int som=faces_sommets(face,s);
717 for (
int ncomp=0; ncomp<nb_comp; ncomp++)
723 for (
int ind_face=0; ind_face<num2; ind_face++)
725 int face=le_bord.
num_face(ind_face);
726 for (
int s=0; s<nb_som_face; s++)
728 int som=faces_sommets(face,s);
735 for (
int ncomp=0; ncomp<nb_comp; ncomp++)
762 else if ( (sub_type(
Symetrie,la_cl) ) &&
809 Cerr<<
" La periodicite n'est pas codee !!!"<<finl;
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Champ_front_softanalytique Classe derivee de Champ_front_var qui represente les
classe Champ_front_var_instationnaire Classe derivee de Champ_front_var qui represente les champs aux
virtual int valeur_au_temps_et_au_point_disponible() const
virtual double valeur_au_temps_et_au_point(double temps, int som, double x, double y, double z, int comp) 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 Conds_lim Cette classe represente un vecteur de conditions aux limites.
Classe Dirichlet_homogene Cette classe est la classe de base de la hierarchie des conditions aux limi...
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
virtual double val_imp_au_temps(double temps, int i) const
Renvoie la valeur imposee sur la i-eme composante du champ a la frontiere au temps precise.
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
const DoubleTab_t & coord_sommets() const
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.
void remplir_type_elem_Cl(const Domaine_EF &)
appele par remplir_volumes_entrelaces_Cl() : remplissage de type_elem_Cl_
Domaine_EF & domaine_EF()
int initialiser(double temps) override
Initialise les CLs Contrairement aux methodes mettre_a_jour, les methodes.
void imposer_symetrie(DoubleTab &, int tous_les_sommets_sym=0) const
Impose les conditions de symetrie c.
int nb_bord_periodicite() const
void modifie_gradient(ArrOfDouble &grad_mod, const ArrOfDouble &grad, int num_som) const
void imposer_symetrie_partiellement(DoubleTab &, const Noms &) const
void imposer_symetrie_matrice_secmem(Matrice_Morse &la_matrice, DoubleTab &secmem) const
On transforme la_matrice et le secmem pour avoir un secmem normal aux bords , plus la matrice pour as...
void imposer_cond_lim(Champ_Inc_base &, double) override
Impose les conditions aux limites a la valeur temporelle "temps" du Champ_Inc.
int nb_faces_sortie_libre() const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
virtual int initialiser(double temps)
Initialise les CLs Contrairement aux methodes mettre_a_jour, les methodes.
virtual const Champ_Inc_base & inconnue() const
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
void completer()
Appel Cond_lim_base::completer() sur chaque condition aux limites.
Conds_lim & les_conditions_limites()
Renvoie le tableaux des conditions aux limites.
Domaine_dis_base & domaine_dis()
Renvoie une reference sur le domaine discretise associe aux conditions aux limites.
Conds_lim les_conditions_limites_
int nb_faces_tot() const
renvoie le nombre total de faces.
virtual double face_normales(int face, int comp) const
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
const Front_VF & front_VF(int i) 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 const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
virtual int nb_comp() const
virtual Nature_du_champ nature_du_champ() const
int num_face(const int) const
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const auto & get_tab2() const
const auto & get_tab1() const
double coef(int i, int j) const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Classe Neumann_homogene Cette classe est la classe de base de la hierarchie des conditions aux limite...
Classe Neumann Cette classe est la classe de base de la hierarchie des conditions aux limites de type...
class Nom Une chaine de caractere pour nommer les objets de TRUST
Un tableau de chaine de caracteres (VECT(Nom)).
int rang(const char *const ch) const
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.
const Discretisation_base & discretisation() const
Renvoie la discretisation associee au probleme.
static void abort()
Routine de sortie de Trio-U sur une erreur abort().
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
void set_value(int_t i_liste, int_t i_element, int_t valeur)
affecte la "valeur" au j-ieme element de la i-ieme liste avec 0 <= i < get_nb_lists() et 0 <= j < get...
int_t get_list_size(int_t i_liste) const
renvoie le nombre d'elements de la liste i
void set_list_sizes(const ArrOfInt_t &sizes)
detruit les listes existantes et en cree de nouvelles.
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
_SIZE_ size_array() const
_SIZE_ dimension_tot(int) const override
_SIZE_ dimension(int d) const