CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   eigenVectors ? (https://www.cfd-online.com/Forums/openfoam-programming-development/86370-eigenvectors.html)

T.D. March 21, 2011 08: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 09: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 10: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 12: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 03: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 02: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 03: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.

potentialFoam February 3, 2016 04:12

Dear Foamers,

thanks for the helpful discussion. Nevertheless, I have two remaining questions:

1.) How can I calculate the eigenvector for known eigenvalues?
(Reason: My problem has one real and two complex conjugate eigenvalues. I get an error calculating the complex eigenvectors, hence I would like to calculate only the eigenvector for the real eigenvalue.)

Therefor I would like to use the following function (defined in 'tensor.C' at line 207 (for OF 3.0.1).

Code:

Foam::vector eigenVector (const tensor & t, const scalar lambda)
Is this a reasonable approach? (Does not work for simulation.)

2.) Assigning the return value like this (for a simple test case)

Code:

vector eigenvector_real = eigenVector( Tensor, eigenvalue_real );
leads to the error:
error: reference to ‘vector’ is ambiguous

Why that?! The return type should be 'vector'?!

I would be glad for help,
Peter

potentialFoam February 3, 2016 04:27

Stop - it works :)

For Foamers with similar problems:
-> 1.)
I should have defined the return value as a volVectorField (and not as a volTensorField like for the function 'eigenVectors').
Code:

volVectorField EV = U * 0.0;
forAll(l_ci, i) // l_r is a volScalarField for the real eigenvalue
{
    ... // calculate real eigenvalue l_r[i]
    EV[i] = eigenVector(gradU[i], l_r[i]);
}

(Another remaining problem is how to declare a 'volVectorField' like 'EV'. I use a nasty solution here...)

-> 2.)
Still not clear, but it works, so what!

Peter

sharonyue February 13, 2016 04:48

Hi guys,

About the eigenvectors and eigenvalue, Alberto has implemented a solver to handle this. check it out here: https://bitbucket.org/albertop/eigensolver

Good luck!


All times are GMT -4. The time now is 18:29.