From: Andrea H. <and...@gm...> - 2010-02-24 15:59:23
|
Hello- I am running a nonlinear time-dependent simulation and am currently attempting to implement the generalized alpha time stepping algorithm. As default I use PETSc for my linear solves and updates, but this method requires I write my own newton update. I had been setting those options outside of the time loop, but found out that the PetscNonlinearSolver was getting cleared after every time step so moving that into the time loop solved that problem. However, I'm now seeing some very peculiar behavior... The first time step things go fine. The second time step, things also seem to go fine, however the newton solver actually ends up converging back to the same solution it started with so that the third time step starts with the same values as the second. I have actually gone into the newton solver and seen that the first newton steps leave the initial values but converge back. While this issue could be many things, I have double checked (at length) with people familiar with this algorithm that I'm at least attempting to implement the correct thing. Is there something else I should be concerned about getting reset every time step? Because when I run it for only one time step and then restart and repeat, I do not see this behavior. Thanks! Andrea |
From: Jed B. <je...@59...> - 2010-02-24 16:05:39
|
On Wed, 24 Feb 2010 09:59:14 -0600, Andrea Hawkins <and...@gm...> wrote: > Is there something else I should be concerned about getting reset > every time step? Does anything change if you run with -ksp_view (this will dump solver details at the end of each solve). If you are using Newton-like algorithms, there is significant benefit to using SNES (through libmesh's wrapper if you like) since this will give you significant algorithmic flexibility and robustness improvements over rolling your own Newton. Jed |
From: Andrea H. <and...@gm...> - 2010-02-24 16:15:33
|
I am using the SNES, I just utilized the SNESLineSearchSet to set my own update. So, if I do a diff between the output after the final newton step in the zero-th time step with the the output after the first newton step of the 1st time step I get broglie $ diff step0 step1 19c19 < total: nonzeros=32153, allocated nonzeros=33489 --- > total: nonzeros=32153, allocated nonzeros=40509 24c24 < total: nonzeros=32153, allocated nonzeros=38169 --- > total: nonzeros=32153, allocated nonzeros=40509 27d26 < This wouldn't be causing the behavior would it? Thanks, Andrea On Wed, Feb 24, 2010 at 10:08 AM, Jed Brown <je...@59...> wrote: > On Wed, 24 Feb 2010 09:59:14 -0600, Andrea Hawkins <and...@gm...> wrote: >> Is there something else I should be concerned about getting reset >> every time step? > > Does anything change if you run with -ksp_view (this will dump solver > details at the end of each solve). If you are using Newton-like > algorithms, there is significant benefit to using SNES (through > libmesh's wrapper if you like) since this will give you significant > algorithmic flexibility and robustness improvements over rolling your > own Newton. > > Jed > |
From: Jed B. <je...@59...> - 2010-02-24 18:13:13
|
On Wed, 24 Feb 2010 10:15:21 -0600, Andrea Hawkins <and...@gm...> wrote: > I am using the SNES, I just utilized the SNESLineSearchSet to set my own update. Okay, is this better than the standard one for your problem? > So, if I do a diff between the output after the final newton step in > the zero-th time step with the the output after the first newton step > of the 1st time step I get > > broglie $ diff step0 step1 > 19c19 > < total: nonzeros=32153, allocated nonzeros=33489 > --- > > total: nonzeros=32153, allocated nonzeros=40509 > 24c24 > < total: nonzeros=32153, allocated nonzeros=38169 > --- > > total: nonzeros=32153, allocated nonzeros=40509 > 27d26 > < This is odd. Do you intend for the sparsity pattern of the matrix to change? If it really shouldn't change, then try setting MAT_NEW_NONZERO_ALLOCATION_ERR and see what triggers the error. > That wouldn't explain it working after restarts though, would it? > Because with a restart, I'm seeding the initial condition with the > previous solution. So, the linear solver should be using this as an > initial guess, correct? Do you mean that you're calling SNESSolve with the current solution in X? That just specifies the first Newton iterate, the Krylov solve will still start with a zero initial guess. (As a general rule with Newton, if you know a better initial guess than 0 for the linear solve, then you should have evaluated the function there.) PETSc solvers should be completely configured before the first XXXSolve. Modification after this should only be done if your code is taking active control (i.e. checking how convergence is proceeding and changing tolerances/preconditioners/etc in some problem-specific way). Maybe if you describe all the ways you modify the SNES/KSP/PC after the first call to SNESSolve, I can guess what is going on. Jed |