Skip to content
Snippets Groups Projects
Select Git revision
  • 31b1cfd46f0bd31348872b93676940db86fa73b4
  • develop default protected
  • feature/gmsh-reader
  • origin/stage/bouguettaia
  • feature/kinetic-schemes
  • feature/reconstruction
  • feature/local-dt-fsi
  • feature/composite-scheme-sources
  • feature/composite-scheme-other-fluxes
  • feature/serraille
  • feature/variational-hydro
  • feature/composite-scheme
  • hyperplastic
  • feature/polynomials
  • feature/gks
  • feature/implicit-solver-o2
  • feature/coupling_module
  • feature/implicit-solver
  • feature/merge-local-dt-fsi
  • master protected
  • feature/escobar-smoother
  • v0.5.0 protected
  • v0.4.1 protected
  • v0.4.0 protected
  • v0.3.0 protected
  • v0.2.0 protected
  • v0.1.0 protected
  • Kidder
  • v0.0.4 protected
  • v0.0.3 protected
  • v0.0.2 protected
  • v0 protected
  • v0.0.1 protected
33 results

TriangleTransformation.hpp

Blame
  • TriangleTransformation.hpp 1.95 KiB
    #ifndef TRIANGLE_TRANSFORMATION_HPP
    #define TRIANGLE_TRANSFORMATION_HPP
    
    #include <algebra/TinyMatrix.hpp>
    #include <algebra/TinyVector.hpp>
    
    template <size_t GivenDimension>
    class TriangleTransformation;
    
    template <>
    class TriangleTransformation<2>
    {
     public:
      constexpr static size_t Dimension = 2;
    
     private:
      TinyMatrix<Dimension> m_jacobian;
      TinyVector<Dimension> m_shift;
      double m_jacobian_determinant;
    
     public:
      PUGS_INLINE
      TinyVector<Dimension>
      operator()(const TinyVector<2>& x) const
      {
        return m_jacobian * x + m_shift;
      }
    
      double
      jacobianDeterminant() const
      {
        return m_jacobian_determinant;
      }
    
      PUGS_INLINE
      TriangleTransformation(const TinyVector<Dimension>& a, const TinyVector<Dimension>& b, const TinyVector<Dimension>& c)
      {
        for (size_t i = 0; i < Dimension; ++i) {
          m_jacobian(i, 0) = b[i] - a[i];
          m_jacobian(i, 1) = c[i] - a[i];
        }
    
        m_shift = a;
    
        m_jacobian_determinant = det(m_jacobian);
      }
    
      ~TriangleTransformation() = default;
    };
    
    template <size_t GivenDimension>
    class TriangleTransformation
    {
     public:
      constexpr static size_t Dimension = GivenDimension;
      static_assert(Dimension == 3, "Triangle transformation is defined in dimension 2 or 3");
    
     private:
      TinyMatrix<Dimension, 2> m_jacobian;
      TinyVector<Dimension> m_shift;
      double m_area_variation_norm;
    
     public:
      PUGS_INLINE
      TinyVector<Dimension>
      operator()(const TinyVector<2>& x) const
      {
        return m_jacobian * x + m_shift;
      }
    
      double
      areaVariationNorm() const
      {
        return m_area_variation_norm;
      }
    
      PUGS_INLINE
      TriangleTransformation(const TinyVector<Dimension>& a, const TinyVector<Dimension>& b, const TinyVector<Dimension>& c)
      {
        for (size_t i = 0; i < Dimension; ++i) {
          m_jacobian(i, 0) = b[i] - a[i];
          m_jacobian(i, 1) = c[i] - a[i];
        }
    
        m_shift = a;
    
        m_area_variation_norm = l2Norm(crossProduct(b - a, c - a));
      }
    
      ~TriangleTransformation() = default;
    };
    
    #endif   // TRIANGLE_TRANSFORMATION_HPP