Reduced Lagrange Multipliers
 
Loading...
Searching...
No Matches
laplacian.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_h
20#define dealii_distributed_lagrange_multiplier_h
21
25#include <deal.II/base/timer.h>
26
32// #define MATRIX_FREE_PATH
33
34#define FORCE_USE_OF_TRILINOS
35namespace LA
36{
37#if defined(DEAL_II_WITH_PETSC) && !defined(DEAL_II_PETSC_WITH_COMPLEX) && \
38 !(defined(DEAL_II_WITH_TRILINOS) && defined(FORCE_USE_OF_TRILINOS))
39 using namespace dealii::LinearAlgebraPETSc;
40# define USE_PETSC_LA
41#elif defined(DEAL_II_WITH_TRILINOS)
42 using namespace dealii::LinearAlgebraTrilinos;
43#else
44# error DEAL_II_WITH_PETSC or DEAL_II_WITH_TRILINOS required
45#endif
46} // namespace LA
52
56
60
62#include <deal.II/fe/fe_q.h>
67
72
84#include <deal.II/lac/vector.h>
85
86#ifdef MATRIX_FREE_PATH
88
95#endif
96
100
103
104#include <matrix_free_utils.h>
105
106#include "inclusions.h"
107
108
109#ifdef DEAL_II_WITH_OPENCASCADE
110# include <TopoDS.hxx>
111#endif
112#include <cmath>
113#include <fstream>
114#include <iostream>
115#include <memory>
116
117
118template <int dim, int spacedim = dim>
120{
121public:
123
124 std::string output_directory = ".";
125 std::string output_name = "solution";
126 unsigned int fe_degree = 1;
127 unsigned int initial_refinement = 5;
128 std::list<types::boundary_id> dirichlet_ids{0};
129 std::string name_of_grid = "hyper_cube";
130 std::string arguments_for_grid = "-1: 1: false";
131 std::string refinement_strategy = "fixed_fraction";
134 unsigned int n_refinement_cycles = 1;
135 unsigned int max_cells = 20000;
138
141
143
145};
146
147
148
149template <int dim, int spacedim>
151 : ParameterAcceptor("/Immersed Problem/")
152 , rhs("/Immersed Problem/Right hand side")
153 , bc("/Immersed Problem/Dirichlet boundary conditions")
154 , inner_control("/Immersed Problem/Solver/Inner control")
155 , outer_control("/Immersed Problem/Solver/Outer control")
156{
157 add_parameter("FE degree", fe_degree, "", this->prm, Patterns::Integer(1));
158 add_parameter("Output directory", output_directory);
159 add_parameter("Output name", output_name);
160 add_parameter("Output results also before solving",
162 add_parameter("Initial refinement", initial_refinement);
163 add_parameter("Dirichlet boundary ids", dirichlet_ids);
164 enter_subsection("Grid generation");
165 {
166 add_parameter("Grid generator", name_of_grid);
167 add_parameter("Grid generator arguments", arguments_for_grid);
168 }
170 enter_subsection("Refinement and remeshing");
171 {
172 add_parameter("Strategy",
174 "",
175 this->prm,
176 Patterns::Selection("fixed_fraction|fixed_number|global"));
177 add_parameter("Coarsening fraction", coarsening_fraction);
178 add_parameter("Refinement fraction", refinement_fraction);
179 add_parameter("Maximum number of cells", max_cells);
180 add_parameter("Number of refinement cycles", n_refinement_cycles);
181 }
183
184 this->prm.enter_subsection("Error");
185 convergence_table.add_parameters(this->prm);
186 this->prm.leave_subsection();
187}
188
189
190
191template <int dim, int spacedim = dim>
193{
194public:
196 void
197 make_grid();
198 void
199 setup_fe();
200 void
201 setup_dofs();
202#ifndef MATRIX_FREE_PATH
203 void
205#else
206 void
207 assemble_rhs();
208#endif
209 void
211 void
212 run();
213
219
220 void
221 solve();
222
223 void
225
226 std::string
227 output_solution() const;
228
229 void
230 output_results() const;
231
232 void
233 print_parameters() const;
234
235private:
241 std::unique_ptr<FiniteElement<spacedim>> fe;
243 std::unique_ptr<Quadrature<spacedim>> quadrature;
244
246 std::vector<IndexSet> owned_dofs;
247 std::vector<IndexSet> relevant_dofs;
248
251
252 LA::MPI::SparseMatrix coupling_matrix;
253 LA::MPI::SparseMatrix inclusion_matrix;
255#ifdef MATRIX_FREE_PATH
258 std::unique_ptr<CouplingOperator<spacedim, double, 1>> coupling_operator;
260 using LevelMatrixType = MatrixFreeOperators::LaplaceOperator<
261 spacedim,
262 -1,
263 -1,
264 1,
267 MGConstrainedDoFs mg_constrained_dofs;
268#else
269 LA::MPI::SparseMatrix stiffness_matrix;
270 using VectorType = LA::MPI::Vector;
271 using BlockVectorType = LA::MPI::BlockVector;
272#endif
273
277 std::vector<std::vector<BoundingBox<spacedim>>> global_bounding_boxes;
278 unsigned int cycle = 0;
279};
280
281
282#endif
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())
Class for handling inclusions in an immersed boundary method.
Definition inclusions.h:65
DoFHandler< spacedim > dh
Definition laplacian.h:245
Inclusions< spacedim > inclusions
Definition laplacian.h:242
AffineConstraints< double > inclusion_constraints
Definition laplacian.h:250
LA::MPI::SparseMatrix inclusion_matrix
Definition laplacian.h:253
std::unique_ptr< FiniteElement< spacedim > > fe
Definition laplacian.h:241
LA::MPI::SparseMatrix coupling_matrix
Definition laplacian.h:252
LA::MPI::BlockVector BlockVectorType
Definition laplacian.h:271
PoissonProblem(const ProblemParameters< dim, spacedim > &par)
Definition laplacian.cc:43
BlockVectorType system_rhs
Definition laplacian.h:276
const ProblemParameters< dim, spacedim > & par
Definition laplacian.h:236
void output_results() const
Definition laplacian.cc:788
std::unique_ptr< Quadrature< spacedim > > quadrature
Definition laplacian.h:243
LA::MPI::SparseMatrix stiffness_matrix
Definition laplacian.h:269
void assemble_coupling()
Definition laplacian.cc:400
void refine_and_transfer()
Definition laplacian.cc:705
std::vector< std::vector< BoundingBox< spacedim > > > global_bounding_boxes
Definition laplacian.h:277
LA::MPI::Vector VectorType
Definition laplacian.h:270
unsigned int cycle
Definition laplacian.h:278
BlockVectorType solution
Definition laplacian.h:274
parallel::distributed::Triangulation< spacedim > tria
Definition laplacian.h:240
BlockVectorType locally_relevant_solution
Definition laplacian.h:275
TimerOutput computing_timer
Definition laplacian.h:239
ConditionalOStream pcout
Definition laplacian.h:238
MPI_Comm mpi_communicator
Definition laplacian.h:237
std::string output_solution() const
Definition laplacian.cc:750
void setup_dofs()
Definition laplacian.cc:149
AffineConstraints< double > constraints
Definition laplacian.h:249
MappingQ< spacedim > mapping
Definition laplacian.h:254
std::vector< IndexSet > owned_dofs
Definition laplacian.h:246
void print_parameters() const
Definition laplacian.cc:815
void assemble_poisson_system()
Definition laplacian.cc:299
std::vector< IndexSet > relevant_dofs
Definition laplacian.h:247
IndexSet assemble_coupling_sparsity(DynamicSparsityPattern &dsp) const
Definition laplacian.cc:353
std::string output_name
Definition laplacian.h:125
ParameterAcceptorProxy< ReductionControl > outer_control
Definition laplacian.h:140
ParameterAcceptorProxy< Functions::ParsedFunction< spacedim > > bc
Definition laplacian.h:137
std::string arguments_for_grid
Definition laplacian.h:130
double refinement_fraction
Definition laplacian.h:133
ParameterAcceptorProxy< Functions::ParsedFunction< spacedim > > rhs
Definition laplacian.h:136
ParameterAcceptorProxy< ReductionControl > inner_control
Definition laplacian.h:139
ParsedConvergenceTable convergence_table
Definition laplacian.h:144
std::string name_of_grid
Definition laplacian.h:129
bool output_results_before_solving
Definition laplacian.h:142
double coarsening_fraction
Definition laplacian.h:132
unsigned int fe_degree
Definition laplacian.h:126
unsigned int initial_refinement
Definition laplacian.h:127
std::string output_directory
Definition laplacian.h:124
unsigned int max_cells
Definition laplacian.h:135
std::string refinement_strategy
Definition laplacian.h:131
std::list< types::boundary_id > dirichlet_ids
Definition laplacian.h:128
unsigned int n_refinement_cycles
Definition laplacian.h:134
EnableObserverPointer Subscriptor