CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   OpenFOAM (http://www.cfd-online.com/Forums/openfoam/)
-   -   Cells loop (http://www.cfd-online.com/Forums/openfoam/88961-cells-loop.html)

 Andrea_85 May 31, 2011 09:09

Cells loop

Hi,
I need to perform a "special" loop over all the cells. For a given cell i need to know the value of a variable in the nearby cells (those cells that share one face with the given cell) and then replace the value of this variable in the given cell with an average through the cell and the neighboring cells. The best thing would be to have a 9x9 stencil around each cell, but to start is enough for me to have the value of this variable in the NORTH, SOUTH, EAST, WEST cells.

For example if the variable is the pressure P, i would like to do something like this:

p[cellI] = (p[cellI]+ p[cell_NORD] + p[cell_SOUTH] +p[cell_EAST] + p[cell_WEST])/5

Now, i know that using mesh.cellCell()[cellI] you can access the neighboring cells of the given cellI.
Unfortunatly my c++ skills are not so good, so i do not know how to loop over the indices of neighbors. Any help is appreciated!

and also if someone have an idea to incude easily also the diagonal cells in this sum (NE, SE, SW, NW). (of course using an orthogonal mesh)

Thanks

andrea

 ngj May 31, 2011 09:38

Hi Andrea

Try e.g. this, it has, however, not been test compiled.

Code:

``` volScalarField pnew("pnew", p); const labelListList & cellCells = mesh.cellCells(); forAll( cellCells, celli ) {     ccs = cellCells[celli];     forAll(ccs, ci )     {           pnew += p[ccs[ci]];     }     pnew[celli] /= (ccs.size() + 1.0); }```
Best regards,

Niels

 Andrea_85 May 31, 2011 11:47

Hi Niels,
thanks for reply. I did it a little different but it works. something like that:
Code:

```scalarField pAdj(mesh.nCells(),scalar(0));  volScalarField pnew("pnew", p);       scalar n = 3;       for(int iter = 0; iter<n; iter++)       {         forAll(mesh.cells(),cellI)         {           labelList adjacent = mesh.cellCells()[cellI];           int size = adjacent.size();           for(int j=0; j<size; j++)           {               pAdj[cellI] += p[adjacent[j]];           }           pnew[cellI] +=  pAdj[cellI];             pnew[cellI] /= size+1;           }         }```
now have you got any idea how to construct a 3x3 stencil(I have mistyped in the last post) around a given cell (only 6 cells around a cell on boundary). Maybe using the neighbors of neighbors? this is not a 3x3 stencil but is not a big problem, the problem is that some cells are taken several times. Hope it is clear!!

Thanks again

andrea

 Andrea_85 June 1, 2011 05:23

Hi,

is there a way, given a certain list, to add other labels? Something like addToList.
If yes, what is the syntax? (Suppose you have two lists, and wanting to put the values ​​of the list 2 into the list 1).

Thanks

andrea

 mahdiiowa October 3, 2012 21:01

Values at east and north cell

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

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