// @note It is worth pointing out that calling the
// Particles::ParticleHandler::particles_in_cell() and
// Particles::ParticleHandler::n_particles_in_cell() functions is not
- // very effective on problems with a large number of particles. But it
+ // very efficient on problems with a large number of particles. But it
// illustrates the easiest way to write this algorithm, and so we are
// willing to incur this cost for the moment for expository purposes.
// We discuss the issue in more detail in the
* step a static sparse data exchange is performed.
*
* @note In contrast to NBX, this class splits the same
- * task into two distinct steps. In the first step, all processes
- * are identified who want to send a request to this process. In the
- * second step, the data is exchanged. However, since - in the
- * second step - now it is clear how many requests have to be answered,
- * i.e. when this process can stop waiting for requests, no IBarrier is
- * needed.
+ * task into two distinct steps. In the first step, all processes
+ * are identified who want to send a request to this process. In the
+ * second step, the data is exchanged. However, since - in the
+ * second step - now it is clear how many requests have to be answered,
+ * i.e. when this process can stop waiting for requests, no IBarrier is
+ * needed.
*
* @note The function
- * Utilities::MPI::compute_point_to_point_communication_pattern() is
- * used to determine the source processes, which implements a
- * PEX-algorithm from Hoefner et al., "Scalable Communication
- * Protocols for Dynamic Sparse Data Exchange".
+ * Utilities::MPI::compute_point_to_point_communication_pattern() is
+ * used to determine the source processes, which implements a
+ * PEX-algorithm from Hoefner et al., "Scalable Communication
+ * Protocols for Dynamic Sparse Data Exchange".
*
* @tparam T1 The type of the elements of the vector to be sent.
* @tparam T2 The type of the elements of the vector to be received.
* form, the constructor with the roots in form of a Lagrange polynomial
* must be used. In case a manipulation is done that changes the roots, the
* representation is switched to the coefficient form.
+ *
+ * This class is a typical example of a possible template argument for the
+ * TensorProductPolynomials class.
*/
template <typename number>
class Polynomial : public Subscriptor
* Definition of piecewise 1D polynomials for the unit interval. This space
* allows the description of interpolating polynomials on parts of the unit
* interval, similarly to the definition of finite element basis functions
- * on the subdivided elements. This primary purpose of this class is to
- * allow constructing FE_Q_iso_Q1 elements that put additional degrees of
- * freedom into an equivalent of a refined mesh instead of higher order
- * polynomials, which is useful when using mixed finite elements.
+ * on subdivided elements. The primary purpose of this class is to
+ * allow constructing the shape functions of the FE_Q_iso_Q1 class that has
+ * a number of interpolation points in each coordinate direction, but instead
+ * of using them for higher-order polynomials just chooses piecewise linear
+ * shape functions -- in effect, it is a $Q_1$ element defined on a
+ * subdivision of the reference cell, and replicated on each of these
+ * sub-cells.
+ *
+ * This class is not derived from the ScalarPolynomialsBase base class
+ * because it is not actually a polynomial -- it is a piecewise polynomial.
+ * However, it is interface-compatible with the Polynomials::Polynomial
+ * class, and consequently can be used as template argument for
+ * TensorProductPolynomials.
*
* @ingroup Polynomials
*/
* indices i,j,k of the one-dimensional polynomials in x,y and z direction.
* The ordering of the dim-dimensional polynomials can be changed by using the
* set_numbering() function.
+ *
+ * @tparam PolynomialType A class that satisfies the required interface for computing
+ * tensor products. Typical choices for this template argument are
+ * Polynomials::Polynomial and Polynomials::PiecewisePolynomial.
*/
template <int dim, typename PolynomialType = Polynomials::Polynomial<double>>
class TensorProductPolynomials : public ScalarPolynomialsBase<dim>