@@ -109,10 +109,11 @@ function get_patch_dofs(space::FESpace,ptopo::PatchTopology)
109
109
patch_to_faces = get_patch_faces (ptopo,Df)
110
110
111
111
patch_to_dofs = map (patch_to_faces) do pfaces
112
- tfaces = filter (! iszero ,face_to_tface[pfaces])
112
+ tfaces = filter (x -> x > 0 ,face_to_tface[pfaces])
113
113
dofs = SortedSet {Int} ()
114
114
for tface in tfaces
115
- push! (dofs,view (tface_to_dofs,tface)... )
115
+ tface_dofs = filter (x-> x> 0 ,view (tface_to_dofs,tface))
116
+ ! isempty (tface_dofs) && push! (dofs,tface_dofs... )
116
117
end
117
118
collect (dofs)
118
119
end |> Table
@@ -235,17 +236,52 @@ struct PatchAssemblyMap{T} <: Map
235
236
cell_data
236
237
end
237
238
239
+ function _alloc_cache (:: PatchAssemblyStrategy ,s:: NTuple{N,Int} ) where N
240
+ zeros (s... )
241
+ end
242
+
243
+ function _alloc_cache (:: PatchAssemblyStrategy ,s:: NTuple{N,<:BlockedOneTo} ) where N
244
+ bs = map (blocklength,s)
245
+ ss = map (blocklengths,s)
246
+ array = [ zeros (ntuple (i -> ss[i][I[i]], Val (N))) for I in CartesianIndices (bs) ]
247
+ ArrayBlock (array,fill (true ,bs))
248
+ end
249
+
250
+ function _alloc_cache (b:: ArrayBlockView ,s:: NTuple{N,<:BlockedOneTo} ) where N
251
+ bs = map (blocklength,s)
252
+ ss = map (blocklengths,s)
253
+ array = [ zeros (ntuple (i -> ss[i][I[i]], Val (N))) for I in CartesianIndices (bs) ]
254
+ bmap = ifelse (N == 2 , b. block_map, map (idx -> CartesianIndex (idx[1 ]), diag (b. block_map)))
255
+ ArrayBlockView (ArrayBlock (array,fill (true ,bs)),bmap)
256
+ end
257
+
258
+ function _resize_cache! (a,:: PatchAssemblyStrategy ,s:: NTuple{N,Int} ) where N
259
+ setsize! (a,s)
260
+ end
261
+
262
+ function _resize_cache! (a,:: PatchAssemblyStrategy ,s:: NTuple{N,<:BlockedOneTo} ) where N
263
+ bs = map (blocklength,s)
264
+ ss = map (blocklengths,s)
265
+ for I in CartesianIndices (bs)
266
+ setsize! (a. array[I],ntuple (i -> ss[i][I[i]], Val (N)))
267
+ end
268
+ end
269
+
270
+ function _resize_cache! (a,b:: ArrayBlockView ,s:: NTuple{N,<:BlockedOneTo} ) where N
271
+ bs = map (blocklength,s)
272
+ ss = map (blocklengths,s)
273
+ for I in CartesianIndices (bs)
274
+ setsize! (a. array. array[I],ntuple (i -> ss[i][I[i]], Val (N)))
275
+ end
276
+ end
277
+
278
+ _unview (a) = a
279
+ _unview (a:: ArrayBlockView ) = a. array
280
+
238
281
# Mat & Vec assembly
239
282
240
283
function Arrays. return_cache (k:: PatchAssemblyMap ,patch)
241
- _zeros (s:: NTuple{N,Int} ) where N = zeros (s... )
242
- function _zeros (s:: NTuple{N,BlockedOneTo} ) where N
243
- bs = map (blocklength,s)
244
- ss = map (blocklengths,s)
245
- array = [ zeros (ntuple (i -> ss[i][I[i]], Val (N))) for I in CartesianIndices (bs) ]
246
- ArrayBlock (array,fill (true ,bs))
247
- end
248
- res = _zeros (k. patch_sizes[patch])
284
+ res = _alloc_cache (k. assem. strategy,k. patch_sizes[patch])
249
285
caches = patch_assembly_cache (res,k. cell_data)
250
286
251
287
c_res = CachedArray (res)
@@ -255,33 +291,19 @@ function Arrays.return_cache(k::PatchAssemblyMap,patch)
255
291
end
256
292
257
293
function Arrays. evaluate! (cache,k:: PatchAssemblyMap ,patch)
258
- _setsize! (a,s:: NTuple{N,Int} ) where N = setsize! (a,s)
259
- function _setsize! (a,s:: NTuple{N,BlockedOneTo} ) where N
260
- bs = map (blocklength,s)
261
- ss = map (blocklengths,s)
262
- for I in CartesianIndices (bs)
263
- setsize! (a. array[I],ntuple (i -> ss[i][I[i]], Val (N)))
264
- end
265
- end
266
294
c_res, uwr_cache, caches = cache
267
- _setsize ! (c_res,k. patch_sizes[patch])
295
+ _resize_cache ! (c_res,k . assem . strategy ,k. patch_sizes[patch])
268
296
res = evaluate! (uwr_cache,Fields. unwrap_cached_array,c_res)
269
297
Fields. _zero_entries! (res)
270
298
patch_assembly! (caches,res,k. cell_data,patch)
271
- return res
299
+ return _unview ( res)
272
300
end
273
301
274
302
# Mat-Vec assembly
275
303
276
304
function Arrays. return_cache (k:: PatchAssemblyMap{<:Tuple{<:Tuple,<:Tuple}} ,patch)
277
- _zeros (s:: NTuple{N,Int} ) where N = zeros (s... )
278
- function _zeros (s:: NTuple{N,BlockedOneTo} ) where N
279
- bs = map (blocklength,s)
280
- ss = map (blocklengths,s)
281
- array = [ zeros (ntuple (i -> ss[i][I[i]], Val (N))) for I in CartesianIndices (bs) ]
282
- ArrayBlock (array,fill (true ,bs))
283
- end
284
- mat, vec = _zeros (k. patch_sizes[patch][1 ]), _zeros (k. patch_sizes[patch][2 ])
305
+ mat = _alloc_cache (k. assem. strategy,k. patch_sizes[patch][1 ])
306
+ vec = _alloc_cache (k. assem. strategy,k. patch_sizes[patch][2 ])
285
307
286
308
matvecdata, matdata, vecdata = k. cell_data
287
309
mat_caches = patch_assembly_cache (mat,matdata)
@@ -296,19 +318,11 @@ function Arrays.return_cache(k::PatchAssemblyMap{<:Tuple{<:Tuple,<:Tuple}},patch
296
318
end
297
319
298
320
function Arrays. evaluate! (cache,k:: PatchAssemblyMap{<:Tuple{<:Tuple,<:Tuple}} ,patch)
299
- _setsize! (a,s:: NTuple{N,Int} ) where N = setsize! (a,s)
300
- function _setsize! (a,s:: NTuple{N,BlockedOneTo} ) where N
301
- bs = map (blocklength,s)
302
- ss = map (blocklengths,s)
303
- for I in CartesianIndices (bs)
304
- setsize! (a. array[I],ntuple (i -> ss[i][I[i]], Val (N)))
305
- end
306
- end
307
321
c_mat, c_vec, uwm_cache, uwv_cache, matvec_caches, mat_caches, vec_caches = cache
308
322
matvecdata, matdata, vecdata = k. cell_data
309
323
310
- _setsize ! (c_mat,k. patch_sizes[patch][1 ])
311
- _setsize ! (c_vec,k. patch_sizes[patch][2 ])
324
+ _resize_cache ! (c_mat,k . assem . strategy ,k. patch_sizes[patch][1 ])
325
+ _resize_cache ! (c_vec,k . assem . strategy ,k. patch_sizes[patch][2 ])
312
326
mat = evaluate! (uwm_cache,Fields. unwrap_cached_array,c_mat)
313
327
vec = evaluate! (uwv_cache,Fields. unwrap_cached_array,c_vec)
314
328
@@ -319,11 +333,11 @@ function Arrays.evaluate!(cache,k::PatchAssemblyMap{<:Tuple{<:Tuple,<:Tuple}},pa
319
333
patch_assembly! (mat_caches,mat,matdata,patch)
320
334
patch_assembly! (vec_caches,vec,vecdata,patch)
321
335
322
- return mat, vec
336
+ return _unview ( mat), _unview ( vec)
323
337
end
324
338
325
- const MatOrMatBlock = Union{AbstractMatrix,MatrixBlock}
326
- const VecOrVecBlock = Union{AbstractVector,VectorBlock}
339
+ const MatOrMatBlock = Union{AbstractMatrix,MatrixBlock,MatrixBlockView }
340
+ const VecOrVecBlock = Union{AbstractVector,VectorBlock,VectorBlockView }
327
341
328
342
function patch_assembly_cache (mat:: MatOrMatBlock ,cell_matdata)
329
343
caches = ()
@@ -451,7 +465,7 @@ function Arrays.evaluate!(cache,k::StaticCondensationMap,matvec)
451
465
@check size (mat. array) == (2 ,2 )
452
466
@check size (vec. array) == (2 ,)
453
467
454
- Kii, Kib, Kbi , Kbb = mat. array
468
+ Kii, Kbi, Kib , Kbb = mat. array
455
469
bi, bb = vec. array
456
470
457
471
f = lu! (Kii,k. pivot;check= false )
0 commit comments