[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Gradient at ghost cells only?




On Sun, 5 Mar 2006, billy@dem.uminho.pt wrote:

Firstly, I would like to congratulate the PETSc team for such a great code!

I send you an image of my case (all indices are global). Ghost cells are in
yellow and white cells are the interior cells. To calculate the gradient at a
cell, I use the gauss theorem so I need all neighbor cells for that. The
interior points are easy I can calculate them each time in each processor since
I have a ghost cell layer. My problem is the gradient in ghost cells because I
need the values at pink cells but they belong to another process. I guess I
could include these pink cells also as ghost cells and then I would have access
to their values.
This is the way we handle things in PETSc-Fun3d; If you need to calculate new gradients each time then just use double wide ghost points for all your vectors. If you only need to calculate them less often you can create a seperate
VecScatter to get the double-wide ghosts just when you need to.

If the gradient is linear in the cell values you can compute "your part of it",
store in a regular ghosted vector move to the other side and then add "its" part
of the gradient. Tricker but avoids the two levels of communication.

Barry



Or I could calculate the gradient and exchange it through
processes using VecCreateGhost().

For now I have the code working because I only use these cell-centered gradients
for non-orthogonal corrections. So, if the grid orthogonal this term is zero.






Quoting Barry Smith <bsmith@mcs.anl.gov>:


On Sat, 4 Mar 2006, billy@dem.uminho.pt wrote:

Hi,

I need the gradient of 5 scalars at ghost cells and I was thinking of
creating
5x3 vectors with VecCreateGhost(). Right now, I calculate the gradient
during
each iteration and I don't store it's value.
I would like to calculate, store and exchange the gradient at the ghost
cells
only, to minimize memory requirements. How is the best way to do that?
^^^^^^^
    Do you not need the gradient values for the interior points? Or are you

willing to recompute the gradients for the interior points? Why different?

    If the gradient is the same each time why not just calculate it the
first
time and store it for later? Don't make live complicated by using
VecCreateGhost(), just compute them and store them in some array.

    Barry


Billy.