File: FormfactorSymmetryTest.cpp

package info (click to toggle)
bornagain 23.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 103,936 kB
  • sloc: cpp: 423,131; python: 40,997; javascript: 11,167; awk: 630; sh: 318; ruby: 173; xml: 130; makefile: 51; ansic: 24
file content (45 lines) | stat: -rw-r--r-- 1,494 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <numbers>

using std::numbers::pi;

#include "Sample/HardParticle/HardParticles.h"
#include "Tests/GTestWrapper/google_test.h"
#include "Tests/Unit/Numeric/MultiQTest.h"
#include <ff/Face.h> // for diagnostic

//! Check that form factors are invariant when q is transformed according to particle symmetry.

class FFSymmetryTest : public testing::Test {
protected:
    void run_test(IFormfactor* ff, std::function<C3(const C3&)> trafo, double eps, double qmag1,
                  double qmag2)
    {
        int failures = formfactorTest::run_test_for_many_q(
            [&](C3 q) -> complex_t { return ff->formfactor(q); },
            [&](C3 q) -> complex_t { return ff->formfactor(trafo(q)); }, qmag1, qmag2, eps);
        EXPECT_EQ(failures, 0);
    }
};

//*********** spheroids ***************

TEST_F(FFSymmetryTest, HemiEllipsoid)
{
    HemiEllipsoid ff(.53, .78, 1.3);
    run_test(&ff, [](const C3& q) -> C3 { return C3(-q.x(), q.y(), q.z()); }, 1e-12, 1e-99, 2e2);
    run_test(&ff, [](const C3& q) -> C3 { return C3(q.x(), -q.y(), q.z()); }, 1e-12, 1e-99, 2e2);
}

TEST_F(FFSymmetryTest, SphericalSegment)
{
    SphericalSegment ff(.79, 0, 1.24);
    run_test(&ff, [](const C3& q) -> C3 { return q.rotatedZ(pi / 3.13698); }, 8e-13, 1e-99, 2e2);
}

TEST_F(FFSymmetryTest, Spheroid)
{
    Spheroid ff(.73, .18);
    run_test(&ff, [](const C3& q) -> C3 { return q.rotatedZ(.123); }, 1e-12, 1e-99, 2e2);
}

// ****** TODO: tests that do not pass for the full q range *********