From: Sebastian Proell Date: Tue, 11 Oct 2022 15:00:54 +0000 (+0200) Subject: DoFInfo: Setup pre and post list for faces X-Git-Tag: v9.5.0-rc1~900^2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F14343%2Fhead;p=dealii.git DoFInfo: Setup pre and post list for faces --- diff --git a/include/deal.II/matrix_free/dof_info.templates.h b/include/deal.II/matrix_free/dof_info.templates.h index d77348695c..7a036ea670 100644 --- a/include/deal.II/matrix_free/dof_info.templates.h +++ b/include/deal.II/matrix_free/dof_info.templates.h @@ -419,28 +419,47 @@ namespace internal } } if (faces.size() > 0) - for (unsigned int face = task_info.face_partition_data[chunk]; - face < task_info.face_partition_data[chunk + 1]; - ++face) - for (unsigned int v = 0; - v < length && faces[face].cells_exterior[v] != - numbers::invalid_unsigned_int; - ++v) - { - const unsigned int cell = faces[face].cells_exterior[v]; - for (unsigned int it = - row_starts[cell * n_components].first; - it != row_starts[(cell + 1) * n_components].first; - ++it) + { + const auto fill_touched_by_for_face = + [&](const unsigned int face) { + for (unsigned int v = 0; v < length; ++v) { - const unsigned int myindex = - dof_indices[it] / chunk_size_zero_vector; - if (touched_first_by[myindex] == - numbers::invalid_unsigned_int) - touched_first_by[myindex] = chunk; - touched_last_by[myindex] = chunk; + const auto fill_touched_by_for_cell = + [&](const unsigned cell) { + if (cell == numbers::invalid_unsigned_int) + return; + for (unsigned int it = + row_starts[cell * n_components].first; + it != + row_starts[(cell + 1) * n_components].first; + ++it) + { + const unsigned int myindex = + dof_indices[it] / chunk_size_zero_vector; + if (touched_first_by[myindex] == + numbers::invalid_unsigned_int) + touched_first_by[myindex] = chunk; + touched_last_by[myindex] = chunk; + } + }; + + fill_touched_by_for_cell(faces[face].cells_interior[v]); + fill_touched_by_for_cell(faces[face].cells_exterior[v]); } - } + }; + + for (unsigned int face = task_info.face_partition_data[chunk]; + face < task_info.face_partition_data[chunk + 1]; + ++face) + fill_touched_by_for_face(face); + + + for (unsigned int face = + task_info.boundary_partition_data[chunk]; + face < task_info.boundary_partition_data[chunk + 1]; + ++face) + fill_touched_by_for_face(face); + } } // ensure that all indices are touched at least during the last round