CFD Online Discussion Forums

CFD Online Discussion Forums (
-   OpenFOAM Running, Solving & CFD (
-   -   Find all adjacent cells (

gwierink March 27, 2011 04:47

Find all adjacent cells
Dear all,

I would like to do calculations for a certain cell that involves all adjacent cells. I know that with cellCells one can find the up, down, left, and right neighbours. Now, in an orthogonal 2D mesh, does anyone know of a smart way to access also the "diagonal" adjacent cells, i.e. northwest, northeast, southeast, and southwest neighbours? Thanks in advance!

ata March 30, 2011 09:26

Find all adjacent cells
I think you can use the adjacents of the adjacents. What do you think?

gwierink March 31, 2011 03:27

Hi Ata,

Thanks for your reply. If I use the adjacents of the adjacents, then I get the "west-west", "east-east", etc neighbours. I need the north-west, south-west, etc neighbours ...

akidess March 31, 2011 03:37

The face numbering is done in a consistent way, and I think you can use that to your advantage. Let's say you found the right (west) neighbor of a cell, the face between them is west_cell_faces[0]. To get the west west neighbor, you can get the neighbor on the face west_cell_faces[1].

Have a look at U-127 and it should become more clear what I'm trying to say.

gwierink March 31, 2011 03:51

1 Attachment(s)
Hi Anton,

Thanks for your idea. But I'm afraid that that won't solve it, unless I completely miss the point :). I have been trying to prevent it, but now I'll have to share some of my drawing talent.

The cell in question is cell C (see drawing). Now, cellCells() will give cells N, E, S, and W. The cells I want are NE, SE, SW, and NW.


Let's say you found the right (west) neighbor of a cell, the face between them is west_cell_faces[0]
Ok, so this is the face between cells W and C, right?


To get the west west neighbor, you can get the neighbor on the face west_cell_faces[1].
But isn't this the same as what Ata said above? I need the "diagonal" neighbours in my fantastic drawing above :). The trick might work if you could get the "upper face" of the W cell, i.e. the face between cell W and cell NW ...

akidess March 31, 2011 03:59

Sorry, I was thinking of far neighbor cells without diagonals ;) But the same idea should be possible -> instead of taking faces 0 and 1, take faces 4 and 5.

[edit]: Oh dear, not only did I misunderstand the original intent, but also I did mix up east and west. Shame on me :o

ata March 31, 2011 04:03

Find all adjacent cells
Hi Gijsbert Wierink
I think the notrh adjacent of the west adjacent cell is the north-west adjacent of the original cell. Is it true?
Best regards

kathrin_kissling March 31, 2011 04:56

Hi Gijs,

you could try (now only for one stencil or my head will break)

labelList adjacent = mesh.cellCells()[cellI];

int size = adjacent.size();
//You need to now how many lists need to be defined now

//For each set a label list
PtrList<labelList> adjOfAdj(size);
for(int j; j<size; j++)
new labelList(mesh.cellCells()[adjacent[j]]) //not too sure about the new
Now create a dynamic list to store your diagonals
dynamicList<label> diagonals(0);
Assuming you have at least one entry
So now you can loop over the single lists
int counter = 0;
for(int k; k<size; k++)
forAll(adjOfAdj[k], adjI)
label labelOne=adjOfAdj[k][adjI];
for(int j; j<size; j++)
forAll(adjOfAdj[j], adjII)
diagonals.resize(counter, labelOne)

In the end the dynamicList holds all your diagonals

I didnt implement or compile this its more a kind of a scope what could be done. I did the most in other code snippets but maybe the one or the other does not work at first!



gwierink April 1, 2011 02:10

Hi Kathrin,

Many thanks for that! I made a method using findCell around a cell, but that is of course very slow if you mesh is bigger tha, say, 9 cells :). Thanks for the input, I'll give it a try!

hjasak April 8, 2011 05:05

Ask the cell for points that it touches and then as the points for cells - that will give you the second layer, but you will have duplicates. You can easily filter them by putting all cell indices into a labelHashSet and asking it for toc() = table of contents.



Andrea_85 June 1, 2011 10:17

Hi all,
i was looking for somthing very similar to implement in my version of OF. Have a look at this post

For my case is not really important a 3x3 stencil,i only need "some" cells around a given cell, so the mesh.cellCells() function is ok.

At the moment i wrote this code:

          labelList adjI = mesh.cellCells()[cellI];

          for(int j=0; j<adjI.size(); j++)
              labelList adjII = mesh.cellCells()[adjI[j]];

Now, my problem is how to create a single list, with inside all the labels coming from adjI and adjII and then check for duplicates.

If i define a third list: "labelHashSet adjTot"
and then i fill the list with the values coming from adjI and adjII (using .insert()), does not work (the list does not contain duplicate, so the size is correct, but it does not contain the label of the cells. It contains only 0 and 1) . but maybe I did something wrong!! (labelHashSet is not a kind of List?!?)

any help will be appreciated!

Thanks in advance


impecca May 11, 2012 06:26

did anyone experience a problem when you try to access the neighbour cells in parallel computing? in my case I have a problem but I don't know how to fix it. I wrote a thread (link below) but no reponse so far. It will be very appreciated if someone gives any advice.

hawkeye321 October 3, 2012 20:18

east and north cell values
Is there any way (any function) to get the value of a parameter at the east and north of a specific cell?

ata October 6, 2012 06:04

First find the neighbors and then compare they coordinates to find desired cells.

CHARLES May 5, 2014 15:18

It seems that cellCells can be used to access ALL cells around a specific cell... how would you access only the NORTH cell?

hjasak May 5, 2014 16:10

Cheap shot. FOAM is a polyhedral mesh code and it uses face addressing on mixed cell types. There's no such thing as "north". I think you need to read my Thesis :)

Some questions to help you think:
- what is North on a tet cell?
- ... and on a dodekahedron?

Therefore, the whole compass framework does not work any more. For things like linear upwind and similar we use gradients (see the Gamma paper) and for others we adapt the numerics.

For special algorithms, there is a function called oppositeFace, but beware: if your cell is not prismatic, the function will respond with an "I don't know".

Hope this helps,


CHARLES May 6, 2014 12:25

Thanks Hrv, you were helpful!

I must say, I'm impressed with your dissertation. :eek:

The point you make about the compass framework not being applicable to such element shapes makes sense. I am currently considering structured meshes with hexahedral elements so I thought cellCells could be used to project a cell's boundary value to all cells above it.

Can you say more about oppositeFace or perhaps suggest a way to achieve what I am trying to do?

All times are GMT -4. The time now is 12:49.