16#include <Traitement_particulier_NS_EC.h>
17#include <Navier_Stokes_std.h>
18#include <Domaine_VF.h>
19#include <Terme_Source_Acceleration.h>
20#include <Milieu_base.h>
22#include <Probleme_base.h>
23#include <Schema_Temps_base.h>
59 Motcle accouverte =
"{" , accfermee =
"}" ;
62 periode = mon_equation->probleme().schema_temps().pas_temps_min();
64 if (motbidon == accouverte)
68 les_mots[1] =
"Ec_dans_repere_fixe";
71 while(motlu != accfermee)
73 int rang=les_mots.
search(motlu);
84 Cerr<<
"On attendait le mot cle periode apres " << les_mots[rang] <<
"."<<finl;
92 Cerr <<
"Erreur dans la lecture de Traitement_particulier_NS_EC";
93 Cerr <<
"Les mots cles possibles sont "<< les_mots <<
" { et }" << finl;
94 Cerr <<
"Vous avez lu :" << motlu << finl;
102 if (motlu != accfermee)
104 Cerr <<
"Erreur dans la lecture de Traitement_particulier_NS_EC";
105 Cerr <<
"On attendait une }" << finl;
112 Cerr <<
"Erreur dans la lecture de Traitement_particulier_NS_EC";
113 Cerr <<
"On attendait une {" << finl;
125 nom_fich+=
"_dans_repere_fixe";
133 s.
ouvrir(nom_fich,ios::app);
134 s.
setf(ios::scientific);
140 tinit = mon_equation->inconnue().temps();
149 le_fichier<<
"# Temps Energie_cinetique_totale"<<finl;
150 le_fichier<<
tinit<<
" "<<Ec<<finl;
155 double temps = mon_equation->inconnue().temps();
166 le_fichier<<temps<<
" "<<Ec<<finl;
176static double trait_part_calculer_ec_faces(
const int face_debut,
179 const DoubleTab& vitesse,
180 const DoubleVect& volumes_entrelaces,
182 const DoubleTab& masse_volumique,
183 const ArrOfDouble& translation,
184 const ArrOfDouble& rotation,
185 const int repere_mobile_,
186 const ArrOfInt& faces_doubles
189 const int face_fin = face_debut + nb_faces;
192 const int nb_dim_1 = (vitesse.
line_size() == 1);
195 for (
int face = face_debut; face < face_fin; face++)
200 ve[0]=translation[0];
201 ve[1]=translation[1];
204 ve[2]=translation[2];
205 ve[0]+=rotation[1]*xv(face,2)-rotation[2]*xv(face,1);
206 ve[1]+=rotation[2]*xv(face,0)-rotation[0]*xv(face,2);
207 ve[2]+=rotation[0]*xv(face,1)-rotation[1]*xv(face,0);
218 const double v = vitesse(face);
221 Cerr <<
"Le codage de l'energie cinetique calculee dans un repere fixe" <<finl;
222 Cerr <<
"n'est pas fait en VDF." << finl;
227 volume = (frontiere ? 0.5 : 1) * volumes_entrelaces(face);
233 for (
int i = 0; i < dim; i++)
235 const double v_i = vitesse(face, i);
236 v2 += (v_i + ve[i]) * (v_i + ve[i]);
239 volume = volumes_entrelaces(face);
241 const int k = (masse_volumique.
dimension(0)==1) ? 0 : face;
242 rho = masse_volumique(k, 0);
243 double contribution = (faces_doubles[face]==1) ? 0.5 : 1 ;
244 ec += contribution * 0.5 * v2 * volume * rho;
263 const Domaine_dis_base& zdisbase = mon_equation->inconnue().domaine_dis_base();
266 const DoubleTab& xv = domaine_VF.
xv();
267 const DoubleTab& vitesse = mon_equation->inconnue().valeurs();
268 OBS_PTR(ArrOfDouble) translation(xv);
269 OBS_PTR(ArrOfDouble) rotation(xv);
277 const Sources& les_sources=mon_equation->sources();
279 for (
const auto& itr : les_sources)
290 if (terme_source_acceleration.
has_omega())
293 rotation=rotation_nulle;
300 Cerr <<
"Vous ne pouvez calculer l'energie cinetique dans un repere fixe" << finl;
301 Cerr <<
"que si le repere de calcul est mobile, c'est a dire que vous avez" << finl;
302 Cerr <<
"defini un terme source d'acceleration dans l'equation Navier Stokes." << finl;
303 Cerr <<
"Ou bien il manque dans ce terme source la definition de la vitesse" << finl;
304 Cerr <<
"du repere mobile dans le repere fixe. Modifier votre jeu de donnees." << finl;
314 if (rho->dimension(0) != domaine_VF.
nb_faces() || rho->line_size() != 1)
316 Cerr <<
"Erreur dans Traitement_particulier_NS_EC::calculer_Ec" << finl;
317 Cerr <<
"le champ de masse volumique n'est pas un champ scalaire aux faces" << finl;
323 rho = mon_equation->milieu().masse_volumique().valeurs();
328 for (
int i = 0; i < nb_front; i++)
333 ec += trait_part_calculer_ec_faces(debut, nb_faces, 1,
334 vitesse, volumes_entrelaces, xv, rho, translation, rotation,
repere_mobile_, faces_doubles);
340 ec += trait_part_calculer_ec_faces(debut, nb_faces, 0,
341 vitesse, volumes_entrelaces, xv, rho, translation, rotation,
repere_mobile_, faces_doubles);
344 energie_cinetique = ec;
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
int nb_faces() const
renvoie le nombre global de faces.
DoubleVect & volumes_entrelaces()
int nb_faces_internes() const
une face est interne ssi elle separe deux elements.
double xv(int num_face, int k) const
ArrOfInt & faces_doubles()
renvoie 1 pour les faces appartenant a un bord perio ou un item commun, 0 par defaut
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
const Front_VF & front_VF(int i) const
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
Class defining operators and methods for all reading operation in an input flow (file,...
int_t num_premiere_face() const
int_t nb_faces() const
Renvoie le nombre de faces de la frontiere.
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
Une chaine de caractere (Nom) en majuscules.
Un tableau d'objets de la classe Motcle.
int search(const Motcle &t) const
class Nom Une chaine de caractere pour nommer les objets de TRUST
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
bool & reprise_effectuee()
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),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
virtual int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::out)
void precision(int pre) override
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
class Sources Sources represente une liste de Source.
virtual const Champ_base & get_champ_masse_volumique() const
Renvoie le champ de masse volumique.
virtual int has_champ_masse_volumique() const
Renvoie 1 si la masse volumique a ete associee, 0 sinon.
_SIZE_ dimension(int d) const
const Champ_Don_base & omega() const
const Champ_Don_base & champ_vitesse() const
bool has_champ_vitesse() const
classe Traitement_particulier_EC Cette classe permet de faire les traitements particuliers
void preparer_calcul_particulier() override
void ouvrir_fichier(SFichier &s) const
Entree & lire(Entree &) override
virtual void calculer_Ec(double &)
Meme methode de calcul en VDF et en VEF.
void post_traitement_particulier() override
classe Traitement_particulier_NS_base Derive de Support_Champ_Masse_Volumique: utilisation de rho
OBS_PTR(Navier_Stokes_std) mon_equation