> On Aug 28, 2015, at 4:35 PM, Gideon Simpson <[email protected]> wrote: > > Hi Barry, > > Ok, I tried that and it works as intended, but there’s something I noticed. > If i use that, and do a SNESGetConvergedReason on the snesrefine, it always > seems to return 0. Is there a reason for that?
Should never do that; are you sure that SNESSolve() has actually been called on it. What does -snes_monitor and -snes_converged_reason show. Barry > > -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. >
