-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_jac_benchmark.py
116 lines (98 loc) · 3.28 KB
/
test_jac_benchmark.py
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import numdifftools as nd
import numpy as np
import pytest
import time
from splitfxm.domain import Domain
from splitfxm.schemes import FDSchemes
from splitfxm.simulation import Simulation
from splitfxm.schemes import default_scheme
from splitfxm.models.advection_diffusion import AdvectionDiffusion
def test_dense_sparse_jac_comparison():
method = 'FDM'
m = AdvectionDiffusion(c=0.2, nu=0.001, method=method)
d = Domain.from_size(250, 1, 1, ["u", "v", "w"])
ics = {"u": "gaussian", "v": "rarefaction"}
bcs = {
"u": {
"left": "periodic",
"right": "periodic"
},
"v": {
"left": {"dirichlet": 3},
"right": {"dirichlet": 4}
},
"w": {
"left": {"dirichlet": 2},
"right": "periodic"
}
}
s = Simulation(d, m, ics, bcs, default_scheme(method))
split = True
split_loc = 1
# Construct initial vector
x0 = d.listify_interior(split, split_loc)
# Some output
print('\n' + '*' * 10)
print('SYMMETRIC STENCIL')
print('*' * 10)
print('Computing...')
# Construct dense Jacobian
def _f(u): return s.get_residuals_from_list(u, split, split_loc)
start_time = time.perf_counter()
jac_dense = nd.Jacobian(_f, method='forward', step=1e-8)(x0)
dense_time = time.perf_counter() - start_time
print(f'Dense Jacobian took {dense_time} s')
# Construct sparse Jacobian
start_time = time.perf_counter()
jac_sparse = s.jacobian(x0, split, split_loc)
sparse_time = time.perf_counter() - start_time
print(f'Sparse Jacobian took {sparse_time} s')
# Show timing results in prompt in pytest
assert sparse_time < dense_time
assert np.allclose(jac_sparse.toarray(), jac_dense, atol=1e-7)
def test_dense_sparse_jac_comparison_asym():
method = 'FDM'
m = AdvectionDiffusion(c=0.2, nu=0.001, method=method)
d = Domain.from_size(250, 1, 2, ["u", "v", "w"])
ics = {"u": "gaussian", "v": "rarefaction"}
bcs = {
"u": {
"left": "periodic",
"right": "periodic"
},
"v": {
"left": {"dirichlet": 3},
"right": {"dirichlet": 4}
},
"w": {
"left": {"dirichlet": 2},
"right": "periodic"
}
}
s = Simulation(d, m, ics, bcs, FDSchemes.RIGHT_BIAS)
split = True
split_loc = 1
# Construct initial vector
x0 = d.listify_interior(split, split_loc)
# Some output
print('\n' + '*' * 10)
print('ASYMMETRIC STENCIL')
print('*' * 10)
print('Computing...')
# Construct dense Jacobian
def _f(u): return s.get_residuals_from_list(u, split, split_loc)
start_time = time.perf_counter()
jac_dense = nd.Jacobian(_f, method='forward', step=1e-8)(x0)
dense_time = time.perf_counter() - start_time
print(f'Dense Jacobian took {dense_time} s')
# Construct sparse Jacobian
start_time = time.perf_counter()
jac_sparse = s.jacobian(x0, split, split_loc)
sparse_time = time.perf_counter() - start_time
print(f'Sparse Jacobian took {sparse_time} s')
# Show timing results in prompt in pytest
assert sparse_time < dense_time
assert np.allclose(jac_sparse.toarray(), jac_dense, atol=1e-7)
# Run the tests
if __name__ == "__main__":
pytest.main()