2305 * Then we
do a second
run with discontinuous elements (
FE_DGQ).
2308 * poisson_solver.run(
true , fe_degree);
2311<a name=
"step_95-Results"></a><h1>Results</h1>
2314<a name=
"step_95-Convergencestudy"></a><h3>Convergence study</h3>
2317The results of the convergence studies are shown in the tables below.
2319For @f$p=1@f$ we get (
for continuous elements,
FE_Q):
2321| Cycle | Mesh size | @f$L^2@f$-Error | EOC |
2322|:-----:|:---------:|:-----------:|:----:|
2323| 0 | 0.3025 | 8.3792e-02 | - |
2324| 1 | 0.1513 | 1.9073e-02 | 2.14 |
2325| 2 | 0.0756 | 4.2112e-03 | 2.18 |
2326| 3 | 0.0378 | 9.4586e-04 | 2.15 |
2328We see that the @f$L^2@f$ error decreases as we
refine and that the estimated
2329order of convergence, EOC, is close to 2.
2331For @f$p=2@f$ we get (again for continuous elements):
2333| Cycle | Mesh size | @f$L^2@f$-Error | EOC |
2334|:-----:|:---------:|:-----------:|:----:|
2335| 0 | 0.3025 | 1.2442e-04 | - |
2336| 1 | 0.1513 | 9.6514e-06 | 3.69 |
2337| 2 | 0.0756 | 8.3693e-07 | 3.53 |
2338| 3 | 0.0378 | 7.4062e-08 | 3.50 |
2340If we increase the degree of the finite element for both the level-set and
2341the solution we observe EOC close to 3.
2343We repeat the experiment for for discontinuous elements (
FE_DGQ), where we get for @f$p=1@f$:
2345| Cycle | Mesh size | @f$L^2@f$-Error | EOC |
2346|:-----:|:---------:|:-----------:|:----:|
2347| 0 | 0.3025 | 7.8706e-02 | - |
2348| 1 | 0.1513 | 1.8413e-02 | 2.10 |
2349| 2 | 0.0756 | 4.0863e-03 | 2.17 |
2350| 3 | 0.0378 | 9.3191e-04 | 2.13 |
2352For @f$p=2@f$ we get (again for discontinuous elements):
2354| Cycle | Mesh size | @f$L^2@f$-Error | EOC |
2355|:-----:|:---------:|:-----------:|:----:|
2356| 0 | 0.3025 | 1.5622e-04 | - |
2357| 1 | 0.1513 | 1.0739e-05 | 3.86 |
2358| 2 | 0.0756 | 1.0044e-06 | 3.42 |
2359| 3 | 0.0378 | 7.9919e-08 | 3.65 |
2361We observe optimal order convergence also for DG.
2363<a name=
"step_95-Possibilitiesforextension"></a><h3>Possibilities for extension</h3>
2366This tutorial could be easily extended to time dependent problems like the heat equation by adding a mass operator and a
2367time integration scheme in the solver class.
2369Another option would be to implement a different ghost penalty like the
volume based ghost penalty to allow
2370stabilization for arbitrary polynomial degree of the shape
functions.
2372Also, the preconditioner could be extended to a more robust scheme like multigrid.
2374If you are interested in the mentioned possibilities for extensions we recommend our paper
"High-performance matrix-free
2375unfitted finite element operator evaluation" @cite bergbauer2024 where
volume ghost-penalty and multigrid preconditioning already have been
2379<a name=
"step_95-PlainProg"></a>
2380<h1> The plain program</h1>
2381@include
"step-95.cc"
void refine(Triangulation< dim, spacedim > &tria, const Vector< Number > &criteria, const double threshold, const unsigned int max_to_mark=numbers::invalid_unsigned_int)
void run(const Iterator &begin, const std_cxx20::type_identity_t< Iterator > &end, Worker worker, Copier copier, const ScratchData &sample_scratch_data, const CopyData &sample_copy_data, const unsigned int queue_length, const unsigned int chunk_size)
int(& functions)(const void *v1, const void *v2)