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);
104 volumes_old_.reset();
105 volumes_entrelaces_old_.reset();
134 Cout <<
"Initialization of Coupling_ICoCo_Method " << res << finl;
140 int iCoCoImplicitIteration = -1;
141 bool resetCoordinates =
false;
143 if ((eq.valeur()).probleme().checkOutputIntEntry(
"iCoCoImplicitIteration"))
145 iCoCoImplicitIteration = (eq.valeur()).probleme().getOutputIntValue(
"iCoCoImplicitIteration");
146 Cerr <<
"Domaine_ALE::mettre_a_jour, iCoCoImplicitIteration: "
147 << iCoCoImplicitIteration << finl;
155 if ((eq.valeur()).probleme().checkOutputIntEntry(
"acceleratedGridMode"))
157 (eq.valeur()).probleme().getOutputIntValue(
"acceleratedGridMode");
160 if (iCoCoImplicitIteration == 0)
165 else if (iCoCoImplicitIteration > 0)
168 resetCoordinates =
true;
178 compute_vertex_velocities(temps, pb);
182 Cout <<
"Updating the mesh!" << finl;
184 update_vertex_coordinates(dt);
202 bool has_periodic =
false;
203 for (
int cl = 0; cl < zcl.
nb_cond_lim() && !has_periodic; cl++)
247 if (ALEMeshVelocity_)
249 ALEMeshVelocity_->valeurs() = ALEMeshVelocity;
250 ALEMeshVelocity_->mettre_a_jour(temps);
253 if (ALEMeshTotalDisplacement_)
257 const int N = ALEMeshVelocity.
size() / D;
258 DoubleTab& disp = ALEMeshTotalDisplacement_->valeurs();
259 for (
int i = 0; i < N; i++)
260 for (
int d = 0; d < D; d++)
261 disp(i, d) += ALEMeshVelocity(i, d) * dt;
263 ALEMeshTotalDisplacement_->mettre_a_jour(temps);
268 if (ALEMeshStructuralPressure_)
270 if (ALEMeshStructuralVonMises_)
272 if (ALEMeshStructuralForces_)
278void Domaine_ALE::validate_ale_setup(
const Probleme_base& pb)
const
282 for (
int i = 0; i < neumann.size(); i++)
286 Cerr <<
"In 'ALE_Neumann_BC_for_grid_problem', boundary " << neumann[i]
287 <<
" is already declared as a moving boundary in 'Imposer_vit_bords_ALE'." << finl;
296 Cerr <<
"Discretization not recognized by ALE!" << finl;
297 Cerr <<
"Use VEFPreP1B, PolyMAC_P0 or EF and restart." << finl;
309 if (!sub_type(Entree_fluide_vitesse_imposee_ALE, la_cl.valeur()))
310 Cerr <<
"Mobile ALE boundary: replace " << la_cl->que_suis_je()
311 <<
" on " <<
le_nom <<
" with Frontiere_ouverte_vitesse_imposee_ALE" << finl;
315 Cerr <<
"Warning: ALE simulation without any moving boundary!" << finl;
321 const bool initialized = (
vf.size_array() != 0);
322 if (initialized)
return;
324 Cerr <<
"Domaine_ALE::initialize" << finl;
325 validate_ale_setup(pb);
330 const int nb_faces = le_dom_VF.
nb_faces();
345 volumes_old_ = le_dom_VF.
volumes();
348 volumes_sommets_thilde_old_ = ref_cast(
Domaine_EF, le_dom_VF).volumes_sommets_thilde();
359 if (lagrangian_velocity_imposed_)
364 build_lagrangian_vertex_mapping(pb_v, champ);
366 Cerr <<
"Domaine_ALE::initialiser : MEDCoupling required for imposed Lagrangian velocity." << finl;
375 compute_vertex_velocities(temps, pb);
392 int nb_som_face, IntTab& face_sommets)
398 for (
int i = 0; i < nb_faces; i++)
400 for (
int s = 0; s < nb_som_face; s++)
401 vf(i, j) += vit_maillage(face_sommets(i, s), j);
402 vf(i, j) /= nb_som_face;
405 vf.echange_espace_virtuel();
421 volumes_old_ = le_dom_VF.
volumes();
422 if (!eq->probleme().discretisation().is_ef())
425 volumes_sommets_thilde_old_ = ref_cast(
Domaine_EF, le_dom_VF).volumes_sommets_thilde();
432 double dt, DoubleTab& deriveeALE)
const
435 const DoubleVect& volumes_entrelaces =
436 ref_cast(
Domaine_VF, eq->domaine_dis()).volumes_entrelaces();
438 for (
int f = 0; f < nf_tot; f++)
440 deriveeALE(f, d) = v(f, d) * volumes_entrelaces_old_(f) / volumes_entrelaces(f) / dt
458 int nfin = ndeb + le_bord.
nb_faces();
459 for (
int f = ndeb; f < nfin; f++)
464 double moy = 0.5 * (deriveeALE(f, d) + deriveeALE(fass, d));
465 deriveeALE(f, d) = moy;
466 deriveeALE(fass, d) = moy;
484 const DoubleVect& volumes = dvf.
volumes();
485 for (
int e = 0; e < I; e++)
486 for (
int n = 0; n < N; n++)
487 inco(e, n) *= volumes_old_(e) / volumes(e);
492 for (
int f = 0; f < I; f++)
493 for (
int n = 0; n < N; n++)
494 inco(f, n) *= volumes_entrelaces_old_(f) / ve(f);
498 const DoubleVect& vs = ref_cast(
Domaine_EF, dvf).volumes_sommets_thilde();
499 for (
int s = 0; s < I; s++)
500 for (
int n = 0; n < N; n++)
501 inco(s, n) *= volumes_sommets_thilde_old_(s) / vs(s);
505 Cerr <<
"Domaine_ALE::apply_old_to_new_volume_scaling: incompatible dimension "
516 double tinit, DoubleTab& u_n, DoubleTab& v_n, DoubleTab& a_n,
517 DoubleTab& x_n, DoubleTab& B0_n, DoubleTab& Ft_n, DoubleTab& Stress_n)
519 str_mesh_model.resumptionMesh(tinit, u_n, v_n, a_n, x_n, B0_n, Ft_n, Stress_n);
568 const int& i,
const double& x,
const double& y,
const double& z,
569 const DoubleTab& u,
const DoubleTab& R)
const
571 return beam_coupling_.interpolationOnThe3DSurface(i, x, y, z, u, R);
575 const int& i,
const double& x,
const double& y,
const double& z,
576 const int& comp,
const DoubleTab& u)
const
578 return beam_coupling_.interpolationPhiOnThe3DSurface(i, x, y, z, comp, u);
626 int nbComp,
const Motcle& directive,
643 for (
int i = 0; i < nbValues; i++)
645 coord(i, k) = ValueOf_MeshCoords(i, k);
651 Motcle accolade_ouverte(
"{"), accolade_fermee(
"}"), motlu;
655 if (motlu != accolade_ouverte)
657 Cerr <<
"Error reading moving boundary velocities: expected "
658 << accolade_ouverte <<
", got " << motlu << finl;
663 Cerr <<
"Number of ALE boundaries : " <<
nb_bords_ALE << finl;
671 if (motlu == accolade_fermee)
break;
672 Cerr <<
"Reading velocity imposed on " << nomlu <<
"..." << finl;
680 Motcle accolade_ouverte(
"{"), accolade_fermee(
"}"), motlu;
684 if (motlu != accolade_ouverte)
686 Cerr <<
"Error reading ALE mesh solver: expected "
687 << accolade_ouverte <<
", got " << motlu << finl;
692 solv.nommer(
"ALE_solver");
698 if (motlu == accolade_fermee)
break;
721 Motcle accolade_ouverte(
"{"), accolade_fermee(
"}"), motlu;
724 std::vector<double> val_prop;
727 if (motlu != accolade_ouverte)
729 Cerr <<
"Error reading structural dynamic mesh model: expected "
730 << accolade_ouverte <<
", got " << motlu << finl;
739 if (motlu ==
"Mfront_library")
740 { is >> nomlu;
str_mesh_model.setMfrontLibraryPath(nomlu.getString());
continue; }
741 if (motlu ==
"Mfront_model_name")
742 { is >> nomlu;
str_mesh_model.setMfrontModelName(nomlu.getString());
continue; }
743 if (motlu ==
"Mfront_hypothesis")
744 { is >> nomlu;
str_mesh_model.setMfrontHypothesis(nomlu.getString());
continue; }
745 if (motlu ==
"Mfront_material_property")
748 if (motlu != accolade_ouverte)
749 { Cerr <<
"Error: expected { in Mfront_material_property" << finl;
Process::exit(); }
751 std::string nom_prop(nomlu);
756 val_prop.push_back(var_double);
758 if (motlu == accolade_fermee)
break;
759 var_double = std::stod(motlu.getString());
764 if (motlu ==
"Density")
765 { is >> var_double;
str_mesh_model.setDensity(var_double);
continue; }
766 if (motlu ==
"Inertial_Damping")
767 { is >> var_double;
str_mesh_model.setInertialDamping(var_double);
continue; }
768 if (motlu ==
"Time_Step_Safety_Coefficient")
769 { is >> var_double;
str_mesh_model.setDtSafetyCoefficient(var_double);
continue; }
770 if (motlu ==
"Grid_Dt_Min")
771 { is >> var_double;
str_mesh_model.setGridDtMin(var_double);
continue; }
772 if (motlu ==
"Configuration_Reset_Dt")
773 { is >> var_double;
str_mesh_model.setConfigurationResetDt(var_double);
continue; }
774 if (motlu ==
"Max_Added_Mass_Ratio")
775 { is >> var_double;
str_mesh_model.setMaxAddedMassRatio(var_double);
continue; }
776 if (motlu == accolade_fermee)
break;
780 { Cerr <<
"Error: density not provided in structural dynamic mesh model." << finl;
Process::exit(); }
817 Cerr <<
"Update of the fluid grid forced from ICoCo" << finl;
831 external_pb_name_ = nom_pb;
832 external_velocity_field_name_ = nom_champ;
833 lagrangian_velocity_imposed_ =
true;
836void Domaine_ALE::check_external_vertex_velocity_compatibility(
const DoubleTab& valeurs)
const
840 Cerr <<
"Domaine_ALE: Lagrangian velocity field must have " <<
dimension
841 <<
" components per node (line_size=" << valeurs.
line_size() <<
")." << finl;
846void Domaine_ALE::build_lagrangian_vertex_mapping(
const Probleme_base& pb_v,
850 Cerr <<
"Domaine_ALE::build_lagrangian_vertex_mapping: MEDCoupling required." << finl;
854 const DoubleTab& ale_coords =
sommets_;
855 const DoubleTab& valeurs = champ.valeurs();
857 check_external_vertex_velocity_compatibility(valeurs);
860 Cerr <<
"Domaine_ALE: external velocity field has " << valeurs.
dimension(0)
861 <<
" nodes but domain has " << ext_coords.
dimension(0) <<
" nodes." << finl;
865 const int nb_ext = ext_coords.
dimension(0);
866 const int nb_ale = ale_coords.
dimension(0);
870 external_vertex_id_for_ale_vertex_.resize(nb_ale);
871 external_vertex_id_for_ale_vertex_ = -1;
881 MCAuto<DataArrayDouble> ext_pts(DataArrayDouble::New());
882 MCAuto<DataArrayDouble> ale_pts(DataArrayDouble::New());
883 ext_pts->alloc(nb_ext, dim);
884 ale_pts->alloc(nb_ale, dim);
886 double* ext_ptr = ext_pts->getPointer();
887 for (
int i = 0; i < nb_ext; i++)
888 for (
int d = 0; d < dim; d++)
889 ext_ptr[i * dim + d] = ext_coords(i, d);
891 double* ale_ptr = ale_pts->getPointer();
892 for (
int i = 0; i < nb_ale; i++)
893 for (
int d = 0; d < dim; d++)
894 ale_ptr[i * dim + d] = ale_coords(i, d);
896 MCAuto<DataArrayIdType> closest(ext_pts->findClosestTupleId(ale_pts));
897 const double tol2 = tol * tol;
899 for (
int i = 0; i < nb_ale; i++)
901 const int j =
static_cast<int>(closest->getIJ(i, 0));
903 for (
int d = 0; d < dim; d++)
905 const double diff = ale_coords(i, d) - ext_coords(j, d);
906 dist2 += diff * diff;
909 external_vertex_id_for_ale_vertex_[i] = j;
915 const int total_unmatched =
static_cast<int>(
mp_sum(unmatched));
916 if (total_unmatched > 0)
917 Cerr <<
"Domaine_ALE: " << total_unmatched
918 <<
" ALE nodes have no external match (tol=" << tol <<
")." << finl;
923void Domaine_ALE::compute_vertex_velocities(
double temps,
const Probleme_base& pb)
925 if (lagrangian_velocity_imposed_)
928 const Probleme_base& pb_v = ref_cast(Probleme_base,
interprete().objet(external_pb_name_));
929 const DoubleTab& valeurs = pb_v.
get_champ(external_velocity_field_name_).
valeurs();
931 for (
int i = 0; i <
nb_som(); i++)
933 const int j = external_vertex_id_for_ale_vertex_[i];
942 Cerr <<
"Domaine_ALE::compute_vertex_velocities: MEDCoupling required." << finl;
948 remplir_vitesse_bord(pb, temps, vit_bords);
958 laplacien(pb, vit_bords);
961 structural_dynamics(pb, vit_bords, temps);
971void Domaine_ALE::remplir_vitesse_bord(
const Probleme_base& pb,
double temps,
972 DoubleTab& vit_bords)
983 DoubleTab vit_bord_ale;
986 if (type ==
"Champ_front_ALE")
989 c.remplir_vit_som_bord_ALE(temps);
990 vit_bord_ale = c.get_vit_som_bord_ALE();
992 else if (type ==
"Champ_front_ALE_lag")
995 c.remplir_vit_som_bord_ALE(temps);
996 vit_bord_ale = c.get_vit_som_bord_ALE();
998 else if (type ==
"Ch_front_input_ALE")
1001 c.remplir_vit_som_bord_ALE(temps);
1002 vit_bord_ale = c.get_vit_som_bord_ALE();
1004 else if (type ==
"Champ_front_ALE_Beam")
1008 c.remplir_vit_som_bord_ALE(temps);
1009 vit_bord_ale = c.get_vit_som_bord_ALE();
1013 Cerr <<
"Unknown Champ_front_base type for moving boundary "
1014 <<
le_nom <<
": " << type << finl;
1019 for (
int dim = 0; dim <
dimension; dim++)
1020 for (
int i = 0; i < N_som; i++)
1022 vit_bords(i, dim) += vit_bord_ale(i, dim);
1028void Domaine_ALE::update_vertex_coordinates(
double dt)
1033 for (
int i = 0; i < N_som; i++)
1042void Domaine_ALE::laplacien(
const Probleme_base& pb,
const DoubleTab& vit_bords)
1044 const Domaine_VF& dom_VF = ref_cast(Domaine_VF, pb.
domaine_dis());
1046 fill_laplacian_matrix(dom_VF, cl);
1047 laplacien_compute_vertex_velocity(dom_VF, cl, vit_bords);
1051void Domaine_ALE::build_laplacian_matrix(
const Domaine_VF& le_dom_VF,
1059 Stencil stencil(0, 2);
1060 for (
int e = 0; e < ne_tot; e++)
1061 for (
int is = 0; is < nb_som_ele; is++)
1062 for (
int js = is + 1; js < nb_som_ele; js++)
1064 int i = e_s(e, is), j = e_s(e, js);
1065 if (i > j) {
int tmp = i; i = j; j = tmp; }
1066 stencil.append_line(i, j);
1067 stencil.append_line(j, i);
1068 stencil.append_line(i, i);
1069 stencil.append_line(j, j);
1072 tableau_trier_retirer_doublons(stencil);
1075 laplacian_matrix_ = Matrice_Morse_Sym(mat);
1076 laplacian_matrix_.set_est_definie(1);
1077 Cout <<
"Domaine_ALE::build_laplacian_matrix: " << laplacian_matrix_.nb_lignes()
1078 <<
" rows, " << laplacian_matrix_.nb_colonnes() <<
" columns." << finl;
1081void Domaine_ALE::fill_laplacian_matrix(
const Domaine_VF& le_dom_VF,
1084 if (laplacian_matrix_.nb_lignes() !=
nb_som_tot())
1085 build_laplacian_matrix(le_dom_VF, dom_cl);
1087 laplacian_matrix_.get_set_coeff() = 0.0;
1099 const double mijK = (
dimension == 2) ? 1. / 4. : 1. / 9.;
1106 for (
int e = 0; e < ne_tot; e++)
1108 const double volume = le_dom_VF.
volumes(e);
1109 for (
int isom = 0; isom < nb_som_ele; isom++)
1111 int facei = e_f(e, isom), ii = e_s(e, isom);
1112 for (
int jsom = isom + 1; jsom < nb_som_ele; jsom++)
1114 int i = ii, facej = e_f(e, jsom), j = e_s(e, jsom);
1115 if (i > j) {
int tmp = i; i = j; j = tmp; }
1117 double coeffij = 0.0;
1119 coeffij += normales(facei, d) * normales(facej, d);
1121 coeffij *= mijK / (volume * volume);
1123 laplacian_matrix_(i, j) += coeffij;
1124 laplacian_matrix_(i, i) -= coeffij;
1125 laplacian_matrix_(j, j) -= coeffij;
1134 for (
int n_bord = 0; n_bord < le_dom_VF.
nb_front_Cl(); n_bord++)
1137 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
1139 && !sub_type(Periodique, la_cl.valeur()))
1142 const int num2 = num1 + le_bord.
nb_faces();
1143 for (
int face = num1; face < num2; face++)
1144 for (
int isom = 0; isom <
dimension; isom++)
1146 le_dom_VF.
face_sommets(face, isom)) = ALE_PENALIZATION;
1161 for (
int i = 0; i < nf; i++)
1162 for (
int k = 0; k < nspf; k++)
1163 laplacian_matrix_(sommets(i, k), sommets(i, k)) = ALE_PENALIZATION;
1167void Domaine_ALE::laplacien_compute_vertex_velocity(
const Domaine_VF& le_dom_VF,
1169 const DoubleTab& vit_bords)
1171 DoubleVect solution(laplacian_rhs_);
1173 const int nbsom =
nb_som();
1175 for (
int comp = 0; comp < nb_comp; comp++)
1177 laplacian_rhs_ = 0.;
1191 for (
int i = 0; i < nf; i++)
1192 for (
int k = 0; k < nspf; k++)
1193 laplacian_rhs_(sommets(i, k)) = ALE_PENALIZATION * vit_bords(sommets(i, k), comp);
1196 laplacian_rhs_.echange_espace_virtuel();
1199 if (laplacian_rhs_.mp_max_abs_vect() >= 1.e-15)
1201 solv.resoudre_systeme(laplacian_matrix_, laplacian_rhs_, solution);
1202 for (
int som = 0; som < nbsom; som++)
1206 for (
int som = 0; som < nbsom; som++)
1215 const int nb_faces_tot = le_dom_VF.
face_sommets().dimension_tot(0);
1217 IntVect fait(nb_faces_tot);
1219 for (
int n_bord = 0; n_bord < le_dom_VF.
nb_front_Cl(); n_bord++)
1222 if (!sub_type(Periodique, la_cl.valeur()))
continue;
1223 const Periodique& la_cl_period = ref_cast(Periodique, la_cl.valeur());
1224 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
1226 for (
int num_face = 0; num_face < nfin; num_face++)
1228 int face = le_bord.
num_face(num_face);
1229 if (fait(face) == 0)
1233 fait(faassociee) = 1;
1234 for (
int isom = 0; isom < nb_som_face; isom++)
1237 int node_dst = le_dom_VF.
face_sommets(faassociee, isom);
1238 for (
int comp = 0; comp < nb_comp; comp++)
1253void Domaine_ALE::structural_dynamics(
const Probleme_base& pb,
const DoubleTab& vit_bords,
1256 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, pb.
domaine_dis());
1257 const Domaine_Cl_VEF& domaine_Cl_VEF = ref_cast(Domaine_Cl_VEF,
1262 IntVect tag_nodes_bords(
nb_som());
1264 tag_nodes_bords = 0;
1266 for (
int n_bord = 0; n_bord < domaine_VEF.
nb_front_Cl(); n_bord++)
1268 const Front_VF& le_bord = ref_cast(Front_VF,
1271 const int num2 = num1 + le_bord.
nb_faces();
1272 for (
int face = num1; face < num2; face++)
1273 for (
int isom = 0; isom <
dimension; isom++)
1274 tag_nodes_bords[domaine_VEF.
face_sommets(face, isom)] = 1;
1276 tag_nodes_bords.echange_espace_virtuel();
1279 for (
int i = 0; i <
nb_som(); i++)
1304 auto disc = [&](
const Nom& type,
const Nom& name,
const Nom& unit,
1309 field->add_synonymous(name);
1312 if (motlu ==
"ALEMeshVelocity" && !ALEMeshVelocity_)
1313 disc(
"vitesse",
"ALEMeshVelocity",
"m/s",
dimension, ALEMeshVelocity_);
1314 else if (motlu ==
"ALEMeshTotalDisplacement" && !ALEMeshTotalDisplacement_)
1315 disc(
"vitesse",
"ALEMeshTotalDisplacement",
"m",
dimension, ALEMeshTotalDisplacement_);
1316 else if (motlu ==
"ALEMeshStructuralPressure" && !ALEMeshStructuralPressure_)
1317 { assert(
getMeshMotionModel() == 1); disc(
"champ_elem",
"ALEMeshStructuralPressure",
"Pa", 1, ALEMeshStructuralPressure_); }
1318 else if (motlu ==
"ALEMeshStructuralVonMises" && !ALEMeshStructuralVonMises_)
1319 { assert(
getMeshMotionModel() == 1); disc(
"champ_elem",
"ALEMeshStructuralVonMises",
"Pa", 1, ALEMeshStructuralVonMises_); }
1320 else if (motlu ==
"ALEMeshStructuralForces" && !ALEMeshStructuralForces_)
1325 disc(
"vitesse",
"ALEMeshStructuralForces",
"N",
dimension, ALEMeshStructuralForces_);
1331 if (un_nom ==
"ALEMeshVelocity" && ALEMeshVelocity_)
return ALEMeshVelocity_.valeur();
1332 if (un_nom ==
"ALEMeshTotalDisplacement" && ALEMeshTotalDisplacement_)
return ALEMeshTotalDisplacement_.valeur();
1333 if (un_nom ==
"ALEMeshStructuralPressure"&& ALEMeshStructuralPressure_)
return ALEMeshStructuralPressure_.valeur();
1334 if (un_nom ==
"ALEMeshStructuralVonMises"&& ALEMeshStructuralVonMises_)
return ALEMeshStructuralVonMises_.valeur();
1335 if (un_nom ==
"ALEMeshStructuralForces" && ALEMeshStructuralForces_)
return ALEMeshStructuralForces_.valeur();
1336 throw std::runtime_error(std::string(
"Field ") + un_nom.
getString() +
" not found!");
1341 if (un_nom ==
"ALEMeshVelocity" && ALEMeshVelocity_) { ref_champ = ALEMeshVelocity_.valeur();
return true; }
1342 if (un_nom ==
"ALEMeshTotalDisplacement" && ALEMeshTotalDisplacement_) { ref_champ = ALEMeshTotalDisplacement_.valeur();
return true; }
1343 if (un_nom ==
"ALEMeshStructuralPressure"&& ALEMeshStructuralPressure_) { ref_champ = ALEMeshStructuralPressure_.valeur();
return true; }
1344 if (un_nom ==
"ALEMeshStructuralVonMises"&& ALEMeshStructuralVonMises_) { ref_champ = ALEMeshStructuralVonMises_.valeur();
return true; }
1345 if (un_nom ==
"ALEMeshStructuralForces" && ALEMeshStructuralForces_) { ref_champ = ALEMeshStructuralForces_.valeur();
return true; }
1358 if (ALEMeshVelocity_) noms_compris.add(
"ALEMeshVelocity");
1359 if (ALEMeshTotalDisplacement_) noms_compris.add(
"ALEMeshTotalDisplacement");
1360 if (ALEMeshStructuralPressure_) noms_compris.add(
"ALEMeshStructuralPressure");
1361 if (ALEMeshStructuralVonMises_) noms_compris.add(
"ALEMeshStructuralVonMises");
1362 if (ALEMeshStructuralForces_) noms_compris.add(
"ALEMeshStructuralForces");
1364 if (opt == DESCRIPTION)
1365 Cerr <<
que_suis_je() <<
" : " << noms_compris << finl;
1367 nom.add(noms_compris);
1376 for (
int i = 0; i < noms.size(); i++)
1379 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...