32template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
45template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
55 ,
fe(
FE_Q<reduced_dim, spacedim>(
par.fe_degree),
64template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
84template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
92template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
101 VTKUtils::read_vtk(
par.reduced_grid_name,
102 serial_properties_dh,
106 std::cout <<
"Read VTK file: " <<
par.reduced_grid_name
107 <<
", properties norm: " << serial_properties.
l2_norm()
118 std::cout <<
"Process "
120 <<
" has no locally owned cells." << std::endl;
129 VTKUtils::serial_vector_to_distributed_vector(serial_properties_dh,
137 const auto block_indices = VTKUtils::get_block_indices(properties_fe);
139 for (
unsigned int i = 0; i < block_indices.size(); ++i)
142 std::cout <<
"Property name: " << name <<
", block index: " << i
143 <<
", block size: " << block_indices.block_size(i)
144 <<
", block start: " << block_indices.block_start(i)
147 std::cout <<
"Properties norm: " <<
properties.l2_norm() << std::endl;
148 std::cout <<
"Serial properties norm: " << serial_properties.
l2_norm()
150 AssertDimension(block_indices.total_size(), properties_fe.n_components());
154template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
168template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
169const std::vector<Point<spacedim>> &
174 const int global_qpoints =
180 "No quadrature points exist across all MPI ranks. You must call compute_points_and_weights() first"));
184template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
185const std::vector<std::vector<double>> &
190 const int global_weights =
193 ExcMessage(
"No weights exist across all MPI ranks. You must call"
194 " compute_points_and_weights() first"));
198template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
199const std::vector<Point<spacedim>> &
204 const int global_reduced_qpoints =
207 global_reduced_qpoints > 0,
209 "No reduced quadrature points exist across all MPI ranks. You must call"
210 " compute_points_and_weights() first"));
214template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
215const std::vector<std::vector<double>> &
220 const int global_reduced_weights =
224 "No reduced weights exist across all MPI ranks. You must call"
225 " compute_points_and_weights() first"));
230template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
234 const std::map<unsigned int, IndexSet> &remote_q_point_indices)
236 auto global_cell_indices =
240 std::map<types::global_cell_index, std::vector<types::global_dof_index>>>
243 for (
const auto &[proc, cell_indices] : global_cell_indices)
244 for (
const auto &
id : cell_indices)
248 auto local_dof_indices =
251 for (
const auto &[proc, cell_indices] : local_dof_indices)
258template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
259const std::vector<types::global_dof_index> &
265 ExcMessage(
"Cell index not found in global cell to dof indices."));
271template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
272std::tuple<unsigned int, unsigned int, unsigned int>
283 const unsigned int qpoint_index_in_cell =
286 const unsigned int qpoint_index_in_section =
294 qpoint_index_in_cell,
295 qpoint_index_in_section);
299template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
300std::map<unsigned int, IndexSet>
303 const std::map<unsigned int, IndexSet> &remote_q_point_indices)
const
305 std::map<unsigned int, IndexSet> cell_indices;
309 ->locally_owned_range();
311 auto local_q_point_indices =
314 for (
const auto &[proc, qpoint_indices] : local_q_point_indices)
317 for (
const auto &qpoint_index : qpoint_indices)
325 cell_indices[proc] = cell_indices_for_proc;
332template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
338 for (
const auto &cell :
dof_handler.active_cell_iterators())
339 if (cell->is_locally_owned())
341 std::vector<types::global_dof_index> dof_indices(
fe.n_dofs_per_cell());
342 cell->get_dof_indices(dof_indices);
348template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
356 ->locally_owned_range();
361 const unsigned int n_qpoints_per_cell =
367 return locally_owned_qpoints_set;
370template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
377 ->locally_owned_range();
384template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
387 const -> const
QGauss<reduced_dim> &
392template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
424 const unsigned int thickness_field_index =
428 par.thickness_field_name));
430 const auto thickness_start =
433 VTKUtils::get_block_indices(properties_fe)
434 .block_start(thickness_field_index);
441 for (
const auto &cell :
triangulation.active_cell_iterators())
442 if (cell->is_locally_owned())
451 properties_fe_values.
reinit(
452 cell->as_dof_handler_iterator(this->properties_dh));
460 for (
const auto &
w : JxW)
464 if constexpr (reduced_dim == 1)
465 new_vertical = cell->vertex(1) - cell->vertex(0);
469 const auto &qpoint = qpoints[q];
470 if constexpr (reduced_dim == 2)
473 auto cross_section_qpoints =
475 qpoint, new_vertical, thickness_values[q]);
478 cross_section_qpoints.get_points().begin(),
479 cross_section_qpoints.get_points().end());
481 for (
const auto &
w : cross_section_qpoints.get_weights())
487template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
495template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
498 const unsigned int)
const
500 return std::pow(
par.thickness, -((dim - reduced_dim) / 2.0));
503template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
511template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
519template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
527template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
528const std::vector<std::string> &
535template <
int reduced_dim,
int dim,
int spacedim,
int n_components>
536std::vector<std::string> &
const FiniteElement< dim, spacedim > & get_fe(const types::fe_index index=0) const
types::global_dof_index n_dofs() const
const std::vector< double > & get_JxW_values() const
void get_function_values(const ReadVector< Number > &fe_function, std::vector< Number > &values) const
const std::vector< Point< spacedim > > & get_quadrature_points() const
const Tensor< 1, spacedim > & normal_vector(const unsigned int q_point) const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > quadrature_point_indices() const
double JxW(const unsigned int q_point) const
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access > > &cell)
IndexSet tensor_product(const IndexSet &other) const
void add_index(const size_type index)
size_type nth_index_in_set(const size_type local_index) const
ParameterAcceptor(const std::string §ion_name="")
void add_parameter(const std::string &entry, ParameterType ¶meter, const std::string &documentation="", ParameterHandler &prm_=prm, const Patterns::PatternBase &pattern=*Patterns::Tools::Convert< ParameterType >::to_pattern())
real_type l2_norm() const
Handles the construction and management of a reference inclusion geometry and its basis.
parallel::fullydistributed::Triangulation< reduced_dim, spacedim > triangulation
std::vector< Point< spacedim > > reduced_qpoints
std::vector< std::vector< double > > reduced_weights
MPI_Comm mpi_communicator
const LinearAlgebra::distributed::Vector< double > & get_properties() const
const parallel::fullydistributed::Triangulation< reduced_dim, spacedim > & get_triangulation() const
std::vector< std::vector< double > > all_weights
const std::vector< Point< spacedim > > & get_locally_owned_qpoints() const
TensorProductSpace(const TensorProductSpaceParameters< reduced_dim, dim, spacedim, n_components > &par, MPI_Comm mpi_communicator=MPI_COMM_WORLD)
DoFHandler< reduced_dim, spacedim > properties_dh
double get_scaling(const unsigned int) const
void compute_points_and_weights()
const ReferenceCrossSection< dim - reduced_dim, spacedim, n_components > & get_reference_cross_section() const
auto get_quadrature() const -> const QGauss< reduced_dim > &
std::vector< Point< spacedim > > all_qpoints
std::function< void(parallel::fullydistributed::Triangulation< reduced_dim, spacedim > &)> set_partitioner
std::map< types::global_cell_index, std::vector< types::global_dof_index > > global_cell_to_dof_indices
const DoFHandler< reduced_dim, spacedim > & get_dof_handler() const
void update_local_dof_indices(const std::map< unsigned int, IndexSet > &remote_q_point_indices)
const std::vector< types::global_dof_index > & get_dof_indices(const types::global_cell_index cell_index) const
const DoFHandler< reduced_dim, spacedim > & get_properties_dh() const
const std::vector< std::vector< double > > & get_locally_owned_reduced_weights() const
void make_reduced_grid_and_properties()
IndexSet locally_relevant_indices() const
std::vector< std::string > properties_names
IndexSet locally_owned_qpoints() const
std::tuple< unsigned int, unsigned int, unsigned int > particle_id_to_cell_and_qpoint_indices(const unsigned int qpoint_index) const
DoFHandler< reduced_dim, spacedim > dof_handler
const std::vector< std::string > & get_properties_names() const
const std::vector< Point< spacedim > > & get_locally_owned_reduced_qpoints() const
LinearAlgebra::distributed::Vector< double > properties
QGauss< reduced_dim > quadrature_formula
const TensorProductSpaceParameters< reduced_dim, dim, spacedim, n_components > & par
std::map< unsigned int, IndexSet > local_q_point_indices_to_global_cell_indices(const std::map< unsigned int, IndexSet > &local_q_point_indices) const
const std::vector< std::vector< double > > & get_locally_owned_weights() const
ReferenceCrossSection< cross_section_dim, spacedim, n_components > reference_cross_section
FESystem< reduced_dim, spacedim > fe
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
#define AssertThrow(cond, exc)
IndexSet complete_index_set(const IndexSet::size_type N)
Tensor< 2, dim, Number > w(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
T sum(const T &t, const MPI_Comm mpi_communicator)
std::map< unsigned int, T > some_to_some(const MPI_Comm comm, const std::map< unsigned int, T > &objects_to_send)
unsigned int this_mpi_process(const MPI_Comm mpi_communicator)
constexpr unsigned int invalid_unsigned_int
::VectorizedArray< Number, width > pow(const ::VectorizedArray< Number, width > &, const Number p)
unsigned int global_cell_index
std::string thickness_field_name
TensorProductSpaceParameters()
std::string reduced_grid_name
Name of the grid to read from a file.