[petsc-users] questions about the SNES Function Norm
Xiangdong
epscodes at gmail.com
Thu May 1 14:43:09 CDT 2014
Here is the order of functions I called:
DMDACreate3d();
SNESCreate();
SNESSetDM(); (DM with dof=2);
DMSetApplicationContext();
DMDASNESSetFunctionLocal();
SNESVISetVariableBounds();
DMDASNESetJacobianLocal();
SNESSetFromOptions();
SNESSolve();
SNESGetKSP();
KSPGetSolution();
KSPGetRhs();
KSPGetOperators(); //get operator kspA, kspx, kspb;
SNESGetFunctionNorm(); ==> get norm fnorma;
SNESGetFunction(); VecNorm(); ==> get norm fnormb;
SNESComputeFunction(); VecNorm(); ==> function evaluation fx at the
solution x and get norm fnormc;
Inside the FormJacobianLocal(), I output the matrix jac and preB;
I found that fnorma matches the default SNES monitor output "SNES Function
norm", but fnormb=fnormc != fnorma. The solution x, the residue fx obtained
by snescomputefunction, mat jac and preB are length 50 or 50-by-50, while
the kspA, kspx, kspb are 25-by-25 or length 25.
I checked that kspA=jac(1:2:end,1:2:end) and x(1:2:end)= kspA\kspb;
x(2:2:end)=0; It seems that it completely ignores the second degree of
freedom (setting it to zero). I saw this for (close to) constant initial
guess, while for heterogeneous initial guess, it works fine and the matrix
and vector size are correct, and the solution is correct. So this
eliminating row behavior seems to be initial guess dependent.
I saw this even if I use snes_fd, so we can rule out the possibility of
wrong Jacobian. For the FormFunctionLocal(), I checked via
SNESComputeFunction and it output the correct vector of residue.
Are the orders of function calls correct?
Thank you.
Xiangdong
On Thu, May 1, 2014 at 1:58 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:
>
> On May 1, 2014, at 10:32 AM, Xiangdong <epscodes at gmail.com> wrote:
>
> > Under what condition, SNESGetFunctionNorm() will output different
> results from SENEGetFunction + VecNorm (with NORM_2)?
> >
> > 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.
>
> Please send more details on your “trivial” case where the values are
> different. It could be that we are not setting the function norm properly
> on early exit from the solvers.
> >
> > 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.
>
> Hmm, we never squeeze out rows/columns from the Jacobian. The size of
> the Jacobian set with SNESSetJacobian() should always match that obtained
> with KSPGetOperators() on the linear system. Please send more details on
> how you get this. Are you calling the KSPGetOperators() inside a
> preconditioner where the the preconditioner has chopped up the operator?
>
> Barry
>
> >
> > Thank you.
> >
> > Xiangdong
> >
> >
> >
> >
> >
> >
> > On Tue, Apr 29, 2014 at 3:12 PM, Matthew Knepley <knepley at gmail.com>
> wrote:
> > On Tue, Apr 29, 2014 at 2:09 PM, Xiangdong <epscodes at gmail.com> wrote:
> > 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.
> >
> > Just curious, why does not petsc initialize the array f to zero by
> default inside petsc when passing the f array to FormFunctionLocal?
> >
> > If you directly set entires, you might not want us to spend the time
> writing those zeros.
> >
> > 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?
> >
> > I cannot think of a better way than that.
> >
> > Matt
> >
> > Thank you.
> >
> > Best,
> > Xiangdong
> >
> >
> >
> > On Mon, Apr 28, 2014 at 10:28 PM, Barry Smith <bsmith at mcs.anl.gov>
> wrote:
> >
> > On Apr 28, 2014, at 3:23 PM, Xiangdong <epscodes at gmail.com> wrote:
> >
> > > Hello everyone,
> > >
> > > When I run snes program,
> >
> > ^^^^ what SNES program”?
> >
> > > it outputs "SNES Function norm 1.23456789e+10". It seems that this
> norm is different from residue norm (even if solving F(x)=0)
> >
> > Please send the full output where you see this.
> >
> > > and also differ from norm of the Jacobian. What is the definition of
> this "SNES Function Norm”?
> >
> > 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”
> >
> > Barry
> >
> > >
> > > Thank you.
> > >
> > > Best,
> > > Xiangdong
> >
> >
> >
> >
> >
> > --
> > What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which their
> experiments lead.
> > -- Norbert Wiener
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20140501/712c97b5/attachment.html>
More information about the petsc-users
mailing list