<h3>Specific improvements</h3>
<ol>
+<li> Fixed: The stabilization parameter for the artificial diffusion
+in the step-31 tutorial program has been increased slightly to avoid
+instabilities at later times (<i>t</i> > 60).
+<br>
+(Martin Kronbichler, 2013/06/04)
+</li>
+
<li> Fixed: If an exception was generated on a task created by
Threads::new_task, the program would terminate with a segmentation
fault, leaving little trace of what had happened. This is now handled
choose the time step very small to keep things under control. Too
large values of $\beta$ make for more diffusion, but again require
small time steps. The best value would appear to be $\beta=0.03$, as
-for the $Q_1$ element, and the we have to choose
+for the $Q_1$ element, and then we have to choose
$k=\frac 18\frac{h_K}{\|\mathbf{u}\|_{L^\infty(K)}}$ — exactly
half the size for the $Q_1$ element, a fact that may not be surprising
if we state the CFL condition as the requirement that the time step be
small enough so that the distance transport advects in each time step
is no longer than one <i>grid point</i> away (which for $Q_1$ elements
-is $h_K$, but for $Q_2$ elements is $h_K/2$).
+is $h_K$, but for $Q_2$ elements is $h_K/2$). It turns out that $\beta$
+needs to be sligthly larger for obtaining stable results also late in
+the simulation at times larger than 60, so we actually choose it as
+$\beta = 0.034$ in the code.
<h5>Results for 3d</h5>
One can repeat these experiments in 3d and find the optimal time step
for each value of $\beta$ and find the best value of $\beta$. What one
finds is that for the same $\beta$ already used in 2d, the time steps
-needs to be a bit small, by around a factor of 1.2 or so. This is
+needs to be a bit smaller, by around a factor of 1.2 or so. This is
easily explained: the time step restriction is
$k=\min_K \frac{ch_K}{\|\mathbf{u}\|_{L^\infty(K)}}$ where $h_K$ is
the <i>diameter</i> of the cell. However, what is really needed is the
<h5>Conclusions</h5>
-Concluding, from the simple computations above, $\beta=0.03$ appears to be a
+Concluding, from the simple computations above, $\beta=0.034$ appears to be a
good choice for the stabilization parameter in 2d, and $\beta=0.05$ in 3d. In
-a dimension independent way, we can model this as $\beta=0.015d$. If one does
+a dimension independent way, we can model this as $\beta=0.017d$. If one does
longer computations (several thousand time steps) on finer meshes, one
-realizes that that's not quite small enough and that for stability one will
-have to reduce the above values a bit more (by about a factor of $\frac 78$).
+realizes that the time step size is not quite small enough and that for
+stability one will have to reduce the above values a bit more (by about a
+factor of $\frac 78$).
As a consequence, a formula that reconciles 2d, 3d, and variable polynomial
degree and takes all factors in account reads as follows:
/* $Id$ */
/* */
-/* Copyright (C) 2007-2012 by the deal.II authors */
+/* Copyright (C) 2007-2013 by the deal.II authors */
/* */
/* This file is subject to QPL and may not be distributed */
/* without copyright and license information. Please refer */
// introduction.
//
// There are some universal constants worth mentioning here. First, we need
- // to fix $\beta$; we choose $\beta=0.015\cdot dim$, a choice discussed in
+ // to fix $\beta$; we choose $\beta=0.017\cdot dim$, a choice discussed in
// detail in the results section of this tutorial program. The second is the
// exponent $\alpha$; $\alpha=1$ appears to work fine for the current
// program, even though some additional benefit might be expected from
const double global_T_variation,
const double cell_diameter) const
{
- const double beta = 0.015 * dim;
+ const double beta = 0.017 * dim;
const double alpha = 1;
if (global_u_infty == 0)
const double maximal_velocity = get_maximal_velocity();
if (maximal_velocity >= 0.01)
- time_step = 1./(1.6*dim*std::sqrt(1.*dim)) /
+ time_step = 1./(1.7*dim*std::sqrt(1.*dim)) /
temperature_degree *
GridTools::minimal_cell_diameter(triangulation) /
maximal_velocity;
else
- time_step = 1./(1.6*dim*std::sqrt(1.*dim)) /
+ time_step = 1./(1.7*dim*std::sqrt(1.*dim)) /
temperature_degree *
GridTools::minimal_cell_diameter(triangulation) /
.01;