core 1.5.0
Shared MPI block decomposition, asynchronous ghost-layer exchange, SDF geometry, load balancing (header-only C++20)
Loading...
Searching...
No Matches
peclet::core::geom::body_detail Namespace Reference

Functions

template<class Real , class Phi >
void interiorMoments (const Phi &phi, Vec3< Real > p0, Vec3< Real > d, int nseg, Real &m0, Real &m1, Real &m2)
 Moments of the NEGATIVE set {phi < 0} along p0 + s*d, s in [0,1], in the PARAMETER s: m0 = ∫ 1 ds, m1 = ∫ s ds, m2 = ∫ s² ds over the interior runs.
 
template<class Real >
void eigSym3 (const Real A[3][3], Real w[3], Real V[3][3])
 Jacobi eigensolver for a symmetric 3x3: A = V diag(w) V^T, V orthonormal columns.
 
template<class Real >
void resolveDegenerateFrame (Real w[3], Real V[3][3], Real relTol=Real(1e-2))
 Within each cluster of (near-)equal eigenvalues, rotate the eigenbasis onto the input axes with the largest projection into that subspace (orthogonal Procrustes on the k x k projection).
 
template<class Real >
Quat< Real > quatFromRotation (const Real R[3][3])
 Rotation matrix (columns orthonormal, det +1) -> quaternion (x, y, z, w), Shepperd's method.
 

Function Documentation

◆ interiorMoments()

template<class Real , class Phi >
void peclet::core::geom::body_detail::interiorMoments ( const Phi &  phi,
Vec3< Real >  p0,
Vec3< Real >  d,
int  nseg,
Real &  m0,
Real &  m1,
Real &  m2 
)

Moments of the NEGATIVE set {phi < 0} along p0 + s*d, s in [0,1], in the PARAMETER s: m0 = ∫ 1 ds, m1 = ∫ s ds, m2 = ∫ s² ds over the interior runs.

Same bracketed bisection as quadrature.hpp's positiveLength (an initial nseg subdivision brackets, 40 bisections refine to ~1 ulp of the parameter); the per-run integrals are analytic. NOTE the sign convention: bodies are the interior (phi < 0), where the aperture code measured the fluid (phi > 0).

Definition at line 66 of file body_properties.hpp.

◆ eigSym3()

template<class Real >
void peclet::core::geom::body_detail::eigSym3 ( const Real  A[3][3],
Real  w[3],
Real  V[3][3] 
)

Jacobi eigensolver for a symmetric 3x3: A = V diag(w) V^T, V orthonormal columns.

Small, exact enough (50 sweeps to machine precision), no dependencies.

Definition at line 113 of file body_properties.hpp.

Referenced by resolveDegenerateFrame().

◆ resolveDegenerateFrame()

template<class Real >
void peclet::core::geom::body_detail::resolveDegenerateFrame ( Real  w[3],
Real  V[3][3],
Real  relTol = Real(1e-2) 
)

Within each cluster of (near-)equal eigenvalues, rotate the eigenbasis onto the input axes with the largest projection into that subspace (orthogonal Procrustes on the k x k projection).

See the header comment; a fully degenerate tensor yields exactly the identity.

Definition at line 165 of file body_properties.hpp.

References eigSym3(), and peclet::core::scale().

◆ quatFromRotation()

template<class Real >
Quat< Real > peclet::core::geom::body_detail::quatFromRotation ( const Real  R[3][3])

Rotation matrix (columns orthonormal, det +1) -> quaternion (x, y, z, w), Shepperd's method.

Definition at line 240 of file body_properties.hpp.