CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Running, Solving & CFD (https://www.cfd-online.com/Forums/openfoam-solving/)
-   -   How to access to faces of a patch (https://www.cfd-online.com/Forums/openfoam-solving/59251-how-access-faces-patch.html)

jaswi December 30, 2007 19:05

Dear OpenFOAMers Greetings
 
Dear OpenFOAMers

Greetings

I need the face list of faces belonging to a boundary patch. This is what I am doing:


label patchID = mesh.boundaryMesh().findPatchID("cylinder");
const polyPatch& cPatch = mesh.boundaryMesh()[patchID];


With the above code lines I can create a polyPatch and assign it equal to the boundary patch i need.

Please give me a clue on how to access the faces of this patch as I need to loop over these faces.



Thanks in advance

Best Regards
Jaswinder

PS: I am searching the posts simultaneously

jaswi December 30, 2007 21:16

Hi Forum Good Evening once
 
Hi Forum

Good Evening once again

I wanted to calculate the surface area of a patch. This is how I achieved the result :

label patchID = mesh.boundaryMesh().findPatchID("walls");

const polyPatch& cPatch = mesh.boundaryMesh()[patchID];

const surfaceScalarField& magSf = mesh.magSf();

scalar patchArea = 0.0;
forAll(cPatch, facei)
{
patchArea += magSf.boundaryField()[patchID][facei];
}

Info << "Patch Area " << patchArea << endl;

I checked it for a cylinder and it gives accurate result. I am sure that it can be done in a more elegant way. Experts please suggest.

Now the next step is to iterate over the faces of this patch and sum the area of only those faces where value of volume fraction gamma is positive.

Any suggestions are highly appreciated.

Wish you all a successful year ahead
Best Regards
Jaswinder

shivasub December 30, 2007 21:19

Jaswinder, you can access e
 
Jaswinder,

you can access each of the faces in this manner after getting specific patch.

forAll(cPatch, faceI)
{
//whatever you need to access here

}

regards
Shiva

jaswi December 30, 2007 21:55

Thanks Shiva Your profile s
 
Thanks Shiva

Your profile shows that you work with Multiphase Flows. That's a good news for me as I am a novice in this field and have been looking out for people who are experienced, especially within OpenFOAM community.

Kind Regards
Jaswinder

shivasub December 31, 2007 12:14

Hi Jaswinder, good to know
 
Hi Jaswinder,

good to know you are working in multiphase flows as well. I am still learning a lot about this.

you can use an if test in the for loop for checking faces with gamma > 0 .

forAll(cPatch,faceI)

{
if (gamma.boundaryField()[patchID][faceI] > 0)
//whatever you need to do.
}

This works, but am not sure how efficient this is and whether there is any other elegant workaround.

regards
Shiva

jaswi January 6, 2008 06:04

Thanks Shiva It works.
 
Thanks Shiva

It works.


Happy New year
Jaswinder

Marshak March 2, 2013 21:43

sum of areas of all faces of a cell
 
I have a similar problem to solve. I want to calculate, for each given cell in the domain :

Length= cell Volume / sum of areas of all faces of a cell

Can you kindly help me how can I code this.

fumiya March 3, 2013 01:59

How to loop over cell faces
 
Hi Marshak,

I think it is better to start another thread for being easy to search later.
Regarding your question, the following is my sample code:

Code:

scalar sumA = 0.0; //Sum of areas of all faces of a cell
const cell& cFaces = mesh.cells()[yourCellIndex];

forAll(cFaces, i)
{
    sumA += mag(mesh.Sf()[cFaces[i]]); //cFaces[i]: face label of a cell
}

scalar Length = mesh.V()[yourCellIndex]/sumA;

Hopt that helps,
Fumiya

PEM_GUY September 28, 2013 15:34

label patchID = mesh.boundaryMesh().findPatchID("NAME OF PATCH");

Info << "patchID = " << patchID << endl;

const polyPatch& cPatch = mesh.boundaryMesh()[patchID];

Info << "cPATCH = " << nl << cPatch << endl;

const surfaceScalarField& magSf = mesh.magSf();

scalar AREA = gSum(magSf.boundaryField()[patchID]);

Info << "AREA = " << nl << AREA << endl;

You might find it more efficient to do the following, it will avoid the need for additional looping. There is also the Foam::max and Foam::min function when needed to only sum more or less than a given value.

Cheers

DH

Marshak October 1, 2013 05:06

Is this the procedure for boundary patches only? if yes then how about finding surface area of each internal mesh cell?

kiddmax December 4, 2013 04:37

Dear DH,

should I add this code into controlDict file? or the solver code?

PEM_GUY December 4, 2013 14:01

Faces... faces... everywhere...
 
The routine above works for addressable patches, i.e. ones that have been created in blockmesh or are created upon splitting a mesh for multi-region. This code would be included in the solver, not in controlDict.

If you wanted to do a loop over all faces in a domain, there are examples of this in the grad calc function in OpenFoam's source guide. I do have code for this and will try to post a "how" later on today.

Cheers,
DH

will_ca September 19, 2014 05:20

surface area of boundary
 
I solved my problem below. It is working.


Hello,

I am using the coldEngine solver and I wanted to get the area of the cylinderwalls. The walls of the cylinder are definded as walls in a boundary patch called 'liner'. The mesh is changing over time and so is the surface of the liner.
This is the code I used:

#include "fvCFD.H"
#include "fvCFD.H"
#include "wallFvPatch.H"

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:

int main(int argc, char *argv[])
{
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
timeSelector::addOptions();
#include "addRegionOption.H"
#include "setRootCase.H"
#include "createTime.H"
instantList timeDirs = timeSelector::select0(runTime, args);
#include "createNamedMesh.H"

forAll(timeDirs, timeI)
{
runTime.setTime(timeDirs[timeI], timeI);
Info<< "Time = " << runTime.timeName() << endl;
mesh.readUpdate();

label patchID = mesh.boundaryMesh().findPatchID("liner");

Info<<"\nsurface of liner "
<< gSum(mesh.magSf().boundaryField()[patchID])
<< endl;

}
Info<< "\nEnd\n" << endl;
return 0;
};


my problem now is that the results are wrong. They are much smaller than if I calculate the surface myself. I have checked everything I could think of, but haven't found the problem. I have checked the dimension of my cylinder in paraView and there the geometry is correct.
Does anyone know what the problem could be?
I would appreciate any help.
Ca

JasonWang3 September 23, 2015 05:25

Hi Will

Do you know how to access all faces that are parallel to a wall?

I am using the code: label cellI = patch.faceCells()[faceI]; to access the cells next to a wall.

Jason

tjliang August 24, 2016 07:52

Quote:

Originally Posted by PEM_GUY (Post 454078)
label patchID = mesh.boundaryMesh().findPatchID("NAME OF PATCH");

Info << "patchID = " << patchID << endl;

const polyPatch& cPatch = mesh.boundaryMesh()[patchID];

Info << "cPATCH = " << nl << cPatch << endl;

const surfaceScalarField& magSf = mesh.magSf();

scalar AREA = gSum(magSf.boundaryField()[patchID]);

Info << "AREA = " << nl << AREA << endl;

You might find it more efficient to do the following, it will avoid the need for additional looping. There is also the Foam::max and Foam::min function when needed to only sum more or less than a given value.

Cheers

DH

Hello David,

do you know how to access patch field value for example temperature?

Thanks in advance,

Peng

Ravi_383 November 10, 2019 09:35

A question on how to execute the codes mentioned?
 
Dear all,
I am very new to OpenFOAM and sorry for this stupid question.

This is my concern here for writing. @jaswi and @shivasub seem to have suggested that we should run a given code or line of codes to be able to get the data required. However, I do not understand how do we execute that code. Any help would be much appreciated?

geth03 May 4, 2020 07:33

Quote:

Originally Posted by Ravi_383 (Post 749380)
Dear all,
I am very new to OpenFOAM and sorry for this stupid question.

This is my concern here for writing. @jaswi and @shivasub seem to have suggested that we should run a given code or line of codes to be able to get the data required. However, I do not understand how do we execute that code. Any help would be much appreciated?

this is a more advanced topic which requires deeper knowledge regarding openfoam solver / library / BC / ... - programming.
you should first start with tutorials on openfoam wiki.
things will make sense soon.

Tian Jin October 7, 2020 10:30

Hello, I have a stupid question: where should I put these code? In what file?
Quote:

Originally Posted by shivasub (Post 187744)
Jaswinder,

you can access each of the faces in this manner after getting specific patch.

forAll(cPatch, faceI)
{
//whatever you need to access here

}

regards
Shiva



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