On 2/6/21 2:30 PM, Corbin Foucart wrote:
> Thank you for the fast and clear answer, Wolfgang.
>
> Just add such a hash function for Point. It's true that two nearby points
> will
> have different hash values, but that shouldn't stop you from using hashes if
> you query the same points over and over.
>
> This is definitely doable.
We would love to see the corresponding patch to deal.II then :-)
The C++ standard is (maybe oddly) written in a way that suggests that one
should specialize std::hash. Take a look at
https://en.cppreference.com/w/cpp/utility/hash
> I'm curious about this; if the material ID physically represents a
> location-based quantity (e.g., which vertical column of fluid as specified by
> a surface mesh), how come you recommend using the iteration order to specify
> it? Unless I'm misunderstanding what you mean by logic position of the cell
> w/r/t a cell iterator...
What I meant to say is this: because floating point numbers can not be
computed in a stable way, it is often tricky to use them as indices or as the
basis of a hash lookup. If I understand you correctly, what you wanted to do
is something like
std::map<Point<dim>, MyProperty> property_map;
for (auto cell : ...)
{
MyProperty prop;
prop = some_function(depends on the location of 'cell');
property_map[cell->center()] = prop;
}
This is tricky because of the lookup based on a floating point number (the
'center' location of the cell). A better design might be
std::map<cell_iterator, MyProperty> property_map;
for (auto cell : ...)
{
MyProperty prop;
prop = some_function(depends on the location of 'cell');
property_map[cell] = prop;
}
You're still computing the property based on the location of the cell, but
you're storing it based on something that's conceptually an integer.