CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Post-Processing (https://www.cfd-online.com/Forums/openfoam-post-processing/)
-   -   How to export patch face centre Coordinate during sampling ? (https://www.cfd-online.com/Forums/openfoam-post-processing/75949-how-export-patch-face-centre-coordinate-during-sampling.html)

panda60 May 10, 2010 10:15

How to export patch face centre Coordinate during sampling ?
 
Dear foamers,

I want to export all face centre Coordinate in my "OUTLET" patch during sampling.
In sampledPatchTemplates.C , it export patch fieldValues like this:

template <class Type>
Foam::tmp<Foam::Field<Type> >
Foam::sampledPatch::sampleField
(
const GeometricField<Type, fvPatchField, volMesh>& vField
) const
{
// One value per face
tmp<Field<Type> > tvalues(new Field<Type>(patchFaceLabels_.size()));
Field<Type>& values = tvalues();

if (patchIndex() != -1)
{
const Field<Type>& bField = vField.boundaryField()[patchIndex()];

forAll(patchFaceLabels_, elemI)
{
values[elemI] = bField[patchFaceLabels_[elemI]];
}
}

return tvalues;
}

I don't know how to export patch face centre coordinate, which correspond to these fieldValues.

I write a utility like this:

volVectorField::GeometricBoundaryField& fcpatches = fc.boundaryField();
label patchI = mesh.boundaryMesh().findPatchID("OUTLET");

fixedValueFvPatchVectorField& fcpatch = refCast<fixedValueFvPatchVectorField>(fcpatches[patchI]);

const vectorField& faceCentres = mesh.Cf().boundaryField()[patchI];

forAll(faceCentres, facei)
{
scalar x = faceCentres[facei].x();
scalar y = faceCentres[facei].y();
scalar z = faceCentres[facei].z();

fcpatch[facei] = vector(x, y, z);
}


fc.write();

who can tell me if this is the coordinate which I want ?
Thank you very much.

chandramurthy August 1, 2011 12:10

Dumping facing centres of a given patch
 
I don't know whether this is useful to you or not. For the benifit of the community, i am keeping a small code to write the face centres of the given patch by its name.

#include <fstream>
#include <iostream>
//#include "fvMesh.H"
#include "Time.H"
//#include "primitiveMesh.H"
#include "argList.H"
#include "polyMesh.H"
int main(int argc, char *argv[])
{
# include "setRootCase.H"
# include "createTime.H"
# include "createPolyMesh.H"
using namespace Foam;
Info<< "Dump face centres of given patch\n" << endl;
//change the patch name to your boundary name
label patchI = mesh.boundaryMesh().findPatchID("bot_wall_inner");

forAll(mesh.boundaryMesh()[patchI].faceCentres(), faceI)
{
scalar x = mesh.boundaryMesh()[patchI].faceCentres()[faceI].x();
scalar y = mesh.boundaryMesh()[patchI].faceCentres()[faceI].y();
scalar z = mesh.boundaryMesh()[patchI].faceCentres()[faceI].z();
Info<<faceI<<" "<<x<<" "<<y<<" "<<z<<" "<<endl;
}
}

Further file handling can be included with run time selectable patch names, something like faceCentreDict

brucechen November 15, 2011 02:34

hello!
when finish the wmake, can you tell me how to output this data in the case (as specific as possible)?
thank you very much!

chandramurthy November 15, 2011 03:02

Quote:

Originally Posted by brucechen (Post 332128)
hello!
when finish the wmake, can you tell me how to output this data in the case (as specific as possible)?

Just add file handling syntax in the above code, instead of printing to the console, it dumps to TEXT file. To achive this, you can use either Foam inbuild File handler IOobjet or in simplest way you can use C++ file stream.

brucechen November 15, 2011 09:16

yes, i got it !
I added this syntax into simpleFoam, which can be done well. try to modify like following:

label PatchI = mesh.boundaryMesh().findPatchID("patchName");
// const vectorField& faceCentres = mesh.boundaryMesh()[patchI].faceCentres();
const fvPatchVectorField& faceCentres = mesh.C().boundaryField()[PatchI];

forAll(faceCentres, faceI)
{
// get coordinate for face centre
const vector& c = faceCentres[faceI];
//c[0]:x coordinate, c[1]: y coordinate, c[2]: z coordinate
Info << faceI <<":(" << c[0] << " " << c[1] << " " << c[2] << ")" << endl;
}

it can get the same result (face centre coordinate).
so i think that object mesh.C().boundaryField()[patchI] returns the corresponding geometric coordinate of patch face centres , that object U.boundaryField()[patchI] returns vector U of corresponding patch face centres.
in a word, mesh.C() and U belong to geometicField<type> which has the function of boundaryField().

nitishanand1989 November 7, 2015 15:17

It was a very insightful thread, however, I still have trouble implementing it in my code. I would be grateful if anyone can post the controlDict file here.

chengyu January 11, 2017 09:18

A simple application to extract patch face centre coordinates
 
1 Attachment(s)
Following MURTHY's code in #2, I have create a simple application to extract patch face centre coordinates, I paste the main code here and attach the full code/test case behind this thread

Code:

#include "fvMesh.H"
#include "volFields.H"
#include "Time.H"
#include "argList.H"

using namespace Foam;

int main(int argc, char *argv[])
{
    # include "addTimeOptions.H"
    argList::validArgs.append("patch");

    # include "setRootCase.H"
    # include "createTime.H"
    # include "createMesh.H"

    Info<< "Dump face centres of given patch\n" << endl;
    const word patchName = args[1];
    label patchI = mesh.boundaryMesh().findPatchID(patchName);
    const polyPatch& pp = mesh.boundaryMesh()[patchI];

    Info<<pp.faceCentres().size()<<endl;
    Info<<"("<<endl;
    forAll(pp.faceCentres(), faceI)
    {
        scalar x = pp.faceCentres()[faceI].x();
        scalar y = pp.faceCentres()[faceI].y();
        scalar z = pp.faceCentres()[faceI].z();
        Info<<"("<<x<<" "<<y<<" "<<z<<")"<<endl;
    }
    Info<<")"<<endl;

    return 0;
}

About the usage, see the README, I test the code in OpenFOAM-3.0.1, hope this code will help the one who have the interest.

Yu Cheng

Tomko February 12, 2018 12:02

Hi Yu,

Thank you very much for the sharing! I am a new foamer and I got some problems when wmake the testSampleFaceCenter.C file.

1) I cannot find the 'Time.H' file. I searched in the computer, there is a file named 'time.h' located in '~/foam/foam-extend-4.0/ThirdParty/rpmBuild/BUILD/bison-2.7/lib$'. Is this the right one included in the .C file?

2) After replacing the 'Time.H' by 'time.h', I tried to wmake the .C file again. I got a syntx error about the function. It shows as follow.
Code:

wei@wei-Aspire-M5910:~/foam/wei-4.0/run/testSampleFaceCenter$ wmake
Making dependency list for source file sampleFaceCenter.C
SOURCE=sampleFaceCenter.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-200 -I/home/wei/foam/foam-extend-4.0/src/finiteVolume/lnInclude    -I/home/wei/foam/foam-extend-4.0/src/meshTools/lnInclude    -I/home/wei/foam/foam-extend-4.0/src/surfMesh/lnInclude -IlnInclude -I. -I/home/wei/foam/foam-extend-4.0/src/foam/lnInclude -I/home/wei/foam/foam-extend-4.0/src/OSspecific/POSIX/lnInclude  -fPIC -c $SOURCE -o Make/linux64GccDPOpt/sampleFaceCenter.o
sampleFaceCenter.C: In function ‘int main(int, char**)’:
sampleFaceCenter.C:18:32: error: no match for ‘operator[]’ (operand types are ‘Foam::argList’ and ‘int’)
    const word patchName = args[1];
                                ^
sampleFaceCenter.dep:519: recipe for target 'Make/linux64GccDPOpt/sampleFaceCenter.o' failed
make: *** [Make/linux64GccDPOpt/sampleFaceCenter.o] Error 1

Any suggestions about these? Thank a lot in advance!

Tomko February 12, 2018 15:01

Hi Yu,

By commenting the Time.H statement and replace the "args[1]" by "argv[1]", I have obtained the coordinates of a patch of faces. Thank you again for your sharing!

Best,
Wei

chengyu February 24, 2018 01:54

Different OpenFOAM version
 
Hi Wei,
Sorry for the late reply and I am glad you have solved the problem. Plz note I used OpenFOAM and you used foam-extend, I am not familiar with foam-extend and this may lead to the problem.

Best wishes,

Yu


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