<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><br class=""></div>    I'm sorry, I made a small mistake in my previous email. It is <div class=""><br class=""></div><div class="">   F'(x) = A(x) + A'(x)x - b'(x)   not F'(x) = A(x) + A'(x)x + b'(x) </div><div class=""><br class=""></div><div class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Oct 9, 2020, at 10:40 AM, baikadi pranay <<a href="mailto:pranayreddy865@gmail.com" class="">pranayreddy865@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Thank you for the response. I have one more quick question.<br class="">Is the solution of A(x)x=b(x) obtained from Newton's method the final solution or is it the solution of A(x^i)x^(i+1)=b(x^i). In other words, do I need to use the solution obtained from Newton's method to update the Jacobian, use Newton method again and repeat the process?<br class=""></div></div></blockquote><div><br class=""></div>  SNESSolve() with SNESSetPicard() continues the iteration calling your routine that computes A repeatedly until the system has converged. You can control the convergence criteria with SNESSetTolerances() (see also the manual pages that page links to). You never need call your routine that computes A from your code, PETSc calls it as it needs it. </div><div><br class=""></div><div>  Also, and I apologize for being pedantic, but using the computation of A() and SNESSetPicard() is NOT doing Newton's method, it is a different algorithm called Picard. If you want to run Newton then you need to write a routine that computes the quantity A(x) + A'(x)x + b'(x)  (not necessarily by using this exact product-rule formula). Computing just A() cannot give you Newton's method. For many problems Picard is good enough so people don't bother to code F'(x) and skip Newton's method and just use Picard. For some problems the extra effort of coding F'(x) gives a Newton that converges much faster than Picard.</div><div><br class=""></div><div>  Barry</div><div><br class=""></div><div><br class=""></div><div><br class=""></div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class="">Best Regards,<br class="">Pranay. </div><div hspace="streak-pt-mark" style="max-height:1px" class=""><img alt="" style="width:0px;max-height:0px;overflow:hidden" src="https://mailfoogae.appspot.com/t?sender=acHJhbmF5cmVkZHk4NjVAZ21haWwuY29t&type=zerocontent&guid=90ddeb1f-7c10-4a56-995e-9e4e40daa962" class=""><font color="#ffffff" size="1" class="">ᐧ</font></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 9, 2020 at 7:43 AM Barry Smith <<a href="mailto:bsmith@petsc.dev" class="">bsmith@petsc.dev</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="overflow-wrap: break-word;" class=""><div class=""><br class=""></div>  To provide the functions to the Picard iteration you call SNESSetPicard() not SNESSetFunction() and SNESSetJacobian(), you provide code to compute A(x) and b(x).<div class=""><br class=""></div><div class="">  Note that in the Picard iteration the matrix A(x) is NOT the Jacobian of  F(x) = A(x) x - b(x). The Jacobian of F(x) is the more complicated F'(x) = A(x) + A'(x)x + b'(x) </div><div class=""><br class=""></div><div class="">  Barry</div><div class=""><br class=""><div class=""><br class=""><blockquote type="cite" class=""><div class="">On Oct 9, 2020, at 6:38 AM, Matthew Knepley <<a href="mailto:knepley@gmail.com" target="_blank" class="">knepley@gmail.com</a>> wrote:</div><br class=""><div class=""><div dir="ltr" class=""><div dir="ltr" class="">On Fri, Oct 9, 2020 at 4:53 AM baikadi pranay <<a href="mailto:pranayreddy865@gmail.com" target="_blank" class="">pranayreddy865@gmail.com</a>> wrote:<br class=""></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class=""><div dir="ltr" class="">Hello,<br class="">I have a couple of questions regarding how SNESSetFunction,SNESSetJacobian and SNESSolve work together. I am trying to solve a nonlinear system of the form A(x)x=b(x). I am using Fortran90. The way I intend to solve the above equation is as follows:<br class="">Step 1: initialize x with an initial guess</div><div class="">Step 2: Solve using SNESSolve for (x^i, i is the iteration number, i=1,2,3...)</div><div class="">Step 3: Calculate the update and check if it is less than tolerance</div><div class="">Step 4: If yes, end the loop. Else the jacobian matrix and function should be updated using x^(i) and go back to step 2.<br class=""></div></div></blockquote><div class=""><br class=""></div><div class="">You are describing the Picard iteration:</div><div class=""><br class=""></div><div class="">  <a href="https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/SNES/SNESSetPicard.html" target="_blank" class="">https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/SNES/SNESSetPicard.html</a></div><div class=""><br class=""></div><div class="">You can do this, but it will converge more slowly than Newton. We usually advise using Newton.</div><div class=""> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class=""><div class="">The part which is a little confusing to me is in understanding how to update the jacobian matrix and the function F (= A(x)x-b(x)). <br class=""><br class="">1) Should I explicitly call the subroutines Form Function and FormJacobian by using x^i as the input argument or is this automatically taken care of when I go back to step 2 and call SNESSolve?<br class=""></div></div></blockquote><div class=""><br class=""></div><div class="">No. SNES calls these automatically.</div><div class=""><br class=""></div><div class="">  Thanks,</div><div class=""><br class=""></div><div class="">     Matt</div><div class=""> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class=""><div class="">2) If the answer to the above question is yes, I do not fully understand the role played by the functions SNESSetFunction and SNESSetJacobian.<br class=""><br class="">I apologize if I am not clear in my explanation. I would be glad to elaborate on any section of my question. Please let me know if you need any further information from my side.<br class=""><br class="">Thank you,<br class="">Sincerely,<br class="">Pranay.</div></div><div hspace="streak-pt-mark" style="max-height:1px" class=""><img alt="" style="width: 0px; max-height: 0px; overflow: hidden;" src="https://mailfoogae.appspot.com/t?sender=acHJhbmF5cmVkZHk4NjVAZ21haWwuY29t&type=zerocontent&guid=af74088e-1b2d-4959-a8dc-d23913da4f3e" class=""><font color="#ffffff" size="1" class="">ᐧ</font></div>
</blockquote></div><br clear="all" class=""><div class=""><br class=""></div>-- <br class=""><div dir="ltr" class=""><div dir="ltr" class=""><div class=""><div dir="ltr" class=""><div class=""><div dir="ltr" class=""><div class="">What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br class="">-- Norbert Wiener</div><div class=""><br class=""></div><div class=""><a href="http://www.cse.buffalo.edu/~knepley/" target="_blank" class="">https://www.cse.buffalo.edu/~knepley/</a><br class=""></div></div></div></div></div></div></div></div>
</div></blockquote></div><br class=""></div></div></blockquote></div>
</div></blockquote></div><br class=""></div></body></html>