16#include <Terme_Source_Acceleration.h>
18#include <Probleme_base.h>
19#include <Navier_Stokes_std.h>
20#include <Discretisation_base.h>
21#include <Domaine_VF.h>
22#include <Schema_Temps_base.h>
57 Cerr <<
"Terme_Source_Acceleration::printOn : appel invalide" << finl;
68 Cerr <<
"Terme_Source_Acceleration::readOn : appel invalide" << finl;
96 Cerr <<
"Terme_Source_Acceleration::lire_data" << finl;
99 les_mots[0] =
"omega";
100 les_mots[1] =
"domegadt";
101 les_mots[2] =
"centre_rotation";
102 les_mots[3] =
"option";
103 les_mots[4] =
"acceleration";
105 les_mots[6] =
"vitesse";
111 Cerr <<
"Erreur dans Terme_Source_Acceleration::lire_data" << finl;
112 Cerr <<
" On attendait {" << finl;
120 const int i_mot = les_mots.
search(motlu);
122 Cerr <<
"Lecture de " << motlu <<
" : ";
128 Cerr << omega_.que_suis_je() << finl;
133 Cerr << domegadt_.que_suis_je() << finl;
136 s >> centre_rotation_;
138 Cerr << centre_rotation_.que_suis_je() << finl;
143 les_options[0] =
"terme_complet";
144 les_options[1] =
"coriolis_seul";
145 les_options[2] =
"entrainement_seul";
147 const int i = les_options.
search(motlu);
151 option_ = TERME_COMPLET;
154 option_ = CORIOLIS_SEUL;
157 option_ = ENTRAINEMENT_SEUL;
160 Cerr <<
"Erreur, les options valides sont : " << finl;
161 Cerr << les_options << finl;
166 Cerr << motlu << finl;
170 s >> champ_acceleration_;
172 Cerr << champ_acceleration_.que_suis_je() << finl;
180 Cerr << champ_vitesse_.que_suis_je() << finl;
183 Cerr <<
"Erreur dans Terme_Source_Acceleration::lire_data" << finl;
184 Cerr <<
" On ne comprend pas le mot " << motlu << finl;
185 Cerr <<
" Les mots compris sont : " << les_mots << finl;
195 if (centre_rotation_) n++;
196 if (n != 0 && n != 3)
198 Cerr <<
"Erreur dans Terme_Source_Acceleration::lire_data" << finl;
199 Cerr <<
" Si OMEGA ou DOMEGADT ou CENTRE_GRAVITE est donne" << finl;
200 Cerr <<
" alors les trois doivent etre donnes" << finl;
206 if (omega_->valeurs().dimension(0) != 1
207 || domegadt_->valeurs().dimension(0) != 1
208 || omega_->valeurs().dimension(1) != 3
209 || domegadt_->valeurs().dimension(1) != 3)
211 Cerr <<
"Erreur dans Terme_Source_Acceleration::lire_data" << finl;
212 Cerr <<
" les champs OMEGA et DOMEGADT doivent etre des champs" << finl;
213 Cerr <<
" uniformes a trois composantes (vecteur aligne sur Z en 2D)" << finl;
218 if (champ_acceleration_)
220 if (champ_acceleration_->valeurs().dimension(0) != 1)
222 Cerr <<
"Erreur dans Terme_Source_Acceleration::lire_data" << finl;
223 Cerr <<
" Le champ ACCELERATION doit etre un champ uniforme" << finl;
236 Cerr <<
"Erreur dans Terme_Source_Acceleration::lire_data\n"
237 <<
" Ce terme source ne peut etre insere que dans une equation\n"
238 <<
" derivee de Navier_Stokes_std" << finl;
245 dis.
discretiser_champ(
"vitesse", domaine,
"acceleration_terme_source",
"kg/ms^2",
259 return terme_source_post_.valeur();
265 return terme_source_post_.valeur();
282 const DoubleTab& centre_faces = domaine_VF.
xv();
284 double a[3] = {0., 0., 0.};
285 double w[3] = {0., 0., 0.};
286 double dw[3] = {0., 0., 0.};
287 double c[3] = {0., 0., 0.};
292 int rotation_solide = 0;
296 if (champ_acceleration_)
298 const DoubleTab& a_ = champ_acceleration_->valeurs();
299 for (j = 0; j < dim; j++)
306 const DoubleTab& champ_w = omega_ ->valeurs();
307 const DoubleTab& champ_dw = domegadt_ ->valeurs();
308 const DoubleTab& champ_c = centre_rotation_->valeurs();
311 for (j = 0; j < 3; j++) w[j] = champ_w(0,j);
312 for (j = 0; j < 3; j++) dw[j] = champ_dw(0,j);
313 for (j = 0; j < dim; j++) c[j] = champ_c(0,j);
323 DoubleTab vitesse_faces_stockage;
326 const DoubleTab& vitesse_faces =
329 : vitesse_faces_stockage;
334 const int nb_faces = acceleration_aux_faces.
dimension(0);
338 double v[3] = {0., 0., 0.};
341 double xgr[3] = {0., 0., 0.};
343 for (i_face = 0; i_face < nb_faces; i_face++)
356 for (j = 0; j < dim; j++)
357 v[j] = vitesse_faces(i_face, j);
359 for (j = 0; j < dim; j++)
360 xgr[j] = centre_faces(i_face, j) - c[j];
362 if (option_ != ENTRAINEMENT_SEUL)
364 src[0] += -2. * (w[1] * v[2] - w[2] * v[1]);
365 src[1] += -2. * (w[2] * v[0] - w[0] * v[2]);
366 src[2] += -2. * (w[0] * v[1] - w[1] * v[0]);
367 src[0] += dw[2] * xgr[1] - dw[1] * xgr[2];
368 src[1] += dw[0] * xgr[2] - dw[2] * xgr[0];
369 src[2] += dw[1] * xgr[0] - dw[0] * xgr[1];
371 if (option_ != CORIOLIS_SEUL)
373 src[0] += w[2]*w[2]*xgr[0] - w[0]*w[2]*xgr[2] - w[0]*w[1]*xgr[1] + w[1]*w[1]*xgr[0];
374 src[1] += w[0]*w[0]*xgr[1] - w[0]*w[1]*xgr[0] - w[1]*w[2]*xgr[2] + w[2]*w[2]*xgr[1];
375 src[2] += w[1]*w[1]*xgr[2] - w[1]*w[2]*xgr[1] - w[2]*w[0]*xgr[0] + w[0]*w[0]*xgr[2];
378 for (j = 0; j < dim; j++)
379 acceleration_aux_faces(i_face, j) = src[j];
381 return acceleration_aux_faces;
401 if (champ_acceleration_)
402 champ_acceleration_->mettre_a_jour(temps);
405 omega_->mettre_a_jour(temps);
406 domegadt_->mettre_a_jour(temps);
407 centre_rotation_->mettre_a_jour(temps);
423 if (mot ==
"ACCELERATION_TERME_SOURCE")
425 ch_ref = terme_source_post_.valeur();
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
void mettre_a_jour(double temps) override
Mise a jour en temps du champ.
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
double xv(int num_face, int k) 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,...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
OBS_PTR(Equation_base) mon_equation
Une chaine de caractere (Nom) en majuscules.
Un tableau d'objets de la classe Motcle.
int search(const Motcle &t) const
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
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 Probleme_base C'est un Probleme_U qui n'est pas un couplage.
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 Source_base Un objet Source_base est un terme apparaissant au second membre d'une
Champs_compris champs_compris_
virtual DoubleTab & ajouter(DoubleTab &) const
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
virtual const Navier_Stokes_std & get_eq_hydraulique() const
Renvoie eq_hydraulique_ !
DoubleTab & calculer(DoubleTab &) const override
resu=0; ajouter(resu); (appel a ajouter() de la classe derivee)
const DoubleTab & calculer_la_source(DoubleTab &src_faces) const
Calcul de la valeur du champ la_source aux faces en fonction de - calculer_vitesse_faces().
Terme_Source_Acceleration()
int a_pour_Champ_Fonc(const Motcle &mot, OBS_PTR(Champ_base) &ch_ref) const override
Methode surchargee de Source_base.
virtual const DoubleTab & calculer_vitesse_faces(DoubleTab &stockage) const =0
void mettre_a_jour(double temps) override
Evalue les champs d'acceleration et de rotation au temps t.
void associer_pb(const Probleme_base &) override
virtual Champ_Fonc_base & get_set_terme_source_post() const
virtual const Champ_Fonc_base & get_terme_source_post() const
virtual void lire_data(Entree &s)
Methode appelee par readOn des classes derivees Terme_Source_Acceleration_VDF_Face,...