54 typename VectorOperation,
55 typename VectorizedArrayType>
58 const VectorOperation & operation,
59 const std::vector<dealii::ArrayView<const Number>> &data_others,
60 VectorizedArrayType * dst,
61 const unsigned int cell_batch_number)
const;
85 typename VectorOperation,
86 typename VectorizedArrayType>
89 const VectorOperation & operation,
90 const std::vector<dealii::ArrayView<const Number>> &data_others,
91 VectorizedArrayType * dst,
92 const unsigned int * face_no,
93 const unsigned int * face_orientation,
94 const unsigned int face_orientation_offset,
95 const unsigned int cell_batch_number,
96 const unsigned int cell_side,
97 const unsigned int face_batch_number,
98 const unsigned int face_side)
const;
101 const std::array<std::vector<unsigned char>, 4>
102 &n_vectorization_lanes_filled;
103 const std::array<std::vector<std::pair<unsigned int, unsigned int>>, 4>
104 & dof_indices_contiguous_ptr;
105 const std::array<std::vector<bool>, 4> &face_type;
106 const std::array<std::vector<bool>, 4> &face_all;
108 const std::vector<std::vector<unsigned int>> &face_to_cell_index_nodal;
109 const std::vector<std::vector<unsigned int>> &face_orientations;
137 const VectorOperation & operation,
138 const std::vector<dealii::ArrayView<const Number>> &global,
139 VectorizedArrayType * local,
140 const unsigned int cell_batch_number)
const
142 static const unsigned int v_len = VectorizedArrayType::size();
143 static const unsigned int n_dofs_per_cell =
144 dealii::Utilities::pow<unsigned int>(degree + 1, dim);
147 std::array<Number *, v_len> global_ptr;
148 std::fill(global_ptr.begin(), global_ptr.end(),
nullptr);
150 for (
unsigned int v = 0;
151 v < n_vectorization_lanes_filled[2][cell_batch_number] &&
156 dof_indices_contiguous_ptr[2][v_len * cell_batch_number + v];
158 const_cast<Number *
>(global[sm_ptr.first].data()) + sm_ptr.second;
162 if (n_vectorization_lanes_filled[2][cell_batch_number] == v_len)
164 operation.process_dofs_vectorized_transpose(n_dofs_per_cell,
169 for (
unsigned int i = 0; i < n_dofs_per_cell; ++i)
170 for (
unsigned int v = 0;
171 v < n_vectorization_lanes_filled[2][cell_batch_number] &&
174 operation.process_dof(global_ptr[v][i], local[i][v]);
187 const VectorOperation & operation,
188 const std::vector<dealii::ArrayView<const Number>> &global,
189 VectorizedArrayType * local,
190 const unsigned int * face_no,
191 const unsigned int * face_orientation,
192 const unsigned int face_orientation_offset,
193 const unsigned int cell_batch_number,
194 const unsigned int cell_side,
195 const unsigned int face_batch_number,
196 const unsigned int face_side)
const
198 static const unsigned int dim = dim_x + dim_v;
199 static const unsigned int v_len = VectorizedArrayType::size();
200 static const unsigned int n_dofs_per_face =
201 dealii::Utilities::pow<unsigned int>(degree + 1, dim - 1);
203 std::array<Number *, v_len> global_ptr;
204 std::fill(global_ptr.begin(), global_ptr.end(),
nullptr);
206 for (
unsigned int v = 0;
207 v < n_vectorization_lanes_filled[cell_side][cell_batch_number] &&
211 AssertIndexRange(v_len * face_batch_number + v,
212 dof_indices_contiguous_ptr[face_side].size());
214 dof_indices_contiguous_ptr[face_side]
215 [v_len * face_batch_number + v];
217 const_cast<Number *
>(global[sm_ptr.first].data()) + sm_ptr.second;
220 if (n_vectorization_lanes_filled[cell_side][cell_batch_number] ==
222 (face_side == 2 || face_all[face_side][face_batch_number]))
224 if ((dim_x <= 2 && dim_v <= 2) || face_orientation[0] == 0)
226 if (face_side != 2 &&
227 face_type[face_side][v_len * face_batch_number])
230 for (
unsigned int i = 0; i < n_dofs_per_face; ++i)
231 for (
unsigned int v = 0; v < v_len; ++v)
232 operation.process_dof(global_ptr[v][i], local[i][v]);
237 for (
unsigned int i = 0; i < n_dofs_per_face; ++i)
238 for (
unsigned int v = 0; v < v_len; ++v)
239 operation.process_dof(
241 [face_to_cell_index_nodal[face_no[0]][i]],
247 const auto &face_orientations_ =
248 face_orientations[face_orientation[0] +
249 face_orientation_offset];
250 if (face_side != 2 &&
251 face_type[face_side][v_len * face_batch_number])
254 for (
unsigned int i = 0; i < n_dofs_per_face; ++i)
256 const unsigned int i_ = face_orientations_[i];
257 for (
unsigned int v = 0; v < v_len; ++v)
258 operation.process_dof(global_ptr[v][i], local[i_][v]);
264 for (
unsigned int i = 0; i < n_dofs_per_face; ++i)
266 const unsigned int i_ = face_orientations_[i];
267 for (
unsigned int v = 0; v < v_len; ++v)
268 operation.process_dof(
270 [face_to_cell_index_nodal[face_no[0]][i]],
277 for (
unsigned int v = 0;
278 v < n_vectorization_lanes_filled[cell_side][cell_batch_number] &&
282 if (((dim_x <= 2) && (dim_v <= 2)) ||
283 face_orientation[face_side == 3 ? v : 0] == 0)
285 if (face_side != 2 &&
286 face_type[face_side][v_len * face_batch_number + v])
289 for (
unsigned int i = 0; i < n_dofs_per_face; ++i)
290 operation.process_dof(global_ptr[v][i], local[i][v]);
295 for (
unsigned int i = 0; i < n_dofs_per_face; ++i)
296 operation.process_dof(
297 global_ptr[v][face_to_cell_index_nodal
298 [face_no[face_side == 3 ? v : 0]][i]],
304 const auto &face_orientations_ =
305 face_orientations[face_orientation[face_side == 3 ? v : 0] +
306 face_orientation_offset];
308 if (face_side != 2 &&
309 face_type[face_side][v_len * face_batch_number + v])
312 for (
unsigned int i = 0; i < n_dofs_per_face; ++i)
314 const unsigned int i_ = face_orientations_[i];
316 operation.process_dof(global_ptr[v][i], local[i_][v]);
322 for (
unsigned int i = 0; i < n_dofs_per_face; ++i)
324 const unsigned int i_ = face_orientations_[i];
325 operation.process_dof(
327 [face_to_cell_index_nodal
328 [face_no[face_side == 3 ? v : 0]][i]],
void process_face(const VectorOperation &operation, const std::vector< dealii::ArrayView< const Number > > &data_others, VectorizedArrayType *dst, const unsigned int *face_no, const unsigned int *face_orientation, const unsigned int face_orientation_offset, const unsigned int cell_batch_number, const unsigned int cell_side, const unsigned int face_batch_number, const unsigned int face_side) const
Definition read_write_operation.h:186