blob: 7afc75d597e351ce724bd4e14ec5b6195d4e5dc2 [file] [log] [blame]
//#####################################################################
// Copyright 2003-2004, Geoffrey Irving.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class UPPER_TRIANGULAR_MATRIX_3X3
//#####################################################################
#ifndef __UPPER_TRIANGULAR_MATRIX_3X3__
#define __UPPER_TRIANGULAR_MATRIX_3X3__
#include "DIAGONAL_MATRIX_3X3.h"
namespace PhysBAM
{
template<class T>
class UPPER_TRIANGULAR_MATRIX_3X3
{
public:
T x11, x12, x22, x13, x23, x33;
UPPER_TRIANGULAR_MATRIX_3X3()
{
x11 = x12 = x22 = x13 = x23 = x33 = 0;
}
template<class T2>
UPPER_TRIANGULAR_MATRIX_3X3 (const UPPER_TRIANGULAR_MATRIX_3X3<T2>& matrix_input)
: x11 (matrix_input.x11), x12 (matrix_input.x12), x22 (matrix_input.x22), x13 (matrix_input.x13), x23 (matrix_input.x23), x33 (matrix_input.x33)
{}
UPPER_TRIANGULAR_MATRIX_3X3 (const T x11_input, const T x12_input, const T x22_input, const T x13_input, const T x23_input, const T x33_input)
: x11 (x11_input), x12 (x12_input), x22 (x22_input), x13 (x13_input), x23 (x23_input), x33 (x33_input)
{}
UPPER_TRIANGULAR_MATRIX_3X3<T> operator-() const
{
return UPPER_TRIANGULAR_MATRIX_3X3<T> (-x11, -x12, -x22, -x13, -x23, -x33);
}
UPPER_TRIANGULAR_MATRIX_3X3<T>& operator*= (const UPPER_TRIANGULAR_MATRIX_3X3<T>& A)
{
return *this = *this * A;
}
UPPER_TRIANGULAR_MATRIX_3X3<T>& operator*= (const T a)
{
x11 *= a;
x12 *= a;
x22 *= a;
x13 *= a;
x23 *= a;
x33 *= a;
return *this;
}
UPPER_TRIANGULAR_MATRIX_3X3<T>& operator/= (const T a)
{
assert (a != 0);
T s = 1 / a;
x11 *= s;
x12 *= s;
x22 *= s;
x13 *= s;
x23 *= s;
x33 *= s;
return *this;
}
UPPER_TRIANGULAR_MATRIX_3X3<T> operator* (const T a) const
{
return UPPER_TRIANGULAR_MATRIX_3X3<T> (a * x11, a * x12, a * x22, a * x13, a * x23, a * x33);
}
UPPER_TRIANGULAR_MATRIX_3X3<T> operator/ (const T a) const
{
assert (a != 0);
T s = 1 / a;
return UPPER_TRIANGULAR_MATRIX_3X3<T> (s * x11, s * x12, s * x22, s * x13, s * x23, s * x33);
}
UPPER_TRIANGULAR_MATRIX_3X3<T> operator* (const UPPER_TRIANGULAR_MATRIX_3X3<T>& A) const
{
return UPPER_TRIANGULAR_MATRIX_3X3<T> (x11 * A.x11, x11 * A.x12 + x12 * A.x22, x22 * A.x22, x11 * A.x13 + x12 * A.x23 + x13 * A.x33, x22 * A.x23 + x23 * A.x33, x33 * A.x33);
}
UPPER_TRIANGULAR_MATRIX_3X3<T> operator* (const DIAGONAL_MATRIX_3X3<T>& A) const
{
return UPPER_TRIANGULAR_MATRIX_3X3<T> (x11 * A.x11, x12 * A.x22, x22 * A.x22, x13 * A.x33, x23 * A.x33, x33 * A.x33);
}
T Determinant() const
{
return x11 * x22 * x33;
}
T Trace() const
{
return x11 + x22 + x33;
}
UPPER_TRIANGULAR_MATRIX_3X3<T> Inverse() const
{
T determinant = x11 * x22 * x33;
assert (determinant != 0);
T s = 1 / determinant;
return s * UPPER_TRIANGULAR_MATRIX_3X3<T> (x22 * x33, -x12 * x33, x11 * x33, x12 * x23 - x22 * x13, -x11 * x23, x11 * x22);
}
static UPPER_TRIANGULAR_MATRIX_3X3<T> Identity_Matrix()
{
return UPPER_TRIANGULAR_MATRIX_3X3<T> (1, 0, 1, 0, 0, 1);
}
T Max_Abs_Element() const
{
return max (fabs (x11), fabs (x12), fabs (x22), fabs (x13), fabs (x23), fabs (x33));
}
T Tetrahedron_Minimum_Altitude() const
{
return MATRIX_3X3<T> (*this).Tetrahedron_Minimum_Altitude();
}
//#####################################################################
};
// global functions
template<class T>
inline UPPER_TRIANGULAR_MATRIX_3X3<T> operator* (const T a, const UPPER_TRIANGULAR_MATRIX_3X3<T>& A)
{
return A * a;
}
template<class T>
inline UPPER_TRIANGULAR_MATRIX_3X3<T> operator* (const DIAGONAL_MATRIX_3X3<T>& A, const UPPER_TRIANGULAR_MATRIX_3X3<T>& B)
{
return UPPER_TRIANGULAR_MATRIX_3X3<T> (A.x11 * B.x11, A.x11 * B.x12, A.x22 * B.x22, A.x11 * B.x13, A.x22 * B.x23, A.x33 * B.x33);
}
template<class T>
inline std::ostream& operator<< (std::ostream& output_stream, const UPPER_TRIANGULAR_MATRIX_3X3<T>& A)
{
return output_stream << A.x11 << " " << A.x12 << " " << A.x13 << "\n0 " << A.x22 << " " << A.x23 << "\n0 0 " << A.x33 << "\n";
}
//#####################################################################
}
#endif