SNES problem

Matthew Knepley knepley at gmail.com
Wed Oct 3 16:52:36 CDT 2007


On 10/3/07, JoaoFlavio Vasconcellos <joaoflavio.vasconcellos at jcu.edu.au> wrote:
> Dear Lisandro
>
> FormFunction1 is called only once. I'm quite sure that F is  a non zero vector. I'd printed it and its values are 100% rigth.
>
>
> I've been used snes functions as written above:
>
> ...
> ...
> ....
>                         ierr = SNESCreate(PETSC_COMM_WORLD, &snes);CHKERRQ(ierr);
>                         ierr = SNESSetFunction(snes, resid, FormFunction1, this);CHKERRQ(ierr);
> ....
> ....                        // Calculating c_ctx.A
> ....
>
>                         ierr = FormJacobian1(snes, resid, &c_ctx.A, &c_ctx.A, &mat_str, this); CHKERRQ(ierr);
>                         ierr = SNESSetJacobian(snes, c_ctx.A, c_ctx.A, FormJacobian1, this); CHKERRQ(ierr);
>                         ierr = SNESSetFromOptions(snes);CHKERRQ(ierr);
>                          cout << "Calling SNESSolve" << endl;
>                          PetscScalar zero = 0;
>                          ierr = VecSet(C, zero);CHKERRQ(ierr);
>                         ierr = SNESSolve(snes,PETSC_NULL, C);CHKERRQ(ierr);
>                         ierr = SNESGetIterationNumber(snes, &its);CHKERRQ(ierr);
>                          ierr = SNESGetSolutionUpdate(snes, &C);CHKERRQ(ierr);
>                          VecView (C, 0);
>
>
> ...
> ...
> ...
>
>     All outputs of VevView in FormFunction1 are ok. The output of VecView (C, 0); after call SNESSolve is an unexpected zero vector.

It is hard to tell without seeing your code. However, there is
something suspicious
in your evaluation routine. You pass &F to CaculateResidual(). The 'Vec' type is
just a pointer, which is passed to FormFunction() by value. You are supposed to
use that Vec. If your routine changed the pointer, then FormFunction() would see
the changed F and print a nonzero norm, but the calling routine would still have
the original Vec which would be unchanged.

   Matt

>     Thanks
>
> JF
>
> Joao Flavio Vieira de Vasconcellos
> School of Engineering
> James Cook University
>
> Phone:  +61 7 4781 4340
> Fax:    +61 7 4775 1184
> Email:  jflavio at iprj.uerj.br
>         joaoflavio.vasconcellos at jcu.edu.au
> skype:  jflavio_vasconcellos
> msn:    jf_vasconcellos at hotmail.com
>
>
> ---- Original message ----
> >Date: Wed, 3 Oct 2007 12:40:28 -0300
> >From: "Lisandro Dalcin" <dalcinl at gmail.com>
> >Subject: Re: SNES problem
> >To: petsc-users at mcs.anl.gov
> >
> >Flavio, are you completelly sure your FormFunction1() is actually
> >being called? I can see the SNES monitor at iter 0, but I did not see
> >in the the outputs of VecView() or your 'cout << "Residual " << endl'.
> >Did you called SNESSetFunction() to set your FormFunction1()??
> >
> >On 10/3/07, JoaoFlavio Vasconcellos <joaoflavio.vasconcellos at jcu.edu.au> wrote:
> >> Hello
> >>
> >> I'm trying to use SNES to solve a problem. I wrote the code above to evaluate the residual of the linear system. In this routine norm_2 of F is different from zero but outside of this routine norm_2 of F is zero.
> >>
> >> #undef __FUNCT__
> >> #define __FUNCT__ "FormFunction1"
> >> PetscErrorCode FormFunction1(SNES snes, Vec X, Vec F, void *_simulator) {
> >> Simulator   *simulator = (Simulator*) _simulator;
> >> PetscErrorCode ierr;
> >>
> >>         VecView (X, 0);
> >>         ierr = simulator->CalculateMatrixCoefficient(X); CHKERRQ(ierr);
> >>         ierr = simulator->CalculateSourceTerm(X); CHKERRQ(ierr);
> >>         ierr = simulator->CalculateResidual (X, &F); CHKERRQ(ierr);
> >>
> >>         cout << "Residual " << endl;
> >>         VecView (F, 0);  // norm_2 of F is != zero
> >>         return 0;
> >>
> >> }
> >>
> >> // End of routine
> >>
> >>
> >>
> >>
> >> Messages from  -snes_view:
> >>
> >>  0 SNES Function norm 0.000000000000e+00
> >> SNES Object:
> >>   type: ls
> >>     line search variant: SNESLineSearchCubic
> >>     alpha=0.0001, maxstep=1e+08, steptol=1e-12
> >>   maximum iterations=50, maximum function evaluations=10000
> >>   tolerances: relative=1e-08, absolute=1e-50, solution=1e-08
> >>   total number of linear solver iterations=0
> >>   total number of function evaluations=1
> >>   KSP Object:
> >>     type: gmres
> >>       GMRES: restart=30, using Classical (unmodified) Gram-Schmidt Orthogonalization with no iterative refinement
> >>       GMRES: happy breakdown tolerance 1e-30
> >>     maximum iterations=10000, initial guess is zero
> >>     tolerances:  relative=1e-05, absolute=1e-50, divergence=10000
> >>     left preconditioning
> >>   PC Object:
> >>     type: ilu
> >>       ILU: 0 levels of fill
> >>       ILU: factor fill ratio allocated 1
> >>       ILU: tolerance for zero pivot 1e-12
> >>            out-of-place factorization
> >>            matrix ordering: natural
> >>
> >> // end of message
> >>
> >> I dont know why  "SNES Function norm 0.000000000000e+00" if
> >> F's norm_2 inside my routine is not.  Has anyone that could sugest how to fix this problem ?
> >>
> >>
> >> Thank you in advance.
> >>
> >>
> >> Joao Flavio Vieira de Vasconcellos
> >> School of Engineering
> >> James Cook University
> >>
> >> Phone:  +61 7 4781 4340
> >> Fax:    +61 7 4775 1184
> >> Email:  jflavio at iprj.uerj.br
> >>         joaoflavio.vasconcellos at jcu.edu.au
> >> skype:  jflavio_vasconcellos
> >> msn:    jf_vasconcellos at hotmail.com
> >>
> >>
> >
> >
> >--
> >Lisandro Dalcín
> >---------------
> >Centro Internacional de Métodos Computacionales en Ingeniería (CIMEC)
> >Instituto de Desarrollo Tecnológico para la Industria Química (INTEC)
> >Consejo Nacional de Investigaciones Científicas y Técnicas (CONICET)
> >PTLC - Güemes 3450, (3000) Santa Fe, Argentina
> >Tel/Fax: +54-(0)342-451.1594
> >
>
>


-- 
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




More information about the petsc-users mailing list