I am creating an Schur complement matrix explicitly (solver%schur) and setting it with code like:
call SNESGetKSP(solver%snes,innerksp,ierr)
call KSPGetPC(innerksp,spc,ierr)
call
PCFieldSplitSetSchurPre(spc,PC_FIELDSPLIT_SCHUR_PRE_USER,solver%schur,ierr)
I would think that the "inner" solver would not be used but it is getting
used. It looks to me like I am not getting this hooked up correctly and my
Schur complement is not being used. I've attached an output with view data
and converged_reason data. I use the "inner" parameters for my Schur
construction (code appended), so you see it at the beginning of this
output. But it is also in each solve, which seems wrong to me.
Any thoughts?
Thanks,
Mark
call MatGetSize(solver%Bmat,M,N,ierr)
call VecDuplicate(Xsub(1),v1,ierr)
call VecDuplicate(Xsub(1),v2,ierr)
call KSPCreate(solver%comm,innerksp,ierr)
call
KSPSetOptionsPrefix(innerksp,'fsa_fieldsplit_lambda_inner_',ierr)
call KSPSetFromOptions(innerksp,ierr)
call KSPSetOperators(innerksp, solver%Amat, solver%Amat, ierr )
call KSPSetUp(innerksp,ierr)
call MatDuplicate(solver%Dmat,MAT_COPY_VALUES,solver%schur,ierr)
call MatGetOwnershipRange(solver%Cmat,low,high,ierr)
do k=0,N-1
call MatGetColumnVector(solver%Bmat,v1,k,ierr)
call KSPSolve(innerksp,v1,v2,ierr)
do j=0,N-1
call VecZeroEntries(v1,ierr)
if (j.ge.low .and.j.lt.high) then
call MatGetRow(solver%Cmat,j,ncols,cols,vals,ierr)
call VecSetValues(v1,ncols,cols,vals,INSERT_VALUES,ierr)
!write(*,*) (vals(i), i=1,ncols)
call MatRestoreRow(solver%Cmat,j,ncols,cols,vals,ierr)
end if
call VecAssemblyBegin(v1,ierr)
call VecAssemblyEnd(v1,ierr)
call VecTDot(v1,v2,dot,ierr)
dot = -dot
call
MatSetValues(solver%schur,ione,j,ione,k,dot,INSERT_VALUES,ierr) ! D - C
(A-1) B
end do
end do
call MatAssemblyBegin(solver%schur,MAT_FINAL_ASSEMBLY,ierr)
call MatAssemblyEnd(solver%schur,MAT_FINAL_ASSEMBLY,ierr)
call VecDestroy(v1,ierr)
call VecDestroy(v2,ierr)
call KSPDestroy(innerksp,ierr)
call SNESGetKSP(solver%snes,innerksp,ierr)
call KSPGetPC(innerksp,spc,ierr)
call
PCFieldSplitSetSchurPre(spc,PC_FIELDSPLIT_SCHUR_PRE_USER,solver%schur,ierr)
out
Description: Binary data
