Reduced Lagrange Multipliers
 
Loading...
Searching...
No Matches
elasticity.h
Go to the documentation of this file.
1// ---------------------------------------------------------------------
2//
3// Copyright (C) 2024 by Luca Heltai
4//
5// This file is part of the reduced_lagrange_multipliers application, based on
6// the deal.II library.
7//
8// The reduced_lagrange_multipliers application is free software; you can use
9// it, redistribute it, and/or modify it under the terms of the Apache-2.0
10// License WITH LLVM-exception as published by the Free Software Foundation;
11// either version 3.0 of the License, or (at your option) any later version. The
12// full text of the license can be found in the file LICENSE.md at the top level
13// of the reduced_lagrange_multipliers distribution.
14//
15// ---------------------------------------------------------------------
16
17/* ---------------------------------------------------------------------
18 */
19#ifndef dealii_distributed_lagrange_multiplier_elasticity_h
20#define dealii_distributed_lagrange_multiplier_elasticity_h
21
25#include <deal.II/base/timer.h>
26
31#define FORCE_USE_OF_TRILINOS
32namespace LA
33{
34#if defined(DEAL_II_WITH_PETSC) && !defined(DEAL_II_PETSC_WITH_COMPLEX) && \
35 !(defined(DEAL_II_WITH_TRILINOS) && defined(FORCE_USE_OF_TRILINOS))
36 using namespace dealii::LinearAlgebraPETSc;
37# define USE_PETSC_LA
38#elif defined(DEAL_II_WITH_TRILINOS)
39 using namespace dealii::LinearAlgebraTrilinos;
40#else
41# error DEAL_II_WITH_PETSC or DEAL_II_WITH_TRILINOS required
42#endif
43} // namespace LA
50
54
58
60#include <deal.II/fe/fe_q.h>
65
73#include <deal.II/grid/tria.h>
76
88#include <deal.II/lac/vector.h>
89
95
100
103
104#include "inclusions.h"
105
106
107#ifdef DEAL_II_WITH_OPENCASCADE
108# include <TopoDS.hxx>
109#endif
110#include <deal.II/base/hdf5.h>
111
112#include <cmath>
113#include <fstream>
114#include <iomanip>
115#include <iostream>
116#include <memory>
117
118
122template <int dim>
123class RigidBodyMotion : public Function<dim>
124{
125public:
126 RigidBodyMotion(const unsigned int type_);
127
128 virtual double
129 value(const Point<dim> &p, const unsigned int component) const override;
130
131private:
132 const unsigned int type;
133};
134
135
136template <int dim>
138 : Function<dim>(dim)
139 , type(_type)
140{
141 Assert(dim == 2 || dim == 3, ExcNotImplemented());
142 Assert((dim == 2 && type <= 2) || (dim == 3 && type <= 5),
143 ExcNotImplemented());
144}
145
146
147
148template <int dim>
149double
151 const unsigned int component) const
152{
153 if constexpr (dim == 2)
154 {
155 // 2D rigid body modes: 2 translations and 1 rotation
156 const std::array<double, 3> modes{{static_cast<double>(component == 0),
157 static_cast<double>(component == 1),
158 (component == 0) ? -p[1] :
159 (component == 1) ? p[0] :
160 0.}};
161
162 return modes[type];
163 }
164 else // dim == 3
165 {
166 // 3D rigid body modes: 3 translations and 3 rotations
167 const std::array<double, 6> modes{{static_cast<double>(component == 0),
168 static_cast<double>(component == 1),
169 static_cast<double>(component == 2),
170 (component == 0) ? 0. :
171 (component == 1) ? p[2] :
172 -p[1],
173 (component == 0) ? -p[2] :
174 (component == 1) ? 0. :
175 p[0],
176 (component == 0) ? p[1] :
177 (component == 1) ? -p[0] :
178 0.}};
179
180 return modes[type];
181 }
182}
183
184template <int dim, int spacedim = dim>
186{
187public:
189
190 std::string output_directory = ".";
191 std::string output_name = "solution";
192 unsigned int fe_degree = 1;
193 unsigned int initial_refinement = 5;
194 std::list<types::boundary_id> dirichlet_ids{0};
195 std::list<types::boundary_id> neumann_ids{};
196 std::set<types::boundary_id> normal_flux_ids{};
197 std::string domain_type = "generate";
198 std::string name_of_grid = "hyper_cube";
199 std::string arguments_for_grid = "-1: 1: false";
200 std::string refinement_strategy = "fixed_fraction";
203 unsigned int n_refinement_cycles = 1;
204 unsigned int max_cells = 20000;
205 bool output_pressure = false;
206
207 double Lame_mu = 1;
208 double Lame_lambda = 1;
209
216
217 std::string weight_expression = "1.";
218
221
223
225
226 // Time dependency.
227 double initial_time = 0.0;
228 double final_time = 0.0;
229 double dt = 5e-3;
230};
231
232
233
234template <int dim, int spacedim>
236 : ParameterAcceptor("/Immersed Problem/")
237 , rhs("/Immersed Problem/Right hand side", spacedim)
238 , exact_solution("/Immersed Problem/Exact solution", spacedim)
239 , bc("/Immersed Problem/Dirichlet boundary conditions", spacedim)
240 , Neumann_bc("/Immersed Problem/Neumann boundary conditions", spacedim)
241 , inner_control("/Immersed Problem/Solver/Inner control")
242 , outer_control("/Immersed Problem/Solver/Outer control")
243 , convergence_table(std::vector<std::string>(spacedim, "u"))
244{
245 add_parameter("FE degree", fe_degree, "", this->prm, Patterns::Integer(1));
246 add_parameter("Output directory", output_directory);
247 add_parameter("Output name", output_name);
248 add_parameter("Output results also before solving",
250 add_parameter("Initial refinement", initial_refinement);
251 add_parameter("Dirichlet boundary ids", dirichlet_ids);
252 add_parameter("Neumann boundary ids", neumann_ids);
253 add_parameter("Normal flux boundary ids", normal_flux_ids);
254 add_parameter("Output pressure", output_pressure);
255 enter_subsection("Grid generation");
256 {
257 add_parameter("Domain type",
259 "",
260 this->prm,
261 Patterns::Selection("generate|file|cheese|cylinder"));
262 add_parameter("Grid generator", name_of_grid);
263 add_parameter("Grid generator arguments", arguments_for_grid);
264 }
266 enter_subsection("Refinement and remeshing");
267 {
268 add_parameter("Strategy",
270 "",
271 this->prm,
272 Patterns::Selection("fixed_fraction|fixed_number|global"));
273 add_parameter("Coarsening fraction", coarsening_fraction);
274 add_parameter("Refinement fraction", refinement_fraction);
275 add_parameter("Maximum number of cells", max_cells);
276 add_parameter("Number of refinement cycles", n_refinement_cycles);
277 }
279 enter_subsection("Physical constants");
280 {
281 add_parameter("Lame mu", Lame_mu);
282 add_parameter("Lame lambda", Lame_lambda);
283 }
285 enter_subsection("Exact solution");
286 {
287 add_parameter("Weight expression", weight_expression);
288 }
290 enter_subsection("Time dependency");
291 {
292 add_parameter("Initial time", initial_time);
293 add_parameter("Final time", final_time);
294 add_parameter("Time step", dt);
295 }
297
298 this->prm.enter_subsection("Error");
299 convergence_table.add_parameters(this->prm);
300 this->prm.leave_subsection();
301
302 auto reset_function = [this]() {
303 this->prm.set("Function expression", (spacedim == 2 ? "0; 0" : "0; 0; 0"));
304 };
305 rhs.declare_parameters_call_back.connect(reset_function);
306 exact_solution.declare_parameters_call_back.connect(reset_function);
307 Neumann_bc.declare_parameters_call_back.connect(reset_function);
308 bc.declare_parameters_call_back.connect(reset_function);
309}
310
311
312
313template <int dim, int spacedim = dim>
315{
316public:
318 void
319 make_grid();
320 void
321 setup_fe();
322 void
323 setup_dofs();
324 void
326 void
328 void
329 run();
330 void
332
338
339 void
340 solve();
341
342 void
344
345 std::string
346 output_solution() const;
347
348 void
349 output_results() const;
350
351 void
352 print_parameters() const;
353
354 void
356 bool openfilefirsttime) const; // make const
357
358 void
359 output_pressure(bool openfilefirsttime) const;
360
361 void
362 output_lambda() const;
363
364 std::string
366
367 // void
368 // compute_face_stress();
369
370 // protected:
376 std::unique_ptr<FiniteElement<spacedim>> fe;
378 std::unique_ptr<Quadrature<spacedim>> quadrature;
379 std::unique_ptr<Quadrature<spacedim - 1>> face_quadrature_formula;
381 std::vector<IndexSet> owned_dofs;
382 std::vector<IndexSet> relevant_dofs;
383
387
388 LA::MPI::SparseMatrix stiffness_matrix;
389 LA::MPI::SparseMatrix coupling_matrix;
390 LA::MPI::SparseMatrix inclusion_matrix;
391 LA::MPI::BlockVector solution;
392 LA::MPI::BlockVector locally_relevant_solution;
393 LA::MPI::BlockVector system_rhs;
394 std::vector<std::vector<BoundingBox<spacedim>>> global_bounding_boxes;
395 unsigned int cycle = 0;
396
398
399 // Postprocessing values
400 std::map<types::boundary_id, Tensor<1, spacedim>> forces;
401 std::map<types::boundary_id, Tensor<1, spacedim>> average_displacements;
402 std::map<types::boundary_id, Tensor<1, spacedim>> average_normals;
403 std::map<types::boundary_id, double> areas;
405 // std::vector<BaseClass::BlockType> pressure_records;
406
407 // Time dependency.
408 double current_time = 0.0;
409
410 class Postprocessor;
411};
412
413#endif
Function(const unsigned int n_components=1, const time_type initial_time=0.0)
ParameterAcceptor(const std::string &section_name="")
static ParameterHandler prm
void enter_subsection(const std::string &subsection)
void add_parameter(const std::string &entry, ParameterType &parameter, const std::string &documentation="", ParameterHandler &prm_=prm, const Patterns::PatternBase &pattern=*Patterns::Tools::Convert< ParameterType >::to_pattern())
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)
Definition elasticity.cc:25
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
Definition elasticity.h:382
void output_lambda() const
TimerOutput computing_timer
Definition elasticity.h:374
LA::MPI::SparseMatrix coupling_matrix
Definition elasticity.h:389
void check_boundary_ids()
check on the boundary id that no boundary conditions are in disagreement
AffineConstraints< double > constraints
Definition elasticity.h:384
void refine_and_transfer()
LA::MPI::BlockVector solution
Definition elasticity.h:391
void print_parameters() const
std::vector< std::vector< BoundingBox< spacedim > > > global_bounding_boxes
Definition elasticity.h:394
unsigned int cycle
Definition elasticity.h:395
std::unique_ptr< Quadrature< spacedim - 1 > > face_quadrature_formula
Definition elasticity.h:379
ConditionalOStream pcout
Definition elasticity.h:373
std::map< types::boundary_id, double > areas
Definition elasticity.h:403
std::unique_ptr< FiniteElement< spacedim > > fe
Definition elasticity.h:376
const ElasticityProblemParameters< dim, spacedim > & par
Definition elasticity.h:371
std::string output_stresses() const
std::string output_solution() const
LA::MPI::BlockVector locally_relevant_solution
Definition elasticity.h:392
std::unique_ptr< Quadrature< spacedim > > quadrature
Definition elasticity.h:378
parallel::distributed::Triangulation< spacedim > tria
Definition elasticity.h:375
MPI_Comm mpi_communicator
Definition elasticity.h:372
std::vector< IndexSet > owned_dofs
Definition elasticity.h:381
Inclusions< spacedim > inclusions
Definition elasticity.h:377
void assemble_elasticity_system()
LA::MPI::SparseMatrix inclusion_matrix
Definition elasticity.h:390
AffineConstraints< double > inclusion_constraints
Definition elasticity.h:385
std::map< types::boundary_id, Tensor< 1, spacedim > > forces
Definition elasticity.h:400
FEValuesExtractors::Vector displacement
Definition elasticity.h:397
AffineConstraints< double > mean_value_constraints
Definition elasticity.h:386
DoFHandler< spacedim > dh
Definition elasticity.h:380
std::map< types::boundary_id, Tensor< 1, spacedim > > average_normals
Definition elasticity.h:402
IndexSet assemble_coupling_sparsity(DynamicSparsityPattern &dsp)
LA::MPI::SparseMatrix stiffness_matrix
Definition elasticity.h:388
LA::MPI::BlockVector system_rhs
Definition elasticity.h:393
TrilinosWrappers::MPI::Vector sigma_n
Definition elasticity.h:404
void output_results() const
std::map< types::boundary_id, Tensor< 1, spacedim > > average_displacements
Definition elasticity.h:401
void run()
set up, assemble and run the problem
std::list< types::boundary_id > neumann_ids
Definition elasticity.h:195
ParameterAcceptorProxy< Functions::ParsedFunction< spacedim > > exact_solution
Definition elasticity.h:212
unsigned int n_refinement_cycles
Definition elasticity.h:203
ParameterAcceptorProxy< Functions::ParsedFunction< spacedim > > rhs
Definition elasticity.h:210
unsigned int initial_refinement
Definition elasticity.h:193
ParsedConvergenceTable convergence_table
Definition elasticity.h:224
ParameterAcceptorProxy< ReductionControl > outer_control
Definition elasticity.h:220
std::list< types::boundary_id > dirichlet_ids
Definition elasticity.h:194
ParameterAcceptorProxy< ReductionControl > inner_control
Definition elasticity.h:219
std::set< types::boundary_id > normal_flux_ids
Definition elasticity.h:196
ParameterAcceptorProxy< Functions::ParsedFunction< spacedim > > bc
Definition elasticity.h:213
ParameterAcceptorProxy< Functions::ParsedFunction< spacedim > > Neumann_bc
Definition elasticity.h:215
Class for handling inclusions in an immersed boundary method.
Definition inclusions.h:65
RigidBodyMotion(const unsigned int type_)
Definition elasticity.h:137
const unsigned int type
Definition elasticity.h:132
virtual double value(const Point< dim > &p, const unsigned int component) const override
Definition elasticity.h:150
EnableObserverPointer Subscriptor
#define Assert(cond, exc)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)