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/)
-   -   Summing phi over all faces in patch (https://www.cfd-online.com/Forums/openfoam-programming-development/117388-summing-phi-over-all-faces-patch.html)

NewtoFOAM May 7, 2013 15:26

Summing phi over all faces in patch
 
Hey,

I am writing a boundary condition and I need to access (not modify) the values of Phi over all the faces in a patch in updateCoeffs()

I went along with something like

const surfaceScalarField& phi = this->db().objectRegistry::lookupObject<surfaceScalarFi eld>("phi");

I thought this might grab the phi field from the openfoam database and i'd be able to just find the faces on my patch....and just sum over the corresponding face entries in the phi list.

I thought this might be good...however this would be for the values of phi everywhere not just in my patch right? so i'd be storing a lot of values I do not need. Also when I check my phi list it doesn't match the Phi files that are created in each timestep directory.

There must be an easy and nice way of just finding the sum(phi) over the faces of my patch.

Thanks in advance. I'm brand new to programming so sometimes this stuff makes me weep.

I'll be combing doxygen and google in the mean time.

David

ngj May 7, 2013 16:17

Hi David,

Welcome to the Forum. You are actually on the right track here, and before I suggest a solution, then please allow me to bring your attention to the "&" in

Code:

const surfaceScalarField & phi = this->db().objectRegistry().lookupObject<surfaceScalarField>("phi");
the "&" means that it is a reference to the object, and if you have not heard about them before, then it is similar to pointer, though much safer to work with. The fact that the object is a reference means, that you are not handling a copy of the entire field, but are being told where the original is placed in the memory, and you are allowed to access this memory as long as you do not alter it; the last part is were the "const" statement in front comes into play.

I hope this helped a bit, and then on to your problem at hand:

Code:

// This line gather the index of the patch
label patchIndex = this->patch().index();

// This is what we already talked about above
const surfaceScalarField & phi = this->db().objectRegistry().lookupObject<surfaceScalarField>("phi");

// This is a reference to the boundaryField of phi, where I am
// using the patch index from above
const scalarField & phiw = phi.boundaryField()[patchIndex];

// Initialise the sumFlux variable
scalar sumFlux = 0.0;

// Sum all of the face values and assign it to sumFlux
sumFlux = Foam::sum(phiw);

// Now, to handle potential parallel computing, this statement sums
// the flux contributions from different processors in case your
// boundary has been divided by one or more processors.
reduce( sumFlux, sumOp<scalar>() );

// Now you have the complete flux across your boundary for serial and
// parallel computations.

I hope this have helped, and please bare with me, if I elaborated too much on some of the points in the code segment above.

Have a nice evening,

Niels

NewtoFOAM May 8, 2013 06:37

Hi,

perfect ! This was exactly what I was looking for!

I have just one question. When I use
Code:

const surfaceScalarField & phi = this->db().objectRegistry().lookupObject<surfaceScalarField>("phi");
I get this message "error: expected primary-expression before ‘>’ token"

However I noticed that changing it to this works perfectly and matches what I expect

Code:

    const surfaceScalarField & phi = this->db().objectRegistry::lookupObject<surfaceScalarField>("phi");
Thanks again!

David


All times are GMT -4. The time now is 11:27.