I’ve been playing around with FF++ to solve some problems quite successfully. We are using a hybrid discontinuous Galerkin formulation. Currently, we are solving a time-dependent Cahn-Hilliard-like problem.
However, we were not able to implement the static condensation (Schur complement) approach to reduce the size of the global linear system.
I’ve looked around and in the documentation, but I haven’t found many tips about this.
Also I’ve seen papers citing FreeFEM++ and which seem to use this approach.
I wonder if there is an example somewhere so that I could learn how to do it on FF++ efficiently.
To day they no sparse static condensation in FreeFem++
in fact you want to eliminate of internal dof of the formulation.
Il is not to hard of code with the HashMatrix, it is the same ShurComplement.cpp algorithm of plugin
but the result is a sparse matrix (ie. a hash matrix in freefem++)
the only difficulty is to compute
I given numbering of Schur complement I[i] is the index in A of the i in S if I[i] >=0
the matrix A is split in 4 blocks [[AII,AIJ],[AJI, AJJ]] where
J = index not in I, AII = A(I,I),
S = AII - AIJ AJJ^-1 AJI
but le matrix AJJ^-1 is a diagonal block matrix
if we get the correct numbering J. (ie. we get a numbering by connect component
of the graphe G_A defined by A (ie i,j a link if a_ij is non zero) restricted on J. ).
then S is Sparse matrix.
If you are able to code this you are well come.
F. Hecht.
There are a lot of PETSc things to help you out. You could also use a fieldsplit preconditioner, and approximate the Schur complement, see this documentation page.