CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   Cells loop (https://www.cfd-online.com/Forums/openfoam-programming-development/88961-cells-loop.html)

Andrea_85 May 31, 2011 08: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 08: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 10: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 04: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

hawkeye321 October 3, 2012 20: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?

CHARLES May 4, 2014 23:47

mahdiiowa, did you ever figure out how to reference specific cells?


All times are GMT -4. The time now is 07:56.