4#ifndef dealii_distributed_lagrange_multiplier_coupled_elasticity_h
5#define dealii_distributed_lagrange_multiplier_coupled_elasticity_h
7#ifdef ENABLE_COUPLED_PROBLEMS
18# define FORCE_USE_OF_TRILINOS
21# if defined(DEAL_II_WITH_PETSC) && !defined(DEAL_II_PETSC_WITH_COMPLEX) && \
22 !(defined(DEAL_II_WITH_TRILINOS) && defined(FORCE_USE_OF_TRILINOS))
23 using namespace dealii::LinearAlgebraPETSc;
25# elif defined(DEAL_II_WITH_TRILINOS)
26 using namespace dealii::LinearAlgebraTrilinos;
28# error DEAL_II_WITH_PETSC or DEAL_II_WITH_TRILINOS required
91# ifdef DEAL_II_WITH_OPENCASCADE
104template <
int dim,
int spacedim = dim>
108 CoupledElasticityProblemParameters();
110 std::string output_directory =
".";
111 std::string output_name =
"solution";
112 unsigned int fe_degree = 1;
113 unsigned int initial_refinement = 5;
114 std::list<types::boundary_id> dirichlet_ids{0};
115 std::list<types::boundary_id> neumann_ids{};
116 std::set<types::boundary_id> normal_flux_ids{};
117 std::string domain_type =
"";
118 std::string name_of_grid =
"hyper_cube";
119 std::string arguments_for_grid =
"-1: 1: false";
120 std::string refinement_strategy =
"fixed_fraction";
121 double coarsening_fraction = 0.0;
122 double refinement_fraction = 0.3;
123 unsigned int n_refinement_cycles = 1;
124 unsigned int max_cells = 20000;
127 double Lame_lambda = 1;
129 mutable ParameterAcceptorProxy<Functions::ParsedFunction<spacedim>> rhs;
130 mutable ParameterAcceptorProxy<Functions::ParsedFunction<spacedim>>
132 mutable ParameterAcceptorProxy<Functions::ParsedFunction<spacedim>> bc;
133 mutable ParameterAcceptorProxy<Functions::ParsedFunction<spacedim>>
136 std::string weight_expression =
"1.";
138 mutable ParameterAcceptorProxy<ReductionControl> inner_control;
139 mutable ParameterAcceptorProxy<ReductionControl> outer_control;
141 bool output_results =
false;
143 mutable ParsedConvergenceTable convergence_table;
146 double initial_time = 0.0;
147 double final_time = 0.0;
152template <
int dim,
int spacedim = dim>
156 CoupledElasticityProblem(
157 const CoupledElasticityProblemParameters<dim, spacedim> &par);
166 compute_coupling_pressure();
169 update_inclusions_data(std::vector<double> new_data);
171 update_inclusions_data(std::vector<double> new_data,
172 std::vector<int> cells_per_vessel);
174 std::vector<std::vector<double>>
175 split_pressure_over_inclusions(std::vector<int>, Vector<double>)
const;
180 return inclusions.get_n_vessels();
183 TrilinosWrappers::MPI::Vector coupling_pressure;
184 TrilinosWrappers::MPI::Vector
186 coupling_pressure_at_inclusions;
196 assemble_elasticity_system();
200 reassemble_coupling_rhs();
203 check_boundary_ids();
209 assemble_coupling_sparsity(DynamicSparsityPattern &dsp);
215 refine_and_transfer();
218 refine_and_transfer_around_inclusions();
221 execute_actual_refine_and_transfer();
224 output_solution()
const;
227 output_results()
const;
230 print_parameters()
const;
233 compute_internal_and_boundary_stress(
bool openfilefirsttime)
const;
236 compute_face_stress(
bool ){};
241 output_coupling_pressure(
bool)
const;
246 const CoupledElasticityProblemParameters<dim, spacedim> ∥
247 MPI_Comm mpi_communicator;
248 ConditionalOStream pcout;
249 mutable TimerOutput computing_timer;
250 parallel::distributed::Triangulation<spacedim> tria;
251 std::unique_ptr<FiniteElement<spacedim>> fe;
252 Inclusions<spacedim> inclusions;
253 std::unique_ptr<Quadrature<spacedim>> quadrature;
254 std::unique_ptr<Quadrature<spacedim - 1>> face_quadrature_formula;
255 DoFHandler<spacedim> dh;
256 std::vector<IndexSet> owned_dofs;
257 std::vector<IndexSet> relevant_dofs;
259 AffineConstraints<double> constraints;
260 AffineConstraints<double> inclusion_constraints;
261 AffineConstraints<double> mean_value_constraints;
263 LA::MPI::SparseMatrix stiffness_matrix;
264 LA::MPI::SparseMatrix coupling_matrix;
265 LA::MPI::SparseMatrix inclusion_matrix;
266 LA::MPI::BlockVector solution;
267 LA::MPI::BlockVector locally_relevant_solution;
268 LA::MPI::BlockVector system_rhs;
269 std::vector<std::vector<BoundingBox<spacedim>>> global_bounding_boxes;
270 unsigned int cycle = 0;
272 FEValuesExtractors::Vector displacement;
275 std::map<types::boundary_id, Tensor<1, spacedim>> forces;
276 std::map<types::boundary_id, Tensor<1, spacedim>> average_displacements;
277 std::map<types::boundary_id, Tensor<1, spacedim>> average_normals;
278 std::map<types::boundary_id, double> areas;
282 double current_time = 0.0;
EnableObserverPointer Subscriptor
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
void run(const std::vector< std::vector< Iterator > > &colored_iterators, Worker worker, Copier copier, const ScratchData &sample_scratch_data, const CopyData &sample_copy_data, const unsigned int queue_length=2 *MultithreadInfo::n_threads(), const unsigned int chunk_size=8)