16#include <Frontiere_ouverte_temperature_imposee_rayo_semi_transp.h>
17#include <Echange_externe_impose_rayo_semi_transp.h>
18#include <Echange_global_impose_rayo_semi_transp.h>
19#include <Echange_contact_rayo_semi_transp_VDF.h>
20#include <Frontiere_ouverte_rayo_semi_transp.h>
21#include <Neumann_paroi_rayo_semi_transp_VDF.h>
22#include <Rayo_semi_transp_solver_VDF.h>
23#include <Champ_front_uniforme.h>
24#include <Eq_rayo_semi_transp.h>
25#include <Pb_rayo_semi_transp.h>
26#include <Flux_radiatif_VDF.h>
27#include <Champ_Uniforme.h>
28#include <Domaine_VDF.h>
29#include <Domaine_VDF.h>
30#include <Fluide_base.h>
63 const auto& fluide = eq_rayo.
fluide();
69 for (
int num_cl = 0; num_cl < les_cl.size(); num_cl++)
76 const DoubleTab& long_rayo = fluide.longueur_rayo().valeurs();
77 const DoubleTab& kappa = fluide.kappa().valeurs();
78 const double A = cl_radiatif.
A();
80 if (sub_type(
Front_VF, la_cl->frontiere_dis()))
84 const int nfin = ndeb + le_bord.
nb_faces();
86 assert(fluide.longueur_rayo().nb_comp() == 1);
87 assert(fluide.kappa().nb_comp() == 1);
89 for (
int face = ndeb; face < nfin; face++)
91 int elem = face_voisins(face, 0);
94 elem = face_voisins(face, 1);
98 double k = -123., l_r = -123.;
103 l_r = long_rayo(0, 0);
108 l_r = long_rayo(elem, 0);
114 epsi = epsilon(0, 0);
116 epsi = epsilon(face - ndeb, 0);
118 const double numer_coeff = l_r * face_surfaces(face);
119 double denum_coeff = 3 * k * epsi;
121 denum_coeff = 1 / denum_coeff;
122 denum_coeff *= A * (2 - epsi);
123 denum_coeff = denum_coeff + eF;
125 const double coeff = numer_coeff / denum_coeff;
128 if (epsi < DMINFLOAT) { }
130 matrice(elem, elem) += coeff;
135 Cerr <<
"Erreur dans Rayo_semi_transp_solver_VDF::modifier_matrice()" << finl;
136 Cerr <<
"la frontiere associee a la_cl ne derive pas de Front_VF" << finl;
140 else if (sub_type(
Symetrie, la_cl.valeur()))
145 Process::exit(
"La condition a la limite utilisee n'est pas connue pour l'equation de rayonnement !");
155 const auto& fluide = eq_rayo.
fluide();
164 terme_diffusif->contribuer_a_avec(irradi, matrice);
167 const DoubleTab& kappa = fluide.kappa().valeurs();
170 if (matrice.
ordre() != nb_elem_tot)
173 Cerr <<
"Ordre de la matrice OK" << finl;
174 assert(fluide.kappa().nb_comp() == 1);
177 for (
int i = 0; i < matrice.
ordre(); i++)
184 const double vol = domaine_VF.
volumes(i);
186 matrice(i, i) = matrice(i, i) + k * vol;
200 const auto& fluide = eq_rayo.
fluide();
202 const int nb_elem = domaine_VF.
nb_elem();
203 const DoubleTab& kappa = fluide.kappa().valeurs();
219 const DoubleTab& indice = fluide.indice().valeurs();
221 assert(fluide.indice().nb_comp());
222 assert(fluide.kappa().nb_comp() == 1);
224 double n = -123., k = -123.;
225 for (
int elem = 0; elem < nb_elem; elem++)
237 const double vol = domaine_VF.
volumes(elem);
238 const double T = temper(elem);
239 secmem(elem) += +4 * n * n * sigma * pow(T, 4) * k * vol;
245 terme_diffusif->contribuer_au_second_membre(secmem);
247 if (solveur->que_suis_je() ==
"Solv_GCP")
257 Cerr <<
"Erreur dans Rayo_semi_transp_solver_VDF::resoudre() ! On ne peut pas resoudre l'equation" << finl;
258 Cerr <<
"de rayonnement semi transparent avec le solveur : " << solveur->que_suis_je() <<
"car kappa n'est pas constant, donc, la_matrice n'est pas symetrique" << finl;
261 else if (solveur->que_suis_je() ==
"Solv_Gmres")
266 Cerr <<
"Erreur dans Rayo_semi_transp_solver_VDF::resoudre() ! On ne peut pas resoudre un probleme" << finl;
267 Cerr <<
"de rayonnement semi transparent en parallele en utilisant le solveur Solv_Gmres. Si vous traitez" << finl;
268 Cerr <<
"un probleme avec kappa constant, vous contournerez cette limitation en utilisant le solveur GCP avec un preconditionnement GCP" << finl;
273 Cerr <<
"Erreur dans Rayo_semi_transp_solver_VDF::resoudre() ! On ne peut pas utiliser le solveur : " << solveur->que_suis_je() << finl;
274 Cerr <<
"pour resoudre l'equation de rayonnement dans un probleme de rayonnement semi transparent" << finl;
284 const auto& fluide = eq_rayo.
fluide();
293 for (
int num_cl_rayo = 0; num_cl_rayo < les_cl_rayo.size(); num_cl_rayo++)
300 Nom nom_cl_rayo = la_cl_rayo->frontiere_dis().le_nom();
303 int test_remplissage_Tb = 0;
304 for (
int num_cl_temp = 0; num_cl_temp < les_cl_temp.size(); num_cl_temp++)
307 Nom nom_cl_temp = la_cl_temp->frontiere_dis().le_nom();
308 if (nom_cl_temp == nom_cl_rayo)
313 test_remplissage_Tb = 1;
320 test_remplissage_Tb = 1;
327 test_remplissage_Tb = 1;
334 test_remplissage_Tb = 1;
341 test_remplissage_Tb = 1;
348 test_remplissage_Tb = 1;
354 Cerr <<
"Erreur dans Rayo_semi_transp_solver_VDF::evaluer_cl_rayonnement ! Le cas d'une CL thermique " << la_cl_temp->que_suis_je() <<
" n'est pas code" << finl;
361 if (test_remplissage_Tb == 0)
362 Cerr <<
"Rayo_semi_transp_solver_VDF::evaluer_cl_rayonnement -- On n'a pas remplie le tableau des temperatures de bord !!!!" << finl;
367 else if (sub_type(
Symetrie, la_cl_rayo.valeur()))
373 Cerr <<
"La condition a la limite " << la_cl_rayo->que_suis_je() <<
" n'est pas connue pour l'equation de rayonnement !" << finl;
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Champ_front_base Classe de base pour la hierarchie des champs aux frontieres.
virtual DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
static void verifier(const char *const msg, double)
int_t nb_elem_tot() const
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
double dist_norm_bord(int num_face) const override
virtual const DoubleVect & face_surfaces() const
double volumes(int i) const
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
const Domaine & domaine() const
classe Echange_externe_impose_rayo_semi_transp cette classe est utilisee pour imposer une temperature...
Champ_front_base & temperature_bord()
void calculer_temperature_bord(double temps)
classe Echange_global_impose_rayo_semi_transp cette classe est utilisee pour imposer une temperature ...
void calculer_temperature_bord(double temps)
Champ_front_base & temperature_bord()
Class defining operators and methods for all reading operation in an input flow (file,...
const Pb_rayo_semi_transp & pb_rayo_semi_transp() const
Matrice_Morse & matrice_rayo()
void dimensionner_Mat_Bloc_Morse_Sym(Matrice &matrice_tmp)
void Mat_Morse_to_Mat_Bloc(Matrice &matrice_tmp)
SolveurSys & solveur_rayo()
Operateur_Diff & terme_diffusif_rayo()
const Champ_Inc_base & inconnue() const override
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Champ_Inc_base & inconnue() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee 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 int nb_comp() const
void evaluer_cl_rayonnement(Champ_front_base &Tb, const Champ_Don_base &, const Champ_Don_base &, const Champ_Don_base &, const Domaine_VF &, const double, double)
Champ_front_base & emissivite()
int num_premiere_face() const
void calculer_temperature_bord(double temps)
Champ_front_base & temperature_bord()
void calculer_temperature_bord(double temps)
Champ_front_base & temperature_bord()
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
void clean() override
Remplit la matrice avec des zeros.
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.
Champ_front_base & temperature_bord()
void calculer_temperature_bord(double temps)
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.
classe Operateur_Diff Classe generique de la hierarchie des operateurs representant un terme
const double & valeur_sigma() const
Probleme_base & probleme_fluide()
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual const Equation_base & equation(int) const =0
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
int nb_colonnes() override
void evaluer_cl_rayonnement(double temps) override
void modifier_matrice() override
modifie la matrice pour prendre en compte la presence de faces rayonnantes au voisinage des elements ...
void assembler_matrice() override
void resoudre(double temps) override
int nb_colonnes_tot() override
OBS_PTR(Eq_rayo_semi_transp) eq_rayo_semi_transp_
class SolveurSys Un SolveurSys represente n'importe qu'elle classe
int resoudre_systeme(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
Classe de base des flux de sortie.
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes: