16#include <Modele_turbulence_scal_base.h>
17#include <Turbulence_paroi_scal_base.h>
18#include <Schema_Euler_Implicite.h>
19#include <Echange_contact_VDF.h>
20#include <Domaine_Cl_dis_base.h>
21#include <Champ_front_calc.h>
22#include <Champ_Uniforme.h>
23#include <Probleme_base.h>
24#include <Equation_base.h>
25#include <Schema_Comm.h>
26#include <Milieu_base.h>
27#include <Domaine_VDF.h>
46int meme_point2(
const DoubleVect& a,
const DoubleVect& b);
52 if (
app_domains.size() == 0)
app_domains = { Motcle(
"Thermique"), Motcle(
"Neutronique"), Motcle(
"fraction_massique"), Motcle(
"indetermine") };
55 T_autre_pb_.typer(
"Champ_front_calc");
56 le_champ_front.typer(
"Ch_front_var_instationnaire_dep");
108 int nfin = ndeb + nb_faces;
113 const RefObjU& modele_turbulence = une_eqn.
get_modele(TURBULENCE);
121 int boundary_index=-1;
125 for (
int n_bord=0; n_bord<nb_boundaries; n_bord++)
128 boundary_index=n_bord;
130 for (
int ind_face=0; ind_face<nb_faces; ind_face++)
138 for (
int face=ndeb; face<nfin; face++)
148 for (
int face=ndeb; face<nfin; face++)
150 int elem = face_voisins(face,0);
152 elem = face_voisins(face,1);
153 for(i=0; i<nb_comp; i++)
156 tab(face-ndeb,i) = 1./(e(face-ndeb)/lambda(elem,i)+invhparoi);
162 for (
int face=ndeb; face<nfin; face++)
164 for(i=0; i<nb_comp; i++)
183 const RefObjU& modele_turbulence = une_eqn.
get_modele(TURBULENCE);
192 DoubleVect d_equiv_tmp;
210 for (
int face=0; face<nb_faces_raccord1; face++)
211 for(i=0; i<nb_comp; i++)
213 assert(lambda(face,i)!=0.);
214 tab(face,i) = 1./(e(face)/lambda(face,i)+invhparoi);
220 for (
int face=0; face<nb_faces_raccord1; face++)
221 for(i=0; i<nb_comp; i++)
223 assert(lambda(0,i)!=0.);
224 tab(face,i) = 1./(e(face)/lambda(0,i)+invhparoi);
237 calculer_h_local(tab,mon_eqn,ma_zvdf,ma_front_vf,mon_milieu,invhparoi,opt);
254 int nb_faces_raccord1 = domaine_dis1.
domaine().
raccord(nom_racc1)->nb_faces();
258 Cerr <<
"Dans Echange_contact_VDF::calculer_h_autre_pb, tab n'est plus dimensionne." << finl;
259 Cerr <<
"Le dimensionnement est fait dans Echange_contact_VDF::initialiser." << finl;
262 if (domaine_dis1.
domaine().
raccord(nom_racc1)->que_suis_je() ==
"Raccord_distant_homogene")
264 calculer_h_distant(tab,une_eqn,zvdf_2,front_vf,le_milieu,invhparoi,opt,nom_racc2);
268 calculer_h_local(tab,une_eqn,zvdf_2,front_vf,le_milieu,invhparoi,opt);
289 int nb_faces_raccord1 = domaine_dis1.
domaine().
raccord(nom_racc1)->nb_faces();
291 h_imp_.typer(
"Champ_front_fonc");
292 h_imp_->fixer_nb_comp(nb_comp);
293 h_imp_->valeurs().resize(nb_faces_raccord1,nb_comp);
295 if (domaine_dis1.
domaine().
raccord(nom_racc1)->que_suis_je() !=
"Raccord_distant_homogene")
298 autre_h.resize(nb_faces_raccord1,nb_comp);
314 DoubleTrav o_proc, o_item, proc, l_item;
317 for (
int i = 0; i < o_fvf.nb_faces(); i++)
319 int f = o_fvf.num_face(i), e = o_f_e(f, 0) == -1 ? o_f_e(f, 1) : o_f_e(f, 0);
320 o_proc(f) = src(e, 0), o_item(f) = src(e, 1);
324 if (o_fvf.frontiere().que_suis_je() ==
"Raccord_distant_homogene")
325 o_fvf.frontiere().trace_face_distant(o_proc, proc), o_fvf.frontiere().trace_face_distant(o_item, l_item);
326 else o_fvf.frontiere().trace_face_local(o_proc, proc), o_fvf.frontiere().trace_face_local(o_item, l_item);
330 for (
int i = 0; i < fvf.
nb_faces(); i++)
334 item(i) = (int)std::lrint(l_item(i));
337 if (o_domaine.
virt_e_map.count({{ (int) proc(i), (int) l_item(i) }}))
338 item(i) = o_domaine.
virt_e_map.at({{ (int) proc(i), (int) l_item(i) }});
339 else Process::exit(
Nom(
"Echange_contact_VDF : missing element opposite face ") +
Nom(fvf.
num_face(i)) +
" in " + fvf.
le_nom() +
" ! Have you used Decouper_multi?");
356 DoubleTab& mon_h= h_imp_->valeurs();
368 for (
int ii=0; ii<taille; ii++)
369 for (
int jj=0; jj<nb_comp; jj++)
371 mon_h(ii,jj)=1./(1./
autre_h(ii,jj)+1./mon_h(ii,jj));
383 int nb_faces_bord = ma_front_vf.
nb_faces();
384 assert(Teta_eq.
dimension(0)==nb_faces_bord);
387 for (
int numfa=0; numfa<nb_faces_bord; numfa++)
389 Teta_eq(numfa,0) = t_autre(numfa,0);
404 int nb_faces_bord = ma_front_vf.
nb_faces();
406 Teta_p.
resize(nb_faces_bord,1);
408 for (
int numfa=0; numfa<nb_faces_bord; numfa++)
410 ind_fac = numfa+ndeb;
416 Teta_p(numfa,0) = (mon_h(numfa,0)*mon_inco(elem) + lautre_h(numfa,0)*t_autre(numfa,0))/(mon_h(numfa,0)+lautre_h(numfa,0));
430 int nb_faces_bord = ma_front_vf.
nb_faces();
431 int ind_fac,ind_fac_2;
432 const DoubleTab& xv=ma_zvdf.
xv();
433 const DoubleTab& xv2=zvdf_2.
xv();
437 for (
int numfa=0; numfa<nb_faces_bord; numfa++)
439 ind_fac = numfa+ndeb;
440 ind_fac_2=numfa+ndeb2;
443 x1[k] = xv(ind_fac,k);
444 x2[k] = xv2(ind_fac_2,k);
446 if (!meme_point2(x1,x2))
449 Cerr<<
"Correspondence problem: the two 'Raccords' named "<<ma_front_vf.
le_nom() <<
" are not facing."<<finl;
450 Cerr<<
"Problem on the following faces:" << finl;
453 Cerr <<
"Coordinates of the face 1: (" << x1[0] <<
" " << x1[1] <<
") on the domain " << ma_zvdf.
domaine().
le_nom() << finl;
454 Cerr <<
"Coordinates of the face 2: (" << x2[0] <<
" " << x2[1] <<
") on the domain " << zvdf_2.
domaine().
le_nom() << finl;
458 Cerr <<
"Coordinates of the face 1: (" << x1[0] <<
" " << x1[1] << x1[2] <<
") on the domain " << ma_zvdf.
domaine().
le_nom() << finl;
459 Cerr <<
"Coordinates of the face 2: (" << x2[0] <<
" " << x2[1] << x2[2] <<
") on the domain " << zvdf_2.
domaine().
le_nom() << finl;
461 Cerr <<
"\nIn VDF, numbering of faces on each 'Raccord' must be identical (to a constant)." << finl;
462 Cerr <<
"The faces of each sub frontier of the boundary " << ma_front_vf.
le_nom() <<
" must be created in the same order on each domain, this process is sensitive to the reading sense of the faces." << finl;
470int meme_point2(
const DoubleVect& x,
const DoubleVect& y)
473 assert(dim==y.
size());
475 for (
int k=0; k<dim; k++)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual void associer_fr_dis_base(const Frontiere_dis_base &)
Associe une frontiere discretisee au champ.
virtual void changer_temps_futur(double temps, int i)
Change la valeur du temps pour la ieme valeur temporelle apres le present.
virtual DoubleTab & valeurs_au_temps(double temps)=0
virtual void fixer_nb_valeurs_temporelles(int nb_cases)
Appele par Conds_lim::completer Par defaut ne fait rien.
virtual int reculer(double temps)
A implementer dans les classes derivees.
virtual int avancer(double temps)
A implementer dans les classes derivees.
virtual void mettre_a_jour(double temps)
NE FAIT RIEN, a surcharger.
classe Champ_front_calc Classe derivee de Champ_front_var qui represente les
const Frontiere_dis_base & front_dis() const
Renvoie la frontiere discretisee correspondante au domaine sur lequel prend la trace.
void creer(const Nom &, const Nom &, const Motcle &)
Cree l'objet Champ_front_calc representant la trace d'un champ inconnue sur une frontiere a partir de...
const Nom & nom_bord_oppose() const
Renvoie le nom du bord sur lequel on calcule la trace.
int initialiser(double, const Champ_Inc_base &) override
Initialisation en debut de calcul.
const Equation_base & equation() const
Renvoie l'equation associee a l'inconnue dont on prend la trace.
const Domaine_dis_base & domaine_dis() const override
Renvoie le domaine discretise associe a l'equation qui porte le champ inconnue dont on prend la trace...
const Milieu_base & milieu() const
Renvoie le milieu associe a l'equation qui porte le champ inconnue dont on prend la trace.
virtual void changer_temps_futur(double temps, int i)
Change le i-eme temps futur de la CL.
virtual int avancer(double temps)
Tourne la roue de la CL.
Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limites discretisee dont l'objet fait partie.
virtual int reculer(double temps)
Tourne la roue de la CL.
std::vector< Motcle > app_domains
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
Raccord_t & raccord(int i)
virtual const MD_Vector & md_vector_elements() const
renvoie le descripteur parallele des tableaux aux elements du domaine
Domaine_dis_base & domaine_dis()
Renvoie une reference sur le domaine discretise associe aux conditions aux limites.
std::map< std::array< int, 2 >, int > virt_e_map
void init_virt_e_map() const
double dist_norm_bord(int num_face) const override
void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
double xv(int num_face, int k) const
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
const Front_VF & front_VF(int i) const
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Classe Echange_global_impose Cette classe represente le cas particulier de la classe.
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps de la condition aux limites.
void completer() override
NE FAIT RIEN A surcharger dans les classes derivees.
int initialiser(double temps) override
Initialisation en debut de calcul.
virtual Champ_front_base & T_ext()
Renvoie le champ T_ext de temperature imposee a la frontiere.
Class defining operators and methods for all reading operation in an input flow (file,...
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 RefObjU & get_modele(Type_modele type) const
virtual const Champ_Inc_base & inconnue() const =0
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual const Motcle & domaine_application() const
Renvoie "indetermine" Navier_Stokes_standard par exemple surcharge cette methode.
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
virtual int nb_comp() const
int num_premiere_face() const
int num_face(const int) const
virtual void trace_elem_distant(const DoubleTab &, DoubleTab &) const
virtual void trace_face_distant(const DoubleTab &, DoubleTab &) const
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
Cree un tableau ayant une "ligne" par face de cette frontiere Voir MD_Vector_tools::creer_tableau_dis...
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
virtual const Champ_Don_base & conductivite() const
Renvoie la conductivite du milieu.
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une equation ...
const Turbulence_paroi_scal_base & loi_paroi() const
Renvoie la loi de turbulence sur la paroi (version const).
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
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.
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.
virtual int nb_valeurs_temporelles() const =0
Classe de base des flux de sortie.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
_SIZE_ dimension(int d) const
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")
const Objet_U & valeur() const
Classe Turbulence_paroi_scal_base Classe de base pour la hierarchie des classes representant les mode...
virtual bool use_equivalent_distance() const
Give a boolean indicating if we need to use equivant distance by default we consider that we use the ...
virtual DoubleVect & equivalent_distance_name(DoubleVect &d_eq, const Nom &nom_bord) const =0
const DoubleVects & equivalent_distance() const