[dune-pdelab] SOLVED! SOLVED: Output component gradients for PowerGridfunctionSpace

Michael Wenske m_wens01 at wwu.de
Fri Nov 15 16:54:36 CET 2019


Dear Santiago,

you were totally correct! Thank you again

(Working version attached)

Michael


On 15.11.19 16:44, Michael Wenske wrote:
>
> Dear Santiago,
>
> thank you for taking the time! What you suggest comes very close to
> what I tried in my Code example (Option 3: line 128). I can indeed
> create the DiscreteGridFunctionGradient from the subspace,
> but for some reason the Adapter will fail!
>
> I append an updated version of the MWE, the adapter will fail to
> instantiate with the DGFGradient made from the subspace (line 137).
>
> thank you again!
>
> Michael
>
>
> On 15.11.19 15:50, Santiago Ospina wrote:
>> 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
>> <mailto: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 list
>>>     dune-pdelab at lists.dune-project.org <mailto:dune-pdelab at lists.dune-project.org>
>>>     https://lists.dune-project.org/mailman/listinfo/dune-pdelab
>>     _______________________________________________
>>     dune-pdelab mailing list
>>     dune-pdelab at lists.dune-project.org
>>     <mailto:dune-pdelab at lists.dune-project.org>
>>     https://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/bb00e527/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: dune-powerGFS-output.cc
Type: text/x-c++src
Size: 7185 bytes
Desc: not available
URL: <https://lists.dune-project.org/pipermail/dune-pdelab/attachments/20191115/bb00e527/attachment.cc>


More information about the dune-pdelab mailing list