17#include <MD_Vector_tools.h>
18#include <MD_Vector_std.h>
20#include <Domaine_ALE.h>
21#include <Probleme_base.h>
22#include <Schema_Temps_base.h>
23#include <Domaine_VEF.h>
24#include <Domaine_EF.h>
25#include <Domaine_Poly_base.h>
28#include <Champ_front_ALE.h>
29#include <Ch_front_input_ALE.h>
30#include <Champ_front_ALE_Beam.h>
31#include <Equation_base.h>
33#include <Navier_Stokes_std.h>
34#include <Operateur_Diff.h>
35#include <Operateur_Grad.h>
36#include <communications.h>
38#include <CL_Types_include.h>
39#include <Entree_fluide_vitesse_imposee_ALE.h>
40#include <Interprete_bloc.h>
41#include <NettoieNoeuds.h>
42#include <TRUST_2_MED.h>
43#include <Matrix_tools.h>
44#include <Array_tools.h>
45#include <Champ_front_ALE_lag.h>
46#include <EcritureLectureSpecial.h>
48#include <TRUST_2_PDI.h>
50#include <medcoupling++.h>
52#include <MEDCouplingMemArray.hxx>
53using namespace MEDCoupling;
70namespace {
static constexpr double ALE_PENALIZATION = 1.e14; }
72Implemente_instanciable_sans_constructeur(
Domaine_ALE,
"Domaine_ALE", Domaine);
103 volumes_old_.reset();
104 volumes_entrelaces_old_.reset();
133 Cout <<
"Initialization of Coupling_ICoCo_Method " << res << finl;
139 int iCoCoImplicitIteration = -1;
140 bool resetCoordinates =
false;
142 if ((eq.valeur()).probleme().checkOutputIntEntry(
"iCoCoImplicitIteration"))
144 iCoCoImplicitIteration = (eq.valeur()).probleme().getOutputIntValue(
"iCoCoImplicitIteration");
145 Cerr <<
"Domaine_ALE::mettre_a_jour, iCoCoImplicitIteration: "
146 << iCoCoImplicitIteration << finl;
154 if ((eq.valeur()).probleme().checkOutputIntEntry(
"acceleratedGridMode"))
156 (eq.valeur()).probleme().getOutputIntValue(
"acceleratedGridMode");
159 if (iCoCoImplicitIteration == 0)
164 else if (iCoCoImplicitIteration > 0)
167 resetCoordinates =
true;
177 compute_vertex_velocities(temps, pb);
181 Cout <<
"Updating the mesh!" << finl;
183 update_vertex_coordinates(dt);
201 bool has_periodic =
false;
202 for (
int cl = 0; cl < zcl.
nb_cond_lim() && !has_periodic; cl++)
246 if (ALEMeshVelocity_)
248 ALEMeshVelocity_->valeurs() = ALEMeshVelocity;
249 ALEMeshVelocity_->mettre_a_jour(temps);
252 if (ALEMeshTotalDisplacement_)
256 const int N = ALEMeshVelocity.
size() / D;
257 DoubleTab& disp = ALEMeshTotalDisplacement_->valeurs();
258 for (
int i = 0; i < N; i++)
259 for (
int d = 0; d < D; d++)
260 disp(i, d) += ALEMeshVelocity(i, d) * dt;
262 ALEMeshTotalDisplacement_->mettre_a_jour(temps);
267 if (ALEMeshStructuralPressure_)
269 if (ALEMeshStructuralVonMises_)
271 if (ALEMeshStructuralForces_)
277void Domaine_ALE::validate_ale_setup(
const Probleme_base& pb)
const
281 for (
int i = 0; i < neumann.size(); i++)
285 Cerr <<
"In 'ALE_Neumann_BC_for_grid_problem', boundary " << neumann[i]
286 <<
" is already declared as a moving boundary in 'Imposer_vit_bords_ALE'." << finl;
295 Cerr <<
"Discretization not recognized by ALE!" << finl;
296 Cerr <<
"Use VEFPreP1B, PolyMAC_P0 or EF and restart." << finl;
308 if (!sub_type(Entree_fluide_vitesse_imposee_ALE, la_cl.valeur()))
309 Cerr <<
"Mobile ALE boundary: replace " << la_cl->que_suis_je()
310 <<
" on " <<
le_nom <<
" with Frontiere_ouverte_vitesse_imposee_ALE" << finl;
314 Cerr <<
"Warning: ALE simulation without any moving boundary!" << finl;
320 const bool initialized = (
vf.size_array() != 0);
321 if (initialized)
return;
323 Cerr <<
"Domaine_ALE::initialize" << finl;
324 validate_ale_setup(pb);
329 const int nb_faces = le_dom_VF.
nb_faces();
344 volumes_old_ = le_dom_VF.
volumes();
347 volumes_sommets_thilde_old_ = ref_cast(
Domaine_EF, le_dom_VF).volumes_sommets_thilde();
358 if (lagrangian_velocity_imposed_)
363 build_lagrangian_vertex_mapping(pb_v, champ);
365 Cerr <<
"Domaine_ALE::initialiser : MEDCoupling required for imposed Lagrangian velocity." << finl;
374 compute_vertex_velocities(temps, pb);
391 int nb_som_face, IntTab& face_sommets)
397 for (
int i = 0; i < nb_faces; i++)
399 for (
int s = 0; s < nb_som_face; s++)
400 vf(i, j) += vit_maillage(face_sommets(i, s), j);
401 vf(i, j) /= nb_som_face;
404 vf.echange_espace_virtuel();
420 volumes_old_ = le_dom_VF.
volumes();
421 if (!eq->probleme().discretisation().is_ef())
424 volumes_sommets_thilde_old_ = ref_cast(
Domaine_EF, le_dom_VF).volumes_sommets_thilde();
431 double dt, DoubleTab& deriveeALE)
const
434 const DoubleVect& volumes_entrelaces =
435 ref_cast(
Domaine_VF, eq->domaine_dis()).volumes_entrelaces();
437 for (
int f = 0; f < nf_tot; f++)
439 deriveeALE(f, d) = v(f, d) * volumes_entrelaces_old_(f) / volumes_entrelaces(f) / dt
457 int nfin = ndeb + le_bord.
nb_faces();
458 for (
int f = ndeb; f < nfin; f++)
463 double moy = 0.5 * (deriveeALE(f, d) + deriveeALE(fass, d));
464 deriveeALE(f, d) = moy;
465 deriveeALE(fass, d) = moy;
483 const DoubleVect& volumes = dvf.
volumes();
484 for (
int e = 0; e < I; e++)
485 for (
int n = 0; n < N; n++)
486 inco(e, n) *= volumes_old_(e) / volumes(e);
491 for (
int f = 0; f < I; f++)
492 for (
int n = 0; n < N; n++)
493 inco(f, n) *= volumes_entrelaces_old_(f) / ve(f);
497 const DoubleVect& vs = ref_cast(
Domaine_EF, dvf).volumes_sommets_thilde();
498 for (
int s = 0; s < I; s++)
499 for (
int n = 0; n < N; n++)
500 inco(s, n) *= volumes_sommets_thilde_old_(s) / vs(s);
504 Cerr <<
"Domaine_ALE::apply_old_to_new_volume_scaling: incompatible dimension "
515 double tinit, DoubleTab& u_n, DoubleTab& v_n, DoubleTab& a_n,
516 DoubleTab& x_n, DoubleTab& B0_n, DoubleTab& Ft_n, DoubleTab& Stress_n)
518 str_mesh_model.resumptionMesh(tinit, u_n, v_n, a_n, x_n, B0_n, Ft_n, Stress_n);
567 const int& i,
const double& x,
const double& y,
const double& z,
568 const DoubleTab& u,
const DoubleTab& R)
const
570 return beam_coupling_.interpolationOnThe3DSurface(i, x, y, z, u, R);
574 const int& i,
const double& x,
const double& y,
const double& z,
575 const int& comp,
const DoubleTab& u)
const
577 return beam_coupling_.interpolationPhiOnThe3DSurface(i, x, y, z, comp, u);
625 int nbComp,
const Motcle& directive,
642 for (
int i = 0; i < nbValues; i++)
644 coord(i, k) = ValueOf_MeshCoords(i, k);
650 Motcle accolade_ouverte(
"{"), accolade_fermee(
"}"), motlu;
654 if (motlu != accolade_ouverte)
656 Cerr <<
"Error reading moving boundary velocities: expected "
657 << accolade_ouverte <<
", got " << motlu << finl;
662 Cerr <<
"Number of ALE boundaries : " <<
nb_bords_ALE << finl;
670 if (motlu == accolade_fermee)
break;
671 Cerr <<
"Reading velocity imposed on " << nomlu <<
"..." << finl;
679 Motcle accolade_ouverte(
"{"), accolade_fermee(
"}"), motlu;
683 if (motlu != accolade_ouverte)
685 Cerr <<
"Error reading ALE mesh solver: expected "
686 << accolade_ouverte <<
", got " << motlu << finl;
691 solv.nommer(
"ALE_solver");
697 if (motlu == accolade_fermee)
break;
720 Motcle accolade_ouverte(
"{"), accolade_fermee(
"}"), motlu;
723 std::vector<double> val_prop;
726 if (motlu != accolade_ouverte)
728 Cerr <<
"Error reading structural dynamic mesh model: expected "
729 << accolade_ouverte <<
", got " << motlu << finl;
738 if (motlu ==
"Mfront_library")
739 { is >> nomlu;
str_mesh_model.setMfrontLibraryPath(nomlu.getString());
continue; }
740 if (motlu ==
"Mfront_model_name")
741 { is >> nomlu;
str_mesh_model.setMfrontModelName(nomlu.getString());
continue; }
742 if (motlu ==
"Mfront_hypothesis")
743 { is >> nomlu;
str_mesh_model.setMfrontHypothesis(nomlu.getString());
continue; }
744 if (motlu ==
"Mfront_material_property")
747 if (motlu != accolade_ouverte)
748 { Cerr <<
"Error: expected { in Mfront_material_property" << finl;
Process::exit(); }
750 std::string nom_prop(nomlu);
755 val_prop.push_back(var_double);
757 if (motlu == accolade_fermee)
break;
758 var_double = std::stod(motlu.getString());
763 if (motlu ==
"Density")
764 { is >> var_double;
str_mesh_model.setDensity(var_double);
continue; }
765 if (motlu ==
"Inertial_Damping")
766 { is >> var_double;
str_mesh_model.setInertialDamping(var_double);
continue; }
767 if (motlu ==
"Time_Step_Safety_Coefficient")
768 { is >> var_double;
str_mesh_model.setDtSafetyCoefficient(var_double);
continue; }
769 if (motlu ==
"Grid_Dt_Min")
770 { is >> var_double;
str_mesh_model.setGridDtMin(var_double);
continue; }
771 if (motlu ==
"Configuration_Reset_Dt")
772 { is >> var_double;
str_mesh_model.setConfigurationResetDt(var_double);
continue; }
773 if (motlu ==
"Max_Added_Mass_Ratio")
774 { is >> var_double;
str_mesh_model.setMaxAddedMassRatio(var_double);
continue; }
775 if (motlu == accolade_fermee)
break;
779 { Cerr <<
"Error: density not provided in structural dynamic mesh model." << finl;
Process::exit(); }
816 Cerr <<
"Update of the fluid grid forced from ICoCo" << finl;
830 external_pb_name_ = nom_pb;
831 external_velocity_field_name_ = nom_champ;
832 lagrangian_velocity_imposed_ =
true;
835void Domaine_ALE::check_external_vertex_velocity_compatibility(
const DoubleTab& valeurs)
const
839 Cerr <<
"Domaine_ALE: Lagrangian velocity field must have " <<
dimension
840 <<
" components per node (line_size=" << valeurs.
line_size() <<
")." << finl;
845void Domaine_ALE::build_lagrangian_vertex_mapping(
const Probleme_base& pb_v,
849 Cerr <<
"Domaine_ALE::build_lagrangian_vertex_mapping: MEDCoupling required." << finl;
853 const DoubleTab& ale_coords =
sommets_;
854 const DoubleTab& valeurs = champ.valeurs();
856 check_external_vertex_velocity_compatibility(valeurs);
859 Cerr <<
"Domaine_ALE: external velocity field has " << valeurs.
dimension(0)
860 <<
" nodes but domain has " << ext_coords.
dimension(0) <<
" nodes." << finl;
864 const int nb_ext = ext_coords.
dimension(0);
865 const int nb_ale = ale_coords.
dimension(0);
869 external_vertex_id_for_ale_vertex_.resize(nb_ale);
870 external_vertex_id_for_ale_vertex_ = -1;
880 MCAuto<DataArrayDouble> ext_pts(DataArrayDouble::New());
881 MCAuto<DataArrayDouble> ale_pts(DataArrayDouble::New());
882 ext_pts->alloc(nb_ext, dim);
883 ale_pts->alloc(nb_ale, dim);
885 double* ext_ptr = ext_pts->getPointer();
886 for (
int i = 0; i < nb_ext; i++)
887 for (
int d = 0; d < dim; d++)
888 ext_ptr[i * dim + d] = ext_coords(i, d);
890 double* ale_ptr = ale_pts->getPointer();
891 for (
int i = 0; i < nb_ale; i++)
892 for (
int d = 0; d < dim; d++)
893 ale_ptr[i * dim + d] = ale_coords(i, d);
895 MCAuto<DataArrayIdType> closest(ext_pts->findClosestTupleId(ale_pts));
896 const double tol2 = tol * tol;
898 for (
int i = 0; i < nb_ale; i++)
900 const int j =
static_cast<int>(closest->getIJ(i, 0));
902 for (
int d = 0; d < dim; d++)
904 const double diff = ale_coords(i, d) - ext_coords(j, d);
905 dist2 += diff * diff;
908 external_vertex_id_for_ale_vertex_[i] = j;
914 const int total_unmatched =
static_cast<int>(
mp_sum(unmatched));
915 if (total_unmatched > 0)
916 Cerr <<
"Domaine_ALE: " << total_unmatched
917 <<
" ALE nodes have no external match (tol=" << tol <<
")." << finl;
922void Domaine_ALE::compute_vertex_velocities(
double temps,
const Probleme_base& pb)
924 if (lagrangian_velocity_imposed_)
927 const Probleme_base& pb_v = ref_cast(Probleme_base,
interprete().objet(external_pb_name_));
928 const DoubleTab& valeurs = pb_v.
get_champ(external_velocity_field_name_).
valeurs();
930 for (
int i = 0; i <
nb_som(); i++)
932 const int j = external_vertex_id_for_ale_vertex_[i];
941 Cerr <<
"Domaine_ALE::compute_vertex_velocities: MEDCoupling required." << finl;
947 remplir_vitesse_bord(pb, temps, vit_bords);
957 laplacien(pb, vit_bords);
960 structural_dynamics(pb, vit_bords, temps);
970void Domaine_ALE::remplir_vitesse_bord(
const Probleme_base& pb,
double temps,
971 DoubleTab& vit_bords)
982 DoubleTab vit_bord_ale;
985 if (type ==
"Champ_front_ALE")
988 c.remplir_vit_som_bord_ALE(temps);
989 vit_bord_ale = c.get_vit_som_bord_ALE();
991 else if (type ==
"Champ_front_ALE_lag")
994 c.remplir_vit_som_bord_ALE(temps);
995 vit_bord_ale = c.get_vit_som_bord_ALE();
997 else if (type ==
"Ch_front_input_ALE")
1000 c.remplir_vit_som_bord_ALE(temps);
1001 vit_bord_ale = c.get_vit_som_bord_ALE();
1003 else if (type ==
"Champ_front_ALE_Beam")
1007 c.remplir_vit_som_bord_ALE(temps);
1008 vit_bord_ale = c.get_vit_som_bord_ALE();
1012 Cerr <<
"Unknown Champ_front_base type for moving boundary "
1013 <<
le_nom <<
": " << type << finl;
1018 for (
int dim = 0; dim <
dimension; dim++)
1019 for (
int i = 0; i < N_som; i++)
1021 vit_bords(i, dim) += vit_bord_ale(i, dim);
1027void Domaine_ALE::update_vertex_coordinates(
double dt)
1032 for (
int i = 0; i < N_som; i++)
1041void Domaine_ALE::laplacien(
const Probleme_base& pb,
const DoubleTab& vit_bords)
1043 const Domaine_VF& dom_VF = ref_cast(Domaine_VF, pb.
domaine_dis());
1045 fill_laplacian_matrix(dom_VF, cl);
1046 laplacien_compute_vertex_velocity(dom_VF, cl, vit_bords);
1050void Domaine_ALE::build_laplacian_matrix(
const Domaine_VF& le_dom_VF,
1058 Stencil stencil(0, 2);
1059 for (
int e = 0; e < ne_tot; e++)
1060 for (
int is = 0; is < nb_som_ele; is++)
1061 for (
int js = is + 1; js < nb_som_ele; js++)
1063 int i = e_s(e, is), j = e_s(e, js);
1064 if (i > j) {
int tmp = i; i = j; j = tmp; }
1065 stencil.append_line(i, j);
1066 stencil.append_line(j, i);
1067 stencil.append_line(i, i);
1068 stencil.append_line(j, j);
1071 tableau_trier_retirer_doublons(stencil);
1074 laplacian_matrix_ = Matrice_Morse_Sym(mat);
1075 laplacian_matrix_.set_est_definie(1);
1076 Cout <<
"Domaine_ALE::build_laplacian_matrix: " << laplacian_matrix_.nb_lignes()
1077 <<
" rows, " << laplacian_matrix_.nb_colonnes() <<
" columns." << finl;
1080void Domaine_ALE::fill_laplacian_matrix(
const Domaine_VF& le_dom_VF,
1083 if (laplacian_matrix_.nb_lignes() !=
nb_som_tot())
1084 build_laplacian_matrix(le_dom_VF, dom_cl);
1086 laplacian_matrix_.get_set_coeff() = 0.0;
1098 const double mijK = (
dimension == 2) ? 1. / 4. : 1. / 9.;
1105 for (
int e = 0; e < ne_tot; e++)
1107 const double volume = le_dom_VF.
volumes(e);
1108 for (
int isom = 0; isom < nb_som_ele; isom++)
1110 int facei = e_f(e, isom), ii = e_s(e, isom);
1111 for (
int jsom = isom + 1; jsom < nb_som_ele; jsom++)
1113 int i = ii, facej = e_f(e, jsom), j = e_s(e, jsom);
1114 if (i > j) {
int tmp = i; i = j; j = tmp; }
1116 double coeffij = 0.0;
1118 coeffij += normales(facei, d) * normales(facej, d);
1120 coeffij *= mijK / (volume * volume);
1122 laplacian_matrix_(i, j) += coeffij;
1123 laplacian_matrix_(i, i) -= coeffij;
1124 laplacian_matrix_(j, j) -= coeffij;
1133 for (
int n_bord = 0; n_bord < le_dom_VF.
nb_front_Cl(); n_bord++)
1136 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
1138 && !sub_type(Periodique, la_cl.valeur()))
1141 const int num2 = num1 + le_bord.
nb_faces();
1142 for (
int face = num1; face < num2; face++)
1143 for (
int isom = 0; isom <
dimension; isom++)
1145 le_dom_VF.
face_sommets(face, isom)) = ALE_PENALIZATION;
1160 for (
int i = 0; i < nf; i++)
1161 for (
int k = 0; k < nspf; k++)
1162 laplacian_matrix_(sommets(i, k), sommets(i, k)) = ALE_PENALIZATION;
1166void Domaine_ALE::laplacien_compute_vertex_velocity(
const Domaine_VF& le_dom_VF,
1168 const DoubleTab& vit_bords)
1170 DoubleVect solution(laplacian_rhs_);
1172 const int nbsom =
nb_som();
1174 for (
int comp = 0; comp < nb_comp; comp++)
1176 laplacian_rhs_ = 0.;
1190 for (
int i = 0; i < nf; i++)
1191 for (
int k = 0; k < nspf; k++)
1192 laplacian_rhs_(sommets(i, k)) = ALE_PENALIZATION * vit_bords(sommets(i, k), comp);
1195 laplacian_rhs_.echange_espace_virtuel();
1198 if (laplacian_rhs_.mp_max_abs_vect() >= 1.e-15)
1200 solv.resoudre_systeme(laplacian_matrix_, laplacian_rhs_, solution);
1201 for (
int som = 0; som < nbsom; som++)
1205 for (
int som = 0; som < nbsom; som++)
1214 const int nb_faces_tot = le_dom_VF.
face_sommets().dimension_tot(0);
1216 IntVect fait(nb_faces_tot);
1218 for (
int n_bord = 0; n_bord < le_dom_VF.
nb_front_Cl(); n_bord++)
1221 if (!sub_type(Periodique, la_cl.valeur()))
continue;
1222 const Periodique& la_cl_period = ref_cast(Periodique, la_cl.valeur());
1223 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
1225 for (
int num_face = 0; num_face < nfin; num_face++)
1227 int face = le_bord.
num_face(num_face);
1228 if (fait(face) == 0)
1232 fait(faassociee) = 1;
1233 for (
int isom = 0; isom < nb_som_face; isom++)
1236 int node_dst = le_dom_VF.
face_sommets(faassociee, isom);
1237 for (
int comp = 0; comp < nb_comp; comp++)
1252void Domaine_ALE::structural_dynamics(
const Probleme_base& pb,
const DoubleTab& vit_bords,
1255 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, pb.
domaine_dis());
1256 const Domaine_Cl_VEF& domaine_Cl_VEF = ref_cast(Domaine_Cl_VEF,
1261 IntVect tag_nodes_bords(
nb_som());
1263 tag_nodes_bords = 0;
1265 for (
int n_bord = 0; n_bord < domaine_VEF.
nb_front_Cl(); n_bord++)
1267 const Front_VF& le_bord = ref_cast(Front_VF,
1270 const int num2 = num1 + le_bord.
nb_faces();
1271 for (
int face = num1; face < num2; face++)
1272 for (
int isom = 0; isom <
dimension; isom++)
1273 tag_nodes_bords[domaine_VEF.
face_sommets(face, isom)] = 1;
1275 tag_nodes_bords.echange_espace_virtuel();
1278 for (
int i = 0; i <
nb_som(); i++)
1303 auto disc = [&](
const Nom& type,
const Nom& name,
const Nom& unit,
1308 field->add_synonymous(name);
1311 if (motlu ==
"ALEMeshVelocity" && !ALEMeshVelocity_)
1312 disc(
"vitesse",
"ALEMeshVelocity",
"m/s",
dimension, ALEMeshVelocity_);
1313 else if (motlu ==
"ALEMeshTotalDisplacement" && !ALEMeshTotalDisplacement_)
1314 disc(
"vitesse",
"ALEMeshTotalDisplacement",
"m",
dimension, ALEMeshTotalDisplacement_);
1315 else if (motlu ==
"ALEMeshStructuralPressure" && !ALEMeshStructuralPressure_)
1316 { assert(
getMeshMotionModel() == 1); disc(
"champ_elem",
"ALEMeshStructuralPressure",
"Pa", 1, ALEMeshStructuralPressure_); }
1317 else if (motlu ==
"ALEMeshStructuralVonMises" && !ALEMeshStructuralVonMises_)
1318 { assert(
getMeshMotionModel() == 1); disc(
"champ_elem",
"ALEMeshStructuralVonMises",
"Pa", 1, ALEMeshStructuralVonMises_); }
1319 else if (motlu ==
"ALEMeshStructuralForces" && !ALEMeshStructuralForces_)
1324 disc(
"vitesse",
"ALEMeshStructuralForces",
"N",
dimension, ALEMeshStructuralForces_);
1330 if (un_nom ==
"ALEMeshVelocity" && ALEMeshVelocity_)
return ALEMeshVelocity_.valeur();
1331 if (un_nom ==
"ALEMeshTotalDisplacement" && ALEMeshTotalDisplacement_)
return ALEMeshTotalDisplacement_.valeur();
1332 if (un_nom ==
"ALEMeshStructuralPressure"&& ALEMeshStructuralPressure_)
return ALEMeshStructuralPressure_.valeur();
1333 if (un_nom ==
"ALEMeshStructuralVonMises"&& ALEMeshStructuralVonMises_)
return ALEMeshStructuralVonMises_.valeur();
1334 if (un_nom ==
"ALEMeshStructuralForces" && ALEMeshStructuralForces_)
return ALEMeshStructuralForces_.valeur();
1335 throw std::runtime_error(std::string(
"Field ") + un_nom.
getString() +
" not found!");
1340 if (un_nom ==
"ALEMeshVelocity" && ALEMeshVelocity_) { ref_champ = ALEMeshVelocity_.valeur();
return true; }
1341 if (un_nom ==
"ALEMeshTotalDisplacement" && ALEMeshTotalDisplacement_) { ref_champ = ALEMeshTotalDisplacement_.valeur();
return true; }
1342 if (un_nom ==
"ALEMeshStructuralPressure"&& ALEMeshStructuralPressure_) { ref_champ = ALEMeshStructuralPressure_.valeur();
return true; }
1343 if (un_nom ==
"ALEMeshStructuralVonMises"&& ALEMeshStructuralVonMises_) { ref_champ = ALEMeshStructuralVonMises_.valeur();
return true; }
1344 if (un_nom ==
"ALEMeshStructuralForces" && ALEMeshStructuralForces_) { ref_champ = ALEMeshStructuralForces_.valeur();
return true; }
1357 if (ALEMeshVelocity_) noms_compris.add(
"ALEMeshVelocity");
1358 if (ALEMeshTotalDisplacement_) noms_compris.add(
"ALEMeshTotalDisplacement");
1359 if (ALEMeshStructuralPressure_) noms_compris.add(
"ALEMeshStructuralPressure");
1360 if (ALEMeshStructuralVonMises_) noms_compris.add(
"ALEMeshStructuralVonMises");
1361 if (ALEMeshStructuralForces_) noms_compris.add(
"ALEMeshStructuralForces");
1363 if (opt == DESCRIPTION)
1364 Cerr <<
que_suis_je() <<
" : " << noms_compris << finl;
1366 nom.add(noms_compris);
1375 for (
int i = 0; i < noms.size(); i++)
1378 Domaine& dom_new = ref_cast(Domaine,
interprete().objet(noms[i]));
const Noms & neumann_boundary_names() const
virtual void verifie_valeurs_cl()
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Champ_front_base Classe de base pour la hierarchie des champs aux frontieres.
virtual void creer_champ(const Motcle &motlu)=0
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
static void verifier(const char *const msg, double)
virtual bool is_ef() const
virtual bool is_PolyMAC_MPFA() 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
virtual const MD_Vector & md_vector_sommets() const
int_t nb_elem_tot() const
DoubleTab_t & les_sommets()
int rang_frontiere(const Nom &) const
const Frontiere_t & frontiere(int i) const
void resetSommetsCoordinates()
const DoubleTab_t & coord_sommets() const
void saveSommetsCoordinates()
virtual const MD_Vector & md_vector_elements() const
double coord(int_t i, int j) const
const int & getBeamNbModes(const int &) const
DoubleTab interpolationOnThe3DSurface(const int &, const double &x, const double &y, const double &z, const DoubleTab &u, const DoubleTab &R) const
void update_coord_dom_extrait_surface()
const DoubleTab & getMeshTransformationGradient() const
const DoubleTab & getMeshPosition() const
const int & getBeamNbBeam() const
void reading_vit_bords_ALE(Entree &is)
int getMeshMotionModel() const
void reading_projection_ALE_boundary(Entree &is)
void reading_beam_model(Entree &is)
bool extrait_surf_dom_deformable_
const int & getBeamNbPlanes(const int &) const
void updateMetrics(Domaine_dis_base &, Probleme_base &)
void initialiser(double temps, Domaine_dis_base &, Probleme_base &) override
void create_field(OWN_PTR(Champ_Inc_base)&, const std::string &, int, const Motcle &, const Probleme_base &) const
void update_after_post(double temps) override
const DoubleTab & getBeamRotation(const int &, const int &) const
const DoubleTab & getMeshStress() const
void apply_old_to_new_volume_scaling(DoubleTab &, const Domaine_dis_base &) const override
void validateTimeStep() override
const IntTab & les_elems_extrait_surf_reference() const
void update_post_fields(double temps, double dt)
void reading_solver_moving_mesh_ALE(Entree &is)
int save_additional_state(Sortie &, const Probleme_base &) const override
const DoubleVect & getMeshPbVonMises() const
YAML_data make_yaml(const std::string &, int, const Probleme_base &) const
void resumptionCoords(DoubleTab &)
const DoubleTab & getMeshDisplacement() const
Structural_dynamic_mesh_model str_mesh_model
std::vector< YAML_data > data_a_sauvegarder(const Probleme_base &) const override
const Champ_base & get_champ(const Motcle &) const override
ALE_CheckpointManager checkpoint_manager_
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base)&ref_champ) const override
void set_dt(double &dt) override
double interpolationPhiOnThe3DSurface(const int &, const double &x, const double &y, const double &z, const int &comp, const DoubleTab &u) const
const int & getBeamLongitudinalAxis(const int &) const
IntTab les_elems_extrait_surf_reference_
ALE_ProjectionManager projection_manager_
void mettre_a_jour(double temps, Domaine_dis_base &, Probleme_base &) override
void update_ALE_projection(double, Nom &, Champ_front_ALE_projection &, int)
const int & getMeshStressNbComp() const
void associer_vitesse_lagrangienne(const Nom &nom_pb, const Nom &nom_champ)
void reading_structural_dynamic_mesh_model(Entree &is)
void reading_ALE_Neumann_BC_for_grid_problem(Entree &is)
OBS_PTR(Equation_base) eq
const DoubleTab & getMeshPbForceFace() const
const int & getMeshTransformationGradientNbComp() const
int Coupling_ICoCo_method
const DoubleTab & getBeamDisplacement(const int &, const int &) const
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
Equation_base & getEquation()
const DoubleTab & getMeshVelocity() const
TRUST_Vector< OWN_PTR(Champ_front_base)> les_champs_front
OWN_PTR(Champ_Inc_base) ALEMeshVelocity_
const Nom & getBeamName(const int &) const
DoubleTab & vitesse_faces()
bool is_resumption() const
Nom generate_field_tag(const Champ_Inc_base &, const Probleme_base &) const
ALE_MetricsUpdater metrics_updater_
void computeFluidForceOnBeam(const int &)
const int & getMeshReferenceConfigurationNbComp() const
void clear() override
Reset the Domaine completely except for its name.
DoubleTab & getBeamVelocity(const int &, const double &tps, const double &dt)
DoubleTab ALE_mesh_velocity
void ajouter_correctif_volumique(const DoubleTab &, const DoubleTab &, double, DoubleTab &) const override
void resumptionStructuralDynamicsMesh(double, DoubleTab &, DoubleTab &, DoubleTab &, DoubleTab &, DoubleTab &, DoubleTab &, DoubleTab &)
int restore_additional_state(Entree &, Probleme_base &) override
void creer_champ(const Motcle &, const Probleme_base &) override
bool getUpdateTheGrid() override
const DoubleTab & getMeshReferenceConfiguration() const
const int & getBeamBendingDirection(const int &, const int &) const
ALE_BeamCoupling beam_coupling_
DoubleTab & calculer_vitesse_faces(DoubleTab &, int, int, IntTab &)
void setUpdateTheGrid(bool) override
const DoubleTab & getMeshAcceleration() const
double computeDtBeam(Domaine_dis_base &, const int &)
const DoubleVect & getMeshPbPressure() const
Champs_compris champs_compris_
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
virtual const Champ_Inc_base & inconnue() const
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
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.
const MD_Vector & md_vector_faces() const
DoubleVect & volumes_entrelaces()
int nb_faces_tot() const
renvoie le nombre total de faces.
virtual double face_normales(int face, int comp) const
double volumes(int i) const
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
int nb_som_face() const
renvoie le nombre de sommets par face.
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
int oriente_normale(int f, int e) const
virtual void validateTimeStep()
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
bool mesh_update_required_
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Frontiere_dis_base & frontiere_dis(const Nom &) const
Renvoie la frontiere de Nom nom.
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....
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
const IntTab_t & les_sommets() const
Renvoie le tableau des sommets de toutes les faces.
int num_premiere_face() const
int num_face(const int) const
const Faces_t & faces() const
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
Interprete un bloc d'instructions dans le jeu de donnees.
static Interprete_bloc & interprete_courant()
renvoie l'interprete_bloc en train d'etre lu dans le jeu de donnees.
const Noms & les_noms() const
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
Une chaine de caractere (Nom) en majuscules.
static void nettoie(Domaine_t &)
class Nom Une chaine de caractere pour nommer les objets de TRUST
const std::string & getString() const
Un tableau de chaine de caracteres (VECT(Nom)).
const Interprete & interprete() const
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.
static double precision_geom
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
const char * le_type() const
Donne le nom du type de l'Objet_U.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
virtual bool checkOutputIntEntry(const Nom &name) const
virtual int getOutputIntValue(const Nom &name) const
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
const Champ_base & get_champ(const Motcle &nom) const override
const Discretisation_base & discretisation() const
Renvoie la discretisation associee au probleme.
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 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 void uninit_sequential_domain(Domaine_32_64< _SIZE_ > &dom)
methode utilisee par les interpretes qui modifient le domaine (sequentiel), detruit les descripteurs ...
double temps_courant() const
Renvoie le temps courant.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
int nb_pas_dt() const
Renvoie le nombre de pas de temps effectues.
class SolveurSys Un SolveurSys represente n'importe qu'elle classe
Classe de base des flux de sortie.
_SIZE_ dimension_tot(int) const override
_SIZE_ dimension(int d) const
_TYPE_ mp_max_abs_vect(Mp_vect_options opt=VECT_REAL_ITEMS) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
classe YAML_data : collection of all needed information for data to save/restore in order to write th...