Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Redo some indexing inside FESystem. #14878

Merged
merged 1 commit into from
Mar 13, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
58 changes: 32 additions & 26 deletions source/fe/fe_system.cc
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,6 @@ namespace internal
copy_primitive_base_element_values(
const FESystem<dim, spacedim> &fe,
const unsigned int base_no,
const unsigned int n_q_points,
const UpdateFlags base_flags,
const Table<2, unsigned int> & base_to_system_table,
const FEValuesImplementation::FiniteElementRelatedData<dim, spacedim>
Expand All @@ -147,31 +146,39 @@ namespace internal
const unsigned int n_components = fe.element_multiplicity(base_no);
const unsigned int n_dofs_per_cell =
fe.base_element(base_no).n_dofs_per_cell();
for (unsigned int component = 0; component < n_components; ++component)
for (unsigned int b = 0; b < n_dofs_per_cell; ++b)
{
const unsigned int out_index = base_to_system_table[component][b];

if (base_flags & update_values)
for (unsigned int q = 0; q < n_q_points; ++q)
output_data.shape_values[out_index][q] =
base_data.shape_values[b][q];

if (base_flags & update_gradients)
for (unsigned int q = 0; q < n_q_points; ++q)
output_data.shape_gradients[out_index][q] =
base_data.shape_gradients[b][q];

if (base_flags & update_hessians)
for (unsigned int q = 0; q < n_q_points; ++q)
output_data.shape_hessians[out_index][q] =
base_data.shape_hessians[b][q];

if (base_flags & update_3rd_derivatives)
for (unsigned int q = 0; q < n_q_points; ++q)
output_data.shape_3rd_derivatives[out_index][q] =
base_data.shape_3rd_derivatives[b][q];
}
auto copy_row = [](const auto row_in, auto row_out) {
std::copy(row_in.begin(), row_in.end(), row_out.begin());
};

if (base_flags & update_values)
for (unsigned int component = 0; component < n_components; ++component)
for (unsigned int b = 0; b < n_dofs_per_cell; ++b)
copy_row(
base_data.shape_values[b],
output_data.shape_values[base_to_system_table[component][b]]);

if (base_flags & update_gradients)
for (unsigned int component = 0; component < n_components; ++component)
for (unsigned int b = 0; b < n_dofs_per_cell; ++b)
copy_row(
base_data.shape_gradients[b],
output_data.shape_gradients[base_to_system_table[component][b]]);

if (base_flags & update_hessians)
for (unsigned int component = 0; component < n_components; ++component)
for (unsigned int b = 0; b < n_dofs_per_cell; ++b)
copy_row(
base_data.shape_hessians[b],
output_data.shape_hessians[base_to_system_table[component][b]]);

if (base_flags & update_3rd_derivatives)
for (unsigned int component = 0; component < n_components; ++component)
for (unsigned int b = 0; b < n_dofs_per_cell; ++b)
copy_row(
base_data.shape_3rd_derivatives[b],
output_data
.shape_3rd_derivatives[base_to_system_table[component][b]]);
}

/**
Expand Down Expand Up @@ -1508,7 +1515,6 @@ FESystem<dim, spacedim>::compute_fill(
internal::copy_primitive_base_element_values(
*this,
base_no,
n_q_points,
base_flags,
primitive_offset_tables[base_no],
base_data,
Expand Down