CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   OpenFOAM (http://www.cfd-online.com/Forums/openfoam/)
-   -   eigenVectors ? (http://www.cfd-online.com/Forums/openfoam/86370-eigenvectors.html)

T.D. March 21, 2011 09:11

eigenVectors ?
 
Hi Foamers,
what is the exact function in openFoam to get the eigenVectors of a volsymmTensorField A ? If it will return a tensor , then how are the vectors aligned, they will be as rows or as columns in the tensor?

thanks


T.D.

fcollonv March 21, 2011 10:40

Hello,

The function is really easy:
eigenVectors(A) should work
And it will return in your case a volTensorField T

For each cell i, the first eigen vector is T.internalField()[i].x(), the second T.internalField()[i].y() and the third T.internalField()[i].z()

But to answer directly they are store by line
so the first one is composed of xx, xy and xz.

In the code they use the constructor line 67 there:
http://foam.sourceforge.net/docs/cpp..._8H_source.php


Best regards,

Fred

T.D. March 21, 2011 11:06

Hi,
i am trying to get eigenVectors of the strain rate tensor E, so i tried

volTensorField Gr=fvc::grad(U);
volSymmTensorField E = symm(Gr);

volTensorField T=eigenVectors(E);

and it didn't work !!!! i get this error:

Quote:

talib@jml-port:~/Desktop/talib/applications/solvers/incompressible/TalibicoFoam2DframeInvariant$ wmake
Making dependency list for source file TalibicoFoam2DframeInvariant.C
SOURCE=TalibicoFoam2DframeInvariant.C ; g++ -m32 -Dlinux -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -O3 -DNoRepository -ftemplate-depth-40 -I/opt/openfoam171/src/finiteVolume/lnInclude -IlnInclude -I. -I/opt/openfoam171/src/OpenFOAM/lnInclude -I/opt/openfoam171/src/OSspecific/POSIX/lnInclude -fPIC -c $SOURCE -o Make/linuxGccDPOpt/TalibicoFoam2DframeInvariant.o
TalibicoFoam2DframeInvariant.C: In function ‘int main(int, char**)’:
TalibicoFoam2DframeInvariant.C:65: error: conversion from ‘Foam::tmp<Foam::GeometricField<Foam::SymmTensor<d ouble>, Foam::fvPatchField, Foam::volMesh> >’ to non-scalar type ‘Foam::volTensorField’ requested
/opt/openfoam171/src/finiteVolume/lnInclude/readPISOControls.H:8: warning: unused variable ‘momentumPredictor’
/opt/openfoam171/src/finiteVolume/lnInclude/readPISOControls.H:11: warning: unused variable ‘transonic’
/opt/openfoam171/src/finiteVolume/lnInclude/readPISOControls.H:14: warning: unused variable ‘nOuterCorr’
In file included from /opt/openfoam171/src/OpenFOAM/lnInclude/GeometricTensorField.H:87,
from /opt/openfoam171/src/OpenFOAM/lnInclude/GeometricFields.H:36,
from /opt/openfoam171/src/finiteVolume/lnInclude/volFields.H:37,
from /opt/openfoam171/src/finiteVolume/lnInclude/surfaceInterpolationScheme.C:30,
from /opt/openfoam171/src/finiteVolume/lnInclude/surfaceInterpolationScheme.H:235,
from /opt/openfoam171/src/finiteVolume/lnInclude/surfaceInterpolate.H:41,
from /opt/openfoam171/src/finiteVolume/lnInclude/fvc.H:39,
from /opt/openfoam171/src/finiteVolume/lnInclude/fvCFD.H:8,
from TalibicoFoam2DframeInvariant.C:32:
/opt/openfoam171/src/OpenFOAM/lnInclude/GeometricTensorField.C: In function ‘void Foam::eigenVectors(Foam::GeometricField<Foam::Symm Tensor<double>, PatchField, GeoMesh>&, const Foam::GeometricField<Foam::SymmTensor<double>, PatchField, GeoMesh>&) [with PatchField = Foam::fvPatchField, GeoMesh = Foam::volMesh]’:
/opt/openfoam171/src/OpenFOAM/lnInclude/GeometricTensorField.C:53: instantiated from ‘Foam::tmp<Foam::GeometricField<Foam::SymmTensor<d ouble>, PatchField, GeoMesh> > Foam::eigenVectors(const Foam::GeometricField<Foam::SymmTensor<double>, PatchField, GeoMesh>&) [with PatchField = Foam::fvPatchField, GeoMesh = Foam::volMesh]’
TalibicoFoam2DframeInvariant.C:65: instantiated from here
/opt/openfoam171/src/OpenFOAM/lnInclude/GeometricTensorField.C:53: error: no matching function for call to ‘eigenVectors(Foam::Field<Foam::SymmTensor<do uble> >&, const Foam::Field<Foam::SymmTensor<double> >&)’
/opt/openfoam171/src/OpenFOAM/lnInclude/tensor.H:55: note: candidates are: Foam::tensor Foam::eigenVectors(const Foam::tensor&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensor.H:59: note: Foam::tensor Foam::eigenVectors(const Foam::symmTensor&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:67: note: void Foam::eigenVectors(Foam::Field<Foam::Tensor<double > >&, const Foam::UList<Foam::Tensor<double> >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:67: note: Foam::tmp<Foam::Field<Foam::Tensor<double> > > Foam::eigenVectors(const Foam::UList<Foam::Tensor<double> >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:67: note: Foam::tmp<Foam::Field<Foam::Tensor<double> > > Foam::eigenVectors(const Foam::tmp<Foam::Field<Foam::Tensor<double> > >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:70: note: void Foam::eigenVectors(Foam::Field<Foam::Tensor<double > >&, const Foam::UList<Foam::SymmTensor<double> >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:70: note: Foam::tmp<Foam::Field<Foam::Tensor<double> > > Foam::eigenVectors(const Foam::UList<Foam::SymmTensor<double> >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:70: note: Foam::tmp<Foam::Field<Foam::Tensor<double> > > Foam::eigenVectors(const Foam::tmp<Foam::Field<Foam::SymmTensor<double> > >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/dimensionedTensor.H:65: note: Foam::dimensionedTensor Foam::eigenVectors(const Foam::dimensionedTensor&)
/opt/openfoam171/src/OpenFOAM/lnInclude/dimensionedTensor.H:68: note: Foam::dimensionedTensor Foam::eigenVectors(const Foam::dimensionedSymmTensor&)
In file included from /opt/openfoam171/src/OpenFOAM/lnInclude/tensorFieldField.H:86,
from /opt/openfoam171/src/OpenFOAM/lnInclude/GeometricTensorField.C:27,
from /opt/openfoam171/src/OpenFOAM/lnInclude/GeometricTensorField.H:87,
from /opt/openfoam171/src/OpenFOAM/lnInclude/GeometricFields.H:36,
from /opt/openfoam171/src/finiteVolume/lnInclude/volFields.H:37,
from /opt/openfoam171/src/finiteVolume/lnInclude/surfaceInterpolationScheme.C:30,
from /opt/openfoam171/src/finiteVolume/lnInclude/surfaceInterpolationScheme.H:235,
from /opt/openfoam171/src/finiteVolume/lnInclude/surfaceInterpolate.H:41,
from /opt/openfoam171/src/finiteVolume/lnInclude/fvc.H:39,
from /opt/openfoam171/src/finiteVolume/lnInclude/fvCFD.H:8,
from TalibicoFoam2DframeInvariant.C:32:
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorFieldField.C: In function ‘void Foam::eigenVectors(Foam::FieldField<Field, Foam::SymmTensor<double> >&, const Foam::FieldField<Field, Foam::SymmTensor<double> >&) [with Field = Foam::fvPatchField]’:
/opt/openfoam171/src/OpenFOAM/lnInclude/GeometricTensorField.C:53: instantiated from ‘void Foam::eigenVectors(Foam::GeometricField<Foam::Symm Tensor<double>, PatchField, GeoMesh>&, const Foam::GeometricField<Foam::SymmTensor<double>, PatchField, GeoMesh>&) [with PatchField = Foam::fvPatchField, GeoMesh = Foam::volMesh]’
/opt/openfoam171/src/OpenFOAM/lnInclude/GeometricTensorField.C:53: instantiated from ‘Foam::tmp<Foam::GeometricField<Foam::SymmTensor<d ouble>, PatchField, GeoMesh> > Foam::eigenVectors(const Foam::GeometricField<Foam::SymmTensor<double>, PatchField, GeoMesh>&) [with PatchField = Foam::fvPatchField, GeoMesh = Foam::volMesh]’
TalibicoFoam2DframeInvariant.C:65: instantiated from here
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorFieldField.C:55: error: no matching function for call to ‘eigenVectors(Foam::fvPatchField<Foam::SymmTensor< double> >&, const Foam::fvPatchField<Foam::SymmTensor<double> >&)’
/opt/openfoam171/src/OpenFOAM/lnInclude/tensor.H:55: note: candidates are: Foam::tensor Foam::eigenVectors(const Foam::tensor&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensor.H:59: note: Foam::tensor Foam::eigenVectors(const Foam::symmTensor&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:67: note: void Foam::eigenVectors(Foam::Field<Foam::Tensor<double > >&, const Foam::UList<Foam::Tensor<double> >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:67: note: Foam::tmp<Foam::Field<Foam::Tensor<double> > > Foam::eigenVectors(const Foam::UList<Foam::Tensor<double> >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:67: note: Foam::tmp<Foam::Field<Foam::Tensor<double> > > Foam::eigenVectors(const Foam::tmp<Foam::Field<Foam::Tensor<double> > >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:70: note: void Foam::eigenVectors(Foam::Field<Foam::Tensor<double > >&, const Foam::UList<Foam::SymmTensor<double> >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:70: note: Foam::tmp<Foam::Field<Foam::Tensor<double> > > Foam::eigenVectors(const Foam::UList<Foam::SymmTensor<double> >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/tensorField.H:70: note: Foam::tmp<Foam::Field<Foam::Tensor<double> > > Foam::eigenVectors(const Foam::tmp<Foam::Field<Foam::SymmTensor<double> > >&)
/opt/openfoam171/src/OpenFOAM/lnInclude/dimensionedTensor.H:65: note: Foam::dimensionedTensor Foam::eigenVectors(const Foam::dimensionedTensor&)
/opt/openfoam171/src/OpenFOAM/lnInclude/dimensionedTensor.H:68: note: Foam::dimensionedTensor Foam::eigenVectors(const Foam::dimensionedSymmTensor&)
make: *** [Make/linuxGccDPOpt/TalibicoFoam2DframeInvariant.o] Error 1
i also tried volSymmTensorField T=eigenVectors(E); but it also didn't work !!
Any ideas ????

fcollonv March 21, 2011 13:19

Hello T.D.,

my fault, eigenVectors is implemented only with volTensorField as input parameter not with volSymmTensorField.

So you will have to convert your E in a volTensorField. Hopefully a trick like tensor(1, 0, 0, 0, 1, 0, 0, 0, 1)*E will do the trick...

Good luck,

Frederic

T.D. March 22, 2011 04:37

Hi
it didn't work as you said, i think it seems that eigenVectors() function does not accept a tensor with dimensions, any idea how to take only the values of the dimensioned volSymmTensorField "E" and put them in another dimensionless volTensorField (for example "E2" ) ???

thanks a lot

yours,

T.D.

kathrin_kissling March 23, 2011 03:24

Hi it should work for a dimensionedTensor, since its implemented in the dimensionedTensor class. Probably it does not work on the boundaries... Try to work only on the internal field.

dimensionedTensorField myTensorFieldOfTheInternal = myVolTensorFieldWhatIHave.internal();
dimensionedTensorField myDesiredEigenvectors = eigenVectors(myTensorFieldOfTheInternal);

Then you give it back as

volTensorField myEigenVectors
(
IOobject
(
"myEigenVectors",
myVolTensorFieldWhatIHave.time().timeName(),
myVolTensorFieldWhatIHave.mesh(),
IOobject::NO_READ
),
myVolTensorFieldWhatIHave.mesh(),
dimensionedTensor::zero
);

myEigenVectors.internal() = myDesiredEigenvectors;


If you need the values on the boundary, maybe you have to loop over those and do the same.
Hope this helps

Kathrin

T.D. March 23, 2011 04:59

Hi,
thanks a lot for your anwser, but i tried this inside the time loop:

volTensorField Gr=fvc::grad(U);
volSymmTensorField E = symm(Gr);

Srate.component(0)=E.component(0);
Srate.component(1)=E.component(1);
Srate.component(2)=E.component(2);
Srate.component(3)=E.component(3);
Srate.component(4)=E.component(4);
Srate.component(5)=E.component(5);
Srate.component(6)=E.component(6);
Srate.component(7)=E.component(7);
Srate.component(8)=E.component(8);

volTensorField Ei=eigenVectors(Srate);

and it compiles well. What i need to know now, is it OK like this for filling all Srate components ? however E is symmetric tensor but Srate is not;

RK: ----inside .H file, Srate defined as:
volTensorField Srate
(
IOobject
(
"Srate",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
mesh
);
---------------------------------------------------------------------


yours,
T.D.

ripudaman October 21, 2013 02:47

I tried the above recommendations to obtain the eigenVectors but I get a NO_READ error. Also, can anyone on this forum tell me how to obtain the eigenvectors as three different vectors instead of a tensor so that I can easily plot the individual vectors as arrows.


All times are GMT -4. The time now is 04:12.