CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (http://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   How to get access to normalVectors of specified faces in patch (http://www.cfd-online.com/Forums/openfoam-programming-development/100657-how-get-access-normalvectors-specified-faces-patch.html)

tilo April 27, 2012 19:59

How to get access to normalVectors of specified faces in patch
 
Hi at all,

my aim is to calculate the averaged normal vector of specified regions of my surface.

Therefore I tried the following:

/************************************************** ************************************************** *****/

const fileName inputSTL = "plate3x3x0.6x0.6.stl"; // a plate is only a simple example, afterwards there will be curved surfaces

triSurface surface(inputSTL);

Field<point> pointsSTLlocal(surface.localPoints());//triSurface.localPoints(): return pointField of points in patch

Foam::List<Foam::labelledTri> faceList(surface.localFaces());//triSurface.localFaces(): return patch faces addressing into local point list

// Field<point> allNormalVectors(oberflaeche.faceNormals()); //triSurface.faceNormals(): return face normals for patch
/*
--> I had a try with the above line too, but I only could output every normalvektor of the whole patch, not for specified faces.
*/

forAll(faceList, i)
{
Info << "faceList[i][0]: " << faceList[i][0] << endl;
Info << "faceList[i][1]: " << faceList[i][1] << endl;
Info << "faceList[i][2]: " << faceList[i][2] << endl;

triFace triangle(faceList[i][0], faceList[i][1], faceList[i][2]);
Info << "triangle: " << triangle << endl;

Info << "pointsSTLlocal[faceList[i][0]]: " << pointsSTLlocal[faceList[i][0]] << endl;
Info << "pointsSTLlocal[faceList[i][1]]: " << pointsSTLlocal[faceList[i][1]] << endl;
Info << "pointsSTLlocal[faceList[i][2]]: " << pointsSTLlocal[faceList[i][2]] << endl;

label number = 3;
List<point> liste(number);
forAll(liste, iterator)
{
liste[iterator] = pointsSTLlocal[faceList[i][iterator]];
}

Field<point> trianglePoints(liste);

Info << "Field<point> trianglePoints.size(): " << trianglePoints.size() << endl;

/* --> another try, but doesn't work too:

Field<point> trianglePoints();
trianglePoints[0] = pointsSTLlocal[faceList[i][0]];
trianglePoints[1] = pointsSTLlocal[faceList[i][1]];
trianglePoints[2] = pointsSTLlocal[faceList[i][2]];
*/
forAll(trianglePoints, j)
{
Info << "trianglePoints[j]: " << trianglePoints[j] << endl;
}

Foam::vector normalVector = vector::zero;
// Info << "normalVector::zero: " << normalVector << endl;

// I think here should be the problem, maybe something with the pointField must be wrong:

normalVector = triangle.normal(trianglePoints);

Info << "normalVector: " << normalVector << endl;

/************************************************** ************************************************** *****/

After running the code I get the following error message:

/************************************************** ************************************************** *****/

tilo@ubuntu:~/OpenFOAM/tilo-2.1.0/run/testSkript$ wclean
tilo@ubuntu:~/OpenFOAM/tilo-2.1.0/run/testSkript$ wmake
Making dependency list for source file testSkript.C
SOURCE=testSkript.C ; g++ -m32 -Dlinux -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -O3 -DNoRepository -ftemplate-depth-100 -

I/opt/openfoam210/src/surfMesh/lnInclude -I/opt/openfoam210/src/meshTools/lnInclude -I/opt/openfoam210/src/triSurface/lnInclude -DFULLDEBUG -g -O0 -IlnInclude -I. -

I/opt/openfoam210/src/OpenFOAM/lnInclude -I/opt/openfoam210/src/OSspecific/POSIX/lnInclude -fPIC -c $SOURCE -o Make/linuxGccDPOpt/testSkript.o
g++ -m32 -Dlinux -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -O3 -DNoRepository -ftemplate-depth-100 -I/opt/openfoam210/src/surfMesh/lnInclude -

I/opt/openfoam210/src/meshTools/lnInclude -I/opt/openfoam210/src/triSurface/lnInclude -DFULLDEBUG -g -O0 -IlnInclude -I. -I/opt/openfoam210/src/OpenFOAM/lnInclude -

I/opt/openfoam210/src/OSspecific/POSIX/lnInclude -fPIC -Xlinker --add-needed -Xlinker --no-as-needed Make/linuxGccDPOpt/testSkript.o -

L/opt/openfoam210/platforms/linuxGccDPOpt/lib \
-lsurfMesh -ltriSurface -lmeshTools -lOpenFOAM -ldl -lm -o /home/tilo/OpenFOAM/tilo-2.1.0/platforms/linuxGccDPOpt/bin/testDelle
tilo@ubuntu:~/OpenFOAM/tilo-2.1.0/run/testSkript$ testDelle
faceList[i][0]: 0
faceList[i][1]: 1
faceList[i][2]: 2
triangle: (0 1 2)
pointsSTLlocal[faceList[i][0]]: (0 0 0)
pointsSTLlocal[faceList[i][1]]: (0.6 0 0)
pointsSTLlocal[faceList[i][2]]: (0.6 0.6 0)
Field<point> trianglePoints.size(): 3
trianglePoints[j]: (0 0 0)
trianglePoints[j]: (0.6 0 0)
trianglePoints[j]: (0.6 0.6 0)
normalVector: (0 0 0.18)

1faceList[i][0]: 0
faceList[i][1]: 3
faceList[i][2]: 2
triangle: (0 3 2)
pointsSTLlocal[faceList[i][0]]: (0 0 0)
pointsSTLlocal[faceList[i][1]]: (0 0.6 0)
pointsSTLlocal[faceList[i][2]]: (0.6 0.6 0)
Field<point> trianglePoints.size(): 3
trianglePoints[j]: (0 0 0)
trianglePoints[j]: (0 0.6 0)
trianglePoints[j]: (0.6 0.6 0)


--> FOAM FATAL ERROR:
index 3 out of range 0 ... 2

From function UList<T>::checkIndex(const label)
in file /opt/openfoam210/src/OpenFOAM/lnInclude/UListI.H at line 109.

FOAM aborting

#0 Foam::error::printStack(Foam::Ostream&) in "/opt/openfoam210/platforms/linuxGccDPOpt/lib/libOpenFOAM.so"
#1 Foam::error::abort() in "/opt/openfoam210/platforms/linuxGccDPOpt/lib/libOpenFOAM.so"
#2 Foam::Ostream& Foam::operator<< <Foam::error>(Foam::Ostream&, Foam::errorManip<Foam::error>) at /opt/openfoam210/src/OpenFOAM/lnInclude/errorManip.H:85
#3
at /opt/openfoam210/src/OpenFOAM/lnInclude/UListI.H:113
#4
at /opt/openfoam210/src/OpenFOAM/lnInclude/UListI.H:200
#5
at /opt/openfoam210/src/OpenFOAM/lnInclude/triFaceI.H:187
#6
at testSkript.C:105
#7 __libc_start_main in "/lib/tls/i686/cmov/libc.so.6"
#8
in "/home/tilo/OpenFOAM/tilo-2.1.0/platforms/linuxGccDPOpt/bin/testDelle"
Abgebrochen
tilo@ubuntu:~/OpenFOAM/tilo-2.1.0/run/testSkript$

/************************************************** ************************************************** *****/

As seen in the error message, the program starts in the right way (I hope so), but then an index-error appears. I thought that the "List<point> liste(number);" has
the wrong size, but I think it couldn't be, because it is build new in every iteration.

Maybe somebody can help me, or tell me how to get access to normal vectors of specified faces. Thanks in advance.


All times are GMT -4. The time now is 03:30.