[petsc-users] Structured Finite Difference Method With Periodic BC Help
Barry Smith
bsmith at mcs.anl.gov
Fri May 6 17:53:59 CDT 2016
> On May 6, 2016, at 5:09 PM, Paul Stephen Urbanczyk <gomer at stanford.edu> wrote:
>
> Hello Barry,
>
> Thank you for responding. I think I'm following you. I set up a little 1-D test problem, and used the built-in DMDASetUniformCoordinates function. Then, by turning on and off the periodic BCs, I see the change in behavior. I think I was making a mistake with the right boundary indexing.
>
> However, this raises another question: shouldn't the coordinates behave differently than other field variables? In other words, shouldn't the periodic ghost points at the left end have coordinates (0-h) and (0-2h), rather than (1-h) and (1-2h)? And, at the right side, shouldn't the x-coordinates be 1 and 1+h?
I don't know. But I believe they should not; periodic boundary conditions can be interpreted as having the domain [0,1) connected at the two ends so there would never be coordinates less than 0 or 1 or larger. Another way, I think, of saying the same thing is that if you take a point x in domain and add some positive distance d then the coordinate of the result is give by fractionalpart(x + d) something similar can be done for subtracting some distance. I remember vaguely there are precise mathematical ways to define this kind of thing but I don't think it matters.
Barry
>
> Apologies for what may be somewhat remedial questions, but I'm somewhat new to PETSc and have not actually programmed a periodic case before.
>
> Thanks for all of your help!
>
> -Paul
>
> ________________________________________
> From: Barry Smith <bsmith at mcs.anl.gov>
> Sent: Tuesday, May 3, 2016 7:26:38 PM
> To: Paul Stephen Urbanczyk
> Cc: petsc-users at mcs.anl.gov
> Subject: Re: [petsc-users] Structured Finite Difference Method With Periodic BC Help
>
>> On May 3, 2016, at 7:38 PM, Paul Urbanczyk <gomer at stanford.edu> wrote:
>>
>> Hello,
>>
>> I'm trying to implement a CFD code using finite differences on a structured mesh with PETSc.
>>
>> I'm having a bit of trouble understanding how to properly use the periodic boundary condition with distributed arrays, and need some clarification.
>>
>> If I set the boundaries in the x-direction to be DM_BOUNDARY_PERIODIC, and set a stencil width of two, there should be two ghost cells in the x-direction at each end of the mesh, which looks like it's happening just fine.
>>
>> However, it seems that the assumption being made by PETSc when filling in these values is that the mesh is a cell-centered finite difference, rather than a vertex-centered finite difference. Is there a way to change this behavior? In other words, I need the first ghost cell on each side to correspond to the opposite side's first interior point, rather than the opposite boundary point.
>
> DMDA doesn't really have a concept of if the values are cell-centered or vertex centered. I think this issue you are facing is only an issue of labeling, not of real substance; in some sense it is up to you to interpret the meaning of the values. In your case with vertex centered values here is how I see it in a picture. Consider a domain from [0,1) periodic with n grid points in the global vector
>
> x = 0 1-2h 1-h 1
> i = 0 1 2 n-1
>
> So you divide the domain into n sections and label the vertices (left end of the sections) starting with zero, note that the last section has no right hand side index because the value at x=1 is the same as the value at x=0 now if you have two processors and a stencil width of two the local domains look like
>
> x = 1-2h 1-h 0
> i = n-2 n-1 0 1 2 ....
>
>
> x = 1-2h 1-h 1=0* 1+h
> i = n-2 n-1 0 1
>
> This is what the DMDA will deliver in the local vector after a DMGlobalToLocalBegin/End
>
> In periodic coordinates the location x=1 is the same as the location x=0
>>
>> If there is not a way to change this behavior, then I need to set my own ghost cells; however, I'm having trouble implementing this...
>>
>> If I change the boundaries to DM_BOUNDARY_GHOSTED, with a stencil width of two, I have the necessary ghost cells at either end of the mesh. I then try to do the following:
>>
>> 1) Scatter the global vector to local vectors on each rank
>>
>> 2) Get a local array referencing the local vectors
>>
>> 3) Calculate ghost values and fill them in the appropriate local arrays
>>
>> 4) Restore the local vectors from the arrays
>>
>> 5) Scatter the local vector info back to the global vector
>>
>> However, if I then re-scatter and look at the local vectors, the ghost cell values are zero. It seems as though the ghost values are lost when scattered back to the global vector.
>
> This is nuts; in theory the basic DMDA does what one needs to handle periodic boundary conditions. No need to try to implement it yourself.
>
> Of course we could always have bugs so if you have a problem with my reasoning send a simple 1d code that demonstrates the issue.
>
> Barry
>
>>
>> What am I doing wrong here?
>>
>> Thanks for your help!
>>
>> -Paul
>>
>>
>
>
More information about the petsc-users
mailing list