Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • openfoam openfoam
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 426
    • Issues 426
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 8
    • Merge requests 8
  • Deployments
    • Deployments
    • Releases
  • Wiki
    • Wiki
  • Activity
  • Graph
  • Create a new issue
  • Commits
  • Issue Boards
Collapse sidebar
  • Development
  • openfoamopenfoam
  • Issues
  • #2011
Closed
Open
Issue created Feb 21, 2021 by Guanyang Xue@xuegy

Can't compile with eigenVectors()

Summary

Can't compile the code that calculates eigenVectors() of a volSymmTensorField directly.

Steps to reproduce

Same as the example case. eigenValues() is OK but eigenVectors() fails.

Example case

To avoid confusion I'm changing the example case a little bit.

//Psi_ is a volSymmTensorField
eig_=eigenValues(Psi_);
R_=eigenVectors(Psi_,eig_);

What is the current bug behaviour?

Can't compile the code.

What is the expected correct behavior?

In src/OpenFOAM/primitives/SymmTensor/symmTensor/symmTensor.H there's

vector eigenValues(const symmTensor& T); and

tensor eigenVectors(const symmTensor& T, const vector& eVals);

eigenValues() can compile which means the conversion from Foam::volSymmTensorField to const Foam::symmTensor is OK. So eigenVectors() should work as well.

Relevant logs and/or images

error: no matching function for call to 'eigenVectors'
    R_=eigenVectors(Psi_,eig_);
       ^~~~~~~~~~~~
/Users/gux215/OpenFOAM/OpenFOAM-v2012/src/OpenFOAM/lnInclude/tensor.H:94:17: note: 
      candidate function not viable: no known conversion from
      'Foam::volSymmTensorField' (aka 'GeometricField<SymmTensor<double>,
      fvPatchField, Foam::volMesh>') to 'const Foam::tensor' (aka
      'const Tensor<double>') for 1st argument
Tensor<complex> eigenVectors
                ^
/Users/gux215/OpenFOAM/OpenFOAM-v2012/src/OpenFOAM/lnInclude/symmTensor.H:95:8: note: 
      candidate function not viable: no known conversion from
      'Foam::volSymmTensorField' (aka 'GeometricField<SymmTensor<double>,
      fvPatchField, Foam::volMesh>') to 'const Foam::symmTensor' (aka 'const
      SymmTensor<double>') for 1st argument
tensor eigenVectors

Also tested with GCC 8 in a Linux VM

/usr/lib/openfoam/openfoam2012/src/OpenFOAM/lnInclude/symmTensor.H:95:8: note: candidate: ‘Foam::tensor Foam::eigenVectors(const symmTensor&, const vector&)’
 tensor eigenVectors
        ^~~~~~~~~~~~
/usr/lib/openfoam/openfoam2012/src/OpenFOAM/lnInclude/symmTensor.H:95:8: note:   no known conversion for argument 1 from ‘Foam::volSymmTensorField’ {aka ‘Foam::GeometricField<Foam::SymmTensor<double>, Foam::fvPatchField, Foam::volMesh>’} to ‘const symmTensor&’ {aka ‘const Foam::SymmTensor<double>&’}

Environment information

  • OpenFOAM version : v2012
  • Operating system : macOS/Linux
  • Hardware info : x86
  • Compiler : Clang/GCC

Possible fixes

    forAll(Psi_, celli) {
        eig_[celli]=eigenValues(Psi_[celli]);
        R_[celli]=eigenVectors(Psi_[celli],eig_[celli]);
    }

Can be compiled successfully, but that's too stupid. It should be doable without using forAll.

Edited Feb 26, 2021 by Guanyang Xue
Assignee
Assign to
Time tracking