|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | + |
| 3 | +import numpy as np |
| 4 | + |
| 5 | +import amrex.space3d as amr |
| 6 | + |
| 7 | + |
| 8 | +def test_smallmatrix(): |
| 9 | + m66 = amr.SmallMatrix_6x6_F_SI1_double( |
| 10 | + [ |
| 11 | + [1, 2, 3, 4, 5, 6], |
| 12 | + [7, 8, 9, 10, 11, 12], |
| 13 | + [13, 14, 15, 16, 17, 18], |
| 14 | + [19, 20, 21, 22, 23, 24], |
| 15 | + [25, 26, 27, 28, 29, 30], |
| 16 | + [31, 32, 33, 34, 35, 36], |
| 17 | + ] |
| 18 | + ) |
| 19 | + v = 1 |
| 20 | + for j in range(1, 7): |
| 21 | + for i in range(1, 7): |
| 22 | + assert m66[i, j] == v |
| 23 | + v += 1 |
| 24 | + |
| 25 | + |
| 26 | +def test_smallvector(): |
| 27 | + cv1 = amr.SmallMatrix_6x1_F_SI1_double() |
| 28 | + rv1 = amr.SmallMatrix_1x6_F_SI1_double() |
| 29 | + cv2 = amr.SmallMatrix_6x1_F_SI1_double([1, 2, 3, 4, 5, 6]) |
| 30 | + rv2 = amr.SmallMatrix_1x6_F_SI1_double([0, 10, 20, 30, 40, 50]) |
| 31 | + cv3 = amr.SmallMatrix_6x1_F_SI1_double([0, 1, 2, 3, 4, 5]) |
| 32 | + |
| 33 | + for j in range(1, 7): |
| 34 | + assert cv1[j] == 0.0 |
| 35 | + assert rv1[j] == 0.0 |
| 36 | + assert cv2[j] == j |
| 37 | + assert amr.almost_equal(rv2[j], (j - 1) * 10.0) |
| 38 | + assert amr.almost_equal(cv3[j], j - 1.0) |
| 39 | + |
| 40 | + |
| 41 | +def test_smallmatrix_zero(): |
| 42 | + zero = amr.SmallMatrix_6x6_F_SI1_double() |
| 43 | + |
| 44 | + # Check properties |
| 45 | + assert zero.size == 36 |
| 46 | + assert zero.row_size == 6 |
| 47 | + assert zero.column_size == 6 |
| 48 | + assert zero.order == "F" |
| 49 | + assert zero.starting_index == 1 |
| 50 | + |
| 51 | + # Check values |
| 52 | + assert zero.sum() == 0 |
| 53 | + assert zero.prod() == 0 |
| 54 | + assert zero.trace() == 0 |
| 55 | + |
| 56 | + # assign empty |
| 57 | + zeroc = amr.SmallMatrix_6x6_F_SI1_double(zero) |
| 58 | + |
| 59 | + # Check values |
| 60 | + assert zeroc.sum() == 0 |
| 61 | + assert zeroc.prod() == 0 |
| 62 | + assert zeroc.trace() == 0 |
| 63 | + |
| 64 | + # create zero |
| 65 | + zerov = amr.SmallMatrix_6x6_F_SI1_double.zero() |
| 66 | + |
| 67 | + # Check values |
| 68 | + assert zerov.sum() == 0 |
| 69 | + assert zerov.prod() == 0 |
| 70 | + assert zerov.trace() == 0 |
| 71 | + |
| 72 | + |
| 73 | +def test_smallmatrix_identity(): |
| 74 | + iden = amr.SmallMatrix_6x6_F_SI1_double.identity() |
| 75 | + |
| 76 | + # Check properties |
| 77 | + assert iden.size == 36 |
| 78 | + assert iden.row_size == 6 |
| 79 | + assert iden.column_size == 6 |
| 80 | + assert iden.order == "F" |
| 81 | + assert iden.starting_index == 1 |
| 82 | + |
| 83 | + # Check values |
| 84 | + assert iden.sum() == 6 |
| 85 | + assert iden.prod() == 0 |
| 86 | + assert iden.trace() == 6 |
| 87 | + |
| 88 | + |
| 89 | +def test_smallmatrix_from_np(): |
| 90 | + # from numpy (copy) |
| 91 | + x = np.ones( |
| 92 | + ( |
| 93 | + 6, |
| 94 | + 6, |
| 95 | + ) |
| 96 | + ) |
| 97 | + print(f"\nx: {x.__array_interface__} {x.dtype}") |
| 98 | + sm = amr.SmallMatrix_6x6_F_SI1_double(x) |
| 99 | + print(f"sm: {sm.__array_interface__}") |
| 100 | + print(sm) |
| 101 | + |
| 102 | + assert sm.sum() == 36 |
| 103 | + assert sm.prod() == 1 |
| 104 | + assert sm.trace() == 6 |
| 105 | + |
| 106 | + |
| 107 | +def test_smallmatrix_to_np(): |
| 108 | + iden = amr.SmallMatrix_6x6_F_SI1_double.identity() |
| 109 | + |
| 110 | + x = iden.to_numpy() |
| 111 | + print(x) |
| 112 | + |
| 113 | + assert x.sum() == 6 |
| 114 | + assert x.prod() == 0 |
| 115 | + assert x.trace() == 6 |
| 116 | + assert not x.flags["C_CONTIGUOUS"] |
| 117 | + assert x.flags["F_CONTIGUOUS"] |
| 118 | + |
| 119 | + |
| 120 | +def test_smallmatrix_smallvector(): |
| 121 | + v3 = amr.SmallMatrix_6x1_F_SI1_double.zero() |
| 122 | + v3[1] = 1.0 |
| 123 | + v3[2] = 2.0 |
| 124 | + v3[3] = 3.0 |
| 125 | + v3[4] = 4.0 |
| 126 | + v3[5] = 5.0 |
| 127 | + v3[6] = 6.0 |
| 128 | + m66 = amr.SmallMatrix_6x6_F_SI1_double.identity() |
| 129 | + r = m66 * v3 |
| 130 | + |
| 131 | + for i in range(1, 7): |
| 132 | + assert amr.almost_equal(r[i], v3[i]) |
| 133 | + |
| 134 | + |
| 135 | +def test_smallmatrix_smallmatrix(): |
| 136 | + A = amr.SmallMatrix_6x6_F_SI1_double( |
| 137 | + [ |
| 138 | + [1, 0, 1, 0, 1, 0], |
| 139 | + [2, 1, 1, 1, 1, 2], |
| 140 | + [0, 1, 1, 1, 1, 0], |
| 141 | + [1, 1, 2, 2, 1, 1], |
| 142 | + [2, 1, 2, 2, 1, 2], |
| 143 | + [0, 1, 1, 1, 1, 0], |
| 144 | + ] |
| 145 | + ) |
| 146 | + B = amr.SmallMatrix_6x6_F_SI1_double( |
| 147 | + [ |
| 148 | + [1, 2, 2, 2, 1, 1], |
| 149 | + [2, 3, 1, 1, 1, 3], |
| 150 | + [4, 2, 2, 2, 2, 0], |
| 151 | + [1, 4, 3, 2, 0, 1], |
| 152 | + [2, 3, 1, 0, 0, 2], |
| 153 | + [0, 1, 1, 1, 4, 0], |
| 154 | + ] |
| 155 | + ) |
| 156 | + C = amr.SmallMatrix_6x1_F_SI1_double([10, 8, 6, 4, 2, 0]) |
| 157 | + ABC = A * B * C |
| 158 | + assert ABC[1, 1] == 322 |
| 159 | + assert ABC[2, 1] == 252 |
| 160 | + assert ABC[3, 1] == 388 |
| 161 | + assert ABC[4, 1] == 330 |
| 162 | + assert ABC[5, 1] == 310 |
| 163 | + assert ABC[6, 1] == 264 |
| 164 | + |
| 165 | + # transpose |
| 166 | + CR = amr.SmallMatrix_1x6_F_SI1_double([10, 8, 6, 4, 2, 0]) |
| 167 | + ABC_T = A.T * B.transpose_in_place() * CR.T |
| 168 | + assert ABC_T[1, 1] == 178 |
| 169 | + assert ABC_T[2, 1] == 402 |
| 170 | + assert ABC_T[3, 1] == 254 |
| 171 | + assert ABC_T[4, 1] == 476 |
| 172 | + assert ABC_T[5, 1] == 550 |
| 173 | + assert ABC_T[6, 1] == 254 |
| 174 | + |
| 175 | + |
| 176 | +def test_smallmatrix_sum_prod(): |
| 177 | + m = amr.SmallMatrix_6x6_F_SI1_double() |
| 178 | + m.set_val(2.0) |
| 179 | + |
| 180 | + assert m.prod() == 2 ** (m.row_size * m.column_size) |
| 181 | + assert m.sum() == 2 * m.row_size * m.column_size |
| 182 | + |
| 183 | + |
| 184 | +def test_smallmatrix_trace(): |
| 185 | + m = amr.SmallMatrix_6x6_F_SI1_double( |
| 186 | + [ |
| 187 | + [1.0, 3.4, 4.5, 5.6, 6.7, 7.8], |
| 188 | + [1.3, 2.0, 3.4, 4.5, 5.6, 6.7], |
| 189 | + [1.3, 1.0, 3.0, 4.5, 5.6, 6.7], |
| 190 | + [1.3, 1.4, 4.5, 4.0, 5.6, 6.7], |
| 191 | + [1.3, 1.0, 4.5, 5.6, 5.0, 6.7], |
| 192 | + [1.3, 1.4, 3.0, 4.5, 6.7, 6.0], |
| 193 | + ] |
| 194 | + ) |
| 195 | + assert m.trace() == 1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 |
| 196 | + |
| 197 | + |
| 198 | +def test_smallmatrix_scalar(): |
| 199 | + A = amr.SmallMatrix_6x6_F_SI1_double( |
| 200 | + [ |
| 201 | + [+1.0, +2, +3, +4, +5, +6], |
| 202 | + [+7, +8, +9, +10, +11, +12], |
| 203 | + [+13, +14, +15, +16, +17, +18], |
| 204 | + [+19, +20, +21, +22, +23, +24], |
| 205 | + [+25, +26, +27, +28, +29, +30], |
| 206 | + [+31, +32, +33, +34, +35, +36], |
| 207 | + ] |
| 208 | + ) |
| 209 | + B = amr.SmallMatrix_6x6_F_SI1_double(A) |
| 210 | + B *= -1.0 |
| 211 | + |
| 212 | + # test matrix-scalar and scalar-matrix |
| 213 | + C = A * 2.0 + 2.0 * B |
| 214 | + assert np.allclose(C.to_numpy(), 0.0) |
| 215 | + |
| 216 | + # test unary- operator and point-wise minus |
| 217 | + D = -A - B |
| 218 | + assert np.allclose(D.to_numpy(), 0.0) |
| 219 | + |
| 220 | + # dot product |
| 221 | + E = amr.SmallMatrix_6x6_F_SI1_double() |
| 222 | + E.set_val(-1.0) |
| 223 | + assert A.dot(E) == -666 |
0 commit comments