[petsc-users] [petsc-maint] Poisson with Neumann BC on a stretched grid

Barry Smith bsmith at petsc.dev
Wed Oct 7 10:59:44 CDT 2020



> On Oct 7, 2020, at 8:11 AM, Mark Adams <mfadams at lbl.gov> wrote:
> 
> 
> On Wed, Oct 7, 2020 at 8:27 AM Victoria Hamtiaux <victoria.hamtiaux at uclouvain.be <mailto:victoria.hamtiaux at uclouvain.be>> wrote:
> Thanks for all the answers,
> 
> 
> 
> How can I do the "semi-coarsening"? I don't really know how those preconditionners work so I don't how how to change them or so..
> 
> 
> 
> You have to write custom code to do semi-coarsening. PETSc does not provide that and you would not want to do it yourself, most likely.

  We do not provide it directly but if you are using PCMG and DMDA it is relatively straight-forward. You create a coarse DM and then refine it but each refinement you only do in the directions you want set each time with DMDASetRefinementFactor(). Once you have the collections of refined DM's you provide them to PCMG.

  Barry

>  
> 
> I have a question because you both seem to say that my matrix is supposed to be symmetric which is not the case. \
> 
> You said "my matrix is symmetric." 
> 
> Then you said " I suspect that by stretching the grid, my matrix is not symmetric anymore and that it might cause a problem."
> 
> We are saying that by stretchin the grid the matrix is still symmetric even if the grid has lost a symmetry. I don't know of a mechanism for stretching the grid to make the matrix asymmetric. So we are suggesting that you verify your suspicion that the matrix is symmetric.
> 
> And in fact, I don't get how it can be symmetric. Because you will have something close to symmetric. For example when you are at the center of your domain it will be symmetric, but when your at a point at the boundaries I don't get how you can be symmetric, you won't have something at the left and the right of your main diagonal... (I       don't know if my explanations are understandable)
> 
> You can make a discretization that is not symmetric because of boundary conditions but I assume that is not the case because you said your matrix is symmetric.
>  
> Best regards, 
> 
> 
> 
> Victoria
> 
> 
> 
> 
> 
> On 7/10/20 14:20, Mark Adams wrote:
>> GMG (geometric MG) is stronger as Matt said, but it is affected by stretched grids in a similar way. A way to fix this in GMG is semi-coarsening, which AMG _can_ do automatically.
>> 
>> On Wed, Oct 7, 2020 at 8:02 AM Matthew Knepley <knepley at gmail.com <mailto:knepley at gmail.com>> wrote:
>> On Wed, Oct 7, 2020 at 7:07 AM Victoria Hamtiaux <victoria.hamtiaux at uclouvain.be <mailto:victoria.hamtiaux at uclouvain.be>> wrote:
>> Hello Matt, 
>> 
>> 
>> 
>> I just checked the symmetry of my matrix and it is not symmetric. But it is not symmetric either when I use a uniform grid.
>> 
>> The domain is 3D and I'm using finite differences, so I guess it is normal that at multiple places (when I deal with points near the boundaries), the matrix is not symmetric.
>> 
>> So I was wrong, the problem doesn't come from the fact that the matrix is not symmetric. I don't know where it comes from, but when I switch from uniform to stretched grid, the solver stops working properly. Could it be from the preconditionner of the solver that I use?
>> 
>> Do you have any other idea ? 
>> 
>> I would consider using GMG. As Mark says, AMG is very fiddly with stretched grids. For Poisson, GMG works great and you seem to have regular grids.
>> 
>>   Thanks,
>> 
>>     Matt 
>> Thanks for your help, 
>> 
>> 
>> 
>> Victoria
>> 
>> 
>> 
>> On 7/10/20 12:48, Matthew Knepley wrote:
>>> On Wed, Oct 7, 2020 at 6:40 AM Victoria Hamtiaux <victoria.hamtiaux at uclouvain.be <mailto:victoria.hamtiaux at uclouvain.be>> wrote:
>>> Dear all,
>>> 
>>> 
>>> After the discretization of a poisson equation with purely Neumann (or 
>>> periodic) boundary conditions, I get a matrix which is singular.
>>> 
>>> 
>>> The way I am handling this is by using a NullSpace with the following 
>>> code :
>>> 
>>> MatNullSpace nullspace;
>>> MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, 0, &nullspace);
>>> MatSetNullSpace(p_solverp->A, nullspace);
>>> MatSetTransposeNullSpace(p_solverp->A, nullspace);
>>> MatNullSpaceDestroy(&nullspace);
>>> 
>>> 
>>> Note that I am using the hypre preconditionner BOOMERANG and the default 
>>> solver GMRES.
>>> 
>>> 
>>>      KSPCreate(PETSC_COMM_WORLD,&p_solverp->ksp);
>>>      KSPSetOperators(p_solverp->ksp, p_solverp->A, p_solverp->A);
>>>      PC prec;
>>>      KSPGetPC(p_solverp->ksp, &prec);
>>>      PCSetType(prec,PCHYPRE);//PCHYPRE seems the best
>>>      PCHYPRESetType(prec,"boomeramg"); //boomeramg is the best
>>>      KSPSetInitialGuessNonzero(p_solverp->ksp,PETSC_TRUE);
>>>      KSPSetFromOptions(p_solverp->ksp);
>>>      KSPSetTolerances(p_solverp->ksp, 1.e-10, 1e-10, PETSC_DEFAULT, 
>>> PETSC_DEFAULT);
>>>      KSPSetReusePreconditioner(p_solverp->ksp,PETSC_TRUE);
>>>      KSPSetUseFischerGuess(p_solverp->ksp,1,5);
>>>      KSPGMRESSetPreAllocateVectors(p_solverp->ksp);
>>>      KSPSetUp(p_solverp->ksp);
>>> 
>>> 
>>> 
>>> And this works fine when my grid is uniform, so that my matrix is 
>>> symmetric.
>>> 
>>> 
>>> But when I stretch the grid near the boundary (my grid is then 
>>> non-uniform), it doesn't work properly anymore. I suspect that by 
>>> stretching the grid, my matrix is not symmetric anymore and that it 
>>> might cause a problem.
>>> 
>>> Symmetry is a property of the operator, so you should be symmetric on your
>>> stretched grid. If not, I think you have the discretization wrong. You can check
>>> symmetry using
>>> 
>>>   https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatIsSymmetric.html <https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.mcs.anl.gov%2Fpetsc%2Fpetsc-current%2Fdocs%2Fmanualpages%2FMat%2FMatIsSymmetric.html&data=02%7C01%7Cvictoria.hamtiaux%40uclouvain.be%7C494a0f05bd214b5974f008d86abb6e02%7C7ab090d4fa2e4ecfbc7c4127b4d582ec%7C0%7C0%7C637376700525925749&sdata=nWt0sejio7o1PzMoc7tPu7JOvcNqofRuMQ91ynW54r4%3D&reserved=0>
>>> 
>>> Also, if you suspect your discretization, you should probably do an MMS test to
>>> verify that you discretization converges at the correct rate.
>>> 
>>>   Thanks,
>>> 
>>>      Matt
>>>  
>>> I tried fixing the solution at an arbitrary point, but sometimes doing 
>>> this, I get errors near that fixed point. I 've seen on the petsc-users 
>>> forum that you usually don't recommend to fix a point, but I don't 
>>> really know how to proceed differently.
>>> 
>>> 
>>> What would you recommend to solve this problem?
>>> 
>>> 
>>> Thanks for your help,
>>> 
>>> 
>>> Best regards,
>>> 
>>> 
>>> Victoria
>>> 
>>> 
>>> 
>>> 
>>> -- 
>>> 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/ <https://eur03.safelinks.protection.outlook.com/?url=http:%2F%2Fwww.cse.buffalo.edu%2F~knepley%2F&data=02%7C01%7Cvictoria.hamtiaux%40uclouvain.be%7C494a0f05bd214b5974f008d86abb6e02%7C7ab090d4fa2e4ecfbc7c4127b4d582ec%7C0%7C0%7C637376700525925749&sdata=LHARUv3BxSwWnxN2LUJnX3vr2ZJ9f50EMQzw44Hy%2FqY%3D&reserved=0>
>> 
>> 
>> -- 
>> 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/ <https://eur03.safelinks.protection.outlook.com/?url=http:%2F%2Fwww.cse.buffalo.edu%2F~knepley%2F&data=02%7C01%7Cvictoria.hamtiaux%40uclouvain.be%7C494a0f05bd214b5974f008d86abb6e02%7C7ab090d4fa2e4ecfbc7c4127b4d582ec%7C0%7C0%7C637376700525935751&sdata=kOKe%2FLj7pvAdzldpTNlRfC7BS6Vv4S5mU6Cb8pPpmrE%3D&reserved=0>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20201007/f13277e5/attachment-0001.html>


More information about the petsc-users mailing list