<div dir="ltr"><div>Hello everyone,</div><div><br></div><div>I am curious about the purpose of mdiag in MatInverseBlockDiagonal_SeqBAIJ</div><div><br></div><a href="http://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/baij/seq/baij.c.html">http://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/baij/seq/baij.c.html</a><br><div><br></div><div><div>It seems that the inverse of the diagonal block is stored is a->idiag, and the extra copy of diagonal block itself is stored in mdiag or  a->idiag+bs2*mbs. What is the purpose of storing this mdiag as an extra copy of diagonal block? When will this mdiag be used?<br></div><div><br></div><div>Thank you.</div><div><br></div><div>Best,</div><div>Xiangdong</div></div><div><br></div><div><br></div><div><div>if (!a->idiag) {</div><div> 38:     PetscMalloc1(2*bs2*mbs,&a->idiag);</div><div> 39:     PetscLogObjectMemory((PetscObject)A,2*bs2*mbs*sizeof(PetscScalar));</div><div> 40:   }</div><div> 41:   diag  = a->idiag;</div><div> 42:   mdiag = a->idiag+bs2*mbs;</div></div><div><br></div><div><br></div><div><div>138:     for (i=0; i<mbs; i++) {</div><div>139:       odiag  = v + bs2*diag_offset[i];</div><div>140:       PetscMemcpy(diag,odiag,bs2*sizeof(PetscScalar));</div><div>141:       PetscMemcpy(mdiag,odiag,bs2*sizeof(PetscScalar));</div><div>142:       PetscKernel_A_gets_inverse_A(bs,diag,v_pivots,v_work,allowzeropivot,&zeropivotdetected);</div><div>143:       if (zeropivotdetected) A->factorerrortype = MAT_FACTOR_NUMERIC_ZEROPIVOT;</div><div>144:       diag  += bs2;</div><div>145:       mdiag += bs2;</div></div><div><br></div></div>