16#include <Frontiere_ouverte_temperature_imposee_rayo_semi_transp.h>
17#include <Temperature_imposee_paroi_rayo_semi_transp.h>
18#include <Frontiere_ouverte_rayo_semi_transp.h>
19#include <Neumann_paroi_rayo_semi_transp_VEF.h>
20#include <Rayo_semi_transp_solver_VEF.h>
21#include <Champ_front_uniforme.h>
22#include <Eq_rayo_semi_transp.h>
23#include <Pb_rayo_semi_transp.h>
24#include <Flux_radiatif_VEF.h>
25#include <Champ_Uniforme.h>
26#include <Domaine_Cl_VEF.h>
27#include <Domaine_VEF.h>
28#include <Fluide_base.h>
66 for (
int num_cl = 0; num_cl < les_cl.size(); num_cl++)
73 double A = cl_radiatif.
A();
75 if (sub_type(
Front_VF, la_cl->frontiere_dis()))
80 const int nfin = ndeb + le_bord.
nb_faces();
81 for (
int face = ndeb; face < nfin; face++)
83 int elem = face_voisins(face, 0);
85 elem = face_voisins(face, 1);
91 epsi = epsilon(face - ndeb, 0);
95 surface += (face_normales(face, i) * face_normales(face, i));
97 surface = sqrt(surface);
99 double coeff = epsi * surface;
100 coeff /= A * (2 - epsi);
103 matrice(face, face) += coeff;
108 Cerr <<
"Erreur dans Rayo_semi_transp_solver_VEF::modifier_matrice()" << finl;
109 Cerr <<
"la frontiere associee a la_cl ne derive pas de Front_VF" << finl;
113 else if (sub_type(
Symetrie, la_cl.valeur()))
118 Process::exit(
"La condition a la limite utilisee n'est pas connue pour l'equation de rayonnement !");
128 const auto& fluide = eq_rayo.
fluide();
137 terme_diffusif->contribuer_a_avec(irradi, matrice);
140 const DoubleTab& kappa = fluide.kappa().valeurs();
146 Cerr <<
"Ordre de la matrice OK" << finl;
147 assert(fluide.kappa().nb_comp() == 1);
150 for (
int i = 0; i < matrice.
ordre(); i++)
157 double vol = volumes_entrelaces(i);
158 matrice(i, i) = matrice(i, i) + k * vol;
172 const auto& fluide = eq_rayo.
fluide();
175 const int nb_faces = domaine_VF.
nb_faces();
192 const DoubleTab& indice = fluide.indice().valeurs();
193 const DoubleTab& kappa = fluide.kappa().valeurs();
195 assert(fluide.indice().nb_comp() == 1);
196 assert(fluide.kappa().nb_comp() == 1);
198 double n = -123., k = -123.;
199 for (
int face = 0; face < nb_faces; face++)
211 double vol = volumes_entrelaces(face);
212 double T = temper(face);
213 secmem(face) += +4 * n * n * sigma * pow(T, 4) * k * vol;
219 terme_diffusif->contribuer_au_second_membre(secmem);
222 if (solveur->que_suis_je() ==
"Solv_GCP")
232 Cerr <<
"Erreur dans Rayo_semi_transp_solver_VEF::resoudre() ! On ne peut pas resoudre l'equation" << finl;
233 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;
236 else if (solveur->que_suis_je() ==
"Solv_Gmres")
241 Cerr <<
"Erreur dans Rayo_semi_transp_solver_VEF::resoudre() ! On ne peut pas resoudre un probleme" << finl;
242 Cerr <<
"de rayonnement semi transparent en parallele en utilisant le solveur Solv_Gmres. Si vous traitez" << finl;
243 Cerr <<
"un probleme avec kappa constant, vous contournerez cette limitation en utilisant le solveur GCP avec un preconditionnement GCP" << finl;
248 Cerr <<
"Erreur dans Rayo_semi_transp_solver_VEF::resoudre() ! On ne peut pas utiliser le solveur : " << solveur->que_suis_je() << finl;
249 Cerr <<
"pour resoudre l'equation de rayonnement dans un probleme de rayonnement semi transparent" << finl;
259 const auto& fluide = eq_rayo.
fluide();
268 for (
int num_cl_rayo = 0; num_cl_rayo < les_cl_rayo.size(); num_cl_rayo++)
275 Nom nom_cl_rayo = la_cl_rayo->frontiere_dis().le_nom();
278 int test_remplissage_Tb = 0;
279 for (
int num_cl_temp = 0; num_cl_temp < les_cl_temp.size(); num_cl_temp++)
282 Nom nom_cl_temp = la_cl_temp->frontiere_dis().le_nom();
283 if (nom_cl_temp == nom_cl_rayo)
288 test_remplissage_Tb = 1;
295 test_remplissage_Tb = 1;
302 test_remplissage_Tb = 1;
309 test_remplissage_Tb = 1;
315 Cerr <<
"Erreur dans Rayo_semi_transp_solver_VEF::evaluer_cl_rayonnement ! Le cas d'une CL thermique " << la_cl_temp->que_suis_je() <<
" n'est pas code" << finl;
322 if (test_remplissage_Tb == 0)
323 Cerr <<
"Rayo_semi_transp_solver_VEF::evaluer_cl_rayonnement -- On n'a pas remplie le tableau des temperatures de bord !!!!" << finl;
328 else if (sub_type(
Symetrie, la_cl_rayo.valeur()))
334 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)
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
int nb_faces() const
renvoie le nombre global de faces.
DoubleVect & volumes_entrelaces()
int nb_faces_tot() const
renvoie le nombre total de faces.
virtual double face_normales(int face, int comp) const
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
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.
void modifier_matrice() override
modifie la matrice pour prendre en compte la presence de faces rayonnantes au voisinage des elements ...
void resoudre(double temps) override
int nb_colonnes_tot() override
void assembler_matrice() override
void evaluer_cl_rayonnement(double temps) override
int nb_colonnes() 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:
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
classe Temperature_imposee_paroi_rayo_semi_transp cette classe est utilisee pour imposer une temperat...
void calculer_temperature_bord(double temps)
Champ_front_base & temperature_bord()