Colouring in symmetric and non symmetric block jacobi precond

Hello there,

I was inspecting the source code of BlockJacobiPrecond and BlockJacobiPrecondSymmetric and I think I have noticed a different strategy for colouring their blocks.

In the first version, the procedure is along the lines of

for b in blocks
 can_colour = true
 for eq in b
   if has_color[eq]
     can_colour = false

//do some stuff
 for eq in b
   for eeq in mat.GetRowIndices(eq):
     has_color[eq] = true

while on the symmetric version,

for b in blocks
 can_colour = true
 for eq in b
   for eeq in mat.GetRowIndices(eq):
     if has_color[eeq]
       can_colour = false

//do some stuff
 for eq in b
   for eeq in mat.GetRowIndices(eq):
     has_color[eq] = true

Assuming that we have an equation x in block a and an equation y in block b and that the dof corresponding to x does not affect the residual of y (and vice-versa), but they would both affect the residual of a given equation z (that does not belong to blocks a nor b).
If I understood correctly, on the non symmetric version, a and b could be assigned the same colour. For the symmetric version, this does not hold.

If I may ask, is there a reasoning for this difference?

Hi Francisco,
I am not sure whether this answers the question exactly, but one difference between the non-symmetric and the symmetric one is the following:
In the symmetric one, the row-indices are stored only for the lower triangular matrix. So, in terms of row-indices, it must be more restrictive in comparison to the non-symmetric one.
best, Joachim

Hi Joachim,

Thank you for this answer. I was indeed wondering if the symmetric matrix had somehow all the row-indices stored. This explains this more rigid approach on the colouring.

Best,

Francisco

p.s. in my experiments, I’ve found that using a direct solver for the lowest order dofs + blocks for high order edges and faces is quite effective for my problem. Zaglmayr’s thesis (as her posterior work with Paul Ledger) has been really useful now, and it was fun to experiment in NGSolve as well. Thank you!