6#ifndef GEMMI_FORMFACT_HPP_
7#define GEMMI_FORMFACT_HPP_
23 static_assert(std::numeric_limits<float>::is_iec559,
"float is not IEEE 754?");
25 float val = 12102203.1615614f * x + 1065353216.f;
27 std::int32_t
vali =
static_cast<std::int32_t
>(val);
28 std::int32_t
xu1 =
vali & 0x7F800000;
29 std::int32_t
xu2 = (
vali & 0x7FFFFF) | 0x3F800000;
31 std::memcpy(&a, &
xu1, 4);
32 std::memcpy(&b, &
xu2, 4);
33 return a * (0.509871020f + b * (0.312146713f + b * (0.166617139f + b *
34 (-2.190619930e-3f + b * 1.3555747234e-2f))));
38template<
int N,
typename Real>
44 for (
int i = 0;
i <
N; ++
i)
52 for (
int i = 0;
i <
N; ++
i) {
67 for (
int i = 0;
i <
N; ++
i)
69 for (
int i = 0;
i <
N; ++
i)
78 for (
int i = 0;
i <
N; ++
i)
79 tmp[
i] = std::max(
b[
i] * (
r *
r), -88.f);
80 for (
int i = 0;
i <
N; ++
i) {
90template<
int N,
typename Real>
97 for (
int i = 0;
i <
N; ++
i)
112 for (
int i = 0;
i <
N; ++
i)
113 tmp[
i] = std::max(
b[
i].r_u_r(
r), -88.f);
114 for (
int i = 0;
i <
N; ++
i)
120template<
typename Real>
124template<
int N,
int WithC,
typename Real>
138 for (
int i = 0;
i <
N; ++
i)
139 sf +=
a(
i) * std::exp(-
b(
i)*stol2);
147 for (
int i = 0;
i <
N; ++
i) {
158 for (
int i = 0;
i <
N; ++
i) {
175 std::exp(-4 *
pi2 *
B.inverse().r_u_r(
r));
176 for (
int i = 0;
i <
N; ++
i) {
179 std::exp(-4 *
pi2 *
Bb.inverse().r_u_r(
r));
189 for (
int i = 0;
i <
N; ++
i) {
Math utilities. 3D linear algebra.
constexpr float sq(float x)
float unsafe_expapprox(float x)
float calculate(const Vec3 &r_) const
Real calculate(const Vec3 &r) const
std::pair< float, float > calculate_with_derivative(float r) const
float calculate(float r2) const
Real calculate(Real r2) const
std::pair< Real, Real > calculate_with_derivative(Real r) const
void set_coefs(const std::array< Real, 2 *N+WithC > &c)
Real calculate_sf(Real stol2) const
ExpAnisoSum< N+WithC, Real > precalculate_density_aniso_b(const SMat33< Real > &B, Real addend=0) const
ExpSum< N+WithC, Real > precalculate_density_iso(Real B, Real addend=0) const
ExpAnisoSum< N+WithC, Real > precalculate_density_aniso_u(const SMat33< float > &U, Real addend=0) const
Real calculate_density_aniso(const Vec3 &r, const SMat33< float > &U) const
std::array< Real, 2 *N+WithC > coefs
Real calculate_density_iso(Real r2, Real B) const