Hi David,

> I want to evaluate each point out of the cloud only once in case of a 
distributed triangulation.

a quick (and dirty) solution would be to perform the communication 
"non-uniquely" (i.e. evaluate multiple times) and pick out one specific 
value. If you use VectorTools::evaluate_at_points() and 
set EvaluationFlags::insert this is exactly what happens (although - 
intentionally - not documented: it will pick the first received value of 
the lowest rank).

> I would probably need to go a step further and implement a consensus 
algorithm in order to decide only for one specific process, which seems not 
trivial to me.

To be able to reduce the communication overhead one would indeed need to 
perform an additional communication step (with or without CA). I was 
thinking about adding an additional flag to the constructor of 
RemotePointEvaluation but have had not the need for that yet, since in most 
cases we are using the average and use the communication pattern only once, 
since the system we are considering are quite dynamic (multi-phase flow).

If you need this feature, I would be happy to discuss how to implement it!

Hope this helps,
Peter
On Wednesday, 12 May 2021 at 09:08:07 UTC+2 [email protected] wrote:

> Dear all, 
>
> I'm currently looking for a way to evaluate my global solution on an 
> arbitrary cloud of points and stumbled across the (new) class 
> `Utilities::MPI::RemotePointEvaluation<dim>`. In general, the class does 
> exactly what I want with one particular exception; I want to evaluate each 
> point out of the cloud only once in case of a distributed triangulation. If 
> I understand it correctly this property is fulfilled in case the boolean 
> function `is_map_unique()` returns true, but I don’t see any option to 
> filter or tell the class that I actually want the map to be unique.
>
> Assuming that the class cannot handle this case I tried to pre-filter the 
> vertices by hand: For me, the most natural choice to fulfill the unique 
> evaluation of the points is to assign them to a process, so that I only 
> work on ‘locally owned vertices’. I compute a bounding box using the 
> iterator filter `LocallyOwnedCell()`, filter the received cloud of points 
> on the process and finally plug them into the `RemotePointEvaluation`. 
> However, this does not work in case points of the cloud are located at the 
> boundary of the bounding box, because they will technically be part of both 
> bounding boxes of the involved processes. I would probably need to go a 
> step further and implement a consensus algorithm in order to decide only 
> for one specific process, which seems not trivial to me. 
>
> Before starting now to implement a more advanced solution I would like to 
> ask if there is an obvious way I’m not aware of. Is it possible to enforce 
> a unique evaluation using one of the ‘PointEvaluation’ classes or is it 
> possible to let deal.II decide for an owner of an arbitrary vertex? I have 
> also seen the function ‘find_active_cell_around_point()’ which might help, 
> but it might end up in similar problem as well.
>
> Thanks in advance and best regards,
>
> David
>
>
>

-- 
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see 
https://groups.google.com/d/forum/dealii?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"deal.II User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/dealii/b0d6fc9a-064a-4fa3-814e-4633d83e35e1n%40googlegroups.com.

Reply via email to