18#include "elasticity.h"
20#include <boost/algorithm/string.hpp>
24template <
int dim,
int spacedim>
44template <
int dim,
int spacedim>
47 const std::string &ids_and_cad_file_names,
52 grid_in.
read(grid_file_name);
53#ifdef DEAL_II_WITH_OPENCASCADE
54 using map_type = std::map<types::manifold_id, std::string>;
56 for (
const auto &pair : Converter::to_value(ids_and_cad_file_names))
58 const auto &manifold_id = pair.first;
59 const auto &cad_file_name = pair.second;
60 const auto extension = boost::to_lower_copy(
61 cad_file_name.substr(cad_file_name.find_last_of(
'.') + 1));
63 if (extension ==
"iges" || extension ==
"igs")
65 else if (extension ==
"step" || extension ==
"stp")
69 ExcNotImplemented(
"We found an extension that we "
70 "do not recognize as a CAD file "
71 "extension. Bailing out."));
73 if ((std::get<0>(n_elements) == 0))
77 else if (spacedim == 3)
80 t->set_manifold(manifold_id,
87 TopoDS::Face(shape)));
90 (void)ids_and_cad_file_names;
91 AssertThrow(
false, ExcNotImplemented(
"Generation of the grid failed."));
97template <
int dim,
int spacedim>
101 if (
par.domain_type ==
"generate")
106 tria,
par.name_of_grid,
par.arguments_for_grid);
110 pcout <<
"Generating from name and argument failed." << std::endl
111 <<
"Trying to read from file name." << std::endl;
113 par.arguments_for_grid,
117 else if (
par.domain_type ==
"cylinder")
119 Assert(spacedim == 2, ExcInternalError());
121 std::cout <<
" ATTENTION: GRID: cirle of radius 1." << std::endl;
123 else if (
par.domain_type ==
"cheese")
125 Assert(spacedim == 2, ExcInternalError());
128 else if (
par.domain_type ==
"file")
132#ifdef DEAL_II_WITH_GMSH_API
133 std::string infile(
par.name_of_grid);
135 std::ifstream infile(
par.name_of_grid);
136 Assert(infile.good(), ExcIO());
145 Assert(
false, ExcInternalError());
149 tria.refine_global(
par.initial_refinement);
154template <
int dim,
int spacedim>
161 quadrature = std::make_unique<QGauss<spacedim>>(
par.fe_degree + 1);
163 std::make_unique<
QGauss<spacedim - 1>>(
par.fe_degree + 1);
167template <
int dim,
int spacedim>
172 dh.distribute_dofs(*
fe);
188 for (
const auto id :
par.dirichlet_ids)
192 std::map<types::boundary_id, const Function<spacedim, double> *>
194 for (
const auto id :
par.normal_flux_ids)
198 id, &
par.Neumann_bc));
245 auto inclusions_set =
249 owned_dofs[1] = inclusions_set.tensor_product(
291 <<
" (locally owned: " <<
owned_dofs[0].n_elements() <<
" + "
292 <<
owned_dofs[1].n_elements() <<
")" << std::endl;
296template <
int dim,
int spacedim>
314 const unsigned int dofs_per_cell =
fe->n_dofs_per_cell();
315 const unsigned int n_q_points =
quadrature->size();
318 std::vector<Vector<double>> rhs_values(n_q_points,
Vector<double>(spacedim));
319 std::vector<Tensor<2, spacedim>> grad_phi_u(dofs_per_cell);
320 std::vector<double> div_phi_u(dofs_per_cell);
321 std::vector<types::global_dof_index> local_dof_indices(dofs_per_cell);
323 for (
const auto &cell :
dh.active_cell_iterators())
324 if (cell->is_locally_owned())
331 for (
unsigned int q = 0; q < n_q_points; ++q)
333 for (
unsigned int k = 0; k < dofs_per_cell; ++k)
337 div_phi_u[k] = fe_values[
displacement].divergence(k, q);
339 for (
unsigned int i = 0; i < dofs_per_cell; ++i)
341 for (
unsigned int j = 0; j < dofs_per_cell; ++j)
345 scalar_product(grad_phi_u[i], grad_phi_u[j]) +
346 par.Lame_lambda * div_phi_u[i] * div_phi_u[j]) *
349 const auto comp_i =
fe->system_to_component_index(i).first;
351 rhs_values[q][comp_i] * fe_values.
JxW(q);
358 for (
unsigned int f = 0; f < GeometryInfo<spacedim>::faces_per_cell;
360 if (cell->face(f)->at_boundary())
364 if (std::find(
par.neumann_ids.begin(),
365 par.neumann_ids.end(),
366 cell->face(f)->boundary_id()) !=
367 par.neumann_ids.end())
369 fe_face_values.
reinit(cell, f);
370 for (
unsigned int q = 0;
374 double neumann_value = 0;
375 for (
int d = 0;
d < spacedim; ++
d)
377 par.Neumann_bc.value(
380 neumann_value /= spacedim;
381 for (
unsigned int i = 0; i < dofs_per_cell; ++i)
383 cell_rhs(i) += -neumann_value *
385 fe_face_values.
JxW(q);
390 cell->get_dof_indices(local_dof_indices);
391 constraints.distribute_local_to_global(cell_matrix,
403template <
int dim,
int spacedim>
409 "Setup dofs: Assemble Coupling sparsity");
413 std::vector<types::global_dof_index> dof_indices(
fe->n_dofs_per_cell());
414 std::vector<types::global_dof_index> inclusion_dof_indices;
416 auto particle =
inclusions.inclusions_as_particles.begin();
417 while (particle !=
inclusions.inclusions_as_particles.end())
419 const auto &cell = particle->get_surrounding_cell();
422 dh_cell->get_dof_indices(dof_indices);
424 inclusions.inclusions_as_particles.particles_in_cell(cell);
425 Assert(pic.begin() == particle, ExcInternalError());
426 std::set<types::global_dof_index> inclusion_dof_indices_set;
427 for (
const auto &p : pic)
429 const auto ids =
inclusions.get_dof_indices(p.get_id());
430 inclusion_dof_indices_set.insert(ids.begin(), ids.end());
432 inclusion_dof_indices.resize(0);
433 inclusion_dof_indices.insert(inclusion_dof_indices.begin(),
434 inclusion_dof_indices_set.begin(),
435 inclusion_dof_indices_set.end());
436 constraints.add_entries_local_to_global(dof_indices,
438 inclusion_dof_indices,
440 relevant.
add_indices(inclusion_dof_indices.begin(),
441 inclusion_dof_indices.end());
442 particle = pic.end();
449template <
int dim,
int spacedim>
456 std::vector<types::global_dof_index> fe_dof_indices(
fe->n_dofs_per_cell());
457 std::vector<types::global_dof_index> inclusion_dof_indices(
468 auto particle =
inclusions.inclusions_as_particles.begin();
469 while (particle !=
inclusions.inclusions_as_particles.end())
471 const auto &cell = particle->get_surrounding_cell();
474 dh_cell->get_dof_indices(fe_dof_indices);
476 inclusions.inclusions_as_particles.particles_in_cell(cell);
477 Assert(pic.begin() == particle, ExcInternalError());
479 auto p = pic.begin();
480 auto next_p = pic.begin();
481 while (p != pic.end())
483 const auto inclusion_id =
inclusions.get_inclusion_id(p->get_id());
484 inclusion_dof_indices =
inclusions.get_dof_indices(p->get_id());
485 local_coupling_matrix = 0;
486 local_inclusion_matrix = 0;
489 std::vector<Point<spacedim>> ref_q_points;
490 for (; next_p != pic.end() &&
491 inclusions.get_inclusion_id(next_p->get_id()) == inclusion_id;
493 ref_q_points.push_back(next_p->get_reference_location());
499 for (
unsigned int q = 0; q < ref_q_points.size(); ++q)
501 const auto id = p->get_id();
502 const auto &inclusion_fe_values =
inclusions.get_fe_values(
id);
503 const auto &real_q = p->get_location();
508 for (
unsigned int j = 0; j <
inclusions.n_dofs_per_inclusion();
511 for (
unsigned int i = 0; i <
fe->n_dofs_per_cell(); ++i)
514 fe->system_to_component_index(i).first;
517 local_coupling_matrix(i, j) +=
519 inclusions.get_section_measure(inclusion_id) * ds;
522 if (
inclusions.inclusions_data[inclusion_id].size() > 0)
524 if (
inclusions.inclusions_data[inclusion_id].size() + 1 >
528 inclusion_fe_values[j] * ds /
529 inclusions.get_section_measure(inclusion_id) *
534 inclusion_fe_values[j] *
535 inclusions.get_inclusion_data(inclusion_id, j);
537 if (
par.initial_time !=
par.final_time)
540 local_rhs(j) += temp;
546 inclusion_fe_values[j] /
547 inclusions.get_section_measure(inclusion_id) *
553 local_inclusion_matrix(j, j) +=
554 (inclusion_fe_values[j] * inclusion_fe_values[j] * ds);
559 Assert(p == next_p, ExcInternalError());
561 constraints.distribute_local_to_global(local_coupling_matrix,
564 inclusion_dof_indices,
567 local_rhs, inclusion_dof_indices,
system_rhs.block(1));
572 particle = pic.end();
581template <
int dim,
int spacedim>
586 LA::MPI::PreconditionAMG prec_A;
591 data.symmetric_operator =
true;
595 Teuchos::ParameterList parameter_list;
596 std::unique_ptr<Epetra_MultiVector> ptr_operator_modes;
597 parameter_list.set(
"smoother: type",
"Chebyshev");
598 parameter_list.set(
"smoother: sweeps", 2);
599 parameter_list.set(
"smoother: pre or post",
"both");
600 parameter_list.set(
"coarse: type",
"Amesos-KLU");
601 parameter_list.set(
"coarse: max size", 2000);
602 parameter_list.set(
"aggregation: threshold", 0.02);
604#if DEAL_II_VERSION_GTE(9, 7, 0)
605 using VectorType = std::vector<double>;
607 std::vector<std::vector<double>> rigid_body_modes =
612 std::vector<LinearAlgebra::distributed::Vector<double>> rigid_body_modes(
613 spacedim == 3 ? 6 : 3);
614 for (
unsigned int i = 0; i < rigid_body_modes.size(); ++i)
662 const auto S = B * invA * Bt;
672 auto S_inv_prec = B * invA * Bt + M;
681 pcout <<
" f norm: " << f.l2_norm() <<
", g norm: " << g.l2_norm()
685 lambda = invS * (B * invA * f - g);
686 pcout <<
" Solved for lambda in " <<
par.outer_control.last_step()
687 <<
" iterations." << std::endl;
690 u = invA * (f - Bt * lambda);
691 pcout <<
" u norm: " << u.l2_norm()
692 <<
", lambda norm: " << lambda.l2_norm() << std::endl;
695 pcout <<
" Solved for u in " <<
par.inner_control.last_step()
696 <<
" iterations." << std::endl;
704template <
int dim,
int spacedim>
716 if (
par.refinement_strategy ==
"fixed_fraction")
719 tria, error_per_cell,
par.refinement_fraction,
par.coarsening_fraction);
721 else if (
par.refinement_strategy ==
"fixed_number")
726 par.refinement_fraction,
727 par.coarsening_fraction,
730 else if (
par.refinement_strategy ==
"global")
731 for (
const auto &cell :
tria.active_cell_iterators())
732 cell->set_refine_flag();
736 tria.prepare_coarsening_and_refinement();
737 inclusions.inclusions_as_particles.prepare_for_coarsening_and_refinement();
742 tria.execute_coarsening_and_refinement();
743 inclusions.inclusions_as_particles.unpack_after_coarsening_and_refinement();
753template <
int dim,
int spacedim>
757 std::vector<std::string> solution_names(spacedim,
"displacement");
758 std::vector<std::string> exact_solution_names(spacedim,
"exact_displacement");
765 exact_vec_locally_relevant = exact_vec;
767 std::vector<DataComponentInterpretation::DataComponentInterpretation>
768 data_component_interpretation(
776 data_component_interpretation);
779 exact_solution_names,
781 data_component_interpretation);
784 for (
unsigned int i = 0; i < subdomain.
size(); ++i)
785 subdomain(i) =
tria.locally_owned_subdomain();
788 const std::string filename =
789 par.output_name +
"_" + std::to_string(
cycle) +
".vtu";
836template <
int dim,
int spacedim>
841 static std::vector<std::pair<double, std::string>> cycles_and_solutions;
842 static std::vector<std::pair<double, std::string>> cycles_and_particles;
845 if (cycles_and_solutions.size() ==
cycle)
848 std::ofstream pvd_solutions(
par.output_directory +
"/" +
par.output_name +
854 const std::string particles_filename =
855 par.output_name +
"_particles.vtu";
859 cycles_and_particles.push_back({(double)
cycle, particles_filename});
861 std::ofstream pvd_particles(
par.output_directory +
"/" +
862 par.output_name +
"_particles.pvd");
868template <
int dim,
int spacedim>
874 <<
"> using PETSc." << std::endl;
877 <<
"> using Trilinos." << std::endl;
879 par.prm.print_parameters(
par.output_directory +
"/" +
"used_parameters_" +
880 std::to_string(dim) + std::to_string(spacedim) +
888template <
int dim,
int spacedim>
892 for (
const auto id :
par.dirichlet_ids)
894 for (
const auto Nid :
par.neumann_ids)
897 ExcNotImplemented(
"incoherent boundary conditions."));
898 for (
const auto noid :
par.normal_flux_ids)
901 ExcNotImplemented(
"incoherent boundary conditions."));
913template <
int dim,
int spacedim>
916 bool openfilefirsttime)
const
920 "Postprocessing: Computing internal and boundary stresses");
922 std::map<types::boundary_id, Tensor<1, spacedim>> boundary_stress;
923 std::map<types::boundary_id, double> u_dot_n;
927 auto all_ids =
tria.get_boundary_ids();
928 std::map<types::boundary_id, double> perimeter;
929 for (
auto id : all_ids)
932 boundary_stress[id] = 0.0;
936 double internal_area = 0.;
957 for (
unsigned int ix = 0; ix < spacedim; ++ix)
963 std::vector<Tensor<2, spacedim>> displacement_gradient(
966 std::vector<Tensor<1, spacedim>> displacement_values(
969 for (
const auto &cell :
dh.active_cell_iterators())
971 if (cell->is_locally_owned())
1003 for (
unsigned int f = 0; f < GeometryInfo<spacedim>::faces_per_cell;
1007 if (cell->face(f)->at_boundary())
1009 auto boundary_index = cell->face(f)->boundary_id();
1010 fe_face_values.
reinit(cell, f);
1022 perimeter[boundary_index] += fe_face_values.
JxW(q);
1024 boundary_stress[boundary_index] +=
1025 (2 *
par.Lame_mu * displacement_gradient[q] +
1026 par.Lame_lambda * displacement_divergence[q] *
1029 u_dot_n[boundary_index] +=
1030 (displacement_values[q] *
1032 fe_face_values.
JxW(q);
1048 for (
auto id : all_ids)
1050 boundary_stress[id] =
1053 Assert(perimeter[
id] > 0, ExcInternalError());
1054 boundary_stress[id] /= perimeter[id];
1059 const std::string filename(
par.output_directory +
"/forces.txt");
1060 std::ofstream forces_file;
1061 if (openfilefirsttime)
1063 forces_file.open(filename);
1064 if constexpr (spacedim == 2)
1066 forces_file <<
"cycle area";
1067 for (
auto id : all_ids)
1068 forces_file <<
" perimeter" << id;
1070 <<
" meanInternalStressxx meanInternalStressxy meanInternalStressyx meanInternalStressyy avg_u_x avg_u_y";
1071 for (
auto id : all_ids)
1072 forces_file <<
" boundaryStressX_" <<
id <<
" boundaryStressY_"
1073 <<
id <<
" uDotN_" << id;
1074 forces_file << std::endl;
1078 forces_file <<
"cycle";
1079 for (
auto id : all_ids)
1080 forces_file <<
"perimeter" <<
id <<
" sigmanX_" <<
id
1081 <<
" sigmanY_" <<
id <<
" sigmanZ_" <<
id
1083 forces_file << std::endl;
1087 forces_file.open(filename, std::ios_base::app);
1089 if constexpr (spacedim == 2)
1091 forces_file <<
cycle <<
" " << internal_area <<
" ";
1092 for (
auto id : all_ids)
1093 forces_file << perimeter[id] <<
" ";
1094 forces_file << internal_stress <<
" " << average_displacement <<
" ";
1095 for (
auto id : all_ids)
1096 forces_file << boundary_stress[id] <<
" " << u_dot_n[id] <<
" ";
1097 forces_file << std::endl;
1101 forces_file <<
cycle <<
" ";
1102 for (
auto id : all_ids)
1103 forces_file << perimeter[id] <<
" ";
1104 for (
auto id : all_ids)
1105 forces_file << boundary_stress[id] <<
" " << u_dot_n[id] <<
" ";
1106 forces_file << std::endl;
1108 forces_file.close();
1120template <
int dim,
int spacedim>
1124 if (
par.output_pressure ==
false)
1134 const auto locally_owned_vessels =
1137 const auto locally_owned_inclusions =
1146 pressure_at_inc = 0;
1150 const auto used_number_modes =
inclusions.get_n_coefficients();
1152 const auto local_lambda = lambda_to_pressure.locally_owned_elements();
1154 if constexpr (spacedim == 3)
1156 for (
const auto &element_of_local_lambda : local_lambda)
1158 const unsigned inclusion_number = (
unsigned int)
floor(
1159 element_of_local_lambda / (used_number_modes));
1162 pressure[
inclusions.get_vesselID(inclusion_number)] +=
1163 lambda_to_pressure[element_of_local_lambda];
1165 pressure_at_inc[inclusion_number] +=
1166 lambda_to_pressure[element_of_local_lambda];
1173 for (
auto element_of_local_lambda : local_lambda)
1175 const unsigned inclusion_number = (
unsigned int)
floor(
1176 element_of_local_lambda / (used_number_modes));
1179 pressure_at_inc[inclusion_number] +=
1180 lambda_to_pressure[element_of_local_lambda];
1182 pressure = pressure_at_inc;
1190 const std::string filename(
par.output_directory +
1191 "/externalPressure.txt");
1192 std::ofstream pressure_file;
1193 if (openfilefirsttime)
1195 pressure_file.open(filename);
1196 pressure_file <<
"cycle ";
1197 for (
unsigned int num = 0; num < pressure.
size(); ++num)
1198 pressure_file <<
"vessel" << num <<
" ";
1199 pressure_file << std::endl;
1202 pressure_file.open(filename, std::ios_base::app);
1204 pressure_file <<
cycle <<
" ";
1205 pressure.
print(pressure_file);
1206 pressure_file.close();
1210 if (
par.initial_time ==
par.final_time)
1212#ifdef DEAL_II_WITH_HDF5
1213 const std::string FILE_NAME(
par.output_directory +
1214 "/externalPressure.h5");
1216 auto accessMode = HDF5::File::FileAccessMode::create;
1217 if (!openfilefirsttime)
1218 accessMode = HDF5::File::FileAccessMode::open;
1221 const std::string DATASET_NAME(
"externalPressure_" +
1222 std::to_string(
cycle));
1228 std::vector<double> data_to_write;
1232 for (
const auto &el : locally_owned_vessels)
1235 data_to_write.emplace_back(pressure[el]);
1241 int ierr = MPI_Exscan(&los,
1244 MPI_UNSIGNED_LONG_LONG,
1249 std::vector<hsize_t> offset = {prefix, 1};
1263 <<
"output_pressure file for time dependent simulation not implemented"
1269 pcout <<
"Inclusions number = 0, pressure file not created" << std::endl;
1273template <
int dim,
int spacedim>
1278 const auto used_number_modes =
inclusions.get_n_coefficients();
1280 if (lambda.size() > 0)
1282 const std::string filename(
par.output_directory +
"/lambda.txt");
1284 file.open(filename);
1286 unsigned int tot =
inclusions.reference_inclusion_data.size() - 4;
1287 Assert(tot > 0, ExcNotImplemented());
1289 for (
unsigned int i = 0; i <
inclusions.n_inclusions(); ++i)
1291 for (
unsigned int j = 0; j < tot; ++j)
1292 file <<
"lambda" << (i * tot + j) <<
" ";
1293 file <<
"lambda" << i <<
"norm ";
1297 for (
unsigned int i = 0; i <
inclusions.n_inclusions(); ++i)
1299 unsigned int mode_of_inclusion = 0;
1300 double lambda_norm = 0;
1301 for (mode_of_inclusion = 0; mode_of_inclusion < used_number_modes;
1302 mode_of_inclusion++)
1304 auto elem_of_lambda = i * used_number_modes + mode_of_inclusion;
1305 file << lambda[elem_of_lambda] <<
" ";
1306 lambda_norm += lambda[elem_of_lambda] * lambda[elem_of_lambda];
1308 while (mode_of_inclusion < tot)
1311 mode_of_inclusion++;
1313 file << lambda_norm <<
" ";
1323template <
int dim,
int spacedim>
1327 if (
par.initial_time ==
par.final_time)
1341 if (
par.output_results_before_solving)
1352 par.convergence_table.error_from_exact(
1359 par.convergence_table.error_from_exact(
1361 if (
cycle !=
par.n_refinement_cycles - 1)
1369 if (
pcout.is_active())
1371 par.convergence_table.output_table(
pcout.get_stream());
1379 pcout <<
"time dependent simulation, refinement not implemented"
1404 if (
par.domain_type ==
"generate")
void write_vtu_in_parallel(const std::string &filename, const MPI_Comm comm) const
void attach_dof_handler(const DoFHandler< dim, spacedim > &)
void add_data_vector(const VectorType &data, const std::vector< std::string > &names, const DataVectorType type=type_automatic, const std::vector< DataComponentInterpretation::DataComponentInterpretation > &data_component_interpretation={})
virtual void build_patches(const unsigned int n_subdivisions=0)
void add(const size_type i, const size_type j)
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access > > &cell, const unsigned int face_no)
void get_function_values(const ReadVector< Number > &fe_function, std::vector< Number > &values) const
const std::vector< Point< spacedim > > & get_quadrature_points() const
const Tensor< 1, spacedim > & normal_vector(const unsigned int q_point) const
const Point< spacedim > & quadrature_point(const unsigned int q_point) const
const unsigned int n_quadrature_points
void get_function_gradients(const ReadVector< Number > &fe_function, std::vector< Tensor< 1, spacedim, Number > > &gradients) const
double JxW(const unsigned int q_point) const
const double & shape_value(const unsigned int i, const unsigned int q_point) const
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access > > &cell)
void attach_triangulation(Triangulation< dim, spacedim > &tria)
void read_msh(std::istream &in)
void read(std::istream &in, Format format=Default)
void write_hyperslab(const Container &data, const std::vector< hsize_t > &offset, const std::vector< hsize_t > &count)
DataSet create_dataset(const std::string &name, const std::vector< hsize_t > &dimensions) const
void add_indices(const ForwardIterator &begin, const ForwardIterator &end)
static void estimate(const Mapping< dim, spacedim > &mapping, const DoFHandler< dim, spacedim > &dof, const Quadrature< dim - 1 > &quadrature, const std::map< types::boundary_id, const Function< spacedim, Number > * > &neumann_bc, const ReadVector< Number > &solution, Vector< float > &error, const ComponentMask &component_mask={}, const Function< spacedim > *coefficients=nullptr, const unsigned int n_threads=numbers::invalid_unsigned_int, const types::subdomain_id subdomain_id=numbers::invalid_subdomain_id, const types::material_id material_id=numbers::invalid_material_id, const Strategy strategy=cell_diameter_over_24)
void prepare_for_coarsening_and_refinement(const std::vector< const VectorType * > &all_in)
void interpolate(std::vector< VectorType * > &all_out)
void compress(VectorOperation::values operation)
size_type size() const override
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const bool across=true) const
size_type locally_owned_size() const
virtual size_type size() const override
void output_pressure(bool openfilefirsttime) const
compute tissue pressure ($\Lambda$) over the vessels and output to a .txt file (sequential) or ....
ElasticityProblem(const ElasticityProblemParameters< dim, spacedim > &par)
void compute_internal_and_boundary_stress(bool openfilefirsttime) const
compute stresses on boundaries (2D and 3D) and internal (2D) this function makes use of boundary id,...
std::vector< IndexSet > relevant_dofs
void output_lambda() const
TimerOutput computing_timer
LA::MPI::SparseMatrix coupling_matrix
void check_boundary_ids()
check on the boundary id that no boundary conditions are in disagreement
AffineConstraints< double > constraints
void refine_and_transfer()
LA::MPI::BlockVector solution
void print_parameters() const
std::unique_ptr< Quadrature< spacedim - 1 > > face_quadrature_formula
std::unique_ptr< FiniteElement< spacedim > > fe
const ElasticityProblemParameters< dim, spacedim > & par
std::string output_solution() const
LA::MPI::BlockVector locally_relevant_solution
std::unique_ptr< Quadrature< spacedim > > quadrature
parallel::distributed::Triangulation< spacedim > tria
MPI_Comm mpi_communicator
std::vector< IndexSet > owned_dofs
Inclusions< spacedim > inclusions
void assemble_elasticity_system()
LA::MPI::SparseMatrix inclusion_matrix
AffineConstraints< double > inclusion_constraints
FEValuesExtractors::Vector displacement
DoFHandler< spacedim > dh
IndexSet assemble_coupling_sparsity(DynamicSparsityPattern &dsp)
LA::MPI::SparseMatrix stiffness_matrix
LA::MPI::BlockVector system_rhs
void output_results() const
void run()
set up, assemble and run the problem
void read_grid_and_cad_files(const std::string &grid_file_name, const std::string &ids_and_cad_file_names, Triangulation< dim, spacedim > &tria)
#define Assert(cond, exc)
#define AssertThrowMPI(error_code)
#define AssertIndexRange(index, range)
#define AssertThrow(cond, exc)
LinearOperator< Range, Domain, Payload > linear_operator(const OperatorExemplar &, const Matrix &)
LinearOperator< Domain, Range, Payload > transpose_operator(const LinearOperator< Range, Domain, Payload > &op)
LinearOperator< Domain, Range, Payload > inverse_operator(const LinearOperator< Range, Domain, Payload > &op, Solver &solver, const Preconditioner &preconditioner)
void make_hanging_node_constraints(const DoFHandler< dim, spacedim > &dof_handler, AffineConstraints< number > &constraints)
void make_sparsity_pattern(const DoFHandler< dim, spacedim > &dof_handler, SparsityPatternBase &sparsity_pattern, const AffineConstraints< number > &constraints={}, const bool keep_constrained_dofs=true, const types::subdomain_id subdomain_id=numbers::invalid_subdomain_id)
void compute_nonzero_normal_flux_constraints(const DoFHandler< dim, spacedim > &dof_handler, const unsigned int first_vector_component, const std::set< types::boundary_id > &boundary_ids, const std::map< types::boundary_id, const Function< spacedim, double > * > &function_map, AffineConstraints< double > &constraints, const Mapping< dim, spacedim > &mapping=(ReferenceCells::get_hypercube< dim >() .template get_default_linear_mapping< dim, spacedim >()), const bool use_manifold_for_normal=true)
void set_manifold(const types::manifold_id number, const Manifold< dim, spacedim > &manifold_object)
IndexSet complete_index_set(const IndexSet::size_type N)
std::vector< index_type > data
component_is_part_of_vector
void write_pvd_record(std::ostream &out, const std::vector< std::pair< double, std::string > > ×_and_names)
Expression floor(const Expression &x)
void generate_from_name_and_arguments(Triangulation< dim, spacedim > &tria, const std::string &grid_generator_function_name, const std::string &grid_generator_function_arguments)
void cheese(Triangulation< dim, spacedim > &tria, const std::vector< unsigned int > &holes)
void hyper_ball(Triangulation< dim, spacedim > &tria, const Point< spacedim > ¢er={}, const double radius=1., const bool attach_spherical_manifold_on_boundary_cells=false)
std::tuple< unsigned int, unsigned int, unsigned int > count_elements(const TopoDS_Shape &shape)
TopoDS_Shape read_STEP(const std::string &filename, const double scale_factor=1e-3)
TopoDS_Shape read_IGES(const std::string &filename, const double scale_factor=1e-3)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
T sum(const T &t, const MPI_Comm mpi_communicator)
unsigned int n_mpi_processes(const MPI_Comm mpi_communicator)
unsigned int this_mpi_process(const MPI_Comm mpi_communicator)
IndexSet create_evenly_distributed_partitioning(const MPI_Comm comm, const types::global_dof_index total_size)
std::string dim_string(const int dim, const int spacedim)
void set_null_space(Teuchos::ParameterList ¶meter_list, std::unique_ptr< Epetra_MultiVector > &ptr_distributed_modes, const Epetra_RowMatrix &matrix, const std::vector< VectorType > &modes)
Set the null space of the matrix using a pre-computed set of vectors. Needed for the AMG precondition...
void refine_and_coarsen_fixed_fraction(::Triangulation< dim, spacedim > &tria, const ::Vector< Number > &criteria, const double top_fraction_of_error, const double bottom_fraction_of_error, const VectorTools::NormType norm_type=VectorTools::L1_norm)
void refine_and_coarsen_fixed_number(::Triangulation< dim, spacedim > &tria, const ::Vector< Number > &criteria, const double top_fraction_of_cells, const double bottom_fraction_of_cells, const types::global_cell_index max_n_cells=std::numeric_limits< types::global_cell_index >::max())
::SolutionTransfer< dim, VectorType, spacedim > SolutionTransfer
std_cxx20::type_identity< T > identity