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