[Dune] Preconditioner

Simon Praetorius simon.praetorius at tu-dresden.de
Tue Sep 9 15:24:13 CEST 2025


Hi,

Perhaps I can contribute a few more thoughts: if the size of the blocks 
is variable but fixed, in the sense that each setup requires a different 
size, but each block is the same size and not changed within a setup, 
then BCRSMatrix<FieldMatrix> would be the best idea, also in terms of 
performance. You could implement a simple switch-case branch in the main 
program to define the block size. Then you can map everything in one 
program. There is also a helper structure for this in dune-common:

Dune::Hybrid::switchCases(std::index_sequence<1,2,3,4,5,...>{}, n, 
[&](auto N) { run<N>(); });

Here, all possible sizes n in {1,2,3,4,5...} are tested and the correct 
one is then passed as a static constant to the passed (lambda) function, 
in which you can then use a FieldMatrix<double,N,N>.

An alternative you mentioned is to flatten the matrix structure. There 
are various ways to do this. I use dune-functions, where blocking can be 
defined in the function space basis using a so-called index merging 
strategy. This allows you to map an index of a local basis function on a 
grid element to a global multi-index or flat index, which you can then 
use to address the matrix entries. With the help of the MatrixIndexSet, 
you can use this to build the non-zero structure of the BCRSMatrix 
accordingly. See the examples in dune-functions for an explanation how 
to do this.

Best,
Simon


Am 09.09.25 um 14:59 schrieb Mike Rosing:
> Howdy Christian,
>
> Recompiling everytime I change size is annoying, but it's also not
> that big a deal. Worst case if I want different sizes I can just use
> different named variables - so I can see how to get there from here.
>
> I just have to change my thought process to the reality of the code.
>
> I did try flattening the matrix to BCRSMatrix<double> but I must have
> done something wrong because DUNE aborted with a NaN error. So I think
> being safe is the way to go.
>
> Thanks!
> Mike
>
> On Tue, 9 Sep 2025, Christian Engwer wrote:
>
>> Date: Tue, 09 Sep 2025 07:55:16 +0200
>> From: Christian Engwer <christian.engwer at uni-muenster.de>
>> To: dune at lists.dune-project.org, Mike Rosing <eresrch at sdf.org>
>> Subject: Re: [Dune] Preconditioner
>>
>> Dear Mike,
>>
>> I'm afraid also we DUNE people need to dig deeper into this.
>>
>> The issue here is that you're using Matrix for the blocks, which have 
>> dynamic size. The usual pattern is to use FieldMatrix, which has 
>> static size and a default constructor. The algorithms use this to 
>> decide where to invest directly.
>>
>> The genetic algorithms usually expect BCRSMatrix to contain dense 
>> data, but Matrix dies not where that everything below is dense.
>>
>> The safe way would be to use BCRSMatrix<FieldMatrix<double,n,n>> and 
>> BlockVector<FieldVector<double, n>>
>>
>> Do you really need the dynamic size?
>>
>> I didn't test myself, but perhaps 
>> BCRSMatrix<DynamicMatrix<double,n,n>> and 
>> BlockVector<DynamicVector<double, n>> work. I would expect relaxation 
>> methods to work, but not AMG. Für ILU it might be a problem, that the 
>> constructor of DynamicMatrix needs the size information.
>>
>> Best
>> Christian
>>
>> Am 6. September 2025 21:04:48 MESZ schrieb Mike Rosing 
>> <eresrch at sdf.org>:
>>> I figured out how to get the MatrixAdaptor to be happy with my 
>>> structures:
>>>
>>> using Occupy = Matrix<double>;
>>> using ElementVec = BlockVector<double>;
>>>
>>>  MatrixAdapter<BCRSMatrix<Occupy>, BlockVector<ElementVec>,
>>>                    BlockVector<ElementVec>> linearOperator(stiffns);
>>>
>>> but none of the preconditioners are happy with this.
>>> The ILU preconditioner gives the attached error output.
>>>
>>> Does it make any sense to attempt to create a preconditioner that 
>>> can deal with this structure, or should I just copy all the data 
>>> into a flat matrix and vector with no sub-structure? Because I 
>>> haven't gotten to call the solver yet, so this might be a lot deeper 
>>> than I want to know about.
>>>
>>> Thanks,
>>>
>>>
>>> Mike Rosing
>>> Engineering Research
>>> Madison WI USA
>>> Elliptic Curve Crypto:  http://mng.bz/D9NA
>>
>
> Mike Rosing
> Engineering Research
> Madison WI USA
> Elliptic Curve Crypto:  http://mng.bz/D9NA
>
> _______________________________________________
> Dune mailing list
> Dune at lists.dune-project.org
> https://lists.dune-project.org/mailman/listinfo/dune

-- 
Dr. Simon Praetorius
Technische Universität Dresden
Institute of Scientific Computing
phone: +49 351 463-34432
mail: simon.praetorius@​tu-dresden.de




More information about the Dune mailing list