]> https://gitweb.dealii.org/ - dealii.git/commit
Let the DoFHandler policy classes' distribute_dofs() return the NumberCache.
authorWolfgang Bangerth <bangerth@colostate.edu>
Fri, 23 Jun 2017 13:09:53 +0000 (07:09 -0600)
committerWolfgang Bangerth <bangerth@colostate.edu>
Fri, 23 Jun 2017 13:09:53 +0000 (07:09 -0600)
commita537c62ab8fd9c61d6022bcb0a6dc9e7467f6cc6
treedbf0c434af012962caf5350121ee6974e15aa9b9
parentb228dbd2fa2d222d494b7d73d76cfe87baff1e59
Let the DoFHandler policy classes' distribute_dofs() return the NumberCache.

In times of move operators, there is really no reason why these functions should
return the NumberCache object by reference, rather than by value. We make this
slightly more efficient by providing (defaulted) move operations to
NumberCache.

However, this change uncovered a subtle problem that sooner or later would
certainly have tripped someone up: If any of the policy classes call
any function that relies on the correctness of the number cache of the
DoFHandler object being worked on, then this is likely going to fail.
Indeed, the implementation of distribute_dofs() for shared triangulations
has this problem by calling some of the DoFTools functions that query
properties of the DoFHandler that aren't all completely consistent
yet internally.

This happened to work -- more or less by design -- because the
NumberCache object that the DoFHandler passes to distribute_dofs()
by reference is the one that belongs to the DoFHandler, and
distribute_dofs() makes sure that it sets the one member that is
necessary to the correct value before calling the DoFTools function.
This can only properly be described as 'brittle': small changes to
the code will make this fail, and it is not obvious why this works
or doesn't.

The only proper solution, obviously, is to not call external functions
from inside distribute_dofs() until all data structures have been set
up completely and are internally consistent. I work around this
by duplicating a small amount of code (specifically, the
DoFTools::get_subdomain_association() and DoFRenumbering::subdomain_wise()
functions), but this effort is made more palatable because these functions
are in fact more general than we need here, and we can throw away a good
amount of code that deals with either sequential or completely
distributed DoFHandlers; we also know that a couple of assertions
in these functions must be satisfied here, so we can eliminate them
as well.

The consequence of this code is slightly more code that is more robust
and contains fewer surprises.
include/deal.II/dofs/dof_handler_policy.h
include/deal.II/dofs/number_cache.h
source/dofs/dof_handler.cc
source/dofs/dof_handler_policy.cc
source/dofs/dof_tools.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.