@@ -244,8 +244,9 @@ function _get_periodic_coupling_matrix(
244244 # to be sure
245245 fill! (fe_vector. entries, 0.0 )
246246
247- # FE vector for interpolation
248- fe_vector_target = FEVector (FES)
247+ # FE target vector for interpolation with sparse entries
248+ fe_vector_target = FEVector (FES; entries = SparseVector {Float64, Int64} (FES. ndofs, Int64[], Float64[]))
249+
249250
250251 # resulting sparse matrix
251252 n = length (fe_vector. entries)
@@ -358,6 +359,13 @@ function _get_periodic_coupling_matrix(
358359 append! (searchareas, view (faces_to, 1 : nfaces_to))
359360 end
360361
362+ # throw error if no search area had been found for a bface
363+ for source in 1 : num_sources (searchareas)
364+ if num_targets (searchareas, source) == 0
365+ throw (" bface $source has no valid search area on the opposite side of the grid. Are from/to regions and give_opposite! function correct?" )
366+ end
367+ end
368+
361369 # loop over boundary face indices: we need this index for dofs_on_boundary
362370 for i_boundary_face in 1 : n_boundary_faces
363371
@@ -372,7 +380,8 @@ function _get_periodic_coupling_matrix(
372380 end
373381
374382 # reset
375- fill! (fe_vector_target. entries, 0.0 )
383+ empty! (fe_vector_target. entries. nzind)
384+ empty! (fe_vector_target. entries. nzval)
376385
377386 # activate one entry
378387 fe_vector. entries[local_dof] = 1.0
@@ -394,7 +403,7 @@ function _get_periodic_coupling_matrix(
394403 fe_vector. entries[local_dof] = 0.0
395404
396405 # set entries
397- for (i, target_entry) in enumerate ( fe_vector_target. entries)
406+ for (i, target_entry) in zip ( findnz ( fe_vector_target. entries) ... )
398407 if abs (target_entry) > sparsity_tol
399408 result[local_dof, i] = target_entry
400409 end
0 commit comments