@@ -151,6 +151,101 @@ cdef class {SCALAR_label}constantTwoPoint({SCALAR_label}twoPointFunction):
151
151
return {SCALAR_label}constantTwoPoint, (self .value, )
152
152
153
153
154
+ cdef class {SCALAR_label}lookupTwoPoint({SCALAR_label}twoPointFunction):
155
+ def __init__ (self , DoFMap dm , {SCALAR}_t[:, ::1] A , BOOL_t symmetric , cellFinder2 cF = None ):
156
+ super ({SCALAR_label}lookupTwoPoint, self ).__init__(symmetric, 1 )
157
+ self .dm = dm
158
+ self .A = A
159
+ if cF is None :
160
+ self .cellFinder = cellFinder2(self .dm.mesh)
161
+ else :
162
+ self .cellFinder = cF
163
+ self .vals1 = uninitialized((self .dm.dofs_per_element), dtype = {SCALAR})
164
+ self .vals2 = uninitialized((self .dm.dofs_per_element), dtype = {SCALAR})
165
+
166
+ cdef void eval (self , REAL_t[::1 ] x, REAL_t[::1 ] y, {SCALAR}_t[::1 ] value):
167
+ cdef:
168
+ shapeFunction shapeFun
169
+ REAL_t val
170
+ INDEX_t cellNo1, cellNo2, dof1, dof2, k1, k2
171
+ cellNo1 = self .cellFinder.findCell(x)
172
+ if cellNo1 == - 1 :
173
+ value[0 ] = 0.
174
+ return
175
+ for k1 in range (self .dm.dofs_per_element):
176
+ dof2 = self .dm.cell2dof(cellNo1, k1)
177
+ if dof2 >= 0 :
178
+ shapeFun = self .dm.getLocalShapeFunction(k1)
179
+ shapeFun.evalPtr(& self .cellFinder.bary[0 ], NULL , & val)
180
+ self .vals1[k1] = val
181
+ else :
182
+ self .vals1[k1] = 0.
183
+
184
+ cellNo2 = self .cellFinder.findCell(y)
185
+ if cellNo2 == - 1 :
186
+ value[0 ] = 0.
187
+ return
188
+ for k2 in range (self .dm.dofs_per_element):
189
+ dof1 = self .dm.cell2dof(cellNo2, k2)
190
+ if dof1 >= 0 :
191
+ shapeFun = self .dm.getLocalShapeFunction(k2)
192
+ shapeFun.evalPtr(& self .cellFinder.bary[0 ], NULL , & val)
193
+ self .vals2[k2] = val
194
+ else :
195
+ self .vals2[k2] = 0.
196
+
197
+ value[0 ] = 0.
198
+ for k1 in range (self .dm.dofs_per_element):
199
+ dof1 = self .dm.cell2dof(cellNo1, k1)
200
+ for k2 in range (self .dm.dofs_per_element):
201
+ dof2 = self .dm.cell2dof(cellNo2, k2)
202
+ value[0 ] += self .vals1[k1]* self .A[dof1, dof2]* self .vals2[k2]
203
+
204
+ cdef void evalPtr(self , INDEX_t dim, REAL_t* x, REAL_t* y, {SCALAR}_t* value):
205
+ cdef:
206
+ shapeFunction shapeFun
207
+ REAL_t val
208
+ INDEX_t cellNo1, cellNo2, dof, dof1, dof2, k1, k2
209
+ cellNo1 = self .cellFinder.findCellPtr(x)
210
+ if cellNo1 == - 1 :
211
+ value[0 ] = 0.
212
+ return
213
+ for k1 in range (self .dm.dofs_per_element):
214
+ dof = self .dm.cell2dof(cellNo1, k1)
215
+ if dof >= 0 :
216
+ shapeFun = self .dm.getLocalShapeFunction(k1)
217
+ shapeFun.evalPtr(& self .cellFinder.bary[0 ], NULL , & val)
218
+ self .vals1[k1] = val
219
+ else :
220
+ self .vals1[k1] = 0.
221
+
222
+ cellNo2 = self .cellFinder.findCellPtr(y)
223
+ if cellNo2 == - 1 :
224
+ value[0 ] = 0.
225
+ return
226
+ for k2 in range (self .dm.dofs_per_element):
227
+ dof = self .dm.cell2dof(cellNo2, k2)
228
+ if dof >= 0 :
229
+ shapeFun = self .dm.getLocalShapeFunction(k2)
230
+ shapeFun.evalPtr(& self .cellFinder.bary[0 ], NULL , & val)
231
+ self .vals2[k2] = val
232
+ else :
233
+ self .vals2[k2] = 0.
234
+
235
+ value[0 ] = 0.
236
+ for k1 in range (self .dm.dofs_per_element):
237
+ dof1 = self .dm.cell2dof(cellNo1, k1)
238
+ for k2 in range (self .dm.dofs_per_element):
239
+ dof2 = self .dm.cell2dof(cellNo2, k2)
240
+ value[0 ] += self .vals1[k1]* self .A[dof1, dof2]* self .vals2[k2]
241
+
242
+ def __repr__ (self ):
243
+ return ' lookup {}' .format(self .dm)
244
+
245
+ def __reduce__ (self ):
246
+ return {SCALAR_label}lookupTwoPoint, (self .dm, np.array(self .A), self .symmetric)
247
+
248
+
154
249
cdef class {SCALAR_label}parametrizedTwoPointFunction({SCALAR_label}twoPointFunction):
155
250
def __init__ (self , BOOL_t symmetric , INDEX_t valueSize ):
156
251
super ({SCALAR_label}parametrizedTwoPointFunction, self ).__init__(symmetric, valueSize)
0 commit comments