Blender V4.3
BLI_math_solvers_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "testing/testing.h"
6
7#include "BLI_math_solvers.h"
8
9TEST(math_solvers, Tridiagonal1)
10{
11 const float a[1] = {1}; // ignored
12 const float b[1] = {2};
13 const float c[1] = {1}; // ignored
14 const float d[1] = {4};
15 float x[1];
16
17 EXPECT_TRUE(BLI_tridiagonal_solve(a, b, c, d, x, 1));
18 EXPECT_FLOAT_EQ(x[0], 2);
19}
20
21TEST(math_solvers, Tridiagonal3)
22{
23 const float a[3] = {1, 2, 3}; // 1 ignored
24 const float b[3] = {4, 5, 6};
25 const float c[3] = {7, 8, 9}; // 9 ignored
26 const float d[3] = {18, 36, 24};
27 float x[3];
28
29 EXPECT_TRUE(BLI_tridiagonal_solve(a, b, c, d, x, 3));
30 EXPECT_FLOAT_EQ(x[0], 1);
31 EXPECT_FLOAT_EQ(x[1], 2);
32 EXPECT_FLOAT_EQ(x[2], 3);
33}
34
35TEST(math_solvers, CyclicTridiagonal1)
36{
37 const float a[1] = {1};
38 const float b[1] = {2};
39 const float c[1] = {1};
40 const float d[1] = {4};
41 float x[1];
42
43 EXPECT_TRUE(BLI_tridiagonal_solve_cyclic(a, b, c, d, x, 1));
44 EXPECT_FLOAT_EQ(x[0], 1);
45}
46
47TEST(math_solvers, CyclicTridiagonal2)
48{
49 const float a[2] = {1, 2};
50 const float b[2] = {3, 4};
51 const float c[2] = {5, 6};
52 const float d[2] = {15, 16};
53 float x[2];
54
55 EXPECT_TRUE(BLI_tridiagonal_solve_cyclic(a, b, c, d, x, 2));
56 EXPECT_FLOAT_EQ(x[0], 1);
57 EXPECT_FLOAT_EQ(x[1], 2);
58}
59
60TEST(math_solvers, CyclicTridiagonal3)
61{
62 const float a[3] = {1, 2, 3};
63 const float b[3] = {4, 5, 6};
64 const float c[3] = {7, 8, 9};
65 const float d[3] = {21, 36, 33};
66 float x[3];
67
68 EXPECT_TRUE(BLI_tridiagonal_solve_cyclic(a, b, c, d, x, 3));
69 EXPECT_FLOAT_EQ(x[0], 1);
70 EXPECT_FLOAT_EQ(x[1], 2);
71 EXPECT_FLOAT_EQ(x[2], 3);
72}
bool BLI_tridiagonal_solve_cyclic(const float *a, const float *b, const float *c, const float *d, float *r_x, int count)
Solve a possibly cyclic tridiagonal system using the Sherman-Morrison formula.
bool BLI_tridiagonal_solve(const float *a, const float *b, const float *c, const float *d, float *r_x, int count)
Solve a tridiagonal system of equations:
TEST(math_solvers, Tridiagonal1)
local_group_size(16, 16) .push_constant(Type b