Barry, Thanks for the reply;
On Mon, Dec 1, 2008 at 4:56 PM, Barry Smith <bsmith at mcs.anl.gov> wrote: > > On Dec 1, 2008, at 12:28 PM, Edson Tadeu wrote: > > Hi, >> >> 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: >> > > 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 > with some suggestions on how to proceed. > 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: J(4,3) = 1; J(4,4) = 1; all other columns of row 4 of J are zero. F(4) = 0. 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... > > >> >> 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). >> >> or >> >> 2) Am I allowed to change the Function vector from PreCheck routine? >> >> 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: >> >> 3) Is there any way to know when I should really recompute the Jacobian >> from inside FormFunction? (I don't think so, but...) >> > > 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 > 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 > from the command line or from the code > SNESLineSearchSet(snes,SNESLineSeachNo,PETSC_NULL); > > Barry > 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! Thanks, Edson -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20081201/5e466c81/attachment.htm>
