[petsc-users] SNESQN number of past states
Smith, Barry F.
bsmith at mcs.anl.gov
Wed Feb 14 22:28:35 CST 2018
I stuck the line
PetscOptionsSetValue(NULL,"-snes_qn_m", "50");
in src/snes/examples/tutorials/ex19.c
and called it with
-da_refine 2 -snes_monitor -snes_type qn -snes_view
and the results showed
Stored subspace size: 50
so I am afraid it is something unique to exactly your code that is causing it to be not used. If you can send us a complete code that reproduces the problem we can track it down and fix it but without a reproducing code we can't do anything to resolve the problem.
Barry
> On Feb 14, 2018, at 9:15 PM, Bikash Kanungo <bikash at umich.edu> wrote:
>
> Thanks Barry and Matthew.
>
> @Barry: I'm following the same procedure as you've mentioned - PetscOptionsSetValue() precede SNESSetFromOptions. Here's the snippet for my code:
>
> -----------------------------------------------------------------------------------------------------------
>
> error = SNESCreate(PETSC_COMM_WORLD,&snes);
> checkPETScError(error,
> "SNESCreate failed.");
>
> error = SNESSetType(snes, SNESQN);
> checkPETScError(error,
> "SNESSetType failed.");
>
> error = SNESQNSetType(snes, SNES_QN_LBFGS);
> checkPETScError(error,
> "SNESQNSetType failed.");
>
> error = SNESQNSetScaleType(snes, SNES_QN_SCALE_SHANNO);
> checkPETScError(error,
> "SNESQNSetScaleType failed.");
>
> error = SNESQNSetRestartType(snes, SNES_QN_RESTART_PERIODIC);
> checkPETScError(error,
> "SNESQNSetRestartType failed.");
>
> error = PetscOptionsSetValue("-snes_qn_m","500");
> checkPETScError(error,
> "PETScOptionsSetValue failed.");
>
> SNESLineSearch linesearch;
> error = SNESGetLineSearch(snes,&linesearch);
> checkPETScError(error,
> "SNESGetLineSearch failed.");
>
> error = SNESLineSearchSetType(linesearch,SNESLINESEARCHCP);
> checkPETScError(error,
> "SNESLineSearchSetType failed.");
>
> error = PetscOptionsSetValue("-snes_linesearch_max_it", "1");
> checkPETScError(error,
> "PetscOptionsSetValue failed.");
>
> error = SNESLineSearchView(linesearch, PETSC_VIEWER_STDOUT_WORLD);
> checkPETScError(error,
> "SNESLineSearchView failed.");
>
> error =SNESLineSearchSetMonitor(linesearch,
> PETSC_TRUE);
> checkPETScError(error,
> "SNESLineSearchSet Monitor failed.");
>
> error = SNESLineSearchSetFromOptions(linesearch);
> checkPETScError(error,
> "SNESLineSearchSetFromOptions failed.");
>
> SNESLineSearchReason lineSearchReason;
> error = SNESLineSearchGetReason(linesearch, &lineSearchReason);
> checkPETScError(error,
> "SNESLineSearchGetReason failed.");
>
> error = SNESSetFunction(snes,r,FormFunction,&petscData);
> checkPETScError(error,
> "SNESSetFunction failed.");
>
> //
> // Customize KSP
> //
> error = SNESGetKSP(snes,&ksp);
> checkPETScError(error,
> "SNESGetKSP failed.");
>
> error = KSPSetType(ksp,KSPGMRES);
> checkPETScError(error,
> "KSPSetType failed.");
>
> error = KSPGMRESSetRestart(ksp,300);
> checkPETScError(error,
> "KSPGMRESSetRestart failed.");
>
> error = KSPSetInitialGuessNonzero(ksp,PETSC_TRUE);
> checkPETScError(error,
> "KSPSetInitialGuessNonzero failed.");
>
> error = KSPGetPC(ksp,&pc);
> checkPETScError(error,
> "KSPGetPC failed.");
>
> error = PCSetType(pc,PCJACOBI);
> checkPETScError(error,
> "PCSetType failed.");
>
> error = PCSetReusePreconditioner(pc,PETSC_TRUE);
> checkPETScError(error,
> "PCSetReusePreconditioner failed.");
>
> error = KSPSetTolerances(ksp,
> PETSC_DEFAULT,
> 1e-15,
> 1e7,
> 10000);
> checkPETScError(error,
> "KSPSetTolerances failed.");
>
> error = KSPSetFromOptions(ksp);
> checkPETScError(error,
> "Call to KSPSetFromOptions() failed.");
>
> //
> //get reason for non-convergence
> //
> KSPConvergedReason kspReason;
> error = KSPGetConvergedReason(ksp, &kspReason);
> checkPETScError(error,
> "Call to KSPGetConvergedReason() failed.");
>
> if(kspReason < 0)
> {
> if(debugLevel != 0)
> std::cout<<"Other kind of divergence in SNES-KSP : "<< kspReason <<std::endl;
>
> }
>
> PetscInt lag = 1;
> error = SNESSetLagPreconditioner(snes,
> lag);
> checkPETScError(error,
> "Call to SNESSetLagPreconditioner() failed.");
>
> PetscInt maxFails = 2;
> error = SNESSetMaxLinearSolveFailures(snes,maxFails);
> checkPETScError(error,
> "Call to SNESSetMaxLinearSolveFailures() failed.");
>
> PetscReal abstol = 1e-13; // absolute convergence tolerance
> PetscInt maxit = 100000;
> error = SNESSetTolerances(snes,
> abstol,
> PETSC_DEFAULT,
> PETSC_DEFAULT,
> maxit,
> maxit);
> checkPETScError(error,
> "SNESSetTolerances failed.");
>
> error = SNESView(snes,
> PETSC_VIEWER_STDOUT_WORLD);
> checkPETScError(error,
> "Call to SNESView() failed.");
>
> error = SNESMonitorSet(snes,SNESMonitorDefault,PETSC_NULL,PETSC_NULL);
> checkPETScError(error,
> "Call to SNESMonitorSet() failed.");
>
> error = SNESSetFromOptions(snes);
> checkPETScError(error,
> "Call to SNESSetFromOptions() failed.");
>
>
> //
> // Solve the system
> //
> error = SNESSolve(snes,PETSC_NULL,x);
> checkPETScError(error,
> "Call to SNESSolve() failed.");
>
> SNESConvergedReason reason;
> error = SNESGetConvergedReason(snes,&reason);
> checkPETScError(error,
> "Call to SNESGetConvergedReason() failed.");
>
> ------------------------------------------------------------------------------------------------------------------------------------
>
> Also, I didn't find any SNESQN examples in my snes/examples folder (using petsc-3.6.3).
> Moreover, the Powell descent condition seems to be only declared and then assigned a value through the PetscOptionsReal call. Beyond that I didn't find any other mention of it. I was grepping for powell_downhill variable. (Note: powell_downhill features in 3.6.3 and not in 3.7 version).
>
> Thanks,
> Bikash
>
>
> On Wed, Feb 14, 2018 at 7:02 PM, Matthew Knepley <knepley at gmail.com> wrote:
> On Wed, Feb 14, 2018 at 6:43 PM, Smith, Barry F. <bsmith at mcs.anl.gov> wrote:
>
> Hmm,
>
> 1) make sure you call PetscOptionsSetValue() before you call to SNESSetFromOptions()
>
> 2) make sure you call SNESSetFromOptions()
>
> 3) did you add a prefix to the SNES object? If so make sure you include it in the PetscOptionsSetValue() call.
>
> I can't see a reason why it won't work. Does it work with the PETSc examples for you or not?
>
> Regarding the Powell descent option, I'm afraid you'll need to examine the code for exact details. src/snes/impls/qn/qn.c
>
> Here is the description
>
> https://bitbucket.org/petsc/petsc/src/939b553f045c5ba32242d0d49e80e4934ed3bf76/src/snes/impls/qn/qn.c?at=master&fileviewer=file-view-default#qn.c-451
>
> Thanks,
>
> Matt
>
>
> Barry
>
>
> > On Feb 14, 2018, at 5:25 PM, Bikash Kanungo <bikash at umich.edu> wrote:
> >
> > Hi,
> >
> > I'm using the L-BFGS QN solver. In order to set the number of past states (also the restart size if I use Periodic restart), to say 50, I'm using PetscOptionsSetValue("-snes_qn_m", "50"). However while running, it still shows "Stored subspace size: 10", i.e., the default value of 10 is not overwritten.
> >
> > Additionally, I would like to know more about the the -snes_qn_powell_descent option. For Powell restart, one uses a gamma parameter which I believe is defined by the -snes_qn_powell_gamma option. What exactly does the descent condition do? It would be useful if there are good references to it.
> >
> > Thanks,
> > Biksah
> >
> > --
> > Bikash S. Kanungo
> > PhD Student
> > Computational Materials Physics Group
> > Mechanical Engineering
> > University of Michigan
> >
>
>
>
>
> --
> 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
>
> https://www.cse.buffalo.edu/~knepley/
>
>
>
> --
> Bikash S. Kanungo
> PhD Student
> Computational Materials Physics Group
> Mechanical Engineering
> University of Michigan
More information about the petsc-users
mailing list