feectools 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- feectools/__init__.py +0 -0
- feectools/accelerate/__init__.py +0 -0
- feectools/accelerate/accelerate.py +220 -0
- feectools/accelerate/compile_psydac.mk +52 -0
- feectools/api/__init__.py +0 -0
- feectools/api/essential_bc.py +122 -0
- feectools/api/fem_bilinear_form.py +2226 -0
- feectools/api/fem_common.py +286 -0
- feectools/api/fem_sum_form.py +123 -0
- feectools/api/settings.py +82 -0
- feectools/core/__init__.py +11 -0
- feectools/core/bsplines.py +1107 -0
- feectools/core/bsplines_kernels.py +1349 -0
- feectools/core/field_evaluation_kernels.py +5015 -0
- feectools/core/tests/__init__.py +0 -0
- feectools/core/tests/test_bsplines.py +263 -0
- feectools/core/tests/test_bsplines_kernel.py +40 -0
- feectools/core/tests/test_bsplines_pyccel.py +752 -0
- feectools/ddm/__init__.py +3 -0
- feectools/ddm/basic.py +78 -0
- feectools/ddm/blocking_data_exchanger.py +348 -0
- feectools/ddm/cart.py +1835 -0
- feectools/ddm/interface_data_exchanger.py +122 -0
- feectools/ddm/mpi.py +109 -0
- feectools/ddm/nonblocking_data_exchanger.py +331 -0
- feectools/ddm/partition.py +207 -0
- feectools/ddm/petsc.py +112 -0
- feectools/ddm/tests/__init__.py +0 -0
- feectools/ddm/tests/test_cart_1d.py +138 -0
- feectools/ddm/tests/test_cart_2d.py +164 -0
- feectools/ddm/tests/test_cart_3d.py +158 -0
- feectools/ddm/tests/test_multicart_2d.py +173 -0
- feectools/ddm/tests/test_partition.py +124 -0
- feectools/ddm/utilities.py +24 -0
- feectools/feec/__init__.py +0 -0
- feectools/feec/derivatives.py +780 -0
- feectools/feec/dof_kernels.py +210 -0
- feectools/feec/global_geometric_projectors.py +1073 -0
- feectools/feec/hodge.py +148 -0
- feectools/fem/__init__.py +0 -0
- feectools/fem/basic.py +465 -0
- feectools/fem/grid.py +181 -0
- feectools/fem/partitioning.py +344 -0
- feectools/fem/projectors.py +160 -0
- feectools/fem/splines.py +559 -0
- feectools/fem/tensor.py +1393 -0
- feectools/fem/tests/__init__.py +0 -0
- feectools/fem/tests/analytical_profiles_1d.py +100 -0
- feectools/fem/tests/analytical_profiles_base.py +34 -0
- feectools/fem/tests/splines_error_bounds.py +155 -0
- feectools/fem/tests/test_spline_histopolation.py +120 -0
- feectools/fem/tests/test_spline_interpolation.py +182 -0
- feectools/fem/tests/test_splines.py +184 -0
- feectools/fem/tests/test_splines_par.py +46 -0
- feectools/fem/tests/test_vector_spaces.py +150 -0
- feectools/fem/tests/utilities.py +47 -0
- feectools/fem/vector.py +729 -0
- feectools/linalg/__init__.py +0 -0
- feectools/linalg/basic.py +1386 -0
- feectools/linalg/block.py +1451 -0
- feectools/linalg/direct_solvers.py +201 -0
- feectools/linalg/fft.py +258 -0
- feectools/linalg/kernels/__init__.py +0 -0
- feectools/linalg/kernels/axpy_kernels.py +57 -0
- feectools/linalg/kernels/inner_kernels.py +100 -0
- feectools/linalg/kernels/matvec_kernels.py +206 -0
- feectools/linalg/kernels/stencil2IJV_kernels.py +227 -0
- feectools/linalg/kernels/stencil2coo_kernels.py +179 -0
- feectools/linalg/kernels/transpose_kernels.py +263 -0
- feectools/linalg/kron.py +911 -0
- feectools/linalg/solvers.py +1914 -0
- feectools/linalg/sparse.py +114 -0
- feectools/linalg/stencil.py +2923 -0
- feectools/linalg/stencil_dot_kernels.py +317 -0
- feectools/linalg/stencil_transpose_kernels.py +372 -0
- feectools/linalg/tests/__init__.py +0 -0
- feectools/linalg/tests/test_block.py +1588 -0
- feectools/linalg/tests/test_fft.py +106 -0
- feectools/linalg/tests/test_kron_stencil_matrix.py +114 -0
- feectools/linalg/tests/test_linalg.py +1065 -0
- feectools/linalg/tests/test_matrix_free.py +128 -0
- feectools/linalg/tests/test_solvers.py +213 -0
- feectools/linalg/tests/test_stencil_interface_matrix.py +379 -0
- feectools/linalg/tests/test_stencil_vector.py +1036 -0
- feectools/linalg/tests/test_stencil_vector_space.py +440 -0
- feectools/linalg/topetsc.py +522 -0
- feectools/linalg/utilities.py +200 -0
- feectools/utilities/__init__.py +0 -0
- feectools/utilities/quadratures.py +113 -0
- feectools/utilities/utils.py +166 -0
- feectools/version.py +1 -0
- feectools-0.1.0.dist-info/METADATA +66 -0
- feectools-0.1.0.dist-info/RECORD +98 -0
- feectools-0.1.0.dist-info/WHEEL +5 -0
- feectools-0.1.0.dist-info/entry_points.txt +3 -0
- feectools-0.1.0.dist-info/licenses/AUTHORS +22 -0
- feectools-0.1.0.dist-info/licenses/LICENSE +21 -0
- feectools-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
from typing import TypeVar
|
|
2
|
+
|
|
3
|
+
T = TypeVar('T', float, complex)
|
|
4
|
+
|
|
5
|
+
def matvec_1d(mat00:'T[:,:]', x0:'T[:]', out0:'T[:]', starts: 'int64[:]', nrows: 'int64[:]', nrows_extra: 'int64[:]',
|
|
6
|
+
dm:'int64[:]', cm:'int64[:]', pad_imp:'int64[:]', ndiags:'int64[:]', gpads: 'int64[:]'):
|
|
7
|
+
|
|
8
|
+
nrows1 = nrows[0]
|
|
9
|
+
dstart1 = starts[0]
|
|
10
|
+
dshift1 = dm[0]
|
|
11
|
+
cshift1 = cm[0]
|
|
12
|
+
ndiags1 = ndiags[0]
|
|
13
|
+
dpads1 = gpads[0]
|
|
14
|
+
pad_imp1 = pad_imp[0]
|
|
15
|
+
|
|
16
|
+
pxm1 = dpads1 * cshift1
|
|
17
|
+
|
|
18
|
+
start_impact1 = dstart1 % dshift1
|
|
19
|
+
|
|
20
|
+
v00 = mat00[0, 0] - mat00[0, 0] + x0[0] - x0[0]
|
|
21
|
+
|
|
22
|
+
for i1 in range(nrows1):
|
|
23
|
+
v00 *= 0
|
|
24
|
+
x_min1 = pad_imp1 + (i1 + start_impact1) // cshift1 * dshift1
|
|
25
|
+
for k1 in range(ndiags1):
|
|
26
|
+
v00 += mat00[pxm1 + i1, k1] * x0[k1 + x_min1]
|
|
27
|
+
out0[pxm1 + i1] = v00
|
|
28
|
+
|
|
29
|
+
if 0 < nrows_extra[0]:
|
|
30
|
+
pxm1 += nrows1
|
|
31
|
+
start_impact1 += nrows1
|
|
32
|
+
for i1 in range(nrows_extra[0]):
|
|
33
|
+
v00 *= 0
|
|
34
|
+
x_min1 = pad_imp1 + (i1 + start_impact1) // cshift1 * dshift1
|
|
35
|
+
for k1 in range(ndiags1 - i1 - 1):
|
|
36
|
+
v00 += mat00[pxm1 + i1, k1] * x0[x_min1 + k1]
|
|
37
|
+
out0[pxm1 + i1] = v00
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def matvec_2d(mat00:'T[:,:,:,:]', x0:'T[:,:]', out0:'T[:,:]', starts:'int64[:]', nrows:'int64[:]', nrows_extra:'int64[:]',
|
|
42
|
+
dm:'int64[:]', cm:'int64[:]', pad_imp:'int64[:]', ndiags:'int64[:]', gpads: 'int64[:]'):
|
|
43
|
+
|
|
44
|
+
nrows1 = nrows[0]
|
|
45
|
+
nrows2 = nrows[1]
|
|
46
|
+
dstart1 = starts[0]
|
|
47
|
+
dstart2 = starts[1]
|
|
48
|
+
dshift1 = dm[0]
|
|
49
|
+
dshift2 = dm[1]
|
|
50
|
+
cshift1 = cm[0]
|
|
51
|
+
cshift2 = cm[1]
|
|
52
|
+
ndiags1 = ndiags[0]
|
|
53
|
+
ndiags2 = ndiags[1]
|
|
54
|
+
dpads1 = gpads[0]
|
|
55
|
+
dpads2 = gpads[1]
|
|
56
|
+
pad_imp1 = pad_imp[0]
|
|
57
|
+
pad_imp2 = pad_imp[1]
|
|
58
|
+
|
|
59
|
+
pxm1 = dpads1 * cshift1
|
|
60
|
+
pxm2 = dpads2 * cshift2
|
|
61
|
+
|
|
62
|
+
start_impact1 = dstart1 % dshift1
|
|
63
|
+
start_impact2 = dstart2 % dshift2
|
|
64
|
+
|
|
65
|
+
v00 = mat00[0, 0, 0, 0] - mat00[0, 0, 0, 0] + x0[0, 0] - x0[0, 0]
|
|
66
|
+
|
|
67
|
+
for i1 in range(nrows1):
|
|
68
|
+
for i2 in range(nrows2):
|
|
69
|
+
v00 *= 0
|
|
70
|
+
x_min1 = pad_imp1 + (i1 + start_impact1) // cshift1 * dshift1
|
|
71
|
+
x_min2 = pad_imp2 + (i2 + start_impact2) // cshift2 * dshift2
|
|
72
|
+
for k1 in range(ndiags1):
|
|
73
|
+
for k2 in range(ndiags2):
|
|
74
|
+
v00 += mat00[pxm1 + i1, pxm2 + i2, k1, k2] * x0[k1 + x_min1, k2 + x_min2]
|
|
75
|
+
out0[pxm1 + i1, pxm2 + i2] = v00
|
|
76
|
+
|
|
77
|
+
if 0 < nrows_extra[0]:
|
|
78
|
+
pxm1 += nrows1
|
|
79
|
+
start_impact1 += nrows1
|
|
80
|
+
for i1 in range(nrows_extra[0]):
|
|
81
|
+
for i2 in range(nrows2):
|
|
82
|
+
v00 *= 0
|
|
83
|
+
x_min1 = pad_imp1 + (i1 + start_impact1) // cshift1 * dshift1
|
|
84
|
+
x_min2 = pad_imp2 + (i2 + start_impact2) // cshift2 * dshift2
|
|
85
|
+
for k1 in range(ndiags1 - i1 - 1):
|
|
86
|
+
for k2 in range(ndiags2):
|
|
87
|
+
v00 += mat00[pxm1 + i1, pxm2 + i2, k1, k2] * x0[x_min1 + k1, x_min2 + k2]
|
|
88
|
+
out0[pxm1 + i1, pxm2 + i2] = v00
|
|
89
|
+
|
|
90
|
+
if 0 < nrows_extra[1]:
|
|
91
|
+
pxm1 = dpads1 * cshift1
|
|
92
|
+
start_impact1 = dstart1 % dshift1
|
|
93
|
+
pxm2 += nrows2
|
|
94
|
+
start_impact2 += nrows2
|
|
95
|
+
for i1 in range(nrows1 + nrows_extra[0]):
|
|
96
|
+
for i2 in range(nrows_extra[1]):
|
|
97
|
+
v00 *= 0
|
|
98
|
+
x_min1 = pad_imp1 + (i1 + start_impact1) // cshift1 * dshift1
|
|
99
|
+
x_min2 = pad_imp2 + (i2 + start_impact2) // cshift2 * dshift2
|
|
100
|
+
for k1 in range(ndiags1 - max(0, i1 + 1 - nrows1)):
|
|
101
|
+
for k2 in range(ndiags2 - i2 - 1):
|
|
102
|
+
v00 += mat00[pxm1 + i1, pxm2 + i2, k1, k2] * x0[x_min1 + k1, x_min2 + k2]
|
|
103
|
+
out0[pxm1 + i1, pxm2 + i2] = v00
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def matvec_3d(mat00:'T[:,:,:,:,:,:]', x0:'T[:,:,:]', out0:'T[:,:,:]', starts:'int64[:]', nrows:'int64[:]', nrows_extra:'int64[:]',
|
|
107
|
+
dm:'int64[:]', cm:'int64[:]', pad_imp:'int64[:]', ndiags:'int64[:]', gpads: 'int64[:]'):
|
|
108
|
+
|
|
109
|
+
nrows1 = nrows[0]
|
|
110
|
+
nrows2 = nrows[1]
|
|
111
|
+
nrows3 = nrows[2]
|
|
112
|
+
dstart1 = starts[0]
|
|
113
|
+
dstart2 = starts[1]
|
|
114
|
+
dstart3 = starts[2]
|
|
115
|
+
dshift1 = dm[0]
|
|
116
|
+
dshift2 = dm[1]
|
|
117
|
+
dshift3 = dm[2]
|
|
118
|
+
cshift1 = cm[0]
|
|
119
|
+
cshift2 = cm[1]
|
|
120
|
+
cshift3 = cm[2]
|
|
121
|
+
ndiags1 = ndiags[0]
|
|
122
|
+
ndiags2 = ndiags[1]
|
|
123
|
+
ndiags3 = ndiags[2]
|
|
124
|
+
dpads1 = gpads[0]
|
|
125
|
+
dpads2 = gpads[1]
|
|
126
|
+
dpads3 = gpads[2]
|
|
127
|
+
pad_imp1 = pad_imp[0]
|
|
128
|
+
pad_imp2 = pad_imp[1]
|
|
129
|
+
pad_imp3 = pad_imp[2]
|
|
130
|
+
|
|
131
|
+
pxm1 = dpads1 * cshift1
|
|
132
|
+
pxm2 = dpads2 * cshift2
|
|
133
|
+
pxm3 = dpads3 * cshift3
|
|
134
|
+
|
|
135
|
+
start_impact1 = dstart1 % dshift1
|
|
136
|
+
start_impact2 = dstart2 % dshift2
|
|
137
|
+
start_impact3 = dstart3 % dshift3
|
|
138
|
+
|
|
139
|
+
v00 = mat00[0, 0, 0, 0, 0, 0] - mat00[0, 0, 0, 0, 0, 0] + x0[0, 0, 0] - x0[0, 0, 0]
|
|
140
|
+
|
|
141
|
+
for i1 in range(nrows1):
|
|
142
|
+
for i2 in range(nrows2):
|
|
143
|
+
for i3 in range(nrows3):
|
|
144
|
+
v00 *= 0
|
|
145
|
+
x_min1 = pad_imp1 + (i1 + start_impact1) // cshift1 * dshift1
|
|
146
|
+
x_min2 = pad_imp2 + (i2 + start_impact2) // cshift2 * dshift2
|
|
147
|
+
x_min3 = pad_imp3 + (i3 + start_impact3) // cshift3 * dshift3
|
|
148
|
+
for k1 in range(ndiags1):
|
|
149
|
+
for k2 in range(ndiags2):
|
|
150
|
+
for k3 in range(ndiags3):
|
|
151
|
+
v00 += mat00[pxm1 + i1, pxm2 + i2, pxm3 + i3, k1, k2, k3] * x0[k1 + x_min1, k2 + x_min2, k3 + x_min3]
|
|
152
|
+
out0[pxm1 + i1, pxm2 + i2, pxm3 + i3] = v00
|
|
153
|
+
|
|
154
|
+
if 0 < nrows_extra[0]:
|
|
155
|
+
pxm1 += nrows1
|
|
156
|
+
start_impact1 += nrows1
|
|
157
|
+
for i1 in range(nrows_extra[0]):
|
|
158
|
+
for i2 in range(nrows2):
|
|
159
|
+
for i3 in range(nrows3):
|
|
160
|
+
v00 *= 0
|
|
161
|
+
x_min1 = pad_imp1 + (i1 + start_impact1) // cshift1 * dshift1
|
|
162
|
+
x_min2 = pad_imp2 + (i2 + start_impact2) // cshift2 * dshift2
|
|
163
|
+
x_min3 = pad_imp3 + (i3 + start_impact3) // cshift3 * dshift3
|
|
164
|
+
for k1 in range(ndiags1 - i1 - 1):
|
|
165
|
+
for k2 in range(ndiags2):
|
|
166
|
+
for k3 in range(ndiags3):
|
|
167
|
+
v00 += mat00[pxm1 + i1, pxm2 + i2, pxm3 + i3, k1, k2, k3] * x0[x_min1 + k1, x_min2 + k2, x_min3 + k3]
|
|
168
|
+
out0[pxm1 + i1, pxm2 + i2, pxm3 + i3] = v00
|
|
169
|
+
|
|
170
|
+
if 0 < nrows_extra[1]:
|
|
171
|
+
pxm1 = dpads1 * cshift1
|
|
172
|
+
start_impact1 = dstart1 % dshift1
|
|
173
|
+
pxm2 += nrows2
|
|
174
|
+
start_impact2 += nrows2
|
|
175
|
+
for i1 in range(nrows1 + nrows_extra[0]):
|
|
176
|
+
for i2 in range(nrows_extra[1]):
|
|
177
|
+
for i3 in range(nrows3):
|
|
178
|
+
v00 *= 0
|
|
179
|
+
x_min1 = pad_imp1 + (i1 + start_impact1) // cshift1 * dshift1
|
|
180
|
+
x_min2 = pad_imp2 + (i2 + start_impact2) // cshift2 * dshift2
|
|
181
|
+
x_min3 = pad_imp3 + (i3 + start_impact3) // cshift3 * dshift3
|
|
182
|
+
for k1 in range(ndiags1 - max(0, i1 + 1 - nrows1)):
|
|
183
|
+
for k2 in range(ndiags2 - i2 - 1):
|
|
184
|
+
for k3 in range(ndiags3):
|
|
185
|
+
v00 += mat00[pxm1 + i1, pxm2 + i2, pxm3 + i3, k1, k2, k3] * x0[x_min1 + k1, x_min2 + k2, x_min3 + k3]
|
|
186
|
+
out0[pxm1 + i1, pxm2 + i2, pxm3 + i3] = v00
|
|
187
|
+
|
|
188
|
+
if 0 < nrows_extra[2]:
|
|
189
|
+
pxm1 = dpads1 * cshift1
|
|
190
|
+
pxm2 = dpads2 * cshift2
|
|
191
|
+
start_impact1 = dstart1 % dshift1
|
|
192
|
+
start_impact2 = dstart2 % dshift2
|
|
193
|
+
pxm3 += nrows3
|
|
194
|
+
start_impact3 += nrows3
|
|
195
|
+
for i1 in range(nrows1 + nrows_extra[0]):
|
|
196
|
+
for i2 in range(nrows2 + nrows_extra[1]):
|
|
197
|
+
for i3 in range(nrows_extra[2]):
|
|
198
|
+
v00 *= 0
|
|
199
|
+
x_min1 = pad_imp1 + (i1 + start_impact1) // cshift1 * dshift1
|
|
200
|
+
x_min2 = pad_imp2 + (i2 + start_impact2) // cshift2 * dshift2
|
|
201
|
+
x_min3 = pad_imp3 + (i3 + start_impact3) // cshift3 * dshift3
|
|
202
|
+
for k1 in range(ndiags1 - max(0, i1 + 1 - nrows1)):
|
|
203
|
+
for k2 in range(ndiags2 - max(0, i2 + 1 - nrows2)):
|
|
204
|
+
for k3 in range(ndiags3 - i3 - 1):
|
|
205
|
+
v00 += mat00[pxm1 + i1, pxm2 + i2, pxm3 + i3, k1, k2, k3] * x0[x_min1 + k1, x_min2 + k2, x_min3 + k3]
|
|
206
|
+
out0[pxm1 + i1, pxm2 + i2, pxm3 + i3] = v00
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
from typing import TypeVar
|
|
4
|
+
|
|
5
|
+
T = TypeVar('T', float, complex)
|
|
6
|
+
|
|
7
|
+
#========================================================================================================
|
|
8
|
+
def stencil2IJV_1d_C(A:'T[:,:]', Ib:'int64[:]', Jb:'int64[:]', Vb:'T[:]', rowmapb:'int64[:]',
|
|
9
|
+
cnl1:'int64', dng1:'int64', cs1:'int64', cp1:'int64', cm1:'int64',
|
|
10
|
+
dsh:'int64[:]', csh:'int64[:]', dgs1:'int64[:]', dge1:'int64[:]',
|
|
11
|
+
cgs1:'int64[:]', cge1:'int64[:]', dnlb1:'int64[:]', cnlb1:'int64[:]'):
|
|
12
|
+
|
|
13
|
+
nnz = 0
|
|
14
|
+
nnz_rows = 0
|
|
15
|
+
gr1 = cp1 * cm1
|
|
16
|
+
|
|
17
|
+
stencil_size1 = A.shape[1] # pre-compute the size
|
|
18
|
+
|
|
19
|
+
for i1 in range(cnl1):
|
|
20
|
+
nnz_in_row = 0
|
|
21
|
+
i1_n = cs1 + i1
|
|
22
|
+
|
|
23
|
+
pr_i1 = 0
|
|
24
|
+
for k in range(cgs1.size):
|
|
25
|
+
if i1_n < cgs1[k] or i1_n > cge1[k]:
|
|
26
|
+
continue
|
|
27
|
+
pr_i1 = k
|
|
28
|
+
|
|
29
|
+
i_g = csh[pr_i1] + i1_n - cgs1[pr_i1]
|
|
30
|
+
# this is used in upstream psydac, doesn't work with --language c
|
|
31
|
+
# stencil_size1 = A[i1 + gr1].size
|
|
32
|
+
|
|
33
|
+
for k1 in range(stencil_size1):
|
|
34
|
+
|
|
35
|
+
j1_n = (i1_n + k1 - stencil_size1 // 2) % dng1
|
|
36
|
+
value = A[i1 + gr1, k1]
|
|
37
|
+
|
|
38
|
+
if abs(value) == 0.0:
|
|
39
|
+
continue
|
|
40
|
+
|
|
41
|
+
pr_j1 = 0
|
|
42
|
+
for k in range(dgs1.size):
|
|
43
|
+
if j1_n < dgs1[k] or j1_n > dge1[k]:
|
|
44
|
+
continue
|
|
45
|
+
pr_j1 = k
|
|
46
|
+
|
|
47
|
+
j_g = dsh[pr_j1] + j1_n - dgs1[pr_j1]
|
|
48
|
+
|
|
49
|
+
if nnz_in_row == 0:
|
|
50
|
+
rowmapb[nnz_rows] = i_g
|
|
51
|
+
|
|
52
|
+
Jb[nnz] = j_g
|
|
53
|
+
Vb[nnz] = value
|
|
54
|
+
nnz += 1
|
|
55
|
+
nnz_in_row += 1
|
|
56
|
+
|
|
57
|
+
if nnz_in_row > 0:
|
|
58
|
+
Ib[1 + nnz_rows] = Ib[nnz_rows] + nnz_in_row
|
|
59
|
+
nnz_rows += 1
|
|
60
|
+
|
|
61
|
+
return nnz_rows, nnz
|
|
62
|
+
|
|
63
|
+
#========================================================================================================
|
|
64
|
+
def stencil2IJV_2d_C(A:'T[:,:,:,:]', Ib:'int64[:]', Jb:'int64[:]', Vb:'T[:]', rowmapb:'int64[:]',
|
|
65
|
+
cnl1:'int64', cnl2:'int64', dng1:'int64', dng2:'int64', cs1:'int64',
|
|
66
|
+
cs2:'int64', cp1:'int64', cp2:'int64', cm1:'int64', cm2:'int64',
|
|
67
|
+
dsh:'int64[:]', csh:'int64[:]', dgs1:'int64[:]', dgs2:'int64[:]',
|
|
68
|
+
dge1:'int64[:]', dge2:'int64[:]', cgs1:'int64[:]', cgs2:'int64[:]',
|
|
69
|
+
cge1:'int64[:]', cge2:'int64[:]', dnlb1:'int64[:]', dnlb2:'int64[:]',
|
|
70
|
+
cnlb1:'int64[:]', cnlb2:'int64[:]'):
|
|
71
|
+
|
|
72
|
+
nnz = 0
|
|
73
|
+
nnz_rows = 0
|
|
74
|
+
gr1 = cp1 * cm1
|
|
75
|
+
gr2 = cp2 * cm2
|
|
76
|
+
|
|
77
|
+
for i1 in range(cnl1):
|
|
78
|
+
for i2 in range(cnl2):
|
|
79
|
+
nnz_in_row = 0
|
|
80
|
+
i1_n = cs1 + i1
|
|
81
|
+
i2_n = cs2 + i2
|
|
82
|
+
|
|
83
|
+
pr_i1 = 0
|
|
84
|
+
for k in range(cgs1.size):
|
|
85
|
+
if i1_n < cgs1[k] or i1_n > cge1[k]:
|
|
86
|
+
continue
|
|
87
|
+
pr_i1 = k
|
|
88
|
+
|
|
89
|
+
pr_i2 = 0
|
|
90
|
+
for k in range(cgs2.size):
|
|
91
|
+
if i2_n < cgs2[k] or i2_n > cge2[k]:
|
|
92
|
+
continue
|
|
93
|
+
pr_i2 = k
|
|
94
|
+
|
|
95
|
+
pr_i = pr_i2 + pr_i1 * cgs2.size
|
|
96
|
+
i_g = csh[pr_i] + i2_n - cgs2[pr_i2] + (i1_n - cgs1[pr_i1]) * cnlb2[pr_i]
|
|
97
|
+
stencil_size1, stencil_size2 = A.shape[2:]
|
|
98
|
+
|
|
99
|
+
for k1 in range(stencil_size1):
|
|
100
|
+
for k2 in range(stencil_size2):
|
|
101
|
+
j1_n = (i1_n + k1 - stencil_size1 // 2) % dng1
|
|
102
|
+
j2_n = (i2_n + k2 - stencil_size2 // 2) % dng2
|
|
103
|
+
|
|
104
|
+
value = A[i1 + gr1, i2 + gr2, k1, k2]
|
|
105
|
+
if abs(value) == 0.0:
|
|
106
|
+
continue
|
|
107
|
+
|
|
108
|
+
pr_j1 = 0
|
|
109
|
+
for k in range(dgs1.size):
|
|
110
|
+
if j1_n < dgs1[k] or j1_n > dge1[k]:
|
|
111
|
+
continue
|
|
112
|
+
pr_j1 = k
|
|
113
|
+
|
|
114
|
+
pr_j2 = 0
|
|
115
|
+
for k in range(dgs2.size):
|
|
116
|
+
if j2_n < dgs2[k] or j2_n > dge2[k]:
|
|
117
|
+
continue
|
|
118
|
+
pr_j2 = k
|
|
119
|
+
|
|
120
|
+
pr_j = pr_j2 + pr_j1 * dgs2.size
|
|
121
|
+
j_g = dsh[pr_j] + j2_n - dgs2[pr_j2] + (j1_n - dgs1[pr_j1]) * dnlb2[pr_j]
|
|
122
|
+
|
|
123
|
+
if nnz_in_row == 0:
|
|
124
|
+
rowmapb[nnz_rows] = i_g
|
|
125
|
+
|
|
126
|
+
Jb[nnz] = j_g
|
|
127
|
+
Vb[nnz] = value
|
|
128
|
+
nnz += 1
|
|
129
|
+
nnz_in_row += 1
|
|
130
|
+
|
|
131
|
+
if nnz_in_row > 0:
|
|
132
|
+
Ib[1 + nnz_rows] = Ib[nnz_rows] + nnz_in_row
|
|
133
|
+
nnz_rows += 1
|
|
134
|
+
|
|
135
|
+
return nnz_rows, nnz
|
|
136
|
+
|
|
137
|
+
#========================================================================================================
|
|
138
|
+
def stencil2IJV_3d_C(A:'T[:,:,:,:,:,:]', Ib:'int64[:]', Jb:'int64[:]', Vb:'T[:]', rowmapb:'int64[:]',
|
|
139
|
+
cnl1:'int64', cnl2:'int64', cnl3:'int64', dng1:'int64', dng2:'int64', dng3:'int64',
|
|
140
|
+
cs1:'int64', cs2:'int64', cs3:'int64', cp1:'int64', cp2:'int64', cp3:'int64',
|
|
141
|
+
cm1:'int64', cm2:'int64', cm3:'int64', dsh:'int64[:]', csh:'int64[:]',
|
|
142
|
+
dgs1:'int64[:]', dgs2:'int64[:]', dgs3:'int64[:]', dge1:'int64[:]', dge2:'int64[:]',
|
|
143
|
+
dge3:'int64[:]', cgs1:'int64[:]', cgs2:'int64[:]', cgs3:'int64[:]',
|
|
144
|
+
cge1:'int64[:]', cge2:'int64[:]', cge3:'int64[:]', dnlb1:'int64[:]', dnlb2:'int64[:]',
|
|
145
|
+
dnlb3:'int64[:]', cnlb1:'int64[:]', cnlb2:'int64[:]', cnlb3:'int64[:]'):
|
|
146
|
+
|
|
147
|
+
nnz = 0
|
|
148
|
+
nnz_rows = 0
|
|
149
|
+
gr1 = cp1*cm1
|
|
150
|
+
gr2 = cp2*cm2
|
|
151
|
+
gr3 = cp3*cm3
|
|
152
|
+
|
|
153
|
+
for i1 in range(cnl1):
|
|
154
|
+
for i2 in range(cnl2):
|
|
155
|
+
for i3 in range(cnl3):
|
|
156
|
+
nnz_in_row = 0
|
|
157
|
+
i1_n = cs1 + i1
|
|
158
|
+
i2_n = cs2 + i2
|
|
159
|
+
i3_n = cs3 + i3
|
|
160
|
+
|
|
161
|
+
pr_i1 = 0
|
|
162
|
+
for k in range(cgs1.size):
|
|
163
|
+
if i1_n < cgs1[k] or i1_n > cge1[k]:
|
|
164
|
+
continue
|
|
165
|
+
pr_i1 = k
|
|
166
|
+
|
|
167
|
+
pr_i2 = 0
|
|
168
|
+
for k in range(cgs2.size):
|
|
169
|
+
if i2_n < cgs2[k] or i2_n > cge2[k]:
|
|
170
|
+
continue
|
|
171
|
+
pr_i2 = k
|
|
172
|
+
|
|
173
|
+
pr_i3 = 0
|
|
174
|
+
for k in range(cgs3.size):
|
|
175
|
+
if i3_n < cgs3[k] or i3_n > cge3[k]:
|
|
176
|
+
continue
|
|
177
|
+
pr_i3 = k
|
|
178
|
+
|
|
179
|
+
pr_i = pr_i3 + pr_i2 * cgs3.size + pr_i1 * cgs2.size * cgs3.size
|
|
180
|
+
i_g = csh[pr_i] + i3_n - cgs3[pr_i3] + (i2_n - cgs2[pr_i2]) * cnlb3[pr_i] + (i1_n - cgs1[pr_i1]) * cnlb2[pr_i] * cnlb3[pr_i]
|
|
181
|
+
stencil_size1, stencil_size2, stencil_size3 = A.shape[3:]
|
|
182
|
+
|
|
183
|
+
for k1 in range(stencil_size1):
|
|
184
|
+
for k2 in range(stencil_size2):
|
|
185
|
+
for k3 in range(stencil_size3):
|
|
186
|
+
j1_n = (i1_n + k1 - stencil_size1 // 2) % dng1
|
|
187
|
+
j2_n = (i2_n + k2 - stencil_size2 // 2) % dng2
|
|
188
|
+
j3_n = (i3_n + k3 - stencil_size3 // 2) % dng3
|
|
189
|
+
|
|
190
|
+
value = A[i1 + gr1, i2 + gr2, i3 + gr3, k1, k2, k3]
|
|
191
|
+
if abs(value) == 0.0:
|
|
192
|
+
continue
|
|
193
|
+
|
|
194
|
+
pr_j1 = 0
|
|
195
|
+
for k in range(dgs1.size):
|
|
196
|
+
if j1_n < dgs1[k] or j1_n > dge1[k]:
|
|
197
|
+
continue
|
|
198
|
+
pr_j1 = k
|
|
199
|
+
|
|
200
|
+
pr_j2 = 0
|
|
201
|
+
for k in range(dgs2.size):
|
|
202
|
+
if j2_n < dgs2[k] or j2_n > dge2[k]:
|
|
203
|
+
continue
|
|
204
|
+
pr_j2 = k
|
|
205
|
+
|
|
206
|
+
pr_j3 = 0
|
|
207
|
+
for k in range(dgs3.size):
|
|
208
|
+
if j3_n < dgs3[k] or j3_n > dge3[k]:
|
|
209
|
+
continue
|
|
210
|
+
pr_j3 = k
|
|
211
|
+
|
|
212
|
+
pr_j = pr_j3 + pr_j2 * dgs3.size + pr_j1 * dgs2.size * dgs3.size
|
|
213
|
+
j_g = dsh[pr_j] + j3_n - dgs3[pr_j3] + (j2_n - dgs2[pr_j2]) * dnlb3[pr_j] + (j1_n - dgs1[pr_j1]) * dnlb2[pr_j] * dnlb3[pr_j]
|
|
214
|
+
|
|
215
|
+
if nnz_in_row == 0:
|
|
216
|
+
rowmapb[nnz_rows] = i_g
|
|
217
|
+
|
|
218
|
+
Jb[nnz] = j_g
|
|
219
|
+
Vb[nnz] = value
|
|
220
|
+
nnz += 1
|
|
221
|
+
nnz_in_row += 1
|
|
222
|
+
|
|
223
|
+
if nnz_in_row > 0:
|
|
224
|
+
Ib[1 + nnz_rows] = Ib[nnz_rows] + nnz_in_row
|
|
225
|
+
nnz_rows += 1
|
|
226
|
+
|
|
227
|
+
return nnz_rows, nnz
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
#!!!!!!!!!!!!!
|
|
4
|
+
#TODO avoid using The expensive modulo operator % in the non periodic case to make the methods faster
|
|
5
|
+
#!!!!!!!!!!!!!
|
|
6
|
+
|
|
7
|
+
from typing import TypeVar
|
|
8
|
+
|
|
9
|
+
T = TypeVar('T', float, complex)
|
|
10
|
+
|
|
11
|
+
#__all__ = ['stencil2coo_1d_C','stencil2coo_1d_F','stencil2coo_2d_C','stencil2coo_2d_F', 'stencil2coo_3d_C', 'stencil2coo_3d_F']
|
|
12
|
+
|
|
13
|
+
#========================================================================================================
|
|
14
|
+
def stencil2coo_1d_C(A:'T[:,:]', data:'T[:]', rows:'int64[:]', cols:'int64[:]', nrl1:'int64', ncl1:'int64',
|
|
15
|
+
s1:'int64', nr1:'int64', nc1:'int64', dm1:'int64', cm1:'int64', p1:'int64', dp1:'int64'):
|
|
16
|
+
nnz = 0
|
|
17
|
+
pp1 = cm1*p1
|
|
18
|
+
for i1 in range(nrl1):
|
|
19
|
+
I = s1+i1
|
|
20
|
+
for j1 in range(ncl1):
|
|
21
|
+
value = A[i1+pp1,j1]
|
|
22
|
+
if abs(value) == 0.0:continue
|
|
23
|
+
J = ((I*dm1//cm1)+j1-dp1)%nc1
|
|
24
|
+
rows[nnz] = I
|
|
25
|
+
cols[nnz] = J
|
|
26
|
+
data[nnz] = value
|
|
27
|
+
nnz += 1
|
|
28
|
+
|
|
29
|
+
return nnz
|
|
30
|
+
|
|
31
|
+
#========================================================================================================
|
|
32
|
+
def stencil2coo_1d_F(A:'T[:,:]', data:'T[:]', rows:'int64[:]', cols:'int64[:]', nrl1:'int64', ncl1:'int64',
|
|
33
|
+
s1:'int64', nr1:'int64', nc1:'int64', dm1:'int64', cm1:'int64', p1:'int64', dp1:'int64'):
|
|
34
|
+
nnz = 0
|
|
35
|
+
pp1 = cm1*p1
|
|
36
|
+
for i1 in range(nrl1):
|
|
37
|
+
I = s1+i1
|
|
38
|
+
for j1 in range(ncl1):
|
|
39
|
+
value = A[i1+pp1,j1]
|
|
40
|
+
if abs(value) == 0.0:continue
|
|
41
|
+
J = ((I*dm1//cm1)+j1-dp1)%nc1
|
|
42
|
+
rows[nnz] = I
|
|
43
|
+
cols[nnz] = J
|
|
44
|
+
data[nnz] = value
|
|
45
|
+
nnz += 1
|
|
46
|
+
|
|
47
|
+
return nnz
|
|
48
|
+
|
|
49
|
+
#========================================================================================================
|
|
50
|
+
def stencil2coo_2d_C(A:'T[:,:,:,:]', data:'T[:]', rows:'int64[:]', cols:'int64[:]',
|
|
51
|
+
nrl1:'int64', nrl2:'int64', ncl1:'int64', ncl2:'int64',
|
|
52
|
+
s1:'int64', s2:'int64', nr1:'int64', nr2:'int64',
|
|
53
|
+
nc1:'int64', nc2:'int64', dm1:'int64', dm2:'int64',
|
|
54
|
+
cm1:'int64', cm2:'int64', p1:'int64', p2:'int64',
|
|
55
|
+
dp1:'int64', dp2:'int64'):
|
|
56
|
+
nnz = 0
|
|
57
|
+
pp1 = cm1*p1
|
|
58
|
+
pp2 = cm2*p2
|
|
59
|
+
for i1 in range(nrl1):
|
|
60
|
+
for i2 in range(nrl2):
|
|
61
|
+
ii1 = s1+i1
|
|
62
|
+
ii2 = s2+i2
|
|
63
|
+
I = ii1*nr2 + ii2
|
|
64
|
+
for j1 in range(ncl1):
|
|
65
|
+
for j2 in range(ncl2):
|
|
66
|
+
value = A[i1+pp1,i2+pp2,j1,j2]
|
|
67
|
+
if abs(value) == 0.0:continue
|
|
68
|
+
jj1 = ((ii1*dm1//cm1)+j1-dp1)%nc1
|
|
69
|
+
jj2 = ((ii2*dm2//cm2)+j2-dp2)%nc2
|
|
70
|
+
|
|
71
|
+
J = jj1*nc2 + jj2
|
|
72
|
+
|
|
73
|
+
rows[nnz] = I
|
|
74
|
+
cols[nnz] = J
|
|
75
|
+
data[nnz] = value
|
|
76
|
+
nnz += 1
|
|
77
|
+
return nnz
|
|
78
|
+
|
|
79
|
+
#========================================================================================================
|
|
80
|
+
def stencil2coo_2d_F(A:'T[:,:,:,:]', data:'T[:]', rows:'int64[:]', cols:'int64[:]',
|
|
81
|
+
nrl1:'int64', nrl2:'int64', ncl1:'int64', ncl2:'int64',
|
|
82
|
+
s1:'int64', s2:'int64', nr1:'int64', nr2:'int64',
|
|
83
|
+
nc1:'int64', nc2:'int64', dm1:'int64', dm2:'int64',
|
|
84
|
+
cm1:'int64', cm2:'int64', p1:'int64', p2:'int64',
|
|
85
|
+
dp1:'int64', dp2:'int64'):
|
|
86
|
+
nnz = 0
|
|
87
|
+
pp1 = cm1*p1
|
|
88
|
+
pp2 = cm2*p2
|
|
89
|
+
for i1 in range(nrl1):
|
|
90
|
+
for i2 in range(nrl2):
|
|
91
|
+
ii1 = s1+i1
|
|
92
|
+
ii2 = s2+i2
|
|
93
|
+
I = ii2*nr1 + ii1
|
|
94
|
+
for j1 in range(ncl1):
|
|
95
|
+
for j2 in range(ncl2):
|
|
96
|
+
value = A[i1+pp1,i2+pp2,j1,j2]
|
|
97
|
+
if abs(value) == 0.0:continue
|
|
98
|
+
jj1 = ((ii1*dm1//cm1)+j1-dp1)%nc1
|
|
99
|
+
jj2 = ((ii2*dm2//cm2)+j2-dp2)%nc2
|
|
100
|
+
|
|
101
|
+
J = jj2*nc1 + jj1
|
|
102
|
+
|
|
103
|
+
rows[nnz] = I
|
|
104
|
+
cols[nnz] = J
|
|
105
|
+
data[nnz] = value
|
|
106
|
+
nnz += 1
|
|
107
|
+
return nnz
|
|
108
|
+
|
|
109
|
+
#========================================================================================================
|
|
110
|
+
def stencil2coo_3d_C(A:'T[:,:,:,:,:,:]', data:'T[:]', rows:'int64[:]', cols:'int64[:]',
|
|
111
|
+
nrl1:'int64', nrl2:'int64', nrl3:'int64', ncl1:'int64', ncl2:'int64', ncl3:'int64',
|
|
112
|
+
s1:'int64', s2:'int64', s3:'int64', nr1:'int64', nr2:'int64', nr3:'int64',
|
|
113
|
+
nc1:'int64', nc2:'int64', nc3:'int64', dm1:'int64', dm2:'int64', dm3:'int64',
|
|
114
|
+
cm1:'int64', cm2:'int64', cm3:'int64', p1:'int64', p2:'int64', p3:'int64',
|
|
115
|
+
dp1:'int64', dp2:'int64', dp3:'int64'):
|
|
116
|
+
nnz = 0
|
|
117
|
+
pp1 = cm1*p1
|
|
118
|
+
pp2 = cm2*p2
|
|
119
|
+
pp3 = cm3*p3
|
|
120
|
+
for i1 in range(nrl1):
|
|
121
|
+
for i2 in range(nrl2):
|
|
122
|
+
for i3 in range(nrl3):
|
|
123
|
+
ii1 = s1+i1
|
|
124
|
+
ii2 = s2+i2
|
|
125
|
+
ii3 = s3+i3
|
|
126
|
+
I = ii1*nr2*nr3 + ii2*nr3 + ii3
|
|
127
|
+
for j1 in range(ncl1):
|
|
128
|
+
for j2 in range(ncl2):
|
|
129
|
+
for j3 in range(ncl3):
|
|
130
|
+
value = A[i1+pp1,i2+pp2,i3+pp3,j1,j2,j3]
|
|
131
|
+
if abs(value) == 0.0:continue
|
|
132
|
+
jj1 = ((ii1*dm1//cm1)+j1-dp1)%nc1
|
|
133
|
+
jj2 = ((ii2*dm2//cm2)+j2-dp2)%nc2
|
|
134
|
+
jj3 = ((ii3*dm3//cm3)+j3-dp3)%nc3
|
|
135
|
+
|
|
136
|
+
J = jj1*nc2*nc3 + jj2*nc3 + jj3
|
|
137
|
+
|
|
138
|
+
rows[nnz] = I
|
|
139
|
+
cols[nnz] = J
|
|
140
|
+
data[nnz] = value
|
|
141
|
+
nnz += 1
|
|
142
|
+
|
|
143
|
+
return nnz
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
#========================================================================================================
|
|
147
|
+
def stencil2coo_3d_F(A:'T[:,:,:,:,:,:]', data:'T[:]', rows:'int64[:]', cols:'int64[:]',
|
|
148
|
+
nrl1:'int64', nrl2:'int64', nrl3:'int64', ncl1:'int64', ncl2:'int64', ncl3:'int64',
|
|
149
|
+
s1:'int64', s2:'int64', s3:'int64', nr1:'int64', nr2:'int64', nr3:'int64',
|
|
150
|
+
nc1:'int64', nc2:'int64', nc3:'int64', dm1:'int64', dm2:'int64', dm3:'int64',
|
|
151
|
+
cm1:'int64', cm2:'int64', cm3:'int64', p1:'int64', p2:'int64', p3:'int64',
|
|
152
|
+
dp1:'int64', dp2:'int64', dp3:'int64'):
|
|
153
|
+
nnz = 0
|
|
154
|
+
pp1 = cm1*p1
|
|
155
|
+
pp2 = cm2*p2
|
|
156
|
+
pp3 = cm3*p3
|
|
157
|
+
for i1 in range(nrl1):
|
|
158
|
+
for i2 in range(nrl2):
|
|
159
|
+
for i3 in range(nrl3):
|
|
160
|
+
ii1 = s1+i1
|
|
161
|
+
ii2 = s2+i2
|
|
162
|
+
ii3 = s3+i3
|
|
163
|
+
I = ii3*nr1*nr2 + ii2*nr1 + ii1
|
|
164
|
+
for j1 in range(ncl1):
|
|
165
|
+
for j2 in range(ncl2):
|
|
166
|
+
for j3 in range(ncl3):
|
|
167
|
+
value = A[i1+pp1,i2+pp2,i3+pp3,j1,j2,j3]
|
|
168
|
+
if abs(value) == 0.0:continue
|
|
169
|
+
jj1 = ((ii1*dm1//cm1)+j1-dp1)%nc1
|
|
170
|
+
jj2 = ((ii2*dm2//cm2)+j2-dp2)%nc2
|
|
171
|
+
jj3 = ((ii3*dm3//cm3)+j3-dp3)%nc3
|
|
172
|
+
|
|
173
|
+
J = jj3*nc1*nc2 + jj2*nc1 + jj1
|
|
174
|
+
|
|
175
|
+
rows[nnz] = I
|
|
176
|
+
cols[nnz] = J
|
|
177
|
+
data[nnz] = value
|
|
178
|
+
nnz += 1
|
|
179
|
+
return nnz
|