[dune-functions] Extract nodes in the basis-tree into new basis

Simon Praetorius simon.praetorius at tu-dresden.de
Sat Feb 2 12:30:36 CET 2019


Hi everyone,

I'm currently working on the implementation of some preconditioners for
a Navier-Stokes equation, based on a pressure Schur-complement approach.
Therefore, it is necessary so assemble an Oseen / Convection-Diffusion
operator on the pressure space and using the resulting matrix inside the
block-preconditioner steps. Working with a Taylor-Hood type global
basis, I was wondering what's the best way to assemble a matrix just on
the pressure space. The subspacebasis might not be optimal, i.e.
although it allows to assemble the operator, the global multi-indices
refer to a global matrix involving the velocity components. So I would
have to create a global matrix for the whole global basis, do the
assembling there and then extract the pressure block. This seems to be
unnecessary complicated approach, I think. Especially, if the
Taylor-Hood basis is just a node in a much larger composite basis it
seems to be an overhead to always work with the global basis and its
indexing.

I thought about some alternatives, but I'm not yet sure whether these
make sense in general:
a) implement something like a sub-basis view that is different from the
subspace-basis view in the sense, that the prefix indices in the
multi-index are omitted and the sizes and dimensions refer to an
extracted basis not part of the global basis.
b) add a function that returns a prebasis factory for a node in the
basis-tree. This would allow to create a new basis with the node type
the same as the original basis, but without other unused nodes.
c) provide a function that returns this size and dimension of a node in
the basis-tree not as subspace of the global basis (this is related to a
discussion in issue #24) and a multi-index transform that removes some
indices (maybe related to MR !125)
d) Sure, one could create a new basis manually, if you know the type of
the pressure component, but this is not a generic way.
e) Maybe you have another (simpler) idea how to implement this.

In some other discussions it was argued that there is hardly a use-case
for a sub-basis that is not related to the global basis. The existing
subspace-basis is very useful, indeed, and should not be changed. But, I
think sometimes it could be useful to have a smaller basis (e.g. just
one node in the basis-tree) extracted from the global basis that is
independent from the latter. An example is the following: In a
multi-phase flow problem, you may want to create a basis as composition
of a Taylor-Hood basis and a basis for the phase-field problem, e.g. a
power<2>(lagrange<k>,...) type. There are some quantities that might be
interesting in this problem-context, like the density or viscosity of
the fluid depending on the phase-field value. These may be created as
DiscreteGlobalBasisFunction from the phase-field basis type
(lagrange<k>), but it does not make sense to store the coefficient
vector for the whole basis, if only one block is used at all. This is a
huge overhead, especially, if you consider not just 2 but N phases with
N>>2.

Best wishes,
Simon


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: OpenPGP digital signature
URL: <https://lists.dune-project.org/pipermail/dune-functions/attachments/20190202/9508a919/attachment.sig>


More information about the dune-functions mailing list