<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Oct 8, 2015 at 2:41 PM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
The easiest way for you to implement this is to simply call your update to the solution and then call SNESSolve() again. For example<br>
<br>
while (1) {<br>
SNESSolve(snes,x,NULL);<br>
SNESGetConvergedReason(snes,&reason);<br>
if (reason > 0) break; /* since snes has converged */<br>
change x per your way<br>
}<br>
<br>
The problem with the code above is that each new call to SNESSolve() resets the rtol convergence factor based on the current latest norm of F so the code above will "oversolve" the problem. You can call SNESSetTolerance() above the while loop with an appropriate atol to get it to exit at the point you want to declare it converged.<br>
<br>
It is not worthwhile trying to "weave" your special update code inside the Newton method.</blockquote><div><br></div><div>Do you know what the non-physical solutions are?</div><div><br></div><div> Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="HOEnZb"><font color="#888888"><br>
Barry<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
> On Oct 8, 2015, at 1:05 PM, Michael Povolotskyi <<a href="mailto:mpovolot@purdue.edu">mpovolot@purdue.edu</a>> wrote:<br>
><br>
> Thank you.<br>
> The situation is as follows:<br>
> The system I need to solve does not have a unique solution, but only one makes sense from physical point of view. I need to compute direction in a different way based on the physics.<br>
><br>
> In other words it should be like this:<br>
><br>
> 1. Start with a solution guess<br>
> 2. Do full Newton step<br>
> 3. If converged, exit<br>
> else if the solution improved go to step 2<br>
> otherwise "update_solution_in_my_way" ang go to step 2<br>
><br>
> Is it possible to do this in PETSc?<br>
> Michael.<br>
><br>
> On 10/08/2015 01:58 PM, Barry Smith wrote:<br>
>>> On Oct 8, 2015, at 12:26 PM, Michael Povolotskyi <<a href="mailto:mpovolot@purdue.edu">mpovolot@purdue.edu</a>> wrote:<br>
>>><br>
>>> Dear Petsc developers and users,<br>
>>> I'm solving a nonlinear system with PETSc.<br>
>>> Often simple Newton iterations do not work and I have to use either linear search or trust region.<br>
>>> I would like to use my own algorithm to find a next iteration approximation to solution if the Newton step does not improve the residual. As far as I can see I have to define my own SNELLineSearch object. Is there any example that shows how to do it?<br>
>> The line search model is 1) select direction based on approximate solution of approximate Jacobian 2) search in THAT direction for a decrease in the function evaluation. You state "if the Newton step does not improve the residual." so will you be computing the DIRECTION in a different way than (1) or will you be using the same direction but trying somehow to find a decrease in the function evaluation using a different technique then the standard line searchs we provide?<br>
>><br>
>> Frankly if the line searches we provide don't work that means the direction is not good and no "special" line search will recover. I really recommend you go through our suggestions on the FAQ <a href="http://www.mcs.anl.gov/petsc/documentation/faq.html#newton" rel="noreferrer" target="_blank">http://www.mcs.anl.gov/petsc/documentation/faq.html#newton</a> on trying to figure out why Newton is not converging before you think about writing a special line search.<br>
>><br>
>> Barry<br>
>><br>
>><br>
>><br>
>>> Thank you,<br>
>>> Michael.<br>
>>><br>
>>> --<br>
>>> Michael Povolotskyi, PhD<br>
>>> Research Assistant Professor<br>
>>> Network for Computational Nanotechnology<br>
>>> Hall for Discover and Learning Research, Room 441<br>
>>> West Lafayette, IN 47907<br>
>>> Phone <a href="tel:%28765%29%204949396" value="+17654949396">(765) 4949396</a><br>
>>><br>
><br>
> --<br>
> Michael Povolotskyi, PhD<br>
> Research Assistant Professor<br>
> Network for Computational Nanotechnology<br>
> Hall for Discover and Learning Research, Room 441<br>
> West Lafayette, IN 47907<br>
> Phone <a href="tel:%28765%29%204949396" value="+17654949396">(765) 4949396</a><br>
><br>
<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener</div>
</div></div>