[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: SNES problem



Dear Matt,

You were right. I'd made some modifications as you suggested and now the program is working.

Thanks

G'day

Joao Flavio Vieira de Vasconcellos
School of Engineering
James Cook University

Phone:  +61 7 4781 4340
Fax:    +61 7 4775 1184
Email:  jflavio@xxxxxxxxxxxx
        joaoflavio.vasconcellos@xxxxxxxxxx
skype:  jflavio_vasconcellos
msn:    jf_vasconcellos@xxxxxxxxxxx


---- Original message ----
>Date: Wed, 3 Oct 2007 16:52:36 -0500
>From: "Matthew Knepley" <knepley@xxxxxxxxx>  
>Subject: Re: SNES problem  
>To: petsc-users@users@users@users@mcs.anl.gov
>Cc:"JoaoFlavioVasconcellos".vasconcellos@xxxxxxxxxxxxxxxxxxxxxxxxxxx@jcu.joaoflavio.vasconcellos@xxxxxxxxxx
>
>On10/3/07,JoaoFlavioVasconcellosjoaoflavio.vasconcellos@xxxxxxxxxxxxxxx
>>DearLisandro
>>
>>FormFunction1iscalledonlyonce.I'mquitesurethatFisanonzerovector.I'dprinteditanditsvaluesare100%rigth.
>>
>>
>>I'vebeenusedsnesfunctionsaswrittenabove:
>>
>> ...
>> ...
>> ....
>>                         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@xxxxxxxxxxxx
>>         joaoflavio.vasconcellos@xxxxxxxxxx
>> skype:  jflavio_vasconcellos
>> msn:    jf_vasconcellos@xxxxxxxxxxx
>>
>>
>> ---- Original message ----
>> >Date: Wed, 3 Oct 2007 12:40:28 -0300
>> >From: "Lisandro Dalcin" <dalcinl@xxxxxxxxx>
>> >Subject: Re: SNES problem
>> >To: petsc-users@users@users@users@mcs.anl.gov
>>>
>>>Flavio,areyoucompletellysureyourFormFunction1()isactually
>>>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@xxxxxxxxxx> 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@xxxxxxxxxxxx
>> >>         joaoflavio.vasconcellos@xxxxxxxxxx
>> >> skype:  jflavio_vasconcellos
>> >> msn:    jf_vasconcellos@xxxxxxxxxxx
>> >>
>> >>
>> >
>> >
>> >--
>> >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
>