16#include <Milieu_Elasticite.h>
17#include <Discretisation_base.h>
18#include <Schema_Temps_base.h>
19#include <Probleme_base.h>
20#include <Domaine_dis_base.h>
21#include <Champ_Uniforme.h>
47 param.
ajouter(
"alpha", &ch_coeff_dilatation_th_);
56 ch_lambda_lame_ = ch_E_;
57 ch_lambda_lame_->nommer(
"lambda_lame");
62 ch_mu_->nommer(
"mu_lame");
67 ch_K_->nommer(
"bulk_modulus");
85 if (ch_coeff_dilatation_th_)
88 ch_rho_lag_->associer_eqn(pb.
equation(0));
96 if (ch_coeff_dilatation_th_)
106 ch_E_->initialiser(temps);
107 ch_nu_->initialiser(temps);
108 ch_lambda_lame_->initialiser(temps);
109 ch_mu_->initialiser(temps);
110 ch_K_->initialiser(temps);
111 if (ch_coeff_dilatation_th_) ch_coeff_dilatation_th_->initialiser(temps);
112 ch_rho_lag_->passe() = ch_rho_->valeurs()(0, 0);
113 ch_rho_lag_->valeurs() = ch_rho_->valeurs()(0, 0);
114 ch_rho_lag_->mettre_a_jour(temps);
127 ch_rho_lag_->changer_temps_futur(sch.
temps_futur(i), i);
128 ch_rho_lag_->futur(i) = ch_rho_lag_->valeurs();
135 if (!ch_E_ || !ch_nu_ || !ch_lambda_lame_ || !ch_mu_ || !ch_K_)
137 Cerr <<
que_suis_je() <<
" cannot update without E, nu, lambda, mu or K fields." << finl;
143 ch_E_->mettre_a_jour(temps);
144 ch_nu_->mettre_a_jour(temps);
145 if (ch_coeff_dilatation_th_) ch_coeff_dilatation_th_->mettre_a_jour(temps);
147 ch_lambda_lame_->changer_temps(temps);
148 ch_mu_->changer_temps(temps);
149 ch_K_->changer_temps(temps);
150 ch_rho_lag_->mettre_a_jour(temps);
159 if (ch_E_->valeurs()(0,0) <= 0.)
161 message +=
"The Young modulus must be strictly positive.\n";
165 const double nu_val = ch_nu_->valeurs()(0,0);
166 if (nu_val <= -1.0 || nu_val >= 0.5)
168 message +=
"The Poisson ratio must belong to (-1, 0.5).\n";
172 if (ch_rho_->valeurs()(0,0) <= 0.)
174 Cerr <<
que_suis_je() <<
" expects rho > 0 but received " << ch_rho_->valeurs()(0,0) << finl;
179void Milieu_Elasticite::ensure_rho_field()
183 Cerr <<
que_suis_je() <<
" requires a rho field to be specified." << finl;
186 if (!sub_type(Champ_Uniforme, ch_rho_.valeur()))
188 Cerr <<
que_suis_je() <<
" currently expects rho to be provided as Champ_Uniforme." << finl;
192 if (ch_rho_->valeurs().size_totale() == 0)
194 Cerr <<
que_suis_je() <<
" received an empty rho field." << finl;
198 if (ch_rho_->nb_comp() != 1)
200 Cerr <<
que_suis_je() <<
" expects rho to be a scalar field." << finl;
207 const double E_val = ch_E_->valeurs()(0, 0);
208 const double nu_val = ch_nu_->valeurs()(0, 0);
209 const double denom_mu = 2. * (1. + nu_val);
210 const double denom_lambda = (1. + nu_val) * (1. - 2. * nu_val);
211 const double denom_K = 3. * (1. - 2. * nu_val);
213 if (denom_mu == 0. || denom_lambda == 0. || denom_K == 0.)
215 Cerr <<
que_suis_je() <<
" cannot compute elastic constants with nu=" << nu_val << finl;
219 ch_mu_->valeurs() = E_val / denom_mu;
220 ch_lambda_lame_->valeurs() = E_val * nu_val / denom_lambda;
221 ch_K_->valeurs() = E_val / denom_K;
225 Cerr <<
"Updating rho_lagrangien field based on current volume scaling at time " << temps << finl;
226 ch_rho_lag_->valeurs() = ch_rho_lag_->passe();
227 zdb_->domaine().apply_old_to_new_volume_scaling(ch_rho_lag_->valeurs(), zdb_.valeur());
230 ch_rho_lag_->futur(i) = ch_rho_lag_->valeurs();
virtual int nb_valeurs_temporelles() const
Renvoie le nombre de valeurs temporelles actuellement conservees.
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
void nommer_completer_champ_physique(const Domaine_dis_base &domaine_vdf, const Nom &nom_champ, const Nom &unite, Champ_base &champ, const Probleme_base &pbi) const
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
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,...
virtual const Champ_Inc_base & inconnue() const =0
Isotropic small-strain linear elastic medium.
void discretiser(const Probleme_base &pb, const Discretisation_base &dis) override
void set_param(Param ¶m) const override
int initialiser(const double temps) override
void mettre_a_jour(double temps) override
void verifier_coherence_champs(int &err, Nom &message) override
void creer_champs_non_lus() override
void update_fields(double temps, bool)
bool initTimeStep(double dt) override
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
virtual int initialiser(const double temps)
virtual void creer_champs_non_lus()
virtual void mettre_a_jour(double temps)
virtual void discretiser(const Probleme_base &pb, const Discretisation_base &dis)
virtual void verifier_coherence_champs(int &err, Nom &message)
Champs_compris champs_compris_
virtual void set_param(Param ¶m) const override
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.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
virtual const Equation_base & equation(int) const =0
const Domaine_dis_base & domaine_dis() const
Renvoie le domaine discretise associe au probleme.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
double temps_courant() const
Renvoie le temps courant.
virtual double temps_futur(int i) const =0
virtual int nb_valeurs_futures() const =0
Classe de base des flux de sortie.