Thanks for your response. You are correct. I overlooked this step.
Now I am trying to correct my "shell matrix approach" for ex1f.F90 of
snes solver
(https://github.com/hyharry/small_petsc_test/blob/master/test_shell_jac/ex1f.F90).
I realized that I need to record the base vector X in the context of
shell matrix and then use this info to carry MyMult. However, the
context cannot be obtained through MatShellGetContext(). Here are the
critical parts of my code.
INTERFACE MatCreateShell
SUBROUTINE MatCreateShell(comm,mloc,nloc,m,n,ctx,mat,ierr)
USE solver_context
MPI_Comm :: comm
PetscInt :: mloc,nloc,m,n
Vec :: ctx
Mat :: mat
PetscErrorCode :: ierr
END SUBROUTINE MatCreateShell
END INTERFACE MatCreateShell
INTERFACE MatShellSetContext
SUBROUTINE MatShellSetContext(mat,ctx,ierr)
USE solver_context
Mat :: mat
!TYPE(MatCtx) :: ctx
Vec :: ctx
PetscErrorCode :: ierr
END SUBROUTINE MatShellSetContext
END INTERFACE MatShellSetContext
INTERFACE MatShellGetContext
SUBROUTINE MatShellGetContext(mat,ctx,ierr)
USE solver_context
Mat :: mat
Vec, Pointer :: ctx
PetscErrorCode :: ierr
END SUBROUTINE MatShellGetContext
END INTERFACE MatShellGetContext
in my FormShellJacobian() I did
subroutine FormJacobianShell(snes,X,jac,B,dummy,ierr)
......
call MatShellSetContext(jac,X,ierr)
......
Then in MyMult() I tried to recover this context by
call MatShellGetContext(J,x,ierr)
call VecView(x,PETSC_VIEWER_STDOUT_WORLD,ierr)
Then the program failed with
[0]PETSC ERROR: --------------------- Error Message
--------------------------------------------------------------
[0]PETSC ERROR: Null argument, when expecting valid pointer
[0]PETSC ERROR: Null Pointer: Parameter # 1
In MyMult, I actually defined x to be a pointer. So I am confused here.
Best regards,
Yi
On 1/31/24 03:18, Barry Smith wrote:
It is not running an extra KSP iteration. This "extra" matmult is
normal and occurs in many of the SNESLineSearchApply_* functions, for
example,
https://petsc.org/release/src/snes/linesearch/impls/bt/linesearchbt.c.html#SNESLineSearchApply_BT It
is used to decide if the Newton step results in sufficient decrease of
the function value.
Barry
On Jan 30, 2024, at 3:19 PM, Yi Hu <[email protected]> wrote:
Hello Barry,
Thanks for your reply. The monitor options are fine. I actually meant
my modification of snes tutorial ex1f.F90 does not work and has some
unexpected behavior. I basically wanted to test if I can use a shell
matrix as my jacobian (code is here
https://github.com/hyharry/small_petsc_test/blob/master/test_shell_jac/ex1f.F90).
After compile my modified version and run with these monitor options,
it gives me the following,
( in rhs )
( leave rhs )
0 SNES Function norm 6.041522986797e+00
++++++++++++ in jac shell +++++++++++
0 KSP Residual norm 6.041522986797e+00
=== start mymult ===
=== done mymult ===
1 KSP Residual norm 5.065392549852e-16
Linear solve converged due to CONVERGED_RTOL iterations 1
=== start mymult ===
=== done mymult ===
( in rhs )
( leave rhs )
1 SNES Function norm 3.512662245652e+00
++++++++++++ in jac shell +++++++++++
0 KSP Residual norm 3.512662245652e+00
=== start mymult ===
=== done mymult ===
1 KSP Residual norm 6.230314124713e-16
Linear solve converged due to CONVERGED_RTOL iterations 1
=== start mymult ===
=== done mymult ===
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
2 SNES Function norm 8.969285922373e-01
++++++++++++ in jac shell +++++++++++
0 KSP Residual norm 8.969285922373e-01
=== start mymult ===
=== done mymult ===
1 KSP Residual norm 0.000000000000e+00
Linear solve converged due to CONVERGED_ATOL iterations 1
=== start mymult ===
=== done mymult ===
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
3 SNES Function norm 4.863816734540e-01
++++++++++++ in jac shell +++++++++++
0 KSP Residual norm 4.863816734540e-01
=== start mymult ===
=== done mymult ===
1 KSP Residual norm 0.000000000000e+00
Linear solve converged due to CONVERGED_ATOL iterations 1
=== start mymult ===
=== done mymult ===
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
4 SNES Function norm 3.512070785520e-01
++++++++++++ in jac shell +++++++++++
0 KSP Residual norm 3.512070785520e-01
=== start mymult ===
=== done mymult ===
1 KSP Residual norm 0.000000000000e+00
Linear solve converged due to CONVERGED_ATOL iterations 1
=== start mymult ===
=== done mymult ===
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
5 SNES Function norm 2.769700293115e-01
++++++++++++ in jac shell +++++++++++
0 KSP Residual norm 2.769700293115e-01
=== start mymult ===
=== done mymult ===
1 KSP Residual norm 1.104778916974e-16
Linear solve converged due to CONVERGED_RTOL iterations 1
=== start mymult ===
=== done mymult ===
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
6 SNES Function norm 2.055345318150e-01
++++++++++++ in jac shell +++++++++++
0 KSP Residual norm 2.055345318150e-01
=== start mymult ===
=== done mymult ===
1 KSP Residual norm 0.000000000000e+00
Linear solve converged due to CONVERGED_ATOL iterations 1
=== start mymult ===
=== done mymult ===
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
7 SNES Function norm 1.267482220786e-01
++++++++++++ in jac shell +++++++++++
0 KSP Residual norm 1.267482220786e-01
=== start mymult ===
=== done mymult ===
1 KSP Residual norm 1.498679601680e-17
Linear solve converged due to CONVERGED_RTOL iterations 1
=== start mymult ===
=== done mymult ===
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
8 SNES Function norm 3.468150619264e-02
++++++++++++ in jac shell +++++++++++
0 KSP Residual norm 3.468150619264e-02
=== start mymult ===
=== done mymult ===
1 KSP Residual norm 5.944160522951e-18
Linear solve converged due to CONVERGED_RTOL iterations 1
=== start mymult ===
=== done mymult ===
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
( in rhs )
( leave rhs )
=== start mymult ===
=== done mymult ===
Nonlinear solve did not converge due to DIVERGED_LINE_SEARCH iterations 8
Number of SNES iterations = 8
After each "Linear solve converged due to CONVERGED_ATOL iterations",
the code starts to do mymult again. So I thought it did an extra
(unwanted) KSP iteration. I would like to ask if this extra iteration
could be disabled, or maybe I am wrong about it.
Best regards,
Yi
On 1/30/24 18:35, Barry Smith wrote:
How do I see a difference? What does "hence ruin my previous
converged KSP result" mean? A different answer at the end of the KSP
solve?
$ ./joe > joe.basic
~/Src/petsc/src/ksp/ksp/tutorials*(barry/2023-09-15/fix-log-pcmpi=)*arch-fix-log-pcmpi
$ ./joe -ksp_monitor -ksp_converged_reason -snes_monitor > joe.monitor
~/Src/petsc/src/ksp/ksp/tutorials*(barry/2023-09-15/fix-log-pcmpi=)*arch-fix-log-pcmpi
$ diff joe.basic joe.monitor
0a1,36
> 0 SNES Function norm 6.041522986797e+00
> 0 KSP Residual norm 6.041522986797e+00
> 1 KSP Residual norm 5.065392549852e-16
> Linear solve converged due to CONVERGED_RTOL_NORMAL iterations 1
> 1 SNES Function norm 3.512662245652e+00
> 0 KSP Residual norm 3.512662245652e+00
> 1 KSP Residual norm 6.230314124713e-16
> Linear solve converged due to CONVERGED_RTOL_NORMAL iterations 1
> 2 SNES Function norm 8.969285922373e-01
> 0 KSP Residual norm 8.969285922373e-01
> 1 KSP Residual norm 0.000000000000e+00
> Linear solve converged due to CONVERGED_RTOL_NORMAL iterations 1
> 3 SNES Function norm 4.863816734540e-01
> 0 KSP Residual norm 4.863816734540e-01
> 1 KSP Residual norm 0.000000000000e+00
> Linear solve converged due to CONVERGED_RTOL_NORMAL iterations 1
> 4 SNES Function norm 3.512070785520e-01
> 0 KSP Residual norm 3.512070785520e-01
> 1 KSP Residual norm 0.000000000000e+00
> Linear solve converged due to CONVERGED_RTOL_NORMAL iterations 1
> 5 SNES Function norm 2.769700293115e-01
> 0 KSP Residual norm 2.769700293115e-01
> 1 KSP Residual norm 1.104778916974e-16
> Linear solve converged due to CONVERGED_RTOL_NORMAL iterations 1
> 6 SNES Function norm 2.055345318150e-01
> 0 KSP Residual norm 2.055345318150e-01
> 1 KSP Residual norm 1.535110861002e-17
> Linear solve converged due to CONVERGED_RTOL_NORMAL iterations 1
> 7 SNES Function norm 1.267482220786e-01
> 0 KSP Residual norm 1.267482220786e-01
> 1 KSP Residual norm 1.498679601680e-17
> Linear solve converged due to CONVERGED_RTOL_NORMAL iterations 1
> 8 SNES Function norm 3.468150619264e-02
> 0 KSP Residual norm 3.468150619264e-02
> 1 KSP Residual norm 5.944160522951e-18
> Linear solve converged due to CONVERGED_RTOL_NORMAL iterations 1
On Jan 30, 2024, at 11:19 AM, Yi Hu <[email protected]> wrote:
Dear PETSc team,
I am still trying to sort out my previous
threadhttps://lists.mcs.anl.gov/pipermail/petsc-users/2024-January/050079.htmlusing
a minimal working example. However, I encountered another problem.
Basically I combined the basic usage of SNES solver and shell
matrix and tried to make it work. The jacobian of my snes is
replaced by a customized MATOP_MULT. The minimal example code can
be viewed
herehttps://github.com/hyharry/small_petsc_test/blob/master/test_shell_jac/ex1f.F90
When running with -ksp_monitor -ksp_converged_reason, it shows an
extra mymult step, and hence ruin my previous converged KSP result.
Implement a customized converged call-back also does not help. I am
wondering how to skip this extra ksp iteration. Could anyone help
me on this?
Thanks for your help.
Best wishes,
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 [email protected]
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 [email protected]
-------------------------------------------------
------------------------------------------------------------------------
-------------------------------------------------
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 [email protected]
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 [email protected]
-------------------------------------------------
-------------------------------------------------
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 [email protected]
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 [email protected]
-------------------------------------------------