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 <knep...@gmail.com> wrote:

> On Wed, Feb 14, 2018 at 6:43 PM, Smith, Barry F. <bsm...@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/939b553f045c5ba32242d0d49e80e4
> 934ed3bf76/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 <bik...@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/ <http://www.caam.rice.edu/~mk51/>
>



-- 
Bikash S. Kanungo
PhD Student
Computational Materials Physics Group
Mechanical Engineering
University of Michigan

Reply via email to