]> https://gitweb.dealii.org/ - dealii.git/commit
Remove the first_cell/is_first_cell/current_update_flags() mechanism from FiniteElement. 1823/head
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Sun, 1 Nov 2015 15:56:00 +0000 (09:56 -0600)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Mon, 2 Nov 2015 08:33:53 +0000 (02:33 -0600)
commit841783bd211631bc601ee716e61d907ea9e854e7
tree3f80dcf5ea00b37a781d230aeb5db4ac819a0ad4
parent859b83b72f52d56a7d87143a4101cff226ac24a8
Remove the first_cell/is_first_cell/current_update_flags() mechanism from FiniteElement.

What this patch does is address the issue that
`FiniteElement::get_data()` (as was previously the case with Mappings
as well) sets a flag in the returned `InternalData` object that
indicates that we are visiting a cell for the first time. `FEValues`
later sets this flag back once we're done with the first cell.

The way this is used is that the various finite element
implementations query `current_update_flags` in
`FE::fill_fe_*_values()`, which equals `update_each|update_once` if we
are on the first cell, and `update_each` on later cells. That means
that on the first cell we update fields in the output object that we
need to initialize only once, e.g., the values of shape functions on
quadrature points, but we won't do this again on later cells.

I don't particularly like this approach. It is opaque and took even me
a long time to reconstruct when I saw it (see #1305 for a
discussion). My preference is to do things we only need to do once in
`FE::get_data()`, and do things we need to do every time in
`FE::fill_fe_*_values()`. This kind of change was already implemented
for mappings in the patches references from #1305, and the current
pull request goes into the same direction.

The current PR only does one half of the necessary changes in order to
keep the patch reasonably self contained and readable. In particular,
what it really does is simply *always* do everything, by storing
`update_once|update_each` in `FE::InternalDataBase::update_each`. In
other words, it is the equivalent to telling finite element
implementations that we are always on the first cell. This requires
more work than in the previous state, although copying shape values
every time is arguably of small expense compared to transforming
gradients.

I will of course fix this up in upcoming patches. It requires
significant shuffling around. I'll open an issue in a minute
discussing the details. I'd simply like to propose this here already
as an incremental step forward, without making patch review too
onerous. The patch is mostly mechanical once you understand what it
does.
15 files changed:
include/deal.II/fe/fe.h
include/deal.II/fe/fe_face.h
include/deal.II/fe/fe_poly.h
include/deal.II/fe/fe_poly.templates.h
include/deal.II/fe/fe_poly_face.h
include/deal.II/fe/fe_poly_face.templates.h
include/deal.II/fe/fe_poly_tensor.h
include/deal.II/fe/fe_system.h
source/fe/fe.cc
source/fe/fe_dgp_nonparametric.cc
source/fe/fe_face.cc
source/fe/fe_poly.cc
source/fe/fe_poly_tensor.cc
source/fe/fe_system.cc
source/fe/fe_values.cc

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.