15#include <ALE_BeamCoupling.h>
16#include <Domaine_VEF.h>
17#include <Navier_Stokes_std.h>
18#include <Operateur_Diff.h>
19#include <Operateur_Grad.h>
20#include <Equation_base.h>
22#include <communications.h>
27 Motcle accolade_ouverte(
"{"), accolade_fermee(
"}"), motlu;
28 Nom nomlu, beam_name =
"none";
31 if (motlu != accolade_ouverte)
33 Cerr <<
"Error reading the beam model block: expected "
34 << accolade_ouverte <<
", got " << motlu << finl;
40 if (motlu ==
"nb_beam")
43 if (nbBeam_ > 0) beam_ = std::vector<Beam_model>(nbBeam_);
44 Cerr <<
"Beam number : " << nbBeam_ << finl;
48 Cerr <<
"Error reading the beam model block: expected 'nb_beam', got "
63 for (
int n = 0; n < nb_bords_ALE; n++)
64 if (les_bords_ALE(n).le_nom() == beam_name)
69 Cerr <<
"Beam name '" << beam_name
70 <<
"' must match a moving boundary declared in 'Imposer_vit_bords_ALE'." << finl;
74 beam_[count].setBeamName(beam_name);
75 Cerr <<
"Beam name : " << beam_[count].getBeamName() << finl;
76 beam_[count].read_beam(is);
79 else if (motlu == accolade_fermee)
83 Cerr <<
"Read " << count <<
" beam model(s) but expected " << nbBeam_ << finl;
90 Cerr <<
"Error reading the beam model: unexpected keyword " << motlu << finl;
98 int nb_bords_ALE,
const Bords& les_bords_ALE)
100 const double tempsLast = beam_[i].getTempsComputeForceOnBeam();
101 if (tps != tempsLast && dt != 0.)
104 assert(eqn !=
nullptr);
106 beam_[i].setTempsComputeForceOnBeam(tps);
108 return beam_[i].getVelocity(tps, dt);
114 int nb_bords_ALE,
const Bords& les_bords_ALE)
120 const DoubleTab& xv = le_dom_vef.
xv();
121 DoubleTab& flux_bords_grad = op_grad.
flux_bords();
122 DoubleTab& flux_bords_diff = op_diff.
flux_bords();
126 const int modes_per_plane = nbModes / nb_planes;
130 if (is_resumption && mp_norme_vect(flux_bords_diff) == 0.)
138 DoubleTab fluidForceOnBeam(modes_per_plane, nb_planes);
139 fluidForceOnBeam = 0.;
141 if (flux_bords_grad.
size() == flux_bords_diff.
size() && flux_bords_grad.
size() > 0)
143 for (
int n = 0; n < nb_bords_ALE; n++)
145 if (les_bords_ALE(n).le_nom() != beam_[i].getBeamName())
continue;
147 const int ndeb = les_bords_ALE(n).num_premiere_face();
148 const int nfin = ndeb + les_bords_ALE(n).
nb_faces();
150 for (
int face = ndeb; face < nfin; face++)
151 for (
int plane = 0; plane < nb_planes; ++plane)
152 for (
int mode = 0; mode < modes_per_plane; ++mode)
157 i, xv(face,0), xv(face,1), xv(face,2), plane, u);
158 fluidForceOnBeam(mode, plane) +=
159 (flux_bords_grad(face, comp) + flux_bords_diff(face, comp)) * phi;
165 beam_[i].setFluidForceOnBeam(fluidForceOnBeam);
168 beam_[i].printOutputFluidForceOnBeam();
183 const int& i,
const double& x,
const double& y,
const double& z,
184 const DoubleTab& u,
const DoubleTab& R)
const
186 return beam_[i].interpolationOnThe3DSurface(x, y, z, u, R);
190 const int& i,
const double& x,
const double& y,
const double& z,
191 const int& comp,
const DoubleTab& u)
const
193 return beam_[i].interpolationPhiOnThe3DSurface(x, y, z, comp, u);
DoubleTab interpolationOnThe3DSurface(const int &i, const double &x, const double &y, const double &z, const DoubleTab &u, const DoubleTab &R) const
void read(Entree &is, int nb_bords_ALE, const Bords &les_bords_ALE)
const DoubleTab & getDisplacement(const int &i, const int &j) const
DoubleTab & getVelocity(const int &i, const double &tps, const double &dt, Equation_base *eqn, bool is_resumption, int nb_bords_ALE, const Bords &les_bords_ALE)
double interpolationPhiOnThe3DSurface(const int &i, const double &x, const double &y, const double &z, const int &comp, const DoubleTab &u) const
const int & getBendingDirection(const int &i, const int &idx) const
void computeFluidForce(const int &i, Equation_base &eqn, bool is_resumption, int nb_bords_ALE, const Bords &les_bords_ALE)
const int & getNbPlanes(const int &i) const
double computeDt(Domaine_dis_base &le_domaine_dis, const int &i) const
const int & getNbModes(const int &i) const
int_t nb_faces() const
Renvoie le nombre total de faces de tous les bords de la liste.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual const DoubleVect & face_surfaces() 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....
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.
Une chaine de caractere (Nom) en majuscules.
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
virtual const Champ_Inc_base & vitesse() const
Operateur_Grad & operateur_gradient()
Renvoie l'operateur de calcul du gradient associe a l'equation.
Operateur_Diff & operateur_diff()
class Nom Une chaine de caractere pour nommer les objets de TRUST
Operateur_base & l_op_base() override
Renvoie l'objet sous-jacent upcaste en Operateur_base.
Operateur_base & l_op_base() override
Renvoie l'objet sous-jacent upcaste en Operateur_base.
classe Operateur_base Classe est la base de la hierarchie des objets representant un
virtual DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const
static double mp_min(double)
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
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),...