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. |
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 |
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! |
Quote:
|
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(). |
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.
|
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" Yu Cheng |
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 |
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 |
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. |