Dear PETSc Experts, I am implementing a matrix-free jacobian for my SNES solver in Fortran. (command line option -snes_type newtonls -ksp_type gmres) In the main program, I define my residual and jacobian and matrix-free jacobian like the following, … call DMDASNESSetFunctionLocal(DM_mech, INSERT_VALUES, formResidual, PETSC_NULL_SNES, err_PETSc) call DMSNESSetJacobianLocal(DM_mech, formJacobian, PETSC_NULL_SNES, err_PETSc) … subroutine formJacobian(residual_subdomain,F,Jac_pre,Jac,dummy,err_PETSc) #include <petsc/finclude/petscmat.h> use petscmat implicit None DMDALocalInfo, dimension(DMDA_LOCAL_INFO_SIZE) :: & residual_subdomain !< DMDA info (needs to be named "in" for macros like XRANGE to work) real(pREAL), dimension(3,3,cells(1),cells(2),cells3), intent(in) :: & F !< deformation gradient field Mat :: Jac, Jac_pre PetscObject :: dummy PetscErrorCode :: err_PETSc PetscInt :: N_dof ! global number of DoF, maybe only a placeholder N_dof = 9*product(cells(1:2))*cells3 print*, 'in my jac' call MatCreateShell(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,N_dof,N_dof,0,Jac,err_PETSc) CHKERRQ(err_PETSc) call MatShellSetOperation(Jac,MATOP_MULT,GK_op,err_PETSc) CHKERRQ(err_PETSc) print*, 'in my jac' ! for jac preconditioner call MatCreateShell(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,N_dof,N_dof,0,Jac_pre,err_PETSc) CHKERRQ(err_PETSc) call MatShellSetOperation(Jac_pre,MATOP_MULT,GK_op,err_PETSc) CHKERRQ(err_PETSc) print*, 'in my jac' end subroutine formJacobian subroutine GK_op(Jac,dF,output,err_PETSc) real(pREAL), dimension(3,3,cells(1),cells(2),cells3), intent(in) :: & dF real(pREAL), dimension(3,3,cells(1),cells(2),cells3), intent(out) :: & output real(pREAL), dimension(3,3) :: & deltaF_aim = 0.0_pREAL Mat :: Jac PetscErrorCode :: err_PETSc integer :: i, j, k, e … a lot of calculations … print*, 'in GK op' end subroutine GK_op The first question is that: it seems I still need to explicitly define the interface of MatCreateShell() and MatShellSetOperation() to properly use them, even though I include them via “use petscmat”. It is a little bit strange to me, since some examples do not perform this step. Then the main issue is that I can build my own Jacobian from my call back function formJacobian, and confirm my Jacobian is a shell matrix (by MatView). However, my customized operator GK_op is not called when solving the nonlinear system (not print my “in GK op”). When I try to monitor my SNES, it gives me some conventional output not mentioning my matrix-free operations. So I guess my customized MATOP_MULT may be not associated with Jacobian. Or my configuration is somehow wrong. Could you help me solve this issue? Thanks, Yi
------------------------------------------------- Stay up to date and follow us on LinkedIn, Twitter and YouTube. Max-Planck-Institut für Eisenforschung GmbH Max-Planck-Straße 1 D-40237 Düsseldorf Handelsregister B 2533 Amtsgericht Düsseldorf Geschäftsführung Prof. Dr. Gerhard Dehm Prof. Dr. Jörg Neugebauer Prof. Dr. Dierk Raabe Dr. Kai de Weldige Ust.-Id.-Nr.: DE 11 93 58 514 Steuernummer: 105 5891 1000 Please consider that invitations and e-mails of our institute are only valid if they end with …@mpie.de. If you are not sure of the validity please contact r...@mpie.de Bitte beachten Sie, dass Einladungen zu Veranstaltungen und E-Mails aus unserem Haus nur mit der Endung …@mpie.de gültig sind. In Zweifelsfällen wenden Sie sich bitte an r...@mpie.de -------------------------------------------------