High-order discretizations suffer from Gibbs oscillations in the proximity of discontinuities. The idea with postprocess filtering is to leave those oscillations in the simulation and only remove them in a postprocessing step. This allows the computation to maintain strong gradients as long as we do not run into unphysical values due to the oscillations. Theoretically, if the position of the discontinuity is known, it is also possible to recover a high-order convergence despite the discontinuity. However, positions are generally not known and not too trivial to find.
In atl_harvesting
we offer two solutions to removing oscillations.
The first is to simply apply a strong spectral filtering (possibly with
covolume filtering) on the loaded data before refinement.
These are controlled by the usual scheme.stabilization
table.
However, you need to explicitly activate them with the additional
use_post_filter = true
setting.
This is the simple most option, but it also quite clearly smoothes out
discontinuities.
An alternative is invited by the adaptive refinement, as it should be
able to narrow down discontinuities.
We implemented here the filter_element
option that allows us to
filter high modes in each refinement step based on the polynomial data.
The filtering is controlled by the filter_element
table within the
ply_sampling
part:
filter_element = {
strategy = 'oddfract',
min_order = 2,
max_order = 10,
fract_exponent = 3
}
Currently we only have the 'oddfract' strategy, which uses the energy contained
in the odd modes compared to the overall spectral energy.
Only the odd modes contribute to the average derivative and would be stronger
if there is a discontinuity there.
The filter order is based on this fraction, the larger the fraction of odd
modes, the larger the filter order of the used spectral filter.
We then apply a spectral filtering in each refinement.
The filter order for this filtering on each level is then ranging between
min_order
(small fraction of odd modes) and max_order
(high fraction of
odd modes).
The formula for the spectral filter order is given by:
min + (max-min+1)*odd_fract^fract_exponent
.
It should be noted, that this filter is applied in each direction and thus,
there is a multiplicative effect for multiple dimensions.
Also keep in mind that there is a multiplicative effect from refinement to
refinement, as the filter is applied in each step.
Note, that the refinement will reduce the last mode by 2^(degree+1)
and
the filtering will anyway reduce it to 0. Thus, removing the last mode will
not drastically affect the refined solution.
To just remove the last mode during refinement from further consideration,
use the decrement strategy for dof reduction.
Note that this will be quite costly an can result in an greatly increased
memory consumption. But cutting too many modes during refinement will result
in less smooth adaptation to the shocks.