Barry, I finally got a chance to really try using the grid sequencing within my code. I find that, in some cases, even if it can solve successfully on the coarsest mesh, the SNES fails, usually due to a line search failure, when it tries to compute along the grid sequence. Would you have any suggestions?
-gideon > On Aug 28, 2015, at 4:21 PM, Barry Smith <[email protected]> wrote: > > >> On Aug 28, 2015, at 3:04 PM, Gideon Simpson <[email protected]> wrote: >> >> Yes, if i continue in this parameter on the coarse mesh, I can generally >> solve at all values. I do find that I need to do some amount of continuation >> to solve near the endpoint. The problem is that on the coarse mesh, things >> are not fully resolved at all the values along the continuation parameter, >> and I would like to do refinement. >> >> One subtlety is that I actually want the intermediate continuation solutions >> too. Currently, without doing any grid sequence, I compute each, write it >> to disk, and then go on to the next one. So I now need to go back an refine >> them. I was thinking that perhaps I could refine them on the fly, dump them >> to disk, and use the coarse solution as the starting guess at the next >> iteration, but that would seem to require resetting the snes back to the >> coarse grid. >> >> The alternative would be to just script the mesh refinement in a post >> processing stage, where each value of the continuation is parameter is >> loaded on the coarse mesh, and refined. Perhaps that’s the most practical >> thing to do. > > I would do the following. Create your DM and create a SNES that will do the > continuation > > loop over continuation parameter > > SNESSolve(snes,NULL,Ucoarse); > > if (you decide you want to see the refined solution at this > continuation point) { > SNESCreate(comm,&snesrefine); > SNESSetDM() > etc > SNESSetGridSequence(snesrefine,) > SNESSolve(snesrefine,0,Ucoarse); > SNESGetSolution(snesrefine,&Ufine); > VecView(Ufine or do whatever you want to do with the Ufine at > that continuation point > SNESDestroy(snesrefine); > end if > > end loop over continuation parameter. > > Barry > >> >> -gideon >> >>> On Aug 28, 2015, at 3:55 PM, Barry Smith <[email protected]> wrote: >>> >>>> >>>> >>>> 3. This problem is actually part of a continuation problem that roughly >>>> looks like this >>>> >>>> for( continuation parameter p = 0 to 1){ >>>> >>>> solve with parameter p_i using solution from p_{i-1}, >>>> } >>>> >>>> What I would like to do is to start the solver, for each value of >>>> parameter p_i on the coarse mesh, and then do grid sequencing on that. >>>> But it appears that after doing grid sequencing on the initial p_0 = 0, >>>> the SNES is set to use the finer mesh. >>> >>> So you are using continuation to give you a good enough initial guess on >>> the coarse level to even get convergence on the coarse level? First I would >>> check if you even need the continuation (or can you not even solve the >>> coarse problem without it). >>> >>> If you do need the continuation then you will need to tweak how you do the >>> grid sequencing. I think this will work: >>> >>> Do not use -snes_grid_sequencing >>> >>> Run SNESSolve() as many times as you want with your continuation parameter. >>> This will all happen on the coarse mesh. >>> >>> Call SNESSetGridSequence() >>> >>> Then call SNESSolve() again and it will do one solve on the coarse level >>> and then interpolate to the next level etc. >> >
