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! 
Find all adjacent cells
I think you can use the adjacents of the adjacents. What do you think?

Hi Ata,
Thanks for your reply. If I use the adjacents of the adjacents, then I get the "westwest", "easteast", etc neighbours. I need the northwest, southwest, etc neighbours ... 
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 U127 and it should become more clear what I'm trying to say. 
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. Quote:
Quote:

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 
Find all adjacent cells
Hi Gijsbert Wierink
I think the notrh adjacent of the west adjacent cell is the northwest adjacent of the original cell. Is it true? Best regards Ata 
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++) { adjOfAdj.set ( 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++) { if(j!=k) { forAll(adjOfAdj[j], adjII) { if(adjOfAdj[j][adjII]==labelOne) { counter++; 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! Best Kathrin 
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! 
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.
Enjoy, Hrv 
Hi all,
i was looking for somthing very similar to implement in my version of OF. Have a look at this post http://www.cfdonline.com/Forums/ope...ellsloop.html 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: Code:
forAll(mesh.cells(),cellI) 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 andrea 
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.
Regards http://www.cfdonline.com/Forums/ope...computing.html 
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?

Hi
First find the neighbors and then compare they coordinates to find desired cells. 
It seems that cellCells can be used to access ALL cells around a specific cell... how would you access only the NORTH cell?

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, Hrv 
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? 
Quote:
Thanks Hrv For anyone who is still interested this is the piece of code: forAll(U,celli) { //if (celli==0) //{ labelHashSet setNBCells(1); labelList lCP = mesh.cellPoints(celli); //Pout<<lCP<<endl; forAll(lCP,pointi) { labelList lPC=mesh.pointCells(lCP[pointi]); //Pout<<lPC<<endl; setNBCells.insert(lPC); } //Pout<<setNBCells<<endl; labelList NBCells=setNBCells.toc(); //} } 
Caveat  this does not work properly across processor boundaries

All times are GMT 4. The time now is 01:57. 