19#ifndef dealii_distributed_lagrange_multiplier_elasticity_h
20#define dealii_distributed_lagrange_multiplier_elasticity_h
31#define FORCE_USE_OF_TRILINOS
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;
38#elif defined(DEAL_II_WITH_TRILINOS)
39 using namespace dealii::LinearAlgebraTrilinos;
41# error DEAL_II_WITH_PETSC or DEAL_II_WITH_TRILINOS required
107#ifdef DEAL_II_WITH_OPENCASCADE
108# include <TopoDS.hxx>
129 value(
const Point<dim> &p,
const unsigned int component)
const override;
141 Assert(dim == 2 || dim == 3, ExcNotImplemented());
143 ExcNotImplemented());
151 const unsigned int component)
const
153 if constexpr (dim == 2)
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] :
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] :
173 (component == 0) ? -p[2] :
174 (component == 1) ? 0. :
176 (component == 0) ? p[1] :
177 (component == 1) ? -p[0] :
184template <
int dim,
int spacedim = dim>
234template <
int dim,
int spacedim>
237 ,
rhs(
"/Immersed Problem/Right hand side", spacedim)
239 ,
bc(
"/Immersed Problem/Dirichlet boundary conditions", spacedim)
240 ,
Neumann_bc(
"/Immersed Problem/Neumann boundary conditions", spacedim)
298 this->
prm.enter_subsection(
"Error");
300 this->
prm.leave_subsection();
302 auto reset_function = [
this]() {
303 this->
prm.set(
"Function expression", (spacedim == 2 ?
"0; 0" :
"0; 0; 0"));
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);
313template <
int dim,
int spacedim = dim>
356 bool openfilefirsttime)
const;
376 std::unique_ptr<FiniteElement<spacedim>>
fe;
400 std::map<types::boundary_id, Tensor<1, spacedim>>
forces;
403 std::map<types::boundary_id, double>
areas;
Function(const unsigned int n_components=1, const time_type initial_time=0.0)
ParameterAcceptor(const std::string §ion_name="")
static ParameterHandler prm
void enter_subsection(const std::string &subsection)
void add_parameter(const std::string &entry, ParameterType ¶meter, 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)
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::vector< std::vector< BoundingBox< spacedim > > > global_bounding_boxes
std::unique_ptr< Quadrature< spacedim - 1 > > face_quadrature_formula
std::map< types::boundary_id, double > areas
std::unique_ptr< FiniteElement< spacedim > > fe
const ElasticityProblemParameters< dim, spacedim > & par
std::string output_stresses() const
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
std::map< types::boundary_id, Tensor< 1, spacedim > > forces
FEValuesExtractors::Vector displacement
AffineConstraints< double > mean_value_constraints
DoFHandler< spacedim > dh
std::map< types::boundary_id, Tensor< 1, spacedim > > average_normals
IndexSet assemble_coupling_sparsity(DynamicSparsityPattern &dsp)
LA::MPI::SparseMatrix stiffness_matrix
LA::MPI::BlockVector system_rhs
TrilinosWrappers::MPI::Vector sigma_n
void output_results() const
std::map< types::boundary_id, Tensor< 1, spacedim > > average_displacements
void run()
set up, assemble and run the problem
bool output_results_before_solving
std::list< types::boundary_id > neumann_ids
ParameterAcceptorProxy< Functions::ParsedFunction< spacedim > > exact_solution
unsigned int n_refinement_cycles
std::string refinement_strategy
ParameterAcceptorProxy< Functions::ParsedFunction< spacedim > > rhs
std::string weight_expression
unsigned int initial_refinement
ParsedConvergenceTable convergence_table
ParameterAcceptorProxy< ReductionControl > outer_control
std::list< types::boundary_id > dirichlet_ids
double refinement_fraction
ElasticityProblemParameters()
ParameterAcceptorProxy< ReductionControl > inner_control
double coarsening_fraction
std::string arguments_for_grid
std::set< types::boundary_id > normal_flux_ids
ParameterAcceptorProxy< Functions::ParsedFunction< spacedim > > bc
ParameterAcceptorProxy< Functions::ParsedFunction< spacedim > > Neumann_bc
std::string output_directory
Class for handling inclusions in an immersed boundary method.
RigidBodyMotion(const unsigned int type_)
virtual double value(const Point< dim > &p, const unsigned int component) const override
EnableObserverPointer Subscriptor
#define Assert(cond, exc)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)