40 namespace DataOutImplementation
42 template <
int dim,
int spacedim>
44 const unsigned int n_datasets,
45 const unsigned int n_subdivisions,
47 const ::hp::MappingCollection<dim, spacedim> &mapping,
52 const std::vector<std::vector<unsigned int>> &cell_to_patch_index_map)
60 , cell_to_patch_index_map(&cell_to_patch_index_map)
67template <
int dim,
int spacedim>
94template <
int dim,
int spacedim>
99 const unsigned int n_subdivisions,
105 patch.n_subdivisions = n_subdivisions;
147 ReferenceCells::get_hypercube<dim>()))
153 patch.points_are_available =
true;
157 const std::vector<Point<spacedim>> &q_points =
161 for (
unsigned int i = 0; i < spacedim; ++i)
162 for (
unsigned int q = 0;
q < n_q_points; ++
q)
168 patch.points_are_available =
false;
176 unsigned int offset = 0;
180 for (
const auto &
dataset : this->dof_data)
184 const unsigned int n_components =
190 if (postprocessor !=
nullptr)
195 postprocessor->get_needed_update_flags();
197 if ((n_components == 1) &&
198 (
dataset->is_complex_valued() ==
false))
214 dataset->get_function_gradients(
221 dataset->get_function_hessians(
225 scratch_data.patch_values_scalar.solution_hessians);
243 postprocessor->evaluate_scalar_field(
258 if (
dataset->is_complex_valued() ==
false)
267 scratch_data.patch_values_system.solution_values);
270 dataset->get_function_gradients(
274 scratch_data.patch_values_system.solution_gradients);
277 dataset->get_function_hessians(
281 scratch_data.patch_values_system.solution_hessians);
289 if (n_components == 1)
301 ComponentExtractor::real_part,
305 for (
unsigned int i = 0;
307 .solution_values.size();
316 .solution_values[i][0] =
324 dataset->get_function_gradients(
327 ComponentExtractor::real_part,
329 .solution_gradients);
331 for (
unsigned int i = 0;
333 .solution_gradients.size();
342 .solution_gradients[i][0] =
344 .solution_gradients[i];
350 dataset->get_function_hessians(
354 scratch_data.patch_values_scalar
357 for (
unsigned int i = 0;
359 .solution_hessians.size();
364 .solution_hessians[i]
368 .solution_hessians[i][0] =
370 .solution_hessians[i];
384 ComponentExtractor::imaginary_part,
388 for (
unsigned int i = 0;
390 .solution_values.size();
399 .solution_values[i][1] =
407 dataset->get_function_gradients(
410 ComponentExtractor::imaginary_part,
411 scratch_data.patch_values_scalar
412 .solution_gradients);
414 for (
unsigned int i = 0;
416 .solution_gradients.size();
425 .solution_gradients[i][1] =
427 .solution_gradients[i];
433 dataset->get_function_hessians(
437 scratch_data.patch_values_scalar
440 for (
unsigned int i = 0;
442 .solution_hessians.size();
447 .solution_hessians[i]
451 .solution_hessians[i][1] =
453 .solution_hessians[i];
488 std::vector<Vector<double>> tmp(
502 for (
unsigned int i = 0;
504 .solution_values.size();
512 for (
unsigned int j = 0;
j < n_components;
515 .solution_values[i][
j] = tmp[i][
j];
527 for (
unsigned int i = 0;
529 .solution_values.size();
532 for (
unsigned int j = 0;
j < n_components;
535 .solution_values[i][
j + n_components] =
543 std::vector<std::vector<Tensor<1, spacedim>>> tmp(
545 .solution_gradients.size(),
549 dataset->get_function_gradients(
555 for (
unsigned int i = 0;
557 .solution_gradients.size();
562 .solution_gradients[i]
565 for (
unsigned int j = 0;
j < n_components;
568 .solution_gradients[i][
j] = tmp[i][
j];
572 dataset->get_function_gradients(
578 for (
unsigned int i = 0;
580 .solution_gradients.size();
583 for (
unsigned int j = 0;
j < n_components;
586 .solution_gradients[i][
j + n_components] =
594 std::vector<std::vector<Tensor<2, spacedim>>> tmp(
596 .solution_gradients.size(),
600 dataset->get_function_hessians(
606 for (
unsigned int i = 0;
608 .solution_hessians.size();
613 .solution_hessians[i]
616 for (
unsigned int j = 0;
j < n_components;
619 .solution_hessians[i][
j] = tmp[i][
j];
623 dataset->get_function_hessians(
629 for (
unsigned int i = 0;
631 .solution_hessians.size();
634 for (
unsigned int j = 0;
j < n_components;
637 .solution_hessians[i][
j + n_components] =
661 postprocessor->evaluate_vector_field(
669 for (
unsigned int q = 0;
q < n_q_points; ++
q)
670 for (
unsigned int component = 0;
671 component <
dataset->n_output_variables;
679 offset +=
dataset->n_output_variables;
686 if (n_components == 1)
695 scratch_data.patch_values_scalar.solution_values);
696 for (
unsigned int q = 0;
q < n_q_points; ++
q)
706 if (
dataset->is_complex_valued() ==
true)
712 scratch_data.patch_values_scalar.solution_values);
713 for (
unsigned int q = 0;
q < n_q_points; ++
q)
728 if (
dataset->is_complex_valued() ==
false)
734 scratch_data.patch_values_system.solution_values);
735 for (
unsigned int component = 0; component < n_components;
737 for (
unsigned int q = 0;
q < n_q_points; ++
q)
743 offset +=
dataset->n_output_variables;
779 scratch_data.patch_values_system.solution_values);
790 for (
unsigned int component = 0;
791 component < n_components;
795 dataset->data_component_interpretation[component])
808 for (
unsigned int q = 0;
q < n_q_points;
812 .solution_values[
q](component);
834 const unsigned int size = spacedim;
835 for (
unsigned int c = 0; c <
size; ++c)
836 for (
unsigned int q = 0;
q < n_q_points;
840 .solution_values[
q](component + c);
852 const unsigned int size =
854 for (
unsigned int c = 0; c <
size; ++c)
855 for (
unsigned int q = 0;
q < n_q_points;
859 .solution_values[
q](component + c);
880 scratch_data.patch_values_system.solution_values);
883 for (
unsigned int component = 0;
884 component < n_components;
888 dataset->data_component_interpretation[component])
897 for (
unsigned int q = 0;
q < n_q_points;
901 .solution_values[
q](component);
917 const unsigned int size = spacedim;
918 for (
unsigned int c = 0; c <
size; ++c)
919 for (
unsigned int q = 0;
q < n_q_points;
923 .solution_values[
q](component + c);
935 const unsigned int size =
937 for (
unsigned int c = 0; c <
size; ++c)
938 for (
unsigned int q = 0;
q < n_q_points;
942 .solution_values[
q](component + c);
960 offset +=
dataset->n_output_variables * 2;
972 if (this->cell_data.size() != 0)
984 for (
unsigned int q = 0;
q < n_q_points; ++
q)
989 if (
dataset->is_complex_valued() ==
true)
995 for (
unsigned int q = 0;
q < n_q_points; ++
q)
999 offset += (
dataset->is_complex_valued() ? 2 : 1);
1025 const cell_iterator neighbor =
cell_and_index->first->neighbor(f);
1026 Assert(
static_cast<unsigned int>(neighbor->level()) <
1029 if ((
static_cast<unsigned int>(neighbor->index()) >=
1032 [neighbor->index()] ==
1041 patch.neighbors[f] =
1061template <
int dim,
int spacedim>
1075template <
int dim,
int spacedim>
1088template <
int dim,
int spacedim>
1101 const unsigned int n_subdivisions =
1103 Assert(n_subdivisions >= 1,
1107 this->validate_dataset_names();
1125 std::vector<std::vector<unsigned int>> cell_to_patch_index_map;
1126 cell_to_patch_index_map.resize(this->
triangulation->n_levels());
1127 for (
unsigned int l = 0; l < this->
triangulation->n_levels(); ++l)
1130 unsigned int max_index = 0;
1134 if (
static_cast<unsigned int>(cell->level()) == l)
1136 std::max(max_index,
static_cast<unsigned int>(cell->index()));
1138 cell_to_patch_index_map[l].resize(
1143 std::vector<std::pair<cell_iterator, unsigned int>>
all_cells;
1165 Assert(
static_cast<unsigned int>(cell->level()) <
1166 cell_to_patch_index_map.size(),
1168 Assert(
static_cast<unsigned int>(cell->index()) <
1169 cell_to_patch_index_map[cell->level()].size(),
1173 cell_to_patch_index_map[cell->level()][cell->index()] =
1180 this->patches.clear();
1189 unsigned int n_datasets = 0;
1190 for (
unsigned int i = 0; i < this->cell_data.size(); ++i)
1191 n_datasets += (this->cell_data[i]->is_complex_valued() &&
1192 (this->cell_data[i]->postprocessor ==
nullptr) ?
1195 for (
unsigned int i = 0; i < this->dof_data.size(); ++i)
1196 n_datasets += (this->dof_data[i]->n_output_variables *
1197 (this->dof_data[i]->is_complex_valued() &&
1198 (this->dof_data[i]->postprocessor ==
nullptr) ?
1204 if (this->dof_data[
dataset]->postprocessor)
1206 this->dof_data[
dataset]->n_output_variables;
1217 for (
unsigned int i = 0; i < this->dof_data.size(); ++i)
1218 if (this->dof_data[i]->postprocessor)
1220 this->dof_data[i]->postprocessor->get_needed_update_flags();
1226 "The update of normal vectors may not be requested for evaluation of "
1227 "data on cells via DataPostprocessor."));
1236 cell_to_patch_index_map);
1257 std::function<
void(
const int)>(),
1272template <
int dim,
int spacedim>
1280 first_cell_function = first_cell;
1281 next_cell_function = next_cell;
1286template <
int dim,
int spacedim>
1291 const auto first_cell =
1302 const auto next_cell =
1314 x.set_to_next_positive(cell);
1322 set_cell_selection(first_cell, next_cell);
1327template <
int dim,
int spacedim>
1328const std::pair<typename DataOut<dim, spacedim>::FirstCellFunctionType,
1332 return std::make_pair(first_cell_function, next_cell_function);
1338#include "data_out.inst"
value_type * data() const noexcept
virtual void build_patches(const unsigned int n_subdivisions=0)
typename std::function< cell_iterator(const Triangulation< dim, spacedim > &, const cell_iterator &)> NextCellFunctionType
void build_one_patch(const std::pair< cell_iterator, unsigned int > *cell_and_index, internal::DataOutImplementation::ParallelData< dim, spacedim > &scratch_data, const unsigned int n_subdivisions, const CurvedCellRegion curved_cell_region)
const std::pair< FirstCellFunctionType, NextCellFunctionType > get_cell_selection() const
typename DataOut_DoFData< dim, dim, spacedim, spacedim >::cell_iterator cell_iterator
void set_cell_selection(const std::function< cell_iterator(const Triangulation< dim, spacedim > &)> &first_cell, const std::function< cell_iterator(const Triangulation< dim, spacedim > &, const cell_iterator &)> &next_cell)
static unsigned int n_threads()
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcInvalidNumberOfSubdivisions(int arg1)
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcNoTriangulationSelected()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
typename ActiveSelector::cell_iterator cell_iterator
@ update_hessians
Second derivatives of shape functions.
@ update_values
Shape function values.
@ update_normal_vectors
Normal vectors.
@ update_gradients
Shape function gradients.
@ update_quadrature_points
Transformed quadrature points.
@ component_is_part_of_tensor
@ component_is_part_of_vector
void run(const std::vector< std::vector< Iterator > > &colored_iterators, Worker worker, Copier copier, const ScratchData &sample_scratch_data, const CopyData &sample_copy_data, const unsigned int queue_length=2 *MultithreadInfo::n_threads(), const unsigned int chunk_size=8)
static const unsigned int invalid_unsigned_int
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation
const FEValuesBase< dim, spacedim > & get_present_fe_values(const unsigned int dataset) const
const unsigned int n_datasets
DataPostprocessorInputs::Scalar< spacedim > patch_values_scalar
std::vector< std::vector<::Vector< double > > > postprocessed_values
DataPostprocessorInputs::Vector< spacedim > patch_values_system
void reinit_all_fe_values(std::vector< std::shared_ptr< DataEntryBase< dim, spacedim > > > &dof_data, const typename ::Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face=numbers::invalid_unsigned_int)
void resize_system_vectors(const unsigned int n_components)
const std::vector< std::vector< unsigned int > > * cell_to_patch_index_map
ParallelData(const unsigned int n_datasets, const unsigned int n_subdivisions, const std::vector< unsigned int > &n_postprocessor_outputs, const ::hp::MappingCollection< dim, spacedim > &mapping, const std::vector< std::shared_ptr<::hp::FECollection< dim, spacedim > > > &finite_elements, const UpdateFlags update_flags, const std::vector< std::vector< unsigned int > > &cell_to_patch_index_map)