<div dir="ltr">Already on it.<div><br></div><div>- Peter</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, May 1, 2014 at 2:27 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"><div class=""><br>
On May 1, 2014, at 2:24 PM, Peter Brune <<a href="mailto:prbrune@gmail.com">prbrune@gmail.com</a>> wrote:<br>
<br>
> Yes, you've got to be careful about this in the case of preconditioning.  I'm still pretty sure that SNESGetFunctionNorm() (which is ancient <a href="http://www.mcs.anl.gov/petsc/petsc-2.2.0/docs/manualpages/SNES/SNESGetFunctionNorm.html" target="_blank">http://www.mcs.anl.gov/petsc/petsc-2.2.0/docs/manualpages/SNES/SNESGetFunctionNorm.html</a> )<br>

<br>
</div>   Yikes. This may predate proper caching of norms with vectors.<br>
<br>
   So will you make a branch and try to eliminate this beast?<br>
<br>
   Thanks<br>
<span class="HOEnZb"><font color="#888888"><br>
    Barry<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
> can be replaced transparently with VecNorm();  SNESSetFunctionNorm() is used in one place and can be eliminated, unless we're going to put wonky logic in there about when things are set.<br>
><br>
><br>
> On Thu, May 1, 2014 at 2:02 PM, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>> wrote:<br>
><br>
> On May 1, 2014, at 1:32 PM, Peter Brune <<a href="mailto:prbrune@gmail.com">prbrune@gmail.com</a>> wrote:<br>
><br>
> > Yeah that bit of interface can most likely go away entirely.  SNESSet/GetFunctionNorm is barely used in the code and can be mostly replaced with calls to VecNorm().  It's odd that snes->norm isn't the same as the norm of the function at the end of an iteration, but is of course totally possible given the multitude of potential exit conditions.  Actual output would, you know, be helpful in diagnosing what exactly's going on instead of forcing us to stab blindly into the dark.<br>

><br>
>    Hmm, what about the weird case with nonlinear preconditioners where the “function norm” may not be the function norm. Like in<br>
><br>
>   /* check if the function is valid based upon how the inner solver is preconditioned */<br>
>     if (normschedule != SNES_NORM_NONE && normschedule != SNES_NORM_INITIAL_ONLY && (npcside == PC_RIGHT || functype == SNES_FUNCTION_UNPRECONDITIONED)) {<br>
>       ierr = SNESGetFunction(snes->pc,&FPC,NULL,NULL);CHKERRQ(ierr);<br>
>       if (FPC) {<br>
>         if (fnorm) {ierr = SNESGetFunctionNorm(snes->pc,fnorm);CHKERRQ(ierr);}<br>
>         ierr = VecCopy(FPC,F);CHKERRQ(ierr);<br>
>       } else {<br>
>         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Preconditioner has no function");<br>
>       }<br>
>     } else {<br>
>       ierr = SNESGetSolution(snes->pc,&XPC);CHKERRQ(ierr);<br>
>       if (XPC) {<br>
>         ierr = SNESComputeFunction(snes->pc,XPC,F);CHKERRQ(ierr);<br>
>         if (fnorm) {ierr = VecNorm(F,NORM_2,fnorm);CHKERRQ(ierr);}<br>
><br>
> or<br>
><br>
>     ierr = PetscInfo4(snes,"fnorm=%18.16e, gnorm=%18.16e, ynorm=%18.16e, lssucceed=%d\n",(double)fnorm,(double)gnorm,(double)ynorm,(int)lssucceed);CHKERRQ(ierr);<br>
><br>
>     if (snes->pc && snes->pcside == PC_RIGHT) {<br>
>       ierr = PetscLogEventBegin(SNES_NPCSolve,snes->pc,X,0,0);CHKERRQ(ierr);<br>
>       ierr = SNESSolve(snes->pc,snes->vec_rhs,X);CHKERRQ(ierr);<br>
>       ierr = PetscLogEventEnd(SNES_NPCSolve,snes->pc,X,0,0);CHKERRQ(ierr);<br>
>       ierr = SNESGetConvergedReason(snes->pc,&reason);CHKERRQ(ierr);<br>
>       if (reason < 0 && reason != SNES_DIVERGED_MAX_IT) {<br>
>         snes->reason = SNES_DIVERGED_INNER;<br>
>         PetscFunctionReturn(0);<br>
>       }<br>
>       ierr = SNESGetNPCFunction(snes,F,&fnorm);CHKERRQ(ierr);<br>
>     }<br>
><br>
>     ierr = SNESSetIterationNumber(snes, i+1);CHKERRQ(ierr);<br>
>     ierr = SNESSetFunctionNorm(snes, fnorm);CHKERRQ(ierr);<br>
><br>
>   and a few other cases?<br>
><br>
>   Barry<br>
><br>
> ><br>
> > - Peter<br>
> ><br>
> ><br>
> > On Thu, May 1, 2014 at 1:00 PM, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>> wrote:<br>
> ><br>
> >   Peter,<br>
> ><br>
> >      This SNESSetFunctionNorm() seems pretty likely to be fragile where it doesn’t always get set. Is there any way we can test that it always gets updated properly when the function gets re-evaluated?   For example what if one place in the code the function is evaluated but the norm does not get computed and set with SNESSetFunctionNorm()?<br>

> ><br>
> >    Thanks<br>
> ><br>
> >     Barry<br>
> ><br>
> ><br>
> > Begin forwarded message:<br>
> ><br>
> >> From: Xiangdong <<a href="mailto:epscodes@gmail.com">epscodes@gmail.com</a>><br>
> >> Subject: Re: [petsc-users] questions about the SNES Function Norm<br>
> >> Date: May 1, 2014 at 10:32:44 AM CDT<br>
> >> To: Matthew Knepley <<a href="mailto:knepley@gmail.com">knepley@gmail.com</a>><br>
> >> Cc: Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>>, PETSc users list <<a href="mailto:petsc-users@mcs.anl.gov">petsc-users@mcs.anl.gov</a>><br>
> >><br>
> >> Under what condition, SNESGetFunctionNorm() will output different results from SENEGetFunction + VecNorm (with NORM_2)?<br>
> >><br>
> >> For most of my test cases, it is the same. However, when I have some special (trivial) initial guess to the SNES problem, I see different norms.<br>
> >><br>
> >> Another phenomenon I noticed with this is that KSP in SNES squeeze my matrix by eliminating rows. I have a Jacobian supposed to be 50-by-50. When I use KSPGetOperators/rhs/solutions, I found that the operator is 25-by-25, and the rhs and solution is with length 25. Do you have any clue on what triggered this? To my surprise, when I output the Jacobian inside the FormJacobianLocal, it outputs the correct matrix 50-by-50 with correct numerical entries. Why does the operator obtained from KSP is different and got rows eliminated? These rows got eliminated have only one entries per row, but the rhs in that row is not zero. Eliminating these rows would give wrong solutions.<br>

> >><br>
> >> Thank you.<br>
> >><br>
> >> Xiangdong<br>
> >><br>
> >><br>
> >><br>
> >><br>
> >><br>
> >><br>
> >> On Tue, Apr 29, 2014 at 3:12 PM, Matthew Knepley <<a href="mailto:knepley@gmail.com">knepley@gmail.com</a>> wrote:<br>
> >> On Tue, Apr 29, 2014 at 2:09 PM, Xiangdong <<a href="mailto:epscodes@gmail.com">epscodes@gmail.com</a>> wrote:<br>
> >> It turns out to a be a bug  in my FormFunctionLocal(DMDALocalInfo *info,PetscScalar **x,PetscScalar **f,AppCtx *user). I forgot to initialize the array f. Zero the array f solved the problem and gave consistent result.<br>

> >><br>
> >> Just curious, why does not petsc initialize the array f to zero by default inside petsc when passing the f array to FormFunctionLocal?<br>
> >><br>
> >> If you directly set entires, you might not want us to spend the time writing those zeros.<br>
> >><br>
> >> I have another quick question about the array x passed to FormFunctionLocal. If I want to know the which x is evaluated, how can I output x in a vector format? Currently, I created a global vector vecx and a local vector vecx_local, get the array of vecx_local_array, copy the x to vecx_local_array,  scatter to global vecx and output vecx. Is there a quick way to restore the array x to a vector and output?<br>

> >><br>
> >> I cannot think of a better way than that.<br>
> >><br>
> >>    Matt<br>
> >><br>
> >> Thank you.<br>
> >><br>
> >> Best,<br>
> >> Xiangdong<br>
> >><br>
> >><br>
> >><br>
> >> On Mon, Apr 28, 2014 at 10:28 PM, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>> wrote:<br>
> >><br>
> >> On Apr 28, 2014, at 3:23 PM, Xiangdong <<a href="mailto:epscodes@gmail.com">epscodes@gmail.com</a>> wrote:<br>
> >><br>
> >> > Hello everyone,<br>
> >> ><br>
> >> > When I run snes program,<br>
> >><br>
> >>                ^^^^ what SNES program”?<br>
> >><br>
> >> > it outputs "SNES Function norm 1.23456789e+10". It seems that this norm is different from residue norm (even if solving F(x)=0)<br>
> >><br>
> >>    Please send the full output where you see this.<br>
> >><br>
> >> > and also differ from norm of the Jacobian. What is the definition of this "SNES Function Norm”?<br>
> >><br>
> >>    The SNES Function Norm as printed by PETSc is suppose to the 2-norm of F(x) - b (where b is usually zero) and this is also the same thing as the “residue norm”<br>
> >><br>
> >>    Barry<br>
> >><br>
> >> ><br>
> >> > Thank you.<br>
> >> ><br>
> >> > Best,<br>
> >> > Xiangdong<br>
> >><br>
> >><br>
> >><br>
> >><br>
> >><br>
> >> --<br>
> >> 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<br>
> >><br>
> ><br>
> ><br>
><br>
><br>
<br>
</div></div></blockquote></div><br></div>