Files
mfem/tests/unit/linalg/test_complex_operator.cpp
T
2020-03-09 15:36:41 -07:00

116 lines
2.5 KiB
C++

// Copyright (c) 2010-2020, Lawrence Livermore National Security, LLC. Produced
// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
// LICENSE and NOTICE for details. LLNL-CODE-806117.
//
// This file is part of the MFEM library. For more information and source code
// availability visit https://mfem.org.
//
// MFEM is free software; you can redistribute it and/or modify it under the
// terms of the BSD-3 license. We welcome feedback and contributions, see file
// CONTRIBUTING.md for details.
#include "mfem.hpp"
#include "catch.hpp"
using namespace mfem;
TEST_CASE("ComplexOperator Quaternion Tests", "[ComplexOperator]")
{
double tol = 1e-12;
// 2x2 Quaternion matrix data in column major order
double d1[4] = { 1.0, 0.0,
0.0, 1.0
};
double di[4] = { 1.0, 0.0,
0.0, -1.0
};
double dj[4] = { 0.0, -1.0,
1.0, 0.0
};
double dk[4] = { 0.0, 1.0,
1.0, 0.0
};
DenseMatrix q1Real(d1, 2, 2);
DenseMatrix qiImag(di, 2, 2);
DenseMatrix qjReal(dj, 2, 2);
DenseMatrix qkImag(dk, 2, 2);
ComplexOperator q1(&q1Real, NULL, false, false);
ComplexOperator qi(NULL, &qiImag, false, false);
ComplexOperator qj(&qjReal, NULL, false, false);
ComplexOperator qk(NULL, &qkImag, false, false);
Vector x(4); x.Randomize(); x /= x.Norml2();
Vector qix(4), qjx(4), qkx(4);
qi.Mult(x, qix);
qj.Mult(x, qjx);
qk.Mult(x, qkx);
SECTION("Identity")
{
Vector q1x(4);
q1.Mult(x, q1x);
q1x.Add(-1.0, x);
REQUIRE(q1x.Normlinf() < tol);
}
SECTION("i*j = k")
{
Vector qijx(4);
qi.Mult(qjx, qijx);
qijx.Add(-1.0, qkx);
REQUIRE(qijx.Normlinf() < tol);
}
SECTION("j*k = i")
{
Vector qjkx(4);
qj.Mult(qkx, qjkx);
qjkx.Add(-1.0, qix);
REQUIRE(qjkx.Normlinf() < tol);
}
SECTION("k*i = j")
{
Vector qkix(4);
qk.Mult(qix, qkix);
qkix.Add(-1.0, qjx);
REQUIRE(qkix.Normlinf() < tol);
}
SECTION("j*i = -k")
{
Vector qjix(4);
qj.Mult(qix, qjix);
qjix.Add(1.0, qkx);
REQUIRE(qjix.Normlinf() < tol);
}
SECTION("k*j = -i")
{
Vector qkjx(4);
qk.Mult(qjx, qkjx);
qkjx.Add(1.0, qix);
REQUIRE(qkjx.Normlinf() < tol);
}
SECTION("i*k = j")
{
Vector qikx(4);
qi.Mult(qkx, qikx);
qikx.Add(1.0, qjx);
REQUIRE(qikx.Normlinf() < tol);
}
}