<div dir="ltr"><div><div><div>I want to set a custom convergence test for the inner KSPs of Schur complement method, so I am using PCFieldSplitGetSubKSP() to get the inner KSPs:<br><br>    int n_subksp;<br>    KSP *subksp = NULL;<br><br>    PCFieldSplitGetSubKSP(s->pc, &n_subksp, &subksp);<br>    assert(n_subksp == 2);<br><br></div>But I get a segmentation fault on MatSchurComplementGetKSP(). From file src/ksp/ksp/utils/schurm.c (line 320):<br><br>PetscErrorCode MatSchurComplementGetKSP(Mat S, KSP *ksp)<br>{<br>  Mat_SchurComplement *Na;<br><br>  PetscFunctionBegin;<br>  PetscValidHeaderSpecific(S,MAT_CLASSID,1);<br>  PetscValidPointer(ksp,2);<br>  Na   = (Mat_SchurComplement*) S->data;<br>  *ksp = Na->ksp; // <<<<< segfaults on this line, 'Na' is an invalid pointer...<br>  PetscFunctionReturn(0);<br>}<br><br></div>This is the stack trace given by valgrind:<br><br>==13559== Invalid read of size 8<br>==13559==    at 0x56B8780: MatSchurComplementGetKSP (schurm.c:320)<br>==13559==    by 0x55F5B08: PCFieldSplitGetSubKSP_FieldSplit_Schur(_p_PC*, int*, _p_KSP***) (fieldsplit.c:1367)<br>==13559==    by 0x5605187: PCFieldSplitGetSubKSP (fieldsplit.c:1869)<br>==13559==    by 0x166305: set_singular_convergence_test (solver-petsc.c:293)<br></div>### irrelevant calls, from inside my program<br><div>==13559==  Address 0x6c0 is not stack'd, malloc'd or (recently) free'd<br>==13559== <br><br></div><div>I tried doing this operation both before and after MatAssembly*() calls, and with both I get the same result. Petsc version is 3.7.5, installed from Ubuntu repository. Is this a bug? Or I am doing it wrong?<br clear="all"></div><div><div><div><div><div><br>-- <br><div class="gmail_signature">Lucas Clemente Vella<br><a href="mailto:lvella@gmail.com" target="_blank">lvella@gmail.com</a></div>
</div></div></div></div></div></div>