16#include <Op_EF_base.h>
17#include <Domaine_EF.h>
18#include <Domaine_Cl_EF.h>
20#include <Dirichlet_homogene.h>
22#include <Matrice_Morse.h>
23#include <Equation_base.h>
27#include <Probleme_base.h>
29#include <Champ_Uniforme.h>
30#include <Schema_Temps_base.h>
31#include <Milieu_base.h>
32#include <Operateur_base.h>
33#include <Operateur_Diff_base.h>
34#include <EcrFicPartage.h>
35#include <Array_tools.h>
36#include <Echange_interne_global_impose.h>
37#include <Echange_interne_global_parfait.h>
38#include <Champ_front_calc_interne.h>
71 int nb_som=le_dom.
nb_som();
88 int extra_nb_coeff = 0;
97 Cerr <<
"Boundary condition 'Echange_interne_global_impose' or 'Echange_interne_parfait' is not validated for EF and mesh_dim > 1 (i.e. sth other than a wire mesh)!!" << finl;
107 int nb_coeff=(int)(nb_elem_tot*(nb_som_elem*(nb_som_elem)))+extra_nb_coeff;
109 IntTab Indice(nb_coeff,2);
111 for (
int elem=0; elem<nb_elem_tot; elem++)
113 for (
int i1=0; i1<nb_som_elem; i1++)
115 int glob=elems(elem,i1);
116 for (
int i2=0; i2<nb_som_elem; i2++)
118 int glob2=elems(elem,i2);
140 int nfacefin = nfacedeb + le_bord.
nb_faces();
141 std::vector<bool> hit(le_bord.
nb_faces());
142 std::fill(hit.begin(), hit.end(),
false);
143 for(
int face_recto=nfacedeb; face_recto < nfacefin; face_recto++)
145 int face_verso = mp(face_recto-nfacedeb)+nfacedeb;
152 int elem = (elem1 != -1) ? elem1 : le_dom.
face_voisins(face_verso, 1);
155 face_plus_2 = f1 != face_verso ? f1 : le_dom.
elem_faces(elem, 1);
159 for(
int som_idx=0; som_idx < nb_som_face; som_idx++)
161 int som_recto = le_dom.
face_sommets(face_recto, som_idx);
162 for(
int som_idx2=0; som_idx2 < nb_som_face; som_idx2++)
164 int som_verso = le_dom.
face_sommets(face_verso, som_idx2);
167 Indice(tot, 0) = som_recto;
168 Indice(tot, 1) = som_verso;
174 int som_plus_2 = le_dom.
face_sommets(face_plus_2, som_idx2);
175 if(!hit[face_recto-nfacedeb])
177 Indice(tot, 0) = som_recto;
178 Indice(tot, 1) = som_plus_2;
188 hit[face_recto-nfacedeb] =
true;
189 hit[face_verso-nfacedeb] =
true;
196 tableau_trier_retirer_doublons(Indice);
203 IntTab Indice_v(ntot*nb_comp*nb_comp,2);
205 for (
int cas=0; cas<ntot; cas++)
207 for (
int i=0; i<nb_comp; i++)
208 for (
int j=0; j<nb_comp; j++)
210 int newi=Indice(cas,0)*nb_comp+i;
211 int newj=Indice(cas,1)*nb_comp+j;
212 Indice_v(newcas,0)=newi;
213 Indice_v(newcas,1)=newj;
218 tableau_trier_retirer_doublons(Indice_v);
234 Cerr<<
"ici "<<tot <<
" "<< nb_coeff<<finl;
235 Cerr<<
"Indice"<<Indice<<finl;
257 const auto& tab1 = la_matrice.
get_tab1();
263 int nb_comp = champ_inconnue.
line_size();
266 int nb_som_face=faces_sommets.
dimension(1);
269 for (
const auto& itr : les_cl)
277 for (
int ind_face=0; ind_face < nfaces; ind_face++)
278 for (
int s=0; s<nb_som_face; s++)
280 int face=le_bord.
num_face(ind_face);
281 int som=faces_sommets(face,s);
283 for (
int comp=0; comp<nb_comp; comp++)
285 int m=som*nb_comp+comp;
286 auto idiag = tab1[som*nb_comp+comp]-1;
287 auto nbvois = tab1[som*nb_comp+1+comp] - tab1[som*nb_comp+comp];
288 for (
auto k=0; k < nbvois; k++)
290 la_matrice.
coef(m,m)=1;
291 assert(la_matrice.
coef(som*nb_comp+comp,som*nb_comp+comp)==1);
295 secmem(som,comp)= la_cl_Dirichlet.
val_imp(ind_face,comp);
296 secmem(som,comp)= champ_inconnue(som,comp);
303 for (
int ind_face=0; ind_face < nfaces; ind_face++)
304 for (
int s=0; s<nb_som_face; s++)
306 int face=le_bord.
num_face(ind_face);
307 int som=faces_sommets(face,s);
309 for (
int comp=0; comp<nb_comp; comp++)
311 int m=som*nb_comp+comp;
312 auto idiag = tab1[som*nb_comp+comp]-1;
313 auto nbvois = tab1[som*nb_comp+1+comp] - tab1[som*nb_comp+comp];
314 for (
auto k=0; k < nbvois; k++)
316 la_matrice.
coef(m,m)=1;
317 assert(la_matrice.
coef(som*nb_comp+comp,som*nb_comp+comp)==1);
322 if (la_cl_Dirichlet.
val_imp(ind_face,comp)!=0)
324 Cerr<<
"impossible non ??? "<<finl;
331 if (sub_type(
Symetrie,la_cl.valeur()))
359 controle_modifier_flux_=1;
372 double coef = rho.
valeurs()(0,0);
374 for (
int face=0; face<nb_faces_bord; face++)
375 for(
int k=0; k<nb_compo; k++)
376 flux_bords_(face,k) *= coef;
389 if (flux_bords_.
nb_dim()!=2)
391 Cout <<
"L'impression des flux n'est pas codee pour l'operateur " << op.
que_suis_je() << finl;
394 if (controle_modifier_flux_==0)
396 Cerr<<op.
que_suis_je()<<
" appelle Op_EF_base::impr sans avoir appeler Op_EF_base::modifier_flux, on arrete tout "<<finl;
408 const int impr_sum=(le_dom_EF.
domaine().bords_a_imprimer_sum().est_vide() ? 0:1);
409 const int impr_bord=(le_dom_EF.
domaine().bords_a_imprimer().est_vide() ? 0:1);
424 if (impr_mom) Flux_moment.add_col(temps);
425 if (impr_sum) Flux_sum.add_col(temps);
431 DoubleVect moment(nb_compo);
435 DoubleVect flux_bord(nb_compo);
436 DoubleVect bilan(nb_compo);
438 for (
int num_cl=0; num_cl<le_dom_EF.
nb_front_Cl(); num_cl++)
445 int nfin = ndeb + frontiere_dis.
nb_faces();
446 for (
int face=ndeb; face<nfin; face++)
448 for(
int k=0; k<nb_compo; k++)
449 flux_bord(k)+=flux_bords_(face, k);
455 moment(0)+=flux_bords_(face,1)*xgr(face,0)-flux_bords_(face,0)*xgr(face,1);
458 moment(0)+=flux_bords_(face,2)*xgr(face,1)-flux_bords_(face,1)*xgr(face,2);
459 moment(1)+=flux_bords_(face,0)*xgr(face,2)-flux_bords_(face,2)*xgr(face,0);
460 moment(2)+=flux_bords_(face,1)*xgr(face,0)-flux_bords_(face,0)*xgr(face,1);
466 for(
int k=0; k<nb_compo; k++)
475 for(
int k=0; k<nb_compo; k++)
477 Flux.add_col(flux_bord(k));
478 if (impr_mom) Flux_moment.add_col(moment(k));
479 if (le_dom_EF.
domaine().bords_a_imprimer_sum().contient(la_fr.
le_nom())) Flux_sum.add_col(flux_bord(k));
482 bilan(k)+=flux_bord(k);
490 for(
int k=0; k<nb_compo; k++)
491 Flux.add_col(bilan(k));
494 if (impr_mom) Flux_moment << finl;
495 if (impr_sum) Flux_sum << finl;
499 for (
int num_cl=0; num_cl<le_dom_EF.
nb_front_Cl(); num_cl++)
505 int nfin = ndeb + frontiere_dis.
nb_faces();
507 if (le_dom_EF.
domaine().bords_a_imprimer().contient(la_fr.
le_nom()))
509 Flux_face <<
"# Flux par face sur " << la_fr.
le_nom() <<
" au temps " << temps <<
" : " << finl;
510 const DoubleTab& xv=le_dom_EF.
xv();
511 for (
int face=ndeb; face<nfin; face++)
514 Flux_face <<
"# Face a x= " << xv(face,0) <<
" y= " << xv(face,1) <<
" flux=" ;
516 Flux_face <<
"# Face a x= " << xv(face,0) <<
" y= " << xv(face,1) <<
" z= " << xv(face,2) <<
" flux=" ;
517 for(
int k=0; k<nb_compo; k++)
518 Flux_face <<
" " << flux_bords_(face, k);
530 if (marqueur_elem_.size_array()==0)
532 else if (marqueur_elem_[elem]==1)
539 if (eqn.
has_champ(
"marqueur_loi_de_paroi"))
543 marqueur_elem_.resize_array(ntot);
544 for (
int n = 0; n < ntot; n++)
546 marqueur_elem_[n] = 1;
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Champ_front_calc_interne Classe derivee de Champ_front_calc qui represente
const IntVect & face_map() 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.
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_homogene Cette classe est la classe de base de la hierarchie des conditions aux limi...
double val_imp(int i) const
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
virtual double val_imp(int i) const
Renvoie la valeur imposee sur la i-eme composante du champ a la frontiere au temps par defaut du cham...
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
int_t nb_elem_tot() 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...
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
double xv(int num_face, int k) const
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
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
DoubleTab calculer_xgr() const
calcul le tableau xgr pour le calcul des moments des forces aux bords :
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
int nb_faces_bord() const
renvoie le nombre de faces sur lesquelles sont appliquees les conditions limites :
int moments_a_imprimer() const
const Domaine & domaine() const
virtual double T_ext(int num) const
Renvoie la valeur de la temperature imposee sur la i-eme composante du champ de frontiere.
Classe Echange_interne_global_impose: Cette classe represente le cas particulier de la classe.
Classe Echange_interne_global_parfait Cette classe represente le cas particulier d'un echange interne...
Sortie & syncfile() override
Provoque l'ecriture sur disque des donnees accumulees sur les differents processeurs depuis le dernie...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
const Champ_base & get_champ(const Motcle &nom) const override
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
virtual Nature_du_champ nature_du_champ() const
int num_premiere_face() const
int num_face(const int) const
classe Frontiere_dis_base Classe representant une frontiere discretisee.
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
Sortie & imprimer_formatte(Sortie &s) const override
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
const auto & get_tab1() const
double coef(int i, int j) const
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
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
virtual int debute_par(const char *const n) const
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
void dimensionner(const Domaine_EF &, const Domaine_Cl_EF &, Matrice_Morse &) const
Dimensionnement de la matrice qui devra recevoir les coefficients provenant de la convection,...
void marque_elem(const Equation_base &eqn)
Matrice_Morse matrice_sto_
int impr(Sortie &, const Operateur_base &) const
Impression des flux d'un operateur EF aux faces (ie: diffusion, convection).
int elem_contribue(const int elem) const
void modifier_pour_Cl(const Domaine_EF &, const Domaine_Cl_EF &, Matrice_Morse &, DoubleTab &) const
Modification des coef de la matrice et du second membre pour les conditions de Dirichlet.
void modifier_flux(const Operateur_base &) const
multiplie le flux bordpar rho cp ou rho si necessaire
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
classe Operateur_base Classe est la base de la hierarchie des objets representant un
void ouvrir_fichier_partage(EcrFicPartage &, const Nom &, const int flag=1) const
Ouverture/creation d'un fichier d'impression d'un operateur A surcharger dans les classes derivees.
void ouvrir_fichier(SFichier &os, const Nom &, const int flag=1) const
Ouverture/creation d'un fichier d'impression d'un operateur A surcharger dans les classes derivees.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual const Milieu_base & milieu() const
Renvoie le milieu physique associe au probleme.
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
double temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
_SIZE_ size_array() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
_SIZE_ dimension(int d) const