Skip to content
Snippets Groups Projects
orthogonalmatrixtest.cc 2.47 KiB
Newer Older
#include <config.h>

#include <dune/gfe/spaces/orthogonalmatrix.hh>

#include "valuefactory.hh"


/** \file
    \brief Unit tests for the OrthogonalMatrix class

using namespace Dune;

double eps = 1e-6;

/** \brief Test whether orthogonal matrix really is orthogonal
 */
template <class T, int N>
void testOrthogonality(const OrthogonalMatrix<T,N>& p)
{
  Dune::FieldMatrix<T,N,N> prod(0);
  for (int i=0; i<N; i++)
    for (int j=0; j<N; j++)
      for (int k=0; k<N; k++)
        prod[i][j] += p.data()[k][i] * p.data()[k][j];

  for (int i=0; i<N; i++)
    for (int j=0; j<N; j++)
      if ( std::abs(prod[i][j] - (i==j) ) > eps)
        DUNE_THROW(Exception, "Matrix is not orthogonal");
/** \brief Test orthogonal projection onto the tangent space at p
 */
template <class T, int N>
void testProjectionOntoTangentSpace(const OrthogonalMatrix<T,N>& p)
{
  std::vector<FieldMatrix<T,N,N> > testVectors;
  ValueFactory<FieldMatrix<T,N,N> >::get(testVectors);

  // Test each element in the list
  for (size_t i=0; i<testVectors.size(); i++) {

    // get projection
    FieldMatrix<T,N,N> projected = p.projectOntoTangentSpace(testVectors[i]);

    // Test whether the tangent vector is really tangent.
    // The tangent space at q consist of all matrices of the form q * (a skew matrix).
    // Hence we left-multiply by q^T and check whether the result is skew-symmetric.
    FieldMatrix<T,N,N> skewPart(0);
    for (int j=0; j<N; j++)
      for (int k=0; k<N; k++)
        for (int l=0; l<N; l++)
          skewPart[j][k] += p.data()[l][j] * projected[l][k];

    // is it skew?
    for (int j=0; j<N; j++)
      for (int k=0; k<=j; k++)
        if ( std::abs(skewPart[j][k] + skewPart[k][j]) > eps ) {

          std::cout << "matrix is not skew-symmetric\n" << skewPart << std::endl;
          abort();

        }
  }


}

template <class T, int N>
void test()
{
  std::cout << "Testing class " << className<OrthogonalMatrix<T,N> >() << std::endl;

  // Get set of orthogonal test matrices
  std::vector<OrthogonalMatrix<T,N> > testPoints;
  ValueFactory<OrthogonalMatrix<T,N> >::get(testPoints);

  int nTestPoints = testPoints.size();

  // Test each element in the list
  for (int i=0; i<nTestPoints; i++) {

    // Test whether the matrix really is orthogonal
    testOrthogonality(testPoints[i]);

    testProjectionOntoTangentSpace(testPoints[i]);

  }

  test<double,1>();
  test<double,2>();
  test<double,3>();
  std::cout << e.what() << std::endl;

}