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.
Files changed (98) hide show
  1. feectools/__init__.py +0 -0
  2. feectools/accelerate/__init__.py +0 -0
  3. feectools/accelerate/accelerate.py +220 -0
  4. feectools/accelerate/compile_psydac.mk +52 -0
  5. feectools/api/__init__.py +0 -0
  6. feectools/api/essential_bc.py +122 -0
  7. feectools/api/fem_bilinear_form.py +2226 -0
  8. feectools/api/fem_common.py +286 -0
  9. feectools/api/fem_sum_form.py +123 -0
  10. feectools/api/settings.py +82 -0
  11. feectools/core/__init__.py +11 -0
  12. feectools/core/bsplines.py +1107 -0
  13. feectools/core/bsplines_kernels.py +1349 -0
  14. feectools/core/field_evaluation_kernels.py +5015 -0
  15. feectools/core/tests/__init__.py +0 -0
  16. feectools/core/tests/test_bsplines.py +263 -0
  17. feectools/core/tests/test_bsplines_kernel.py +40 -0
  18. feectools/core/tests/test_bsplines_pyccel.py +752 -0
  19. feectools/ddm/__init__.py +3 -0
  20. feectools/ddm/basic.py +78 -0
  21. feectools/ddm/blocking_data_exchanger.py +348 -0
  22. feectools/ddm/cart.py +1835 -0
  23. feectools/ddm/interface_data_exchanger.py +122 -0
  24. feectools/ddm/mpi.py +109 -0
  25. feectools/ddm/nonblocking_data_exchanger.py +331 -0
  26. feectools/ddm/partition.py +207 -0
  27. feectools/ddm/petsc.py +112 -0
  28. feectools/ddm/tests/__init__.py +0 -0
  29. feectools/ddm/tests/test_cart_1d.py +138 -0
  30. feectools/ddm/tests/test_cart_2d.py +164 -0
  31. feectools/ddm/tests/test_cart_3d.py +158 -0
  32. feectools/ddm/tests/test_multicart_2d.py +173 -0
  33. feectools/ddm/tests/test_partition.py +124 -0
  34. feectools/ddm/utilities.py +24 -0
  35. feectools/feec/__init__.py +0 -0
  36. feectools/feec/derivatives.py +780 -0
  37. feectools/feec/dof_kernels.py +210 -0
  38. feectools/feec/global_geometric_projectors.py +1073 -0
  39. feectools/feec/hodge.py +148 -0
  40. feectools/fem/__init__.py +0 -0
  41. feectools/fem/basic.py +465 -0
  42. feectools/fem/grid.py +181 -0
  43. feectools/fem/partitioning.py +344 -0
  44. feectools/fem/projectors.py +160 -0
  45. feectools/fem/splines.py +559 -0
  46. feectools/fem/tensor.py +1393 -0
  47. feectools/fem/tests/__init__.py +0 -0
  48. feectools/fem/tests/analytical_profiles_1d.py +100 -0
  49. feectools/fem/tests/analytical_profiles_base.py +34 -0
  50. feectools/fem/tests/splines_error_bounds.py +155 -0
  51. feectools/fem/tests/test_spline_histopolation.py +120 -0
  52. feectools/fem/tests/test_spline_interpolation.py +182 -0
  53. feectools/fem/tests/test_splines.py +184 -0
  54. feectools/fem/tests/test_splines_par.py +46 -0
  55. feectools/fem/tests/test_vector_spaces.py +150 -0
  56. feectools/fem/tests/utilities.py +47 -0
  57. feectools/fem/vector.py +729 -0
  58. feectools/linalg/__init__.py +0 -0
  59. feectools/linalg/basic.py +1386 -0
  60. feectools/linalg/block.py +1451 -0
  61. feectools/linalg/direct_solvers.py +201 -0
  62. feectools/linalg/fft.py +258 -0
  63. feectools/linalg/kernels/__init__.py +0 -0
  64. feectools/linalg/kernels/axpy_kernels.py +57 -0
  65. feectools/linalg/kernels/inner_kernels.py +100 -0
  66. feectools/linalg/kernels/matvec_kernels.py +206 -0
  67. feectools/linalg/kernels/stencil2IJV_kernels.py +227 -0
  68. feectools/linalg/kernels/stencil2coo_kernels.py +179 -0
  69. feectools/linalg/kernels/transpose_kernels.py +263 -0
  70. feectools/linalg/kron.py +911 -0
  71. feectools/linalg/solvers.py +1914 -0
  72. feectools/linalg/sparse.py +114 -0
  73. feectools/linalg/stencil.py +2923 -0
  74. feectools/linalg/stencil_dot_kernels.py +317 -0
  75. feectools/linalg/stencil_transpose_kernels.py +372 -0
  76. feectools/linalg/tests/__init__.py +0 -0
  77. feectools/linalg/tests/test_block.py +1588 -0
  78. feectools/linalg/tests/test_fft.py +106 -0
  79. feectools/linalg/tests/test_kron_stencil_matrix.py +114 -0
  80. feectools/linalg/tests/test_linalg.py +1065 -0
  81. feectools/linalg/tests/test_matrix_free.py +128 -0
  82. feectools/linalg/tests/test_solvers.py +213 -0
  83. feectools/linalg/tests/test_stencil_interface_matrix.py +379 -0
  84. feectools/linalg/tests/test_stencil_vector.py +1036 -0
  85. feectools/linalg/tests/test_stencil_vector_space.py +440 -0
  86. feectools/linalg/topetsc.py +522 -0
  87. feectools/linalg/utilities.py +200 -0
  88. feectools/utilities/__init__.py +0 -0
  89. feectools/utilities/quadratures.py +113 -0
  90. feectools/utilities/utils.py +166 -0
  91. feectools/version.py +1 -0
  92. feectools-0.1.0.dist-info/METADATA +66 -0
  93. feectools-0.1.0.dist-info/RECORD +98 -0
  94. feectools-0.1.0.dist-info/WHEEL +5 -0
  95. feectools-0.1.0.dist-info/entry_points.txt +3 -0
  96. feectools-0.1.0.dist-info/licenses/AUTHORS +22 -0
  97. feectools-0.1.0.dist-info/licenses/LICENSE +21 -0
  98. 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