[dune-pdelab] SOLVED: Output component gradients for PowerGridfunctionSpace
Santiago Ospina
sospinar at gmail.com
Fri Nov 15 15:50:51 CET 2019
Hi Michael,
Your first approach on extracting the child grid function space and using
it for the power discrete grid function space will definitely not work as
you already noticed. The reason is that local function spaces have to be
created with the root tree, in your case, the power grid function space.
This is because the binding process is only allowed to happen in root
nodes. Now, there are two approaches to get gradients in a grid function
out of complex grid function space trees. The first one is the one you
implemented, that is, copying the discrete grid function gradient and get
explicitly the correct child out of the local function space in the
evaluate function. The second one is by using a subspace grid function
space (i.e GridFunctionSubSpace<...>). This class overcomes the situation
mentioned above and allows you to use functionalities that expect a root
grid function space (e.g. LocalFunctionSpace<...> or
DiscreteGridFunctionGradient<...>). Naturally, the second approach should
be prefered as it reduces code duplication. The following is the way it
should be used:
// ...
template<int comp>
using ComponentGFS =
GridFunctionSubSpace<PowerGFS,TypeTree::TreePath<comp>>;
// I am not entirely sure on the type three path above. If this doesn't
work, take a look at the type tree docs.
ComponentGFS comp_gfs(power_gfs);
DiscreteGridFunctionGradient<ComponentGFS<0>,X> dfg_grad_0(comp_gfs,x) ;
// from here on, this should be pretty much the same as with the scalar
component case.
// ...
Notice that you still use the same coefficient vector as you used to do for
the power nodes. This is because the map from DOFIndex to ContainerIndex is
generated by the leaf nodes of local function spaces, therefore, no
restriction operation nor additional mappings are needed.
Best,
Santiago
--------------------------------
Santiago Ospina De Los Rios
Interdisciplinary Center for Scientific Computing
Heidelberg University
On Fri, Nov 15, 2019 at 2:26 PM Michael Wenske <m_wens01 at wwu.de> wrote:
> Dear all,
>
> i managed to do the gradient outputs for the components of the PowerGFS
> by writing an aditional discrete Gridfunction which is compatible with the
> adapters.
> I am not sure if it is clean enough to make it into the gfs utilities
> header, but
> for closure I want to report it here. (see attached header)
>
> Michael
> On 14.11.19 15:36, Michael Wenske wrote:
>
> Dear wizards,
>
> i am working on a system of one or two (or more) reaction-diffusion
> equations. I successfully
> refactored my codebase to use the PowerGridfunctionSpace for this
> application.
> This way I can extend my system to more fields, or fall back to the
> simple one-equation case.
> I can switch between a PowerGFS of size 1 (one equation), and size 2
> (two coupled equations),
> and export the results to VTK. So far so good.
>
> Now I want to inspect the gradients of my field(s). In the normal case
> without the PowerGFS,
> I could make use of the functionality of DiscreteGridFunctionGradient,
> and then use the VTK adapter to write the gradient. This is very convenient!
>
> How do I go about this when using a PowerGFS? I fail to get it to work
> even for the
> one-component PowerGFS. For the two component fields I can use the class
> VectorDiscreteGridFunction<..,size>, and force the return types size
> with the last
> template argument. The class VectorDiscreteGridFunctionGradient does not
> seem
> to have that option. Here, in the case where the powerGFS has size one, the
> Adapters can not convert the one-component Fieldvector to double (I think).
>
> I tried a different route of extracting the sub-GFS-Type from the
> PowerGFS and
> create a handle on the first components subspace. The idea was to use
> use the existing
> functionality of the DGF's and adapters on the subGFS, but I also run
> into problems.
> How would I extract the (smaller) coefficient vector from the larger
> PowerGFs one?
>
> I figure that this might be interesting for other applications too,
> where the GFS-Tree
> might be even more complex than in my case.
>
> I am attaching a minimal working example (dune module) which outputs the
> two component fields
> sucessfully. The parts where I horribly fail to output the gradients of
> the first component are
> commented, starting from line 107. I would appreciate any hints or
> insights on how to do this.
>
> Am I missing something? What would be the dune way to do this?
>
> build with:
> ./dune-common/bin/dunecontrol --opts=./dune-powerGFS-output/debug_opts
> --only=dune-powerGFS-output all
>
> I am working on dune 2.6
>
> thanks in advance!
>
> Michael
>
>
>
> _______________________________________________
> dune-pdelab mailing listdune-pdelab at lists.dune-project.orghttps://lists.dune-project.org/mailman/listinfo/dune-pdelab
>
> _______________________________________________
> dune-pdelab mailing list
> dune-pdelab at lists.dune-project.org
> https://lists.dune-project.org/mailman/listinfo/dune-pdelab
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.dune-project.org/pipermail/dune-pdelab/attachments/20191115/e72f44b2/attachment.htm>
More information about the dune-pdelab
mailing list