Barry,<br><br> Thanks for the reply;<br><br><div class="gmail_quote">On Mon, Dec 1, 2008 at 4:56 PM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="Ih2E3d"><br>
On Dec 1, 2008, at 12:28 PM, Edson Tadeu wrote:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi,<br>
<br>
I'm solving non-linear problems with Line Search, and sometimes I need to change an entire row of the Jacobian together with the corresponding element in the Function, but I only know which rows/elements need to be changed when I'm computing the Jacobian. So, what I'd like to know first is:<br>
</blockquote>
<br></div>
Maybe if you explain why you need to "change an entire row of the Jacobian together with the corresponding element in the Function" we could come up<br>
with some suggestions on how to proceed.<div class="Ih2E3d"></div></blockquote><div><br>It's because, depending on some conditions, I need to make some change of variables in the original equations, otherwise the Jacobian will have linear dependent rows. For example, I need to tell that x(4) = 1.0-x(3) (instead of the original equation for x(4)). I would do it by changing the Jacobian like this:<br>
<br>J(4,3) = 1; J(4,4) = 1; all other columns of row 4 of J are zero. F(4) = 0.<br><br>This way, I would have delta_x(4) = -delta_x(3). I've solved this now by directly changing the delta solution vector (delta_x) in the pre check phase... it seems to be working, but it doesn't seem to be the right way, I don't know...<br>
<br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="Ih2E3d"><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
1) Am I allowed to change the Function vector from inside FormJacobian? (I've looked inside SNESSolve_LS, and it seems that this is not allowed, because "fnorm" is evaluated before SNESComputeJacobian, and if I change F inside FormJacobian, fnorm would be wrong).<br>
<br>
or<br>
<br>
2) Am I allowed to change the Function vector from PreCheck routine?<br>
<br>
If none of that is allowed, another solution that I thought was to compute the Jacobian while computing the Function. The FAQ says that "You are free to have your 'FormFunction' compute as much of the Jacobian at that point as you like, keep the information in the user context (the final argument to FormFunction and FormJacobian) and then retreive the information in your FormJacobian() function". The problem is that FormFunction is called many times more than FormJacobian, and Jacobian calculation is slow, so:<br>
<br>
3) Is there any way to know when I should really recompute the Jacobian from inside FormFunction? (I don't think so, but...)<br>
</blockquote>
<br></div>
No. But if you do not use any line search at all then each function evaluation will have an associated Jacobian so you can compute them<br>
together. (Of course you lose the globalization of the line search so SNES may not converge). You can turn off all line searches with -snes_ls basic<br>
from the command line or from the code SNESLineSearchSet(snes,SNESLineSeachNo,PETSC_NULL);<br><font color="#888888">
<br>
Barry</font><div><div></div><div class="Wj3C7c"></div></div></blockquote><div><br> Ok, but the whole reason that I'm using SNES is to speed up my computations by using the Line Search algorithms (or maybe Trust Region). I had coded an algorithm before that manually computed using full steps, and it were working, but were slow!<br>
<br></div></div> Thanks,<br>Edson<br><br>