ArrayView
}
+// DoFHandler (for iterators!)
+DOFHANDLER_TEMPLATE := { DoFHandler }
+
// DoFHandler and hp::DoFHandler templates
-DOFHANDLER_TEMPLATES := { DoFHandler;
- hp::DoFHandler }
+DOFHANDLER_TEMPLATES := { DoFHandler; hp::DoFHandler }
// Triangulation and DoFHandler templates
TRIANGULATION_AND_DOFHANDLER_TEMPLATES := { Triangulation;
DoFHandler;
hp::DoFHandler }
+// concrete sequential Triangulation and DoFHandler with hard-coded
+// <deal_II_dimension, deal_II_space_dimension> (for iterators!)
+SEQUENTIAL_TRIANGULATION_AND_DOFHANDLER := { Triangulation<deal_II_dimension, deal_II_space_dimension>;
+ DoFHandler<deal_II_dimension, deal_II_space_dimension> }
+
// concrete sequential Triangulation and DoFHandler types with hard-coded
// <deal_II_dimension, deal_II_space_dimension>
SEQUENTIAL_TRIANGULATION_AND_DOFHANDLERS := { Triangulation<deal_II_dimension, deal_II_space_dimension>;
--- /dev/null
+Deprecated: The class hp::DoFHandler has been deprecated, since the DoFHandler
+has been extended with its functionalities.
+<br>
+(Peter Munch, 2020/05/23)
--- /dev/null
+Changed: The internal data structures of DoFHandler have been modified to use
+compressed row storage, enabling it to also handle hp::DoFHandler functionalities.
+Currently, the user can choose between the normal mode and the hp mode during
+calling the constructur. Please note that the multigrid functionalities are only
+available during normal mode.
+<br>
+(Peter Munch, 2020/05/23)
Triangulation<dim> triangulation;
- hp::DoFHandler<dim> dof_handler;
+ DoFHandler<dim> dof_handler;
hp::FECollection<dim> fe_collection;
hp::QCollection<dim> quadrature_collection;
hp::QCollection<dim - 1> face_quadrature_collection;
template <int dim>
LaplaceProblem<dim>::LaplaceProblem()
- : dof_handler(triangulation)
+ : dof_handler(triangulation, /*enable_hp_capability */ true)
, max_degree(dim <= 2 ? 7 : 5)
{
for (unsigned int degree = 2; degree <= max_degree; ++degree)
// DoFHandler@<dim@>, which is why we have never seen it in previous
// tutorial programs) that indicates the type of DoF handler to be
// used. Here, we have to use the hp::DoFHandler class:
- DataOut<dim, hp::DoFHandler<dim>> data_out;
+ DataOut<dim, DoFHandler<dim>> data_out;
data_out.attach_dof_handler(dof_handler);
data_out.add_data_vector(solution, "solution");
};
static bool cell_is_in_fluid_domain(
- const typename hp::DoFHandler<dim>::cell_iterator &cell);
+ const typename DoFHandler<dim>::cell_iterator &cell);
static bool cell_is_in_solid_domain(
- const typename hp::DoFHandler<dim>::cell_iterator &cell);
+ const typename DoFHandler<dim>::cell_iterator &cell);
void make_grid();
FESystem<dim> stokes_fe;
FESystem<dim> elasticity_fe;
hp::FECollection<dim> fe_collection;
- hp::DoFHandler<dim> dof_handler;
+ DoFHandler<dim> dof_handler;
AffineConstraints<double> constraints;
1,
FE_Q<dim>(elasticity_degree),
dim)
- , dof_handler(triangulation)
+ , dof_handler(triangulation, /*enable_hp_capability */ true)
, viscosity(2)
, lambda(1)
, mu(1)
template <int dim>
bool FluidStructureProblem<dim>::cell_is_in_fluid_domain(
- const typename hp::DoFHandler<dim>::cell_iterator &cell)
+ const typename DoFHandler<dim>::cell_iterator &cell)
{
return (cell->material_id() == fluid_domain_id);
}
template <int dim>
bool FluidStructureProblem<dim>::cell_is_in_solid_domain(
- const typename hp::DoFHandler<dim>::cell_iterator &cell)
+ const typename DoFHandler<dim>::cell_iterator &cell)
{
return (cell->material_id() == solid_domain_id);
}
data_component_interpretation.push_back(
DataComponentInterpretation::component_is_part_of_vector);
- DataOut<dim, hp::DoFHandler<dim>> data_out;
+ DataOut<dim, DoFHandler<dim>> data_out;
data_out.attach_dof_handler(dof_handler);
data_out.add_data_vector(solution,
solution_names,
- DataOut<dim, hp::DoFHandler<dim>>::type_dof_data,
+ DataOut<dim, DoFHandler<dim>>::type_dof_data,
data_component_interpretation);
data_out.build_patches();
* weight or, in other words, the additional computational load associated
* with it.
*/
- using WeightingFunction = std::function<unsigned int(
- const typename hp::DoFHandler<dim, spacedim>::cell_iterator &,
- const FiniteElement<dim, spacedim> &)>;
+ using WeightingFunction = std::function<
+ unsigned int(const typename DoFHandler<dim, spacedim>::cell_iterator &,
+ const FiniteElement<dim, spacedim> &)>;
/**
* Constructor.
* @param[in] weighting_function The function that determines each
* cell's weight during load balancing.
*/
- CellWeights(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const WeightingFunction & weighting_function);
+ CellWeights(const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const WeightingFunction & weighting_function);
/**
* Destructor.
* Disconnects the function previously connected to the weighting signal.
*/
void
- reinit(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const WeightingFunction & weighting_function);
+ reinit(const DoFHandler<dim, spacedim> &dof_handler,
+ const WeightingFunction & weighting_function);
/**
* Converts a @p weighting_function to a different type that qualifies as
static std::function<unsigned int(
const typename Triangulation<dim, spacedim>::cell_iterator &cell,
const typename Triangulation<dim, spacedim>::CellStatus status)>
- make_weighting_callback(const hp::DoFHandler<dim, spacedim> &dof_handler,
+ make_weighting_callback(const DoFHandler<dim, spacedim> &dof_handler,
const WeightingFunction &weighting_function);
/**
* determine each cell's finite element.
*/
DEAL_II_DEPRECATED
- CellWeights(const hp::DoFHandler<dim, spacedim> &dof_handler);
+ CellWeights(const dealii::DoFHandler<dim, spacedim> &dof_handler);
/**
* Choose a constant weight @p factor on each cell.
*/
DEAL_II_DEPRECATED void
register_custom_weighting(
- const std::function<unsigned int(
- const FiniteElement<dim, spacedim> &,
- const typename hp::DoFHandler<dim, spacedim>::cell_iterator &)>
+ const std::function<
+ unsigned int(const FiniteElement<dim, spacedim> &,
+ const typename DoFHandler<dim, spacedim>::cell_iterator &)>
custom_function);
/**
* Pointer to the degree of freedom handler.
*/
DEAL_II_DEPRECATED
- SmartPointer<const dealii::hp::DoFHandler<dim, spacedim>, CellWeights>
+ SmartPointer<const dealii::DoFHandler<dim, spacedim>, CellWeights>
dof_handler;
/**
weighting_callback(
const typename Triangulation<dim, spacedim>::cell_iterator &cell,
const typename Triangulation<dim, spacedim>::CellStatus status,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const parallel::TriangulationBase<dim, spacedim> & triangulation,
const WeightingFunction &weighting_function);
};
#ifndef DOXYGEN
template <int dim, int spacedim>
class DoFHandler;
-namespace hp
-{
- template <int dim, int spacedim>
- class DoFHandler;
-}
#endif
bool levels_only = false,
bool active_only = false);
- /**
- * The same as above but for hp::DoFHandler.
- *
- * @note Not implemented.
- */
- template <int dim, int spacedim>
- void
- initialize(const hp::DoFHandler<dim, spacedim> &,
- bool levels_only = false,
- bool active_only = false);
-
/**
* @brief Initialize block structure on cells and compute renumbering
* between cell dofs and block cell dofs.
void
initialize_local(const DoFHandler<dim, spacedim> &);
- /**
- * The same as above but for hp::DoFHandler.
- *
- * @note Not implemented.
- */
- template <int dim, int spacedim>
- void
- initialize_local(const hp::DoFHandler<dim, spacedim> &);
-
/**
* Access the BlockIndices structure of the global system.
*/
#include <deal.II/base/config.h>
#include <deal.II/dofs/dof_handler.h>
+#include <deal.II/dofs/dof_iterator_selector.h>
#include <deal.II/grid/tria_accessor.h>
*/
using BaseClass = dealii::CellAccessor<dim, spacedim>;
};
+
+ struct Implementation;
} // namespace DoFAccessorImplementation
} // namespace internal
void
get_dof_indices(
std::vector<types::global_dof_index> &dof_indices,
- const unsigned int fe_index = DoFHandlerType::default_fe_index) const;
+ const unsigned int fe_index = DoFHandlerType::invalid_fe_index) const;
/**
* Return the global multilevel indices of the degrees of freedom that live
get_mg_dof_indices(
const int level,
std::vector<types::global_dof_index> &dof_indices,
- const unsigned int fe_index = DoFHandlerType::default_fe_index) const;
+ const unsigned int fe_index = DoFHandlerType::invalid_fe_index) const;
/**
* Set the level DoF indices that are returned by get_mg_dof_indices.
set_mg_dof_indices(
const int level,
const std::vector<types::global_dof_index> &dof_indices,
- const unsigned int fe_index = DoFHandlerType::default_fe_index);
+ const unsigned int fe_index = DoFHandlerType::invalid_fe_index);
/**
* Global DoF index of the <i>i</i> degree associated with the @p vertexth
vertex_dof_index(
const unsigned int vertex,
const unsigned int i,
- const unsigned int fe_index = DoFHandlerType::default_fe_index) const;
+ const unsigned int fe_index = DoFHandlerType::invalid_fe_index) const;
/**
* Return the global DoF index of the <code>i</code>th degree of freedom
const int level,
const unsigned int vertex,
const unsigned int i,
- const unsigned int fe_index = DoFHandlerType::default_fe_index) const;
+ const unsigned int fe_index = DoFHandlerType::invalid_fe_index) const;
/**
* Index of the <i>i</i>th degree of freedom of this object.
types::global_dof_index
dof_index(
const unsigned int i,
- const unsigned int fe_index = DoFHandlerType::default_fe_index) const;
+ const unsigned int fe_index = DoFHandlerType::invalid_fe_index) const;
/**
* Return the dof_index on the given level. Also see dof_index.
set_dof_index(
const unsigned int i,
const types::global_dof_index index,
- const unsigned int fe_index = DoFHandlerType::default_fe_index) const;
+ const unsigned int fe_index = DoFHandlerType::invalid_fe_index) const;
void
set_mg_dof_index(const int level,
const unsigned int vertex,
const unsigned int i,
const types::global_dof_index index,
- const unsigned int fe_index = DoFHandlerType::default_fe_index) const;
+ const unsigned int fe_index = DoFHandlerType::invalid_fe_index) const;
void
set_mg_vertex_dof_index(
const unsigned int vertex,
const unsigned int i,
const types::global_dof_index index,
- const unsigned int fe_index = DoFHandlerType::default_fe_index) const;
+ const unsigned int fe_index = DoFHandlerType::invalid_fe_index) const;
// Iterator classes need to be friends because they need to access
// operator== and operator!=.
void
get_dof_indices(
std::vector<types::global_dof_index> &dof_indices,
- const unsigned int fe_index = AccessorData::default_fe_index) const;
+ const unsigned int fe_index = AccessorData::invalid_fe_index) const;
/**
* Return the global multilevel indices of the degrees of freedom that live
get_mg_dof_indices(
const int level,
std::vector<types::global_dof_index> &dof_indices,
- const unsigned int fe_index = AccessorData::default_fe_index) const;
+ const unsigned int fe_index = AccessorData::invalid_fe_index) const;
/**
* Global DoF index of the <i>i</i> degree associated with the @p vertexth
vertex_dof_index(
const unsigned int vertex,
const unsigned int i,
- const unsigned int fe_index = AccessorData::default_fe_index) const;
+ const unsigned int fe_index = AccessorData::invalid_fe_index) const;
/**
* Index of the <i>i</i>th degree of freedom of this object.
*/
types::global_dof_index
dof_index(const unsigned int i,
- const unsigned int fe_index = AccessorData::default_fe_index) const;
+ const unsigned int fe_index = AccessorData::invalid_fe_index) const;
/**
* @}
set_dof_index(
const unsigned int i,
const types::global_dof_index index,
- const unsigned int fe_index = AccessorData::default_fe_index) const;
+ const unsigned int fe_index = AccessorData::invalid_fe_index) const;
/**
* Set the global index of the <i>i</i> degree on the @p vertex-th vertex of
const unsigned int vertex,
const unsigned int i,
const types::global_dof_index index,
- const unsigned int fe_index = AccessorData::default_fe_index) const;
+ const unsigned int fe_index = AccessorData::invalid_fe_index) const;
// Iterator classes need to be friends because they need to access
// operator== and operator!=.
set_dof_index(const unsigned int i,
const types::global_dof_index index,
const unsigned int fe_index =
- DoFHandler<dim, spacedim>::default_fe_index) const;
+ DoFHandler<dim, spacedim>::invalid_fe_index) const;
};
get_interpolated_dof_values(
const InputVector &values,
Vector<number> & interpolated_values,
- const unsigned int fe_index = DoFHandlerType::default_fe_index) const;
+ const unsigned int fe_index = DoFHandlerType::invalid_fe_index) const;
/**
* This function is the counterpart to get_interpolated_dof_values(): you
set_dof_values_by_interpolation(
const Vector<number> &local_values,
OutputVector & values,
- const unsigned int fe_index = DoFHandlerType::default_fe_index) const;
+ const unsigned int fe_index = DoFHandlerType::invalid_fe_index) const;
/**
* Distribute a local (cell based) vector to a global one by mapping the
#include <deal.II/grid/tria_iterator.h>
#include <deal.II/grid/tria_iterator.templates.h>
-#include <deal.II/hp/dof_faces.h>
-#include <deal.II/hp/dof_level.h>
-
#include <deal.II/lac/affine_constraints.h>
#include <deal.II/lac/read_write_vector.h>
DoFAccessor<structdim, DoFHandlerType, level_dof_access>::child(
const unsigned int i) const
{
- Assert(static_cast<unsigned int>(this->level()) <
- this->dof_handler->levels.size(),
+ Assert(static_cast<unsigned int>(this->present_level) <
+ this->dof_handler->object_dof_indices.size(),
ExcMessage("DoFHandler not initialized"));
TriaIterator<TriaAccessor<structdim,
*/
struct Implementation
{
- /**
- * Implementations of the get_dof_index/set_dof_index functions.
- */
- template <int spacedim>
- static types::global_dof_index
- get_dof_index(const dealii::DoFHandler<1, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 1>)
- {
- return dof_handler.levels[obj_level]->dof_object.get_dof_index(
- dof_handler, obj_index, fe_index, local_index);
- }
-
-
- template <int spacedim>
- static void
- set_dof_index(const dealii::DoFHandler<1, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 1>,
- const types::global_dof_index global_index)
- {
- dof_handler.levels[obj_level]->dof_object.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
- }
-
-
- template <int spacedim>
- static types::global_dof_index
- get_dof_index(const dealii::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 1>)
- {
- (void)obj_level;
- // faces have no levels
- Assert(obj_level == 0, ExcInternalError());
- return dof_handler.faces->lines.get_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index);
- }
-
-
- template <int spacedim>
- static void
- set_dof_index(const dealii::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 1>,
- const types::global_dof_index global_index)
- {
- (void)obj_level;
- // faces have no levels
- Assert(obj_level == 0, ExcInternalError());
- dof_handler.faces->lines.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
- }
-
-
- template <int spacedim>
- static types::global_dof_index
- get_dof_index(const dealii::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 2>)
- {
- return dof_handler.levels[obj_level]->dof_object.get_dof_index(
- dof_handler, obj_index, fe_index, local_index);
- }
-
-
- template <int spacedim>
- static void
- set_dof_index(const dealii::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 2>,
- const types::global_dof_index global_index)
- {
- dof_handler.levels[obj_level]->dof_object.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
- }
-
-
- template <int spacedim>
- static types::global_dof_index
- get_dof_index(const dealii::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 1>)
- {
- (void)obj_level;
- // faces have no levels
- Assert(obj_level == 0, ExcInternalError());
- return dof_handler.faces->lines.get_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index);
- }
-
-
- template <int spacedim>
- static void
- set_dof_index(const dealii::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 1>,
- const types::global_dof_index global_index)
- {
- (void)obj_level;
- // faces have no levels
- Assert(obj_level == 0, ExcInternalError());
- dof_handler.faces->lines.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
- }
-
-
-
- template <int spacedim>
- static types::global_dof_index
- get_dof_index(const dealii::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 2>)
- {
- (void)obj_level;
- // faces have no levels
- Assert(obj_level == 0, ExcInternalError());
- return dof_handler.faces->quads.get_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index);
- }
-
-
- template <int spacedim>
- static void
- set_dof_index(const dealii::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 2>,
- const types::global_dof_index global_index)
+ template <typename DoFHandlerType>
+ static const types::global_dof_index *
+ get_cache_ptr(DoFHandlerType * dof_handler,
+ const unsigned int present_level,
+ const unsigned int present_index,
+ const unsigned int dofs_per_cell)
{
- (void)obj_level;
- // faces have no levels
- Assert(obj_level == 0, ExcInternalError());
- dof_handler.faces->quads.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
- }
-
+ (void)dofs_per_cell;
-
- template <int spacedim>
- static types::global_dof_index
- get_dof_index(const dealii::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 3>)
- {
- return dof_handler.levels[obj_level]->dof_object.get_dof_index(
- dof_handler, obj_index, fe_index, local_index);
+ return &dof_handler
+ ->cell_dof_cache_indices[present_level]
+ [dof_handler->cell_dof_cache_ptr
+ [present_level][present_index]];
}
- template <int spacedim>
- static void
- set_dof_index(const dealii::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- std::integral_constant<int, 3>,
- const types::global_dof_index global_index)
- {
- dof_handler.levels[obj_level]->dof_object.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
- }
-
- template <int spacedim>
- static types::global_dof_index
- get_dof_index(const dealii::hp::DoFHandler<1, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 1> &)
- {
- return dof_handler.levels[obj_level]->get_dof_index(obj_index,
- fe_index,
- local_index);
- }
-
-
- template <int spacedim>
+ /**
+ * Set the @p local_index-th degree of freedom corresponding to the
+ * finite element specified by @p fe_index on the vertex with global
+ * number @p vertex_index to @p global_index.
+ */
+ template <typename DoFHandlerType, int d>
static void
- set_dof_index(const dealii::hp::DoFHandler<1, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 1> &,
+ set_dof_index(const DoFHandlerType &dof_handler,
+ const unsigned int obj_level,
+ const unsigned int obj_index,
+ const unsigned int fe_index,
+ const unsigned int local_index,
+ const std::integral_constant<int, d> &,
const types::global_dof_index global_index)
{
- dof_handler.levels[obj_level]->set_dof_index(obj_index,
- fe_index,
- local_index,
- global_index);
- }
+ Assert(d == DoFHandlerType::dimension || obj_level == 0,
+ ExcNotImplemented());
+ // 1) no hp used -> fe_index == 0
+ if (dof_handler.hp_capability_enabled == false)
+ {
+ AssertDimension(fe_index, DoFHandlerType::default_fe_index);
- template <int spacedim>
- static types::global_dof_index
- get_dof_index(const dealii::hp::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 1> &)
- {
- return dof_handler.faces->lines.get_dof_index(
- dof_handler, obj_index, fe_index, local_index, obj_level);
- }
+ if (d == 0)
+ dof_handler.object_dof_indices
+ [0][0][obj_index * dof_handler.get_fe().dofs_per_vertex +
+ local_index] = global_index;
+ else
+ dof_handler.object_dof_indices
+ [obj_level][d]
+ [dof_handler.object_dof_ptr[obj_level][d][obj_index] +
+ local_index] = global_index;
+ return;
+ }
- template <int spacedim>
- static void
- set_dof_index(const dealii::hp::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 1> &,
- const types::global_dof_index global_index)
- {
- dof_handler.faces->lines.set_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index,
- global_index,
- obj_level);
- }
+ // 2) cell and hp is used -> there is only one fe_index
+ if (d == DoFHandlerType::dimension)
+ {
+ dof_handler.object_dof_indices
+ [obj_level][d]
+ [dof_handler.object_dof_ptr[obj_level][d][obj_index] +
+ local_index] = global_index;
+ return;
+ }
+ // 3) general entity and hp is used
+ AssertIndexRange(obj_level, dof_handler.object_dof_indices.size());
+ AssertIndexRange(d, dof_handler.object_dof_indices[obj_level].size());
- template <int spacedim>
- static types::global_dof_index
- get_dof_index(const dealii::hp::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 2> &)
- {
- return dof_handler.levels[obj_level]->get_dof_index(obj_index,
- fe_index,
- local_index);
- }
+ unsigned int fe_index_;
+ if (dof_handler.hp_capability_enabled)
+ {
+ AssertIndexRange(d, dof_handler.hp_object_fe_ptr.size());
+ AssertIndexRange(obj_index, dof_handler.hp_object_fe_ptr[d].size());
+
+ const auto ptr =
+ std::find(dof_handler.hp_object_fe_indices[d].begin() +
+ dof_handler.hp_object_fe_ptr[d][obj_index],
+ dof_handler.hp_object_fe_indices[d].begin() +
+ dof_handler.hp_object_fe_ptr[d][obj_index + 1],
+ fe_index);
+
+ Assert(ptr != dof_handler.hp_object_fe_indices[d].begin() +
+ dof_handler.hp_object_fe_ptr[d][obj_index + 1],
+ ExcNotImplemented());
+
+ fe_index_ =
+ std::distance(dof_handler.hp_object_fe_indices[d].begin() +
+ dof_handler.hp_object_fe_ptr[d][obj_index],
+ ptr);
+ }
- template <int spacedim>
- static void
- set_dof_index(const dealii::hp::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 2> &,
- const types::global_dof_index global_index)
- {
- dof_handler.levels[obj_level]->set_dof_index(obj_index,
- fe_index,
- local_index,
- global_index);
+ AssertIndexRange(dof_handler.hp_capability_enabled ?
+ (dof_handler.hp_object_fe_ptr[d][obj_index] +
+ fe_index_) :
+ obj_index,
+ dof_handler.object_dof_ptr[obj_level][d].size());
+
+ AssertIndexRange(
+ dof_handler
+ .object_dof_ptr[obj_level][d]
+ [dof_handler.hp_capability_enabled ?
+ (dof_handler.hp_object_fe_ptr[d][obj_index] +
+ fe_index_) :
+ obj_index] +
+ local_index,
+ dof_handler.object_dof_indices[obj_level][d].size());
+
+ dof_handler.object_dof_indices
+ [obj_level][d]
+ [dof_handler.object_dof_ptr
+ [obj_level][d]
+ [dof_handler.hp_capability_enabled ?
+ (dof_handler.hp_object_fe_ptr[d][obj_index] + fe_index_) :
+ obj_index] +
+ local_index] = global_index;
}
- template <int spacedim>
+ /**
+ * Get the @p local_index-th degree of freedom corresponding to the
+ * finite element specified by @p fe_index on the vertex with global
+ * number @p vertex_index to @p global_index.
+ */
+ template <typename DoFHandlerType, int d>
static types::global_dof_index
- get_dof_index(const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 1> &)
- {
- return dof_handler.faces->lines.get_dof_index(
- dof_handler, obj_index, fe_index, local_index, obj_level);
- }
-
-
- template <int spacedim>
- static void
- set_dof_index(const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 1> &,
- const types::global_dof_index global_index)
- {
- dof_handler.faces->lines.set_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index,
- global_index,
- obj_level);
- }
+ get_dof_index(const DoFHandlerType &dof_handler,
+ const unsigned int obj_level,
+ const unsigned int obj_index,
+ const unsigned int fe_index,
+ const unsigned int local_index,
+ const std::integral_constant<int, d> &)
+ {
+ Assert(d == DoFHandlerType::dimension || obj_level == 0,
+ ExcNotImplemented());
+
+ // 1) no hp used -> fe_index == 0
+ if (dof_handler.hp_capability_enabled == false)
+ {
+ AssertDimension(fe_index, DoFHandlerType::default_fe_index);
+ if (d == 0)
+ return dof_handler.object_dof_indices
+ [0][0][obj_index * dof_handler.get_fe().dofs_per_vertex +
+ local_index];
+ else
+ return dof_handler.object_dof_indices
+ [obj_level][d]
+ [dof_handler.object_dof_ptr[obj_level][d][obj_index] +
+ local_index];
+ }
- template <int spacedim>
- static types::global_dof_index
- get_dof_index(const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 2> &)
- {
- return dof_handler.faces->quads.get_dof_index(
- dof_handler, obj_index, fe_index, local_index, obj_level);
- }
+ // 2) cell and hp is used -> there is only one fe_index
+ if (d == DoFHandlerType::dimension)
+ {
+ return dof_handler.object_dof_indices
+ [obj_level][d]
+ [dof_handler.object_dof_ptr[obj_level][d][obj_index] +
+ local_index];
+ }
+ // 3) general entity and hp is used
+ AssertIndexRange(obj_level, dof_handler.object_dof_indices.size());
+ AssertIndexRange(d, dof_handler.object_dof_indices[obj_level].size());
- template <int spacedim>
- static void
- set_dof_index(const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 2> &,
- const types::global_dof_index global_index)
- {
- dof_handler.faces->quads.set_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index,
- global_index,
- obj_level);
- }
+ unsigned int fe_index_;
+ if (dof_handler.hp_capability_enabled)
+ {
+ AssertIndexRange(d, dof_handler.hp_object_fe_ptr.size());
+ AssertIndexRange(obj_index, dof_handler.hp_object_fe_ptr[d].size());
+
+ const auto ptr =
+ std::find(dof_handler.hp_object_fe_indices[d].begin() +
+ dof_handler.hp_object_fe_ptr[d][obj_index],
+ dof_handler.hp_object_fe_indices[d].begin() +
+ dof_handler.hp_object_fe_ptr[d][obj_index + 1],
+ fe_index);
+
+ Assert(ptr != dof_handler.hp_object_fe_indices[d].begin() +
+ dof_handler.hp_object_fe_ptr[d][obj_index + 1],
+ ExcNotImplemented());
+
+ fe_index_ =
+ std::distance(dof_handler.hp_object_fe_indices[d].begin() +
+ dof_handler.hp_object_fe_ptr[d][obj_index],
+ ptr);
+ }
- template <int spacedim>
+ AssertIndexRange(dof_handler.hp_capability_enabled ?
+ (dof_handler.hp_object_fe_ptr[d][obj_index] +
+ fe_index_) :
+ obj_index,
+ dof_handler.object_dof_ptr[obj_level][d].size());
+
+ AssertIndexRange(
+ dof_handler
+ .object_dof_ptr[obj_level][d]
+ [dof_handler.hp_capability_enabled ?
+ (dof_handler.hp_object_fe_ptr[d][obj_index] +
+ fe_index_) :
+ obj_index] +
+ local_index,
+ dof_handler.object_dof_indices[obj_level][d].size());
+
+ return dof_handler.object_dof_indices
+ [obj_level][d]
+ [dof_handler.object_dof_ptr
+ [obj_level][d]
+ [dof_handler.hp_capability_enabled ?
+ (dof_handler.hp_object_fe_ptr[d][obj_index] + fe_index_) :
+ obj_index] +
+ local_index];
+ }
+
+
+ template <typename DoFHandlerType>
static types::global_dof_index
- get_dof_index(const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 3> &)
- {
- return dof_handler.levels[obj_level]->get_dof_index(obj_index,
- fe_index,
- local_index);
- }
-
-
- template <int spacedim>
- static void
- set_dof_index(const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const std::integral_constant<int, 3> &,
- const types::global_dof_index global_index)
+ mg_vertex_dof_index(const DoFHandlerType &dof_handler,
+ const int level,
+ const unsigned int vertex_index,
+ const unsigned int i)
{
- dof_handler.levels[obj_level]->set_dof_index(obj_index,
- fe_index,
- local_index,
- global_index);
- }
-
+ Assert(dof_handler.hp_capability_enabled == false,
+ ExcMessage(
+ "hp::DoFHandler does not implement multilevel DoFs."));
- template <int dim, int spacedim>
- static types::global_dof_index
- mg_vertex_dof_index(const dealii::DoFHandler<dim, spacedim> &dof_handler,
- const int level,
- const unsigned int vertex_index,
- const unsigned int i)
- {
return dof_handler.mg_vertex_dofs[vertex_index].get_index(
level, i, dof_handler.get_fe().dofs_per_vertex);
}
- template <int dim, int spacedim>
- static types::global_dof_index
- mg_vertex_dof_index(const dealii::hp::DoFHandler<dim, spacedim> &,
- const int,
- const unsigned int,
- const unsigned int)
- {
- Assert(false,
- ExcMessage(
- "hp::DoFHandler does not implement multilevel DoFs."));
- return numbers::invalid_dof_index;
- }
-
-
- template <int dim, int spacedim>
- static void
- set_mg_vertex_dof_index(dealii::DoFHandler<dim, spacedim> &dof_handler,
- const int level,
- const unsigned int vertex_index,
- const unsigned int i,
- types::global_dof_index index)
- {
- return dof_handler.mg_vertex_dofs[vertex_index].set_index(
- level, i, dof_handler.get_fe().dofs_per_vertex, index);
- }
-
- template <int dim, int spacedim>
+ template <typename DoFHandlerType>
static void
- set_mg_vertex_dof_index(dealii::hp::DoFHandler<dim, spacedim> &,
- const int,
- const unsigned int,
- const unsigned int,
- types::global_dof_index)
+ set_mg_vertex_dof_index(DoFHandlerType & dof_handler,
+ const int level,
+ const unsigned int vertex_index,
+ const unsigned int i,
+ types::global_dof_index index)
{
- Assert(false,
+ Assert(dof_handler.hp_capability_enabled == false,
ExcMessage(
"hp::DoFHandler does not implement multilevel DoFs."));
- }
-
-
-
- template <int structdim, int dim, int spacedim>
- static bool
- fe_index_is_active(const dealii::DoFHandler<dim, spacedim> &,
- const unsigned int,
- const unsigned int,
- const unsigned int fe_index,
- const std::integral_constant<int, structdim> &)
- {
- return (fe_index == 0);
- }
-
-
-
- template <int structdim, int dim, int spacedim>
- static unsigned int
- n_active_fe_indices(const dealii::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const std::integral_constant<int, structdim> &)
- {
- (void)dof_handler;
- (void)obj_level;
- (void)obj_index;
- // check that the object we look
- // at is in fact active. the
- // problem is that we have
- // templatized on the
- // dimensionality of the object,
- // so it may be a cell, a face,
- // or a line. we have a bit of
- // trouble doing this all in the
- // generic case, so only check if
- // it is either a cell or a
- // line. the only case this
- // leaves out is faces in 3d --
- // let's hope that this never is
- // a problem
- Assert((dim == structdim ?
- TriaRawIterator<dealii::CellAccessor<dim, spacedim>>(
- &dof_handler.get_triangulation(), obj_level, obj_index)
- ->used() :
- (structdim == 1 ?
- typename internal::TriangulationImplementation::
- Iterators<dim, spacedim>::raw_line_iterator(
- &dof_handler.get_triangulation(), obj_level, obj_index)
- ->used() :
- true)) == true,
- ExcMessage("This cell is not active and therefore can't be "
- "queried for its active FE indices"));
- return 1;
- }
-
-
-
- template <int structdim, int dim, int spacedim>
- static unsigned int
- nth_active_fe_index(const dealii::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int n,
- const std::integral_constant<int, structdim> &)
- {
- (void)dof_handler;
- (void)obj_level;
- (void)obj_index;
- (void)n;
- // check that the object we look
- // at is in fact active. the
- // problem is that we have
- // templatized on the
- // dimensionality of the object,
- // so it may be a cell, a face,
- // or a line. we have a bit of
- // trouble doing this all in the
- // generic case, so only check if
- // it is either a cell or a
- // line. the only case this
- // leaves out is faces in 3d --
- // let's hope that this never is
- // a problem
- Assert((dim == structdim ?
- TriaRawIterator<dealii::CellAccessor<dim, spacedim>>(
- &dof_handler.get_triangulation(), obj_level, obj_index)
- ->used() :
- (structdim == 1 ?
- typename internal::TriangulationImplementation::
- Iterators<dim, spacedim>::raw_line_iterator(
- &dof_handler.get_triangulation(), obj_level, obj_index)
- ->used() :
- true)) == true,
- ExcMessage("This cell is not active and therefore can't be "
- "queried for its active FE indices"));
- AssertIndexRange(n, 1);
-
- return dealii::DoFHandler<dim, spacedim>::default_fe_index;
- }
-
-
- template <int spacedim>
- static bool
- fe_index_is_active(const dealii::hp::DoFHandler<1, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const std::integral_constant<int, 1> &)
- {
- return dof_handler.levels[obj_level]->fe_index_is_active(obj_index,
- fe_index);
- }
-
-
- template <int spacedim>
- static unsigned int
- n_active_fe_indices(const dealii::hp::DoFHandler<1, spacedim> &,
- const unsigned int /*obj_level*/,
- const unsigned int /*obj_index*/,
- const std::integral_constant<int, 1> &)
- {
- // on a cell, the number of active elements is one
- return 1;
- }
-
-
-
- template <int spacedim>
- static unsigned int
- nth_active_fe_index(
- const dealii::hp::DoFHandler<1, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int n,
- const std::integral_constant<int, 1> &)
- {
- (void)n;
- Assert(n == 0,
- ExcMessage("On cells, there can only be one active FE index"));
- return dof_handler.levels[obj_level]->active_fe_index(obj_index);
- }
-
-
- template <int spacedim>
- static bool
- fe_index_is_active(const dealii::hp::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const std::integral_constant<int, 1> &)
- {
- return dof_handler.faces->lines.fe_index_is_active(dof_handler,
- obj_index,
- fe_index,
- obj_level);
- }
-
-
- template <int spacedim>
- static unsigned int
- n_active_fe_indices(
- const dealii::hp::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int,
- const unsigned int obj_index,
- const std::integral_constant<int, 1> &)
- {
- return dof_handler.faces->lines.n_active_fe_indices(dof_handler,
- obj_index);
- }
-
-
- template <int spacedim>
- static unsigned int
- nth_active_fe_index(
- const dealii::hp::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int n,
- const std::integral_constant<int, 1> &)
- {
- return dof_handler.faces->lines.nth_active_fe_index(dof_handler,
- obj_level,
- obj_index,
- n);
- }
-
-
-
- template <int spacedim>
- static bool
- fe_index_is_active(const dealii::hp::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const std::integral_constant<int, 2> &)
- {
- return dof_handler.levels[obj_level]->fe_index_is_active(obj_index,
- fe_index);
- }
-
-
- template <int spacedim>
- static unsigned int
- n_active_fe_indices(const dealii::hp::DoFHandler<2, spacedim> &,
- const unsigned int /*obj_level*/,
- const unsigned int /*obj_index*/,
- const std::integral_constant<int, 2> &)
- {
- // on a cell, the number of active elements is one
- return 1;
- }
-
-
-
- template <int spacedim>
- static unsigned int
- nth_active_fe_index(
- const dealii::hp::DoFHandler<2, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int n,
- const std::integral_constant<int, 2> &)
- {
- (void)n;
- Assert(n == 0,
- ExcMessage("On cells, there can only be one active FE index"));
- return dof_handler.levels[obj_level]->active_fe_index(obj_index);
- }
-
-
-
- template <int spacedim>
- static bool
- fe_index_is_active(const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const std::integral_constant<int, 1> &)
- {
- return dof_handler.faces->lines.fe_index_is_active(dof_handler,
- obj_index,
- fe_index,
- obj_level);
- }
-
- template <int spacedim>
- static unsigned int
- n_active_fe_indices(
- const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int,
- const unsigned int obj_index,
- const std::integral_constant<int, 1> &)
- {
- return dof_handler.faces->lines.n_active_fe_indices(dof_handler,
- obj_index);
- }
-
-
-
- template <int spacedim>
- static unsigned int
- nth_active_fe_index(
- const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int n,
- const std::integral_constant<int, 1> &)
- {
- return dof_handler.faces->lines.nth_active_fe_index(dof_handler,
- obj_level,
- obj_index,
- n);
- }
-
-
-
- template <int spacedim>
- static bool
- fe_index_is_active(const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const std::integral_constant<int, 2> &)
- {
- return dof_handler.faces->quads.fe_index_is_active(dof_handler,
- obj_index,
- fe_index,
- obj_level);
- }
-
- template <int spacedim>
- static bool
- fe_index_is_active(const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const std::integral_constant<int, 3> &)
- {
- return dof_handler.levels[obj_level]->fe_index_is_active(obj_index,
- fe_index);
- }
-
-
- template <int spacedim>
- static unsigned int
- n_active_fe_indices(
- const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int,
- const unsigned int obj_index,
- const std::integral_constant<int, 2> &)
- {
- return dof_handler.faces->quads.n_active_fe_indices(dof_handler,
- obj_index);
- }
-
-
-
- template <int spacedim>
- static unsigned int
- nth_active_fe_index(
- const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int n,
- const std::integral_constant<int, 2> &)
- {
- return dof_handler.faces->quads.nth_active_fe_index(dof_handler,
- obj_level,
- obj_index,
- n);
- }
-
-
-
- template <int spacedim>
- static unsigned int
- n_active_fe_indices(const dealii::hp::DoFHandler<3, spacedim> &,
- const unsigned int /*obj_level*/,
- const unsigned int /*obj_index*/,
- const std::integral_constant<int, 3> &)
- {
- // on a cell, the number of active elements is one
- return 1;
- }
-
-
-
- template <int spacedim>
- static unsigned int
- nth_active_fe_index(
- const dealii::hp::DoFHandler<3, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int n,
- const std::integral_constant<int, 3> &)
- {
- (void)n;
- Assert(n == 0,
- ExcMessage("On cells, there can only be one active FE index"));
- return dof_handler.levels[obj_level]->active_fe_index(obj_index);
- }
-
- /**
- * Set the @p local_index-th degree of freedom corresponding to the
- * finite element specified by @p fe_index on the vertex with global
- * number @p vertex_index to @p global_index.
- */
- template <int dim, int spacedim>
- static void
- set_vertex_dof_index(dealii::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int vertex_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const types::global_dof_index global_index)
- {
- (void)fe_index;
- Assert(
- (fe_index == dealii::DoFHandler<dim, spacedim>::default_fe_index),
- ExcMessage(
- "Only the default FE index is allowed for non-hp DoFHandler objects"));
- AssertIndexRange(local_index, dof_handler.get_fe().dofs_per_vertex);
-
- dof_handler
- .vertex_dofs[vertex_index * dof_handler.get_fe().dofs_per_vertex +
- local_index] = global_index;
- }
-
-
- template <int dim, int spacedim>
- static void
- set_vertex_dof_index(dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int vertex_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const types::global_dof_index global_index)
- {
- Assert((fe_index !=
- dealii::hp::DoFHandler<dim, spacedim>::default_fe_index),
- ExcMessage("You need to specify a FE index when working "
- "with hp DoFHandlers"));
- Assert(dof_handler.fe_collection.size() > 0,
- ExcMessage("No finite element collection is associated with "
- "this DoFHandler"));
- AssertIndexRange(local_index,
- dof_handler.get_fe(fe_index).dofs_per_vertex);
- Assert(fe_index < dof_handler.fe_collection.size(), ExcInternalError());
- Assert(dof_handler.vertex_dof_offsets[vertex_index] !=
- numbers::invalid_unsigned_int,
- ExcMessage(
- "This vertex is unused and has no DoFs associated with it"));
-
- // hop along the list of index
- // sets until we find the one
- // with the correct fe_index, and
- // then poke into that
- // part. trigger an exception if
- // we can't find a set for this
- // particular fe_index
- const unsigned int starting_offset =
- dof_handler.vertex_dof_offsets[vertex_index];
- types::global_dof_index *pointer =
- &dof_handler.vertex_dofs[starting_offset];
- while (true)
- {
- Assert(pointer <= &dof_handler.vertex_dofs.back(),
- ExcInternalError());
-
- // a fe index is always small
- Assert((*pointer) < std::numeric_limits<unsigned int>::max(),
- ExcInternalError());
- const types::global_dof_index this_fe_index = *pointer;
-
- Assert(this_fe_index != numbers::invalid_dof_index,
- ExcInternalError());
- Assert(this_fe_index < dof_handler.fe_collection.size(),
- ExcInternalError());
-
- if (this_fe_index == fe_index)
- {
- *(pointer + 1 + local_index) = global_index;
- return;
- }
- else
- pointer += static_cast<types::global_dof_index>(
- dof_handler.get_fe(this_fe_index).dofs_per_vertex + 1);
- }
- }
-
-
- /**
- * Get the @p local_index-th degree of freedom corresponding to the
- * finite element specified by @p fe_index on the vertex with global
- * number @p vertex_index to @p global_index.
- */
-
- template <int dim, int spacedim>
- static types::global_dof_index
- get_vertex_dof_index(const dealii::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int vertex_index,
- const unsigned int fe_index,
- const unsigned int local_index)
- {
- (void)fe_index;
- Assert(
- (fe_index == dealii::DoFHandler<dim, spacedim>::default_fe_index),
- ExcMessage(
- "Only the default FE index is allowed for non-hp DoFHandler objects"));
- AssertIndexRange(local_index, dof_handler.get_fe().dofs_per_vertex);
-
- return dof_handler
- .vertex_dofs[vertex_index * dof_handler.get_fe().dofs_per_vertex +
- local_index];
- }
-
-
- template <int dim, int spacedim>
- static types::global_dof_index
- get_vertex_dof_index(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int vertex_index,
- const unsigned int fe_index,
- const unsigned int local_index)
- {
- Assert((fe_index !=
- dealii::hp::DoFHandler<dim, spacedim>::default_fe_index),
- ExcMessage("You need to specify a FE index when working "
- "with hp DoFHandlers"));
- Assert(dof_handler.fe_collection.size() > 0,
- ExcMessage("No finite element collection is associated with "
- "this DoFHandler"));
- AssertIndexRange(local_index,
- dof_handler.get_fe(fe_index).dofs_per_vertex);
- AssertIndexRange(vertex_index, dof_handler.vertex_dof_offsets.size());
- Assert(dof_handler.vertex_dof_offsets[vertex_index] !=
- numbers::invalid_unsigned_int,
- ExcMessage(
- "This vertex is unused and has no DoFs associated with it"));
-
- // hop along the list of index
- // sets until we find the one
- // with the correct fe_index, and
- // then poke into that
- // part. trigger an exception if
- // we can't find a set for this
- // particular fe_index
- const unsigned int starting_offset =
- dof_handler.vertex_dof_offsets[vertex_index];
- const types::global_dof_index *pointer =
- &dof_handler.vertex_dofs[starting_offset];
- while (true)
- {
- Assert(pointer <= &dof_handler.vertex_dofs.back(),
- ExcInternalError());
-
- Assert((*pointer) <
- std::numeric_limits<types::global_dof_index>::max(),
- ExcInternalError());
- const types::global_dof_index this_fe_index = *pointer;
-
- Assert(this_fe_index != numbers::invalid_dof_index,
- ExcInternalError());
- Assert(this_fe_index < dof_handler.fe_collection.size(),
- ExcInternalError());
-
- if (this_fe_index == fe_index)
- return *(pointer + 1 + local_index);
- else
- pointer += static_cast<types::global_dof_index>(
- dof_handler.get_fe(this_fe_index).dofs_per_vertex + 1);
- }
+ return dof_handler.mg_vertex_dofs[vertex_index].set_index(
+ level, i, dof_handler.get_fe().dofs_per_vertex, index);
}
* Return the number of different finite elements that are active on a
* given vertex.
*/
- template <int dim, int spacedim>
+ template <typename DoFHandlerType, int d>
static unsigned int
- n_active_vertex_fe_indices(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int vertex_index)
+ n_active_fe_indices(const DoFHandlerType &dof_handler,
+ const unsigned int obj_level,
+ const unsigned int obj_index,
+ const std::integral_constant<int, d> &)
{
- Assert(dof_handler.fe_collection.size() > 0,
- ExcMessage("No finite element collection is associated with "
- "this DoFHandler"));
-
- // if this vertex is unused, return 0
- if (dof_handler.vertex_dof_offsets[vertex_index] ==
- numbers::invalid_unsigned_int)
- return 0;
-
- // hop along the list of index
- // sets and count the number of
- // hops
- const unsigned int starting_offset =
- dof_handler.vertex_dof_offsets[vertex_index];
- const types::global_dof_index *pointer =
- &dof_handler.vertex_dofs[starting_offset];
-
- Assert(*pointer != numbers::invalid_dof_index, ExcInternalError());
-
- unsigned int counter = 0;
- while (true)
- {
- Assert(pointer <= &dof_handler.vertex_dofs.back(),
- ExcInternalError());
+ (void)obj_level;
- const types::global_dof_index this_fe_index = *pointer;
+ Assert(d == DoFHandlerType::dimension || obj_level == 0,
+ ExcNotImplemented());
- if (this_fe_index == numbers::invalid_dof_index)
- return counter;
- else
- {
- pointer += static_cast<types::global_dof_index>(
- dof_handler.get_fe(this_fe_index).dofs_per_vertex + 1);
- ++counter;
- }
- }
+ // 1) no hp used -> fe_index == 0
+ if (dof_handler.hp_capability_enabled == false)
+ return 1;
+
+ // 2) cell and hp is used -> there is only one fe_index
+ if (d == DoFHandlerType::dimension)
+ return 1;
+
+ // 3) general entity and hp is used
+ AssertIndexRange(d, dof_handler.hp_object_fe_ptr.size());
+ AssertIndexRange(obj_index + 1, dof_handler.hp_object_fe_ptr[d].size());
+
+ return dof_handler.hp_object_fe_ptr[d][obj_index + 1] -
+ dof_handler.hp_object_fe_ptr[d][obj_index];
}
* Return the fe index of the n-th finite element active on a given
* vertex.
*/
- template <int dim, int spacedim>
+ template <typename DoFHandlerType, int d>
static unsigned int
- nth_active_vertex_fe_index(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int vertex_index,
- const unsigned int n)
- {
- Assert(dof_handler.fe_collection.size() > 0,
- ExcMessage("No finite element collection is associated with "
- "this DoFHandler"));
- Assert(n < n_active_vertex_fe_indices(dof_handler, vertex_index),
- ExcIndexRange(
- n, 0, n_active_vertex_fe_indices(dof_handler, vertex_index)));
- // make sure we don't ask on
- // unused vertices
- Assert(dof_handler.vertex_dof_offsets[vertex_index] !=
- numbers::invalid_unsigned_int,
- ExcInternalError());
-
- // hop along the list of index
- // sets and count the number of
- // hops
- const unsigned int starting_offset =
- dof_handler.vertex_dof_offsets[vertex_index];
- const types::global_dof_index *pointer =
- &dof_handler.vertex_dofs[starting_offset];
-
- Assert(*pointer != numbers::invalid_dof_index, ExcInternalError());
-
- unsigned int counter = 0;
- while (true)
- {
- Assert(pointer <= &dof_handler.vertex_dofs.back(),
- ExcInternalError());
-
- Assert((*pointer) < std::numeric_limits<unsigned int>::max(),
- ExcInternalError());
- const types::global_dof_index this_fe_index = *pointer;
-
- Assert(this_fe_index < dof_handler.fe_collection.size(),
- ExcInternalError());
-
- if (counter == n)
- return this_fe_index;
+ nth_active_fe_index(const DoFHandlerType &dof_handler,
+ const unsigned int obj_level,
+ const unsigned int obj_index,
+ const unsigned int local_index,
+ const std::integral_constant<int, d> &)
+ {
+ Assert(d == DoFHandlerType::dimension || obj_level == 0,
+ ExcNotImplemented());
+
+ // for cells only one active fe index available
+ Assert(((d == DoFHandlerType::dimension) &&
+ (local_index != DoFHandlerType::default_fe_index)) == false,
+ ExcNotImplemented());
+
+ // 1) no hp used -> fe_index == 0
+ if (dof_handler.hp_capability_enabled == false)
+ return DoFHandlerType::default_fe_index;
+
+ // 2) cell and hp is used -> there is only one fe_index
+ if (d == DoFHandlerType::dimension)
+ return dof_handler.hp_cell_active_fe_indices[obj_level][obj_index];
+
+ // 3) general entity and hp is used
+ AssertIndexRange(d, dof_handler.hp_object_fe_indices.size());
+ AssertIndexRange(d, dof_handler.hp_object_fe_ptr.size());
+ AssertIndexRange(obj_index, dof_handler.hp_object_fe_ptr[d].size());
+ AssertIndexRange(dof_handler.hp_object_fe_ptr[d][obj_index] +
+ local_index,
+ dof_handler.hp_object_fe_indices[d].size());
- Assert(this_fe_index != numbers::invalid_dof_index,
- ExcInternalError());
-
- pointer += static_cast<types::global_dof_index>(
- dof_handler.get_fe(this_fe_index).dofs_per_vertex + 1);
- ++counter;
- }
+ return dof_handler
+ .hp_object_fe_indices[d][dof_handler.hp_object_fe_ptr[d][obj_index] +
+ local_index];
}
* The size of the returned set equals the number of finite elements that
* are active on this vertex.
*/
- template <int dim, int spacedim>
+ template <typename DoFHandlerType, int d>
static std::set<unsigned int>
- get_active_vertex_fe_indices(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int vertex_index)
+ get_active_fe_indices(const DoFHandlerType & dof_handler,
+ const unsigned int obj_level,
+ const unsigned int obj_index,
+ const std::integral_constant<int, d> &t)
{
+ Assert(d == DoFHandlerType::dimension || obj_level == 0,
+ ExcNotImplemented());
+
+ // 1) no hp used -> fe_index == 0
+ if (dof_handler.hp_capability_enabled == false)
+ return {DoFHandlerType::default_fe_index};
+
+ // 2) cell and hp is used -> there is only one fe_index
+ if (d == DoFHandlerType::dimension)
+ return {dof_handler.hp_cell_active_fe_indices[obj_level][obj_index]};
+
+ // 3) general entity and hp is used
std::set<unsigned int> active_fe_indices;
for (unsigned int i = 0;
- i < n_active_vertex_fe_indices(dof_handler, vertex_index);
+ i < n_active_fe_indices(dof_handler, obj_level, obj_index, t);
++i)
active_fe_indices.insert(
- nth_active_vertex_fe_index(dof_handler, vertex_index, i));
+ nth_active_fe_index(dof_handler, obj_level, obj_index, i, t));
return active_fe_indices;
}
- /**
- * Return whether a particular finite element index is active on the
- * specified vertex.
- */
- template <int dim, int spacedim>
+ template <typename DoFHandlerType, int d>
static bool
- fe_is_active_on_vertex(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int vertex_index,
- const unsigned int fe_index)
+ fe_index_is_active(const DoFHandlerType &dof_handler,
+ const unsigned int obj_level,
+ const unsigned int obj_index,
+ const unsigned int fe_index,
+ const std::integral_constant<int, d> &)
{
- Assert((fe_index !=
- dealii::hp::DoFHandler<dim, spacedim>::default_fe_index),
- ExcMessage("You need to specify a FE index when working "
- "with hp DoFHandlers"));
- Assert(dof_handler.fe_collection.size() > 0,
- ExcMessage("No finite element collection is associated with "
- "this DoFHandler"));
- Assert(fe_index < dof_handler.fe_collection.size(), ExcInternalError());
-
- // make sure we don't ask on
- // unused vertices
- Assert(dof_handler.vertex_dof_offsets[vertex_index] !=
- numbers::invalid_unsigned_int,
- ExcInternalError());
-
- // hop along the list of index
- // sets and see whether we find
- // the given index
- const unsigned int starting_offset =
- dof_handler.vertex_dof_offsets[vertex_index];
- const types::global_dof_index *pointer =
- &dof_handler.vertex_dofs[starting_offset];
-
- Assert(*pointer != numbers::invalid_dof_index, ExcInternalError());
-
- while (true)
- {
- Assert(pointer <= &dof_handler.vertex_dofs.back(),
- ExcInternalError());
+ Assert(d == DoFHandlerType::dimension || obj_level == 0,
+ ExcNotImplemented());
- Assert((*pointer) <
- std::numeric_limits<types::global_dof_index>::max(),
- ExcInternalError());
- const types::global_dof_index this_fe_index = *pointer;
+ // 1) no hp used -> fe_index == 0
+ if (dof_handler.hp_capability_enabled == false)
+ return (fe_index == DoFHandlerType::default_fe_index);
- Assert(this_fe_index < dof_handler.fe_collection.size(),
- ExcInternalError());
+ // 2) cell and hp is used -> there is only one fe_index
+ if (d == DoFHandlerType::dimension)
+ return dof_handler.hp_cell_active_fe_indices[obj_level][obj_index] ==
+ fe_index;
- if (this_fe_index == numbers::invalid_dof_index)
- return false;
- else if (this_fe_index == fe_index)
- return true;
- else
- pointer += dof_handler.get_fe(this_fe_index).dofs_per_vertex + 1;
- }
+ // 3) general entity and hp is used
+ return std::find(dof_handler.hp_object_fe_indices[d].begin() +
+ dof_handler.hp_object_fe_ptr[d][obj_index],
+ dof_handler.hp_object_fe_indices[d].begin() +
+ dof_handler.hp_object_fe_ptr[d][obj_index + 1],
+ fe_index) !=
+ (dof_handler.hp_object_fe_indices[d].begin() +
+ dof_handler.hp_object_fe_ptr[d][obj_index + 1]);
}
+
+
template <typename DoFHandlerType, bool level_dof_access>
static void
set_mg_dof_indices(
inline types::global_dof_index
DoFAccessor<dim, DoFHandlerType, level_dof_access>::dof_index(
const unsigned int i,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType::invalid_fe_index) ?
+ DoFHandlerType::default_fe_index :
+ fe_index_;
+
// access the respective DoF
return dealii::internal::DoFAccessorImplementation::Implementation::
get_dof_index(*this->dof_handler,
DoFAccessor<dim, DoFHandlerType, level_dof_access>::set_dof_index(
const unsigned int i,
const types::global_dof_index index,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType::invalid_fe_index) ?
+ DoFHandlerType::default_fe_index :
+ fe_index_;
+
// access the respective DoF
dealii::internal::DoFAccessorImplementation::Implementation::set_dof_index(
*this->dof_handler,
DoFAccessor<structdim, DoFHandlerType, level_dof_access>::vertex_dof_index(
const unsigned int vertex,
const unsigned int i,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType::invalid_fe_index) ?
+ DoFHandlerType::default_fe_index :
+ fe_index_;
+
return dealii::internal::DoFAccessorImplementation::Implementation::
- get_vertex_dof_index(*this->dof_handler,
- this->vertex_index(vertex),
- fe_index,
- i);
+ get_dof_index(*this->dof_handler,
+ 0,
+ this->vertex_index(vertex),
+ fe_index,
+ i,
+ std::integral_constant<int, 0>());
}
const int level,
const unsigned int vertex,
const unsigned int i,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType::invalid_fe_index) ?
+ DoFHandlerType::default_fe_index :
+ fe_index_;
(void)fe_index;
Assert(this->dof_handler != nullptr, ExcInvalidObject());
AssertIndexRange(vertex, GeometryInfo<structdim>::vertices_per_cell);
AssertIndexRange(i, this->dof_handler->get_fe(fe_index).dofs_per_vertex);
- return dealii::internal::DoFAccessorImplementation::Implementation::
- mg_vertex_dof_index(*this->dof_handler,
- level,
- this->vertex_index(vertex),
- i);
+ Assert(dof_handler->hp_capability_enabled == false,
+ ExcMessage("hp::DoFHandler does not implement multilevel DoFs."));
+
+ return this->dof_handler->mg_vertex_dofs[this->vertex_index(vertex)]
+ .get_index(level, i, this->dof_handler->get_fe().dofs_per_vertex);
}
const unsigned int vertex,
const unsigned int i,
const types::global_dof_index index,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
- dealii::internal::DoFAccessorImplementation::Implementation::
- set_vertex_dof_index(
- *this->dof_handler, this->vertex_index(vertex), fe_index, i, index);
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType::invalid_fe_index) ?
+ DoFHandlerType::default_fe_index :
+ fe_index_;
+
+ dealii::internal::DoFAccessorImplementation::Implementation::set_dof_index(
+ *this->dof_handler,
+ 0,
+ this->vertex_index(vertex),
+ fe_index,
+ i,
+ std::integral_constant<int, 0>(),
+ index);
}
const unsigned int vertex,
const unsigned int i,
const types::global_dof_index index,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType::invalid_fe_index) ?
+ DoFHandlerType::default_fe_index :
+ fe_index_;
(void)fe_index;
Assert(this->dof_handler != nullptr, ExcInvalidObject());
AssertIndexRange(vertex, GeometryInfo<structdim>::vertices_per_cell);
AssertIndexRange(i, this->dof_handler->get_fe(fe_index).dofs_per_vertex);
- return dealii::internal::DoFAccessorImplementation::Implementation::
- set_mg_vertex_dof_index(
- *this->dof_handler, level, this->vertex_index(vertex), i, index);
+ Assert(dof_handler->hp_capability_enabled == false,
+ ExcMessage("hp::DoFHandler does not implement multilevel DoFs."));
+
+ this->dof_handler->mg_vertex_dofs[this->vertex_index(vertex)].set_index(
+ level, i, this->dof_handler->get_fe().dofs_per_vertex, index);
}
inline void
DoFAccessor<structdim, DoFHandlerType, level_dof_access>::get_dof_indices(
std::vector<types::global_dof_index> &dof_indices,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
Assert(this->dof_handler != nullptr, ExcInvalidObject());
+
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType::invalid_fe_index) ?
+ DoFHandlerType::default_fe_index :
+ fe_index_;
+
Assert(static_cast<unsigned int>(this->level()) <
- this->dof_handler->levels.size(),
+ this->dof_handler->object_dof_indices.size(),
ExcMessage(
"The DoFHandler to which this accessor points has not "
"been initialized, i.e., it doesn't appear that DoF indices "
DoFAccessor<structdim, DoFHandlerType, level_dof_access>::get_mg_dof_indices(
const int level,
std::vector<types::global_dof_index> &dof_indices,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
Assert(this->dof_handler != nullptr, ExcInvalidObject());
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType::invalid_fe_index) ?
+ DoFHandlerType::default_fe_index :
+ fe_index_;
+
switch (structdim)
{
case 1:
DoFAccessor<structdim, DoFHandlerType, level_dof_access>::set_mg_dof_indices(
const int level,
const std::vector<types::global_dof_index> &dof_indices,
- const unsigned int fe_index)
+ const unsigned int fe_index_)
{
Assert(this->dof_handler != nullptr, ExcInvalidObject());
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType::invalid_fe_index) ?
+ DoFHandlerType::default_fe_index :
+ fe_index_;
+
switch (structdim)
{
case 1:
inline void
DoFAccessor<0, DoFHandlerType<1, spacedim>, level_dof_access>::get_dof_indices(
std::vector<types::global_dof_index> &dof_indices,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType<1, spacedim>::invalid_fe_index) ?
+ DoFHandlerType<1, spacedim>::default_fe_index :
+ fe_index_;
+
for (unsigned int i = 0; i < dof_indices.size(); ++i)
dof_indices[i] = dealii::internal::DoFAccessorImplementation::
- Implementation::get_vertex_dof_index(*dof_handler,
- this->global_vertex_index,
- fe_index,
- i);
+ Implementation::get_dof_index(*dof_handler,
+ 0,
+ this->global_vertex_index,
+ fe_index,
+ i,
+ std::integral_constant<int, 0>());
}
DoFAccessor<0, DoFHandlerType<1, spacedim>, level_dof_access>::
get_mg_dof_indices(const int level,
std::vector<types::global_dof_index> &dof_indices,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
- AssertThrow(fe_index == 0, ExcMessage("Unknown triangulation!"));
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType<1, spacedim>::invalid_fe_index) ?
+ DoFHandlerType<1, spacedim>::default_fe_index :
+ fe_index_;
+ (void)fe_index;
+ AssertDimension(fe_index, (DoFHandlerType<1, spacedim>::default_fe_index));
for (unsigned int i = 0; i < dof_indices.size(); ++i)
dof_indices[i] =
DoFAccessor<0, DoFHandlerType<1, spacedim>, level_dof_access>::vertex_dof_index(
const unsigned int vertex,
const unsigned int i,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType<1, spacedim>::invalid_fe_index) ?
+ DoFHandlerType<1, spacedim>::default_fe_index :
+ fe_index_;
+
(void)vertex;
AssertIndexRange(vertex, 1);
return dealii::internal::DoFAccessorImplementation::Implementation::
- get_vertex_dof_index(*dof_handler, this->global_vertex_index, fe_index, i);
+ get_dof_index(*dof_handler,
+ 0,
+ this->global_vertex_index,
+ fe_index,
+ i,
+ std::integral_constant<int, 0>());
}
inline types::global_dof_index
DoFAccessor<0, DoFHandlerType<1, spacedim>, level_dof_access>::dof_index(
const unsigned int i,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType<1, spacedim>::invalid_fe_index) ?
+ DoFHandlerType<1, spacedim>::default_fe_index :
+ fe_index_;
+
return dealii::internal::DoFAccessorImplementation::Implementation::
- get_vertex_dof_index(*this->dof_handler,
- this->vertex_index(0),
- fe_index,
- i);
+ get_dof_index(*this->dof_handler,
+ 0,
+ this->vertex_index(0),
+ fe_index,
+ i,
+ std::integral_constant<int, 0>());
}
types::global_dof_index *next_dof_index =
const_cast<types::global_dof_index *>(
- accessor.dof_handler->levels[accessor.present_level]
- ->get_cell_cache_start(accessor.present_index, dofs_per_cell));
+ dealii::internal::DoFAccessorImplementation::Implementation::
+ get_cache_ptr(accessor.dof_handler,
+ accessor.present_level,
+ accessor.present_index,
+ dofs_per_cell));
for (unsigned int i = 0; i < dofs_per_cell; ++i, ++next_dof_index)
*next_dof_index = dof_indices[i];
* Do what the active_fe_index function in the parent class is supposed to
* do.
*/
- template <int dim, int spacedim, bool level_dof_access>
+ template <typename DoFHandlerType, bool level_dof_access>
static unsigned int
active_fe_index(
- const DoFCellAccessor<DoFHandler<dim, spacedim>, level_dof_access> &)
+ const DoFCellAccessor<DoFHandlerType, level_dof_access> &accessor)
{
- // ::DoFHandler only supports a single active fe with index zero
- return 0;
- }
+ if (accessor.dof_handler->hp_capability_enabled == false)
+ return 0; // ::DoFHandler only supports a single active fe with index
+ // zero
-
-
- template <int dim, int spacedim, bool level_dof_access>
- static unsigned int
- active_fe_index(
- const DoFCellAccessor<dealii::hp::DoFHandler<dim, spacedim>,
- level_dof_access> &accessor)
- {
Assert(
accessor.dof_handler != nullptr,
(typename std::decay<decltype(accessor)>::type::ExcInvalidObject()));
Assert(static_cast<unsigned int>(accessor.level()) <
- accessor.dof_handler->levels.size(),
+ accessor.dof_handler->hp_cell_future_fe_indices.size(),
ExcMessage("DoFHandler not initialized"));
- return accessor.dof_handler->levels[accessor.level()]->active_fe_index(
- accessor.present_index);
+ return accessor.dof_handler
+ ->hp_cell_active_fe_indices[accessor.level()][accessor.present_index];
}
* Do what the set_active_fe_index function in the parent class is
* supposed to do.
*/
- template <int dim, int spacedim, bool level_dof_access>
- static void
- set_active_fe_index(const DoFCellAccessor<DoFHandler<dim, spacedim>,
- level_dof_access> &accessor,
- const unsigned int i)
- {
- (void)accessor;
- (void)i;
- // ::DoFHandler only supports a single active fe with index zero
- Assert(
- i == 0,
- (typename std::decay<decltype(accessor)>::type::ExcInvalidObject()));
- }
-
-
-
- template <int dim, int spacedim, bool level_dof_access>
+ template <typename DoFHandlerType, bool level_dof_access>
static void
set_active_fe_index(
- const DoFCellAccessor<dealii::hp::DoFHandler<dim, spacedim>,
- level_dof_access> &accessor,
- const unsigned int i)
+ const DoFCellAccessor<DoFHandlerType, level_dof_access> &accessor,
+ const unsigned int i)
{
+ if (accessor.dof_handler->hp_capability_enabled == false)
+ {
+ // ::DoFHandler only supports a single active fe with index zero
+ AssertDimension(i, DoFHandlerType::default_fe_index);
+ return;
+ }
+
Assert(
accessor.dof_handler != nullptr,
(typename std::decay<decltype(accessor)>::type::ExcInvalidObject()));
Assert(static_cast<unsigned int>(accessor.level()) <
- accessor.dof_handler->levels.size(),
+ accessor.dof_handler->hp_cell_future_fe_indices.size(),
ExcMessage("DoFHandler not initialized"));
- accessor.dof_handler->levels[accessor.level()]->set_active_fe_index(
- accessor.present_index, i);
+ accessor.dof_handler
+ ->hp_cell_active_fe_indices[accessor.level()]
+ [accessor.present_index] = i;
}
* Do what the future_fe_index function in the parent class is supposed to
* do.
*/
- template <int dim, int spacedim, bool level_dof_access>
+ template <typename DoFHandlerType, bool level_dof_access>
static unsigned int
future_fe_index(
- const DoFCellAccessor<DoFHandler<dim, spacedim>, level_dof_access> &)
+ const DoFCellAccessor<DoFHandlerType, level_dof_access> &accessor)
{
- // ::DoFHandler only supports a single active fe with index zero
- return 0;
- }
-
+ if (accessor.dof_handler->hp_capability_enabled == false)
+ return DoFHandlerType::default_fe_index; // ::DoFHandler only supports
+ // a single active fe with
+ // index zero
-
- template <int dim, int spacedim, bool level_dof_access>
- static unsigned int
- future_fe_index(
- const DoFCellAccessor<dealii::hp::DoFHandler<dim, spacedim>,
- level_dof_access> &accessor)
- {
Assert(
accessor.dof_handler != nullptr,
(typename std::decay<decltype(accessor)>::type::ExcInvalidObject()));
Assert(static_cast<unsigned int>(accessor.level()) <
- accessor.dof_handler->levels.size(),
+ accessor.dof_handler->hp_cell_future_fe_indices.size(),
ExcMessage("DoFHandler not initialized"));
- return accessor.dof_handler->levels[accessor.level()]->future_fe_index(
- accessor.present_index);
+ if (future_fe_index_set(accessor))
+ return accessor.dof_handler
+ ->hp_cell_future_fe_indices[accessor.level()]
+ [accessor.present_index];
+ else
+ return accessor.dof_handler
+ ->hp_cell_active_fe_indices[accessor.level()]
+ [accessor.present_index];
}
* Do what the set_future_fe_index function in the parent class is
* supposed to do.
*/
- template <int dim, int spacedim, bool level_dof_access>
- static void
- set_future_fe_index(const DoFCellAccessor<DoFHandler<dim, spacedim>,
- level_dof_access> &accessor,
- const unsigned int i)
- {
- (void)accessor;
- (void)i;
- // ::DoFHandler only supports a single active fe with index zero
- Assert(
- i == 0,
- (typename std::decay<decltype(accessor)>::type::ExcInvalidObject()));
- }
-
-
-
- template <int dim, int spacedim, bool level_dof_access>
+ template <typename DoFHandlerType, bool level_dof_access>
static void
set_future_fe_index(
- const DoFCellAccessor<dealii::hp::DoFHandler<dim, spacedim>,
- level_dof_access> &accessor,
- const unsigned int i)
+ const DoFCellAccessor<DoFHandlerType, level_dof_access> &accessor,
+ const unsigned int i)
{
+ if (accessor.dof_handler->hp_capability_enabled == false)
+ {
+ // ::DoFHandler only supports a single active fe with index zero
+ AssertDimension(i, DoFHandlerType::default_fe_index);
+ return;
+ }
+
Assert(
accessor.dof_handler != nullptr,
(typename std::decay<decltype(accessor)>::type::ExcInvalidObject()));
Assert(static_cast<unsigned int>(accessor.level()) <
- accessor.dof_handler->levels.size(),
+ accessor.dof_handler->hp_cell_future_fe_indices.size(),
ExcMessage("DoFHandler not initialized"));
- accessor.dof_handler->levels[accessor.level()]->set_future_fe_index(
- accessor.present_index, i);
+ accessor.dof_handler
+ ->hp_cell_future_fe_indices[accessor.level()]
+ [accessor.present_index] = i;
}
* Do what the future_fe_index_set function in the parent class is
* supposed to do.
*/
- template <int dim, int spacedim, bool level_dof_access>
+ template <typename DoFHandlerType, bool level_dof_access>
static bool
future_fe_index_set(
- const DoFCellAccessor<dealii::DoFHandler<dim, spacedim>,
- level_dof_access> &)
+ const DoFCellAccessor<DoFHandlerType, level_dof_access> &accessor)
{
- // ::DoFHandler only supports a single active fe with index zero
- return false;
- }
-
+ if (accessor.dof_handler->hp_capability_enabled == false)
+ return false; // ::DoFHandler only supports a single active fe with
+ // index zero
-
- template <int dim, int spacedim, bool level_dof_access>
- static bool
- future_fe_index_set(
- const DoFCellAccessor<dealii::hp::DoFHandler<dim, spacedim>,
- level_dof_access> &accessor)
- {
Assert(
accessor.dof_handler != nullptr,
(typename std::decay<decltype(accessor)>::type::ExcInvalidObject()));
Assert(static_cast<unsigned int>(accessor.level()) <
- accessor.dof_handler->levels.size(),
+ accessor.dof_handler->hp_cell_future_fe_indices.size(),
ExcMessage("DoFHandler not initialized"));
- return accessor.dof_handler->levels[accessor.level()]
- ->future_fe_index_set(accessor.present_index);
+ return accessor.dof_handler
+ ->hp_cell_future_fe_indices[accessor.level()]
+ [accessor.present_index] !=
+ DoFHandlerType::invalid_active_fe_index;
}
* Do what the clear_fe_index function in the parent class is supposed to
* do.
*/
- template <int dim, int spacedim, bool level_dof_access>
+ template <typename DoFHandlerType, bool level_dof_access>
static void
clear_future_fe_index(
- const DoFCellAccessor<dealii::DoFHandler<dim, spacedim>,
- level_dof_access> &)
+ const DoFCellAccessor<DoFHandlerType, level_dof_access> &accessor)
{
- // ::DoFHandler only supports a single active fe with index zero
- }
-
-
+ if (accessor.dof_handler->hp_capability_enabled == false)
+ return; // ::DoFHandler only supports a single active fe with index
+ // zero
- template <int dim, int spacedim, bool level_dof_access>
- static void
- clear_future_fe_index(
- const DoFCellAccessor<dealii::hp::DoFHandler<dim, spacedim>,
- level_dof_access> &accessor)
- {
Assert(
accessor.dof_handler != nullptr,
(typename std::decay<decltype(accessor)>::type::ExcInvalidObject()));
Assert(static_cast<unsigned int>(accessor.level()) <
- accessor.dof_handler->levels.size(),
+ accessor.dof_handler->hp_cell_future_fe_indices.size(),
ExcMessage("DoFHandler not initialized"));
- accessor.dof_handler->levels[accessor.level()]->clear_future_fe_index(
- accessor.present_index);
+ // TODO
+ using active_fe_index_type = unsigned short int;
+ static const active_fe_index_type invalid_active_fe_index =
+ static_cast<active_fe_index_type>(-1);
+
+ accessor.dof_handler
+ ->hp_cell_future_fe_indices[accessor.level()]
+ [accessor.present_index] =
+ invalid_active_fe_index;
}
};
} // namespace DoFCellAccessorImplementation
if (dofs_per_cell > 0)
{
const types::global_dof_index *cache =
- this->dof_handler->levels[this->present_level]->get_cell_cache_start(
- this->present_index, dofs_per_cell);
+ dealii::internal::DoFAccessorImplementation::Implementation::
+ get_cache_ptr(this->dof_handler,
+ this->present_level,
+ this->present_index,
+ dofs_per_cell);
for (unsigned int i = 0; i < dofs_per_cell; ++i, ++cache)
dof_indices[i] = *cache;
}
typename DoFCellAccessor::ExcVectorDoesNotMatch());
const types::global_dof_index *cache =
- this->dof_handler->levels[this->present_level]->get_cell_cache_start(
- this->present_index, this->get_fe().dofs_per_cell);
+ dealii::internal::DoFAccessorImplementation::Implementation::get_cache_ptr(
+ this->dof_handler,
+ this->present_level,
+ this->present_index,
+ this->get_fe().dofs_per_cell);
dealii::internal::DoFAccessorImplementation::Implementation::
extract_subvector_to(values,
cache,
const types::global_dof_index *cache =
- this->dof_handler->levels[this->present_level]->get_cell_cache_start(
- this->present_index, this->get_fe().dofs_per_cell);
+ dealii::internal::DoFAccessorImplementation::Implementation::get_cache_ptr(
+ this->dof_handler,
+ this->present_level,
+ this->present_index,
+ this->get_fe().dofs_per_cell);
constraints.get_dof_values(values,
*cache,
Assert(this->dof_handler != nullptr, typename BaseClass::ExcInvalidObject());
const types::global_dof_index *cache =
- this->dof_handler->levels[this->present_level]->get_cell_cache_start(
- this->present_index, this->get_fe().dofs_per_cell);
+ dealii::internal::DoFAccessorImplementation::Implementation::get_cache_ptr(
+ this->dof_handler,
+ this->present_level,
+ this->present_index,
+ this->get_fe().dofs_per_cell);
for (unsigned int i = 0; i < this->get_fe().dofs_per_cell; ++i, ++cache)
internal::ElementAccess<OutputVector>::set(local_values(i), *cache, values);
DoFCellAccessor<DoFHandlerType, level_dof_access>::get_fe() const
{
Assert(this->dof_handler != nullptr, typename BaseClass::ExcInvalidObject());
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- this->is_active(),
- ExcMessage("In hp::DoFHandler objects, finite elements are only associated "
- "with active cells. Consequently, you can not ask for the "
- "active finite element on cells with children."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ this->is_active(),
+ ExcMessage(
+ "In hp::DoFHandler objects, finite elements are only associated "
+ "with active cells. Consequently, you can not ask for the "
+ "active finite element on cells with children."));
return this->dof_handler->get_fe(active_fe_index());
}
inline unsigned int
DoFCellAccessor<DoFHandlerType, level_dof_access>::active_fe_index() const
{
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- this->is_active(),
- ExcMessage("You can not ask for the active_fe_index on a cell that has "
- "children because no degrees of freedom are assigned "
- "to this cell and, consequently, no finite element "
- "is associated with it."));
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- (this->is_locally_owned() || this->is_ghost()),
- ExcMessage("You can only query active_fe_index information on cells "
- "that are either locally owned or (after distributing "
- "degrees of freedom) are ghost cells."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ this->is_active(),
+ ExcMessage(
+ "You can not ask for the active_fe_index on a cell that has "
+ "children because no degrees of freedom are assigned "
+ "to this cell and, consequently, no finite element "
+ "is associated with it."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ (this->is_locally_owned() || this->is_ghost()),
+ ExcMessage("You can only query active_fe_index information on cells "
+ "that are either locally owned or (after distributing "
+ "degrees of freedom) are ghost cells."));
return dealii::internal::DoFCellAccessorImplementation::Implementation::
active_fe_index(*this);
DoFCellAccessor<DoFHandlerType, level_dof_access>::set_active_fe_index(
const unsigned int i) const
{
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- this->is_active(),
- ExcMessage("You can not set the active_fe_index on a cell that has "
- "children because no degrees of freedom will be assigned "
- "to this cell."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ this->is_active(),
+ ExcMessage("You can not set the active_fe_index on a cell that has "
+ "children because no degrees of freedom will be assigned "
+ "to this cell."));
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- this->is_locally_owned(),
- ExcMessage("You can only set active_fe_index information on cells "
- "that are locally owned. On ghost cells, this information "
- "will automatically be propagated from the owning process "
- "of that cell, and there is no information at all on "
- "artificial cells."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ this->is_locally_owned(),
+ ExcMessage("You can only set active_fe_index information on cells "
+ "that are locally owned. On ghost cells, this information "
+ "will automatically be propagated from the owning process "
+ "of that cell, and there is no information at all on "
+ "artificial cells."));
dealii::internal::DoFCellAccessorImplementation::Implementation::
set_active_fe_index(*this, i);
DoFCellAccessor<DoFHandlerType, level_dof_access>::get_future_fe() const
{
Assert(this->dof_handler != nullptr, typename BaseClass::ExcInvalidObject());
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- this->is_active(),
- ExcMessage("In hp::DoFHandler objects, finite elements are only associated "
- "with active cells. Consequently, you can not ask for the "
- "future finite element on cells with children."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ this->is_active(),
+ ExcMessage(
+ "In hp::DoFHandler objects, finite elements are only associated "
+ "with active cells. Consequently, you can not ask for the "
+ "future finite element on cells with children."));
return this->dof_handler->get_fe(future_fe_index());
}
inline unsigned int
DoFCellAccessor<DoFHandlerType, level_dof_access>::future_fe_index() const
{
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- (this->has_children() == false),
- ExcMessage("You can not ask for the future_fe_index on a cell that has "
- "children because no degrees of freedom are assigned "
- "to this cell and, consequently, no finite element "
- "is associated with it."));
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- (this->is_locally_owned()),
- ExcMessage("You can only query future_fe_index information on cells "
- "that are locally owned."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ (this->has_children() == false),
+ ExcMessage(
+ "You can not ask for the future_fe_index on a cell that has "
+ "children because no degrees of freedom are assigned "
+ "to this cell and, consequently, no finite element "
+ "is associated with it."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ (this->is_locally_owned()),
+ ExcMessage("You can only query future_fe_index information on cells "
+ "that are locally owned."));
return dealii::internal::DoFCellAccessorImplementation::Implementation::
future_fe_index(*this);
DoFCellAccessor<DoFHandlerType, level_dof_access>::set_future_fe_index(
const unsigned int i) const
{
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- (this->has_children() == false),
- ExcMessage("You can not set the future_fe_index on a cell that has "
- "children because no degrees of freedom will be assigned "
- "to this cell."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ (this->has_children() == false),
+ ExcMessage("You can not set the future_fe_index on a cell that has "
+ "children because no degrees of freedom will be assigned "
+ "to this cell."));
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- this->is_locally_owned(),
- ExcMessage("You can only set future_fe_index information on cells "
- "that are locally owned."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ this->is_locally_owned(),
+ ExcMessage("You can only set future_fe_index information on cells "
+ "that are locally owned."));
dealii::internal::DoFCellAccessorImplementation::Implementation::
set_future_fe_index(*this, i);
inline bool
DoFCellAccessor<DoFHandlerType, level_dof_access>::future_fe_index_set() const
{
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- (this->has_children() == false),
- ExcMessage("You can not ask for the future_fe_index on a cell that has "
- "children because no degrees of freedom are assigned "
- "to this cell and, consequently, no finite element "
- "is associated with it."));
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- (this->is_locally_owned()),
- ExcMessage("You can only query future_fe_index information on cells "
- "that are locally owned."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ (this->has_children() == false),
+ ExcMessage(
+ "You can not ask for the future_fe_index on a cell that has "
+ "children because no degrees of freedom are assigned "
+ "to this cell and, consequently, no finite element "
+ "is associated with it."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ (this->is_locally_owned()),
+ ExcMessage("You can only query future_fe_index information on cells "
+ "that are locally owned."));
return dealii::internal::DoFCellAccessorImplementation::Implementation::
future_fe_index_set(*this);
inline void
DoFCellAccessor<DoFHandlerType, level_dof_access>::clear_future_fe_index() const
{
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- (this->has_children() == false),
- ExcMessage("You can not ask for the future_fe_index on a cell that has "
- "children because no degrees of freedom are assigned "
- "to this cell and, consequently, no finite element "
- "is associated with it."));
- Assert(
- (dynamic_cast<const dealii::DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- (this->is_locally_owned()),
- ExcMessage("You can only query future_fe_index information on cells "
- "that are locally owned."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ (this->has_children() == false),
+ ExcMessage(
+ "You can not ask for the future_fe_index on a cell that has "
+ "children because no degrees of freedom are assigned "
+ "to this cell and, consequently, no finite element "
+ "is associated with it."));
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ (this->is_locally_owned()),
+ ExcMessage("You can only query future_fe_index information on cells "
+ "that are locally owned."));
dealii::internal::DoFCellAccessorImplementation::Implementation::
clear_future_fe_index(*this);
const unsigned int n_dofs = local_source_end - local_source_begin;
const types::global_dof_index *dofs =
- this->dof_handler->levels[this->level()]->get_cell_cache_start(
- this->present_index, n_dofs);
+ dealii::internal::DoFAccessorImplementation::Implementation::get_cache_ptr(
+ this->dof_handler, this->level(), this->present_index, n_dofs);
// distribute cell vector
global_destination.add(n_dofs, dofs, local_source_begin);
const unsigned int n_dofs = local_source_end - local_source_begin;
const types::global_dof_index *dofs =
- this->dof_handler->levels[this->level()]->get_cell_cache_start(
- this->present_index, n_dofs);
+ dealii::internal::DoFAccessorImplementation::Implementation::get_cache_ptr(
+ this->dof_handler, this->level(), this->present_index, n_dofs);
// distribute cell vector
constraints.distribute_local_to_global(local_source_begin,
const unsigned int n_dofs = local_source.m();
const types::global_dof_index *dofs =
- this->dof_handler->levels[this->level()]->get_cell_cache_start(
- this->present_index, n_dofs);
+ dealii::internal::DoFAccessorImplementation::Implementation::get_cache_ptr(
+ this->dof_handler, this->level(), this->present_index, n_dofs);
// distribute cell matrix
for (unsigned int i = 0; i < n_dofs; ++i)
const unsigned int n_dofs = this->get_fe().dofs_per_cell;
const types::global_dof_index *dofs =
- this->dof_handler->levels[this->level()]->get_cell_cache_start(
- this->present_index, n_dofs);
+ dealii::internal::DoFAccessorImplementation::Implementation::get_cache_ptr(
+ this->dof_handler, this->level(), this->present_index, n_dofs);
// distribute cell matrices
for (unsigned int i = 0; i < n_dofs; ++i)
{
struct Implementation;
}
+
+ namespace hp
+ {
+ namespace DoFHandlerImplementation
+ {
+ struct Implementation;
+ }
+ } // namespace hp
} // namespace internal
+
+namespace parallel
+{
+ namespace distributed
+ {
+ template <int dim, int spacedim, typename VectorType>
+ class CellDataTransfer;
+ }
+} // namespace parallel
#endif
/**
static const unsigned int space_dimension = spacedim;
/**
- * Make the type of this DoFHandler available in function templates.
+ * Boolean indicating whether or not the current DoFHander has hp
+ * capabilities.
*/
- static const bool is_hp_dof_handler = false;
+ const bool hp_capability_enabled;
/**
- * The default index of the finite element to be used on a given cell. Since
- * the present class only supports the same finite element to be used on all
- * cells, the index of the finite element needs to be the same on all cells
- * anyway, and by convention we pick zero for this value. The situation is
- * different for hp objects (i.e. the hp::DoFHandler class) where different
- * finite element indices may be used on different cells, and the default
- * index there corresponds to an invalid value.
+ * The default index of the finite element to be used on a given cell.
*/
static const unsigned int default_fe_index = 0;
+ /**
+ * Invalid index of the finite element to be used on a given cell.
+ */
+ static const unsigned int invalid_fe_index = numbers::invalid_unsigned_int;
+
+ /**
+ * The type in which we store the active FE index.
+ */
+ using active_fe_index_type = unsigned short int;
+
+ /**
+ * The type in which we store the offsets in the CRS data structures.
+ */
+ using offset_type = unsigned int;
+
+ /**
+ * Invalid active_fe_index which will be used as a default value to determine
+ * whether a future_fe_index has been set or not.
+ */
+ static const active_fe_index_type invalid_active_fe_index =
+ static_cast<active_fe_index_type>(-1);
+
/**
* Standard constructor, not initializing any data. After constructing an
* object with this constructor, use initialize() to make a valid
* DoFHandler.
*/
- DoFHandler();
+ DoFHandler(const bool hp_capability_enabled = false);
/**
* Constructor. Take @p tria as the triangulation to work on.
*/
- DoFHandler(const Triangulation<dim, spacedim> &tria);
+ DoFHandler(const Triangulation<dim, spacedim> &tria,
+ const bool hp_capability_enabled = false);
/**
* Copy constructor. DoFHandler objects are large and expensive.
initialize(const Triangulation<dim, spacedim> &tria,
const FiniteElement<dim, spacedim> &fe);
+ /**
+ * Same as above but taking an hp::FECollection object.
+ */
+ void
+ initialize(const Triangulation<dim, spacedim> & tria,
+ const hp::FECollection<dim, spacedim> &fe);
+
/**
* Assign a FiniteElement @p fe to this object.
*
* element. In both cases, accessing degrees of freedom will lead to invalid
* results. To restore consistency, call distribute_dofs().
*/
- virtual void
+ void
set_fe(const FiniteElement<dim, spacedim> &fe);
+ /**
+ * Same as above but taking an hp::FECollection object.
+ */
+ void
+ set_fe(const hp::FECollection<dim, spacedim> &fe);
+
+ /**
+ * Go through the triangulation and set the active FE indices of all
+ * active cells to the values given in @p active_fe_indices.
+ */
+ void
+ set_active_fe_indices(const std::vector<unsigned int> &active_fe_indices);
+
+ /**
+ * Go through the triangulation and store the active FE indices of all
+ * active cells to the vector @p active_fe_indices. This vector is
+ * resized, if necessary.
+ */
+ void
+ get_active_fe_indices(std::vector<unsigned int> &active_fe_indices) const;
+
/**
* Go through the triangulation and "distribute" the degrees of
* freedom needed for the given finite element. "Distributing"
* argument, and stores it as a member variable, similarly to the above
* function set_fe().
*/
- virtual void
+ void
distribute_dofs(const FiniteElement<dim, spacedim> &fe);
+ /**
+ * Same as above but taking an hp::FECollection object.
+ */
+ void
+ distribute_dofs(const hp::FECollection<dim, spacedim> &fe);
+
/**
* Distribute level degrees of freedom on each level for geometric
* multigrid. The active DoFs need to be distributed using distribute_dofs()
* before calling this function.
*/
- virtual void
+ void
distribute_mg_dofs();
/**
/**
* Clear all data of this object.
*/
- virtual void
+ void
clear();
/**
active_cell_iterator
end_active(const unsigned int level) const;
-
/**
* Iterator to the first used cell on level @p level. This returns a
* level_cell_iterator that returns level dofs when dof_indices() is called.
const BlockInfo &
block_info() const;
-
/**
* Return the number of degrees of freedom that belong to this process.
*
const Triangulation<dim, spacedim> &
get_triangulation() const;
+ /**
+ * Whenever serialization with a parallel::distributed::Triangulation as the
+ * underlying triangulation is considered, we also need to consider storing
+ * the active_fe_indices on all active cells as well.
+ *
+ * This function registers that these indices are to be stored whenever the
+ * parallel::distributed::Triangulation::save() function is called on the
+ * underlying triangulation.
+ *
+ * @note Currently only implemented for triangulations of type
+ * parallel::distributed::Triangulation. An assertion will be triggered if
+ * a different type is registered.
+ *
+ * @see The documentation of parallel::distributed::SolutionTransfer has further
+ * information on serialization.
+ */
+ void
+ prepare_for_serialization_of_active_fe_indices();
+
+ /**
+ * Whenever serialization with a parallel::distributed::Triangulation as the
+ * underlying triangulation is considered, we also need to consider storing
+ * the active_fe_indices on all active cells as well.
+ *
+ * This function deserializes and distributes the previously stored
+ * active_fe_indices on all active cells.
+ *
+ * @note Currently only implemented for triangulations of type
+ * parallel::distributed::Triangulation. An assertion will be triggered if
+ * a different type is registered.
+ *
+ * @see The documentation of parallel::distributed::SolutionTransfer has further
+ * information on serialization.
+ */
+ void
+ deserialize_active_fe_indices();
+
/**
* Determine an estimate for the memory consumption (in bytes) of this
* object.
/**
* Exception
- * @ingroup Exceptions
*/
- DeclException0(ExcGridsDoNotMatch);
+ DeclException0(ExcNoFESelected);
/**
* Exception
* @ingroup Exceptions
*/
DeclException0(ExcInvalidBoundaryIndicator);
- /**
- * Exception
- * @ingroup Exceptions
- */
- DeclException1(ExcNewNumbersNotConsecutive,
- types::global_dof_index,
- << "The given list of new dof indices is not consecutive: "
- << "the index " << arg1 << " does not exist.");
/**
* Exception
* @ingroup Exceptions
* Exception
* @ingroup Exceptions
*/
- DeclException0(ExcFacesHaveNoLevel);
+ DeclException1(ExcNewNumbersNotConsecutive,
+ types::global_dof_index,
+ << "The given list of new dof indices is not consecutive: "
+ << "the index " << arg1 << " does not exist.");
/**
- * The triangulation level you accessed is empty.
- * @ingroup Exceptions
+ * Exception
*/
- DeclException1(ExcEmptyLevel,
+ DeclException2(ExcInvalidFEIndex,
int,
- << "You tried to do something on level " << arg1
- << ", but this level is empty.");
-
-
-private:
- /**
- * An object containing information on the block structure.
- */
- BlockInfo block_info_object;
-
- /**
- * Address of the triangulation to work on.
- */
- SmartPointer<const Triangulation<dim, spacedim>, DoFHandler<dim, spacedim>>
- tria;
-
-
- /**
- * Store a hp::FECollection object containing the (one)
- * FiniteElement this object is initialized with.
- */
- hp::FECollection<dim, spacedim> fe_collection;
-
- /**
- * An object that describes how degrees of freedom should be distributed and
- * renumbered.
- */
- std::unique_ptr<dealii::internal::DoFHandlerImplementation::Policy::
- PolicyBase<dim, spacedim>>
- policy;
+ int,
+ << "The mesh contains a cell with an active_fe_index of "
+ << arg1 << ", but the finite element collection only has "
+ << arg2 << " elements");
/**
- * A structure that contains all sorts of numbers that characterize the
- * degrees of freedom this object works on.
- *
- * For most members of this structure, there is an accessor function in this
- * class that returns its value.
+ * Exception used when a certain feature doesn't make sense when
+ * DoFHandler does not hp capabilities.
*/
- dealii::internal::DoFHandlerImplementation::NumberCache number_cache;
+ DeclExceptionMsg(ExcNotAvailableWithoutHP,
+ "The current function doesn't make sense when used with a "
+ "DoFHandler without hp capabilities.");
/**
- * Data structure like number_cache, but for each multigrid level.
+ * Exception used when a certain feature is not implemented when the
+ * DoFHandler has hp capabilities.
*/
- std::vector<dealii::internal::DoFHandlerImplementation::NumberCache>
- mg_number_cache;
+ DeclExceptionMsg(ExcNotImplementedWithHP,
+ "The current function has not yet been implemented for a "
+ "DoFHandler with hp capabilities.");
+private:
/**
* A data structure that is used to store the DoF indices associated with a
* particular vertex. Unlike cells, vertices live on several levels of a
std::unique_ptr<types::global_dof_index[]> indices;
};
+ /**
+ * Whenever the underlying triangulation changes by either
+ * h/p refinement/coarsening and serialization, the active_fe_index of cells
+ * needs to be transferred. This structure stores all temporary information
+ * required during that process.
+ */
+ struct ActiveFEIndexTransfer
+ {
+ /**
+ * Container to temporarily store the iterator and future active FE index
+ * of cells that persist.
+ */
+ std::map<const cell_iterator, const unsigned int> persisting_cells_fe_index;
+
+ /**
+ * Container to temporarily store the iterator and future active FE index
+ * of cells that will be refined.
+ */
+ std::map<const cell_iterator, const unsigned int> refined_cells_fe_index;
+
+ /**
+ * Container to temporarily store the iterator and future active FE index
+ * of parent cells that will remain after coarsening.
+ */
+ std::map<const cell_iterator, const unsigned int> coarsened_cells_fe_index;
+
+ /**
+ * Container to temporarily store the active_fe_index of every locally
+ * owned cell for transfer across parallel::distributed::Triangulation
+ * objects.
+ */
+ std::vector<unsigned int> active_fe_indices;
+
+ /**
+ * Helper object to transfer all active_fe_indices on
+ * parallel::distributed::Triangulation objects during
+ * refinement/coarsening and serialization.
+ */
+ std::unique_ptr<
+ parallel::distributed::
+ CellDataTransfer<dim, spacedim, std::vector<unsigned int>>>
+ cell_data_transfer;
+ };
+
+ /**
+ * An object containing information on the block structure.
+ */
+ BlockInfo block_info_object;
+
+ /**
+ * Address of the triangulation to work on.
+ */
+ SmartPointer<const Triangulation<dim, spacedim>, DoFHandler<dim, spacedim>>
+ tria;
+
+ /**
+ * Store a hp::FECollection object. If only a single FiniteElement is
+ * used during initialization of this object, it contains the (one)
+ * FiniteElement.
+ */
+ hp::FECollection<dim, spacedim> fe_collection;
+
+ /**
+ * An object that describes how degrees of freedom should be distributed and
+ * renumbered.
+ */
+ std::unique_ptr<dealii::internal::DoFHandlerImplementation::Policy::
+ PolicyBase<dim, spacedim>>
+ policy;
+
+ /**
+ * A structure that contains all sorts of numbers that characterize the
+ * degrees of freedom this object works on.
+ *
+ * For most members of this structure, there is an accessor function in this
+ * class that returns its value.
+ */
+ dealii::internal::DoFHandlerImplementation::NumberCache number_cache;
+
+ /**
+ * Data structure like number_cache, but for each multigrid level.
+ */
+ std::vector<dealii::internal::DoFHandlerImplementation::NumberCache>
+ mg_number_cache;
+
+ /**
+ * Cached indices of the degrees of freedom of all active cell. Identification
+ * of the appropriate position of a cell in the vectors is done via
+ * cell_dof_cache_ptr (CRS scheme).
+ */
+ mutable std::vector<std::vector<types::global_dof_index>>
+ cell_dof_cache_indices;
+
+ /**
+ * Pointer to the first cached degree of freedom of an active cell
+ * (identified by level and level index) within cell_dof_cache_indices.
+ */
+ mutable std::vector<std::vector<offset_type>> cell_dof_cache_ptr;
+
+ /**
+ * Indices of degree of freedom of each d+1 geometric object (3D: vertex,
+ * line, quad, hex) for all relevant active finite elements. Identification
+ * of the appropriate position is done via object_dof_ptr (CRS scheme).
+ */
+ mutable std::vector<std::array<std::vector<types::global_dof_index>, dim + 1>>
+ object_dof_indices;
+
+ /**
+ * Pointer to the first cached degree of freedom of a geometric object for all
+ * relevant active finite elements.
+ *
+ * @note In normal mode it is possible to access this data strucutre directly.
+ * In hp mode, an indirection via hp_object_fe_indices/hp_object_fe_ptr is
+ * necessary.
+ */
+ mutable std::vector<std::array<std::vector<offset_type>, dim + 1>>
+ object_dof_ptr;
+
+ /**
+ * Active fe indices of each geometric object. Identification
+ * of the appropriate position of a cell in the vectors is done via
+ * hp_object_fe_ptr (CRS scheme).
+ */
+ mutable std::array<std::vector<active_fe_index_type>, dim + 1>
+ hp_object_fe_indices;
+
+ /**
+ * Pointer to the first fe index of a geometric object.
+ */
+ mutable std::array<std::vector<offset_type>, dim + 1> hp_object_fe_ptr;
+
+ /**
+ * Active fe index of an active cell (identified by level and level index).
+ * This vector is only used in hp mode.
+ */
+ mutable std::vector<std::vector<active_fe_index_type>>
+ hp_cell_active_fe_indices;
+
+ /**
+ * Future fe index of an active cell (identified by level and level index).
+ * This vector is only used in hp mode.
+ */
+ mutable std::vector<std::vector<active_fe_index_type>>
+ hp_cell_future_fe_indices;
+
+ /**
+ * An array to store the indices for level degrees of freedom located at
+ * vertices.
+ */
+ std::vector<MGVertexDoFs> mg_vertex_dofs;
+
+ /**
+ * Space to store the DoF numbers for the different multigrid levels.
+ */
+ std::vector<
+ std::unique_ptr<dealii::internal::DoFHandlerImplementation::DoFLevel<dim>>>
+ mg_levels;
+
+ /**
+ * Space to store DoF numbers of faces in the multigrid context.
+ */
+ std::unique_ptr<dealii::internal::DoFHandlerImplementation::DoFFaces<dim>>
+ mg_faces;
+
+ /**
+ * We embed our data structure into a pointer to control that
+ * all transfer related data only exists during the actual transfer process.
+ */
+ std::unique_ptr<ActiveFEIndexTransfer> active_fe_index_transfer;
+
+ /**
+ * A list of connections with which this object connects to the
+ * triangulation to get information about when the triangulation changes.
+ */
+ std::vector<boost::signals2::connection> tria_listeners;
+
/**
* Free all memory used for non-multigrid data structures.
*/
void
clear_mg_space();
+ /**
+ * Return dof index of specified object.
+ */
template <int structdim>
types::global_dof_index
get_dof_index(const unsigned int obj_level,
const unsigned int fe_index,
const unsigned int local_index) const;
+ /**
+ * Return dof index of specified object.
+ */
template <int structdim>
void
set_dof_index(const unsigned int obj_level,
const types::global_dof_index global_index) const;
/**
- * Array to store the indices for degrees of freedom located at vertices.
+ * Setup DoFHandler policy.
*/
- std::vector<types::global_dof_index> vertex_dofs;
+ void
+ setup_policy();
/**
- * An array to store the indices for level degrees of freedom located at
- * vertices.
+ * Setup DoFHandler policy and listeners (in the hp-context).
*/
- std::vector<MGVertexDoFs> mg_vertex_dofs;
+ void
+ setup_policy_and_listeners();
/**
- * Space to store the DoF numbers for the different levels. Analogous to the
- * <tt>levels[]</tt> tree of the Triangulation objects.
+ * Create default tables for the active_fe_indices.
+ * They are initialized with a zero
+ * indicator, meaning that fe[0] is going to be used by default. This
+ * method is called before refinement and while setting the finite elements
+ * via set_fe(). It ensures each cell has a valid active_fe_index.
*/
- std::vector<
- std::unique_ptr<dealii::internal::DoFHandlerImplementation::DoFLevel<dim>>>
- levels;
+ void
+ create_active_fe_table();
- std::vector<
- std::unique_ptr<dealii::internal::DoFHandlerImplementation::DoFLevel<dim>>>
- mg_levels;
+ /**
+ * A function that will be triggered through a triangulation
+ * signal just before the triangulation is modified.
+ *
+ * The function that stores the active_fe_flags of all cells that will
+ * be refined or coarsened before the refinement happens, so that
+ * they can be set again after refinement.
+ */
+ void
+ pre_refinement_action();
/**
- * Space to store DoF numbers of faces. They are not stored in
- * <tt>levels</tt> since faces are not organized hierarchically, but in a
- * flat array.
+ * A function that will be triggered through a triangulation
+ * signal just after the triangulation is modified.
+ *
+ * The function that restores the active_fe_flags of all cells that
+ * were refined.
*/
- std::unique_ptr<dealii::internal::DoFHandlerImplementation::DoFFaces<dim>>
- faces;
+ void
+ post_refinement_action();
+
+ /**
+ * A function that will be triggered through a triangulation
+ * signal just before the associated Triangulation or
+ * parallel::shared::Triangulation is modified.
+ *
+ * The function that stores the active_fe_indices of all cells that will
+ * be refined or coarsened before the refinement happens, so that
+ * they can be set again after refinement.
+ */
+ void
+ pre_active_fe_index_transfer();
+
+ /**
+ * A function that will be triggered through a triangulation
+ * signal just before the associated parallel::distributed::Triangulation is
+ * modified.
+ *
+ * The function that stores all active_fe_indices on locally owned cells for
+ * distribution over all participating processors.
+ */
+ void
+ pre_distributed_active_fe_index_transfer();
+
+ /**
+ * A function that will be triggered through a triangulation
+ * signal just after the associated Triangulation or
+ * parallel::shared::Triangulation is modified.
+ *
+ * The function that restores the active_fe_indices of all cells that
+ * were refined or coarsened.
+ */
+ void
+ post_active_fe_index_transfer();
+
+ /**
+ * A function that will be triggered through a triangulation
+ * signal just after the associated parallel::distributed::Triangulation is
+ * modified.
+ *
+ * The function that restores all active_fe_indices on locally owned cells
+ * that have been communicated.
+ */
+ void
+ post_distributed_active_fe_index_transfer();
+
+ /**
+ * A function that will be triggered through a triangulation
+ * signal just after the associated parallel::distributed::Triangulation has
+ * been saved.
+ *
+ * The function frees all memory related to the transfer of
+ * active_fe_indices.
+ */
+ void
+ post_distributed_serialization_of_active_fe_indices();
- std::unique_ptr<dealii::internal::DoFHandlerImplementation::DoFFaces<dim>>
- mg_faces;
// Make accessor objects friends.
template <int, class, bool>
- friend class DoFAccessor;
+ friend class dealii::DoFAccessor;
template <class, bool>
- friend class DoFCellAccessor;
+ friend class dealii::DoFCellAccessor;
friend struct dealii::internal::DoFAccessorImplementation::Implementation;
friend struct dealii::internal::DoFCellAccessorImplementation::Implementation;
+ // Likewise for DoFLevel objects since they need to access the vertex dofs
+ // in the functions that set and retrieve vertex dof indices.
friend struct dealii::internal::DoFHandlerImplementation::Implementation;
+ friend struct dealii::internal::hp::DoFHandlerImplementation::Implementation;
friend struct dealii::internal::DoFHandlerImplementation::Policy::
Implementation;
#endif
};
-
-
#ifndef DOXYGEN
/* ----------------------- Inline functions ----------------------------------
template <int dim, int spacedim>
inline const FiniteElement<dim, spacedim> &
-DoFHandler<dim, spacedim>::get_fe(const unsigned int index) const
+DoFHandler<dim, spacedim>::get_fe(const unsigned int number) const
{
- (void)index;
- Assert(index == 0,
- ExcMessage(
- "There is only one FiniteElement stored. The index must be zero!"));
- return get_fe_collection()[0];
+ Assert(fe_collection.size() > 0,
+ ExcMessage("No finite element collection is associated with "
+ "this DoFHandler"));
+ return fe_collection[number];
}
inline const hp::FECollection<dim, spacedim> &
DoFHandler<dim, spacedim>::get_fe_collection() const
{
- Assert(
- fe_collection.size() > 0,
- ExcMessage(
- "You are trying to access the DoFHandler's FECollection object before it has been initialized."));
+ Assert(fe_collection.size() > 0,
+ ExcMessage("No finite element collection is associated with "
+ "this DoFHandler"));
return fe_collection;
}
inline const BlockInfo &
DoFHandler<dim, spacedim>::block_info() const
{
+ Assert(this->hp_capability_enabled == false, ExcNotImplementedWithHP());
+
return block_info_object;
}
const std::map<types::boundary_id, const Function<spacedim, number> *>
&boundary_ids) const
{
+ Assert(!(dim == 2 && spacedim == 3) || this->hp_capability_enabled == false,
+ ExcNotImplementedWithHP());
+
// extract the set of boundary ids and forget about the function object
// pointers
std::set<types::boundary_id> boundary_ids_only;
void
DoFHandler<dim, spacedim>::save(Archive &ar, const unsigned int) const
{
- ar &block_info_object;
- ar &vertex_dofs;
- ar &number_cache;
-
- // some versions of gcc have trouble with loading vectors of
- // std::unique_ptr objects because std::unique_ptr does not
- // have a copy constructor. do it one level at a time
- unsigned int n_levels = levels.size();
- ar & n_levels;
- for (unsigned int i = 0; i < levels.size(); ++i)
- ar &levels[i];
-
- // boost dereferences a nullptr when serializing a nullptr
- // at least up to 1.65.1. This causes problems with clang-5.
- // Therefore, work around it.
- bool faces_is_nullptr = (faces.get() == nullptr);
- ar & faces_is_nullptr;
- if (!faces_is_nullptr)
- ar &faces;
-
- // write out the number of triangulation cells and later check during
- // loading that this number is indeed correct; same with something that
- // identifies the FE and the policy
- unsigned int n_cells = tria->n_cells();
- std::string fe_name = this->get_fe(0).get_name();
- std::string policy_name = internal::policy_to_string(*policy);
-
- ar &n_cells &fe_name &policy_name;
+ if (this->hp_capability_enabled)
+ {
+ ar & this->object_dof_indices;
+ ar & this->object_dof_ptr;
+
+ ar & this->cell_dof_cache_indices;
+ ar & this->cell_dof_cache_ptr;
+
+ ar & this->hp_cell_active_fe_indices;
+ ar & this->hp_cell_future_fe_indices;
+
+ ar &hp_object_fe_ptr;
+ ar &hp_object_fe_indices;
+
+ ar &number_cache;
+
+ ar &mg_number_cache;
+
+ // write out the number of triangulation cells and later check during
+ // loading that this number is indeed correct; same with something that
+ // identifies the policy
+ const unsigned int n_cells = this->tria->n_cells();
+ std::string policy_name =
+ dealii::internal::policy_to_string(*this->policy);
+
+ ar &n_cells &policy_name;
+ }
+ else
+ {
+ ar & this->block_info_object;
+ ar &number_cache;
+
+ ar & this->object_dof_indices;
+ ar & this->object_dof_ptr;
+
+ ar & this->cell_dof_cache_indices;
+ ar & this->cell_dof_cache_ptr;
+
+ // write out the number of triangulation cells and later check during
+ // loading that this number is indeed correct; same with something that
+ // identifies the FE and the policy
+ unsigned int n_cells = this->tria->n_cells();
+ std::string fe_name = this->get_fe(0).get_name();
+ std::string policy_name = internal::policy_to_string(*this->policy);
+
+ ar &n_cells &fe_name &policy_name;
+ }
}
void
DoFHandler<dim, spacedim>::load(Archive &ar, const unsigned int)
{
- ar &block_info_object;
- ar &vertex_dofs;
- ar &number_cache;
-
- // boost::serialization can restore pointers just fine, but if the
- // pointer object still points to something useful, that object is not
- // destroyed and we end up with a memory leak. consequently, first delete
- // previous content before re-loading stuff
- levels.clear();
- faces.reset();
-
- // some versions of gcc have trouble with loading vectors of
- // std::unique_ptr objects because std::unique_ptr does not
- // have a copy constructor. do it one level at a time
- unsigned int size;
- ar & size;
- levels.resize(size);
- for (unsigned int i = 0; i < levels.size(); ++i)
+ if (this->hp_capability_enabled)
{
- std::unique_ptr<internal::DoFHandlerImplementation::DoFLevel<dim>> level;
- ar & level;
- levels[i] = std::move(level);
- }
+ ar & this->object_dof_indices;
+ ar & this->object_dof_ptr;
- // Workaround for nullptr, see in save().
- bool faces_is_nullptr = true;
- ar & faces_is_nullptr;
- if (!faces_is_nullptr)
- ar &faces;
-
- // these are the checks that correspond to the last block in the save()
- // function
- unsigned int n_cells;
- std::string fe_name;
- std::string policy_name;
-
- ar &n_cells &fe_name &policy_name;
-
- AssertThrow(n_cells == tria->n_cells(),
- ExcMessage(
- "The object being loaded into does not match the triangulation "
- "that has been stored previously."));
- AssertThrow(
- fe_name == this->get_fe(0).get_name(),
- ExcMessage(
- "The finite element associated with this DoFHandler does not match "
- "the one that was associated with the DoFHandler previously stored."));
- AssertThrow(policy_name == internal::policy_to_string(*policy),
- ExcMessage(
- "The policy currently associated with this DoFHandler (" +
- internal::policy_to_string(*policy) +
- ") does not match the one that was associated with the "
- "DoFHandler previously stored (" +
- policy_name + ")."));
+ ar & this->cell_dof_cache_indices;
+ ar & this->cell_dof_cache_ptr;
+
+ ar & this->hp_cell_active_fe_indices;
+ ar & this->hp_cell_future_fe_indices;
+
+ ar &hp_object_fe_ptr;
+ ar &hp_object_fe_indices;
+
+ ar &number_cache;
+
+ ar &mg_number_cache;
+
+ // these are the checks that correspond to the last block in the save()
+ // function
+ unsigned int n_cells;
+ std::string policy_name;
+
+ ar &n_cells &policy_name;
+
+ AssertThrow(
+ n_cells == this->tria->n_cells(),
+ ExcMessage(
+ "The object being loaded into does not match the triangulation "
+ "that has been stored previously."));
+ AssertThrow(
+ policy_name == dealii::internal::policy_to_string(*this->policy),
+ ExcMessage("The policy currently associated with this DoFHandler (" +
+ dealii::internal::policy_to_string(*this->policy) +
+ ") does not match the one that was associated with the "
+ "DoFHandler previously stored (" +
+ policy_name + ")."));
+ }
+ else
+ {
+ ar & this->block_info_object;
+ ar &number_cache;
+
+ object_dof_indices.clear();
+
+ object_dof_ptr.clear();
+
+ ar & this->object_dof_indices;
+ ar & this->object_dof_ptr;
+
+ ar & this->cell_dof_cache_indices;
+ ar & this->cell_dof_cache_ptr;
+
+ // these are the checks that correspond to the last block in the save()
+ // function
+ unsigned int n_cells;
+ std::string fe_name;
+ std::string policy_name;
+
+ ar &n_cells &fe_name &policy_name;
+
+ AssertThrow(
+ n_cells == this->tria->n_cells(),
+ ExcMessage(
+ "The object being loaded into does not match the triangulation "
+ "that has been stored previously."));
+ AssertThrow(
+ fe_name == this->get_fe(0).get_name(),
+ ExcMessage(
+ "The finite element associated with this DoFHandler does not match "
+ "the one that was associated with the DoFHandler previously stored."));
+ AssertThrow(policy_name == internal::policy_to_string(*this->policy),
+ ExcMessage(
+ "The policy currently associated with this DoFHandler (" +
+ internal::policy_to_string(*this->policy) +
+ ") does not match the one that was associated with the "
+ "DoFHandler previously stored (" +
+ policy_name + ")."));
+ }
}
const unsigned int fe_index) const
{
(void)fe_index;
- Assert(fe_index == 0,
+ Assert((fe_index ==
+ dealii::DoFHandler<dh_dim, spacedim>::default_fe_index),
ExcMessage("Only zero fe_index values are allowed for "
"non-hp DoFHandlers."));
return true;
* some block, and another degree of freedom with index $j$ belonging to the
* same block will be assigned new indices $n(i)$ and $n(j)$ with
* $n(i)<n(j)$ if $i<j$ and $n(i)>n(j)$ if $i>j$.
- */
- template <int dim, int spacedim>
- void
- block_wise(DoFHandler<dim, spacedim> &dof_handler);
-
- /**
- * Sort the degrees of freedom by vector block. It does the same thing as
- * the above function, only that it does this for one single level of a
- * multilevel discretization. The non-multigrid part of the DoFHandler
- * is not touched.
- */
- template <int dim, int spacedim>
- void
- block_wise(DoFHandler<dim, spacedim> &dof_handler, const unsigned int level);
-
- /**
- * Sort the degrees of freedom by block. It does the same thing as the above
- * function.
*
- * This function only succeeds if each of the elements in the
- * hp::FECollection attached to the hp::DoFHandler argument has exactly the
+ * @note This function only succeeds if each of the elements in the
+ * hp::FECollection attached to the DoFHandler argument has exactly the
* same number of blocks (see
* @ref GlossBlock "the glossary"
* for more information). Note that this is not always given: while the
* number of blocks and that subsequent blocks in one element have the same
* meaning as in another element.
*/
- template <int dim, int spacedim>
+ template <typename DoFHandlerType>
+ void
+ block_wise(DoFHandlerType &dof_handler);
+
+ /**
+ * Sort the degrees of freedom by vector block. It does the same thing as
+ * the above function, only that it does this for one single level of a
+ * multilevel discretization. The non-multigrid part of the DoFHandler
+ * is not touched.
+ */
+ template <typename DoFHandlerType>
void
- block_wise(hp::DoFHandler<dim, spacedim> &dof_handler);
+ block_wise(DoFHandlerType &dof_handler, const unsigned int level);
/**
* Compute the renumbering vector needed by the block_wise() functions.
*/
template <int dim, int spacedim>
void
- convert_couplings_to_blocks(const hp::DoFHandler<dim, spacedim> &dof_handler,
+ convert_couplings_to_blocks(const DoFHandler<dim, spacedim> &dof_handler,
const Table<2, Coupling> &table_by_component,
std::vector<Table<2, Coupling>> &tables_by_block);
DEAL_II_DEPRECATED unsigned int
max_dofs_per_cell(const DoFHandler<dim, spacedim> &dh);
- /**
- * Maximal number of degrees of freedom on a cell.
- *
- * @deprecated Use <code>dh.get_fe_collection().max_dofs_per_cell()</code>.
- *
- * @relatesalso hp::DoFHandler
- */
- template <int dim, int spacedim>
- DEAL_II_DEPRECATED unsigned int
- max_dofs_per_cell(const hp::DoFHandler<dim, spacedim> &dh);
-
/**
* Maximal number of degrees of freedom on a face.
DEAL_II_DEPRECATED unsigned int
max_dofs_per_face(const DoFHandler<dim, spacedim> &dh);
- /**
- * Maximal number of degrees of freedom on a face.
- *
- * This function exists for both non-hp and hp DoFHandlers, to allow for a
- * uniform interface to query this property.
- *
- * @deprecated Use <code>dh.get_fe_collection().max_dofs_per_face()</code>.
- *
- * @relatesalso hp::DoFHandler
- */
- template <int dim, int spacedim>
- DEAL_II_DEPRECATED unsigned int
- max_dofs_per_face(const hp::DoFHandler<dim, spacedim> &dh);
-
/**
* Maximal number of degrees of freedom on a vertex.
*
*/
template <int dim, int spacedim>
DEAL_II_DEPRECATED unsigned int
- max_dofs_per_vertex(const hp::DoFHandler<dim, spacedim> &dh);
+ max_dofs_per_vertex(const DoFHandler<dim, spacedim> &dh);
/**
* Number of vector components in the finite element object used by this
*/
template <int dim, int spacedim>
DEAL_II_DEPRECATED unsigned int
- n_components(const hp::DoFHandler<dim, spacedim> &dh);
+ n_components(const DoFHandler<dim, spacedim> &dh);
/**
* Find out whether the first FiniteElement used by this DoFHandler is
*/
template <int dim, int spacedim>
DEAL_II_DEPRECATED bool
- fe_is_primitive(const hp::DoFHandler<dim, spacedim> &dh);
+ fe_is_primitive(const DoFHandler<dim, spacedim> &dh);
/**
* @}
* @deprecated For the reason stated above, this function is deprecated in
* favor of the following function.
*/
- template <int dim, int spacedim>
+ template <typename DoFHandlerType>
DEAL_II_DEPRECATED void
- extract_hanging_node_dofs(const DoFHandler<dim, spacedim> &dof_handler,
- std::vector<bool> & selected_dofs);
+ extract_hanging_node_dofs(const DoFHandlerType &dof_handler,
+ std::vector<bool> & selected_dofs);
/**
* Same as above but return the selected DoFs as IndexSet. In particular,
* for parallel::TriangulationBase objects this function should be preferred.
*/
- template <int dim, int spacedim>
+ template <typename DoFHandlerType>
IndexSet
- extract_hanging_node_dofs(const DoFHandler<dim, spacedim> &dof_handler);
+ extract_hanging_node_dofs(const DoFHandlerType &dof_handler);
/**
* Extract the indices of the degrees of freedom belonging to certain vector
void
map_dofs_to_support_points(
const dealii::hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
std::vector<Point<spacedim>> & support_points,
const ComponentMask & mask = ComponentMask());
void
map_dofs_to_support_points(
const dealii::hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
std::map<types::global_dof_index, Point<spacedim>> &support_points,
const ComponentMask & mask = ComponentMask());
inline unsigned int
max_dofs_per_cell(const DoFHandler<dim, spacedim> &dh)
{
- return dh.get_fe().dofs_per_cell;
+ if (dh.hp_capability_enabled == true)
+ return dh.get_fe_collection().max_dofs_per_cell();
+ else
+ return dh.get_fe().dofs_per_cell;
}
inline unsigned int
max_dofs_per_face(const DoFHandler<dim, spacedim> &dh)
{
- return dh.get_fe().dofs_per_face;
+ if (dh.hp_capability_enabled == true)
+ return dh.get_fe_collection().max_dofs_per_face();
+ else
+ return dh.get_fe().dofs_per_face;
}
inline unsigned int
max_dofs_per_vertex(const DoFHandler<dim, spacedim> &dh)
{
- return dh.get_fe().dofs_per_vertex;
+ if (dh.hp_capability_enabled == true)
+ return dh.get_fe_collection().max_dofs_per_vertex();
+ else
+ return dh.get_fe().dofs_per_vertex;
}
inline unsigned int
n_components(const DoFHandler<dim, spacedim> &dh)
{
- return dh.get_fe().n_components();
+ if (dh.hp_capability_enabled == true)
+ return dh.get_fe(0).n_components();
+ else
+ return dh.get_fe().n_components();
}
inline bool
fe_is_primitive(const DoFHandler<dim, spacedim> &dh)
{
- return dh.get_fe().is_primitive();
- }
-
-
- template <int dim, int spacedim>
- inline unsigned int
- max_dofs_per_cell(const hp::DoFHandler<dim, spacedim> &dh)
- {
- return dh.get_fe_collection().max_dofs_per_cell();
- }
-
-
- template <int dim, int spacedim>
- inline unsigned int
- max_dofs_per_face(const hp::DoFHandler<dim, spacedim> &dh)
- {
- return dh.get_fe_collection().max_dofs_per_face();
- }
-
-
- template <int dim, int spacedim>
- inline unsigned int
- max_dofs_per_vertex(const hp::DoFHandler<dim, spacedim> &dh)
- {
- return dh.get_fe_collection().max_dofs_per_vertex();
- }
-
-
- template <int dim, int spacedim>
- inline unsigned int
- n_components(const hp::DoFHandler<dim, spacedim> &dh)
- {
- return dh.get_fe(0).n_components();
- }
-
-
- template <int dim, int spacedim>
- inline bool
- fe_is_primitive(const hp::DoFHandler<dim, spacedim> &dh)
- {
- return dh.get_fe(0).is_primitive();
+ if (dh.hp_capability_enabled == true)
+ return dh.get_fe(0).is_primitive();
+ else
+ return dh.get_fe().is_primitive();
}
template <int dim, int spacedim>
bool
find_connection_between_subdomains(
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const predicate_function<dim, spacedim> &predicate_1,
const predicate_function<dim, spacedim> &predicate_2);
template <int dim, int spacedim>
unsigned int
color_predicates(
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const std::vector<predicate_function<dim, spacedim>> &predicates,
std::vector<unsigned int> & predicate_colors);
template <int dim, int spacedim>
void
set_cellwise_color_set_and_fe_index(
- hp::DoFHandler<dim, spacedim> & dof_handler,
+ DoFHandler<dim, spacedim> & dof_handler,
const std::vector<predicate_function<dim, spacedim>> &predicates,
const std::vector<unsigned int> & predicate_colors,
std::map<unsigned int, std::map<unsigned int, unsigned int>>
* finite elements needed by @p dof_handler.
*/
const hp::FECollection<dim, spacedim> &
- build_fe_collection(hp::DoFHandler<dim, spacedim> &dof_handler);
+ build_fe_collection(DoFHandler<dim, spacedim> &dof_handler);
private:
/**
* space corresponding to @p fe1 is a subset of the finite element space
* corresponding to @p fe2, this function is simply an identity mapping.
*/
- template <int dim,
- template <int, int> class DoFHandlerType,
- class InVector,
- class OutVector,
- int spacedim>
+ template <int dim, class InVector, class OutVector, int spacedim>
void
- back_interpolate(const DoFHandlerType<dim, spacedim> &dof1,
- const InVector & u1,
- const FiniteElement<dim, spacedim> & fe2,
- OutVector & u1_interpolated);
+ back_interpolate(const DoFHandler<dim, spacedim> & dof1,
+ const InVector & u1,
+ const FiniteElement<dim, spacedim> &fe2,
+ OutVector & u1_interpolated);
/**
* Compute the interpolation of the @p dof1-function @p u1 to a @p
- template <int dim,
- template <int, int> class DoFHandlerType,
- class InVector,
- class OutVector,
- int spacedim>
+ template <int dim, class InVector, class OutVector, int spacedim>
void
- back_interpolate(const DoFHandlerType<dim, spacedim> &dof1,
- const InVector & u1,
- const FiniteElement<dim, spacedim> & fe2,
- OutVector & u1_interpolated)
+ back_interpolate(const DoFHandler<dim, spacedim> & dof1,
+ const InVector & u1,
+ const FiniteElement<dim, spacedim> &fe2,
+ OutVector & u1_interpolated)
{
Assert(dof1.get_fe(0).n_components() == fe2.n_components(),
ExcDimensionMismatch(dof1.get_fe(0).n_components(),
const types::subdomain_id subdomain_id =
dof1.get_triangulation().locally_owned_subdomain();
- typename DoFHandlerType<dim, spacedim>::active_cell_iterator
+ typename DoFHandler<dim, spacedim>::active_cell_iterator
cell = dof1.begin_active(),
endc = dof1.end();
using type = TriaActiveIterator<
dealii::DoFCellAccessor<dealii::DoFHandler<dim, spacedim>, false>>;
};
+# endif
+
+# ifdef _MSC_VER
template <int dim, int spacedim>
class ActiveCellIterator<dim, spacedim, dealii::hp::DoFHandler<dim, spacedim>>
{
public:
using type = TriaActiveIterator<
- dealii::DoFCellAccessor<dealii::hp::DoFHandler<dim, spacedim>, false>>;
+ dealii::DoFCellAccessor<dealii::DoFHandler<dim, spacedim>, false>>;
};
# endif
} // namespace internal
* element index for all other DoF handlers is always zero.
*/
template <int dim, int spacedim>
- std::pair<typename hp::DoFHandler<dim, spacedim>::active_cell_iterator,
+ std::pair<typename DoFHandler<dim, spacedim>::active_cell_iterator,
Point<dim>>
find_active_cell_around_point(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & mesh,
+ const DoFHandler<dim, spacedim> & mesh,
const Point<spacedim> & p,
const double tolerance = 1.e-10);
+++ /dev/null
-// ---------------------------------------------------------------------
-//
-// Copyright (C) 2006 - 2020 by the deal.II authors
-//
-// This file is part of the deal.II library.
-//
-// The deal.II library is free software; you can use it, redistribute
-// it, and/or modify it under the terms of the GNU Lesser General
-// Public License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// The full text of the license can be found in the file LICENSE.md at
-// the top level directory of deal.II.
-//
-// ---------------------------------------------------------------------
-
-#ifndef dealii_hp_dof_faces_h
-#define dealii_hp_dof_faces_h
-
-
-#include <deal.II/base/config.h>
-
-#include <deal.II/hp/fe_collection.h>
-
-#include <vector>
-
-DEAL_II_NAMESPACE_OPEN
-
-namespace internal
-{
- namespace hp
- {
- /**
- * Store the indices of the degrees of freedom which are located on
- * objects of dimension @p structdim < dim, i.e., for faces or edges of
- * cells. This is opposed to the internal::hp::DoFLevels class that stores
- * the DoF indices on cells.
- *
- * The things we store here is very similar to what is stored in the
- * internal::DoFHandlerImplementation::DoFObjects classes (see there for
- * more information, in particular on the layout of the class hierarchy, and
- * the use of file names).
- *
- * <h4>Offset computations</h4>
- *
- * For hp methods, not all cells may use the same finite element, and it
- * is consequently more complicated to determine where the DoF indices for
- * a given line, quad, or hex are stored. As described in the
- * documentation of the internal::DoFHandlerImplementation::DoFLevel class,
- * we can compute the location of the first line DoF, for example, by
- * calculating the offset as <code>line_index *
- * dof_handler.get_fe().dofs_per_line</code>. This of course doesn't work
- * any more if different lines may have different numbers of degrees of
- * freedom associated with them. Consequently, rather than using this
- * simple multiplication, the dofs array has an associated array
- * dof_offsets. The data corresponding to a line then starts at index
- * <code>line_dof_offsets[line_index]</code> within the
- * <code>line_dofs</code> array.
- *
- *
- * <h4>Multiple data sets per object</h4>
- *
- * If two adjacent cells use different finite elements, then the face that
- * they share needs to store DoF indices for both involved finite
- * elements. While faces therefore have to have at most two sets of DoF
- * indices, it is easy to see that edges and vertices can have as many
- * sets of DoF indices associated with them as there are adjacent cells.
- *
- * Consequently, for objects that have a lower dimensionality than cells,
- * we have to store a map from the finite element index to the set of DoF
- * indices associated. Since real sets are typically very inefficient to
- * store, and since most of the time we expect the number of individual
- * keys to be small (frequently, adjacent cells will have the same finite
- * element, and only a single entry will exist in the map), what we do is
- * instead to store a linked list. In this format, the first entry
- * starting at position
- * <code>lines.dofs[lines.dof_offsets[line_index]]</code> will denote the
- * finite element index of the set of DoF indices following; after this
- * set, we will store the finite element index of the second set followed
- * by the corresponding DoF indices; and so on. Finally, when all finite
- * element indices adjacent to this object have been covered, we write a
- * -1 to indicate the end of the list.
- *
- * Access to this kind of data, as well as the distinction between cells
- * and objects of lower dimensionality are encoded in the accessor
- * functions, DoFObjects::set_dof_index() and DoFLevel::get_dof_index().
- * They are able to traverse this list and pick out or set a DoF index
- * given the finite element index and its location within the set of DoFs
- * corresponding to this finite element.
- *
- *
- * @ingroup hp
- */
- template <int structdim>
- class DoFIndicesOnFacesOrEdges
- {
- public:
- /**
- * Store the start index for the degrees of freedom of each object in
- * the @p dofs array.
- *
- * The type we store is then obviously the type the @p dofs array uses
- * for indexing.
- */
- std::vector<unsigned int> dof_offsets;
-
- /**
- * Store the global indices of the degrees of freedom. See DoFLevel()
- * for detailed information.
- */
- std::vector<types::global_dof_index> dofs;
-
- /**
- * Set the global index of the @p local_index-th degree of freedom
- * located on the object with number @p obj_index to the value given by
- * @p global_index. The @p dof_handler argument is used to access the
- * finite element that is to be used to compute the location where this
- * data is stored.
- *
- * The third argument, @p fe_index, denotes which of the finite elements
- * associated with this object we shall access. Refer to the general
- * documentation of the internal::hp::DoFLevel class template for more
- * information.
- */
- template <int dim, int spacedim>
- void
- set_dof_index(const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const types::global_dof_index global_index,
- const unsigned int obj_level);
-
- /**
- * Return the global index of the @p local_index-th degree of freedom
- * located on the object with number @p obj_index. The @p dof_handler
- * argument is used to access the finite element that is to be used to
- * compute the location where this data is stored.
- *
- * The third argument, @p fe_index, denotes which of the finite elements
- * associated with this object we shall access. Refer to the general
- * documentation of the internal::hp::DoFLevel class template for more
- * information.
- */
- template <int dim, int spacedim>
- types::global_dof_index
- get_dof_index(const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const unsigned int obj_level) const;
-
- /**
- * Return the number of finite elements that are active on a given
- * object. If this is a cell, the answer is of course one. If it is a
- * face, the answer may be one or two, depending on whether the two
- * adjacent cells use the same finite element or not. If it is an edge
- * in 3d, the possible return value may be one or any other value larger
- * than that.
- *
- * If the object is not part of an active cell, then no degrees of
- * freedom have been distributed and zero is returned.
- */
- template <int dim, int spacedim>
- unsigned int
- n_active_fe_indices(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int obj_index) const;
-
- /**
- * Return the fe_index of the n-th active finite element on this object.
- */
- template <int dim, int spacedim>
- types::global_dof_index
- nth_active_fe_index(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int n) const;
-
- /**
- * Check whether a given finite element index is used on the present
- * object or not.
- */
- template <int dim, int spacedim>
- bool
- fe_index_is_active(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int obj_level) const;
-
- /**
- * Determine an estimate for the memory consumption (in bytes) of this
- * object.
- */
- std::size_t
- memory_consumption() const;
-
- /**
- * Read or write the data of this object to or from a stream for the
- * purpose of serialization
- */
- template <class Archive>
- void
- serialize(Archive &ar, const unsigned int version);
- };
-
-
-
- /**
- * These classes are similar to the internal::hp::DoFLevel classes. We
- * here store information that is associated with faces, rather than
- * cells, as this information is independent of the hierarchical structure
- * of cells, which are organized in levels. In 2D we store information on
- * degrees of freedom located on lines whereas in 3D we store information
- * on degrees of freedom located on quads and lines. In 1D we do nothing,
- * as the faces of lines are vertices which are treated separately.
- *
- * Apart from the internal::hp::DoFObjects object containing the data to
- * store (degree of freedom indices) and all the access-functionality to
- * this data, we do not store any data or provide any functionality.
- * However, we do implement a function to determine an estimate of the
- * memory consumption of the contained internal::hp::DoFObjects object(s).
- *
- * The data contained isn't usually directly accessed. Rather, except for
- * some access from the DoFHandler class, access is usually through the
- * DoFAccessor::set_dof_index() and DoFAccessor::dof_index() functions or
- * similar functions of derived classes that in turn access the member
- * variables using the DoFHandler::get_dof_index() and corresponding
- * setter functions. Knowledge of the actual data format is therefore
- * encapsulated to the present hierarchy of classes as well as the
- * ::DoFHandler class.
- *
- * @ingroup dofs
- */
- template <int dim>
- class DoFIndicesOnFaces;
-
-
- /**
- * Store the indices of degrees of freedom on faces in 1D. As these would
- * be vertices, which are treated separately, don't do anything.
- *
- * @ingroup hp
- */
- template <>
- class DoFIndicesOnFaces<1>
- {
- public:
- /**
- * Determine an estimate for the memory consumption (in bytes) of this
- * object.
- */
- std::size_t
- memory_consumption() const;
-
- /**
- * Read or write the data of this object to or from a stream for the
- * purpose of serialization
- */
- template <class Archive>
- void
- serialize(Archive &ar, const unsigned int version);
- };
-
- /**
- * Store the indices of degrees of freedom on faces in 2D, which are
- * lines.
- *
- * @ingroup hp
- */
- template <>
- class DoFIndicesOnFaces<2>
- {
- public:
- /**
- * Indices of DoFs on the lines that bound cells.
- */
- internal::hp::DoFIndicesOnFacesOrEdges<1> lines;
-
- /**
- * Determine an estimate for the memory consumption (in bytes) of this
- * object.
- */
- std::size_t
- memory_consumption() const;
-
- /**
- * Read or write the data of this object to or from a stream for the
- * purpose of serialization
- */
- template <class Archive>
- void
- serialize(Archive &ar, const unsigned int version);
- };
-
- /**
- * Store the indices of degrees of freedom on faces in 3D, which are
- * quads, additionally also on lines.
- *
- * @ingroup hp
- */
- template <>
- class DoFIndicesOnFaces<3>
- {
- public:
- /**
- * Indices of DoFs on the lines that form the edges of cells.
- */
- internal::hp::DoFIndicesOnFacesOrEdges<1> lines;
-
- /**
- * Indices of DoFs on the quads that bound cells.
- */
- internal::hp::DoFIndicesOnFacesOrEdges<2> quads;
-
- /**
- * Determine an estimate for the memory consumption (in bytes) of this
- * object.
- */
- std::size_t
- memory_consumption() const;
-
- /**
- * Read or write the data of this object to or from a stream for the
- * purpose of serialization
- */
- template <class Archive>
- void
- serialize(Archive &ar, const unsigned int version);
- };
-
-
- // --------------------- inline and template functions ------------------
- template <class Archive>
- void
- DoFIndicesOnFaces<1>::serialize(Archive &, const unsigned int)
- {}
-
-
-
- inline std::size_t
- DoFIndicesOnFaces<1>::memory_consumption() const
- {
- return 0;
- }
-
-
-
- template <class Archive>
- void
- DoFIndicesOnFaces<2>::serialize(Archive &ar, const unsigned int)
- {
- ar &lines;
- }
-
-
-
- inline std::size_t
- DoFIndicesOnFaces<2>::memory_consumption() const
- {
- return MemoryConsumption::memory_consumption(lines);
- }
-
-
-
- template <class Archive>
- void
- DoFIndicesOnFaces<3>::serialize(Archive &ar, const unsigned int)
- {
- ar &lines &quads;
- }
-
-
-
- inline std::size_t
- DoFIndicesOnFaces<3>::memory_consumption() const
- {
- return (MemoryConsumption::memory_consumption(lines) +
- MemoryConsumption::memory_consumption(quads));
- }
-
- template <int structdim>
- template <int dim, int spacedim>
- inline types::global_dof_index
- DoFIndicesOnFacesOrEdges<structdim>::get_dof_index(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const unsigned int /*obj_level*/) const
- {
- Assert((fe_index !=
- dealii::hp::DoFHandler<dim, spacedim>::default_fe_index),
- ExcMessage("You need to specify a FE index when working "
- "with hp DoFHandlers"));
- AssertIndexRange(fe_index, dof_handler.get_fe_collection().size());
- AssertIndexRange(
- local_index,
- dof_handler.get_fe(fe_index).template n_dofs_per_object<structdim>());
- AssertIndexRange(obj_index, dof_offsets.size());
-
- // make sure we are on an
- // object for which DoFs have
- // been allocated at all
- Assert(dof_offsets[obj_index] != numbers::invalid_unsigned_int,
- ExcMessage("You are trying to access degree of freedom "
- "information for an object on which no such "
- "information is available"));
-
- Assert(structdim < dim,
- ExcMessage("This object can not be used for cells."));
-
- // there may be multiple finite elements associated with
- // this object. hop along the list of index sets until we
- // find the one with the correct fe_index, and then poke
- // into that part. trigger an exception if we can't find a
- // set for this particular fe_index
- const types::global_dof_index starting_offset = dof_offsets[obj_index];
- const types::global_dof_index *pointer = &dofs[starting_offset];
- while (true)
- {
- Assert(*pointer != numbers::invalid_dof_index, ExcInternalError());
- if (*pointer == fe_index)
- return *(pointer + 1 + local_index);
- else
- pointer += static_cast<types::global_dof_index>(
- dof_handler.get_fe(*pointer)
- .template n_dofs_per_object<structdim>() +
- 1);
- }
- }
-
-
-
- template <int structdim>
- template <int dim, int spacedim>
- inline void
- DoFIndicesOnFacesOrEdges<structdim>::set_dof_index(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const types::global_dof_index global_index,
- const unsigned int /*obj_level*/)
- {
- Assert((fe_index !=
- dealii::hp::DoFHandler<dim, spacedim>::default_fe_index),
- ExcMessage("You need to specify a FE index when working "
- "with hp DoFHandlers"));
- AssertIndexRange(fe_index, dof_handler.get_fe_collection().size());
- AssertIndexRange(
- local_index,
- dof_handler.get_fe(fe_index).template n_dofs_per_object<structdim>());
- AssertIndexRange(obj_index, dof_offsets.size());
-
- // make sure we are on an
- // object for which DoFs have
- // been allocated at all
- Assert(dof_offsets[obj_index] != numbers::invalid_unsigned_int,
- ExcMessage("You are trying to access degree of freedom "
- "information for an object on which no such "
- "information is available"));
-
- Assert(structdim < dim,
- ExcMessage("This object can not be used for cells."));
-
- // there may be multiple finite elements associated with
- // this object. hop along the list of index sets until we
- // find the one with the correct fe_index, and then poke
- // into that part. trigger an exception if we can't find a
- // set for this particular fe_index
- const types::global_dof_index starting_offset = dof_offsets[obj_index];
- types::global_dof_index * pointer = &dofs[starting_offset];
- while (true)
- {
- Assert(*pointer != numbers::invalid_dof_index, ExcInternalError());
- if (*pointer == fe_index)
- {
- *(pointer + 1 + local_index) = global_index;
- return;
- }
- else
- pointer += dof_handler.get_fe(*pointer)
- .template n_dofs_per_object<structdim>() +
- 1;
- }
- }
-
-
-
- template <int structdim>
- template <int dim, int spacedim>
- inline unsigned int
- DoFIndicesOnFacesOrEdges<structdim>::n_active_fe_indices(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int obj_index) const
- {
- AssertIndexRange(obj_index, dof_offsets.size());
-
- // make sure we are on an
- // object for which DoFs have
- // been allocated at all
- if (dof_offsets[obj_index] == numbers::invalid_unsigned_int)
- return 0;
-
- Assert(structdim < dim,
- ExcMessage("This object can not be used for cells."));
-
- // there may be multiple finite elements associated with this
- // object. hop along the list of index sets until we find the
- // one with the correct fe_index, and then poke into that
- // part. trigger an exception if we can't find a set for this
- // particular fe_index
- const unsigned int starting_offset = dof_offsets[obj_index];
- const types::global_dof_index *pointer = &dofs[starting_offset];
- unsigned int counter = 0;
- while (true)
- {
- if (*pointer == numbers::invalid_dof_index)
- // end of list reached
- return counter;
- else
- {
- ++counter;
- pointer += dof_handler.get_fe(*pointer)
- .template n_dofs_per_object<structdim>() +
- 1;
- }
- }
- }
-
-
-
- template <int structdim>
- template <int dim, int spacedim>
- inline types::global_dof_index
- DoFIndicesOnFacesOrEdges<structdim>::nth_active_fe_index(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int /*obj_level*/,
- const unsigned int obj_index,
- const unsigned int n) const
- {
- AssertIndexRange(obj_index, dof_offsets.size());
-
- // make sure we are on an
- // object for which DoFs have
- // been allocated at all
- Assert(dof_offsets[obj_index] != numbers::invalid_unsigned_int,
- ExcMessage("You are trying to access degree of freedom "
- "information for an object on which no such "
- "information is available"));
-
- Assert(structdim < dim,
- ExcMessage("This object can not be used for cells."));
-
- AssertIndexRange(n, n_active_fe_indices(dof_handler, obj_index));
-
- // there may be multiple finite elements associated with
- // this object. hop along the list of index sets until we
- // find the one with the correct fe_index, and then poke
- // into that part. trigger an exception if we can't find a
- // set for this particular fe_index
- const unsigned int starting_offset = dof_offsets[obj_index];
- const types::global_dof_index *pointer = &dofs[starting_offset];
- unsigned int counter = 0;
- while (true)
- {
- Assert(*pointer != numbers::invalid_dof_index, ExcInternalError());
-
- const unsigned int fe_index = *pointer;
-
- Assert(fe_index < dof_handler.get_fe_collection().size(),
- ExcInternalError());
-
- if (counter == n)
- return fe_index;
-
- ++counter;
- pointer += dof_handler.get_fe(fe_index)
- .template n_dofs_per_object<structdim>() +
- 1;
- }
- }
-
-
-
- template <int structdim>
- template <int dim, int spacedim>
- inline bool
- DoFIndicesOnFacesOrEdges<structdim>::fe_index_is_active(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int /*obj_level*/) const
- {
- AssertIndexRange(obj_index, dof_offsets.size());
- Assert((fe_index !=
- dealii::hp::DoFHandler<dim, spacedim>::default_fe_index),
- ExcMessage("You need to specify a FE index when working "
- "with hp DoFHandlers"));
- AssertIndexRange(fe_index, dof_handler.get_fe_collection().size());
-
- // make sure we are on an
- // object for which DoFs have
- // been allocated at all
- Assert(dof_offsets[obj_index] != numbers::invalid_unsigned_int,
- ExcMessage("You are trying to access degree of freedom "
- "information for an object on which no such "
- "information is available"));
-
- Assert(structdim < dim,
- ExcMessage("This object can not be used for cells."));
-
- // there may be multiple finite elements associated with
- // this object. hop along the list of index sets until we
- // find the one with the correct fe_index, and then poke
- // into that part. trigger an exception if we can't find a
- // set for this particular fe_index
- const types::global_dof_index starting_offset = dof_offsets[obj_index];
- const types::global_dof_index *pointer = &dofs[starting_offset];
- while (true)
- {
- if (*pointer == numbers::invalid_dof_index)
- // end of list reached
- return false;
- else if (*pointer == fe_index)
- return true;
- else
- pointer += static_cast<types::global_dof_index>(
- dof_handler.get_fe(*pointer)
- .template n_dofs_per_object<structdim>() +
- 1);
- }
- }
-
- template <int structdim>
- template <class Archive>
- void
- DoFIndicesOnFacesOrEdges<structdim>::serialize(Archive &ar,
- const unsigned int)
- {
- ar &dofs;
- ar &dof_offsets;
- }
-
-
- } // namespace hp
-
-} // namespace internal
-
-DEAL_II_NAMESPACE_CLOSE
-
-#endif
#ifndef dealii_hp_dof_handler_h
#define dealii_hp_dof_handler_h
-
-
-#include <deal.II/base/config.h>
-
-#include <deal.II/base/exceptions.h>
-#include <deal.II/base/function.h>
-#include <deal.II/base/iterator_range.h>
-#include <deal.II/base/smartpointer.h>
-#include <deal.II/base/template_constraints.h>
-
-#include <deal.II/dofs/deprecated_function_map.h>
-#include <deal.II/dofs/dof_accessor.h>
-#include <deal.II/dofs/dof_iterator_selector.h>
-#include <deal.II/dofs/number_cache.h>
-
-#include <deal.II/hp/dof_faces.h>
-#include <deal.II/hp/dof_level.h>
-#include <deal.II/hp/fe_collection.h>
-
-#include <map>
-#include <memory>
-#include <set>
-#include <vector>
+#include <deal.II/dofs/dof_handler.h>
DEAL_II_NAMESPACE_OPEN
-// Forward declarations
-#ifndef DOXYGEN
-template <int dim, int spacedim>
-class Triangulation;
-
-namespace parallel
-{
- namespace distributed
- {
- template <int dim, int spacedim, typename VectorType>
- class CellDataTransfer;
- }
-} // namespace parallel
-
-namespace internal
-{
- namespace DoFHandlerImplementation
- {
- struct Implementation;
-
- namespace Policy
- {
- template <int dim, int spacedim>
- class PolicyBase;
- struct Implementation;
- } // namespace Policy
- } // namespace DoFHandlerImplementation
-
- namespace hp
- {
- class DoFLevel;
-
- namespace DoFHandlerImplementation
- {
- struct Implementation;
- }
- } // namespace hp
-} // namespace internal
-
-namespace internal
-{
- namespace DoFAccessorImplementation
- {
- struct Implementation;
- }
-
- namespace DoFCellAccessorImplementation
- {
- struct Implementation;
- }
-} // namespace internal
-#endif
-
-
namespace hp
{
/**
*
* @ingroup dofs
* @ingroup hp
+ *
+ * @note Task is delegated to the base class dealii::DoFHandler.
*/
template <int dim, int spacedim = dim>
- class DoFHandler : public Subscriptor
+ class DoFHandler : public dealii::DoFHandler<dim, spacedim>
{
- using ActiveSelector = dealii::internal::DoFHandlerImplementation::
- Iterators<DoFHandler<dim, spacedim>, false>;
- using LevelSelector = dealii::internal::DoFHandlerImplementation::
- Iterators<DoFHandler<dim, spacedim>, true>;
-
public:
- /**
- * An alias that is used to identify cell iterators in DoFHandler objects.
- * The concept of iterators is discussed at length in the
- * @ref Iterators "iterators documentation module".
- *
- * The current alias works, in essence, like the corresponding
- * Triangulation::cell_accessor alias. However, it also makes available
- * the member functions of DoFCellAccessor, in addition to the ones
- * already available through the CellAccessor class.
- *
- * @ingroup Iterators
- */
- using cell_accessor = typename ActiveSelector::CellAccessor;
-
- /**
- * An alias that is used to identify iterators that point to faces.
- * The concept of iterators is discussed at length in the
- * @ref Iterators "iterators documentation module".
- *
- * The current alias works, in essence, like the corresponding
- * Triangulation::face_accessor alias. However, it also makes available
- * the member functions of DoFAccessor, in addition to the ones
- * already available through the TriaAccessor class.
- *
- * @ingroup Iterators
- */
- using face_accessor = typename ActiveSelector::FaceAccessor;
-
- /**
- * An alias that defines an iterator over the (one-dimensional) lines
- * of a mesh. In one-dimensional meshes, these are the cells of the mesh,
- * whereas in two-dimensional meshes the lines are the faces of cells.
- *
- * @ingroup Iterators
- */
- using line_iterator = typename ActiveSelector::line_iterator;
-
- /**
- * An alias that allows iterating over the <i>active</i> lines, i.e.,
- * that subset of lines that have no children. In one-dimensional meshes,
- * these are the cells of the mesh, whereas in two-dimensional
- * meshes the lines are the faces of cells.
- *
- * In two- or three-dimensional meshes, lines without children (i.e.,
- * the active lines) are part of at least one active cell. Each such line
- * may additionally be a child of a line of a coarser cell adjacent to a
- * cell that is active. (This coarser neighbor would then also be active.)
- *
- * @ingroup Iterators
- */
- using active_line_iterator = typename ActiveSelector::active_line_iterator;
-
- /**
- * An alias that defines an iterator over the (two-dimensional) quads
- * of a mesh. In two-dimensional meshes, these are the cells of the mesh,
- * whereas in three-dimensional meshes the quads are the faces of cells.
- *
- * @ingroup Iterators
- */
- using quad_iterator = typename ActiveSelector::quad_iterator;
-
- /**
- * An alias that allows iterating over the <i>active</i> quads, i.e.,
- * that subset of quads that have no children. In two-dimensional meshes,
- * these are the cells of the mesh, whereas in three-dimensional
- * meshes the quads are the faces of cells.
- *
- * In three-dimensional meshes, quads without children (i.e.,
- * the active quads) are faces of at least one active cell. Each such quad
- * may additionally be a child of a quad face of a coarser cell adjacent to
- * a cell that is active. (This coarser neighbor would then also be active.)
- *
- * @ingroup Iterators
- */
- using active_quad_iterator = typename ActiveSelector::active_quad_iterator;
-
- /**
- * An alias that defines an iterator over the (three-dimensional) hexes
- * of a mesh. This iterator only makes sense in three-dimensional meshes,
- * where hexes are the cells of the mesh.
- *
- * @ingroup Iterators
- */
- using hex_iterator = typename ActiveSelector::hex_iterator;
-
- /**
- * An alias that allows iterating over the <i>active</i> hexes of a mesh.
- * This iterator only makes sense in three-dimensional meshes,
- * where hexes are the cells of the mesh. Consequently, in these
- * three-dimensional meshes, this iterator is equivalent to the
- * @p active_cell_iterator alias.
- *
- * @ingroup Iterators
- */
- using active_hex_iterator = typename ActiveSelector::active_hex_iterator;
-
- /**
- * @copydoc ::DoFHandler::active_cell_iterator
- * @ingroup Iterators
- */
-#ifndef _MSC_VER
- using active_cell_iterator = typename ActiveSelector::active_cell_iterator;
-#else
- using active_cell_iterator = TriaActiveIterator<
- dealii::DoFCellAccessor<DoFHandler<dim, spacedim>, false>>;
-#endif
-
- using level_cell_iterator = typename LevelSelector::cell_iterator;
-
- /**
- * @copydoc ::DoFHandler::cell_iterator
- * @ingroup Iterators
- */
-#ifndef _MSC_VER
- using cell_iterator = typename ActiveSelector::cell_iterator;
-#else
- using cell_iterator =
- TriaIterator<dealii::DoFCellAccessor<DoFHandler<dim, spacedim>, false>>;
-#endif
-
- /**
- * @copydoc ::DoFHandler::face_iterator
- * @ingroup Iterators
- */
- using face_iterator = typename ActiveSelector::face_iterator;
-
- /**
- * @copydoc ::DoFHandler::active_face_iterator
- * @ingroup Iterators
- */
- using active_face_iterator = typename ActiveSelector::active_face_iterator;
-
- using level_cell_accessor = typename LevelSelector::CellAccessor;
- using level_face_accessor = typename LevelSelector::FaceAccessor;
-
- using level_face_iterator = typename LevelSelector::face_iterator;
-
- /**
- * Make the dimension available in function templates.
- */
- static const unsigned int dimension = dim;
-
- /**
- * Make the space dimension available in function templates.
- */
- static const unsigned int space_dimension = spacedim;
-
- /**
- * Make the type of this DoFHandler available in function templates.
- */
- static const bool is_hp_dof_handler = true;
-
- /**
- * The default index of the finite element to be used on a given cell. For
- * the usual, non-hp dealii::DoFHandler class that only supports the same
- * finite element to be used on all cells, the index of the finite element
- * needs to be the same on all cells anyway, and by convention we pick
- * zero for this value. The situation here is different, since the hp
- * classes support the case where different finite element indices may be
- * used on different cells. The default index consequently corresponds to
- * an invalid value.
- */
- static const unsigned int default_fe_index = numbers::invalid_unsigned_int;
-
-
/**
* Default Constructor.
+ *
+ * @deprecated Use dealii::DoFHandler(true) instead.
*/
+ DEAL_II_DEPRECATED
DoFHandler();
/**
* Constructor. Take @p tria as the triangulation to work on.
+ *
+ * @deprecated Use dealii::DoFHandler(tria, true) instead.
*/
+ DEAL_II_DEPRECATED
DoFHandler(const Triangulation<dim, spacedim> &tria);
/**
*/
DoFHandler(const DoFHandler &) = delete;
- /**
- * Destructor.
- */
- virtual ~DoFHandler() override;
-
/**
* Copy operator. DoFHandler objects are large and expensive.
* They should not be copied, in particular not by accident, but
*/
DoFHandler &
operator=(const DoFHandler &) = delete;
-
- /**
- * Assign a Triangulation and a FECollection to the DoFHandler and compute
- * the distribution of degrees of freedom over the mesh.
- */
- void
- initialize(const Triangulation<dim, spacedim> & tria,
- const hp::FECollection<dim, spacedim> &fe);
-
- /**
- * Assign a hp::FECollection @p fe to this object.
- *
- * In case a parallel::TriangulationBase is assigned to this object,
- * the active_fe_indices will be exchanged between processors so that
- * each one knows the indices on its own cells and all ghost cells.
- *
- * @note In accordance with dealii::DoFHandler::set_fe(),
- * this function also makes a copy of the object given as argument.
- *
- * @warning This function only sets a hp::FECollection. Degrees of freedom
- * have either not been distributed yet, or are distributed using a
- * previously set collection. In both cases, accessing degrees of freedom
- * will lead to invalid results. To restore consistency, call
- * distribute_dofs().
- */
- virtual void
- set_fe(const hp::FECollection<dim, spacedim> &fe);
-
- /**
- * Go through the triangulation and "distribute" the degrees of
- * freedom needed for the given finite element. "Distributing"
- * degrees of freedom involves allocating memory to store the
- * indices on all entities on which degrees of freedom can be
- * located (e.g., vertices, edges, faces, etc.) and to then enumerate
- * all degrees of freedom. In other words, while the mesh and the
- * finite element object by themselves simply define a finite
- * element space $V_h$, the process of distributing degrees of
- * freedom makes sure that there is a basis for this space and that
- * the shape functions of this basis are enumerated in an indexable,
- * predictable way.
- *
- * The exact order in which degrees of freedom on a mesh are
- * ordered, i.e., the order in which basis functions of the finite
- * element space are enumerated, is something that deal.II treats as
- * an implementation detail. By and large, degrees of freedom are
- * enumerated in the same order in which we traverse cells, but you
- * should not rely on any specific numbering. In contrast, if you
- * want a particular ordering, use the functions in namespace
- * DoFRenumbering.
- *
- * @note In accordance with dealii::DoFHandler::distribute_dofs(),
- * this function also makes a copy of the object given as argument.
- */
- virtual void
- distribute_dofs(const hp::FECollection<dim, spacedim> &fe);
-
- /**
- * Go through the triangulation and set the active FE indices of all
- * active cells to the values given in @p active_fe_indices.
- */
- void
- set_active_fe_indices(const std::vector<unsigned int> &active_fe_indices);
-
- /**
- * Go through the triangulation and store the active FE indices of all
- * active cells to the vector @p active_fe_indices. This vector is
- * resized, if necessary.
- */
- void
- get_active_fe_indices(std::vector<unsigned int> &active_fe_indices) const;
-
- /**
- * Clear all data of this object and especially delete the lock this
- * object has to the finite element used the last time when @p
- * distribute_dofs was called.
- */
- virtual void
- clear();
-
- /**
- * Renumber degrees of freedom based on a list of new DoF indices for each
- * of the degrees of freedom.
- *
- * This function is called by the functions in DoFRenumbering function after
- * computing a new ordering of the degree of freedom indices. However, it
- * can of course also be called from user code.
- *
- * @arg new_number This array must have a size equal to the number of
- * degrees of freedom owned by the current processor, i.e. the size must be
- * equal to what n_locally_owned_dofs() returns. If only one processor
- * participates in storing the current mesh, then this equals the total
- * number of degrees of freedom, i.e. the result of n_dofs(). The contents
- * of this array are the new global indices for each freedom listed in the
- * IndexSet returned by locally_owned_dofs(). In the case of a sequential
- * mesh this means that the array is a list of new indices for each of the
- * degrees of freedom on the current mesh. In the case that we have a
- * parallel::shared::Triangulation or
- * parallel::distributed::Triangulation underlying this DoFHandler object,
- * the array is a list of new indices for all the locally owned degrees of
- * freedom, enumerated in the same order as the currently locally owned
- * DoFs. In other words, assume that degree of freedom <code>i</code> is
- * currently locally owned, then
- * <code>new_numbers[locally_owned_dofs().index_within_set(i)]</code>
- * returns the new global DoF index of <code>i</code>. Since the IndexSet of
- * locally_owned_dofs() is complete in the sequential case, the latter
- * convention for the content of the array reduces to the former in the case
- * that only one processor participates in the mesh.
- *
- * @note While it follows from the above, it may be surprising to know that
- * the <i>number</i> of locally owned degrees of freedom in a parallel
- * computation is an invariant
- * under renumbering, even if the <i>indices</i> associated with these
- * locally owned degrees of freedom are not. At a fundamental level,
- * this invariant exists because the <i>decision</i> whether a degree of
- * freedom is locally owned or not has nothing to do with that
- * degree of freedom's (old or new) index. Indeed, degrees of freedom
- * are locally owned if they are on a locally owned cell and not on
- * an interface between cells where the neighboring cell has a lower
- * @ref GlossSubdomainId "subdomain id". Since both of these conditions
- * are independent of the index associated with the DoF, a locally
- * owned degree of freedom will also be locally owned after renumbering.
- * On the other hand, properties such as whether the set of indices
- * of locally owned DoFs forms a contiguous range or not
- * (i.e., whether the locally_owned_dofs() returns an IndexSet object
- * for which IndexSet::is_contiguous() returns @p true) are of
- * course affected by the exact renumbering performed here. For example,
- * while the initial numbering of DoF indices done in distribute_dofs()
- * yields a contiguous numbering, the renumbering performed by
- * DoFRenumbering::component_wise() will, in general, not yield
- * contiguous locally owned DoF indices.
- */
- void
- renumber_dofs(const std::vector<types::global_dof_index> &new_numbers);
-
- /**
- * Return the maximum number of degrees of freedom a degree of freedom in
- * the given triangulation with the given finite element may couple with.
- * This is the maximum number of entries per line in the system matrix;
- * this information can therefore be used upon construction of the
- * SparsityPattern object.
- *
- * The returned number is not really the maximum number but an estimate
- * based on the finite element and the maximum number of cells meeting at
- * a vertex. The number holds for the constrained matrix also.
- *
- * As for ::DoFHandler::max_couplings_between_dofs(), the result of this
- * function is often not very accurate for 3d and/or high polynomial
- * degrees. The consequences are discussed in the documentation of the
- * module on
- * @ref Sparsity.
- */
- unsigned int
- max_couplings_between_dofs() const;
-
- /**
- * Return the number of degrees of freedom located on the boundary another
- * dof on the boundary can couple with.
- *
- * The number is the same as for @p max_coupling_between_dofs in one
- * dimension less.
- *
- * @note The same applies to this function as to max_couplings_per_dofs()
- * as regards the performance of this function. Think about one of the
- * dynamic sparsity pattern classes instead (see
- * @ref Sparsity).
- */
- unsigned int
- max_couplings_between_boundary_dofs() const;
-
- /**
- * @name Cell iterator functions
- */
- /*@{*/
- /**
- * Iterator to the first used cell on level @p level.
- */
- cell_iterator
- begin(const unsigned int level = 0) const;
-
- /**
- * Iterator to the first active cell on level @p level. If the given level
- * does not contain any active cells (i.e., all cells on this level are
- * further refined, then this function returns
- * <code>end_active(level)</code> so that loops of the kind
- * @code
- * for (cell=dof_handler.begin_active(level);
- * cell!=dof_handler.end_active(level);
- * ++cell)
- * {
- * ...
- * }
- * @endcode
- * have zero iterations, as may be expected if there are no active cells
- * on this level.
- */
- active_cell_iterator
- begin_active(const unsigned int level = 0) const;
-
- /**
- * Iterator past the end; this iterator serves for comparisons of
- * iterators with past-the-end or before-the-beginning states.
- */
- cell_iterator
- end() const;
-
- /**
- * Return an iterator which is the first iterator not on level. If @p
- * level is the last level, then this returns <tt>end()</tt>.
- */
- cell_iterator
- end(const unsigned int level) const;
-
- /**
- * Return an active iterator which is the first active iterator not on the
- * given level. If @p level is the last level, then this returns
- * <tt>end()</tt>.
- */
- active_cell_iterator
- end_active(const unsigned int level) const;
-
- /**
- * @name Cell iterator functions returning ranges of iterators
- */
-
- /**
- * Return an iterator range that contains all cells (active or not) that
- * make up this DoFHandler. Such a range is useful to initialize range-
- * based for loops as supported by C++11. See the example in the
- * documentation of active_cell_iterators().
- *
- * @return The half open range <code>[this->begin(), this->end())</code>
- *
- * @ingroup CPP11
- */
- IteratorRange<cell_iterator>
- cell_iterators() const;
-
- /**
- * Return an iterator range that contains all active cells that make up
- * this DoFHandler. Such a range is useful to initialize range-based for
- * loops as supported by C++11, see also
- * @ref CPP11 "C++11 standard".
- *
- * Range-based for loops are useful in that they require much less code
- * than traditional loops (see <a
- * href="http://en.wikipedia.org/wiki/C%2B%2B11#Range-based_for_loop">here</a>
- * for a discussion of how they work). An example is that without
- * range-based for loops, one often writes code such as the following:
- * @code
- * DoFHandler<dim> dof_handler;
- * ...
- * typename DoFHandler<dim>::active_cell_iterator
- * cell = dof_handler.begin_active(),
- * endc = dof_handler.end();
- * for (; cell!=endc; ++cell)
- * {
- * fe_values.reinit (cell);
- * ...do the local integration on 'cell'...;
- * }
- * @endcode
- * Using C++11's range-based for loops, this is now entirely equivalent to
- * the following:
- * @code
- * DoFHandler<dim> dof_handler;
- * ...
- * for (const auto &cell : dof_handler.active_cell_iterators())
- * {
- * fe_values.reinit (cell);
- * ...do the local integration on 'cell'...;
- * }
- * @endcode
- *
- * @return The half open range <code>[this->begin_active(),
- * this->end())</code>
- *
- * @ingroup CPP11
- */
- IteratorRange<active_cell_iterator>
- active_cell_iterators() const;
-
- /**
- * Return an iterator range that contains all cells (active or not) that
- * make up the given level of this DoFHandler. Such a range is useful to
- * initialize range-based for loops as supported by C++11. See the example
- * in the documentation of active_cell_iterators().
- *
- * @param[in] level A given level in the refinement hierarchy of this
- * triangulation.
- * @return The half open range <code>[this->begin(level),
- * this->end(level))</code>
- *
- * @pre level must be less than this->n_levels().
- *
- * @ingroup CPP11
- */
- IteratorRange<cell_iterator>
- cell_iterators_on_level(const unsigned int level) const;
-
- /**
- * Return an iterator range that contains all active cells that make up
- * the given level of this DoFHandler. Such a range is useful to
- * initialize range-based for loops as supported by C++11. See the example
- * in the documentation of active_cell_iterators().
- *
- * @param[in] level A given level in the refinement hierarchy of this
- * triangulation.
- * @return The half open range <code>[this->begin_active(level),
- * this->end(level))</code>
- *
- * @pre level must be less than this->n_levels().
- *
- * @ingroup CPP11
- */
- IteratorRange<active_cell_iterator>
- active_cell_iterators_on_level(const unsigned int level) const;
-
- /*
- * @}
- */
-
- /*---------------------------------------*/
-
-
- /**
- * Return the global number of degrees of freedom. If the current object
- * handles all degrees of freedom itself (even if you may intend to solve
- * your linear system in parallel, such as in step-17 or step-18), then
- * this number equals the number of locally owned degrees of freedom since
- * this object doesn't know anything about what you want to do with it and
- * believes that it owns every degree of freedom it knows about.
- *
- * On the other hand, if this object operates on a
- * parallel::distributed::Triangulation object, then this function returns
- * the global number of degrees of freedom, accumulated over all
- * processors.
- *
- * In either case, included in the returned number are those DoFs which
- * are constrained by hanging nodes, see
- * @ref constraints.
- *
- * Mathematically speaking, the number returned by this function equals the
- * dimension of the finite element space (without taking into account
- * constraints) that corresponds to (i) the mesh on which it is defined,
- * and (ii) the finite element that is used by the current object. It
- * also, of course, equals the number of shape functions that span this
- * space.
- */
- types::global_dof_index
- n_dofs() const;
-
- /**
- * The number of multilevel dofs on given level. Since hp::DoFHandler does
- * not support multilevel methods yet, this function throws an exception
- * ExcNotImplemented() independent of its argument.
- */
- types::global_dof_index
- n_dofs(const unsigned int level) const;
-
- /**
- * Return the number of locally owned degrees of freedom located on the
- * boundary.
- */
- types::global_dof_index
- n_boundary_dofs() const;
-
- /**
- * Return the number of degrees of freedom located on those parts of the
- * boundary which have a boundary indicator listed in the given set. The
- * reason that a @p map rather than a @p set is used is the same as
- * described in the documentation of that variant of
- * DoFTools::make_boundary_sparsity_pattern() that takes a map.
- *
- * There is, however, another overload of this function that takes
- * a @p set argument (see below).
- */
- template <typename number>
- types::global_dof_index
- n_boundary_dofs(
- const std::map<types::boundary_id, const Function<spacedim, number> *>
- &boundary_ids) const;
-
- /**
- * Return the number of locally owned degrees of freedom located on those
- * parts of the boundary which have a boundary indicator listed in the given
- * set.
- */
- types::global_dof_index
- n_boundary_dofs(const std::set<types::boundary_id> &boundary_ids) const;
-
- /**
- * Return the number of degrees of freedom that belong to this process.
- *
- * If this is a sequential DoFHandler, then the result equals that produced
- * by n_dofs(). (Here, "sequential" means that either the whole program does
- * not use MPI, or that it uses MPI but only uses a single MPI process, or
- * that there are multiple MPI processes but the Triangulation on which this
- * DoFHandler builds works only on one MPI process.) On the other hand, if
- * we are operating on a parallel::distributed::Triangulation or
- * parallel::shared::Triangulation, then it includes only the degrees of
- * freedom that the current processor owns. Note that in this case this does
- * not include all degrees of freedom that have been distributed on the
- * current processor's image of the mesh: in particular, some of the degrees
- * of freedom on the interface between the cells owned by this processor and
- * cells owned by other processors may be theirs, and degrees of freedom on
- * ghost cells are also not necessarily included.
- */
- types::global_dof_index
- n_locally_owned_dofs() const;
-
- /**
- * Return an IndexSet describing the set of locally owned DoFs as a subset
- * of 0..n_dofs(). The number of elements of this set equals
- * n_locally_owned_dofs().
- */
- const IndexSet &
- locally_owned_dofs() const;
-
- /**
- * Return a vector that stores the locally owned DoFs of each processor.
- *
- * @deprecated As of deal.II version 9.2, we do not populate a vector with
- * the index sets of all processors by default any more due to a possibly
- * large memory footprint on many processors. As a consequence, this
- * function needs to call `Utilities::all_gather(comm,
- * locally_owned_dofs())` upon the first invocation, including global
- * communication. Use `Utilities::all_gather(comm,
- * dof_handler.locally_owned_dofs())` instead if using up to a few thousands
- * of MPI ranks or some variant involving local communication with more
- * processors.
- */
- DEAL_II_DEPRECATED const std::vector<IndexSet> &
- locally_owned_dofs_per_processor() const;
-
- /**
- * Return a vector that stores the number of degrees of freedom each
- * processor that participates in this triangulation owns locally. The sum
- * of all these numbers equals the number of degrees of freedom that exist
- * globally, i.e. what n_dofs() returns.
- *
- * @deprecated As of deal.II version 9.2, we do not populate a vector with
- * the numbers of dofs of all processors by default any more due to a
- * possibly large memory footprint on many processors. As a consequence,
- * this function needs to call `Utilities::all_gather(comm,
- * n_locally_owned_dofs()` upon the first invocation, including global
- * communication. Use `Utilities::all_gather(comm,
- * dof_handler.n_locally_owned_dofs()` instead if using up to a few
- * thousands of MPI ranks or some variant involving local communication with
- * more processors.
- */
- DEAL_II_DEPRECATED const std::vector<types::global_dof_index> &
- n_locally_owned_dofs_per_processor() const;
-
- /**
- * Return an IndexSet describing the set of locally owned DoFs used for
- * the given multigrid level. Since hp::DoFHandler does not support
- * multilevel methods yet, this function throws an exception
- * ExcNotImplemented() independent of its argument.
- */
- const IndexSet &
- locally_owned_mg_dofs(const unsigned int level) const;
-
- /**
- * Return a vector that stores the locally owned DoFs of each processor on
- * the given level @p level.
- *
- * @deprecated As of deal.II version 9.2, we do not populate a vector with
- * the index sets of all processors by default any more due to a possibly
- * large memory footprint on many processors. As a consequence, this
- * function needs to call `Utilities::all_gather(comm,
- * locally_owned_dofs_mg())` upon the first invocation, including global
- * communication. Use `Utilities::all_gather(comm,
- * dof_handler.locally_owned_dofs_mg())` instead if using up to a few
- * thousands of MPI ranks or some variant involving local communication with
- * more processors.
- */
- DEAL_II_DEPRECATED const std::vector<IndexSet> &
- locally_owned_mg_dofs_per_processor(const unsigned int level) const;
-
- /**
- * Return a constant reference to the indexth finite element object that is
- * used by this @p DoFHandler.
- */
- const FiniteElement<dim, spacedim> &
- get_fe(const unsigned int index) const;
-
- /**
- * Return a constant reference to the set of finite element objects that
- * are used by this @p DoFHandler.
- */
- const hp::FECollection<dim, spacedim> &
- get_fe_collection() const;
-
- /**
- * Return a constant reference to the triangulation underlying this
- * object.
- */
- const Triangulation<dim, spacedim> &
- get_triangulation() const;
-
- /**
- * Determine an estimate for the memory consumption (in bytes) of this
- * object.
- *
- * This function is made virtual, since a dof handler object might be
- * accessed through a pointers to this base class, although the actual
- * object might be a derived class.
- */
- virtual std::size_t
- memory_consumption() const;
-
- /**
- * Whenever serialization with a parallel::distributed::Triangulation as the
- * underlying triangulation is considered, we also need to consider storing
- * the active_fe_indices on all active cells as well.
- *
- * This function registers that these indices are to be stored whenever the
- * parallel::distributed::Triangulation::save() function is called on the
- * underlying triangulation.
- *
- * @note Currently only implemented for triangulations of type
- * parallel::distributed::Triangulation. An assertion will be triggered if
- * a different type is registered.
- *
- * @see The documentation of parallel::distributed::SolutionTransfer has further
- * information on serialization.
- */
- void
- prepare_for_serialization_of_active_fe_indices();
-
- /**
- * Whenever serialization with a parallel::distributed::Triangulation as the
- * underlying triangulation is considered, we also need to consider storing
- * the active_fe_indices on all active cells as well.
- *
- * This function deserializes and distributes the previously stored
- * active_fe_indices on all active cells.
- *
- * @note Currently only implemented for triangulations of type
- * parallel::distributed::Triangulation. An assertion will be triggered if
- * a different type is registered.
- *
- * @see The documentation of parallel::distributed::SolutionTransfer has further
- * information on serialization.
- */
- void
- deserialize_active_fe_indices();
-
- /**
- * Write the data of this object to a stream for the purpose of
- * serialization.
- */
- template <class Archive>
- void
- save(Archive &ar, const unsigned int version) const;
-
- /**
- * Read the data of this object from a stream for the purpose of
- * serialization.
- */
- template <class Archive>
- void
- load(Archive &ar, const unsigned int version);
-
-#ifdef DOXYGEN
- /**
- * Write and read the data of this object from a stream for the purpose
- * of serialization.
- */
- template <class Archive>
- void
- serialize(Archive &archive, const unsigned int version);
-#else
- // This macro defines the serialize() method that is compatible with
- // the templated save() and load() method that have been implemented.
- BOOST_SERIALIZATION_SPLIT_MEMBER()
-#endif
-
- /**
- * Exception
- */
- DeclException0(ExcNoFESelected);
- /**
- * Exception
- */
- DeclException0(ExcGridsDoNotMatch);
- /**
- * Exception
- */
- DeclException0(ExcInvalidBoundaryIndicator);
- /**
- * Exception
- */
- DeclException1(ExcMatrixHasWrongSize,
- int,
- << "The matrix has the wrong dimension " << arg1);
- /**
- * Exception
- */
- DeclException0(ExcFunctionNotUseful);
- /**
- * Exception
- */
- DeclException1(ExcNewNumbersNotConsecutive,
- types::global_dof_index,
- << "The given list of new dof indices is not consecutive: "
- << "the index " << arg1 << " does not exist.");
- /**
- * Exception
- */
- DeclException2(ExcInvalidFEIndex,
- int,
- int,
- << "The mesh contains a cell with an active_fe_index of "
- << arg1 << ", but the finite element collection only has "
- << arg2 << " elements");
- /**
- * Exception
- */
- DeclException1(ExcInvalidLevel,
- int,
- << "The given level " << arg1
- << " is not in the valid range!");
- /**
- * Exception
- */
- DeclException0(ExcFacesHaveNoLevel);
- /**
- * The triangulation level you accessed is empty.
- */
- DeclException1(ExcEmptyLevel,
- int,
- << "You tried to do something on level " << arg1
- << ", but this level is empty.");
-
- private:
- /**
- * Address of the triangulation to work on.
- */
- SmartPointer<const Triangulation<dim, spacedim>, DoFHandler<dim, spacedim>>
- tria;
-
- /**
- * Store a copy of the finite element set given latest to distribute_dofs().
- */
- hp::FECollection<dim, spacedim> fe_collection;
-
- /**
- * An object that describes how degrees of freedom should be distributed and
- * renumbered.
- */
- std::unique_ptr<dealii::internal::DoFHandlerImplementation::Policy::
- PolicyBase<dim, spacedim>>
- policy;
-
-
- /**
- * Setup policy and listeners based on the underlying Triangulation.
- */
- void
- setup_policy_and_listeners();
-
- /**
- * Free all used memory.
- */
- void
- clear_space();
-
- template <int structdim>
- types::global_dof_index
- get_dof_index(const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index) const;
-
- template <int structdim>
- void
- set_dof_index(const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const types::global_dof_index global_index) const;
-
- /**
- * Create default tables for the active_fe_indices in the
- * dealii::internal::hp::DoFLevel. They are initialized with a zero
- * indicator, meaning that fe[0] is going to be used by default. This
- * method is called before refinement and while setting the finite elements
- * via set_fe(). It ensures each cell has a valid active_fe_index.
- */
- void
- create_active_fe_table();
-
- /**
- * A function that will be triggered through a triangulation
- * signal just before the triangulation is modified.
- *
- * The function that stores the active_fe_flags of all cells that will
- * be refined or coarsened before the refinement happens, so that
- * they can be set again after refinement.
- */
- void
- pre_refinement_action();
-
- /**
- * A function that will be triggered through a triangulation
- * signal just after the triangulation is modified.
- *
- * The function that restores the active_fe_flags of all cells that
- * were refined.
- */
- void
- post_refinement_action();
-
- /**
- * A function that will be triggered through a triangulation
- * signal just before the associated Triangulation or
- * parallel::shared::Triangulation is modified.
- *
- * The function that stores the active_fe_indices of all cells that will
- * be refined or coarsened before the refinement happens, so that
- * they can be set again after refinement.
- */
- void
- pre_active_fe_index_transfer();
-
- /**
- * A function that will be triggered through a triangulation
- * signal just before the associated parallel::distributed::Triangulation is
- * modified.
- *
- * The function that stores all active_fe_indices on locally owned cells for
- * distribution over all participating processors.
- */
- void
- pre_distributed_active_fe_index_transfer();
-
- /**
- * A function that will be triggered through a triangulation
- * signal just after the associated Triangulation or
- * parallel::shared::Triangulation is modified.
- *
- * The function that restores the active_fe_indices of all cells that
- * were refined or coarsened.
- */
- void
- post_active_fe_index_transfer();
-
- /**
- * A function that will be triggered through a triangulation
- * signal just after the associated parallel::distributed::Triangulation is
- * modified.
- *
- * The function that restores all active_fe_indices on locally owned cells
- * that have been communicated.
- */
- void
- post_distributed_active_fe_index_transfer();
-
- /**
- * A function that will be triggered through a triangulation
- * signal just after the associated parallel::distributed::Triangulation has
- * been saved.
- *
- * The function frees all memory related to the transfer of
- * active_fe_indices.
- */
- void
- post_distributed_serialization_of_active_fe_indices();
-
- /**
- * Space to store the DoF numbers for the different levels. Analogous to
- * the <tt>levels[]</tt> tree of the Triangulation objects.
- */
- std::vector<std::unique_ptr<dealii::internal::hp::DoFLevel>> levels;
-
- /**
- * Space to store the DoF numbers for the faces. Analogous to the
- * <tt>faces</tt> pointer of the Triangulation objects.
- */
- std::unique_ptr<dealii::internal::hp::DoFIndicesOnFaces<dim>> faces;
-
- /**
- * A structure that contains all sorts of numbers that characterize the
- * degrees of freedom this object works on.
- *
- * For most members of this structure, there is an accessor function in
- * this class that returns its value.
- */
- dealii::internal::DoFHandlerImplementation::NumberCache number_cache;
-
- /**
- * A structure that contains all sorts of numbers that characterize the
- * degrees of freedom on multigrid levels. Since multigrid is not currently
- * supported, this table is not filled with valid entries.
- */
- std::vector<dealii::internal::DoFHandlerImplementation::NumberCache>
- mg_number_cache;
-
- /**
- * Array to store the indices for degrees of freedom located at vertices.
- *
- * The format used here, in the form of a linked list, is the same as used
- * for the arrays used in the internal::hp::DoFLevel hierarchy. Starting
- * indices into this array are provided by the vertex_dof_offsets field.
- *
- * Access to this field is generally through the
- * DoFAccessor::get_vertex_dof_index() and
- * DoFAccessor::set_vertex_dof_index() functions, encapsulating the actual
- * data format used to the present class.
- */
- std::vector<types::global_dof_index> vertex_dofs;
-
- /**
- * For each vertex in the triangulation, store the offset within the
- * vertex_dofs array where the dofs for this vertex start.
- *
- * As for that array, the format is the same as described in the
- * documentation of hp::DoFLevel.
- *
- * Access to this field is generally through the
- * Accessor::get_vertex_dof_index() and Accessor::set_vertex_dof_index()
- * functions, encapsulating the actual data format used to the present
- * class.
- */
- std::vector<unsigned int> vertex_dof_offsets;
-
- /**
- * Whenever the underlying triangulation changes by either
- * h/p refinement/coarsening and serialization, the active_fe_index of cells
- * needs to be transferred. This structure stores all temporary information
- * required during that process.
- */
- struct ActiveFEIndexTransfer
- {
- /**
- * Container to temporarily store the iterator and future active FE index
- * of cells that persist.
- */
- std::map<const cell_iterator, const unsigned int>
- persisting_cells_fe_index;
-
- /**
- * Container to temporarily store the iterator and future active FE index
- * of cells that will be refined.
- */
- std::map<const cell_iterator, const unsigned int> refined_cells_fe_index;
-
- /**
- * Container to temporarily store the iterator and future active FE index
- * of parent cells that will remain after coarsening.
- */
- std::map<const cell_iterator, const unsigned int>
- coarsened_cells_fe_index;
-
- /**
- * Container to temporarily store the active_fe_index of every locally
- * owned cell for transfer across parallel::distributed::Triangulation
- * objects.
- */
- std::vector<unsigned int> active_fe_indices;
-
- /**
- * Helper object to transfer all active_fe_indices on
- * parallel::distributed::Triangulation objects during
- * refinement/coarsening and serialization.
- */
- std::unique_ptr<
- parallel::distributed::
- CellDataTransfer<dim, spacedim, std::vector<unsigned int>>>
- cell_data_transfer;
- };
-
- /**
- * We embed our data structure into a pointer to control that
- * all transfer related data only exists during the actual transfer process.
- */
- std::unique_ptr<ActiveFEIndexTransfer> active_fe_index_transfer;
-
- /**
- * A list of connections with which this object connects to the
- * triangulation to get information about when the triangulation changes.
- */
- std::vector<boost::signals2::connection> tria_listeners;
-
- // Make accessor objects friends.
- template <int, class, bool>
- friend class dealii::DoFAccessor;
- template <class, bool>
- friend class dealii::DoFCellAccessor;
- friend struct dealii::internal::DoFAccessorImplementation::Implementation;
- friend struct dealii::internal::DoFCellAccessorImplementation::
- Implementation;
-
- // Likewise for DoFLevel objects since they need to access the vertex dofs
- // in the functions that set and retrieve vertex dof indices.
- template <int>
- friend class dealii::internal::hp::DoFIndicesOnFacesOrEdges;
- friend struct dealii::internal::hp::DoFHandlerImplementation::
- Implementation;
- friend struct dealii::internal::DoFHandlerImplementation::Policy::
- Implementation;
};
-
-
-#ifndef DOXYGEN
-
-
- /* ----------------------- Inline functions ----------------------------------
- */
-
-
- template <int dim, int spacedim>
- template <typename number>
- types::global_dof_index
- DoFHandler<dim, spacedim>::n_boundary_dofs(
- const std::map<types::boundary_id, const Function<spacedim, number> *>
- &boundary_ids) const
- {
- // extract the set of boundary ids and forget about the function object
- // pointers
- std::set<types::boundary_id> boundary_ids_only;
- for (typename std::map<types::boundary_id,
- const Function<spacedim, number> *>::const_iterator
- p = boundary_ids.begin();
- p != boundary_ids.end();
- ++p)
- boundary_ids_only.insert(p->first);
-
- // then just hand everything over to the other function that does the work
- return n_boundary_dofs(boundary_ids_only);
- }
-
-
-
- template <>
- inline types::global_dof_index
- DoFHandler<2, 3>::n_boundary_dofs() const
- {
- Assert(false, ExcNotImplemented());
- return 0;
- }
-
-
-
- template <>
- template <typename number>
- inline types::global_dof_index
- DoFHandler<2, 3>::n_boundary_dofs(
- const std::map<types::boundary_id, const Function<3, number> *> &) const
- {
- Assert(false, ExcNotImplemented());
- return 0;
- }
-
-
-
- template <>
- inline types::global_dof_index
- DoFHandler<2, 3>::n_boundary_dofs(const std::set<types::boundary_id> &) const
- {
- Assert(false, ExcNotImplemented());
- return 0;
- }
-}
-
-
-namespace internal
-{
- /**
- * Return a string representing the dynamic type of the given argument.
- * This is basically the same what typeid(...).name() does, but it turns out
- * this is broken on Intel 13+.
- *
- * Defined in source/dofs/dof_handler.cc.
- */
- template <int dim, int spacedim>
- std::string
- policy_to_string(const dealii::internal::DoFHandlerImplementation::Policy::
- PolicyBase<dim, spacedim> &policy);
-} // namespace internal
-
-
-namespace hp
-{
- template <int dim, int spacedim>
- template <class Archive>
- void
- DoFHandler<dim, spacedim>::save(Archive &ar, unsigned int) const
- {
- ar &vertex_dofs;
- ar &vertex_dof_offsets;
- ar &number_cache;
- ar &mg_number_cache;
-
- // some versions of gcc have trouble with loading vectors of
- // std::unique_ptr objects because std::unique_ptr does not
- // have a copy constructor. do it one level at a time
- const unsigned int n_levels = levels.size();
- ar & n_levels;
- for (unsigned int i = 0; i < n_levels; ++i)
- ar &levels[i];
-
- // boost dereferences a nullptr when serializing a nullptr
- // at least up to 1.65.1. This causes problems with clang-5.
- // Therefore, work around it.
- bool faces_is_nullptr = (faces.get() == nullptr);
- ar & faces_is_nullptr;
- if (!faces_is_nullptr)
- ar &faces;
-
- // write out the number of triangulation cells and later check during
- // loading that this number is indeed correct; same with something that
- // identifies the policy
- const unsigned int n_cells = tria->n_cells();
- std::string policy_name = dealii::internal::policy_to_string(*policy);
-
- ar &n_cells &policy_name;
- }
-
-
-
- template <int dim, int spacedim>
- template <class Archive>
- void
- DoFHandler<dim, spacedim>::load(Archive &ar, unsigned int)
- {
- ar &vertex_dofs;
- ar &vertex_dof_offsets;
- ar &number_cache;
- ar &mg_number_cache;
-
- // boost::serialization can restore pointers just fine, but if the
- // pointer object still points to something useful, that object is not
- // destroyed and we end up with a memory leak. consequently, first delete
- // previous content before re-loading stuff
- levels.clear();
- faces.reset();
-
- // some versions of gcc have trouble with loading vectors of
- // std::unique_ptr objects because std::unique_ptr does not
- // have a copy constructor. do it one level at a time
- unsigned int size;
- ar & size;
- levels.resize(size);
- for (unsigned int i = 0; i < size; ++i)
- {
- std::unique_ptr<dealii::internal::hp::DoFLevel> level;
- ar & level;
- levels[i] = std::move(level);
- }
-
- // Workaround for nullptr, see in save().
- bool faces_is_nullptr = true;
- ar & faces_is_nullptr;
- if (!faces_is_nullptr)
- ar &faces;
-
- // these are the checks that correspond to the last block in the save()
- // function
- unsigned int n_cells;
- std::string policy_name;
-
- ar &n_cells &policy_name;
-
- AssertThrow(
- n_cells == tria->n_cells(),
- ExcMessage(
- "The object being loaded into does not match the triangulation "
- "that has been stored previously."));
- AssertThrow(policy_name == dealii::internal::policy_to_string(*policy),
- ExcMessage(
- "The policy currently associated with this DoFHandler (" +
- dealii::internal::policy_to_string(*policy) +
- ") does not match the one that was associated with the "
- "DoFHandler previously stored (" +
- policy_name + ")."));
- }
-
- template <int dim, int spacedim>
- inline types::global_dof_index
- DoFHandler<dim, spacedim>::n_dofs() const
- {
- return number_cache.n_global_dofs;
- }
-
-
-
- template <int dim, int spacedim>
- inline types::global_dof_index
- DoFHandler<dim, spacedim>::n_dofs(const unsigned int) const
- {
- Assert(false, ExcNotImplemented());
- return numbers::invalid_dof_index;
- }
-
-
-
- template <int dim, int spacedim>
- types::global_dof_index
- DoFHandler<dim, spacedim>::n_locally_owned_dofs() const
- {
- return number_cache.n_locally_owned_dofs;
- }
-
-
-
- template <int dim, int spacedim>
- const IndexSet &
- DoFHandler<dim, spacedim>::locally_owned_dofs() const
- {
- return number_cache.locally_owned_dofs;
- }
-
-
-
- template <int dim, int spacedim>
- const std::vector<types::global_dof_index> &
- DoFHandler<dim, spacedim>::n_locally_owned_dofs_per_processor() const
- {
- if (number_cache.n_locally_owned_dofs_per_processor.empty() &&
- number_cache.n_global_dofs > 0)
- {
- MPI_Comm comm;
-
- const parallel::TriangulationBase<dim, spacedim> *tr =
- (dynamic_cast<const parallel::TriangulationBase<dim, spacedim> *>(
- &this->get_triangulation()));
- if (tr != nullptr)
- comm = tr->get_communicator();
- else
- comm = MPI_COMM_SELF;
-
- const_cast<dealii::internal::DoFHandlerImplementation::NumberCache &>(
- number_cache)
- .n_locally_owned_dofs_per_processor =
- number_cache.get_n_locally_owned_dofs_per_processor(comm);
- }
- return number_cache.n_locally_owned_dofs_per_processor;
- }
-
-
-
- template <int dim, int spacedim>
- const std::vector<IndexSet> &
- DoFHandler<dim, spacedim>::locally_owned_dofs_per_processor() const
- {
- if (number_cache.locally_owned_dofs_per_processor.empty() &&
- number_cache.n_global_dofs > 0)
- {
- MPI_Comm comm;
-
- const parallel::TriangulationBase<dim, spacedim> *tr =
- (dynamic_cast<const parallel::TriangulationBase<dim, spacedim> *>(
- &this->get_triangulation()));
- if (tr != nullptr)
- comm = tr->get_communicator();
- else
- comm = MPI_COMM_SELF;
-
- const_cast<dealii::internal::DoFHandlerImplementation::NumberCache &>(
- number_cache)
- .locally_owned_dofs_per_processor =
- number_cache.get_locally_owned_dofs_per_processor(comm);
- }
- return number_cache.locally_owned_dofs_per_processor;
- }
-
-
-
- template <int dim, int spacedim>
- const IndexSet &
- DoFHandler<dim, spacedim>::locally_owned_mg_dofs(
- const unsigned int level) const
- {
- Assert(false, ExcNotImplemented());
- (void)level;
- Assert(level < this->get_triangulation().n_global_levels(),
- ExcMessage("The given level index exceeds the number of levels "
- "present in the triangulation"));
- return mg_number_cache[0].locally_owned_dofs;
- }
-
-
-
- template <int dim, int spacedim>
- const std::vector<IndexSet> &
- DoFHandler<dim, spacedim>::locally_owned_mg_dofs_per_processor(
- const unsigned int level) const
- {
- Assert(level < this->get_triangulation().n_global_levels(),
- ExcMessage("The given level index exceeds the number of levels "
- "present in the triangulation"));
- Assert(
- mg_number_cache.size() == this->get_triangulation().n_global_levels(),
- ExcMessage(
- "The level dofs are not set up properly! Did you call distribute_mg_dofs()?"));
- if (mg_number_cache[level].locally_owned_dofs_per_processor.empty() &&
- mg_number_cache[level].n_global_dofs > 0)
- {
- MPI_Comm comm;
-
- const parallel::TriangulationBase<dim, spacedim> *tr =
- (dynamic_cast<const parallel::TriangulationBase<dim, spacedim> *>(
- &this->get_triangulation()));
- if (tr != nullptr)
- comm = tr->get_communicator();
- else
- comm = MPI_COMM_SELF;
-
- const_cast<dealii::internal::DoFHandlerImplementation::NumberCache &>(
- mg_number_cache[level])
- .locally_owned_dofs_per_processor =
- mg_number_cache[level].get_locally_owned_dofs_per_processor(comm);
- }
- return mg_number_cache[level].locally_owned_dofs_per_processor;
- }
-
-
-
- template <int dim, int spacedim>
- inline const FiniteElement<dim, spacedim> &
- DoFHandler<dim, spacedim>::get_fe(const unsigned int number) const
- {
- Assert(fe_collection.size() > 0,
- ExcMessage("No finite element collection is associated with "
- "this DoFHandler"));
- return fe_collection[number];
- }
-
-
-
- template <int dim, int spacedim>
- inline const hp::FECollection<dim, spacedim> &
- DoFHandler<dim, spacedim>::get_fe_collection() const
- {
- Assert(fe_collection.size() > 0,
- ExcMessage("No finite element collection is associated with "
- "this DoFHandler"));
- return fe_collection;
- }
-
-
-
- template <int dim, int spacedim>
- inline const Triangulation<dim, spacedim> &
- DoFHandler<dim, spacedim>::get_triangulation() const
- {
- Assert(tria != nullptr,
- ExcMessage("This DoFHandler object has not been associated "
- "with a triangulation."));
- return *tria;
- }
-
-#endif
-
} // namespace hp
DEAL_II_NAMESPACE_CLOSE
+++ /dev/null
-// ---------------------------------------------------------------------
-//
-// Copyright (C) 2003 - 2020 by the deal.II authors
-//
-// This file is part of the deal.II library.
-//
-// The deal.II library is free software; you can use it, redistribute
-// it, and/or modify it under the terms of the GNU Lesser General
-// Public License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// The full text of the license can be found in the file LICENSE.md at
-// the top level directory of deal.II.
-//
-// ---------------------------------------------------------------------
-
-#ifndef dealii_hp_dof_level_h
-#define dealii_hp_dof_level_h
-
-
-#include <deal.II/base/config.h>
-
-#include <deal.II/base/exceptions.h>
-
-#include <vector>
-
-
-DEAL_II_NAMESPACE_OPEN
-
-// Forward declarations
-#ifndef DOXYGEN
-namespace hp
-{
- template <int, int>
- class DoFHandler;
- template <int, int>
- class FECollection;
-} // namespace hp
-
-
-namespace internal
-{
- namespace hp
- {
- namespace DoFHandlerImplementation
- {
- struct Implementation;
- }
- } // namespace hp
- namespace DoFCellAccessorImplementation
- {
- struct Implementation;
- }
-} // namespace internal
-#endif
-
-
-namespace internal
-{
- namespace hp
- {
- /**
- * This is the class that stores the degrees of freedom on cells in a hp
- * hierarchy. Compared to faces and edges, the task here is simple since
- * each cell can only have a single active finite element index.
- * Consequently, all we need is one long array with DoF indices and one
- * array of offsets where each cell's indices start within the array of
- * indices. This is in contrast to the DoFObjects class where each face or
- * edge may have more than one associated finite element with
- * corresponding degrees of freedom.
- *
- * The data stored here is represented by three arrays - The @p
- * active_fe_indices array stores for each cell which finite element is
- * used on this cell. Since some cells are not active on the current
- * level, some entries in this array may represent an invalid value. - The
- * @p dof_indices array stores for each active cell on the current level
- * the dofs that associated with the <i>interior</i> of the cell, i.e.,
- * the @p dofs_per_line dofs associated with the line in 1d, and @p
- * dofs_per_quad and @p dofs_per_hex in 2d and 3d. These numbers are in
- * general smaller than @p dofs_per_cell. - The @p dof_offsets array
- * stores, for each cell, the starting point of the dof indices
- * corresponding to this cell in the @p dof_indices array. This is
- * analogous to how we store data in compressed row storage for sparse
- * matrices. For cells that are not active on the current level, we store
- * an invalid value for the starting index.
- *
- * <h3>Compression</h3>
- *
- * It is common for the indices stored in @p dof_indices for one cell to
- * be numbered consecutively. For example, using the standard numbering
- * (without renumbering DoFs), the quad dofs on the first cell of a mesh
- * when using a $Q_3$ element will be numbered <tt>12, 13, 14, 15</tt>.
- * This allows for compression if we only store the first entry and have
- * some way to mark the DoFs on this object as compressed. Here,
- * compression means that we know that subsequent DoF indices can be
- * obtained from the previous ones by just incrementing them by one -- in
- * other words, we use a variant of doing run-length encoding. The way to
- * do this is that we use positive FE indices for uncompressed sets of
- * DoFs and if a set of indices is compressed, then we instead store the
- * FE index in binary complement (which we can identify by looking at the
- * sign bit when interpreting the number as a signed one). There are two
- * functions, compress_data() and uncompress_data() that convert between
- * the two possible representations.
- *
- * Note that compression is not always possible. For example, if one
- * renumbered the example above using DoFRenumbering::downstream with
- * $(1,0)^T$ as direction, then they would likely be numbered <tt>12, 14,
- * 13, 15</tt>, which can not be compressed using run-length encoding.
- */
- class DoFLevel
- {
- private:
- /**
- * The type in which we store the offsets into the dof_indices array.
- */
- using offset_type = unsigned int;
-
- /**
- * The type in which we store the active FE index.
- */
- using active_fe_index_type = unsigned short int;
-
- /**
- * A signed type that matches the type in which we store the active FE
- * index. We use this in computing binary complements.
- */
- using signed_active_fe_index_type = signed short int;
-
- /**
- * Invalid active_fe_index which will be used as a default value to
- * determine whether a future_fe_index has been set or not.
- */
- static const active_fe_index_type invalid_active_fe_index;
-
- /**
- * Given an active_fe_index, return whether the corresponding
- * set of DoF indices are compressed. See the general documentation
- * of this class for a description of when this is the case.
- */
- static bool
- is_compressed_entry(const active_fe_index_type active_fe_index);
-
- /**
- * Given an active_fe_index (either corresponding to an uncompressed
- * or compressed state), return the active_fe_index that corresponds
- * to the respectively other state. See the general documentation
- * of this class for a description of how compression is indicated.
- */
- static active_fe_index_type
- get_toggled_compression_state(const active_fe_index_type active_fe_index);
-
- /**
- * Indices specifying the finite element of hp::FECollection to use for
- * the different cells on the current level. The vector stores one
- * element per cell since the active_fe_index is unique for cells.
- *
- * Each active_fe_index will be preset to zero, i.e. the default finite
- * element. However, only active cells are eligible to have a finite
- * element assigned, which will be verified by corresponding accessor
- * functions of the DoFCellAccessor class.
- */
- std::vector<active_fe_index_type> active_fe_indices;
-
- /**
- * Indices specifying the finite element of hp::FECollection that the cell
- * will be assigned to after the triangulation changed (due to refinement
- * and/or coarsening, or repartitioning). The vector stores one element
- * per cell since the future_fe_index is unique for cells.
- *
- * Each future_fe_index will be preset to invalid_active_fe_index,
- * indicating that the active_fe_index will remain unchanged. However,
- * only active cells are eligible to have a finite element assigned, which
- * will be verified by corresponding accessor functions of the
- * DoFCellAccessor class.
- */
- std::vector<active_fe_index_type> future_fe_indices;
-
- /**
- * Store the start index for the degrees of freedom of each object in
- * the @p dof_indices array. If the cell corresponding to a particular
- * index in this array is not active on this level, then we do not store
- * any DoFs for it. In that case, the offset we store here must be an
- * invalid number and indeed we store
- * <code>(std::vector<types::global_dof_index>::size_type)(-1)</code>
- * for it.
- *
- * The type we store is then obviously the type the @p dof_indices array
- * uses for indexing.
- */
- std::vector<offset_type> dof_offsets;
-
- /**
- * Store the global indices of the degrees of freedom. information. The
- * dof_offsets field determines where each (active) cell's data is
- * stored.
- */
- std::vector<types::global_dof_index> dof_indices;
-
- /**
- * The offsets for each cell of the cache that holds all DoF indices.
- */
- std::vector<offset_type> cell_cache_offsets;
-
- /**
- * Cache for the DoF indices on cells. The size of this array equals the
- * sum over all cells of
- * selected_fe[active_fe_index[cell]].dofs_per_cell.
- */
- std::vector<types::global_dof_index> cell_dof_indices_cache;
-
- public:
- /**
- * Set the global index of the @p local_index-th degree of freedom
- * located on the object with number @p obj_index to the value given by
- * @p global_index. The @p dof_handler argument is used to access the
- * finite element that is to be used to compute the location where this
- * data is stored.
- *
- * The third argument, @p fe_index, denotes which of the finite elements
- * associated with this object we shall access. Refer to the general
- * documentation of the internal::hp::DoFLevel class template for more
- * information.
- */
- void
- set_dof_index(const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const types::global_dof_index global_index);
-
- /**
- * Return the global index of the @p local_index-th degree of freedom
- * located on the object with number @p obj_index. The @p dof_handler
- * argument is used to access the finite element that is to be used to
- * compute the location where this data is stored.
- *
- * The third argument, @p fe_index, denotes which of the finite elements
- * associated with this object we shall access. Refer to the general
- * documentation of the internal::hp::DoFLevel class template for more
- * information.
- */
- types::global_dof_index
- get_dof_index(const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index) const;
-
- /**
- * Return the fe_index of the active finite element on this object.
- */
- unsigned int
- active_fe_index(const unsigned int obj_index) const;
-
- /**
- * Check whether a given finite element index is used on the present
- * object or not.
- */
- bool
- fe_index_is_active(const unsigned int obj_index,
- const unsigned int fe_index) const;
-
- /**
- * Set the fe_index of the active finite element on this object.
- */
- void
- set_active_fe_index(const unsigned int obj_index,
- const unsigned int fe_index);
-
- /**
- * Return the fe_index of the future finite element on this object. If no
- * future_fe_index has been specified, return the active_fe_index instead.
- */
- unsigned int
- future_fe_index(const unsigned int obj_index) const;
-
- /**
- * Set the fe_index of the future finite element on this object.
- */
- void
- set_future_fe_index(const unsigned int obj_index,
- const unsigned int fe_index);
-
- /**
- * Return whether a future fe index has been set on this object.
- */
- bool
- future_fe_index_set(const unsigned int obj_index) const;
-
- /**
- * Revoke the future finite element assigned to this object.
- */
- void
- clear_future_fe_index(const unsigned int obj_index);
-
- /**
- * Return a pointer to the beginning of the DoF indices cache for a
- * given cell.
- *
- * @param obj_index The number of the cell we are looking at.
- * @param dofs_per_cell The number of DoFs per cell for this cell. This
- * is not used for the hp case but necessary to keep the interface the
- * same as for the non-hp case.
- * @return A pointer to the first DoF index for the current cell. The
- * next dofs_per_cell indices are for the current cell.
- */
- const types::global_dof_index *
- get_cell_cache_start(const unsigned int obj_index,
- const unsigned int dofs_per_cell) const;
-
- /**
- * Determine an estimate for the memory consumption (in bytes) of this
- * object.
- */
- std::size_t
- memory_consumption() const;
-
- /**
- * Read or write the data of this object to or from a stream for the
- * purpose of serialization
- */
- template <class Archive>
- void
- serialize(Archive &ar, const unsigned int version);
-
- private:
- /**
- * Compress the arrays that store dof indices by using a variant of run-
- * length encoding. See the general documentation of this class for more
- * information.
- *
- * @param fe_collection The object that can tell us how many degrees of
- * freedom each of the finite elements has that we store in this object.
- */
- template <int dim, int spacedim>
- void
- compress_data(
- const dealii::hp::FECollection<dim, spacedim> &fe_collection);
-
- /**
- * Uncompress the arrays that store dof indices by using a variant of
- * run-length encoding. See the general documentation of this class for
- * more information.
- *
- * @param fe_collection The object that can tell us how many degrees of
- * freedom each of the finite elements has that we store in this object.
- */
- template <int dim, int spacedim>
- void
- uncompress_data(
- const dealii::hp::FECollection<dim, spacedim> &fe_collection);
-
-
- /**
- * Restore the active fe indices stored by the current object to
- * an uncompressed state. At the same time, do not touch any of
- * the other data structures. This leaves the active_fe_indices
- * array out-of-synch from the other member variables, and the
- * function can consequently only be used when the remaining
- * data structures are going to be rebuilt next. This is
- * specifically the case in hp::DoFHandler::distribute_dofs()
- * where we throw away all data in the DoFLevels objects *except
- * for the active_fe_indices* array. This function therefore
- * simply makes sure that that one array is in uncompressed
- * format so that we can use the information about active
- * fe_indices for all cells that were used in the previous mesh
- * refinement cycle (or the previous time distribute_dofs() was
- * called) without having to care about any of the other data
- * fields.
- */
- void
- normalize_active_fe_indices();
-
-
- // Make hp::DoFHandler and its auxiliary class a friend since it is the
- // class that needs to create these data structures.
- template <int, int>
- friend class dealii::hp::DoFHandler;
- friend struct dealii::internal::hp::DoFHandlerImplementation::
- Implementation;
- friend struct dealii::internal::DoFCellAccessorImplementation::
- Implementation;
- };
-
-
- // -------------------- template functions --------------------------------
-
-
- inline bool
- DoFLevel::is_compressed_entry(const active_fe_index_type active_fe_index)
- {
- return (static_cast<signed_active_fe_index_type>(active_fe_index) < 0);
- }
-
-
-
- inline DoFLevel::active_fe_index_type
- DoFLevel::get_toggled_compression_state(
- const active_fe_index_type active_fe_index)
- {
- // convert the active_fe_index into a signed type, flip all
- // bits, and get the unsigned representation back
- return static_cast<active_fe_index_type>(
- ~(static_cast<signed_active_fe_index_type>(active_fe_index)));
- }
-
-
-
- inline types::global_dof_index
- DoFLevel::get_dof_index(const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index) const
- {
- (void)fe_index;
- AssertIndexRange(obj_index, dof_offsets.size());
-
- // make sure we are on an object for which DoFs have been
- // allocated at all
- Assert(dof_offsets[obj_index] != static_cast<offset_type>(-1),
- ExcMessage("You are trying to access degree of freedom "
- "information for an object on which no such "
- "information is available"));
-
- Assert(fe_index ==
- (is_compressed_entry(active_fe_indices[obj_index]) == false ?
- active_fe_indices[obj_index] :
- get_toggled_compression_state(active_fe_indices[obj_index])),
- ExcMessage("FE index does not match that of the present cell"));
-
- // see if the dof_indices array has been compressed for this
- // particular cell
- if (is_compressed_entry(active_fe_indices[obj_index]) == false)
- return dof_indices[dof_offsets[obj_index] + local_index];
- else
- return dof_indices[dof_offsets[obj_index]] + local_index;
- }
-
-
-
- inline void
- DoFLevel::set_dof_index(const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const types::global_dof_index global_index)
- {
- (void)fe_index;
- AssertIndexRange(obj_index, dof_offsets.size());
-
- // make sure we are on an
- // object for which DoFs have
- // been allocated at all
- Assert(dof_offsets[obj_index] != static_cast<offset_type>(-1),
- ExcMessage("You are trying to access degree of freedom "
- "information for an object on which no such "
- "information is available"));
- Assert(
- is_compressed_entry(active_fe_indices[obj_index]) == false,
- ExcMessage(
- "This function can no longer be called after compressing the dof_indices array"));
- Assert(fe_index == active_fe_indices[obj_index],
- ExcMessage("FE index does not match that of the present cell"));
- dof_indices[dof_offsets[obj_index] + local_index] = global_index;
- }
-
-
-
- inline unsigned int
- DoFLevel::active_fe_index(const unsigned int obj_index) const
- {
- AssertIndexRange(obj_index, active_fe_indices.size());
-
- if (is_compressed_entry(active_fe_indices[obj_index]) == false)
- return active_fe_indices[obj_index];
- else
- return get_toggled_compression_state(active_fe_indices[obj_index]);
- }
-
-
-
- inline bool
- DoFLevel::fe_index_is_active(const unsigned int obj_index,
- const unsigned int fe_index) const
- {
- return (fe_index == active_fe_index(obj_index));
- }
-
-
-
- inline void
- DoFLevel::set_active_fe_index(const unsigned int obj_index,
- const unsigned int fe_index)
- {
- AssertIndexRange(obj_index, active_fe_indices.size());
-
- // check whether the given fe_index is within the range of
- // values that we interpret as "not compressed". if not, then
- // the index is so large that we cannot accept it. (but this
- // will not likely happen because it requires someone using an
- // FECollection that has more than 32k entries.)
- Assert(is_compressed_entry(fe_index) == false,
- ExcMessage(
- "You are using an active_fe_index that is larger than an "
- "internal limitation for these objects. Try to work with "
- "hp::FECollection objects that have a more modest size."));
- Assert(fe_index != invalid_active_fe_index,
- ExcMessage(
- "You are using an active_fe_index that is reserved for "
- "internal purposes for these objects. Try to work with "
- "hp::FECollection objects that have a more modest size."));
-
- active_fe_indices[obj_index] = fe_index;
- }
-
-
-
- inline unsigned int
- DoFLevel::future_fe_index(const unsigned int obj_index) const
- {
- AssertIndexRange(obj_index, future_fe_indices.size());
-
- if (future_fe_index_set(obj_index))
- return future_fe_indices[obj_index];
-
- return active_fe_index(obj_index);
- }
-
-
-
- inline void
- DoFLevel::set_future_fe_index(const unsigned int obj_index,
- const unsigned int fe_index)
- {
- AssertIndexRange(obj_index, future_fe_indices.size());
-
- // check whether the given fe_index is within the range of
- // values that we interpret as "not compressed". if not, then
- // the index is so large that we cannot accept it. (but this
- // will not likely happen because it requires someone using an
- // FECollection that has more than 32k entries.)
- Assert(is_compressed_entry(fe_index) == false,
- ExcMessage(
- "You are using a future_fe_index that is larger than an "
- "internal limitation for these objects. Try to work with "
- "hp::FECollection objects that have a more modest size."));
- Assert(fe_index != invalid_active_fe_index,
- ExcMessage(
- "You are using a future_fe_index that is reserved for "
- "internal purposes for these objects. Try to work with "
- "hp::FECollection objects that have a more modest size."));
-
- future_fe_indices[obj_index] = fe_index;
- }
-
-
-
- inline bool
- DoFLevel::future_fe_index_set(const unsigned int obj_index) const
- {
- AssertIndexRange(obj_index, future_fe_indices.size());
-
- return (future_fe_indices[obj_index] != invalid_active_fe_index);
- }
-
-
-
- inline void
- DoFLevel::clear_future_fe_index(const unsigned int obj_index)
- {
- AssertIndexRange(obj_index, future_fe_indices.size());
-
- future_fe_indices[obj_index] = invalid_active_fe_index;
- }
-
-
-
- inline const types::global_dof_index *
- DoFLevel::get_cell_cache_start(const unsigned int obj_index,
- const unsigned int dofs_per_cell) const
- {
- (void)dofs_per_cell;
- Assert(
- (obj_index < cell_cache_offsets.size()) &&
- (cell_cache_offsets[obj_index] + dofs_per_cell <=
- cell_dof_indices_cache.size()),
- ExcMessage(
- "You are trying to access an element of the cache that stores "
- "the indices of all degrees of freedom that live on one cell. "
- "However, this element does not exist. Did you forget to call "
- "DoFHandler::distribute_dofs(), or did you forget to call it "
- "again after changing the active_fe_index of one of the cells?"));
-
- return &cell_dof_indices_cache[cell_cache_offsets[obj_index]];
- }
-
-
-
- template <class Archive>
- inline void
- DoFLevel::serialize(Archive &ar, const unsigned int)
- {
- ar & this->active_fe_indices;
- ar & this->cell_cache_offsets;
- ar & this->cell_dof_indices_cache;
- ar & this->dof_indices;
- ar & this->dof_offsets;
- ar & this->future_fe_indices;
- }
- } // namespace hp
-
-} // namespace internal
-
-DEAL_II_NAMESPACE_CLOSE
-
-#endif
template <typename Number>
class Vector;
-namespace hp
-{
- template <int dim, int spacedim>
- class DoFHandler;
-}
+template <int dim, int spacedim>
+class DoFHandler;
#endif
*/
template <int dim, int spacedim>
void
- full_p_adaptivity(const hp::DoFHandler<dim, spacedim> &dof_handler);
+ full_p_adaptivity(const dealii::DoFHandler<dim, spacedim> &dof_handler);
/**
* Adapt which finite element to use on cells that have been specifically
*/
template <int dim, int spacedim>
void
- p_adaptivity_from_flags(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const std::vector<bool> & p_flags);
+ p_adaptivity_from_flags(
+ const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const std::vector<bool> & p_flags);
/**
* Adapt which finite element to use on cells whose criteria meet a certain
template <int dim, typename Number, int spacedim>
void
p_adaptivity_from_absolute_threshold(
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Vector<Number> & criteria,
- const Number p_refine_threshold,
- const Number p_coarsen_threshold,
+ const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const Vector<Number> & criteria,
+ const Number p_refine_threshold,
+ const Number p_coarsen_threshold,
const ComparisonFunction<typename identity<Number>::type>
&compare_refine = std::greater_equal<Number>(),
const ComparisonFunction<typename identity<Number>::type>
template <int dim, typename Number, int spacedim>
void
p_adaptivity_from_relative_threshold(
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Vector<Number> & criteria,
- const double p_refine_fraction = 0.5,
- const double p_coarsen_fraction = 0.5,
+ const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const Vector<Number> & criteria,
+ const double p_refine_fraction = 0.5,
+ const double p_coarsen_fraction = 0.5,
const ComparisonFunction<typename identity<Number>::type>
&compare_refine = std::greater_equal<Number>(),
const ComparisonFunction<typename identity<Number>::type>
template <int dim, typename Number, int spacedim>
void
p_adaptivity_fixed_number(
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Vector<Number> & criteria,
- const double p_refine_fraction = 0.5,
- const double p_coarsen_fraction = 0.5,
+ const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const Vector<Number> & criteria,
+ const double p_refine_fraction = 0.5,
+ const double p_coarsen_fraction = 0.5,
const ComparisonFunction<typename identity<Number>::type>
&compare_refine = std::greater_equal<Number>(),
const ComparisonFunction<typename identity<Number>::type>
template <int dim, typename Number, int spacedim>
void
p_adaptivity_from_regularity(
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Vector<Number> & sobolev_indices);
+ const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const Vector<Number> & sobolev_indices);
/**
* Adapt which finite element to use on each cell based on how its criterion
template <int dim, typename Number, int spacedim>
void
p_adaptivity_from_reference(
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const dealii::DoFHandler<dim, spacedim> & dof_handler,
const Vector<Number> & criteria,
const Vector<Number> & references,
const ComparisonFunction<typename identity<Number>::type> &compare_refine,
*/
template <int dim, typename Number, int spacedim>
void
- predict_error(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Vector<Number> & error_indicators,
- Vector<Number> & predicted_errors,
- const double gamma_p = std::sqrt(0.4),
- const double gamma_h = 2.,
- const double gamma_n = 1.);
+ predict_error(const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const Vector<Number> & error_indicators,
+ Vector<Number> & predicted_errors,
+ const double gamma_p = std::sqrt(0.4),
+ const double gamma_h = 2.,
+ const double gamma_n = 1.);
/**
* @}
*/
template <int dim, int spacedim>
void
- force_p_over_h(const hp::DoFHandler<dim, spacedim> &dof_handler);
+ force_p_over_h(const dealii::DoFHandler<dim, spacedim> &dof_handler);
/**
* Choose p-adaptivity over h-adaptivity whenever it is invoked on all
*/
template <int dim, int spacedim>
void
- choose_p_over_h(const hp::DoFHandler<dim, spacedim> &dof_handler);
+ choose_p_over_h(const dealii::DoFHandler<dim, spacedim> &dof_handler);
/**
* @}
* different MPI processors need to be accessed at a certain time when
* accessing remote data and overlapping communication with computation.
*/
- typename hp::DoFHandler<dim>::active_cell_iterator
+ typename DoFHandler<dim>::active_cell_iterator
get_hp_cell_iterator(const unsigned int macro_cell_number,
const unsigned int vector_number,
const unsigned int dof_handler_index = 0) const;
/**
* Initializes the DoFHandlers based on a DoFHandler<dim> argument.
*/
+ template <typename DoFHandlerType>
void
initialize_dof_handlers(
- const std::vector<const DoFHandler<dim> *> &dof_handlers,
- const AdditionalData & additional_data);
-
- /**
- * Initializes the DoFHandlers based on a hp::DoFHandler<dim> argument.
- */
- void
- initialize_dof_handlers(
- const std::vector<const hp::DoFHandler<dim> *> &dof_handlers,
- const AdditionalData & additional_data);
+ const std::vector<const DoFHandlerType *> &dof_handlers,
+ const AdditionalData & additional_data);
/**
* Setup connectivity graph with information on the dependencies between
, n_dof_handlers(0)
{}
- std::vector<SmartPointer<const DoFHandler<dim>>> dof_handler;
- std::vector<SmartPointer<const hp::DoFHandler<dim>>> hp_dof_handler;
+ std::vector<SmartPointer<const DoFHandler<dim>>> dof_handler;
+ std::vector<SmartPointer<const DoFHandler<dim>>> hp_dof_handler;
enum ActiveDoFHandler
{
/**
DEAL_II_NAMESPACE_OPEN
-namespace internal
-{
- template <
- typename DoFHandlerType,
- typename std::enable_if<
- std::is_same<DoFHandlerType,
- ::dealii::DoFHandler<DoFHandlerType::dimension>>::value,
- int>::type = 0>
- const DoFHandlerType &
- get_dof_handler(
- const std::vector<
- SmartPointer<const ::dealii::DoFHandler<DoFHandlerType::dimension>>>
- &dof_handler,
- const std::vector<
- SmartPointer<const ::dealii::hp::DoFHandler<DoFHandlerType::dimension>>>
- &,
- const unsigned int n_dof_handlers,
- const unsigned int dof_handler_index)
- {
- (void)n_dof_handlers;
- AssertDimension(dof_handler.size(), n_dof_handlers);
- return *dof_handler[dof_handler_index];
- }
-
- template <
- typename DoFHandlerType,
- typename std::enable_if<
- std::is_same<DoFHandlerType,
- ::dealii::hp::DoFHandler<DoFHandlerType::dimension>>::value,
- int>::type = 0>
- const DoFHandlerType &
- get_dof_handler(
- const std::vector<
- SmartPointer<const ::dealii::DoFHandler<DoFHandlerType::dimension>>> &,
- const std::vector<
- SmartPointer<const ::dealii::hp::DoFHandler<DoFHandlerType::dimension>>>
- & hp_dof_handler,
- const unsigned int n_dof_handlers,
- const unsigned int dof_handler_index)
- {
- (void)n_dof_handlers;
- AssertDimension(hp_dof_handler.size(), n_dof_handlers);
- return *hp_dof_handler[dof_handler_index];
- }
-} // namespace internal
// --------------------- MatrixFree -----------------------------------
const unsigned int dof_handler_index) const
{
AssertIndexRange(dof_handler_index, n_components());
- return internal::get_dof_handler<DoFHandlerType>(dof_handlers.dof_handler,
- dof_handlers.hp_dof_handler,
- dof_handlers.n_dof_handlers,
- dof_handler_index);
+
+ auto dh = dynamic_cast<const DoFHandlerType *>(
+ &*dof_handlers.dof_handler[dof_handler_index]);
+
+ Assert(dh != nullptr, ExcNotImplemented());
+
+ return *dh;
}
template <int dim, typename Number, typename VectorizedArrayType>
-typename hp::DoFHandler<dim>::active_cell_iterator
+typename DoFHandler<dim>::active_cell_iterator
MatrixFree<dim, Number, VectorizedArrayType>::get_hp_cell_iterator(
const unsigned int macro_cell_number,
const unsigned int vector_number,
Assert(dof_handlers.active_dof_handler == DoFHandlers::hp,
ExcNotImplemented());
- const hp::DoFHandler<dim> *dofh =
- dof_handlers.hp_dof_handler[dof_handler_index];
+ const DoFHandler<dim> *dofh = dof_handlers.hp_dof_handler[dof_handler_index];
std::pair<unsigned int, unsigned int> index =
cell_level_index[macro_cell_number * VectorizedArrayType::size() +
vector_number];
- return typename hp::DoFHandler<dim>::cell_iterator(&dofh->get_triangulation(),
- index.first,
- index.second,
- dofh);
+ return typename DoFHandler<dim>::cell_iterator(&dofh->get_triangulation(),
+ index.first,
+ index.second,
+ dofh);
}
dof_handler[0]->get_triangulation(),
cell_level_index,
face_info,
- DoFHandlerType<dim, dim>::is_hp_dof_handler ?
+ dof_handler[0]->hp_capability_enabled ?
dof_info[0].cell_active_fe_index :
std::vector<unsigned int>(),
mapping,
template <int dim, typename Number, typename VectorizedArrayType>
+template <typename DoFHandlerType>
void
MatrixFree<dim, Number, VectorizedArrayType>::initialize_dof_handlers(
- const std::vector<const DoFHandler<dim> *> &dof_handler,
- const AdditionalData & additional_data)
+ const std::vector<const DoFHandlerType *> &dof_handler,
+ const AdditionalData & additional_data)
{
- cell_level_index.clear();
- dof_handlers.active_dof_handler = DoFHandlers::usual;
- dof_handlers.n_dof_handlers = dof_handler.size();
- dof_handlers.dof_handler.resize(dof_handlers.n_dof_handlers);
- for (unsigned int no = 0; no < dof_handlers.n_dof_handlers; ++no)
- dof_handlers.dof_handler[no] = dof_handler[no];
+ if (dof_handler.front()->hp_capability_enabled == false)
+ {
+ cell_level_index.clear();
+ dof_handlers.active_dof_handler = DoFHandlers::usual;
+ dof_handlers.n_dof_handlers = dof_handler.size();
+ dof_handlers.dof_handler.resize(dof_handlers.n_dof_handlers);
+ for (unsigned int no = 0; no < dof_handlers.n_dof_handlers; ++no)
+ dof_handlers.dof_handler[no] = dof_handler[no];
+
+ dof_info.resize(dof_handlers.n_dof_handlers);
+ for (unsigned int no = 0; no < dof_handlers.n_dof_handlers; ++no)
+ dof_info[no].vectorization_length = VectorizedArrayType::size();
+
+ const unsigned int n_mpi_procs = task_info.n_procs;
+ const unsigned int my_pid = task_info.my_pid;
+
+ const Triangulation<dim> &tria =
+ dof_handlers.dof_handler[0]->get_triangulation();
+ const unsigned int level = additional_data.mg_level;
+ if (level == numbers::invalid_unsigned_int)
+ {
+ if (n_mpi_procs == 1)
+ cell_level_index.reserve(tria.n_active_cells());
+ // For serial Triangulations always take all cells
+ const unsigned int subdomain_id =
+ (dynamic_cast<const parallel::TriangulationBase<dim> *>(
+ &dof_handler[0]->get_triangulation()) != nullptr) ?
+ my_pid :
+ numbers::invalid_subdomain_id;
+
+ // Go through cells on zeroth level and then successively step down
+ // into children. This gives a z-ordering of the cells, which is
+ // beneficial when setting up neighboring relations between cells for
+ // thread parallelization
+ for (const auto &cell : tria.cell_iterators_on_level(0))
+ internal::MatrixFreeFunctions::resolve_cell(cell,
+ cell_level_index,
+ subdomain_id);
+
+ Assert(n_mpi_procs > 1 ||
+ cell_level_index.size() == tria.n_active_cells(),
+ ExcInternalError());
+ }
+ else
+ {
+ AssertIndexRange(level, tria.n_global_levels());
+ if (level < tria.n_levels())
+ {
+ cell_level_index.reserve(tria.n_cells(level));
+ for (const auto &cell : tria.cell_iterators_on_level(level))
+ if (cell->level_subdomain_id() == my_pid)
+ cell_level_index.emplace_back(cell->level(), cell->index());
+ }
+ }
- dof_info.resize(dof_handlers.n_dof_handlers);
- for (unsigned int no = 0; no < dof_handlers.n_dof_handlers; ++no)
- dof_info[no].vectorization_length = VectorizedArrayType::size();
+ // All these are cells local to this processor. Therefore, set
+ // cell_level_index_end_local to the size of cell_level_index.
+ cell_level_index_end_local = cell_level_index.size();
+ }
+ else
+ {
+ (void)additional_data;
- const unsigned int n_mpi_procs = task_info.n_procs;
- const unsigned int my_pid = task_info.my_pid;
+ cell_level_index.clear();
+ dof_handlers.active_dof_handler = DoFHandlers::hp;
+ Assert(additional_data.mg_level == numbers::invalid_unsigned_int,
+ ExcNotImplemented());
+ dof_handlers.n_dof_handlers = dof_handler.size();
+ dof_handlers.hp_dof_handler.resize(dof_handlers.n_dof_handlers);
+ for (unsigned int no = 0; no < dof_handlers.n_dof_handlers; ++no)
+ dof_handlers.hp_dof_handler[no] = dof_handler[no];
+
+ dof_info.resize(dof_handlers.n_dof_handlers);
+ for (unsigned int no = 0; no < dof_handlers.n_dof_handlers; ++no)
+ dof_info[no].vectorization_length = VectorizedArrayType::size();
+
+ const unsigned int n_mpi_procs = task_info.n_procs;
+ const unsigned int my_pid = task_info.my_pid;
+
+ // if we have no level given, use the same as for the standard DoFHandler,
+ // otherwise we must loop through the respective level
+ const Triangulation<dim> &tria = dof_handler[0]->get_triangulation();
- const Triangulation<dim> &tria =
- dof_handlers.dof_handler[0]->get_triangulation();
- const unsigned int level = additional_data.mg_level;
- if (level == numbers::invalid_unsigned_int)
- {
if (n_mpi_procs == 1)
cell_level_index.reserve(tria.n_active_cells());
// For serial Triangulations always take all cells
Assert(n_mpi_procs > 1 ||
cell_level_index.size() == tria.n_active_cells(),
ExcInternalError());
- }
- else
- {
- AssertIndexRange(level, tria.n_global_levels());
- if (level < tria.n_levels())
- {
- cell_level_index.reserve(tria.n_cells(level));
- for (const auto &cell : tria.cell_iterators_on_level(level))
- if (cell->level_subdomain_id() == my_pid)
- cell_level_index.emplace_back(cell->level(), cell->index());
- }
- }
- // All these are cells local to this processor. Therefore, set
- // cell_level_index_end_local to the size of cell_level_index.
- cell_level_index_end_local = cell_level_index.size();
-}
-
-
-
-template <int dim, typename Number, typename VectorizedArrayType>
-void
-MatrixFree<dim, Number, VectorizedArrayType>::initialize_dof_handlers(
- const std::vector<const hp::DoFHandler<dim> *> &dof_handler,
- const AdditionalData & additional_data)
-{
- (void)additional_data;
-
- cell_level_index.clear();
- dof_handlers.active_dof_handler = DoFHandlers::hp;
- Assert(additional_data.mg_level == numbers::invalid_unsigned_int,
- ExcNotImplemented());
- dof_handlers.n_dof_handlers = dof_handler.size();
- dof_handlers.hp_dof_handler.resize(dof_handlers.n_dof_handlers);
- for (unsigned int no = 0; no < dof_handlers.n_dof_handlers; ++no)
- dof_handlers.hp_dof_handler[no] = dof_handler[no];
-
- dof_info.resize(dof_handlers.n_dof_handlers);
- for (unsigned int no = 0; no < dof_handlers.n_dof_handlers; ++no)
- dof_info[no].vectorization_length = VectorizedArrayType::size();
-
- const unsigned int n_mpi_procs = task_info.n_procs;
- const unsigned int my_pid = task_info.my_pid;
-
- // if we have no level given, use the same as for the standard DoFHandler,
- // otherwise we must loop through the respective level
- const Triangulation<dim> &tria = dof_handler[0]->get_triangulation();
-
- if (n_mpi_procs == 1)
- cell_level_index.reserve(tria.n_active_cells());
-
- // For serial Triangulations always take all cells
- const unsigned int subdomain_id =
- (dynamic_cast<const parallel::TriangulationBase<dim> *>(
- &dof_handler[0]->get_triangulation()) != nullptr) ?
- my_pid :
- numbers::invalid_subdomain_id;
-
- // go through cells on zeroth level and then successively step down into
- // children. This gives a z-ordering of the cells, which is beneficial when
- // setting up neighboring relations between cells for thread parallelization
- for (const auto &cell : tria.cell_iterators_on_level(0))
- internal::MatrixFreeFunctions::resolve_cell(cell,
- cell_level_index,
- subdomain_id);
-
- Assert(n_mpi_procs > 1 || cell_level_index.size() == tria.n_active_cells(),
- ExcInternalError());
-
- // All these are cells local to this processor. Therefore, set
- // cell_level_index_end_local to the size of cell_level_index.
- cell_level_index_end_local = cell_level_index.size();
+ // All these are cells local to this processor. Therefore, set
+ // cell_level_index_end_local to the size of cell_level_index.
+ cell_level_index_end_local = cell_level_index.size();
+ }
}
std::vector<const FiniteElement<dim> *> fes;
if (dof_handlers.active_dof_handler == DoFHandlers::hp)
{
- const hp::DoFHandler<dim> * hpdof = dof_handlers.hp_dof_handler[no];
+ const DoFHandler<dim> * hpdof = dof_handlers.hp_dof_handler[no];
const hp::FECollection<dim> &fe = hpdof->get_fe_collection();
for (unsigned int f = 0; f < fe.size(); ++f)
fes.push_back(&fe[f]);
// hp case where we need to decode the FE index and similar
else if (dof_handlers.active_dof_handler == DoFHandlers::hp)
{
- const hp::DoFHandler<dim> *dofh = dof_handlers.hp_dof_handler[no];
- typename hp::DoFHandler<dim>::active_cell_iterator cell_it(
+ const DoFHandler<dim> *dofh = dof_handlers.hp_dof_handler[no];
+ typename DoFHandler<dim>::active_cell_iterator cell_it(
&dofh->get_triangulation(),
cell_level_index[counter].first,
cell_level_index[counter].second,
template <int dim, int spacedim, typename number>
void
create_mass_matrix(const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<number> & matrix,
const Function<spacedim, number> *const coefficient,
WorkStream::run(
dof.begin_active(),
- static_cast<typename hp::DoFHandler<dim, spacedim>::active_cell_iterator>(
+ static_cast<typename DoFHandler<dim, spacedim>::active_cell_iterator>(
dof.end()),
&MatrixCreator::internal::mass_assembler<
dim,
spacedim,
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator,
+ typename DoFHandler<dim, spacedim>::active_cell_iterator,
number>,
[&matrix](const internal::AssemblerData::CopyData<number> &data) {
MatrixCreator::internal::copy_local_to_global(
template <int dim, int spacedim, typename number>
void
- create_mass_matrix(const hp::DoFHandler<dim, spacedim> & dof,
+ create_mass_matrix(const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<number> & matrix,
const Function<spacedim, number> *const coefficient,
template <int dim, int spacedim, typename number>
void
create_mass_matrix(const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<number> & matrix,
const Function<spacedim, number> & rhs,
WorkStream::run(
dof.begin_active(),
- static_cast<typename hp::DoFHandler<dim, spacedim>::active_cell_iterator>(
+ static_cast<typename DoFHandler<dim, spacedim>::active_cell_iterator>(
dof.end()),
&MatrixCreator::internal::mass_assembler<
dim,
spacedim,
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator,
+ typename DoFHandler<dim, spacedim>::active_cell_iterator,
number>,
[&matrix,
&rhs_vector](const internal::AssemblerData::CopyData<number> &data) {
template <int dim, int spacedim, typename number>
void
- create_mass_matrix(const hp::DoFHandler<dim, spacedim> & dof,
+ create_mass_matrix(const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<number> & matrix,
const Function<spacedim, number> & rhs,
template <int dim, int spacedim, typename number>
void
create_hp_boundary_mass_matrix_1(
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator const &cell,
+ typename DoFHandler<dim, spacedim>::active_cell_iterator const &cell,
MatrixCreator::internal::AssemblerBoundary::Scratch const &,
- MatrixCreator::internal::AssemblerBoundary::
- CopyData<hp::DoFHandler<dim, spacedim>, number> ©_data,
- hp::MappingCollection<dim, spacedim> const & mapping,
- hp::FECollection<dim, spacedim> const & fe_collection,
- hp::QCollection<dim - 1> const & q,
+ MatrixCreator::internal::AssemblerBoundary ::
+ CopyData<DoFHandler<dim, spacedim>, number> ©_data,
+ hp::MappingCollection<dim, spacedim> const & mapping,
+ hp::FECollection<dim, spacedim> const & fe_collection,
+ hp::QCollection<dim - 1> const & q,
const std::map<types::boundary_id, const Function<spacedim, number> *>
& boundary_functions,
Function<spacedim, number> const *const coefficient,
template <int dim, int spacedim, typename number>
void
copy_hp_boundary_mass_matrix_1(
- MatrixCreator::internal::AssemblerBoundary::
- CopyData<hp::DoFHandler<dim, spacedim>, number> const ©_data,
+ MatrixCreator::internal::AssemblerBoundary ::
+ CopyData<DoFHandler<dim, spacedim>, number> const ©_data,
std::map<types::boundary_id, const Function<spacedim, number> *> const
& boundary_functions,
std::vector<types::global_dof_index> const &dof_to_boundary_mapping,
void
create_boundary_mass_matrix(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim - 1> & q,
SparseMatrix<number> & matrix,
const std::map<types::boundary_id, const Function<spacedim, number> *>
MatrixCreator::internal::AssemblerBoundary::Scratch scratch;
MatrixCreator::internal::AssemblerBoundary::
- CopyData<hp::DoFHandler<dim, spacedim>, number>
+ CopyData<DoFHandler<dim, spacedim>, number>
copy_data;
WorkStream::run(
&boundary_functions,
coefficient,
&component_mapping](
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator const
- & cell,
+ typename DoFHandler<dim, spacedim>::active_cell_iterator const &cell,
MatrixCreator::internal::AssemblerBoundary::Scratch const &scratch_data,
- MatrixCreator::internal::AssemblerBoundary::
- CopyData<hp::DoFHandler<dim, spacedim>, number> ©_data) {
+ MatrixCreator::internal::AssemblerBoundary ::
+ CopyData<DoFHandler<dim, spacedim>, number> ©_data) {
internal::create_hp_boundary_mass_matrix_1(cell,
scratch_data,
copy_data,
component_mapping);
},
[&boundary_functions, &dof_to_boundary_mapping, &matrix, &rhs_vector](
- MatrixCreator::internal::AssemblerBoundary::
- CopyData<hp::DoFHandler<dim, spacedim>, number> const ©_data) {
+ MatrixCreator::internal::AssemblerBoundary ::
+ CopyData<DoFHandler<dim, spacedim>, number> const ©_data) {
internal::copy_hp_boundary_mass_matrix_1(copy_data,
boundary_functions,
dof_to_boundary_mapping,
template <int dim, int spacedim, typename number>
void
create_boundary_mass_matrix(
- const hp::DoFHandler<dim, spacedim> &dof,
- const hp::QCollection<dim - 1> & q,
- SparseMatrix<number> & matrix,
+ const DoFHandler<dim, spacedim> &dof,
+ const hp::QCollection<dim - 1> & q,
+ SparseMatrix<number> & matrix,
const std::map<types::boundary_id, const Function<spacedim, number> *> &rhs,
Vector<number> & rhs_vector,
std::vector<types::global_dof_index> & dof_to_boundary_mapping,
template <int dim, int spacedim>
void
create_laplace_matrix(const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<double> & matrix,
const Function<spacedim> *const coefficient,
WorkStream::run(
dof.begin_active(),
- static_cast<typename hp::DoFHandler<dim, spacedim>::active_cell_iterator>(
+ static_cast<typename DoFHandler<dim, spacedim>::active_cell_iterator>(
dof.end()),
&MatrixCreator::internal::laplace_assembler<
dim,
spacedim,
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator>,
+ typename DoFHandler<dim, spacedim>::active_cell_iterator>,
[&matrix](const internal::AssemblerData::CopyData<double> &data) {
MatrixCreator::internal::copy_local_to_global(
data, &matrix, static_cast<Vector<double> *>(nullptr));
template <int dim, int spacedim>
void
- create_laplace_matrix(const hp::DoFHandler<dim, spacedim> &dof,
- const hp::QCollection<dim> & q,
- SparseMatrix<double> & matrix,
- const Function<spacedim> *const coefficient,
- const AffineConstraints<double> & constraints)
+ create_laplace_matrix(const DoFHandler<dim, spacedim> &dof,
+ const hp::QCollection<dim> & q,
+ SparseMatrix<double> & matrix,
+ const Function<spacedim> *const coefficient,
+ const AffineConstraints<double> &constraints)
{
create_laplace_matrix(
hp::StaticMappingQ1<dim, spacedim>::mapping_collection,
template <int dim, int spacedim>
void
create_laplace_matrix(const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<double> & matrix,
const Function<spacedim> & rhs,
WorkStream::run(
dof.begin_active(),
- static_cast<typename hp::DoFHandler<dim, spacedim>::active_cell_iterator>(
+ static_cast<typename DoFHandler<dim, spacedim>::active_cell_iterator>(
dof.end()),
&MatrixCreator::internal::laplace_assembler<
dim,
spacedim,
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator>,
+ typename DoFHandler<dim, spacedim>::active_cell_iterator>,
[&matrix,
&rhs_vector](const internal::AssemblerData::CopyData<double> &data) {
MatrixCreator::internal::copy_local_to_global(data,
template <int dim, int spacedim>
void
- create_laplace_matrix(const hp::DoFHandler<dim, spacedim> &dof,
- const hp::QCollection<dim> & q,
- SparseMatrix<double> & matrix,
- const Function<spacedim> & rhs,
- Vector<double> & rhs_vector,
- const Function<spacedim> *const coefficient,
- const AffineConstraints<double> & constraints)
+ create_laplace_matrix(const DoFHandler<dim, spacedim> &dof,
+ const hp::QCollection<dim> & q,
+ SparseMatrix<double> & matrix,
+ const Function<spacedim> & rhs,
+ Vector<double> & rhs_vector,
+ const Function<spacedim> *const coefficient,
+ const AffineConstraints<double> &constraints)
{
create_laplace_matrix(
hp::StaticMappingQ1<dim, spacedim>::mapping_collection,
void
create_mass_matrix(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<number> & matrix,
const Function<spacedim, number> *const a = nullptr,
template <int dim, int spacedim, typename number>
void
create_mass_matrix(
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<number> & matrix,
const Function<spacedim, number> *const a = nullptr,
void
create_mass_matrix(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<number> & matrix,
const Function<spacedim, number> & rhs,
template <int dim, int spacedim, typename number>
void
create_mass_matrix(
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<number> & matrix,
const Function<spacedim, number> & rhs,
void
create_boundary_mass_matrix(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim - 1> & q,
SparseMatrix<number> & matrix,
const std::map<types::boundary_id, const Function<spacedim, number> *>
template <int dim, int spacedim, typename number>
void
create_boundary_mass_matrix(
- const hp::DoFHandler<dim, spacedim> &dof,
- const hp::QCollection<dim - 1> & q,
- SparseMatrix<number> & matrix,
+ const DoFHandler<dim, spacedim> &dof,
+ const hp::QCollection<dim - 1> & q,
+ SparseMatrix<number> & matrix,
const std::map<types::boundary_id, const Function<spacedim, number> *>
& boundary_functions,
Vector<number> & rhs_vector,
void
create_laplace_matrix(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<double> & matrix,
const Function<spacedim> *const a = nullptr,
template <int dim, int spacedim>
void
create_laplace_matrix(
- const hp::DoFHandler<dim, spacedim> &dof,
- const hp::QCollection<dim> & q,
- SparseMatrix<double> & matrix,
- const Function<spacedim> *const a = nullptr,
+ const DoFHandler<dim, spacedim> &dof,
+ const hp::QCollection<dim> & q,
+ SparseMatrix<double> & matrix,
+ const Function<spacedim> *const a = nullptr,
const AffineConstraints<double> &constraints = AffineConstraints<double>());
/**
void
create_laplace_matrix(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
SparseMatrix<double> & matrix,
const Function<spacedim> & rhs,
template <int dim, int spacedim>
void
create_laplace_matrix(
- const hp::DoFHandler<dim, spacedim> &dof,
- const hp::QCollection<dim> & q,
- SparseMatrix<double> & matrix,
- const Function<spacedim> & rhs,
- Vector<double> & rhs_vector,
- const Function<spacedim> *const a = nullptr,
+ const DoFHandler<dim, spacedim> &dof,
+ const hp::QCollection<dim> & q,
+ SparseMatrix<double> & matrix,
+ const Function<spacedim> & rhs,
+ Vector<double> & rhs_vector,
+ const Function<spacedim> *const a = nullptr,
const AffineConstraints<double> &constraints = AffineConstraints<double>());
/**
template <typename Number>
class Vector;
+template <int dim, int spacedim>
+class DoFHandler;
+
namespace FESeries
{
template <int dim, int spacedim>
namespace hp
{
- template <int dim, int spacedim>
- class DoFHandler;
template <int dim, int spacedim>
class FECollection;
} // namespace hp
*/
template <int dim, int spacedim, typename VectorType>
void
- coefficient_decay(FESeries::Legendre<dim, spacedim> & fe_legendre,
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const VectorType & solution,
- Vector<float> & smoothness_indicators,
- const VectorTools::NormType regression_strategy =
+ coefficient_decay(FESeries::Legendre<dim, spacedim> &fe_legendre,
+ const DoFHandler<dim, spacedim> & dof_handler,
+ const VectorType & solution,
+ Vector<float> & smoothness_indicators,
+ const VectorTools::NormType regression_strategy =
VectorTools::Linfty_norm,
const double smallest_abs_coefficient = 1e-10,
const bool only_flagged_cells = false);
template <int dim, int spacedim, typename VectorType>
void
coefficient_decay_per_direction(
- FESeries::Legendre<dim, spacedim> & fe_legendre,
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const VectorType & solution,
- Vector<float> & smoothness_indicators,
+ FESeries::Legendre<dim, spacedim> &fe_legendre,
+ const DoFHandler<dim, spacedim> & dof_handler,
+ const VectorType & solution,
+ Vector<float> & smoothness_indicators,
const ComponentMask &coefficients_predicate = ComponentMask(),
const double smallest_abs_coefficient = 1e-10,
const bool only_flagged_cells = false);
*/
template <int dim, int spacedim, typename VectorType>
void
- coefficient_decay(FESeries::Fourier<dim, spacedim> & fe_fourier,
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const VectorType & solution,
- Vector<float> & smoothness_indicators,
- const VectorTools::NormType regression_strategy =
+ coefficient_decay(FESeries::Fourier<dim, spacedim> &fe_fourier,
+ const DoFHandler<dim, spacedim> & dof_handler,
+ const VectorType & solution,
+ Vector<float> & smoothness_indicators,
+ const VectorTools::NormType regression_strategy =
VectorTools::Linfty_norm,
const double smallest_abs_coefficient = 1e-10,
const bool only_flagged_cells = false);
template <int dim, int spacedim, typename VectorType>
void
coefficient_decay_per_direction(
- FESeries::Fourier<dim, spacedim> & fe_fourier,
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const VectorType & solution,
- Vector<float> & smoothness_indicators,
+ FESeries::Fourier<dim, spacedim> &fe_fourier,
+ const DoFHandler<dim, spacedim> & dof_handler,
+ const VectorType & solution,
+ Vector<float> & smoothness_indicators,
const ComponentMask &coefficients_predicate = ComponentMask(),
const double smallest_abs_coefficient = 1e-10,
const bool only_flagged_cells = false);
class Function;
namespace hp
{
- template <int dim, int spacedim>
- class DoFHandler;
template <int dim>
class QCollection;
} // namespace hp
void
interpolate_boundary_values(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const std::map<types::boundary_id, const Function<spacedim, number> *>
& function_map,
std::map<types::global_dof_index, number> &boundary_values,
void
project_boundary_values(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const std::map<types::boundary_id, const Function<spacedim, number> *>
& boundary_functions,
const hp::QCollection<dim - 1> & q,
template <int dim, int spacedim, typename number>
void
project_boundary_values(
- const hp::DoFHandler<dim, spacedim> &dof,
+ const DoFHandler<dim, spacedim> &dof,
const std::map<types::boundary_id, const Function<spacedim, number> *>
& boundary_function,
const hp::QCollection<dim - 1> & q,
template <int dim>
DEAL_II_DEPRECATED void
project_boundary_values_curl_conforming(
- const hp::DoFHandler<dim, dim> & dof_handler,
+ const DoFHandler<dim, dim> & dof_handler,
const unsigned int first_vector_component,
const Function<dim, double> & boundary_function,
const types::boundary_id boundary_component,
const Function<dim, number> &boundary_function,
const types::boundary_id boundary_component,
AffineConstraints<number> & constraints,
- const Mapping<dim> & mapping = StaticMappingQ1<dim>::mapping);
+ const Mapping<dim> & mapping);
/**
template <int dim, typename number>
void
project_boundary_values_curl_conforming_l2(
- const hp::DoFHandler<dim, dim> & dof_handler,
+ const DoFHandler<dim, dim> & dof_handler,
const unsigned int first_vector_component,
const Function<dim, number> & boundary_function,
const types::boundary_id boundary_component,
AffineConstraints<number> & constraints,
- const hp::MappingCollection<dim, dim> &mapping_collection =
- hp::StaticMappingQ1<dim>::mapping_collection);
+ const hp::MappingCollection<dim, dim> &mapping_collection);
/**
const Function<dim, double> &boundary_function,
const types::boundary_id boundary_component,
AffineConstraints<double> & constraints,
- const Mapping<dim> & mapping = StaticMappingQ1<dim>::mapping);
+ const Mapping<dim> & mapping);
/**
* Same as above for the hp-namespace.
template <int dim>
void
project_boundary_values_div_conforming(
- const hp::DoFHandler<dim, dim> & dof_handler,
+ const DoFHandler<dim, dim> & dof_handler,
const unsigned int first_vector_component,
const Function<dim, double> & boundary_function,
const types::boundary_id boundary_component,
AffineConstraints<double> & constraints,
- const hp::MappingCollection<dim, dim> &mapping_collection =
- hp::StaticMappingQ1<dim>::mapping_collection);
+ const hp::MappingCollection<dim, dim> &mapping_collection);
// @}
} // namespace VectorTools
void
interpolate_boundary_values(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const std::map<types::boundary_id, const Function<spacedim, number> *>
& function_map,
std::map<types::global_dof_index, number> &boundary_values,
void
project_boundary_values(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const std::map<types::boundary_id, const Function<spacedim, number> *>
& boundary_functions,
const hp::QCollection<dim - 1> & q,
template <int dim, int spacedim, typename number>
void
project_boundary_values(
- const hp::DoFHandler<dim, spacedim> &dof,
+ const DoFHandler<dim, spacedim> &dof,
const std::map<types::boundary_id, const Function<spacedim, number> *>
& boundary_function,
const hp::QCollection<dim - 1> & q,
void
project_boundary_values_curl_conforming(
- const hp::DoFHandler<dim> & dof_handler,
+ const DoFHandler<dim> & dof_handler,
const unsigned int first_vector_component,
const Function<dim> & boundary_function,
const types::boundary_id boundary_component,
std::vector<bool> dofs_processed;
std::vector<double> dof_values;
std::vector<types::global_dof_index> face_dof_indices;
- typename hp::DoFHandler<dim>::active_cell_iterator cell =
+ typename DoFHandler<dim>::active_cell_iterator cell =
dof_handler.begin_active();
switch (dim)
}
}
-
template <int dim, typename DoFHandlerType, typename number>
void
compute_project_boundary_values_curl_conforming_l2(
template <int dim, typename number>
void
project_boundary_values_curl_conforming_l2(
- const hp::DoFHandler<dim> & dof_handler,
+ const DoFHandler<dim> & dof_handler,
const unsigned int first_vector_component,
const Function<dim, number> & boundary_function,
const types::boundary_id boundary_component,
template <int dim>
void
project_boundary_values_div_conforming(
- const hp::DoFHandler<dim> & dof_handler,
+ const DoFHandler<dim> & dof_handler,
const unsigned int first_vector_component,
const Function<dim> & boundary_function,
const types::boundary_id boundary_component,
void
integrate_difference(
const hp::MappingCollection<dim, spacedim> & mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const InVector & fe_function,
const Function<spacedim, typename InVector::value_type> &exact_solution,
OutVector & difference,
template <int dim, class InVector, class OutVector, int spacedim>
void
integrate_difference(
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const InVector & fe_function,
const Function<spacedim, typename InVector::value_type> &exact_solution,
OutVector & difference,
DEAL_II_DEPRECATED typename std::enable_if<
!std::is_same<typename InVector::value_type, double>::value>::type
integrate_difference(const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const InVector & fe_function,
const Function<spacedim, double> &exact_solution,
OutVector & difference,
template <int dim, class InVector, class OutVector, int spacedim>
DEAL_II_DEPRECATED typename std::enable_if<
!std::is_same<typename InVector::value_type, double>::value>::type
- integrate_difference(const hp::DoFHandler<dim, spacedim> &dof,
- const InVector & fe_function,
- const Function<spacedim, double> & exact_solution,
- OutVector & difference,
- const hp::QCollection<dim> & q,
- const NormType & norm,
- const Function<spacedim, double> * weight = nullptr,
- const double exponent = 2.);
+ integrate_difference(const DoFHandler<dim, spacedim> & dof,
+ const InVector & fe_function,
+ const Function<spacedim, double> &exact_solution,
+ OutVector & difference,
+ const hp::QCollection<dim> & q,
+ const NormType & norm,
+ const Function<spacedim, double> *weight = nullptr,
+ const double exponent = 2.);
/**
* Take a Vector @p cellwise_error of errors on each cell with
return diff;
}
+
+
template <int dim,
class InVector,
class OutVector,
void
integrate_difference(
const dealii::hp::MappingCollection<dim, spacedim> & mapping,
- const dealii::hp::DoFHandler<dim, spacedim> & dof,
+ const dealii::DoFHandler<dim, spacedim> & dof,
const InVector & fe_function,
const Function<spacedim, typename InVector::value_type> &exact_solution,
OutVector & difference,
!std::is_same<typename InVector::value_type, double>::value>::type
integrate_difference(
const dealii::hp::MappingCollection<dim, spacedim> &mapping,
- const dealii::hp::DoFHandler<dim, spacedim> & dof,
+ const dealii::DoFHandler<dim, spacedim> & dof,
const InVector & fe_function,
const Function<spacedim> & exact_solution,
OutVector & difference,
template <int dim, class InVector, class OutVector, int spacedim>
void
integrate_difference(
- const dealii::hp::DoFHandler<dim, spacedim> & dof,
+ const dealii::DoFHandler<dim, spacedim> & dof,
const InVector & fe_function,
const Function<spacedim, typename InVector::value_type> &exact_solution,
OutVector & difference,
template <int dim, class InVector, class OutVector, int spacedim>
DEAL_II_DEPRECATED typename std::enable_if<
!std::is_same<typename InVector::value_type, double>::value>::type
- integrate_difference(const dealii::hp::DoFHandler<dim, spacedim> &dof,
- const InVector & fe_function,
- const Function<spacedim> & exact_solution,
- OutVector & difference,
- const dealii::hp::QCollection<dim> &q,
- const NormType & norm,
- const Function<spacedim> * weight,
- const double exponent)
+ integrate_difference(const dealii::DoFHandler<dim, spacedim> &dof,
+ const InVector & fe_function,
+ const Function<spacedim> & exact_solution,
+ OutVector & difference,
+ const dealii::hp::QCollection<dim> & q,
+ const NormType & norm,
+ const Function<spacedim> * weight,
+ const double exponent)
{
internal::do_integrate_difference(
hp::StaticMappingQ1<dim, spacedim>::mapping_collection,
* @todo The @p mapping argument should be replaced by a
* hp::MappingCollection in case of a hp::DoFHandler.
*/
- template <int dim,
- int spacedim,
- typename VectorType,
- template <int, int> class DoFHandlerType>
+ template <int dim, int spacedim, typename VectorType>
void
interpolate(
const Mapping<dim, spacedim> & mapping,
- const DoFHandlerType<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const Function<spacedim, typename VectorType::value_type> &function,
VectorType & vec,
const ComponentMask &component_mask = ComponentMask());
* Call the @p interpolate() function above with
* <tt>mapping=MappingQGeneric1@<dim>@()</tt>.
*/
- template <int dim,
- int spacedim,
- typename VectorType,
- template <int, int> class DoFHandlerType>
+ template <int dim, int spacedim, typename VectorType>
void
interpolate(
- const DoFHandlerType<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const Function<spacedim, typename VectorType::value_type> &function,
VectorType & vec,
const ComponentMask &component_mask = ComponentMask());
- template <int dim,
- int spacedim,
- typename VectorType,
- template <int, int> class DoFHandlerType>
+ template <int dim, int spacedim, typename VectorType>
void
interpolate(
const Mapping<dim, spacedim> & mapping,
- const DoFHandlerType<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const Function<spacedim, typename VectorType::value_type> &function,
VectorType & vec,
const ComponentMask & component_mask)
// Create a small lambda capture wrapping function and call the
// internal implementation
const auto function_map = [&function](
- const typename DoFHandlerType<dim, spacedim>::active_cell_iterator &)
+ const typename DoFHandler<dim, spacedim>::active_cell_iterator &)
-> const Function<spacedim, typename VectorType::value_type> *
{
return &function;
- template <int dim,
- int spacedim,
- typename VectorType,
- template <int, int> class DoFHandlerType>
+ template <int dim, int spacedim, typename VectorType>
void
interpolate(
- const DoFHandlerType<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const Function<spacedim, typename VectorType::value_type> &function,
VectorType & vec,
const ComponentMask & component_mask)
template <int dim, typename VectorType, int spacedim>
void
point_gradient(
- const hp::DoFHandler<dim, spacedim> &dof,
- const VectorType & fe_function,
- const Point<spacedim, double> & point,
+ const DoFHandler<dim, spacedim> &dof,
+ const VectorType & fe_function,
+ const Point<spacedim, double> & point,
std::vector<Tensor<1, spacedim, typename VectorType::value_type>> &value);
/**
*/
template <int dim, typename VectorType, int spacedim>
Tensor<1, spacedim, typename VectorType::value_type>
- point_gradient(const hp::DoFHandler<dim, spacedim> &dof,
- const VectorType & fe_function,
- const Point<spacedim, double> & point);
+ point_gradient(const DoFHandler<dim, spacedim> &dof,
+ const VectorType & fe_function,
+ const Point<spacedim, double> & point);
/**
* Evaluate a possibly vector-valued finite element function defined by the
void
point_gradient(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const VectorType & fe_function,
const Point<spacedim, double> & point,
std::vector<Tensor<1, spacedim, typename VectorType::value_type>> &value);
template <int dim, typename VectorType, int spacedim>
Tensor<1, spacedim, typename VectorType::value_type>
point_gradient(const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const VectorType & fe_function,
const Point<spacedim, double> & point);
std::vector<Tensor<1, spacedim, typename VectorType::value_type>>
&gradients)
{
- point_gradient(StaticMappingQ1<dim, spacedim>::mapping,
- dof,
- fe_function,
- point,
- gradients);
- }
-
-
- template <int dim, typename VectorType, int spacedim>
- void
- point_gradient(
- const hp::DoFHandler<dim, spacedim> &dof,
- const VectorType & fe_function,
- const Point<spacedim> & point,
- std::vector<Tensor<1, spacedim, typename VectorType::value_type>>
- &gradients)
- {
- point_gradient(hp::StaticMappingQ1<dim, spacedim>::mapping_collection,
- dof,
- fe_function,
- point,
- gradients);
+ if (dof.hp_capability_enabled == false)
+ point_gradient(StaticMappingQ1<dim, spacedim>::mapping,
+ dof,
+ fe_function,
+ point,
+ gradients);
+ else
+ point_gradient(hp::StaticMappingQ1<dim, spacedim>::mapping_collection,
+ dof,
+ fe_function,
+ point,
+ gradients);
}
const VectorType & fe_function,
const Point<spacedim> & point)
{
- return point_gradient(StaticMappingQ1<dim, spacedim>::mapping,
- dof,
- fe_function,
- point);
- }
-
-
- template <int dim, typename VectorType, int spacedim>
- Tensor<1, spacedim, typename VectorType::value_type>
- point_gradient(const hp::DoFHandler<dim, spacedim> &dof,
- const VectorType & fe_function,
- const Point<spacedim> & point)
- {
- return point_gradient(
- hp::StaticMappingQ1<dim, spacedim>::mapping_collection,
- dof,
- fe_function,
- point);
+ if (dof.hp_capability_enabled == false)
+ return point_gradient(StaticMappingQ1<dim, spacedim>::mapping,
+ dof,
+ fe_function,
+ point);
+ else
+ return point_gradient(
+ hp::StaticMappingQ1<dim, spacedim>::mapping_collection,
+ dof,
+ fe_function,
+ point);
}
void
point_gradient(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const VectorType & fe_function,
const Point<spacedim> & point,
std::vector<Tensor<1, spacedim, typename VectorType::value_type>> &gradient)
// first find the cell in which this point
// is, initialize a quadrature rule with
// it, and then a FEValues object
- const std::pair<
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator,
- Point<spacedim>>
+ const std::pair<typename DoFHandler<dim, spacedim>::active_cell_iterator,
+ Point<spacedim>>
cell_point =
GridTools::find_active_cell_around_point(mapping, dof, point);
template <int dim, typename VectorType, int spacedim>
Tensor<1, spacedim, typename VectorType::value_type>
point_gradient(const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const VectorType & fe_function,
const Point<spacedim> & point)
{
void
create_point_source_vector(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const Point<spacedim, double> & p,
Vector<double> & rhs_vector);
*/
template <int dim, int spacedim>
void
- create_point_source_vector(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Point<spacedim, double> & p,
- Vector<double> & rhs_vector);
+ create_point_source_vector(const DoFHandler<dim, spacedim> &dof_handler,
+ const Point<spacedim, double> & p,
+ Vector<double> & rhs_vector);
/**
* Create a right hand side vector for a point source at point @p p. This
void
create_point_source_vector(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const Point<spacedim, double> & p,
const Point<dim, double> & direction,
Vector<double> & rhs_vector);
*/
template <int dim, int spacedim>
void
- create_point_source_vector(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Point<spacedim, double> & p,
- const Point<dim, double> & direction,
- Vector<double> & rhs_vector);
+ create_point_source_vector(const DoFHandler<dim, spacedim> &dof_handler,
+ const Point<spacedim, double> & p,
+ const Point<dim, double> & direction,
+ Vector<double> & rhs_vector);
// @}
*/
template <int dim, typename VectorType, int spacedim>
void
- point_value(const hp::DoFHandler<dim, spacedim> & dof,
+ point_value(const DoFHandler<dim, spacedim> & dof,
const VectorType & fe_function,
const Point<spacedim, double> & point,
Vector<typename VectorType::value_type> &value);
*/
template <int dim, typename VectorType, int spacedim>
typename VectorType::value_type
- point_value(const hp::DoFHandler<dim, spacedim> &dof,
- const VectorType & fe_function,
- const Point<spacedim, double> & point);
+ point_value(const DoFHandler<dim, spacedim> &dof,
+ const VectorType & fe_function,
+ const Point<spacedim, double> & point);
/**
* Evaluate a possibly vector-valued finite element function defined by the
template <int dim, typename VectorType, int spacedim>
void
point_value(const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const VectorType & fe_function,
const Point<spacedim, double> & point,
Vector<typename VectorType::value_type> & value);
template <int dim, typename VectorType, int spacedim>
typename VectorType::value_type
point_value(const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const VectorType & fe_function,
const Point<spacedim, double> & point);
//@}
const Point<spacedim> & point,
Vector<typename VectorType::value_type> &value)
{
- point_value(
- StaticMappingQ1<dim, spacedim>::mapping, dof, fe_function, point, value);
- }
-
-
- template <int dim, typename VectorType, int spacedim>
- void
- point_value(const hp::DoFHandler<dim, spacedim> & dof,
- const VectorType & fe_function,
- const Point<spacedim> & point,
- Vector<typename VectorType::value_type> &value)
- {
- point_value(hp::StaticMappingQ1<dim, spacedim>::mapping_collection,
- dof,
- fe_function,
- point,
- value);
+ if (dof.hp_capability_enabled == false)
+ point_value(StaticMappingQ1<dim, spacedim>::mapping,
+ dof,
+ fe_function,
+ point,
+ value);
+ else
+ point_value(hp::StaticMappingQ1<dim, spacedim>::mapping_collection,
+ dof,
+ fe_function,
+ point,
+ value);
}
const VectorType & fe_function,
const Point<spacedim> & point)
{
- return point_value(StaticMappingQ1<dim, spacedim>::mapping,
- dof,
- fe_function,
- point);
- }
-
-
- template <int dim, typename VectorType, int spacedim>
- typename VectorType::value_type
- point_value(const hp::DoFHandler<dim, spacedim> &dof,
- const VectorType & fe_function,
- const Point<spacedim> & point)
- {
- return point_value(hp::StaticMappingQ1<dim, spacedim>::mapping_collection,
- dof,
- fe_function,
- point);
+ if (dof.hp_capability_enabled == false)
+ return point_value(StaticMappingQ1<dim, spacedim>::mapping,
+ dof,
+ fe_function,
+ point);
+ else
+ return point_value(hp::StaticMappingQ1<dim, spacedim>::mapping_collection,
+ dof,
+ fe_function,
+ point);
}
template <int dim, typename VectorType, int spacedim>
void
point_value(const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const VectorType & fe_function,
const Point<spacedim> & point,
Vector<typename VectorType::value_type> & value)
// first find the cell in which this point
// is, initialize a quadrature rule with
// it, and then a FEValues object
- const std::pair<
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator,
- Point<spacedim>>
+ const std::pair<typename DoFHandler<dim, spacedim>::active_cell_iterator,
+ Point<spacedim>>
cell_point =
GridTools::find_active_cell_around_point(mapping, dof, point);
template <int dim, typename VectorType, int spacedim>
typename VectorType::value_type
point_value(const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const VectorType & fe_function,
const Point<spacedim> & point)
{
return value(0);
}
+
template <int dim, typename VectorType, int spacedim>
void
point_difference(
const Point<spacedim> & p,
Vector<double> & rhs_vector)
{
- create_point_source_vector(StaticMappingQ1<dim, spacedim>::mapping,
- dof_handler,
- p,
- rhs_vector);
+ if (dof_handler.hp_capability_enabled)
+ create_point_source_vector(hp::StaticMappingQ1<dim>::mapping_collection,
+ dof_handler,
+ p,
+ rhs_vector);
+ else
+ create_point_source_vector(StaticMappingQ1<dim, spacedim>::mapping,
+ dof_handler,
+ p,
+ rhs_vector);
}
void
create_point_source_vector(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const Point<spacedim> & p,
Vector<double> & rhs_vector)
{
rhs_vector = 0;
- std::pair<typename hp::DoFHandler<dim, spacedim>::active_cell_iterator,
+ std::pair<typename DoFHandler<dim, spacedim>::active_cell_iterator,
Point<spacedim>>
cell_point =
GridTools::find_active_cell_around_point(mapping, dof_handler, p);
- template <int dim, int spacedim>
- void
- create_point_source_vector(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Point<spacedim> & p,
- Vector<double> & rhs_vector)
- {
- create_point_source_vector(hp::StaticMappingQ1<dim>::mapping_collection,
- dof_handler,
- p,
- rhs_vector);
- }
-
-
-
template <int dim, int spacedim>
void
create_point_source_vector(const Mapping<dim, spacedim> & mapping,
const Point<dim> & orientation,
Vector<double> & rhs_vector)
{
- create_point_source_vector(StaticMappingQ1<dim, spacedim>::mapping,
- dof_handler,
- p,
- orientation,
- rhs_vector);
+ if (dof_handler.hp_capability_enabled)
+ create_point_source_vector(hp::StaticMappingQ1<dim>::mapping_collection,
+ dof_handler,
+ p,
+ orientation,
+ rhs_vector);
+ else
+ create_point_source_vector(StaticMappingQ1<dim, spacedim>::mapping,
+ dof_handler,
+ p,
+ orientation,
+ rhs_vector);
}
void
create_point_source_vector(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const Point<spacedim> & p,
const Point<dim> & orientation,
Vector<double> & rhs_vector)
rhs_vector = 0;
- std::pair<typename hp::DoFHandler<dim, spacedim>::active_cell_iterator,
+ std::pair<typename DoFHandler<dim, spacedim>::active_cell_iterator,
Point<spacedim>>
cell_point =
GridTools::find_active_cell_around_point(mapping, dof_handler, p);
rhs_vector(local_dof_indices[i]) =
orientation * fe_values[vec].value(i, 0);
}
-
-
-
- template <int dim, int spacedim>
- void
- create_point_source_vector(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Point<spacedim> & p,
- const Point<dim> & orientation,
- Vector<double> & rhs_vector)
- {
- create_point_source_vector(hp::StaticMappingQ1<dim>::mapping_collection,
- dof_handler,
- p,
- orientation,
- rhs_vector);
- }
} // namespace VectorTools
DEAL_II_NAMESPACE_CLOSE
template <int dim, typename VectorType, int spacedim>
void
project(const hp::MappingCollection<dim, spacedim> & mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const AffineConstraints<typename VectorType::value_type> &constraints,
const hp::QCollection<dim> & quadrature,
const Function<spacedim, typename VectorType::value_type> &function,
*/
template <int dim, typename VectorType, int spacedim>
void
- project(const hp::DoFHandler<dim, spacedim> & dof,
+ project(const DoFHandler<dim, spacedim> & dof,
const AffineConstraints<typename VectorType::value_type> &constraints,
const hp::QCollection<dim> & quadrature,
const Function<spacedim, typename VectorType::value_type> &function,
}
}
+
/*
* MatrixFree implementation of project() for an arbitrary number of
* components and arbitrary degree of the FiniteElement.
template <int dim, typename VectorType, int spacedim>
void
project(const hp::MappingCollection<dim, spacedim> & mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const AffineConstraints<typename VectorType::value_type> &constraints,
const hp::QCollection<dim> & quadrature,
const Function<spacedim, typename VectorType::value_type> &function,
template <int dim, typename VectorType, int spacedim>
void
- project(const hp::DoFHandler<dim, spacedim> & dof,
+ project(const DoFHandler<dim, spacedim> & dof,
const AffineConstraints<typename VectorType::value_type> &constraints,
const hp::QCollection<dim> & quadrature,
const Function<spacedim, typename VectorType::value_type> &function,
void
create_right_hand_side(
const hp::MappingCollection<dim, spacedim> & mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
const Function<spacedim, typename VectorType::value_type> &rhs,
VectorType & rhs_vector,
template <int dim, int spacedim, typename VectorType>
void
create_right_hand_side(
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim> & q,
const Function<spacedim, typename VectorType::value_type> &rhs,
VectorType & rhs_vector,
void
create_boundary_right_hand_side(
const hp::MappingCollection<dim, spacedim> & mapping,
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim - 1> & q,
const Function<spacedim, typename VectorType::value_type> &rhs,
VectorType & rhs_vector,
template <int dim, int spacedim, typename VectorType>
void
create_boundary_right_hand_side(
- const hp::DoFHandler<dim, spacedim> & dof,
+ const DoFHandler<dim, spacedim> & dof,
const hp::QCollection<dim - 1> & q,
const Function<spacedim, typename VectorType::value_type> &rhs,
VectorType & rhs_vector,
void
create_boundary_right_hand_side(
const hp::MappingCollection<dim, spacedim> & mapping,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const hp::QCollection<dim - 1> & quadrature,
const Function<spacedim, typename VectorType::value_type> &rhs_function,
VectorType & rhs_vector,
std::vector<types::global_dof_index> dofs(fe.max_dofs_per_cell());
Vector<double> cell_vector(fe.max_dofs_per_cell());
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator
+ typename DoFHandler<dim, spacedim>::active_cell_iterator
cell = dof_handler.begin_active(),
endc = dof_handler.end();
template <int dim, int spacedim, typename VectorType>
void
create_boundary_right_hand_side(
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const hp::QCollection<dim - 1> & quadrature,
const Function<spacedim, typename VectorType::value_type> &rhs_function,
VectorType & rhs_vector,
void
create_right_hand_side(
const hp::MappingCollection<dim, spacedim> & mapping,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const hp::QCollection<dim> & quadrature,
const Function<spacedim, typename VectorType::value_type> &rhs_function,
VectorType & rhs_vector,
std::vector<types::global_dof_index> dofs(fe.max_dofs_per_cell());
Vector<Number> cell_vector(fe.max_dofs_per_cell());
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator
+ typename DoFHandler<dim, spacedim>::active_cell_iterator
cell = dof_handler.begin_active(),
endc = dof_handler.end();
template <int dim, int spacedim, typename VectorType>
void
create_right_hand_side(
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const hp::QCollection<dim> & quadrature,
const Function<spacedim, typename VectorType::value_type> &rhs_function,
VectorType & rhs_vector,
{
template <int dim, int spacedim>
CellWeights<dim, spacedim>::CellWeights(
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const WeightingFunction & weighting_function)
+ const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const WeightingFunction & weighting_function)
{
reinit(dof_handler, weighting_function);
}
template <int dim, int spacedim>
void
CellWeights<dim, spacedim>::reinit(
- const hp::DoFHandler<dim, spacedim> &dof_handler,
+ const DoFHandler<dim, spacedim> &dof_handler,
const typename CellWeights<dim, spacedim>::WeightingFunction
&weighting_function)
{
typename CellWeights<dim, spacedim>::WeightingFunction
CellWeights<dim, spacedim>::constant_weighting(const unsigned int factor)
{
- return
- [factor](const typename hp::DoFHandler<dim, spacedim>::cell_iterator &,
- const FiniteElement<dim, spacedim> &) -> unsigned int {
- return factor;
- };
+ return [factor](const typename DoFHandler<dim, spacedim>::cell_iterator &,
+ const FiniteElement<dim, spacedim> &) -> unsigned int {
+ return factor;
+ };
}
const std::pair<float, float> &coefficients)
{
return [coefficients](
- const typename hp::DoFHandler<dim, spacedim>::cell_iterator &,
+ const typename DoFHandler<dim, spacedim>::cell_iterator &,
const FiniteElement<dim, spacedim> &future_fe) -> unsigned int {
const float result =
std::trunc(coefficients.first *
const std::vector<std::pair<float, float>> &coefficients)
{
return [coefficients](
- const typename hp::DoFHandler<dim, spacedim>::cell_iterator &,
+ const typename DoFHandler<dim, spacedim>::cell_iterator &,
const FiniteElement<dim, spacedim> &future_fe) -> unsigned int {
float result = 0;
for (const auto &pair : coefficients)
const typename Triangulation<dim, spacedim>::cell_iterator &cell,
const typename Triangulation<dim, spacedim>::CellStatus status)>
CellWeights<dim, spacedim>::make_weighting_callback(
- const hp::DoFHandler<dim, spacedim> &dof_handler,
+ const DoFHandler<dim, spacedim> &dof_handler,
const typename CellWeights<dim, spacedim>::WeightingFunction
&weighting_function)
{
CellWeights<dim, spacedim>::weighting_callback(
const typename Triangulation<dim, spacedim>::cell_iterator &cell_,
const typename Triangulation<dim, spacedim>::CellStatus status,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const parallel::TriangulationBase<dim, spacedim> & triangulation,
const typename CellWeights<dim, spacedim>::WeightingFunction
&weighting_function)
// Convert cell type from Triangulation to DoFHandler to be able
// to access the information about the degrees of freedom.
- const typename hp::DoFHandler<dim, spacedim>::cell_iterator cell(
- *cell_, &dof_handler);
+ const typename DoFHandler<dim, spacedim>::cell_iterator cell(*cell_,
+ &dof_handler);
// Determine which FiniteElement object will be present on this cell after
// refinement and will thus specify the number of degrees of freedom.
template <int dim, int spacedim>
CellWeights<dim, spacedim>::CellWeights(
- const hp::DoFHandler<dim, spacedim> &dof_handler)
+ const dealii::DoFHandler<dim, spacedim> &dof_handler)
: dof_handler(&dof_handler)
, triangulation(
dynamic_cast<const parallel::TriangulationBase<dim, spacedim> *>(
template <int dim, int spacedim>
void
CellWeights<dim, spacedim>::register_custom_weighting(
- const std::function<unsigned int(
- const FiniteElement<dim, spacedim> &,
- const typename hp::DoFHandler<dim, spacedim>::cell_iterator &)>
+ const std::function<
+ unsigned int(const FiniteElement<dim, spacedim> &,
+ const typename DoFHandler<dim, spacedim>::cell_iterator &)>
custom_function)
{
connection.disconnect();
- const std::function<unsigned int(
- const typename hp::DoFHandler<dim, spacedim>::cell_iterator &,
- const FiniteElement<dim, spacedim> &)>
+ const std::function<
+ unsigned int(const typename DoFHandler<dim, spacedim>::cell_iterator &,
+ const FiniteElement<dim, spacedim> &)>
converted_function =
[&custom_function](
- const typename hp::DoFHandler<dim, spacedim>::cell_iterator &cell,
+ const typename DoFHandler<dim, spacedim>::cell_iterator &cell,
const FiniteElement<dim, spacedim> &future_fe) -> unsigned int {
return custom_function(future_fe, cell);
};
cell_iterator &cell_,
const typename Triangulation<dim, DoFHandlerType::space_dimension>::
CellStatus status) { return this->pack_callback(cell_, status); },
- /*returns_variable_size_data=*/DoFHandlerType::is_hp_dof_handler);
+ /*returns_variable_size_data=*/dof_handler->hp_capability_enabled);
}
input_vectors.size());
unsigned int fe_index = 0;
- if (DoFHandlerType::is_hp_dof_handler)
+ if (dof_handler->hp_capability_enabled)
{
switch (status)
{
typename DoFHandlerType::cell_iterator cell(*cell_, dof_handler);
unsigned int fe_index = 0;
- if (DoFHandlerType::is_hp_dof_handler)
+ if (dof_handler->hp_capability_enabled)
{
switch (status)
{
-for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS)
+for (DoFHandler : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS;
+ deal_II_space_dimension : SPACE_DIMENSIONS)
{
namespace parallel
\{
::dealii::LinearAlgebra::distributed::BlockVector<float>,
DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
- template class SolutionTransfer<
- deal_II_dimension,
- ::dealii::Vector<double>,
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
- template class SolutionTransfer<
- deal_II_dimension,
- ::dealii::LinearAlgebra::distributed::Vector<double>,
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
- template class SolutionTransfer<
- deal_II_dimension,
- ::dealii::LinearAlgebra::distributed::Vector<float>,
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
- template class SolutionTransfer<
- deal_II_dimension,
- ::dealii::LinearAlgebra::distributed::BlockVector<double>,
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
- template class SolutionTransfer<
- deal_II_dimension,
- ::dealii::LinearAlgebra::distributed::BlockVector<float>,
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
-
# ifdef DEAL_II_WITH_PETSC
template class SolutionTransfer<
deal_II_dimension,
PETScWrappers::MPI::BlockVector,
DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
-
- template class SolutionTransfer<
- deal_II_dimension,
- PETScWrappers::MPI::Vector,
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
- template class SolutionTransfer<
- deal_II_dimension,
- PETScWrappers::MPI::BlockVector,
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
# endif
# ifdef DEAL_II_WITH_TRILINOS
deal_II_dimension,
TrilinosWrappers::MPI::BlockVector,
DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
-
- template class SolutionTransfer<
- deal_II_dimension,
- TrilinosWrappers::MPI::Vector,
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
- template class SolutionTransfer<
- deal_II_dimension,
- TrilinosWrappers::MPI::BlockVector,
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
# endif
#endif
bool levels_only,
bool active_only)
{
+ Assert(dof.hp_capability_enabled == false,
+ (typename DoFHandler<dim, spacedim>::ExcNotImplementedWithHP()));
+
if (!levels_only && dof.has_active_dofs())
{
const std::vector<types::global_dof_index> sizes =
-template <int dim, int spacedim>
-void
-BlockInfo::initialize(const hp::DoFHandler<dim, spacedim> &dof,
- bool levels_only,
- bool active_only)
-{
- AssertThrow(false, ExcNotImplemented());
- (void)dof;
- (void)levels_only;
- (void)active_only;
-}
-
-
-
template <int dim, int spacedim>
void
BlockInfo::initialize_local(const DoFHandler<dim, spacedim> &dof)
{
+ Assert(dof.hp_capability_enabled == false,
+ (typename DoFHandler<dim, spacedim>::ExcNotImplementedWithHP()));
+
const FiniteElement<dim, spacedim> & fe = dof.get_fe();
std::vector<types::global_dof_index> sizes(fe.n_blocks());
bi_local.reinit(sizes);
}
-
-
-template <int dim, int spacedim>
-void
-BlockInfo::initialize_local(const hp::DoFHandler<dim, spacedim> &dof)
-{
- AssertThrow(false, ExcNotImplemented());
- (void)dof;
-}
-
// explicit instantiations
#include "block_info.inst"
const DoFHandler<deal_II_dimension, deal_II_dimension> &, bool, bool);
template void BlockInfo::initialize_local(
const DoFHandler<deal_II_dimension, deal_II_dimension> &);
- template void BlockInfo::initialize(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension> &, bool, bool);
- template void BlockInfo::initialize_local(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension> &);
#if deal_II_dimension < 3
template void BlockInfo::initialize(
const DoFHandler<deal_II_dimension, deal_II_dimension + 1> &, bool, bool);
template void BlockInfo::initialize_local(
const DoFHandler<deal_II_dimension, deal_II_dimension + 1> &);
- template void BlockInfo::initialize(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &,
- bool,
- bool);
- template void BlockInfo::initialize_local(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &);
#endif
#if deal_II_dimension == 3
template void BlockInfo::initialize(const DoFHandler<1, 3> &, bool, bool);
template void BlockInfo::initialize_local(const DoFHandler<1, 3> &);
- template void BlockInfo::initialize(const hp::DoFHandler<1, 3> &,
- bool,
- bool);
- template void BlockInfo::initialize_local(const hp::DoFHandler<1, 3> &);
#endif
}
DoFCellAccessor<DoFHandlerType, lda>::update_cell_dof_indices_cache() const
{
Assert(static_cast<unsigned int>(this->present_level) <
- this->dof_handler->levels.size(),
+ this->dof_handler->object_dof_indices.size(),
ExcMessage("DoFHandler not initialized"));
Assert(this->dof_handler != nullptr, typename BaseClass::ExcInvalidObject());
const std::vector<types::global_dof_index> &local_dof_indices)
{
Assert(static_cast<unsigned int>(this->present_level) <
- this->dof_handler->levels.size(),
+ this->dof_handler->object_dof_indices.size(),
ExcMessage("DoFHandler not initialized"));
Assert(this->dof_handler != nullptr, typename BaseClass::ExcInvalidObject());
DoFCellAccessor<DoFHandler<deal_II_dimension>, lda>>;
- // --------------------------------------------------------------------------
- // explicit instantiations (for hp::DoFHandler)
-
-
-#if deal_II_dimension == 2
- template class DoFAccessor<1, hp::DoFHandler<2>, lda>;
- template class TriaRawIterator<DoFAccessor<1, hp::DoFHandler<2>, lda>>;
- template class TriaIterator<DoFAccessor<1, hp::DoFHandler<2>, lda>>;
- template class TriaActiveIterator<DoFAccessor<1, hp::DoFHandler<2>, lda>>;
-#endif
-
-
-#if deal_II_dimension == 3
- template class DoFAccessor<1, hp::DoFHandler<3>, lda>;
- template class TriaRawIterator<DoFAccessor<1, hp::DoFHandler<3>, lda>>;
- template class TriaIterator<DoFAccessor<1, hp::DoFHandler<3>, lda>>;
- template class TriaActiveIterator<DoFAccessor<1, hp::DoFHandler<3>, lda>>;
-
- template class DoFAccessor<2, hp::DoFHandler<3>, lda>;
- template class TriaRawIterator<DoFAccessor<2, hp::DoFHandler<3>, lda>>;
- template class TriaIterator<DoFAccessor<2, hp::DoFHandler<3>, lda>>;
- template class TriaActiveIterator<DoFAccessor<2, hp::DoFHandler<3>, lda>>;
-#endif
-
- template class DoFAccessor<deal_II_dimension,
- hp::DoFHandler<deal_II_dimension>,
- lda>;
- template class DoFCellAccessor<hp::DoFHandler<deal_II_dimension>, lda>;
-
- template class TriaRawIterator<
- DoFCellAccessor<hp::DoFHandler<deal_II_dimension>, lda>>;
- template class TriaIterator<
- DoFCellAccessor<hp::DoFHandler<deal_II_dimension>, lda>>;
- template class TriaActiveIterator<
- DoFCellAccessor<hp::DoFHandler<deal_II_dimension>, lda>>;
-
-
// //
// --------------------------------------------------------------------------
template class TriaIterator<DoFCellAccessor<DoFHandler<1, 3>, lda>>;
template class TriaActiveIterator<DoFCellAccessor<DoFHandler<1, 3>, lda>>;
#endif
-
-
- // --------------------------------------------------------------------------
- // explicit instantiations (for hp::DoFHandler)
-
-#if deal_II_dimension == 1
- template class DoFAccessor<1, hp::DoFHandler<1, 2>, lda>;
- template class DoFAccessor<1, hp::DoFHandler<1, 3>, lda>;
-#endif
-
-#if deal_II_dimension == 2
- template class DoFAccessor<1, hp::DoFHandler<2, 3>, lda>;
- template class DoFAccessor<2, hp::DoFHandler<2, 3>, lda>;
-
- template class TriaRawIterator<DoFAccessor<1, hp::DoFHandler<2, 3>, lda>>;
- template class TriaIterator<DoFAccessor<1, hp::DoFHandler<2, 3>, lda>>;
- template class TriaActiveIterator<
- DoFAccessor<1, hp::DoFHandler<2, 3>, lda>>;
-#endif
-
-#if deal_II_dimension != 3
- template class DoFCellAccessor<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
- lda>;
-
- template class TriaRawIterator<
- DoFCellAccessor<hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
- lda>>;
- template class TriaIterator<
- DoFCellAccessor<hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
- lda>>;
- template class TriaActiveIterator<
- DoFCellAccessor<hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
- lda>>;
-#endif
-
-
-#if deal_II_dimension == 3
- template class DoFCellAccessor<hp::DoFHandler<1, 3>, lda>;
-
- template class TriaRawIterator<DoFCellAccessor<hp::DoFHandler<1, 3>, lda>>;
- template class TriaIterator<DoFCellAccessor<hp::DoFHandler<1, 3>, lda>>;
- template class TriaActiveIterator<
- DoFCellAccessor<hp::DoFHandler<1, 3>, lda>>;
-#endif
}
for (deal_II_struct_dimension : DIMENSIONS; deal_II_dimension : DIMENSIONS;
DoFCellAccessor<DoFHandlerType, lda>::get_interpolated_dof_values(
const InputVector &values,
Vector<number> & interpolated_values,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType::invalid_fe_index) ?
+ DoFHandlerType::default_fe_index :
+ fe_index_;
+
if (this->is_active())
// If this cell is active: simply return the exact values on this
// cell unless the finite element we need to interpolate to is different
// than the one we have on the current cell
{
- if ((dynamic_cast<DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
+ if ((this->dof_handler->hp_capability_enabled == false) ||
// for hp-DoFHandlers, we need to require that on
// active cells, you either don't specify an fe_index,
// or that you specify the correct one
(fe_index == this->active_fe_index()) ||
- (fe_index == DoFHandlerType::default_fe_index))
+ (fe_index == DoFHandlerType::invalid_fe_index))
this->get_dof_values(values, interpolated_values);
else
{
// mesh). consequently, we cannot interpolate from children's FE
// space to this cell's (unknown) FE space unless an explicit
// fe_index is given
- Assert((dynamic_cast<DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- (fe_index != DoFHandlerType::default_fe_index),
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ (fe_index != DoFHandlerType::invalid_fe_index),
ExcMessage(
"You cannot call this function on non-active cells "
"of hp::DoFHandler objects unless you provide an explicit "
#endif
}
-
-
-for (VEC : VECTOR_TYPES; deal_II_dimension : DIMENSIONS; lda : BOOL)
- {
- template void DoFCellAccessor<hp::DoFHandler<deal_II_dimension>, lda>::
- get_interpolated_dof_values(const VEC &,
- Vector<VEC::value_type> &,
- const unsigned int fe_index) const;
-
-#if deal_II_dimension != 3
-
- template void DoFCellAccessor<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
- lda>::get_interpolated_dof_values(const VEC &,
- Vector<VEC::value_type> &,
- const unsigned int fe_index) const;
-
-#endif
-
-#if deal_II_dimension == 3
-
- template void
- DoFCellAccessor<hp::DoFHandler<1, 3>, lda>::get_interpolated_dof_values(
- const VEC &, Vector<VEC::value_type> &, const unsigned int fe_index)
- const;
-
-#endif
- }
DoFCellAccessor<DoFHandlerType, lda>::set_dof_values_by_interpolation(
const Vector<number> &local_values,
OutputVector & values,
- const unsigned int fe_index) const
+ const unsigned int fe_index_) const
{
+ const unsigned int fe_index =
+ (this->dof_handler->hp_capability_enabled == false &&
+ fe_index_ == DoFHandlerType::invalid_fe_index) ?
+ DoFHandlerType::default_fe_index :
+ fe_index_;
+
if (this->is_active() && !this->is_artificial())
{
- if ((dynamic_cast<DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
+ if ((this->dof_handler->hp_capability_enabled == false) ||
// for hp-DoFHandlers, we need to require that on
// active cells, you either don't specify an fe_index,
// or that you specify the correct one
(fe_index == this->active_fe_index()) ||
- (fe_index == DoFHandlerType::default_fe_index))
+ (fe_index == DoFHandlerType::invalid_fe_index))
// simply set the values on this cell
this->set_dof_values(local_values, values);
else
else
// otherwise distribute them to the children
{
- Assert((dynamic_cast<DoFHandler<DoFHandlerType::dimension,
- DoFHandlerType::space_dimension> *>(
- this->dof_handler) != nullptr) ||
- (fe_index != DoFHandlerType::default_fe_index),
+ Assert((this->dof_handler->hp_capability_enabled == false) ||
+ (fe_index != DoFHandlerType::invalid_fe_index),
ExcMessage(
"You cannot call this function on non-active cells "
"of hp::DoFHandler objects unless you provide an explicit "
#endif
}
-
-
-for (VEC : VECTOR_TYPES; deal_II_dimension : DIMENSIONS; lda : BOOL)
- {
- template void DoFCellAccessor<hp::DoFHandler<deal_II_dimension>, lda>::
- set_dof_values_by_interpolation(const Vector<VEC::value_type> &,
- VEC &,
- const unsigned int fe_index) const;
-
-#if deal_II_dimension != 3
-
- template void DoFCellAccessor<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
- lda>::set_dof_values_by_interpolation(const Vector<VEC::value_type> &,
- VEC &,
- const unsigned int fe_index) const;
-
-#endif
-
-#if deal_II_dimension == 3
-
- template void
- DoFCellAccessor<hp::DoFHandler<1, 3>, lda>::set_dof_values_by_interpolation(
- const Vector<VEC::value_type> &, VEC &, const unsigned int fe_index)
- const;
-
-#endif
- }
//
// ---------------------------------------------------------------------
+#include <deal.II/base/config.h>
+
#include <deal.II/base/geometry_info.h>
#include <deal.II/base/memory_consumption.h>
+#include <deal.II/distributed/cell_data_transfer.templates.h>
#include <deal.II/distributed/shared_tria.h>
#include <deal.II/distributed/tria.h>
-#include <deal.II/dofs/dof_accessor.h>
-#include <deal.II/dofs/dof_faces.h>
#include <deal.II/dofs/dof_handler.h>
#include <deal.II/dofs/dof_handler_policy.h>
-#include <deal.II/dofs/dof_levels.h>
-
-#include <deal.II/fe/fe.h>
+#include <deal.II/grid/grid_tools.h>
#include <deal.II/grid/tria.h>
#include <deal.II/grid/tria_accessor.h>
#include <deal.II/grid/tria_iterator.h>
DEAL_II_NAMESPACE_OPEN
-
-template <int dim, int spacedim>
-const unsigned int DoFHandler<dim, spacedim>::dimension;
-
-template <int dim, int spacedim>
-const unsigned int DoFHandler<dim, spacedim>::space_dimension;
-
template <int dim, int spacedim>
-const unsigned int DoFHandler<dim, spacedim>::default_fe_index;
-
-
-// reference the invalid_dof_index variable explicitly to work around
-// a bug in the icc8 compiler
-namespace internal
-{
- template <int dim, int spacedim>
- const types::global_dof_index *
- dummy()
- {
- return &dealii::numbers::invalid_dof_index;
- }
-} // namespace internal
-
-
+const typename DoFHandler<dim, spacedim>::active_fe_index_type
+ DoFHandler<dim, spacedim>::invalid_active_fe_index;
namespace internal
{
if (dynamic_cast<const typename dealii::internal::DoFHandlerImplementation::
Policy::Sequential<dealii::DoFHandler<dim, spacedim>> *>(
&policy) ||
- dynamic_cast<
- const typename dealii::internal::DoFHandlerImplementation::Policy::
- Sequential<dealii::hp::DoFHandler<dim, spacedim>> *>(&policy))
+ dynamic_cast<const typename dealii::internal::DoFHandlerImplementation::
+ Policy::Sequential<dealii::DoFHandler<dim, spacedim>> *>(
+ &policy))
policy_name = "Policy::Sequential<";
else if (dynamic_cast<
const typename dealii::internal::DoFHandlerImplementation::
*>(&policy) ||
dynamic_cast<
const typename dealii::internal::DoFHandlerImplementation::
- Policy::ParallelDistributed<
- dealii::hp::DoFHandler<dim, spacedim>> *>(&policy))
+ Policy::ParallelDistributed<dealii::DoFHandler<dim, spacedim>>
+ *>(&policy))
policy_name = "Policy::ParallelDistributed<";
else if (dynamic_cast<
const typename dealii::internal::DoFHandlerImplementation::
Policy::ParallelShared<dealii::DoFHandler<dim, spacedim>> *>(
&policy) ||
- dynamic_cast<const typename dealii::internal::
- DoFHandlerImplementation::Policy::ParallelShared<
- dealii::hp::DoFHandler<dim, spacedim>> *>(
+ dynamic_cast<
+ const typename dealii::internal::DoFHandlerImplementation::
+ Policy::ParallelShared<dealii::DoFHandler<dim, spacedim>> *>(
&policy))
policy_name = "Policy::ParallelShared<";
else
namespace DoFHandlerImplementation
{
- // access class
- // dealii::DoFHandler instead of
- // namespace internal::DoFHandler
- using dealii::DoFHandler;
-
-
/**
* A class with the same purpose as the similarly named class of the
* Triangulation class. See there for more information.
max_couplings_between_dofs(const DoFHandler<1, spacedim> &dof_handler)
{
return std::min(static_cast<types::global_dof_index>(
- 3 * dof_handler.get_fe().dofs_per_vertex +
- 2 * dof_handler.get_fe().dofs_per_line),
+ 3 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 2 * dof_handler.fe_collection.max_dofs_per_line()),
dof_handler.n_dofs());
}
-
-
template <int spacedim>
static unsigned int
max_couplings_between_dofs(const DoFHandler<2, spacedim> &dof_handler)
switch (dof_handler.tria->max_adjacent_cells())
{
case 4:
- max_couplings = 19 * dof_handler.get_fe().dofs_per_vertex +
- 28 * dof_handler.get_fe().dofs_per_line +
- 8 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 19 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 28 * dof_handler.fe_collection.max_dofs_per_line() +
+ 8 * dof_handler.fe_collection.max_dofs_per_quad();
break;
case 5:
- max_couplings = 21 * dof_handler.get_fe().dofs_per_vertex +
- 31 * dof_handler.get_fe().dofs_per_line +
- 9 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 21 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 31 * dof_handler.fe_collection.max_dofs_per_line() +
+ 9 * dof_handler.fe_collection.max_dofs_per_quad();
break;
case 6:
- max_couplings = 28 * dof_handler.get_fe().dofs_per_vertex +
- 42 * dof_handler.get_fe().dofs_per_line +
- 12 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 28 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 42 * dof_handler.fe_collection.max_dofs_per_line() +
+ 12 * dof_handler.fe_collection.max_dofs_per_quad();
break;
case 7:
- max_couplings = 30 * dof_handler.get_fe().dofs_per_vertex +
- 45 * dof_handler.get_fe().dofs_per_line +
- 13 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 30 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 45 * dof_handler.fe_collection.max_dofs_per_line() +
+ 13 * dof_handler.fe_collection.max_dofs_per_quad();
break;
case 8:
- max_couplings = 37 * dof_handler.get_fe().dofs_per_vertex +
- 56 * dof_handler.get_fe().dofs_per_line +
- 16 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 37 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 56 * dof_handler.fe_collection.max_dofs_per_line() +
+ 16 * dof_handler.fe_collection.max_dofs_per_quad();
break;
// the following numbers are not based on actual counting but by
// example, for dofs_per_vertex, the sequence above is 19, 21, 28,
// 30, 37, and is continued as follows):
case 9:
- max_couplings = 39 * dof_handler.get_fe().dofs_per_vertex +
- 59 * dof_handler.get_fe().dofs_per_line +
- 17 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 39 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 59 * dof_handler.fe_collection.max_dofs_per_line() +
+ 17 * dof_handler.fe_collection.max_dofs_per_quad();
break;
case 10:
- max_couplings = 46 * dof_handler.get_fe().dofs_per_vertex +
- 70 * dof_handler.get_fe().dofs_per_line +
- 20 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 46 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 70 * dof_handler.fe_collection.max_dofs_per_line() +
+ 20 * dof_handler.fe_collection.max_dofs_per_quad();
break;
case 11:
- max_couplings = 48 * dof_handler.get_fe().dofs_per_vertex +
- 73 * dof_handler.get_fe().dofs_per_line +
- 21 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 48 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 73 * dof_handler.fe_collection.max_dofs_per_line() +
+ 21 * dof_handler.fe_collection.max_dofs_per_quad();
break;
case 12:
- max_couplings = 55 * dof_handler.get_fe().dofs_per_vertex +
- 84 * dof_handler.get_fe().dofs_per_line +
- 24 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 55 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 84 * dof_handler.fe_collection.max_dofs_per_line() +
+ 24 * dof_handler.fe_collection.max_dofs_per_quad();
break;
case 13:
- max_couplings = 57 * dof_handler.get_fe().dofs_per_vertex +
- 87 * dof_handler.get_fe().dofs_per_line +
- 25 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 57 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 87 * dof_handler.fe_collection.max_dofs_per_line() +
+ 25 * dof_handler.fe_collection.max_dofs_per_quad();
break;
case 14:
- max_couplings = 63 * dof_handler.get_fe().dofs_per_vertex +
- 98 * dof_handler.get_fe().dofs_per_line +
- 28 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 63 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 98 * dof_handler.fe_collection.max_dofs_per_line() +
+ 28 * dof_handler.fe_collection.max_dofs_per_quad();
break;
case 15:
- max_couplings = 65 * dof_handler.get_fe().dofs_per_vertex +
- 103 * dof_handler.get_fe().dofs_per_line +
- 29 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 65 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 103 * dof_handler.fe_collection.max_dofs_per_line() +
+ 29 * dof_handler.fe_collection.max_dofs_per_quad();
break;
case 16:
- max_couplings = 72 * dof_handler.get_fe().dofs_per_vertex +
- 114 * dof_handler.get_fe().dofs_per_line +
- 32 * dof_handler.get_fe().dofs_per_quad;
+ max_couplings =
+ 72 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 114 * dof_handler.fe_collection.max_dofs_per_line() +
+ 32 * dof_handler.fe_collection.max_dofs_per_quad();
break;
default:
return std::min(max_couplings, dof_handler.n_dofs());
}
-
template <int spacedim>
static unsigned int
max_couplings_between_dofs(const DoFHandler<3, spacedim> &dof_handler)
// TODO:[?] Invent significantly better estimates than the ones in this
// function
- // doing the same thing here is a
- // rather complicated thing, compared
- // to the 2d case, since it is hard
- // to draw pictures with several
- // refined hexahedra :-) so I
- // presently only give a coarse
- // estimate for the case that at most
- // 8 hexes meet at each vertex
+ // doing the same thing here is a rather complicated thing, compared
+ // to the 2d case, since it is hard to draw pictures with several
+ // refined hexahedra :-) so I presently only give a coarse
+ // estimate for the case that at most 8 hexes meet at each vertex
//
- // can anyone give better estimate
- // here?
+ // can anyone give better estimate here?
const unsigned int max_adjacent_cells =
dof_handler.tria->max_adjacent_cells();
types::global_dof_index max_couplings;
if (max_adjacent_cells <= 8)
- max_couplings = 7 * 7 * 7 * dof_handler.get_fe().dofs_per_vertex +
- 7 * 6 * 7 * 3 * dof_handler.get_fe().dofs_per_line +
- 9 * 4 * 7 * 3 * dof_handler.get_fe().dofs_per_quad +
- 27 * dof_handler.get_fe().dofs_per_hex;
+ max_couplings =
+ 7 * 7 * 7 * dof_handler.fe_collection.max_dofs_per_vertex() +
+ 7 * 6 * 7 * 3 * dof_handler.fe_collection.max_dofs_per_line() +
+ 9 * 4 * 7 * 3 * dof_handler.fe_collection.max_dofs_per_quad() +
+ 27 * dof_handler.fe_collection.max_dofs_per_hex();
else
{
Assert(false, ExcNotImplemented());
return std::min(max_couplings, dof_handler.n_dofs());
}
-
/**
- * Reserve enough space in the
- * <tt>levels[]</tt> objects to store the
- * numbers of the degrees of freedom
- * needed for the given element. The
- * given element is that one which
- * was selected when calling
+ * Reserve enough space in the <tt>levels[]</tt> objects to store the
+ * numbers of the degrees of freedom needed for the given element. The
+ * given element is that one which was selected when calling
* @p distribute_dofs the last time.
*/
template <int spacedim>
static void reserve_space(DoFHandler<1, spacedim> &dof_handler)
{
- dof_handler.vertex_dofs.resize(dof_handler.tria->n_vertices() *
- dof_handler.get_fe().dofs_per_vertex,
- numbers::invalid_dof_index);
+ dof_handler.object_dof_indices[0][0].resize(
+ dof_handler.tria->n_vertices() * dof_handler.get_fe().dofs_per_vertex,
+ numbers::invalid_dof_index);
for (unsigned int i = 0; i < dof_handler.tria->n_levels(); ++i)
{
- dof_handler.levels.emplace_back(
- new internal::DoFHandlerImplementation::DoFLevel<1>);
-
- dof_handler.levels.back()->dof_object.dofs.resize(
+ dof_handler.object_dof_indices[i][1].resize(
dof_handler.tria->n_raw_cells(i) *
dof_handler.get_fe().dofs_per_line,
numbers::invalid_dof_index);
- dof_handler.levels.back()->cell_dof_indices_cache.resize(
+ dof_handler.object_dof_ptr[i][1].reserve(
+ dof_handler.tria->n_raw_cells(i) + 1);
+ for (unsigned int j = 0; j < dof_handler.tria->n_raw_cells(i) + 1;
+ j++)
+ dof_handler.object_dof_ptr[i][1].push_back(
+ j * dof_handler.get_fe().dofs_per_line);
+
+ dof_handler.cell_dof_cache_indices[i].resize(
dof_handler.tria->n_raw_cells(i) *
dof_handler.get_fe().dofs_per_cell,
numbers::invalid_dof_index);
+
+ dof_handler.cell_dof_cache_ptr[i].reserve(
+ dof_handler.tria->n_raw_cells(i) + 1);
+ for (unsigned int j = 0; j < dof_handler.tria->n_raw_cells(i) + 1;
+ j++)
+ dof_handler.cell_dof_cache_ptr[i].push_back(
+ j * dof_handler.get_fe().dofs_per_cell);
}
- }
+ dof_handler.object_dof_indices[0][0].resize(
+ dof_handler.tria->n_vertices() * dof_handler.get_fe().dofs_per_vertex,
+ numbers::invalid_dof_index);
+ }
template <int spacedim>
static void reserve_space(DoFHandler<2, spacedim> &dof_handler)
{
- dof_handler.vertex_dofs.resize(dof_handler.tria->n_vertices() *
- dof_handler.get_fe().dofs_per_vertex,
- numbers::invalid_dof_index);
+ dof_handler.object_dof_indices[0][0].resize(
+ dof_handler.tria->n_vertices() * dof_handler.get_fe().dofs_per_vertex,
+ numbers::invalid_dof_index);
for (unsigned int i = 0; i < dof_handler.tria->n_levels(); ++i)
{
- dof_handler.levels.emplace_back(
- new internal::DoFHandlerImplementation::DoFLevel<2>);
-
- dof_handler.levels.back()->dof_object.dofs.resize(
+ dof_handler.object_dof_indices[i][2].resize(
dof_handler.tria->n_raw_cells(i) *
dof_handler.get_fe().dofs_per_quad,
numbers::invalid_dof_index);
- dof_handler.levels.back()->cell_dof_indices_cache.resize(
+ dof_handler.object_dof_ptr[i][2].reserve(
+ dof_handler.tria->n_raw_cells(i) + 1);
+ for (unsigned int j = 0; j < dof_handler.tria->n_raw_cells(i) + 1;
+ j++)
+ dof_handler.object_dof_ptr[i][2].push_back(
+ j * dof_handler.get_fe().dofs_per_quad);
+
+ dof_handler.cell_dof_cache_indices[i].resize(
dof_handler.tria->n_raw_cells(i) *
dof_handler.get_fe().dofs_per_cell,
numbers::invalid_dof_index);
+
+ dof_handler.cell_dof_cache_ptr[i].reserve(
+ dof_handler.tria->n_raw_cells(i) + 1);
+ for (unsigned int j = 0; j < dof_handler.tria->n_raw_cells(i) + 1;
+ j++)
+ dof_handler.cell_dof_cache_ptr[i].push_back(
+ j * dof_handler.get_fe().dofs_per_cell);
}
- dof_handler.faces =
- std::make_unique<internal::DoFHandlerImplementation::DoFFaces<2>>();
- // avoid access to n_raw_lines when there are no cells
+ dof_handler.object_dof_indices[0][0].resize(
+ dof_handler.tria->n_vertices() * dof_handler.get_fe().dofs_per_vertex,
+ numbers::invalid_dof_index);
+
if (dof_handler.tria->n_cells() > 0)
{
- dof_handler.faces->lines.dofs.resize(
+ // line
+ dof_handler.object_dof_ptr[0][1].reserve(
+ dof_handler.tria->n_raw_lines() + 1);
+ for (unsigned int i = 0; i < dof_handler.tria->n_raw_lines() + 1;
+ i++)
+ dof_handler.object_dof_ptr[0][1].push_back(
+ i * dof_handler.get_fe().dofs_per_line);
+
+ dof_handler.object_dof_indices[0][1].resize(
dof_handler.tria->n_raw_lines() *
dof_handler.get_fe().dofs_per_line,
numbers::invalid_dof_index);
}
}
-
template <int spacedim>
static void reserve_space(DoFHandler<3, spacedim> &dof_handler)
{
- dof_handler.vertex_dofs.resize(dof_handler.tria->n_vertices() *
- dof_handler.get_fe().dofs_per_vertex,
- numbers::invalid_dof_index);
+ dof_handler.object_dof_indices[0][0].resize(
+ dof_handler.tria->n_vertices() * dof_handler.get_fe().dofs_per_vertex,
+ numbers::invalid_dof_index);
for (unsigned int i = 0; i < dof_handler.tria->n_levels(); ++i)
{
- dof_handler.levels.emplace_back(
- new internal::DoFHandlerImplementation::DoFLevel<3>);
-
- dof_handler.levels.back()->dof_object.dofs.resize(
+ dof_handler.object_dof_indices[i][3].resize(
dof_handler.tria->n_raw_cells(i) *
dof_handler.get_fe().dofs_per_hex,
numbers::invalid_dof_index);
- dof_handler.levels.back()->cell_dof_indices_cache.resize(
+ dof_handler.object_dof_ptr[i][3].reserve(
+ dof_handler.tria->n_raw_cells(i) + 1);
+ for (unsigned int j = 0; j < dof_handler.tria->n_raw_cells(i) + 1;
+ j++)
+ dof_handler.object_dof_ptr[i][3].push_back(
+ j * dof_handler.get_fe().dofs_per_hex);
+
+ dof_handler.cell_dof_cache_indices[i].resize(
dof_handler.tria->n_raw_cells(i) *
dof_handler.get_fe().dofs_per_cell,
numbers::invalid_dof_index);
+
+ dof_handler.cell_dof_cache_ptr[i].reserve(
+ dof_handler.tria->n_raw_cells(i) + 1);
+ for (unsigned int j = 0; j < dof_handler.tria->n_raw_cells(i) + 1;
+ j++)
+ dof_handler.cell_dof_cache_ptr[i].push_back(
+ j * dof_handler.get_fe().dofs_per_cell);
}
- dof_handler.faces =
- std::make_unique<internal::DoFHandlerImplementation::DoFFaces<3>>();
- // avoid access to n_raw_lines when there are no cells
+ dof_handler.object_dof_indices[0][0].resize(
+ dof_handler.tria->n_vertices() * dof_handler.get_fe().dofs_per_vertex,
+ numbers::invalid_dof_index);
+
if (dof_handler.tria->n_cells() > 0)
{
- dof_handler.faces->lines.dofs.resize(
+ // lines
+ dof_handler.object_dof_ptr[0][1].reserve(
+ dof_handler.tria->n_raw_lines() + 1);
+ for (unsigned int i = 0; i < dof_handler.tria->n_raw_lines() + 1;
+ i++)
+ dof_handler.object_dof_ptr[0][1].push_back(
+ i * dof_handler.get_fe().dofs_per_line);
+
+ dof_handler.object_dof_indices[0][1].resize(
dof_handler.tria->n_raw_lines() *
dof_handler.get_fe().dofs_per_line,
numbers::invalid_dof_index);
- dof_handler.faces->quads.dofs.resize(
+
+ // faces
+ dof_handler.object_dof_ptr[0][2].reserve(
+ dof_handler.tria->n_raw_quads() + 1);
+ for (unsigned int i = 0; i < dof_handler.tria->n_raw_quads() + 1;
+ i++)
+ dof_handler.object_dof_ptr[0][2].push_back(
+ i * dof_handler.get_fe().dofs_per_quad);
+
+ dof_handler.object_dof_indices[0][2].resize(
dof_handler.tria->n_raw_quads() *
dof_handler.get_fe().dofs_per_quad,
numbers::invalid_dof_index);
}
}
-
-
template <int spacedim>
static types::global_dof_index
get_dof_index(
const unsigned int local_index,
const std::integral_constant<int, 1>)
{
- return mg_level->dof_object.get_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index);
+ Assert(dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<1, spacedim>::ExcNotImplementedWithHP()));
+
+ return mg_level->dof_object.get_dof_index(
+ static_cast<const DoFHandler<1, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index);
}
template <int spacedim>
const unsigned int local_index,
const std::integral_constant<int, 1>)
{
- return mg_faces->lines.get_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index);
+ return mg_faces->lines.get_dof_index(
+ static_cast<const DoFHandler<2, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index);
}
template <int spacedim>
const unsigned int local_index,
const std::integral_constant<int, 2>)
{
- return mg_level->dof_object.get_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index);
+ Assert(dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<2, spacedim>::ExcNotImplementedWithHP()));
+ return mg_level->dof_object.get_dof_index(
+ static_cast<const DoFHandler<2, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index);
}
template <int spacedim>
const unsigned int local_index,
const std::integral_constant<int, 1>)
{
- return mg_faces->lines.get_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index);
+ Assert(dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<3, spacedim>::ExcNotImplementedWithHP()));
+ return mg_faces->lines.get_dof_index(
+ static_cast<const DoFHandler<3, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index);
}
template <int spacedim>
const unsigned int local_index,
const std::integral_constant<int, 2>)
{
- return mg_faces->quads.get_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index);
+ Assert(dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<3, spacedim>::ExcNotImplementedWithHP()));
+ return mg_faces->quads.get_dof_index(
+ static_cast<const DoFHandler<3, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index);
}
template <int spacedim>
const unsigned int local_index,
const std::integral_constant<int, 3>)
{
- return mg_level->dof_object.get_dof_index(dof_handler,
- obj_index,
- fe_index,
- local_index);
+ Assert(dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<3, spacedim>::ExcNotImplementedWithHP()));
+ return mg_level->dof_object.get_dof_index(
+ static_cast<const DoFHandler<3, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index);
}
template <int spacedim>
const types::global_dof_index global_index,
const std::integral_constant<int, 1>)
{
+ Assert(dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<1, spacedim>::ExcNotImplementedWithHP()));
mg_level->dof_object.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
+ static_cast<const DoFHandler<1, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index,
+ global_index);
}
template <int spacedim>
const types::global_dof_index global_index,
const std::integral_constant<int, 1>)
{
+ Assert(dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<2, spacedim>::ExcNotImplementedWithHP()));
mg_faces->lines.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
+ static_cast<const DoFHandler<2, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index,
+ global_index);
}
template <int spacedim>
const types::global_dof_index global_index,
const std::integral_constant<int, 2>)
{
+ Assert(dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<2, spacedim>::ExcNotImplementedWithHP()));
mg_level->dof_object.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
+ static_cast<const DoFHandler<2, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index,
+ global_index);
}
template <int spacedim>
const types::global_dof_index global_index,
const std::integral_constant<int, 1>)
{
+ Assert(dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<3, spacedim>::ExcNotImplementedWithHP()));
mg_faces->lines.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
+ static_cast<const DoFHandler<3, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index,
+ global_index);
}
template <int spacedim>
const types::global_dof_index global_index,
const std::integral_constant<int, 2>)
{
+ Assert(dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<3, spacedim>::ExcNotImplementedWithHP()));
mg_faces->quads.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
+ static_cast<const DoFHandler<3, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index,
+ global_index);
}
template <int spacedim>
const types::global_dof_index global_index,
const std::integral_constant<int, 3>)
{
+ Assert(dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<3, spacedim>::ExcNotImplementedWithHP()));
mg_level->dof_object.set_dof_index(
- dof_handler, obj_index, fe_index, local_index, global_index);
+ static_cast<const DoFHandler<3, spacedim> &>(dof_handler),
+ obj_index,
+ fe_index,
+ local_index,
+ global_index);
}
};
} // namespace DoFHandlerImplementation
-} // namespace internal
+ namespace hp
+ {
+ namespace DoFHandlerImplementation
+ {
+ /**
+ * A class with the same purpose as the similarly named class of the
+ * Triangulation class. See there for more information.
+ */
+ struct Implementation
+ {
+ /**
+ * No future_fe_indices should have been assigned when partitioning a
+ * triangulation, since they are only available locally and will not be
+ * communicated.
+ */
+ template <int dim, int spacedim>
+ static void
+ ensure_absence_of_future_fe_indices(
+ DoFHandler<dim, spacedim> &dof_handler)
+ {
+ (void)dof_handler;
+ for (const auto &cell : dof_handler.active_cell_iterators())
+ if (cell->is_locally_owned())
+ Assert(
+ !cell->future_fe_index_set(),
+ ExcMessage(
+ "There shouldn't be any cells flagged for p-adaptation when partitioning."));
+ }
-template <int dim, int spacedim>
-DoFHandler<dim, spacedim>::DoFHandler(const Triangulation<dim, spacedim> &tria)
- : tria(&tria, typeid(*this).name())
- , faces(nullptr)
- , mg_faces(nullptr)
-{
- // decide whether we need a sequential or a parallel distributed policy
- if (dynamic_cast<const parallel::shared::Triangulation<dim, spacedim> *>(
- &tria) != nullptr)
- policy =
- std::make_unique<internal::DoFHandlerImplementation::Policy::
- ParallelShared<DoFHandler<dim, spacedim>>>(*this);
- else if (dynamic_cast<
- const parallel::DistributedTriangulationBase<dim, spacedim> *>(
- &tria) == nullptr)
- policy =
- std::make_unique<internal::DoFHandlerImplementation::Policy::Sequential<
- DoFHandler<dim, spacedim>>>(*this);
- else
- policy =
- std::make_unique<internal::DoFHandlerImplementation::Policy::
- ParallelDistributed<DoFHandler<dim, spacedim>>>(*this);
-}
+ /**
+ * Do that part of reserving space that pertains to releasing
+ * the previously used memory.
+ */
+ template <int dim, int spacedim>
+ static void
+ reserve_space_release_space(DoFHandler<dim, spacedim> &dof_handler)
+ {
+ // Release all space except the fields for active_fe_indices and
+ // refinement flags which we have to back up before
+ {
+ std::vector<std::vector<
+ typename DoFHandler<dim, spacedim>::active_fe_index_type>>
+ active_fe_backup(dof_handler.hp_cell_active_fe_indices.size()),
+ future_fe_backup(dof_handler.hp_cell_future_fe_indices.size());
+ for (unsigned int level = 0;
+ level < dof_handler.hp_cell_future_fe_indices.size();
+ ++level)
+ {
+ active_fe_backup[level] =
+ std::move(dof_handler.hp_cell_active_fe_indices[level]);
+ future_fe_backup[level] =
+ std::move(dof_handler.hp_cell_future_fe_indices[level]);
+ }
-template <int dim, int spacedim>
-DoFHandler<dim, spacedim>::DoFHandler()
- : tria(nullptr, typeid(*this).name())
-{}
+ // delete all levels and set them up newly, since vectors
+ // are troublesome if you want to change their size
+ dof_handler.clear_space();
+
+ dof_handler.object_dof_indices.resize(dof_handler.tria->n_levels());
+ dof_handler.object_dof_ptr.resize(dof_handler.tria->n_levels());
+ dof_handler.cell_dof_cache_indices.resize(
+ dof_handler.tria->n_levels());
+ dof_handler.cell_dof_cache_ptr.resize(dof_handler.tria->n_levels());
+ dof_handler.hp_cell_active_fe_indices.resize(
+ dof_handler.tria->n_levels());
+ dof_handler.hp_cell_future_fe_indices.resize(
+ dof_handler.tria->n_levels());
+
+ for (unsigned int level = 0; level < dof_handler.tria->n_levels();
+ ++level)
+ {
+ // recover backups
+ dof_handler.hp_cell_active_fe_indices[level] =
+ std::move(active_fe_backup[level]);
+ dof_handler.hp_cell_future_fe_indices[level] =
+ std::move(future_fe_backup[level]);
+ }
+ }
+ }
-template <int dim, int spacedim>
-DoFHandler<dim, spacedim>::~DoFHandler()
-{
- // release allocated memory
- // virtual functions called in constructors and destructors never use the
- // override in a derived class
- // for clarity be explicit on which function is called
- DoFHandler<dim, spacedim>::clear();
-
- // also release the policy. this needs to happen before the
- // current object disappears because the policy objects
- // store references to the DoFhandler object they work on
- policy.reset();
-}
+ /**
+ * Do that part of reserving space that pertains to vertices,
+ * since this is the same in all space dimensions.
+ */
+ template <int dim, int spacedim>
+ static void
+ reserve_space_vertices(DoFHandler<dim, spacedim> &dof_handler)
+ {
+ // The final step in all of the reserve_space() functions is to set
+ // up vertex dof information. since vertices are sequentially
+ // numbered, what we do first is to set up an array in which
+ // we record whether a vertex is associated with any of the
+ // given fe's, by setting a bit. in a later step, we then
+ // actually allocate memory for the required dofs
+ //
+ // in the following, we only need to consider vertices that are
+ // adjacent to either a locally owned or a ghost cell; we never
+ // store anything on vertices that are only surrounded by
+ // artificial cells. so figure out that subset of vertices
+ // first
+ std::vector<bool> locally_used_vertices(
+ dof_handler.tria->n_vertices(), false);
+ for (const auto &cell : dof_handler.active_cell_iterators())
+ if (!cell->is_artificial())
+ for (const unsigned int v : GeometryInfo<dim>::vertex_indices())
+ locally_used_vertices[cell->vertex_index(v)] = true;
+
+ std::vector<std::vector<bool>> vertex_fe_association(
+ dof_handler.fe_collection.size(),
+ std::vector<bool>(dof_handler.tria->n_vertices(), false));
+
+ for (const auto &cell : dof_handler.active_cell_iterators())
+ if (!cell->is_artificial())
+ for (const unsigned int v : GeometryInfo<dim>::vertex_indices())
+ vertex_fe_association[cell->active_fe_index()]
+ [cell->vertex_index(v)] = true;
+
+ // in debug mode, make sure that each vertex is associated
+ // with at least one fe (note that except for unused
+ // vertices, all vertices are actually active). this is of
+ // course only true for vertices that are part of either
+ // ghost or locally owned cells
+#ifdef DEBUG
+ for (unsigned int v = 0; v < dof_handler.tria->n_vertices(); ++v)
+ if (locally_used_vertices[v] == true)
+ if (dof_handler.tria->vertex_used(v) == true)
+ {
+ unsigned int fe = 0;
+ for (; fe < dof_handler.fe_collection.size(); ++fe)
+ if (vertex_fe_association[fe][v] == true)
+ break;
+ Assert(fe != dof_handler.fe_collection.size(),
+ ExcInternalError());
+ }
+#endif
-template <int dim, int spacedim>
-void
-DoFHandler<dim, spacedim>::initialize(const Triangulation<dim, spacedim> &t,
- const FiniteElement<dim, spacedim> &fe)
-{
- tria = &t;
- faces = nullptr;
- number_cache.n_global_dofs = 0;
+ const unsigned int d = 0;
+ const unsigned int l = 0;
- // decide whether we need a sequential or a parallel distributed policy
- if (dynamic_cast<const parallel::shared::Triangulation<dim, spacedim> *>(
- &t) != nullptr)
- policy =
- std::make_unique<internal::DoFHandlerImplementation::Policy::
- ParallelShared<DoFHandler<dim, spacedim>>>(*this);
- else if (dynamic_cast<
- const parallel::DistributedTriangulationBase<dim, spacedim> *>(
- &t) != nullptr)
- policy =
- std::make_unique<internal::DoFHandlerImplementation::Policy::
- ParallelDistributed<DoFHandler<dim, spacedim>>>(*this);
- else
- policy =
- std::make_unique<internal::DoFHandlerImplementation::Policy::Sequential<
- DoFHandler<dim, spacedim>>>(*this);
+ dof_handler.hp_object_fe_ptr[d].clear();
+ dof_handler.hp_object_fe_indices[d].clear();
+ dof_handler.object_dof_ptr[l][d].clear();
+ dof_handler.object_dof_indices[l][d].clear();
- distribute_dofs(fe);
-}
+ dof_handler.hp_object_fe_ptr[d].reserve(
+ dof_handler.tria->n_vertices() + 1);
+ unsigned int vertex_slots_needed = 0;
+ unsigned int fe_slots_needed = 0;
+ for (unsigned int v = 0; v < dof_handler.tria->n_vertices(); ++v)
+ {
+ dof_handler.hp_object_fe_ptr[d].push_back(fe_slots_needed);
-/*------------------------ Cell iterator functions ------------------------*/
+ if (dof_handler.tria->vertex_used(v) && locally_used_vertices[v])
+ {
+ for (unsigned int fe = 0;
+ fe < dof_handler.fe_collection.size();
+ ++fe)
+ if (vertex_fe_association[fe][v] == true)
+ {
+ fe_slots_needed++;
+ vertex_slots_needed +=
+ dof_handler.get_fe(fe).dofs_per_vertex;
+ }
+ }
+ }
-template <int dim, int spacedim>
-typename DoFHandler<dim, spacedim>::cell_iterator
-DoFHandler<dim, spacedim>::begin(const unsigned int level) const
-{
- typename Triangulation<dim, spacedim>::cell_iterator cell =
- this->get_triangulation().begin(level);
- if (cell == this->get_triangulation().end(level))
- return end(level);
- return cell_iterator(*cell, this);
-}
+ dof_handler.hp_object_fe_ptr[d].push_back(fe_slots_needed);
+ dof_handler.hp_object_fe_indices[d].reserve(fe_slots_needed);
+ dof_handler.object_dof_ptr[l][d].reserve(fe_slots_needed + 1);
+ dof_handler.object_dof_indices[l][d].reserve(vertex_slots_needed);
-template <int dim, int spacedim>
-typename DoFHandler<dim, spacedim>::active_cell_iterator
-DoFHandler<dim, spacedim>::begin_active(const unsigned int level) const
-{
- // level is checked in begin
- cell_iterator i = begin(level);
- if (i.state() != IteratorState::valid)
- return i;
- while (i->has_children())
- if ((++i).state() != IteratorState::valid)
- return i;
- return i;
-}
+ for (unsigned int v = 0; v < dof_handler.tria->n_vertices(); ++v)
+ if (dof_handler.tria->vertex_used(v) && locally_used_vertices[v])
+ {
+ for (unsigned int fe = 0; fe < dof_handler.fe_collection.size();
+ ++fe)
+ if (vertex_fe_association[fe][v] == true)
+ {
+ dof_handler.hp_object_fe_indices[d].push_back(fe);
+ dof_handler.object_dof_ptr[l][d].push_back(
+ dof_handler.object_dof_indices[l][d].size());
+
+ for (unsigned int i = 0;
+ i < dof_handler.get_fe(fe).dofs_per_vertex;
+ i++)
+ dof_handler.object_dof_indices[l][d].push_back(
+ numbers::invalid_dof_index);
+ }
+ }
+ dof_handler.object_dof_ptr[l][d].push_back(
+ dof_handler.object_dof_indices[l][d].size());
-template <int dim, int spacedim>
-typename DoFHandler<dim, spacedim>::cell_iterator
-DoFHandler<dim, spacedim>::end() const
-{
- return cell_iterator(&this->get_triangulation(), -1, -1, this);
-}
+ AssertDimension(vertex_slots_needed,
+ dof_handler.object_dof_indices[l][d].size());
+ AssertDimension(fe_slots_needed,
+ dof_handler.hp_object_fe_indices[d].size());
+ AssertDimension(fe_slots_needed + 1,
+ dof_handler.object_dof_ptr[l][d].size());
+ AssertDimension(dof_handler.tria->n_vertices() + 1,
+ dof_handler.hp_object_fe_ptr[d].size());
+ dof_handler.object_dof_indices[l][d].assign(
+ vertex_slots_needed, numbers::invalid_dof_index);
+ }
-template <int dim, int spacedim>
-typename DoFHandler<dim, spacedim>::cell_iterator
-DoFHandler<dim, spacedim>::end(const unsigned int level) const
-{
- typename Triangulation<dim, spacedim>::cell_iterator cell =
- this->get_triangulation().end(level);
- if (cell.state() != IteratorState::valid)
- return end();
- return cell_iterator(*cell, this);
-}
-template <int dim, int spacedim>
-typename DoFHandler<dim, spacedim>::active_cell_iterator
-DoFHandler<dim, spacedim>::end_active(const unsigned int level) const
-{
- typename Triangulation<dim, spacedim>::cell_iterator cell =
- this->get_triangulation().end_active(level);
- if (cell.state() != IteratorState::valid)
- return active_cell_iterator(end());
- return active_cell_iterator(*cell, this);
-}
+ /**
+ * Do that part of reserving space that pertains to cells,
+ * since this is the same in all space dimensions.
+ */
+ template <int dim, int spacedim>
+ static void
+ reserve_space_cells(DoFHandler<dim, spacedim> &dof_handler)
+ {
+ (void)dof_handler;
+ // count how much space we need on each level for the cell
+ // dofs and set the dof_*_offsets data. initially set the
+ // latter to an invalid index, and only later set it to
+ // something reasonable for active dof_handler.cells
+ //
+ // note that for dof_handler.cells, the situation is simpler
+ // than for other (lower dimensional) objects since exactly
+ // one finite element is used for it
+ for (unsigned int level = 0; level < dof_handler.tria->n_levels();
+ ++level)
+ {
+ dof_handler.object_dof_ptr[level][dim] =
+ std::vector<typename DoFHandler<dim, spacedim>::offset_type>(
+ dof_handler.tria->n_raw_cells(level),
+ static_cast<typename DoFHandler<dim, spacedim>::offset_type>(
+ -1));
+ dof_handler.cell_dof_cache_ptr[level] =
+ std::vector<typename DoFHandler<dim, spacedim>::offset_type>(
+ dof_handler.tria->n_raw_cells(level),
+ static_cast<typename DoFHandler<dim, spacedim>::offset_type>(
+ -1));
+
+ types::global_dof_index next_free_dof = 0;
+ types::global_dof_index cache_size = 0;
+
+ for (auto cell :
+ dof_handler.active_cell_iterators_on_level(level))
+ if (cell->is_active() && !cell->is_artificial())
+ {
+ dof_handler.object_dof_ptr[level][dim][cell->index()] =
+ next_free_dof;
+ next_free_dof +=
+ cell->get_fe().template n_dofs_per_object<dim>();
+
+ dof_handler.cell_dof_cache_ptr[level][cell->index()] =
+ cache_size;
+ cache_size += cell->get_fe().dofs_per_cell;
+ }
+
+ dof_handler.object_dof_indices[level][dim] =
+ std::vector<types::global_dof_index>(
+ next_free_dof, numbers::invalid_dof_index);
+ dof_handler.cell_dof_cache_indices[level] =
+ std::vector<types::global_dof_index>(
+ cache_size, numbers::invalid_dof_index);
+ }
+ }
-template <int dim, int spacedim>
-typename DoFHandler<dim, spacedim>::level_cell_iterator
-DoFHandler<dim, spacedim>::begin_mg(const unsigned int level) const
-{
- // Assert(this->has_level_dofs(), ExcMessage("You can only iterate over mg "
- // "levels if mg dofs got distributed."));
- typename Triangulation<dim, spacedim>::cell_iterator cell =
- this->get_triangulation().begin(level);
- if (cell == this->get_triangulation().end(level))
- return end_mg(level);
- return level_cell_iterator(*cell, this);
-}
+ /**
+ * Do that part of reserving space that pertains to faces,
+ * since this is the same in all space dimensions.
+ */
+ template <int dim, int spacedim>
+ static void
+ reserve_space_faces(DoFHandler<dim, spacedim> &dof_handler)
+ {
+ // FACE DOFS
+ //
+ // Count face dofs, then allocate as much space
+ // as we need and prime the linked list for faces (see the
+ // description in hp::DoFLevel) with the indices we will
+ // need. Note that our task is more complicated than for the
+ // cell case above since two adjacent cells may have different
+ // active_fe_indices, in which case we need to allocate
+ // *two* sets of face dofs for the same face. But they don't
+ // *have* to be different, and so we need to prepare for this
+ // as well.
+ //
+ // The way we do things is that we loop over all active
+ // cells (these are the only ones that have DoFs
+ // anyway) and all their faces. We note in the
+ // user flags whether we have previously visited a face and
+ // if so skip it (consequently, we have to save and later
+ // restore the face flags)
+ {
+ std::vector<bool> saved_face_user_flags;
+ switch (dim)
+ {
+ case 2:
+ {
+ const_cast<dealii::Triangulation<dim, spacedim> &>(
+ *dof_handler.tria)
+ .save_user_flags_line(saved_face_user_flags);
+ const_cast<dealii::Triangulation<dim, spacedim> &>(
+ *dof_handler.tria)
+ .clear_user_flags_line();
+
+ break;
+ }
+
+ case 3:
+ {
+ const_cast<dealii::Triangulation<dim, spacedim> &>(
+ *dof_handler.tria)
+ .save_user_flags_quad(saved_face_user_flags);
+ const_cast<dealii::Triangulation<dim, spacedim> &>(
+ *dof_handler.tria)
+ .clear_user_flags_quad();
+
+ break;
+ }
+
+ default:
+ Assert(false, ExcNotImplemented());
+ }
+ const unsigned int d = dim - 1;
+ const unsigned int l = 0;
-template <int dim, int spacedim>
-typename DoFHandler<dim, spacedim>::level_cell_iterator
-DoFHandler<dim, spacedim>::end_mg(const unsigned int level) const
-{
- // Assert(this->has_level_dofs(), ExcMessage("You can only iterate over mg "
- // "levels if mg dofs got distributed."));
- typename Triangulation<dim, spacedim>::cell_iterator cell =
- this->get_triangulation().end(level);
- if (cell.state() != IteratorState::valid)
- return end();
- return level_cell_iterator(*cell, this);
-}
+ dof_handler.hp_object_fe_ptr[d].clear();
+ dof_handler.hp_object_fe_indices[d].clear();
+ dof_handler.object_dof_ptr[l][d].clear();
+ dof_handler.object_dof_indices[l][d].clear();
+ dof_handler.hp_object_fe_ptr[d].resize(
+ dof_handler.tria->n_raw_faces() + 1);
-template <int dim, int spacedim>
-typename DoFHandler<dim, spacedim>::level_cell_iterator
-DoFHandler<dim, spacedim>::end_mg() const
-{
- return level_cell_iterator(&this->get_triangulation(), -1, -1, this);
-}
+ // An array to hold how many slots (see the hp::DoFLevel
+ // class) we will have to store on each level
+ unsigned int n_face_slots = 0;
+ for (const auto &cell : dof_handler.active_cell_iterators())
+ if (!cell->is_artificial())
+ for (const unsigned int face :
+ GeometryInfo<dim>::face_indices())
+ if (cell->face(face)->user_flag_set() == false)
+ {
+ unsigned int fe_slots_needed = 0;
+
+ if (cell->at_boundary(face) ||
+ cell->face(face)->has_children() ||
+ cell->neighbor_is_coarser(face) ||
+ (!cell->at_boundary(face) &&
+ cell->neighbor(face)->is_artificial()) ||
+ (!cell->at_boundary(face) &&
+ !cell->neighbor(face)->is_artificial() &&
+ (cell->active_fe_index() ==
+ cell->neighbor(face)->active_fe_index())))
+ {
+ fe_slots_needed = 1;
+ n_face_slots +=
+ dof_handler.get_fe(cell->active_fe_index())
+ .template n_dofs_per_object<dim - 1>();
+ }
+ else
+ {
+ fe_slots_needed = 2;
+ n_face_slots +=
+ dof_handler.get_fe(cell->active_fe_index())
+ .template n_dofs_per_object<dim - 1>() +
+ dof_handler
+ .get_fe(cell->neighbor(face)->active_fe_index())
+ .template n_dofs_per_object<dim - 1>();
+ }
+ // mark this face as visited
+ cell->face(face)->set_user_flag();
-template <int dim, int spacedim>
-IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>
-DoFHandler<dim, spacedim>::cell_iterators() const
-{
- return IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>(
- begin(), end());
-}
+ dof_handler
+ .hp_object_fe_ptr[d][cell->face(face)->index() + 1] =
+ fe_slots_needed;
+ }
+ for (unsigned int i = 1; i < dof_handler.hp_object_fe_ptr[d].size();
+ i++)
+ dof_handler.hp_object_fe_ptr[d][i] +=
+ dof_handler.hp_object_fe_ptr[d][i - 1];
-template <int dim, int spacedim>
-IteratorRange<typename DoFHandler<dim, spacedim>::active_cell_iterator>
-DoFHandler<dim, spacedim>::active_cell_iterators() const
-{
- return IteratorRange<
- typename DoFHandler<dim, spacedim>::active_cell_iterator>(begin_active(),
- end());
-}
+ dof_handler.hp_object_fe_indices[d].resize(
+ dof_handler.hp_object_fe_ptr[d].back());
+ dof_handler.object_dof_ptr[l][d].resize(
+ dof_handler.hp_object_fe_ptr[d].back() + 1);
+ dof_handler.object_dof_indices[l][d].reserve(n_face_slots);
-template <int dim, int spacedim>
-IteratorRange<typename DoFHandler<dim, spacedim>::level_cell_iterator>
-DoFHandler<dim, spacedim>::mg_cell_iterators() const
-{
- return IteratorRange<typename DoFHandler<dim, spacedim>::level_cell_iterator>(
- begin_mg(), end_mg());
-}
+ // With the memory now allocated, loop over the
+ // dof_handler cells again and prime the _offset values as
+ // well as the fe_index fields
+ switch (dim)
+ {
+ case 2:
+ {
+ const_cast<dealii::Triangulation<dim, spacedim> &>(
+ *dof_handler.tria)
+ .clear_user_flags_line();
+
+ break;
+ }
+
+ case 3:
+ {
+ const_cast<dealii::Triangulation<dim, spacedim> &>(
+ *dof_handler.tria)
+ .clear_user_flags_quad();
+
+ break;
+ }
+
+ default:
+ Assert(false, ExcNotImplemented());
+ }
+ for (const auto &cell : dof_handler.active_cell_iterators())
+ if (!cell->is_artificial())
+ for (const unsigned int face :
+ GeometryInfo<dim>::face_indices())
+ if (!cell->face(face)->user_flag_set())
+ {
+ // Same decision tree as before
+ if (cell->at_boundary(face) ||
+ cell->face(face)->has_children() ||
+ cell->neighbor_is_coarser(face) ||
+ (!cell->at_boundary(face) &&
+ cell->neighbor(face)->is_artificial()) ||
+ (!cell->at_boundary(face) &&
+ !cell->neighbor(face)->is_artificial() &&
+ (cell->active_fe_index() ==
+ cell->neighbor(face)->active_fe_index())))
+ {
+ const unsigned int fe = cell->active_fe_index();
+ const unsigned int n_dofs =
+ dof_handler.get_fe(fe)
+ .template n_dofs_per_object<dim - 1>();
+ const unsigned int offset =
+ dof_handler
+ .hp_object_fe_ptr[d][cell->face(face)->index()];
+
+ dof_handler.hp_object_fe_indices[d][offset] = fe;
+ dof_handler.object_dof_ptr[l][d][offset + 1] = n_dofs;
+
+ for (unsigned int i = 0; i < n_dofs; i++)
+ dof_handler.object_dof_indices[l][d].push_back(
+ numbers::invalid_dof_index);
+ }
+ else
+ {
+ unsigned int fe_1 = cell->active_fe_index();
+ unsigned int fe_2 =
+ cell->neighbor(face)->active_fe_index();
+
+ if (fe_2 < fe_1)
+ std::swap(fe_1, fe_2);
+
+ const unsigned int n_dofs_1 =
+ dof_handler.get_fe(fe_1)
+ .template n_dofs_per_object<dim - 1>();
+
+ const unsigned int n_dofs_2 =
+ dof_handler.get_fe(fe_2)
+ .template n_dofs_per_object<dim - 1>();
+
+ const unsigned int offset =
+ dof_handler
+ .hp_object_fe_ptr[d][cell->face(face)->index()];
+
+ dof_handler.hp_object_fe_indices[d].push_back(
+ cell->active_fe_index());
+ dof_handler.object_dof_ptr[l][d].push_back(
+ dof_handler.object_dof_indices[l][d].size());
+
+ for (unsigned int i = 0;
+ i < dof_handler.get_fe(cell->active_fe_index())
+ .template n_dofs_per_object<dim - 1>();
+ i++)
+ dof_handler.object_dof_indices[l][d].push_back(
+ numbers::invalid_dof_index);
+
+ dof_handler.hp_object_fe_indices[d][offset + 0] =
+ fe_1;
+ dof_handler.hp_object_fe_indices[d][offset + 1] =
+ fe_2;
+ dof_handler.object_dof_ptr[l][d][offset + 1] =
+ n_dofs_1;
+ dof_handler.object_dof_ptr[l][d][offset + 2] =
+ n_dofs_2;
+
+
+ for (unsigned int i = 0; i < n_dofs_1 + n_dofs_2; i++)
+ dof_handler.object_dof_indices[l][d].push_back(
+ numbers::invalid_dof_index);
+ }
-template <int dim, int spacedim>
-IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>
-DoFHandler<dim, spacedim>::cell_iterators_on_level(
- const unsigned int level) const
-{
- return IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>(
- begin(level), end(level));
-}
+ // mark this face as visited
+ cell->face(face)->set_user_flag();
+ }
+ for (unsigned int i = 1;
+ i < dof_handler.object_dof_ptr[l][d].size();
+ i++)
+ dof_handler.object_dof_ptr[l][d][i] +=
+ dof_handler.object_dof_ptr[l][d][i - 1];
+ // at the end, restore the user flags for the faces
+ switch (dim)
+ {
+ case 2:
+ {
+ const_cast<dealii::Triangulation<dim, spacedim> &>(
+ *dof_handler.tria)
+ .load_user_flags_line(saved_face_user_flags);
+
+ break;
+ }
+
+ case 3:
+ {
+ const_cast<dealii::Triangulation<dim, spacedim> &>(
+ *dof_handler.tria)
+ .load_user_flags_quad(saved_face_user_flags);
+
+ break;
+ }
+
+ default:
+ Assert(false, ExcNotImplemented());
+ }
+ }
+ }
-template <int dim, int spacedim>
-IteratorRange<typename DoFHandler<dim, spacedim>::active_cell_iterator>
-DoFHandler<dim, spacedim>::active_cell_iterators_on_level(
- const unsigned int level) const
-{
- return IteratorRange<
- typename DoFHandler<dim, spacedim>::active_cell_iterator>(
- begin_active(level), end_active(level));
-}
+ /**
+ * Reserve enough space in the <tt>levels[]</tt> objects to
+ * store the numbers of the degrees of freedom needed for the
+ * given element. The given element is that one which was
+ * selected when calling @p distribute_dofs the last time.
+ */
+ template <int spacedim>
+ static void reserve_space(dealii::DoFHandler<1, spacedim> &dof_handler)
+ {
+ Assert(dof_handler.fe_collection.size() > 0,
+ (typename dealii::DoFHandler<1, spacedim>::ExcNoFESelected()));
+ Assert(dof_handler.tria->n_levels() > 0,
+ ExcMessage("The current Triangulation must not be empty."));
+ Assert(dof_handler.tria->n_levels() ==
+ dof_handler.hp_cell_future_fe_indices.size(),
+ ExcInternalError());
+
+ reserve_space_release_space(dof_handler);
+
+ Threads::TaskGroup<> tasks;
+ tasks +=
+ Threads::new_task(&reserve_space_cells<1, spacedim>, dof_handler);
+ tasks += Threads::new_task(&reserve_space_vertices<1, spacedim>,
+ dof_handler);
+ tasks.join_all();
+ }
-template <int dim, int spacedim>
+
+
+ template <int spacedim>
+ static void reserve_space(dealii::DoFHandler<2, spacedim> &dof_handler)
+ {
+ Assert(dof_handler.fe_collection.size() > 0,
+ (typename dealii::DoFHandler<1, spacedim>::ExcNoFESelected()));
+ Assert(dof_handler.tria->n_levels() > 0,
+ ExcMessage("The current Triangulation must not be empty."));
+ Assert(dof_handler.tria->n_levels() ==
+ dof_handler.hp_cell_future_fe_indices.size(),
+ ExcInternalError());
+
+ reserve_space_release_space(dof_handler);
+
+ Threads::TaskGroup<> tasks;
+ tasks +=
+ Threads::new_task(&reserve_space_cells<2, spacedim>, dof_handler);
+ tasks +=
+ Threads::new_task(&reserve_space_faces<2, spacedim>, dof_handler);
+ tasks += Threads::new_task(&reserve_space_vertices<2, spacedim>,
+ dof_handler);
+ tasks.join_all();
+ }
+
+
+
+ template <int spacedim>
+ static void reserve_space(dealii::DoFHandler<3, spacedim> &dof_handler)
+ {
+ const unsigned int dim = 3;
+
+ Assert(dof_handler.fe_collection.size() > 0,
+ (typename dealii::DoFHandler<1, spacedim>::ExcNoFESelected()));
+ Assert(dof_handler.tria->n_levels() > 0,
+ ExcMessage("The current Triangulation must not be empty."));
+ Assert(dof_handler.tria->n_levels() ==
+ dof_handler.hp_cell_future_fe_indices.size(),
+ ExcInternalError());
+
+ reserve_space_release_space(dof_handler);
+
+ Threads::TaskGroup<> tasks;
+ tasks +=
+ Threads::new_task(&reserve_space_cells<3, spacedim>, dof_handler);
+ tasks +=
+ Threads::new_task(&reserve_space_faces<3, spacedim>, dof_handler);
+ tasks += Threads::new_task(&reserve_space_vertices<3, spacedim>,
+ dof_handler);
+
+ // While the tasks above are running, we can turn to line dofs
+
+ // the situation here is pretty much like with vertices:
+ // there can be an arbitrary number of finite elements
+ // associated with each line.
+ //
+ // the algorithm we use is somewhat similar to what we do in
+ // reserve_space_vertices()
+ {
+ // what we do first is to set up an array in which we
+ // record whether a line is associated with any of the
+ // given fe's, by setting a bit. in a later step, we
+ // then actually allocate memory for the required dofs
+ std::vector<std::vector<bool>> line_fe_association(
+ dof_handler.fe_collection.size(),
+ std::vector<bool>(dof_handler.tria->n_raw_lines(), false));
+
+ for (const auto &cell : dof_handler.active_cell_iterators())
+ if (!cell->is_artificial())
+ for (unsigned int l = 0; l < GeometryInfo<dim>::lines_per_cell;
+ ++l)
+ line_fe_association[cell->active_fe_index()]
+ [cell->line_index(l)] = true;
+
+ // first check which of the lines is used at all,
+ // i.e. is associated with a finite element. we do this
+ // since not all lines may actually be used, in which
+ // case we do not have to allocate any memory at all
+ std::vector<bool> line_is_used(dof_handler.tria->n_raw_lines(),
+ false);
+ for (unsigned int line = 0; line < dof_handler.tria->n_raw_lines();
+ ++line)
+ for (unsigned int fe = 0; fe < dof_handler.fe_collection.size();
+ ++fe)
+ if (line_fe_association[fe][line] == true)
+ {
+ line_is_used[line] = true;
+ break;
+ }
+
+
+
+ const unsigned int d = 1;
+ const unsigned int l = 0;
+
+ dof_handler.hp_object_fe_ptr[d].clear();
+ dof_handler.hp_object_fe_indices[d].clear();
+ dof_handler.object_dof_ptr[l][d].clear();
+ dof_handler.object_dof_indices[l][d].clear();
+
+ dof_handler.hp_object_fe_ptr[d].reserve(
+ dof_handler.tria->n_raw_lines() + 1);
+
+ unsigned int line_slots_needed = 0;
+ unsigned int fe_slots_needed = 0;
+
+ for (unsigned int line = 0; line < dof_handler.tria->n_raw_lines();
+ ++line)
+ {
+ dof_handler.hp_object_fe_ptr[d].push_back(fe_slots_needed);
+
+ if (line_is_used[line] == true)
+ {
+ for (unsigned int fe = 0;
+ fe < dof_handler.fe_collection.size();
+ ++fe)
+ if (line_fe_association[fe][line] == true)
+ {
+ fe_slots_needed++;
+ line_slots_needed +=
+ dof_handler.get_fe(fe).dofs_per_line;
+ }
+ }
+ }
+
+ dof_handler.hp_object_fe_ptr[d].push_back(fe_slots_needed);
+
+ dof_handler.hp_object_fe_indices[d].reserve(fe_slots_needed);
+ dof_handler.object_dof_ptr[l][d].reserve(fe_slots_needed + 1);
+
+ dof_handler.object_dof_indices[l][d].reserve(line_slots_needed);
+
+ for (unsigned int line = 0; line < dof_handler.tria->n_raw_lines();
+ ++line)
+ if (line_is_used[line] == true)
+ {
+ for (unsigned int fe = 0;
+ fe < dof_handler.fe_collection.size();
+ ++fe)
+ if (line_fe_association[fe][line] == true)
+ {
+ dof_handler.hp_object_fe_indices[d].push_back(fe);
+ dof_handler.object_dof_ptr[l][d].push_back(
+ dof_handler.object_dof_indices[l][d].size());
+
+ for (unsigned int i = 0;
+ i < dof_handler.get_fe(fe).dofs_per_line;
+ i++)
+ dof_handler.object_dof_indices[l][d].push_back(
+ numbers::invalid_dof_index);
+ }
+ }
+ }
+
+ // Ensure that everything is done at this point.
+ tasks.join_all();
+ }
+
+
+
+ /**
+ * Given a hp::DoFHandler object, make sure that the active_fe_indices
+ * that a user has set for locally owned cells are communicated to all
+ * other relevant cells as well.
+ *
+ * For parallel::shared::Triangulation objects,
+ * this information is distributed on both ghost and artificial cells.
+ *
+ * In case a parallel::distributed::Triangulation is used,
+ * indices are communicated only to ghost cells.
+ */
+ template <int dim, int spacedim>
+ static void
+ communicate_active_fe_indices(DoFHandler<dim, spacedim> &dof_handler)
+ {
+ Assert(
+ dof_handler.hp_capability_enabled == true,
+ (typename DoFHandler<dim, spacedim>::ExcNotAvailableWithoutHP()));
+
+ if (const dealii::parallel::shared::Triangulation<dim, spacedim> *tr =
+ dynamic_cast<
+ const dealii::parallel::shared::Triangulation<dim, spacedim>
+ *>(&dof_handler.get_triangulation()))
+ {
+ // we have a shared triangulation. in this case, every processor
+ // knows about all cells, but every processor only has knowledge
+ // about the active_fe_index on the cells it owns.
+ //
+ // we can create a complete set of active_fe_indices by letting
+ // every processor create a vector of indices for all cells,
+ // filling only those on the cells it owns and setting the indices
+ // on the other cells to zero. then we add all of these vectors
+ // up, and because every vector entry has exactly one processor
+ // that owns it, the sum is correct
+ std::vector<unsigned int> active_fe_indices(tr->n_active_cells(),
+ 0u);
+ for (const auto &cell : dof_handler.active_cell_iterators())
+ if (cell->is_locally_owned())
+ active_fe_indices[cell->active_cell_index()] =
+ cell->active_fe_index();
+
+ Utilities::MPI::sum(active_fe_indices,
+ tr->get_communicator(),
+ active_fe_indices);
+
+ // now go back and fill the active_fe_index on all other
+ // cells. we would like to call cell->set_active_fe_index(),
+ // but that function does not allow setting these indices on
+ // non-locally_owned cells. so we have to work around the
+ // issue a little bit by accessing the underlying data
+ // structures directly
+ for (const auto &cell : dof_handler.active_cell_iterators())
+ if (!cell->is_locally_owned())
+ dof_handler
+ .hp_cell_active_fe_indices[cell->level()][cell->index()] =
+ active_fe_indices[cell->active_cell_index()];
+ }
+ else if (const dealii::parallel::distributed::Triangulation<dim,
+ spacedim>
+ *tr = dynamic_cast<const dealii::parallel::distributed::
+ Triangulation<dim, spacedim> *>(
+ &dof_handler.get_triangulation()))
+ {
+ // For completely distributed meshes, use the function that is
+ // able to move data from locally owned cells on one processor to
+ // the corresponding ghost cells on others. To this end, we need
+ // to have functions that can pack and unpack the data we want to
+ // transport -- namely, the single unsigned int active_fe_index
+ // objects
+ auto pack = [](const typename dealii::DoFHandler<dim, spacedim>::
+ active_cell_iterator &cell) -> unsigned int {
+ return cell->active_fe_index();
+ };
+
+ auto unpack = [&dof_handler](
+ const typename dealii::DoFHandler<dim, spacedim>::
+ active_cell_iterator &cell,
+ const unsigned int active_fe_index) -> void {
+ // we would like to say
+ // cell->set_active_fe_index(active_fe_index);
+ // but this is not allowed on cells that are not
+ // locally owned, and we are on a ghost cell
+ dof_handler
+ .hp_cell_active_fe_indices[cell->level()][cell->index()] =
+ active_fe_index;
+ };
+
+ GridTools::exchange_cell_data_to_ghosts<
+ unsigned int,
+ dealii::DoFHandler<dim, spacedim>>(
+ static_cast<dealii::DoFHandler<dim, spacedim> &>(dof_handler),
+ pack,
+ unpack);
+ }
+ else
+ {
+ // a sequential triangulation. there is nothing we need to do here
+ Assert(
+ (dynamic_cast<
+ const dealii::parallel::TriangulationBase<dim, spacedim> *>(
+ &dof_handler.get_triangulation()) == nullptr),
+ ExcInternalError());
+ }
+ }
+
+
+
+ /**
+ * Collect all finite element indices on cells that will be affected by
+ * future refinement and coarsening. Further, prepare those indices to
+ * be distributed on on the updated triangulation later.
+ *
+ * On cells to be refined, the active_fe_index will be inherited to
+ * their children and thus will be stored as such.
+ *
+ * On cells to be coarsened, we choose the finite element on the parent
+ * cell from those assigned to their children to be the one that is
+ * dominated by all children. If none was found, we pick the most
+ * dominant element in the whole collection that is dominated by all
+ * children. See documentation of
+ * hp::FECollection::find_dominated_fe_extended() for further
+ * information.
+ *
+ * On cells intended for p-refinement or p-coarsening, those
+ * active_fe_indices will be determined by the corresponding flags that
+ * have been set on the relevant cells.
+ */
+ template <int dim, int spacedim>
+ static void
+ collect_fe_indices_on_cells_to_be_refined(
+ DoFHandler<dim, spacedim> &dof_handler)
+ {
+ const auto &fe_transfer = dof_handler.active_fe_index_transfer;
+
+ for (const auto &cell : dof_handler.active_cell_iterators())
+ if (cell->is_locally_owned())
+ {
+ if (cell->refine_flag_set())
+ {
+ // Store the active_fe_index of each cell that will be
+ // refined to and distribute it later on its children.
+ // Pick their future index if flagged for p-refinement.
+ fe_transfer->refined_cells_fe_index.insert(
+ {cell, cell->future_fe_index()});
+ }
+ else if (cell->coarsen_flag_set())
+ {
+ // From all cells that will be coarsened, determine their
+ // parent and calculate its proper active_fe_index, so that
+ // it can be set after refinement. But first, check if that
+ // particular cell has a parent at all.
+ Assert(cell->level() > 0, ExcInternalError());
+ const auto &parent = cell->parent();
+
+ // Check if the active_fe_index for the current cell has
+ // been determined already.
+ if (fe_transfer->coarsened_cells_fe_index.find(parent) ==
+ fe_transfer->coarsened_cells_fe_index.end())
+ {
+ // Find a suitable active_fe_index for the parent cell
+ // based on the 'least dominant finite element' of its
+ // children. Consider the childrens' hypothetical future
+ // index when they have been flagged for p-refinement.
+ std::set<unsigned int> fe_indices_children;
+ for (unsigned int child_index = 0;
+ child_index < parent->n_children();
+ ++child_index)
+ {
+ const auto sibling = parent->child(child_index);
+ Assert(sibling->is_active() &&
+ sibling->coarsen_flag_set(),
+ typename dealii::Triangulation<
+ dim>::ExcInconsistentCoarseningFlags());
+
+ fe_indices_children.insert(
+ sibling->future_fe_index());
+ }
+ Assert(!fe_indices_children.empty(),
+ ExcInternalError());
+
+ const unsigned int fe_index =
+ dof_handler.fe_collection.find_dominated_fe_extended(
+ fe_indices_children, /*codim=*/0);
+
+ Assert(fe_index != numbers::invalid_unsigned_int,
+ typename dealii::hp::FECollection<dim>::
+ ExcNoDominatedFiniteElementAmongstChildren());
+
+ fe_transfer->coarsened_cells_fe_index.insert(
+ {parent, fe_index});
+ }
+ }
+ else
+ {
+ // No h-refinement is scheduled for this cell.
+ // However, it may have p-refinement indicators, so we
+ // choose a new active_fe_index based on its flags.
+ if (cell->future_fe_index_set() == true)
+ fe_transfer->persisting_cells_fe_index.insert(
+ {cell, cell->future_fe_index()});
+ }
+ }
+ }
+
+
+
+ /**
+ * Distribute active finite element indices that have been previously
+ * prepared in collect_fe_indices_on_cells_to_be_refined().
+ */
+ template <int dim, int spacedim>
+ static void
+ distribute_fe_indices_on_refined_cells(
+ DoFHandler<dim, spacedim> &dof_handler)
+ {
+ const auto &fe_transfer = dof_handler.active_fe_index_transfer;
+
+ // Set active_fe_indices on persisting cells.
+ for (const auto &persist : fe_transfer->persisting_cells_fe_index)
+ {
+ const auto &cell = persist.first;
+
+ if (cell->is_locally_owned())
+ {
+ Assert(cell->is_active(), ExcInternalError());
+ cell->set_active_fe_index(persist.second);
+ }
+ }
+
+ // Distribute active_fe_indices from all refined cells on their
+ // respective children.
+ for (const auto &refine : fe_transfer->refined_cells_fe_index)
+ {
+ const auto &parent = refine.first;
+
+ for (unsigned int child_index = 0;
+ child_index < parent->n_children();
+ ++child_index)
+ {
+ const auto &child = parent->child(child_index);
+ Assert(child->is_locally_owned() && child->is_active(),
+ ExcInternalError());
+ child->set_active_fe_index(refine.second);
+ }
+ }
+
+ // Set active_fe_indices on coarsened cells that have been determined
+ // before the actual coarsening happened.
+ for (const auto &coarsen : fe_transfer->coarsened_cells_fe_index)
+ {
+ const auto &cell = coarsen.first;
+ Assert(cell->is_locally_owned() && cell->is_active(),
+ ExcInternalError());
+ cell->set_active_fe_index(coarsen.second);
+ }
+ }
+
+
+ /**
+ * Coarsening strategy for the CellDataTransfer object responsible for
+ * transferring the active_fe_index of each cell on
+ * parallel::distributed::Triangulation objects that have been refined.
+ *
+ * A finite element index needs to be determined for the (not yet
+ * active) parent cell from its (still active) children. Out of the set
+ * of elements previously assigned to the former children, we choose the
+ * one dominated by all children for the parent cell.
+ */
+ template <int dim, int spacedim>
+ static unsigned int
+ determine_fe_from_children(
+ const typename Triangulation<dim, spacedim>::cell_iterator &,
+ const std::vector<unsigned int> & children_fe_indices,
+ dealii::hp::FECollection<dim, spacedim> &fe_collection)
+ {
+ Assert(!children_fe_indices.empty(), ExcInternalError());
+
+ // convert vector to set
+ const std::set<unsigned int> children_fe_indices_set(
+ children_fe_indices.begin(), children_fe_indices.end());
+
+ const unsigned int dominated_fe_index =
+ fe_collection.find_dominated_fe_extended(children_fe_indices_set,
+ /*codim=*/0);
+
+ Assert(dominated_fe_index != numbers::invalid_unsigned_int,
+ typename dealii::hp::FECollection<
+ dim>::ExcNoDominatedFiniteElementAmongstChildren());
+
+ return dominated_fe_index;
+ }
+ };
+ } // namespace DoFHandlerImplementation
+ } // namespace hp
+} // namespace internal
+
+
+
+template <int dim, int spacedim>
+DoFHandler<dim, spacedim>::DoFHandler(const bool hp_capability_enabled)
+ : hp_capability_enabled(hp_capability_enabled)
+ , tria(nullptr, typeid(*this).name())
+ , mg_faces(nullptr)
+{}
+
+
+
+template <int dim, int spacedim>
+DoFHandler<dim, spacedim>::DoFHandler(const Triangulation<dim, spacedim> &tria,
+ const bool hp_capability_enabled)
+ : hp_capability_enabled(hp_capability_enabled)
+ , tria(&tria, typeid(*this).name())
+ , mg_faces(nullptr)
+{
+ if (hp_capability_enabled)
+ {
+ this->setup_policy_and_listeners();
+ this->create_active_fe_table();
+ }
+ else
+ {
+ this->setup_policy();
+ }
+}
+
+template <int dim, int spacedim>
+DoFHandler<dim, spacedim>::~DoFHandler()
+{
+ if (hp_capability_enabled)
+ {
+ // unsubscribe as a listener to refinement of the underlying
+ // triangulation
+ for (auto &connection : this->tria_listeners)
+ connection.disconnect();
+ this->tria_listeners.clear();
+
+ // ...and release allocated memory
+ // virtual functions called in constructors and destructors never use the
+ // override in a derived class
+ // for clarity be explicit on which function is called
+ DoFHandler<dim, spacedim>::clear();
+ }
+ else
+ {
+ // release allocated memory
+ // virtual functions called in constructors and destructors never use the
+ // override in a derived class
+ // for clarity be explicit on which function is called
+ DoFHandler<dim, spacedim>::clear();
+
+ // also release the policy. this needs to happen before the
+ // current object disappears because the policy objects
+ // store references to the DoFhandler object they work on
+ this->policy.reset();
+ }
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::initialize(const Triangulation<dim, spacedim> &tria,
+ const FiniteElement<dim, spacedim> &fe)
+{
+ this->initialize(tria, hp::FECollection<dim, spacedim>(fe));
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::initialize(const Triangulation<dim, spacedim> &tria,
+ const hp::FECollection<dim, spacedim> &fe)
+{
+ if (hp_capability_enabled)
+ {
+ this->clear();
+
+ if (this->tria != &tria)
+ {
+ for (auto &connection : this->tria_listeners)
+ connection.disconnect();
+ this->tria_listeners.clear();
+
+ this->tria = &tria;
+
+ this->setup_policy_and_listeners();
+ }
+
+ this->create_active_fe_table();
+
+ this->distribute_dofs(fe);
+ }
+ else
+ {
+ this->tria = &tria;
+ // this->faces = nullptr;
+ this->number_cache.n_global_dofs = 0;
+
+ this->setup_policy();
+
+ this->distribute_dofs(fe);
+ }
+}
+
+
+
+/*------------------------ Cell iterator functions ------------------------*/
+
+template <int dim, int spacedim>
+typename DoFHandler<dim, spacedim>::cell_iterator
+DoFHandler<dim, spacedim>::begin(const unsigned int level) const
+{
+ typename Triangulation<dim, spacedim>::cell_iterator cell =
+ this->get_triangulation().begin(level);
+ if (cell == this->get_triangulation().end(level))
+ return end(level);
+ return cell_iterator(*cell, this);
+}
+
+
+
+template <int dim, int spacedim>
+typename DoFHandler<dim, spacedim>::active_cell_iterator
+DoFHandler<dim, spacedim>::begin_active(const unsigned int level) const
+{
+ // level is checked in begin
+ cell_iterator i = begin(level);
+ if (i.state() != IteratorState::valid)
+ return i;
+ while (i->has_children())
+ if ((++i).state() != IteratorState::valid)
+ return i;
+ return i;
+}
+
+
+
+template <int dim, int spacedim>
+typename DoFHandler<dim, spacedim>::cell_iterator
+DoFHandler<dim, spacedim>::end() const
+{
+ return cell_iterator(&this->get_triangulation(), -1, -1, this);
+}
+
+
+
+template <int dim, int spacedim>
+typename DoFHandler<dim, spacedim>::cell_iterator
+DoFHandler<dim, spacedim>::end(const unsigned int level) const
+{
+ typename Triangulation<dim, spacedim>::cell_iterator cell =
+ this->get_triangulation().end(level);
+ if (cell.state() != IteratorState::valid)
+ return end();
+ return cell_iterator(*cell, this);
+}
+
+
+
+template <int dim, int spacedim>
+typename DoFHandler<dim, spacedim>::active_cell_iterator
+DoFHandler<dim, spacedim>::end_active(const unsigned int level) const
+{
+ typename Triangulation<dim, spacedim>::cell_iterator cell =
+ this->get_triangulation().end_active(level);
+ if (cell.state() != IteratorState::valid)
+ return active_cell_iterator(end());
+ return active_cell_iterator(*cell, this);
+}
+
+
+
+template <int dim, int spacedim>
+typename DoFHandler<dim, spacedim>::level_cell_iterator
+DoFHandler<dim, spacedim>::begin_mg(const unsigned int level) const
+{
+ Assert(this->has_level_dofs(),
+ ExcMessage("You can only iterate over mg "
+ "levels if mg dofs got distributed."));
+ typename Triangulation<dim, spacedim>::cell_iterator cell =
+ this->get_triangulation().begin(level);
+ if (cell == this->get_triangulation().end(level))
+ return end_mg(level);
+ return level_cell_iterator(*cell, this);
+}
+
+
+
+template <int dim, int spacedim>
+typename DoFHandler<dim, spacedim>::level_cell_iterator
+DoFHandler<dim, spacedim>::end_mg(const unsigned int level) const
+{
+ Assert(this->has_level_dofs(),
+ ExcMessage("You can only iterate over mg "
+ "levels if mg dofs got distributed."));
+ typename Triangulation<dim, spacedim>::cell_iterator cell =
+ this->get_triangulation().end(level);
+ if (cell.state() != IteratorState::valid)
+ return end();
+ return level_cell_iterator(*cell, this);
+}
+
+
+
+template <int dim, int spacedim>
+typename DoFHandler<dim, spacedim>::level_cell_iterator
+DoFHandler<dim, spacedim>::end_mg() const
+{
+ return level_cell_iterator(&this->get_triangulation(), -1, -1, this);
+}
+
+
+
+template <int dim, int spacedim>
+IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>
+DoFHandler<dim, spacedim>::cell_iterators() const
+{
+ return IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>(
+ begin(), end());
+}
+
+
+
+template <int dim, int spacedim>
+IteratorRange<typename DoFHandler<dim, spacedim>::active_cell_iterator>
+DoFHandler<dim, spacedim>::active_cell_iterators() const
+{
+ return IteratorRange<
+ typename DoFHandler<dim, spacedim>::active_cell_iterator>(begin_active(),
+ end());
+}
+
+
+
+template <int dim, int spacedim>
+IteratorRange<typename DoFHandler<dim, spacedim>::level_cell_iterator>
+DoFHandler<dim, spacedim>::mg_cell_iterators() const
+{
+ return IteratorRange<typename DoFHandler<dim, spacedim>::level_cell_iterator>(
+ begin_mg(), end_mg());
+}
+
+
+
+template <int dim, int spacedim>
+IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>
+DoFHandler<dim, spacedim>::cell_iterators_on_level(
+ const unsigned int level) const
+{
+ return IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>(
+ begin(level), end(level));
+}
+
+
+
+template <int dim, int spacedim>
+IteratorRange<typename DoFHandler<dim, spacedim>::active_cell_iterator>
+DoFHandler<dim, spacedim>::active_cell_iterators_on_level(
+ const unsigned int level) const
+{
+ return IteratorRange<
+ typename DoFHandler<dim, spacedim>::active_cell_iterator>(
+ begin_active(level), end_active(level));
+}
+
+
+
+template <int dim, int spacedim>
IteratorRange<typename DoFHandler<dim, spacedim>::level_cell_iterator>
DoFHandler<dim, spacedim>::mg_cell_iterators_on_level(
const unsigned int level) const
{
- return IteratorRange<typename DoFHandler<dim, spacedim>::level_cell_iterator>(
- begin_mg(level), end_mg(level));
+ return IteratorRange<typename DoFHandler<dim, spacedim>::level_cell_iterator>(
+ begin_mg(level), end_mg(level));
+}
+
+
+
+//---------------------------------------------------------------------------
+
+
+
+template <int dim, int spacedim>
+types::global_dof_index
+DoFHandler<dim, spacedim>::n_boundary_dofs() const
+{
+ Assert(!(dim == 2 && spacedim == 3) || hp_capability_enabled == false,
+ ExcNotImplementedWithHP());
+
+ Assert(this->fe_collection.size() > 0, ExcNoFESelected());
+
+ std::unordered_set<types::global_dof_index> boundary_dofs;
+ std::vector<types::global_dof_index> dofs_on_face;
+ dofs_on_face.reserve(this->get_fe_collection().max_dofs_per_face());
+
+ const IndexSet &owned_dofs = locally_owned_dofs();
+
+ // loop over all faces to check whether they are at a
+ // boundary. note that we need not take special care of single
+ // lines in 3d (using @p{cell->has_boundary_lines}), since we do
+ // not support boundaries of dimension dim-2, and so every
+ // boundary line is also part of a boundary face.
+ for (const auto &cell : this->active_cell_iterators())
+ if (cell->is_locally_owned() && cell->at_boundary())
+ {
+ for (auto iface : GeometryInfo<dim>::face_indices())
+ {
+ const auto face = cell->face(iface);
+ if (face->at_boundary())
+ {
+ const unsigned int dofs_per_face = cell->get_fe().dofs_per_face;
+ dofs_on_face.resize(dofs_per_face);
+
+ face->get_dof_indices(dofs_on_face, cell->active_fe_index());
+ for (unsigned int i = 0; i < dofs_per_face; ++i)
+ {
+ const unsigned int global_idof_index = dofs_on_face[i];
+ if (owned_dofs.is_element(global_idof_index))
+ {
+ boundary_dofs.insert(global_idof_index);
+ }
+ }
+ }
+ }
+ }
+ return boundary_dofs.size();
+}
+
+
+
+template <int dim, int spacedim>
+types::global_dof_index
+DoFHandler<dim, spacedim>::n_boundary_dofs(
+ const std::set<types::boundary_id> &boundary_ids) const
+{
+ Assert(!(dim == 2 && spacedim == 3) || hp_capability_enabled == false,
+ ExcNotImplementedWithHP());
+
+ Assert(this->fe_collection.size() > 0, ExcNoFESelected());
+ Assert(boundary_ids.find(numbers::internal_face_boundary_id) ==
+ boundary_ids.end(),
+ ExcInvalidBoundaryIndicator());
+
+ // same as above, but with additional checks for set of boundary
+ // indicators
+ std::unordered_set<types::global_dof_index> boundary_dofs;
+ std::vector<types::global_dof_index> dofs_on_face;
+ dofs_on_face.reserve(this->get_fe_collection().max_dofs_per_face());
+
+ const IndexSet &owned_dofs = locally_owned_dofs();
+
+ for (const auto &cell : this->active_cell_iterators())
+ if (cell->is_locally_owned() && cell->at_boundary())
+ {
+ for (auto iface : GeometryInfo<dim>::face_indices())
+ {
+ const auto face = cell->face(iface);
+ const unsigned int boundary_id = face->boundary_id();
+ if (face->at_boundary() &&
+ (boundary_ids.find(boundary_id) != boundary_ids.end()))
+ {
+ const unsigned int dofs_per_face = cell->get_fe().dofs_per_face;
+ dofs_on_face.resize(dofs_per_face);
+
+ face->get_dof_indices(dofs_on_face, cell->active_fe_index());
+ for (unsigned int i = 0; i < dofs_per_face; ++i)
+ {
+ const unsigned int global_idof_index = dofs_on_face[i];
+ if (owned_dofs.is_element(global_idof_index))
+ {
+ boundary_dofs.insert(global_idof_index);
+ }
+ }
+ }
+ }
+ }
+ return boundary_dofs.size();
+}
+
+
+
+template <int dim, int spacedim>
+std::size_t
+DoFHandler<dim, spacedim>::memory_consumption() const
+{
+ std::size_t mem = MemoryConsumption::memory_consumption(this->tria) +
+ MemoryConsumption::memory_consumption(this->fe_collection) +
+ MemoryConsumption::memory_consumption(this->number_cache);
+
+ mem += MemoryConsumption::memory_consumption(cell_dof_cache_indices) +
+ MemoryConsumption::memory_consumption(cell_dof_cache_ptr) +
+ MemoryConsumption::memory_consumption(object_dof_indices) +
+ MemoryConsumption::memory_consumption(object_dof_ptr) +
+ MemoryConsumption::memory_consumption(hp_object_fe_indices) +
+ MemoryConsumption::memory_consumption(hp_object_fe_ptr) +
+ MemoryConsumption::memory_consumption(hp_cell_active_fe_indices) +
+ MemoryConsumption::memory_consumption(hp_cell_future_fe_indices);
+
+
+ if (hp_capability_enabled)
+ {
+ // nothing to add
+ }
+ else
+ {
+ // collect size of multigrid data structures
+
+ mem += MemoryConsumption::memory_consumption(this->block_info_object);
+
+ for (unsigned int level = 0; level < this->mg_levels.size(); ++level)
+ mem += this->mg_levels[level]->memory_consumption();
+
+ if (this->mg_faces != nullptr)
+ mem += MemoryConsumption::memory_consumption(*this->mg_faces);
+
+ for (unsigned int i = 0; i < this->mg_vertex_dofs.size(); ++i)
+ mem += sizeof(MGVertexDoFs) +
+ (1 + this->mg_vertex_dofs[i].get_finest_level() -
+ this->mg_vertex_dofs[i].get_coarsest_level()) *
+ sizeof(types::global_dof_index);
+ }
+
+ return mem;
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::set_fe(const FiniteElement<dim, spacedim> &fe)
+{
+ this->set_fe(hp::FECollection<dim, spacedim>(fe));
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::set_fe(const hp::FECollection<dim, spacedim> &ff)
+{
+ Assert(
+ this->tria != nullptr,
+ ExcMessage(
+ "You need to set the Triangulation in the DoFHandler using initialize() or "
+ "in the constructor before you can distribute DoFs."));
+ Assert(this->tria->n_levels() > 0,
+ ExcMessage("The Triangulation you are using is empty!"));
+ Assert(ff.size() > 0, ExcMessage("The hp::FECollection given is empty!"));
+
+ // don't create a new object if the one we have is already appropriate
+ if (this->fe_collection != ff)
+ this->fe_collection = hp::FECollection<dim, spacedim>(ff);
+
+ if (hp_capability_enabled)
+ {
+ // ensure that the active_fe_indices vectors are initialized correctly
+ this->create_active_fe_table();
+
+ // make sure every processor knows the active_fe_indices
+ // on both its own cells and all ghost cells
+ dealii::internal::hp::DoFHandlerImplementation::Implementation::
+ communicate_active_fe_indices(*this);
+
+ // make sure that the fe collection is large enough to
+ // cover all fe indices presently in use on the mesh
+ for (const auto &cell : this->active_cell_iterators())
+ if (!cell->is_artificial())
+ Assert(cell->active_fe_index() < this->fe_collection.size(),
+ ExcInvalidFEIndex(cell->active_fe_index(),
+ this->fe_collection.size()));
+ }
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::distribute_dofs(
+ const FiniteElement<dim, spacedim> &fe)
+{
+ this->distribute_dofs(hp::FECollection<dim, spacedim>(fe));
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::distribute_dofs(
+ const hp::FECollection<dim, spacedim> &ff)
+{
+ if (hp_capability_enabled)
+ {
+ object_dof_indices.resize(this->tria->n_levels());
+ object_dof_ptr.resize(this->tria->n_levels());
+ cell_dof_cache_indices.resize(this->tria->n_levels());
+ cell_dof_cache_ptr.resize(this->tria->n_levels());
+ hp_cell_active_fe_indices.resize(this->tria->n_levels());
+ hp_cell_future_fe_indices.resize(this->tria->n_levels());
+ // assign the fe_collection and initialize all active_fe_indices
+ this->set_fe(ff);
+
+ // If an underlying shared::Tria allows artificial cells,
+ // then save the current set of subdomain ids, and set
+ // subdomain ids to the "true" owner of each cell. we later
+ // restore these flags
+ std::vector<types::subdomain_id> saved_subdomain_ids;
+ const parallel::shared::Triangulation<dim, spacedim> *shared_tria =
+ (dynamic_cast<const parallel::shared::Triangulation<dim, spacedim> *>(
+ &this->get_triangulation()));
+ if (shared_tria != nullptr && shared_tria->with_artificial_cells())
+ {
+ saved_subdomain_ids.resize(shared_tria->n_active_cells());
+
+ const std::vector<types::subdomain_id> &true_subdomain_ids =
+ shared_tria->get_true_subdomain_ids_of_cells();
+
+ for (const auto &cell : shared_tria->active_cell_iterators())
+ {
+ const unsigned int index = cell->active_cell_index();
+ saved_subdomain_ids[index] = cell->subdomain_id();
+ cell->set_subdomain_id(true_subdomain_ids[index]);
+ }
+ }
+
+ // then allocate space for all the other tables
+ dealii::internal::hp::DoFHandlerImplementation::Implementation::
+ reserve_space(*this);
+
+ // now undo the subdomain modification
+ if (shared_tria != nullptr && shared_tria->with_artificial_cells())
+ for (const auto &cell : shared_tria->active_cell_iterators())
+ cell->set_subdomain_id(
+ saved_subdomain_ids[cell->active_cell_index()]);
+
+
+ // Clear user flags because we will need them. But first we save
+ // them and make sure that we restore them later such that at the
+ // end of this function the Triangulation will be in the same
+ // state as it was at the beginning of this function.
+ std::vector<bool> user_flags;
+ this->tria->save_user_flags(user_flags);
+ const_cast<Triangulation<dim, spacedim> &>(*this->tria)
+ .clear_user_flags();
+
+
+ /////////////////////////////////
+
+ // Now for the real work:
+ this->number_cache = this->policy->distribute_dofs();
+
+ /////////////////////////////////
+
+ // do some housekeeping: compress indices
+ //{
+ // Threads::TaskGroup<> tg;
+ // for (int level = this->levels_hp.size() - 1; level >= 0; --level)
+ // tg += Threads::new_task(
+ // &dealii::internal::hp::DoFLevel::compress_data<dim, spacedim>,
+ // *this->levels_hp[level],
+ // this->fe_collection);
+ // tg.join_all();
+ //}
+
+ // finally restore the user flags
+ const_cast<Triangulation<dim, spacedim> &>(*this->tria)
+ .load_user_flags(user_flags);
+ }
+ else
+ {
+ // first, assign the finite_element
+ this->set_fe(ff);
+
+ // delete all levels and set them up newly. note that we still have to
+ // allocate space for all degrees of freedom on this mesh (including ghost
+ // and cells that are entirely stored on different processors), though we
+ // may not assign numbers to some of them (i.e. they will remain at
+ // invalid_dof_index). We need to allocate the space because we will want
+ // to be able to query the dof_indices on each cell, and simply be told
+ // that we don't know them on some cell (i.e. get back invalid_dof_index)
+ this->clear_space();
+ object_dof_indices.resize(this->tria->n_levels());
+ object_dof_ptr.resize(this->tria->n_levels());
+ cell_dof_cache_indices.resize(this->tria->n_levels());
+ cell_dof_cache_ptr.resize(this->tria->n_levels());
+ internal::DoFHandlerImplementation::Implementation::reserve_space(*this);
+
+ // hand things off to the policy
+ this->number_cache = this->policy->distribute_dofs();
+
+ // initialize the block info object only if this is a sequential
+ // triangulation. it doesn't work correctly yet if it is parallel
+ if (dynamic_cast<
+ const parallel::DistributedTriangulationBase<dim, spacedim> *>(
+ &*this->tria) == nullptr)
+ this->block_info_object.initialize(*this, false, true);
+ }
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::distribute_mg_dofs()
+{
+ AssertThrow(hp_capability_enabled == false, ExcNotImplementedWithHP());
+
+ Assert(
+ this->object_dof_indices.size() > 0,
+ ExcMessage(
+ "Distribute active DoFs using distribute_dofs() before calling distribute_mg_dofs()."));
+
+ Assert(
+ ((this->tria->get_mesh_smoothing() &
+ Triangulation<dim, spacedim>::limit_level_difference_at_vertices) !=
+ Triangulation<dim, spacedim>::none),
+ ExcMessage(
+ "The mesh smoothing requirement 'limit_level_difference_at_vertices' has to be set for using multigrid!"));
+
+ this->clear_mg_space();
+
+ internal::DoFHandlerImplementation::Implementation::reserve_space_mg(*this);
+ this->mg_number_cache = this->policy->distribute_mg_dofs();
+
+ // initialize the block info object only if this is a sequential
+ // triangulation. it doesn't work correctly yet if it is parallel
+ if (dynamic_cast<const parallel::TriangulationBase<dim, spacedim> *>(
+ &*this->tria) == nullptr)
+ this->block_info_object.initialize(*this, true, false);
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::initialize_local_block_info()
+{
+ AssertThrow(hp_capability_enabled == false, ExcNotImplementedWithHP());
+
+ this->block_info_object.initialize_local(*this);
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::setup_policy()
+{
+ // decide whether we need a sequential or a parallel distributed policy
+ if (dynamic_cast<const dealii::parallel::shared::Triangulation<dim, spacedim>
+ *>(&this->get_triangulation()) != nullptr)
+ this->policy =
+ std::make_unique<internal::DoFHandlerImplementation::Policy::
+ ParallelShared<DoFHandler<dim, spacedim>>>(*this);
+ else if (dynamic_cast<
+ const dealii::parallel::DistributedTriangulationBase<dim, spacedim>
+ *>(&this->get_triangulation()) == nullptr)
+ this->policy =
+ std::make_unique<internal::DoFHandlerImplementation::Policy::Sequential<
+ DoFHandler<dim, spacedim>>>(*this);
+ else
+ this->policy =
+ std::make_unique<internal::DoFHandlerImplementation::Policy::
+ ParallelDistributed<DoFHandler<dim, spacedim>>>(*this);
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::clear()
+{
+ if (hp_capability_enabled)
+ {
+ // release memory
+ this->clear_space();
+ }
+ else
+ {
+ // release memory
+ this->clear_space();
+ this->clear_mg_space();
+ }
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::clear_space()
+{
+ cell_dof_cache_indices.clear();
+
+ cell_dof_cache_ptr.clear();
+
+ object_dof_indices.clear();
+
+ object_dof_ptr.clear();
+
+ if (hp_capability_enabled)
+ {
+ this->hp_cell_active_fe_indices.clear();
+ this->hp_cell_future_fe_indices.clear();
+
+ object_dof_indices.clear();
+ }
+ else
+ {
+ this->number_cache.clear();
+ }
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::clear_mg_space()
+{
+ this->mg_levels.clear();
+ this->mg_faces.reset();
+
+ std::vector<MGVertexDoFs> tmp;
+
+ std::swap(this->mg_vertex_dofs, tmp);
+
+ this->mg_number_cache.clear();
+}
+
+
+
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::renumber_dofs(
+ const std::vector<types::global_dof_index> &new_numbers)
+{
+ if (hp_capability_enabled)
+ {
+ Assert(this->hp_cell_future_fe_indices.size() > 0,
+ ExcMessage(
+ "You need to distribute DoFs before you can renumber them."));
+
+ AssertDimension(new_numbers.size(), this->n_locally_owned_dofs());
+
+#ifdef DEBUG
+ // assert that the new indices are consecutively numbered if we are
+ // working on a single processor. this doesn't need to
+ // hold in the case of a parallel mesh since we map the interval
+ // [0...n_dofs()) into itself but only globally, not on each processor
+ if (this->n_locally_owned_dofs() == this->n_dofs())
+ {
+ std::vector<types::global_dof_index> tmp(new_numbers);
+ std::sort(tmp.begin(), tmp.end());
+ std::vector<types::global_dof_index>::const_iterator p = tmp.begin();
+ types::global_dof_index i = 0;
+ for (; p != tmp.end(); ++p, ++i)
+ Assert(*p == i, ExcNewNumbersNotConsecutive(i));
+ }
+ else
+ for (const auto new_number : new_numbers)
+ Assert(new_number < this->n_dofs(),
+ ExcMessage(
+ "New DoF index is not less than the total number of dofs."));
+#endif
+
+ // uncompress the internal storage scheme of dofs on cells so that
+ // we can access dofs in turns. uncompress in parallel, starting
+ // with the most expensive levels (the highest ones)
+ //{
+ // Threads::TaskGroup<> tg;
+ // for (int level = this->levels_hp.size() - 1; level >= 0; --level)
+ // tg += Threads::new_task(
+ // &dealii::internal::hp::DoFLevel::uncompress_data<dim, spacedim>,
+ // *this->levels_hp[level],
+ // this->fe_collection);
+ // tg.join_all();
+ //}
+
+ // do the renumbering
+ this->number_cache = this->policy->renumber_dofs(new_numbers);
+
+ // now re-compress the dof indices
+ //{
+ // Threads::TaskGroup<> tg;
+ // for (int level = this->levels_hp.size() - 1; level >= 0; --level)
+ // tg += Threads::new_task(
+ // &dealii::internal::hp::DoFLevel::compress_data<dim, spacedim>,
+ // *this->levels_hp[level],
+ // this->fe_collection);
+ // tg.join_all();
+ //}
+ }
+ else
+ {
+ Assert(this->object_dof_indices.size() > 0,
+ ExcMessage(
+ "You need to distribute DoFs before you can renumber them."));
+
+#ifdef DEBUG
+ if (dynamic_cast<const parallel::shared::Triangulation<dim, spacedim> *>(
+ &*this->tria) != nullptr)
+ {
+ Assert(new_numbers.size() == this->n_dofs() ||
+ new_numbers.size() == this->n_locally_owned_dofs(),
+ ExcMessage("Incorrect size of the input array."));
+ }
+ else if (dynamic_cast<
+ const parallel::DistributedTriangulationBase<dim, spacedim> *>(
+ &*this->tria) != nullptr)
+ {
+ AssertDimension(new_numbers.size(), this->n_locally_owned_dofs());
+ }
+ else
+ {
+ AssertDimension(new_numbers.size(), this->n_dofs());
+ }
+
+ // assert that the new indices are consecutively numbered if we are
+ // working on a single processor. this doesn't need to
+ // hold in the case of a parallel mesh since we map the interval
+ // [0...n_dofs()) into itself but only globally, not on each processor
+ if (this->n_locally_owned_dofs() == this->n_dofs())
+ {
+ std::vector<types::global_dof_index> tmp(new_numbers);
+ std::sort(tmp.begin(), tmp.end());
+ std::vector<types::global_dof_index>::const_iterator p = tmp.begin();
+ types::global_dof_index i = 0;
+ for (; p != tmp.end(); ++p, ++i)
+ Assert(*p == i, ExcNewNumbersNotConsecutive(i));
+ }
+ else
+ for (const auto new_number : new_numbers)
+ Assert(new_number < this->n_dofs(),
+ ExcMessage(
+ "New DoF index is not less than the total number of dofs."));
+#endif
+
+ this->number_cache = this->policy->renumber_dofs(new_numbers);
+ }
}
-//---------------------------------------------------------------------------
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::renumber_dofs(
+ const unsigned int level,
+ const std::vector<types::global_dof_index> &new_numbers)
+{
+ AssertThrow(hp_capability_enabled == false, ExcNotImplementedWithHP());
+
+ Assert(
+ this->mg_levels.size() > 0 && this->object_dof_indices.size() > 0,
+ ExcMessage(
+ "You need to distribute active and level DoFs before you can renumber level DoFs."));
+ AssertIndexRange(level, this->get_triangulation().n_global_levels());
+ AssertDimension(new_numbers.size(),
+ this->locally_owned_mg_dofs(level).n_elements());
+
+#ifdef DEBUG
+ // assert that the new indices are consecutively numbered if we are working
+ // on a single processor. this doesn't need to hold in the case of a
+ // parallel mesh since we map the interval [0...n_dofs(level)) into itself
+ // but only globally, not on each processor
+ if (this->n_locally_owned_dofs() == this->n_dofs())
+ {
+ std::vector<types::global_dof_index> tmp(new_numbers);
+ std::sort(tmp.begin(), tmp.end());
+ std::vector<types::global_dof_index>::const_iterator p = tmp.begin();
+ types::global_dof_index i = 0;
+ for (; p != tmp.end(); ++p, ++i)
+ Assert(*p == i, ExcNewNumbersNotConsecutive(i));
+ }
+ else
+ for (const auto new_number : new_numbers)
+ Assert(new_number < this->n_dofs(level),
+ ExcMessage(
+ "New DoF index is not less than the total number of dofs."));
+#endif
+
+ this->mg_number_cache[level] =
+ this->policy->renumber_mg_dofs(level, new_numbers);
+}
template <int dim, int spacedim>
-types::global_dof_index
-DoFHandler<dim, spacedim>::n_boundary_dofs() const
+unsigned int
+DoFHandler<dim, spacedim>::max_couplings_between_boundary_dofs() const
{
- const FiniteElement<dim, spacedim> &fe = get_fe();
- const unsigned int dofs_per_face = fe.n_dofs_per_face();
- std::vector<dealii::types::global_dof_index> dofs_on_face(dofs_per_face);
+ Assert(this->fe_collection.size() > 0, ExcNoFESelected());
- const IndexSet &owned_dofs = locally_owned_dofs();
-
- std::unordered_set<unsigned int> boundary_dof_indices;
- // Loop over all faces of all cells and see whether they are at a boundary.
- // note (i) that we visit interior faces twice (which we don't care about) but
- // exterior faces only once as is appropriate, and (ii) that we need not take
- // special care of single lines (using @p{cell->has_boundary_lines}), since we
- // do not support boundaries of dimension dim-2, and so every boundary line is
- // also part of a boundary face.
- for (const auto &cell : this->active_cell_iterators())
+ switch (dim)
{
- if (cell->is_locally_owned() && cell->at_boundary())
- {
- for (const unsigned int iface :
- dealii::GeometryInfo<dim>::face_indices())
- {
- const auto face = cell->face(iface);
- if (face->at_boundary())
- {
- cell->face(iface)->get_dof_indices(dofs_on_face);
- for (unsigned int idof_face = 0; idof_face < dofs_per_face;
- ++idof_face)
- {
- const unsigned int global_idof_index =
- dofs_on_face[idof_face];
-
- // If dof is not already in our hashmap, then insert it
- // into our set of surface indices. However, do not add if
- // it is not locally owned, it will get picked up by
- // another processor
- if (owned_dofs.is_element(global_idof_index))
- {
- boundary_dof_indices.insert(global_idof_index);
- }
- }
- }
- }
- }
+ case 1:
+ return this->fe_collection.max_dofs_per_vertex();
+ case 2:
+ return (3 * this->fe_collection.max_dofs_per_vertex() +
+ 2 * this->fe_collection.max_dofs_per_line());
+ case 3:
+ // we need to take refinement of one boundary face into
+ // consideration here; in fact, this function returns what
+ // #max_coupling_between_dofs<2> returns
+ //
+ // we assume here, that only four faces meet at the boundary;
+ // this assumption is not justified and needs to be fixed some
+ // time. fortunately, omitting it for now does no harm since
+ // the matrix will cry foul if its requirements are not
+ // satisfied
+ return (19 * this->fe_collection.max_dofs_per_vertex() +
+ 28 * this->fe_collection.max_dofs_per_line() +
+ 8 * this->fe_collection.max_dofs_per_quad());
+ default:
+ Assert(false, ExcNotImplemented());
+ return 0;
}
- return boundary_dof_indices.size();
}
template <int dim, int spacedim>
-types::global_dof_index
-DoFHandler<dim, spacedim>::n_boundary_dofs(
- const std::set<types::boundary_id> &boundary_ids) const
+unsigned int
+DoFHandler<dim, spacedim>::max_couplings_between_dofs() const
{
- Assert(boundary_ids.find(numbers::internal_face_boundary_id) ==
- boundary_ids.end(),
- ExcInvalidBoundaryIndicator());
+ Assert(this->fe_collection.size() > 0, ExcNoFESelected());
+ return internal::DoFHandlerImplementation::Implementation::
+ max_couplings_between_dofs(*this);
+}
- const FiniteElement<dim, spacedim> &fe = get_fe();
- const unsigned int dofs_per_face = fe.n_dofs_per_face();
- std::vector<dealii::types::global_dof_index> dofs_on_face(dofs_per_face);
- const IndexSet &owned_dofs = locally_owned_dofs();
- std::unordered_set<unsigned int> boundary_dof_indices;
- // Loop over all faces of all cells and see whether they are at a boundary.
- // note (i) that we visit interior faces twice (which we don't care about) but
- // exterior faces only once as is appropriate, and (ii) that we need not take
- // special care of single lines (using @p{cell->has_boundary_lines}), since we
- // do not support boundaries of dimension dim-2, and so every boundary line is
- // also part of a boundary face.
- for (const auto &cell : this->active_cell_iterators())
+template <int dim, int spacedim>
+template <int structdim>
+types::global_dof_index
+DoFHandler<dim, spacedim>::get_dof_index(const unsigned int obj_level,
+ const unsigned int obj_index,
+ const unsigned int fe_index,
+ const unsigned int local_index) const
+{
+ if (hp_capability_enabled)
{
- if (cell->is_locally_owned() && cell->at_boundary())
- {
- for (const unsigned int iface :
- dealii::GeometryInfo<dim>::face_indices())
- {
- const auto face = cell->face(iface);
- const unsigned int boundary_id = face->boundary_id();
-
- if (face->at_boundary() &&
- boundary_ids.find(boundary_id) != boundary_ids.end())
- {
- cell->face(iface)->get_dof_indices(dofs_on_face);
- for (unsigned int idof_face = 0; idof_face < dofs_per_face;
- ++idof_face)
- {
- const unsigned int global_idof_index =
- dofs_on_face[idof_face];
-
- // If dof is not already in our hashmap, then insert it
- // into our set of surface indices. However, do not add if
- // it is not locally owned, it will get picked up by
- // another processor
- if (owned_dofs.is_element(global_idof_index))
- {
- boundary_dof_indices.insert(global_idof_index);
- }
- }
- }
- }
- }
+ Assert(false, ExcNotImplemented());
+ return numbers::invalid_dof_index;
+ }
+ else
+ {
+ return internal::DoFHandlerImplementation::Implementation::get_dof_index(
+ *this,
+ this->mg_levels[obj_level],
+ this->mg_faces,
+ obj_index,
+ fe_index,
+ local_index,
+ std::integral_constant<int, structdim>());
}
- return boundary_dof_indices.size();
}
template <int dim, int spacedim>
-std::size_t
-DoFHandler<dim, spacedim>::memory_consumption() const
+template <int structdim>
+void
+DoFHandler<dim, spacedim>::set_dof_index(
+ const unsigned int obj_level,
+ const unsigned int obj_index,
+ const unsigned int fe_index,
+ const unsigned int local_index,
+ const types::global_dof_index global_index) const
{
- std::size_t mem =
- (MemoryConsumption::memory_consumption(tria) +
- MemoryConsumption::memory_consumption(fe_collection) +
- MemoryConsumption::memory_consumption(block_info_object) +
- MemoryConsumption::memory_consumption(levels) +
- MemoryConsumption::memory_consumption(*faces) +
- MemoryConsumption::memory_consumption(faces) + sizeof(number_cache) +
- MemoryConsumption::memory_consumption(mg_number_cache) +
- MemoryConsumption::memory_consumption(vertex_dofs));
- for (unsigned int i = 0; i < levels.size(); ++i)
- mem += MemoryConsumption::memory_consumption(*levels[i]);
-
- for (unsigned int level = 0; level < mg_levels.size(); ++level)
- mem += mg_levels[level]->memory_consumption();
-
- if (mg_faces != nullptr)
- mem += MemoryConsumption::memory_consumption(*mg_faces);
-
- for (unsigned int i = 0; i < mg_vertex_dofs.size(); ++i)
- mem += sizeof(MGVertexDoFs) + (1 + mg_vertex_dofs[i].get_finest_level() -
- mg_vertex_dofs[i].get_coarsest_level()) *
- sizeof(types::global_dof_index);
-
- return mem;
+ if (hp_capability_enabled)
+ {
+ Assert(false, ExcNotImplemented());
+ return;
+ }
+ else
+ {
+ internal::DoFHandlerImplementation::Implementation::set_dof_index(
+ *this,
+ this->mg_levels[obj_level],
+ this->mg_faces,
+ obj_index,
+ fe_index,
+ local_index,
+ global_index,
+ std::integral_constant<int, structdim>());
+ }
}
template <int dim, int spacedim>
void
-DoFHandler<dim, spacedim>::set_fe(const FiniteElement<dim, spacedim> &ff)
+DoFHandler<dim, spacedim>::set_active_fe_indices(
+ const std::vector<unsigned int> &active_fe_indices)
{
- // Only recreate the FECollection if we don't already store
- // the exact same FiniteElement object.
- if (fe_collection.size() == 0 || fe_collection[0] != ff)
- fe_collection = hp::FECollection<dim, spacedim>(ff);
+ Assert(active_fe_indices.size() == this->get_triangulation().n_active_cells(),
+ ExcDimensionMismatch(active_fe_indices.size(),
+ this->get_triangulation().n_active_cells()));
+
+ this->create_active_fe_table();
+ // we could set the values directly, since they are stored as
+ // protected data of this object, but for simplicity we use the
+ // cell-wise access. this way we also have to pass some debug-mode
+ // tests which we would have to duplicate ourselves otherwise
+ for (const auto &cell : this->active_cell_iterators())
+ if (cell->is_locally_owned())
+ cell->set_active_fe_index(active_fe_indices[cell->active_cell_index()]);
}
template <int dim, int spacedim>
void
-DoFHandler<dim, spacedim>::distribute_dofs(
- const FiniteElement<dim, spacedim> &ff)
+DoFHandler<dim, spacedim>::get_active_fe_indices(
+ std::vector<unsigned int> &active_fe_indices) const
{
- Assert(
- tria != nullptr,
- ExcMessage(
- "You need to set the Triangulation in the DoFHandler using initialize() or "
- "in the constructor before you can distribute DoFs."));
- Assert(tria->n_levels() > 0,
- ExcMessage("The Triangulation you are using is empty!"));
+ active_fe_indices.resize(this->get_triangulation().n_active_cells());
- // first, assign the finite_element
- set_fe(ff);
-
- // delete all levels and set them
- // up newly. note that we still
- // have to allocate space for all
- // degrees of freedom on this mesh
- // (including ghost and cells that
- // are entirely stored on different
- // processors), though we may not
- // assign numbers to some of them
- // (i.e. they will remain at
- // invalid_dof_index). We need to
- // allocate the space because we
- // will want to be able to query
- // the dof_indices on each cell,
- // and simply be told that we don't
- // know them on some cell (i.e. get
- // back invalid_dof_index)
- clear_space();
- internal::DoFHandlerImplementation::Implementation::reserve_space(*this);
-
- // hand things off to the policy
- number_cache = policy->distribute_dofs();
-
- // initialize the block info object
- // only if this is a sequential
- // triangulation. it doesn't work
- // correctly yet if it is parallel
- if (dynamic_cast<const parallel::DistributedTriangulationBase<dim, spacedim>
- *>(&*tria) == nullptr)
- block_info_object.initialize(*this, false, true);
+ // we could try to extract the values directly, since they are
+ // stored as protected data of this object, but for simplicity we
+ // use the cell-wise access.
+ for (const auto &cell : this->active_cell_iterators())
+ if (!cell->is_artificial())
+ active_fe_indices[cell->active_cell_index()] = cell->active_fe_index();
}
template <int dim, int spacedim>
void
-DoFHandler<dim, spacedim>::distribute_mg_dofs()
+DoFHandler<dim, spacedim>::setup_policy_and_listeners()
{
- Assert(
- levels.size() > 0,
- ExcMessage(
- "Distribute active DoFs using distribute_dofs() before calling distribute_mg_dofs()."));
-
- Assert(
- ((tria->get_mesh_smoothing() &
- Triangulation<dim, spacedim>::limit_level_difference_at_vertices) !=
- Triangulation<dim, spacedim>::none),
- ExcMessage(
- "The mesh smoothing requirement 'limit_level_difference_at_vertices' has to be set for using multigrid!"));
-
- clear_mg_space();
-
- internal::DoFHandlerImplementation::Implementation::reserve_space_mg(*this);
- mg_number_cache = policy->distribute_mg_dofs();
-
- // initialize the block info object
- // only if this is a sequential
- // triangulation. it doesn't work
- // correctly yet if it is parallel
- if (dynamic_cast<const parallel::TriangulationBase<dim, spacedim> *>(
- &*tria) == nullptr)
- block_info_object.initialize(*this, true, false);
+ // connect functions to signals of the underlying triangulation
+ this->tria_listeners.push_back(this->tria->signals.pre_refinement.connect(
+ [this]() { this->pre_refinement_action(); }));
+ this->tria_listeners.push_back(this->tria->signals.post_refinement.connect(
+ [this]() { this->post_refinement_action(); }));
+ this->tria_listeners.push_back(this->tria->signals.create.connect(
+ [this]() { this->post_refinement_action(); }));
+
+ // decide whether we need a sequential or a parallel shared/distributed
+ // policy and attach corresponding callback functions dealing with the
+ // transfer of active_fe_indices
+ if (dynamic_cast<
+ const dealii::parallel::distributed::Triangulation<dim, spacedim> *>(
+ &this->get_triangulation()))
+ {
+ this->policy =
+ std::make_unique<internal::DoFHandlerImplementation::Policy::
+ ParallelDistributed<DoFHandler<dim, spacedim>>>(
+ *this);
+
+ // repartitioning signals
+ this->tria_listeners.push_back(
+ this->tria->signals.pre_distributed_repartition.connect([this]() {
+ internal::hp::DoFHandlerImplementation::Implementation::
+ ensure_absence_of_future_fe_indices<dim, spacedim>(*this);
+ }));
+ this->tria_listeners.push_back(
+ this->tria->signals.pre_distributed_repartition.connect(
+ [this]() { this->pre_distributed_active_fe_index_transfer(); }));
+ this->tria_listeners.push_back(
+ this->tria->signals.post_distributed_repartition.connect(
+ [this] { this->post_distributed_active_fe_index_transfer(); }));
+
+ // refinement signals
+ this->tria_listeners.push_back(
+ this->tria->signals.pre_distributed_refinement.connect(
+ [this]() { this->pre_distributed_active_fe_index_transfer(); }));
+ this->tria_listeners.push_back(
+ this->tria->signals.post_distributed_refinement.connect(
+ [this]() { this->post_distributed_active_fe_index_transfer(); }));
+
+ // serialization signals
+ this->tria_listeners.push_back(
+ this->tria->signals.post_distributed_save.connect([this]() {
+ this->post_distributed_serialization_of_active_fe_indices();
+ }));
+ }
+ else if (dynamic_cast<
+ const dealii::parallel::shared::Triangulation<dim, spacedim> *>(
+ &this->get_triangulation()) != nullptr)
+ {
+ this->policy =
+ std::make_unique<internal::DoFHandlerImplementation::Policy::
+ ParallelShared<DoFHandler<dim, spacedim>>>(*this);
+
+ // partitioning signals
+ this->tria_listeners.push_back(
+ this->tria->signals.pre_partition.connect([this]() {
+ internal::hp::DoFHandlerImplementation::Implementation::
+ ensure_absence_of_future_fe_indices(*this);
+ }));
+
+ // refinement signals
+ this->tria_listeners.push_back(this->tria->signals.pre_refinement.connect(
+ [this] { this->pre_active_fe_index_transfer(); }));
+ this->tria_listeners.push_back(
+ this->tria->signals.post_refinement.connect(
+ [this] { this->post_active_fe_index_transfer(); }));
+ }
+ else
+ {
+ this->policy =
+ std::make_unique<internal::DoFHandlerImplementation::Policy::Sequential<
+ DoFHandler<dim, spacedim>>>(*this);
+
+ // refinement signals
+ this->tria_listeners.push_back(this->tria->signals.pre_refinement.connect(
+ [this] { this->pre_active_fe_index_transfer(); }));
+ this->tria_listeners.push_back(
+ this->tria->signals.post_refinement.connect(
+ [this] { this->post_active_fe_index_transfer(); }));
+ }
}
template <int dim, int spacedim>
void
-DoFHandler<dim, spacedim>::clear_mg_space()
+DoFHandler<dim, spacedim>::create_active_fe_table()
{
- mg_levels.clear();
- mg_faces.reset();
+ AssertThrow(hp_capability_enabled == true, ExcNotAvailableWithoutHP());
- std::vector<MGVertexDoFs> tmp;
- std::swap(mg_vertex_dofs, tmp);
+ // Create sufficiently many hp::DoFLevels.
+ // while (this->levels_hp.size() < this->tria->n_levels())
+ // this->levels_hp.emplace_back(new dealii::internal::hp::DoFLevel);
- mg_number_cache.clear();
-}
+ while (this->hp_cell_active_fe_indices.size() < this->tria->n_levels())
+ this->hp_cell_active_fe_indices.push_back({});
+ while (this->hp_cell_future_fe_indices.size() < this->tria->n_levels())
+ this->hp_cell_future_fe_indices.push_back({});
-template <int dim, int spacedim>
-void
-DoFHandler<dim, spacedim>::initialize_local_block_info()
-{
- block_info_object.initialize_local(*this);
+ // then make sure that on each level we have the appropriate size
+ // of active_fe_indices; preset them to zero, i.e. the default FE
+ for (unsigned int level = 0; level < this->hp_cell_future_fe_indices.size();
+ ++level)
+ {
+ if (this->hp_cell_active_fe_indices[level].size() == 0 &&
+ this->hp_cell_future_fe_indices[level].size() == 0)
+ {
+ this->hp_cell_active_fe_indices[level].resize(
+ this->tria->n_raw_cells(level), 0);
+ this->hp_cell_future_fe_indices[level].resize(
+ this->tria->n_raw_cells(level), invalid_active_fe_index);
+ }
+ else
+ {
+ // Either the active_fe_indices have size zero because
+ // they were just created, or the correct size. Other
+ // sizes indicate that something went wrong.
+ Assert(this->hp_cell_active_fe_indices[level].size() ==
+ this->tria->n_raw_cells(level) &&
+ this->hp_cell_future_fe_indices[level].size() ==
+ this->tria->n_raw_cells(level),
+ ExcInternalError());
+ }
+
+ // it may be that the previous table was compressed; in that
+ // case, restore the correct active_fe_index. the fact that
+ // this no longer matches the indices in the table is of no
+ // importance because the current function is called at a
+ // point where we have to recreate the dof_indices tables in
+ // the levels anyway
+ // this->levels_hp[level]->normalize_active_fe_indices();
+ }
}
template <int dim, int spacedim>
void
-DoFHandler<dim, spacedim>::clear()
+DoFHandler<dim, spacedim>::pre_refinement_action()
{
- // release memory
- clear_space();
- clear_mg_space();
+ create_active_fe_table();
}
template <int dim, int spacedim>
void
-DoFHandler<dim, spacedim>::renumber_dofs(
- const std::vector<types::global_dof_index> &new_numbers)
+DoFHandler<dim, spacedim>::post_refinement_action()
{
- Assert(levels.size() > 0,
- ExcMessage(
- "You need to distribute DoFs before you can renumber them."));
+ // // Normally only one level is added, but if this Triangulation
+ // // is created by copy_triangulation, it can be more than one level.
+ // while (this->levels_hp.size() < this->tria->n_levels())
+ // this->levels_hp.emplace_back(new dealii::internal::hp::DoFLevel);
+ //
+ // // Coarsening can lead to the loss of levels. Hence remove them.
+ // while (this->levels_hp.size() > this->tria->n_levels())
+ // {
+ // // drop the last element. that also releases the memory pointed to
+ // this->levels_hp.pop_back();
+ // }
-#ifdef DEBUG
- if (dynamic_cast<const parallel::shared::Triangulation<dim, spacedim> *>(
- &*tria) != nullptr)
- {
- Assert(new_numbers.size() == n_dofs() ||
- new_numbers.size() == n_locally_owned_dofs(),
- ExcMessage("Incorrect size of the input array."));
- }
- else if (dynamic_cast<
- const parallel::DistributedTriangulationBase<dim, spacedim> *>(
- &*tria) != nullptr)
- {
- AssertDimension(new_numbers.size(), n_locally_owned_dofs());
- }
- else
+ while (this->hp_cell_active_fe_indices.size() < this->tria->n_levels())
+ this->hp_cell_active_fe_indices.push_back({});
+
+ while (this->hp_cell_active_fe_indices.size() > this->tria->n_levels())
+ this->hp_cell_active_fe_indices.pop_back();
+
+ while (this->hp_cell_future_fe_indices.size() < this->tria->n_levels())
+ this->hp_cell_future_fe_indices.push_back({});
+
+ while (this->hp_cell_future_fe_indices.size() > this->tria->n_levels())
+ this->hp_cell_future_fe_indices.pop_back();
+
+
+
+ Assert(this->hp_cell_future_fe_indices.size() == this->tria->n_levels(),
+ ExcInternalError());
+ for (unsigned int i = 0; i < this->hp_cell_future_fe_indices.size(); ++i)
{
- AssertDimension(new_numbers.size(), n_dofs());
+ // Resize active_fe_indices vectors. Use zero indicator to extend.
+ this->hp_cell_active_fe_indices[i].resize(this->tria->n_raw_cells(i), 0);
+
+ // Resize future_fe_indices vectors. Make sure that all
+ // future_fe_indices have been cleared after refinement happened.
+ //
+ // We have used future_fe_indices to update all active_fe_indices
+ // before refinement happened, thus we are safe to clear them now.
+ this->hp_cell_future_fe_indices[i].assign(this->tria->n_raw_cells(i),
+ invalid_active_fe_index);
}
+}
+
- // assert that the new indices are
- // consecutively numbered if we are
- // working on a single
- // processor. this doesn't need to
- // hold in the case of a parallel
- // mesh since we map the interval
- // [0...n_dofs()) into itself but
- // only globally, not on each
- // processor
- if (n_locally_owned_dofs() == n_dofs())
+template <int dim, int spacedim>
+void
+DoFHandler<dim, spacedim>::pre_active_fe_index_transfer()
+{
+ // Finite elements need to be assigned to each cell by calling
+ // distribute_dofs() first to make this functionality available.
+ if (this->fe_collection.size() > 0)
{
- std::vector<types::global_dof_index> tmp(new_numbers);
- std::sort(tmp.begin(), tmp.end());
- std::vector<types::global_dof_index>::const_iterator p = tmp.begin();
- types::global_dof_index i = 0;
- for (; p != tmp.end(); ++p, ++i)
- Assert(*p == i, ExcNewNumbersNotConsecutive(i));
- }
- else
- for (const auto new_number : new_numbers)
- Assert(new_number < n_dofs(),
- ExcMessage(
- "New DoF index is not less than the total number of dofs."));
-#endif
+ Assert(this->active_fe_index_transfer == nullptr, ExcInternalError());
+
+ this->active_fe_index_transfer =
+ std::make_unique<ActiveFEIndexTransfer>();
- number_cache = policy->renumber_dofs(new_numbers);
+ dealii::internal::hp::DoFHandlerImplementation::Implementation::
+ collect_fe_indices_on_cells_to_be_refined(*this);
+ }
}
+
template <int dim, int spacedim>
void
-DoFHandler<dim, spacedim>::renumber_dofs(
- const unsigned int level,
- const std::vector<types::global_dof_index> &new_numbers)
+DoFHandler<dim, spacedim>::pre_distributed_active_fe_index_transfer()
{
+#ifndef DEAL_II_WITH_P4EST
+ Assert(false,
+ ExcMessage(
+ "You are attempting to use a functionality that is only available "
+ "if deal.II was configured to use p4est, but cmake did not find a "
+ "valid p4est library."));
+#else
+ // the implementation below requires a p:d:T currently
Assert(
- mg_levels.size() > 0 && levels.size() > 0,
- ExcMessage(
- "You need to distribute active and level DoFs before you can renumber level DoFs."));
- AssertIndexRange(level, get_triangulation().n_global_levels());
- AssertDimension(new_numbers.size(),
- locally_owned_mg_dofs(level).n_elements());
+ (dynamic_cast<const parallel::distributed::Triangulation<dim, spacedim> *>(
+ &this->get_triangulation()) != nullptr),
+ ExcNotImplemented());
-#ifdef DEBUG
- // assert that the new indices are consecutively numbered if we are working
- // on a single processor. this doesn't need to hold in the case of a
- // parallel mesh since we map the interval [0...n_dofs(level)) into itself
- // but only globally, not on each processor
- if (n_locally_owned_dofs() == n_dofs())
+ // Finite elements need to be assigned to each cell by calling
+ // distribute_dofs() first to make this functionality available.
+ if (fe_collection.size() > 0)
{
- std::vector<types::global_dof_index> tmp(new_numbers);
- std::sort(tmp.begin(), tmp.end());
- std::vector<types::global_dof_index>::const_iterator p = tmp.begin();
- types::global_dof_index i = 0;
- for (; p != tmp.end(); ++p, ++i)
- Assert(*p == i, ExcNewNumbersNotConsecutive(i));
+ Assert(active_fe_index_transfer == nullptr, ExcInternalError());
+
+ active_fe_index_transfer = std::make_unique<ActiveFEIndexTransfer>();
+
+ // If we work on a p::d::Triangulation, we have to transfer all
+ // active_fe_indices since ownership of cells may change. We will
+ // use our p::d::CellDataTransfer member to achieve this. Further,
+ // we prepare the values in such a way that they will correspond to
+ // the active_fe_indices on the new mesh.
+
+ // Gather all current future_fe_indices.
+ active_fe_index_transfer->active_fe_indices.resize(
+ get_triangulation().n_active_cells(), numbers::invalid_unsigned_int);
+
+ for (const auto &cell : active_cell_iterators())
+ if (cell->is_locally_owned())
+ active_fe_index_transfer
+ ->active_fe_indices[cell->active_cell_index()] =
+ cell->future_fe_index();
+
+ // Create transfer object and attach to it.
+ const auto *distributed_tria = dynamic_cast<
+ const parallel::distributed::Triangulation<dim, spacedim> *>(
+ &this->get_triangulation());
+
+ active_fe_index_transfer->cell_data_transfer = std::make_unique<
+ parallel::distributed::
+ CellDataTransfer<dim, spacedim, std::vector<unsigned int>>>(
+ *distributed_tria,
+ /*transfer_variable_size_data=*/false,
+ /*refinement_strategy=*/
+ &dealii::AdaptationStrategies::Refinement::
+ preserve<dim, spacedim, unsigned int>,
+ /*coarsening_strategy=*/
+ [this](
+ const typename Triangulation<dim, spacedim>::cell_iterator &parent,
+ const std::vector<unsigned int> &children_fe_indices)
+ -> unsigned int {
+ return dealii::internal::hp::DoFHandlerImplementation::
+ Implementation::determine_fe_from_children<dim, spacedim>(
+ parent, children_fe_indices, fe_collection);
+ });
+
+ active_fe_index_transfer->cell_data_transfer
+ ->prepare_for_coarsening_and_refinement(
+ active_fe_index_transfer->active_fe_indices);
}
- else
- for (const auto new_number : new_numbers)
- Assert(new_number < n_dofs(level),
- ExcMessage(
- "New DoF index is not less than the total number of dofs."));
#endif
-
- mg_number_cache[level] = policy->renumber_mg_dofs(level, new_numbers);
}
template <int dim, int spacedim>
-unsigned int
-DoFHandler<dim, spacedim>::max_couplings_between_dofs() const
+void
+DoFHandler<dim, spacedim>::post_active_fe_index_transfer()
{
- return internal::DoFHandlerImplementation::Implementation::
- max_couplings_between_dofs(*this);
+ // Finite elements need to be assigned to each cell by calling
+ // distribute_dofs() first to make this functionality available.
+ if (this->fe_collection.size() > 0)
+ {
+ Assert(this->active_fe_index_transfer != nullptr, ExcInternalError());
+
+ dealii::internal::hp::DoFHandlerImplementation::Implementation::
+ distribute_fe_indices_on_refined_cells(*this);
+
+ // We have to distribute the information about active_fe_indices
+ // of all cells (including the artificial ones) on all processors,
+ // if a parallel::shared::Triangulation has been used.
+ dealii::internal::hp::DoFHandlerImplementation::Implementation::
+ communicate_active_fe_indices(*this);
+
+ // Free memory.
+ this->active_fe_index_transfer.reset();
+ }
}
template <int dim, int spacedim>
-unsigned int
-DoFHandler<dim, spacedim>::max_couplings_between_boundary_dofs() const
+void
+DoFHandler<dim, spacedim>::post_distributed_active_fe_index_transfer()
{
- switch (dim)
+#ifndef DEAL_II_WITH_P4EST
+ Assert(false, ExcInternalError());
+#else
+ // Finite elements need to be assigned to each cell by calling
+ // distribute_dofs() first to make this functionality available.
+ if (this->fe_collection.size() > 0)
{
- case 1:
- return get_fe().dofs_per_vertex;
- case 2:
- return (3 * get_fe().dofs_per_vertex + 2 * get_fe().dofs_per_line);
- case 3:
- // we need to take refinement of
- // one boundary face into
- // consideration here; in fact,
- // this function returns what
- // #max_coupling_between_dofs<2>
- // returns
- //
- // we assume here, that only four
- // faces meet at the boundary;
- // this assumption is not
- // justified and needs to be
- // fixed some time. fortunately,
- // omitting it for now does no
- // harm since the matrix will cry
- // foul if its requirements are
- // not satisfied
- return (19 * get_fe().dofs_per_vertex + 28 * get_fe().dofs_per_line +
- 8 * get_fe().dofs_per_quad);
- default:
- Assert(false, ExcNotImplemented());
- return numbers::invalid_unsigned_int;
+ Assert(this->active_fe_index_transfer != nullptr, ExcInternalError());
+
+ // Unpack active_fe_indices.
+ this->active_fe_index_transfer->active_fe_indices.resize(
+ this->get_triangulation().n_active_cells(),
+ numbers::invalid_unsigned_int);
+ this->active_fe_index_transfer->cell_data_transfer->unpack(
+ this->active_fe_index_transfer->active_fe_indices);
+
+ // Update all locally owned active_fe_indices.
+ this->set_active_fe_indices(
+ this->active_fe_index_transfer->active_fe_indices);
+
+ // Update active_fe_indices on ghost cells.
+ dealii::internal::hp::DoFHandlerImplementation::Implementation::
+ communicate_active_fe_indices(*this);
+
+ // Free memory.
+ this->active_fe_index_transfer.reset();
}
+#endif
}
template <int dim, int spacedim>
void
-DoFHandler<dim, spacedim>::clear_space()
+DoFHandler<dim, spacedim>::prepare_for_serialization_of_active_fe_indices()
{
- levels.clear();
- faces.reset();
-
- std::vector<types::global_dof_index> tmp;
- std::swap(vertex_dofs, tmp);
+#ifndef DEAL_II_WITH_P4EST
+ Assert(false,
+ ExcMessage(
+ "You are attempting to use a functionality that is only available "
+ "if deal.II was configured to use p4est, but cmake did not find a "
+ "valid p4est library."));
+#else
+ // the implementation below requires a p:d:T currently
+ Assert(
+ (dynamic_cast<const parallel::distributed::Triangulation<dim, spacedim> *>(
+ &this->get_triangulation()) != nullptr),
+ ExcNotImplemented());
- number_cache.clear();
+ // Finite elements need to be assigned to each cell by calling
+ // distribute_dofs() first to make this functionality available.
+ if (fe_collection.size() > 0)
+ {
+ Assert(active_fe_index_transfer == nullptr, ExcInternalError());
+
+ active_fe_index_transfer = std::make_unique<ActiveFEIndexTransfer>();
+
+ // Create transfer object and attach to it.
+ const auto *distributed_tria = dynamic_cast<
+ const parallel::distributed::Triangulation<dim, spacedim> *>(
+ &this->get_triangulation());
+
+ active_fe_index_transfer->cell_data_transfer = std::make_unique<
+ parallel::distributed::
+ CellDataTransfer<dim, spacedim, std::vector<unsigned int>>>(
+ *distributed_tria,
+ /*transfer_variable_size_data=*/false,
+ /*refinement_strategy=*/
+ &dealii::AdaptationStrategies::Refinement::
+ preserve<dim, spacedim, unsigned int>,
+ /*coarsening_strategy=*/
+ [this](
+ const typename Triangulation<dim, spacedim>::cell_iterator &parent,
+ const std::vector<unsigned int> &children_fe_indices)
+ -> unsigned int {
+ return dealii::internal::hp::DoFHandlerImplementation::
+ Implementation::determine_fe_from_children<dim, spacedim>(
+ parent, children_fe_indices, fe_collection);
+ });
+
+ // If we work on a p::d::Triangulation, we have to transfer all
+ // active fe indices since ownership of cells may change.
+
+ // Gather all current active_fe_indices
+ get_active_fe_indices(active_fe_index_transfer->active_fe_indices);
+
+ // Attach to transfer object
+ active_fe_index_transfer->cell_data_transfer->prepare_for_serialization(
+ active_fe_index_transfer->active_fe_indices);
+ }
+#endif
}
template <int dim, int spacedim>
-template <int structdim>
-types::global_dof_index
-DoFHandler<dim, spacedim>::get_dof_index(const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index) const
+void
+DoFHandler<dim, spacedim>::post_distributed_serialization_of_active_fe_indices()
{
- return internal::DoFHandlerImplementation::Implementation::get_dof_index(
- *this,
- this->mg_levels[obj_level],
- this->mg_faces,
- obj_index,
- fe_index,
- local_index,
- std::integral_constant<int, structdim>());
+#ifndef DEAL_II_WITH_P4EST
+ Assert(false,
+ ExcMessage(
+ "You are attempting to use a functionality that is only available "
+ "if deal.II was configured to use p4est, but cmake did not find a "
+ "valid p4est library."));
+#else
+ if (this->fe_collection.size() > 0)
+ {
+ Assert(this->active_fe_index_transfer != nullptr, ExcInternalError());
+
+ // Free memory.
+ this->active_fe_index_transfer.reset();
+ }
+#endif
}
template <int dim, int spacedim>
-template <int structdim>
void
-DoFHandler<dim, spacedim>::set_dof_index(
- const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const types::global_dof_index global_index) const
+DoFHandler<dim, spacedim>::deserialize_active_fe_indices()
{
- internal::DoFHandlerImplementation::Implementation::set_dof_index(
- *this,
- this->mg_levels[obj_level],
- this->mg_faces,
- obj_index,
- fe_index,
- local_index,
- global_index,
- std::integral_constant<int, structdim>());
+#ifndef DEAL_II_WITH_P4EST
+ Assert(false,
+ ExcMessage(
+ "You are attempting to use a functionality that is only available "
+ "if deal.II was configured to use p4est, but cmake did not find a "
+ "valid p4est library."));
+#else
+ // the implementation below requires a p:d:T currently
+ Assert(
+ (dynamic_cast<const parallel::distributed::Triangulation<dim, spacedim> *>(
+ &this->get_triangulation()) != nullptr),
+ ExcNotImplemented());
+
+ // Finite elements need to be assigned to each cell by calling
+ // distribute_dofs() first to make this functionality available.
+ if (fe_collection.size() > 0)
+ {
+ Assert(active_fe_index_transfer == nullptr, ExcInternalError());
+
+ active_fe_index_transfer = std::make_unique<ActiveFEIndexTransfer>();
+
+ // Create transfer object and attach to it.
+ const auto *distributed_tria = dynamic_cast<
+ const parallel::distributed::Triangulation<dim, spacedim> *>(
+ &this->get_triangulation());
+
+ active_fe_index_transfer->cell_data_transfer = std::make_unique<
+ parallel::distributed::
+ CellDataTransfer<dim, spacedim, std::vector<unsigned int>>>(
+ *distributed_tria,
+ /*transfer_variable_size_data=*/false,
+ /*refinement_strategy=*/
+ &dealii::AdaptationStrategies::Refinement::
+ preserve<dim, spacedim, unsigned int>,
+ /*coarsening_strategy=*/
+ [this](
+ const typename Triangulation<dim, spacedim>::cell_iterator &parent,
+ const std::vector<unsigned int> &children_fe_indices)
+ -> unsigned int {
+ return dealii::internal::hp::DoFHandlerImplementation::
+ Implementation::determine_fe_from_children<dim, spacedim>(
+ parent, children_fe_indices, fe_collection);
+ });
+
+ // Unpack active_fe_indices.
+ active_fe_index_transfer->active_fe_indices.resize(
+ get_triangulation().n_active_cells(), numbers::invalid_unsigned_int);
+ active_fe_index_transfer->cell_data_transfer->deserialize(
+ active_fe_index_transfer->active_fe_indices);
+
+ // Update all locally owned active_fe_indices.
+ set_active_fe_indices(active_fe_index_transfer->active_fe_indices);
+
+ // Update active_fe_indices on ghost cells.
+ dealii::internal::hp::DoFHandlerImplementation::Implementation::
+ communicate_active_fe_indices(*this);
+
+ // Free memory.
+ active_fe_index_transfer.reset();
+ }
+#endif
}
return finest_level;
}
-
/*-------------- Explicit Instantiations -------------------------------*/
#include "dof_handler.inst"
+
DEAL_II_NAMESPACE_CLOSE
// the following
using dealii::DoFHandler;
- namespace hp
- {
- using dealii::hp::DoFHandler;
- }
-
-
namespace
{
/**
template <int dim, int spacedim>
static std::map<types::global_dof_index, types::global_dof_index>
compute_vertex_dof_identities(
- const hp::DoFHandler<dim, spacedim> &dof_handler)
+ const DoFHandler<dim, spacedim> &dof_handler)
{
+ Assert(
+ dof_handler.hp_capability_enabled == true,
+ (typename DoFHandler<dim, spacedim>::ExcNotAvailableWithoutHP()));
+
std::map<types::global_dof_index, types::global_dof_index>
dof_identities;
{
const unsigned int n_active_fe_indices =
dealii::internal::DoFAccessorImplementation::Implementation::
- n_active_vertex_fe_indices(dof_handler, vertex_index);
+ n_active_fe_indices(dof_handler,
+ 0,
+ vertex_index,
+ std::integral_constant<int, 0>());
if (n_active_fe_indices > 1)
{
const std::set<unsigned int> fe_indices =
dealii::internal::DoFAccessorImplementation::
- Implementation::get_active_vertex_fe_indices(
- dof_handler, vertex_index);
+ Implementation::get_active_fe_indices(
+ dof_handler,
+ 0,
+ vertex_index,
+ std::integral_constant<int, 0>());
// find out which is the most dominating finite
// element of the ones that are used on this vertex
numbers::invalid_unsigned_int)
most_dominating_fe_index =
dealii::internal::DoFAccessorImplementation::
- Implementation::nth_active_vertex_fe_index(
- dof_handler, vertex_index, 0);
+ Implementation::nth_active_fe_index(
+ dof_handler,
+ 0,
+ vertex_index,
+ 0,
+ std::integral_constant<int, 0>());
// loop over the indices of all the finite
// elements that are not dominating, and
{
const types::global_dof_index master_dof_index =
dealii::internal::DoFAccessorImplementation::
- Implementation::get_vertex_dof_index(
+ Implementation::get_dof_index(
dof_handler,
+ 0,
vertex_index,
most_dominating_fe_index,
- identity.first);
+ identity.first,
+ std::integral_constant<int, 0>());
const types::global_dof_index slave_dof_index =
dealii::internal::DoFAccessorImplementation::
- Implementation::get_vertex_dof_index(
+ Implementation::get_dof_index(
dof_handler,
+ 0,
vertex_index,
other_fe_index,
- identity.second);
+ identity.second,
+ std::integral_constant<int, 0>());
// on subdomain boundaries, we will
// encounter invalid DoFs on ghost cells,
*/
template <int spacedim>
static std::map<types::global_dof_index, types::global_dof_index>
- compute_line_dof_identities(const hp::DoFHandler<1, spacedim> &)
+ compute_line_dof_identities(const DoFHandler<1, spacedim> &dof_handler)
{
+ (void)dof_handler;
+ Assert(
+ dof_handler.hp_capability_enabled == true,
+ (typename DoFHandler<1, spacedim>::ExcNotAvailableWithoutHP()));
+
return std::map<types::global_dof_index, types::global_dof_index>();
}
template <int dim, int spacedim>
static std::map<types::global_dof_index, types::global_dof_index>
compute_line_dof_identities(
- const hp::DoFHandler<dim, spacedim> &dof_handler)
+ const DoFHandler<dim, spacedim> &dof_handler)
{
+ Assert(
+ dof_handler.hp_capability_enabled == true,
+ (typename DoFHandler<dim, spacedim>::ExcNotAvailableWithoutHP()));
+
std::map<types::global_dof_index, types::global_dof_index>
dof_identities;
for (unsigned int l = 0; l < GeometryInfo<dim>::lines_per_cell; ++l)
if (cell->line(l)->user_flag_set() == false)
{
- const typename hp::DoFHandler<dim, spacedim>::line_iterator
- line = cell->line(l);
+ const typename DoFHandler<dim, spacedim>::line_iterator line =
+ cell->line(l);
line->set_user_flag();
unsigned int unique_sets_of_dofs =
*/
template <int dim, int spacedim>
static std::map<types::global_dof_index, types::global_dof_index>
- compute_quad_dof_identities(const hp::DoFHandler<dim, spacedim> &)
+ compute_quad_dof_identities(
+ const DoFHandler<dim, spacedim> &dof_handler)
{
+ (void)dof_handler;
+ Assert(
+ dof_handler.hp_capability_enabled == true,
+ (typename DoFHandler<dim, spacedim>::ExcNotAvailableWithoutHP()));
+
// this function should only be called for dim<3 where there are
// no quad dof identies. for dim==3, the specialization below should
// take care of it
template <int spacedim>
static std::map<types::global_dof_index, types::global_dof_index>
- compute_quad_dof_identities(
- const hp::DoFHandler<3, spacedim> &dof_handler)
+ compute_quad_dof_identities(const DoFHandler<3, spacedim> &dof_handler)
{
+ Assert(
+ dof_handler.hp_capability_enabled == true,
+ (typename DoFHandler<3, spacedim>::ExcNotAvailableWithoutHP()));
+
const int dim = 3;
std::map<types::global_dof_index, types::global_dof_index>
if ((cell->quad(q)->user_flag_set() == false) &&
(cell->quad(q)->n_active_fe_indices() == 2))
{
- const typename hp::DoFHandler<dim, spacedim>::quad_iterator
- quad = cell->quad(q);
+ const typename DoFHandler<dim, spacedim>::quad_iterator quad =
+ cell->quad(q);
quad->set_user_flag();
const std::set<unsigned int> fe_indices =
* Compute the constraints that correspond to unifying DoF indices
* on vertices, lines, and quads. Do so in parallel.
*/
- template <int dim, int spacedim>
- static void
- compute_dof_identities(
- const std::vector<
- std::map<types::global_dof_index, types::global_dof_index>> &,
- const DoFHandler<dim, spacedim> &)
- {}
-
-
template <int dim, int spacedim>
static void
compute_dof_identities(std::vector<std::map<types::global_dof_index,
types::global_dof_index>>
&all_constrained_indices,
- const hp::DoFHandler<dim, spacedim> &dof_handler)
+ const DoFHandler<dim, spacedim> &dof_handler)
{
+ if (dof_handler.hp_capability_enabled == false)
+ return;
+
Assert(all_constrained_indices.size() == dim, ExcInternalError());
Threads::TaskGroup<> tasks;
*/
template <int dim, int spacedim>
static types::global_dof_index
- unify_dof_indices(const DoFHandler<dim, spacedim> &,
- const unsigned int n_dofs_before_identification,
- const bool)
- {
- return n_dofs_before_identification;
- }
-
-
- template <int dim, int spacedim>
- static types::global_dof_index
- unify_dof_indices(hp::DoFHandler<dim, spacedim> &dof_handler,
+ unify_dof_indices(const DoFHandler<dim, spacedim> &dof_handler,
const unsigned int n_dofs_before_identification,
const bool check_validity)
{
+ if (dof_handler.hp_capability_enabled == false)
+ return n_dofs_before_identification;
+
std::vector<
std::map<types::global_dof_index, types::global_dof_index>>
all_constrained_indices(dim);
template <int dim, int spacedim>
static void
merge_invalid_vertex_dofs_on_ghost_interfaces(
- hp::DoFHandler<dim, spacedim> &dof_handler)
+ DoFHandler<dim, spacedim> &dof_handler)
{
+ Assert(
+ dof_handler.hp_capability_enabled == true,
+ (typename DoFHandler<dim, spacedim>::ExcNotAvailableWithoutHP()));
+
// Note: we may wish to have something here similar to what
// we do for lines and quads, namely that we only identify
// dofs for any fe towards the most dominating one. however,
{
const unsigned int n_active_fe_indices =
dealii::internal::DoFAccessorImplementation::Implementation::
- n_active_vertex_fe_indices(dof_handler, vertex_index);
+ n_active_fe_indices(dof_handler,
+ 0,
+ vertex_index,
+ std::integral_constant<int, 0>());
if (n_active_fe_indices > 1)
{
const std::set<unsigned int> fe_indices =
dealii::internal::DoFAccessorImplementation::
- Implementation::get_active_vertex_fe_indices(
- dof_handler, vertex_index);
+ Implementation::get_active_fe_indices(
+ dof_handler,
+ 0,
+ vertex_index,
+ std::integral_constant<int, 0>());
// find out which is the most dominating finite
// element of the ones that are used on this vertex
const types::global_dof_index
master_dof_index = dealii::internal::
DoFAccessorImplementation::
- Implementation::get_vertex_dof_index(
+ Implementation::get_dof_index(
dof_handler,
+ 0,
vertex_index,
most_dominating_fe_index,
- identity.first);
+ identity.first,
+ std::integral_constant<int, 0>());
const types::global_dof_index
slave_dof_index = dealii::internal::
DoFAccessorImplementation::
- Implementation::get_vertex_dof_index(
+ Implementation::get_dof_index(
dof_handler,
+ 0,
vertex_index,
other_fe_index,
- identity.second);
+ identity.second,
+ std::integral_constant<int, 0>());
// check if we are on an interface between
// a locally owned and a ghost cell on which
numbers::invalid_dof_index))
dealii::internal::
DoFAccessorImplementation::
- Implementation::set_vertex_dof_index(
+ Implementation::set_dof_index(
dof_handler,
+ 0,
vertex_index,
other_fe_index,
identity.second,
+ std::integral_constant<int, 0>(),
master_dof_index);
}
}
*/
template <int spacedim>
static void merge_invalid_line_dofs_on_ghost_interfaces(
- hp::DoFHandler<1, spacedim> &)
- {}
+ DoFHandler<1, spacedim> &dof_handler)
+ {
+ (void)dof_handler;
+ Assert(
+ dof_handler.hp_capability_enabled == true,
+ (typename DoFHandler<1, spacedim>::ExcNotAvailableWithoutHP()));
+ }
template <int dim, int spacedim>
static void
merge_invalid_line_dofs_on_ghost_interfaces(
- hp::DoFHandler<dim, spacedim> &dof_handler)
+ DoFHandler<dim, spacedim> &dof_handler)
{
+ Assert(
+ dof_handler.hp_capability_enabled == true,
+ (typename DoFHandler<dim, spacedim>::ExcNotAvailableWithoutHP()));
+
// we will mark lines that we have already treated, so first save and
// clear the user flags on lines and later restore them
std::vector<bool> user_flags;
if ((cell->is_locally_owned()) &&
(cell->line(l)->user_flag_set() == true))
{
- const typename hp::DoFHandler<dim, spacedim>::line_iterator
- line = cell->line(l);
+ const typename DoFHandler<dim, spacedim>::line_iterator line =
+ cell->line(l);
line->clear_user_flag();
unsigned int unique_sets_of_dofs =
template <int dim, int spacedim>
static void
merge_invalid_quad_dofs_on_ghost_interfaces(
- hp::DoFHandler<dim, spacedim> &)
+ DoFHandler<dim, spacedim> &dof_handler)
{
+ (void)dof_handler;
+ Assert(
+ dof_handler.hp_capability_enabled == true,
+ (typename DoFHandler<dim, spacedim>::ExcNotAvailableWithoutHP()));
+
// this function should only be called for dim<3 where there are
// no quad dof identies. for dim>=3, the specialization below should
// take care of it
template <int spacedim>
static void merge_invalid_quad_dofs_on_ghost_interfaces(
- hp::DoFHandler<3, spacedim> &dof_handler)
+ DoFHandler<3, spacedim> &dof_handler)
{
+ Assert(
+ dof_handler.hp_capability_enabled == true,
+ (typename DoFHandler<3, spacedim>::ExcNotAvailableWithoutHP()));
+
const int dim = 3;
// we will mark quads that we have already treated, so first
(cell->quad(q)->user_flag_set() == true) &&
(cell->quad(q)->n_active_fe_indices() == 2))
{
- const typename hp::DoFHandler<dim, spacedim>::quad_iterator
- quad = cell->quad(q);
+ const typename DoFHandler<dim, spacedim>::quad_iterator quad =
+ cell->quad(q);
quad->clear_user_flag();
const std::set<unsigned int> fe_indices =
template <int dim, int spacedim>
static void
merge_invalid_dof_indices_on_ghost_interfaces(
- const DoFHandler<dim, spacedim> &)
- {}
-
-
- template <int dim, int spacedim>
- static void
- merge_invalid_dof_indices_on_ghost_interfaces(
- hp::DoFHandler<dim, spacedim> &dof_handler)
+ DoFHandler<dim, spacedim> &dof_handler)
{
+ if (dof_handler.hp_capability_enabled == false)
+ return;
+
{
Threads::TaskGroup<> tasks;
DoFHandlerType & dof_handler,
const unsigned int level)
{
- Assert(DoFHandlerType::is_hp_dof_handler == false,
+ Assert(dof_handler.hp_capability_enabled == false,
ExcInternalError());
const unsigned int dim = DoFHandlerType::dimension;
/* --------------------- renumber_dofs functionality ---------------- */
- /**
- * The part of the renumber_dofs() functionality that is dimension
- * independent because it renumbers the DoF indices on vertices
- * (which exist for all dimensions).
- *
- * See renumber_dofs() for the meaning of the arguments.
- */
- template <int dim, int spacedim>
- static void
- renumber_vertex_dofs(
- const std::vector<types::global_dof_index> &new_numbers,
- const IndexSet & indices_we_care_about,
- DoFHandler<dim, spacedim> & dof_handler,
- const bool check_validity)
- {
- // we can not use cell iterators in this function since then
- // we would renumber the dofs on the interface of two cells
- // more than once. Anyway, this way it's not only more
- // correct but also faster; note, however, that dof numbers
- // may be invalid_dof_index, namely when the appropriate
- // vertex/line/etc is unused
- for (std::vector<types::global_dof_index>::iterator i =
- dof_handler.vertex_dofs.begin();
- i != dof_handler.vertex_dofs.end();
- ++i)
- if (*i != numbers::invalid_dof_index)
- *i = (indices_we_care_about.size() == 0) ?
- (new_numbers[*i]) :
- (new_numbers[indices_we_care_about.index_within_set(*i)]);
- else if (check_validity)
- // if index is invalid_dof_index: check if this one
- // really is unused
- Assert(dof_handler.get_triangulation().vertex_used(
- (i - dof_handler.vertex_dofs.begin()) /
- dof_handler.get_fe().dofs_per_vertex) == false,
- ExcInternalError());
- }
-
-
-
- /**
- * The part of the renumber_dofs() functionality that is dimension
- * independent because it renumbers the DoF indices on cell interiors
- * (which exist for all dimensions).
- *
- * See renumber_dofs() for the meaning of the arguments.
- */
- template <int dim, int spacedim>
- static void
- renumber_cell_dofs(
- const std::vector<types::global_dof_index> &new_numbers,
- const IndexSet & indices_we_care_about,
- DoFHandler<dim, spacedim> & dof_handler)
- {
- for (unsigned int level = 0; level < dof_handler.levels.size();
- ++level)
- for (std::vector<types::global_dof_index>::iterator i =
- dof_handler.levels[level]->dof_object.dofs.begin();
- i != dof_handler.levels[level]->dof_object.dofs.end();
- ++i)
- if (*i != numbers::invalid_dof_index)
- *i =
- ((indices_we_care_about.size() == 0) ?
- new_numbers[*i] :
- new_numbers[indices_we_care_about.index_within_set(*i)]);
- }
-
-
-
/**
* The part of the renumber_dofs() functionality that operates on faces.
* This part is dimension dependent and so needs to be implemented in
*
* See renumber_dofs() for the meaning of the arguments.
*/
- template <int spacedim>
- static void
- renumber_face_dofs(
- const std::vector<types::global_dof_index> & /*new_numbers*/,
- const IndexSet & /*indices_we_care_about*/,
- DoFHandler<1, spacedim> & /*dof_handler*/)
- {
- // nothing to do in 1d since there are no separate faces
- }
-
-
-
- template <int spacedim>
- static void
- renumber_face_dofs(
- const std::vector<types::global_dof_index> &new_numbers,
- const IndexSet & indices_we_care_about,
- DoFHandler<2, spacedim> & dof_handler)
- {
- // treat dofs on lines
- for (std::vector<types::global_dof_index>::iterator i =
- dof_handler.faces->lines.dofs.begin();
- i != dof_handler.faces->lines.dofs.end();
- ++i)
- if (*i != numbers::invalid_dof_index)
- *i = ((indices_we_care_about.size() == 0) ?
- new_numbers[*i] :
- new_numbers[indices_we_care_about.index_within_set(*i)]);
- }
-
-
-
- template <int spacedim>
+ template <int dim, int spacedim>
static void
renumber_face_dofs(
const std::vector<types::global_dof_index> &new_numbers,
const IndexSet & indices_we_care_about,
- DoFHandler<3, spacedim> & dof_handler)
+ DoFHandler<dim, spacedim> & dof_handler)
{
- // treat dofs on lines
- for (std::vector<types::global_dof_index>::iterator i =
- dof_handler.faces->lines.dofs.begin();
- i != dof_handler.faces->lines.dofs.end();
- ++i)
- if (*i != numbers::invalid_dof_index)
- *i = ((indices_we_care_about.size() == 0) ?
- new_numbers[*i] :
- new_numbers[indices_we_care_about.index_within_set(*i)]);
-
- // treat dofs on quads
- for (std::vector<types::global_dof_index>::iterator i =
- dof_handler.faces->quads.dofs.begin();
- i != dof_handler.faces->quads.dofs.end();
- ++i)
- if (*i != numbers::invalid_dof_index)
- *i = ((indices_we_care_about.size() == 0) ?
- new_numbers[*i] :
- new_numbers[indices_we_care_about.index_within_set(*i)]);
+ for (unsigned int d = 1; d < dim; d++)
+ for (auto &i : dof_handler.object_dof_indices[0][d])
+ if (i != numbers::invalid_dof_index)
+ i = ((indices_we_care_about.size() == 0) ?
+ new_numbers[i] :
+ new_numbers[indices_we_care_about.index_within_set(i)]);
}
renumber_vertex_dofs(
const std::vector<types::global_dof_index> &new_numbers,
const IndexSet & indices_we_care_about,
- hp::DoFHandler<dim, spacedim> & dof_handler,
+ DoFHandler<dim, spacedim> & dof_handler,
const bool check_validity)
{
+ if (dof_handler.hp_capability_enabled == false)
+ {
+ // we can not use cell iterators in this function since then
+ // we would renumber the dofs on the interface of two cells
+ // more than once. Anyway, this way it's not only more
+ // correct but also faster; note, however, that dof numbers
+ // may be invalid_dof_index, namely when the appropriate
+ // vertex/line/etc is unused
+ for (std::vector<types::global_dof_index>::iterator i =
+ dof_handler.object_dof_indices[0][0].begin();
+ i != dof_handler.object_dof_indices[0][0].end();
+ ++i)
+ if (*i != numbers::invalid_dof_index)
+ *i =
+ (indices_we_care_about.size() == 0) ?
+ (new_numbers[*i]) :
+ (new_numbers[indices_we_care_about.index_within_set(*i)]);
+ else if (check_validity)
+ // if index is invalid_dof_index: check if this one
+ // really is unused
+ Assert(dof_handler.get_triangulation().vertex_used(
+ (i - dof_handler.object_dof_indices[0][0].begin()) /
+ dof_handler.get_fe().dofs_per_vertex) == false,
+ ExcInternalError());
+ return;
+ }
+
+
for (unsigned int vertex_index = 0;
vertex_index < dof_handler.get_triangulation().n_vertices();
++vertex_index)
{
const unsigned int n_active_fe_indices =
dealii::internal::DoFAccessorImplementation::Implementation::
- n_active_vertex_fe_indices(dof_handler, vertex_index);
+ n_active_fe_indices(dof_handler,
+ 0,
+ vertex_index,
+ std::integral_constant<int, 0>());
// if this vertex is unused, then we really ought not to have
// allocated any space for it, i.e., n_active_fe_indices should be
{
const unsigned int fe_index =
dealii::internal::DoFAccessorImplementation::
- Implementation::nth_active_vertex_fe_index(dof_handler,
- vertex_index,
- f);
+ Implementation::nth_active_fe_index(
+ dof_handler,
+ 0,
+ vertex_index,
+ f,
+ std::integral_constant<int, 0>());
for (unsigned int d = 0;
d < dof_handler.get_fe(fe_index).dofs_per_vertex;
{
const types::global_dof_index old_dof_index =
dealii::internal::DoFAccessorImplementation::
- Implementation::get_vertex_dof_index(dof_handler,
- vertex_index,
- fe_index,
- d);
+ Implementation::get_dof_index(
+ dof_handler,
+ 0,
+ vertex_index,
+ fe_index,
+ d,
+ std::integral_constant<int, 0>());
// if check_validity was set, then we are to verify that
// the previous indices were all valid. this really should
// cells.
if (indices_we_care_about.size() == 0)
dealii::internal::DoFAccessorImplementation::
- Implementation::set_vertex_dof_index(
+ Implementation::set_dof_index(
dof_handler,
+ 0,
vertex_index,
fe_index,
d,
+ std::integral_constant<int, 0>(),
new_numbers[old_dof_index]);
else
{
if (indices_we_care_about.is_element(
old_dof_index))
dealii::internal::DoFAccessorImplementation::
- Implementation::set_vertex_dof_index(
+ Implementation::set_dof_index(
dof_handler,
+ 0,
vertex_index,
fe_index,
d,
+ std::integral_constant<int, 0>(),
new_numbers[indices_we_care_about
.index_within_set(
old_dof_index)]);
else
dealii::internal::DoFAccessorImplementation::
- Implementation::set_vertex_dof_index(
+ Implementation::set_dof_index(
dof_handler,
+ 0,
vertex_index,
fe_index,
d,
+ std::integral_constant<int, 0>(),
numbers::invalid_dof_index);
}
}
renumber_cell_dofs(
const std::vector<types::global_dof_index> &new_numbers,
const IndexSet & indices_we_care_about,
- hp::DoFHandler<dim, spacedim> & dof_handler)
+ DoFHandler<dim, spacedim> & dof_handler)
{
+ if (dof_handler.hp_capability_enabled == false)
+ {
+ for (unsigned int level = 0;
+ level < dof_handler.object_dof_indices.size();
+ ++level)
+ for (auto &i : dof_handler.object_dof_indices[level][dim])
+ if (i != numbers::invalid_dof_index)
+ i = ((indices_we_care_about.size() == 0) ?
+ new_numbers[i] :
+ new_numbers[indices_we_care_about.index_within_set(
+ i)]);
+ return;
+ }
+
for (const auto &cell : dof_handler.active_cell_iterators())
if (!cell->is_artificial())
{
renumber_face_dofs(
const std::vector<types::global_dof_index> & /*new_numbers*/,
const IndexSet & /*indices_we_care_about*/,
- hp::DoFHandler<1, spacedim> & /*dof_handler*/)
+ DoFHandler<1, spacedim> & /*dof_handler*/)
{
// nothing to do in 1d since there are no separate faces -- we've
// already taken care of this when dealing with the vertices
renumber_face_dofs(
const std::vector<types::global_dof_index> &new_numbers,
const IndexSet & indices_we_care_about,
- hp::DoFHandler<2, spacedim> & dof_handler)
+ DoFHandler<2, spacedim> & dof_handler)
{
const unsigned int dim = 2;
+ if (dof_handler.hp_capability_enabled == false)
+ {
+ for (unsigned int d = 1; d < dim; d++)
+ for (auto &i : dof_handler.object_dof_indices[0][d])
+ if (i != numbers::invalid_dof_index)
+ i = ((indices_we_care_about.size() == 0) ?
+ new_numbers[i] :
+ new_numbers[indices_we_care_about.index_within_set(
+ i)]);
+ return;
+ }
+
// deal with DoFs on lines
{
// save user flags on lines so we can use them to mark lines
++l)
if (cell->line(l)->user_flag_set() == false)
{
- const typename hp::DoFHandler<dim,
- spacedim>::line_iterator
+ const typename DoFHandler<dim, spacedim>::line_iterator
line = cell->line(l);
line->set_user_flag();
renumber_face_dofs(
const std::vector<types::global_dof_index> &new_numbers,
const IndexSet & indices_we_care_about,
- hp::DoFHandler<3, spacedim> & dof_handler)
+ DoFHandler<3, spacedim> & dof_handler)
{
const unsigned int dim = 3;
+ if (dof_handler.hp_capability_enabled == false)
+ {
+ for (unsigned int d = 1; d < dim; d++)
+ for (auto &i : dof_handler.object_dof_indices[0][d])
+ if (i != numbers::invalid_dof_index)
+ i = ((indices_we_care_about.size() == 0) ?
+ new_numbers[i] :
+ new_numbers[indices_we_care_about.index_within_set(
+ i)]);
+ return;
+ }
+
// deal with DoFs on lines
{
// save user flags on lines so we can use them to mark lines
++l)
if (cell->line(l)->user_flag_set() == false)
{
- const typename hp::DoFHandler<dim,
- spacedim>::line_iterator
+ const typename DoFHandler<dim, spacedim>::line_iterator
line = cell->line(l);
line->set_user_flag();
++q)
if (cell->quad(q)->user_flag_set() == false)
{
- const typename hp::DoFHandler<dim,
- spacedim>::quad_iterator
+ const typename DoFHandler<dim, spacedim>::quad_iterator
quad = cell->quad(q);
quad->set_user_flag();
* (The IndexSet argument is not used in 1d because we only need
* it for parallel meshes and 1d doesn't support that right now.)
*/
- template <class DoFHandlerType>
+ template <int dim, int space_dim>
static void
renumber_dofs(const std::vector<types::global_dof_index> &new_numbers,
- const IndexSet &indices_we_care_about,
- DoFHandlerType &dof_handler,
- const bool check_validity)
+ const IndexSet & indices_we_care_about,
+ const DoFHandler<dim, space_dim> &dof_handler,
+ const bool check_validity)
{
- if (DoFHandlerType::dimension == 1)
+ if (dim == 1)
Assert(indices_we_care_about == IndexSet(0), ExcNotImplemented());
// renumber DoF indices on vertices, cells, and faces. this
tasks += Threads::new_task([&]() {
renumber_vertex_dofs(new_numbers,
indices_we_care_about,
- dof_handler,
+ const_cast<DoFHandler<dim, space_dim> &>(
+ dof_handler),
check_validity);
});
tasks += Threads::new_task([&]() {
- renumber_face_dofs(new_numbers, indices_we_care_about, dof_handler);
+ renumber_face_dofs(new_numbers,
+ indices_we_care_about,
+ const_cast<DoFHandler<dim, space_dim> &>(
+ dof_handler));
});
tasks += Threads::new_task([&]() {
- renumber_cell_dofs(new_numbers, indices_we_care_about, dof_handler);
+ renumber_cell_dofs(new_numbers,
+ indices_we_care_about,
+ const_cast<DoFHandler<dim, space_dim> &>(
+ dof_handler));
});
tasks.join_all();
// update the cache used for cell dof indices
- update_all_active_cell_dof_indices_caches(dof_handler);
+ update_all_active_cell_dof_indices_caches(
+ const_cast<DoFHandler<dim, space_dim> &>(dof_handler));
}
const unsigned int level,
const bool check_validity)
{
+ Assert(
+ dof_handler.hp_capability_enabled == false,
+ (typename DoFHandler<dim, spacedim>::ExcNotImplementedWithHP()));
+
Assert(level < dof_handler.get_triangulation().n_global_levels(),
ExcInternalError());
});
tasks.join_all();
}
-
-
-
- template <int dim, int spacedim>
- static void
- renumber_mg_dofs(
- const std::vector<dealii::types::global_dof_index> & /*new_numbers*/,
- const IndexSet & /*indices_we_care_about*/,
- hp::DoFHandler<dim, spacedim> & /*dof_handler*/,
- const unsigned int /*level*/,
- const bool /*check_validity*/)
- {
- Assert(false, ExcNotImplemented());
- }
};
- template <int spacedim>
- void
- communicate_mg_ghost_cells(const typename dealii::parallel::
- distributed::Triangulation<1, spacedim> &,
- hp::DoFHandler<1, spacedim> &)
- {
- Assert(false, ExcNotImplemented());
- }
-
-
-
/**
* A function that communicates the DoF indices from that subset of
* locally owned cells that have their user indices set to the
template class Sequential<
dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
- template class Sequential<
- dealii::hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
template class ParallelShared<
dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
- template class ParallelShared<
- dealii::hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
template class ParallelDistributed<
dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
- template class ParallelDistributed<
- dealii::hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>;
\}
\}
\}
- template <int dim, int spacedim>
+ template <typename DoFHandlerType>
void
- block_wise(DoFHandler<dim, spacedim> &dof_handler)
+ block_wise(DoFHandlerType &dof_handler)
{
std::vector<types::global_dof_index> renumbering(
dof_handler.n_locally_owned_dofs(), numbers::invalid_dof_index);
- typename DoFHandler<dim, spacedim>::active_cell_iterator start =
+ typename DoFHandlerType::active_cell_iterator start =
dof_handler.begin_active();
- const typename DoFHandler<dim, spacedim>::level_cell_iterator end =
- dof_handler.end();
-
- const types::global_dof_index result = compute_block_wise<
- dim,
- spacedim,
- typename DoFHandler<dim, spacedim>::active_cell_iterator,
- typename DoFHandler<dim, spacedim>::level_cell_iterator>(renumbering,
- start,
- end,
- false);
+ const typename DoFHandlerType::level_cell_iterator end = dof_handler.end();
+
+ const types::global_dof_index result =
+ compute_block_wise<DoFHandlerType::dimension,
+ DoFHandlerType::space_dimension,
+ typename DoFHandlerType::active_cell_iterator,
+ typename DoFHandlerType::level_cell_iterator>(
+ renumbering, start, end, false);
if (result == 0)
return;
- template <int dim, int spacedim>
- void
- block_wise(hp::DoFHandler<dim, spacedim> &dof_handler)
- {
- std::vector<types::global_dof_index> renumbering(
- dof_handler.n_dofs(), numbers::invalid_dof_index);
-
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator start =
- dof_handler.begin_active();
- const typename hp::DoFHandler<dim, spacedim>::level_cell_iterator end =
- dof_handler.end();
-
- const types::global_dof_index result = compute_block_wise<
- dim,
- spacedim,
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator,
- typename hp::DoFHandler<dim, spacedim>::level_cell_iterator>(renumbering,
- start,
- end,
- false);
-
- if (result == 0)
- return;
-
- Assert(result == dof_handler.n_dofs(), ExcInternalError());
-
- dof_handler.renumber_dofs(renumbering);
- }
-
-
-
- template <int dim, int spacedim>
+ template <typename DoFHandlerType>
void
- block_wise(DoFHandler<dim, spacedim> &dof_handler, const unsigned int level)
+ block_wise(DoFHandlerType &dof_handler, const unsigned int level)
{
Assert(dof_handler.n_dofs(level) != numbers::invalid_dof_index,
ExcDoFHandlerNotInitialized());
dof_handler.locally_owned_mg_dofs(level).n_elements(),
numbers::invalid_dof_index);
- typename DoFHandler<dim, spacedim>::level_cell_iterator start =
+ typename DoFHandlerType::level_cell_iterator start =
dof_handler.begin(level);
- typename DoFHandler<dim, spacedim>::level_cell_iterator end =
- dof_handler.end(level);
-
- const types::global_dof_index result = compute_block_wise<
- dim,
- spacedim,
- typename DoFHandler<dim, spacedim>::level_cell_iterator,
- typename DoFHandler<dim, spacedim>::level_cell_iterator>(renumbering,
- start,
- end,
- true);
+ typename DoFHandlerType::level_cell_iterator end = dof_handler.end(level);
+
+ const types::global_dof_index result =
+ compute_block_wise<DoFHandlerType::dimension,
+ DoFHandlerType::space_dimension,
+ typename DoFHandlerType::level_cell_iterator,
+ typename DoFHandlerType::level_cell_iterator>(
+ renumbering, start, end, true);
if (result == 0)
return;
// ---------------------------------------------------------------------
-for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS)
+for (DoFHandler : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS;
+ deal_II_space_dimension : SPACE_DIMENSIONS)
{
#if deal_II_dimension <= deal_II_space_dimension
namespace DoFRenumbering
const std::vector<unsigned int> &);
template void
- component_wise<
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>(
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
- const std::vector<unsigned int> &);
-
- template void
- block_wise<deal_II_dimension, deal_II_space_dimension>(
+ block_wise<DoFHandler<deal_II_dimension, deal_II_space_dimension>>(
DoFHandler<deal_II_dimension, deal_II_space_dimension> &);
template void
template void
hierarchical(DoFHandler<deal_II_dimension, deal_II_space_dimension> &);
- template void
- hierarchical(
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &);
\}
#endif
}
// TODO[SP]: replace <deal_II_dimension> by <deal_II_dimension,
// deal_II_space_dimension>
// where applicable and move to codimension cases above also when applicable
-for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS)
+for (DoFHandler : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS;
+ deal_II_space_dimension : SPACE_DIMENSIONS)
{
#if deal_II_dimension == deal_II_space_dimension
namespace DoFRenumbering
const DoFHandler<deal_II_dimension> &,
bool,
bool);
-
-
- template void
- Cuthill_McKee(hp::DoFHandler<deal_II_dimension> &, bool, bool);
-
- template void
- compute_Cuthill_McKee(std::vector<dealii::types::global_dof_index> &,
- const hp::DoFHandler<deal_II_dimension> &,
- bool,
- bool);
-
- template void
- king_ordering(hp::DoFHandler<deal_II_dimension> &, bool, bool);
-
- template void
- compute_king_ordering(std::vector<dealii::types::global_dof_index> &,
- const hp::DoFHandler<deal_II_dimension> &,
- bool,
- bool);
-
- template void
- minimum_degree(hp::DoFHandler<deal_II_dimension> &, bool, bool);
-
- template void
- compute_minimum_degree(std::vector<dealii::types::global_dof_index> &,
- const hp::DoFHandler<deal_II_dimension> &,
- bool,
- bool);
\}
// non-boost functions:
- template void
- Cuthill_McKee<hp::DoFHandler<deal_II_dimension>>(
- hp::DoFHandler<deal_II_dimension> &,
- const bool,
- const bool,
- const std::vector<types::global_dof_index> &);
-
- template void
- compute_Cuthill_McKee<hp::DoFHandler<deal_II_dimension>>(
- std::vector<types::global_dof_index> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const bool,
- const bool,
- const std::vector<types::global_dof_index> &);
-
template void
component_wise(DoFHandler<deal_II_dimension> &,
unsigned int,
const std::vector<unsigned int> &);
template void
- block_wise<deal_II_dimension>(hp::DoFHandler<deal_II_dimension> &);
-
- template void
- block_wise<deal_II_dimension>(DoFHandler<deal_II_dimension> &,
- unsigned int);
+ block_wise<DoFHandler<deal_II_dimension>>(DoFHandler<deal_II_dimension> &,
+ unsigned int);
template void
cell_wise<DoFHandler<deal_II_dimension>>(
const Point<deal_II_dimension> &,
const bool);
- // Renumbering for hp::DoFHandler
-
- template void
- cell_wise<hp::DoFHandler<deal_II_dimension>>(
- hp::DoFHandler<deal_II_dimension> &,
- const std::vector<
- hp::DoFHandler<deal_II_dimension>::active_cell_iterator> &);
-
- template void
- compute_cell_wise<hp::DoFHandler<deal_II_dimension>>(
- std::vector<types::global_dof_index> &,
- std::vector<types::global_dof_index> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const std::vector<
- hp::DoFHandler<deal_II_dimension>::active_cell_iterator> &);
-
- template void
- compute_downstream<hp::DoFHandler<deal_II_dimension>>(
- std::vector<types::global_dof_index> &,
- std::vector<types::global_dof_index> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const Tensor<1, hp::DoFHandler<deal_II_dimension>::space_dimension> &,
- const bool);
-
- template void
- clockwise_dg<hp::DoFHandler<deal_II_dimension>>(
- hp::DoFHandler<deal_II_dimension> &,
- const Point<deal_II_dimension> &,
- bool);
+ // Renumbering for DoFHandler
- template void
- compute_clockwise_dg<hp::DoFHandler<deal_II_dimension>>(
- std::vector<types::global_dof_index> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const Point<deal_II_dimension> &,
- const bool);
template void
downstream(
const DoFHandler<deal_II_dimension> &,
const std::vector<bool> &);
- template void
- random<hp::DoFHandler<deal_II_dimension>>(
- hp::DoFHandler<deal_II_dimension> &);
-
- template void
- compute_random<hp::DoFHandler<deal_II_dimension>>(
- std::vector<types::global_dof_index> &,
- const hp::DoFHandler<deal_II_dimension> &);
-
- template void
- sort_selected_dofs_back<hp::DoFHandler<deal_II_dimension>>(
- hp::DoFHandler<deal_II_dimension> &,
- const std::vector<bool> &);
-
- template void
- compute_sort_selected_dofs_back<hp::DoFHandler<deal_II_dimension>>(
- std::vector<types::global_dof_index> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const std::vector<bool> &);
-
-
- template void
- subdomain_wise<hp::DoFHandler<deal_II_dimension>>(
- hp::DoFHandler<deal_II_dimension> &);
-
template void
Cuthill_McKee<DoFHandler<deal_II_dimension>>(
DoFHandler<deal_II_dimension> &,
- template <int dim, int spacedim>
+ template <typename DoFHandlerType>
void
- extract_hanging_node_dofs(const DoFHandler<dim, spacedim> &dof_handler,
- std::vector<bool> & selected_dofs)
+ extract_hanging_node_dofs(const DoFHandlerType &dof_handler,
+ std::vector<bool> & selected_dofs)
{
const IndexSet selected_dofs_as_index_set =
extract_hanging_node_dofs(dof_handler);
- template <int dim, int spacedim>
+ template <typename DoFHandlerType>
IndexSet
- extract_hanging_node_dofs(const DoFHandler<dim, spacedim> &dof_handler)
+ extract_hanging_node_dofs(const DoFHandlerType &dof_handler)
{
return internal::extract_hanging_node_dofs(dof_handler);
}
void
map_dofs_to_support_points(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
std::vector<Point<spacedim>> & support_points,
const ComponentMask & mask)
{
void
map_dofs_to_support_points(
const hp::MappingCollection<dim, spacedim> & mapping,
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
std::map<types::global_dof_index, Point<spacedim>> &support_points,
const ComponentMask & mask)
{
const Table<2, Coupling> & table,
std::vector<Table<2, Coupling>> &tables_by_block)
{
- const FiniteElement<dim, spacedim> &fe = dof_handler.get_fe();
- const unsigned int nb = fe.n_blocks();
-
- tables_by_block.resize(1);
- tables_by_block[0].reinit(nb, nb);
- tables_by_block[0].fill(none);
-
- for (unsigned int i = 0; i < fe.n_components(); ++i)
+ if (dof_handler.hp_capability_enabled == false)
{
- const unsigned int ib = fe.component_to_block_index(i);
- for (unsigned int j = 0; j < fe.n_components(); ++j)
- {
- const unsigned int jb = fe.component_to_block_index(j);
- tables_by_block[0](ib, jb) |= table(i, j);
- }
- }
- }
-
-
- template <int dim, int spacedim>
- void
- convert_couplings_to_blocks(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Table<2, Coupling> & table,
- std::vector<Table<2, Coupling>> &tables_by_block)
- {
- const hp::FECollection<dim> &fe_collection =
- dof_handler.get_fe_collection();
- tables_by_block.resize(fe_collection.size());
+ const FiniteElement<dim, spacedim> &fe = dof_handler.get_fe();
+ const unsigned int nb = fe.n_blocks();
- for (unsigned int f = 0; f < fe_collection.size(); ++f)
- {
- const FiniteElement<dim, spacedim> &fe = fe_collection[f];
+ tables_by_block.resize(1);
+ tables_by_block[0].reinit(nb, nb);
+ tables_by_block[0].fill(none);
- const unsigned int nb = fe.n_blocks();
- tables_by_block[f].reinit(nb, nb);
- tables_by_block[f].fill(none);
for (unsigned int i = 0; i < fe.n_components(); ++i)
{
const unsigned int ib = fe.component_to_block_index(i);
for (unsigned int j = 0; j < fe.n_components(); ++j)
{
const unsigned int jb = fe.component_to_block_index(j);
- tables_by_block[f](ib, jb) |= table(i, j);
+ tables_by_block[0](ib, jb) |= table(i, j);
+ }
+ }
+ }
+ else
+ {
+ const hp::FECollection<dim> &fe_collection =
+ dof_handler.get_fe_collection();
+ tables_by_block.resize(fe_collection.size());
+
+ for (unsigned int f = 0; f < fe_collection.size(); ++f)
+ {
+ const FiniteElement<dim, spacedim> &fe = fe_collection[f];
+
+ const unsigned int nb = fe.n_blocks();
+ tables_by_block[f].reinit(nb, nb);
+ tables_by_block[f].fill(none);
+ for (unsigned int i = 0; i < fe.n_components(); ++i)
+ {
+ const unsigned int ib = fe.component_to_block_index(i);
+ for (unsigned int j = 0; j < fe.n_components(); ++j)
+ {
+ const unsigned int jb = fe.component_to_block_index(j);
+ tables_by_block[f](ib, jb) |= table(i, j);
+ }
}
}
}
-for (deal_II_dimension : DIMENSIONS)
+for (DoFHandler : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS)
{
template std::vector<unsigned int> DoFTools::make_vertex_patches(
SparsityPattern &,
Vector<double> & dof_data,
const unsigned int component);
- template void
- DoFTools::distribute_cell_to_dof_vector<hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &dof_handler,
- const Vector<float> & cell_data,
- Vector<double> & dof_data,
- const unsigned int component);
- template void
- DoFTools::distribute_cell_to_dof_vector<hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &dof_handler,
- const Vector<double> & cell_data,
- Vector<double> & dof_data,
- const unsigned int component);
-
-
template void DoFTools::extract_boundary_dofs<
DoFHandler<deal_II_dimension>>(const DoFHandler<deal_II_dimension> &,
const ComponentMask &,
std::vector<bool> &,
const std::set<types::boundary_id> &);
- template void
- DoFTools::extract_boundary_dofs<hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &,
- const ComponentMask &,
- std::vector<bool> &,
- const std::set<types::boundary_id> &);
-
template void DoFTools::extract_boundary_dofs<
DoFHandler<deal_II_dimension>>(const DoFHandler<deal_II_dimension> &,
const ComponentMask &,
IndexSet &,
const std::set<types::boundary_id> &);
- template void
- DoFTools::extract_boundary_dofs<hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &,
- const ComponentMask &,
- IndexSet &,
- const std::set<types::boundary_id> &);
-
template void DoFTools::extract_dofs_with_support_on_boundary<
DoFHandler<deal_II_dimension>>(const DoFHandler<deal_II_dimension> &,
const ComponentMask &,
std::vector<bool> &,
const std::set<types::boundary_id> &);
- template void DoFTools::extract_dofs_with_support_on_boundary<
- hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &,
- const ComponentMask &,
- std::vector<bool> &,
- const std::set<types::boundary_id> &);
template IndexSet DoFTools::extract_hanging_node_dofs(
const DoFHandler<deal_II_dimension> &);
const DoFHandler<deal_II_dimension> &dof_handler,
const types::subdomain_id subdomain_id,
std::vector<bool> & selected_dofs);
- template void
- DoFTools::extract_subdomain_dofs<hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &dof_handler,
- const types::subdomain_id subdomain_id,
- std::vector<bool> & selected_dofs);
template void
DoFTools::extract_constant_modes<DoFHandler<deal_II_dimension>>(
const ComponentMask & selected_components,
std::vector<std::vector<bool>> & constant_modes);
- template void
- DoFTools::extract_constant_modes<hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &dof_handler,
- const ComponentMask & selected_components,
- std::vector<std::vector<bool>> & constant_modes);
-
template void
DoFTools::get_active_fe_indices<DoFHandler<deal_II_dimension>>(
const DoFHandler<deal_II_dimension> &dof_handler,
std::vector<unsigned int> & active_fe_indices);
- template void
- DoFTools::get_active_fe_indices<hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &dof_handler,
- std::vector<unsigned int> & active_fe_indices);
-
template void
DoFTools::get_subdomain_association<DoFHandler<deal_II_dimension>>(
const DoFHandler<deal_II_dimension> &dof_handler,
std::vector<types::subdomain_id> & subdomain_association);
- template void
- DoFTools::get_subdomain_association<hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &dof_handler,
- std::vector<types::subdomain_id> & subdomain_association);
template std::vector<IndexSet>
DoFTools::locally_owned_dofs_per_subdomain<DoFHandler<deal_II_dimension>>(
const DoFHandler<deal_II_dimension> &dof_handler);
- template std::vector<IndexSet> DoFTools::locally_owned_dofs_per_subdomain<
- hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &dof_handler);
template std::vector<IndexSet> DoFTools::
locally_relevant_dofs_per_subdomain<DoFHandler<deal_II_dimension>>(
const DoFHandler<deal_II_dimension> &dof_handler);
- template std::vector<IndexSet> DoFTools::
- locally_relevant_dofs_per_subdomain<hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &dof_handler);
template unsigned int DoFTools::count_dofs_with_subdomain_association<
DoFHandler<deal_II_dimension>>(const DoFHandler<deal_II_dimension> &,
const types::subdomain_id,
std::vector<unsigned int> &);
- template unsigned int DoFTools::count_dofs_with_subdomain_association<
- hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &, const types::subdomain_id);
- template IndexSet DoFTools::dof_indices_with_subdomain_association<
- hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &, const types::subdomain_id);
- template void DoFTools::count_dofs_with_subdomain_association<
- hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &,
- const types::subdomain_id,
- std::vector<unsigned int> &);
-
#if deal_II_dimension < 3
template void DoFTools::extract_boundary_dofs<
const types::subdomain_id,
std::vector<unsigned int> &);
- template unsigned int DoFTools::count_dofs_with_subdomain_association<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &,
- const types::subdomain_id);
-
- template IndexSet DoFTools::dof_indices_with_subdomain_association<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &,
- const types::subdomain_id);
-
template void DoFTools::get_subdomain_association<
DoFHandler<deal_II_dimension, deal_II_dimension + 1>>(
const DoFHandler<deal_II_dimension, deal_II_dimension + 1> &dof_handler,
std::vector<types::subdomain_id> &subdomain_association);
- template void DoFTools::get_subdomain_association<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>
- & dof_handler,
- std::vector<types::subdomain_id> &subdomain_association);
template std::vector<IndexSet> DoFTools::locally_owned_dofs_per_subdomain<
DoFHandler<deal_II_dimension, deal_II_dimension + 1>>(
const DoFHandler<deal_II_dimension, deal_II_dimension + 1> &dof_handler);
- template std::vector<IndexSet> DoFTools::locally_owned_dofs_per_subdomain<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>
- &dof_handler);
template std::vector<IndexSet>
DoFTools::locally_relevant_dofs_per_subdomain<
DoFHandler<deal_II_dimension, deal_II_dimension + 1>>(
const DoFHandler<deal_II_dimension, deal_II_dimension + 1> &dof_handler);
- template std::vector<IndexSet>
- DoFTools::locally_relevant_dofs_per_subdomain<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>
- &dof_handler);
-
- template void DoFTools::count_dofs_with_subdomain_association<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &,
- const types::subdomain_id,
- std::vector<unsigned int> &);
#endif
#if deal_II_dimension == 3
template void DoFTools::get_subdomain_association<DoFHandler<1, 3>>(
const DoFHandler<1, 3> & dof_handler,
std::vector<types::subdomain_id> &subdomain_association);
- template void DoFTools::get_subdomain_association<hp::DoFHandler<1, 3>>(
- const hp::DoFHandler<1, 3> & dof_handler,
- std::vector<types::subdomain_id> &subdomain_association);
template std::vector<IndexSet>
DoFTools::locally_owned_dofs_per_subdomain<DoFHandler<1, 3>>(
const DoFHandler<1, 3> &dof_handler);
- template std::vector<IndexSet>
- DoFTools::locally_owned_dofs_per_subdomain<hp::DoFHandler<1, 3>>(
- const hp::DoFHandler<1, 3> &dof_handler);
template std::vector<IndexSet>
DoFTools::locally_relevant_dofs_per_subdomain<DoFHandler<1, 3>>(
const DoFHandler<1, 3> &dof_handler);
- template std::vector<IndexSet>
- DoFTools::locally_relevant_dofs_per_subdomain<hp::DoFHandler<1, 3>>(
- const hp::DoFHandler<1, 3> &dof_handler);
template unsigned int DoFTools::count_dofs_with_subdomain_association<
DoFHandler<1, 3>>(const DoFHandler<1, 3> &, const types::subdomain_id);
DoFHandler<1, 3>>(const DoFHandler<1, 3> &,
const types::subdomain_id,
std::vector<unsigned int> &);
-
- template unsigned int
- DoFTools::count_dofs_with_subdomain_association<hp::DoFHandler<1, 3>>(
- const hp::DoFHandler<1, 3> &, const types::subdomain_id);
- template IndexSet
- DoFTools::dof_indices_with_subdomain_association<hp::DoFHandler<1, 3>>(
- const hp::DoFHandler<1, 3> &, const types::subdomain_id);
- template void DoFTools::count_dofs_with_subdomain_association<
- hp::DoFHandler<1, 3>>(const hp::DoFHandler<1, 3> &,
- const types::subdomain_id,
- std::vector<unsigned int> &);
#endif
template void DoFTools::map_dof_to_boundary_indices<
std::vector<types::global_dof_index> &);
-
- template void
- DoFTools::map_dof_to_boundary_indices<hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &,
- const std::set<types::boundary_id> &,
- std::vector<types::global_dof_index> &);
-
- template void
- DoFTools::map_dof_to_boundary_indices<hp::DoFHandler<deal_II_dimension>>(
- const hp::DoFHandler<deal_II_dimension> &,
- std::vector<types::global_dof_index> &);
-
-
- template void DoFTools::write_gnuplot_dof_support_point_info(
- std::ostream &,
- const std::map<types::global_dof_index, Point<deal_II_dimension>> &);
-
-
- template void DoFTools::convert_couplings_to_blocks(
- const DoFHandler<deal_II_dimension> &,
- const Table<2, Coupling> &,
- std::vector<Table<2, Coupling>> &);
-
- template void DoFTools::convert_couplings_to_blocks(
- const hp::DoFHandler<deal_II_dimension> &,
- const Table<2, Coupling> &,
- std::vector<Table<2, Coupling>> &);
-
-
#if deal_II_dimension < 3
template void DoFTools::map_dof_to_boundary_indices<
const DoFHandler<deal_II_dimension, deal_II_dimension + 1> &,
std::vector<bool> &);
- template void DoFTools::map_dof_to_boundary_indices<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &,
- const std::set<types::boundary_id> &,
- std::vector<types::global_dof_index> &);
-
- template void DoFTools::map_dof_to_boundary_indices<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &,
- std::vector<types::global_dof_index> &);
-
#endif
#if deal_II_dimension == 3
template void DoFTools::extract_hanging_node_dofs(const DoFHandler<1, 3> &,
std::vector<bool> &);
- template void DoFTools::map_dof_to_boundary_indices<hp::DoFHandler<1, 3>>(
- const hp::DoFHandler<1, 3> &,
- const std::set<unsigned int> &,
- std::vector<types::global_dof_index> &);
+#endif
+ }
- template void DoFTools::map_dof_to_boundary_indices<hp::DoFHandler<1, 3>>(
- const hp::DoFHandler<1, 3> &, std::vector<types::global_dof_index> &);
-#endif
+for (deal_II_dimension : DIMENSIONS)
+ {
+ template void DoFTools::convert_couplings_to_blocks(
+ const DoFHandler<deal_II_dimension> &,
+ const Table<2, Coupling> &,
+ std::vector<Table<2, Coupling>> &);
+
+ template void DoFTools::write_gnuplot_dof_support_point_info(
+ std::ostream &,
+ const std::map<types::global_dof_index, Point<deal_II_dimension>> &);
}
-for (deal_II_dimension : DIMENSIONS; S : REAL_AND_COMPLEX_SCALARS)
+for (DoFHandler : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS;
+ S : REAL_AND_COMPLEX_SCALARS)
{
template IndexSet DoFTools::extract_dofs_with_support_contained_within<
DoFHandler<deal_II_dimension>,
map_dofs_to_support_points<deal_II_dimension, deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
std::vector<Point<deal_II_space_dimension>> &,
const ComponentMask &);
map_dofs_to_support_points<deal_II_dimension, deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
std::map<types::global_dof_index, Point<deal_II_space_dimension>> &,
const ComponentMask &);
+ \}
+#endif
+ }
+for (DoFHandler : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS;
+ deal_II_space_dimension : DIMENSIONS)
+ {
+#if deal_II_dimension <= deal_II_space_dimension
+ namespace DoFTools
+ \{
// extract_level_dofs() for ComponentMask and BlockMask
template void
extract_level_dofs<
const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const BlockMask &,
std::vector<bool> &);
+ \}
+#endif
+ }
+
+for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : DIMENSIONS)
+ {
+#if deal_II_dimension <= deal_II_space_dimension
+ namespace DoFTools
+ \{
template void
make_cell_patches<deal_II_dimension, deal_II_space_dimension>(
SparsityPattern &,
}
- // a template that can determine statically whether a given DoFHandler
- // class supports different finite element elements
- template <typename>
- struct DoFHandlerSupportsDifferentFEs
- {
- static const bool value = true;
- };
-
-
- template <int dim, int spacedim>
- struct DoFHandlerSupportsDifferentFEs<dealii::DoFHandler<dim, spacedim>>
- {
- static const bool value = false;
- };
-
-
/**
* A function that returns how many different finite elements a dof
* handler uses. This is one for non-hp DoFHandlers and
*/
template <int dim, int spacedim>
unsigned int
- n_finite_elements(
- const dealii::hp::DoFHandler<dim, spacedim> &dof_handler)
+ n_finite_elements(const DoFHandler<dim, spacedim> &dof_handler)
{
- return dof_handler.get_fe_collection().size();
- }
-
-
- template <typename DoFHandlerType>
- unsigned int
- n_finite_elements(const DoFHandlerType &)
- {
- return 1;
+ if (dof_handler.hp_capability_enabled == true)
+ return dof_handler.get_fe_collection().size();
+ else
+ return 1;
}
} // namespace
+ template <typename number>
+ void
+ make_hp_hanging_node_constraints(const dealii::DoFHandler<1> &,
+ AffineConstraints<number> &)
+ {
+ // nothing to do for regular dof handlers in 1d
+ }
- template <typename number, int spacedim>
+
+ template <typename number>
void
- make_hp_hanging_node_constraints(
- const dealii::hp::DoFHandler<1, spacedim> & /*dof_handler*/,
- AffineConstraints<number> & /*constraints*/)
+ make_oldstyle_hanging_node_constraints(const dealii::DoFHandler<1> &,
+ AffineConstraints<number> &,
+ std::integral_constant<int, 1>)
{
- // nothing to do for dof handlers in 1d
+ // nothing to do for regular dof handlers in 1d
}
- template <typename number, int spacedim>
+ template <typename number>
void
- make_oldstyle_hanging_node_constraints(
- const dealii::hp::DoFHandler<1, spacedim> & /*dof_handler*/,
- AffineConstraints<number> & /*constraints*/,
- std::integral_constant<int, 1>)
+ make_hp_hanging_node_constraints(const dealii::DoFHandler<1, 2> &,
+ AffineConstraints<number> &)
{
- // nothing to do for dof handlers in 1d
+ // nothing to do for regular dof handlers in 1d
+ }
+
+
+ template <typename number>
+ void
+ make_oldstyle_hanging_node_constraints(const dealii::DoFHandler<1, 2> &,
+ AffineConstraints<number> &,
+ std::integral_constant<int, 1>)
+ {
+ // nothing to do for regular dof handlers in 1d
}
// nothing to do for dof handlers in 1d
}
- template <typename DoFHandlerType, typename number>
+ template <int dim_, int spacedim, typename number>
void
make_oldstyle_hanging_node_constraints(
- const DoFHandlerType & dof_handler,
- AffineConstraints<number> &constraints,
+ const DoFHandler<dim_, spacedim> &dof_handler,
+ AffineConstraints<number> & constraints,
std::integral_constant<int, 2>)
{
const unsigned int dim = 2;
- const unsigned int spacedim = DoFHandlerType::space_dimension;
-
std::vector<types::global_dof_index> dofs_on_mother;
std::vector<types::global_dof_index> dofs_on_children;
// note that even though we may visit a face twice if the neighboring
// cells are equally refined, we can only visit each face with hanging
// nodes once
- typename DoFHandlerType::active_cell_iterator cell = dof_handler
- .begin_active(),
- endc = dof_handler.end();
+ typename DoFHandler<dim_, spacedim>::active_cell_iterator
+ cell = dof_handler.begin_active(),
+ endc = dof_handler.end();
for (; cell != endc; ++cell)
{
// artificial cells can at best neighbor ghost cells, but we're not
ExcDimensionMismatch(n_dofs_on_children,
fe.constraints().m()));
- const typename DoFHandlerType::line_iterator this_face =
- cell->face(face);
+ const typename DoFHandler<dim_, spacedim>::line_iterator
+ this_face = cell->face(face);
// fill the dofs indices. Use same enumeration scheme as in
// @p{FiniteElement::constraints()}
- template <typename DoFHandlerType, typename number>
+ template <int dim_, int spacedim, typename number>
void
make_oldstyle_hanging_node_constraints(
- const DoFHandlerType & dof_handler,
- AffineConstraints<number> &constraints,
+ const DoFHandler<dim_, spacedim> &dof_handler,
+ AffineConstraints<number> & constraints,
std::integral_constant<int, 3>)
{
const unsigned int dim = 3;
// note that even though we may visit a face twice if the neighboring
// cells are equally refined, we can only visit each face with hanging
// nodes once
- typename DoFHandlerType::active_cell_iterator cell = dof_handler
- .begin_active(),
- endc = dof_handler.end();
+ typename DoFHandler<dim_, spacedim>::active_cell_iterator
+ cell = dof_handler.begin_active(),
+ endc = dof_handler.end();
for (; cell != endc; ++cell)
{
// artificial cells can at best neighbor ghost cells, but we're not
ExcDimensionMismatch(n_dofs_on_children,
fe.constraints().m()));
- const typename DoFHandlerType::face_iterator this_face =
- cell->face(face);
+ const typename DoFHandler<dim_, spacedim>::face_iterator
+ this_face = cell->face(face);
// fill the dofs indices. Use same enumeration scheme as in
// @p{FiniteElement::constraints()}
- template <typename DoFHandlerType, typename number>
+ template <int dim, int spacedim, typename number>
void
- make_hp_hanging_node_constraints(const DoFHandlerType & dof_handler,
- AffineConstraints<number> &constraints)
+ make_hp_hanging_node_constraints(
+ const DoFHandler<dim, spacedim> &dof_handler,
+ AffineConstraints<number> & constraints)
{
// note: this function is going to be hard to understand if you haven't
// read the hp paper. however, we try to follow the notation laid out
// there, so go read the paper before you try to understand what is going
// on here
- const unsigned int dim = DoFHandlerType::dimension;
-
- const unsigned int spacedim = DoFHandlerType::space_dimension;
-
// a matrix to be used for constraints below. declared here and simply
// resized down below to avoid permanent re-allocation of memory
std::set<unsigned int> fe_ind_face_subface;
fe_ind_face_subface.insert(cell->active_fe_index());
- if (DoFHandlerSupportsDifferentFEs<DoFHandlerType>::value ==
- true)
+ if (dof_handler.hp_capability_enabled)
for (unsigned int c = 0;
c < cell->face(face)->number_of_children();
++c)
->is_artificial())
continue;
- const typename DoFHandlerType::active_face_iterator
- subface = cell->face(face)->child(c);
+ const typename DoFHandler<dim, spacedim>::
+ active_face_iterator subface =
+ cell->face(face)->child(c);
Assert(subface->n_active_fe_indices() == 1,
ExcInternalError());
//
// since this is something that can only happen for hp
// dof handlers, add a check here...
- Assert(DoFHandlerSupportsDifferentFEs<
- DoFHandlerType>::value == true,
+ Assert(dof_handler.hp_capability_enabled == true,
ExcInternalError());
const dealii::hp::FECollection<dim, spacedim>
// Only if there is a neighbor with a different active_fe_index
// and the same h-level, some action has to be taken.
- if ((DoFHandlerSupportsDifferentFEs<DoFHandlerType>::value ==
- true) &&
+ if ((dof_handler.hp_capability_enabled) &&
!cell->face(face)->at_boundary() &&
(cell->neighbor(face)->active_fe_index() !=
cell->active_fe_index()) &&
(!cell->face(face)->has_children() &&
!cell->neighbor_is_coarser(face)))
{
- const typename DoFHandlerType::level_cell_iterator
+ const typename DoFHandler<dim,
+ spacedim>::level_cell_iterator
neighbor = cell->neighbor(face);
// see which side of the face we have to constrain
const ComponentMask &component_mask,
const number periodicity_factor)
{
- static const int space_dim = DoFHandlerType::space_dimension;
- (void)space_dim;
- AssertIndexRange(direction, space_dim);
+ static const int spacedim = DoFHandlerType::space_dimension;
+ (void)spacedim;
+ AssertIndexRange(direction, spacedim);
Assert(b_id1 != b_id2,
ExcMessage("The boundary indicators b_id1 and b_id2 must be "
const ComponentMask & component_mask,
const number periodicity_factor)
{
- static const int dim = DoFHandlerType::dimension;
- static const int space_dim = DoFHandlerType::space_dimension;
+ static const int dim = DoFHandlerType::dimension;
+ static const int spacedim = DoFHandlerType::space_dimension;
(void)dim;
- (void)space_dim;
+ (void)spacedim;
- AssertIndexRange(direction, space_dim);
+ AssertIndexRange(direction, spacedim);
- Assert(dim == space_dim, ExcNotImplemented());
+ Assert(dim == spacedim, ExcNotImplemented());
std::vector<
GridTools::PeriodicFacePair<typename DoFHandlerType::cell_iterator>>
const InterGridMap<DoFHandler<dim, spacedim>> &coarse_to_fine_grid_map,
AffineConstraints<double> & constraints)
{
+ Assert(coarse_grid.get_fe_collection().size() == 1 &&
+ fine_grid.get_fe_collection().size() == 1,
+ ExcMessage("This function is not yet implemented for DoFHandlers "
+ "using hp capabilities."));
// store the weights with which a dof on the parameter grid contributes to a
// dof on the fine grid. see the long doc below for more info
//
std::vector<std::map<types::global_dof_index, float>>
&transfer_representation)
{
+ Assert(coarse_grid.get_fe_collection().size() == 1 &&
+ fine_grid.get_fe_collection().size() == 1,
+ ExcMessage("This function is not yet implemented for DoFHandlers "
+ "using hp capabilities."));
// store the weights with which a dof on the parameter grid contributes to a
// dof on the fine grid. see the long doc below for more info
//
//
// ---------------------------------------------------------------------
-for (DH : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS)
+for (deal_II_dimension : DIMENSIONS)
{
template void DoFTools::make_periodicity_constraints(
- const DH<deal_II_dimension>::face_iterator &,
- const DH<deal_II_dimension>::face_iterator &,
+ const DoFHandler<deal_II_dimension>::face_iterator &,
+ const DoFHandler<deal_II_dimension>::face_iterator &,
AffineConstraints<double> &,
const ComponentMask &,
bool,
#ifdef DEAL_II_WITH_COMPLEX_VALUES
template void DoFTools::make_periodicity_constraints(
- const DH<deal_II_dimension>::face_iterator &,
- const DH<deal_II_dimension>::face_iterator &,
+ const DoFHandler<deal_II_dimension>::face_iterator &,
+ const DoFHandler<deal_II_dimension>::face_iterator &,
AffineConstraints<std::complex<double>> &,
const ComponentMask &,
bool,
const std::vector<unsigned int> &,
std::complex<double>);
#endif
+ }
+for (DH : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS)
+ {
template void
DoFTools::make_periodicity_constraints<DH<deal_II_dimension>, double>(
const std::vector<
#endif
}
-// intergrid transfer is not yet implemented for hp::DoFHandler
for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS)
{
#if deal_II_dimension <= deal_II_space_dimension
bool(const typename DoFHandler<dim, spacedim>::active_cell_iterator &,
const unsigned int)> &face_has_flux_coupling)
{
- const FiniteElement<dim, spacedim> &fe = dof.get_fe();
-
- std::vector<types::global_dof_index> dofs_on_this_cell(
- fe.dofs_per_cell);
- std::vector<types::global_dof_index> dofs_on_other_cell(
- fe.dofs_per_cell);
-
- const Table<2, Coupling>
- int_dof_mask = dof_couplings_from_component_couplings(fe, int_mask),
- flux_dof_mask = dof_couplings_from_component_couplings(fe, flux_mask);
-
- Table<2, bool> support_on_face(fe.dofs_per_cell,
- GeometryInfo<dim>::faces_per_cell);
- for (unsigned int i = 0; i < fe.dofs_per_cell; ++i)
- for (const unsigned int f : GeometryInfo<dim>::face_indices())
- support_on_face(i, f) = fe.has_support_on_face(i, f);
-
- // Convert the int_dof_mask to bool_int_dof_mask so we can pass it
- // to constraints.add_entries_local_to_global()
- Table<2, bool> bool_int_dof_mask(fe.dofs_per_cell, fe.dofs_per_cell);
- bool_int_dof_mask.fill(false);
- for (unsigned int i = 0; i < fe.dofs_per_cell; ++i)
- for (unsigned int j = 0; j < fe.dofs_per_cell; ++j)
- if (int_dof_mask(i, j) != none)
- bool_int_dof_mask(i, j) = true;
-
- typename DoFHandler<dim, spacedim>::active_cell_iterator
- cell = dof.begin_active(),
- endc = dof.end();
- for (; cell != endc; ++cell)
- if (((subdomain_id == numbers::invalid_subdomain_id) ||
- (subdomain_id == cell->subdomain_id())) &&
- cell->is_locally_owned())
- {
- cell->get_dof_indices(dofs_on_this_cell);
- // make sparsity pattern for this cell
- constraints.add_entries_local_to_global(dofs_on_this_cell,
- sparsity,
- keep_constrained_dofs,
- bool_int_dof_mask);
- // Loop over all interior neighbors
- for (const unsigned int face_n :
- GeometryInfo<dim>::face_indices())
+ if (dof.hp_capability_enabled == false)
+ {
+ const FiniteElement<dim, spacedim> &fe = dof.get_fe();
+
+ std::vector<types::global_dof_index> dofs_on_this_cell(
+ fe.dofs_per_cell);
+ std::vector<types::global_dof_index> dofs_on_other_cell(
+ fe.dofs_per_cell);
+
+ const Table<2, Coupling>
+ int_dof_mask =
+ dof_couplings_from_component_couplings(fe, int_mask),
+ flux_dof_mask =
+ dof_couplings_from_component_couplings(fe, flux_mask);
+
+ Table<2, bool> support_on_face(fe.dofs_per_cell,
+ GeometryInfo<dim>::faces_per_cell);
+ for (unsigned int i = 0; i < fe.dofs_per_cell; ++i)
+ for (const unsigned int f : GeometryInfo<dim>::face_indices())
+ support_on_face(i, f) = fe.has_support_on_face(i, f);
+
+ // Convert the int_dof_mask to bool_int_dof_mask so we can pass it
+ // to constraints.add_entries_local_to_global()
+ Table<2, bool> bool_int_dof_mask(fe.dofs_per_cell,
+ fe.dofs_per_cell);
+ bool_int_dof_mask.fill(false);
+ for (unsigned int i = 0; i < fe.dofs_per_cell; ++i)
+ for (unsigned int j = 0; j < fe.dofs_per_cell; ++j)
+ if (int_dof_mask(i, j) != none)
+ bool_int_dof_mask(i, j) = true;
+
+ typename DoFHandler<dim, spacedim>::active_cell_iterator
+ cell = dof.begin_active(),
+ endc = dof.end();
+ for (; cell != endc; ++cell)
+ if (((subdomain_id == numbers::invalid_subdomain_id) ||
+ (subdomain_id == cell->subdomain_id())) &&
+ cell->is_locally_owned())
{
- const typename DoFHandler<dim, spacedim>::face_iterator
- cell_face = cell->face(face_n);
+ cell->get_dof_indices(dofs_on_this_cell);
+ // make sparsity pattern for this cell
+ constraints.add_entries_local_to_global(dofs_on_this_cell,
+ sparsity,
+ keep_constrained_dofs,
+ bool_int_dof_mask);
+ // Loop over all interior neighbors
+ for (const unsigned int face_n :
+ GeometryInfo<dim>::face_indices())
+ {
+ const typename DoFHandler<dim, spacedim>::face_iterator
+ cell_face = cell->face(face_n);
- const bool periodic_neighbor =
- cell->has_periodic_neighbor(face_n);
+ const bool periodic_neighbor =
+ cell->has_periodic_neighbor(face_n);
- if (cell->at_boundary(face_n) && (!periodic_neighbor))
- {
- for (unsigned int i = 0; i < fe.dofs_per_cell; ++i)
+ if (cell->at_boundary(face_n) && (!periodic_neighbor))
{
- const bool i_non_zero_i = support_on_face(i, face_n);
- for (unsigned int j = 0; j < fe.dofs_per_cell; ++j)
+ for (unsigned int i = 0; i < fe.dofs_per_cell; ++i)
{
- const bool j_non_zero_i =
- support_on_face(j, face_n);
-
- if (flux_dof_mask(i, j) == always ||
- (flux_dof_mask(i, j) == nonzero &&
- i_non_zero_i && j_non_zero_i))
- sparsity.add(dofs_on_this_cell[i],
- dofs_on_this_cell[j]);
+ const bool i_non_zero_i =
+ support_on_face(i, face_n);
+ for (unsigned int j = 0; j < fe.dofs_per_cell;
+ ++j)
+ {
+ const bool j_non_zero_i =
+ support_on_face(j, face_n);
+
+ if (flux_dof_mask(i, j) == always ||
+ (flux_dof_mask(i, j) == nonzero &&
+ i_non_zero_i && j_non_zero_i))
+ sparsity.add(dofs_on_this_cell[i],
+ dofs_on_this_cell[j]);
+ }
}
}
- }
- else
- {
- if (!face_has_flux_coupling(cell, face_n))
- continue;
-
- typename DoFHandler<dim, spacedim>::level_cell_iterator
- neighbor = cell->neighbor_or_periodic_neighbor(face_n);
- // If the cells are on the same level (and both are
- // active, locally-owned cells) then only add to the
- // sparsity pattern if the current cell is 'greater' in
- // the total ordering.
- if (neighbor->level() == cell->level() &&
- neighbor->index() > cell->index() &&
- neighbor->is_active() && neighbor->is_locally_owned())
- continue;
- // If we are more refined then the neighbor, then we
- // will automatically find the active neighbor cell when
- // we call 'neighbor (face_n)' above. The opposite is
- // not true; if the neighbor is more refined then the
- // call 'neighbor (face_n)' will *not* return an active
- // cell. Hence, only add things to the sparsity pattern
- // if (when the levels are different) the neighbor is
- // coarser than the current cell.
- //
- // Like above, do not use this optimization if the
- // neighbor is not locally owned.
- if (neighbor->level() != cell->level() &&
- ((!periodic_neighbor &&
- !cell->neighbor_is_coarser(face_n)) ||
- (periodic_neighbor &&
- !cell->periodic_neighbor_is_coarser(face_n))) &&
- neighbor->is_locally_owned())
- continue; // (the neighbor is finer)
-
- const unsigned int neighbor_face_n =
- periodic_neighbor ?
- cell->periodic_neighbor_face_no(face_n) :
- cell->neighbor_face_no(face_n);
-
-
- // In 1D, go straight to the cell behind this particular
- // cell's most terminal cell. This makes us skip the
- // if (neighbor->has_children()) section below. We need to
- // do this since we otherwise iterate over the children of
- // the face, which are always 0 in 1D.
- if (dim == 1)
- while (neighbor->has_children())
- neighbor = neighbor->child(face_n == 0 ? 1 : 0);
-
- if (neighbor->has_children())
+ else
{
- for (unsigned int sub_nr = 0;
- sub_nr != cell_face->n_children();
- ++sub_nr)
+ if (!face_has_flux_coupling(cell, face_n))
+ continue;
+
+ typename DoFHandler<dim,
+ spacedim>::level_cell_iterator
+ neighbor =
+ cell->neighbor_or_periodic_neighbor(face_n);
+ // If the cells are on the same level (and both are
+ // active, locally-owned cells) then only add to the
+ // sparsity pattern if the current cell is 'greater'
+ // in the total ordering.
+ if (neighbor->level() == cell->level() &&
+ neighbor->index() > cell->index() &&
+ neighbor->is_active() &&
+ neighbor->is_locally_owned())
+ continue;
+ // If we are more refined then the neighbor, then we
+ // will automatically find the active neighbor cell
+ // when we call 'neighbor (face_n)' above. The
+ // opposite is not true; if the neighbor is more
+ // refined then the call 'neighbor (face_n)' will
+ // *not* return an active cell. Hence, only add things
+ // to the sparsity pattern if (when the levels are
+ // different) the neighbor is coarser than the current
+ // cell.
+ //
+ // Like above, do not use this optimization if the
+ // neighbor is not locally owned.
+ if (neighbor->level() != cell->level() &&
+ ((!periodic_neighbor &&
+ !cell->neighbor_is_coarser(face_n)) ||
+ (periodic_neighbor &&
+ !cell->periodic_neighbor_is_coarser(face_n))) &&
+ neighbor->is_locally_owned())
+ continue; // (the neighbor is finer)
+
+ const unsigned int neighbor_face_n =
+ periodic_neighbor ?
+ cell->periodic_neighbor_face_no(face_n) :
+ cell->neighbor_face_no(face_n);
+
+
+ // In 1D, go straight to the cell behind this
+ // particular cell's most terminal cell. This makes us
+ // skip the if (neighbor->has_children()) section
+ // below. We need to do this since we otherwise
+ // iterate over the children of the face, which are
+ // always 0 in 1D.
+ if (dim == 1)
+ while (neighbor->has_children())
+ neighbor = neighbor->child(face_n == 0 ? 1 : 0);
+
+ if (neighbor->has_children())
+ {
+ for (unsigned int sub_nr = 0;
+ sub_nr != cell_face->n_children();
+ ++sub_nr)
+ {
+ const typename DoFHandler<dim, spacedim>::
+ level_cell_iterator sub_neighbor =
+ periodic_neighbor ?
+ cell
+ ->periodic_neighbor_child_on_subface(
+ face_n, sub_nr) :
+ cell->neighbor_child_on_subface(face_n,
+ sub_nr);
+
+ sub_neighbor->get_dof_indices(
+ dofs_on_other_cell);
+ for (unsigned int i = 0; i < fe.dofs_per_cell;
+ ++i)
+ {
+ const bool i_non_zero_i =
+ support_on_face(i, face_n);
+ const bool i_non_zero_e =
+ support_on_face(i, neighbor_face_n);
+ for (unsigned int j = 0;
+ j < fe.dofs_per_cell;
+ ++j)
+ {
+ const bool j_non_zero_i =
+ support_on_face(j, face_n);
+ const bool j_non_zero_e =
+ support_on_face(j, neighbor_face_n);
+
+ if (flux_dof_mask(i, j) == always)
+ {
+ sparsity.add(
+ dofs_on_this_cell[i],
+ dofs_on_other_cell[j]);
+ sparsity.add(
+ dofs_on_other_cell[i],
+ dofs_on_this_cell[j]);
+ sparsity.add(
+ dofs_on_this_cell[i],
+ dofs_on_this_cell[j]);
+ sparsity.add(
+ dofs_on_other_cell[i],
+ dofs_on_other_cell[j]);
+ }
+ else if (flux_dof_mask(i, j) ==
+ nonzero)
+ {
+ if (i_non_zero_i && j_non_zero_e)
+ sparsity.add(
+ dofs_on_this_cell[i],
+ dofs_on_other_cell[j]);
+ if (i_non_zero_e && j_non_zero_i)
+ sparsity.add(
+ dofs_on_other_cell[i],
+ dofs_on_this_cell[j]);
+ if (i_non_zero_i && j_non_zero_i)
+ sparsity.add(
+ dofs_on_this_cell[i],
+ dofs_on_this_cell[j]);
+ if (i_non_zero_e && j_non_zero_e)
+ sparsity.add(
+ dofs_on_other_cell[i],
+ dofs_on_other_cell[j]);
+ }
+
+ if (flux_dof_mask(j, i) == always)
+ {
+ sparsity.add(
+ dofs_on_this_cell[j],
+ dofs_on_other_cell[i]);
+ sparsity.add(
+ dofs_on_other_cell[j],
+ dofs_on_this_cell[i]);
+ sparsity.add(
+ dofs_on_this_cell[j],
+ dofs_on_this_cell[i]);
+ sparsity.add(
+ dofs_on_other_cell[j],
+ dofs_on_other_cell[i]);
+ }
+ else if (flux_dof_mask(j, i) ==
+ nonzero)
+ {
+ if (j_non_zero_i && i_non_zero_e)
+ sparsity.add(
+ dofs_on_this_cell[j],
+ dofs_on_other_cell[i]);
+ if (j_non_zero_e && i_non_zero_i)
+ sparsity.add(
+ dofs_on_other_cell[j],
+ dofs_on_this_cell[i]);
+ if (j_non_zero_i && i_non_zero_i)
+ sparsity.add(
+ dofs_on_this_cell[j],
+ dofs_on_this_cell[i]);
+ if (j_non_zero_e && i_non_zero_e)
+ sparsity.add(
+ dofs_on_other_cell[j],
+ dofs_on_other_cell[i]);
+ }
+ }
+ }
+ }
+ }
+ else
{
- const typename DoFHandler<dim, spacedim>::
- level_cell_iterator sub_neighbor =
- periodic_neighbor ?
- cell->periodic_neighbor_child_on_subface(
- face_n, sub_nr) :
- cell->neighbor_child_on_subface(face_n,
- sub_nr);
-
- sub_neighbor->get_dof_indices(dofs_on_other_cell);
+ neighbor->get_dof_indices(dofs_on_other_cell);
for (unsigned int i = 0; i < fe.dofs_per_cell;
++i)
{
support_on_face(j, face_n);
const bool j_non_zero_e =
support_on_face(j, neighbor_face_n);
-
if (flux_dof_mask(i, j) == always)
{
sparsity.add(dofs_on_this_cell[i],
sparsity.add(dofs_on_other_cell[i],
dofs_on_other_cell[j]);
}
- else if (flux_dof_mask(i, j) == nonzero)
+ if (flux_dof_mask(i, j) == nonzero)
{
if (i_non_zero_i && j_non_zero_e)
sparsity.add(dofs_on_this_cell[i],
sparsity.add(dofs_on_other_cell[j],
dofs_on_other_cell[i]);
}
- else if (flux_dof_mask(j, i) == nonzero)
+ if (flux_dof_mask(j, i) == nonzero)
{
if (j_non_zero_i && i_non_zero_e)
sparsity.add(dofs_on_this_cell[j],
}
}
}
- else
- {
- neighbor->get_dof_indices(dofs_on_other_cell);
- for (unsigned int i = 0; i < fe.dofs_per_cell; ++i)
- {
- const bool i_non_zero_i =
- support_on_face(i, face_n);
- const bool i_non_zero_e =
- support_on_face(i, neighbor_face_n);
- for (unsigned int j = 0; j < fe.dofs_per_cell;
- ++j)
- {
- const bool j_non_zero_i =
- support_on_face(j, face_n);
- const bool j_non_zero_e =
- support_on_face(j, neighbor_face_n);
- if (flux_dof_mask(i, j) == always)
- {
- sparsity.add(dofs_on_this_cell[i],
- dofs_on_other_cell[j]);
- sparsity.add(dofs_on_other_cell[i],
- dofs_on_this_cell[j]);
- sparsity.add(dofs_on_this_cell[i],
- dofs_on_this_cell[j]);
- sparsity.add(dofs_on_other_cell[i],
- dofs_on_other_cell[j]);
- }
- if (flux_dof_mask(i, j) == nonzero)
- {
- if (i_non_zero_i && j_non_zero_e)
- sparsity.add(dofs_on_this_cell[i],
- dofs_on_other_cell[j]);
- if (i_non_zero_e && j_non_zero_i)
- sparsity.add(dofs_on_other_cell[i],
- dofs_on_this_cell[j]);
- if (i_non_zero_i && j_non_zero_i)
- sparsity.add(dofs_on_this_cell[i],
- dofs_on_this_cell[j]);
- if (i_non_zero_e && j_non_zero_e)
- sparsity.add(dofs_on_other_cell[i],
- dofs_on_other_cell[j]);
- }
-
- if (flux_dof_mask(j, i) == always)
- {
- sparsity.add(dofs_on_this_cell[j],
- dofs_on_other_cell[i]);
- sparsity.add(dofs_on_other_cell[j],
- dofs_on_this_cell[i]);
- sparsity.add(dofs_on_this_cell[j],
- dofs_on_this_cell[i]);
- sparsity.add(dofs_on_other_cell[j],
- dofs_on_other_cell[i]);
- }
- if (flux_dof_mask(j, i) == nonzero)
- {
- if (j_non_zero_i && i_non_zero_e)
- sparsity.add(dofs_on_this_cell[j],
- dofs_on_other_cell[i]);
- if (j_non_zero_e && i_non_zero_i)
- sparsity.add(dofs_on_other_cell[j],
- dofs_on_this_cell[i]);
- if (j_non_zero_i && i_non_zero_i)
- sparsity.add(dofs_on_this_cell[j],
- dofs_on_this_cell[i]);
- if (j_non_zero_e && i_non_zero_e)
- sparsity.add(dofs_on_other_cell[j],
- dofs_on_other_cell[i]);
- }
- }
- }
- }
}
}
- }
- }
-
-
- // implementation of the same function in namespace DoFTools for hp
- // DoFHandlers
- template <int dim,
- int spacedim,
- typename SparsityPatternType,
- typename number>
- void
- make_flux_sparsity_pattern(
- const dealii::hp::DoFHandler<dim, spacedim> &dof,
- SparsityPatternType & sparsity,
- const AffineConstraints<number> & constraints,
- const bool keep_constrained_dofs,
- const Table<2, Coupling> & int_mask,
- const Table<2, Coupling> & flux_mask,
- const types::subdomain_id subdomain_id,
- const std::function<
- bool(const typename dealii::hp::DoFHandler<dim, spacedim>::
- active_cell_iterator &,
- const unsigned int)> &face_has_flux_coupling)
- {
- // while the implementation above is quite optimized and caches a
- // lot of data (see e.g. the int/flux_dof_mask tables), this is no
- // longer practical for the hp version since we would have to have
- // it for all combinations of elements in the hp::FECollection.
- // consequently, the implementation here is simpler and probably
- // less efficient but at least readable...
-
- const dealii::hp::FECollection<dim, spacedim> &fe =
- dof.get_fe_collection();
-
- std::vector<types::global_dof_index> dofs_on_this_cell(
- DoFTools::max_dofs_per_cell(dof));
- std::vector<types::global_dof_index> dofs_on_other_cell(
- DoFTools::max_dofs_per_cell(dof));
-
- const unsigned int n_components = fe.n_components();
- AssertDimension(int_mask.size(0), n_components);
- AssertDimension(int_mask.size(1), n_components);
- AssertDimension(flux_mask.size(0), n_components);
- AssertDimension(flux_mask.size(1), n_components);
-
- // note that we also need to set the respective entries if flux_mask
- // says so. this is necessary since we need to consider all degrees of
- // freedom on a cell for interior faces.
- Table<2, Coupling> int_and_flux_mask(n_components, n_components);
- for (unsigned int c1 = 0; c1 < n_components; ++c1)
- for (unsigned int c2 = 0; c2 < n_components; ++c2)
- if (int_mask(c1, c2) != none || flux_mask(c1, c2) != none)
- int_and_flux_mask(c1, c2) = always;
-
- std::vector<Table<2, Coupling>> int_and_flux_dof_mask =
- dof_couplings_from_component_couplings(fe, int_and_flux_mask);
-
- // Convert int_and_flux_dof_mask to bool_int_and_flux_dof_mask so we
- // can pass it to constraints.add_entries_local_to_global()
- std::vector<Table<2, bool>> bool_int_and_flux_dof_mask(fe.size());
- for (unsigned int f = 0; f < fe.size(); ++f)
- {
- bool_int_and_flux_dof_mask[f].reinit(
- TableIndices<2>(fe[f].dofs_per_cell, fe[f].dofs_per_cell));
- bool_int_and_flux_dof_mask[f].fill(false);
- for (unsigned int i = 0; i < fe[f].dofs_per_cell; ++i)
- for (unsigned int j = 0; j < fe[f].dofs_per_cell; ++j)
- if (int_and_flux_dof_mask[f](i, j) != none)
- bool_int_and_flux_dof_mask[f](i, j) = true;
}
+ else
+ {
+ // while the implementation above is quite optimized and caches a
+ // lot of data (see e.g. the int/flux_dof_mask tables), this is no
+ // longer practical for the hp version since we would have to have
+ // it for all combinations of elements in the hp::FECollection.
+ // consequently, the implementation here is simpler and probably
+ // less efficient but at least readable...
+
+ const dealii::hp::FECollection<dim, spacedim> &fe =
+ dof.get_fe_collection();
+
+ std::vector<types::global_dof_index> dofs_on_this_cell(
+ DoFTools::max_dofs_per_cell(dof));
+ std::vector<types::global_dof_index> dofs_on_other_cell(
+ DoFTools::max_dofs_per_cell(dof));
+
+ const unsigned int n_components = fe.n_components();
+ AssertDimension(int_mask.size(0), n_components);
+ AssertDimension(int_mask.size(1), n_components);
+ AssertDimension(flux_mask.size(0), n_components);
+ AssertDimension(flux_mask.size(1), n_components);
+
+ // note that we also need to set the respective entries if flux_mask
+ // says so. this is necessary since we need to consider all degrees
+ // of freedom on a cell for interior faces.
+ Table<2, Coupling> int_and_flux_mask(n_components, n_components);
+ for (unsigned int c1 = 0; c1 < n_components; ++c1)
+ for (unsigned int c2 = 0; c2 < n_components; ++c2)
+ if (int_mask(c1, c2) != none || flux_mask(c1, c2) != none)
+ int_and_flux_mask(c1, c2) = always;
+
+ std::vector<Table<2, Coupling>> int_and_flux_dof_mask =
+ dof_couplings_from_component_couplings(fe, int_and_flux_mask);
+
+ // Convert int_and_flux_dof_mask to bool_int_and_flux_dof_mask so we
+ // can pass it to constraints.add_entries_local_to_global()
+ std::vector<Table<2, bool>> bool_int_and_flux_dof_mask(fe.size());
+ for (unsigned int f = 0; f < fe.size(); ++f)
+ {
+ bool_int_and_flux_dof_mask[f].reinit(
+ TableIndices<2>(fe[f].dofs_per_cell, fe[f].dofs_per_cell));
+ bool_int_and_flux_dof_mask[f].fill(false);
+ for (unsigned int i = 0; i < fe[f].dofs_per_cell; ++i)
+ for (unsigned int j = 0; j < fe[f].dofs_per_cell; ++j)
+ if (int_and_flux_dof_mask[f](i, j) != none)
+ bool_int_and_flux_dof_mask[f](i, j) = true;
+ }
- typename dealii::hp::DoFHandler<dim, spacedim>::active_cell_iterator
- cell = dof.begin_active(),
- endc = dof.end();
- for (; cell != endc; ++cell)
- if (((subdomain_id == numbers::invalid_subdomain_id) ||
- (subdomain_id == cell->subdomain_id())) &&
- cell->is_locally_owned())
- {
- dofs_on_this_cell.resize(cell->get_fe().dofs_per_cell);
- cell->get_dof_indices(dofs_on_this_cell);
-
- // make sparsity pattern for this cell also taking into account
- // the couplings due to face contributions on the same cell
- constraints.add_entries_local_to_global(
- dofs_on_this_cell,
- sparsity,
- keep_constrained_dofs,
- bool_int_and_flux_dof_mask[cell->active_fe_index()]);
-
- // Loop over interior faces
- for (const unsigned int face : GeometryInfo<dim>::face_indices())
+ typename dealii::DoFHandler<dim, spacedim>::active_cell_iterator
+ cell = dof.begin_active(),
+ endc = dof.end();
+ for (; cell != endc; ++cell)
+ if (((subdomain_id == numbers::invalid_subdomain_id) ||
+ (subdomain_id == cell->subdomain_id())) &&
+ cell->is_locally_owned())
{
- const typename dealii::hp::DoFHandler<dim,
+ dofs_on_this_cell.resize(cell->get_fe().dofs_per_cell);
+ cell->get_dof_indices(dofs_on_this_cell);
+
+ // make sparsity pattern for this cell also taking into
+ // account the couplings due to face contributions on the same
+ // cell
+ constraints.add_entries_local_to_global(
+ dofs_on_this_cell,
+ sparsity,
+ keep_constrained_dofs,
+ bool_int_and_flux_dof_mask[cell->active_fe_index()]);
+
+ // Loop over interior faces
+ for (const unsigned int face :
+ GeometryInfo<dim>::face_indices())
+ {
+ const typename dealii::DoFHandler<dim,
spacedim>::face_iterator
- cell_face = cell->face(face);
+ cell_face = cell->face(face);
- const bool periodic_neighbor =
- cell->has_periodic_neighbor(face);
+ const bool periodic_neighbor =
+ cell->has_periodic_neighbor(face);
- if ((!cell->at_boundary(face)) || periodic_neighbor)
- {
- typename dealii::hp::DoFHandler<dim, spacedim>::
- level_cell_iterator neighbor =
- cell->neighbor_or_periodic_neighbor(face);
-
- if (!face_has_flux_coupling(cell, face))
- continue;
-
- // Like the non-hp case: If the cells are on the same
- // level (and both are active, locally-owned cells) then
- // only add to the sparsity pattern if the current cell
- // is 'greater' in the total ordering.
- if (neighbor->level() == cell->level() &&
- neighbor->index() > cell->index() &&
- neighbor->is_active() && neighbor->is_locally_owned())
- continue;
- // Again, like the non-hp case: If we are more refined
- // then the neighbor, then we will automatically find
- // the active neighbor cell when we call 'neighbor
- // (face)' above. The opposite is not true; if the
- // neighbor is more refined then the call 'neighbor
- // (face)' will *not* return an active cell. Hence,
- // only add things to the sparsity pattern if (when the
- // levels are different) the neighbor is coarser than
- // the current cell.
- //
- // Like above, do not use this optimization if the
- // neighbor is not locally owned.
- if (neighbor->level() != cell->level() &&
- ((!periodic_neighbor &&
- !cell->neighbor_is_coarser(face)) ||
- (periodic_neighbor &&
- !cell->periodic_neighbor_is_coarser(face))) &&
- neighbor->is_locally_owned())
- continue; // (the neighbor is finer)
-
- // In 1D, go straight to the cell behind this particular
- // cell's most terminal cell. This makes us skip the
- // if (neighbor->has_children()) section below. We need to
- // do this since we otherwise iterate over the children of
- // the face, which are always 0 in 1D.
- if (dim == 1)
- while (neighbor->has_children())
- neighbor = neighbor->child(face == 0 ? 1 : 0);
-
- if (neighbor->has_children())
+ if ((!cell->at_boundary(face)) || periodic_neighbor)
{
- for (unsigned int sub_nr = 0;
- sub_nr != cell_face->n_children();
- ++sub_nr)
+ typename dealii::DoFHandler<dim, spacedim>::
+ level_cell_iterator neighbor =
+ cell->neighbor_or_periodic_neighbor(face);
+
+ if (!face_has_flux_coupling(cell, face))
+ continue;
+
+ // Like the non-hp case: If the cells are on the same
+ // level (and both are active, locally-owned cells)
+ // then only add to the sparsity pattern if the
+ // current cell is 'greater' in the total ordering.
+ if (neighbor->level() == cell->level() &&
+ neighbor->index() > cell->index() &&
+ neighbor->is_active() &&
+ neighbor->is_locally_owned())
+ continue;
+ // Again, like the non-hp case: If we are more refined
+ // then the neighbor, then we will automatically find
+ // the active neighbor cell when we call 'neighbor
+ // (face)' above. The opposite is not true; if the
+ // neighbor is more refined then the call 'neighbor
+ // (face)' will *not* return an active cell. Hence,
+ // only add things to the sparsity pattern if (when
+ // the levels are different) the neighbor is coarser
+ // than the current cell.
+ //
+ // Like above, do not use this optimization if the
+ // neighbor is not locally owned.
+ if (neighbor->level() != cell->level() &&
+ ((!periodic_neighbor &&
+ !cell->neighbor_is_coarser(face)) ||
+ (periodic_neighbor &&
+ !cell->periodic_neighbor_is_coarser(face))) &&
+ neighbor->is_locally_owned())
+ continue; // (the neighbor is finer)
+
+ // In 1D, go straight to the cell behind this
+ // particular cell's most terminal cell. This makes us
+ // skip the if (neighbor->has_children()) section
+ // below. We need to do this since we otherwise
+ // iterate over the children of the face, which are
+ // always 0 in 1D.
+ if (dim == 1)
+ while (neighbor->has_children())
+ neighbor = neighbor->child(face == 0 ? 1 : 0);
+
+ if (neighbor->has_children())
{
- const typename dealii::hp::DoFHandler<
- dim,
- spacedim>::level_cell_iterator sub_neighbor =
- periodic_neighbor ?
- cell->periodic_neighbor_child_on_subface(
- face, sub_nr) :
- cell->neighbor_child_on_subface(face, sub_nr);
+ for (unsigned int sub_nr = 0;
+ sub_nr != cell_face->n_children();
+ ++sub_nr)
+ {
+ const typename dealii::DoFHandler<dim,
+ spacedim>::
+ level_cell_iterator sub_neighbor =
+ periodic_neighbor ?
+ cell
+ ->periodic_neighbor_child_on_subface(
+ face, sub_nr) :
+ cell->neighbor_child_on_subface(face,
+ sub_nr);
+
+ dofs_on_other_cell.resize(
+ sub_neighbor->get_fe().dofs_per_cell);
+ sub_neighbor->get_dof_indices(
+ dofs_on_other_cell);
+ for (unsigned int i = 0;
+ i < cell->get_fe().dofs_per_cell;
+ ++i)
+ {
+ const unsigned int ii =
+ (cell->get_fe().is_primitive(i) ?
+ cell->get_fe()
+ .system_to_component_index(i)
+ .first :
+ cell->get_fe()
+ .get_nonzero_components(i)
+ .first_selected_component());
+ Assert(ii < cell->get_fe().n_components(),
+ ExcInternalError());
+
+ for (unsigned int j = 0;
+ j <
+ sub_neighbor->get_fe().dofs_per_cell;
+ ++j)
+ {
+ const unsigned int jj =
+ (sub_neighbor->get_fe()
+ .is_primitive(j) ?
+ sub_neighbor->get_fe()
+ .system_to_component_index(j)
+ .first :
+ sub_neighbor->get_fe()
+ .get_nonzero_components(j)
+ .first_selected_component());
+
+ Assert(jj < sub_neighbor->get_fe()
+ .n_components(),
+ ExcInternalError());
+
+ if ((flux_mask(ii, jj) == always) ||
+ (flux_mask(ii, jj) == nonzero))
+ {
+ sparsity.add(
+ dofs_on_this_cell[i],
+ dofs_on_other_cell[j]);
+ }
+
+ if ((flux_mask(jj, ii) == always) ||
+ (flux_mask(jj, ii) == nonzero))
+ {
+ sparsity.add(
+ dofs_on_other_cell[j],
+ dofs_on_this_cell[i]);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
dofs_on_other_cell.resize(
- sub_neighbor->get_fe().dofs_per_cell);
- sub_neighbor->get_dof_indices(dofs_on_other_cell);
+ neighbor->get_fe().dofs_per_cell);
+ neighbor->get_dof_indices(dofs_on_other_cell);
for (unsigned int i = 0;
i < cell->get_fe().dofs_per_cell;
++i)
ExcInternalError());
for (unsigned int j = 0;
- j < sub_neighbor->get_fe().dofs_per_cell;
+ j < neighbor->get_fe().dofs_per_cell;
++j)
{
const unsigned int jj =
- (sub_neighbor->get_fe().is_primitive(
- j) ?
- sub_neighbor->get_fe()
+ (neighbor->get_fe().is_primitive(j) ?
+ neighbor->get_fe()
.system_to_component_index(j)
.first :
- sub_neighbor->get_fe()
+ neighbor->get_fe()
.get_nonzero_components(j)
.first_selected_component());
- Assert(jj < sub_neighbor->get_fe()
- .n_components(),
- ExcInternalError());
+ Assert(
+ jj < neighbor->get_fe().n_components(),
+ ExcInternalError());
if ((flux_mask(ii, jj) == always) ||
(flux_mask(ii, jj) == nonzero))
}
}
}
- else
- {
- dofs_on_other_cell.resize(
- neighbor->get_fe().dofs_per_cell);
- neighbor->get_dof_indices(dofs_on_other_cell);
- for (unsigned int i = 0;
- i < cell->get_fe().dofs_per_cell;
- ++i)
- {
- const unsigned int ii =
- (cell->get_fe().is_primitive(i) ?
- cell->get_fe()
- .system_to_component_index(i)
- .first :
- cell->get_fe()
- .get_nonzero_components(i)
- .first_selected_component());
-
- Assert(ii < cell->get_fe().n_components(),
- ExcInternalError());
-
- for (unsigned int j = 0;
- j < neighbor->get_fe().dofs_per_cell;
- ++j)
- {
- const unsigned int jj =
- (neighbor->get_fe().is_primitive(j) ?
- neighbor->get_fe()
- .system_to_component_index(j)
- .first :
- neighbor->get_fe()
- .get_nonzero_components(j)
- .first_selected_component());
-
- Assert(jj < neighbor->get_fe().n_components(),
- ExcInternalError());
-
- if ((flux_mask(ii, jj) == always) ||
- (flux_mask(ii, jj) == nonzero))
- {
- sparsity.add(dofs_on_this_cell[i],
- dofs_on_other_cell[j]);
- }
-
- if ((flux_mask(jj, ii) == always) ||
- (flux_mask(jj, ii) == nonzero))
- {
- sparsity.add(dofs_on_other_cell[j],
- dofs_on_this_cell[i]);
- }
- }
- }
- }
}
}
- }
+ }
}
} // namespace
//
// ---------------------------------------------------------------------
-for (scalar : REAL_SCALARS; SP : SPARSITY_PATTERNS;
+for (DoFHandler : DOFHANDLER_TEMPLATES; scalar : REAL_SCALARS;
+ SP : SPARSITY_PATTERNS;
deal_II_dimension : DIMENSIONS)
{
template void DoFTools::
const std::vector<types::global_dof_index> &dof_to_boundary_mapping,
SP & sparsity);
- template void
- DoFTools::make_boundary_sparsity_pattern<hp::DoFHandler<deal_II_dimension>,
- SP,
- scalar>(
- const hp::DoFHandler<deal_II_dimension> & dof,
- const std::map<types::boundary_id,
- const Function<deal_II_dimension, scalar> *> &boundary_ids,
- const std::vector<types::global_dof_index> &dof_to_boundary_mapping,
- SP & sparsity);
-
#if deal_II_dimension < 3
- template void DoFTools::make_boundary_sparsity_pattern<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
- SP,
- scalar>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &dof,
- const std::map<types::boundary_id,
- const Function<deal_II_dimension + 1, scalar> *>
- & boundary_ids,
- const std::vector<types::global_dof_index> &dof_to_boundary_mapping,
- SP & sparsity);
template void DoFTools::make_boundary_sparsity_pattern<
DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
const std::vector<types::global_dof_index> &dof_to_boundary_mapping,
SP & sparsity);
- // template void
- // DoFTools::make_boundary_sparsity_pattern<hp::DoFHandler<deal_II_dimension,deal_II_dimension+1>,SP,scalar>
- //(const hp::DoFHandler<deal_II_dimension,deal_II_dimension+1>& dof,
- // const std::map<types::boundary_id, const
- // Function<deal_II_dimension+1,scalar>*> &boundary_ids, const
- // std::vector<types::global_dof_index> &dof_to_boundary_mapping, SP
- // &sparsity);
-
#endif
#if deal_II_dimension == 1
- template void DoFTools::make_boundary_sparsity_pattern<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 2>,
- SP,
- scalar>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 2> &dof,
- const std::map<types::boundary_id,
- const Function<deal_II_dimension + 2, scalar> *>
- & boundary_ids,
- const std::vector<types::global_dof_index> &dof_to_boundary_mapping,
- SP & sparsity);
-
template void DoFTools::make_boundary_sparsity_pattern<
DoFHandler<deal_II_dimension, deal_II_dimension + 2>,
SP,
#endif
}
-for (scalar : COMPLEX_SCALARS; SP : SPARSITY_PATTERNS;
+for (DoFHandler : DOFHANDLER_TEMPLATES; scalar : COMPLEX_SCALARS;
+ SP : SPARSITY_PATTERNS;
deal_II_dimension : DIMENSIONS)
{
template void DoFTools::
const std::vector<types::global_dof_index> &dof_to_boundary_mapping,
SP & sparsity);
- template void
- DoFTools::make_boundary_sparsity_pattern<hp::DoFHandler<deal_II_dimension>,
- SP,
- scalar>(
- const hp::DoFHandler<deal_II_dimension> & dof,
- const std::map<types::boundary_id,
- const Function<deal_II_dimension, scalar> *> &boundary_ids,
- const std::vector<types::global_dof_index> &dof_to_boundary_mapping,
- SP & sparsity);
-
#if deal_II_dimension < 3
- template void DoFTools::make_boundary_sparsity_pattern<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
- SP,
- scalar>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &dof,
- const std::map<types::boundary_id,
- const Function<deal_II_dimension + 1, scalar> *>
- & boundary_ids,
- const std::vector<types::global_dof_index> &dof_to_boundary_mapping,
- SP & sparsity);
-
template void DoFTools::make_boundary_sparsity_pattern<
DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
SP,
const std::vector<types::global_dof_index> &dof_to_boundary_mapping,
SP & sparsity);
- // template void
- // DoFTools::make_boundary_sparsity_pattern<hp::DoFHandler<deal_II_dimension,deal_II_dimension+1>,SP,scalar>
- //(const hp::DoFHandler<deal_II_dimension,deal_II_dimension+1>& dof,
- // const std::map<types::boundary_id, const
- // Function<deal_II_dimension+1,scalar>*> &boundary_ids, const
- // std::vector<types::global_dof_index> &dof_to_boundary_mapping, SP
- // &sparsity);
-#endif
-#if deal_II_dimension == 1
- template void DoFTools::make_boundary_sparsity_pattern<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 2>,
- SP,
- scalar>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 2> &dof,
- const std::map<types::boundary_id,
- const Function<deal_II_dimension + 2, scalar> *>
- & boundary_ids,
- const std::vector<types::global_dof_index> &dof_to_boundary_mapping,
- SP & sparsity);
-
- template void DoFTools::make_boundary_sparsity_pattern<
- DoFHandler<deal_II_dimension, deal_II_dimension + 2>,
- SP,
- scalar>(
- const DoFHandler<deal_II_dimension, deal_II_dimension + 2> &dof,
- const std::map<types::boundary_id,
- const Function<deal_II_dimension + 2, scalar> *>
- & boundary_ids,
- const std::vector<types::global_dof_index> &dof_to_boundary_mapping,
- SP & sparsity);
#endif
}
-for (SP : SPARSITY_PATTERNS; deal_II_dimension : DIMENSIONS;
+for (DoFHandler : DOFHANDLER_TEMPLATES; SP : SPARSITY_PATTERNS;
+ deal_II_dimension : DIMENSIONS;
S : REAL_AND_COMPLEX_SCALARS)
{
template void DoFTools::make_sparsity_pattern<
const bool,
const types::subdomain_id);
- template void DoFTools::make_sparsity_pattern<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension>,
- SP>(const hp::DoFHandler<deal_II_dimension, deal_II_dimension> &dof,
- SP & sparsity,
- const AffineConstraints<S> &,
- const bool,
- const types::subdomain_id);
-
template void DoFTools::make_sparsity_pattern<
DoFHandler<deal_II_dimension, deal_II_dimension>,
SP>(const DoFHandler<deal_II_dimension, deal_II_dimension> &,
const bool,
const types::subdomain_id);
- template void DoFTools::make_sparsity_pattern<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension>,
- SP>(const hp::DoFHandler<deal_II_dimension, deal_II_dimension> &,
- const Table<2, Coupling> &,
- SP &,
- const AffineConstraints<S> &,
- const bool,
- const types::subdomain_id);
-
template void
DoFTools::make_flux_sparsity_pattern<DoFHandler<deal_II_dimension>, SP>(
const DoFHandler<deal_II_dimension> &dof,
const bool,
const types::subdomain_id);
- template void
- DoFTools::make_flux_sparsity_pattern<hp::DoFHandler<deal_II_dimension>, SP>(
- const hp::DoFHandler<deal_II_dimension> &dof,
- SP & sparsity,
- const AffineConstraints<S> &,
- const bool,
- const types::subdomain_id);
-
- template void
- DoFTools::make_flux_sparsity_pattern<hp::DoFHandler<deal_II_dimension>, SP>(
- const hp::DoFHandler<deal_II_dimension> &dof,
- SP & sparsity,
- const AffineConstraints<S> &,
- const bool,
- const Table<2, Coupling> &,
- const Table<2, Coupling> &,
- const types::subdomain_id,
- const std::function<bool(const typename hp::DoFHandler<
- deal_II_dimension>::active_cell_iterator &,
- const unsigned int)> &);
-
#if deal_II_dimension < 3
template void DoFTools::make_sparsity_pattern<
const bool,
const types::subdomain_id);
- template void DoFTools::make_sparsity_pattern<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
- SP>(const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &dof,
- SP &sparsity,
- const AffineConstraints<S> &,
- const bool,
- const types::subdomain_id);
-
template void DoFTools::make_sparsity_pattern<
DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
SP>(const DoFHandler<deal_II_dimension, deal_II_dimension + 1> &,
const bool,
const types::subdomain_id);
- template void DoFTools::make_sparsity_pattern<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
- SP>(const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &,
- const Table<2, Coupling> &,
- SP &,
- const AffineConstraints<S> &,
- const bool,
- const types::subdomain_id);
-
#endif
#if deal_II_dimension == 3
const bool,
const types::subdomain_id);
- template void DoFTools::make_sparsity_pattern<hp::DoFHandler<1, 3>, SP>(
- const hp::DoFHandler<1, 3> &dof,
- SP & sparsity,
- const AffineConstraints<S> &,
- const bool,
- const types::subdomain_id);
-
template void DoFTools::make_sparsity_pattern<DoFHandler<1, 3>, SP>(
const DoFHandler<1, 3> &,
const Table<2, Coupling> &,
const bool,
const types::subdomain_id);
- template void DoFTools::make_sparsity_pattern<hp::DoFHandler<1, 3>, SP>(
- const hp::DoFHandler<1, 3> &,
- const Table<2, Coupling> &,
- SP &,
- const AffineConstraints<S> &,
- const bool,
- const types::subdomain_id);
-
#endif
}
-for (SP : SPARSITY_PATTERNS; deal_II_dimension : DIMENSIONS)
+for (DoFHandler : DOFHANDLER_TEMPLATES; SP : SPARSITY_PATTERNS;
+ deal_II_dimension : DIMENSIONS)
{
template void DoFTools::make_sparsity_pattern<
DoFHandler<deal_II_dimension, deal_II_dimension>,
const DoFHandler<deal_II_dimension, deal_II_dimension> &dof_col,
SP & sparsity);
- template void DoFTools::make_sparsity_pattern<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension>,
- SP>(const hp::DoFHandler<deal_II_dimension, deal_II_dimension> &dof_row,
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension> &dof_col,
- SP & sparsity);
-
template void
DoFTools::make_boundary_sparsity_pattern<DoFHandler<deal_II_dimension>, SP>(
const DoFHandler<deal_II_dimension> &dof,
const std::vector<types::global_dof_index> &,
SP &);
- template void DoFTools::make_boundary_sparsity_pattern<
- hp::DoFHandler<deal_II_dimension>,
- SP>(const hp::DoFHandler<deal_II_dimension> &dof,
- const std::vector<types::global_dof_index> &,
- SP &);
-
template void
DoFTools::make_flux_sparsity_pattern<DoFHandler<deal_II_dimension>, SP>(
const DoFHandler<deal_II_dimension> &dof, SP &sparsity);
- template void
- DoFTools::make_flux_sparsity_pattern<hp::DoFHandler<deal_II_dimension>, SP>(
- const hp::DoFHandler<deal_II_dimension> &dof, SP &sparsity);
-
template void
DoFTools::make_flux_sparsity_pattern<DoFHandler<deal_II_dimension>, SP>(
const DoFHandler<deal_II_dimension> &dof,
const Table<2, Coupling> &,
const types::subdomain_id);
- template void
- DoFTools::make_flux_sparsity_pattern<hp::DoFHandler<deal_II_dimension>, SP>(
- const hp::DoFHandler<deal_II_dimension> &dof,
- SP & sparsity,
- const Table<2, Coupling> &,
- const Table<2, Coupling> &,
- const types::subdomain_id);
-
#if deal_II_dimension < 3
template void DoFTools::make_sparsity_pattern<
const DoFHandler<deal_II_dimension, deal_II_dimension + 1> &dof_col,
SP & sparsity);
- template void DoFTools::make_sparsity_pattern<
- hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
- SP>(
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &dof_row,
- const hp::DoFHandler<deal_II_dimension, deal_II_dimension + 1> &dof_col,
- SP & sparsity);
-
template void DoFTools::make_boundary_sparsity_pattern<
DoFHandler<deal_II_dimension, deal_II_dimension + 1>,
SP>(const DoFHandler<deal_II_dimension, deal_II_dimension + 1> &dof,
const std::vector<types::global_dof_index> &,
SP &);
- // template void
- // DoFTools::make_boundary_sparsity_pattern<hp::DoFHandler<deal_II_dimension,deal_II_dimension+1>,SP>
- //(const hp::DoFHandler<deal_II_dimension,deal_II_dimension+1>& dof,
- // const std::vector<types::global_dof_index> &,
- // SP &);
-
#endif
const DoFHandler<1, 3> &dof_col,
SP & sparsity);
- template void DoFTools::make_sparsity_pattern<hp::DoFHandler<1, 3>, SP>(
- const hp::DoFHandler<1, 3> &dof_row,
- const hp::DoFHandler<1, 3> &dof_col,
- SP & sparsity);
-
template void
DoFTools::make_boundary_sparsity_pattern<DoFHandler<1, 3>, SP>(
const DoFHandler<1, 3> &dof,
const std::vector<types::global_dof_index> &,
SP &);
- template void
- DoFTools::make_boundary_sparsity_pattern<hp::DoFHandler<1, 3>, SP>(
- const hp::DoFHandler<1, 3> &dof,
- const std::vector<types::global_dof_index> &,
- SP &);
-
#endif
}
template <int dim, int spacedim>
bool
find_connection_between_subdomains(
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const DoFHandler<dim, spacedim> & dof_handler,
const predicate_function<dim, spacedim> &predicate_1,
const predicate_function<dim, spacedim> &predicate_2)
{
template <int dim, int spacedim>
unsigned int
color_predicates(
- const hp::DoFHandler<dim, spacedim> & mesh,
+ const DoFHandler<dim, spacedim> & mesh,
const std::vector<predicate_function<dim, spacedim>> &predicates,
std::vector<unsigned int> & predicate_colors)
{
template <int dim, int spacedim>
void
set_cellwise_color_set_and_fe_index(
- hp::DoFHandler<dim, spacedim> & dof_handler,
+ DoFHandler<dim, spacedim> & dof_handler,
const std::vector<predicate_function<dim, spacedim>> &predicates,
const std::vector<unsigned int> & predicate_colors,
std::map<unsigned int, std::map<unsigned int, unsigned int>>
template <int dim, int spacedim>
const hp::FECollection<dim, spacedim> &
Helper<dim, spacedim>::build_fe_collection(
- hp::DoFHandler<dim, spacedim> &dof_handler)
+ DoFHandler<dim, spacedim> &dof_handler)
{
// color the predicates based on connections between corresponding
// subdomains
\{
template bool
find_connection_between_subdomains(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension>
&dof_handler,
const predicate_function<deal_II_dimension, deal_II_space_dimension>
&predicate_1,
template unsigned int
color_predicates(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension>
&dof_handler,
const std::vector<
predicate_function<deal_II_dimension, deal_II_space_dimension>> &,
template void
set_cellwise_color_set_and_fe_index(
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>
- &dof_handler,
+ DoFHandler<deal_II_dimension, deal_II_space_dimension> &dof_handler,
const std::vector<
predicate_function<deal_II_dimension, deal_II_space_dimension>>
& predicates,
namespace FETools
\{
#if deal_II_dimension == deal_II_space_dimension
- template void
- interpolate<deal_II_dimension>(const hp::DoFHandler<deal_II_dimension> &,
- const Vector<double> &,
- const hp::DoFHandler<deal_II_dimension> &,
- Vector<double> &);
-
- template void
- interpolate<deal_II_dimension>(const hp::DoFHandler<deal_II_dimension> &,
- const Vector<double> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const AffineConstraints<double> &,
- Vector<double> &);
-
- template void
- interpolate<deal_II_dimension>(const hp::DoFHandler<deal_II_dimension> &,
- const Vector<float> &,
- const hp::DoFHandler<deal_II_dimension> &,
- Vector<float> &);
-
- template void
- interpolate<deal_II_dimension>(const hp::DoFHandler<deal_II_dimension> &,
- const Vector<float> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const AffineConstraints<float> &,
- Vector<float> &);
#endif
\}
}
const FiniteElement<deal_II_dimension> &,
VEC &);
- template void
- back_interpolate<deal_II_dimension>(
- const hp::DoFHandler<deal_II_dimension> &,
- const VEC &,
- const FiniteElement<deal_II_dimension> &,
- VEC &);
-
template void
back_interpolate<deal_II_dimension>(
const DoFHandler<deal_II_dimension> &,
}
-for (dof_handler : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS;
+for (DoFHandler : DOFHANDLER_TEMPLATE; deal_II_dimension : DIMENSIONS;
deal_II_space_dimension : SPACE_DIMENSIONS;
lda : BOOL)
{
#if deal_II_dimension <= deal_II_space_dimension
template void FEValues<deal_II_dimension, deal_II_space_dimension>::reinit(
const TriaIterator<
- DoFCellAccessor<dof_handler<deal_II_dimension, deal_II_space_dimension>,
+ DoFCellAccessor<DoFHandler<deal_II_dimension, deal_II_space_dimension>,
lda>> &);
template void
FEFaceValues<deal_II_dimension, deal_II_space_dimension>::reinit(
const TriaIterator<
- DoFCellAccessor<dof_handler<deal_II_dimension, deal_II_space_dimension>,
+ DoFCellAccessor<DoFHandler<deal_II_dimension, deal_II_space_dimension>,
lda>> &,
unsigned int);
template void
FEFaceValues<deal_II_dimension, deal_II_space_dimension>::reinit(
const TriaIterator<
- DoFCellAccessor<dof_handler<deal_II_dimension, deal_II_space_dimension>,
+ DoFCellAccessor<DoFHandler<deal_II_dimension, deal_II_space_dimension>,
lda>> &,
const TriaIterator<TriaAccessor<deal_II_dimension - 1,
deal_II_dimension,
template void
FESubfaceValues<deal_II_dimension, deal_II_space_dimension>::reinit(
const TriaIterator<
- DoFCellAccessor<dof_handler<deal_II_dimension, deal_II_space_dimension>,
+ DoFCellAccessor<DoFHandler<deal_II_dimension, deal_II_space_dimension>,
lda>> &,
const unsigned int,
const unsigned int);
template void
FESubfaceValues<deal_II_dimension, deal_II_space_dimension>::reinit(
const TriaIterator<
- DoFCellAccessor<dof_handler<deal_II_dimension, deal_II_space_dimension>,
+ DoFCellAccessor<DoFHandler<deal_II_dimension, deal_II_space_dimension>,
lda>> &,
const TriaIterator<TriaAccessor<deal_II_dimension - 1,
deal_II_dimension,
template <int dim, int spacedim>
- std::pair<typename hp::DoFHandler<dim, spacedim>::active_cell_iterator,
+ std::pair<typename dealii::DoFHandler<dim, spacedim>::active_cell_iterator,
Point<dim>>
find_active_cell_around_point(
const hp::MappingCollection<dim, spacedim> &mapping,
- const hp::DoFHandler<dim, spacedim> & mesh,
+ const DoFHandler<dim, spacedim> & mesh,
const Point<spacedim> & p,
const double tolerance)
{
"the FECollection."));
using cell_iterator =
- typename hp::DoFHandler<dim, spacedim>::active_cell_iterator;
+ typename dealii::DoFHandler<dim, spacedim>::active_cell_iterator;
std::pair<cell_iterator, Point<dim>> best_cell;
// If we have only one element in the MappingCollection,
if (!found && cells_searched < n_cells)
{
find_active_cell_around_point_internal<dim,
- hp::DoFHandler,
+ dealii::DoFHandler,
spacedim>(
mesh, searched_cells, adjacent_cells);
}
\{
template std::pair<
- hp::DoFHandler<deal_II_dimension,
- deal_II_space_dimension>::active_cell_iterator,
+ dealii::DoFHandler<deal_II_dimension,
+ deal_II_space_dimension>::active_cell_iterator,
Point<deal_II_dimension>>
find_active_cell_around_point(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const Point<deal_II_space_dimension> &,
const double);
for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS;
- Container : DOFHANDLER_TEMPLATES)
+ Container : DOFHANDLER_TEMPLATE)
{
#if deal_II_dimension <= deal_II_space_dimension
namespace GridTools
// types are the same for sequential and parallel containers; consequently, we
// get duplicate instantiation errors if we instantiate for *all* container
// types, rather than only the sequential ones
-for (X : SEQUENTIAL_TRIANGULATION_AND_DOFHANDLERS;
+for (X : SEQUENTIAL_TRIANGULATION_AND_DOFHANDLER;
deal_II_dimension : DIMENSIONS;
deal_II_space_dimension : SPACE_DIMENSIONS)
{
const Tensor<1, deal_II_space_dimension> &,
const FullMatrix<double> &);
+ \}
+#endif
+ }
+
+for (X : SEQUENTIAL_TRIANGULATION_AND_DOFHANDLERS;
+ deal_II_dimension : DIMENSIONS;
+ deal_II_space_dimension : SPACE_DIMENSIONS)
+ {
+#if deal_II_dimension <= deal_II_space_dimension
+ namespace GridTools
+ \{
template void
collect_periodic_faces<X>(
const X &,
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
SET(_unity_include_src
- dof_faces.cc
- dof_level.cc
fe_collection.cc
fe_values.cc
mapping_collection.cc
+++ /dev/null
-// ---------------------------------------------------------------------
-//
-// Copyright (C) 2006 - 2019 by the deal.II authors
-//
-// This file is part of the deal.II library.
-//
-// The deal.II library is free software; you can use it, redistribute
-// it, and/or modify it under the terms of the GNU Lesser General
-// Public License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// The full text of the license can be found in the file LICENSE.md at
-// the top level directory of deal.II.
-//
-// ---------------------------------------------------------------------
-
-#include <deal.II/base/memory_consumption.h>
-
-#include <deal.II/hp/dof_faces.h>
-
-DEAL_II_NAMESPACE_OPEN
-
-namespace internal
-{
- namespace hp
- {
- // ---------------------- DoFObjects ----------------------------
-
- template <int structdim>
- std::size_t
- DoFIndicesOnFacesOrEdges<structdim>::memory_consumption() const
- {
- return (MemoryConsumption::memory_consumption(dofs) +
- MemoryConsumption::memory_consumption(dof_offsets));
- }
-
-
- // explicit instantiations
- template std::size_t
- DoFIndicesOnFacesOrEdges<1>::memory_consumption() const;
-
- template std::size_t
- DoFIndicesOnFacesOrEdges<2>::memory_consumption() const;
-
- template std::size_t
- DoFIndicesOnFacesOrEdges<3>::memory_consumption() const;
- } // namespace hp
-} // namespace internal
-
-DEAL_II_NAMESPACE_CLOSE
//
// ---------------------------------------------------------------------
-#include <deal.II/base/geometry_info.h>
-#include <deal.II/base/memory_consumption.h>
-#include <deal.II/base/thread_management.h>
-
-#include <deal.II/distributed/cell_data_transfer.templates.h>
-#include <deal.II/distributed/shared_tria.h>
-#include <deal.II/distributed/tria.h>
-
-#include <deal.II/dofs/dof_accessor.h>
-#include <deal.II/dofs/dof_handler_policy.h>
-
-#include <deal.II/fe/fe.h>
-
-#include <deal.II/grid/grid_tools.h>
-#include <deal.II/grid/tria.h>
-#include <deal.II/grid/tria_accessor.h>
-#include <deal.II/grid/tria_iterator.h>
-#include <deal.II/grid/tria_levels.h>
-
-#include <deal.II/hp/dof_faces.h>
#include <deal.II/hp/dof_handler.h>
-#include <deal.II/hp/dof_level.h>
-
-#include <boost/serialization/array.hpp>
-
-#include <algorithm>
-#include <functional>
-#include <memory>
-#include <set>
-#include <unordered_set>
DEAL_II_NAMESPACE_OPEN
-// The following is necessary for compilation under Visual Studio which is
-// unable to correctly distinguish between dealii::DoFHandler and
-// dealii::hp::DoFHandler. Plus it makes code in dof_handler.cc easier to read.
-#if defined(_MSC_VER) && (_MSC_VER >= 1800)
-template <int dim, int spacedim>
-using HpDoFHandler = ::dealii::hp::DoFHandler<dim, spacedim>;
-#else
-// When using older Visual Studio or a different compiler just fall back.
-# define HpDoFHandler DoFHandler
-#endif
-
-namespace parallel
-{
- namespace distributed
- {
- template <int, int>
- class Triangulation;
- }
-} // namespace parallel
-
-
-
-namespace internal
-{
- namespace hp
- {
- namespace DoFHandlerImplementation
- {
- // access class dealii::hp::DoFHandler instead of namespace
- // internal::hp::DoFHandler, etc
- using dealii::hp::DoFHandler;
-
- /**
- * A class with the same purpose as the similarly named class of the
- * Triangulation class. See there for more information.
- */
- struct Implementation
- {
- /**
- * No future_fe_indices should have been assigned when partitioning a
- * triangulation, since they are only available locally and will not be
- * communicated.
- */
- template <int dim, int spacedim>
- static void
- ensure_absence_of_future_fe_indices(
- DoFHandler<dim, spacedim> &dof_handler)
- {
- (void)dof_handler;
- for (const auto &cell : dof_handler.active_cell_iterators())
- if (cell->is_locally_owned())
- Assert(
- !cell->future_fe_index_set(),
- ExcMessage(
- "There shouldn't be any cells flagged for p-adaptation when partitioning."));
- }
-
-
-
- /**
- * Do that part of reserving space that pertains to releasing
- * the previously used memory.
- */
- template <int dim, int spacedim>
- static void
- reserve_space_release_space(DoFHandler<dim, spacedim> &dof_handler)
- {
- // Release all space except the fields for active_fe_indices and
- // refinement flags which we have to back up before
- {
- std::vector<std::vector<DoFLevel::active_fe_index_type>>
- active_fe_backup(dof_handler.levels.size()),
- future_fe_backup(dof_handler.levels.size());
- for (unsigned int level = 0; level < dof_handler.levels.size();
- ++level)
- {
- active_fe_backup[level] =
- std::move(dof_handler.levels[level]->active_fe_indices);
- future_fe_backup[level] =
- std::move(dof_handler.levels[level]->future_fe_indices);
- }
-
- // delete all levels and set them up newly, since vectors
- // are troublesome if you want to change their size
- dof_handler.clear_space();
-
- for (unsigned int level = 0; level < dof_handler.tria->n_levels();
- ++level)
- {
- dof_handler.levels.emplace_back(new internal::hp::DoFLevel);
- // recover backups
- dof_handler.levels[level]->active_fe_indices =
- std::move(active_fe_backup[level]);
- dof_handler.levels[level]->future_fe_indices =
- std::move(future_fe_backup[level]);
- }
-
- if (dim > 1)
- dof_handler.faces =
- std::make_unique<internal::hp::DoFIndicesOnFaces<dim>>();
- }
- }
-
-
-
- /**
- * Do that part of reserving space that pertains to vertices,
- * since this is the same in all space dimensions.
- */
- template <int dim, int spacedim>
- static void
- reserve_space_vertices(DoFHandler<dim, spacedim> &dof_handler)
- {
- // The final step in all of the reserve_space() functions is to set
- // up vertex dof information. since vertices are sequentially
- // numbered, what we do first is to set up an array in which
- // we record whether a vertex is associated with any of the
- // given fe's, by setting a bit. in a later step, we then
- // actually allocate memory for the required dofs
- //
- // in the following, we only need to consider vertices that are
- // adjacent to either a locally owned or a ghost cell; we never
- // store anything on vertices that are only surrounded by
- // artificial cells. so figure out that subset of vertices
- // first
- std::vector<bool> locally_used_vertices(
- dof_handler.tria->n_vertices(), false);
- for (const auto &cell : dof_handler.active_cell_iterators())
- if (!cell->is_artificial())
- for (const unsigned int v : GeometryInfo<dim>::vertex_indices())
- locally_used_vertices[cell->vertex_index(v)] = true;
-
- std::vector<std::vector<bool>> vertex_fe_association(
- dof_handler.fe_collection.size(),
- std::vector<bool>(dof_handler.tria->n_vertices(), false));
-
- for (const auto &cell : dof_handler.active_cell_iterators())
- if (!cell->is_artificial())
- for (const unsigned int v : GeometryInfo<dim>::vertex_indices())
- vertex_fe_association[cell->active_fe_index()]
- [cell->vertex_index(v)] = true;
-
- // in debug mode, make sure that each vertex is associated
- // with at least one fe (note that except for unused
- // vertices, all vertices are actually active). this is of
- // course only true for vertices that are part of either
- // ghost or locally owned cells
-#ifdef DEBUG
- for (unsigned int v = 0; v < dof_handler.tria->n_vertices(); ++v)
- if (locally_used_vertices[v] == true)
- if (dof_handler.tria->vertex_used(v) == true)
- {
- unsigned int fe = 0;
- for (; fe < dof_handler.fe_collection.size(); ++fe)
- if (vertex_fe_association[fe][v] == true)
- break;
- Assert(fe != dof_handler.fe_collection.size(),
- ExcInternalError());
- }
-#endif
-
- // next count how much memory we actually need. for each
- // vertex, we need one slot per fe to store the fe_index,
- // plus dofs_per_vertex for this fe. in addition, we need
- // one slot as the end marker for the fe_indices. at the
- // same time already fill the vertex_dof_offsets field
- dof_handler.vertex_dof_offsets.resize(dof_handler.tria->n_vertices(),
- numbers::invalid_unsigned_int);
-
- unsigned int vertex_slots_needed = 0;
- for (unsigned int v = 0; v < dof_handler.tria->n_vertices(); ++v)
- if (dof_handler.tria->vertex_used(v) == true)
- if (locally_used_vertices[v] == true)
- {
- dof_handler.vertex_dof_offsets[v] = vertex_slots_needed;
-
- for (unsigned int fe = 0;
- fe < dof_handler.fe_collection.size();
- ++fe)
- if (vertex_fe_association[fe][v] == true)
- vertex_slots_needed +=
- dof_handler.get_fe(fe).dofs_per_vertex + 1;
-
- // don't forget the end_marker:
- ++vertex_slots_needed;
- }
-
- // now allocate the space we have determined we need, and
- // set up the linked lists for each of the vertices
- dof_handler.vertex_dofs.resize(vertex_slots_needed,
- numbers::invalid_dof_index);
- for (unsigned int v = 0; v < dof_handler.tria->n_vertices(); ++v)
- if (dof_handler.tria->vertex_used(v) == true)
- if (locally_used_vertices[v] == true)
- {
- unsigned int current_index =
- dof_handler.vertex_dof_offsets[v];
- for (unsigned int fe = 0;
- fe < dof_handler.fe_collection.size();
- ++fe)
- if (vertex_fe_association[fe][v] == true)
- {
- // if this vertex uses this fe, then set the
- // fe_index and move the pointer ahead
- dof_handler.vertex_dofs[current_index] = fe;
- current_index +=
- dof_handler.get_fe(fe).dofs_per_vertex + 1;
- }
- // finally place the end marker
- dof_handler.vertex_dofs[current_index] =
- numbers::invalid_dof_index;
- }
- }
-
-
-
- /**
- * Do that part of reserving space that pertains to cells,
- * since this is the same in all space dimensions.
- */
- template <int dim, int spacedim>
- static void
- reserve_space_cells(DoFHandler<dim, spacedim> &dof_handler)
- {
- // count how much space we need on each level for the cell
- // dofs and set the dof_*_offsets data. initially set the
- // latter to an invalid index, and only later set it to
- // something reasonable for active dof_handler.cells
- //
- // note that for dof_handler.cells, the situation is simpler
- // than for other (lower dimensional) objects since exactly
- // one finite element is used for it
- for (unsigned int level = 0; level < dof_handler.tria->n_levels();
- ++level)
- {
- dof_handler.levels[level]->dof_offsets =
- std::vector<DoFLevel::offset_type>(
- dof_handler.tria->n_raw_cells(level),
- static_cast<DoFLevel::offset_type>(-1));
- dof_handler.levels[level]->cell_cache_offsets =
- std::vector<DoFLevel::offset_type>(
- dof_handler.tria->n_raw_cells(level),
- static_cast<DoFLevel::offset_type>(-1));
-
- types::global_dof_index next_free_dof = 0;
- types::global_dof_index cache_size = 0;
- typename HpDoFHandler<dim, spacedim>::active_cell_iterator
- cell = dof_handler.begin_active(level),
- endc = dof_handler.end_active(level);
- for (; cell != endc; ++cell)
- if (cell->is_active() && !cell->is_artificial())
- {
- dof_handler.levels[level]->dof_offsets[cell->index()] =
- next_free_dof;
- next_free_dof +=
- cell->get_fe().template n_dofs_per_object<dim>();
-
- dof_handler.levels[level]
- ->cell_cache_offsets[cell->index()] = cache_size;
- cache_size += cell->get_fe().dofs_per_cell;
- }
-
- dof_handler.levels[level]->dof_indices =
- std::vector<types::global_dof_index>(
- next_free_dof, numbers::invalid_dof_index);
- dof_handler.levels[level]->cell_dof_indices_cache =
- std::vector<types::global_dof_index>(
- cache_size, numbers::invalid_dof_index);
- }
-
- // safety check: make sure that the number of DoFs we
- // allocated is actually correct (above we have also set the
- // dof_*_offsets field, so we couldn't use this simpler
- // algorithm)
-#ifdef DEBUG
- for (unsigned int level = 0; level < dof_handler.tria->n_levels();
- ++level)
- {
- types::global_dof_index counter = 0;
- for (const auto &cell :
- dof_handler.active_cell_iterators_on_level(level))
- if (cell->is_active() && !cell->is_artificial())
- counter += cell->get_fe().template n_dofs_per_object<dim>();
-
- Assert(dof_handler.levels[level]->dof_indices.size() == counter,
- ExcInternalError());
-
- // also check that the number of unassigned slots in the
- // dof_offsets equals the number of cells on that level minus the
- // number of active, non-artificial cells (because these are
- // exactly the cells on which we do something)
- unsigned int n_active_non_artificial_cells = 0;
- for (const auto &cell :
- dof_handler.active_cell_iterators_on_level(level))
- if (cell->is_active() && !cell->is_artificial())
- ++n_active_non_artificial_cells;
-
- Assert(static_cast<unsigned int>(std::count(
- dof_handler.levels[level]->dof_offsets.begin(),
- dof_handler.levels[level]->dof_offsets.end(),
- static_cast<DoFLevel::offset_type>(-1))) ==
- dof_handler.tria->n_raw_cells(level) -
- n_active_non_artificial_cells,
- ExcInternalError());
- }
-#endif
- }
-
-
-
- /**
- * Do that part of reserving space that pertains to faces,
- * since this is the same in all space dimensions.
- */
- template <int dim, int spacedim>
- static void
- reserve_space_faces(DoFHandler<dim, spacedim> &dof_handler)
- {
- // make the code generic between lines and quads
- std::vector<unsigned int> &face_dof_offsets =
- (dim == 2 ?
- reinterpret_cast<dealii::internal::hp::DoFIndicesOnFaces<2> &>(
- *dof_handler.faces)
- .lines.dof_offsets :
- reinterpret_cast<dealii::internal::hp::DoFIndicesOnFaces<3> &>(
- *dof_handler.faces)
- .quads.dof_offsets);
-
- std::vector<types::global_dof_index> &face_dof_indices =
- (dim == 2 ?
- reinterpret_cast<dealii::internal::hp::DoFIndicesOnFaces<2> &>(
- *dof_handler.faces)
- .lines.dofs :
- reinterpret_cast<dealii::internal::hp::DoFIndicesOnFaces<3> &>(
- *dof_handler.faces)
- .quads.dofs);
-
- // FACE DOFS
- //
- // Count face dofs, then allocate as much space
- // as we need and prime the linked list for faces (see the
- // description in hp::DoFLevel) with the indices we will
- // need. Note that our task is more complicated than for the
- // cell case above since two adjacent cells may have different
- // active_fe_indices, in which case we need to allocate
- // *two* sets of face dofs for the same face. But they don't
- // *have* to be different, and so we need to prepare for this
- // as well.
- //
- // The way we do things is that we loop over all active
- // cells (these are the only ones that have DoFs
- // anyway) and all their faces. We note in the
- // user flags whether we have previously visited a face and
- // if so skip it (consequently, we have to save and later
- // restore the face flags)
- {
- std::vector<bool> saved_face_user_flags;
- switch (dim)
- {
- case 2:
- {
- const_cast<dealii::Triangulation<dim, spacedim> &>(
- *dof_handler.tria)
- .save_user_flags_line(saved_face_user_flags);
- const_cast<dealii::Triangulation<dim, spacedim> &>(
- *dof_handler.tria)
- .clear_user_flags_line();
-
- break;
- }
-
- case 3:
- {
- const_cast<dealii::Triangulation<dim, spacedim> &>(
- *dof_handler.tria)
- .save_user_flags_quad(saved_face_user_flags);
- const_cast<dealii::Triangulation<dim, spacedim> &>(
- *dof_handler.tria)
- .clear_user_flags_quad();
-
- break;
- }
-
- default:
- Assert(false, ExcNotImplemented());
- }
-
- // An array to hold how many slots (see the hp::DoFLevel
- // class) we will have to store on each level
- unsigned int n_face_slots = 0;
-
- for (const auto &cell : dof_handler.active_cell_iterators())
- if (!cell->is_artificial())
- for (const unsigned int face :
- GeometryInfo<dim>::face_indices())
- if (cell->face(face)->user_flag_set() == false)
- {
- // Ok, face has not been visited. So we need to
- // allocate space for it. Let's see how much we
- // need: we need one set if a) there is no
- // neighbor behind this face, or b) the neighbor
- // is either coarser or finer than we are, or c)
- // the neighbor is artificial, or d) the neighbor
- // is neither coarser nor finer, nor is artificial,
- // and just so happens to have the same active_fe_index :
- if (cell->at_boundary(face) ||
- cell->face(face)->has_children() ||
- cell->neighbor_is_coarser(face) ||
- (!cell->at_boundary(face) &&
- cell->neighbor(face)->is_artificial()) ||
- (!cell->at_boundary(face) &&
- !cell->neighbor(face)->is_artificial() &&
- (cell->active_fe_index() ==
- cell->neighbor(face)->active_fe_index())))
- // Ok, one set of dofs. that makes one active_fe_index,
- // 1 times dofs_per_face dofs, and one stop index
- n_face_slots +=
- 1 +
- dof_handler.get_fe(cell->active_fe_index())
- .template n_dofs_per_object<dim - 1>() +
- 1;
-
- // Otherwise we do indeed need two sets, i.e. two
- // active_fe_indices, two sets of dofs, and one stop
- // index:
- else
- n_face_slots +=
- (1 + // the active_fe_index
- dof_handler.get_fe(cell->active_fe_index())
- .template n_dofs_per_object<
- dim - 1>() // actual DoF indices
- + 1 // the second active_fe_index
- + dof_handler
- .get_fe(cell->neighbor(face)->active_fe_index())
- .template n_dofs_per_object<
- dim - 1>() // actual DoF indices
- + 1); // stop marker
-
- // mark this face as visited
- cell->face(face)->set_user_flag();
- }
-
- // Now that we know how many face dofs we will have to
- // have, allocate the memory. Note that we
- // allocate offsets for all faces, though only the active
- // ones will have a non-invalid value later on
- face_dof_offsets =
- std::vector<unsigned int>(dof_handler.tria->n_raw_faces(),
- numbers::invalid_unsigned_int);
- face_dof_indices =
- std::vector<types::global_dof_index>(n_face_slots,
- numbers::invalid_dof_index);
-
- // With the memory now allocated, loop over the
- // dof_handler cells again and prime the _offset values as
- // well as the fe_index fields
- switch (dim)
- {
- case 2:
- {
- const_cast<dealii::Triangulation<dim, spacedim> &>(
- *dof_handler.tria)
- .clear_user_flags_line();
-
- break;
- }
-
- case 3:
- {
- const_cast<dealii::Triangulation<dim, spacedim> &>(
- *dof_handler.tria)
- .clear_user_flags_quad();
-
- break;
- }
-
- default:
- Assert(false, ExcNotImplemented());
- }
-
- unsigned int next_free_face_slot = 0;
-
- for (const auto &cell : dof_handler.active_cell_iterators())
- if (!cell->is_artificial())
- for (const unsigned int face :
- GeometryInfo<dim>::face_indices())
- if (!cell->face(face)->user_flag_set())
- {
- // Same decision tree as before
- if (cell->at_boundary(face) ||
- cell->face(face)->has_children() ||
- cell->neighbor_is_coarser(face) ||
- (!cell->at_boundary(face) &&
- cell->neighbor(face)->is_artificial()) ||
- (!cell->at_boundary(face) &&
- !cell->neighbor(face)->is_artificial() &&
- (cell->active_fe_index() ==
- cell->neighbor(face)->active_fe_index())))
- {
- // Only one active_fe_index lives on this
- // face
- face_dof_offsets[cell->face(face)->index()] =
- next_free_face_slot;
-
- // Set the first and only slot for this face to
- // active_fe_index of this face
- face_dof_indices[next_free_face_slot] =
- cell->active_fe_index();
-
- // The next dofs_per_face indices remain unset
- // for the moment (i.e. at invalid_dof_index).
- // Following this comes the stop index, which
- // also is invalid_dof_index and therefore
- // does not have to be explicitly set
-
- // Finally, move the current marker forward:
- next_free_face_slot +=
- 1 // the active_fe_index
- + dof_handler.get_fe(cell->active_fe_index())
- .template n_dofs_per_object<
- dim - 1>() // actual DoF indices
- + 1; // the end marker
- }
- else
- {
- // There are two active_fe_indices that live on this
- // face.
- face_dof_offsets[cell->face(face)->index()] =
- next_free_face_slot;
-
- // Store the two indices we will have to deal with.
- // We sort these so that it does not matter which of
- // the cells adjacent to this face we visit first. In
- // sequential computations, this does not matter
- // because the order in which we visit these cells is
- // deterministic and always the same. But in parallel
- // computations, we can get into trouble because two
- // processors visit the cells in different order
- // (because the mesh creation history on the two
- // processors is different), and in that case it can
- // happen that the order of active_fe_index values for
- // a given face is different on the two processes,
- // even though they agree on which two values need to
- // be stored. Since the DoF unification on faces
- // takes into account the order of the
- // active_fe_indices, this leads to quite subtle bugs.
- // We could fix this in the place where we do the DoF
- // unification on cells, but it is better to just make
- // sure that every process stores the exact same
- // information (and in the same order) on each face.
- unsigned int active_fe_indices[2] = {
- cell->active_fe_index(),
- cell->neighbor(face)->active_fe_index()};
- if (active_fe_indices[1] < active_fe_indices[0])
- std::swap(active_fe_indices[0],
- active_fe_indices[1]);
-
- // Set first slot for this face to
- // active_fe_index of this face
- face_dof_indices[next_free_face_slot] =
- active_fe_indices[0];
-
- // The next dofs_per_line/quad indices remain unset
- // for the moment (i.e. at invalid_dof_index).
- //
- // Then comes the fe_index for the second slot:
- face_dof_indices
- [next_free_face_slot + 1 +
- dof_handler.get_fe(active_fe_indices[0])
- .template n_dofs_per_object<dim - 1>()] =
- active_fe_indices[1];
- // Then again a set of dofs that we need not
- // set right now
- //
- // Following this comes the stop index, which
- // also is invalid_dof_index and therefore
- // does not have to be explicitly set
-
- // Finally, move the current marker forward:
- next_free_face_slot +=
- (1 // first active_fe_index
- + dof_handler.get_fe(active_fe_indices[0])
- .template n_dofs_per_object<
- dim - 1>() // actual DoF indices
- + 1 // second active_fe_index
- + dof_handler.get_fe(active_fe_indices[1])
- .template n_dofs_per_object<
- dim - 1>() // actual DoF indices
- + 1); // end marker
- }
-
- // mark this face as visited
- cell->face(face)->set_user_flag();
- }
-
- // we should have moved the cursor for each level to the
- // total number of dofs on that level. check that
- Assert(next_free_face_slot == n_face_slots, ExcInternalError());
-
- // at the end, restore the user flags for the faces
- switch (dim)
- {
- case 2:
- {
- const_cast<dealii::Triangulation<dim, spacedim> &>(
- *dof_handler.tria)
- .load_user_flags_line(saved_face_user_flags);
-
- break;
- }
-
- case 3:
- {
- const_cast<dealii::Triangulation<dim, spacedim> &>(
- *dof_handler.tria)
- .load_user_flags_quad(saved_face_user_flags);
-
- break;
- }
-
- default:
- Assert(false, ExcNotImplemented());
- }
- }
- }
-
-
-
- /**
- * Reserve enough space in the <tt>levels[]</tt> objects to
- * store the numbers of the degrees of freedom needed for the
- * given element. The given element is that one which was
- * selected when calling @p distribute_dofs the last time.
- */
- template <int spacedim>
- static void reserve_space(DoFHandler<1, spacedim> &dof_handler)
- {
- Assert(dof_handler.fe_collection.size() > 0,
- (typename DoFHandler<1, spacedim>::ExcNoFESelected()));
- Assert(dof_handler.tria->n_levels() > 0,
- ExcMessage("The current Triangulation must not be empty."));
- Assert(dof_handler.tria->n_levels() == dof_handler.levels.size(),
- ExcInternalError());
-
- reserve_space_release_space(dof_handler);
-
- Threads::TaskGroup<> tasks;
- tasks +=
- Threads::new_task(&reserve_space_cells<1, spacedim>, dof_handler);
- tasks += Threads::new_task(&reserve_space_vertices<1, spacedim>,
- dof_handler);
- tasks.join_all();
- }
-
-
-
- template <int spacedim>
- static void reserve_space(DoFHandler<2, spacedim> &dof_handler)
- {
- Assert(dof_handler.fe_collection.size() > 0,
- (typename DoFHandler<2, spacedim>::ExcNoFESelected()));
- Assert(dof_handler.tria->n_levels() > 0,
- ExcMessage("The current Triangulation must not be empty."));
- Assert(dof_handler.tria->n_levels() == dof_handler.levels.size(),
- ExcInternalError());
-
- reserve_space_release_space(dof_handler);
-
- Threads::TaskGroup<> tasks;
- tasks +=
- Threads::new_task(&reserve_space_cells<2, spacedim>, dof_handler);
- tasks +=
- Threads::new_task(&reserve_space_faces<2, spacedim>, dof_handler);
- tasks += Threads::new_task(&reserve_space_vertices<2, spacedim>,
- dof_handler);
- tasks.join_all();
- }
-
-
-
- template <int spacedim>
- static void reserve_space(DoFHandler<3, spacedim> &dof_handler)
- {
- const unsigned int dim = 3;
-
- Assert(dof_handler.fe_collection.size() > 0,
- (typename DoFHandler<dim, spacedim>::ExcNoFESelected()));
- Assert(dof_handler.tria->n_levels() > 0,
- ExcMessage("The current Triangulation must not be empty."));
- Assert(dof_handler.tria->n_levels() == dof_handler.levels.size(),
- ExcInternalError());
-
- reserve_space_release_space(dof_handler);
-
- Threads::TaskGroup<> tasks;
- tasks +=
- Threads::new_task(&reserve_space_cells<3, spacedim>, dof_handler);
- tasks +=
- Threads::new_task(&reserve_space_faces<3, spacedim>, dof_handler);
- tasks += Threads::new_task(&reserve_space_vertices<3, spacedim>,
- dof_handler);
-
- // While the tasks above are running, we can turn to line dofs
-
- // the situation here is pretty much like with vertices:
- // there can be an arbitrary number of finite elements
- // associated with each line.
- //
- // the algorithm we use is somewhat similar to what we do in
- // reserve_space_vertices()
- {
- // what we do first is to set up an array in which we
- // record whether a line is associated with any of the
- // given fe's, by setting a bit. in a later step, we
- // then actually allocate memory for the required dofs
- std::vector<std::vector<bool>> line_fe_association(
- dof_handler.fe_collection.size(),
- std::vector<bool>(dof_handler.tria->n_raw_lines(), false));
-
- for (const auto &cell : dof_handler.active_cell_iterators())
- if (!cell->is_artificial())
- for (unsigned int l = 0; l < GeometryInfo<dim>::lines_per_cell;
- ++l)
- line_fe_association[cell->active_fe_index()]
- [cell->line_index(l)] = true;
-
- // first check which of the lines is used at all,
- // i.e. is associated with a finite element. we do this
- // since not all lines may actually be used, in which
- // case we do not have to allocate any memory at all
- std::vector<bool> line_is_used(dof_handler.tria->n_raw_lines(),
- false);
- for (unsigned int line = 0; line < dof_handler.tria->n_raw_lines();
- ++line)
- for (unsigned int fe = 0; fe < dof_handler.fe_collection.size();
- ++fe)
- if (line_fe_association[fe][line] == true)
- {
- line_is_used[line] = true;
- break;
- }
-
- // next count how much memory we actually need. for each
- // line, we need one slot per fe to store the fe_index,
- // plus dofs_per_line for this fe. in addition, we need
- // one slot as the end marker for the fe_indices. at the
- // same time already fill the line_dofs_offsets field
- dof_handler.faces->lines.dof_offsets.resize(
- dof_handler.tria->n_raw_lines(), numbers::invalid_unsigned_int);
-
- unsigned int line_slots_needed = 0;
- for (unsigned int line = 0; line < dof_handler.tria->n_raw_lines();
- ++line)
- if (line_is_used[line] == true)
- {
- dof_handler.faces->lines.dof_offsets[line] =
- line_slots_needed;
-
- for (unsigned int fe = 0;
- fe < dof_handler.fe_collection.size();
- ++fe)
- if (line_fe_association[fe][line] == true)
- line_slots_needed +=
- dof_handler.get_fe(fe).dofs_per_line + 1;
- ++line_slots_needed;
- }
-
- // now allocate the space we have determined we need,
- // and set up the linked lists for each of the lines
- dof_handler.faces->lines.dofs.resize(line_slots_needed,
- numbers::invalid_dof_index);
- for (unsigned int line = 0; line < dof_handler.tria->n_raw_lines();
- ++line)
- if (line_is_used[line] == true)
- {
- unsigned int pointer =
- dof_handler.faces->lines.dof_offsets[line];
- for (unsigned int fe = 0;
- fe < dof_handler.fe_collection.size();
- ++fe)
- if (line_fe_association[fe][line] == true)
- {
- // if this line uses this fe, then set the
- // fe_index and move the pointer ahead
- dof_handler.faces->lines.dofs[pointer] = fe;
- pointer += dof_handler.get_fe(fe).dofs_per_line + 1;
- }
- // finally place the end marker
- dof_handler.faces->lines.dofs[pointer] =
- numbers::invalid_dof_index;
- }
- }
-
- // Ensure that everything is done at this point.
- tasks.join_all();
- }
-
-
-
- /**
- * Implement the function of same name in the mother class.
- */
- template <int spacedim>
- static unsigned int
- max_couplings_between_dofs(const DoFHandler<1, spacedim> &dof_handler)
- {
- return std::min(static_cast<types::global_dof_index>(
- 3 *
- dof_handler.fe_collection.max_dofs_per_vertex() +
- 2 * dof_handler.fe_collection.max_dofs_per_line()),
- dof_handler.n_dofs());
- }
-
-
-
- template <int spacedim>
- static unsigned int
- max_couplings_between_dofs(const DoFHandler<2, spacedim> &dof_handler)
- {
- // get these numbers by drawing pictures and counting...
- // example:
- // | | |
- // --x-----x--x--X--
- // | | | |
- // | x--x--x
- // | | | |
- // --x--x--*--x--x--
- // | | | |
- // x--x--x |
- // | | | |
- // --X--x--x-----x--
- // | | |
- // x = vertices connected with center vertex *;
- // = total of 19
- //
- // (the X vertices are connected with * if the vertices
- // adjacent to X are hanging nodes) count lines -> 28 (don't
- // forget to count mother and children separately!)
- types::global_dof_index max_couplings;
- switch (dof_handler.tria->max_adjacent_cells())
- {
- case 4:
- max_couplings =
- 19 * dof_handler.fe_collection.max_dofs_per_vertex() +
- 28 * dof_handler.fe_collection.max_dofs_per_line() +
- 8 * dof_handler.fe_collection.max_dofs_per_quad();
- break;
- case 5:
- max_couplings =
- 21 * dof_handler.fe_collection.max_dofs_per_vertex() +
- 31 * dof_handler.fe_collection.max_dofs_per_line() +
- 9 * dof_handler.fe_collection.max_dofs_per_quad();
- break;
- case 6:
- max_couplings =
- 28 * dof_handler.fe_collection.max_dofs_per_vertex() +
- 42 * dof_handler.fe_collection.max_dofs_per_line() +
- 12 * dof_handler.fe_collection.max_dofs_per_quad();
- break;
- case 7:
- max_couplings =
- 30 * dof_handler.fe_collection.max_dofs_per_vertex() +
- 45 * dof_handler.fe_collection.max_dofs_per_line() +
- 13 * dof_handler.fe_collection.max_dofs_per_quad();
- break;
- case 8:
- max_couplings =
- 37 * dof_handler.fe_collection.max_dofs_per_vertex() +
- 56 * dof_handler.fe_collection.max_dofs_per_line() +
- 16 * dof_handler.fe_collection.max_dofs_per_quad();
- break;
- default:
- Assert(false, ExcNotImplemented());
- max_couplings = 0;
- }
- return std::min(max_couplings, dof_handler.n_dofs());
- }
-
-
-
- template <int spacedim>
- static unsigned int
- max_couplings_between_dofs(const DoFHandler<3, spacedim> &dof_handler)
- {
- // TODO:[?] Invent significantly better estimates than the ones in
- // this function
- // doing the same thing here is a rather complicated thing,
- // compared to the 2d case, since it is hard to draw
- // pictures with several refined hexahedra :-) so I
- // presently only give a coarse estimate for the case that
- // at most 8 hexes meet at each vertex
- //
- // can anyone give better estimate here?
- const unsigned int max_adjacent_cells =
- dof_handler.tria->max_adjacent_cells();
-
- types::global_dof_index max_couplings;
- if (max_adjacent_cells <= 8)
- max_couplings =
- 7 * 7 * 7 * dof_handler.fe_collection.max_dofs_per_vertex() +
- 7 * 6 * 7 * 3 * dof_handler.fe_collection.max_dofs_per_line() +
- 9 * 4 * 7 * 3 * dof_handler.fe_collection.max_dofs_per_quad() +
- 27 * dof_handler.fe_collection.max_dofs_per_hex();
- else
- {
- Assert(false, ExcNotImplemented());
- max_couplings = 0;
- }
-
- return std::min(max_couplings, dof_handler.n_dofs());
- }
-
-
-
- /**
- * Given a hp::DoFHandler object, make sure that the active_fe_indices
- * that a user has set for locally owned cells are communicated to all
- * other relevant cells as well.
- *
- * For parallel::shared::Triangulation objects,
- * this information is distributed on both ghost and artificial cells.
- *
- * In case a parallel::DistributedTriangulationBase is used,
- * indices are communicated only to ghost cells.
- */
- template <int dim, int spacedim>
- static void
- communicate_active_fe_indices(
- dealii::hp::DoFHandler<dim, spacedim> &dof_handler)
- {
- if (const dealii::parallel::shared::Triangulation<dim, spacedim> *tr =
- dynamic_cast<
- const dealii::parallel::shared::Triangulation<dim, spacedim>
- *>(&dof_handler.get_triangulation()))
- {
- // we have a shared triangulation. in this case, every processor
- // knows about all cells, but every processor only has knowledge
- // about the active_fe_index on the cells it owns.
- //
- // we can create a complete set of active_fe_indices by letting
- // every processor create a vector of indices for all cells,
- // filling only those on the cells it owns and setting the indices
- // on the other cells to zero. then we add all of these vectors
- // up, and because every vector entry has exactly one processor
- // that owns it, the sum is correct
- std::vector<unsigned int> active_fe_indices(tr->n_active_cells(),
- 0u);
- for (const auto &cell : dof_handler.active_cell_iterators())
- if (cell->is_locally_owned())
- active_fe_indices[cell->active_cell_index()] =
- cell->active_fe_index();
-
- Utilities::MPI::sum(active_fe_indices,
- tr->get_communicator(),
- active_fe_indices);
-
- // now go back and fill the active_fe_index on all other
- // cells. we would like to call cell->set_active_fe_index(),
- // but that function does not allow setting these indices on
- // non-locally_owned cells. so we have to work around the
- // issue a little bit by accessing the underlying data
- // structures directly
- for (const auto &cell : dof_handler.active_cell_iterators())
- if (!cell->is_locally_owned())
- dof_handler.levels[cell->level()]->set_active_fe_index(
- cell->index(),
- active_fe_indices[cell->active_cell_index()]);
- }
- else if (const dealii::parallel::
- DistributedTriangulationBase<dim, spacedim> *tr =
- dynamic_cast<
- const dealii::parallel::
- DistributedTriangulationBase<dim, spacedim> *>(
- &dof_handler.get_triangulation()))
- {
- // For completely distributed meshes, use the function that is
- // able to move data from locally owned cells on one processor to
- // the corresponding ghost cells on others. To this end, we need
- // to have functions that can pack and unpack the data we want to
- // transport -- namely, the single unsigned int active_fe_index
- // objects
- auto pack =
- [](const typename dealii::hp::DoFHandler<dim, spacedim>::
- active_cell_iterator &cell) -> unsigned int {
- return cell->active_fe_index();
- };
-
- auto unpack =
- [&dof_handler](
- const typename dealii::hp::DoFHandler<dim, spacedim>::
- active_cell_iterator &cell,
- const unsigned int active_fe_index) -> void {
- // we would like to say
- // cell->set_active_fe_index(active_fe_index);
- // but this is not allowed on cells that are not
- // locally owned, and we are on a ghost cell
- dof_handler.levels[cell->level()]->set_active_fe_index(
- cell->index(), active_fe_index);
- };
-
- GridTools::exchange_cell_data_to_ghosts<
- unsigned int,
- dealii::hp::DoFHandler<dim, spacedim>>(dof_handler,
- pack,
- unpack);
- }
- else
- {
- // a sequential triangulation. there is nothing we need to do here
- Assert(
- (dynamic_cast<
- const dealii::parallel::TriangulationBase<dim, spacedim> *>(
- &dof_handler.get_triangulation()) == nullptr),
- ExcInternalError());
- }
- }
-
-
-
- /**
- * Collect all finite element indices on cells that will be affected by
- * future refinement and coarsening. Further, prepare those indices to
- * be distributed on on the updated triangulation later.
- *
- * On cells to be refined, the active_fe_index will be inherited to
- * their children and thus will be stored as such.
- *
- * On cells to be coarsened, we choose the finite element on the parent
- * cell from those assigned to their children to be the one that is
- * dominated by all children. If none was found, we pick the most
- * dominant element in the whole collection that is dominated by all
- * children. See documentation of
- * hp::FECollection::find_dominated_fe_extended() for further
- * information.
- *
- * On cells intended for p-refinement or p-coarsening, those
- * active_fe_indices will be determined by the corresponding flags that
- * have been set on the relevant cells.
- */
- template <int dim, int spacedim>
- static void
- collect_fe_indices_on_cells_to_be_refined(
- dealii::hp::DoFHandler<dim, spacedim> &dof_handler)
- {
- const auto &fe_transfer = dof_handler.active_fe_index_transfer;
-
- for (const auto &cell : dof_handler.active_cell_iterators())
- if (cell->is_locally_owned())
- {
- if (cell->refine_flag_set())
- {
- // Store the active_fe_index of each cell that will be
- // refined to and distribute it later on its children.
- // Pick their future index if flagged for p-refinement.
- fe_transfer->refined_cells_fe_index.insert(
- {cell, cell->future_fe_index()});
- }
- else if (cell->coarsen_flag_set())
- {
- // From all cells that will be coarsened, determine their
- // parent and calculate its proper active_fe_index, so that
- // it can be set after refinement. But first, check if that
- // particular cell has a parent at all.
- Assert(cell->level() > 0, ExcInternalError());
- const auto &parent = cell->parent();
-
- // Check if the active_fe_index for the current cell has
- // been determined already.
- if (fe_transfer->coarsened_cells_fe_index.find(parent) ==
- fe_transfer->coarsened_cells_fe_index.end())
- {
- // Find a suitable active_fe_index for the parent cell
- // based on the 'least dominant finite element' of its
- // children. Consider the childrens' hypothetical future
- // index when they have been flagged for p-refinement.
- std::set<unsigned int> fe_indices_children;
- for (unsigned int child_index = 0;
- child_index < parent->n_children();
- ++child_index)
- {
- const auto &sibling = parent->child(child_index);
- Assert(sibling->is_active() &&
- sibling->coarsen_flag_set(),
- typename dealii::Triangulation<
- dim>::ExcInconsistentCoarseningFlags());
-
- fe_indices_children.insert(
- sibling->future_fe_index());
- }
- Assert(!fe_indices_children.empty(),
- ExcInternalError());
-
- const unsigned int fe_index =
- dof_handler.fe_collection.find_dominated_fe_extended(
- fe_indices_children, /*codim=*/0);
-
- Assert(fe_index != numbers::invalid_unsigned_int,
- typename dealii::hp::FECollection<dim>::
- ExcNoDominatedFiniteElementAmongstChildren());
-
- fe_transfer->coarsened_cells_fe_index.insert(
- {parent, fe_index});
- }
- }
- else
- {
- // No h-refinement is scheduled for this cell.
- // However, it may have p-refinement indicators, so we
- // choose a new active_fe_index based on its flags.
- if (cell->future_fe_index_set() == true)
- fe_transfer->persisting_cells_fe_index.insert(
- {cell, cell->future_fe_index()});
- }
- }
- }
-
-
-
- /**
- * Distribute active finite element indices that have been previously
- * prepared in collect_fe_indices_on_cells_to_be_refined().
- */
- template <int dim, int spacedim>
- static void
- distribute_fe_indices_on_refined_cells(
- dealii::hp::DoFHandler<dim, spacedim> &dof_handler)
- {
- const auto &fe_transfer = dof_handler.active_fe_index_transfer;
-
- // Set active_fe_indices on persisting cells.
- for (const auto &persist : fe_transfer->persisting_cells_fe_index)
- {
- const auto &cell = persist.first;
-
- if (cell->is_locally_owned())
- {
- Assert(cell->is_active(), ExcInternalError());
- cell->set_active_fe_index(persist.second);
- }
- }
-
- // Distribute active_fe_indices from all refined cells on their
- // respective children.
- for (const auto &refine : fe_transfer->refined_cells_fe_index)
- {
- const auto &parent = refine.first;
-
- for (unsigned int child_index = 0;
- child_index < parent->n_children();
- ++child_index)
- {
- const auto &child = parent->child(child_index);
- Assert(child->is_locally_owned() && child->is_active(),
- ExcInternalError());
- child->set_active_fe_index(refine.second);
- }
- }
-
- // Set active_fe_indices on coarsened cells that have been determined
- // before the actual coarsening happened.
- for (const auto &coarsen : fe_transfer->coarsened_cells_fe_index)
- {
- const auto &cell = coarsen.first;
- Assert(cell->is_locally_owned() && cell->is_active(),
- ExcInternalError());
- cell->set_active_fe_index(coarsen.second);
- }
- }
-
-
- /**
- * Coarsening strategy for the CellDataTransfer object responsible for
- * transferring the active_fe_index of each cell on
- * parallel::distributed::Triangulation objects that have been refined.
- *
- * A finite element index needs to be determined for the (not yet
- * active) parent cell from its (still active) children. Out of the set
- * of elements previously assigned to the former children, we choose the
- * one dominated by all children for the parent cell.
- */
- template <int dim, int spacedim>
- static unsigned int
- determine_fe_from_children(
- const typename Triangulation<dim, spacedim>::cell_iterator &,
- const std::vector<unsigned int> & children_fe_indices,
- dealii::hp::FECollection<dim, spacedim> &fe_collection)
- {
- Assert(!children_fe_indices.empty(), ExcInternalError());
-
- // convert vector to set
- const std::set<unsigned int> children_fe_indices_set(
- children_fe_indices.begin(), children_fe_indices.end());
-
- const unsigned int dominated_fe_index =
- fe_collection.find_dominated_fe_extended(children_fe_indices_set,
- /*codim=*/0);
-
- Assert(dominated_fe_index != numbers::invalid_unsigned_int,
- typename dealii::hp::FECollection<
- dim>::ExcNoDominatedFiniteElementAmongstChildren());
-
- return dominated_fe_index;
- }
- };
- } // namespace DoFHandlerImplementation
- } // namespace hp
-} // namespace internal
-
-
-
namespace hp
{
- template <int dim, int spacedim>
- const unsigned int DoFHandler<dim, spacedim>::dimension;
-
- template <int dim, int spacedim>
- const unsigned int DoFHandler<dim, spacedim>::default_fe_index;
-
-
-
template <int dim, int spacedim>
DoFHandler<dim, spacedim>::DoFHandler()
- : tria(nullptr, typeid(*this).name())
- , faces(nullptr)
+ : dealii::DoFHandler<dim, spacedim>(true)
{}
template <int dim, int spacedim>
DoFHandler<dim, spacedim>::DoFHandler(
const Triangulation<dim, spacedim> &tria)
- : tria(&tria, typeid(*this).name())
- , faces(nullptr)
- {
- setup_policy_and_listeners();
-
- create_active_fe_table();
- }
-
-
-
- template <int dim, int spacedim>
- DoFHandler<dim, spacedim>::~DoFHandler()
- {
- // unsubscribe as a listener to refinement of the underlying
- // triangulation
- for (auto &connection : tria_listeners)
- connection.disconnect();
- tria_listeners.clear();
-
- // ...and release allocated memory
- // virtual functions called in constructors and destructors never use the
- // override in a derived class
- // for clarity be explicit on which function is called
- DoFHandler<dim, spacedim>::clear();
- }
-
-
-
- /*------------------------ Cell iterator functions ------------------------*/
-
-
- template <int dim, int spacedim>
- typename DoFHandler<dim, spacedim>::cell_iterator
- DoFHandler<dim, spacedim>::begin(const unsigned int level) const
- {
- return cell_iterator(*this->get_triangulation().begin(level), this);
- }
-
-
-
- template <int dim, int spacedim>
- typename DoFHandler<dim, spacedim>::active_cell_iterator
- DoFHandler<dim, spacedim>::begin_active(const unsigned int level) const
- {
- // level is checked in begin
- cell_iterator i = begin(level);
- if (i.state() != IteratorState::valid)
- return i;
- while (i->has_children())
- if ((++i).state() != IteratorState::valid)
- return i;
- return i;
- }
-
-
-
- template <int dim, int spacedim>
- typename DoFHandler<dim, spacedim>::cell_iterator
- DoFHandler<dim, spacedim>::end() const
- {
- return cell_iterator(&this->get_triangulation(), -1, -1, this);
- }
-
-
-
- template <int dim, int spacedim>
- typename DoFHandler<dim, spacedim>::cell_iterator
- DoFHandler<dim, spacedim>::end(const unsigned int level) const
- {
- return (level == this->get_triangulation().n_levels() - 1 ?
- end() :
- begin(level + 1));
- }
-
-
-
- template <int dim, int spacedim>
- typename DoFHandler<dim, spacedim>::active_cell_iterator
- DoFHandler<dim, spacedim>::end_active(const unsigned int level) const
- {
- return (level == this->get_triangulation().n_levels() - 1 ?
- active_cell_iterator(end()) :
- begin_active(level + 1));
- }
-
-
-
- template <int dim, int spacedim>
- IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>
- DoFHandler<dim, spacedim>::cell_iterators() const
- {
- return IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>(
- begin(), end());
- }
-
-
-
- template <int dim, int spacedim>
- IteratorRange<typename DoFHandler<dim, spacedim>::active_cell_iterator>
- DoFHandler<dim, spacedim>::active_cell_iterators() const
- {
- return IteratorRange<
- typename DoFHandler<dim, spacedim>::active_cell_iterator>(begin_active(),
- end());
- }
-
-
-
- template <int dim, int spacedim>
- IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>
- DoFHandler<dim, spacedim>::cell_iterators_on_level(
- const unsigned int level) const
- {
- return IteratorRange<typename DoFHandler<dim, spacedim>::cell_iterator>(
- begin(level), end(level));
- }
-
-
-
- template <int dim, int spacedim>
- IteratorRange<typename DoFHandler<dim, spacedim>::active_cell_iterator>
- DoFHandler<dim, spacedim>::active_cell_iterators_on_level(
- const unsigned int level) const
- {
- return IteratorRange<
- typename DoFHandler<dim, spacedim>::active_cell_iterator>(
- begin_active(level), end_active(level));
- }
-
-
-
- //------------------------------------------------------------------
-
-
- template <int dim, int spacedim>
- types::global_dof_index
- DoFHandler<dim, spacedim>::n_boundary_dofs() const
- {
- Assert(fe_collection.size() > 0, ExcNoFESelected());
-
- std::unordered_set<types::global_dof_index> boundary_dofs;
- std::vector<types::global_dof_index> dofs_on_face;
- dofs_on_face.reserve(this->get_fe_collection().max_dofs_per_face());
-
- const IndexSet &owned_dofs = locally_owned_dofs();
-
- // loop over all faces to check whether they are at a
- // boundary. note that we need not take special care of single
- // lines in 3d (using @p{cell->has_boundary_lines}), since we do
- // not support boundaries of dimension dim-2, and so every
- // boundary line is also part of a boundary face.
- typename HpDoFHandler<dim, spacedim>::active_cell_iterator
- cell = this->begin_active(),
- endc = this->end();
- for (; cell != endc; ++cell)
- if (cell->is_locally_owned() && cell->at_boundary())
- {
- for (auto f : GeometryInfo<dim>::face_indices())
- if (cell->at_boundary(f))
- {
- const unsigned int dofs_per_face = cell->get_fe().dofs_per_face;
- dofs_on_face.resize(dofs_per_face);
-
- cell->face(f)->get_dof_indices(dofs_on_face,
- cell->active_fe_index());
- for (unsigned int i = 0; i < dofs_per_face; ++i)
- {
- const unsigned int global_idof_index = dofs_on_face[i];
- if (owned_dofs.is_element(global_idof_index))
- {
- boundary_dofs.insert(global_idof_index);
- }
- }
- }
- }
- return boundary_dofs.size();
- }
-
-
-
- template <int dim, int spacedim>
- types::global_dof_index
- DoFHandler<dim, spacedim>::n_boundary_dofs(
- const std::set<types::boundary_id> &boundary_ids) const
- {
- Assert(fe_collection.size() > 0, ExcNoFESelected());
- Assert(boundary_ids.find(numbers::internal_face_boundary_id) ==
- boundary_ids.end(),
- ExcInvalidBoundaryIndicator());
-
- // same as above, but with additional checks for set of boundary
- // indicators
- std::unordered_set<types::global_dof_index> boundary_dofs;
- std::vector<types::global_dof_index> dofs_on_face;
- dofs_on_face.reserve(this->get_fe_collection().max_dofs_per_face());
-
- const IndexSet &owned_dofs = locally_owned_dofs();
-
- typename HpDoFHandler<dim, spacedim>::active_cell_iterator
- cell = this->begin_active(),
- endc = this->end();
- for (; cell != endc; ++cell)
- if (cell->is_locally_owned() && cell->at_boundary())
- {
- for (auto f : GeometryInfo<dim>::face_indices())
- if (cell->at_boundary(f) &&
- (boundary_ids.find(cell->face(f)->boundary_id()) !=
- boundary_ids.end()))
- {
- const unsigned int dofs_per_face = cell->get_fe().dofs_per_face;
- dofs_on_face.resize(dofs_per_face);
-
- cell->face(f)->get_dof_indices(dofs_on_face,
- cell->active_fe_index());
- for (unsigned int i = 0; i < dofs_per_face; ++i)
- {
- const unsigned int global_idof_index = dofs_on_face[i];
- if (owned_dofs.is_element(global_idof_index))
- {
- boundary_dofs.insert(global_idof_index);
- }
- }
- }
- }
- return boundary_dofs.size();
- }
-
-
-
- template <int dim, int spacedim>
- std::size_t
- DoFHandler<dim, spacedim>::memory_consumption() const
- {
- std::size_t mem =
- (MemoryConsumption::memory_consumption(tria) +
- MemoryConsumption::memory_consumption(fe_collection) +
- MemoryConsumption::memory_consumption(tria) +
- MemoryConsumption::memory_consumption(levels) +
- MemoryConsumption::memory_consumption(*faces) +
- MemoryConsumption::memory_consumption(number_cache) +
- MemoryConsumption::memory_consumption(vertex_dofs) +
- MemoryConsumption::memory_consumption(vertex_dof_offsets));
- for (const auto &level : levels)
- mem += MemoryConsumption::memory_consumption(*level);
- mem += MemoryConsumption::memory_consumption(*faces);
-
- return mem;
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::set_active_fe_indices(
- const std::vector<unsigned int> &active_fe_indices)
- {
- Assert(active_fe_indices.size() == get_triangulation().n_active_cells(),
- ExcDimensionMismatch(active_fe_indices.size(),
- get_triangulation().n_active_cells()));
-
- create_active_fe_table();
- // we could set the values directly, since they are stored as
- // protected data of this object, but for simplicity we use the
- // cell-wise access. this way we also have to pass some debug-mode
- // tests which we would have to duplicate ourselves otherwise
- for (const auto &cell : active_cell_iterators())
- if (cell->is_locally_owned())
- cell->set_active_fe_index(active_fe_indices[cell->active_cell_index()]);
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::get_active_fe_indices(
- std::vector<unsigned int> &active_fe_indices) const
- {
- active_fe_indices.resize(get_triangulation().n_active_cells());
-
- // we could try to extract the values directly, since they are
- // stored as protected data of this object, but for simplicity we
- // use the cell-wise access.
- for (const auto &cell : active_cell_iterators())
- if (!cell->is_artificial())
- active_fe_indices[cell->active_cell_index()] = cell->active_fe_index();
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::initialize(
- const Triangulation<dim, spacedim> & tria,
- const hp::FECollection<dim, spacedim> &fe)
- {
- clear();
-
- if (this->tria != &tria)
- {
- for (auto &connection : tria_listeners)
- connection.disconnect();
- tria_listeners.clear();
-
- this->tria = &tria;
-
- setup_policy_and_listeners();
- }
-
- create_active_fe_table();
-
- distribute_dofs(fe);
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::set_fe(const hp::FECollection<dim, spacedim> &ff)
- {
- Assert(
- tria != nullptr,
- ExcMessage(
- "You need to set the Triangulation in the DoFHandler using initialize() or "
- "in the constructor before you can distribute DoFs."));
- Assert(tria->n_levels() > 0,
- ExcMessage("The Triangulation you are using is empty!"));
- Assert(ff.size() > 0, ExcMessage("The hp::FECollection given is empty!"));
-
- // don't create a new object if the one we have is already appropriate
- if (fe_collection != ff)
- fe_collection = hp::FECollection<dim, spacedim>(ff);
-
- // ensure that the active_fe_indices vectors are initialized correctly
- create_active_fe_table();
-
- // make sure every processor knows the active_fe_indices
- // on both its own cells and all ghost cells
- dealii::internal::hp::DoFHandlerImplementation::Implementation::
- communicate_active_fe_indices(*this);
-
- // make sure that the fe collection is large enough to
- // cover all fe indices presently in use on the mesh
- for (const auto &cell : active_cell_iterators())
- if (!cell->is_artificial())
- Assert(cell->active_fe_index() < fe_collection.size(),
- ExcInvalidFEIndex(cell->active_fe_index(),
- fe_collection.size()));
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::distribute_dofs(
- const hp::FECollection<dim, spacedim> &ff)
- {
- // assign the fe_collection and initialize all active_fe_indices
- set_fe(ff);
-
- // If an underlying shared::Tria allows artificial cells,
- // then save the current set of subdomain ids, and set
- // subdomain ids to the "true" owner of each cell. we later
- // restore these flags
- std::vector<types::subdomain_id> saved_subdomain_ids;
- const parallel::shared::Triangulation<dim, spacedim> *shared_tria =
- (dynamic_cast<const parallel::shared::Triangulation<dim, spacedim> *>(
- &get_triangulation()));
- if (shared_tria != nullptr && shared_tria->with_artificial_cells())
- {
- saved_subdomain_ids.resize(shared_tria->n_active_cells());
-
- const std::vector<types::subdomain_id> &true_subdomain_ids =
- shared_tria->get_true_subdomain_ids_of_cells();
-
- for (const auto &cell : shared_tria->active_cell_iterators())
- {
- const unsigned int index = cell->active_cell_index();
- saved_subdomain_ids[index] = cell->subdomain_id();
- cell->set_subdomain_id(true_subdomain_ids[index]);
- }
- }
-
- // then allocate space for all the other tables
- dealii::internal::hp::DoFHandlerImplementation::Implementation::
- reserve_space(*this);
-
- // now undo the subdomain modification
- if (shared_tria != nullptr && shared_tria->with_artificial_cells())
- for (const auto &cell : shared_tria->active_cell_iterators())
- cell->set_subdomain_id(saved_subdomain_ids[cell->active_cell_index()]);
-
-
- // Clear user flags because we will need them. But first we save
- // them and make sure that we restore them later such that at the
- // end of this function the Triangulation will be in the same
- // state as it was at the beginning of this function.
- std::vector<bool> user_flags;
- tria->save_user_flags(user_flags);
- const_cast<Triangulation<dim, spacedim> &>(*tria).clear_user_flags();
-
-
- /////////////////////////////////
-
- // Now for the real work:
- number_cache = policy->distribute_dofs();
-
- /////////////////////////////////
-
- // do some housekeeping: compress indices
- {
- Threads::TaskGroup<> tg;
- for (int level = levels.size() - 1; level >= 0; --level)
- tg += Threads::new_task(
- &dealii::internal::hp::DoFLevel::compress_data<dim, spacedim>,
- *levels[level],
- fe_collection);
- tg.join_all();
- }
-
- // finally restore the user flags
- const_cast<Triangulation<dim, spacedim> &>(*tria).load_user_flags(
- user_flags);
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::setup_policy_and_listeners()
- {
- // connect functions to signals of the underlying triangulation
- tria_listeners.push_back(this->tria->signals.pre_refinement.connect(
- [this]() { this->pre_refinement_action(); }));
- tria_listeners.push_back(this->tria->signals.post_refinement.connect(
- [this]() { this->post_refinement_action(); }));
- tria_listeners.push_back(this->tria->signals.create.connect(
- [this]() { this->post_refinement_action(); }));
-
- // decide whether we need a sequential or a parallel shared/distributed
- // policy and attach corresponding callback functions dealing with the
- // transfer of active_fe_indices
- if (dynamic_cast<const parallel::DistributedTriangulationBase<dim, spacedim>
- *>(&this->get_triangulation()))
- {
- policy =
- std::make_unique<internal::DoFHandlerImplementation::Policy::
- ParallelDistributed<DoFHandler<dim, spacedim>>>(
- *this);
-
- // repartitioning signals
- tria_listeners.push_back(
- this->tria->signals.pre_distributed_repartition.connect([this]() {
- internal::hp::DoFHandlerImplementation::Implementation::
- ensure_absence_of_future_fe_indices<dim, spacedim>(*this);
- }));
- tria_listeners.push_back(
- this->tria->signals.pre_distributed_repartition.connect(
- [this]() { this->pre_distributed_active_fe_index_transfer(); }));
- tria_listeners.push_back(
- this->tria->signals.post_distributed_repartition.connect(
- [this] { this->post_distributed_active_fe_index_transfer(); }));
-
- // refinement signals
- tria_listeners.push_back(
- this->tria->signals.pre_distributed_refinement.connect(
- [this]() { this->pre_distributed_active_fe_index_transfer(); }));
- tria_listeners.push_back(
- this->tria->signals.post_distributed_refinement.connect(
- [this]() { this->post_distributed_active_fe_index_transfer(); }));
-
- // serialization signals
- tria_listeners.push_back(
- this->tria->signals.post_distributed_save.connect([this]() {
- this->post_distributed_serialization_of_active_fe_indices();
- }));
- }
- else if (dynamic_cast<const parallel::shared::Triangulation<dim, spacedim>
- *>(&this->get_triangulation()) != nullptr)
- {
- policy =
- std::make_unique<internal::DoFHandlerImplementation::Policy::
- ParallelShared<DoFHandler<dim, spacedim>>>(*this);
-
- // partitioning signals
- tria_listeners.push_back(
- this->tria->signals.pre_partition.connect([this]() {
- internal::hp::DoFHandlerImplementation::Implementation::
- ensure_absence_of_future_fe_indices(*this);
- }));
-
- // refinement signals
- tria_listeners.push_back(this->tria->signals.pre_refinement.connect(
- [this] { this->pre_active_fe_index_transfer(); }));
- tria_listeners.push_back(this->tria->signals.post_refinement.connect(
- [this] { this->post_active_fe_index_transfer(); }));
- }
- else
- {
- policy =
- std::make_unique<internal::DoFHandlerImplementation::Policy::
- Sequential<DoFHandler<dim, spacedim>>>(*this);
-
- // refinement signals
- tria_listeners.push_back(this->tria->signals.pre_refinement.connect(
- [this] { this->pre_active_fe_index_transfer(); }));
- tria_listeners.push_back(this->tria->signals.post_refinement.connect(
- [this] { this->post_active_fe_index_transfer(); }));
- }
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::clear()
- {
- // release memory
- clear_space();
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::renumber_dofs(
- const std::vector<types::global_dof_index> &new_numbers)
- {
- Assert(levels.size() > 0,
- ExcMessage(
- "You need to distribute DoFs before you can renumber them."));
-
- AssertDimension(new_numbers.size(), n_locally_owned_dofs());
-
-#ifdef DEBUG
- // assert that the new indices are
- // consecutively numbered if we are
- // working on a single
- // processor. this doesn't need to
- // hold in the case of a parallel
- // mesh since we map the interval
- // [0...n_dofs()) into itself but
- // only globally, not on each
- // processor
- if (n_locally_owned_dofs() == n_dofs())
- {
- std::vector<types::global_dof_index> tmp(new_numbers);
- std::sort(tmp.begin(), tmp.end());
- std::vector<types::global_dof_index>::const_iterator p = tmp.begin();
- types::global_dof_index i = 0;
- for (; p != tmp.end(); ++p, ++i)
- Assert(*p == i, ExcNewNumbersNotConsecutive(i));
- }
- else
- for (const auto new_number : new_numbers)
- Assert(new_number < n_dofs(),
- ExcMessage(
- "New DoF index is not less than the total number of dofs."));
-#endif
-
- // uncompress the internal storage scheme of dofs on cells so that
- // we can access dofs in turns. uncompress in parallel, starting
- // with the most expensive levels (the highest ones)
- {
- Threads::TaskGroup<> tg;
- for (int level = levels.size() - 1; level >= 0; --level)
- tg += Threads::new_task(
- &dealii::internal::hp::DoFLevel::uncompress_data<dim, spacedim>,
- *levels[level],
- fe_collection);
- tg.join_all();
- }
-
- // do the renumbering
- number_cache = policy->renumber_dofs(new_numbers);
-
- // now re-compress the dof indices
- {
- Threads::TaskGroup<> tg;
- for (int level = levels.size() - 1; level >= 0; --level)
- tg += Threads::new_task(
- &dealii::internal::hp::DoFLevel::compress_data<dim, spacedim>,
- *levels[level],
- fe_collection);
- tg.join_all();
- }
- }
-
-
-
- template <int dim, int spacedim>
- unsigned int
- DoFHandler<dim, spacedim>::max_couplings_between_dofs() const
- {
- Assert(fe_collection.size() > 0, ExcNoFESelected());
- return dealii::internal::hp::DoFHandlerImplementation::Implementation::
- max_couplings_between_dofs(*this);
- }
-
-
-
- template <int dim, int spacedim>
- unsigned int
- DoFHandler<dim, spacedim>::max_couplings_between_boundary_dofs() const
- {
- Assert(fe_collection.size() > 0, ExcNoFESelected());
-
- switch (dim)
- {
- case 1:
- return fe_collection.max_dofs_per_vertex();
- case 2:
- return (3 * fe_collection.max_dofs_per_vertex() +
- 2 * fe_collection.max_dofs_per_line());
- case 3:
- // we need to take refinement of one boundary face into
- // consideration here; in fact, this function returns what
- // #max_coupling_between_dofs<2> returns
- //
- // we assume here, that only four faces meet at the boundary;
- // this assumption is not justified and needs to be fixed some
- // time. fortunately, omitting it for now does no harm since
- // the matrix will cry foul if its requirements are not
- // satisfied
- return (19 * fe_collection.max_dofs_per_vertex() +
- 28 * fe_collection.max_dofs_per_line() +
- 8 * fe_collection.max_dofs_per_quad());
- default:
- Assert(false, ExcNotImplemented());
- return 0;
- }
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::create_active_fe_table()
- {
- // Create sufficiently many hp::DoFLevels.
- while (levels.size() < tria->n_levels())
- levels.emplace_back(new dealii::internal::hp::DoFLevel);
-
- // then make sure that on each level we have the appropriate size
- // of active_fe_indices; preset them to zero, i.e. the default FE
- for (unsigned int level = 0; level < levels.size(); ++level)
- {
- if (levels[level]->active_fe_indices.size() == 0 &&
- levels[level]->future_fe_indices.size() == 0)
- {
- levels[level]->active_fe_indices.resize(tria->n_raw_cells(level),
- 0);
- levels[level]->future_fe_indices.resize(
- tria->n_raw_cells(level),
- dealii::internal::hp::DoFLevel::invalid_active_fe_index);
- }
- else
- {
- // Either the active_fe_indices have size zero because
- // they were just created, or the correct size. Other
- // sizes indicate that something went wrong.
- Assert(levels[level]->active_fe_indices.size() ==
- tria->n_raw_cells(level) &&
- levels[level]->future_fe_indices.size() ==
- tria->n_raw_cells(level),
- ExcInternalError());
- }
-
- // it may be that the previous table was compressed; in that
- // case, restore the correct active_fe_index. the fact that
- // this no longer matches the indices in the table is of no
- // importance because the current function is called at a
- // point where we have to recreate the dof_indices tables in
- // the levels anyway
- levels[level]->normalize_active_fe_indices();
- }
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::pre_refinement_action()
- {
- create_active_fe_table();
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::post_refinement_action()
- {
- // Normally only one level is added, but if this Triangulation
- // is created by copy_triangulation, it can be more than one level.
- while (levels.size() < tria->n_levels())
- levels.emplace_back(new dealii::internal::hp::DoFLevel);
-
- // Coarsening can lead to the loss of levels. Hence remove them.
- while (levels.size() > tria->n_levels())
- {
- // drop the last element. that also releases the memory pointed to
- levels.pop_back();
- }
-
- Assert(levels.size() == tria->n_levels(), ExcInternalError());
- for (unsigned int i = 0; i < levels.size(); ++i)
- {
- // Resize active_fe_indices vectors. Use zero indicator to extend.
- levels[i]->active_fe_indices.resize(tria->n_raw_cells(i), 0);
-
- // Resize future_fe_indices vectors. Make sure that all
- // future_fe_indices have been cleared after refinement happened.
- //
- // We have used future_fe_indices to update all active_fe_indices
- // before refinement happened, thus we are safe to clear them now.
- levels[i]->future_fe_indices.assign(
- tria->n_raw_cells(i),
- dealii::internal::hp::DoFLevel::invalid_active_fe_index);
- }
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::pre_active_fe_index_transfer()
- {
- // Finite elements need to be assigned to each cell by calling
- // distribute_dofs() first to make this functionality available.
- if (fe_collection.size() > 0)
- {
- Assert(active_fe_index_transfer == nullptr, ExcInternalError());
-
- active_fe_index_transfer = std::make_unique<ActiveFEIndexTransfer>();
-
- dealii::internal::hp::DoFHandlerImplementation::Implementation::
- collect_fe_indices_on_cells_to_be_refined(*this);
- }
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::pre_distributed_active_fe_index_transfer()
- {
-#ifndef DEAL_II_WITH_P4EST
- Assert(false,
- ExcMessage(
- "You are attempting to use a functionality that is only available "
- "if deal.II was configured to use p4est, but cmake did not find a "
- "valid p4est library."));
-#else
- // the implementation below requires a p:d:T currently
- Assert((dynamic_cast<
- const parallel::distributed::Triangulation<dim, spacedim> *>(
- &this->get_triangulation()) != nullptr),
- ExcNotImplemented());
-
- // Finite elements need to be assigned to each cell by calling
- // distribute_dofs() first to make this functionality available.
- if (fe_collection.size() > 0)
- {
- Assert(active_fe_index_transfer == nullptr, ExcInternalError());
-
- active_fe_index_transfer = std::make_unique<ActiveFEIndexTransfer>();
-
- // If we work on a p::d::Triangulation, we have to transfer all
- // active_fe_indices since ownership of cells may change. We will
- // use our p::d::CellDataTransfer member to achieve this. Further,
- // we prepare the values in such a way that they will correspond to
- // the active_fe_indices on the new mesh.
-
- // Gather all current future_fe_indices.
- active_fe_index_transfer->active_fe_indices.resize(
- get_triangulation().n_active_cells(), numbers::invalid_unsigned_int);
-
- for (const auto &cell : active_cell_iterators())
- if (cell->is_locally_owned())
- active_fe_index_transfer
- ->active_fe_indices[cell->active_cell_index()] =
- cell->future_fe_index();
-
- // Create transfer object and attach to it.
- const auto *distributed_tria = dynamic_cast<
- const parallel::distributed::Triangulation<dim, spacedim> *>(
- &this->get_triangulation());
-
- active_fe_index_transfer->cell_data_transfer = std::make_unique<
- parallel::distributed::
- CellDataTransfer<dim, spacedim, std::vector<unsigned int>>>(
- *distributed_tria,
- /*transfer_variable_size_data=*/false,
- /*refinement_strategy=*/
- &dealii::AdaptationStrategies::Refinement::
- preserve<dim, spacedim, unsigned int>,
- /*coarsening_strategy=*/
- [this](
- const typename Triangulation<dim, spacedim>::cell_iterator &parent,
- const std::vector<unsigned int> &children_fe_indices)
- -> unsigned int {
- return dealii::internal::hp::DoFHandlerImplementation::
- Implementation::determine_fe_from_children<dim, spacedim>(
- parent, children_fe_indices, fe_collection);
- });
-
- active_fe_index_transfer->cell_data_transfer
- ->prepare_for_coarsening_and_refinement(
- active_fe_index_transfer->active_fe_indices);
- }
-#endif
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::post_active_fe_index_transfer()
- {
- // Finite elements need to be assigned to each cell by calling
- // distribute_dofs() first to make this functionality available.
- if (fe_collection.size() > 0)
- {
- Assert(active_fe_index_transfer != nullptr, ExcInternalError());
-
- dealii::internal::hp::DoFHandlerImplementation::Implementation::
- distribute_fe_indices_on_refined_cells(*this);
-
- // We have to distribute the information about active_fe_indices
- // of all cells (including the artificial ones) on all processors,
- // if a parallel::shared::Triangulation has been used.
- dealii::internal::hp::DoFHandlerImplementation::Implementation::
- communicate_active_fe_indices(*this);
-
- // Free memory.
- active_fe_index_transfer.reset();
- }
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::post_distributed_active_fe_index_transfer()
- {
-#ifndef DEAL_II_WITH_P4EST
- Assert(false,
- ExcMessage(
- "You are attempting to use a functionality that is only available "
- "if deal.II was configured to use p4est, but cmake did not find a "
- "valid p4est library."));
-#else
- // the implementation below requires a p:d:T currently
- Assert((dynamic_cast<
- const parallel::distributed::Triangulation<dim, spacedim> *>(
- &this->get_triangulation()) != nullptr),
- ExcNotImplemented());
-
- // Finite elements need to be assigned to each cell by calling
- // distribute_dofs() first to make this functionality available.
- if (fe_collection.size() > 0)
- {
- Assert(active_fe_index_transfer != nullptr, ExcInternalError());
-
- // Unpack active_fe_indices.
- active_fe_index_transfer->active_fe_indices.resize(
- get_triangulation().n_active_cells(), numbers::invalid_unsigned_int);
- active_fe_index_transfer->cell_data_transfer->unpack(
- active_fe_index_transfer->active_fe_indices);
-
- // Update all locally owned active_fe_indices.
- set_active_fe_indices(active_fe_index_transfer->active_fe_indices);
-
- // Update active_fe_indices on ghost cells.
- dealii::internal::hp::DoFHandlerImplementation::Implementation::
- communicate_active_fe_indices(*this);
-
- // Free memory.
- active_fe_index_transfer.reset();
- }
-#endif
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::prepare_for_serialization_of_active_fe_indices()
- {
-#ifndef DEAL_II_WITH_P4EST
- Assert(false,
- ExcMessage(
- "You are attempting to use a functionality that is only available "
- "if deal.II was configured to use p4est, but cmake did not find a "
- "valid p4est library."));
-#else
- // the implementation below requires a p:d:T currently
- Assert((dynamic_cast<
- const parallel::distributed::Triangulation<dim, spacedim> *>(
- &this->get_triangulation()) != nullptr),
- ExcNotImplemented());
-
- // Finite elements need to be assigned to each cell by calling
- // distribute_dofs() first to make this functionality available.
- if (fe_collection.size() > 0)
- {
- Assert(active_fe_index_transfer == nullptr, ExcInternalError());
-
- active_fe_index_transfer = std::make_unique<ActiveFEIndexTransfer>();
-
- // Create transfer object and attach to it.
- const auto *distributed_tria = dynamic_cast<
- const parallel::distributed::Triangulation<dim, spacedim> *>(
- &this->get_triangulation());
-
- active_fe_index_transfer->cell_data_transfer = std::make_unique<
- parallel::distributed::
- CellDataTransfer<dim, spacedim, std::vector<unsigned int>>>(
- *distributed_tria,
- /*transfer_variable_size_data=*/false,
- /*refinement_strategy=*/
- &dealii::AdaptationStrategies::Refinement::
- preserve<dim, spacedim, unsigned int>,
- /*coarsening_strategy=*/
- [this](
- const typename Triangulation<dim, spacedim>::cell_iterator &parent,
- const std::vector<unsigned int> &children_fe_indices)
- -> unsigned int {
- return dealii::internal::hp::DoFHandlerImplementation::
- Implementation::determine_fe_from_children<dim, spacedim>(
- parent, children_fe_indices, fe_collection);
- });
-
- // If we work on a p::d::Triangulation, we have to transfer all
- // active fe indices since ownership of cells may change.
-
- // Gather all current active_fe_indices
- get_active_fe_indices(active_fe_index_transfer->active_fe_indices);
-
- // Attach to transfer object
- active_fe_index_transfer->cell_data_transfer->prepare_for_serialization(
- active_fe_index_transfer->active_fe_indices);
- }
-#endif
- }
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim,
- spacedim>::post_distributed_serialization_of_active_fe_indices()
- {
-#ifndef DEAL_II_WITH_P4EST
- Assert(false,
- ExcMessage(
- "You are attempting to use a functionality that is only available "
- "if deal.II was configured to use p4est, but cmake did not find a "
- "valid p4est library."));
-#else
- // the implementation below requires a p:d:T currently
- Assert((dynamic_cast<
- const parallel::distributed::Triangulation<dim, spacedim> *>(
- &this->get_triangulation()) != nullptr),
- ExcNotImplemented());
-
- if (fe_collection.size() > 0)
- {
- Assert(active_fe_index_transfer != nullptr, ExcInternalError());
-
- // Free memory.
- active_fe_index_transfer.reset();
- }
-#endif
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::deserialize_active_fe_indices()
- {
-#ifndef DEAL_II_WITH_P4EST
- Assert(false,
- ExcMessage(
- "You are attempting to use a functionality that is only available "
- "if deal.II was configured to use p4est, but cmake did not find a "
- "valid p4est library."));
-#else
- // the implementation below requires a p:d:T currently
- Assert((dynamic_cast<
- const parallel::distributed::Triangulation<dim, spacedim> *>(
- &this->get_triangulation()) != nullptr),
- ExcNotImplemented());
-
- // Finite elements need to be assigned to each cell by calling
- // distribute_dofs() first to make this functionality available.
- if (fe_collection.size() > 0)
- {
- Assert(active_fe_index_transfer == nullptr, ExcInternalError());
-
- active_fe_index_transfer = std::make_unique<ActiveFEIndexTransfer>();
-
- // Create transfer object and attach to it.
- const auto *distributed_tria = dynamic_cast<
- const parallel::distributed::Triangulation<dim, spacedim> *>(
- &this->get_triangulation());
-
- active_fe_index_transfer->cell_data_transfer = std::make_unique<
- parallel::distributed::
- CellDataTransfer<dim, spacedim, std::vector<unsigned int>>>(
- *distributed_tria,
- /*transfer_variable_size_data=*/false,
- /*refinement_strategy=*/
- &dealii::AdaptationStrategies::Refinement::
- preserve<dim, spacedim, unsigned int>,
- /*coarsening_strategy=*/
- [this](
- const typename Triangulation<dim, spacedim>::cell_iterator &parent,
- const std::vector<unsigned int> &children_fe_indices)
- -> unsigned int {
- return dealii::internal::hp::DoFHandlerImplementation::
- Implementation::determine_fe_from_children<dim, spacedim>(
- parent, children_fe_indices, fe_collection);
- });
-
- // Unpack active_fe_indices.
- active_fe_index_transfer->active_fe_indices.resize(
- get_triangulation().n_active_cells(), numbers::invalid_unsigned_int);
- active_fe_index_transfer->cell_data_transfer->deserialize(
- active_fe_index_transfer->active_fe_indices);
-
- // Update all locally owned active_fe_indices.
- set_active_fe_indices(active_fe_index_transfer->active_fe_indices);
-
- // Update active_fe_indices on ghost cells.
- dealii::internal::hp::DoFHandlerImplementation::Implementation::
- communicate_active_fe_indices(*this);
-
- // Free memory.
- active_fe_index_transfer.reset();
- }
-#endif
- }
-
-
-
- template <int dim, int spacedim>
- template <int structdim>
- types::global_dof_index
- DoFHandler<dim, spacedim>::get_dof_index(const unsigned int,
- const unsigned int,
- const unsigned int,
- const unsigned int) const
- {
- Assert(false, ExcNotImplemented());
- return numbers::invalid_dof_index;
- }
-
-
-
- template <int dim, int spacedim>
- template <int structdim>
- void
- DoFHandler<dim, spacedim>::set_dof_index(const unsigned int,
- const unsigned int,
- const unsigned int,
- const unsigned int,
- const types::global_dof_index) const
- {
- Assert(false, ExcNotImplemented());
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFHandler<dim, spacedim>::clear_space()
- {
- levels.clear();
- faces.reset();
+ : dealii::DoFHandler<dim, spacedim>(tria, true)
+ {}
- vertex_dofs = std::vector<types::global_dof_index>();
- vertex_dof_offsets = std::vector<unsigned int>();
- }
} // namespace hp
-
-
/*-------------- Explicit Instantiations -------------------------------*/
#include "dof_handler.inst"
\}
#endif
}
-
-
-for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : DIMENSIONS;
- deal_II_component : DIMENSIONS)
- {
-#if deal_II_component <= deal_II_dimension && \
- deal_II_dimension <= deal_II_space_dimension
- template types::global_dof_index
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>::get_dof_index<
- deal_II_component>(const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index) const;
-
- template void
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>::set_dof_index<
- deal_II_component>(const unsigned int obj_level,
- const unsigned int obj_index,
- const unsigned int fe_index,
- const unsigned int local_index,
- const types::global_dof_index global_index) const;
-#endif
- }
+++ /dev/null
-// ---------------------------------------------------------------------
-//
-// Copyright (C) 2003 - 2019 by the deal.II authors
-//
-// This file is part of the deal.II library.
-//
-// The deal.II library is free software; you can use it, redistribute
-// it, and/or modify it under the terms of the GNU Lesser General
-// Public License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// The full text of the license can be found in the file LICENSE.md at
-// the top level directory of deal.II.
-//
-// ---------------------------------------------------------------------
-
-#include <deal.II/base/memory_consumption.h>
-
-#include <deal.II/hp/dof_level.h>
-#include <deal.II/hp/fe_collection.h>
-
-#include <iostream>
-
-DEAL_II_NAMESPACE_OPEN
-
-namespace internal
-{
- namespace hp
- {
- const DoFLevel::active_fe_index_type DoFLevel::invalid_active_fe_index =
- static_cast<DoFLevel::active_fe_index_type>(-1);
-
-
-
- template <int dim, int spacedim>
- void
- DoFLevel::compress_data(
- const dealii::hp::FECollection<dim, spacedim> &fe_collection)
- {
- (void)fe_collection;
-
- if (dof_offsets.size() == 0 || dof_indices.size() == 0)
- return;
-
- // in a first run through, count how many new slots we need in the
- // dof_indices array after compression. note that the 'cell'
- // counter is incremented inside the loop
- unsigned int new_size = 0;
- for (unsigned int cell = 0; cell < dof_offsets.size();)
- // see if this cell is active on the current level
- if (dof_offsets[cell] != static_cast<offset_type>(-1))
- {
- // find the next cell active on this level
- unsigned int next_cell = cell + 1;
- while ((next_cell < dof_offsets.size()) &&
- (dof_offsets[next_cell] == static_cast<offset_type>(-1)))
- ++next_cell;
-
- const unsigned int next_offset =
- (next_cell < dof_offsets.size() ? dof_offsets[next_cell] :
- dof_indices.size());
-
- Assert(next_offset - dof_offsets[cell] ==
- fe_collection[active_fe_indices[cell]]
- .template n_dofs_per_object<dim>(),
- ExcInternalError());
-
- // see if the range of dofs for this cell can be compressed and if
- // so how many slots we have to store for them
- if (next_offset > dof_offsets[cell])
- {
- bool compressible = true;
- for (unsigned int j = dof_offsets[cell] + 1; j < next_offset;
- ++j)
- if (dof_indices[j] != dof_indices[j - 1] + 1)
- {
- compressible = false;
- break;
- }
- if (compressible == true)
- new_size += 1;
- else
- new_size += (next_offset - dof_offsets[cell]);
- }
-
- // then move on to the next cell
- cell = next_cell;
- }
- else
- ++cell;
-
- // now allocate the new array and copy into it whatever we need
- std::vector<types::global_dof_index> new_dof_indices;
- new_dof_indices.reserve(new_size);
- std::vector<offset_type> new_dof_offsets(dof_offsets.size(),
- static_cast<offset_type>(-1));
- for (unsigned int cell = 0; cell < dof_offsets.size();)
- // see if this cell is active on the current level
- if (dof_offsets[cell] != static_cast<offset_type>(-1))
- {
- // find the next cell active on this level
- unsigned int next_cell = cell + 1;
- while ((next_cell < dof_offsets.size()) &&
- (dof_offsets[next_cell] == static_cast<offset_type>(-1)))
- ++next_cell;
-
- const unsigned int next_offset =
- (next_cell < dof_offsets.size() ? dof_offsets[next_cell] :
- dof_indices.size());
-
- Assert(next_offset - dof_offsets[cell] ==
- fe_collection[active_fe_indices[cell]]
- .template n_dofs_per_object<dim>(),
- ExcInternalError());
-
- new_dof_offsets[cell] = new_dof_indices.size();
-
- // see if the range of dofs for this cell can be compressed and if
- // so how many slots we have to store for them
- if (next_offset > dof_offsets[cell])
- {
- bool compressible = true;
- for (unsigned int j = dof_offsets[cell] + 1; j < next_offset;
- ++j)
- if (dof_indices[j] != dof_indices[j - 1] + 1)
- {
- compressible = false;
- break;
- }
-
- // if this cell is compressible, then copy the first index and
- // mark this in the dof_offsets array
- if (compressible == true)
- {
- new_dof_indices.push_back(dof_indices[dof_offsets[cell]]);
-
- // make sure that the current active_fe_index indicates
- // that this entry hasn't been compressed yet
- Assert(is_compressed_entry(active_fe_indices[cell]) ==
- false,
- ExcInternalError());
-
- // then mark the compression
- active_fe_indices[cell] =
- get_toggled_compression_state(active_fe_indices[cell]);
- }
- else
- for (unsigned int i = dof_offsets[cell]; i < next_offset; ++i)
- new_dof_indices.push_back(dof_indices[i]);
- }
-
- // then move on to the next cell
- cell = next_cell;
- }
- else
- ++cell;
-
- // finally swap old and new content
- Assert(new_dof_indices.size() == new_size, ExcInternalError());
- dof_indices.swap(new_dof_indices);
- dof_offsets.swap(new_dof_offsets);
- }
-
-
-
- template <int dim, int spacedim>
- void
- DoFLevel::uncompress_data(
- const dealii::hp::FECollection<dim, spacedim> &fe_collection)
- {
- if (dof_offsets.size() == 0 || dof_indices.size() == 0)
- return;
-
- // in a first run through, count how many new slots we need in the
- // dof_indices array after uncompression.
- unsigned int new_size = 0;
- for (unsigned int cell = 0; cell < dof_offsets.size(); ++cell)
- if (dof_offsets[cell] != static_cast<offset_type>(-1))
- {
- // we know now that the slot for this cell is used. extract the
- // active_fe_index for it and see how many entries we need
- new_size += fe_collection[active_fe_index(cell)]
- .template n_dofs_per_object<dim>();
- }
-
- // now allocate the new array and copy into it whatever we need
- std::vector<types::global_dof_index> new_dof_indices;
- new_dof_indices.reserve(new_size);
- std::vector<offset_type> new_dof_offsets(dof_offsets.size(),
- static_cast<offset_type>(-1));
- for (unsigned int cell = 0; cell < dof_offsets.size();)
- // see if this cell is active on the current level
- if (dof_offsets[cell] != static_cast<offset_type>(-1))
- {
- // find the next cell active on this level
- unsigned int next_cell = cell + 1;
- while ((next_cell < dof_offsets.size()) &&
- (dof_offsets[next_cell] == static_cast<offset_type>(-1)))
- ++next_cell;
-
- const unsigned int next_offset =
- (next_cell < dof_offsets.size() ? dof_offsets[next_cell] :
- dof_indices.size());
-
- // set offset for this cell
- new_dof_offsets[cell] = new_dof_indices.size();
-
- // see if we need to uncompress this set of dofs
- if (is_compressed_entry(active_fe_indices[cell]) == false)
- {
- // apparently not. simply copy them
- Assert(next_offset - dof_offsets[cell] ==
- fe_collection[active_fe_indices[cell]]
- .template n_dofs_per_object<dim>(),
- ExcInternalError());
- for (unsigned int i = dof_offsets[cell]; i < next_offset; ++i)
- new_dof_indices.push_back(dof_indices[i]);
- }
- else
- {
- // apparently so. uncompress
- Assert(next_offset - dof_offsets[cell] == 1,
- ExcInternalError());
- const unsigned int dofs_per_object =
- fe_collection[get_toggled_compression_state(
- active_fe_indices[cell])]
- .template n_dofs_per_object<dim>();
- for (unsigned int i = 0; i < dofs_per_object; ++i)
- new_dof_indices.push_back(dof_indices[dof_offsets[cell]] + i);
-
- // then mark the uncompression
- active_fe_indices[cell] =
- get_toggled_compression_state(active_fe_indices[cell]);
- }
-
- // then move on to the next cell
- cell = next_cell;
- }
- else
- ++cell;
-
- // verify correct size, then swap arrays
- Assert(new_dof_indices.size() == new_size, ExcInternalError());
- dof_indices.swap(new_dof_indices);
- dof_offsets.swap(new_dof_offsets);
- }
-
-
-
- std::size_t
- DoFLevel::memory_consumption() const
- {
- return (MemoryConsumption::memory_consumption(active_fe_indices) +
- MemoryConsumption::memory_consumption(dof_indices) +
- MemoryConsumption::memory_consumption(dof_offsets) +
- MemoryConsumption::memory_consumption(cell_cache_offsets) +
- MemoryConsumption::memory_consumption(cell_dof_indices_cache) +
- MemoryConsumption::memory_consumption(future_fe_indices));
- }
-
-
-
- void
- DoFLevel::normalize_active_fe_indices()
- {
- for (auto &active_fe_index : active_fe_indices)
- if (is_compressed_entry(active_fe_index))
- active_fe_index = get_toggled_compression_state(active_fe_index);
- }
-
-
-
- // explicit instantiations
- template void
- DoFLevel::compress_data(const dealii::hp::FECollection<1, 1> &);
- template void
- DoFLevel::compress_data(const dealii::hp::FECollection<1, 2> &);
- template void
- DoFLevel::compress_data(const dealii::hp::FECollection<1, 3> &);
- template void
- DoFLevel::compress_data(const dealii::hp::FECollection<2, 2> &);
- template void
- DoFLevel::compress_data(const dealii::hp::FECollection<2, 3> &);
- template void
- DoFLevel::compress_data(const dealii::hp::FECollection<3, 3> &);
-
- template void
- DoFLevel::uncompress_data(const dealii::hp::FECollection<1, 1> &);
- template void
- DoFLevel::uncompress_data(const dealii::hp::FECollection<1, 2> &);
- template void
- DoFLevel::uncompress_data(const dealii::hp::FECollection<1, 3> &);
- template void
- DoFLevel::uncompress_data(const dealii::hp::FECollection<2, 2> &);
- template void
- DoFLevel::uncompress_data(const dealii::hp::FECollection<2, 3> &);
- template void
- DoFLevel::uncompress_data(const dealii::hp::FECollection<3, 3> &);
- } // namespace hp
-} // namespace internal
-
-DEAL_II_NAMESPACE_CLOSE
#endif
}
-for (dof_handler : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS;
+for (dof_handler : DOFHANDLER_TEMPLATE; deal_II_dimension : DIMENSIONS;
deal_II_space_dimension : SPACE_DIMENSIONS;
lda : BOOL)
{
*/
template <int dim, int spacedim>
void
- full_p_adaptivity(const hp::DoFHandler<dim, spacedim> &dof_handler)
+ full_p_adaptivity(const dealii::DoFHandler<dim, spacedim> &dof_handler)
{
std::vector<bool> p_flags(
dof_handler.get_triangulation().n_active_cells(), true);
template <int dim, int spacedim>
void
- p_adaptivity_from_flags(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const std::vector<bool> & p_flags)
+ p_adaptivity_from_flags(
+ const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const std::vector<bool> & p_flags)
{
AssertDimension(dof_handler.get_triangulation().n_active_cells(),
p_flags.size());
template <int dim, typename Number, int spacedim>
void
p_adaptivity_from_absolute_threshold(
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Vector<Number> & criteria,
- const Number p_refine_threshold,
- const Number p_coarsen_threshold,
+ const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const Vector<Number> & criteria,
+ const Number p_refine_threshold,
+ const Number p_coarsen_threshold,
const ComparisonFunction<typename identity<Number>::type> &compare_refine,
const ComparisonFunction<typename identity<Number>::type>
&compare_coarsen)
template <int dim, typename Number, int spacedim>
void
p_adaptivity_from_relative_threshold(
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Vector<Number> & criteria,
- const double p_refine_fraction,
- const double p_coarsen_fraction,
+ const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const Vector<Number> & criteria,
+ const double p_refine_fraction,
+ const double p_coarsen_fraction,
const ComparisonFunction<typename identity<Number>::type> &compare_refine,
const ComparisonFunction<typename identity<Number>::type>
&compare_coarsen)
template <int dim, typename Number, int spacedim>
void
p_adaptivity_fixed_number(
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Vector<Number> & criteria,
- const double p_refine_fraction,
- const double p_coarsen_fraction,
+ const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const Vector<Number> & criteria,
+ const double p_refine_fraction,
+ const double p_coarsen_fraction,
const ComparisonFunction<typename identity<Number>::type> &compare_refine,
const ComparisonFunction<typename identity<Number>::type>
&compare_coarsen)
template <int dim, typename Number, int spacedim>
void
p_adaptivity_from_regularity(
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Vector<Number> & sobolev_indices)
+ const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const Vector<Number> & sobolev_indices)
{
AssertDimension(dof_handler.get_triangulation().n_active_cells(),
sobolev_indices.size());
template <int dim, typename Number, int spacedim>
void
p_adaptivity_from_reference(
- const hp::DoFHandler<dim, spacedim> & dof_handler,
+ const dealii::DoFHandler<dim, spacedim> & dof_handler,
const Vector<Number> & criteria,
const Vector<Number> & references,
const ComparisonFunction<typename identity<Number>::type> &compare_refine,
*/
template <int dim, typename Number, int spacedim>
void
- predict_error(const hp::DoFHandler<dim, spacedim> &dof_handler,
- const Vector<Number> & error_indicators,
- Vector<Number> & predicted_errors,
- const double gamma_p,
- const double gamma_h,
- const double gamma_n)
+ predict_error(const dealii::DoFHandler<dim, spacedim> &dof_handler,
+ const Vector<Number> & error_indicators,
+ Vector<Number> & predicted_errors,
+ const double gamma_p,
+ const double gamma_h,
+ const double gamma_n)
{
AssertDimension(dof_handler.get_triangulation().n_active_cells(),
error_indicators.size());
*/
template <int dim, int spacedim>
void
- force_p_over_h(const hp::DoFHandler<dim, spacedim> &dof_handler)
+ force_p_over_h(const dealii::DoFHandler<dim, spacedim> &dof_handler)
{
for (const auto &cell : dof_handler.active_cell_iterators())
if (cell->is_locally_owned() && cell->future_fe_index_set())
template <int dim, int spacedim>
void
- choose_p_over_h(const hp::DoFHandler<dim, spacedim> &dof_handler)
+ choose_p_over_h(const dealii::DoFHandler<dim, spacedim> &dof_handler)
{
// Siblings of cells to be coarsened may not be owned by the same
// processor. We will exchange coarsening flags on ghost cells and
GridTools::exchange_cell_data_to_ghosts<
std::pair<bool, bool>,
- dealii::hp::DoFHandler<dim, spacedim>>(dof_handler, pack, unpack);
+ dealii::DoFHandler<dim, spacedim>>(dof_handler, pack, unpack);
}
\{
template void
full_p_adaptivity<deal_II_dimension, deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &);
+ const dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ &);
template void
p_adaptivity_from_flags<deal_II_dimension, deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ &,
const std::vector<bool> &);
template void
force_p_over_h<deal_II_dimension, deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &);
+ const dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ &);
template void
choose_p_over_h<deal_II_dimension, deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &);
+ const dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ &);
\}
\}
#endif
p_adaptivity_from_absolute_threshold<deal_II_dimension,
S,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ &,
const Vector<S> &,
const S,
const S,
p_adaptivity_from_relative_threshold<deal_II_dimension,
S,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ &,
const Vector<S> &,
const double,
const double,
p_adaptivity_fixed_number<deal_II_dimension,
S,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ &,
const Vector<S> &,
const double,
const double,
p_adaptivity_from_regularity<deal_II_dimension,
S,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ &,
const Vector<S> &);
template void
p_adaptivity_from_reference<deal_II_dimension,
S,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ &,
const Vector<S> &,
const Vector<S> &,
const ComparisonFunction<typename identity<S>::type> &,
template void
predict_error<deal_II_dimension, S, deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const dealii::DoFHandler<deal_II_dimension, deal_II_space_dimension>
+ &,
const Vector<S> &,
Vector<S> &,
const double,
-for (PATTERN : SPARSITY_PATTERNS; deal_II_dimension : DIMENSIONS;
+for (DoFHandler : DOFHANDLER_TEMPLATES; PATTERN : SPARSITY_PATTERNS;
+ deal_II_dimension : DIMENSIONS;
deal_II_space_dimension : SPACE_DIMENSIONS)
{
namespace MGTools
PATTERN>(const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
PATTERN &,
const unsigned int);
+#endif
+ \}
+ }
+
+
+for (PATTERN : SPARSITY_PATTERNS; deal_II_dimension : DIMENSIONS;
+ deal_II_space_dimension : SPACE_DIMENSIONS)
+ {
+ namespace MGTools
+ \{
+#if deal_II_dimension <= deal_II_space_dimension
template void
make_interface_sparsity_pattern<
DoFHandler<deal_II_dimension, deal_II_space_dimension>,
#if deal_II_dimension >= 2
template class DataOutFaces<deal_II_dimension,
DoFHandler<deal_II_dimension>>;
- template class DataOutFaces<deal_II_dimension,
- hp::DoFHandler<deal_II_dimension>>;
#endif
}
DoFHandler<deal_II_dimension>>::
add_data_vector<float>(const Vector<float> &,
const std::vector<std::string> &);
-
-
- template class DataOutStack<deal_II_dimension,
- deal_II_dimension,
- hp::DoFHandler<deal_II_dimension>>;
-
- template void DataOutStack<deal_II_dimension,
- deal_II_dimension,
- hp::DoFHandler<deal_II_dimension>>::
- add_data_vector<double>(const Vector<double> &, const std::string &);
- template void DataOutStack<deal_II_dimension,
- deal_II_dimension,
- hp::DoFHandler<deal_II_dimension>>::
- add_data_vector<float>(const Vector<float> &, const std::string &);
-
- template void DataOutStack<deal_II_dimension,
- deal_II_dimension,
- hp::DoFHandler<deal_II_dimension>>::
- add_data_vector<double>(const Vector<double> &,
- const std::vector<std::string> &);
- template void DataOutStack<deal_II_dimension,
- deal_II_dimension,
- hp::DoFHandler<deal_II_dimension>>::
- add_data_vector<float>(const Vector<float> &,
- const std::vector<std::string> &);
#endif
}
const DoFHandlerType<dim, spacedim> &dof_handler,
const InputVector & solution,
const unsigned int component,
- const TriaActiveIterator<
- dealii::DoFCellAccessor<DoFHandlerType<dim, spacedim>, false>> &cell,
+ const typename DoFHandlerType<dim, spacedim>::active_cell_iterator &cell,
typename DerivativeDescription::Derivative &derivative)
{
QMidpoint<dim> midpoint_rule;
// active neighbors of a cell
// reserve the maximal number of
// active neighbors
- std::vector<TriaActiveIterator<
- dealii::DoFCellAccessor<DoFHandlerType<dim, spacedim>, false>>>
+ std::vector<typename DoFHandlerType<dim, spacedim>::active_cell_iterator>
active_neighbors;
active_neighbors.reserve(GeometryInfo<dim>::faces_per_cell *
// now loop over all active
// neighbors and collect the
// data we need
- typename std::vector<TriaActiveIterator<
- dealii::DoFCellAccessor<DoFHandlerType<dim, spacedim>, false>>>::
- const_iterator neighbor_ptr = active_neighbors.begin();
+ auto neighbor_ptr = active_neighbors.begin();
for (; neighbor_ptr != active_neighbors.end(); ++neighbor_ptr)
{
- const TriaActiveIterator<
- dealii::DoFCellAccessor<DoFHandlerType<dim, spacedim>, false>>
- neighbor = *neighbor_ptr;
+ const auto neighbor = *neighbor_ptr;
// reinit fe values object...
x_fe_midpoint_value.reinit(neighbor);
int spacedim>
void
approximate(
- SynchronousIterators<std::tuple<
- TriaActiveIterator<
- dealii::DoFCellAccessor<DoFHandlerType<dim, spacedim>, false>>,
- Vector<float>::iterator>> const & cell,
- const Mapping<dim, spacedim> & mapping,
- const DoFHandlerType<dim, spacedim> &dof_handler,
- const InputVector & solution,
- const unsigned int component)
+ SynchronousIterators<
+ std::tuple<typename DoFHandlerType<dim, spacedim>::active_cell_iterator,
+ Vector<float>::iterator>> const &cell,
+ const Mapping<dim, spacedim> & mapping,
+ const DoFHandlerType<dim, spacedim> & dof_handler,
+ const InputVector & solution,
+ const unsigned int component)
{
// if the cell is not locally owned, then there is nothing to do
if (std::get<0>(*cell)->is_locally_owned() == false)
dof_handler.get_triangulation().n_active_cells()));
AssertIndexRange(component, dof_handler.get_fe(0).n_components());
- using Iterators = std::tuple<
- TriaActiveIterator<
- dealii::DoFCellAccessor<DoFHandlerType<dim, spacedim>, false>>,
- Vector<float>::iterator>;
+ using Iterators =
+ std::tuple<typename DoFHandlerType<dim, spacedim>::active_cell_iterator,
+ Vector<float>::iterator>;
SynchronousIterators<Iterators> begin(
Iterators(dof_handler.begin_active(), derivative_norm.begin())),
end(Iterators(dof_handler.end(), derivative_norm.end()));
-for (VECTOR : VECTOR_TYPES; deal_II_dimension : DIMENSIONS)
+for (DoFHandler : DOFHANDLER_TEMPLATES; VECTOR : VECTOR_TYPES;
+ deal_II_dimension : DIMENSIONS)
{
template class FEFieldFunction<deal_II_dimension,
DoFHandler<deal_II_dimension>,
VECTOR>;
-
- template class FEFieldFunction<deal_II_dimension,
- hp::DoFHandler<deal_II_dimension>,
- VECTOR>;
}
template void MatrixCreator::
create_mass_matrix<deal_II_dimension, deal_II_space_dimension, scalar>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
- &mapping,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &dof,
- const hp::QCollection<deal_II_dimension> & q,
- SparseMatrix<scalar> & matrix,
+ & mapping,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &dof,
+ const hp::QCollection<deal_II_dimension> & q,
+ SparseMatrix<scalar> & matrix,
const Function<deal_II_space_dimension, scalar> *const coefficient,
const AffineConstraints<scalar> & constraints);
template void MatrixCreator::
create_mass_matrix<deal_II_dimension, deal_II_space_dimension, scalar>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &dof,
- const hp::QCollection<deal_II_dimension> & q,
- SparseMatrix<scalar> & matrix,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &dof,
+ const hp::QCollection<deal_II_dimension> & q,
+ SparseMatrix<scalar> & matrix,
const Function<deal_II_space_dimension, scalar> *const coefficient,
const AffineConstraints<scalar> & constraints);
#endif
template void MatrixCreator::
create_mass_matrix<deal_II_dimension, deal_II_space_dimension, scalar>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
- &mapping,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &dof,
- const hp::QCollection<deal_II_dimension> & q,
- SparseMatrix<scalar> & matrix,
- const Function<deal_II_space_dimension, scalar> & rhs,
+ & mapping,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &dof,
+ const hp::QCollection<deal_II_dimension> & q,
+ SparseMatrix<scalar> & matrix,
+ const Function<deal_II_space_dimension, scalar> & rhs,
Vector<scalar> & rhs_vector,
const Function<deal_II_space_dimension, scalar> *const coefficient,
const AffineConstraints<scalar> & constraints);
template void MatrixCreator::
create_mass_matrix<deal_II_dimension, deal_II_space_dimension, scalar>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &dof,
- const hp::QCollection<deal_II_dimension> & q,
- SparseMatrix<scalar> & matrix,
- const Function<deal_II_space_dimension, scalar> & rhs,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &dof,
+ const hp::QCollection<deal_II_dimension> & q,
+ SparseMatrix<scalar> & matrix,
+ const Function<deal_II_space_dimension, scalar> & rhs,
Vector<scalar> & rhs_vector,
const Function<deal_II_space_dimension, scalar> *const coefficient,
const AffineConstraints<scalar> & constraints);
deal_II_space_dimension,
scalar>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension> &,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const hp::QCollection<deal_II_dimension - 1> &,
SparseMatrix<scalar> &,
const std::map<types::boundary_id,
MatrixCreator::create_boundary_mass_matrix<deal_II_dimension,
deal_II_space_dimension,
scalar>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const hp::QCollection<deal_II_dimension - 1> &,
SparseMatrix<scalar> &,
const std::map<types::boundary_id,
// hp versions of create_laplace_matrix
template void MatrixCreator::create_laplace_matrix<deal_II_dimension>(
- const hp::DoFHandler<deal_II_dimension> & dof,
+ const DoFHandler<deal_II_dimension> & dof,
const hp::QCollection<deal_II_dimension> &q,
SparseMatrix<double> & matrix,
const Function<deal_II_dimension> *const coefficient,
const AffineConstraints<double> & constraints);
template void MatrixCreator::create_laplace_matrix<deal_II_dimension>(
const hp::MappingCollection<deal_II_dimension> &mapping,
- const hp::DoFHandler<deal_II_dimension> & dof,
+ const DoFHandler<deal_II_dimension> & dof,
const hp::QCollection<deal_II_dimension> & q,
SparseMatrix<double> & matrix,
const Function<deal_II_dimension> *const coefficient,
const AffineConstraints<double> & constraints);
template void MatrixCreator::create_laplace_matrix<deal_II_dimension>(
const hp::MappingCollection<deal_II_dimension> &mapping,
- const hp::DoFHandler<deal_II_dimension> & dof,
+ const DoFHandler<deal_II_dimension> & dof,
const hp::QCollection<deal_II_dimension> & q,
SparseMatrix<double> & matrix,
const Function<deal_II_dimension> & rhs,
const Function<deal_II_dimension> *const coefficient,
const AffineConstraints<double> & constraints);
template void MatrixCreator::create_laplace_matrix<deal_II_dimension>(
- const hp::DoFHandler<deal_II_dimension> & dof,
+ const DoFHandler<deal_II_dimension> & dof,
const hp::QCollection<deal_II_dimension> &q,
SparseMatrix<double> & matrix,
const Function<deal_II_dimension> & rhs,
template <int dim, int spacedim, typename VectorType>
void
- coefficient_decay(FESeries::Legendre<dim, spacedim> & fe_legendre,
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const VectorType & solution,
- Vector<float> & smoothness_indicators,
- const VectorTools::NormType regression_strategy,
- const double smallest_abs_coefficient,
- const bool only_flagged_cells)
+ coefficient_decay(FESeries::Legendre<dim, spacedim> &fe_legendre,
+ const DoFHandler<dim, spacedim> & dof_handler,
+ const VectorType & solution,
+ Vector<float> & smoothness_indicators,
+ const VectorTools::NormType regression_strategy,
+ const double smallest_abs_coefficient,
+ const bool only_flagged_cells)
{
using number = typename VectorType::value_type;
using number_coeff =
template <int dim, int spacedim, typename VectorType>
void
coefficient_decay_per_direction(
- FESeries::Legendre<dim, spacedim> & fe_legendre,
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const VectorType & solution,
- Vector<float> & smoothness_indicators,
- const ComponentMask & coefficients_predicate,
- const double smallest_abs_coefficient,
- const bool only_flagged_cells)
+ FESeries::Legendre<dim, spacedim> &fe_legendre,
+ const DoFHandler<dim, spacedim> & dof_handler,
+ const VectorType & solution,
+ Vector<float> & smoothness_indicators,
+ const ComponentMask & coefficients_predicate,
+ const double smallest_abs_coefficient,
+ const bool only_flagged_cells)
{
Assert(smallest_abs_coefficient >= 0.,
ExcMessage("smallest_abs_coefficient should be non-negative."));
template <int dim, int spacedim, typename VectorType>
void
- coefficient_decay(FESeries::Fourier<dim, spacedim> & fe_fourier,
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const VectorType & solution,
- Vector<float> & smoothness_indicators,
- const VectorTools::NormType regression_strategy,
- const double smallest_abs_coefficient,
- const bool only_flagged_cells)
+ coefficient_decay(FESeries::Fourier<dim, spacedim> &fe_fourier,
+ const DoFHandler<dim, spacedim> & dof_handler,
+ const VectorType & solution,
+ Vector<float> & smoothness_indicators,
+ const VectorTools::NormType regression_strategy,
+ const double smallest_abs_coefficient,
+ const bool only_flagged_cells)
{
using number = typename VectorType::value_type;
using number_coeff =
template <int dim, int spacedim, typename VectorType>
void
coefficient_decay_per_direction(
- FESeries::Fourier<dim, spacedim> & fe_fourier,
- const hp::DoFHandler<dim, spacedim> &dof_handler,
- const VectorType & solution,
- Vector<float> & smoothness_indicators,
- const ComponentMask & coefficients_predicate,
- const double smallest_abs_coefficient,
- const bool only_flagged_cells)
+ FESeries::Fourier<dim, spacedim> &fe_fourier,
+ const DoFHandler<dim, spacedim> & dof_handler,
+ const VectorType & solution,
+ Vector<float> & smoothness_indicators,
+ const ComponentMask & coefficients_predicate,
+ const double smallest_abs_coefficient,
+ const bool only_flagged_cells)
{
Assert(smallest_abs_coefficient >= 0.,
ExcMessage("smallest_abs_coefficient should be non-negative."));
template void SmoothnessEstimator::Legendre::
coefficient_decay<deal_II_dimension, deal_II_space_dimension, VEC>(
FESeries::Legendre<deal_II_dimension, deal_II_space_dimension> &,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const VEC &,
Vector<float> &,
const VectorTools::NormType,
deal_II_dimension,
deal_II_space_dimension,
VEC>(FESeries::Legendre<deal_II_dimension, deal_II_space_dimension> &,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const VEC &,
Vector<float> &,
const ComponentMask &,
template void SmoothnessEstimator::Fourier::
coefficient_decay<deal_II_dimension, deal_II_space_dimension, VEC>(
FESeries::Fourier<deal_II_dimension, deal_II_space_dimension> &,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const VEC &,
Vector<float> &,
const VectorTools::NormType,
deal_II_dimension,
deal_II_space_dimension,
VEC>(FESeries::Fourier<deal_II_dimension, deal_II_space_dimension> &,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const VEC &,
Vector<float> &,
const ComponentMask &,
* which no such interpolation is
* implemented.
*/
- template <typename DoFHandlerType>
- void
- extract_interpolation_matrices(const DoFHandlerType &,
- dealii::Table<2, FullMatrix<double>> &)
- {}
-
template <int dim, int spacedim>
void
- extract_interpolation_matrices(
- const dealii::hp::DoFHandler<dim, spacedim> &dof,
- dealii::Table<2, FullMatrix<double>> & matrices)
+ extract_interpolation_matrices(const dealii::DoFHandler<dim, spacedim> &dof,
+ dealii::Table<2, FullMatrix<double>> &matrices)
{
+ if (dof.hp_capability_enabled == false)
+ return;
+
const dealii::hp::FECollection<dim, spacedim> &fe = dof.get_fe_collection();
matrices.reinit(fe.size(), fe.size());
for (unsigned int i = 0; i < fe.size(); ++i)
interpolate_boundary_values(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const std::map<types::boundary_id,
const Function<deal_II_space_dimension, number> *> &,
std::map<types::global_dof_index, number> &,
project_boundary_values<deal_II_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
- const std::map<types::boundary_id,
- const Function<deal_II_space_dimension, number> *> &,
- const hp::QCollection<deal_II_dimension - 1> &,
- std::map<types::global_dof_index, number> &,
- std::vector<unsigned int>);
-
- template void
- project_boundary_values<deal_II_dimension, deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const std::map<types::boundary_id,
const Function<deal_II_space_dimension, number> *> &,
const hp::QCollection<deal_II_dimension - 1> &,
AffineConstraints<double> &,
const Mapping<deal_II_dimension> &);
template void
- project_boundary_values_curl_conforming<deal_II_dimension>(
- const hp::DoFHandler<deal_II_dimension> &,
- const unsigned int,
- const Function<deal_II_dimension> &,
- const types::boundary_id,
- AffineConstraints<double> &,
- const hp::MappingCollection<deal_II_dimension> &);
- template void
project_boundary_values_curl_conforming_l2(
const DoFHandler<deal_II_dimension> &,
const unsigned int,
AffineConstraints<std::complex<double>> &,
const Mapping<deal_II_dimension> &);
# endif
- template void
- project_boundary_values_curl_conforming_l2(
- const hp::DoFHandler<deal_II_dimension> &,
- const unsigned int,
- const Function<deal_II_dimension, double> &,
- const types::boundary_id,
- AffineConstraints<double> &,
- const hp::MappingCollection<deal_II_dimension> &);
# ifdef DEAL_II_WITH_COMPLEX_VALUES
- template void
- project_boundary_values_curl_conforming_l2(
- const hp::DoFHandler<deal_II_dimension> &,
- const unsigned int,
- const Function<deal_II_dimension, std::complex<double>> &,
- const types::boundary_id,
- AffineConstraints<std::complex<double>> &,
- const hp::MappingCollection<deal_II_dimension> &);
# endif
template void
project_boundary_values_div_conforming<deal_II_dimension>(
const types::boundary_id,
AffineConstraints<double> &,
const Mapping<deal_II_dimension> &);
- template void
- project_boundary_values_div_conforming<deal_II_dimension>(
- const hp::DoFHandler<deal_II_dimension> &,
- const unsigned int,
- const Function<deal_II_dimension> &,
- const types::boundary_id,
- AffineConstraints<double> &,
- const hp::MappingCollection<deal_II_dimension> &);
# endif
#endif
\}
// TODO[SP]: replace <deal_II_dimension> by <deal_II_dimension,
// deal_II_space_dimension>
// where applicable and move to codimension cases above also when applicable
-for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS)
+for (DoFHandler : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS;
+ deal_II_space_dimension : SPACE_DIMENSIONS)
{
namespace VectorTools
\{
AffineConstraints<double> & constraints,
const Mapping<deal_II_dimension> &mapping);
- template void
- compute_nonzero_normal_flux_constraints(
- const hp::DoFHandler<deal_II_dimension> &dof_handler,
- const unsigned int first_vector_component,
- const std::set<types::boundary_id> & boundary_ids,
- const std::map<types::boundary_id, const Function<deal_II_dimension> *>
- & function_map,
- AffineConstraints<double> & constraints,
- const Mapping<deal_II_dimension> &mapping);
-
template void
compute_nonzero_tangential_flux_constraints(
const DoFHandler<deal_II_dimension> &dof_handler,
& function_map,
AffineConstraints<double> & constraints,
const Mapping<deal_II_dimension> &mapping);
- template void
- compute_nonzero_tangential_flux_constraints(
- const hp::DoFHandler<deal_II_dimension> &dof_handler,
- const unsigned int first_vector_component,
- const std::set<types::boundary_id> & boundary_ids,
- const std::map<types::boundary_id, const Function<deal_II_dimension> *>
- & function_map,
- AffineConstraints<double> & constraints,
- const Mapping<deal_II_dimension> &mapping);
template void
compute_no_normal_flux_constraints(
AffineConstraints<double> & constraints,
const Mapping<deal_II_dimension> & mapping);
- template void
- compute_no_normal_flux_constraints(
- const hp::DoFHandler<deal_II_dimension> &dof_handler,
- const unsigned int first_vector_component,
- const std::set<types::boundary_id> & boundary_ids,
- AffineConstraints<double> & constraints,
- const Mapping<deal_II_dimension> & mapping);
-
template void
compute_normal_flux_constraints(
const DoFHandler<deal_II_dimension> &dof_handler,
const std::set<types::boundary_id> & boundary_ids,
AffineConstraints<double> & constraints,
const Mapping<deal_II_dimension> & mapping);
-
- template void
- compute_normal_flux_constraints(
- const hp::DoFHandler<deal_II_dimension> &dof_handler,
- const unsigned int first_vector_component,
- const std::set<types::boundary_id> & boundary_ids,
- AffineConstraints<double> & constraints,
- const Mapping<deal_II_dimension> & mapping);
# endif
#endif
\}
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const VEC &,
const Function<deal_II_space_dimension, typename VEC::value_type> &,
Vector<double> &,
VEC,
Vector<double>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const VEC &,
const Function<deal_II_space_dimension, typename VEC::value_type> &,
Vector<double> &,
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const VEC &,
const Function<deal_II_space_dimension, typename VEC::value_type> &,
Vector<float> &,
VEC,
Vector<float>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const VEC &,
const Function<deal_II_space_dimension, typename VEC::value_type> &,
Vector<float> &,
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const BlockVector<float> &,
const Function<deal_II_space_dimension> &,
Vector<double> &,
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<double> &,
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::distributed::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<double> &,
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::distributed::BlockVector<float> &,
const Function<deal_II_space_dimension> &,
Vector<double> &,
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::TpetraWrappers::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<double> &,
BlockVector<float>,
Vector<double>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const BlockVector<float> &,
const Function<deal_II_space_dimension> &,
Vector<double> &,
LinearAlgebra::Vector<float>,
Vector<double>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<double> &,
LinearAlgebra::distributed::Vector<float>,
Vector<double>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::distributed::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<double> &,
LinearAlgebra::distributed::BlockVector<float>,
Vector<double>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::distributed::BlockVector<float> &,
const Function<deal_II_space_dimension> &,
Vector<double> &,
LinearAlgebra::TpetraWrappers::Vector<float>,
Vector<double>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::TpetraWrappers::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<double> &,
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const BlockVector<float> &,
const Function<deal_II_space_dimension> &,
Vector<float> &,
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<float> &,
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::distributed::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<float> &,
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::distributed::BlockVector<float> &,
const Function<deal_II_space_dimension> &,
Vector<float> &,
deal_II_space_dimension>(
const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
&,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::TpetraWrappers::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<float> &,
BlockVector<float>,
Vector<float>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const BlockVector<float> &,
const Function<deal_II_space_dimension> &,
Vector<float> &,
LinearAlgebra::Vector<float>,
Vector<float>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<float> &,
LinearAlgebra::distributed::Vector<float>,
Vector<float>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::distributed::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<float> &,
LinearAlgebra::distributed::BlockVector<float>,
Vector<float>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::distributed::BlockVector<float> &,
const Function<deal_II_space_dimension> &,
Vector<float> &,
LinearAlgebra::TpetraWrappers::Vector<float>,
Vector<float>,
deal_II_space_dimension>(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
const LinearAlgebra::TpetraWrappers::Vector<float> &,
const Function<deal_II_space_dimension> &,
Vector<float> &,
namespace VectorTools
\{
-
- template void
- interpolate(const Mapping<deal_II_dimension> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const Function<deal_II_dimension, VEC::value_type> &,
- VEC &,
- const ComponentMask &);
- template void
- interpolate(const hp::DoFHandler<deal_II_dimension> &,
- const Function<deal_II_dimension, VEC::value_type> &,
- VEC &,
- const ComponentMask &);
-
template void
interpolate_based_on_material_id(
const Mapping<deal_II_dimension, deal_II_space_dimension> &,
const Function<deal_II_space_dimension, VEC::value_type> *> &,
VEC &,
const ComponentMask &);
-
- template void
- interpolate_based_on_material_id(
- const Mapping<deal_II_dimension> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const std::map<types::material_id,
- const Function<deal_II_dimension, VEC::value_type> *> &,
- VEC &,
- const ComponentMask &);
-
\}
#endif
}
-for (VEC : VECTOR_TYPES; deal_II_dimension : DIMENSIONS;
+for (DoFHandler : DOFHANDLER_TEMPLATES; VEC : VECTOR_TYPES;
+ deal_II_dimension : DIMENSIONS;
deal_II_space_dimension : SPACE_DIMENSIONS)
{
#if deal_II_dimension <= deal_II_space_dimension
const VEC &,
const AffineConstraints<VEC::value_type> &,
VEC &);
-
- template void
- interpolate_to_different_mesh(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
- const VEC &,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
- VEC &);
-
- template void
- interpolate_to_different_mesh(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
- const VEC &,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
- const AffineConstraints<VEC::value_type> &,
- VEC &);
-
- template void
- interpolate_to_different_mesh(
- const InterGridMap<
- hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>> &,
- const VEC &,
- const AffineConstraints<VEC::value_type> &,
- VEC &);
\}
#endif
}
namespace VectorTools
\{
-
- template void
- point_gradient(
- const hp::DoFHandler<deal_II_dimension> &,
- const VEC &,
- const Point<deal_II_dimension> &,
- std::vector<Tensor<1, deal_II_space_dimension, VEC::value_type>> &);
-
- template Tensor<1, deal_II_space_dimension, VEC::value_type>
- point_gradient(const hp::DoFHandler<deal_II_dimension> &,
- const VEC &,
- const Point<deal_II_dimension> &);
-
- template void
- point_gradient(
- const hp::MappingCollection<deal_II_dimension> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const VEC &,
- const Point<deal_II_dimension> &,
- std::vector<Tensor<1, deal_II_space_dimension, VEC::value_type>> &);
-
- template Tensor<1, deal_II_space_dimension, VEC::value_type>
- point_gradient(const hp::MappingCollection<deal_II_dimension> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const VEC &,
- const Point<deal_II_dimension> &);
-
template void
point_gradient(
const DoFHandler<deal_II_dimension> &,
namespace VectorTools
\{
- template void
- point_value<deal_II_dimension>(const hp::DoFHandler<deal_II_dimension> &,
- const VEC &,
- const Point<deal_II_dimension> &,
- Vector<VEC::value_type> &);
-
- template VEC::value_type
- point_value<deal_II_dimension>(const hp::DoFHandler<deal_II_dimension> &,
- const VEC &,
- const Point<deal_II_dimension> &);
-
template void
point_value<deal_II_dimension>(
const hp::MappingCollection<deal_II_dimension> &,
- const hp::DoFHandler<deal_II_dimension> &,
+ const DoFHandler<deal_II_dimension> &,
const VEC &,
const Point<deal_II_dimension> &,
Vector<VEC::value_type> &);
template VEC::value_type
point_value<deal_II_dimension>(
const hp::MappingCollection<deal_II_dimension> &,
- const hp::DoFHandler<deal_II_dimension> &,
+ const DoFHandler<deal_II_dimension> &,
const VEC &,
const Point<deal_II_dimension> &);
template void
create_point_source_vector<deal_II_dimension>(
const hp::MappingCollection<deal_II_dimension> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const Point<deal_II_dimension> &,
- Vector<double> &);
- template void
- create_point_source_vector<deal_II_dimension>(
- const hp::DoFHandler<deal_II_dimension> &,
+ const DoFHandler<deal_II_dimension> &,
const Point<deal_II_dimension> &,
Vector<double> &);
template void
template void
create_point_source_vector<deal_II_dimension>(
const hp::MappingCollection<deal_II_dimension> &,
- const hp::DoFHandler<deal_II_dimension> &,
- const Point<deal_II_dimension> &,
- const Point<deal_II_dimension> &,
- Vector<double> &);
- template void
- create_point_source_vector<deal_II_dimension>(
- const hp::DoFHandler<deal_II_dimension> &,
+ const DoFHandler<deal_II_dimension> &,
const Point<deal_II_dimension> &,
const Point<deal_II_dimension> &,
Vector<double> &);
\{
template void
- project(
- const hp::MappingCollection<deal_II_dimension, deal_II_space_dimension>
- &,
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
- const AffineConstraints<VEC::value_type> &,
- const hp::QCollection<deal_II_dimension> &,
- const Function<deal_II_space_dimension, VEC::value_type> &,
- VEC &,
- const bool,
- const hp::QCollection<deal_II_dimension - 1> &,
- const bool);
+ project(const hp::MappingCollection<deal_II_dimension,
+ deal_II_space_dimension> &,
+ const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const AffineConstraints<VEC::value_type> &,
+ const hp::QCollection<deal_II_dimension> &,
+ const Function<deal_II_space_dimension, VEC::value_type> &,
+ VEC &,
+ const bool,
+ const hp::QCollection<deal_II_dimension - 1> &,
+ const bool);
template void
- project(
- const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
- const AffineConstraints<VEC::value_type> &,
- const hp::QCollection<deal_II_dimension> &,
- const Function<deal_II_space_dimension, VEC::value_type> &,
- VEC &,
- const bool,
- const hp::QCollection<deal_II_dimension - 1> &,
- const bool);
+ project(const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
+ const AffineConstraints<VEC::value_type> &,
+ const hp::QCollection<deal_II_dimension> &,
+ const Function<deal_II_space_dimension, VEC::value_type> &,
+ VEC &,
+ const bool,
+ const hp::QCollection<deal_II_dimension - 1> &,
+ const bool);
\}
#endif
}
- template <>
- void
- create_boundary_right_hand_side(const hp::MappingCollection<1, 1> &,
- const hp::DoFHandler<1, 1> &,
- const hp::QCollection<0> &,
- const Function<1> &,
- Vector<double> &,
- const std::set<types::boundary_id> &)
- {
- Assert(false, ExcImpossibleInDim(1));
- }
-
-
-
- template <>
- void
- create_boundary_right_hand_side(const hp::MappingCollection<1, 2> &,
- const hp::DoFHandler<1, 2> &,
- const hp::QCollection<0> &,
- const Function<2> &,
- Vector<double> &,
- const std::set<types::boundary_id> &)
- {
- Assert(false, ExcImpossibleInDim(1));
- }
} // namespace VectorTools
// ---------------------------- explicit instantiations --------------------
deal_II_space_dimension,
Vector<double>>(
const hp::MappingCollection<deal_II_dimension> &,
- const hp::DoFHandler<deal_II_dimension> &,
+ const DoFHandler<deal_II_dimension> &,
const hp::QCollection<deal_II_dimension> &,
const Function<deal_II_space_dimension, Vector<double>::value_type> &,
Vector<double> &,
create_right_hand_side<deal_II_dimension,
deal_II_space_dimension,
Vector<double>>(
- const hp::DoFHandler<deal_II_dimension> &,
+ const DoFHandler<deal_II_dimension> &,
const hp::QCollection<deal_II_dimension> &,
const Function<deal_II_space_dimension, Vector<double>::value_type> &,
Vector<double> &,
deal_II_space_dimension,
Vector<double>>(
const hp::MappingCollection<deal_II_dimension> &,
- const hp::DoFHandler<deal_II_dimension> &,
+ const DoFHandler<deal_II_dimension> &,
const hp::QCollection<deal_II_dimension - 1> &,
const Function<deal_II_space_dimension, Vector<double>::value_type> &,
Vector<double> &,
create_boundary_right_hand_side<deal_II_dimension,
deal_II_space_dimension,
Vector<double>>(
- const hp::DoFHandler<deal_II_dimension> &,
+ const DoFHandler<deal_II_dimension> &,
const hp::QCollection<deal_II_dimension - 1> &,
const Function<deal_II_space_dimension, Vector<double>::value_type> &,
Vector<double> &,
AffineConstraints<double> constraints;
Functions::ZeroFunction<dim> boundary_values(fe.n_components());
VectorTools::project_boundary_values_curl_conforming_l2(
- dof_handler, 0, boundary_values, 0, constraints);
+ dof_handler,
+ 0,
+ boundary_values,
+ 0,
+ constraints,
+ StaticMappingQ1<dim>::mapping);
}
DoFTools::make_hanging_node_constraints(dof_handler, constraints);
// FE_Nedelec boundary condition.
VectorTools::project_boundary_values_curl_conforming_l2(
- dof_handler, 0, ExactSolution<dim>(), 0, constraints);
+ dof_handler,
+ 0,
+ ExactSolution<dim>(),
+ 0,
+ constraints,
+ StaticMappingQ1<dim>::mapping);
constraints.close();
DynamicSparsityPattern c_sparsity(dof_handler.n_dofs());
SimplePolynomial<dim> boundary_function;
VectorTools::project_boundary_values_curl_conforming_l2(
- dof_handler, 0, boundary_function, 0, constraints);
+ dof_handler,
+ 0,
+ boundary_function,
+ 0,
+ constraints,
+ StaticMappingQ1<dim>::mapping);
constraints.close();
DynamicSparsityPattern c_sparsity(dof_handler.n_dofs());
DoFTools::make_sparsity_pattern(dof_handler,
// FE_Nedelec boundary condition.
VectorTools::project_boundary_values_curl_conforming_l2(
- dof_handler, 0, exact_solution, 0, constraints);
+ dof_handler,
+ 0,
+ exact_solution,
+ 0,
+ constraints,
+ StaticMappingQ1<dim>::mapping);
constraints.close();
SimplePolynomial<dim> boundary_function;
VectorTools::project_boundary_values_curl_conforming_l2(
- dof_handler, 0, boundary_function, 0, constraints);
+ dof_handler,
+ 0,
+ boundary_function,
+ 0,
+ constraints,
+ StaticMappingQ1<dim>::mapping);
constraints.close();
DynamicSparsityPattern c_sparsity(dof_handler.n_dofs());
DoFTools::make_sparsity_pattern(dof_handler,
// FE_Nedelec boundary condition.
VectorTools::project_boundary_values_curl_conforming_l2(
- dof_handler, 0, exact_solution, 0, constraints);
+ dof_handler,
+ 0,
+ exact_solution,
+ 0,
+ constraints,
+ StaticMappingQ1<dim>::mapping);
constraints.close();
DEAL::Yes, exception 1!
-DEAL::ExcMessage ("In hp::DoFHandler objects, finite elements are only associated " "with active cells. Consequently, you can not ask for the " "active finite element on cells with children.")
+DEAL::ExcMessage( "In hp::DoFHandler objects, finite elements are only associated " "with active cells. Consequently, you can not ask for the " "active finite element on cells with children.")
DEAL::Yes, exception!
-DEAL::ExcMessage ("You cannot call this function on non-active cells " "of hp::DoFHandler objects unless you provide an explicit " "finite element index because they do not have naturally " "associated finite element spaces associated: degrees " "of freedom are only distributed on active cells for which " "the active_fe_index has been set.")
+DEAL::ExcMessage( "You cannot call this function on non-active cells " "of hp::DoFHandler objects unless you provide an explicit " "finite element index because they do not have naturally " "associated finite element spaces associated: degrees " "of freedom are only distributed on active cells for which " "the active_fe_index has been set.")
DEAL::Yes, exception 1!
-DEAL::ExcMessage ("In hp::DoFHandler objects, finite elements are only associated " "with active cells. Consequently, you can not ask for the " "active finite element on cells with children.")
+DEAL::ExcMessage( "In hp::DoFHandler objects, finite elements are only associated " "with active cells. Consequently, you can not ask for the " "active finite element on cells with children.")
DEAL::Yes, exception!
-DEAL::ExcMessage ("You cannot call this function on non-active cells " "of hp::DoFHandler objects unless you provide an explicit " "finite element index because they do not have naturally " "associated finite element spaces associated: degrees " "of freedom are only distributed on active cells for which " "the active_fe_index has been set.")
+DEAL::ExcMessage( "You cannot call this function on non-active cells " "of hp::DoFHandler objects unless you provide an explicit " "finite element index because they do not have naturally " "associated finite element spaces associated: degrees " "of freedom are only distributed on active cells for which " "the active_fe_index has been set.")
DEAL::Yes, exception 1!
-DEAL::ExcMessage ("In hp::DoFHandler objects, finite elements are only associated " "with active cells. Consequently, you can not ask for the " "active finite element on cells with children.")
+DEAL::ExcMessage( "In hp::DoFHandler objects, finite elements are only associated " "with active cells. Consequently, you can not ask for the " "active finite element on cells with children.")
DEAL::Yes, exception!
-DEAL::ExcMessage ("You cannot call this function on non-active cells " "of hp::DoFHandler objects unless you provide an explicit " "finite element index because they do not have naturally " "associated finite element spaces associated: degrees " "of freedom are only distributed on active cells for which " "the active_fe_index has been set.")
+DEAL::ExcMessage( "You cannot call this function on non-active cells " "of hp::DoFHandler objects unless you provide an explicit " "finite element index because they do not have naturally " "associated finite element spaces associated: degrees " "of freedom are only distributed on active cells for which " "the active_fe_index has been set.")
DoFTools::make_hanging_node_constraints(dof_handler, constraints);
VectorTools::project_boundary_values_div_conforming(
- dof_handler, 0, FluxBoundaryValues<dim>(), 0, constraints);
+ dof_handler,
+ 0,
+ FluxBoundaryValues<dim>(),
+ 0,
+ constraints,
+ StaticMappingQ1<dim>::mapping);
deallog << "Constraints" << std::endl;
constraints.print(deallog.get_file_stream());
constraints.clear();
VectorTools::project_boundary_values_curl_conforming_l2(
- dof_handler, 0, boundary_function, 0, constraints);
+ dof_handler,
+ 0,
+ boundary_function,
+ 0,
+ constraints,
+ StaticMappingQ1<dim>::mapping);
constraints.close();
constraints.print(deallog.get_file_stream());
}
BoundaryFunction<dim> boundary_function;
constraints.clear();
VectorTools::project_boundary_values_curl_conforming_l2(
- dof_handler, 0, boundary_function, 0, constraints);
+ dof_handler,
+ 0,
+ boundary_function,
+ 0,
+ constraints,
+ StaticMappingQ1<dim>::mapping);
constraints.close();
}
constraints.clear();
VectorTools::project_boundary_values_curl_conforming_l2(
- dof_handler, 0, boundary_function, 0, constraints);
+ dof_handler,
+ 0,
+ boundary_function,
+ 0,
+ constraints,
+ StaticMappingQ1<dim>::mapping);
constraints.close();
constraints.print(deallog.get_file_stream());
}
constraints.clear();
VectorTools::project_boundary_values_div_conforming(
- dof_handler, 0, boundary_function, 0, constraints);
+ dof_handler,
+ 0,
+ boundary_function,
+ 0,
+ constraints,
+ StaticMappingQ1<dim>::mapping);
constraints.close();
constraints.print(deallog.get_file_stream());
}
0, /*first_vector_component*/
boundary_function_disp,
0, /*bdry_id*/
- constraints);
+ constraints,
+ StaticMappingQ1<dim>::mapping);
VectorTools::project_boundary_values_div_conforming(
dof_handler,
dim, /*first_vector_component*/
boundary_function_velo,
0, /*bdry_id*/
- constraints);
+ constraints,
+ StaticMappingQ1<dim>::mapping);
constraints.close();
}
-DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 1 11 12 6 7 3 4 9 10 0 0 14 14 0 0 0 0 1 0 0 0 0 14 0 1 14 0 1 0 14 0 0 1 0 1 0 0 14 0 1 14 0 3 0 0 11 1 0
-0 5 0 4294967295 4294967295 4294967295 4294967295 4294967295 0 0 1 0 4294967295 11
-1 10 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 2 0 4294967295 4294967295 11
-2 20 0 0 1 3 4 2 3 4 6 7 5 6 7 9 10 8 9 10 11 12 13 4 0 2 5 8 13 1 7 34 FESystem<1>[FE_Q<1>(2)-FE_Q<1>(1)] 23 Policy::Sequential<1,1>
+DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 14 0 0 0 0 1 0 0 0 0 14 0 1 14 0 1 0 14 0 0 1 0 1 0 0 14 0 1 14 0 0 0 3 0 0 0 2 10 0 0 1 11 12 6 7 3 4 9 10 1 0 4294967295 2 0 0 2 0 4294967295 4294967295 2 0 0 4 0 2 5 8 13 3 0 2 0 0 2 0 0 1 2 0 0 3 0 0 1 2 2 0 0 5 0 0 1 2 3 4 0 0 3 0 5 0 4294967295 4294967295 4294967295 4294967295 4294967295 10 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 20 0 0 1 3 4 2 3 4 6 7 5 6 7 9 10 8 9 10 11 12 13 3 0 2 0 0 5 3 0 0 5 10 5 0 0 5 10 15 20 7 34 FESystem<1>[FE_Q<1>(2)-FE_Q<1>(1)] 23 Policy::Sequential<1,1>
-DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 1 11 12 6 7 3 4 9 10 0 0 14 14 0 0 0 0 1 0 0 0 0 14 0 1 14 0 1 0 14 0 0 1 0 1 0 0 14 0 1 14 0 3 0 0 11 1 0
-0 5 0 4294967295 4294967295 4294967295 4294967295 4294967295 0 0 1 0 4294967295 11
-1 10 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 2 0 4294967295 4294967295 11
-2 20 0 0 1 3 4 2 3 4 6 7 5 6 7 9 10 8 9 10 11 12 13 4 0 2 5 8 13 1 7 40 FESystem<1,2>[FE_Q<1,2>(2)-FE_Q<1,2>(1)] 23 Policy::Sequential<1,2>
+DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 14 0 0 0 0 1 0 0 0 0 14 0 1 14 0 1 0 14 0 0 1 0 1 0 0 14 0 1 14 0 0 0 3 0 0 0 2 10 0 0 1 11 12 6 7 3 4 9 10 1 0 4294967295 2 0 0 2 0 4294967295 4294967295 2 0 0 4 0 2 5 8 13 3 0 2 0 0 2 0 0 1 2 0 0 3 0 0 1 2 2 0 0 5 0 0 1 2 3 4 0 0 3 0 5 0 4294967295 4294967295 4294967295 4294967295 4294967295 10 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 20 0 0 1 3 4 2 3 4 6 7 5 6 7 9 10 8 9 10 11 12 13 3 0 2 0 0 5 3 0 0 5 10 5 0 0 5 10 15 20 7 40 FESystem<1,2>[FE_Q<1,2>(2)-FE_Q<1,2>(1)] 23 Policy::Sequential<1,2>
-DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 0 0 1 2 114 115 116 127 128 129 148 149 150 32 33 34 39 40 41 162 163 164 172 173 174 56 57 58 9 10 11 73 74 75 12 13 14 84 85 86 157 158 159 177 178 179 167 168 169 182 183 184 50 51 52 108 109 110 53 54 55 102 103 104 19 20 21 99 100 101 105 106 107 111 112 113 0 0 187 187 0 0 0 0 1 0 0 0 0 187 0 1 187 0 1 0 187 0 0 1 0 1 0 0 187 0 1 187 0 3 0 0 11 1 0
-0 22 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 0 0 2 0 4294967295 4294967295 11
-1 88 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 11
-2 352 0 0 1 2 9 10 11 12 13 14 19 20 21 3 4 15 16 5 6 17 18 7 8 9 10 11 32 33 34 19 20 21 50 51 52 15 16 35 36 22 23 37 38 24 25 12 13 14 19 20 21 39 40 41 53 54 55 26 27 42 43 17 18 44 45 28 29 19 20 21 50 51 52 53 54 55 56 57 58 42 43 46 47 37 38 48 49 30 31 32 33 34 73 74 75 50 51 52 99 100 101 35 36 76 77 59 60 78 79 61 62 73 74 75 114 115 116 99 100 101 157 158 159 76 77 117 118 119 120 160 161 121 122 50 51 52 99 100 101 56 57 58 102 103 104 46 47 80 81 78 79 82 83 63 64 99 100 101 157 158 159 102 103 104 162 163 164 80 81 123 124 160 161 165 166 125 126 39 40 41 53 54 55 84 85 86 105 106 107 65 66 87 88 44 45 89 90 67 68 53 54 55 56 57 58 105 106 107 108 109 110 87 88 91 92 48 49 93 94 69 70 84 85 86 105 106 107 127 128 129 167 168 169 130 131 170 171 89 90 132 133 134 135 105 106 107 108 109 110 167 168 169 172 173 174 170 171 175 176 93 94 136 137 138 139 56 57 58 102 103 104 108 109 110 111 112 113 91 92 95 96 82 83 97 98 71 72 102 103 104 162 163 164 111 112 113 177 178 179 95 96 140 141 165 166 180 181 142 143 108 109 110 111 112 113 172 173 174 182 183 184 175 176 185 186 97 98 144 145 146 147 111 112 113 177 178 179 182 183 184 148 149 150 185 186 151 152 180 181 153 154 155 156 32 0 7 8 24 25 28 29 30 31 61 62 121 122 63 64 125 126 67 68 69 70 134 135 138 139 71 72 142 143 146 147 155 156 0 0 0 14 1 0
-3 0 0 112 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 5 6 22 23 59 60 119 120 3 4 26 27 65 66 130 131 117 118 123 124 140 141 151 152 132 133 136 137 144 145 153 154 35 36 46 47 91 92 175 176 44 45 48 49 82 83 165 166 15 16 42 43 17 18 37 38 76 77 80 81 78 79 160 161 87 88 170 171 89 90 93 94 95 96 185 186 97 98 180 181 21 36 FESystem<2>[FE_Q<2>(2)^2-FE_Q<2>(1)] 23 Policy::Sequential<2,2>
+DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 187 187 0 0 0 0 1 0 0 0 0 187 0 1 187 0 1 0 187 0 0 1 0 1 0 0 187 0 1 187 0 0 0 3 0 0 0 3 75 0 0 1 2 114 115 116 127 128 129 148 149 150 32 33 34 39 40 41 162 163 164 172 173 174 56 57 58 9 10 11 73 74 75 12 13 14 84 85 86 157 158 159 177 178 179 167 168 169 182 183 184 50 51 52 108 109 110 53 54 55 102 103 104 19 20 21 99 100 101 105 106 107 111 112 113 112 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 5 6 22 23 59 60 119 120 3 4 26 27 65 66 130 131 117 118 123 124 140 141 151 152 132 133 136 137 144 145 153 154 35 36 46 47 91 92 175 176 44 45 48 49 82 83 165 166 15 16 42 43 17 18 37 38 76 77 80 81 78 79 160 161 87 88 170 171 89 90 93 94 95 96 185 186 97 98 180 181 2 0 4294967295 4294967295 3 0 0 0 0 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 3 0 0 0 0 32 0 7 8 24 25 28 29 30 31 61 62 121 122 63 64 125 126 67 68 69 70 134 135 138 139 71 72 142 143 146 147 155 156 3 0 3 0 0 57 0 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 2 0 0 2 3 0 0 0 0 5 0 0 2 4 6 8 3 0 0 0 0 17 0 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 0 0 3 0 22 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 88 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 352 0 0 1 2 9 10 11 12 13 14 19 20 21 3 4 15 16 5 6 17 18 7 8 9 10 11 32 33 34 19 20 21 50 51 52 15 16 35 36 22 23 37 38 24 25 12 13 14 19 20 21 39 40 41 53 54 55 26 27 42 43 17 18 44 45 28 29 19 20 21 50 51 52 53 54 55 56 57 58 42 43 46 47 37 38 48 49 30 31 32 33 34 73 74 75 50 51 52 99 100 101 35 36 76 77 59 60 78 79 61 62 73 74 75 114 115 116 99 100 101 157 158 159 76 77 117 118 119 120 160 161 121 122 50 51 52 99 100 101 56 57 58 102 103 104 46 47 80 81 78 79 82 83 63 64 99 100 101 157 158 159 102 103 104 162 163 164 80 81 123 124 160 161 165 166 125 126 39 40 41 53 54 55 84 85 86 105 106 107 65 66 87 88 44 45 89 90 67 68 53 54 55 56 57 58 105 106 107 108 109 110 87 88 91 92 48 49 93 94 69 70 84 85 86 105 106 107 127 128 129 167 168 169 130 131 170 171 89 90 132 133 134 135 105 106 107 108 109 110 167 168 169 172 173 174 170 171 175 176 93 94 136 137 138 139 56 57 58 102 103 104 108 109 110 111 112 113 91 92 95 96 82 83 97 98 71 72 102 103 104 162 163 164 111 112 113 177 178 179 95 96 140 141 165 166 180 181 142 143 108 109 110 111 112 113 172 173 174 182 183 184 175 176 185 186 97 98 144 145 146 147 111 112 113 177 178 179 182 183 184 148 149 150 185 186 151 152 180 181 153 154 155 156 3 0 2 0 0 22 5 0 0 22 44 66 88 17 0 0 22 44 66 88 110 132 154 176 198 220 242 264 286 308 330 352 21 36 FESystem<2>[FE_Q<2>(2)^2-FE_Q<2>(1)] 23 Policy::Sequential<2,2>
-DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 0 0 1 2 114 115 116 127 128 129 148 149 150 32 33 34 39 40 41 162 163 164 172 173 174 56 57 58 9 10 11 73 74 75 12 13 14 84 85 86 157 158 159 177 178 179 167 168 169 182 183 184 50 51 52 108 109 110 53 54 55 102 103 104 19 20 21 99 100 101 105 106 107 111 112 113 0 0 187 187 0 0 0 0 1 0 0 0 0 187 0 1 187 0 1 0 187 0 0 1 0 1 0 0 187 0 1 187 0 3 0 0 11 1 0
-0 22 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 0 0 2 0 4294967295 4294967295 11
-1 88 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 11
-2 352 0 0 1 2 9 10 11 12 13 14 19 20 21 3 4 15 16 5 6 17 18 7 8 9 10 11 32 33 34 19 20 21 50 51 52 15 16 35 36 22 23 37 38 24 25 12 13 14 19 20 21 39 40 41 53 54 55 26 27 42 43 17 18 44 45 28 29 19 20 21 50 51 52 53 54 55 56 57 58 42 43 46 47 37 38 48 49 30 31 32 33 34 73 74 75 50 51 52 99 100 101 35 36 76 77 59 60 78 79 61 62 73 74 75 114 115 116 99 100 101 157 158 159 76 77 117 118 119 120 160 161 121 122 50 51 52 99 100 101 56 57 58 102 103 104 46 47 80 81 78 79 82 83 63 64 99 100 101 157 158 159 102 103 104 162 163 164 80 81 123 124 160 161 165 166 125 126 39 40 41 53 54 55 84 85 86 105 106 107 65 66 87 88 44 45 89 90 67 68 53 54 55 56 57 58 105 106 107 108 109 110 87 88 91 92 48 49 93 94 69 70 84 85 86 105 106 107 127 128 129 167 168 169 130 131 170 171 89 90 132 133 134 135 105 106 107 108 109 110 167 168 169 172 173 174 170 171 175 176 93 94 136 137 138 139 56 57 58 102 103 104 108 109 110 111 112 113 91 92 95 96 82 83 97 98 71 72 102 103 104 162 163 164 111 112 113 177 178 179 95 96 140 141 165 166 180 181 142 143 108 109 110 111 112 113 172 173 174 182 183 184 175 176 185 186 97 98 144 145 146 147 111 112 113 177 178 179 182 183 184 148 149 150 185 186 151 152 180 181 153 154 155 156 32 0 7 8 24 25 28 29 30 31 61 62 121 122 63 64 125 126 67 68 69 70 134 135 138 139 71 72 142 143 146 147 155 156 0 0 0 14 1 0
-3 0 0 112 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 5 6 22 23 59 60 119 120 3 4 26 27 65 66 130 131 117 118 123 124 140 141 151 152 132 133 136 137 144 145 153 154 35 36 46 47 91 92 175 176 44 45 48 49 82 83 165 166 15 16 42 43 17 18 37 38 76 77 80 81 78 79 160 161 87 88 170 171 89 90 93 94 95 96 185 186 97 98 180 181 21 42 FESystem<2,3>[FE_Q<2,3>(2)^2-FE_Q<2,3>(1)] 23 Policy::Sequential<2,3>
+DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 187 187 0 0 0 0 1 0 0 0 0 187 0 1 187 0 1 0 187 0 0 1 0 1 0 0 187 0 1 187 0 0 0 3 0 0 0 3 75 0 0 1 2 114 115 116 127 128 129 148 149 150 32 33 34 39 40 41 162 163 164 172 173 174 56 57 58 9 10 11 73 74 75 12 13 14 84 85 86 157 158 159 177 178 179 167 168 169 182 183 184 50 51 52 108 109 110 53 54 55 102 103 104 19 20 21 99 100 101 105 106 107 111 112 113 112 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 5 6 22 23 59 60 119 120 3 4 26 27 65 66 130 131 117 118 123 124 140 141 151 152 132 133 136 137 144 145 153 154 35 36 46 47 91 92 175 176 44 45 48 49 82 83 165 166 15 16 42 43 17 18 37 38 76 77 80 81 78 79 160 161 87 88 170 171 89 90 93 94 95 96 185 186 97 98 180 181 2 0 4294967295 4294967295 3 0 0 0 0 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 3 0 0 0 0 32 0 7 8 24 25 28 29 30 31 61 62 121 122 63 64 125 126 67 68 69 70 134 135 138 139 71 72 142 143 146 147 155 156 3 0 3 0 0 57 0 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 2 0 0 2 3 0 0 0 0 5 0 0 2 4 6 8 3 0 0 0 0 17 0 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 0 0 3 0 22 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 88 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 352 0 0 1 2 9 10 11 12 13 14 19 20 21 3 4 15 16 5 6 17 18 7 8 9 10 11 32 33 34 19 20 21 50 51 52 15 16 35 36 22 23 37 38 24 25 12 13 14 19 20 21 39 40 41 53 54 55 26 27 42 43 17 18 44 45 28 29 19 20 21 50 51 52 53 54 55 56 57 58 42 43 46 47 37 38 48 49 30 31 32 33 34 73 74 75 50 51 52 99 100 101 35 36 76 77 59 60 78 79 61 62 73 74 75 114 115 116 99 100 101 157 158 159 76 77 117 118 119 120 160 161 121 122 50 51 52 99 100 101 56 57 58 102 103 104 46 47 80 81 78 79 82 83 63 64 99 100 101 157 158 159 102 103 104 162 163 164 80 81 123 124 160 161 165 166 125 126 39 40 41 53 54 55 84 85 86 105 106 107 65 66 87 88 44 45 89 90 67 68 53 54 55 56 57 58 105 106 107 108 109 110 87 88 91 92 48 49 93 94 69 70 84 85 86 105 106 107 127 128 129 167 168 169 130 131 170 171 89 90 132 133 134 135 105 106 107 108 109 110 167 168 169 172 173 174 170 171 175 176 93 94 136 137 138 139 56 57 58 102 103 104 108 109 110 111 112 113 91 92 95 96 82 83 97 98 71 72 102 103 104 162 163 164 111 112 113 177 178 179 95 96 140 141 165 166 180 181 142 143 108 109 110 111 112 113 172 173 174 182 183 184 175 176 185 186 97 98 144 145 146 147 111 112 113 177 178 179 182 183 184 148 149 150 185 186 151 152 180 181 153 154 155 156 3 0 2 0 0 22 5 0 0 22 44 66 88 17 0 0 22 44 66 88 110 132 154 176 198 220 242 264 286 308 330 352 21 42 FESystem<2,3>[FE_Q<2,3>(2)^2-FE_Q<2,3>(1)] 23 Policy::Sequential<2,3>
-DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 1 2 3 1093 1094 1095 1096 1148 1149 1150 1151 1227 1228 1229 1230 1276 1277 1278 1279 1361 1362 1363 1364 1440 1441 1442 1443 1531 1532 1533 1534 146 147 148 149 171 172 173 174 211 212 213 214 1582 1583 1584 1585 1601 1602 1603 1604 1658 1659 1660 1661 1677 1678 1679 1680 1783 1784 1785 1786 1822 1823 1824 1825 1841 1842 1843 1844 1947 1948 1949 1950 2035 2036 2037 2038 339 340 341 342 309 310 311 312 352 353 354 355 2144 2145 2146 2147 2172 2173 2174 2175 2228 2229 2230 2231 398 399 400 401 25 26 27 28 513 514 515 516 29 30 31 32 577 578 579 580 33 34 35 36 665 666 667 668 1556 1557 1558 1559 1708 1709 1710 1711 1560 1561 1562 1563 1872 1873 1874 1875 1632 1633 1634 1635 1727 1728 1729 1730 1636 1637 1638 1639 1960 1961 1962 1963 1746 1747 1748 1749 2072 2073 2074 2075 1796 1797 1798 1799 1903 1904 1905 1906 1800 1801 1802 1803 1991 1992 1993 1994 1922 1923 1924 1925 2097 2098 2099 2100 2022 2023 2024 2025 2110 2111 2112 2113 322 323 324 325 816 817 818 819 279 280 281 282 929 930 931 932 275 276 277 278 855 856 857 858 292 293 294 295 803 804 805 806 296 297 298 299 942 943 944 945 326 327 328 329 868 869 870 871 2130 2131 2132 2133 2242 2243 2244 2245 2137 2138 2139 2140 2193 2194 2195 2196 2165 2166 2167 2168 2200 2201 2202 2203 2158 2159 2160 2161 2270 2271 2272 2273 2214 2215 2216 2217 2284 2285 2286 2287 2221 2222 2223 2224 2256 2257 2258 2259 1069 1070 1071 1072 382 383 384 385 1029 1030 1031 1032 394 395 396 397 1045 1046 1047 1048 390 391 392 393 68 69 70 71 912 913 914 915 790 791 792 793 964 965 966 967 64 65 66 67 786 787 788 789 838 839 840 841 890 891 892 893 72 73 74 75 842 843 844 845 916 917 918 919 986 987 988 989 2123 2124 2125 2126 2179 2180 2181 2182 2235 2236 2237 2238 2291 2292 2293 2294 2151 2152 2153 2154 2263 2264 2265 2266 2186 2187 2188 2189 2298 2299 2300 2301 2207 2208 2209 2210 2249 2250 2251 2252 2277 2278 2279 2280 2305 2306 2307 2308 1053 1054 1055 1056 1041 1042 1043 1044 1025 1026 1027 1028 386 387 388 389 1077 1078 1079 1080 1021 1022 1023 1024 1065 1066 1067 1068 378 379 380 381 1085 1086 1087 1088 1061 1062 1063 1064 1037 1038 1039 1040 374 375 376 377 85 86 87 88 1017 1018 1019 1020 1033 1034 1035 1036 1049 1050 1051 1052 1057 1058 1059 1060 1073 1074 1075 1076 1081 1082 1083 1084 1089 1090 1091 1092 0 0 2312 2312 0 0 0 0 1 0 0 0 0 2312 0 1 2312 0 1 0 2312 0 0 1 0 1 0 0 2312 0 1 2312 0 3 0 0 11 1 0
-0 89 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 0 0 3 0 4294967295 4294967295 4294967295 11
-1 712 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 24 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 11
-2 5696 0 0 1 2 3 25 26 27 28 29 30 31 32 64 65 66 67 33 34 35 36 68 69 70 71 72 73 74 75 85 86 87 88 4 5 6 37 38 39 7 8 9 40 41 42 43 44 45 76 77 78 46 47 48 79 80 81 10 11 12 49 50 51 52 53 54 82 83 84 13 14 15 55 56 57 16 17 18 58 59 60 19 20 21 61 62 63 22 23 24 25 26 27 28 146 147 148 149 64 65 66 67 275 276 277 278 68 69 70 71 279 280 281 282 85 86 87 88 374 375 376 377 37 38 39 150 151 152 89 90 91 153 154 155 76 77 78 283 284 285 156 157 158 286 287 288 49 50 51 159 160 161 82 83 84 289 290 291 55 56 57 162 163 164 92 93 94 165 166 167 95 96 97 168 169 170 98 99 100 29 30 31 32 64 65 66 67 171 172 173 174 292 293 294 295 72 73 74 75 85 86 87 88 296 297 298 299 378 379 380 381 101 102 103 175 176 177 40 41 42 178 179 180 181 182 183 300 301 302 79 80 81 303 304 305 52 53 54 82 83 84 184 185 186 306 307 308 104 105 106 187 188 189 58 59 60 190 191 192 107 108 109 193 194 195 110 111 112 64 65 66 67 275 276 277 278 292 293 294 295 309 310 311 312 85 86 87 88 374 375 376 377 378 379 380 381 382 383 384 385 175 176 177 196 197 198 153 154 155 199 200 201 300 301 302 313 314 315 286 287 288 316 317 318 82 83 84 289 290 291 306 307 308 319 320 321 187 188 189 202 203 204 165 166 167 205 206 207 113 114 115 208 209 210 116 117 118 33 34 35 36 68 69 70 71 72 73 74 75 85 86 87 88 211 212 213 214 322 323 324 325 326 327 328 329 386 387 388 389 43 44 45 76 77 78 46 47 48 79 80 81 215 216 217 330 331 332 218 219 220 333 334 335 119 120 121 221 222 223 224 225 226 336 337 338 122 123 124 227 228 229 125 126 127 230 231 232 61 62 63 233 234 235 128 129 130 68 69 70 71 279 280 281 282 85 86 87 88 374 375 376 377 322 323 324 325 339 340 341 342 386 387 388 389 390 391 392 393 76 77 78 283 284 285 156 157 158 286 287 288 330 331 332 343 344 345 236 237 238 346 347 348 221 222 223 239 240 241 336 337 338 349 350 351 227 228 229 242 243 244 131 132 133 245 246 247 168 169 170 248 249 250 134 135 136 72 73 74 75 85 86 87 88 296 297 298 299 378 379 380 381 326 327 328 329 386 387 388 389 352 353 354 355 394 395 396 397 181 182 183 300 301 302 79 80 81 303 304 305 251 252 253 356 357 358 333 334 335 359 360 361 224 225 226 336 337 338 254 255 256 362 363 364 137 138 139 257 258 259 230 231 232 260 261 262 193 194 195 263 264 265 140 141 142 85 86 87 88 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 300 301 302 313 314 315 286 287 288 316 317 318 356 357 358 365 366 367 346 347 348 368 369 370 336 337 338 349 350 351 362 363 364 371 372 373 257 258 259 266 267 268 245 246 247 269 270 271 208 209 210 272 273 274 143 144 145 146 147 148 149 513 514 515 516 275 276 277 278 786 787 788 789 279 280 281 282 790 791 792 793 374 375 376 377 1017 1018 1019 1020 150 151 152 517 518 519 402 403 404 520 521 522 283 284 285 794 795 796 523 524 525 797 798 799 159 160 161 526 527 528 289 290 291 800 801 802 162 163 164 529 530 531 405 406 407 532 533 534 408 409 410 535 536 537 411 412 413 513 514 515 516 1093 1094 1095 1096 786 787 788 789 1556 1557 1558 1559 790 791 792 793 1560 1561 1562 1563 1017 1018 1019 1020 2123 2124 2125 2126 517 518 519 1097 1098 1099 1100 1101 1102 1564 1565 1566 794 795 796 1567 1568 1569 1570 1571 1572 2127 2128 2129 526 527 528 1103 1104 1105 800 801 802 1573 1574 1575 529 530 531 1106 1107 1108 1109 1110 1111 1576 1577 1578 1112 1113 1114 1579 1580 1581 1115 1116 1117 275 276 277 278 786 787 788 789 309 310 311 312 803 804 805 806 374 375 376 377 1017 1018 1019 1020 382 383 384 385 1021 1022 1023 1024 196 197 198 538 539 540 520 521 522 541 542 543 313 314 315 807 808 809 797 798 799 810 811 812 289 290 291 800 801 802 319 320 321 813 814 815 202 203 204 544 545 546 532 533 534 547 548 549 414 415 416 550 551 552 417 418 419 786 787 788 789 1556 1557 1558 1559 803 804 805 806 1582 1583 1584 1585 1017 1018 1019 1020 2123 2124 2125 2126 1021 1022 1023 1024 2130 2131 2132 2133 538 539 540 1118 1119 1120 1564 1565 1566 1586 1587 1588 807 808 809 1589 1590 1591 2127 2128 2129 2134 2135 2136 800 801 802 1573 1574 1575 813 814 815 1592 1593 1594 544 545 546 1121 1122 1123 1576 1577 1578 1595 1596 1597 1124 1125 1126 1598 1599 1600 1127 1128 1129 279 280 281 282 790 791 792 793 374 375 376 377 1017 1018 1019 1020 339 340 341 342 816 817 818 819 390 391 392 393 1025 1026 1027 1028 283 284 285 794 795 796 523 524 525 797 798 799 343 344 345 820 821 822 553 554 555 823 824 825 239 240 241 556 557 558 349 350 351 826 827 828 242 243 244 559 560 561 420 421 422 562 563 564 535 536 537 565 566 567 423 424 425 790 791 792 793 1560 1561 1562 1563 1017 1018 1019 1020 2123 2124 2125 2126 816 817 818 819 1601 1602 1603 1604 1025 1026 1027 1028 2137 2138 2139 2140 794 795 796 1567 1568 1569 1570 1571 1572 2127 2128 2129 820 821 822 1605 1606 1607 1608 1609 1610 2141 2142 2143 556 557 558 1130 1131 1132 826 827 828 1611 1612 1613 559 560 561 1133 1134 1135 1136 1137 1138 1614 1615 1616 1579 1580 1581 1617 1618 1619 1139 1140 1141 374 375 376 377 1017 1018 1019 1020 382 383 384 385 1021 1022 1023 1024 390 391 392 393 1025 1026 1027 1028 398 399 400 401 1029 1030 1031 1032 313 314 315 807 808 809 797 798 799 810 811 812 365 366 367 829 830 831 823 824 825 832 833 834 349 350 351 826 827 828 371 372 373 835 836 837 266 267 268 568 569 570 562 563 564 571 572 573 550 551 552 574 575 576 426 427 428 1017 1018 1019 1020 2123 2124 2125 2126 1021 1022 1023 1024 2130 2131 2132 2133 1025 1026 1027 1028 2137 2138 2139 2140 1029 1030 1031 1032 2144 2145 2146 2147 807 808 809 1589 1590 1591 2127 2128 2129 2134 2135 2136 829 830 831 1620 1621 1622 2141 2142 2143 2148 2149 2150 826 827 828 1611 1612 1613 835 836 837 1623 1624 1625 568 569 570 1142 1143 1144 1614 1615 1616 1626 1627 1628 1598 1599 1600 1629 1630 1631 1145 1146 1147 171 172 173 174 292 293 294 295 577 578 579 580 838 839 840 841 296 297 298 299 378 379 380 381 842 843 844 845 1033 1034 1035 1036 429 430 431 581 582 583 178 179 180 584 585 586 587 588 589 846 847 848 303 304 305 849 850 851 184 185 186 306 307 308 590 591 592 852 853 854 432 433 434 593 594 595 190 191 192 596 597 598 435 436 437 599 600 601 438 439 440 292 293 294 295 309 310 311 312 838 839 840 841 855 856 857 858 378 379 380 381 382 383 384 385 1033 1034 1035 1036 1037 1038 1039 1040 581 582 583 602 603 604 199 200 201 605 606 607 846 847 848 859 860 861 316 317 318 862 863 864 306 307 308 319 320 321 852 853 854 865 866 867 593 594 595 608 609 610 205 206 207 611 612 613 441 442 443 614 615 616 444 445 446 577 578 579 580 838 839 840 841 1148 1149 1150 1151 1632 1633 1634 1635 842 843 844 845 1033 1034 1035 1036 1636 1637 1638 1639 2151 2152 2153 2154 1152 1153 1154 1640 1641 1642 584 585 586 1155 1156 1157 1643 1644 1645 2155 2156 2157 849 850 851 1646 1647 1648 590 591 592 852 853 854 1158 1159 1160 1649 1650 1651 1161 1162 1163 1652 1653 1654 596 597 598 1164 1165 1166 1167 1168 1169 1655 1656 1657 1170 1171 1172 838 839 840 841 855 856 857 858 1632 1633 1634 1635 1658 1659 1660 1661 1033 1034 1035 1036 1037 1038 1039 1040 2151 2152 2153 2154 2158 2159 2160 2161 1640 1641 1642 1662 1663 1664 605 606 607 1173 1174 1175 2155 2156 2157 2162 2163 2164 862 863 864 1665 1666 1667 852 853 854 865 866 867 1649 1650 1651 1668 1669 1670 1652 1653 1654 1671 1672 1673 611 612 613 1176 1177 1178 1179 1180 1181 1674 1675 1676 1182 1183 1184 296 297 298 299 378 379 380 381 842 843 844 845 1033 1034 1035 1036 352 353 354 355 394 395 396 397 868 869 870 871 1041 1042 1043 1044 587 588 589 846 847 848 303 304 305 849 850 851 617 618 619 872 873 874 359 360 361 875 876 877 254 255 256 362 363 364 620 621 622 878 879 880 447 448 449 623 624 625 260 261 262 626 627 628 599 600 601 629 630 631 450 451 452 378 379 380 381 382 383 384 385 1033 1034 1035 1036 1037 1038 1039 1040 394 395 396 397 398 399 400 401 1041 1042 1043 1044 1045 1046 1047 1048 846 847 848 859 860 861 316 317 318 862 863 864 872 873 874 881 882 883 368 369 370 884 885 886 362 363 364 371 372 373 878 879 880 887 888 889 623 624 625 632 633 634 269 270 271 635 636 637 614 615 616 638 639 640 453 454 455 842 843 844 845 1033 1034 1035 1036 1636 1637 1638 1639 2151 2152 2153 2154 868 869 870 871 1041 1042 1043 1044 1677 1678 1679 1680 2165 2166 2167 2168 1643 1644 1645 2155 2156 2157 849 850 851 1646 1647 1648 1681 1682 1683 2169 2170 2171 875 876 877 1684 1685 1686 620 621 622 878 879 880 1185 1186 1187 1687 1688 1689 1188 1189 1190 1690 1691 1692 626 627 628 1191 1192 1193 1655 1656 1657 1693 1694 1695 1194 1195 1196 1033 1034 1035 1036 1037 1038 1039 1040 2151 2152 2153 2154 2158 2159 2160 2161 1041 1042 1043 1044 1045 1046 1047 1048 2165 2166 2167 2168 2172 2173 2174 2175 2155 2156 2157 2162 2163 2164 862 863 864 1665 1666 1667 2169 2170 2171 2176 2177 2178 884 885 886 1696 1697 1698 878 879 880 887 888 889 1687 1688 1689 1699 1700 1701 1690 1691 1692 1702 1703 1704 635 636 637 1197 1198 1199 1674 1675 1676 1705 1706 1707 1200 1201 1202 309 310 311 312 803 804 805 806 855 856 857 858 890 891 892 893 382 383 384 385 1021 1022 1023 1024 1037 1038 1039 1040 1049 1050 1051 1052 602 603 604 641 642 643 541 542 543 644 645 646 859 860 861 894 895 896 810 811 812 897 898 899 319 320 321 813 814 815 865 866 867 900 901 902 608 609 610 647 648 649 547 548 549 650 651 652 456 457 458 653 654 655 459 460 461 803 804 805 806 1582 1583 1584 1585 890 891 892 893 1708 1709 1710 1711 1021 1022 1023 1024 2130 2131 2132 2133 1049 1050 1051 1052 2179 2180 2181 2182 641 642 643 1203 1204 1205 1586 1587 1588 1712 1713 1714 894 895 896 1715 1716 1717 2134 2135 2136 2183 2184 2185 813 814 815 1592 1593 1594 900 901 902 1718 1719 1720 647 648 649 1206 1207 1208 1595 1596 1597 1721 1722 1723 1209 1210 1211 1724 1725 1726 1212 1213 1214 855 856 857 858 890 891 892 893 1658 1659 1660 1661 1727 1728 1729 1730 1037 1038 1039 1040 1049 1050 1051 1052 2158 2159 2160 2161 2186 2187 2188 2189 1662 1663 1664 1731 1732 1733 644 645 646 1215 1216 1217 2162 2163 2164 2190 2191 2192 897 898 899 1734 1735 1736 865 866 867 900 901 902 1668 1669 1670 1737 1738 1739 1671 1672 1673 1740 1741 1742 650 651 652 1218 1219 1220 1221 1222 1223 1743 1744 1745 1224 1225 1226 890 891 892 893 1708 1709 1710 1711 1727 1728 1729 1730 1227 1228 1229 1230 1049 1050 1051 1052 2179 2180 2181 2182 2186 2187 2188 2189 1746 1747 1748 1749 1731 1732 1733 1231 1232 1233 1712 1713 1714 1234 1235 1236 2190 2191 2192 1750 1751 1752 2183 2184 2185 1753 1754 1755 900 901 902 1718 1719 1720 1737 1738 1739 1237 1238 1239 1740 1741 1742 1240 1241 1242 1721 1722 1723 1243 1244 1245 1246 1247 1248 1756 1757 1758 1249 1250 1251 382 383 384 385 1021 1022 1023 1024 1037 1038 1039 1040 1049 1050 1051 1052 398 399 400 401 1029 1030 1031 1032 1045 1046 1047 1048 1053 1054 1055 1056 859 860 861 894 895 896 810 811 812 897 898 899 881 882 883 903 904 905 832 833 834 906 907 908 371 372 373 835 836 837 887 888 889 909 910 911 632 633 634 656 657 658 571 572 573 659 660 661 653 654 655 662 663 664 462 463 464 1021 1022 1023 1024 2130 2131 2132 2133 1049 1050 1051 1052 2179 2180 2181 2182 1029 1030 1031 1032 2144 2145 2146 2147 1053 1054 1055 1056 2193 2194 2195 2196 894 895 896 1715 1716 1717 2134 2135 2136 2183 2184 2185 903 904 905 1759 1760 1761 2148 2149 2150 2197 2198 2199 835 836 837 1623 1624 1625 909 910 911 1762 1763 1764 656 657 658 1252 1253 1254 1626 1627 1628 1765 1766 1767 1724 1725 1726 1768 1769 1770 1255 1256 1257 1037 1038 1039 1040 1049 1050 1051 1052 2158 2159 2160 2161 2186 2187 2188 2189 1045 1046 1047 1048 1053 1054 1055 1056 2172 2173 2174 2175 2200 2201 2202 2203 2162 2163 2164 2190 2191 2192 897 898 899 1734 1735 1736 2176 2177 2178 2204 2205 2206 906 907 908 1771 1772 1773 887 888 889 909 910 911 1699 1700 1701 1774 1775 1776 1702 1703 1704 1777 1778 1779 659 660 661 1258 1259 1260 1743 1744 1745 1780 1781 1782 1261 1262 1263 1049 1050 1051 1052 2179 2180 2181 2182 2186 2187 2188 2189 1746 1747 1748 1749 1053 1054 1055 1056 2193 2194 2195 2196 2200 2201 2202 2203 1783 1784 1785 1786 2190 2191 2192 1750 1751 1752 2183 2184 2185 1753 1754 1755 2204 2205 2206 1787 1788 1789 2197 2198 2199 1790 1791 1792 909 910 911 1762 1763 1764 1774 1775 1776 1264 1265 1266 1777 1778 1779 1267 1268 1269 1765 1766 1767 1270 1271 1272 1756 1757 1758 1793 1794 1795 1273 1274 1275 211 212 213 214 322 323 324 325 326 327 328 329 386 387 388 389 665 666 667 668 912 913 914 915 916 917 918 919 1057 1058 1059 1060 215 216 217 330 331 332 218 219 220 333 334 335 669 670 671 920 921 922 672 673 674 923 924 925 465 466 467 675 676 677 678 679 680 926 927 928 468 469 470 681 682 683 471 472 473 684 685 686 233 234 235 687 688 689 474 475 476 322 323 324 325 339 340 341 342 386 387 388 389 390 391 392 393 912 913 914 915 929 930 931 932 1057 1058 1059 1060 1061 1062 1063 1064 330 331 332 343 344 345 236 237 238 346 347 348 920 921 922 933 934 935 690 691 692 936 937 938 675 676 677 693 694 695 926 927 928 939 940 941 681 682 683 696 697 698 477 478 479 699 700 701 248 249 250 702 703 704 480 481 482 326 327 328 329 386 387 388 389 352 353 354 355 394 395 396 397 916 917 918 919 1057 1058 1059 1060 942 943 944 945 1065 1066 1067 1068 251 252 253 356 357 358 333 334 335 359 360 361 705 706 707 946 947 948 923 924 925 949 950 951 678 679 680 926 927 928 708 709 710 952 953 954 483 484 485 711 712 713 684 685 686 714 715 716 263 264 265 717 718 719 486 487 488 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 356 357 358 365 366 367 346 347 348 368 369 370 946 947 948 955 956 957 936 937 938 958 959 960 926 927 928 939 940 941 952 953 954 961 962 963 711 712 713 720 721 722 699 700 701 723 724 725 272 273 274 726 727 728 489 490 491 665 666 667 668 912 913 914 915 916 917 918 919 1057 1058 1059 1060 1276 1277 1278 1279 1796 1797 1798 1799 1800 1801 1802 1803 2207 2208 2209 2210 669 670 671 920 921 922 672 673 674 923 924 925 1280 1281 1282 1804 1805 1806 1283 1284 1285 1807 1808 1809 1286 1287 1288 1810 1811 1812 1813 1814 1815 2211 2212 2213 1289 1290 1291 1816 1817 1818 1292 1293 1294 1819 1820 1821 687 688 689 1295 1296 1297 1298 1299 1300 912 913 914 915 929 930 931 932 1057 1058 1059 1060 1061 1062 1063 1064 1796 1797 1798 1799 1822 1823 1824 1825 2207 2208 2209 2210 2214 2215 2216 2217 920 921 922 933 934 935 690 691 692 936 937 938 1804 1805 1806 1826 1827 1828 1301 1302 1303 1829 1830 1831 1810 1811 1812 1832 1833 1834 2211 2212 2213 2218 2219 2220 1816 1817 1818 1835 1836 1837 1304 1305 1306 1838 1839 1840 702 703 704 1307 1308 1309 1310 1311 1312 916 917 918 919 1057 1058 1059 1060 942 943 944 945 1065 1066 1067 1068 1800 1801 1802 1803 2207 2208 2209 2210 1841 1842 1843 1844 2221 2222 2223 2224 705 706 707 946 947 948 923 924 925 949 950 951 1313 1314 1315 1845 1846 1847 1807 1808 1809 1848 1849 1850 1813 1814 1815 2211 2212 2213 1851 1852 1853 2225 2226 2227 1316 1317 1318 1854 1855 1856 1819 1820 1821 1857 1858 1859 717 718 719 1319 1320 1321 1322 1323 1324 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 2207 2208 2209 2210 2214 2215 2216 2217 2221 2222 2223 2224 2228 2229 2230 2231 946 947 948 955 956 957 936 937 938 958 959 960 1845 1846 1847 1860 1861 1862 1829 1830 1831 1863 1864 1865 2211 2212 2213 2218 2219 2220 2225 2226 2227 2232 2233 2234 1854 1855 1856 1866 1867 1868 1838 1839 1840 1869 1870 1871 726 727 728 1325 1326 1327 1328 1329 1330 339 340 341 342 816 817 818 819 390 391 392 393 1025 1026 1027 1028 929 930 931 932 964 965 966 967 1061 1062 1063 1064 1073 1074 1075 1076 343 344 345 820 821 822 553 554 555 823 824 825 933 934 935 968 969 970 729 730 731 971 972 973 693 694 695 732 733 734 939 940 941 974 975 976 696 697 698 735 736 737 492 493 494 738 739 740 565 566 567 741 742 743 495 496 497 816 817 818 819 1601 1602 1603 1604 1025 1026 1027 1028 2137 2138 2139 2140 964 965 966 967 1872 1873 1874 1875 1073 1074 1075 1076 2235 2236 2237 2238 820 821 822 1605 1606 1607 1608 1609 1610 2141 2142 2143 968 969 970 1876 1877 1878 1879 1880 1881 2239 2240 2241 732 733 734 1331 1332 1333 974 975 976 1882 1883 1884 735 736 737 1334 1335 1336 1337 1338 1339 1885 1886 1887 1617 1618 1619 1888 1889 1890 1340 1341 1342 390 391 392 393 1025 1026 1027 1028 398 399 400 401 1029 1030 1031 1032 1061 1062 1063 1064 1073 1074 1075 1076 1069 1070 1071 1072 1077 1078 1079 1080 365 366 367 829 830 831 823 824 825 832 833 834 955 956 957 977 978 979 971 972 973 980 981 982 939 940 941 974 975 976 961 962 963 983 984 985 720 721 722 744 745 746 738 739 740 747 748 749 574 575 576 750 751 752 498 499 500 1025 1026 1027 1028 2137 2138 2139 2140 1029 1030 1031 1032 2144 2145 2146 2147 1073 1074 1075 1076 2235 2236 2237 2238 1077 1078 1079 1080 2242 2243 2244 2245 829 830 831 1620 1621 1622 2141 2142 2143 2148 2149 2150 977 978 979 1891 1892 1893 2239 2240 2241 2246 2247 2248 974 975 976 1882 1883 1884 983 984 985 1894 1895 1896 744 745 746 1343 1344 1345 1885 1886 1887 1897 1898 1899 1629 1630 1631 1900 1901 1902 1346 1347 1348 929 930 931 932 964 965 966 967 1061 1062 1063 1064 1073 1074 1075 1076 1822 1823 1824 1825 1903 1904 1905 1906 2214 2215 2216 2217 2249 2250 2251 2252 933 934 935 968 969 970 729 730 731 971 972 973 1826 1827 1828 1907 1908 1909 1349 1350 1351 1910 1911 1912 1832 1833 1834 1913 1914 1915 2218 2219 2220 2253 2254 2255 1835 1836 1837 1916 1917 1918 1352 1353 1354 1919 1920 1921 741 742 743 1355 1356 1357 1358 1359 1360 964 965 966 967 1872 1873 1874 1875 1073 1074 1075 1076 2235 2236 2237 2238 1903 1904 1905 1906 1361 1362 1363 1364 2249 2250 2251 2252 1922 1923 1924 1925 968 969 970 1876 1877 1878 1879 1880 1881 2239 2240 2241 1907 1908 1909 1365 1366 1367 1368 1369 1370 1926 1927 1928 1913 1914 1915 1371 1372 1373 2253 2254 2255 1929 1930 1931 1916 1917 1918 1374 1375 1376 1377 1378 1379 1932 1933 1934 1888 1889 1890 1380 1381 1382 1383 1384 1385 1061 1062 1063 1064 1073 1074 1075 1076 1069 1070 1071 1072 1077 1078 1079 1080 2214 2215 2216 2217 2249 2250 2251 2252 2228 2229 2230 2231 2256 2257 2258 2259 955 956 957 977 978 979 971 972 973 980 981 982 1860 1861 1862 1935 1936 1937 1910 1911 1912 1938 1939 1940 2218 2219 2220 2253 2254 2255 2232 2233 2234 2260 2261 2262 1866 1867 1868 1941 1942 1943 1919 1920 1921 1944 1945 1946 750 751 752 1386 1387 1388 1389 1390 1391 1073 1074 1075 1076 2235 2236 2237 2238 1077 1078 1079 1080 2242 2243 2244 2245 2249 2250 2251 2252 1922 1923 1924 1925 2256 2257 2258 2259 1947 1948 1949 1950 977 978 979 1891 1892 1893 2239 2240 2241 2246 2247 2248 1935 1936 1937 1392 1393 1394 1926 1927 1928 1951 1952 1953 2253 2254 2255 1929 1930 1931 2260 2261 2262 1954 1955 1956 1941 1942 1943 1395 1396 1397 1932 1933 1934 1957 1958 1959 1900 1901 1902 1398 1399 1400 1401 1402 1403 352 353 354 355 394 395 396 397 868 869 870 871 1041 1042 1043 1044 942 943 944 945 1065 1066 1067 1068 986 987 988 989 1081 1082 1083 1084 617 618 619 872 873 874 359 360 361 875 876 877 753 754 755 990 991 992 949 950 951 993 994 995 708 709 710 952 953 954 756 757 758 996 997 998 501 502 503 759 760 761 714 715 716 762 763 764 629 630 631 765 766 767 504 505 506 394 395 396 397 398 399 400 401 1041 1042 1043 1044 1045 1046 1047 1048 1065 1066 1067 1068 1069 1070 1071 1072 1081 1082 1083 1084 1085 1086 1087 1088 872 873 874 881 882 883 368 369 370 884 885 886 990 991 992 999 1000 1001 958 959 960 1002 1003 1004 952 953 954 961 962 963 996 997 998 1005 1006 1007 759 760 761 768 769 770 723 724 725 771 772 773 638 639 640 774 775 776 507 508 509 868 869 870 871 1041 1042 1043 1044 1677 1678 1679 1680 2165 2166 2167 2168 986 987 988 989 1081 1082 1083 1084 1960 1961 1962 1963 2263 2264 2265 2266 1681 1682 1683 2169 2170 2171 875 876 877 1684 1685 1686 1964 1965 1966 2267 2268 2269 993 994 995 1967 1968 1969 756 757 758 996 997 998 1404 1405 1406 1970 1971 1972 1407 1408 1409 1973 1974 1975 762 763 764 1410 1411 1412 1693 1694 1695 1976 1977 1978 1413 1414 1415 1041 1042 1043 1044 1045 1046 1047 1048 2165 2166 2167 2168 2172 2173 2174 2175 1081 1082 1083 1084 1085 1086 1087 1088 2263 2264 2265 2266 2270 2271 2272 2273 2169 2170 2171 2176 2177 2178 884 885 886 1696 1697 1698 2267 2268 2269 2274 2275 2276 1002 1003 1004 1979 1980 1981 996 997 998 1005 1006 1007 1970 1971 1972 1982 1983 1984 1973 1974 1975 1985 1986 1987 771 772 773 1416 1417 1418 1705 1706 1707 1988 1989 1990 1419 1420 1421 942 943 944 945 1065 1066 1067 1068 986 987 988 989 1081 1082 1083 1084 1841 1842 1843 1844 2221 2222 2223 2224 1991 1992 1993 1994 2277 2278 2279 2280 753 754 755 990 991 992 949 950 951 993 994 995 1422 1423 1424 1995 1996 1997 1848 1849 1850 1998 1999 2000 1851 1852 1853 2225 2226 2227 2001 2002 2003 2281 2282 2283 1425 1426 1427 2004 2005 2006 1857 1858 1859 2007 2008 2009 765 766 767 1428 1429 1430 1431 1432 1433 1065 1066 1067 1068 1069 1070 1071 1072 1081 1082 1083 1084 1085 1086 1087 1088 2221 2222 2223 2224 2228 2229 2230 2231 2277 2278 2279 2280 2284 2285 2286 2287 990 991 992 999 1000 1001 958 959 960 1002 1003 1004 1995 1996 1997 2010 2011 2012 1863 1864 1865 2013 2014 2015 2225 2226 2227 2232 2233 2234 2281 2282 2283 2288 2289 2290 2004 2005 2006 2016 2017 2018 1869 1870 1871 2019 2020 2021 774 775 776 1434 1435 1436 1437 1438 1439 986 987 988 989 1081 1082 1083 1084 1960 1961 1962 1963 2263 2264 2265 2266 1991 1992 1993 1994 2277 2278 2279 2280 1440 1441 1442 1443 2022 2023 2024 2025 1964 1965 1966 2267 2268 2269 993 994 995 1967 1968 1969 1444 1445 1446 2026 2027 2028 1998 1999 2000 1447 1448 1449 2001 2002 2003 2281 2282 2283 1450 1451 1452 2029 2030 2031 1453 1454 1455 2032 2033 2034 2007 2008 2009 1456 1457 1458 1976 1977 1978 1459 1460 1461 1462 1463 1464 1081 1082 1083 1084 1085 1086 1087 1088 2263 2264 2265 2266 2270 2271 2272 2273 2277 2278 2279 2280 2284 2285 2286 2287 2022 2023 2024 2025 2035 2036 2037 2038 2267 2268 2269 2274 2275 2276 1002 1003 1004 1979 1980 1981 2026 2027 2028 2039 2040 2041 2013 2014 2015 1465 1466 1467 2281 2282 2283 2288 2289 2290 2029 2030 2031 2042 2043 2044 2032 2033 2034 2045 2046 2047 2019 2020 2021 1468 1469 1470 1988 1989 1990 1471 1472 1473 1474 1475 1476 398 399 400 401 1029 1030 1031 1032 1045 1046 1047 1048 1053 1054 1055 1056 1069 1070 1071 1072 1077 1078 1079 1080 1085 1086 1087 1088 1089 1090 1091 1092 881 882 883 903 904 905 832 833 834 906 907 908 999 1000 1001 1008 1009 1010 980 981 982 1011 1012 1013 961 962 963 983 984 985 1005 1006 1007 1014 1015 1016 768 769 770 777 778 779 747 748 749 780 781 782 662 663 664 783 784 785 510 511 512 1029 1030 1031 1032 2144 2145 2146 2147 1053 1054 1055 1056 2193 2194 2195 2196 1077 1078 1079 1080 2242 2243 2244 2245 1089 1090 1091 1092 2291 2292 2293 2294 903 904 905 1759 1760 1761 2148 2149 2150 2197 2198 2199 1008 1009 1010 2048 2049 2050 2246 2247 2248 2295 2296 2297 983 984 985 1894 1895 1896 1014 1015 1016 2051 2052 2053 777 778 779 1477 1478 1479 1897 1898 1899 2054 2055 2056 1768 1769 1770 2057 2058 2059 1480 1481 1482 1045 1046 1047 1048 1053 1054 1055 1056 2172 2173 2174 2175 2200 2201 2202 2203 1085 1086 1087 1088 1089 1090 1091 1092 2270 2271 2272 2273 2298 2299 2300 2301 2176 2177 2178 2204 2205 2206 906 907 908 1771 1772 1773 2274 2275 2276 2302 2303 2304 1011 1012 1013 2060 2061 2062 1005 1006 1007 1014 1015 1016 1982 1983 1984 2063 2064 2065 1985 1986 1987 2066 2067 2068 780 781 782 1483 1484 1485 1780 1781 1782 2069 2070 2071 1486 1487 1488 1053 1054 1055 1056 2193 2194 2195 2196 2200 2201 2202 2203 1783 1784 1785 1786 1089 1090 1091 1092 2291 2292 2293 2294 2298 2299 2300 2301 2072 2073 2074 2075 2204 2205 2206 1787 1788 1789 2197 2198 2199 1790 1791 1792 2302 2303 2304 2076 2077 2078 2295 2296 2297 2079 2080 2081 1014 1015 1016 2051 2052 2053 2063 2064 2065 1489 1490 1491 2066 2067 2068 1492 1493 1494 2054 2055 2056 1495 1496 1497 1793 1794 1795 2082 2083 2084 1498 1499 1500 1069 1070 1071 1072 1077 1078 1079 1080 1085 1086 1087 1088 1089 1090 1091 1092 2228 2229 2230 2231 2256 2257 2258 2259 2284 2285 2286 2287 2305 2306 2307 2308 999 1000 1001 1008 1009 1010 980 981 982 1011 1012 1013 2010 2011 2012 2085 2086 2087 1938 1939 1940 2088 2089 2090 2232 2233 2234 2260 2261 2262 2288 2289 2290 2309 2310 2311 2016 2017 2018 2091 2092 2093 1944 1945 1946 2094 2095 2096 783 784 785 1501 1502 1503 1504 1505 1506 1077 1078 1079 1080 2242 2243 2244 2245 1089 1090 1091 1092 2291 2292 2293 2294 2256 2257 2258 2259 1947 1948 1949 1950 2305 2306 2307 2308 2097 2098 2099 2100 1008 1009 1010 2048 2049 2050 2246 2247 2248 2295 2296 2297 2085 2086 2087 1507 1508 1509 1951 1952 1953 2101 2102 2103 2260 2261 2262 1954 1955 1956 2309 2310 2311 2104 2105 2106 2091 2092 2093 1510 1511 1512 1957 1958 1959 2107 2108 2109 2057 2058 2059 1513 1514 1515 1516 1517 1518 1085 1086 1087 1088 1089 1090 1091 1092 2270 2271 2272 2273 2298 2299 2300 2301 2284 2285 2286 2287 2305 2306 2307 2308 2035 2036 2037 2038 2110 2111 2112 2113 2274 2275 2276 2302 2303 2304 1011 1012 1013 2060 2061 2062 2039 2040 2041 2114 2115 2116 2088 2089 2090 1519 1520 1521 2288 2289 2290 2309 2310 2311 2042 2043 2044 2117 2118 2119 2045 2046 2047 2120 2121 2122 2094 2095 2096 1522 1523 1524 2069 2070 2071 1525 1526 1527 1528 1529 1530 1089 1090 1091 1092 2291 2292 2293 2294 2298 2299 2300 2301 2072 2073 2074 2075 2305 2306 2307 2308 2097 2098 2099 2100 2110 2111 2112 2113 1531 1532 1533 1534 2302 2303 2304 2076 2077 2078 2295 2296 2297 2079 2080 2081 2114 2115 2116 1535 1536 1537 2101 2102 2103 1538 1539 1540 2309 2310 2311 2104 2105 2106 2117 2118 2119 1541 1542 1543 2120 2121 2122 1544 1545 1546 2107 2108 2109 1547 1548 1549 2082 2083 2084 1550 1551 1552 1553 1554 1555 192 0 22 23 24 98 99 100 110 111 112 116 117 118 128 129 130 134 135 136 140 141 142 143 144 145 411 412 413 1115 1116 1117 417 418 419 1127 1128 1129 423 424 425 1139 1140 1141 426 427 428 1145 1146 1147 438 439 440 444 445 446 1170 1171 1172 1182 1183 1184 450 451 452 453 454 455 1194 1195 1196 1200 1201 1202 459 460 461 1212 1213 1214 1224 1225 1226 1249 1250 1251 462 463 464 1255 1256 1257 1261 1262 1263 1273 1274 1275 474 475 476 480 481 482 486 487 488 489 490 491 1298 1299 1300 1310 1311 1312 1322 1323 1324 1328 1329 1330 495 496 497 1340 1341 1342 498 499 500 1346 1347 1348 1358 1359 1360 1383 1384 1385 1389 1390 1391 1401 1402 1403 504 505 506 507 508 509 1413 1414 1415 1419 1420 1421 1431 1432 1433 1437 1438 1439 1462 1463 1464 1474 1475 1476 510 511 512 1480 1481 1482 1486 1487 1488 1498 1499 1500 1504 1505 1506 1516 1517 1518 1528 1529 1530 1553 1554 1555 0 0 0 14 1 0
-3 0 0 1098 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 7 8 9 89 90 91 402 403 404 1100 1101 1102 4 5 6 101 102 103 429 430 431 1152 1153 1154 10 11 12 119 120 121 465 466 467 1286 1287 1288 1097 1098 1099 1118 1119 1120 1203 1204 1205 1231 1232 1233 1103 1104 1105 1130 1131 1132 1331 1332 1333 1371 1372 1373 1155 1156 1157 1173 1174 1175 1215 1216 1217 1234 1235 1236 1158 1159 1160 1185 1186 1187 1404 1405 1406 1450 1451 1452 1237 1238 1239 1264 1265 1266 1489 1490 1491 1541 1542 1543 1283 1284 1285 1301 1302 1303 1349 1350 1351 1368 1369 1370 1280 1281 1282 1313 1314 1315 1422 1423 1424 1444 1445 1446 1365 1366 1367 1392 1393 1394 1507 1508 1509 1535 1536 1537 1447 1448 1449 1465 1466 1467 1519 1520 1521 1538 1539 1540 218 219 220 236 237 238 553 554 555 1608 1609 1610 159 160 161 239 240 241 693 694 695 1832 1833 1834 150 151 152 196 197 198 602 603 604 1662 1663 1664 178 179 180 199 200 201 541 542 543 1586 1587 1588 184 185 186 254 255 256 708 709 710 1851 1852 1853 215 216 217 251 252 253 617 618 619 1681 1682 1683 1592 1593 1594 1623 1624 1625 1894 1895 1896 1954 1955 1956 1605 1606 1607 1620 1621 1622 1759 1760 1761 1787 1788 1789 1684 1685 1686 1696 1697 1698 1771 1772 1773 1790 1791 1792 1668 1669 1670 1699 1700 1701 1982 1983 1984 2042 2043 2044 1826 1827 1828 1860 1861 1862 2010 2011 2012 2039 2040 2041 1848 1849 1850 1863 1864 1865 1938 1939 1940 1951 1952 1953 961 962 963 2232 2233 2234 319 320 321 371 372 373 832 833 834 2148 2149 2150 359 360 361 368 369 370 881 882 883 2176 2177 2178 343 344 345 365 366 367 46 47 48 156 157 158 49 50 51 221 222 223 672 673 674 690 691 692 675 676 677 1810 1811 1812 523 524 525 1570 1571 1572 526 527 528 556 557 558 729 730 731 1879 1880 1881 732 733 734 1913 1914 1915 37 38 39 175 176 177 40 41 42 153 154 155 517 518 519 538 539 540 520 521 522 1564 1565 1566 581 582 583 1640 1641 1642 584 585 586 605 606 607 641 642 643 1731 1732 1733 644 645 646 1712 1713 1714 52 53 54 224 225 226 43 44 45 181 182 183 590 591 592 620 621 622 587 588 589 1643 1644 1645 678 679 680 1813 1814 1815 669 670 671 705 706 707 756 757 758 2001 2002 2003 753 754 755 1964 1965 1966 1573 1574 1575 1611 1612 1613 1567 1568 1569 1589 1590 1591 1718 1719 1720 1762 1763 1764 1715 1716 1717 1750 1751 1752 1882 1883 1884 1929 1930 1931 1876 1877 1878 1891 1892 1893 2051 2052 2053 2104 2105 2106 2048 2049 2050 2076 2077 2078 1646 1647 1648 1665 1666 1667 1649 1650 1651 1687 1688 1689 1967 1968 1969 1979 1980 1981 1970 1971 1972 2029 2030 2031 1734 1735 1736 1753 1754 1755 1737 1738 1739 1774 1775 1776 2060 2061 2062 2079 2080 2081 2063 2064 2065 2117 2118 2119 1804 1805 1806 1845 1846 1847 1807 1808 1809 1829 1830 1831 1907 1908 1909 1935 1936 1937 1910 1911 1912 1926 1927 1928 1995 1996 1997 2026 2027 2028 1998 1999 2000 2013 2014 2015 2085 2086 2087 2114 2115 2116 2088 2089 2090 2101 2102 2103 903 904 905 2204 2205 2206 906 907 908 2197 2198 2199 872 873 874 2169 2170 2171 875 876 877 884 885 886 820 821 822 829 830 831 823 824 825 2141 2142 2143 330 331 332 356 357 358 333 334 335 346 347 348 980 981 982 2246 2247 2248 983 984 985 2260 2261 2262 810 811 812 2134 2135 2136 813 814 815 835 836 837 949 950 951 958 959 960 952 953 954 2225 2226 2227 303 304 305 316 317 318 306 307 308 362 363 364 1005 1006 1007 2288 2289 2290 999 1000 1001 2274 2275 2276 939 940 941 2218 2219 2220 933 934 935 955 956 957 865 866 867 887 888 889 859 860 861 2162 2163 2164 289 290 291 349 350 351 283 284 285 313 314 315 2309 2310 2311 1014 1015 1016 2295 2296 2297 1011 1012 1013 2302 2303 2304 1008 1009 1010 2281 2282 2283 996 997 998 1002 1003 1004 993 994 995 2267 2268 2269 990 991 992 2253 2254 2255 974 975 976 2239 2240 2241 971 972 973 977 978 979 968 969 970 2211 2212 2213 926 927 928 936 937 938 923 924 925 946 947 948 920 921 922 909 910 911 900 901 902 2183 2184 2185 897 898 899 2190 2191 2192 894 895 896 878 879 880 852 853 854 862 863 864 849 850 851 2155 2156 2157 846 847 848 826 827 828 800 801 802 2127 2128 2129 797 798 799 807 808 809 794 795 796 336 337 338 82 83 84 286 287 288 79 80 81 300 301 302 76 77 78 0 0 846 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 16 17 18 125 126 127 92 93 94 131 132 133 471 472 473 1292 1293 1294 477 478 479 1304 1305 1306 405 406 407 420 421 422 1109 1110 1111 1136 1137 1138 492 493 494 1352 1353 1354 1337 1338 1339 1377 1378 1379 19 20 21 95 96 97 107 108 109 113 114 115 408 409 410 1112 1113 1114 414 415 416 1124 1125 1126 435 436 437 441 442 443 1167 1168 1169 1179 1180 1181 456 457 458 1209 1210 1211 1221 1222 1223 1246 1247 1248 13 14 15 104 105 106 122 123 124 137 138 139 432 433 434 1161 1162 1163 447 448 449 1188 1189 1190 468 469 470 483 484 485 1289 1290 1291 1316 1317 1318 501 502 503 1407 1408 1409 1425 1426 1427 1453 1454 1455 1106 1107 1108 1121 1122 1123 1133 1134 1135 1142 1143 1144 1206 1207 1208 1240 1241 1242 1252 1253 1254 1267 1268 1269 1334 1335 1336 1343 1344 1345 1374 1375 1376 1395 1396 1397 1477 1478 1479 1492 1493 1494 1510 1511 1512 1544 1545 1546 1164 1165 1166 1191 1192 1193 1176 1177 1178 1197 1198 1199 1410 1411 1412 1456 1457 1458 1416 1417 1418 1468 1469 1470 1218 1219 1220 1258 1259 1260 1243 1244 1245 1270 1271 1272 1483 1484 1485 1522 1523 1524 1495 1496 1497 1547 1548 1549 1295 1296 1297 1307 1308 1309 1319 1320 1321 1325 1326 1327 1355 1356 1357 1380 1381 1382 1386 1387 1388 1398 1399 1400 1428 1429 1430 1434 1435 1436 1459 1460 1461 1471 1472 1473 1501 1502 1503 1513 1514 1515 1525 1526 1527 1550 1551 1552 662 663 664 1768 1769 1770 1780 1781 1782 1793 1794 1795 629 630 631 638 639 640 1693 1694 1695 1705 1706 1707 565 566 567 1617 1618 1619 574 575 576 1629 1630 1631 233 234 235 248 249 250 263 264 265 272 273 274 747 748 749 1944 1945 1946 1897 1898 1899 1957 1958 1959 547 548 549 571 572 573 1595 1596 1597 1626 1627 1628 714 715 716 1857 1858 1859 723 724 725 1869 1870 1871 190 191 192 260 261 262 205 206 207 269 270 271 768 769 770 1985 1986 1987 2016 2017 2018 2045 2046 2047 696 697 698 720 721 722 1835 1836 1837 1866 1867 1868 608 609 610 1671 1672 1673 632 633 634 1702 1703 1704 162 163 164 202 203 204 242 243 244 266 267 268 2082 2083 2084 2069 2070 2071 2057 2058 2059 783 784 785 2107 2108 2109 2054 2055 2056 2094 2095 2096 780 781 782 2120 2121 2122 2091 2092 2093 2066 2067 2068 777 778 779 1988 1989 1990 1976 1977 1978 774 775 776 765 766 767 2019 2020 2021 771 772 773 2007 2008 2009 762 763 764 2032 2033 2034 2004 2005 2006 1973 1974 1975 759 760 761 1900 1901 1902 750 751 752 1888 1889 1890 741 742 743 1932 1933 1934 1885 1886 1887 1919 1920 1921 738 739 740 1941 1942 1943 1916 1917 1918 744 745 746 735 736 737 726 727 728 717 718 719 702 703 704 687 688 689 1838 1839 1840 699 700 701 1819 1820 1821 684 685 686 1854 1855 1856 1816 1817 1818 711 712 713 681 682 683 1756 1757 1758 1743 1744 1745 1724 1725 1726 653 654 655 1765 1766 1767 1721 1722 1723 659 660 661 650 651 652 1777 1778 1779 656 657 658 1740 1741 1742 647 648 649 1674 1675 1676 1655 1656 1657 614 615 616 599 600 601 635 636 637 611 612 613 626 627 628 596 597 598 1690 1691 1692 623 624 625 1652 1653 1654 593 594 595 1598 1599 1600 550 551 552 1579 1580 1581 535 536 537 1614 1615 1616 1576 1577 1578 562 563 564 532 533 534 568 569 570 559 560 561 544 545 546 529 530 531 208 209 210 193 194 195 168 169 170 61 62 63 245 246 247 165 166 167 230 231 232 58 59 60 257 258 259 227 228 229 187 188 189 55 56 57 73 36 FESystem<3>[FE_Q<3>(2)^3-FE_Q<3>(1)] 23 Policy::Sequential<3,3>
+DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2312 2312 0 0 0 0 1 0 0 0 0 2312 0 1 2312 0 1 0 2312 0 0 1 0 1 0 0 2312 0 1 2312 0 0 0 3 0 0 0 4 500 0 0 1 2 3 1093 1094 1095 1096 1148 1149 1150 1151 1227 1228 1229 1230 1276 1277 1278 1279 1361 1362 1363 1364 1440 1441 1442 1443 1531 1532 1533 1534 146 147 148 149 171 172 173 174 211 212 213 214 1582 1583 1584 1585 1601 1602 1603 1604 1658 1659 1660 1661 1677 1678 1679 1680 1783 1784 1785 1786 1822 1823 1824 1825 1841 1842 1843 1844 1947 1948 1949 1950 2035 2036 2037 2038 339 340 341 342 309 310 311 312 352 353 354 355 2144 2145 2146 2147 2172 2173 2174 2175 2228 2229 2230 2231 398 399 400 401 25 26 27 28 513 514 515 516 29 30 31 32 577 578 579 580 33 34 35 36 665 666 667 668 1556 1557 1558 1559 1708 1709 1710 1711 1560 1561 1562 1563 1872 1873 1874 1875 1632 1633 1634 1635 1727 1728 1729 1730 1636 1637 1638 1639 1960 1961 1962 1963 1746 1747 1748 1749 2072 2073 2074 2075 1796 1797 1798 1799 1903 1904 1905 1906 1800 1801 1802 1803 1991 1992 1993 1994 1922 1923 1924 1925 2097 2098 2099 2100 2022 2023 2024 2025 2110 2111 2112 2113 322 323 324 325 816 817 818 819 279 280 281 282 929 930 931 932 275 276 277 278 855 856 857 858 292 293 294 295 803 804 805 806 296 297 298 299 942 943 944 945 326 327 328 329 868 869 870 871 2130 2131 2132 2133 2242 2243 2244 2245 2137 2138 2139 2140 2193 2194 2195 2196 2165 2166 2167 2168 2200 2201 2202 2203 2158 2159 2160 2161 2270 2271 2272 2273 2214 2215 2216 2217 2284 2285 2286 2287 2221 2222 2223 2224 2256 2257 2258 2259 1069 1070 1071 1072 382 383 384 385 1029 1030 1031 1032 394 395 396 397 1045 1046 1047 1048 390 391 392 393 68 69 70 71 912 913 914 915 790 791 792 793 964 965 966 967 64 65 66 67 786 787 788 789 838 839 840 841 890 891 892 893 72 73 74 75 842 843 844 845 916 917 918 919 986 987 988 989 2123 2124 2125 2126 2179 2180 2181 2182 2235 2236 2237 2238 2291 2292 2293 2294 2151 2152 2153 2154 2263 2264 2265 2266 2186 2187 2188 2189 2298 2299 2300 2301 2207 2208 2209 2210 2249 2250 2251 2252 2277 2278 2279 2280 2305 2306 2307 2308 1053 1054 1055 1056 1041 1042 1043 1044 1025 1026 1027 1028 386 387 388 389 1077 1078 1079 1080 1021 1022 1023 1024 1065 1066 1067 1068 378 379 380 381 1085 1086 1087 1088 1061 1062 1063 1064 1037 1038 1039 1040 374 375 376 377 85 86 87 88 1017 1018 1019 1020 1033 1034 1035 1036 1049 1050 1051 1052 1057 1058 1059 1060 1073 1074 1075 1076 1081 1082 1083 1084 1089 1090 1091 1092 1098 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 7 8 9 89 90 91 402 403 404 1100 1101 1102 4 5 6 101 102 103 429 430 431 1152 1153 1154 10 11 12 119 120 121 465 466 467 1286 1287 1288 1097 1098 1099 1118 1119 1120 1203 1204 1205 1231 1232 1233 1103 1104 1105 1130 1131 1132 1331 1332 1333 1371 1372 1373 1155 1156 1157 1173 1174 1175 1215 1216 1217 1234 1235 1236 1158 1159 1160 1185 1186 1187 1404 1405 1406 1450 1451 1452 1237 1238 1239 1264 1265 1266 1489 1490 1491 1541 1542 1543 1283 1284 1285 1301 1302 1303 1349 1350 1351 1368 1369 1370 1280 1281 1282 1313 1314 1315 1422 1423 1424 1444 1445 1446 1365 1366 1367 1392 1393 1394 1507 1508 1509 1535 1536 1537 1447 1448 1449 1465 1466 1467 1519 1520 1521 1538 1539 1540 218 219 220 236 237 238 553 554 555 1608 1609 1610 159 160 161 239 240 241 693 694 695 1832 1833 1834 150 151 152 196 197 198 602 603 604 1662 1663 1664 178 179 180 199 200 201 541 542 543 1586 1587 1588 184 185 186 254 255 256 708 709 710 1851 1852 1853 215 216 217 251 252 253 617 618 619 1681 1682 1683 1592 1593 1594 1623 1624 1625 1894 1895 1896 1954 1955 1956 1605 1606 1607 1620 1621 1622 1759 1760 1761 1787 1788 1789 1684 1685 1686 1696 1697 1698 1771 1772 1773 1790 1791 1792 1668 1669 1670 1699 1700 1701 1982 1983 1984 2042 2043 2044 1826 1827 1828 1860 1861 1862 2010 2011 2012 2039 2040 2041 1848 1849 1850 1863 1864 1865 1938 1939 1940 1951 1952 1953 961 962 963 2232 2233 2234 319 320 321 371 372 373 832 833 834 2148 2149 2150 359 360 361 368 369 370 881 882 883 2176 2177 2178 343 344 345 365 366 367 46 47 48 156 157 158 49 50 51 221 222 223 672 673 674 690 691 692 675 676 677 1810 1811 1812 523 524 525 1570 1571 1572 526 527 528 556 557 558 729 730 731 1879 1880 1881 732 733 734 1913 1914 1915 37 38 39 175 176 177 40 41 42 153 154 155 517 518 519 538 539 540 520 521 522 1564 1565 1566 581 582 583 1640 1641 1642 584 585 586 605 606 607 641 642 643 1731 1732 1733 644 645 646 1712 1713 1714 52 53 54 224 225 226 43 44 45 181 182 183 590 591 592 620 621 622 587 588 589 1643 1644 1645 678 679 680 1813 1814 1815 669 670 671 705 706 707 756 757 758 2001 2002 2003 753 754 755 1964 1965 1966 1573 1574 1575 1611 1612 1613 1567 1568 1569 1589 1590 1591 1718 1719 1720 1762 1763 1764 1715 1716 1717 1750 1751 1752 1882 1883 1884 1929 1930 1931 1876 1877 1878 1891 1892 1893 2051 2052 2053 2104 2105 2106 2048 2049 2050 2076 2077 2078 1646 1647 1648 1665 1666 1667 1649 1650 1651 1687 1688 1689 1967 1968 1969 1979 1980 1981 1970 1971 1972 2029 2030 2031 1734 1735 1736 1753 1754 1755 1737 1738 1739 1774 1775 1776 2060 2061 2062 2079 2080 2081 2063 2064 2065 2117 2118 2119 1804 1805 1806 1845 1846 1847 1807 1808 1809 1829 1830 1831 1907 1908 1909 1935 1936 1937 1910 1911 1912 1926 1927 1928 1995 1996 1997 2026 2027 2028 1998 1999 2000 2013 2014 2015 2085 2086 2087 2114 2115 2116 2088 2089 2090 2101 2102 2103 903 904 905 2204 2205 2206 906 907 908 2197 2198 2199 872 873 874 2169 2170 2171 875 876 877 884 885 886 820 821 822 829 830 831 823 824 825 2141 2142 2143 330 331 332 356 357 358 333 334 335 346 347 348 980 981 982 2246 2247 2248 983 984 985 2260 2261 2262 810 811 812 2134 2135 2136 813 814 815 835 836 837 949 950 951 958 959 960 952 953 954 2225 2226 2227 303 304 305 316 317 318 306 307 308 362 363 364 1005 1006 1007 2288 2289 2290 999 1000 1001 2274 2275 2276 939 940 941 2218 2219 2220 933 934 935 955 956 957 865 866 867 887 888 889 859 860 861 2162 2163 2164 289 290 291 349 350 351 283 284 285 313 314 315 2309 2310 2311 1014 1015 1016 2295 2296 2297 1011 1012 1013 2302 2303 2304 1008 1009 1010 2281 2282 2283 996 997 998 1002 1003 1004 993 994 995 2267 2268 2269 990 991 992 2253 2254 2255 974 975 976 2239 2240 2241 971 972 973 977 978 979 968 969 970 2211 2212 2213 926 927 928 936 937 938 923 924 925 946 947 948 920 921 922 909 910 911 900 901 902 2183 2184 2185 897 898 899 2190 2191 2192 894 895 896 878 879 880 852 853 854 862 863 864 849 850 851 2155 2156 2157 846 847 848 826 827 828 800 801 802 2127 2128 2129 797 798 799 807 808 809 794 795 796 336 337 338 82 83 84 286 287 288 79 80 81 300 301 302 76 77 78 846 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 16 17 18 125 126 127 92 93 94 131 132 133 471 472 473 1292 1293 1294 477 478 479 1304 1305 1306 405 406 407 420 421 422 1109 1110 1111 1136 1137 1138 492 493 494 1352 1353 1354 1337 1338 1339 1377 1378 1379 19 20 21 95 96 97 107 108 109 113 114 115 408 409 410 1112 1113 1114 414 415 416 1124 1125 1126 435 436 437 441 442 443 1167 1168 1169 1179 1180 1181 456 457 458 1209 1210 1211 1221 1222 1223 1246 1247 1248 13 14 15 104 105 106 122 123 124 137 138 139 432 433 434 1161 1162 1163 447 448 449 1188 1189 1190 468 469 470 483 484 485 1289 1290 1291 1316 1317 1318 501 502 503 1407 1408 1409 1425 1426 1427 1453 1454 1455 1106 1107 1108 1121 1122 1123 1133 1134 1135 1142 1143 1144 1206 1207 1208 1240 1241 1242 1252 1253 1254 1267 1268 1269 1334 1335 1336 1343 1344 1345 1374 1375 1376 1395 1396 1397 1477 1478 1479 1492 1493 1494 1510 1511 1512 1544 1545 1546 1164 1165 1166 1191 1192 1193 1176 1177 1178 1197 1198 1199 1410 1411 1412 1456 1457 1458 1416 1417 1418 1468 1469 1470 1218 1219 1220 1258 1259 1260 1243 1244 1245 1270 1271 1272 1483 1484 1485 1522 1523 1524 1495 1496 1497 1547 1548 1549 1295 1296 1297 1307 1308 1309 1319 1320 1321 1325 1326 1327 1355 1356 1357 1380 1381 1382 1386 1387 1388 1398 1399 1400 1428 1429 1430 1434 1435 1436 1459 1460 1461 1471 1472 1473 1501 1502 1503 1513 1514 1515 1525 1526 1527 1550 1551 1552 662 663 664 1768 1769 1770 1780 1781 1782 1793 1794 1795 629 630 631 638 639 640 1693 1694 1695 1705 1706 1707 565 566 567 1617 1618 1619 574 575 576 1629 1630 1631 233 234 235 248 249 250 263 264 265 272 273 274 747 748 749 1944 1945 1946 1897 1898 1899 1957 1958 1959 547 548 549 571 572 573 1595 1596 1597 1626 1627 1628 714 715 716 1857 1858 1859 723 724 725 1869 1870 1871 190 191 192 260 261 262 205 206 207 269 270 271 768 769 770 1985 1986 1987 2016 2017 2018 2045 2046 2047 696 697 698 720 721 722 1835 1836 1837 1866 1867 1868 608 609 610 1671 1672 1673 632 633 634 1702 1703 1704 162 163 164 202 203 204 242 243 244 266 267 268 2082 2083 2084 2069 2070 2071 2057 2058 2059 783 784 785 2107 2108 2109 2054 2055 2056 2094 2095 2096 780 781 782 2120 2121 2122 2091 2092 2093 2066 2067 2068 777 778 779 1988 1989 1990 1976 1977 1978 774 775 776 765 766 767 2019 2020 2021 771 772 773 2007 2008 2009 762 763 764 2032 2033 2034 2004 2005 2006 1973 1974 1975 759 760 761 1900 1901 1902 750 751 752 1888 1889 1890 741 742 743 1932 1933 1934 1885 1886 1887 1919 1920 1921 738 739 740 1941 1942 1943 1916 1917 1918 744 745 746 735 736 737 726 727 728 717 718 719 702 703 704 687 688 689 1838 1839 1840 699 700 701 1819 1820 1821 684 685 686 1854 1855 1856 1816 1817 1818 711 712 713 681 682 683 1756 1757 1758 1743 1744 1745 1724 1725 1726 653 654 655 1765 1766 1767 1721 1722 1723 659 660 661 650 651 652 1777 1778 1779 656 657 658 1740 1741 1742 647 648 649 1674 1675 1676 1655 1656 1657 614 615 616 599 600 601 635 636 637 611 612 613 626 627 628 596 597 598 1690 1691 1692 623 624 625 1652 1653 1654 593 594 595 1598 1599 1600 550 551 552 1579 1580 1581 535 536 537 1614 1615 1616 1576 1577 1578 562 563 564 532 533 534 568 569 570 559 560 561 544 545 546 529 530 531 208 209 210 193 194 195 168 169 170 61 62 63 245 246 247 165 166 167 230 231 232 58 59 60 257 258 259 227 228 229 187 188 189 55 56 57 3 0 4294967295 4294967295 4294967295 4 0 0 0 0 0 0 24 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4 0 0 0 0 0 0 192 0 22 23 24 98 99 100 110 111 112 116 117 118 128 129 130 134 135 136 140 141 142 143 144 145 411 412 413 1115 1116 1117 417 418 419 1127 1128 1129 423 424 425 1139 1140 1141 426 427 428 1145 1146 1147 438 439 440 444 445 446 1170 1171 1172 1182 1183 1184 450 451 452 453 454 455 1194 1195 1196 1200 1201 1202 459 460 461 1212 1213 1214 1224 1225 1226 1249 1250 1251 462 463 464 1255 1256 1257 1261 1262 1263 1273 1274 1275 474 475 476 480 481 482 486 487 488 489 490 491 1298 1299 1300 1310 1311 1312 1322 1323 1324 1328 1329 1330 495 496 497 1340 1341 1342 498 499 500 1346 1347 1348 1358 1359 1360 1383 1384 1385 1389 1390 1391 1401 1402 1403 504 505 506 507 508 509 1413 1414 1415 1419 1420 1421 1431 1432 1433 1437 1438 1439 1462 1463 1464 1474 1475 1476 510 511 512 1480 1481 1482 1486 1487 1488 1498 1499 1500 1504 1505 1506 1516 1517 1518 1528 1529 1530 1553 1554 1555 3 0 4 0 0 367 0 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 945 948 951 954 957 960 963 966 969 972 975 978 981 984 987 990 993 996 999 1002 1005 1008 1011 1014 1017 1020 1023 1026 1029 1032 1035 1038 1041 1044 1047 1050 1053 1056 1059 1062 1065 1068 1071 1074 1077 1080 1083 1086 1089 1092 1095 1098 283 0 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 2 0 0 3 4 0 0 0 0 0 0 9 0 0 3 6 9 12 15 18 21 24 4 0 0 0 0 0 0 65 0 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 0 0 3 0 89 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 712 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 5696 0 0 1 2 3 25 26 27 28 29 30 31 32 64 65 66 67 33 34 35 36 68 69 70 71 72 73 74 75 85 86 87 88 4 5 6 37 38 39 7 8 9 40 41 42 43 44 45 76 77 78 46 47 48 79 80 81 10 11 12 49 50 51 52 53 54 82 83 84 13 14 15 55 56 57 16 17 18 58 59 60 19 20 21 61 62 63 22 23 24 25 26 27 28 146 147 148 149 64 65 66 67 275 276 277 278 68 69 70 71 279 280 281 282 85 86 87 88 374 375 376 377 37 38 39 150 151 152 89 90 91 153 154 155 76 77 78 283 284 285 156 157 158 286 287 288 49 50 51 159 160 161 82 83 84 289 290 291 55 56 57 162 163 164 92 93 94 165 166 167 95 96 97 168 169 170 98 99 100 29 30 31 32 64 65 66 67 171 172 173 174 292 293 294 295 72 73 74 75 85 86 87 88 296 297 298 299 378 379 380 381 101 102 103 175 176 177 40 41 42 178 179 180 181 182 183 300 301 302 79 80 81 303 304 305 52 53 54 82 83 84 184 185 186 306 307 308 104 105 106 187 188 189 58 59 60 190 191 192 107 108 109 193 194 195 110 111 112 64 65 66 67 275 276 277 278 292 293 294 295 309 310 311 312 85 86 87 88 374 375 376 377 378 379 380 381 382 383 384 385 175 176 177 196 197 198 153 154 155 199 200 201 300 301 302 313 314 315 286 287 288 316 317 318 82 83 84 289 290 291 306 307 308 319 320 321 187 188 189 202 203 204 165 166 167 205 206 207 113 114 115 208 209 210 116 117 118 33 34 35 36 68 69 70 71 72 73 74 75 85 86 87 88 211 212 213 214 322 323 324 325 326 327 328 329 386 387 388 389 43 44 45 76 77 78 46 47 48 79 80 81 215 216 217 330 331 332 218 219 220 333 334 335 119 120 121 221 222 223 224 225 226 336 337 338 122 123 124 227 228 229 125 126 127 230 231 232 61 62 63 233 234 235 128 129 130 68 69 70 71 279 280 281 282 85 86 87 88 374 375 376 377 322 323 324 325 339 340 341 342 386 387 388 389 390 391 392 393 76 77 78 283 284 285 156 157 158 286 287 288 330 331 332 343 344 345 236 237 238 346 347 348 221 222 223 239 240 241 336 337 338 349 350 351 227 228 229 242 243 244 131 132 133 245 246 247 168 169 170 248 249 250 134 135 136 72 73 74 75 85 86 87 88 296 297 298 299 378 379 380 381 326 327 328 329 386 387 388 389 352 353 354 355 394 395 396 397 181 182 183 300 301 302 79 80 81 303 304 305 251 252 253 356 357 358 333 334 335 359 360 361 224 225 226 336 337 338 254 255 256 362 363 364 137 138 139 257 258 259 230 231 232 260 261 262 193 194 195 263 264 265 140 141 142 85 86 87 88 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 300 301 302 313 314 315 286 287 288 316 317 318 356 357 358 365 366 367 346 347 348 368 369 370 336 337 338 349 350 351 362 363 364 371 372 373 257 258 259 266 267 268 245 246 247 269 270 271 208 209 210 272 273 274 143 144 145 146 147 148 149 513 514 515 516 275 276 277 278 786 787 788 789 279 280 281 282 790 791 792 793 374 375 376 377 1017 1018 1019 1020 150 151 152 517 518 519 402 403 404 520 521 522 283 284 285 794 795 796 523 524 525 797 798 799 159 160 161 526 527 528 289 290 291 800 801 802 162 163 164 529 530 531 405 406 407 532 533 534 408 409 410 535 536 537 411 412 413 513 514 515 516 1093 1094 1095 1096 786 787 788 789 1556 1557 1558 1559 790 791 792 793 1560 1561 1562 1563 1017 1018 1019 1020 2123 2124 2125 2126 517 518 519 1097 1098 1099 1100 1101 1102 1564 1565 1566 794 795 796 1567 1568 1569 1570 1571 1572 2127 2128 2129 526 527 528 1103 1104 1105 800 801 802 1573 1574 1575 529 530 531 1106 1107 1108 1109 1110 1111 1576 1577 1578 1112 1113 1114 1579 1580 1581 1115 1116 1117 275 276 277 278 786 787 788 789 309 310 311 312 803 804 805 806 374 375 376 377 1017 1018 1019 1020 382 383 384 385 1021 1022 1023 1024 196 197 198 538 539 540 520 521 522 541 542 543 313 314 315 807 808 809 797 798 799 810 811 812 289 290 291 800 801 802 319 320 321 813 814 815 202 203 204 544 545 546 532 533 534 547 548 549 414 415 416 550 551 552 417 418 419 786 787 788 789 1556 1557 1558 1559 803 804 805 806 1582 1583 1584 1585 1017 1018 1019 1020 2123 2124 2125 2126 1021 1022 1023 1024 2130 2131 2132 2133 538 539 540 1118 1119 1120 1564 1565 1566 1586 1587 1588 807 808 809 1589 1590 1591 2127 2128 2129 2134 2135 2136 800 801 802 1573 1574 1575 813 814 815 1592 1593 1594 544 545 546 1121 1122 1123 1576 1577 1578 1595 1596 1597 1124 1125 1126 1598 1599 1600 1127 1128 1129 279 280 281 282 790 791 792 793 374 375 376 377 1017 1018 1019 1020 339 340 341 342 816 817 818 819 390 391 392 393 1025 1026 1027 1028 283 284 285 794 795 796 523 524 525 797 798 799 343 344 345 820 821 822 553 554 555 823 824 825 239 240 241 556 557 558 349 350 351 826 827 828 242 243 244 559 560 561 420 421 422 562 563 564 535 536 537 565 566 567 423 424 425 790 791 792 793 1560 1561 1562 1563 1017 1018 1019 1020 2123 2124 2125 2126 816 817 818 819 1601 1602 1603 1604 1025 1026 1027 1028 2137 2138 2139 2140 794 795 796 1567 1568 1569 1570 1571 1572 2127 2128 2129 820 821 822 1605 1606 1607 1608 1609 1610 2141 2142 2143 556 557 558 1130 1131 1132 826 827 828 1611 1612 1613 559 560 561 1133 1134 1135 1136 1137 1138 1614 1615 1616 1579 1580 1581 1617 1618 1619 1139 1140 1141 374 375 376 377 1017 1018 1019 1020 382 383 384 385 1021 1022 1023 1024 390 391 392 393 1025 1026 1027 1028 398 399 400 401 1029 1030 1031 1032 313 314 315 807 808 809 797 798 799 810 811 812 365 366 367 829 830 831 823 824 825 832 833 834 349 350 351 826 827 828 371 372 373 835 836 837 266 267 268 568 569 570 562 563 564 571 572 573 550 551 552 574 575 576 426 427 428 1017 1018 1019 1020 2123 2124 2125 2126 1021 1022 1023 1024 2130 2131 2132 2133 1025 1026 1027 1028 2137 2138 2139 2140 1029 1030 1031 1032 2144 2145 2146 2147 807 808 809 1589 1590 1591 2127 2128 2129 2134 2135 2136 829 830 831 1620 1621 1622 2141 2142 2143 2148 2149 2150 826 827 828 1611 1612 1613 835 836 837 1623 1624 1625 568 569 570 1142 1143 1144 1614 1615 1616 1626 1627 1628 1598 1599 1600 1629 1630 1631 1145 1146 1147 171 172 173 174 292 293 294 295 577 578 579 580 838 839 840 841 296 297 298 299 378 379 380 381 842 843 844 845 1033 1034 1035 1036 429 430 431 581 582 583 178 179 180 584 585 586 587 588 589 846 847 848 303 304 305 849 850 851 184 185 186 306 307 308 590 591 592 852 853 854 432 433 434 593 594 595 190 191 192 596 597 598 435 436 437 599 600 601 438 439 440 292 293 294 295 309 310 311 312 838 839 840 841 855 856 857 858 378 379 380 381 382 383 384 385 1033 1034 1035 1036 1037 1038 1039 1040 581 582 583 602 603 604 199 200 201 605 606 607 846 847 848 859 860 861 316 317 318 862 863 864 306 307 308 319 320 321 852 853 854 865 866 867 593 594 595 608 609 610 205 206 207 611 612 613 441 442 443 614 615 616 444 445 446 577 578 579 580 838 839 840 841 1148 1149 1150 1151 1632 1633 1634 1635 842 843 844 845 1033 1034 1035 1036 1636 1637 1638 1639 2151 2152 2153 2154 1152 1153 1154 1640 1641 1642 584 585 586 1155 1156 1157 1643 1644 1645 2155 2156 2157 849 850 851 1646 1647 1648 590 591 592 852 853 854 1158 1159 1160 1649 1650 1651 1161 1162 1163 1652 1653 1654 596 597 598 1164 1165 1166 1167 1168 1169 1655 1656 1657 1170 1171 1172 838 839 840 841 855 856 857 858 1632 1633 1634 1635 1658 1659 1660 1661 1033 1034 1035 1036 1037 1038 1039 1040 2151 2152 2153 2154 2158 2159 2160 2161 1640 1641 1642 1662 1663 1664 605 606 607 1173 1174 1175 2155 2156 2157 2162 2163 2164 862 863 864 1665 1666 1667 852 853 854 865 866 867 1649 1650 1651 1668 1669 1670 1652 1653 1654 1671 1672 1673 611 612 613 1176 1177 1178 1179 1180 1181 1674 1675 1676 1182 1183 1184 296 297 298 299 378 379 380 381 842 843 844 845 1033 1034 1035 1036 352 353 354 355 394 395 396 397 868 869 870 871 1041 1042 1043 1044 587 588 589 846 847 848 303 304 305 849 850 851 617 618 619 872 873 874 359 360 361 875 876 877 254 255 256 362 363 364 620 621 622 878 879 880 447 448 449 623 624 625 260 261 262 626 627 628 599 600 601 629 630 631 450 451 452 378 379 380 381 382 383 384 385 1033 1034 1035 1036 1037 1038 1039 1040 394 395 396 397 398 399 400 401 1041 1042 1043 1044 1045 1046 1047 1048 846 847 848 859 860 861 316 317 318 862 863 864 872 873 874 881 882 883 368 369 370 884 885 886 362 363 364 371 372 373 878 879 880 887 888 889 623 624 625 632 633 634 269 270 271 635 636 637 614 615 616 638 639 640 453 454 455 842 843 844 845 1033 1034 1035 1036 1636 1637 1638 1639 2151 2152 2153 2154 868 869 870 871 1041 1042 1043 1044 1677 1678 1679 1680 2165 2166 2167 2168 1643 1644 1645 2155 2156 2157 849 850 851 1646 1647 1648 1681 1682 1683 2169 2170 2171 875 876 877 1684 1685 1686 620 621 622 878 879 880 1185 1186 1187 1687 1688 1689 1188 1189 1190 1690 1691 1692 626 627 628 1191 1192 1193 1655 1656 1657 1693 1694 1695 1194 1195 1196 1033 1034 1035 1036 1037 1038 1039 1040 2151 2152 2153 2154 2158 2159 2160 2161 1041 1042 1043 1044 1045 1046 1047 1048 2165 2166 2167 2168 2172 2173 2174 2175 2155 2156 2157 2162 2163 2164 862 863 864 1665 1666 1667 2169 2170 2171 2176 2177 2178 884 885 886 1696 1697 1698 878 879 880 887 888 889 1687 1688 1689 1699 1700 1701 1690 1691 1692 1702 1703 1704 635 636 637 1197 1198 1199 1674 1675 1676 1705 1706 1707 1200 1201 1202 309 310 311 312 803 804 805 806 855 856 857 858 890 891 892 893 382 383 384 385 1021 1022 1023 1024 1037 1038 1039 1040 1049 1050 1051 1052 602 603 604 641 642 643 541 542 543 644 645 646 859 860 861 894 895 896 810 811 812 897 898 899 319 320 321 813 814 815 865 866 867 900 901 902 608 609 610 647 648 649 547 548 549 650 651 652 456 457 458 653 654 655 459 460 461 803 804 805 806 1582 1583 1584 1585 890 891 892 893 1708 1709 1710 1711 1021 1022 1023 1024 2130 2131 2132 2133 1049 1050 1051 1052 2179 2180 2181 2182 641 642 643 1203 1204 1205 1586 1587 1588 1712 1713 1714 894 895 896 1715 1716 1717 2134 2135 2136 2183 2184 2185 813 814 815 1592 1593 1594 900 901 902 1718 1719 1720 647 648 649 1206 1207 1208 1595 1596 1597 1721 1722 1723 1209 1210 1211 1724 1725 1726 1212 1213 1214 855 856 857 858 890 891 892 893 1658 1659 1660 1661 1727 1728 1729 1730 1037 1038 1039 1040 1049 1050 1051 1052 2158 2159 2160 2161 2186 2187 2188 2189 1662 1663 1664 1731 1732 1733 644 645 646 1215 1216 1217 2162 2163 2164 2190 2191 2192 897 898 899 1734 1735 1736 865 866 867 900 901 902 1668 1669 1670 1737 1738 1739 1671 1672 1673 1740 1741 1742 650 651 652 1218 1219 1220 1221 1222 1223 1743 1744 1745 1224 1225 1226 890 891 892 893 1708 1709 1710 1711 1727 1728 1729 1730 1227 1228 1229 1230 1049 1050 1051 1052 2179 2180 2181 2182 2186 2187 2188 2189 1746 1747 1748 1749 1731 1732 1733 1231 1232 1233 1712 1713 1714 1234 1235 1236 2190 2191 2192 1750 1751 1752 2183 2184 2185 1753 1754 1755 900 901 902 1718 1719 1720 1737 1738 1739 1237 1238 1239 1740 1741 1742 1240 1241 1242 1721 1722 1723 1243 1244 1245 1246 1247 1248 1756 1757 1758 1249 1250 1251 382 383 384 385 1021 1022 1023 1024 1037 1038 1039 1040 1049 1050 1051 1052 398 399 400 401 1029 1030 1031 1032 1045 1046 1047 1048 1053 1054 1055 1056 859 860 861 894 895 896 810 811 812 897 898 899 881 882 883 903 904 905 832 833 834 906 907 908 371 372 373 835 836 837 887 888 889 909 910 911 632 633 634 656 657 658 571 572 573 659 660 661 653 654 655 662 663 664 462 463 464 1021 1022 1023 1024 2130 2131 2132 2133 1049 1050 1051 1052 2179 2180 2181 2182 1029 1030 1031 1032 2144 2145 2146 2147 1053 1054 1055 1056 2193 2194 2195 2196 894 895 896 1715 1716 1717 2134 2135 2136 2183 2184 2185 903 904 905 1759 1760 1761 2148 2149 2150 2197 2198 2199 835 836 837 1623 1624 1625 909 910 911 1762 1763 1764 656 657 658 1252 1253 1254 1626 1627 1628 1765 1766 1767 1724 1725 1726 1768 1769 1770 1255 1256 1257 1037 1038 1039 1040 1049 1050 1051 1052 2158 2159 2160 2161 2186 2187 2188 2189 1045 1046 1047 1048 1053 1054 1055 1056 2172 2173 2174 2175 2200 2201 2202 2203 2162 2163 2164 2190 2191 2192 897 898 899 1734 1735 1736 2176 2177 2178 2204 2205 2206 906 907 908 1771 1772 1773 887 888 889 909 910 911 1699 1700 1701 1774 1775 1776 1702 1703 1704 1777 1778 1779 659 660 661 1258 1259 1260 1743 1744 1745 1780 1781 1782 1261 1262 1263 1049 1050 1051 1052 2179 2180 2181 2182 2186 2187 2188 2189 1746 1747 1748 1749 1053 1054 1055 1056 2193 2194 2195 2196 2200 2201 2202 2203 1783 1784 1785 1786 2190 2191 2192 1750 1751 1752 2183 2184 2185 1753 1754 1755 2204 2205 2206 1787 1788 1789 2197 2198 2199 1790 1791 1792 909 910 911 1762 1763 1764 1774 1775 1776 1264 1265 1266 1777 1778 1779 1267 1268 1269 1765 1766 1767 1270 1271 1272 1756 1757 1758 1793 1794 1795 1273 1274 1275 211 212 213 214 322 323 324 325 326 327 328 329 386 387 388 389 665 666 667 668 912 913 914 915 916 917 918 919 1057 1058 1059 1060 215 216 217 330 331 332 218 219 220 333 334 335 669 670 671 920 921 922 672 673 674 923 924 925 465 466 467 675 676 677 678 679 680 926 927 928 468 469 470 681 682 683 471 472 473 684 685 686 233 234 235 687 688 689 474 475 476 322 323 324 325 339 340 341 342 386 387 388 389 390 391 392 393 912 913 914 915 929 930 931 932 1057 1058 1059 1060 1061 1062 1063 1064 330 331 332 343 344 345 236 237 238 346 347 348 920 921 922 933 934 935 690 691 692 936 937 938 675 676 677 693 694 695 926 927 928 939 940 941 681 682 683 696 697 698 477 478 479 699 700 701 248 249 250 702 703 704 480 481 482 326 327 328 329 386 387 388 389 352 353 354 355 394 395 396 397 916 917 918 919 1057 1058 1059 1060 942 943 944 945 1065 1066 1067 1068 251 252 253 356 357 358 333 334 335 359 360 361 705 706 707 946 947 948 923 924 925 949 950 951 678 679 680 926 927 928 708 709 710 952 953 954 483 484 485 711 712 713 684 685 686 714 715 716 263 264 265 717 718 719 486 487 488 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 356 357 358 365 366 367 346 347 348 368 369 370 946 947 948 955 956 957 936 937 938 958 959 960 926 927 928 939 940 941 952 953 954 961 962 963 711 712 713 720 721 722 699 700 701 723 724 725 272 273 274 726 727 728 489 490 491 665 666 667 668 912 913 914 915 916 917 918 919 1057 1058 1059 1060 1276 1277 1278 1279 1796 1797 1798 1799 1800 1801 1802 1803 2207 2208 2209 2210 669 670 671 920 921 922 672 673 674 923 924 925 1280 1281 1282 1804 1805 1806 1283 1284 1285 1807 1808 1809 1286 1287 1288 1810 1811 1812 1813 1814 1815 2211 2212 2213 1289 1290 1291 1816 1817 1818 1292 1293 1294 1819 1820 1821 687 688 689 1295 1296 1297 1298 1299 1300 912 913 914 915 929 930 931 932 1057 1058 1059 1060 1061 1062 1063 1064 1796 1797 1798 1799 1822 1823 1824 1825 2207 2208 2209 2210 2214 2215 2216 2217 920 921 922 933 934 935 690 691 692 936 937 938 1804 1805 1806 1826 1827 1828 1301 1302 1303 1829 1830 1831 1810 1811 1812 1832 1833 1834 2211 2212 2213 2218 2219 2220 1816 1817 1818 1835 1836 1837 1304 1305 1306 1838 1839 1840 702 703 704 1307 1308 1309 1310 1311 1312 916 917 918 919 1057 1058 1059 1060 942 943 944 945 1065 1066 1067 1068 1800 1801 1802 1803 2207 2208 2209 2210 1841 1842 1843 1844 2221 2222 2223 2224 705 706 707 946 947 948 923 924 925 949 950 951 1313 1314 1315 1845 1846 1847 1807 1808 1809 1848 1849 1850 1813 1814 1815 2211 2212 2213 1851 1852 1853 2225 2226 2227 1316 1317 1318 1854 1855 1856 1819 1820 1821 1857 1858 1859 717 718 719 1319 1320 1321 1322 1323 1324 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 2207 2208 2209 2210 2214 2215 2216 2217 2221 2222 2223 2224 2228 2229 2230 2231 946 947 948 955 956 957 936 937 938 958 959 960 1845 1846 1847 1860 1861 1862 1829 1830 1831 1863 1864 1865 2211 2212 2213 2218 2219 2220 2225 2226 2227 2232 2233 2234 1854 1855 1856 1866 1867 1868 1838 1839 1840 1869 1870 1871 726 727 728 1325 1326 1327 1328 1329 1330 339 340 341 342 816 817 818 819 390 391 392 393 1025 1026 1027 1028 929 930 931 932 964 965 966 967 1061 1062 1063 1064 1073 1074 1075 1076 343 344 345 820 821 822 553 554 555 823 824 825 933 934 935 968 969 970 729 730 731 971 972 973 693 694 695 732 733 734 939 940 941 974 975 976 696 697 698 735 736 737 492 493 494 738 739 740 565 566 567 741 742 743 495 496 497 816 817 818 819 1601 1602 1603 1604 1025 1026 1027 1028 2137 2138 2139 2140 964 965 966 967 1872 1873 1874 1875 1073 1074 1075 1076 2235 2236 2237 2238 820 821 822 1605 1606 1607 1608 1609 1610 2141 2142 2143 968 969 970 1876 1877 1878 1879 1880 1881 2239 2240 2241 732 733 734 1331 1332 1333 974 975 976 1882 1883 1884 735 736 737 1334 1335 1336 1337 1338 1339 1885 1886 1887 1617 1618 1619 1888 1889 1890 1340 1341 1342 390 391 392 393 1025 1026 1027 1028 398 399 400 401 1029 1030 1031 1032 1061 1062 1063 1064 1073 1074 1075 1076 1069 1070 1071 1072 1077 1078 1079 1080 365 366 367 829 830 831 823 824 825 832 833 834 955 956 957 977 978 979 971 972 973 980 981 982 939 940 941 974 975 976 961 962 963 983 984 985 720 721 722 744 745 746 738 739 740 747 748 749 574 575 576 750 751 752 498 499 500 1025 1026 1027 1028 2137 2138 2139 2140 1029 1030 1031 1032 2144 2145 2146 2147 1073 1074 1075 1076 2235 2236 2237 2238 1077 1078 1079 1080 2242 2243 2244 2245 829 830 831 1620 1621 1622 2141 2142 2143 2148 2149 2150 977 978 979 1891 1892 1893 2239 2240 2241 2246 2247 2248 974 975 976 1882 1883 1884 983 984 985 1894 1895 1896 744 745 746 1343 1344 1345 1885 1886 1887 1897 1898 1899 1629 1630 1631 1900 1901 1902 1346 1347 1348 929 930 931 932 964 965 966 967 1061 1062 1063 1064 1073 1074 1075 1076 1822 1823 1824 1825 1903 1904 1905 1906 2214 2215 2216 2217 2249 2250 2251 2252 933 934 935 968 969 970 729 730 731 971 972 973 1826 1827 1828 1907 1908 1909 1349 1350 1351 1910 1911 1912 1832 1833 1834 1913 1914 1915 2218 2219 2220 2253 2254 2255 1835 1836 1837 1916 1917 1918 1352 1353 1354 1919 1920 1921 741 742 743 1355 1356 1357 1358 1359 1360 964 965 966 967 1872 1873 1874 1875 1073 1074 1075 1076 2235 2236 2237 2238 1903 1904 1905 1906 1361 1362 1363 1364 2249 2250 2251 2252 1922 1923 1924 1925 968 969 970 1876 1877 1878 1879 1880 1881 2239 2240 2241 1907 1908 1909 1365 1366 1367 1368 1369 1370 1926 1927 1928 1913 1914 1915 1371 1372 1373 2253 2254 2255 1929 1930 1931 1916 1917 1918 1374 1375 1376 1377 1378 1379 1932 1933 1934 1888 1889 1890 1380 1381 1382 1383 1384 1385 1061 1062 1063 1064 1073 1074 1075 1076 1069 1070 1071 1072 1077 1078 1079 1080 2214 2215 2216 2217 2249 2250 2251 2252 2228 2229 2230 2231 2256 2257 2258 2259 955 956 957 977 978 979 971 972 973 980 981 982 1860 1861 1862 1935 1936 1937 1910 1911 1912 1938 1939 1940 2218 2219 2220 2253 2254 2255 2232 2233 2234 2260 2261 2262 1866 1867 1868 1941 1942 1943 1919 1920 1921 1944 1945 1946 750 751 752 1386 1387 1388 1389 1390 1391 1073 1074 1075 1076 2235 2236 2237 2238 1077 1078 1079 1080 2242 2243 2244 2245 2249 2250 2251 2252 1922 1923 1924 1925 2256 2257 2258 2259 1947 1948 1949 1950 977 978 979 1891 1892 1893 2239 2240 2241 2246 2247 2248 1935 1936 1937 1392 1393 1394 1926 1927 1928 1951 1952 1953 2253 2254 2255 1929 1930 1931 2260 2261 2262 1954 1955 1956 1941 1942 1943 1395 1396 1397 1932 1933 1934 1957 1958 1959 1900 1901 1902 1398 1399 1400 1401 1402 1403 352 353 354 355 394 395 396 397 868 869 870 871 1041 1042 1043 1044 942 943 944 945 1065 1066 1067 1068 986 987 988 989 1081 1082 1083 1084 617 618 619 872 873 874 359 360 361 875 876 877 753 754 755 990 991 992 949 950 951 993 994 995 708 709 710 952 953 954 756 757 758 996 997 998 501 502 503 759 760 761 714 715 716 762 763 764 629 630 631 765 766 767 504 505 506 394 395 396 397 398 399 400 401 1041 1042 1043 1044 1045 1046 1047 1048 1065 1066 1067 1068 1069 1070 1071 1072 1081 1082 1083 1084 1085 1086 1087 1088 872 873 874 881 882 883 368 369 370 884 885 886 990 991 992 999 1000 1001 958 959 960 1002 1003 1004 952 953 954 961 962 963 996 997 998 1005 1006 1007 759 760 761 768 769 770 723 724 725 771 772 773 638 639 640 774 775 776 507 508 509 868 869 870 871 1041 1042 1043 1044 1677 1678 1679 1680 2165 2166 2167 2168 986 987 988 989 1081 1082 1083 1084 1960 1961 1962 1963 2263 2264 2265 2266 1681 1682 1683 2169 2170 2171 875 876 877 1684 1685 1686 1964 1965 1966 2267 2268 2269 993 994 995 1967 1968 1969 756 757 758 996 997 998 1404 1405 1406 1970 1971 1972 1407 1408 1409 1973 1974 1975 762 763 764 1410 1411 1412 1693 1694 1695 1976 1977 1978 1413 1414 1415 1041 1042 1043 1044 1045 1046 1047 1048 2165 2166 2167 2168 2172 2173 2174 2175 1081 1082 1083 1084 1085 1086 1087 1088 2263 2264 2265 2266 2270 2271 2272 2273 2169 2170 2171 2176 2177 2178 884 885 886 1696 1697 1698 2267 2268 2269 2274 2275 2276 1002 1003 1004 1979 1980 1981 996 997 998 1005 1006 1007 1970 1971 1972 1982 1983 1984 1973 1974 1975 1985 1986 1987 771 772 773 1416 1417 1418 1705 1706 1707 1988 1989 1990 1419 1420 1421 942 943 944 945 1065 1066 1067 1068 986 987 988 989 1081 1082 1083 1084 1841 1842 1843 1844 2221 2222 2223 2224 1991 1992 1993 1994 2277 2278 2279 2280 753 754 755 990 991 992 949 950 951 993 994 995 1422 1423 1424 1995 1996 1997 1848 1849 1850 1998 1999 2000 1851 1852 1853 2225 2226 2227 2001 2002 2003 2281 2282 2283 1425 1426 1427 2004 2005 2006 1857 1858 1859 2007 2008 2009 765 766 767 1428 1429 1430 1431 1432 1433 1065 1066 1067 1068 1069 1070 1071 1072 1081 1082 1083 1084 1085 1086 1087 1088 2221 2222 2223 2224 2228 2229 2230 2231 2277 2278 2279 2280 2284 2285 2286 2287 990 991 992 999 1000 1001 958 959 960 1002 1003 1004 1995 1996 1997 2010 2011 2012 1863 1864 1865 2013 2014 2015 2225 2226 2227 2232 2233 2234 2281 2282 2283 2288 2289 2290 2004 2005 2006 2016 2017 2018 1869 1870 1871 2019 2020 2021 774 775 776 1434 1435 1436 1437 1438 1439 986 987 988 989 1081 1082 1083 1084 1960 1961 1962 1963 2263 2264 2265 2266 1991 1992 1993 1994 2277 2278 2279 2280 1440 1441 1442 1443 2022 2023 2024 2025 1964 1965 1966 2267 2268 2269 993 994 995 1967 1968 1969 1444 1445 1446 2026 2027 2028 1998 1999 2000 1447 1448 1449 2001 2002 2003 2281 2282 2283 1450 1451 1452 2029 2030 2031 1453 1454 1455 2032 2033 2034 2007 2008 2009 1456 1457 1458 1976 1977 1978 1459 1460 1461 1462 1463 1464 1081 1082 1083 1084 1085 1086 1087 1088 2263 2264 2265 2266 2270 2271 2272 2273 2277 2278 2279 2280 2284 2285 2286 2287 2022 2023 2024 2025 2035 2036 2037 2038 2267 2268 2269 2274 2275 2276 1002 1003 1004 1979 1980 1981 2026 2027 2028 2039 2040 2041 2013 2014 2015 1465 1466 1467 2281 2282 2283 2288 2289 2290 2029 2030 2031 2042 2043 2044 2032 2033 2034 2045 2046 2047 2019 2020 2021 1468 1469 1470 1988 1989 1990 1471 1472 1473 1474 1475 1476 398 399 400 401 1029 1030 1031 1032 1045 1046 1047 1048 1053 1054 1055 1056 1069 1070 1071 1072 1077 1078 1079 1080 1085 1086 1087 1088 1089 1090 1091 1092 881 882 883 903 904 905 832 833 834 906 907 908 999 1000 1001 1008 1009 1010 980 981 982 1011 1012 1013 961 962 963 983 984 985 1005 1006 1007 1014 1015 1016 768 769 770 777 778 779 747 748 749 780 781 782 662 663 664 783 784 785 510 511 512 1029 1030 1031 1032 2144 2145 2146 2147 1053 1054 1055 1056 2193 2194 2195 2196 1077 1078 1079 1080 2242 2243 2244 2245 1089 1090 1091 1092 2291 2292 2293 2294 903 904 905 1759 1760 1761 2148 2149 2150 2197 2198 2199 1008 1009 1010 2048 2049 2050 2246 2247 2248 2295 2296 2297 983 984 985 1894 1895 1896 1014 1015 1016 2051 2052 2053 777 778 779 1477 1478 1479 1897 1898 1899 2054 2055 2056 1768 1769 1770 2057 2058 2059 1480 1481 1482 1045 1046 1047 1048 1053 1054 1055 1056 2172 2173 2174 2175 2200 2201 2202 2203 1085 1086 1087 1088 1089 1090 1091 1092 2270 2271 2272 2273 2298 2299 2300 2301 2176 2177 2178 2204 2205 2206 906 907 908 1771 1772 1773 2274 2275 2276 2302 2303 2304 1011 1012 1013 2060 2061 2062 1005 1006 1007 1014 1015 1016 1982 1983 1984 2063 2064 2065 1985 1986 1987 2066 2067 2068 780 781 782 1483 1484 1485 1780 1781 1782 2069 2070 2071 1486 1487 1488 1053 1054 1055 1056 2193 2194 2195 2196 2200 2201 2202 2203 1783 1784 1785 1786 1089 1090 1091 1092 2291 2292 2293 2294 2298 2299 2300 2301 2072 2073 2074 2075 2204 2205 2206 1787 1788 1789 2197 2198 2199 1790 1791 1792 2302 2303 2304 2076 2077 2078 2295 2296 2297 2079 2080 2081 1014 1015 1016 2051 2052 2053 2063 2064 2065 1489 1490 1491 2066 2067 2068 1492 1493 1494 2054 2055 2056 1495 1496 1497 1793 1794 1795 2082 2083 2084 1498 1499 1500 1069 1070 1071 1072 1077 1078 1079 1080 1085 1086 1087 1088 1089 1090 1091 1092 2228 2229 2230 2231 2256 2257 2258 2259 2284 2285 2286 2287 2305 2306 2307 2308 999 1000 1001 1008 1009 1010 980 981 982 1011 1012 1013 2010 2011 2012 2085 2086 2087 1938 1939 1940 2088 2089 2090 2232 2233 2234 2260 2261 2262 2288 2289 2290 2309 2310 2311 2016 2017 2018 2091 2092 2093 1944 1945 1946 2094 2095 2096 783 784 785 1501 1502 1503 1504 1505 1506 1077 1078 1079 1080 2242 2243 2244 2245 1089 1090 1091 1092 2291 2292 2293 2294 2256 2257 2258 2259 1947 1948 1949 1950 2305 2306 2307 2308 2097 2098 2099 2100 1008 1009 1010 2048 2049 2050 2246 2247 2248 2295 2296 2297 2085 2086 2087 1507 1508 1509 1951 1952 1953 2101 2102 2103 2260 2261 2262 1954 1955 1956 2309 2310 2311 2104 2105 2106 2091 2092 2093 1510 1511 1512 1957 1958 1959 2107 2108 2109 2057 2058 2059 1513 1514 1515 1516 1517 1518 1085 1086 1087 1088 1089 1090 1091 1092 2270 2271 2272 2273 2298 2299 2300 2301 2284 2285 2286 2287 2305 2306 2307 2308 2035 2036 2037 2038 2110 2111 2112 2113 2274 2275 2276 2302 2303 2304 1011 1012 1013 2060 2061 2062 2039 2040 2041 2114 2115 2116 2088 2089 2090 1519 1520 1521 2288 2289 2290 2309 2310 2311 2042 2043 2044 2117 2118 2119 2045 2046 2047 2120 2121 2122 2094 2095 2096 1522 1523 1524 2069 2070 2071 1525 1526 1527 1528 1529 1530 1089 1090 1091 1092 2291 2292 2293 2294 2298 2299 2300 2301 2072 2073 2074 2075 2305 2306 2307 2308 2097 2098 2099 2100 2110 2111 2112 2113 1531 1532 1533 1534 2302 2303 2304 2076 2077 2078 2295 2296 2297 2079 2080 2081 2114 2115 2116 1535 1536 1537 2101 2102 2103 1538 1539 1540 2309 2310 2311 2104 2105 2106 2117 2118 2119 1541 1542 1543 2120 2121 2122 1544 1545 1546 2107 2108 2109 1547 1548 1549 2082 2083 2084 1550 1551 1552 1553 1554 1555 3 0 2 0 0 89 9 0 0 89 178 267 356 445 534 623 712 65 0 0 89 178 267 356 445 534 623 712 801 890 979 1068 1157 1246 1335 1424 1513 1602 1691 1780 1869 1958 2047 2136 2225 2314 2403 2492 2581 2670 2759 2848 2937 3026 3115 3204 3293 3382 3471 3560 3649 3738 3827 3916 4005 4094 4183 4272 4361 4450 4539 4628 4717 4806 4895 4984 5073 5162 5251 5340 5429 5518 5607 5696 73 36 FESystem<3>[FE_Q<3>(2)^3-FE_Q<3>(1)] 23 Policy::Sequential<3,3>
DEAL::OK
-DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 1 11 12 6 7 3 4 9 10 0 0 14 14 0 0 0 0 1 0 0 0 0 14 0 1 14 0 1 0 14 0 0 1 0 1 0 0 14 0 1 14 0 3 0 0 12 1 0
-0 5 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 0 0 1 0 18446744073709551615 12
-1 10 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 2 0 18446744073709551615 18446744073709551615 12
-2 20 0 0 1 3 4 2 3 4 6 7 5 6 7 9 10 8 9 10 11 12 13 4 0 2 5 8 13 1 7 34 FESystem<1>[FE_Q<1>(2)-FE_Q<1>(1)] 23 Policy::Sequential<1,1>
+DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 14 0 0 0 0 1 0 0 0 0 14 0 1 14 0 1 0 14 0 0 1 0 1 0 0 14 0 1 14 0 0 0 3 0 0 0 2 10 0 0 1 11 12 6 7 3 4 9 10 1 0 18446744073709551615 2 0 0 2 0 18446744073709551615 18446744073709551615 2 0 0 4 0 2 5 8 13 0 0 3 0 0 0 2 0 0 2 0 0 1 2 0 0 3 0 0 1 2 2 0 0 5 0 0 1 2 3 4 0 0 3 0 5 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 10 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 20 0 0 1 3 4 2 3 4 6 7 5 6 7 9 10 8 9 10 11 12 13 0 0 3 0 2 0 0 5 3 0 0 5 10 5 0 0 5 10 15 20 7 34 FESystem<1>[FE_Q<1>(2)-FE_Q<1>(1)] 23 Policy::Sequential<1,1>
-DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 1 11 12 6 7 3 4 9 10 0 0 14 14 0 0 0 0 1 0 0 0 0 14 0 1 14 0 1 0 14 0 0 1 0 1 0 0 14 0 1 14 0 3 0 0 12 1 0
-0 5 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 0 0 1 0 18446744073709551615 12
-1 10 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 2 0 18446744073709551615 18446744073709551615 12
-2 20 0 0 1 3 4 2 3 4 6 7 5 6 7 9 10 8 9 10 11 12 13 4 0 2 5 8 13 1 7 40 FESystem<1,2>[FE_Q<1,2>(2)-FE_Q<1,2>(1)] 23 Policy::Sequential<1,2>
+DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 14 0 0 0 0 1 0 0 0 0 14 0 1 14 0 1 0 14 0 0 1 0 1 0 0 14 0 1 14 0 0 0 3 0 0 0 2 10 0 0 1 11 12 6 7 3 4 9 10 1 0 18446744073709551615 2 0 0 2 0 18446744073709551615 18446744073709551615 2 0 0 4 0 2 5 8 13 0 0 3 0 0 0 2 0 0 2 0 0 1 2 0 0 3 0 0 1 2 2 0 0 5 0 0 1 2 3 4 0 0 3 0 5 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 10 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 20 0 0 1 3 4 2 3 4 6 7 5 6 7 9 10 8 9 10 11 12 13 0 0 3 0 2 0 0 5 3 0 0 5 10 5 0 0 5 10 15 20 7 40 FESystem<1,2>[FE_Q<1,2>(2)-FE_Q<1,2>(1)] 23 Policy::Sequential<1,2>
-DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 0 0 1 2 114 115 116 127 128 129 148 149 150 32 33 34 39 40 41 162 163 164 172 173 174 56 57 58 9 10 11 73 74 75 12 13 14 84 85 86 157 158 159 177 178 179 167 168 169 182 183 184 50 51 52 108 109 110 53 54 55 102 103 104 19 20 21 99 100 101 105 106 107 111 112 113 0 0 187 187 0 0 0 0 1 0 0 0 0 187 0 1 187 0 1 0 187 0 0 1 0 1 0 0 187 0 1 187 0 3 0 0 12 1 0
-0 22 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 0 0 2 0 18446744073709551615 18446744073709551615 12
-1 88 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 8 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 12
-2 352 0 0 1 2 9 10 11 12 13 14 19 20 21 3 4 15 16 5 6 17 18 7 8 9 10 11 32 33 34 19 20 21 50 51 52 15 16 35 36 22 23 37 38 24 25 12 13 14 19 20 21 39 40 41 53 54 55 26 27 42 43 17 18 44 45 28 29 19 20 21 50 51 52 53 54 55 56 57 58 42 43 46 47 37 38 48 49 30 31 32 33 34 73 74 75 50 51 52 99 100 101 35 36 76 77 59 60 78 79 61 62 73 74 75 114 115 116 99 100 101 157 158 159 76 77 117 118 119 120 160 161 121 122 50 51 52 99 100 101 56 57 58 102 103 104 46 47 80 81 78 79 82 83 63 64 99 100 101 157 158 159 102 103 104 162 163 164 80 81 123 124 160 161 165 166 125 126 39 40 41 53 54 55 84 85 86 105 106 107 65 66 87 88 44 45 89 90 67 68 53 54 55 56 57 58 105 106 107 108 109 110 87 88 91 92 48 49 93 94 69 70 84 85 86 105 106 107 127 128 129 167 168 169 130 131 170 171 89 90 132 133 134 135 105 106 107 108 109 110 167 168 169 172 173 174 170 171 175 176 93 94 136 137 138 139 56 57 58 102 103 104 108 109 110 111 112 113 91 92 95 96 82 83 97 98 71 72 102 103 104 162 163 164 111 112 113 177 178 179 95 96 140 141 165 166 180 181 142 143 108 109 110 111 112 113 172 173 174 182 183 184 175 176 185 186 97 98 144 145 146 147 111 112 113 177 178 179 182 183 184 148 149 150 185 186 151 152 180 181 153 154 155 156 32 0 7 8 24 25 28 29 30 31 61 62 121 122 63 64 125 126 67 68 69 70 134 135 138 139 71 72 142 143 146 147 155 156 0 0 0 15 1 0
-3 0 0 112 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 5 6 22 23 59 60 119 120 3 4 26 27 65 66 130 131 117 118 123 124 140 141 151 152 132 133 136 137 144 145 153 154 35 36 46 47 91 92 175 176 44 45 48 49 82 83 165 166 15 16 42 43 17 18 37 38 76 77 80 81 78 79 160 161 87 88 170 171 89 90 93 94 95 96 185 186 97 98 180 181 21 36 FESystem<2>[FE_Q<2>(2)^2-FE_Q<2>(1)] 23 Policy::Sequential<2,2>
+DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 187 187 0 0 0 0 1 0 0 0 0 187 0 1 187 0 1 0 187 0 0 1 0 1 0 0 187 0 1 187 0 0 0 3 0 0 0 3 75 0 0 1 2 114 115 116 127 128 129 148 149 150 32 33 34 39 40 41 162 163 164 172 173 174 56 57 58 9 10 11 73 74 75 12 13 14 84 85 86 157 158 159 177 178 179 167 168 169 182 183 184 50 51 52 108 109 110 53 54 55 102 103 104 19 20 21 99 100 101 105 106 107 111 112 113 112 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 5 6 22 23 59 60 119 120 3 4 26 27 65 66 130 131 117 118 123 124 140 141 151 152 132 133 136 137 144 145 153 154 35 36 46 47 91 92 175 176 44 45 48 49 82 83 165 166 15 16 42 43 17 18 37 38 76 77 80 81 78 79 160 161 87 88 170 171 89 90 93 94 95 96 185 186 97 98 180 181 2 0 18446744073709551615 18446744073709551615 3 0 0 0 0 8 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 3 0 0 0 0 32 0 7 8 24 25 28 29 30 31 61 62 121 122 63 64 125 126 67 68 69 70 134 135 138 139 71 72 142 143 146 147 155 156 0 0 3 0 0 0 3 0 0 57 0 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 2 0 0 2 3 0 0 0 0 5 0 0 2 4 6 8 3 0 0 0 0 17 0 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 0 0 3 0 22 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 88 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 352 0 0 1 2 9 10 11 12 13 14 19 20 21 3 4 15 16 5 6 17 18 7 8 9 10 11 32 33 34 19 20 21 50 51 52 15 16 35 36 22 23 37 38 24 25 12 13 14 19 20 21 39 40 41 53 54 55 26 27 42 43 17 18 44 45 28 29 19 20 21 50 51 52 53 54 55 56 57 58 42 43 46 47 37 38 48 49 30 31 32 33 34 73 74 75 50 51 52 99 100 101 35 36 76 77 59 60 78 79 61 62 73 74 75 114 115 116 99 100 101 157 158 159 76 77 117 118 119 120 160 161 121 122 50 51 52 99 100 101 56 57 58 102 103 104 46 47 80 81 78 79 82 83 63 64 99 100 101 157 158 159 102 103 104 162 163 164 80 81 123 124 160 161 165 166 125 126 39 40 41 53 54 55 84 85 86 105 106 107 65 66 87 88 44 45 89 90 67 68 53 54 55 56 57 58 105 106 107 108 109 110 87 88 91 92 48 49 93 94 69 70 84 85 86 105 106 107 127 128 129 167 168 169 130 131 170 171 89 90 132 133 134 135 105 106 107 108 109 110 167 168 169 172 173 174 170 171 175 176 93 94 136 137 138 139 56 57 58 102 103 104 108 109 110 111 112 113 91 92 95 96 82 83 97 98 71 72 102 103 104 162 163 164 111 112 113 177 178 179 95 96 140 141 165 166 180 181 142 143 108 109 110 111 112 113 172 173 174 182 183 184 175 176 185 186 97 98 144 145 146 147 111 112 113 177 178 179 182 183 184 148 149 150 185 186 151 152 180 181 153 154 155 156 0 0 3 0 2 0 0 22 5 0 0 22 44 66 88 17 0 0 22 44 66 88 110 132 154 176 198 220 242 264 286 308 330 352 21 36 FESystem<2>[FE_Q<2>(2)^2-FE_Q<2>(1)] 23 Policy::Sequential<2,2>
-DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 0 0 1 2 114 115 116 127 128 129 148 149 150 32 33 34 39 40 41 162 163 164 172 173 174 56 57 58 9 10 11 73 74 75 12 13 14 84 85 86 157 158 159 177 178 179 167 168 169 182 183 184 50 51 52 108 109 110 53 54 55 102 103 104 19 20 21 99 100 101 105 106 107 111 112 113 0 0 187 187 0 0 0 0 1 0 0 0 0 187 0 1 187 0 1 0 187 0 0 1 0 1 0 0 187 0 1 187 0 3 0 0 12 1 0
-0 22 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 0 0 2 0 18446744073709551615 18446744073709551615 12
-1 88 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 8 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 12
-2 352 0 0 1 2 9 10 11 12 13 14 19 20 21 3 4 15 16 5 6 17 18 7 8 9 10 11 32 33 34 19 20 21 50 51 52 15 16 35 36 22 23 37 38 24 25 12 13 14 19 20 21 39 40 41 53 54 55 26 27 42 43 17 18 44 45 28 29 19 20 21 50 51 52 53 54 55 56 57 58 42 43 46 47 37 38 48 49 30 31 32 33 34 73 74 75 50 51 52 99 100 101 35 36 76 77 59 60 78 79 61 62 73 74 75 114 115 116 99 100 101 157 158 159 76 77 117 118 119 120 160 161 121 122 50 51 52 99 100 101 56 57 58 102 103 104 46 47 80 81 78 79 82 83 63 64 99 100 101 157 158 159 102 103 104 162 163 164 80 81 123 124 160 161 165 166 125 126 39 40 41 53 54 55 84 85 86 105 106 107 65 66 87 88 44 45 89 90 67 68 53 54 55 56 57 58 105 106 107 108 109 110 87 88 91 92 48 49 93 94 69 70 84 85 86 105 106 107 127 128 129 167 168 169 130 131 170 171 89 90 132 133 134 135 105 106 107 108 109 110 167 168 169 172 173 174 170 171 175 176 93 94 136 137 138 139 56 57 58 102 103 104 108 109 110 111 112 113 91 92 95 96 82 83 97 98 71 72 102 103 104 162 163 164 111 112 113 177 178 179 95 96 140 141 165 166 180 181 142 143 108 109 110 111 112 113 172 173 174 182 183 184 175 176 185 186 97 98 144 145 146 147 111 112 113 177 178 179 182 183 184 148 149 150 185 186 151 152 180 181 153 154 155 156 32 0 7 8 24 25 28 29 30 31 61 62 121 122 63 64 125 126 67 68 69 70 134 135 138 139 71 72 142 143 146 147 155 156 0 0 0 15 1 0
-3 0 0 112 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 5 6 22 23 59 60 119 120 3 4 26 27 65 66 130 131 117 118 123 124 140 141 151 152 132 133 136 137 144 145 153 154 35 36 46 47 91 92 175 176 44 45 48 49 82 83 165 166 15 16 42 43 17 18 37 38 76 77 80 81 78 79 160 161 87 88 170 171 89 90 93 94 95 96 185 186 97 98 180 181 21 42 FESystem<2,3>[FE_Q<2,3>(2)^2-FE_Q<2,3>(1)] 23 Policy::Sequential<2,3>
+DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 187 187 0 0 0 0 1 0 0 0 0 187 0 1 187 0 1 0 187 0 0 1 0 1 0 0 187 0 1 187 0 0 0 3 0 0 0 3 75 0 0 1 2 114 115 116 127 128 129 148 149 150 32 33 34 39 40 41 162 163 164 172 173 174 56 57 58 9 10 11 73 74 75 12 13 14 84 85 86 157 158 159 177 178 179 167 168 169 182 183 184 50 51 52 108 109 110 53 54 55 102 103 104 19 20 21 99 100 101 105 106 107 111 112 113 112 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 5 6 22 23 59 60 119 120 3 4 26 27 65 66 130 131 117 118 123 124 140 141 151 152 132 133 136 137 144 145 153 154 35 36 46 47 91 92 175 176 44 45 48 49 82 83 165 166 15 16 42 43 17 18 37 38 76 77 80 81 78 79 160 161 87 88 170 171 89 90 93 94 95 96 185 186 97 98 180 181 2 0 18446744073709551615 18446744073709551615 3 0 0 0 0 8 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 3 0 0 0 0 32 0 7 8 24 25 28 29 30 31 61 62 121 122 63 64 125 126 67 68 69 70 134 135 138 139 71 72 142 143 146 147 155 156 0 0 3 0 0 0 3 0 0 57 0 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 2 0 0 2 3 0 0 0 0 5 0 0 2 4 6 8 3 0 0 0 0 17 0 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 0 0 3 0 22 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 88 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 352 0 0 1 2 9 10 11 12 13 14 19 20 21 3 4 15 16 5 6 17 18 7 8 9 10 11 32 33 34 19 20 21 50 51 52 15 16 35 36 22 23 37 38 24 25 12 13 14 19 20 21 39 40 41 53 54 55 26 27 42 43 17 18 44 45 28 29 19 20 21 50 51 52 53 54 55 56 57 58 42 43 46 47 37 38 48 49 30 31 32 33 34 73 74 75 50 51 52 99 100 101 35 36 76 77 59 60 78 79 61 62 73 74 75 114 115 116 99 100 101 157 158 159 76 77 117 118 119 120 160 161 121 122 50 51 52 99 100 101 56 57 58 102 103 104 46 47 80 81 78 79 82 83 63 64 99 100 101 157 158 159 102 103 104 162 163 164 80 81 123 124 160 161 165 166 125 126 39 40 41 53 54 55 84 85 86 105 106 107 65 66 87 88 44 45 89 90 67 68 53 54 55 56 57 58 105 106 107 108 109 110 87 88 91 92 48 49 93 94 69 70 84 85 86 105 106 107 127 128 129 167 168 169 130 131 170 171 89 90 132 133 134 135 105 106 107 108 109 110 167 168 169 172 173 174 170 171 175 176 93 94 136 137 138 139 56 57 58 102 103 104 108 109 110 111 112 113 91 92 95 96 82 83 97 98 71 72 102 103 104 162 163 164 111 112 113 177 178 179 95 96 140 141 165 166 180 181 142 143 108 109 110 111 112 113 172 173 174 182 183 184 175 176 185 186 97 98 144 145 146 147 111 112 113 177 178 179 182 183 184 148 149 150 185 186 151 152 180 181 153 154 155 156 0 0 3 0 2 0 0 22 5 0 0 22 44 66 88 17 0 0 22 44 66 88 110 132 154 176 198 220 242 264 286 308 330 352 21 42 FESystem<2,3>[FE_Q<2,3>(2)^2-FE_Q<2,3>(1)] 23 Policy::Sequential<2,3>
-DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 1 2 3 1093 1094 1095 1096 1148 1149 1150 1151 1227 1228 1229 1230 1276 1277 1278 1279 1361 1362 1363 1364 1440 1441 1442 1443 1531 1532 1533 1534 146 147 148 149 171 172 173 174 211 212 213 214 1582 1583 1584 1585 1601 1602 1603 1604 1658 1659 1660 1661 1677 1678 1679 1680 1783 1784 1785 1786 1822 1823 1824 1825 1841 1842 1843 1844 1947 1948 1949 1950 2035 2036 2037 2038 339 340 341 342 309 310 311 312 352 353 354 355 2144 2145 2146 2147 2172 2173 2174 2175 2228 2229 2230 2231 398 399 400 401 25 26 27 28 513 514 515 516 29 30 31 32 577 578 579 580 33 34 35 36 665 666 667 668 1556 1557 1558 1559 1708 1709 1710 1711 1560 1561 1562 1563 1872 1873 1874 1875 1632 1633 1634 1635 1727 1728 1729 1730 1636 1637 1638 1639 1960 1961 1962 1963 1746 1747 1748 1749 2072 2073 2074 2075 1796 1797 1798 1799 1903 1904 1905 1906 1800 1801 1802 1803 1991 1992 1993 1994 1922 1923 1924 1925 2097 2098 2099 2100 2022 2023 2024 2025 2110 2111 2112 2113 322 323 324 325 816 817 818 819 279 280 281 282 929 930 931 932 275 276 277 278 855 856 857 858 292 293 294 295 803 804 805 806 296 297 298 299 942 943 944 945 326 327 328 329 868 869 870 871 2130 2131 2132 2133 2242 2243 2244 2245 2137 2138 2139 2140 2193 2194 2195 2196 2165 2166 2167 2168 2200 2201 2202 2203 2158 2159 2160 2161 2270 2271 2272 2273 2214 2215 2216 2217 2284 2285 2286 2287 2221 2222 2223 2224 2256 2257 2258 2259 1069 1070 1071 1072 382 383 384 385 1029 1030 1031 1032 394 395 396 397 1045 1046 1047 1048 390 391 392 393 68 69 70 71 912 913 914 915 790 791 792 793 964 965 966 967 64 65 66 67 786 787 788 789 838 839 840 841 890 891 892 893 72 73 74 75 842 843 844 845 916 917 918 919 986 987 988 989 2123 2124 2125 2126 2179 2180 2181 2182 2235 2236 2237 2238 2291 2292 2293 2294 2151 2152 2153 2154 2263 2264 2265 2266 2186 2187 2188 2189 2298 2299 2300 2301 2207 2208 2209 2210 2249 2250 2251 2252 2277 2278 2279 2280 2305 2306 2307 2308 1053 1054 1055 1056 1041 1042 1043 1044 1025 1026 1027 1028 386 387 388 389 1077 1078 1079 1080 1021 1022 1023 1024 1065 1066 1067 1068 378 379 380 381 1085 1086 1087 1088 1061 1062 1063 1064 1037 1038 1039 1040 374 375 376 377 85 86 87 88 1017 1018 1019 1020 1033 1034 1035 1036 1049 1050 1051 1052 1057 1058 1059 1060 1073 1074 1075 1076 1081 1082 1083 1084 1089 1090 1091 1092 0 0 2312 2312 0 0 0 0 1 0 0 0 0 2312 0 1 2312 0 1 0 2312 0 0 1 0 1 0 0 2312 0 1 2312 0 3 0 0 12 1 0
-0 89 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 0 0 3 0 18446744073709551615 18446744073709551615 18446744073709551615 12
-1 712 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 24 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 12
-2 5696 0 0 1 2 3 25 26 27 28 29 30 31 32 64 65 66 67 33 34 35 36 68 69 70 71 72 73 74 75 85 86 87 88 4 5 6 37 38 39 7 8 9 40 41 42 43 44 45 76 77 78 46 47 48 79 80 81 10 11 12 49 50 51 52 53 54 82 83 84 13 14 15 55 56 57 16 17 18 58 59 60 19 20 21 61 62 63 22 23 24 25 26 27 28 146 147 148 149 64 65 66 67 275 276 277 278 68 69 70 71 279 280 281 282 85 86 87 88 374 375 376 377 37 38 39 150 151 152 89 90 91 153 154 155 76 77 78 283 284 285 156 157 158 286 287 288 49 50 51 159 160 161 82 83 84 289 290 291 55 56 57 162 163 164 92 93 94 165 166 167 95 96 97 168 169 170 98 99 100 29 30 31 32 64 65 66 67 171 172 173 174 292 293 294 295 72 73 74 75 85 86 87 88 296 297 298 299 378 379 380 381 101 102 103 175 176 177 40 41 42 178 179 180 181 182 183 300 301 302 79 80 81 303 304 305 52 53 54 82 83 84 184 185 186 306 307 308 104 105 106 187 188 189 58 59 60 190 191 192 107 108 109 193 194 195 110 111 112 64 65 66 67 275 276 277 278 292 293 294 295 309 310 311 312 85 86 87 88 374 375 376 377 378 379 380 381 382 383 384 385 175 176 177 196 197 198 153 154 155 199 200 201 300 301 302 313 314 315 286 287 288 316 317 318 82 83 84 289 290 291 306 307 308 319 320 321 187 188 189 202 203 204 165 166 167 205 206 207 113 114 115 208 209 210 116 117 118 33 34 35 36 68 69 70 71 72 73 74 75 85 86 87 88 211 212 213 214 322 323 324 325 326 327 328 329 386 387 388 389 43 44 45 76 77 78 46 47 48 79 80 81 215 216 217 330 331 332 218 219 220 333 334 335 119 120 121 221 222 223 224 225 226 336 337 338 122 123 124 227 228 229 125 126 127 230 231 232 61 62 63 233 234 235 128 129 130 68 69 70 71 279 280 281 282 85 86 87 88 374 375 376 377 322 323 324 325 339 340 341 342 386 387 388 389 390 391 392 393 76 77 78 283 284 285 156 157 158 286 287 288 330 331 332 343 344 345 236 237 238 346 347 348 221 222 223 239 240 241 336 337 338 349 350 351 227 228 229 242 243 244 131 132 133 245 246 247 168 169 170 248 249 250 134 135 136 72 73 74 75 85 86 87 88 296 297 298 299 378 379 380 381 326 327 328 329 386 387 388 389 352 353 354 355 394 395 396 397 181 182 183 300 301 302 79 80 81 303 304 305 251 252 253 356 357 358 333 334 335 359 360 361 224 225 226 336 337 338 254 255 256 362 363 364 137 138 139 257 258 259 230 231 232 260 261 262 193 194 195 263 264 265 140 141 142 85 86 87 88 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 300 301 302 313 314 315 286 287 288 316 317 318 356 357 358 365 366 367 346 347 348 368 369 370 336 337 338 349 350 351 362 363 364 371 372 373 257 258 259 266 267 268 245 246 247 269 270 271 208 209 210 272 273 274 143 144 145 146 147 148 149 513 514 515 516 275 276 277 278 786 787 788 789 279 280 281 282 790 791 792 793 374 375 376 377 1017 1018 1019 1020 150 151 152 517 518 519 402 403 404 520 521 522 283 284 285 794 795 796 523 524 525 797 798 799 159 160 161 526 527 528 289 290 291 800 801 802 162 163 164 529 530 531 405 406 407 532 533 534 408 409 410 535 536 537 411 412 413 513 514 515 516 1093 1094 1095 1096 786 787 788 789 1556 1557 1558 1559 790 791 792 793 1560 1561 1562 1563 1017 1018 1019 1020 2123 2124 2125 2126 517 518 519 1097 1098 1099 1100 1101 1102 1564 1565 1566 794 795 796 1567 1568 1569 1570 1571 1572 2127 2128 2129 526 527 528 1103 1104 1105 800 801 802 1573 1574 1575 529 530 531 1106 1107 1108 1109 1110 1111 1576 1577 1578 1112 1113 1114 1579 1580 1581 1115 1116 1117 275 276 277 278 786 787 788 789 309 310 311 312 803 804 805 806 374 375 376 377 1017 1018 1019 1020 382 383 384 385 1021 1022 1023 1024 196 197 198 538 539 540 520 521 522 541 542 543 313 314 315 807 808 809 797 798 799 810 811 812 289 290 291 800 801 802 319 320 321 813 814 815 202 203 204 544 545 546 532 533 534 547 548 549 414 415 416 550 551 552 417 418 419 786 787 788 789 1556 1557 1558 1559 803 804 805 806 1582 1583 1584 1585 1017 1018 1019 1020 2123 2124 2125 2126 1021 1022 1023 1024 2130 2131 2132 2133 538 539 540 1118 1119 1120 1564 1565 1566 1586 1587 1588 807 808 809 1589 1590 1591 2127 2128 2129 2134 2135 2136 800 801 802 1573 1574 1575 813 814 815 1592 1593 1594 544 545 546 1121 1122 1123 1576 1577 1578 1595 1596 1597 1124 1125 1126 1598 1599 1600 1127 1128 1129 279 280 281 282 790 791 792 793 374 375 376 377 1017 1018 1019 1020 339 340 341 342 816 817 818 819 390 391 392 393 1025 1026 1027 1028 283 284 285 794 795 796 523 524 525 797 798 799 343 344 345 820 821 822 553 554 555 823 824 825 239 240 241 556 557 558 349 350 351 826 827 828 242 243 244 559 560 561 420 421 422 562 563 564 535 536 537 565 566 567 423 424 425 790 791 792 793 1560 1561 1562 1563 1017 1018 1019 1020 2123 2124 2125 2126 816 817 818 819 1601 1602 1603 1604 1025 1026 1027 1028 2137 2138 2139 2140 794 795 796 1567 1568 1569 1570 1571 1572 2127 2128 2129 820 821 822 1605 1606 1607 1608 1609 1610 2141 2142 2143 556 557 558 1130 1131 1132 826 827 828 1611 1612 1613 559 560 561 1133 1134 1135 1136 1137 1138 1614 1615 1616 1579 1580 1581 1617 1618 1619 1139 1140 1141 374 375 376 377 1017 1018 1019 1020 382 383 384 385 1021 1022 1023 1024 390 391 392 393 1025 1026 1027 1028 398 399 400 401 1029 1030 1031 1032 313 314 315 807 808 809 797 798 799 810 811 812 365 366 367 829 830 831 823 824 825 832 833 834 349 350 351 826 827 828 371 372 373 835 836 837 266 267 268 568 569 570 562 563 564 571 572 573 550 551 552 574 575 576 426 427 428 1017 1018 1019 1020 2123 2124 2125 2126 1021 1022 1023 1024 2130 2131 2132 2133 1025 1026 1027 1028 2137 2138 2139 2140 1029 1030 1031 1032 2144 2145 2146 2147 807 808 809 1589 1590 1591 2127 2128 2129 2134 2135 2136 829 830 831 1620 1621 1622 2141 2142 2143 2148 2149 2150 826 827 828 1611 1612 1613 835 836 837 1623 1624 1625 568 569 570 1142 1143 1144 1614 1615 1616 1626 1627 1628 1598 1599 1600 1629 1630 1631 1145 1146 1147 171 172 173 174 292 293 294 295 577 578 579 580 838 839 840 841 296 297 298 299 378 379 380 381 842 843 844 845 1033 1034 1035 1036 429 430 431 581 582 583 178 179 180 584 585 586 587 588 589 846 847 848 303 304 305 849 850 851 184 185 186 306 307 308 590 591 592 852 853 854 432 433 434 593 594 595 190 191 192 596 597 598 435 436 437 599 600 601 438 439 440 292 293 294 295 309 310 311 312 838 839 840 841 855 856 857 858 378 379 380 381 382 383 384 385 1033 1034 1035 1036 1037 1038 1039 1040 581 582 583 602 603 604 199 200 201 605 606 607 846 847 848 859 860 861 316 317 318 862 863 864 306 307 308 319 320 321 852 853 854 865 866 867 593 594 595 608 609 610 205 206 207 611 612 613 441 442 443 614 615 616 444 445 446 577 578 579 580 838 839 840 841 1148 1149 1150 1151 1632 1633 1634 1635 842 843 844 845 1033 1034 1035 1036 1636 1637 1638 1639 2151 2152 2153 2154 1152 1153 1154 1640 1641 1642 584 585 586 1155 1156 1157 1643 1644 1645 2155 2156 2157 849 850 851 1646 1647 1648 590 591 592 852 853 854 1158 1159 1160 1649 1650 1651 1161 1162 1163 1652 1653 1654 596 597 598 1164 1165 1166 1167 1168 1169 1655 1656 1657 1170 1171 1172 838 839 840 841 855 856 857 858 1632 1633 1634 1635 1658 1659 1660 1661 1033 1034 1035 1036 1037 1038 1039 1040 2151 2152 2153 2154 2158 2159 2160 2161 1640 1641 1642 1662 1663 1664 605 606 607 1173 1174 1175 2155 2156 2157 2162 2163 2164 862 863 864 1665 1666 1667 852 853 854 865 866 867 1649 1650 1651 1668 1669 1670 1652 1653 1654 1671 1672 1673 611 612 613 1176 1177 1178 1179 1180 1181 1674 1675 1676 1182 1183 1184 296 297 298 299 378 379 380 381 842 843 844 845 1033 1034 1035 1036 352 353 354 355 394 395 396 397 868 869 870 871 1041 1042 1043 1044 587 588 589 846 847 848 303 304 305 849 850 851 617 618 619 872 873 874 359 360 361 875 876 877 254 255 256 362 363 364 620 621 622 878 879 880 447 448 449 623 624 625 260 261 262 626 627 628 599 600 601 629 630 631 450 451 452 378 379 380 381 382 383 384 385 1033 1034 1035 1036 1037 1038 1039 1040 394 395 396 397 398 399 400 401 1041 1042 1043 1044 1045 1046 1047 1048 846 847 848 859 860 861 316 317 318 862 863 864 872 873 874 881 882 883 368 369 370 884 885 886 362 363 364 371 372 373 878 879 880 887 888 889 623 624 625 632 633 634 269 270 271 635 636 637 614 615 616 638 639 640 453 454 455 842 843 844 845 1033 1034 1035 1036 1636 1637 1638 1639 2151 2152 2153 2154 868 869 870 871 1041 1042 1043 1044 1677 1678 1679 1680 2165 2166 2167 2168 1643 1644 1645 2155 2156 2157 849 850 851 1646 1647 1648 1681 1682 1683 2169 2170 2171 875 876 877 1684 1685 1686 620 621 622 878 879 880 1185 1186 1187 1687 1688 1689 1188 1189 1190 1690 1691 1692 626 627 628 1191 1192 1193 1655 1656 1657 1693 1694 1695 1194 1195 1196 1033 1034 1035 1036 1037 1038 1039 1040 2151 2152 2153 2154 2158 2159 2160 2161 1041 1042 1043 1044 1045 1046 1047 1048 2165 2166 2167 2168 2172 2173 2174 2175 2155 2156 2157 2162 2163 2164 862 863 864 1665 1666 1667 2169 2170 2171 2176 2177 2178 884 885 886 1696 1697 1698 878 879 880 887 888 889 1687 1688 1689 1699 1700 1701 1690 1691 1692 1702 1703 1704 635 636 637 1197 1198 1199 1674 1675 1676 1705 1706 1707 1200 1201 1202 309 310 311 312 803 804 805 806 855 856 857 858 890 891 892 893 382 383 384 385 1021 1022 1023 1024 1037 1038 1039 1040 1049 1050 1051 1052 602 603 604 641 642 643 541 542 543 644 645 646 859 860 861 894 895 896 810 811 812 897 898 899 319 320 321 813 814 815 865 866 867 900 901 902 608 609 610 647 648 649 547 548 549 650 651 652 456 457 458 653 654 655 459 460 461 803 804 805 806 1582 1583 1584 1585 890 891 892 893 1708 1709 1710 1711 1021 1022 1023 1024 2130 2131 2132 2133 1049 1050 1051 1052 2179 2180 2181 2182 641 642 643 1203 1204 1205 1586 1587 1588 1712 1713 1714 894 895 896 1715 1716 1717 2134 2135 2136 2183 2184 2185 813 814 815 1592 1593 1594 900 901 902 1718 1719 1720 647 648 649 1206 1207 1208 1595 1596 1597 1721 1722 1723 1209 1210 1211 1724 1725 1726 1212 1213 1214 855 856 857 858 890 891 892 893 1658 1659 1660 1661 1727 1728 1729 1730 1037 1038 1039 1040 1049 1050 1051 1052 2158 2159 2160 2161 2186 2187 2188 2189 1662 1663 1664 1731 1732 1733 644 645 646 1215 1216 1217 2162 2163 2164 2190 2191 2192 897 898 899 1734 1735 1736 865 866 867 900 901 902 1668 1669 1670 1737 1738 1739 1671 1672 1673 1740 1741 1742 650 651 652 1218 1219 1220 1221 1222 1223 1743 1744 1745 1224 1225 1226 890 891 892 893 1708 1709 1710 1711 1727 1728 1729 1730 1227 1228 1229 1230 1049 1050 1051 1052 2179 2180 2181 2182 2186 2187 2188 2189 1746 1747 1748 1749 1731 1732 1733 1231 1232 1233 1712 1713 1714 1234 1235 1236 2190 2191 2192 1750 1751 1752 2183 2184 2185 1753 1754 1755 900 901 902 1718 1719 1720 1737 1738 1739 1237 1238 1239 1740 1741 1742 1240 1241 1242 1721 1722 1723 1243 1244 1245 1246 1247 1248 1756 1757 1758 1249 1250 1251 382 383 384 385 1021 1022 1023 1024 1037 1038 1039 1040 1049 1050 1051 1052 398 399 400 401 1029 1030 1031 1032 1045 1046 1047 1048 1053 1054 1055 1056 859 860 861 894 895 896 810 811 812 897 898 899 881 882 883 903 904 905 832 833 834 906 907 908 371 372 373 835 836 837 887 888 889 909 910 911 632 633 634 656 657 658 571 572 573 659 660 661 653 654 655 662 663 664 462 463 464 1021 1022 1023 1024 2130 2131 2132 2133 1049 1050 1051 1052 2179 2180 2181 2182 1029 1030 1031 1032 2144 2145 2146 2147 1053 1054 1055 1056 2193 2194 2195 2196 894 895 896 1715 1716 1717 2134 2135 2136 2183 2184 2185 903 904 905 1759 1760 1761 2148 2149 2150 2197 2198 2199 835 836 837 1623 1624 1625 909 910 911 1762 1763 1764 656 657 658 1252 1253 1254 1626 1627 1628 1765 1766 1767 1724 1725 1726 1768 1769 1770 1255 1256 1257 1037 1038 1039 1040 1049 1050 1051 1052 2158 2159 2160 2161 2186 2187 2188 2189 1045 1046 1047 1048 1053 1054 1055 1056 2172 2173 2174 2175 2200 2201 2202 2203 2162 2163 2164 2190 2191 2192 897 898 899 1734 1735 1736 2176 2177 2178 2204 2205 2206 906 907 908 1771 1772 1773 887 888 889 909 910 911 1699 1700 1701 1774 1775 1776 1702 1703 1704 1777 1778 1779 659 660 661 1258 1259 1260 1743 1744 1745 1780 1781 1782 1261 1262 1263 1049 1050 1051 1052 2179 2180 2181 2182 2186 2187 2188 2189 1746 1747 1748 1749 1053 1054 1055 1056 2193 2194 2195 2196 2200 2201 2202 2203 1783 1784 1785 1786 2190 2191 2192 1750 1751 1752 2183 2184 2185 1753 1754 1755 2204 2205 2206 1787 1788 1789 2197 2198 2199 1790 1791 1792 909 910 911 1762 1763 1764 1774 1775 1776 1264 1265 1266 1777 1778 1779 1267 1268 1269 1765 1766 1767 1270 1271 1272 1756 1757 1758 1793 1794 1795 1273 1274 1275 211 212 213 214 322 323 324 325 326 327 328 329 386 387 388 389 665 666 667 668 912 913 914 915 916 917 918 919 1057 1058 1059 1060 215 216 217 330 331 332 218 219 220 333 334 335 669 670 671 920 921 922 672 673 674 923 924 925 465 466 467 675 676 677 678 679 680 926 927 928 468 469 470 681 682 683 471 472 473 684 685 686 233 234 235 687 688 689 474 475 476 322 323 324 325 339 340 341 342 386 387 388 389 390 391 392 393 912 913 914 915 929 930 931 932 1057 1058 1059 1060 1061 1062 1063 1064 330 331 332 343 344 345 236 237 238 346 347 348 920 921 922 933 934 935 690 691 692 936 937 938 675 676 677 693 694 695 926 927 928 939 940 941 681 682 683 696 697 698 477 478 479 699 700 701 248 249 250 702 703 704 480 481 482 326 327 328 329 386 387 388 389 352 353 354 355 394 395 396 397 916 917 918 919 1057 1058 1059 1060 942 943 944 945 1065 1066 1067 1068 251 252 253 356 357 358 333 334 335 359 360 361 705 706 707 946 947 948 923 924 925 949 950 951 678 679 680 926 927 928 708 709 710 952 953 954 483 484 485 711 712 713 684 685 686 714 715 716 263 264 265 717 718 719 486 487 488 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 356 357 358 365 366 367 346 347 348 368 369 370 946 947 948 955 956 957 936 937 938 958 959 960 926 927 928 939 940 941 952 953 954 961 962 963 711 712 713 720 721 722 699 700 701 723 724 725 272 273 274 726 727 728 489 490 491 665 666 667 668 912 913 914 915 916 917 918 919 1057 1058 1059 1060 1276 1277 1278 1279 1796 1797 1798 1799 1800 1801 1802 1803 2207 2208 2209 2210 669 670 671 920 921 922 672 673 674 923 924 925 1280 1281 1282 1804 1805 1806 1283 1284 1285 1807 1808 1809 1286 1287 1288 1810 1811 1812 1813 1814 1815 2211 2212 2213 1289 1290 1291 1816 1817 1818 1292 1293 1294 1819 1820 1821 687 688 689 1295 1296 1297 1298 1299 1300 912 913 914 915 929 930 931 932 1057 1058 1059 1060 1061 1062 1063 1064 1796 1797 1798 1799 1822 1823 1824 1825 2207 2208 2209 2210 2214 2215 2216 2217 920 921 922 933 934 935 690 691 692 936 937 938 1804 1805 1806 1826 1827 1828 1301 1302 1303 1829 1830 1831 1810 1811 1812 1832 1833 1834 2211 2212 2213 2218 2219 2220 1816 1817 1818 1835 1836 1837 1304 1305 1306 1838 1839 1840 702 703 704 1307 1308 1309 1310 1311 1312 916 917 918 919 1057 1058 1059 1060 942 943 944 945 1065 1066 1067 1068 1800 1801 1802 1803 2207 2208 2209 2210 1841 1842 1843 1844 2221 2222 2223 2224 705 706 707 946 947 948 923 924 925 949 950 951 1313 1314 1315 1845 1846 1847 1807 1808 1809 1848 1849 1850 1813 1814 1815 2211 2212 2213 1851 1852 1853 2225 2226 2227 1316 1317 1318 1854 1855 1856 1819 1820 1821 1857 1858 1859 717 718 719 1319 1320 1321 1322 1323 1324 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 2207 2208 2209 2210 2214 2215 2216 2217 2221 2222 2223 2224 2228 2229 2230 2231 946 947 948 955 956 957 936 937 938 958 959 960 1845 1846 1847 1860 1861 1862 1829 1830 1831 1863 1864 1865 2211 2212 2213 2218 2219 2220 2225 2226 2227 2232 2233 2234 1854 1855 1856 1866 1867 1868 1838 1839 1840 1869 1870 1871 726 727 728 1325 1326 1327 1328 1329 1330 339 340 341 342 816 817 818 819 390 391 392 393 1025 1026 1027 1028 929 930 931 932 964 965 966 967 1061 1062 1063 1064 1073 1074 1075 1076 343 344 345 820 821 822 553 554 555 823 824 825 933 934 935 968 969 970 729 730 731 971 972 973 693 694 695 732 733 734 939 940 941 974 975 976 696 697 698 735 736 737 492 493 494 738 739 740 565 566 567 741 742 743 495 496 497 816 817 818 819 1601 1602 1603 1604 1025 1026 1027 1028 2137 2138 2139 2140 964 965 966 967 1872 1873 1874 1875 1073 1074 1075 1076 2235 2236 2237 2238 820 821 822 1605 1606 1607 1608 1609 1610 2141 2142 2143 968 969 970 1876 1877 1878 1879 1880 1881 2239 2240 2241 732 733 734 1331 1332 1333 974 975 976 1882 1883 1884 735 736 737 1334 1335 1336 1337 1338 1339 1885 1886 1887 1617 1618 1619 1888 1889 1890 1340 1341 1342 390 391 392 393 1025 1026 1027 1028 398 399 400 401 1029 1030 1031 1032 1061 1062 1063 1064 1073 1074 1075 1076 1069 1070 1071 1072 1077 1078 1079 1080 365 366 367 829 830 831 823 824 825 832 833 834 955 956 957 977 978 979 971 972 973 980 981 982 939 940 941 974 975 976 961 962 963 983 984 985 720 721 722 744 745 746 738 739 740 747 748 749 574 575 576 750 751 752 498 499 500 1025 1026 1027 1028 2137 2138 2139 2140 1029 1030 1031 1032 2144 2145 2146 2147 1073 1074 1075 1076 2235 2236 2237 2238 1077 1078 1079 1080 2242 2243 2244 2245 829 830 831 1620 1621 1622 2141 2142 2143 2148 2149 2150 977 978 979 1891 1892 1893 2239 2240 2241 2246 2247 2248 974 975 976 1882 1883 1884 983 984 985 1894 1895 1896 744 745 746 1343 1344 1345 1885 1886 1887 1897 1898 1899 1629 1630 1631 1900 1901 1902 1346 1347 1348 929 930 931 932 964 965 966 967 1061 1062 1063 1064 1073 1074 1075 1076 1822 1823 1824 1825 1903 1904 1905 1906 2214 2215 2216 2217 2249 2250 2251 2252 933 934 935 968 969 970 729 730 731 971 972 973 1826 1827 1828 1907 1908 1909 1349 1350 1351 1910 1911 1912 1832 1833 1834 1913 1914 1915 2218 2219 2220 2253 2254 2255 1835 1836 1837 1916 1917 1918 1352 1353 1354 1919 1920 1921 741 742 743 1355 1356 1357 1358 1359 1360 964 965 966 967 1872 1873 1874 1875 1073 1074 1075 1076 2235 2236 2237 2238 1903 1904 1905 1906 1361 1362 1363 1364 2249 2250 2251 2252 1922 1923 1924 1925 968 969 970 1876 1877 1878 1879 1880 1881 2239 2240 2241 1907 1908 1909 1365 1366 1367 1368 1369 1370 1926 1927 1928 1913 1914 1915 1371 1372 1373 2253 2254 2255 1929 1930 1931 1916 1917 1918 1374 1375 1376 1377 1378 1379 1932 1933 1934 1888 1889 1890 1380 1381 1382 1383 1384 1385 1061 1062 1063 1064 1073 1074 1075 1076 1069 1070 1071 1072 1077 1078 1079 1080 2214 2215 2216 2217 2249 2250 2251 2252 2228 2229 2230 2231 2256 2257 2258 2259 955 956 957 977 978 979 971 972 973 980 981 982 1860 1861 1862 1935 1936 1937 1910 1911 1912 1938 1939 1940 2218 2219 2220 2253 2254 2255 2232 2233 2234 2260 2261 2262 1866 1867 1868 1941 1942 1943 1919 1920 1921 1944 1945 1946 750 751 752 1386 1387 1388 1389 1390 1391 1073 1074 1075 1076 2235 2236 2237 2238 1077 1078 1079 1080 2242 2243 2244 2245 2249 2250 2251 2252 1922 1923 1924 1925 2256 2257 2258 2259 1947 1948 1949 1950 977 978 979 1891 1892 1893 2239 2240 2241 2246 2247 2248 1935 1936 1937 1392 1393 1394 1926 1927 1928 1951 1952 1953 2253 2254 2255 1929 1930 1931 2260 2261 2262 1954 1955 1956 1941 1942 1943 1395 1396 1397 1932 1933 1934 1957 1958 1959 1900 1901 1902 1398 1399 1400 1401 1402 1403 352 353 354 355 394 395 396 397 868 869 870 871 1041 1042 1043 1044 942 943 944 945 1065 1066 1067 1068 986 987 988 989 1081 1082 1083 1084 617 618 619 872 873 874 359 360 361 875 876 877 753 754 755 990 991 992 949 950 951 993 994 995 708 709 710 952 953 954 756 757 758 996 997 998 501 502 503 759 760 761 714 715 716 762 763 764 629 630 631 765 766 767 504 505 506 394 395 396 397 398 399 400 401 1041 1042 1043 1044 1045 1046 1047 1048 1065 1066 1067 1068 1069 1070 1071 1072 1081 1082 1083 1084 1085 1086 1087 1088 872 873 874 881 882 883 368 369 370 884 885 886 990 991 992 999 1000 1001 958 959 960 1002 1003 1004 952 953 954 961 962 963 996 997 998 1005 1006 1007 759 760 761 768 769 770 723 724 725 771 772 773 638 639 640 774 775 776 507 508 509 868 869 870 871 1041 1042 1043 1044 1677 1678 1679 1680 2165 2166 2167 2168 986 987 988 989 1081 1082 1083 1084 1960 1961 1962 1963 2263 2264 2265 2266 1681 1682 1683 2169 2170 2171 875 876 877 1684 1685 1686 1964 1965 1966 2267 2268 2269 993 994 995 1967 1968 1969 756 757 758 996 997 998 1404 1405 1406 1970 1971 1972 1407 1408 1409 1973 1974 1975 762 763 764 1410 1411 1412 1693 1694 1695 1976 1977 1978 1413 1414 1415 1041 1042 1043 1044 1045 1046 1047 1048 2165 2166 2167 2168 2172 2173 2174 2175 1081 1082 1083 1084 1085 1086 1087 1088 2263 2264 2265 2266 2270 2271 2272 2273 2169 2170 2171 2176 2177 2178 884 885 886 1696 1697 1698 2267 2268 2269 2274 2275 2276 1002 1003 1004 1979 1980 1981 996 997 998 1005 1006 1007 1970 1971 1972 1982 1983 1984 1973 1974 1975 1985 1986 1987 771 772 773 1416 1417 1418 1705 1706 1707 1988 1989 1990 1419 1420 1421 942 943 944 945 1065 1066 1067 1068 986 987 988 989 1081 1082 1083 1084 1841 1842 1843 1844 2221 2222 2223 2224 1991 1992 1993 1994 2277 2278 2279 2280 753 754 755 990 991 992 949 950 951 993 994 995 1422 1423 1424 1995 1996 1997 1848 1849 1850 1998 1999 2000 1851 1852 1853 2225 2226 2227 2001 2002 2003 2281 2282 2283 1425 1426 1427 2004 2005 2006 1857 1858 1859 2007 2008 2009 765 766 767 1428 1429 1430 1431 1432 1433 1065 1066 1067 1068 1069 1070 1071 1072 1081 1082 1083 1084 1085 1086 1087 1088 2221 2222 2223 2224 2228 2229 2230 2231 2277 2278 2279 2280 2284 2285 2286 2287 990 991 992 999 1000 1001 958 959 960 1002 1003 1004 1995 1996 1997 2010 2011 2012 1863 1864 1865 2013 2014 2015 2225 2226 2227 2232 2233 2234 2281 2282 2283 2288 2289 2290 2004 2005 2006 2016 2017 2018 1869 1870 1871 2019 2020 2021 774 775 776 1434 1435 1436 1437 1438 1439 986 987 988 989 1081 1082 1083 1084 1960 1961 1962 1963 2263 2264 2265 2266 1991 1992 1993 1994 2277 2278 2279 2280 1440 1441 1442 1443 2022 2023 2024 2025 1964 1965 1966 2267 2268 2269 993 994 995 1967 1968 1969 1444 1445 1446 2026 2027 2028 1998 1999 2000 1447 1448 1449 2001 2002 2003 2281 2282 2283 1450 1451 1452 2029 2030 2031 1453 1454 1455 2032 2033 2034 2007 2008 2009 1456 1457 1458 1976 1977 1978 1459 1460 1461 1462 1463 1464 1081 1082 1083 1084 1085 1086 1087 1088 2263 2264 2265 2266 2270 2271 2272 2273 2277 2278 2279 2280 2284 2285 2286 2287 2022 2023 2024 2025 2035 2036 2037 2038 2267 2268 2269 2274 2275 2276 1002 1003 1004 1979 1980 1981 2026 2027 2028 2039 2040 2041 2013 2014 2015 1465 1466 1467 2281 2282 2283 2288 2289 2290 2029 2030 2031 2042 2043 2044 2032 2033 2034 2045 2046 2047 2019 2020 2021 1468 1469 1470 1988 1989 1990 1471 1472 1473 1474 1475 1476 398 399 400 401 1029 1030 1031 1032 1045 1046 1047 1048 1053 1054 1055 1056 1069 1070 1071 1072 1077 1078 1079 1080 1085 1086 1087 1088 1089 1090 1091 1092 881 882 883 903 904 905 832 833 834 906 907 908 999 1000 1001 1008 1009 1010 980 981 982 1011 1012 1013 961 962 963 983 984 985 1005 1006 1007 1014 1015 1016 768 769 770 777 778 779 747 748 749 780 781 782 662 663 664 783 784 785 510 511 512 1029 1030 1031 1032 2144 2145 2146 2147 1053 1054 1055 1056 2193 2194 2195 2196 1077 1078 1079 1080 2242 2243 2244 2245 1089 1090 1091 1092 2291 2292 2293 2294 903 904 905 1759 1760 1761 2148 2149 2150 2197 2198 2199 1008 1009 1010 2048 2049 2050 2246 2247 2248 2295 2296 2297 983 984 985 1894 1895 1896 1014 1015 1016 2051 2052 2053 777 778 779 1477 1478 1479 1897 1898 1899 2054 2055 2056 1768 1769 1770 2057 2058 2059 1480 1481 1482 1045 1046 1047 1048 1053 1054 1055 1056 2172 2173 2174 2175 2200 2201 2202 2203 1085 1086 1087 1088 1089 1090 1091 1092 2270 2271 2272 2273 2298 2299 2300 2301 2176 2177 2178 2204 2205 2206 906 907 908 1771 1772 1773 2274 2275 2276 2302 2303 2304 1011 1012 1013 2060 2061 2062 1005 1006 1007 1014 1015 1016 1982 1983 1984 2063 2064 2065 1985 1986 1987 2066 2067 2068 780 781 782 1483 1484 1485 1780 1781 1782 2069 2070 2071 1486 1487 1488 1053 1054 1055 1056 2193 2194 2195 2196 2200 2201 2202 2203 1783 1784 1785 1786 1089 1090 1091 1092 2291 2292 2293 2294 2298 2299 2300 2301 2072 2073 2074 2075 2204 2205 2206 1787 1788 1789 2197 2198 2199 1790 1791 1792 2302 2303 2304 2076 2077 2078 2295 2296 2297 2079 2080 2081 1014 1015 1016 2051 2052 2053 2063 2064 2065 1489 1490 1491 2066 2067 2068 1492 1493 1494 2054 2055 2056 1495 1496 1497 1793 1794 1795 2082 2083 2084 1498 1499 1500 1069 1070 1071 1072 1077 1078 1079 1080 1085 1086 1087 1088 1089 1090 1091 1092 2228 2229 2230 2231 2256 2257 2258 2259 2284 2285 2286 2287 2305 2306 2307 2308 999 1000 1001 1008 1009 1010 980 981 982 1011 1012 1013 2010 2011 2012 2085 2086 2087 1938 1939 1940 2088 2089 2090 2232 2233 2234 2260 2261 2262 2288 2289 2290 2309 2310 2311 2016 2017 2018 2091 2092 2093 1944 1945 1946 2094 2095 2096 783 784 785 1501 1502 1503 1504 1505 1506 1077 1078 1079 1080 2242 2243 2244 2245 1089 1090 1091 1092 2291 2292 2293 2294 2256 2257 2258 2259 1947 1948 1949 1950 2305 2306 2307 2308 2097 2098 2099 2100 1008 1009 1010 2048 2049 2050 2246 2247 2248 2295 2296 2297 2085 2086 2087 1507 1508 1509 1951 1952 1953 2101 2102 2103 2260 2261 2262 1954 1955 1956 2309 2310 2311 2104 2105 2106 2091 2092 2093 1510 1511 1512 1957 1958 1959 2107 2108 2109 2057 2058 2059 1513 1514 1515 1516 1517 1518 1085 1086 1087 1088 1089 1090 1091 1092 2270 2271 2272 2273 2298 2299 2300 2301 2284 2285 2286 2287 2305 2306 2307 2308 2035 2036 2037 2038 2110 2111 2112 2113 2274 2275 2276 2302 2303 2304 1011 1012 1013 2060 2061 2062 2039 2040 2041 2114 2115 2116 2088 2089 2090 1519 1520 1521 2288 2289 2290 2309 2310 2311 2042 2043 2044 2117 2118 2119 2045 2046 2047 2120 2121 2122 2094 2095 2096 1522 1523 1524 2069 2070 2071 1525 1526 1527 1528 1529 1530 1089 1090 1091 1092 2291 2292 2293 2294 2298 2299 2300 2301 2072 2073 2074 2075 2305 2306 2307 2308 2097 2098 2099 2100 2110 2111 2112 2113 1531 1532 1533 1534 2302 2303 2304 2076 2077 2078 2295 2296 2297 2079 2080 2081 2114 2115 2116 1535 1536 1537 2101 2102 2103 1538 1539 1540 2309 2310 2311 2104 2105 2106 2117 2118 2119 1541 1542 1543 2120 2121 2122 1544 1545 1546 2107 2108 2109 1547 1548 1549 2082 2083 2084 1550 1551 1552 1553 1554 1555 192 0 22 23 24 98 99 100 110 111 112 116 117 118 128 129 130 134 135 136 140 141 142 143 144 145 411 412 413 1115 1116 1117 417 418 419 1127 1128 1129 423 424 425 1139 1140 1141 426 427 428 1145 1146 1147 438 439 440 444 445 446 1170 1171 1172 1182 1183 1184 450 451 452 453 454 455 1194 1195 1196 1200 1201 1202 459 460 461 1212 1213 1214 1224 1225 1226 1249 1250 1251 462 463 464 1255 1256 1257 1261 1262 1263 1273 1274 1275 474 475 476 480 481 482 486 487 488 489 490 491 1298 1299 1300 1310 1311 1312 1322 1323 1324 1328 1329 1330 495 496 497 1340 1341 1342 498 499 500 1346 1347 1348 1358 1359 1360 1383 1384 1385 1389 1390 1391 1401 1402 1403 504 505 506 507 508 509 1413 1414 1415 1419 1420 1421 1431 1432 1433 1437 1438 1439 1462 1463 1464 1474 1475 1476 510 511 512 1480 1481 1482 1486 1487 1488 1498 1499 1500 1504 1505 1506 1516 1517 1518 1528 1529 1530 1553 1554 1555 0 0 0 15 1 0
-3 0 0 1098 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 7 8 9 89 90 91 402 403 404 1100 1101 1102 4 5 6 101 102 103 429 430 431 1152 1153 1154 10 11 12 119 120 121 465 466 467 1286 1287 1288 1097 1098 1099 1118 1119 1120 1203 1204 1205 1231 1232 1233 1103 1104 1105 1130 1131 1132 1331 1332 1333 1371 1372 1373 1155 1156 1157 1173 1174 1175 1215 1216 1217 1234 1235 1236 1158 1159 1160 1185 1186 1187 1404 1405 1406 1450 1451 1452 1237 1238 1239 1264 1265 1266 1489 1490 1491 1541 1542 1543 1283 1284 1285 1301 1302 1303 1349 1350 1351 1368 1369 1370 1280 1281 1282 1313 1314 1315 1422 1423 1424 1444 1445 1446 1365 1366 1367 1392 1393 1394 1507 1508 1509 1535 1536 1537 1447 1448 1449 1465 1466 1467 1519 1520 1521 1538 1539 1540 218 219 220 236 237 238 553 554 555 1608 1609 1610 159 160 161 239 240 241 693 694 695 1832 1833 1834 150 151 152 196 197 198 602 603 604 1662 1663 1664 178 179 180 199 200 201 541 542 543 1586 1587 1588 184 185 186 254 255 256 708 709 710 1851 1852 1853 215 216 217 251 252 253 617 618 619 1681 1682 1683 1592 1593 1594 1623 1624 1625 1894 1895 1896 1954 1955 1956 1605 1606 1607 1620 1621 1622 1759 1760 1761 1787 1788 1789 1684 1685 1686 1696 1697 1698 1771 1772 1773 1790 1791 1792 1668 1669 1670 1699 1700 1701 1982 1983 1984 2042 2043 2044 1826 1827 1828 1860 1861 1862 2010 2011 2012 2039 2040 2041 1848 1849 1850 1863 1864 1865 1938 1939 1940 1951 1952 1953 961 962 963 2232 2233 2234 319 320 321 371 372 373 832 833 834 2148 2149 2150 359 360 361 368 369 370 881 882 883 2176 2177 2178 343 344 345 365 366 367 46 47 48 156 157 158 49 50 51 221 222 223 672 673 674 690 691 692 675 676 677 1810 1811 1812 523 524 525 1570 1571 1572 526 527 528 556 557 558 729 730 731 1879 1880 1881 732 733 734 1913 1914 1915 37 38 39 175 176 177 40 41 42 153 154 155 517 518 519 538 539 540 520 521 522 1564 1565 1566 581 582 583 1640 1641 1642 584 585 586 605 606 607 641 642 643 1731 1732 1733 644 645 646 1712 1713 1714 52 53 54 224 225 226 43 44 45 181 182 183 590 591 592 620 621 622 587 588 589 1643 1644 1645 678 679 680 1813 1814 1815 669 670 671 705 706 707 756 757 758 2001 2002 2003 753 754 755 1964 1965 1966 1573 1574 1575 1611 1612 1613 1567 1568 1569 1589 1590 1591 1718 1719 1720 1762 1763 1764 1715 1716 1717 1750 1751 1752 1882 1883 1884 1929 1930 1931 1876 1877 1878 1891 1892 1893 2051 2052 2053 2104 2105 2106 2048 2049 2050 2076 2077 2078 1646 1647 1648 1665 1666 1667 1649 1650 1651 1687 1688 1689 1967 1968 1969 1979 1980 1981 1970 1971 1972 2029 2030 2031 1734 1735 1736 1753 1754 1755 1737 1738 1739 1774 1775 1776 2060 2061 2062 2079 2080 2081 2063 2064 2065 2117 2118 2119 1804 1805 1806 1845 1846 1847 1807 1808 1809 1829 1830 1831 1907 1908 1909 1935 1936 1937 1910 1911 1912 1926 1927 1928 1995 1996 1997 2026 2027 2028 1998 1999 2000 2013 2014 2015 2085 2086 2087 2114 2115 2116 2088 2089 2090 2101 2102 2103 903 904 905 2204 2205 2206 906 907 908 2197 2198 2199 872 873 874 2169 2170 2171 875 876 877 884 885 886 820 821 822 829 830 831 823 824 825 2141 2142 2143 330 331 332 356 357 358 333 334 335 346 347 348 980 981 982 2246 2247 2248 983 984 985 2260 2261 2262 810 811 812 2134 2135 2136 813 814 815 835 836 837 949 950 951 958 959 960 952 953 954 2225 2226 2227 303 304 305 316 317 318 306 307 308 362 363 364 1005 1006 1007 2288 2289 2290 999 1000 1001 2274 2275 2276 939 940 941 2218 2219 2220 933 934 935 955 956 957 865 866 867 887 888 889 859 860 861 2162 2163 2164 289 290 291 349 350 351 283 284 285 313 314 315 2309 2310 2311 1014 1015 1016 2295 2296 2297 1011 1012 1013 2302 2303 2304 1008 1009 1010 2281 2282 2283 996 997 998 1002 1003 1004 993 994 995 2267 2268 2269 990 991 992 2253 2254 2255 974 975 976 2239 2240 2241 971 972 973 977 978 979 968 969 970 2211 2212 2213 926 927 928 936 937 938 923 924 925 946 947 948 920 921 922 909 910 911 900 901 902 2183 2184 2185 897 898 899 2190 2191 2192 894 895 896 878 879 880 852 853 854 862 863 864 849 850 851 2155 2156 2157 846 847 848 826 827 828 800 801 802 2127 2128 2129 797 798 799 807 808 809 794 795 796 336 337 338 82 83 84 286 287 288 79 80 81 300 301 302 76 77 78 0 0 846 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 16 17 18 125 126 127 92 93 94 131 132 133 471 472 473 1292 1293 1294 477 478 479 1304 1305 1306 405 406 407 420 421 422 1109 1110 1111 1136 1137 1138 492 493 494 1352 1353 1354 1337 1338 1339 1377 1378 1379 19 20 21 95 96 97 107 108 109 113 114 115 408 409 410 1112 1113 1114 414 415 416 1124 1125 1126 435 436 437 441 442 443 1167 1168 1169 1179 1180 1181 456 457 458 1209 1210 1211 1221 1222 1223 1246 1247 1248 13 14 15 104 105 106 122 123 124 137 138 139 432 433 434 1161 1162 1163 447 448 449 1188 1189 1190 468 469 470 483 484 485 1289 1290 1291 1316 1317 1318 501 502 503 1407 1408 1409 1425 1426 1427 1453 1454 1455 1106 1107 1108 1121 1122 1123 1133 1134 1135 1142 1143 1144 1206 1207 1208 1240 1241 1242 1252 1253 1254 1267 1268 1269 1334 1335 1336 1343 1344 1345 1374 1375 1376 1395 1396 1397 1477 1478 1479 1492 1493 1494 1510 1511 1512 1544 1545 1546 1164 1165 1166 1191 1192 1193 1176 1177 1178 1197 1198 1199 1410 1411 1412 1456 1457 1458 1416 1417 1418 1468 1469 1470 1218 1219 1220 1258 1259 1260 1243 1244 1245 1270 1271 1272 1483 1484 1485 1522 1523 1524 1495 1496 1497 1547 1548 1549 1295 1296 1297 1307 1308 1309 1319 1320 1321 1325 1326 1327 1355 1356 1357 1380 1381 1382 1386 1387 1388 1398 1399 1400 1428 1429 1430 1434 1435 1436 1459 1460 1461 1471 1472 1473 1501 1502 1503 1513 1514 1515 1525 1526 1527 1550 1551 1552 662 663 664 1768 1769 1770 1780 1781 1782 1793 1794 1795 629 630 631 638 639 640 1693 1694 1695 1705 1706 1707 565 566 567 1617 1618 1619 574 575 576 1629 1630 1631 233 234 235 248 249 250 263 264 265 272 273 274 747 748 749 1944 1945 1946 1897 1898 1899 1957 1958 1959 547 548 549 571 572 573 1595 1596 1597 1626 1627 1628 714 715 716 1857 1858 1859 723 724 725 1869 1870 1871 190 191 192 260 261 262 205 206 207 269 270 271 768 769 770 1985 1986 1987 2016 2017 2018 2045 2046 2047 696 697 698 720 721 722 1835 1836 1837 1866 1867 1868 608 609 610 1671 1672 1673 632 633 634 1702 1703 1704 162 163 164 202 203 204 242 243 244 266 267 268 2082 2083 2084 2069 2070 2071 2057 2058 2059 783 784 785 2107 2108 2109 2054 2055 2056 2094 2095 2096 780 781 782 2120 2121 2122 2091 2092 2093 2066 2067 2068 777 778 779 1988 1989 1990 1976 1977 1978 774 775 776 765 766 767 2019 2020 2021 771 772 773 2007 2008 2009 762 763 764 2032 2033 2034 2004 2005 2006 1973 1974 1975 759 760 761 1900 1901 1902 750 751 752 1888 1889 1890 741 742 743 1932 1933 1934 1885 1886 1887 1919 1920 1921 738 739 740 1941 1942 1943 1916 1917 1918 744 745 746 735 736 737 726 727 728 717 718 719 702 703 704 687 688 689 1838 1839 1840 699 700 701 1819 1820 1821 684 685 686 1854 1855 1856 1816 1817 1818 711 712 713 681 682 683 1756 1757 1758 1743 1744 1745 1724 1725 1726 653 654 655 1765 1766 1767 1721 1722 1723 659 660 661 650 651 652 1777 1778 1779 656 657 658 1740 1741 1742 647 648 649 1674 1675 1676 1655 1656 1657 614 615 616 599 600 601 635 636 637 611 612 613 626 627 628 596 597 598 1690 1691 1692 623 624 625 1652 1653 1654 593 594 595 1598 1599 1600 550 551 552 1579 1580 1581 535 536 537 1614 1615 1616 1576 1577 1578 562 563 564 532 533 534 568 569 570 559 560 561 544 545 546 529 530 531 208 209 210 193 194 195 168 169 170 61 62 63 245 246 247 165 166 167 230 231 232 58 59 60 257 258 259 227 228 229 187 188 189 55 56 57 73 36 FESystem<3>[FE_Q<3>(2)^3-FE_Q<3>(1)] 23 Policy::Sequential<3,3>
+DEAL::0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2312 2312 0 0 0 0 1 0 0 0 0 2312 0 1 2312 0 1 0 2312 0 0 1 0 1 0 0 2312 0 1 2312 0 0 0 3 0 0 0 4 500 0 0 1 2 3 1093 1094 1095 1096 1148 1149 1150 1151 1227 1228 1229 1230 1276 1277 1278 1279 1361 1362 1363 1364 1440 1441 1442 1443 1531 1532 1533 1534 146 147 148 149 171 172 173 174 211 212 213 214 1582 1583 1584 1585 1601 1602 1603 1604 1658 1659 1660 1661 1677 1678 1679 1680 1783 1784 1785 1786 1822 1823 1824 1825 1841 1842 1843 1844 1947 1948 1949 1950 2035 2036 2037 2038 339 340 341 342 309 310 311 312 352 353 354 355 2144 2145 2146 2147 2172 2173 2174 2175 2228 2229 2230 2231 398 399 400 401 25 26 27 28 513 514 515 516 29 30 31 32 577 578 579 580 33 34 35 36 665 666 667 668 1556 1557 1558 1559 1708 1709 1710 1711 1560 1561 1562 1563 1872 1873 1874 1875 1632 1633 1634 1635 1727 1728 1729 1730 1636 1637 1638 1639 1960 1961 1962 1963 1746 1747 1748 1749 2072 2073 2074 2075 1796 1797 1798 1799 1903 1904 1905 1906 1800 1801 1802 1803 1991 1992 1993 1994 1922 1923 1924 1925 2097 2098 2099 2100 2022 2023 2024 2025 2110 2111 2112 2113 322 323 324 325 816 817 818 819 279 280 281 282 929 930 931 932 275 276 277 278 855 856 857 858 292 293 294 295 803 804 805 806 296 297 298 299 942 943 944 945 326 327 328 329 868 869 870 871 2130 2131 2132 2133 2242 2243 2244 2245 2137 2138 2139 2140 2193 2194 2195 2196 2165 2166 2167 2168 2200 2201 2202 2203 2158 2159 2160 2161 2270 2271 2272 2273 2214 2215 2216 2217 2284 2285 2286 2287 2221 2222 2223 2224 2256 2257 2258 2259 1069 1070 1071 1072 382 383 384 385 1029 1030 1031 1032 394 395 396 397 1045 1046 1047 1048 390 391 392 393 68 69 70 71 912 913 914 915 790 791 792 793 964 965 966 967 64 65 66 67 786 787 788 789 838 839 840 841 890 891 892 893 72 73 74 75 842 843 844 845 916 917 918 919 986 987 988 989 2123 2124 2125 2126 2179 2180 2181 2182 2235 2236 2237 2238 2291 2292 2293 2294 2151 2152 2153 2154 2263 2264 2265 2266 2186 2187 2188 2189 2298 2299 2300 2301 2207 2208 2209 2210 2249 2250 2251 2252 2277 2278 2279 2280 2305 2306 2307 2308 1053 1054 1055 1056 1041 1042 1043 1044 1025 1026 1027 1028 386 387 388 389 1077 1078 1079 1080 1021 1022 1023 1024 1065 1066 1067 1068 378 379 380 381 1085 1086 1087 1088 1061 1062 1063 1064 1037 1038 1039 1040 374 375 376 377 85 86 87 88 1017 1018 1019 1020 1033 1034 1035 1036 1049 1050 1051 1052 1057 1058 1059 1060 1073 1074 1075 1076 1081 1082 1083 1084 1089 1090 1091 1092 1098 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 7 8 9 89 90 91 402 403 404 1100 1101 1102 4 5 6 101 102 103 429 430 431 1152 1153 1154 10 11 12 119 120 121 465 466 467 1286 1287 1288 1097 1098 1099 1118 1119 1120 1203 1204 1205 1231 1232 1233 1103 1104 1105 1130 1131 1132 1331 1332 1333 1371 1372 1373 1155 1156 1157 1173 1174 1175 1215 1216 1217 1234 1235 1236 1158 1159 1160 1185 1186 1187 1404 1405 1406 1450 1451 1452 1237 1238 1239 1264 1265 1266 1489 1490 1491 1541 1542 1543 1283 1284 1285 1301 1302 1303 1349 1350 1351 1368 1369 1370 1280 1281 1282 1313 1314 1315 1422 1423 1424 1444 1445 1446 1365 1366 1367 1392 1393 1394 1507 1508 1509 1535 1536 1537 1447 1448 1449 1465 1466 1467 1519 1520 1521 1538 1539 1540 218 219 220 236 237 238 553 554 555 1608 1609 1610 159 160 161 239 240 241 693 694 695 1832 1833 1834 150 151 152 196 197 198 602 603 604 1662 1663 1664 178 179 180 199 200 201 541 542 543 1586 1587 1588 184 185 186 254 255 256 708 709 710 1851 1852 1853 215 216 217 251 252 253 617 618 619 1681 1682 1683 1592 1593 1594 1623 1624 1625 1894 1895 1896 1954 1955 1956 1605 1606 1607 1620 1621 1622 1759 1760 1761 1787 1788 1789 1684 1685 1686 1696 1697 1698 1771 1772 1773 1790 1791 1792 1668 1669 1670 1699 1700 1701 1982 1983 1984 2042 2043 2044 1826 1827 1828 1860 1861 1862 2010 2011 2012 2039 2040 2041 1848 1849 1850 1863 1864 1865 1938 1939 1940 1951 1952 1953 961 962 963 2232 2233 2234 319 320 321 371 372 373 832 833 834 2148 2149 2150 359 360 361 368 369 370 881 882 883 2176 2177 2178 343 344 345 365 366 367 46 47 48 156 157 158 49 50 51 221 222 223 672 673 674 690 691 692 675 676 677 1810 1811 1812 523 524 525 1570 1571 1572 526 527 528 556 557 558 729 730 731 1879 1880 1881 732 733 734 1913 1914 1915 37 38 39 175 176 177 40 41 42 153 154 155 517 518 519 538 539 540 520 521 522 1564 1565 1566 581 582 583 1640 1641 1642 584 585 586 605 606 607 641 642 643 1731 1732 1733 644 645 646 1712 1713 1714 52 53 54 224 225 226 43 44 45 181 182 183 590 591 592 620 621 622 587 588 589 1643 1644 1645 678 679 680 1813 1814 1815 669 670 671 705 706 707 756 757 758 2001 2002 2003 753 754 755 1964 1965 1966 1573 1574 1575 1611 1612 1613 1567 1568 1569 1589 1590 1591 1718 1719 1720 1762 1763 1764 1715 1716 1717 1750 1751 1752 1882 1883 1884 1929 1930 1931 1876 1877 1878 1891 1892 1893 2051 2052 2053 2104 2105 2106 2048 2049 2050 2076 2077 2078 1646 1647 1648 1665 1666 1667 1649 1650 1651 1687 1688 1689 1967 1968 1969 1979 1980 1981 1970 1971 1972 2029 2030 2031 1734 1735 1736 1753 1754 1755 1737 1738 1739 1774 1775 1776 2060 2061 2062 2079 2080 2081 2063 2064 2065 2117 2118 2119 1804 1805 1806 1845 1846 1847 1807 1808 1809 1829 1830 1831 1907 1908 1909 1935 1936 1937 1910 1911 1912 1926 1927 1928 1995 1996 1997 2026 2027 2028 1998 1999 2000 2013 2014 2015 2085 2086 2087 2114 2115 2116 2088 2089 2090 2101 2102 2103 903 904 905 2204 2205 2206 906 907 908 2197 2198 2199 872 873 874 2169 2170 2171 875 876 877 884 885 886 820 821 822 829 830 831 823 824 825 2141 2142 2143 330 331 332 356 357 358 333 334 335 346 347 348 980 981 982 2246 2247 2248 983 984 985 2260 2261 2262 810 811 812 2134 2135 2136 813 814 815 835 836 837 949 950 951 958 959 960 952 953 954 2225 2226 2227 303 304 305 316 317 318 306 307 308 362 363 364 1005 1006 1007 2288 2289 2290 999 1000 1001 2274 2275 2276 939 940 941 2218 2219 2220 933 934 935 955 956 957 865 866 867 887 888 889 859 860 861 2162 2163 2164 289 290 291 349 350 351 283 284 285 313 314 315 2309 2310 2311 1014 1015 1016 2295 2296 2297 1011 1012 1013 2302 2303 2304 1008 1009 1010 2281 2282 2283 996 997 998 1002 1003 1004 993 994 995 2267 2268 2269 990 991 992 2253 2254 2255 974 975 976 2239 2240 2241 971 972 973 977 978 979 968 969 970 2211 2212 2213 926 927 928 936 937 938 923 924 925 946 947 948 920 921 922 909 910 911 900 901 902 2183 2184 2185 897 898 899 2190 2191 2192 894 895 896 878 879 880 852 853 854 862 863 864 849 850 851 2155 2156 2157 846 847 848 826 827 828 800 801 802 2127 2128 2129 797 798 799 807 808 809 794 795 796 336 337 338 82 83 84 286 287 288 79 80 81 300 301 302 76 77 78 846 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 16 17 18 125 126 127 92 93 94 131 132 133 471 472 473 1292 1293 1294 477 478 479 1304 1305 1306 405 406 407 420 421 422 1109 1110 1111 1136 1137 1138 492 493 494 1352 1353 1354 1337 1338 1339 1377 1378 1379 19 20 21 95 96 97 107 108 109 113 114 115 408 409 410 1112 1113 1114 414 415 416 1124 1125 1126 435 436 437 441 442 443 1167 1168 1169 1179 1180 1181 456 457 458 1209 1210 1211 1221 1222 1223 1246 1247 1248 13 14 15 104 105 106 122 123 124 137 138 139 432 433 434 1161 1162 1163 447 448 449 1188 1189 1190 468 469 470 483 484 485 1289 1290 1291 1316 1317 1318 501 502 503 1407 1408 1409 1425 1426 1427 1453 1454 1455 1106 1107 1108 1121 1122 1123 1133 1134 1135 1142 1143 1144 1206 1207 1208 1240 1241 1242 1252 1253 1254 1267 1268 1269 1334 1335 1336 1343 1344 1345 1374 1375 1376 1395 1396 1397 1477 1478 1479 1492 1493 1494 1510 1511 1512 1544 1545 1546 1164 1165 1166 1191 1192 1193 1176 1177 1178 1197 1198 1199 1410 1411 1412 1456 1457 1458 1416 1417 1418 1468 1469 1470 1218 1219 1220 1258 1259 1260 1243 1244 1245 1270 1271 1272 1483 1484 1485 1522 1523 1524 1495 1496 1497 1547 1548 1549 1295 1296 1297 1307 1308 1309 1319 1320 1321 1325 1326 1327 1355 1356 1357 1380 1381 1382 1386 1387 1388 1398 1399 1400 1428 1429 1430 1434 1435 1436 1459 1460 1461 1471 1472 1473 1501 1502 1503 1513 1514 1515 1525 1526 1527 1550 1551 1552 662 663 664 1768 1769 1770 1780 1781 1782 1793 1794 1795 629 630 631 638 639 640 1693 1694 1695 1705 1706 1707 565 566 567 1617 1618 1619 574 575 576 1629 1630 1631 233 234 235 248 249 250 263 264 265 272 273 274 747 748 749 1944 1945 1946 1897 1898 1899 1957 1958 1959 547 548 549 571 572 573 1595 1596 1597 1626 1627 1628 714 715 716 1857 1858 1859 723 724 725 1869 1870 1871 190 191 192 260 261 262 205 206 207 269 270 271 768 769 770 1985 1986 1987 2016 2017 2018 2045 2046 2047 696 697 698 720 721 722 1835 1836 1837 1866 1867 1868 608 609 610 1671 1672 1673 632 633 634 1702 1703 1704 162 163 164 202 203 204 242 243 244 266 267 268 2082 2083 2084 2069 2070 2071 2057 2058 2059 783 784 785 2107 2108 2109 2054 2055 2056 2094 2095 2096 780 781 782 2120 2121 2122 2091 2092 2093 2066 2067 2068 777 778 779 1988 1989 1990 1976 1977 1978 774 775 776 765 766 767 2019 2020 2021 771 772 773 2007 2008 2009 762 763 764 2032 2033 2034 2004 2005 2006 1973 1974 1975 759 760 761 1900 1901 1902 750 751 752 1888 1889 1890 741 742 743 1932 1933 1934 1885 1886 1887 1919 1920 1921 738 739 740 1941 1942 1943 1916 1917 1918 744 745 746 735 736 737 726 727 728 717 718 719 702 703 704 687 688 689 1838 1839 1840 699 700 701 1819 1820 1821 684 685 686 1854 1855 1856 1816 1817 1818 711 712 713 681 682 683 1756 1757 1758 1743 1744 1745 1724 1725 1726 653 654 655 1765 1766 1767 1721 1722 1723 659 660 661 650 651 652 1777 1778 1779 656 657 658 1740 1741 1742 647 648 649 1674 1675 1676 1655 1656 1657 614 615 616 599 600 601 635 636 637 611 612 613 626 627 628 596 597 598 1690 1691 1692 623 624 625 1652 1653 1654 593 594 595 1598 1599 1600 550 551 552 1579 1580 1581 535 536 537 1614 1615 1616 1576 1577 1578 562 563 564 532 533 534 568 569 570 559 560 561 544 545 546 529 530 531 208 209 210 193 194 195 168 169 170 61 62 63 245 246 247 165 166 167 230 231 232 58 59 60 257 258 259 227 228 229 187 188 189 55 56 57 3 0 18446744073709551615 18446744073709551615 18446744073709551615 4 0 0 0 0 0 0 24 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 4 0 0 0 0 0 0 192 0 22 23 24 98 99 100 110 111 112 116 117 118 128 129 130 134 135 136 140 141 142 143 144 145 411 412 413 1115 1116 1117 417 418 419 1127 1128 1129 423 424 425 1139 1140 1141 426 427 428 1145 1146 1147 438 439 440 444 445 446 1170 1171 1172 1182 1183 1184 450 451 452 453 454 455 1194 1195 1196 1200 1201 1202 459 460 461 1212 1213 1214 1224 1225 1226 1249 1250 1251 462 463 464 1255 1256 1257 1261 1262 1263 1273 1274 1275 474 475 476 480 481 482 486 487 488 489 490 491 1298 1299 1300 1310 1311 1312 1322 1323 1324 1328 1329 1330 495 496 497 1340 1341 1342 498 499 500 1346 1347 1348 1358 1359 1360 1383 1384 1385 1389 1390 1391 1401 1402 1403 504 505 506 507 508 509 1413 1414 1415 1419 1420 1421 1431 1432 1433 1437 1438 1439 1462 1463 1464 1474 1475 1476 510 511 512 1480 1481 1482 1486 1487 1488 1498 1499 1500 1504 1505 1506 1516 1517 1518 1528 1529 1530 1553 1554 1555 0 0 3 0 0 0 4 0 0 367 0 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 945 948 951 954 957 960 963 966 969 972 975 978 981 984 987 990 993 996 999 1002 1005 1008 1011 1014 1017 1020 1023 1026 1029 1032 1035 1038 1041 1044 1047 1050 1053 1056 1059 1062 1065 1068 1071 1074 1077 1080 1083 1086 1089 1092 1095 1098 283 0 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 2 0 0 3 4 0 0 0 0 0 0 9 0 0 3 6 9 12 15 18 21 24 4 0 0 0 0 0 0 65 0 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 0 0 3 0 89 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 712 0 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 5696 0 0 1 2 3 25 26 27 28 29 30 31 32 64 65 66 67 33 34 35 36 68 69 70 71 72 73 74 75 85 86 87 88 4 5 6 37 38 39 7 8 9 40 41 42 43 44 45 76 77 78 46 47 48 79 80 81 10 11 12 49 50 51 52 53 54 82 83 84 13 14 15 55 56 57 16 17 18 58 59 60 19 20 21 61 62 63 22 23 24 25 26 27 28 146 147 148 149 64 65 66 67 275 276 277 278 68 69 70 71 279 280 281 282 85 86 87 88 374 375 376 377 37 38 39 150 151 152 89 90 91 153 154 155 76 77 78 283 284 285 156 157 158 286 287 288 49 50 51 159 160 161 82 83 84 289 290 291 55 56 57 162 163 164 92 93 94 165 166 167 95 96 97 168 169 170 98 99 100 29 30 31 32 64 65 66 67 171 172 173 174 292 293 294 295 72 73 74 75 85 86 87 88 296 297 298 299 378 379 380 381 101 102 103 175 176 177 40 41 42 178 179 180 181 182 183 300 301 302 79 80 81 303 304 305 52 53 54 82 83 84 184 185 186 306 307 308 104 105 106 187 188 189 58 59 60 190 191 192 107 108 109 193 194 195 110 111 112 64 65 66 67 275 276 277 278 292 293 294 295 309 310 311 312 85 86 87 88 374 375 376 377 378 379 380 381 382 383 384 385 175 176 177 196 197 198 153 154 155 199 200 201 300 301 302 313 314 315 286 287 288 316 317 318 82 83 84 289 290 291 306 307 308 319 320 321 187 188 189 202 203 204 165 166 167 205 206 207 113 114 115 208 209 210 116 117 118 33 34 35 36 68 69 70 71 72 73 74 75 85 86 87 88 211 212 213 214 322 323 324 325 326 327 328 329 386 387 388 389 43 44 45 76 77 78 46 47 48 79 80 81 215 216 217 330 331 332 218 219 220 333 334 335 119 120 121 221 222 223 224 225 226 336 337 338 122 123 124 227 228 229 125 126 127 230 231 232 61 62 63 233 234 235 128 129 130 68 69 70 71 279 280 281 282 85 86 87 88 374 375 376 377 322 323 324 325 339 340 341 342 386 387 388 389 390 391 392 393 76 77 78 283 284 285 156 157 158 286 287 288 330 331 332 343 344 345 236 237 238 346 347 348 221 222 223 239 240 241 336 337 338 349 350 351 227 228 229 242 243 244 131 132 133 245 246 247 168 169 170 248 249 250 134 135 136 72 73 74 75 85 86 87 88 296 297 298 299 378 379 380 381 326 327 328 329 386 387 388 389 352 353 354 355 394 395 396 397 181 182 183 300 301 302 79 80 81 303 304 305 251 252 253 356 357 358 333 334 335 359 360 361 224 225 226 336 337 338 254 255 256 362 363 364 137 138 139 257 258 259 230 231 232 260 261 262 193 194 195 263 264 265 140 141 142 85 86 87 88 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 300 301 302 313 314 315 286 287 288 316 317 318 356 357 358 365 366 367 346 347 348 368 369 370 336 337 338 349 350 351 362 363 364 371 372 373 257 258 259 266 267 268 245 246 247 269 270 271 208 209 210 272 273 274 143 144 145 146 147 148 149 513 514 515 516 275 276 277 278 786 787 788 789 279 280 281 282 790 791 792 793 374 375 376 377 1017 1018 1019 1020 150 151 152 517 518 519 402 403 404 520 521 522 283 284 285 794 795 796 523 524 525 797 798 799 159 160 161 526 527 528 289 290 291 800 801 802 162 163 164 529 530 531 405 406 407 532 533 534 408 409 410 535 536 537 411 412 413 513 514 515 516 1093 1094 1095 1096 786 787 788 789 1556 1557 1558 1559 790 791 792 793 1560 1561 1562 1563 1017 1018 1019 1020 2123 2124 2125 2126 517 518 519 1097 1098 1099 1100 1101 1102 1564 1565 1566 794 795 796 1567 1568 1569 1570 1571 1572 2127 2128 2129 526 527 528 1103 1104 1105 800 801 802 1573 1574 1575 529 530 531 1106 1107 1108 1109 1110 1111 1576 1577 1578 1112 1113 1114 1579 1580 1581 1115 1116 1117 275 276 277 278 786 787 788 789 309 310 311 312 803 804 805 806 374 375 376 377 1017 1018 1019 1020 382 383 384 385 1021 1022 1023 1024 196 197 198 538 539 540 520 521 522 541 542 543 313 314 315 807 808 809 797 798 799 810 811 812 289 290 291 800 801 802 319 320 321 813 814 815 202 203 204 544 545 546 532 533 534 547 548 549 414 415 416 550 551 552 417 418 419 786 787 788 789 1556 1557 1558 1559 803 804 805 806 1582 1583 1584 1585 1017 1018 1019 1020 2123 2124 2125 2126 1021 1022 1023 1024 2130 2131 2132 2133 538 539 540 1118 1119 1120 1564 1565 1566 1586 1587 1588 807 808 809 1589 1590 1591 2127 2128 2129 2134 2135 2136 800 801 802 1573 1574 1575 813 814 815 1592 1593 1594 544 545 546 1121 1122 1123 1576 1577 1578 1595 1596 1597 1124 1125 1126 1598 1599 1600 1127 1128 1129 279 280 281 282 790 791 792 793 374 375 376 377 1017 1018 1019 1020 339 340 341 342 816 817 818 819 390 391 392 393 1025 1026 1027 1028 283 284 285 794 795 796 523 524 525 797 798 799 343 344 345 820 821 822 553 554 555 823 824 825 239 240 241 556 557 558 349 350 351 826 827 828 242 243 244 559 560 561 420 421 422 562 563 564 535 536 537 565 566 567 423 424 425 790 791 792 793 1560 1561 1562 1563 1017 1018 1019 1020 2123 2124 2125 2126 816 817 818 819 1601 1602 1603 1604 1025 1026 1027 1028 2137 2138 2139 2140 794 795 796 1567 1568 1569 1570 1571 1572 2127 2128 2129 820 821 822 1605 1606 1607 1608 1609 1610 2141 2142 2143 556 557 558 1130 1131 1132 826 827 828 1611 1612 1613 559 560 561 1133 1134 1135 1136 1137 1138 1614 1615 1616 1579 1580 1581 1617 1618 1619 1139 1140 1141 374 375 376 377 1017 1018 1019 1020 382 383 384 385 1021 1022 1023 1024 390 391 392 393 1025 1026 1027 1028 398 399 400 401 1029 1030 1031 1032 313 314 315 807 808 809 797 798 799 810 811 812 365 366 367 829 830 831 823 824 825 832 833 834 349 350 351 826 827 828 371 372 373 835 836 837 266 267 268 568 569 570 562 563 564 571 572 573 550 551 552 574 575 576 426 427 428 1017 1018 1019 1020 2123 2124 2125 2126 1021 1022 1023 1024 2130 2131 2132 2133 1025 1026 1027 1028 2137 2138 2139 2140 1029 1030 1031 1032 2144 2145 2146 2147 807 808 809 1589 1590 1591 2127 2128 2129 2134 2135 2136 829 830 831 1620 1621 1622 2141 2142 2143 2148 2149 2150 826 827 828 1611 1612 1613 835 836 837 1623 1624 1625 568 569 570 1142 1143 1144 1614 1615 1616 1626 1627 1628 1598 1599 1600 1629 1630 1631 1145 1146 1147 171 172 173 174 292 293 294 295 577 578 579 580 838 839 840 841 296 297 298 299 378 379 380 381 842 843 844 845 1033 1034 1035 1036 429 430 431 581 582 583 178 179 180 584 585 586 587 588 589 846 847 848 303 304 305 849 850 851 184 185 186 306 307 308 590 591 592 852 853 854 432 433 434 593 594 595 190 191 192 596 597 598 435 436 437 599 600 601 438 439 440 292 293 294 295 309 310 311 312 838 839 840 841 855 856 857 858 378 379 380 381 382 383 384 385 1033 1034 1035 1036 1037 1038 1039 1040 581 582 583 602 603 604 199 200 201 605 606 607 846 847 848 859 860 861 316 317 318 862 863 864 306 307 308 319 320 321 852 853 854 865 866 867 593 594 595 608 609 610 205 206 207 611 612 613 441 442 443 614 615 616 444 445 446 577 578 579 580 838 839 840 841 1148 1149 1150 1151 1632 1633 1634 1635 842 843 844 845 1033 1034 1035 1036 1636 1637 1638 1639 2151 2152 2153 2154 1152 1153 1154 1640 1641 1642 584 585 586 1155 1156 1157 1643 1644 1645 2155 2156 2157 849 850 851 1646 1647 1648 590 591 592 852 853 854 1158 1159 1160 1649 1650 1651 1161 1162 1163 1652 1653 1654 596 597 598 1164 1165 1166 1167 1168 1169 1655 1656 1657 1170 1171 1172 838 839 840 841 855 856 857 858 1632 1633 1634 1635 1658 1659 1660 1661 1033 1034 1035 1036 1037 1038 1039 1040 2151 2152 2153 2154 2158 2159 2160 2161 1640 1641 1642 1662 1663 1664 605 606 607 1173 1174 1175 2155 2156 2157 2162 2163 2164 862 863 864 1665 1666 1667 852 853 854 865 866 867 1649 1650 1651 1668 1669 1670 1652 1653 1654 1671 1672 1673 611 612 613 1176 1177 1178 1179 1180 1181 1674 1675 1676 1182 1183 1184 296 297 298 299 378 379 380 381 842 843 844 845 1033 1034 1035 1036 352 353 354 355 394 395 396 397 868 869 870 871 1041 1042 1043 1044 587 588 589 846 847 848 303 304 305 849 850 851 617 618 619 872 873 874 359 360 361 875 876 877 254 255 256 362 363 364 620 621 622 878 879 880 447 448 449 623 624 625 260 261 262 626 627 628 599 600 601 629 630 631 450 451 452 378 379 380 381 382 383 384 385 1033 1034 1035 1036 1037 1038 1039 1040 394 395 396 397 398 399 400 401 1041 1042 1043 1044 1045 1046 1047 1048 846 847 848 859 860 861 316 317 318 862 863 864 872 873 874 881 882 883 368 369 370 884 885 886 362 363 364 371 372 373 878 879 880 887 888 889 623 624 625 632 633 634 269 270 271 635 636 637 614 615 616 638 639 640 453 454 455 842 843 844 845 1033 1034 1035 1036 1636 1637 1638 1639 2151 2152 2153 2154 868 869 870 871 1041 1042 1043 1044 1677 1678 1679 1680 2165 2166 2167 2168 1643 1644 1645 2155 2156 2157 849 850 851 1646 1647 1648 1681 1682 1683 2169 2170 2171 875 876 877 1684 1685 1686 620 621 622 878 879 880 1185 1186 1187 1687 1688 1689 1188 1189 1190 1690 1691 1692 626 627 628 1191 1192 1193 1655 1656 1657 1693 1694 1695 1194 1195 1196 1033 1034 1035 1036 1037 1038 1039 1040 2151 2152 2153 2154 2158 2159 2160 2161 1041 1042 1043 1044 1045 1046 1047 1048 2165 2166 2167 2168 2172 2173 2174 2175 2155 2156 2157 2162 2163 2164 862 863 864 1665 1666 1667 2169 2170 2171 2176 2177 2178 884 885 886 1696 1697 1698 878 879 880 887 888 889 1687 1688 1689 1699 1700 1701 1690 1691 1692 1702 1703 1704 635 636 637 1197 1198 1199 1674 1675 1676 1705 1706 1707 1200 1201 1202 309 310 311 312 803 804 805 806 855 856 857 858 890 891 892 893 382 383 384 385 1021 1022 1023 1024 1037 1038 1039 1040 1049 1050 1051 1052 602 603 604 641 642 643 541 542 543 644 645 646 859 860 861 894 895 896 810 811 812 897 898 899 319 320 321 813 814 815 865 866 867 900 901 902 608 609 610 647 648 649 547 548 549 650 651 652 456 457 458 653 654 655 459 460 461 803 804 805 806 1582 1583 1584 1585 890 891 892 893 1708 1709 1710 1711 1021 1022 1023 1024 2130 2131 2132 2133 1049 1050 1051 1052 2179 2180 2181 2182 641 642 643 1203 1204 1205 1586 1587 1588 1712 1713 1714 894 895 896 1715 1716 1717 2134 2135 2136 2183 2184 2185 813 814 815 1592 1593 1594 900 901 902 1718 1719 1720 647 648 649 1206 1207 1208 1595 1596 1597 1721 1722 1723 1209 1210 1211 1724 1725 1726 1212 1213 1214 855 856 857 858 890 891 892 893 1658 1659 1660 1661 1727 1728 1729 1730 1037 1038 1039 1040 1049 1050 1051 1052 2158 2159 2160 2161 2186 2187 2188 2189 1662 1663 1664 1731 1732 1733 644 645 646 1215 1216 1217 2162 2163 2164 2190 2191 2192 897 898 899 1734 1735 1736 865 866 867 900 901 902 1668 1669 1670 1737 1738 1739 1671 1672 1673 1740 1741 1742 650 651 652 1218 1219 1220 1221 1222 1223 1743 1744 1745 1224 1225 1226 890 891 892 893 1708 1709 1710 1711 1727 1728 1729 1730 1227 1228 1229 1230 1049 1050 1051 1052 2179 2180 2181 2182 2186 2187 2188 2189 1746 1747 1748 1749 1731 1732 1733 1231 1232 1233 1712 1713 1714 1234 1235 1236 2190 2191 2192 1750 1751 1752 2183 2184 2185 1753 1754 1755 900 901 902 1718 1719 1720 1737 1738 1739 1237 1238 1239 1740 1741 1742 1240 1241 1242 1721 1722 1723 1243 1244 1245 1246 1247 1248 1756 1757 1758 1249 1250 1251 382 383 384 385 1021 1022 1023 1024 1037 1038 1039 1040 1049 1050 1051 1052 398 399 400 401 1029 1030 1031 1032 1045 1046 1047 1048 1053 1054 1055 1056 859 860 861 894 895 896 810 811 812 897 898 899 881 882 883 903 904 905 832 833 834 906 907 908 371 372 373 835 836 837 887 888 889 909 910 911 632 633 634 656 657 658 571 572 573 659 660 661 653 654 655 662 663 664 462 463 464 1021 1022 1023 1024 2130 2131 2132 2133 1049 1050 1051 1052 2179 2180 2181 2182 1029 1030 1031 1032 2144 2145 2146 2147 1053 1054 1055 1056 2193 2194 2195 2196 894 895 896 1715 1716 1717 2134 2135 2136 2183 2184 2185 903 904 905 1759 1760 1761 2148 2149 2150 2197 2198 2199 835 836 837 1623 1624 1625 909 910 911 1762 1763 1764 656 657 658 1252 1253 1254 1626 1627 1628 1765 1766 1767 1724 1725 1726 1768 1769 1770 1255 1256 1257 1037 1038 1039 1040 1049 1050 1051 1052 2158 2159 2160 2161 2186 2187 2188 2189 1045 1046 1047 1048 1053 1054 1055 1056 2172 2173 2174 2175 2200 2201 2202 2203 2162 2163 2164 2190 2191 2192 897 898 899 1734 1735 1736 2176 2177 2178 2204 2205 2206 906 907 908 1771 1772 1773 887 888 889 909 910 911 1699 1700 1701 1774 1775 1776 1702 1703 1704 1777 1778 1779 659 660 661 1258 1259 1260 1743 1744 1745 1780 1781 1782 1261 1262 1263 1049 1050 1051 1052 2179 2180 2181 2182 2186 2187 2188 2189 1746 1747 1748 1749 1053 1054 1055 1056 2193 2194 2195 2196 2200 2201 2202 2203 1783 1784 1785 1786 2190 2191 2192 1750 1751 1752 2183 2184 2185 1753 1754 1755 2204 2205 2206 1787 1788 1789 2197 2198 2199 1790 1791 1792 909 910 911 1762 1763 1764 1774 1775 1776 1264 1265 1266 1777 1778 1779 1267 1268 1269 1765 1766 1767 1270 1271 1272 1756 1757 1758 1793 1794 1795 1273 1274 1275 211 212 213 214 322 323 324 325 326 327 328 329 386 387 388 389 665 666 667 668 912 913 914 915 916 917 918 919 1057 1058 1059 1060 215 216 217 330 331 332 218 219 220 333 334 335 669 670 671 920 921 922 672 673 674 923 924 925 465 466 467 675 676 677 678 679 680 926 927 928 468 469 470 681 682 683 471 472 473 684 685 686 233 234 235 687 688 689 474 475 476 322 323 324 325 339 340 341 342 386 387 388 389 390 391 392 393 912 913 914 915 929 930 931 932 1057 1058 1059 1060 1061 1062 1063 1064 330 331 332 343 344 345 236 237 238 346 347 348 920 921 922 933 934 935 690 691 692 936 937 938 675 676 677 693 694 695 926 927 928 939 940 941 681 682 683 696 697 698 477 478 479 699 700 701 248 249 250 702 703 704 480 481 482 326 327 328 329 386 387 388 389 352 353 354 355 394 395 396 397 916 917 918 919 1057 1058 1059 1060 942 943 944 945 1065 1066 1067 1068 251 252 253 356 357 358 333 334 335 359 360 361 705 706 707 946 947 948 923 924 925 949 950 951 678 679 680 926 927 928 708 709 710 952 953 954 483 484 485 711 712 713 684 685 686 714 715 716 263 264 265 717 718 719 486 487 488 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 356 357 358 365 366 367 346 347 348 368 369 370 946 947 948 955 956 957 936 937 938 958 959 960 926 927 928 939 940 941 952 953 954 961 962 963 711 712 713 720 721 722 699 700 701 723 724 725 272 273 274 726 727 728 489 490 491 665 666 667 668 912 913 914 915 916 917 918 919 1057 1058 1059 1060 1276 1277 1278 1279 1796 1797 1798 1799 1800 1801 1802 1803 2207 2208 2209 2210 669 670 671 920 921 922 672 673 674 923 924 925 1280 1281 1282 1804 1805 1806 1283 1284 1285 1807 1808 1809 1286 1287 1288 1810 1811 1812 1813 1814 1815 2211 2212 2213 1289 1290 1291 1816 1817 1818 1292 1293 1294 1819 1820 1821 687 688 689 1295 1296 1297 1298 1299 1300 912 913 914 915 929 930 931 932 1057 1058 1059 1060 1061 1062 1063 1064 1796 1797 1798 1799 1822 1823 1824 1825 2207 2208 2209 2210 2214 2215 2216 2217 920 921 922 933 934 935 690 691 692 936 937 938 1804 1805 1806 1826 1827 1828 1301 1302 1303 1829 1830 1831 1810 1811 1812 1832 1833 1834 2211 2212 2213 2218 2219 2220 1816 1817 1818 1835 1836 1837 1304 1305 1306 1838 1839 1840 702 703 704 1307 1308 1309 1310 1311 1312 916 917 918 919 1057 1058 1059 1060 942 943 944 945 1065 1066 1067 1068 1800 1801 1802 1803 2207 2208 2209 2210 1841 1842 1843 1844 2221 2222 2223 2224 705 706 707 946 947 948 923 924 925 949 950 951 1313 1314 1315 1845 1846 1847 1807 1808 1809 1848 1849 1850 1813 1814 1815 2211 2212 2213 1851 1852 1853 2225 2226 2227 1316 1317 1318 1854 1855 1856 1819 1820 1821 1857 1858 1859 717 718 719 1319 1320 1321 1322 1323 1324 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 2207 2208 2209 2210 2214 2215 2216 2217 2221 2222 2223 2224 2228 2229 2230 2231 946 947 948 955 956 957 936 937 938 958 959 960 1845 1846 1847 1860 1861 1862 1829 1830 1831 1863 1864 1865 2211 2212 2213 2218 2219 2220 2225 2226 2227 2232 2233 2234 1854 1855 1856 1866 1867 1868 1838 1839 1840 1869 1870 1871 726 727 728 1325 1326 1327 1328 1329 1330 339 340 341 342 816 817 818 819 390 391 392 393 1025 1026 1027 1028 929 930 931 932 964 965 966 967 1061 1062 1063 1064 1073 1074 1075 1076 343 344 345 820 821 822 553 554 555 823 824 825 933 934 935 968 969 970 729 730 731 971 972 973 693 694 695 732 733 734 939 940 941 974 975 976 696 697 698 735 736 737 492 493 494 738 739 740 565 566 567 741 742 743 495 496 497 816 817 818 819 1601 1602 1603 1604 1025 1026 1027 1028 2137 2138 2139 2140 964 965 966 967 1872 1873 1874 1875 1073 1074 1075 1076 2235 2236 2237 2238 820 821 822 1605 1606 1607 1608 1609 1610 2141 2142 2143 968 969 970 1876 1877 1878 1879 1880 1881 2239 2240 2241 732 733 734 1331 1332 1333 974 975 976 1882 1883 1884 735 736 737 1334 1335 1336 1337 1338 1339 1885 1886 1887 1617 1618 1619 1888 1889 1890 1340 1341 1342 390 391 392 393 1025 1026 1027 1028 398 399 400 401 1029 1030 1031 1032 1061 1062 1063 1064 1073 1074 1075 1076 1069 1070 1071 1072 1077 1078 1079 1080 365 366 367 829 830 831 823 824 825 832 833 834 955 956 957 977 978 979 971 972 973 980 981 982 939 940 941 974 975 976 961 962 963 983 984 985 720 721 722 744 745 746 738 739 740 747 748 749 574 575 576 750 751 752 498 499 500 1025 1026 1027 1028 2137 2138 2139 2140 1029 1030 1031 1032 2144 2145 2146 2147 1073 1074 1075 1076 2235 2236 2237 2238 1077 1078 1079 1080 2242 2243 2244 2245 829 830 831 1620 1621 1622 2141 2142 2143 2148 2149 2150 977 978 979 1891 1892 1893 2239 2240 2241 2246 2247 2248 974 975 976 1882 1883 1884 983 984 985 1894 1895 1896 744 745 746 1343 1344 1345 1885 1886 1887 1897 1898 1899 1629 1630 1631 1900 1901 1902 1346 1347 1348 929 930 931 932 964 965 966 967 1061 1062 1063 1064 1073 1074 1075 1076 1822 1823 1824 1825 1903 1904 1905 1906 2214 2215 2216 2217 2249 2250 2251 2252 933 934 935 968 969 970 729 730 731 971 972 973 1826 1827 1828 1907 1908 1909 1349 1350 1351 1910 1911 1912 1832 1833 1834 1913 1914 1915 2218 2219 2220 2253 2254 2255 1835 1836 1837 1916 1917 1918 1352 1353 1354 1919 1920 1921 741 742 743 1355 1356 1357 1358 1359 1360 964 965 966 967 1872 1873 1874 1875 1073 1074 1075 1076 2235 2236 2237 2238 1903 1904 1905 1906 1361 1362 1363 1364 2249 2250 2251 2252 1922 1923 1924 1925 968 969 970 1876 1877 1878 1879 1880 1881 2239 2240 2241 1907 1908 1909 1365 1366 1367 1368 1369 1370 1926 1927 1928 1913 1914 1915 1371 1372 1373 2253 2254 2255 1929 1930 1931 1916 1917 1918 1374 1375 1376 1377 1378 1379 1932 1933 1934 1888 1889 1890 1380 1381 1382 1383 1384 1385 1061 1062 1063 1064 1073 1074 1075 1076 1069 1070 1071 1072 1077 1078 1079 1080 2214 2215 2216 2217 2249 2250 2251 2252 2228 2229 2230 2231 2256 2257 2258 2259 955 956 957 977 978 979 971 972 973 980 981 982 1860 1861 1862 1935 1936 1937 1910 1911 1912 1938 1939 1940 2218 2219 2220 2253 2254 2255 2232 2233 2234 2260 2261 2262 1866 1867 1868 1941 1942 1943 1919 1920 1921 1944 1945 1946 750 751 752 1386 1387 1388 1389 1390 1391 1073 1074 1075 1076 2235 2236 2237 2238 1077 1078 1079 1080 2242 2243 2244 2245 2249 2250 2251 2252 1922 1923 1924 1925 2256 2257 2258 2259 1947 1948 1949 1950 977 978 979 1891 1892 1893 2239 2240 2241 2246 2247 2248 1935 1936 1937 1392 1393 1394 1926 1927 1928 1951 1952 1953 2253 2254 2255 1929 1930 1931 2260 2261 2262 1954 1955 1956 1941 1942 1943 1395 1396 1397 1932 1933 1934 1957 1958 1959 1900 1901 1902 1398 1399 1400 1401 1402 1403 352 353 354 355 394 395 396 397 868 869 870 871 1041 1042 1043 1044 942 943 944 945 1065 1066 1067 1068 986 987 988 989 1081 1082 1083 1084 617 618 619 872 873 874 359 360 361 875 876 877 753 754 755 990 991 992 949 950 951 993 994 995 708 709 710 952 953 954 756 757 758 996 997 998 501 502 503 759 760 761 714 715 716 762 763 764 629 630 631 765 766 767 504 505 506 394 395 396 397 398 399 400 401 1041 1042 1043 1044 1045 1046 1047 1048 1065 1066 1067 1068 1069 1070 1071 1072 1081 1082 1083 1084 1085 1086 1087 1088 872 873 874 881 882 883 368 369 370 884 885 886 990 991 992 999 1000 1001 958 959 960 1002 1003 1004 952 953 954 961 962 963 996 997 998 1005 1006 1007 759 760 761 768 769 770 723 724 725 771 772 773 638 639 640 774 775 776 507 508 509 868 869 870 871 1041 1042 1043 1044 1677 1678 1679 1680 2165 2166 2167 2168 986 987 988 989 1081 1082 1083 1084 1960 1961 1962 1963 2263 2264 2265 2266 1681 1682 1683 2169 2170 2171 875 876 877 1684 1685 1686 1964 1965 1966 2267 2268 2269 993 994 995 1967 1968 1969 756 757 758 996 997 998 1404 1405 1406 1970 1971 1972 1407 1408 1409 1973 1974 1975 762 763 764 1410 1411 1412 1693 1694 1695 1976 1977 1978 1413 1414 1415 1041 1042 1043 1044 1045 1046 1047 1048 2165 2166 2167 2168 2172 2173 2174 2175 1081 1082 1083 1084 1085 1086 1087 1088 2263 2264 2265 2266 2270 2271 2272 2273 2169 2170 2171 2176 2177 2178 884 885 886 1696 1697 1698 2267 2268 2269 2274 2275 2276 1002 1003 1004 1979 1980 1981 996 997 998 1005 1006 1007 1970 1971 1972 1982 1983 1984 1973 1974 1975 1985 1986 1987 771 772 773 1416 1417 1418 1705 1706 1707 1988 1989 1990 1419 1420 1421 942 943 944 945 1065 1066 1067 1068 986 987 988 989 1081 1082 1083 1084 1841 1842 1843 1844 2221 2222 2223 2224 1991 1992 1993 1994 2277 2278 2279 2280 753 754 755 990 991 992 949 950 951 993 994 995 1422 1423 1424 1995 1996 1997 1848 1849 1850 1998 1999 2000 1851 1852 1853 2225 2226 2227 2001 2002 2003 2281 2282 2283 1425 1426 1427 2004 2005 2006 1857 1858 1859 2007 2008 2009 765 766 767 1428 1429 1430 1431 1432 1433 1065 1066 1067 1068 1069 1070 1071 1072 1081 1082 1083 1084 1085 1086 1087 1088 2221 2222 2223 2224 2228 2229 2230 2231 2277 2278 2279 2280 2284 2285 2286 2287 990 991 992 999 1000 1001 958 959 960 1002 1003 1004 1995 1996 1997 2010 2011 2012 1863 1864 1865 2013 2014 2015 2225 2226 2227 2232 2233 2234 2281 2282 2283 2288 2289 2290 2004 2005 2006 2016 2017 2018 1869 1870 1871 2019 2020 2021 774 775 776 1434 1435 1436 1437 1438 1439 986 987 988 989 1081 1082 1083 1084 1960 1961 1962 1963 2263 2264 2265 2266 1991 1992 1993 1994 2277 2278 2279 2280 1440 1441 1442 1443 2022 2023 2024 2025 1964 1965 1966 2267 2268 2269 993 994 995 1967 1968 1969 1444 1445 1446 2026 2027 2028 1998 1999 2000 1447 1448 1449 2001 2002 2003 2281 2282 2283 1450 1451 1452 2029 2030 2031 1453 1454 1455 2032 2033 2034 2007 2008 2009 1456 1457 1458 1976 1977 1978 1459 1460 1461 1462 1463 1464 1081 1082 1083 1084 1085 1086 1087 1088 2263 2264 2265 2266 2270 2271 2272 2273 2277 2278 2279 2280 2284 2285 2286 2287 2022 2023 2024 2025 2035 2036 2037 2038 2267 2268 2269 2274 2275 2276 1002 1003 1004 1979 1980 1981 2026 2027 2028 2039 2040 2041 2013 2014 2015 1465 1466 1467 2281 2282 2283 2288 2289 2290 2029 2030 2031 2042 2043 2044 2032 2033 2034 2045 2046 2047 2019 2020 2021 1468 1469 1470 1988 1989 1990 1471 1472 1473 1474 1475 1476 398 399 400 401 1029 1030 1031 1032 1045 1046 1047 1048 1053 1054 1055 1056 1069 1070 1071 1072 1077 1078 1079 1080 1085 1086 1087 1088 1089 1090 1091 1092 881 882 883 903 904 905 832 833 834 906 907 908 999 1000 1001 1008 1009 1010 980 981 982 1011 1012 1013 961 962 963 983 984 985 1005 1006 1007 1014 1015 1016 768 769 770 777 778 779 747 748 749 780 781 782 662 663 664 783 784 785 510 511 512 1029 1030 1031 1032 2144 2145 2146 2147 1053 1054 1055 1056 2193 2194 2195 2196 1077 1078 1079 1080 2242 2243 2244 2245 1089 1090 1091 1092 2291 2292 2293 2294 903 904 905 1759 1760 1761 2148 2149 2150 2197 2198 2199 1008 1009 1010 2048 2049 2050 2246 2247 2248 2295 2296 2297 983 984 985 1894 1895 1896 1014 1015 1016 2051 2052 2053 777 778 779 1477 1478 1479 1897 1898 1899 2054 2055 2056 1768 1769 1770 2057 2058 2059 1480 1481 1482 1045 1046 1047 1048 1053 1054 1055 1056 2172 2173 2174 2175 2200 2201 2202 2203 1085 1086 1087 1088 1089 1090 1091 1092 2270 2271 2272 2273 2298 2299 2300 2301 2176 2177 2178 2204 2205 2206 906 907 908 1771 1772 1773 2274 2275 2276 2302 2303 2304 1011 1012 1013 2060 2061 2062 1005 1006 1007 1014 1015 1016 1982 1983 1984 2063 2064 2065 1985 1986 1987 2066 2067 2068 780 781 782 1483 1484 1485 1780 1781 1782 2069 2070 2071 1486 1487 1488 1053 1054 1055 1056 2193 2194 2195 2196 2200 2201 2202 2203 1783 1784 1785 1786 1089 1090 1091 1092 2291 2292 2293 2294 2298 2299 2300 2301 2072 2073 2074 2075 2204 2205 2206 1787 1788 1789 2197 2198 2199 1790 1791 1792 2302 2303 2304 2076 2077 2078 2295 2296 2297 2079 2080 2081 1014 1015 1016 2051 2052 2053 2063 2064 2065 1489 1490 1491 2066 2067 2068 1492 1493 1494 2054 2055 2056 1495 1496 1497 1793 1794 1795 2082 2083 2084 1498 1499 1500 1069 1070 1071 1072 1077 1078 1079 1080 1085 1086 1087 1088 1089 1090 1091 1092 2228 2229 2230 2231 2256 2257 2258 2259 2284 2285 2286 2287 2305 2306 2307 2308 999 1000 1001 1008 1009 1010 980 981 982 1011 1012 1013 2010 2011 2012 2085 2086 2087 1938 1939 1940 2088 2089 2090 2232 2233 2234 2260 2261 2262 2288 2289 2290 2309 2310 2311 2016 2017 2018 2091 2092 2093 1944 1945 1946 2094 2095 2096 783 784 785 1501 1502 1503 1504 1505 1506 1077 1078 1079 1080 2242 2243 2244 2245 1089 1090 1091 1092 2291 2292 2293 2294 2256 2257 2258 2259 1947 1948 1949 1950 2305 2306 2307 2308 2097 2098 2099 2100 1008 1009 1010 2048 2049 2050 2246 2247 2248 2295 2296 2297 2085 2086 2087 1507 1508 1509 1951 1952 1953 2101 2102 2103 2260 2261 2262 1954 1955 1956 2309 2310 2311 2104 2105 2106 2091 2092 2093 1510 1511 1512 1957 1958 1959 2107 2108 2109 2057 2058 2059 1513 1514 1515 1516 1517 1518 1085 1086 1087 1088 1089 1090 1091 1092 2270 2271 2272 2273 2298 2299 2300 2301 2284 2285 2286 2287 2305 2306 2307 2308 2035 2036 2037 2038 2110 2111 2112 2113 2274 2275 2276 2302 2303 2304 1011 1012 1013 2060 2061 2062 2039 2040 2041 2114 2115 2116 2088 2089 2090 1519 1520 1521 2288 2289 2290 2309 2310 2311 2042 2043 2044 2117 2118 2119 2045 2046 2047 2120 2121 2122 2094 2095 2096 1522 1523 1524 2069 2070 2071 1525 1526 1527 1528 1529 1530 1089 1090 1091 1092 2291 2292 2293 2294 2298 2299 2300 2301 2072 2073 2074 2075 2305 2306 2307 2308 2097 2098 2099 2100 2110 2111 2112 2113 1531 1532 1533 1534 2302 2303 2304 2076 2077 2078 2295 2296 2297 2079 2080 2081 2114 2115 2116 1535 1536 1537 2101 2102 2103 1538 1539 1540 2309 2310 2311 2104 2105 2106 2117 2118 2119 1541 1542 1543 2120 2121 2122 1544 1545 1546 2107 2108 2109 1547 1548 1549 2082 2083 2084 1550 1551 1552 1553 1554 1555 0 0 3 0 2 0 0 89 9 0 0 89 178 267 356 445 534 623 712 65 0 0 89 178 267 356 445 534 623 712 801 890 979 1068 1157 1246 1335 1424 1513 1602 1691 1780 1869 1958 2047 2136 2225 2314 2403 2492 2581 2670 2759 2848 2937 3026 3115 3204 3293 3382 3471 3560 3649 3738 3827 3916 4005 4094 4183 4272 4361 4450 4539 4628 4717 4806 4895 4984 5073 5162 5251 5340 5429 5518 5607 5696 73 36 FESystem<3>[FE_Q<3>(2)^3-FE_Q<3>(1)] 23 Policy::Sequential<3,3>
DEAL::OK
-DEAL::0 0 23 0 1 5 11 4294967295 0 10 0 4294967295 0 12 15 4294967295 0 2 9 1 2 9 4294967295 0 3 8 4294967295 5 0 0 4 8 12 19 0 0 16 16 0 0 0 0 1 0 0 0 0 16 0 1 16 0 1 0 16 0 0 1 0 1 0 0 16 0 1 16 0 0 0 0 0 3 0 0 9 1 0
-0 1 0 0 1 0 4294967295 0 0 0 0 1 0 4294967295 1 0 65535 9
-1 2 0 0 0 2 0 4294967295 4294967295 0 0 0 0 2 0 4294967295 4294967295 2 0 65535 65535 9
-2 4 0 1 65535 65535 65535 4 0 0 7 12 17 22 0 5 11 2 9 14 13 4 2 9 12 15 6 12 15 3 8 7 3 8 10 0 1 6 0 14 13 4 6 7 1 4 0 0 3 4 5 4 0 0 1 65535 65535 1 7 23 Policy::Sequential<1,1>
+DEAL::0 0 0 0 3 0 0 0 2 12 0 5 11 10 0 12 15 2 9 2 9 3 8 0 0 2 0 0 0 0 2 0 0 6 0 14 13 4 6 7 1 3 0 2 7 0 0 2 4 6 8 10 12 1 0 4294967295 2 0 0 2 0 4294967295 4294967295 2 0 0 4 0 0 3 4 5 0 0 3 0 0 0 0 0 22 0 5 11 2 9 14 13 4 2 9 12 15 6 12 15 3 8 7 3 8 10 0 1 3 0 1 0 4294967295 2 0 4294967295 4294967295 4 0 0 7 12 17 0 0 3 0 1 0 0 2 0 0 0 4 0 1 0 0 0 3 0 1 0 65535 2 0 65535 65535 4 0 0 1 65535 65535 2 6 0 0 1 2 3 5 6 0 0 0 0 2 6 0 1 0 0 0 1 0 0 0 0 0 16 16 0 0 0 0 1 0 0 0 0 16 0 1 16 0 1 0 16 0 0 1 0 1 0 0 16 0 1 16 0 0 0 0 0 7 23 Policy::Sequential<1,1>
-DEAL::0 0 137 0 1 104 43 197 4294967295 0 118 165 185 4294967295 0 128 123 37 4294967295 0 150 177 8 4294967295 0 81 147 178 4294967295 0 39 76 72 4294967295 0 141 79 98 4294967295 0 157 56 38 4294967295 0 182 77 159 4294967295 0 201 49 209 1 201 49 209 4294967295 0 68 35 17 4294967295 0 14 130 161 1 14 130 161 4294967295 0 80 208 164 4294967295 0 176 5 122 4294967295 0 74 190 21 4294967295 0 54 169 28 4294967295 0 25 186 132 4294967295 0 93 92 61 4294967295 0 126 139 198 4294967295 0 18 11 95 4294967295 0 193 13 9 4294967295 0 78 155 53 1 78 155 53 4294967295 0 60 31 112 4294967295 0 173 175 45 4294967295 0 59 96 166 4294967295 25 0 0 5 10 15 20 25 30 35 40 45 54 59 68 73 78 83 88 93 98 103 108 113 122 127 132 0 0 210 210 0 0 0 0 1 0 0 0 0 210 0 1 210 0 1 0 210 0 0 1 0 1 0 0 210 0 1 210 0 0 0 0 0 3 0 0 9 1 0
-0 1 0 0 1 0 4294967295 0 0 0 0 1 0 4294967295 1 0 65535 9
-1 4 0 0 0 0 0 4 0 4294967295 4294967295 4294967295 4294967295 0 0 0 0 4 0 4294967295 4294967295 4294967295 4294967295 4 0 65535 65535 65535 65535 9
-2 16 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 41 63 85 107 129 151 173 195 217 239 261 283 305 327 349 371 0 104 43 197 201 49 209 14 130 161 78 155 53 88 86 2 69 12 15 183 82 162 7 181 33 1 89 107 135 19 137 134 16 36 191 24 119 41 101 192 153 138 201 49 209 81 147 178 78 155 53 93 92 61 146 91 94 22 144 171 110 73 51 151 14 130 161 78 155 53 39 76 72 18 11 95 125 205 184 3 199 174 117 108 58 102 78 155 53 93 92 61 18 11 95 182 77 159 184 3 196 194 110 73 200 63 20 100 81 147 178 68 35 17 93 92 61 60 31 112 94 22 67 204 6 121 195 10 30 180 68 35 17 118 165 185 60 31 112 176 5 122 67 204 179 70 136 97 66 84 103 207 93 92 61 60 31 112 182 77 159 193 13 9 196 194 27 140 195 10 129 71 172 170 60 31 112 176 5 122 193 13 9 141 79 98 27 140 23 168 66 84 116 26 131 44 39 76 72 18 11 95 80 208 164 173 175 45 55 65 163 64 117 108 152 149 85 142 18 11 95 182 77 159 173 175 45 126 139 198 163 64 46 187 200 63 143 120 156 83 80 208 164 173 175 45 128 123 37 54 169 28 87 160 99 4 152 149 29 203 32 111 173 175 45 126 139 198 54 169 28 157 56 38 99 4 158 115 143 120 145 48 105 154 182 77 159 193 13 9 126 139 198 59 96 166 46 187 189 206 129 71 124 40 109 133 193 13 9 141 79 98 59 96 166 74 190 21 189 206 62 47 116 26 202 34 114 75 126 139 198 59 96 166 157 56 38 25 186 132 158 115 167 106 124 40 148 0 188 57 59 96 166 74 190 21 25 186 132 150 177 8 167 106 127 50 202 34 90 113 52 42 39 0 36 191 24 119 41 101 192 153 138 51 151 58 102 20 100 30 180 103 207 172 170 131 44 85 142 156 83 32 111 105 154 109 133 114 75 188 57 52 42 16 0 0 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 16 0 0 1 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 0 0 0 12 1 0
-3 0 0 178 0 1 88 86 2 69 12 4294967295 0 146 91 1 15 183 82 162 7 4294967295 1 181 33 1 89 107 4294967295 0 199 174 1 135 19 137 134 16 4294967295 0 94 22 4294967295 0 144 171 4294967295 0 110 73 4294967295 0 125 205 4294967295 0 184 3 4294967295 0 117 108 4294967295 0 196 194 4294967295 0 200 63 4294967295 0 67 204 4294967295 0 6 121 4294967295 0 195 10 4294967295 0 179 70 4294967295 0 136 97 4294967295 0 66 84 4294967295 0 27 140 4294967295 0 129 71 4294967295 0 23 168 4294967295 0 116 26 4294967295 0 55 65 4294967295 0 163 64 4294967295 0 152 149 4294967295 0 46 187 4294967295 0 143 120 4294967295 0 87 160 4294967295 0 99 4 4294967295 0 29 203 4294967295 0 158 115 4294967295 0 145 48 4294967295 0 189 206 4294967295 0 124 40 4294967295 0 62 47 4294967295 0 202 34 4294967295 0 167 106 4294967295 0 148 0 4294967295 0 127 50 4294967295 0 90 113 4294967295 56 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 17 38 70 82 0 46 106 126 78 98 154 170 134 142 166 174 34 58 118 138 54 62 94 102 7 50 24 42 66 90 74 86 110 130 114 122 146 162 150 158 21 23 Policy::Sequential<2,2>
+DEAL::0 0 0 0 3 0 0 0 3 84 0 104 43 197 118 165 185 128 123 37 150 177 8 81 147 178 39 76 72 141 79 98 157 56 38 182 77 159 201 49 209 201 49 209 68 35 17 14 130 161 14 130 161 80 208 164 176 5 122 74 190 21 54 169 28 25 186 132 93 92 61 126 139 198 18 11 95 193 13 9 78 155 53 78 155 53 60 31 112 173 175 45 59 96 166 106 0 181 33 1 89 107 144 171 6 121 136 97 88 86 2 69 12 125 205 55 65 87 160 179 70 23 168 62 47 127 50 29 203 145 48 148 0 90 113 94 22 196 194 46 187 158 115 117 108 200 63 129 71 116 26 146 91 15 183 82 162 7 184 3 199 174 135 19 137 134 16 110 73 67 204 27 140 195 10 66 84 163 64 99 4 152 149 143 120 189 206 167 106 124 40 202 34 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 0 0 3 0 0 0 0 0 0 3 0 0 0 0 39 0 36 191 24 119 41 101 192 153 138 51 151 58 102 20 100 30 180 103 207 172 170 131 44 85 142 156 83 32 111 105 154 109 133 114 75 188 57 52 42 3 0 3 29 0 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 45 0 0 5 7 9 11 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 61 63 65 70 72 74 76 78 80 82 84 86 88 90 92 94 96 101 123 1 0 4294967295 3 0 0 0 0 4 0 4294967295 4294967295 4294967295 4294967295 3 0 0 0 0 16 0 0 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 0 0 3 0 0 0 0 0 371 0 104 43 197 201 49 209 14 130 161 78 155 53 88 86 2 69 12 15 183 82 162 7 181 33 1 89 107 135 19 137 134 16 36 191 24 119 41 101 192 153 138 201 49 209 81 147 178 78 155 53 93 92 61 146 91 94 22 144 171 110 73 51 151 14 130 161 78 155 53 39 76 72 18 11 95 125 205 184 3 199 174 117 108 58 102 78 155 53 93 92 61 18 11 95 182 77 159 184 3 196 194 110 73 200 63 20 100 81 147 178 68 35 17 93 92 61 60 31 112 94 22 67 204 6 121 195 10 30 180 68 35 17 118 165 185 60 31 112 176 5 122 67 204 179 70 136 97 66 84 103 207 93 92 61 60 31 112 182 77 159 193 13 9 196 194 27 140 195 10 129 71 172 170 60 31 112 176 5 122 193 13 9 141 79 98 27 140 23 168 66 84 116 26 131 44 39 76 72 18 11 95 80 208 164 173 175 45 55 65 163 64 117 108 152 149 85 142 18 11 95 182 77 159 173 175 45 126 139 198 163 64 46 187 200 63 143 120 156 83 80 208 164 173 175 45 128 123 37 54 169 28 87 160 99 4 152 149 29 203 32 111 173 175 45 126 139 198 54 169 28 157 56 38 99 4 158 115 143 120 145 48 105 154 182 77 159 193 13 9 126 139 198 59 96 166 46 187 189 206 129 71 124 40 109 133 193 13 9 141 79 98 59 96 166 74 190 21 189 206 62 47 116 26 202 34 114 75 126 139 198 59 96 166 157 56 38 25 186 132 158 115 167 106 124 40 148 0 188 57 59 96 166 74 190 21 25 186 132 150 177 8 167 106 127 50 202 34 90 113 52 42 3 0 1 0 4294967295 4 0 4294967295 4294967295 4294967295 4294967295 16 0 0 41 63 85 107 129 151 173 195 217 239 261 283 305 327 349 0 0 3 0 1 0 0 4 0 0 0 0 0 16 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 0 65535 4 0 65535 65535 65535 65535 16 0 0 1 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 3 26 0 0 1 2 3 4 5 6 7 8 9 11 12 14 15 16 17 18 19 20 21 22 23 25 26 27 28 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 0 0 0 0 3 28 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 44 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 210 210 0 0 0 0 1 0 0 0 0 210 0 1 210 0 1 0 210 0 0 1 0 1 0 0 210 0 1 210 0 0 0 0 0 21 23 Policy::Sequential<2,2>
-DEAL::0 0 785 0 1 1217 903 1574 88 4294967295 0 1892 610 1929 1981 4294967295 0 635 2463 1457 2441 4294967295 0 741 89 1683 1590 4294967295 0 1979 1983 1652 222 4294967295 0 1716 2321 65 649 4294967295 0 946 2084 234 1803 4294967295 0 355 1538 2443 1283 4294967295 0 167 668 916 1477 4294967295 0 1484 1292 2015 143 4294967295 0 892 1893 336 311 4294967295 0 1075 2149 180 1018 4294967295 0 1859 2320 1047 1054 4294967295 0 987 1060 265 325 4294967295 0 2220 83 2281 622 4294967295 0 1556 645 1874 544 4294967295 0 1064 516 2422 1470 4294967295 0 1856 816 1455 1119 4294967295 0 2391 1708 1250 652 4294967295 0 852 482 1063 908 4294967295 0 2062 1717 789 705 4294967295 0 1604 2033 1485 756 4294967295 0 1658 1270 2428 249 4294967295 0 1957 939 2144 12 4294967295 0 1399 1840 1848 72 4294967295 0 2446 1277 1498 2392 4294967295 0 1224 2363 155 1731 4294967295 0 1347 247 1466 584 1 1347 247 1466 584 4294967295 0 2032 608 970 1448 4294967295 0 1231 1821 599 565 1 1231 1821 599 565 4294967295 0 1995 2094 1673 2161 4294967295 0 1671 200 1594 1996 1 1671 200 1594 1996 4294967295 0 1144 1032 1449 226 4294967295 0 1460 2447 972 1293 4294967295 0 1002 546 1974 376 4294967295 0 1934 2330 1085 2155 4294967295 0 1788 1244 506 768 4294967295 0 2283 2208 1211 841 4294967295 0 1107 2252 671 942 4294967295 0 1781 1542 105 862 4294967295 0 1214 411 1289 2202 4294967295 0 1969 1502 141 2466 4294967295 0 2384 1164 803 575 4294967295 0 2219 413 2070 1541 4294967295 0 1288 1188 379 1587 4294967295 0 1572 1278 2165 2334 4294967295 0 1077 297 1483 2042 4294967295 0 1176 948 819 1341 4294967295 0 1693 32 2299 707 4294967295 0 487 1636 551 288 4294967295 0 934 2212 1087 356 4294967295 0 628 2263 2352 1420 4294967295 0 422 600 353 2043 4294967295 0 1603 552 161 2076 4294967295 0 1131 1355 639 8 4294967295 0 1592 2433 1598 896 4294967295 0 1619 206 836 567 4294967295 0 2309 589 1090 757 4294967295 0 1970 2036 2322 317 4294967295 0 1210 2274 2455 597 4294967295 0 1953 554 478 1921 4294967295 0 2243 443 1389 1472 4294967295 0 209 1373 1467 1561 4294967295 0 184 308 1243 1813 4294967295 0 406 1754 1513 364 4294967295 0 103 1935 1194 1661 4294967295 0 689 630 1530 1529 4294967295 0 1747 2402 621 1159 4294967295 0 688 213 790 2395 4294967295 0 2390 96 323 242 4294967295 0 1698 1471 2040 1549 4294967295 0 563 67 2290 2100 4294967295 0 924 1380 2072 395 4294967295 0 71 2237 1478 1427 4294967295 0 1615 1446 2105 258 4294967295 0 332 1703 1524 1234 4294967295 0 1026 2176 1776 251 4294967295 0 1847 484 2215 1520 4294967295 0 238 44 334 421 4294967295 0 1870 14 926 1014 4294967295 0 130 765 1115 2272 4294967295 0 1924 2360 869 24 1 1924 2360 869 24 4294967295 0 580 39 2254 1846 4294967295 0 386 231 1428 2310 4294967295 0 514 1316 535 1535 4294967295 0 1908 476 1028 1579 1 1908 476 1028 1579 4294967295 0 2081 2379 602 444 4294967295 0 2277 1508 520 1890 4294967295 0 787 1069 192 2296 4294967295 0 2121 1911 1825 390 1 2121 1911 1825 390 4294967295 0 1304 2295 1348 116 4294967295 0 129 2418 1612 2157 4294967295 0 199 1062 1136 519 4294967295 0 264 898 1372 2050 4294967295 0 1454 867 80 469 4294967295 0 1947 2469 810 42 4294967295 0 1264 594 1287 186 4294967295 0 294 2189 1128 1884 4294967295 0 2239 2024 1637 949 4294967295 0 2325 1695 593 561 4294967295 0 1818 684 99 1147 4294967295 0 762 2343 1689 1503 4294967295 0 2117 1431 1240 1229 4294967295 0 709 631 455 1011 4294967295 0 2052 250 60 1445 4294967295 0 1271 553 1984 2057 4294967295 0 1610 2409 280 1506 4294967295 0 2440 37 2312 2372 4294967295 0 991 854 872 694 4294967295 0 1772 318 477 2006 4294967295 0 1626 1964 2344 935 4294967295 0 977 1434 378 2048 4294967295 0 25 131 1308 1806 4294967295 0 1444 603 2051 1313 4294967295 0 380 34 1351 1656 4294967295 0 273 2016 1916 1880 4294967295 0 402 1714 763 2245 4294967295 0 1928 140 1737 702 1 1928 140 1737 702 4294967295 0 217 1286 126 1001 4294967295 0 2380 1706 545 547 4294967295 0 1092 1735 2401 1223 4294967295 0 2023 882 1397 835 4294967295 0 1121 555 1801 2468 4294967295 0 1994 1605 811 1329 4294967295 0 2141 2327 2285 124 4294967295 125 0 0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 126 132 138 144 150 156 162 173 179 190 196 207 213 219 225 231 237 243 249 255 261 267 273 279 285 291 297 303 309 315 321 327 333 339 345 351 357 363 369 375 381 387 393 399 405 411 417 423 429 435 441 447 453 459 465 471 477 483 489 495 501 512 518 524 530 541 547 553 559 570 576 582 588 594 600 606 612 618 624 630 636 642 648 654 660 666 672 678 684 690 696 702 708 714 720 726 732 743 749 755 761 767 773 779 0 0 2478 2478 0 0 0 0 1 0 0 0 0 2478 0 1 2478 0 1 0 2478 0 0 1 0 1 0 0 2478 0 1 2478 0 0 0 0 0 3 0 0 9 1 0
-0 1 0 0 1 0 4294967295 0 0 0 0 1 0 4294967295 1 0 65535 9
-1 8 0 0 0 0 0 0 0 0 0 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 0 0 0 0 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 8 0 65535 65535 65535 65535 65535 65535 65535 65535 9
-2 64 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 0 0 219 308 397 486 575 664 753 842 931 1020 1109 1198 1287 1376 1465 1554 1643 1732 1821 1910 1999 2088 2177 2266 2355 2444 2533 2622 2711 2800 2889 2978 3067 3156 3245 3334 3423 3512 3601 3690 3779 3868 3957 4046 4135 4224 4313 4402 4491 4580 4669 4758 4847 4936 5025 5114 5203 5292 5381 5470 5559 5648 5737 5826 0 1217 903 1574 88 1347 247 1466 584 1231 1821 599 565 1908 476 1028 1579 1671 200 1594 1996 1924 2360 869 24 2121 1911 1825 390 1928 140 1737 702 86 347 1134 424 1990 2346 1666 994 7 1743 2280 1543 1668 791 2132 1491 339 2205 291 721 191 968 119 815 101 1766 1256 329 919 1942 1808 1400 1988 271 2107 1941 2034 1285 1383 607 2063 1863 2431 22 1089 2436 2017 225 529 637 1068 1305 817 846 848 879 18 2266 2093 1291 1719 2410 1039 988 371 996 1919 1384 1966 537 1545 2355 1409 310 518 1487 341 1591 447 1120 1418 1510 1363 1290 2127 2120 751 715 2066 1511 2213 724 1567 165 1178 2255 285 122 2413 860 1249 1878 2154 500 976 1035 1343 641 2373 2416 1406 1200 2465 2110 497 1997 1140 1904 1266 1525 2279 284 1965 713 797 1680 849 1416 1642 2124 1368 1940 1748 441 1787 1497 2103 1595 1647 1694 1439 240 187 1059 340 156 298 570 1630 1675 1774 634 536 548 776 1297 1741 1187 1083 1321 219 1577 56 1667 2216 387 1112 252 1212 1761 532 382 1679 1607 945 2175 1167 109 2097 590 190 1828 1895 740 1770 1910 1753 1347 247 1466 584 167 668 916 1477 1908 476 1028 1579 1592 2433 1598 896 1924 2360 869 24 1603 552 161 2076 1928 140 1737 702 402 1714 763 2245 2253 1864 1198 1739 2129 1354 499 973 2459 1861 1169 243 375 1759 223 1350 2200 281 2241 818 2382 2046 43 1303 300 795 2340 1763 673 2476 941 369 1451 1441 1100 162 401 651 1896 1944 1456 932 1093 1007 1299 1279 886 1004 2128 947 655 1654 2195 1339 1331 914 743 1231 1821 599 565 1908 476 1028 1579 1484 1292 2015 143 2309 589 1090 757 2121 1911 1825 390 1928 140 1737 702 1210 2274 2455 597 25 131 1308 1806 2400 154 889 2218 2448 2308 194 1901 1000 239 1479 2293 802 929 1949 1705 974 1009 636 1882 2348 2338 418 450 203 2389 214 941 369 1451 2393 1899 730 579 304 825 793 1236 1651 660 1646 1616 1096 653 396 1767 2 899 513 1937 1228 576 1638 573 543 94 843 1908 476 1028 1579 1592 2433 1598 896 2309 589 1090 757 1604 2033 1485 756 1928 140 1737 702 402 1714 763 2245 25 131 1308 1806 1026 2176 1776 251 2218 2448 2308 736 400 1216 1861 1169 243 1309 2332 486 1705 974 1009 2021 2451 1554 2046 43 1303 1179 1081 1056 941 369 1451 1441 1100 162 579 304 825 1785 1657 807 660 1646 1616 1690 1045 302 1279 886 1004 426 1773 842 2125 700 1202 798 1066 857 549 169 2233 1671 200 1594 1996 1924 2360 869 24 2121 1911 1825 390 1928 140 1737 702 892 1893 336 311 628 2263 2352 1420 2243 443 1389 1472 991 854 872 694 1540 362 1387 375 1759 223 909 527 1041 636 1882 2348 1073 228 2314 906 826 185 35 1868 2374 1052 917 427 2249 1103 1570 412 925 432 259 1392 1475 2074 753 1775 861 68 1509 1963 2007 1877 2336 188 1707 2250 2041 2417 435 642 11 1499 2123 1391 1684 1805 139 1924 2360 869 24 1603 552 161 2076 1928 140 1737 702 402 1714 763 2245 628 2263 2352 1420 2062 1717 789 705 991 854 872 694 130 765 1115 2272 375 1759 223 1350 2200 281 2241 818 2382 2046 43 1303 906 826 185 2087 2267 2193 1318 1462 525 93 2146 1123 412 925 432 1095 59 1458 2074 753 1775 2426 1017 1405 1963 2007 1877 1682 1685 171 703 312 2162 149 457 2221 1654 2195 1339 1220 1507 1936 2196 615 1959 2121 1911 1825 390 1928 140 1737 702 1210 2274 2455 597 25 131 1308 1806 2243 443 1389 1472 991 854 872 694 1658 1270 2428 249 238 44 334 421 802 929 1949 1705 974 1009 636 1882 2348 2338 418 450 839 1548 569 1174 388 2083 1052 917 427 1537 788 1476 259 1392 1475 2074 753 1775 955 1126 1534 2153 183 2231 1326 606 1613 496 752 1834 2250 2041 2417 367 1338 218 576 1638 573 1432 1360 823 2037 1865 2058 1928 140 1737 702 402 1714 763 2245 25 131 1308 1806 1026 2176 1776 251 991 854 872 694 130 765 1115 2272 238 44 334 421 1224 2363 155 1731 1705 974 1009 2021 2451 1554 2046 43 1303 1179 1081 1056 1174 388 2083 289 1482 57 93 2146 1123 1379 423 1845 2074 753 1775 2426 1017 1405 2153 183 2231 210 2008 1122 496 752 1834 1696 1337 1108 149 457 2221 2108 1771 1932 798 1066 857 1795 809 2439 773 1067 542 167 668 916 1477 2032 608 970 1448 1592 2433 1598 896 2081 2379 602 444 1603 552 161 2076 386 231 1428 2310 402 1714 763 2245 217 1286 126 1001 1739 2129 1354 1488 1836 377 1319 1227 871 1191 902 1195 1350 2200 281 2378 152 654 829 1161 2223 682 1850 319 1763 673 2476 178 893 2386 1441 1100 162 808 320 1440 1944 1456 932 508 625 1588 351 794 999 2150 1366 566 1275 1843 1246 1565 100 1576 2236 1568 1900 2032 608 970 1448 1892 610 1929 1981 2081 2379 602 444 1460 2447 972 1293 386 231 1428 2310 1934 2330 1085 2155 217 1286 126 1001 264 898 1372 2050 1488 1836 377 1831 321 372 330 1664 1760 2026 1323 1746 2378 152 654 1393 1019 1162 2140 1015 2445 667 1672 1049 178 893 2386 120 598 1023 808 320 1440 1544 2361 1851 508 625 1588 1644 1084 1980 2054 370 2385 61 930 1203 45 624 467 2197 1715 1677 442 578 1459 1592 2433 1598 896 2081 2379 602 444 1604 2033 1485 756 1970 2036 2322 317 402 1714 763 2245 217 1286 126 1001 1026 2176 1776 251 1626 1964 2344 935 736 400 1216 1930 198 366 1191 902 1195 1823 891 16 2021 2451 1554 315 986 408 682 1850 319 510 911 1424 1441 1100 162 808 320 1440 1785 1657 807 1516 2261 1375 1690 1045 302 2396 2342 1894 2150 1366 566 676 2003 327 483 2055 696 305 1807 915 168 1086 1608 2081 2379 602 444 1460 2447 972 1293 1970 2036 2322 317 1075 2149 180 1018 217 1286 126 1001 264 898 1372 2050 1626 1964 2344 935 184 308 1243 1813 1930 198 366 53 1817 1130 2026 1323 1746 111 1697 1267 315 986 408 211 670 1745 667 1672 1049 1061 1723 1027 808 320 1440 1544 2361 1851 1516 2261 1375 920 314 208 2396 2342 1894 582 1274 1168 61 930 1203 1221 2323 2025 6 966 1333 1010 1447 749 2185 771 985 1603 552 161 2076 386 231 1428 2310 402 1714 763 2245 217 1286 126 1001 2062 1717 789 705 422 600 353 2043 130 765 1115 2272 2440 37 2312 2372 1350 2200 281 2378 152 654 829 1161 2223 682 1850 319 2087 2267 2193 2265 2347 2331 1933 2460 2181 1564 148 1353 1095 59 1458 1992 464 2013 2426 1017 1405 1280 1849 562 1682 1685 171 1401 338 202 806 1922 1857 436 2059 2305 1565 100 1576 1586 132 2073 738 1082 374 386 231 1428 2310 1934 2330 1085 2155 217 1286 126 1001 264 898 1372 2050 422 600 353 2043 1859 2320 1047 1054 2440 37 2312 2372 103 1935 1194 1661 2378 152 654 1393 1019 1162 2140 1015 2445 667 1672 1049 2265 2347 2331 648 1189 2456 15 2414 2452 2449 585 405 1992 464 2013 863 1551 1531 1280 1849 562 98 448 824 1401 338 202 618 813 485 1091 1469 901 1768 2375 995 2197 1715 1677 1860 1247 632 759 1711 574 402 1714 763 2245 217 1286 126 1001 1026 2176 1776 251 1626 1964 2344 935 130 765 1115 2272 2440 37 2312 2372 1224 2363 155 1731 1847 484 2215 1520 2021 2451 1554 315 986 408 682 1850 319 510 911 1424 289 1482 57 3 2357 2335 1564 148 1353 75 2467 270 2426 1017 1405 1280 1849 562 210 2008 1122 2056 73 1736 1696 1337 1108 2142 2407 236 436 2059 2305 1474 235 2453 305 1807 915 1335 669 1650 1875 389 70 217 1286 126 1001 264 898 1372 2050 1626 1964 2344 935 184 308 1243 1813 2440 37 2312 2372 103 1935 1194 1661 1847 484 2215 1520 1957 939 2144 12 315 986 408 211 670 1745 667 1672 1049 1061 1723 1027 3 2357 2335 5 84 248 2449 585 405 1960 1581 1563 1280 1849 562 98 448 824 2056 73 1736 844 1184 48 2142 2407 236 1042 2425 1891 1768 2375 995 2204 2397 764 1010 1447 749 1473 952 256 361 1124 437 1484 1292 2015 143 2309 589 1090 757 1995 2094 1673 2161 2277 1508 520 1890 1210 2274 2455 597 25 131 1308 1806 1304 2295 1348 116 2380 1706 545 547 1141 245 1395 204 2191 47 239 1479 2293 278 1758 723 888 960 2438 967 254 1255 2338 418 450 1241 52 2394 2393 1899 730 579 304 825 276 1778 850 2317 13 1182 453 1702 498 399 1751 2102 1767 2 899 2164 2192 1730 2130 781 1854 956 592 612 1558 2085 735 2309 589 1090 757 1604 2033 1485 756 2277 1508 520 1890 1619 206 836 567 25 131 1308 1806 1026 2176 1776 251 2380 1706 545 547 273 2016 1916 1880 204 2191 47 1013 417 659 1309 2332 486 1496 1573 1222 967 254 1255 1300 1322 1521 1179 1081 1056 604 571 1582 579 304 825 1785 1657 807 2317 13 1182 1660 279 1512 399 1751 2102 197 2339 1802 426 1773 842 1261 783 716 679 747 1837 316 313 1314 373 1639 1016 1995 2094 1673 2161 2277 1508 520 1890 635 2463 1457 2441 2283 2208 1211 841 1304 2295 1348 116 2380 1706 545 547 1781 1542 105 862 294 2189 1128 1884 2388 1125 1793 473 2060 1020 278 1758 723 1376 438 1989 775 1886 335 940 391 1927 1241 52 2394 1156 28 2454 276 1778 850 2317 13 1182 1552 164 2294 984 1536 227 1201 1132 883 1031 1822 1055 2164 2192 1730 890 1163 1374 295 1738 1547 358 2184 1915 261 85 1700 2277 1508 520 1890 1619 206 836 567 2283 2208 1211 841 987 1060 265 325 2380 1706 545 547 273 2016 1916 1880 294 2189 1128 1884 2390 96 323 242 473 2060 1020 1686 750 814 1496 1573 1222 884 878 2288 940 391 1927 137 1931 1764 604 571 1582 1938 1858 1494 2317 13 1182 1660 279 1512 984 1536 227 112 461 962 1031 1822 1055 2227 272 1659 1261 783 716 796 1820 1872 416 638 822 419 2377 687 943 1798 2366 1210 2274 2455 597 25 131 1308 1806 1304 2295 1348 116 2380 1706 545 547 1658 1270 2428 249 238 44 334 421 209 1373 1467 1561 1610 2409 280 1506 888 960 2438 967 254 1255 2338 418 450 1241 52 2394 1143 352 1526 874 1284 108 1537 788 1476 1465 144 744 955 1126 1534 2153 183 2231 1601 1606 1435 41 1632 2247 1550 2079 77 1962 1826 1150 367 1338 218 691 2326 2138 956 592 612 1968 274 2289 1235 1699 2080 25 131 1308 1806 1026 2176 1776 251 2380 1706 545 547 273 2016 1916 1880 238 44 334 421 1224 2363 155 1731 1610 2409 280 1506 1870 14 926 1014 967 254 1255 1300 1322 1521 1179 1081 1056 604 571 1582 874 1284 108 1799 1205 2095 1379 423 1845 501 76 1412 2153 183 2231 210 2008 1122 41 1632 2247 343 1390 534 1962 1826 1150 2113 19 1328 2108 1771 1932 414 2078 895 316 313 1314 1030 647 232 923 904 2159 1304 2295 1348 116 2380 1706 545 547 1781 1542 105 862 294 2189 1128 1884 209 1373 1467 1561 1610 2409 280 1506 2220 83 2281 622 1747 2402 621 1159 775 1886 335 940 391 1927 1241 52 2394 1156 28 2454 629 1622 900 1728 2341 931 1465 144 744 2022 50 1519 1601 1606 1435 41 1632 2247 2269 1721 2031 368 237 876 384 1602 742 1589 1575 26 691 2326 2138 558 1230 69 358 2184 1915 17 1050 1365 2403 1950 1371 2380 1706 545 547 273 2016 1916 1880 294 2189 1128 1884 2390 96 323 242 1610 2409 280 1506 1870 14 926 1014 1747 2402 621 1159 1399 1840 1848 72 940 391 1927 137 1931 1764 604 571 1582 1938 1858 1494 1728 2341 931 581 2148 712 501 76 1412 847 1527 938 41 1632 2247 343 1390 534 368 237 876 693 1029 74 1589 1575 26 951 1033 350 414 2078 895 2077 701 2169 419 2377 687 1186 1403 1621 277 1215 173 1604 2033 1485 756 1970 2036 2322 317 1619 206 836 567 787 1069 192 2296 1026 2176 1776 251 1626 1964 2344 935 273 2016 1916 1880 1092 1735 2401 1223 1013 417 659 1617 1154 459 1823 891 16 734 1113 2442 1300 1322 1521 614 1562 1580 510 911 1424 666 1869 257 1785 1657 807 1516 2261 1375 1660 279 1512 2358 23 1111 197 2339 1802 875 588 398 676 2003 327 425 465 1196 1394 1584 58 733 1259 509 1811 1074 1546 1970 2036 2322 317 1075 2149 180 1018 787 1069 192 2296 1002 546 1974 376 1626 1964 2344 935 184 308 1243 1813 1092 1735 2401 1223 1454 867 80 469 1617 1154 459 1237 1779 357 111 1697 1267 1442 2172 1998 614 1562 1580 1902 1833 2257 1061 1723 1027 309 504 2370 1516 2261 1375 920 314 208 2358 23 1111 1332 2001 1357 875 588 398 2167 1991 2171 1221 2323 2025 1903 1226 118 472 1945 1649 1914 1597 1640 107 1367 2329 1619 206 836 567 787 1069 192 2296 987 1060 265 325 1107 2252 671 942 273 2016 1916 1880 1092 1735 2401 1223 2390 96 323 242 2325 1695 593 561 1686 750 814 1889 1888 512 734 1113 2442 1426 2098 2061 137 1931 1764 1724 1238 1641 666 1869 257 2010 1104 820 1660 279 1512 2358 23 1111 112 461 962 2292 2298 1665 2227 272 1659 1917 2163 471 425 465 1196 90 1726 1117 1678 2047 2009 838 586 2131 695 1982 1713 787 1069 192 2296 1002 546 1974 376 1107 2252 671 942 741 89 1683 1590 1092 1735 2401 1223 1454 867 80 469 2325 1695 593 561 1969 1502 141 2466 1889 1888 512 2119 662 1325 1442 2172 1998 2376 568 123 1724 1238 1641 697 1461 2186 309 504 2370 1012 2328 539 2358 23 1111 1332 2001 1357 2292 2298 1665 572 1733 1493 1917 2163 471 2158 1909 559 1903 1226 118 157 1832 2096 761 2473 2086 664 1490 1734 160 1614 293 1026 2176 1776 251 1626 1964 2344 935 273 2016 1916 1880 1092 1735 2401 1223 1224 2363 155 1731 1847 484 2215 1520 1870 14 926 1014 1271 553 1984 2057 1300 1322 1521 614 1562 1580 510 911 1424 666 1869 257 1799 1205 2095 1190 1208 897 75 2467 270 2018 1709 1265 210 2008 1122 2056 73 1736 343 1390 534 524 1344 55 2113 19 1328 1306 1133 433 1474 235 2453 2302 1750 92 733 1259 509 1317 1361 46 1855 2316 420 1626 1964 2344 935 184 308 1243 1813 1092 1735 2401 1223 1454 867 80 469 1847 484 2215 1520 1957 939 2144 12 1271 553 1984 2057 689 630 1530 1529 614 1562 1580 1902 1833 2257 1061 1723 1027 309 504 2370 1190 1208 897 1898 1566 905 1960 1581 1563 1500 2178 2229 2056 73 1736 844 1184 48 524 1344 55 2082 1127 983 1306 1133 433 1298 1883 1312 2204 2397 764 601 263 2369 1914 1597 1640 1676 1251 1885 1662 858 1421 273 2016 1916 1880 1092 1735 2401 1223 2390 96 323 242 2325 1695 593 561 1870 14 926 1014 1271 553 1984 2057 1399 1840 1848 72 688 213 790 2395 137 1931 1764 1724 1238 1641 666 1869 257 2010 1104 820 581 2148 712 1971 121 1585 2018 1709 1265 1629 1528 1334 343 1390 534 524 1344 55 693 1029 74 674 596 779 951 1033 350 38 2421 110 2302 1750 92 492 1620 2303 838 586 2131 2151 125 1718 446 1881 2273 1092 1735 2401 1223 1454 867 80 469 2325 1695 593 561 1969 1502 141 2466 1271 553 1984 2057 689 630 1530 1529 688 213 790 2395 1556 645 1874 544 1724 1238 1641 697 1461 2186 309 504 2370 1012 2328 539 1971 121 1585 494 1879 1268 1500 2178 2229 1204 1518 2258 524 1344 55 2082 1127 983 674 596 779 784 2109 1071 38 2421 110 331 2333 1948 601 263 2369 1105 1396 324 664 1490 1734 2143 997 95 1 306 1311 892 1893 336 311 628 2263 2352 1420 2243 443 1389 1472 991 854 872 694 1144 1032 1449 226 580 39 2254 1846 129 2418 1612 2157 2023 882 1397 835 1073 228 2314 906 826 185 35 1868 2374 1052 917 427 1429 470 2300 1961 1410 1024 2367 333 2170 33 1302 1183 345 2053 587 63 2246 1800 2029 521 714 864 2112 2313 2286 729 2225 1505 710 241 681 1463 1206 253 2427 1158 1499 2123 1391 1599 922 1967 1402 859 2458 628 2263 2352 1420 2062 1717 789 705 991 854 872 694 130 765 1115 2272 580 39 2254 1846 1131 1355 639 8 2023 882 1397 835 380 34 1351 1656 906 826 185 2087 2267 2193 1318 1462 525 93 2146 1123 1961 1410 1024 1972 360 1057 1812 207 29 1295 2203 392 63 2246 1800 2240 2354 1419 864 2112 2313 1436 49 365 1505 710 241 1443 1378 1618 359 1480 176 2069 1080 458 1220 1507 1936 1792 216 1336 135 760 1810 2243 443 1389 1472 991 854 872 694 1658 1270 2428 249 238 44 334 421 129 2418 1612 2157 2023 882 1397 835 1953 554 478 1921 977 1434 378 2048 839 1548 569 1174 388 2083 1052 917 427 1537 788 1476 774 2190 2217 2359 2306 463 33 1302 1183 2371 2177 303 2029 521 714 864 2112 2313 381 2166 449 1146 474 2474 51 505 1624 609 969 1627 253 2427 1158 2472 1340 1423 1432 1360 823 975 220 1148 2437 877 650 991 854 872 694 130 765 1115 2272 238 44 334 421 1224 2363 155 1731 2023 882 1397 835 380 34 1351 1656 977 1434 378 2048 332 1703 1524 1234 1174 388 2083 289 1482 57 93 2146 1123 1379 423 1845 2359 2306 463 1829 927 296 1295 2203 392 2199 1438 1102 864 2112 2313 1436 49 365 1146 474 2474 1076 718 1170 609 969 1627 1232 1008 1327 2069 1080 458 800 2242 36 1795 809 2439 342 880 269 1155 1571 2419 1144 1032 1449 226 580 39 2254 1846 129 2418 1612 2157 2023 882 1397 835 1979 1983 1652 222 2219 413 2070 1541 1572 1278 2165 2334 762 2343 1689 1503 1429 470 2300 1961 1410 1024 2367 333 2170 33 1302 1183 583 1273 1560 452 2424 2423 1342 81 440 393 475 2301 1635 1433 801 20 2362 1804 177 1796 1645 2464 785 633 2111 1151 153 244 2004 246 831 726 873 1225 1192 665 1599 922 1967 1533 1486 328 672 698 1489 580 39 2254 1846 1131 1355 639 8 2023 882 1397 835 380 34 1351 1656 2219 413 2070 1541 1064 516 2422 1470 762 2343 1689 1503 563 67 2290 2100 1961 1410 1024 1972 360 1057 1812 207 29 1295 2203 392 452 2424 2423 2089 2365 1740 2099 1669 1824 1422 2248 2311 20 2362 1804 1623 196 1450 2464 785 633 2114 1987 481 244 2004 246 1021 1263 1786 2475 1720 62 348 2381 1905 1792 216 1336 2211 2027 777 2002 792 403 129 2418 1612 2157 2023 882 1397 835 1953 554 478 1921 977 1434 378 2048 1572 1278 2165 2334 762 2343 1689 1503 1856 816 1455 1119 71 2237 1478 1427 774 2190 2217 2359 2306 463 33 1302 1183 2371 2177 303 434 840 78 755 2201 804 393 475 2301 2106 1320 953 177 1796 1645 2464 785 633 27 255 1906 1160 1296 1999 928 79 812 407 2351 2319 1225 1192 665 515 1634 1523 975 220 1148 758 2174 2387 686 853 1742 2023 882 1397 835 380 34 1351 1656 977 1434 378 2048 332 1703 1524 1234 762 2343 1689 1503 563 67 2290 2100 71 2237 1478 1427 2446 1277 1498 2392 2359 2306 463 1829 927 296 1295 2203 392 2199 1438 1102 755 2201 804 2244 322 2434 1422 2248 2311 2156 1048 680 2464 785 633 2114 1987 481 1160 1296 1999 66 117 1166 407 2351 2319 1358 1411 1976 348 2381 1905 383 1504 1958 342 880 269 2337 1079 1681 1065 828 907 2062 1717 789 705 422 600 353 2043 130 765 1115 2272 2440 37 2312 2372 1131 1355 639 8 514 1316 535 1535 380 34 1351 1656 1121 555 1801 2468 2087 2267 2193 2265 2347 2331 1933 2460 2181 1564 148 1353 1972 360 1057 2444 1674 1815 134 2262 1954 719 456 1324 2240 2354 1419 1871 1712 2224 1436 49 365 1492 2318 1862 1443 1378 1618 1951 950 1257 490 488 1852 2470 1631 577 1586 132 2073 2038 1844 1078 675 657 4 422 600 353 2043 1859 2320 1047 1054 2440 37 2312 2372 103 1935 1194 1661 514 1316 535 1535 1788 1244 506 768 1121 555 1801 2468 1947 2469 810 42 2265 2347 2331 648 1189 2456 15 2414 2452 2449 585 405 2444 1674 1815 1213 1398 870 772 1913 1495 1097 517 1381 1871 1712 2224 2260 1553 1653 1492 2318 1862 745 428 720 1951 950 1257 1362 1388 1532 1866 2230 326 1555 1729 959 1860 1247 632 717 2238 1710 1752 495 260 130 765 1115 2272 2440 37 2312 2372 1224 2363 155 1731 1847 484 2215 1520 380 34 1351 1656 1121 555 1801 2468 332 1703 1524 1234 1772 318 477 2006 289 1482 57 3 2357 2335 1564 148 1353 75 2467 270 1829 927 296 1413 2235 2287 719 456 1324 2028 404 692 1436 49 365 1492 2318 1862 1076 718 1170 1952 2207 1135 1232 1008 1327 722 1349 2134 2470 1631 577 1219 1704 1137 1335 669 1650 2168 2226 646 550 2284 1138 2440 37 2312 2372 103 1935 1194 1661 1847 484 2215 1520 1957 939 2144 12 1121 555 1801 2468 1947 2469 810 42 1772 318 477 2006 406 1754 1513 364 3 2357 2335 5 84 248 2449 585 405 1960 1581 1563 1413 2235 2287 982 87 2065 1097 517 1381 623 1072 179 1492 2318 1862 745 428 720 1952 2207 1135 10 2039 1118 722 1349 2134 2404 834 1036 1555 1729 959 301 1180 556 1473 952 256 2356 2136 1993 766 1827 1258 1131 1355 639 8 514 1316 535 1535 380 34 1351 1656 1121 555 1801 2468 1064 516 2422 1470 1288 1188 379 1587 563 67 2290 2100 2117 1431 1240 1229 1972 360 1057 2444 1674 1815 134 2262 1954 719 456 1324 2089 2365 1740 1887 21 1609 267 1172 2408 1417 221 1404 1623 196 1450 1139 1153 1515 2114 1987 481 656 1688 2092 1021 1263 1786 2064 1762 1252 268 2222 142 2315 2462 1838 2038 1844 1078 1769 181 769 1596 2399 82 514 1316 535 1535 1788 1244 506 768 1121 555 1801 2468 1947 2469 810 42 1288 1188 379 1587 1716 2321 65 649 2117 1431 1240 1229 1176 948 819 1341 2444 1674 1815 1213 1398 870 772 1913 1495 1097 517 1381 1887 21 1609 1248 1254 138 2035 643 1382 1307 175 678 1139 1153 1515 1819 711 617 656 1688 2092 1040 1149 2122 2064 1762 1252 451 2450 1559 2471 2188 102 2198 2349 136 717 2238 1710 1501 2429 1784 91 531 1253 380 34 1351 1656 1121 555 1801 2468 332 1703 1524 1234 1772 318 477 2006 563 67 2290 2100 2117 1431 1240 1229 2446 1277 1498 2392 1615 1446 2105 258 1829 927 296 1413 2235 2287 719 456 1324 2028 404 692 2244 322 2434 106 868 746 1417 221 1404 998 2276 2182 2114 1987 481 656 1688 2092 66 117 1166 1034 799 685 1358 1411 1976 958 964 1791 2315 2462 1838 1022 1152 2030 2168 2226 646 912 172 658 2014 2005 1058 1121 555 1801 2468 1947 2469 810 42 1772 318 477 2006 406 1754 1513 364 2117 1431 1240 1229 1176 948 819 1341 1615 1446 2105 258 2391 1708 1250 652 1413 2235 2287 982 87 2065 1097 517 1381 623 1072 179 106 868 746 2133 1088 981 1307 175 678 262 778 275 656 1688 2092 1040 1149 2122 1034 799 685 1557 1207 1725 958 964 1791 1370 663 31 2198 2349 136 2251 1628 2234 2356 2136 1993 2068 466 661 1185 1918 2278 1658 1270 2428 249 238 44 334 421 209 1373 1467 1561 1610 2409 280 1506 1953 554 478 1921 977 1434 378 2048 199 1062 1136 519 1994 1605 811 1329 1143 352 1526 874 1284 108 1537 788 1476 1465 144 744 1218 1578 2398 1835 2209 2020 2371 2177 303 937 2383 151 381 2166 449 1146 474 2474 2228 415 2364 1377 2116 1514 1464 2291 619 1867 163 9 2472 1340 1423 292 541 830 1968 274 2289 1003 2271 439 739 2091 146 238 44 334 421 1224 2363 155 1731 1610 2409 280 1506 1870 14 926 1014 977 1434 378 2048 332 1703 1524 1234 1994 1605 811 1329 1444 603 2051 1313 874 1284 108 1799 1205 2095 1379 423 1845 501 76 1412 1835 2209 2020 1425 349 737 2199 1438 1102 1408 533 1986 1146 474 2474 1076 718 1170 1377 2116 1514 833 936 182 1867 163 9 1625 1830 2101 800 2242 36 1038 97 523 1030 647 232 2214 158 1926 881 282 502 209 1373 1467 1561 1610 2409 280 1506 2220 83 2281 622 1747 2402 621 1159 199 1062 1136 519 1994 1605 811 1329 1214 411 1289 2202 2239 2024 1637 949 629 1622 900 1728 2341 931 1465 144 744 2022 50 1519 133 2430 2071 1094 2324 2118 937 2383 151 1648 1794 2432 2228 415 2364 1377 2116 1514 2368 1364 193 445 2405 2067 287 1955 1437 1301 538 978 292 541 830 409 1481 2145 17 1050 1365 2183 683 522 1809 115 1101 1610 2409 280 1506 1870 14 926 1014 1747 2402 621 1159 1399 1840 1848 72 1994 1605 811 1329 1444 603 2051 1313 2239 2024 1637 949 1698 1471 2040 1549 1728 2341 931 581 2148 712 501 76 1412 847 1527 938 1094 2324 2118 2297 344 832 1408 533 1986 286 1262 1701 1377 2116 1514 833 936 182 445 2405 2067 530 1755 431 1301 538 978 963 1912 1780 1038 97 523 805 1006 626 1186 1403 1621 1692 1345 954 410 1233 189 1953 554 478 1921 977 1434 378 2048 199 1062 1136 519 1994 1605 811 1329 1856 816 1455 1119 71 2237 1478 1427 1077 297 1483 2042 709 631 455 1011 1218 1578 2398 1835 2209 2020 2371 2177 303 937 2383 151 2307 195 2268 1310 229 215 2106 1320 953 821 1749 627 27 255 1906 1160 1296 1999 283 1070 2179 1142 2457 460 2045 429 1985 770 1973 1939 515 1634 1523 1876 1430 780 1003 2271 439 1853 2135 1043 1756 1046 1242 977 1434 378 2048 332 1703 1524 1234 1994 1605 811 1329 1444 603 2051 1313 71 2237 1478 1427 2446 1277 1498 2392 709 631 455 1011 924 1380 2072 395 1835 2209 2020 1425 349 737 2199 1438 1102 1408 533 1986 1310 229 215 363 503 613 2156 1048 680 827 704 128 1160 1296 1999 66 117 1166 1142 2457 460 851 1110 224 770 1973 1939 1282 2137 1269 383 1504 1958 1744 866 290 2214 158 1926 1453 489 1978 706 30 2477 199 1062 1136 519 1994 1605 811 1329 1214 411 1289 2202 2239 2024 1637 949 1077 297 1483 2042 709 631 455 1011 946 2084 234 1803 487 1636 551 288 133 2430 2071 1094 2324 2118 937 2383 151 1648 1794 2432 1633 145 1177 430 591 212 821 1749 627 979 2000 1276 283 1070 2179 1142 2457 460 731 1099 266 989 961 767 865 1782 1839 493 754 114 1876 1430 780 1873 1757 2353 2183 683 522 1841 786 205 2210 1272 2075 1994 1605 811 1329 1444 603 2051 1313 2239 2024 1637 949 1698 1471 2040 1549 709 631 455 1011 924 1380 2072 395 487 1636 551 288 852 482 1063 908 1094 2324 2118 2297 344 832 1408 533 1986 286 1262 1701 430 591 212 677 1923 1946 827 704 128 644 1209 837 1142 2457 460 851 1110 224 989 961 767 1920 1468 1583 493 754 114 2206 1171 2180 1744 866 290 2194 454 732 1692 1345 954 1956 1814 1765 1925 113 150 1224 2363 155 1731 1847 484 2215 1520 1870 14 926 1014 1271 553 1984 2057 332 1703 1524 1234 1772 318 477 2006 1444 603 2051 1313 2141 2327 2285 124 1799 1205 2095 1190 1208 897 75 2467 270 2018 1709 1265 1425 349 737 2345 1260 2115 2028 404 692 944 980 1294 1076 718 1170 1952 2207 1135 833 936 182 1727 2461 1197 1625 1830 2101 346 1098 233 1219 1704 1137 1687 728 127 1317 1361 46 620 1385 507 2104 2264 725 1847 484 2215 1520 1957 939 2144 12 1271 553 1984 2057 689 630 1530 1529 1772 318 477 2006 406 1754 1513 364 2141 2327 2285 124 1264 594 1287 186 1190 1208 897 1898 1566 905 1960 1581 1563 1500 2178 2229 2345 1260 2115 690 2270 560 623 1072 179 1044 918 1522 1952 2207 1135 10 2039 1118 1727 2461 1197 913 2412 1407 346 1098 233 480 104 1943 301 1180 556 1193 2152 2187 1676 1251 1885 40 887 2411 307 1025 540 1870 14 926 1014 1271 553 1984 2057 1399 1840 1848 72 688 213 790 2395 1444 603 2051 1313 2141 2327 2285 124 1698 1471 2040 1549 1818 684 99 1147 581 2148 712 1971 121 1585 2018 1709 1265 1629 1528 1334 2297 344 832 2049 1386 699 944 980 1294 2090 1539 2304 833 936 182 1727 2461 1197 530 1755 431 397 605 1414 963 1912 1780 0 1281 1346 1687 728 127 299 1777 526 2151 125 1718 394 174 385 2415 1611 910 1271 553 1984 2057 689 630 1530 1529 688 213 790 2395 1556 645 1874 544 2141 2327 2285 124 1264 594 1287 186 1818 684 99 1147 2384 1164 803 575 1971 121 1585 494 1879 1268 1500 2178 2229 1204 1518 2258 2049 1386 699 2012 2420 1897 1044 918 1522 462 782 2147 1727 2461 1197 913 2412 1407 397 605 1414 748 933 1109 0 1281 1346 616 1415 2139 1193 2152 2187 1145 1175 1600 2143 997 95 1517 856 2435 1975 491 2044 332 1703 1524 1234 1772 318 477 2006 1444 603 2051 1313 2141 2327 2285 124 2446 1277 1498 2392 1615 1446 2105 258 924 1380 2072 395 2052 250 60 1445 1425 349 737 2345 1260 2115 2028 404 692 944 980 1294 363 503 613 479 894 337 998 2276 2182 2160 1643 2259 66 117 1166 1034 799 685 851 1110 224 1157 1783 1106 1282 2137 1269 564 993 1670 1022 1152 2030 201 845 1116 620 1385 507 1173 1165 1352 2088 159 2406 1772 318 477 2006 406 1754 1513 364 2141 2327 2285 124 1264 594 1287 186 1615 1446 2105 258 2391 1708 1250 652 2052 250 60 1445 1693 32 2299 707 2345 1260 2115 690 2270 560 623 1072 179 1044 918 1522 479 894 337 2019 1239 921 262 778 275 1199 354 595 1034 799 685 1557 1207 1725 1157 1783 1106 1842 54 1732 564 993 1670 1037 170 2232 2251 1628 2234 1330 1569 957 40 887 2411 1356 885 1789 1005 727 1114 1444 603 2051 1313 2141 2327 2285 124 1698 1471 2040 1549 1818 684 99 1147 924 1380 2072 395 2052 250 60 1445 852 482 1063 908 934 2212 1087 356 2297 344 832 2049 1386 699 944 980 1294 2090 1539 2304 677 1923 1946 511 990 1790 2160 1643 2259 992 640 2282 851 1110 224 1157 1783 1106 1920 1468 1583 1655 557 611 2206 1171 2180 1907 2011 1797 201 845 1116 1452 1315 2350 394 174 385 1181 528 1051 965 64 2126 2141 2327 2285 124 1264 594 1287 186 1818 684 99 1147 2384 1164 803 575 2052 250 60 1445 1693 32 2299 707 934 2212 1087 356 355 1538 2443 1283 2049 1386 699 2012 2420 1897 1044 918 1522 462 782 2147 511 990 1790 1722 855 2275 1199 354 595 1977 2173 147 1157 1783 1106 1842 54 1732 1655 557 611 1053 708 1593 1907 2011 1797 1816 230 1359 1330 1569 957 1691 1245 971 1517 856 2435 1129 1369 2256 166 1663 468 214 0 56 1667 2216 387 1112 252 1212 1761 532 382 1679 1607 945 2175 1167 109 2097 590 190 1828 1895 740 1770 1910 1753 1331 914 743 543 94 843 549 169 2233 1684 1805 139 2196 615 1959 2037 1865 2058 773 1067 542 2236 1568 1900 442 578 1459 168 1086 1608 2185 771 985 738 1082 374 759 1711 574 1875 389 70 361 1124 437 1558 2085 735 373 1639 1016 261 85 1700 943 1798 2366 1235 1699 2080 923 904 2159 2403 1950 1371 277 1215 173 1811 1074 1546 107 1367 2329 695 1982 1713 160 1614 293 1855 2316 420 1662 858 1421 446 1881 2273 1 306 1311 1402 859 2458 135 760 1810 2437 877 650 1155 1571 2419 672 698 1489 2002 792 403 686 853 1742 1065 828 907 675 657 4 1752 495 260 550 2284 1138 766 1827 1258 1596 2399 82 91 531 1253 2014 2005 1058 1185 1918 2278 739 2091 146 881 282 502 1809 115 1101 410 1233 189 1756 1046 1242 706 30 2477 2210 1272 2075 1925 113 150 2104 2264 725 307 1025 540 2415 1611 910 1975 491 2044 2088 159 2406 1005 727 1114 965 64 2126 166 1663 468 64 0 0 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 82 85 88 91 94 97 100 103 106 109 112 115 118 121 124 127 130 133 136 139 142 145 148 151 154 157 160 163 166 169 172 175 178 181 184 187 190 193 196 199 202 205 208 211 64 0 0 1 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 0 0 0 12 1 0
-3 0 0 1584 0 1 2132 1491 339 2205 291 721 191 4294967295 0 499 973 2459 4294967295 0 1319 1227 871 4294967295 0 330 1664 1760 4294967295 1 86 347 1134 424 1990 2346 1666 4294967295 0 2400 154 889 4294967295 0 1141 245 1395 4294967295 0 2388 1125 1793 4294967295 1 18 2266 2093 1291 1719 2410 1039 4294967295 0 2249 1103 1570 4294967295 0 345 2053 587 4294967295 0 1635 1433 801 4294967295 0 1831 321 372 4294967295 0 53 1817 1130 4294967295 0 1237 1779 357 4294967295 0 2119 662 1325 4294967295 0 120 598 1023 4294967295 0 863 1551 1531 4294967295 0 2260 1553 1653 4294967295 0 1819 711 617 4294967295 0 1376 438 1989 4294967295 0 884 878 2288 4294967295 0 1426 2098 2061 4294967295 0 2376 568 123 4294967295 0 1552 164 2294 4294967295 0 2269 1721 2031 4294967295 0 2368 1364 193 4294967295 0 731 1099 266 4294967295 0 572 1733 1493 4294967295 0 784 2109 1071 4294967295 0 748 933 1109 4294967295 0 1053 708 1593 4294967295 0 1342 81 440 4294967295 0 2099 1669 1824 4294967295 0 267 1172 2408 4294967295 0 2035 643 1382 4294967295 0 583 1273 1560 4294967295 0 434 840 78 4294967295 0 2307 195 2268 4294967295 0 1633 145 1177 4294967295 0 1248 1254 138 4294967295 0 2133 1088 981 4294967295 0 2019 1239 921 4294967295 0 1722 855 2275 4294967295 0 979 2000 1276 4294967295 0 644 1209 837 4294967295 0 992 640 2282 4294967295 0 1977 2173 147 4294967295 0 35 1868 2374 4294967295 0 1318 1462 525 4294967295 0 1933 2460 2181 4294967295 0 15 2414 2452 4294967295 0 1763 673 2476 4294967295 0 1095 59 1458 4294967295 0 2240 2354 1419 4294967295 0 1623 196 1450 4294967295 0 1739 2129 1354 4294967295 0 736 400 1216 4294967295 0 1013 417 659 4294967295 0 1686 750 814 4294967295 0 239 1479 2293 4294967295 0 1309 2332 486 4294967295 0 1823 891 16 4294967295 0 111 1697 1267 4294967295 0 2393 1899 730 4294967295 0 955 1126 1534 4294967295 0 381 2166 449 4294967295 0 27 255 1906 4294967295 0 1073 228 2314 4294967295 0 839 1548 569 4294967295 0 1143 352 1526 4294967295 0 629 1622 900 4294967295 0 920 314 208 4294967295 0 844 1184 48 4294967295 0 10 2039 1118 4294967295 0 1557 1207 1725 4294967295 0 648 1189 2456 4294967295 0 5 84 248 4294967295 0 1898 1566 905 4294967295 0 494 1879 1268 4294967295 0 2022 50 1519 4294967295 0 847 1527 938 4294967295 0 1629 1528 1334 4294967295 0 1204 1518 2258 4294967295 0 112 461 962 4294967295 0 693 1029 74 4294967295 0 530 1755 431 4294967295 0 1920 1468 1583 4294967295 0 2089 2365 1740 4294967295 0 2244 322 2434 4294967295 0 363 503 613 4294967295 0 677 1923 1946 4294967295 0 2106 1320 953 4294967295 0 2156 1048 680 4294967295 0 998 2276 2182 4294967295 0 262 778 275 4294967295 0 1076 718 1170 4294967295 0 66 117 1166 4294967295 0 1785 1657 807 4294967295 0 210 2008 1122 4294967295 0 75 2467 270 4294967295 0 1960 1581 1563 4294967295 0 1537 788 1476 4294967295 0 1379 423 1845 4294967295 0 1799 1205 2095 4294967295 0 581 2148 712 4294967295 0 2087 2267 2193 4294967295 0 289 1482 57 4294967295 0 909 527 1041 1 2431 22 1089 2436 2017 225 529 4294967295 0 2241 818 2382 4294967295 0 300 795 2340 1 988 371 996 1919 1384 1966 537 4294967295 0 412 925 432 4294967295 0 2367 333 2170 4294967295 0 1812 207 29 4294967295 0 63 2246 1800 4294967295 0 20 2362 1804 4294967295 0 829 1161 2223 4294967295 0 2140 1015 2445 4294967295 0 178 893 2386 4294967295 0 1992 464 2013 4294967295 0 134 2262 1954 4294967295 0 772 1913 1495 4294967295 0 1871 1712 2224 4294967295 0 1139 1153 1515 4294967295 0 2253 1864 1198 1 994 7 1743 2280 1543 1668 791 4294967295 0 2218 2448 2308 4294967295 0 194 1901 1000 1 968 119 815 101 1766 1256 329 4294967295 0 1861 1169 243 4294967295 0 1488 1836 377 4294967295 0 1930 198 366 4294967295 0 1191 902 1195 4294967295 0 2026 1323 1746 4294967295 0 204 2191 47 4294967295 0 473 2060 1020 4294967295 0 278 1758 723 4294967295 0 1496 1573 1222 4294967295 0 1617 1154 459 4294967295 0 1889 1888 512 4294967295 0 734 1113 2442 4294967295 0 1442 2172 1998 4294967295 0 203 2389 214 1 1545 2355 1409 310 518 1487 341 4294967295 0 259 1392 1475 4294967295 0 1540 362 1387 1 919 1942 1808 1400 1988 271 2107 4294967295 0 802 929 1949 4294967295 0 276 1778 850 4294967295 0 1601 1606 1435 4294967295 0 888 960 2438 4294967295 0 775 1886 335 4294967295 0 2029 521 714 4294967295 0 177 1796 1645 4294967295 0 1429 470 2300 4294967295 0 774 2190 2217 4294967295 0 2228 415 2364 4294967295 0 283 1070 2179 4294967295 0 1218 1578 2398 4294967295 0 133 2430 2071 4294967295 0 1544 2361 1851 4294967295 0 98 448 824 4294967295 0 1393 1019 1162 4294967295 0 211 670 1745 4294967295 0 1332 2001 1357 4294967295 0 2082 1127 983 4294967295 0 1902 1833 2257 4294967295 0 697 1461 2186 4294967295 0 745 428 720 4294967295 0 1040 1149 2122 4294967295 0 1213 1398 870 4294967295 0 982 87 2065 4294967295 0 913 2412 1407 4294967295 0 1842 54 1732 4294967295 0 690 2270 560 4294967295 0 2012 2420 1897 4294967295 0 1156 28 2454 4294967295 0 1938 1858 1494 4294967295 0 984 1536 227 4294967295 0 368 237 876 4294967295 0 1648 1794 2432 4294967295 0 286 1262 1701 4294967295 0 445 2405 2067 4294967295 0 989 961 767 4294967295 0 2010 1104 820 4294967295 0 1012 2328 539 4294967295 0 2292 2298 1665 4294967295 0 674 596 779 4294967295 0 2090 1539 2304 4294967295 0 462 782 2147 4294967295 0 397 605 1414 4294967295 0 1655 557 611 4294967295 0 452 2424 2423 4294967295 0 755 2201 804 4294967295 0 393 475 2301 4294967295 0 1422 2248 2311 4294967295 0 1887 21 1609 4294967295 0 106 868 746 4294967295 0 1417 221 1404 4294967295 0 1307 175 678 4294967295 0 1310 229 215 4294967295 0 430 591 212 4294967295 0 821 1749 627 4294967295 0 827 704 128 4294967295 0 479 894 337 4294967295 0 511 990 1790 4294967295 0 2160 1643 2259 4294967295 0 1199 354 595 4294967295 0 1190 1208 897 4294967295 0 1971 121 1585 4294967295 0 2018 1709 1265 4294967295 0 1500 2178 2229 4294967295 0 874 1284 108 4294967295 0 1728 2341 931 4294967295 0 1465 144 744 4294967295 0 501 76 1412 4294967295 0 2265 2347 2331 4294967295 0 3 2357 2335 4294967295 0 1564 148 1353 4294967295 0 2449 585 405 4294967295 0 906 826 185 4294967295 0 1174 388 2083 4294967295 0 1052 917 427 4294967295 0 93 2146 1123 4294967295 0 2028 404 692 4294967295 0 623 1072 179 4294967295 0 1952 2207 1135 4294967295 0 1034 799 685 4294967295 0 510 911 1424 4294967295 0 1061 1723 1027 4294967295 0 1516 2261 1375 4294967295 0 2056 73 1736 4294967295 0 2371 2177 303 4294967295 0 2199 1438 1102 4294967295 0 1146 474 2474 4294967295 0 1160 1296 1999 4294967295 0 2338 418 450 4294967295 0 1179 1081 1056 4294967295 0 579 304 825 4294967295 0 2153 183 2231 4294967295 0 833 936 182 4294967295 0 851 1110 224 4294967295 0 1425 349 737 4294967295 0 2297 344 832 4294967295 0 1436 49 365 4294967295 0 2114 1987 481 4294967295 0 1972 360 1057 4294967295 0 1829 927 296 4294967295 0 1660 279 1512 4294967295 0 343 1390 534 4294967295 0 1300 1322 1521 4294967295 0 137 1931 1764 4294967295 0 1441 1100 162 4294967295 0 2426 1017 1405 4294967295 0 1350 2200 281 4294967295 0 2021 2451 1554 4294967295 0 1157 1783 1106 4294967295 0 1727 2461 1197 4294967295 0 1044 918 1522 4294967295 0 944 980 1294 4294967295 0 2049 1386 699 4294967295 0 2345 1260 2115 4294967295 0 1142 2457 460 4294967295 0 1377 2116 1514 4294967295 0 1408 533 1986 4294967295 0 937 2383 151 4294967295 0 1094 2324 2118 4294967295 0 1835 2209 2020 4294967295 0 656 1688 2092 4294967295 0 1492 2318 1862 4294967295 0 1097 517 1381 4294967295 0 719 456 1324 4294967295 0 1413 2235 2287 4294967295 0 2444 1674 1815 4294967295 0 2464 785 633 4294967295 0 864 2112 2313 4294967295 0 1295 2203 392 4294967295 0 33 1302 1183 4294967295 0 2359 2306 463 4294967295 0 1961 1410 1024 4294967295 0 524 1344 55 4294967295 0 2358 23 1111 4294967295 0 309 504 2370 4294967295 0 666 1869 257 4294967295 0 1724 1238 1641 4294967295 0 614 1562 1580 4294967295 0 41 1632 2247 4294967295 0 2317 13 1182 4294967295 0 604 571 1582 4294967295 0 1241 52 2394 4294967295 0 940 391 1927 4294967295 0 967 254 1255 4294967295 0 1280 1849 562 4294967295 0 808 320 1440 4294967295 0 667 1672 1049 4294967295 0 682 1850 319 4294967295 0 315 986 408 4294967295 0 2378 152 654 4294967295 0 2074 753 1775 4294967295 0 941 369 1451 1 1591 447 1120 1418 1510 1363 1290 4294967295 0 2046 43 1303 4294967295 0 636 1882 2348 1 637 1068 1305 817 846 848 879 4294967295 0 1705 974 1009 4294967295 0 375 1759 223 1 1941 2034 1285 1383 607 2063 1863 4294967295 366 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 0 9 14 19 24 33 38 43 48 57 62 67 72 77 82 87 92 97 102 107 112 117 122 127 132 137 142 147 152 157 162 167 172 177 182 187 192 197 202 207 212 217 222 227 232 237 242 247 252 257 262 267 272 277 282 287 292 297 302 307 312 317 322 327 332 337 342 347 352 357 362 367 372 377 382 387 392 397 402 407 412 417 422 427 432 437 442 447 452 457 462 467 472 477 482 487 492 497 502 507 512 517 522 527 532 537 542 547 552 565 570 583 588 593 598 603 608 613 618 623 628 633 638 643 648 661 666 679 684 689 694 699 704 709 714 719 724 729 734 739 744 757 762 775 780 785 790 795 800 805 810 815 820 825 830 835 840 845 850 855 860 865 870 875 880 885 890 895 900 905 910 915 920 925 930 935 940 945 950 955 960 965 970 975 980 985 990 995 1000 1005 1010 1015 1020 1025 1030 1035 1040 1045 1050 1055 1060 1065 1070 1075 1080 1085 1090 1095 1100 1105 1110 1115 1120 1125 1130 1135 1140 1145 1150 1155 1160 1165 1170 1175 1180 1185 1190 1195 1200 1205 1210 1215 1220 1225 1230 1235 1240 1245 1250 1255 1260 1265 1270 1275 1280 1285 1290 1295 1300 1305 1310 1315 1320 1325 1330 1335 1340 1345 1350 1355 1360 1365 1370 1375 1380 1385 1390 1395 1400 1405 1410 1415 1420 1425 1430 1435 1440 1445 1450 1455 1460 1465 1470 1475 1480 1485 1490 1495 1500 1505 1510 1515 1520 1525 1530 1535 1548 1553 1566 1571 0 0 1272 0 1 2127 2120 751 715 2066 1511 2213 724 1567 165 1178 2255 285 4294967295 0 401 651 1896 1 122 2413 860 1249 1878 2154 500 976 1035 1343 641 2373 2416 4294967295 1 1406 1200 2465 2110 497 1997 1140 1904 1266 1525 2279 284 1965 4294967295 0 1096 653 396 1 713 797 1680 849 1416 1642 2124 1368 1940 1748 441 1787 1497 4294967295 1 2103 1595 1647 1694 1439 240 187 1059 340 156 298 570 1630 4294967295 0 435 642 11 1 1675 1774 634 536 548 776 1297 1741 1187 1083 1321 219 1577 4294967295 0 1944 1456 932 4294967295 0 1093 1007 1299 4294967295 0 1279 886 1004 4294967295 0 2128 947 655 4294967295 0 1654 2195 1339 4294967295 0 793 1236 1651 4294967295 0 660 1646 1616 4294967295 0 1767 2 899 4294967295 0 513 1937 1228 4294967295 0 576 1638 573 4294967295 0 1690 1045 302 4294967295 0 426 1773 842 4294967295 0 2125 700 1202 4294967295 0 798 1066 857 4294967295 0 861 68 1509 4294967295 0 1963 2007 1877 4294967295 0 2336 188 1707 4294967295 0 2250 2041 2417 4294967295 0 1499 2123 1391 4294967295 0 1682 1685 171 4294967295 0 703 312 2162 4294967295 0 149 457 2221 4294967295 0 1220 1507 1936 4294967295 0 1326 606 1613 4294967295 0 496 752 1834 4294967295 0 367 1338 218 4294967295 0 1432 1360 823 4294967295 0 1696 1337 1108 4294967295 0 2108 1771 1932 4294967295 0 1795 809 2439 4294967295 0 508 625 1588 4294967295 0 351 794 999 4294967295 0 2150 1366 566 4294967295 0 1275 1843 1246 4294967295 0 1565 100 1576 4294967295 0 1644 1084 1980 4294967295 0 2054 370 2385 4294967295 0 61 930 1203 4294967295 0 45 624 467 4294967295 0 2197 1715 1677 4294967295 0 2396 2342 1894 4294967295 0 676 2003 327 4294967295 0 483 2055 696 4294967295 0 305 1807 915 4294967295 0 582 1274 1168 4294967295 0 1221 2323 2025 4294967295 0 6 966 1333 4294967295 0 1010 1447 749 4294967295 0 1401 338 202 4294967295 0 806 1922 1857 4294967295 0 436 2059 2305 4294967295 0 1586 132 2073 4294967295 0 618 813 485 4294967295 0 1091 1469 901 4294967295 0 1768 2375 995 4294967295 0 1860 1247 632 4294967295 0 2142 2407 236 4294967295 0 1474 235 2453 4294967295 0 1335 669 1650 4294967295 0 1042 2425 1891 4294967295 0 2204 2397 764 4294967295 0 1473 952 256 4294967295 0 453 1702 498 4294967295 0 399 1751 2102 4294967295 0 2164 2192 1730 4294967295 0 2130 781 1854 4294967295 0 956 592 612 4294967295 0 197 2339 1802 4294967295 0 1261 783 716 4294967295 0 679 747 1837 4294967295 0 316 313 1314 4294967295 0 1201 1132 883 4294967295 0 1031 1822 1055 4294967295 0 890 1163 1374 4294967295 0 295 1738 1547 4294967295 0 358 2184 1915 4294967295 0 2227 272 1659 4294967295 0 796 1820 1872 4294967295 0 416 638 822 4294967295 0 419 2377 687 4294967295 0 1550 2079 77 4294967295 0 1962 1826 1150 4294967295 0 691 2326 2138 4294967295 0 1968 274 2289 4294967295 0 2113 19 1328 4294967295 0 414 2078 895 4294967295 0 1030 647 232 4294967295 0 384 1602 742 4294967295 0 1589 1575 26 4294967295 0 558 1230 69 4294967295 0 17 1050 1365 4294967295 0 951 1033 350 4294967295 0 2077 701 2169 4294967295 0 1186 1403 1621 4294967295 0 875 588 398 4294967295 0 425 465 1196 4294967295 0 1394 1584 58 4294967295 0 733 1259 509 4294967295 0 2167 1991 2171 4294967295 0 1903 1226 118 4294967295 0 472 1945 1649 4294967295 0 1914 1597 1640 4294967295 0 1917 2163 471 4294967295 0 90 1726 1117 4294967295 0 1678 2047 2009 4294967295 0 838 586 2131 4294967295 0 2158 1909 559 4294967295 0 157 1832 2096 4294967295 0 761 2473 2086 4294967295 0 664 1490 1734 4294967295 0 1306 1133 433 4294967295 0 2302 1750 92 4294967295 0 1317 1361 46 4294967295 0 1298 1883 1312 4294967295 0 601 263 2369 4294967295 0 1676 1251 1885 4294967295 0 38 2421 110 4294967295 0 492 1620 2303 4294967295 0 2151 125 1718 4294967295 0 331 2333 1948 4294967295 0 1105 1396 324 4294967295 0 2143 997 95 4294967295 0 2286 729 2225 4294967295 0 1505 710 241 4294967295 0 681 1463 1206 4294967295 0 253 2427 1158 4294967295 0 1599 922 1967 4294967295 0 1443 1378 1618 4294967295 0 359 1480 176 4294967295 0 2069 1080 458 4294967295 0 1792 216 1336 4294967295 0 51 505 1624 4294967295 0 609 969 1627 4294967295 0 2472 1340 1423 4294967295 0 975 220 1148 4294967295 0 1232 1008 1327 4294967295 0 800 2242 36 4294967295 0 342 880 269 4294967295 0 2111 1151 153 4294967295 0 244 2004 246 4294967295 0 831 726 873 4294967295 0 1225 1192 665 4294967295 0 1533 1486 328 4294967295 0 1021 1263 1786 4294967295 0 2475 1720 62 4294967295 0 348 2381 1905 4294967295 0 2211 2027 777 4294967295 0 928 79 812 4294967295 0 407 2351 2319 4294967295 0 515 1634 1523 4294967295 0 758 2174 2387 4294967295 0 1358 1411 1976 4294967295 0 383 1504 1958 4294967295 0 2337 1079 1681 4294967295 0 1951 950 1257 4294967295 0 490 488 1852 4294967295 0 2470 1631 577 4294967295 0 2038 1844 1078 4294967295 0 1362 1388 1532 4294967295 0 1866 2230 326 4294967295 0 1555 1729 959 4294967295 0 717 2238 1710 4294967295 0 722 1349 2134 4294967295 0 1219 1704 1137 4294967295 0 2168 2226 646 4294967295 0 2404 834 1036 4294967295 0 301 1180 556 4294967295 0 2356 2136 1993 4294967295 0 2064 1762 1252 4294967295 0 268 2222 142 4294967295 0 2315 2462 1838 4294967295 0 1769 181 769 4294967295 0 451 2450 1559 4294967295 0 2471 2188 102 4294967295 0 2198 2349 136 4294967295 0 1501 2429 1784 4294967295 0 958 964 1791 4294967295 0 1022 1152 2030 4294967295 0 912 172 658 4294967295 0 1370 663 31 4294967295 0 2251 1628 2234 4294967295 0 2068 466 661 4294967295 0 1464 2291 619 4294967295 0 1867 163 9 4294967295 0 292 541 830 4294967295 0 1003 2271 439 4294967295 0 1625 1830 2101 4294967295 0 1038 97 523 4294967295 0 2214 158 1926 4294967295 0 287 1955 1437 4294967295 0 1301 538 978 4294967295 0 409 1481 2145 4294967295 0 2183 683 522 4294967295 0 963 1912 1780 4294967295 0 805 1006 626 4294967295 0 1692 1345 954 4294967295 0 2045 429 1985 4294967295 0 770 1973 1939 4294967295 0 1876 1430 780 4294967295 0 1853 2135 1043 4294967295 0 1282 2137 1269 4294967295 0 1744 866 290 4294967295 0 1453 489 1978 4294967295 0 865 1782 1839 4294967295 0 493 754 114 4294967295 0 1873 1757 2353 4294967295 0 1841 786 205 4294967295 0 2206 1171 2180 4294967295 0 2194 454 732 4294967295 0 1956 1814 1765 4294967295 0 346 1098 233 4294967295 0 1687 728 127 4294967295 0 620 1385 507 4294967295 0 480 104 1943 4294967295 0 1193 2152 2187 4294967295 0 40 887 2411 4294967295 0 0 1281 1346 4294967295 0 299 1777 526 4294967295 0 394 174 385 4294967295 0 616 1415 2139 4294967295 0 1145 1175 1600 4294967295 0 1517 856 2435 4294967295 0 564 993 1670 4294967295 0 201 845 1116 4294967295 0 1173 1165 1352 4294967295 0 1037 170 2232 4294967295 0 1330 1569 957 4294967295 0 1356 885 1789 4294967295 0 1907 2011 1797 4294967295 0 1452 1315 2350 4294967295 0 1181 528 1051 4294967295 0 1816 230 1359 4294967295 0 1691 1245 971 4294967295 0 1129 1369 2256 4294967295 282 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 34 182 107 202 722 802 742 822 257 347 282 367 877 947 897 967 68 117 142 162 267 292 312 332 427 447 472 492 582 602 622 642 0 127 172 217 412 457 502 537 712 757 792 837 1012 1047 1082 1117 277 322 362 397 592 632 667 697 892 927 962 997 1167 1197 1227 1257 467 547 487 562 1057 1127 1072 1142 617 687 637 702 1187 1247 1202 1262 812 832 852 867 957 977 992 1007 1097 1112 1132 1147 1222 1237 1252 1267 662 677 692 707 517 532 552 567 357 377 392 407 192 212 232 247 917 987 932 1002 307 387 327 402 767 847 782 862 137 227 157 242 1032 1067 1102 1137 737 777 817 857 437 482 522 557 102 152 197 237 1207 1192 1177 1162 1232 1172 1217 1157 1242 1212 1182 1152 1077 1062 1042 1027 1107 1037 1092 1022 1122 1087 1052 1017 937 922 907 887 972 902 952 882 982 942 912 872 787 772 752 732 827 747 807 727 842 797 762 717 647 627 607 587 672 597 657 577 682 652 612 572 497 477 452 432 527 442 512 422 542 507 462 417 337 317 297 272 372 287 352 262 382 342 302 252 167 147 122 83 207 112 187 49 222 177 132 15 73 23 Policy::Sequential<3,3>
+DEAL::0 0 0 0 3 0 0 0 4 528 0 1217 903 1574 88 1892 610 1929 1981 635 2463 1457 2441 741 89 1683 1590 1979 1983 1652 222 1716 2321 65 649 946 2084 234 1803 355 1538 2443 1283 167 668 916 1477 1484 1292 2015 143 892 1893 336 311 1075 2149 180 1018 1859 2320 1047 1054 987 1060 265 325 2220 83 2281 622 1556 645 1874 544 1064 516 2422 1470 1856 816 1455 1119 2391 1708 1250 652 852 482 1063 908 2062 1717 789 705 1604 2033 1485 756 1658 1270 2428 249 1957 939 2144 12 1399 1840 1848 72 2446 1277 1498 2392 1224 2363 155 1731 1347 247 1466 584 1347 247 1466 584 2032 608 970 1448 1231 1821 599 565 1231 1821 599 565 1995 2094 1673 2161 1671 200 1594 1996 1671 200 1594 1996 1144 1032 1449 226 1460 2447 972 1293 1002 546 1974 376 1934 2330 1085 2155 1788 1244 506 768 2283 2208 1211 841 1107 2252 671 942 1781 1542 105 862 1214 411 1289 2202 1969 1502 141 2466 2384 1164 803 575 2219 413 2070 1541 1288 1188 379 1587 1572 1278 2165 2334 1077 297 1483 2042 1176 948 819 1341 1693 32 2299 707 487 1636 551 288 934 2212 1087 356 628 2263 2352 1420 422 600 353 2043 1603 552 161 2076 1131 1355 639 8 1592 2433 1598 896 1619 206 836 567 2309 589 1090 757 1970 2036 2322 317 1210 2274 2455 597 1953 554 478 1921 2243 443 1389 1472 209 1373 1467 1561 184 308 1243 1813 406 1754 1513 364 103 1935 1194 1661 689 630 1530 1529 1747 2402 621 1159 688 213 790 2395 2390 96 323 242 1698 1471 2040 1549 563 67 2290 2100 924 1380 2072 395 71 2237 1478 1427 1615 1446 2105 258 332 1703 1524 1234 1026 2176 1776 251 1847 484 2215 1520 238 44 334 421 1870 14 926 1014 130 765 1115 2272 1924 2360 869 24 1924 2360 869 24 580 39 2254 1846 386 231 1428 2310 514 1316 535 1535 1908 476 1028 1579 1908 476 1028 1579 2081 2379 602 444 2277 1508 520 1890 787 1069 192 2296 2121 1911 1825 390 2121 1911 1825 390 1304 2295 1348 116 129 2418 1612 2157 199 1062 1136 519 264 898 1372 2050 1454 867 80 469 1947 2469 810 42 1264 594 1287 186 294 2189 1128 1884 2239 2024 1637 949 2325 1695 593 561 1818 684 99 1147 762 2343 1689 1503 2117 1431 1240 1229 709 631 455 1011 2052 250 60 1445 1271 553 1984 2057 1610 2409 280 1506 2440 37 2312 2372 991 854 872 694 1772 318 477 2006 1626 1964 2344 935 977 1434 378 2048 25 131 1308 1806 1444 603 2051 1313 380 34 1351 1656 273 2016 1916 1880 402 1714 763 2245 1928 140 1737 702 1928 140 1737 702 217 1286 126 1001 2380 1706 545 547 1092 1735 2401 1223 2023 882 1397 835 1121 555 1801 2468 1994 1605 811 1329 2141 2327 2285 124 975 0 2132 1491 339 2205 291 721 191 499 973 2459 1319 1227 871 330 1664 1760 86 347 1134 424 1990 2346 1666 2400 154 889 1141 245 1395 2388 1125 1793 18 2266 2093 1291 1719 2410 1039 2249 1103 1570 345 2053 587 1635 1433 801 1831 321 372 53 1817 1130 1237 1779 357 2119 662 1325 120 598 1023 863 1551 1531 2260 1553 1653 1819 711 617 1376 438 1989 884 878 2288 1426 2098 2061 2376 568 123 1552 164 2294 2269 1721 2031 2368 1364 193 731 1099 266 572 1733 1493 784 2109 1071 748 933 1109 1053 708 1593 1342 81 440 2099 1669 1824 267 1172 2408 2035 643 1382 583 1273 1560 434 840 78 2307 195 2268 1633 145 1177 1248 1254 138 2133 1088 981 2019 1239 921 1722 855 2275 979 2000 1276 644 1209 837 992 640 2282 1977 2173 147 35 1868 2374 1318 1462 525 1933 2460 2181 15 2414 2452 1763 673 2476 1095 59 1458 2240 2354 1419 1623 196 1450 1739 2129 1354 736 400 1216 1013 417 659 1686 750 814 239 1479 2293 1309 2332 486 1823 891 16 111 1697 1267 2393 1899 730 955 1126 1534 381 2166 449 27 255 1906 1073 228 2314 839 1548 569 1143 352 1526 629 1622 900 920 314 208 844 1184 48 10 2039 1118 1557 1207 1725 648 1189 2456 5 84 248 1898 1566 905 494 1879 1268 2022 50 1519 847 1527 938 1629 1528 1334 1204 1518 2258 112 461 962 693 1029 74 530 1755 431 1920 1468 1583 2089 2365 1740 2244 322 2434 363 503 613 677 1923 1946 2106 1320 953 2156 1048 680 998 2276 2182 262 778 275 1076 718 1170 66 117 1166 1785 1657 807 210 2008 1122 75 2467 270 1960 1581 1563 1537 788 1476 1379 423 1845 1799 1205 2095 581 2148 712 2087 2267 2193 289 1482 57 909 527 1041 2431 22 1089 2436 2017 225 529 2241 818 2382 300 795 2340 988 371 996 1919 1384 1966 537 412 925 432 2367 333 2170 1812 207 29 63 2246 1800 20 2362 1804 829 1161 2223 2140 1015 2445 178 893 2386 1992 464 2013 134 2262 1954 772 1913 1495 1871 1712 2224 1139 1153 1515 2253 1864 1198 994 7 1743 2280 1543 1668 791 2218 2448 2308 194 1901 1000 968 119 815 101 1766 1256 329 1861 1169 243 1488 1836 377 1930 198 366 1191 902 1195 2026 1323 1746 204 2191 47 473 2060 1020 278 1758 723 1496 1573 1222 1617 1154 459 1889 1888 512 734 1113 2442 1442 2172 1998 203 2389 214 1545 2355 1409 310 518 1487 341 259 1392 1475 1540 362 1387 919 1942 1808 1400 1988 271 2107 802 929 1949 276 1778 850 1601 1606 1435 888 960 2438 775 1886 335 2029 521 714 177 1796 1645 1429 470 2300 774 2190 2217 2228 415 2364 283 1070 2179 1218 1578 2398 133 2430 2071 1544 2361 1851 98 448 824 1393 1019 1162 211 670 1745 1332 2001 1357 2082 1127 983 1902 1833 2257 697 1461 2186 745 428 720 1040 1149 2122 1213 1398 870 982 87 2065 913 2412 1407 1842 54 1732 690 2270 560 2012 2420 1897 1156 28 2454 1938 1858 1494 984 1536 227 368 237 876 1648 1794 2432 286 1262 1701 445 2405 2067 989 961 767 2010 1104 820 1012 2328 539 2292 2298 1665 674 596 779 2090 1539 2304 462 782 2147 397 605 1414 1655 557 611 452 2424 2423 755 2201 804 393 475 2301 1422 2248 2311 1887 21 1609 106 868 746 1417 221 1404 1307 175 678 1310 229 215 430 591 212 821 1749 627 827 704 128 479 894 337 511 990 1790 2160 1643 2259 1199 354 595 1190 1208 897 1971 121 1585 2018 1709 1265 1500 2178 2229 874 1284 108 1728 2341 931 1465 144 744 501 76 1412 2265 2347 2331 3 2357 2335 1564 148 1353 2449 585 405 906 826 185 1174 388 2083 1052 917 427 93 2146 1123 2028 404 692 623 1072 179 1952 2207 1135 1034 799 685 510 911 1424 1061 1723 1027 1516 2261 1375 2056 73 1736 2371 2177 303 2199 1438 1102 1146 474 2474 1160 1296 1999 2338 418 450 1179 1081 1056 579 304 825 2153 183 2231 833 936 182 851 1110 224 1425 349 737 2297 344 832 1436 49 365 2114 1987 481 1972 360 1057 1829 927 296 1660 279 1512 343 1390 534 1300 1322 1521 137 1931 1764 1441 1100 162 2426 1017 1405 1350 2200 281 2021 2451 1554 1157 1783 1106 1727 2461 1197 1044 918 1522 944 980 1294 2049 1386 699 2345 1260 2115 1142 2457 460 1377 2116 1514 1408 533 1986 937 2383 151 1094 2324 2118 1835 2209 2020 656 1688 2092 1492 2318 1862 1097 517 1381 719 456 1324 1413 2235 2287 2444 1674 1815 2464 785 633 864 2112 2313 1295 2203 392 33 1302 1183 2359 2306 463 1961 1410 1024 524 1344 55 2358 23 1111 309 504 2370 666 1869 257 1724 1238 1641 614 1562 1580 41 1632 2247 2317 13 1182 604 571 1582 1241 52 2394 940 391 1927 967 254 1255 1280 1849 562 808 320 1440 667 1672 1049 682 1850 319 315 986 408 2378 152 654 2074 753 1775 941 369 1451 1591 447 1120 1418 1510 1363 1290 2046 43 1303 636 1882 2348 637 1068 1305 817 846 848 879 1705 974 1009 375 1759 223 1941 2034 1285 1383 607 2063 1863 828 0 1406 1200 2465 2110 497 1997 1140 1904 1266 1525 2279 284 1965 2336 188 1707 1093 1007 1299 703 312 2162 681 1463 1206 831 726 873 359 1480 176 2475 1720 62 351 794 999 806 1922 1857 2054 370 2385 1091 1469 901 490 488 1852 268 2222 142 1866 2230 326 2471 2188 102 2103 1595 1647 1694 1439 240 187 1059 340 156 298 570 1630 2128 947 655 513 1937 1228 2125 700 1202 1275 1843 1246 45 624 467 483 2055 696 6 966 1333 2130 781 1854 679 747 1837 295 1738 1547 416 638 822 1394 1584 58 472 1945 1649 1678 2047 2009 761 2473 2086 2127 2120 751 715 2066 1511 2213 724 1567 165 1178 2255 285 793 1236 1651 861 68 1509 1326 606 1613 453 1702 498 1201 1132 883 1550 2079 77 384 1602 742 2286 729 2225 51 505 1624 2111 1151 153 928 79 812 1464 2291 619 287 1955 1437 2045 429 1985 865 1782 1839 1644 1084 1980 582 1274 1168 618 813 485 1042 2425 1891 2167 1991 2171 2158 1909 559 1298 1883 1312 331 2333 1948 1362 1388 1532 2404 834 1036 451 2450 1559 1370 663 31 480 104 1943 616 1415 2139 1037 170 2232 1816 230 1359 890 1163 1374 558 1230 69 796 1820 1872 2077 701 2169 409 1481 2145 1873 1757 2353 805 1006 626 2194 454 732 90 1726 1117 492 1620 2303 157 1832 2096 1105 1396 324 299 1777 526 1452 1315 2350 1145 1175 1600 1691 1245 971 1533 1486 328 2211 2027 777 758 2174 2387 2337 1079 1681 1769 181 769 1501 2429 1784 912 172 658 2068 466 661 1853 2135 1043 1453 489 1978 1841 786 205 1956 1814 1765 1173 1165 1352 1356 885 1789 1181 528 1051 1129 1369 2256 1317 1361 46 1676 1251 1885 2151 125 1718 2143 997 95 1968 274 2289 1030 647 232 17 1050 1365 1186 1403 1621 1586 132 2073 1860 1247 632 1335 669 1650 1473 952 256 1499 2123 1391 1220 1507 1936 1432 1360 823 1795 809 2439 1219 1704 1137 1022 1152 2030 301 1180 556 2251 1628 2234 676 2003 327 1474 235 2453 1221 2323 2025 2204 2397 764 2472 1340 1423 515 1634 1523 800 2242 36 383 1504 1958 1767 2 899 367 1338 218 426 1773 842 2108 1771 1932 1625 1830 2101 963 1912 1780 1282 2137 1269 2206 1171 2180 1443 1378 1618 1232 1008 1327 1021 1263 1786 1358 1411 1976 197 2339 1802 2227 272 1659 2113 19 1328 951 1033 350 1944 1456 932 1690 1045 302 1682 1685 171 1696 1337 1108 1517 856 2435 394 174 385 40 887 2411 620 1385 507 1330 1569 957 1193 2152 2187 201 845 1116 1687 728 127 1907 2011 1797 564 993 1670 0 1281 1346 346 1098 233 1692 1345 954 2183 683 522 2214 158 1926 1003 2271 439 1744 866 290 1038 97 523 1876 1430 780 292 541 830 493 754 114 770 1973 1939 1301 538 978 1867 163 9 2356 2136 1993 2168 2226 646 717 2238 1710 2038 1844 1078 2198 2349 136 1555 1729 959 2315 2462 1838 2470 1631 577 958 964 1791 2064 1762 1252 722 1349 2134 1951 950 1257 342 880 269 975 220 1148 1792 216 1336 1599 922 1967 348 2381 1905 2069 1080 458 1225 1192 665 253 2427 1158 407 2351 2319 244 2004 246 609 969 1627 1505 710 241 664 1490 1734 838 586 2131 1914 1597 1640 733 1259 509 601 263 2369 1903 1226 118 2302 1750 92 425 465 1196 38 2421 110 1306 1133 433 1917 2163 471 875 588 398 419 2377 687 358 2184 1915 316 313 1314 956 592 612 414 2078 895 1261 783 716 691 2326 2138 2164 2192 1730 1589 1575 26 1962 1826 1150 1031 1822 1055 399 1751 2102 1010 1447 749 305 1807 915 2197 1715 1677 1565 100 1576 1768 2375 995 61 930 1203 436 2059 2305 2150 1366 566 2142 2407 236 1401 338 202 2396 2342 1894 508 625 1588 798 1066 857 576 1638 573 1654 2195 1339 435 642 11 1675 1774 634 536 548 776 1297 1741 1187 1083 1321 219 1577 149 457 2221 1279 886 1004 2250 2041 2417 1096 653 396 713 797 1680 849 1416 1642 2124 1368 1940 1748 441 1787 1497 496 752 1834 1963 2007 1877 660 1646 1616 401 651 1896 122 2413 860 1249 1878 2154 500 976 1035 1343 641 2373 2416 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 0 0 4 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 214 0 56 1667 2216 387 1112 252 1212 1761 532 382 1679 1607 945 2175 1167 109 2097 590 190 1828 1895 740 1770 1910 1753 1331 914 743 543 94 843 549 169 2233 1684 1805 139 2196 615 1959 2037 1865 2058 773 1067 542 2236 1568 1900 442 578 1459 168 1086 1608 2185 771 985 738 1082 374 759 1711 574 1875 389 70 361 1124 437 1558 2085 735 373 1639 1016 261 85 1700 943 1798 2366 1235 1699 2080 923 904 2159 2403 1950 1371 277 1215 173 1811 1074 1546 107 1367 2329 695 1982 1713 160 1614 293 1855 2316 420 1662 858 1421 446 1881 2273 1 306 1311 1402 859 2458 135 760 1810 2437 877 650 1155 1571 2419 672 698 1489 2002 792 403 686 853 1742 1065 828 907 675 657 4 1752 495 260 550 2284 1138 766 1827 1258 1596 2399 82 91 531 1253 2014 2005 1058 1185 1918 2278 739 2091 146 881 282 502 1809 115 1101 410 1233 189 1756 1046 1242 706 30 2477 2210 1272 2075 1925 113 150 2104 2264 725 307 1025 540 2415 1611 910 1975 491 2044 2088 159 2406 1005 727 1114 965 64 2126 166 1663 468 3 0 4 133 0 0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 309 0 0 7 10 13 16 23 26 29 32 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 346 349 352 359 362 365 368 371 374 377 380 383 386 389 392 395 398 401 408 411 414 421 424 427 430 433 436 439 442 445 448 451 454 457 460 463 470 473 476 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 949 952 955 962 965 968 247 0 0 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 71 74 77 80 83 86 89 92 95 98 101 104 107 110 113 116 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 739 742 745 748 751 764 767 770 773 776 789 802 857 954 1 0 4294967295 4 0 0 0 0 0 0 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4 0 0 0 0 0 0 64 0 0 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 82 85 88 91 94 97 100 103 106 109 112 115 118 121 124 127 130 133 136 139 142 145 148 151 154 157 160 163 166 169 172 175 178 181 184 187 190 193 196 199 202 205 208 211 0 0 3 0 0 0 0 0 5826 0 1217 903 1574 88 1347 247 1466 584 1231 1821 599 565 1908 476 1028 1579 1671 200 1594 1996 1924 2360 869 24 2121 1911 1825 390 1928 140 1737 702 86 347 1134 424 1990 2346 1666 994 7 1743 2280 1543 1668 791 2132 1491 339 2205 291 721 191 968 119 815 101 1766 1256 329 919 1942 1808 1400 1988 271 2107 1941 2034 1285 1383 607 2063 1863 2431 22 1089 2436 2017 225 529 637 1068 1305 817 846 848 879 18 2266 2093 1291 1719 2410 1039 988 371 996 1919 1384 1966 537 1545 2355 1409 310 518 1487 341 1591 447 1120 1418 1510 1363 1290 2127 2120 751 715 2066 1511 2213 724 1567 165 1178 2255 285 122 2413 860 1249 1878 2154 500 976 1035 1343 641 2373 2416 1406 1200 2465 2110 497 1997 1140 1904 1266 1525 2279 284 1965 713 797 1680 849 1416 1642 2124 1368 1940 1748 441 1787 1497 2103 1595 1647 1694 1439 240 187 1059 340 156 298 570 1630 1675 1774 634 536 548 776 1297 1741 1187 1083 1321 219 1577 56 1667 2216 387 1112 252 1212 1761 532 382 1679 1607 945 2175 1167 109 2097 590 190 1828 1895 740 1770 1910 1753 1347 247 1466 584 167 668 916 1477 1908 476 1028 1579 1592 2433 1598 896 1924 2360 869 24 1603 552 161 2076 1928 140 1737 702 402 1714 763 2245 2253 1864 1198 1739 2129 1354 499 973 2459 1861 1169 243 375 1759 223 1350 2200 281 2241 818 2382 2046 43 1303 300 795 2340 1763 673 2476 941 369 1451 1441 1100 162 401 651 1896 1944 1456 932 1093 1007 1299 1279 886 1004 2128 947 655 1654 2195 1339 1331 914 743 1231 1821 599 565 1908 476 1028 1579 1484 1292 2015 143 2309 589 1090 757 2121 1911 1825 390 1928 140 1737 702 1210 2274 2455 597 25 131 1308 1806 2400 154 889 2218 2448 2308 194 1901 1000 239 1479 2293 802 929 1949 1705 974 1009 636 1882 2348 2338 418 450 203 2389 214 941 369 1451 2393 1899 730 579 304 825 793 1236 1651 660 1646 1616 1096 653 396 1767 2 899 513 1937 1228 576 1638 573 543 94 843 1908 476 1028 1579 1592 2433 1598 896 2309 589 1090 757 1604 2033 1485 756 1928 140 1737 702 402 1714 763 2245 25 131 1308 1806 1026 2176 1776 251 2218 2448 2308 736 400 1216 1861 1169 243 1309 2332 486 1705 974 1009 2021 2451 1554 2046 43 1303 1179 1081 1056 941 369 1451 1441 1100 162 579 304 825 1785 1657 807 660 1646 1616 1690 1045 302 1279 886 1004 426 1773 842 2125 700 1202 798 1066 857 549 169 2233 1671 200 1594 1996 1924 2360 869 24 2121 1911 1825 390 1928 140 1737 702 892 1893 336 311 628 2263 2352 1420 2243 443 1389 1472 991 854 872 694 1540 362 1387 375 1759 223 909 527 1041 636 1882 2348 1073 228 2314 906 826 185 35 1868 2374 1052 917 427 2249 1103 1570 412 925 432 259 1392 1475 2074 753 1775 861 68 1509 1963 2007 1877 2336 188 1707 2250 2041 2417 435 642 11 1499 2123 1391 1684 1805 139 1924 2360 869 24 1603 552 161 2076 1928 140 1737 702 402 1714 763 2245 628 2263 2352 1420 2062 1717 789 705 991 854 872 694 130 765 1115 2272 375 1759 223 1350 2200 281 2241 818 2382 2046 43 1303 906 826 185 2087 2267 2193 1318 1462 525 93 2146 1123 412 925 432 1095 59 1458 2074 753 1775 2426 1017 1405 1963 2007 1877 1682 1685 171 703 312 2162 149 457 2221 1654 2195 1339 1220 1507 1936 2196 615 1959 2121 1911 1825 390 1928 140 1737 702 1210 2274 2455 597 25 131 1308 1806 2243 443 1389 1472 991 854 872 694 1658 1270 2428 249 238 44 334 421 802 929 1949 1705 974 1009 636 1882 2348 2338 418 450 839 1548 569 1174 388 2083 1052 917 427 1537 788 1476 259 1392 1475 2074 753 1775 955 1126 1534 2153 183 2231 1326 606 1613 496 752 1834 2250 2041 2417 367 1338 218 576 1638 573 1432 1360 823 2037 1865 2058 1928 140 1737 702 402 1714 763 2245 25 131 1308 1806 1026 2176 1776 251 991 854 872 694 130 765 1115 2272 238 44 334 421 1224 2363 155 1731 1705 974 1009 2021 2451 1554 2046 43 1303 1179 1081 1056 1174 388 2083 289 1482 57 93 2146 1123 1379 423 1845 2074 753 1775 2426 1017 1405 2153 183 2231 210 2008 1122 496 752 1834 1696 1337 1108 149 457 2221 2108 1771 1932 798 1066 857 1795 809 2439 773 1067 542 167 668 916 1477 2032 608 970 1448 1592 2433 1598 896 2081 2379 602 444 1603 552 161 2076 386 231 1428 2310 402 1714 763 2245 217 1286 126 1001 1739 2129 1354 1488 1836 377 1319 1227 871 1191 902 1195 1350 2200 281 2378 152 654 829 1161 2223 682 1850 319 1763 673 2476 178 893 2386 1441 1100 162 808 320 1440 1944 1456 932 508 625 1588 351 794 999 2150 1366 566 1275 1843 1246 1565 100 1576 2236 1568 1900 2032 608 970 1448 1892 610 1929 1981 2081 2379 602 444 1460 2447 972 1293 386 231 1428 2310 1934 2330 1085 2155 217 1286 126 1001 264 898 1372 2050 1488 1836 377 1831 321 372 330 1664 1760 2026 1323 1746 2378 152 654 1393 1019 1162 2140 1015 2445 667 1672 1049 178 893 2386 120 598 1023 808 320 1440 1544 2361 1851 508 625 1588 1644 1084 1980 2054 370 2385 61 930 1203 45 624 467 2197 1715 1677 442 578 1459 1592 2433 1598 896 2081 2379 602 444 1604 2033 1485 756 1970 2036 2322 317 402 1714 763 2245 217 1286 126 1001 1026 2176 1776 251 1626 1964 2344 935 736 400 1216 1930 198 366 1191 902 1195 1823 891 16 2021 2451 1554 315 986 408 682 1850 319 510 911 1424 1441 1100 162 808 320 1440 1785 1657 807 1516 2261 1375 1690 1045 302 2396 2342 1894 2150 1366 566 676 2003 327 483 2055 696 305 1807 915 168 1086 1608 2081 2379 602 444 1460 2447 972 1293 1970 2036 2322 317 1075 2149 180 1018 217 1286 126 1001 264 898 1372 2050 1626 1964 2344 935 184 308 1243 1813 1930 198 366 53 1817 1130 2026 1323 1746 111 1697 1267 315 986 408 211 670 1745 667 1672 1049 1061 1723 1027 808 320 1440 1544 2361 1851 1516 2261 1375 920 314 208 2396 2342 1894 582 1274 1168 61 930 1203 1221 2323 2025 6 966 1333 1010 1447 749 2185 771 985 1603 552 161 2076 386 231 1428 2310 402 1714 763 2245 217 1286 126 1001 2062 1717 789 705 422 600 353 2043 130 765 1115 2272 2440 37 2312 2372 1350 2200 281 2378 152 654 829 1161 2223 682 1850 319 2087 2267 2193 2265 2347 2331 1933 2460 2181 1564 148 1353 1095 59 1458 1992 464 2013 2426 1017 1405 1280 1849 562 1682 1685 171 1401 338 202 806 1922 1857 436 2059 2305 1565 100 1576 1586 132 2073 738 1082 374 386 231 1428 2310 1934 2330 1085 2155 217 1286 126 1001 264 898 1372 2050 422 600 353 2043 1859 2320 1047 1054 2440 37 2312 2372 103 1935 1194 1661 2378 152 654 1393 1019 1162 2140 1015 2445 667 1672 1049 2265 2347 2331 648 1189 2456 15 2414 2452 2449 585 405 1992 464 2013 863 1551 1531 1280 1849 562 98 448 824 1401 338 202 618 813 485 1091 1469 901 1768 2375 995 2197 1715 1677 1860 1247 632 759 1711 574 402 1714 763 2245 217 1286 126 1001 1026 2176 1776 251 1626 1964 2344 935 130 765 1115 2272 2440 37 2312 2372 1224 2363 155 1731 1847 484 2215 1520 2021 2451 1554 315 986 408 682 1850 319 510 911 1424 289 1482 57 3 2357 2335 1564 148 1353 75 2467 270 2426 1017 1405 1280 1849 562 210 2008 1122 2056 73 1736 1696 1337 1108 2142 2407 236 436 2059 2305 1474 235 2453 305 1807 915 1335 669 1650 1875 389 70 217 1286 126 1001 264 898 1372 2050 1626 1964 2344 935 184 308 1243 1813 2440 37 2312 2372 103 1935 1194 1661 1847 484 2215 1520 1957 939 2144 12 315 986 408 211 670 1745 667 1672 1049 1061 1723 1027 3 2357 2335 5 84 248 2449 585 405 1960 1581 1563 1280 1849 562 98 448 824 2056 73 1736 844 1184 48 2142 2407 236 1042 2425 1891 1768 2375 995 2204 2397 764 1010 1447 749 1473 952 256 361 1124 437 1484 1292 2015 143 2309 589 1090 757 1995 2094 1673 2161 2277 1508 520 1890 1210 2274 2455 597 25 131 1308 1806 1304 2295 1348 116 2380 1706 545 547 1141 245 1395 204 2191 47 239 1479 2293 278 1758 723 888 960 2438 967 254 1255 2338 418 450 1241 52 2394 2393 1899 730 579 304 825 276 1778 850 2317 13 1182 453 1702 498 399 1751 2102 1767 2 899 2164 2192 1730 2130 781 1854 956 592 612 1558 2085 735 2309 589 1090 757 1604 2033 1485 756 2277 1508 520 1890 1619 206 836 567 25 131 1308 1806 1026 2176 1776 251 2380 1706 545 547 273 2016 1916 1880 204 2191 47 1013 417 659 1309 2332 486 1496 1573 1222 967 254 1255 1300 1322 1521 1179 1081 1056 604 571 1582 579 304 825 1785 1657 807 2317 13 1182 1660 279 1512 399 1751 2102 197 2339 1802 426 1773 842 1261 783 716 679 747 1837 316 313 1314 373 1639 1016 1995 2094 1673 2161 2277 1508 520 1890 635 2463 1457 2441 2283 2208 1211 841 1304 2295 1348 116 2380 1706 545 547 1781 1542 105 862 294 2189 1128 1884 2388 1125 1793 473 2060 1020 278 1758 723 1376 438 1989 775 1886 335 940 391 1927 1241 52 2394 1156 28 2454 276 1778 850 2317 13 1182 1552 164 2294 984 1536 227 1201 1132 883 1031 1822 1055 2164 2192 1730 890 1163 1374 295 1738 1547 358 2184 1915 261 85 1700 2277 1508 520 1890 1619 206 836 567 2283 2208 1211 841 987 1060 265 325 2380 1706 545 547 273 2016 1916 1880 294 2189 1128 1884 2390 96 323 242 473 2060 1020 1686 750 814 1496 1573 1222 884 878 2288 940 391 1927 137 1931 1764 604 571 1582 1938 1858 1494 2317 13 1182 1660 279 1512 984 1536 227 112 461 962 1031 1822 1055 2227 272 1659 1261 783 716 796 1820 1872 416 638 822 419 2377 687 943 1798 2366 1210 2274 2455 597 25 131 1308 1806 1304 2295 1348 116 2380 1706 545 547 1658 1270 2428 249 238 44 334 421 209 1373 1467 1561 1610 2409 280 1506 888 960 2438 967 254 1255 2338 418 450 1241 52 2394 1143 352 1526 874 1284 108 1537 788 1476 1465 144 744 955 1126 1534 2153 183 2231 1601 1606 1435 41 1632 2247 1550 2079 77 1962 1826 1150 367 1338 218 691 2326 2138 956 592 612 1968 274 2289 1235 1699 2080 25 131 1308 1806 1026 2176 1776 251 2380 1706 545 547 273 2016 1916 1880 238 44 334 421 1224 2363 155 1731 1610 2409 280 1506 1870 14 926 1014 967 254 1255 1300 1322 1521 1179 1081 1056 604 571 1582 874 1284 108 1799 1205 2095 1379 423 1845 501 76 1412 2153 183 2231 210 2008 1122 41 1632 2247 343 1390 534 1962 1826 1150 2113 19 1328 2108 1771 1932 414 2078 895 316 313 1314 1030 647 232 923 904 2159 1304 2295 1348 116 2380 1706 545 547 1781 1542 105 862 294 2189 1128 1884 209 1373 1467 1561 1610 2409 280 1506 2220 83 2281 622 1747 2402 621 1159 775 1886 335 940 391 1927 1241 52 2394 1156 28 2454 629 1622 900 1728 2341 931 1465 144 744 2022 50 1519 1601 1606 1435 41 1632 2247 2269 1721 2031 368 237 876 384 1602 742 1589 1575 26 691 2326 2138 558 1230 69 358 2184 1915 17 1050 1365 2403 1950 1371 2380 1706 545 547 273 2016 1916 1880 294 2189 1128 1884 2390 96 323 242 1610 2409 280 1506 1870 14 926 1014 1747 2402 621 1159 1399 1840 1848 72 940 391 1927 137 1931 1764 604 571 1582 1938 1858 1494 1728 2341 931 581 2148 712 501 76 1412 847 1527 938 41 1632 2247 343 1390 534 368 237 876 693 1029 74 1589 1575 26 951 1033 350 414 2078 895 2077 701 2169 419 2377 687 1186 1403 1621 277 1215 173 1604 2033 1485 756 1970 2036 2322 317 1619 206 836 567 787 1069 192 2296 1026 2176 1776 251 1626 1964 2344 935 273 2016 1916 1880 1092 1735 2401 1223 1013 417 659 1617 1154 459 1823 891 16 734 1113 2442 1300 1322 1521 614 1562 1580 510 911 1424 666 1869 257 1785 1657 807 1516 2261 1375 1660 279 1512 2358 23 1111 197 2339 1802 875 588 398 676 2003 327 425 465 1196 1394 1584 58 733 1259 509 1811 1074 1546 1970 2036 2322 317 1075 2149 180 1018 787 1069 192 2296 1002 546 1974 376 1626 1964 2344 935 184 308 1243 1813 1092 1735 2401 1223 1454 867 80 469 1617 1154 459 1237 1779 357 111 1697 1267 1442 2172 1998 614 1562 1580 1902 1833 2257 1061 1723 1027 309 504 2370 1516 2261 1375 920 314 208 2358 23 1111 1332 2001 1357 875 588 398 2167 1991 2171 1221 2323 2025 1903 1226 118 472 1945 1649 1914 1597 1640 107 1367 2329 1619 206 836 567 787 1069 192 2296 987 1060 265 325 1107 2252 671 942 273 2016 1916 1880 1092 1735 2401 1223 2390 96 323 242 2325 1695 593 561 1686 750 814 1889 1888 512 734 1113 2442 1426 2098 2061 137 1931 1764 1724 1238 1641 666 1869 257 2010 1104 820 1660 279 1512 2358 23 1111 112 461 962 2292 2298 1665 2227 272 1659 1917 2163 471 425 465 1196 90 1726 1117 1678 2047 2009 838 586 2131 695 1982 1713 787 1069 192 2296 1002 546 1974 376 1107 2252 671 942 741 89 1683 1590 1092 1735 2401 1223 1454 867 80 469 2325 1695 593 561 1969 1502 141 2466 1889 1888 512 2119 662 1325 1442 2172 1998 2376 568 123 1724 1238 1641 697 1461 2186 309 504 2370 1012 2328 539 2358 23 1111 1332 2001 1357 2292 2298 1665 572 1733 1493 1917 2163 471 2158 1909 559 1903 1226 118 157 1832 2096 761 2473 2086 664 1490 1734 160 1614 293 1026 2176 1776 251 1626 1964 2344 935 273 2016 1916 1880 1092 1735 2401 1223 1224 2363 155 1731 1847 484 2215 1520 1870 14 926 1014 1271 553 1984 2057 1300 1322 1521 614 1562 1580 510 911 1424 666 1869 257 1799 1205 2095 1190 1208 897 75 2467 270 2018 1709 1265 210 2008 1122 2056 73 1736 343 1390 534 524 1344 55 2113 19 1328 1306 1133 433 1474 235 2453 2302 1750 92 733 1259 509 1317 1361 46 1855 2316 420 1626 1964 2344 935 184 308 1243 1813 1092 1735 2401 1223 1454 867 80 469 1847 484 2215 1520 1957 939 2144 12 1271 553 1984 2057 689 630 1530 1529 614 1562 1580 1902 1833 2257 1061 1723 1027 309 504 2370 1190 1208 897 1898 1566 905 1960 1581 1563 1500 2178 2229 2056 73 1736 844 1184 48 524 1344 55 2082 1127 983 1306 1133 433 1298 1883 1312 2204 2397 764 601 263 2369 1914 1597 1640 1676 1251 1885 1662 858 1421 273 2016 1916 1880 1092 1735 2401 1223 2390 96 323 242 2325 1695 593 561 1870 14 926 1014 1271 553 1984 2057 1399 1840 1848 72 688 213 790 2395 137 1931 1764 1724 1238 1641 666 1869 257 2010 1104 820 581 2148 712 1971 121 1585 2018 1709 1265 1629 1528 1334 343 1390 534 524 1344 55 693 1029 74 674 596 779 951 1033 350 38 2421 110 2302 1750 92 492 1620 2303 838 586 2131 2151 125 1718 446 1881 2273 1092 1735 2401 1223 1454 867 80 469 2325 1695 593 561 1969 1502 141 2466 1271 553 1984 2057 689 630 1530 1529 688 213 790 2395 1556 645 1874 544 1724 1238 1641 697 1461 2186 309 504 2370 1012 2328 539 1971 121 1585 494 1879 1268 1500 2178 2229 1204 1518 2258 524 1344 55 2082 1127 983 674 596 779 784 2109 1071 38 2421 110 331 2333 1948 601 263 2369 1105 1396 324 664 1490 1734 2143 997 95 1 306 1311 892 1893 336 311 628 2263 2352 1420 2243 443 1389 1472 991 854 872 694 1144 1032 1449 226 580 39 2254 1846 129 2418 1612 2157 2023 882 1397 835 1073 228 2314 906 826 185 35 1868 2374 1052 917 427 1429 470 2300 1961 1410 1024 2367 333 2170 33 1302 1183 345 2053 587 63 2246 1800 2029 521 714 864 2112 2313 2286 729 2225 1505 710 241 681 1463 1206 253 2427 1158 1499 2123 1391 1599 922 1967 1402 859 2458 628 2263 2352 1420 2062 1717 789 705 991 854 872 694 130 765 1115 2272 580 39 2254 1846 1131 1355 639 8 2023 882 1397 835 380 34 1351 1656 906 826 185 2087 2267 2193 1318 1462 525 93 2146 1123 1961 1410 1024 1972 360 1057 1812 207 29 1295 2203 392 63 2246 1800 2240 2354 1419 864 2112 2313 1436 49 365 1505 710 241 1443 1378 1618 359 1480 176 2069 1080 458 1220 1507 1936 1792 216 1336 135 760 1810 2243 443 1389 1472 991 854 872 694 1658 1270 2428 249 238 44 334 421 129 2418 1612 2157 2023 882 1397 835 1953 554 478 1921 977 1434 378 2048 839 1548 569 1174 388 2083 1052 917 427 1537 788 1476 774 2190 2217 2359 2306 463 33 1302 1183 2371 2177 303 2029 521 714 864 2112 2313 381 2166 449 1146 474 2474 51 505 1624 609 969 1627 253 2427 1158 2472 1340 1423 1432 1360 823 975 220 1148 2437 877 650 991 854 872 694 130 765 1115 2272 238 44 334 421 1224 2363 155 1731 2023 882 1397 835 380 34 1351 1656 977 1434 378 2048 332 1703 1524 1234 1174 388 2083 289 1482 57 93 2146 1123 1379 423 1845 2359 2306 463 1829 927 296 1295 2203 392 2199 1438 1102 864 2112 2313 1436 49 365 1146 474 2474 1076 718 1170 609 969 1627 1232 1008 1327 2069 1080 458 800 2242 36 1795 809 2439 342 880 269 1155 1571 2419 1144 1032 1449 226 580 39 2254 1846 129 2418 1612 2157 2023 882 1397 835 1979 1983 1652 222 2219 413 2070 1541 1572 1278 2165 2334 762 2343 1689 1503 1429 470 2300 1961 1410 1024 2367 333 2170 33 1302 1183 583 1273 1560 452 2424 2423 1342 81 440 393 475 2301 1635 1433 801 20 2362 1804 177 1796 1645 2464 785 633 2111 1151 153 244 2004 246 831 726 873 1225 1192 665 1599 922 1967 1533 1486 328 672 698 1489 580 39 2254 1846 1131 1355 639 8 2023 882 1397 835 380 34 1351 1656 2219 413 2070 1541 1064 516 2422 1470 762 2343 1689 1503 563 67 2290 2100 1961 1410 1024 1972 360 1057 1812 207 29 1295 2203 392 452 2424 2423 2089 2365 1740 2099 1669 1824 1422 2248 2311 20 2362 1804 1623 196 1450 2464 785 633 2114 1987 481 244 2004 246 1021 1263 1786 2475 1720 62 348 2381 1905 1792 216 1336 2211 2027 777 2002 792 403 129 2418 1612 2157 2023 882 1397 835 1953 554 478 1921 977 1434 378 2048 1572 1278 2165 2334 762 2343 1689 1503 1856 816 1455 1119 71 2237 1478 1427 774 2190 2217 2359 2306 463 33 1302 1183 2371 2177 303 434 840 78 755 2201 804 393 475 2301 2106 1320 953 177 1796 1645 2464 785 633 27 255 1906 1160 1296 1999 928 79 812 407 2351 2319 1225 1192 665 515 1634 1523 975 220 1148 758 2174 2387 686 853 1742 2023 882 1397 835 380 34 1351 1656 977 1434 378 2048 332 1703 1524 1234 762 2343 1689 1503 563 67 2290 2100 71 2237 1478 1427 2446 1277 1498 2392 2359 2306 463 1829 927 296 1295 2203 392 2199 1438 1102 755 2201 804 2244 322 2434 1422 2248 2311 2156 1048 680 2464 785 633 2114 1987 481 1160 1296 1999 66 117 1166 407 2351 2319 1358 1411 1976 348 2381 1905 383 1504 1958 342 880 269 2337 1079 1681 1065 828 907 2062 1717 789 705 422 600 353 2043 130 765 1115 2272 2440 37 2312 2372 1131 1355 639 8 514 1316 535 1535 380 34 1351 1656 1121 555 1801 2468 2087 2267 2193 2265 2347 2331 1933 2460 2181 1564 148 1353 1972 360 1057 2444 1674 1815 134 2262 1954 719 456 1324 2240 2354 1419 1871 1712 2224 1436 49 365 1492 2318 1862 1443 1378 1618 1951 950 1257 490 488 1852 2470 1631 577 1586 132 2073 2038 1844 1078 675 657 4 422 600 353 2043 1859 2320 1047 1054 2440 37 2312 2372 103 1935 1194 1661 514 1316 535 1535 1788 1244 506 768 1121 555 1801 2468 1947 2469 810 42 2265 2347 2331 648 1189 2456 15 2414 2452 2449 585 405 2444 1674 1815 1213 1398 870 772 1913 1495 1097 517 1381 1871 1712 2224 2260 1553 1653 1492 2318 1862 745 428 720 1951 950 1257 1362 1388 1532 1866 2230 326 1555 1729 959 1860 1247 632 717 2238 1710 1752 495 260 130 765 1115 2272 2440 37 2312 2372 1224 2363 155 1731 1847 484 2215 1520 380 34 1351 1656 1121 555 1801 2468 332 1703 1524 1234 1772 318 477 2006 289 1482 57 3 2357 2335 1564 148 1353 75 2467 270 1829 927 296 1413 2235 2287 719 456 1324 2028 404 692 1436 49 365 1492 2318 1862 1076 718 1170 1952 2207 1135 1232 1008 1327 722 1349 2134 2470 1631 577 1219 1704 1137 1335 669 1650 2168 2226 646 550 2284 1138 2440 37 2312 2372 103 1935 1194 1661 1847 484 2215 1520 1957 939 2144 12 1121 555 1801 2468 1947 2469 810 42 1772 318 477 2006 406 1754 1513 364 3 2357 2335 5 84 248 2449 585 405 1960 1581 1563 1413 2235 2287 982 87 2065 1097 517 1381 623 1072 179 1492 2318 1862 745 428 720 1952 2207 1135 10 2039 1118 722 1349 2134 2404 834 1036 1555 1729 959 301 1180 556 1473 952 256 2356 2136 1993 766 1827 1258 1131 1355 639 8 514 1316 535 1535 380 34 1351 1656 1121 555 1801 2468 1064 516 2422 1470 1288 1188 379 1587 563 67 2290 2100 2117 1431 1240 1229 1972 360 1057 2444 1674 1815 134 2262 1954 719 456 1324 2089 2365 1740 1887 21 1609 267 1172 2408 1417 221 1404 1623 196 1450 1139 1153 1515 2114 1987 481 656 1688 2092 1021 1263 1786 2064 1762 1252 268 2222 142 2315 2462 1838 2038 1844 1078 1769 181 769 1596 2399 82 514 1316 535 1535 1788 1244 506 768 1121 555 1801 2468 1947 2469 810 42 1288 1188 379 1587 1716 2321 65 649 2117 1431 1240 1229 1176 948 819 1341 2444 1674 1815 1213 1398 870 772 1913 1495 1097 517 1381 1887 21 1609 1248 1254 138 2035 643 1382 1307 175 678 1139 1153 1515 1819 711 617 656 1688 2092 1040 1149 2122 2064 1762 1252 451 2450 1559 2471 2188 102 2198 2349 136 717 2238 1710 1501 2429 1784 91 531 1253 380 34 1351 1656 1121 555 1801 2468 332 1703 1524 1234 1772 318 477 2006 563 67 2290 2100 2117 1431 1240 1229 2446 1277 1498 2392 1615 1446 2105 258 1829 927 296 1413 2235 2287 719 456 1324 2028 404 692 2244 322 2434 106 868 746 1417 221 1404 998 2276 2182 2114 1987 481 656 1688 2092 66 117 1166 1034 799 685 1358 1411 1976 958 964 1791 2315 2462 1838 1022 1152 2030 2168 2226 646 912 172 658 2014 2005 1058 1121 555 1801 2468 1947 2469 810 42 1772 318 477 2006 406 1754 1513 364 2117 1431 1240 1229 1176 948 819 1341 1615 1446 2105 258 2391 1708 1250 652 1413 2235 2287 982 87 2065 1097 517 1381 623 1072 179 106 868 746 2133 1088 981 1307 175 678 262 778 275 656 1688 2092 1040 1149 2122 1034 799 685 1557 1207 1725 958 964 1791 1370 663 31 2198 2349 136 2251 1628 2234 2356 2136 1993 2068 466 661 1185 1918 2278 1658 1270 2428 249 238 44 334 421 209 1373 1467 1561 1610 2409 280 1506 1953 554 478 1921 977 1434 378 2048 199 1062 1136 519 1994 1605 811 1329 1143 352 1526 874 1284 108 1537 788 1476 1465 144 744 1218 1578 2398 1835 2209 2020 2371 2177 303 937 2383 151 381 2166 449 1146 474 2474 2228 415 2364 1377 2116 1514 1464 2291 619 1867 163 9 2472 1340 1423 292 541 830 1968 274 2289 1003 2271 439 739 2091 146 238 44 334 421 1224 2363 155 1731 1610 2409 280 1506 1870 14 926 1014 977 1434 378 2048 332 1703 1524 1234 1994 1605 811 1329 1444 603 2051 1313 874 1284 108 1799 1205 2095 1379 423 1845 501 76 1412 1835 2209 2020 1425 349 737 2199 1438 1102 1408 533 1986 1146 474 2474 1076 718 1170 1377 2116 1514 833 936 182 1867 163 9 1625 1830 2101 800 2242 36 1038 97 523 1030 647 232 2214 158 1926 881 282 502 209 1373 1467 1561 1610 2409 280 1506 2220 83 2281 622 1747 2402 621 1159 199 1062 1136 519 1994 1605 811 1329 1214 411 1289 2202 2239 2024 1637 949 629 1622 900 1728 2341 931 1465 144 744 2022 50 1519 133 2430 2071 1094 2324 2118 937 2383 151 1648 1794 2432 2228 415 2364 1377 2116 1514 2368 1364 193 445 2405 2067 287 1955 1437 1301 538 978 292 541 830 409 1481 2145 17 1050 1365 2183 683 522 1809 115 1101 1610 2409 280 1506 1870 14 926 1014 1747 2402 621 1159 1399 1840 1848 72 1994 1605 811 1329 1444 603 2051 1313 2239 2024 1637 949 1698 1471 2040 1549 1728 2341 931 581 2148 712 501 76 1412 847 1527 938 1094 2324 2118 2297 344 832 1408 533 1986 286 1262 1701 1377 2116 1514 833 936 182 445 2405 2067 530 1755 431 1301 538 978 963 1912 1780 1038 97 523 805 1006 626 1186 1403 1621 1692 1345 954 410 1233 189 1953 554 478 1921 977 1434 378 2048 199 1062 1136 519 1994 1605 811 1329 1856 816 1455 1119 71 2237 1478 1427 1077 297 1483 2042 709 631 455 1011 1218 1578 2398 1835 2209 2020 2371 2177 303 937 2383 151 2307 195 2268 1310 229 215 2106 1320 953 821 1749 627 27 255 1906 1160 1296 1999 283 1070 2179 1142 2457 460 2045 429 1985 770 1973 1939 515 1634 1523 1876 1430 780 1003 2271 439 1853 2135 1043 1756 1046 1242 977 1434 378 2048 332 1703 1524 1234 1994 1605 811 1329 1444 603 2051 1313 71 2237 1478 1427 2446 1277 1498 2392 709 631 455 1011 924 1380 2072 395 1835 2209 2020 1425 349 737 2199 1438 1102 1408 533 1986 1310 229 215 363 503 613 2156 1048 680 827 704 128 1160 1296 1999 66 117 1166 1142 2457 460 851 1110 224 770 1973 1939 1282 2137 1269 383 1504 1958 1744 866 290 2214 158 1926 1453 489 1978 706 30 2477 199 1062 1136 519 1994 1605 811 1329 1214 411 1289 2202 2239 2024 1637 949 1077 297 1483 2042 709 631 455 1011 946 2084 234 1803 487 1636 551 288 133 2430 2071 1094 2324 2118 937 2383 151 1648 1794 2432 1633 145 1177 430 591 212 821 1749 627 979 2000 1276 283 1070 2179 1142 2457 460 731 1099 266 989 961 767 865 1782 1839 493 754 114 1876 1430 780 1873 1757 2353 2183 683 522 1841 786 205 2210 1272 2075 1994 1605 811 1329 1444 603 2051 1313 2239 2024 1637 949 1698 1471 2040 1549 709 631 455 1011 924 1380 2072 395 487 1636 551 288 852 482 1063 908 1094 2324 2118 2297 344 832 1408 533 1986 286 1262 1701 430 591 212 677 1923 1946 827 704 128 644 1209 837 1142 2457 460 851 1110 224 989 961 767 1920 1468 1583 493 754 114 2206 1171 2180 1744 866 290 2194 454 732 1692 1345 954 1956 1814 1765 1925 113 150 1224 2363 155 1731 1847 484 2215 1520 1870 14 926 1014 1271 553 1984 2057 332 1703 1524 1234 1772 318 477 2006 1444 603 2051 1313 2141 2327 2285 124 1799 1205 2095 1190 1208 897 75 2467 270 2018 1709 1265 1425 349 737 2345 1260 2115 2028 404 692 944 980 1294 1076 718 1170 1952 2207 1135 833 936 182 1727 2461 1197 1625 1830 2101 346 1098 233 1219 1704 1137 1687 728 127 1317 1361 46 620 1385 507 2104 2264 725 1847 484 2215 1520 1957 939 2144 12 1271 553 1984 2057 689 630 1530 1529 1772 318 477 2006 406 1754 1513 364 2141 2327 2285 124 1264 594 1287 186 1190 1208 897 1898 1566 905 1960 1581 1563 1500 2178 2229 2345 1260 2115 690 2270 560 623 1072 179 1044 918 1522 1952 2207 1135 10 2039 1118 1727 2461 1197 913 2412 1407 346 1098 233 480 104 1943 301 1180 556 1193 2152 2187 1676 1251 1885 40 887 2411 307 1025 540 1870 14 926 1014 1271 553 1984 2057 1399 1840 1848 72 688 213 790 2395 1444 603 2051 1313 2141 2327 2285 124 1698 1471 2040 1549 1818 684 99 1147 581 2148 712 1971 121 1585 2018 1709 1265 1629 1528 1334 2297 344 832 2049 1386 699 944 980 1294 2090 1539 2304 833 936 182 1727 2461 1197 530 1755 431 397 605 1414 963 1912 1780 0 1281 1346 1687 728 127 299 1777 526 2151 125 1718 394 174 385 2415 1611 910 1271 553 1984 2057 689 630 1530 1529 688 213 790 2395 1556 645 1874 544 2141 2327 2285 124 1264 594 1287 186 1818 684 99 1147 2384 1164 803 575 1971 121 1585 494 1879 1268 1500 2178 2229 1204 1518 2258 2049 1386 699 2012 2420 1897 1044 918 1522 462 782 2147 1727 2461 1197 913 2412 1407 397 605 1414 748 933 1109 0 1281 1346 616 1415 2139 1193 2152 2187 1145 1175 1600 2143 997 95 1517 856 2435 1975 491 2044 332 1703 1524 1234 1772 318 477 2006 1444 603 2051 1313 2141 2327 2285 124 2446 1277 1498 2392 1615 1446 2105 258 924 1380 2072 395 2052 250 60 1445 1425 349 737 2345 1260 2115 2028 404 692 944 980 1294 363 503 613 479 894 337 998 2276 2182 2160 1643 2259 66 117 1166 1034 799 685 851 1110 224 1157 1783 1106 1282 2137 1269 564 993 1670 1022 1152 2030 201 845 1116 620 1385 507 1173 1165 1352 2088 159 2406 1772 318 477 2006 406 1754 1513 364 2141 2327 2285 124 1264 594 1287 186 1615 1446 2105 258 2391 1708 1250 652 2052 250 60 1445 1693 32 2299 707 2345 1260 2115 690 2270 560 623 1072 179 1044 918 1522 479 894 337 2019 1239 921 262 778 275 1199 354 595 1034 799 685 1557 1207 1725 1157 1783 1106 1842 54 1732 564 993 1670 1037 170 2232 2251 1628 2234 1330 1569 957 40 887 2411 1356 885 1789 1005 727 1114 1444 603 2051 1313 2141 2327 2285 124 1698 1471 2040 1549 1818 684 99 1147 924 1380 2072 395 2052 250 60 1445 852 482 1063 908 934 2212 1087 356 2297 344 832 2049 1386 699 944 980 1294 2090 1539 2304 677 1923 1946 511 990 1790 2160 1643 2259 992 640 2282 851 1110 224 1157 1783 1106 1920 1468 1583 1655 557 611 2206 1171 2180 1907 2011 1797 201 845 1116 1452 1315 2350 394 174 385 1181 528 1051 965 64 2126 2141 2327 2285 124 1264 594 1287 186 1818 684 99 1147 2384 1164 803 575 2052 250 60 1445 1693 32 2299 707 934 2212 1087 356 355 1538 2443 1283 2049 1386 699 2012 2420 1897 1044 918 1522 462 782 2147 511 990 1790 1722 855 2275 1199 354 595 1977 2173 147 1157 1783 1106 1842 54 1732 1655 557 611 1053 708 1593 1907 2011 1797 1816 230 1359 1330 1569 957 1691 1245 971 1517 856 2435 1129 1369 2256 166 1663 468 3 0 1 0 4294967295 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 64 0 0 219 308 397 486 575 664 753 842 931 1020 1109 1198 1287 1376 1465 1554 1643 1732 1821 1910 1999 2088 2177 2266 2355 2444 2533 2622 2711 2800 2889 2978 3067 3156 3245 3334 3423 3512 3601 3690 3779 3868 3957 4046 4135 4224 4313 4402 4491 4580 4669 4758 4847 4936 5025 5114 5203 5292 5381 5470 5559 5648 5737 0 0 3 0 1 0 0 8 0 0 0 0 0 0 0 0 0 64 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 0 65535 8 0 65535 65535 65535 65535 65535 65535 65535 65535 64 0 0 1 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 4 126 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 91 92 93 94 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 125 126 127 128 129 130 131 132 367 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 113 114 115 116 117 118 119 120 121 122 123 124 125 126 128 129 131 132 133 134 135 136 137 138 139 140 141 142 143 144 146 147 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 303 304 306 307 309 283 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 233 234 235 236 238 239 240 241 243 0 0 0 0 4 132 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 309 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 246 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 2478 2478 0 0 0 0 1 0 0 0 0 2478 0 1 2478 0 1 0 2478 0 0 1 0 1 0 0 2478 0 1 2478 0 0 0 0 0 73 23 Policy::Sequential<3,3>
DEAL::OK
-DEAL::0 0 23 0 1 5 11 18446744073709551615 0 10 0 18446744073709551615 0 12 15 18446744073709551615 0 2 9 1 2 9 18446744073709551615 0 3 8 18446744073709551615 5 0 0 4 8 12 19 0 0 16 16 0 0 0 0 1 0 0 0 0 16 0 1 16 0 1 0 16 0 0 1 0 1 0 0 16 0 1 16 0 0 0 0 0 3 0 0 10 1 0
-0 1 0 0 1 0 4294967295 0 0 0 0 1 0 4294967295 1 0 65535 10
-1 2 0 0 0 2 0 4294967295 4294967295 0 0 0 0 2 0 4294967295 4294967295 2 0 65535 65535 10
-2 4 0 1 65535 65535 65535 4 0 0 7 12 17 22 0 5 11 2 9 14 13 4 2 9 12 15 6 12 15 3 8 7 3 8 10 0 1 6 0 14 13 4 6 7 1 4 0 0 3 4 5 4 0 0 1 65535 65535 1 7 23 Policy::Sequential<1,1>
+DEAL::0 0 0 0 3 0 0 0 2 12 0 5 11 10 0 12 15 2 9 2 9 3 8 0 0 2 0 0 0 0 2 0 0 6 0 14 13 4 6 7 1 0 0 3 0 0 0 2 7 0 0 2 4 6 8 10 12 1 0 4294967295 2 0 0 2 0 4294967295 4294967295 2 0 0 4 0 0 3 4 5 0 0 3 0 0 0 0 0 22 0 5 11 2 9 14 13 4 2 9 12 15 6 12 15 3 8 7 3 8 10 0 1 0 0 3 0 1 0 4294967295 2 0 4294967295 4294967295 4 0 0 7 12 17 0 0 3 0 1 0 0 2 0 0 0 4 0 1 0 0 0 3 0 1 0 65535 2 0 65535 65535 4 0 0 1 65535 65535 2 6 0 0 1 2 3 5 6 0 0 0 0 2 6 0 1 0 0 0 1 0 0 0 0 0 16 16 0 0 0 0 1 0 0 0 0 16 0 1 16 0 1 0 16 0 0 1 0 1 0 0 16 0 1 16 0 0 0 0 0 7 23 Policy::Sequential<1,1>
-DEAL::0 0 137 0 1 104 43 197 18446744073709551615 0 118 165 185 18446744073709551615 0 128 123 37 18446744073709551615 0 150 177 8 18446744073709551615 0 81 147 178 18446744073709551615 0 39 76 72 18446744073709551615 0 141 79 98 18446744073709551615 0 157 56 38 18446744073709551615 0 182 77 159 18446744073709551615 0 201 49 209 1 201 49 209 18446744073709551615 0 68 35 17 18446744073709551615 0 14 130 161 1 14 130 161 18446744073709551615 0 80 208 164 18446744073709551615 0 176 5 122 18446744073709551615 0 74 190 21 18446744073709551615 0 54 169 28 18446744073709551615 0 25 186 132 18446744073709551615 0 93 92 61 18446744073709551615 0 126 139 198 18446744073709551615 0 18 11 95 18446744073709551615 0 193 13 9 18446744073709551615 0 78 155 53 1 78 155 53 18446744073709551615 0 60 31 112 18446744073709551615 0 173 175 45 18446744073709551615 0 59 96 166 18446744073709551615 25 0 0 5 10 15 20 25 30 35 40 45 54 59 68 73 78 83 88 93 98 103 108 113 122 127 132 0 0 210 210 0 0 0 0 1 0 0 0 0 210 0 1 210 0 1 0 210 0 0 1 0 1 0 0 210 0 1 210 0 0 0 0 0 3 0 0 10 1 0
-0 1 0 0 1 0 4294967295 0 0 0 0 1 0 4294967295 1 0 65535 10
-1 4 0 0 0 0 0 4 0 4294967295 4294967295 4294967295 4294967295 0 0 0 0 4 0 4294967295 4294967295 4294967295 4294967295 4 0 65535 65535 65535 65535 10
-2 16 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 41 63 85 107 129 151 173 195 217 239 261 283 305 327 349 371 0 104 43 197 201 49 209 14 130 161 78 155 53 88 86 2 69 12 15 183 82 162 7 181 33 1 89 107 135 19 137 134 16 36 191 24 119 41 101 192 153 138 201 49 209 81 147 178 78 155 53 93 92 61 146 91 94 22 144 171 110 73 51 151 14 130 161 78 155 53 39 76 72 18 11 95 125 205 184 3 199 174 117 108 58 102 78 155 53 93 92 61 18 11 95 182 77 159 184 3 196 194 110 73 200 63 20 100 81 147 178 68 35 17 93 92 61 60 31 112 94 22 67 204 6 121 195 10 30 180 68 35 17 118 165 185 60 31 112 176 5 122 67 204 179 70 136 97 66 84 103 207 93 92 61 60 31 112 182 77 159 193 13 9 196 194 27 140 195 10 129 71 172 170 60 31 112 176 5 122 193 13 9 141 79 98 27 140 23 168 66 84 116 26 131 44 39 76 72 18 11 95 80 208 164 173 175 45 55 65 163 64 117 108 152 149 85 142 18 11 95 182 77 159 173 175 45 126 139 198 163 64 46 187 200 63 143 120 156 83 80 208 164 173 175 45 128 123 37 54 169 28 87 160 99 4 152 149 29 203 32 111 173 175 45 126 139 198 54 169 28 157 56 38 99 4 158 115 143 120 145 48 105 154 182 77 159 193 13 9 126 139 198 59 96 166 46 187 189 206 129 71 124 40 109 133 193 13 9 141 79 98 59 96 166 74 190 21 189 206 62 47 116 26 202 34 114 75 126 139 198 59 96 166 157 56 38 25 186 132 158 115 167 106 124 40 148 0 188 57 59 96 166 74 190 21 25 186 132 150 177 8 167 106 127 50 202 34 90 113 52 42 39 0 36 191 24 119 41 101 192 153 138 51 151 58 102 20 100 30 180 103 207 172 170 131 44 85 142 156 83 32 111 105 154 109 133 114 75 188 57 52 42 16 0 0 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 16 0 0 1 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 0 0 0 13 1 0
-3 0 0 178 0 1 88 86 2 69 12 18446744073709551615 0 146 91 1 15 183 82 162 7 18446744073709551615 1 181 33 1 89 107 18446744073709551615 0 199 174 1 135 19 137 134 16 18446744073709551615 0 94 22 18446744073709551615 0 144 171 18446744073709551615 0 110 73 18446744073709551615 0 125 205 18446744073709551615 0 184 3 18446744073709551615 0 117 108 18446744073709551615 0 196 194 18446744073709551615 0 200 63 18446744073709551615 0 67 204 18446744073709551615 0 6 121 18446744073709551615 0 195 10 18446744073709551615 0 179 70 18446744073709551615 0 136 97 18446744073709551615 0 66 84 18446744073709551615 0 27 140 18446744073709551615 0 129 71 18446744073709551615 0 23 168 18446744073709551615 0 116 26 18446744073709551615 0 55 65 18446744073709551615 0 163 64 18446744073709551615 0 152 149 18446744073709551615 0 46 187 18446744073709551615 0 143 120 18446744073709551615 0 87 160 18446744073709551615 0 99 4 18446744073709551615 0 29 203 18446744073709551615 0 158 115 18446744073709551615 0 145 48 18446744073709551615 0 189 206 18446744073709551615 0 124 40 18446744073709551615 0 62 47 18446744073709551615 0 202 34 18446744073709551615 0 167 106 18446744073709551615 0 148 0 18446744073709551615 0 127 50 18446744073709551615 0 90 113 18446744073709551615 56 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 17 38 70 82 0 46 106 126 78 98 154 170 134 142 166 174 34 58 118 138 54 62 94 102 7 50 24 42 66 90 74 86 110 130 114 122 146 162 150 158 21 23 Policy::Sequential<2,2>
+DEAL::0 0 0 0 3 0 0 0 3 84 0 104 43 197 118 165 185 128 123 37 150 177 8 81 147 178 39 76 72 141 79 98 157 56 38 182 77 159 201 49 209 201 49 209 68 35 17 14 130 161 14 130 161 80 208 164 176 5 122 74 190 21 54 169 28 25 186 132 93 92 61 126 139 198 18 11 95 193 13 9 78 155 53 78 155 53 60 31 112 173 175 45 59 96 166 106 0 181 33 1 89 107 144 171 6 121 136 97 88 86 2 69 12 125 205 55 65 87 160 179 70 23 168 62 47 127 50 29 203 145 48 148 0 90 113 94 22 196 194 46 187 158 115 117 108 200 63 129 71 116 26 146 91 15 183 82 162 7 184 3 199 174 135 19 137 134 16 110 73 67 204 27 140 195 10 66 84 163 64 99 4 152 149 143 120 189 206 167 106 124 40 202 34 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 0 0 3 0 0 0 0 0 0 3 0 0 0 0 39 0 36 191 24 119 41 101 192 153 138 51 151 58 102 20 100 30 180 103 207 172 170 131 44 85 142 156 83 32 111 105 154 109 133 114 75 188 57 52 42 0 0 3 0 0 0 3 29 0 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 45 0 0 5 7 9 11 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 61 63 65 70 72 74 76 78 80 82 84 86 88 90 92 94 96 101 123 1 0 4294967295 3 0 0 0 0 4 0 4294967295 4294967295 4294967295 4294967295 3 0 0 0 0 16 0 0 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 0 0 3 0 0 0 0 0 371 0 104 43 197 201 49 209 14 130 161 78 155 53 88 86 2 69 12 15 183 82 162 7 181 33 1 89 107 135 19 137 134 16 36 191 24 119 41 101 192 153 138 201 49 209 81 147 178 78 155 53 93 92 61 146 91 94 22 144 171 110 73 51 151 14 130 161 78 155 53 39 76 72 18 11 95 125 205 184 3 199 174 117 108 58 102 78 155 53 93 92 61 18 11 95 182 77 159 184 3 196 194 110 73 200 63 20 100 81 147 178 68 35 17 93 92 61 60 31 112 94 22 67 204 6 121 195 10 30 180 68 35 17 118 165 185 60 31 112 176 5 122 67 204 179 70 136 97 66 84 103 207 93 92 61 60 31 112 182 77 159 193 13 9 196 194 27 140 195 10 129 71 172 170 60 31 112 176 5 122 193 13 9 141 79 98 27 140 23 168 66 84 116 26 131 44 39 76 72 18 11 95 80 208 164 173 175 45 55 65 163 64 117 108 152 149 85 142 18 11 95 182 77 159 173 175 45 126 139 198 163 64 46 187 200 63 143 120 156 83 80 208 164 173 175 45 128 123 37 54 169 28 87 160 99 4 152 149 29 203 32 111 173 175 45 126 139 198 54 169 28 157 56 38 99 4 158 115 143 120 145 48 105 154 182 77 159 193 13 9 126 139 198 59 96 166 46 187 189 206 129 71 124 40 109 133 193 13 9 141 79 98 59 96 166 74 190 21 189 206 62 47 116 26 202 34 114 75 126 139 198 59 96 166 157 56 38 25 186 132 158 115 167 106 124 40 148 0 188 57 59 96 166 74 190 21 25 186 132 150 177 8 167 106 127 50 202 34 90 113 52 42 0 0 3 0 1 0 4294967295 4 0 4294967295 4294967295 4294967295 4294967295 16 0 0 41 63 85 107 129 151 173 195 217 239 261 283 305 327 349 0 0 3 0 1 0 0 4 0 0 0 0 0 16 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 0 65535 4 0 65535 65535 65535 65535 16 0 0 1 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 3 26 0 0 1 2 3 4 5 6 7 8 9 11 12 14 15 16 17 18 19 20 21 22 23 25 26 27 28 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 0 0 0 0 3 28 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 44 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 210 210 0 0 0 0 1 0 0 0 0 210 0 1 210 0 1 0 210 0 0 1 0 1 0 0 210 0 1 210 0 0 0 0 0 21 23 Policy::Sequential<2,2>
-DEAL::0 0 785 0 1 1217 903 1574 88 18446744073709551615 0 1892 610 1929 1981 18446744073709551615 0 635 2463 1457 2441 18446744073709551615 0 741 89 1683 1590 18446744073709551615 0 1979 1983 1652 222 18446744073709551615 0 1716 2321 65 649 18446744073709551615 0 946 2084 234 1803 18446744073709551615 0 355 1538 2443 1283 18446744073709551615 0 167 668 916 1477 18446744073709551615 0 1484 1292 2015 143 18446744073709551615 0 892 1893 336 311 18446744073709551615 0 1075 2149 180 1018 18446744073709551615 0 1859 2320 1047 1054 18446744073709551615 0 987 1060 265 325 18446744073709551615 0 2220 83 2281 622 18446744073709551615 0 1556 645 1874 544 18446744073709551615 0 1064 516 2422 1470 18446744073709551615 0 1856 816 1455 1119 18446744073709551615 0 2391 1708 1250 652 18446744073709551615 0 852 482 1063 908 18446744073709551615 0 2062 1717 789 705 18446744073709551615 0 1604 2033 1485 756 18446744073709551615 0 1658 1270 2428 249 18446744073709551615 0 1957 939 2144 12 18446744073709551615 0 1399 1840 1848 72 18446744073709551615 0 2446 1277 1498 2392 18446744073709551615 0 1224 2363 155 1731 18446744073709551615 0 1347 247 1466 584 1 1347 247 1466 584 18446744073709551615 0 2032 608 970 1448 18446744073709551615 0 1231 1821 599 565 1 1231 1821 599 565 18446744073709551615 0 1995 2094 1673 2161 18446744073709551615 0 1671 200 1594 1996 1 1671 200 1594 1996 18446744073709551615 0 1144 1032 1449 226 18446744073709551615 0 1460 2447 972 1293 18446744073709551615 0 1002 546 1974 376 18446744073709551615 0 1934 2330 1085 2155 18446744073709551615 0 1788 1244 506 768 18446744073709551615 0 2283 2208 1211 841 18446744073709551615 0 1107 2252 671 942 18446744073709551615 0 1781 1542 105 862 18446744073709551615 0 1214 411 1289 2202 18446744073709551615 0 1969 1502 141 2466 18446744073709551615 0 2384 1164 803 575 18446744073709551615 0 2219 413 2070 1541 18446744073709551615 0 1288 1188 379 1587 18446744073709551615 0 1572 1278 2165 2334 18446744073709551615 0 1077 297 1483 2042 18446744073709551615 0 1176 948 819 1341 18446744073709551615 0 1693 32 2299 707 18446744073709551615 0 487 1636 551 288 18446744073709551615 0 934 2212 1087 356 18446744073709551615 0 628 2263 2352 1420 18446744073709551615 0 422 600 353 2043 18446744073709551615 0 1603 552 161 2076 18446744073709551615 0 1131 1355 639 8 18446744073709551615 0 1592 2433 1598 896 18446744073709551615 0 1619 206 836 567 18446744073709551615 0 2309 589 1090 757 18446744073709551615 0 1970 2036 2322 317 18446744073709551615 0 1210 2274 2455 597 18446744073709551615 0 1953 554 478 1921 18446744073709551615 0 2243 443 1389 1472 18446744073709551615 0 209 1373 1467 1561 18446744073709551615 0 184 308 1243 1813 18446744073709551615 0 406 1754 1513 364 18446744073709551615 0 103 1935 1194 1661 18446744073709551615 0 689 630 1530 1529 18446744073709551615 0 1747 2402 621 1159 18446744073709551615 0 688 213 790 2395 18446744073709551615 0 2390 96 323 242 18446744073709551615 0 1698 1471 2040 1549 18446744073709551615 0 563 67 2290 2100 18446744073709551615 0 924 1380 2072 395 18446744073709551615 0 71 2237 1478 1427 18446744073709551615 0 1615 1446 2105 258 18446744073709551615 0 332 1703 1524 1234 18446744073709551615 0 1026 2176 1776 251 18446744073709551615 0 1847 484 2215 1520 18446744073709551615 0 238 44 334 421 18446744073709551615 0 1870 14 926 1014 18446744073709551615 0 130 765 1115 2272 18446744073709551615 0 1924 2360 869 24 1 1924 2360 869 24 18446744073709551615 0 580 39 2254 1846 18446744073709551615 0 386 231 1428 2310 18446744073709551615 0 514 1316 535 1535 18446744073709551615 0 1908 476 1028 1579 1 1908 476 1028 1579 18446744073709551615 0 2081 2379 602 444 18446744073709551615 0 2277 1508 520 1890 18446744073709551615 0 787 1069 192 2296 18446744073709551615 0 2121 1911 1825 390 1 2121 1911 1825 390 18446744073709551615 0 1304 2295 1348 116 18446744073709551615 0 129 2418 1612 2157 18446744073709551615 0 199 1062 1136 519 18446744073709551615 0 264 898 1372 2050 18446744073709551615 0 1454 867 80 469 18446744073709551615 0 1947 2469 810 42 18446744073709551615 0 1264 594 1287 186 18446744073709551615 0 294 2189 1128 1884 18446744073709551615 0 2239 2024 1637 949 18446744073709551615 0 2325 1695 593 561 18446744073709551615 0 1818 684 99 1147 18446744073709551615 0 762 2343 1689 1503 18446744073709551615 0 2117 1431 1240 1229 18446744073709551615 0 709 631 455 1011 18446744073709551615 0 2052 250 60 1445 18446744073709551615 0 1271 553 1984 2057 18446744073709551615 0 1610 2409 280 1506 18446744073709551615 0 2440 37 2312 2372 18446744073709551615 0 991 854 872 694 18446744073709551615 0 1772 318 477 2006 18446744073709551615 0 1626 1964 2344 935 18446744073709551615 0 977 1434 378 2048 18446744073709551615 0 25 131 1308 1806 18446744073709551615 0 1444 603 2051 1313 18446744073709551615 0 380 34 1351 1656 18446744073709551615 0 273 2016 1916 1880 18446744073709551615 0 402 1714 763 2245 18446744073709551615 0 1928 140 1737 702 1 1928 140 1737 702 18446744073709551615 0 217 1286 126 1001 18446744073709551615 0 2380 1706 545 547 18446744073709551615 0 1092 1735 2401 1223 18446744073709551615 0 2023 882 1397 835 18446744073709551615 0 1121 555 1801 2468 18446744073709551615 0 1994 1605 811 1329 18446744073709551615 0 2141 2327 2285 124 18446744073709551615 125 0 0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 126 132 138 144 150 156 162 173 179 190 196 207 213 219 225 231 237 243 249 255 261 267 273 279 285 291 297 303 309 315 321 327 333 339 345 351 357 363 369 375 381 387 393 399 405 411 417 423 429 435 441 447 453 459 465 471 477 483 489 495 501 512 518 524 530 541 547 553 559 570 576 582 588 594 600 606 612 618 624 630 636 642 648 654 660 666 672 678 684 690 696 702 708 714 720 726 732 743 749 755 761 767 773 779 0 0 2478 2478 0 0 0 0 1 0 0 0 0 2478 0 1 2478 0 1 0 2478 0 0 1 0 1 0 0 2478 0 1 2478 0 0 0 0 0 3 0 0 10 1 0
-0 1 0 0 1 0 4294967295 0 0 0 0 1 0 4294967295 1 0 65535 10
-1 8 0 0 0 0 0 0 0 0 0 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 0 0 0 0 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 8 0 65535 65535 65535 65535 65535 65535 65535 65535 10
-2 64 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 0 0 219 308 397 486 575 664 753 842 931 1020 1109 1198 1287 1376 1465 1554 1643 1732 1821 1910 1999 2088 2177 2266 2355 2444 2533 2622 2711 2800 2889 2978 3067 3156 3245 3334 3423 3512 3601 3690 3779 3868 3957 4046 4135 4224 4313 4402 4491 4580 4669 4758 4847 4936 5025 5114 5203 5292 5381 5470 5559 5648 5737 5826 0 1217 903 1574 88 1347 247 1466 584 1231 1821 599 565 1908 476 1028 1579 1671 200 1594 1996 1924 2360 869 24 2121 1911 1825 390 1928 140 1737 702 86 347 1134 424 1990 2346 1666 994 7 1743 2280 1543 1668 791 2132 1491 339 2205 291 721 191 968 119 815 101 1766 1256 329 919 1942 1808 1400 1988 271 2107 1941 2034 1285 1383 607 2063 1863 2431 22 1089 2436 2017 225 529 637 1068 1305 817 846 848 879 18 2266 2093 1291 1719 2410 1039 988 371 996 1919 1384 1966 537 1545 2355 1409 310 518 1487 341 1591 447 1120 1418 1510 1363 1290 2127 2120 751 715 2066 1511 2213 724 1567 165 1178 2255 285 122 2413 860 1249 1878 2154 500 976 1035 1343 641 2373 2416 1406 1200 2465 2110 497 1997 1140 1904 1266 1525 2279 284 1965 713 797 1680 849 1416 1642 2124 1368 1940 1748 441 1787 1497 2103 1595 1647 1694 1439 240 187 1059 340 156 298 570 1630 1675 1774 634 536 548 776 1297 1741 1187 1083 1321 219 1577 56 1667 2216 387 1112 252 1212 1761 532 382 1679 1607 945 2175 1167 109 2097 590 190 1828 1895 740 1770 1910 1753 1347 247 1466 584 167 668 916 1477 1908 476 1028 1579 1592 2433 1598 896 1924 2360 869 24 1603 552 161 2076 1928 140 1737 702 402 1714 763 2245 2253 1864 1198 1739 2129 1354 499 973 2459 1861 1169 243 375 1759 223 1350 2200 281 2241 818 2382 2046 43 1303 300 795 2340 1763 673 2476 941 369 1451 1441 1100 162 401 651 1896 1944 1456 932 1093 1007 1299 1279 886 1004 2128 947 655 1654 2195 1339 1331 914 743 1231 1821 599 565 1908 476 1028 1579 1484 1292 2015 143 2309 589 1090 757 2121 1911 1825 390 1928 140 1737 702 1210 2274 2455 597 25 131 1308 1806 2400 154 889 2218 2448 2308 194 1901 1000 239 1479 2293 802 929 1949 1705 974 1009 636 1882 2348 2338 418 450 203 2389 214 941 369 1451 2393 1899 730 579 304 825 793 1236 1651 660 1646 1616 1096 653 396 1767 2 899 513 1937 1228 576 1638 573 543 94 843 1908 476 1028 1579 1592 2433 1598 896 2309 589 1090 757 1604 2033 1485 756 1928 140 1737 702 402 1714 763 2245 25 131 1308 1806 1026 2176 1776 251 2218 2448 2308 736 400 1216 1861 1169 243 1309 2332 486 1705 974 1009 2021 2451 1554 2046 43 1303 1179 1081 1056 941 369 1451 1441 1100 162 579 304 825 1785 1657 807 660 1646 1616 1690 1045 302 1279 886 1004 426 1773 842 2125 700 1202 798 1066 857 549 169 2233 1671 200 1594 1996 1924 2360 869 24 2121 1911 1825 390 1928 140 1737 702 892 1893 336 311 628 2263 2352 1420 2243 443 1389 1472 991 854 872 694 1540 362 1387 375 1759 223 909 527 1041 636 1882 2348 1073 228 2314 906 826 185 35 1868 2374 1052 917 427 2249 1103 1570 412 925 432 259 1392 1475 2074 753 1775 861 68 1509 1963 2007 1877 2336 188 1707 2250 2041 2417 435 642 11 1499 2123 1391 1684 1805 139 1924 2360 869 24 1603 552 161 2076 1928 140 1737 702 402 1714 763 2245 628 2263 2352 1420 2062 1717 789 705 991 854 872 694 130 765 1115 2272 375 1759 223 1350 2200 281 2241 818 2382 2046 43 1303 906 826 185 2087 2267 2193 1318 1462 525 93 2146 1123 412 925 432 1095 59 1458 2074 753 1775 2426 1017 1405 1963 2007 1877 1682 1685 171 703 312 2162 149 457 2221 1654 2195 1339 1220 1507 1936 2196 615 1959 2121 1911 1825 390 1928 140 1737 702 1210 2274 2455 597 25 131 1308 1806 2243 443 1389 1472 991 854 872 694 1658 1270 2428 249 238 44 334 421 802 929 1949 1705 974 1009 636 1882 2348 2338 418 450 839 1548 569 1174 388 2083 1052 917 427 1537 788 1476 259 1392 1475 2074 753 1775 955 1126 1534 2153 183 2231 1326 606 1613 496 752 1834 2250 2041 2417 367 1338 218 576 1638 573 1432 1360 823 2037 1865 2058 1928 140 1737 702 402 1714 763 2245 25 131 1308 1806 1026 2176 1776 251 991 854 872 694 130 765 1115 2272 238 44 334 421 1224 2363 155 1731 1705 974 1009 2021 2451 1554 2046 43 1303 1179 1081 1056 1174 388 2083 289 1482 57 93 2146 1123 1379 423 1845 2074 753 1775 2426 1017 1405 2153 183 2231 210 2008 1122 496 752 1834 1696 1337 1108 149 457 2221 2108 1771 1932 798 1066 857 1795 809 2439 773 1067 542 167 668 916 1477 2032 608 970 1448 1592 2433 1598 896 2081 2379 602 444 1603 552 161 2076 386 231 1428 2310 402 1714 763 2245 217 1286 126 1001 1739 2129 1354 1488 1836 377 1319 1227 871 1191 902 1195 1350 2200 281 2378 152 654 829 1161 2223 682 1850 319 1763 673 2476 178 893 2386 1441 1100 162 808 320 1440 1944 1456 932 508 625 1588 351 794 999 2150 1366 566 1275 1843 1246 1565 100 1576 2236 1568 1900 2032 608 970 1448 1892 610 1929 1981 2081 2379 602 444 1460 2447 972 1293 386 231 1428 2310 1934 2330 1085 2155 217 1286 126 1001 264 898 1372 2050 1488 1836 377 1831 321 372 330 1664 1760 2026 1323 1746 2378 152 654 1393 1019 1162 2140 1015 2445 667 1672 1049 178 893 2386 120 598 1023 808 320 1440 1544 2361 1851 508 625 1588 1644 1084 1980 2054 370 2385 61 930 1203 45 624 467 2197 1715 1677 442 578 1459 1592 2433 1598 896 2081 2379 602 444 1604 2033 1485 756 1970 2036 2322 317 402 1714 763 2245 217 1286 126 1001 1026 2176 1776 251 1626 1964 2344 935 736 400 1216 1930 198 366 1191 902 1195 1823 891 16 2021 2451 1554 315 986 408 682 1850 319 510 911 1424 1441 1100 162 808 320 1440 1785 1657 807 1516 2261 1375 1690 1045 302 2396 2342 1894 2150 1366 566 676 2003 327 483 2055 696 305 1807 915 168 1086 1608 2081 2379 602 444 1460 2447 972 1293 1970 2036 2322 317 1075 2149 180 1018 217 1286 126 1001 264 898 1372 2050 1626 1964 2344 935 184 308 1243 1813 1930 198 366 53 1817 1130 2026 1323 1746 111 1697 1267 315 986 408 211 670 1745 667 1672 1049 1061 1723 1027 808 320 1440 1544 2361 1851 1516 2261 1375 920 314 208 2396 2342 1894 582 1274 1168 61 930 1203 1221 2323 2025 6 966 1333 1010 1447 749 2185 771 985 1603 552 161 2076 386 231 1428 2310 402 1714 763 2245 217 1286 126 1001 2062 1717 789 705 422 600 353 2043 130 765 1115 2272 2440 37 2312 2372 1350 2200 281 2378 152 654 829 1161 2223 682 1850 319 2087 2267 2193 2265 2347 2331 1933 2460 2181 1564 148 1353 1095 59 1458 1992 464 2013 2426 1017 1405 1280 1849 562 1682 1685 171 1401 338 202 806 1922 1857 436 2059 2305 1565 100 1576 1586 132 2073 738 1082 374 386 231 1428 2310 1934 2330 1085 2155 217 1286 126 1001 264 898 1372 2050 422 600 353 2043 1859 2320 1047 1054 2440 37 2312 2372 103 1935 1194 1661 2378 152 654 1393 1019 1162 2140 1015 2445 667 1672 1049 2265 2347 2331 648 1189 2456 15 2414 2452 2449 585 405 1992 464 2013 863 1551 1531 1280 1849 562 98 448 824 1401 338 202 618 813 485 1091 1469 901 1768 2375 995 2197 1715 1677 1860 1247 632 759 1711 574 402 1714 763 2245 217 1286 126 1001 1026 2176 1776 251 1626 1964 2344 935 130 765 1115 2272 2440 37 2312 2372 1224 2363 155 1731 1847 484 2215 1520 2021 2451 1554 315 986 408 682 1850 319 510 911 1424 289 1482 57 3 2357 2335 1564 148 1353 75 2467 270 2426 1017 1405 1280 1849 562 210 2008 1122 2056 73 1736 1696 1337 1108 2142 2407 236 436 2059 2305 1474 235 2453 305 1807 915 1335 669 1650 1875 389 70 217 1286 126 1001 264 898 1372 2050 1626 1964 2344 935 184 308 1243 1813 2440 37 2312 2372 103 1935 1194 1661 1847 484 2215 1520 1957 939 2144 12 315 986 408 211 670 1745 667 1672 1049 1061 1723 1027 3 2357 2335 5 84 248 2449 585 405 1960 1581 1563 1280 1849 562 98 448 824 2056 73 1736 844 1184 48 2142 2407 236 1042 2425 1891 1768 2375 995 2204 2397 764 1010 1447 749 1473 952 256 361 1124 437 1484 1292 2015 143 2309 589 1090 757 1995 2094 1673 2161 2277 1508 520 1890 1210 2274 2455 597 25 131 1308 1806 1304 2295 1348 116 2380 1706 545 547 1141 245 1395 204 2191 47 239 1479 2293 278 1758 723 888 960 2438 967 254 1255 2338 418 450 1241 52 2394 2393 1899 730 579 304 825 276 1778 850 2317 13 1182 453 1702 498 399 1751 2102 1767 2 899 2164 2192 1730 2130 781 1854 956 592 612 1558 2085 735 2309 589 1090 757 1604 2033 1485 756 2277 1508 520 1890 1619 206 836 567 25 131 1308 1806 1026 2176 1776 251 2380 1706 545 547 273 2016 1916 1880 204 2191 47 1013 417 659 1309 2332 486 1496 1573 1222 967 254 1255 1300 1322 1521 1179 1081 1056 604 571 1582 579 304 825 1785 1657 807 2317 13 1182 1660 279 1512 399 1751 2102 197 2339 1802 426 1773 842 1261 783 716 679 747 1837 316 313 1314 373 1639 1016 1995 2094 1673 2161 2277 1508 520 1890 635 2463 1457 2441 2283 2208 1211 841 1304 2295 1348 116 2380 1706 545 547 1781 1542 105 862 294 2189 1128 1884 2388 1125 1793 473 2060 1020 278 1758 723 1376 438 1989 775 1886 335 940 391 1927 1241 52 2394 1156 28 2454 276 1778 850 2317 13 1182 1552 164 2294 984 1536 227 1201 1132 883 1031 1822 1055 2164 2192 1730 890 1163 1374 295 1738 1547 358 2184 1915 261 85 1700 2277 1508 520 1890 1619 206 836 567 2283 2208 1211 841 987 1060 265 325 2380 1706 545 547 273 2016 1916 1880 294 2189 1128 1884 2390 96 323 242 473 2060 1020 1686 750 814 1496 1573 1222 884 878 2288 940 391 1927 137 1931 1764 604 571 1582 1938 1858 1494 2317 13 1182 1660 279 1512 984 1536 227 112 461 962 1031 1822 1055 2227 272 1659 1261 783 716 796 1820 1872 416 638 822 419 2377 687 943 1798 2366 1210 2274 2455 597 25 131 1308 1806 1304 2295 1348 116 2380 1706 545 547 1658 1270 2428 249 238 44 334 421 209 1373 1467 1561 1610 2409 280 1506 888 960 2438 967 254 1255 2338 418 450 1241 52 2394 1143 352 1526 874 1284 108 1537 788 1476 1465 144 744 955 1126 1534 2153 183 2231 1601 1606 1435 41 1632 2247 1550 2079 77 1962 1826 1150 367 1338 218 691 2326 2138 956 592 612 1968 274 2289 1235 1699 2080 25 131 1308 1806 1026 2176 1776 251 2380 1706 545 547 273 2016 1916 1880 238 44 334 421 1224 2363 155 1731 1610 2409 280 1506 1870 14 926 1014 967 254 1255 1300 1322 1521 1179 1081 1056 604 571 1582 874 1284 108 1799 1205 2095 1379 423 1845 501 76 1412 2153 183 2231 210 2008 1122 41 1632 2247 343 1390 534 1962 1826 1150 2113 19 1328 2108 1771 1932 414 2078 895 316 313 1314 1030 647 232 923 904 2159 1304 2295 1348 116 2380 1706 545 547 1781 1542 105 862 294 2189 1128 1884 209 1373 1467 1561 1610 2409 280 1506 2220 83 2281 622 1747 2402 621 1159 775 1886 335 940 391 1927 1241 52 2394 1156 28 2454 629 1622 900 1728 2341 931 1465 144 744 2022 50 1519 1601 1606 1435 41 1632 2247 2269 1721 2031 368 237 876 384 1602 742 1589 1575 26 691 2326 2138 558 1230 69 358 2184 1915 17 1050 1365 2403 1950 1371 2380 1706 545 547 273 2016 1916 1880 294 2189 1128 1884 2390 96 323 242 1610 2409 280 1506 1870 14 926 1014 1747 2402 621 1159 1399 1840 1848 72 940 391 1927 137 1931 1764 604 571 1582 1938 1858 1494 1728 2341 931 581 2148 712 501 76 1412 847 1527 938 41 1632 2247 343 1390 534 368 237 876 693 1029 74 1589 1575 26 951 1033 350 414 2078 895 2077 701 2169 419 2377 687 1186 1403 1621 277 1215 173 1604 2033 1485 756 1970 2036 2322 317 1619 206 836 567 787 1069 192 2296 1026 2176 1776 251 1626 1964 2344 935 273 2016 1916 1880 1092 1735 2401 1223 1013 417 659 1617 1154 459 1823 891 16 734 1113 2442 1300 1322 1521 614 1562 1580 510 911 1424 666 1869 257 1785 1657 807 1516 2261 1375 1660 279 1512 2358 23 1111 197 2339 1802 875 588 398 676 2003 327 425 465 1196 1394 1584 58 733 1259 509 1811 1074 1546 1970 2036 2322 317 1075 2149 180 1018 787 1069 192 2296 1002 546 1974 376 1626 1964 2344 935 184 308 1243 1813 1092 1735 2401 1223 1454 867 80 469 1617 1154 459 1237 1779 357 111 1697 1267 1442 2172 1998 614 1562 1580 1902 1833 2257 1061 1723 1027 309 504 2370 1516 2261 1375 920 314 208 2358 23 1111 1332 2001 1357 875 588 398 2167 1991 2171 1221 2323 2025 1903 1226 118 472 1945 1649 1914 1597 1640 107 1367 2329 1619 206 836 567 787 1069 192 2296 987 1060 265 325 1107 2252 671 942 273 2016 1916 1880 1092 1735 2401 1223 2390 96 323 242 2325 1695 593 561 1686 750 814 1889 1888 512 734 1113 2442 1426 2098 2061 137 1931 1764 1724 1238 1641 666 1869 257 2010 1104 820 1660 279 1512 2358 23 1111 112 461 962 2292 2298 1665 2227 272 1659 1917 2163 471 425 465 1196 90 1726 1117 1678 2047 2009 838 586 2131 695 1982 1713 787 1069 192 2296 1002 546 1974 376 1107 2252 671 942 741 89 1683 1590 1092 1735 2401 1223 1454 867 80 469 2325 1695 593 561 1969 1502 141 2466 1889 1888 512 2119 662 1325 1442 2172 1998 2376 568 123 1724 1238 1641 697 1461 2186 309 504 2370 1012 2328 539 2358 23 1111 1332 2001 1357 2292 2298 1665 572 1733 1493 1917 2163 471 2158 1909 559 1903 1226 118 157 1832 2096 761 2473 2086 664 1490 1734 160 1614 293 1026 2176 1776 251 1626 1964 2344 935 273 2016 1916 1880 1092 1735 2401 1223 1224 2363 155 1731 1847 484 2215 1520 1870 14 926 1014 1271 553 1984 2057 1300 1322 1521 614 1562 1580 510 911 1424 666 1869 257 1799 1205 2095 1190 1208 897 75 2467 270 2018 1709 1265 210 2008 1122 2056 73 1736 343 1390 534 524 1344 55 2113 19 1328 1306 1133 433 1474 235 2453 2302 1750 92 733 1259 509 1317 1361 46 1855 2316 420 1626 1964 2344 935 184 308 1243 1813 1092 1735 2401 1223 1454 867 80 469 1847 484 2215 1520 1957 939 2144 12 1271 553 1984 2057 689 630 1530 1529 614 1562 1580 1902 1833 2257 1061 1723 1027 309 504 2370 1190 1208 897 1898 1566 905 1960 1581 1563 1500 2178 2229 2056 73 1736 844 1184 48 524 1344 55 2082 1127 983 1306 1133 433 1298 1883 1312 2204 2397 764 601 263 2369 1914 1597 1640 1676 1251 1885 1662 858 1421 273 2016 1916 1880 1092 1735 2401 1223 2390 96 323 242 2325 1695 593 561 1870 14 926 1014 1271 553 1984 2057 1399 1840 1848 72 688 213 790 2395 137 1931 1764 1724 1238 1641 666 1869 257 2010 1104 820 581 2148 712 1971 121 1585 2018 1709 1265 1629 1528 1334 343 1390 534 524 1344 55 693 1029 74 674 596 779 951 1033 350 38 2421 110 2302 1750 92 492 1620 2303 838 586 2131 2151 125 1718 446 1881 2273 1092 1735 2401 1223 1454 867 80 469 2325 1695 593 561 1969 1502 141 2466 1271 553 1984 2057 689 630 1530 1529 688 213 790 2395 1556 645 1874 544 1724 1238 1641 697 1461 2186 309 504 2370 1012 2328 539 1971 121 1585 494 1879 1268 1500 2178 2229 1204 1518 2258 524 1344 55 2082 1127 983 674 596 779 784 2109 1071 38 2421 110 331 2333 1948 601 263 2369 1105 1396 324 664 1490 1734 2143 997 95 1 306 1311 892 1893 336 311 628 2263 2352 1420 2243 443 1389 1472 991 854 872 694 1144 1032 1449 226 580 39 2254 1846 129 2418 1612 2157 2023 882 1397 835 1073 228 2314 906 826 185 35 1868 2374 1052 917 427 1429 470 2300 1961 1410 1024 2367 333 2170 33 1302 1183 345 2053 587 63 2246 1800 2029 521 714 864 2112 2313 2286 729 2225 1505 710 241 681 1463 1206 253 2427 1158 1499 2123 1391 1599 922 1967 1402 859 2458 628 2263 2352 1420 2062 1717 789 705 991 854 872 694 130 765 1115 2272 580 39 2254 1846 1131 1355 639 8 2023 882 1397 835 380 34 1351 1656 906 826 185 2087 2267 2193 1318 1462 525 93 2146 1123 1961 1410 1024 1972 360 1057 1812 207 29 1295 2203 392 63 2246 1800 2240 2354 1419 864 2112 2313 1436 49 365 1505 710 241 1443 1378 1618 359 1480 176 2069 1080 458 1220 1507 1936 1792 216 1336 135 760 1810 2243 443 1389 1472 991 854 872 694 1658 1270 2428 249 238 44 334 421 129 2418 1612 2157 2023 882 1397 835 1953 554 478 1921 977 1434 378 2048 839 1548 569 1174 388 2083 1052 917 427 1537 788 1476 774 2190 2217 2359 2306 463 33 1302 1183 2371 2177 303 2029 521 714 864 2112 2313 381 2166 449 1146 474 2474 51 505 1624 609 969 1627 253 2427 1158 2472 1340 1423 1432 1360 823 975 220 1148 2437 877 650 991 854 872 694 130 765 1115 2272 238 44 334 421 1224 2363 155 1731 2023 882 1397 835 380 34 1351 1656 977 1434 378 2048 332 1703 1524 1234 1174 388 2083 289 1482 57 93 2146 1123 1379 423 1845 2359 2306 463 1829 927 296 1295 2203 392 2199 1438 1102 864 2112 2313 1436 49 365 1146 474 2474 1076 718 1170 609 969 1627 1232 1008 1327 2069 1080 458 800 2242 36 1795 809 2439 342 880 269 1155 1571 2419 1144 1032 1449 226 580 39 2254 1846 129 2418 1612 2157 2023 882 1397 835 1979 1983 1652 222 2219 413 2070 1541 1572 1278 2165 2334 762 2343 1689 1503 1429 470 2300 1961 1410 1024 2367 333 2170 33 1302 1183 583 1273 1560 452 2424 2423 1342 81 440 393 475 2301 1635 1433 801 20 2362 1804 177 1796 1645 2464 785 633 2111 1151 153 244 2004 246 831 726 873 1225 1192 665 1599 922 1967 1533 1486 328 672 698 1489 580 39 2254 1846 1131 1355 639 8 2023 882 1397 835 380 34 1351 1656 2219 413 2070 1541 1064 516 2422 1470 762 2343 1689 1503 563 67 2290 2100 1961 1410 1024 1972 360 1057 1812 207 29 1295 2203 392 452 2424 2423 2089 2365 1740 2099 1669 1824 1422 2248 2311 20 2362 1804 1623 196 1450 2464 785 633 2114 1987 481 244 2004 246 1021 1263 1786 2475 1720 62 348 2381 1905 1792 216 1336 2211 2027 777 2002 792 403 129 2418 1612 2157 2023 882 1397 835 1953 554 478 1921 977 1434 378 2048 1572 1278 2165 2334 762 2343 1689 1503 1856 816 1455 1119 71 2237 1478 1427 774 2190 2217 2359 2306 463 33 1302 1183 2371 2177 303 434 840 78 755 2201 804 393 475 2301 2106 1320 953 177 1796 1645 2464 785 633 27 255 1906 1160 1296 1999 928 79 812 407 2351 2319 1225 1192 665 515 1634 1523 975 220 1148 758 2174 2387 686 853 1742 2023 882 1397 835 380 34 1351 1656 977 1434 378 2048 332 1703 1524 1234 762 2343 1689 1503 563 67 2290 2100 71 2237 1478 1427 2446 1277 1498 2392 2359 2306 463 1829 927 296 1295 2203 392 2199 1438 1102 755 2201 804 2244 322 2434 1422 2248 2311 2156 1048 680 2464 785 633 2114 1987 481 1160 1296 1999 66 117 1166 407 2351 2319 1358 1411 1976 348 2381 1905 383 1504 1958 342 880 269 2337 1079 1681 1065 828 907 2062 1717 789 705 422 600 353 2043 130 765 1115 2272 2440 37 2312 2372 1131 1355 639 8 514 1316 535 1535 380 34 1351 1656 1121 555 1801 2468 2087 2267 2193 2265 2347 2331 1933 2460 2181 1564 148 1353 1972 360 1057 2444 1674 1815 134 2262 1954 719 456 1324 2240 2354 1419 1871 1712 2224 1436 49 365 1492 2318 1862 1443 1378 1618 1951 950 1257 490 488 1852 2470 1631 577 1586 132 2073 2038 1844 1078 675 657 4 422 600 353 2043 1859 2320 1047 1054 2440 37 2312 2372 103 1935 1194 1661 514 1316 535 1535 1788 1244 506 768 1121 555 1801 2468 1947 2469 810 42 2265 2347 2331 648 1189 2456 15 2414 2452 2449 585 405 2444 1674 1815 1213 1398 870 772 1913 1495 1097 517 1381 1871 1712 2224 2260 1553 1653 1492 2318 1862 745 428 720 1951 950 1257 1362 1388 1532 1866 2230 326 1555 1729 959 1860 1247 632 717 2238 1710 1752 495 260 130 765 1115 2272 2440 37 2312 2372 1224 2363 155 1731 1847 484 2215 1520 380 34 1351 1656 1121 555 1801 2468 332 1703 1524 1234 1772 318 477 2006 289 1482 57 3 2357 2335 1564 148 1353 75 2467 270 1829 927 296 1413 2235 2287 719 456 1324 2028 404 692 1436 49 365 1492 2318 1862 1076 718 1170 1952 2207 1135 1232 1008 1327 722 1349 2134 2470 1631 577 1219 1704 1137 1335 669 1650 2168 2226 646 550 2284 1138 2440 37 2312 2372 103 1935 1194 1661 1847 484 2215 1520 1957 939 2144 12 1121 555 1801 2468 1947 2469 810 42 1772 318 477 2006 406 1754 1513 364 3 2357 2335 5 84 248 2449 585 405 1960 1581 1563 1413 2235 2287 982 87 2065 1097 517 1381 623 1072 179 1492 2318 1862 745 428 720 1952 2207 1135 10 2039 1118 722 1349 2134 2404 834 1036 1555 1729 959 301 1180 556 1473 952 256 2356 2136 1993 766 1827 1258 1131 1355 639 8 514 1316 535 1535 380 34 1351 1656 1121 555 1801 2468 1064 516 2422 1470 1288 1188 379 1587 563 67 2290 2100 2117 1431 1240 1229 1972 360 1057 2444 1674 1815 134 2262 1954 719 456 1324 2089 2365 1740 1887 21 1609 267 1172 2408 1417 221 1404 1623 196 1450 1139 1153 1515 2114 1987 481 656 1688 2092 1021 1263 1786 2064 1762 1252 268 2222 142 2315 2462 1838 2038 1844 1078 1769 181 769 1596 2399 82 514 1316 535 1535 1788 1244 506 768 1121 555 1801 2468 1947 2469 810 42 1288 1188 379 1587 1716 2321 65 649 2117 1431 1240 1229 1176 948 819 1341 2444 1674 1815 1213 1398 870 772 1913 1495 1097 517 1381 1887 21 1609 1248 1254 138 2035 643 1382 1307 175 678 1139 1153 1515 1819 711 617 656 1688 2092 1040 1149 2122 2064 1762 1252 451 2450 1559 2471 2188 102 2198 2349 136 717 2238 1710 1501 2429 1784 91 531 1253 380 34 1351 1656 1121 555 1801 2468 332 1703 1524 1234 1772 318 477 2006 563 67 2290 2100 2117 1431 1240 1229 2446 1277 1498 2392 1615 1446 2105 258 1829 927 296 1413 2235 2287 719 456 1324 2028 404 692 2244 322 2434 106 868 746 1417 221 1404 998 2276 2182 2114 1987 481 656 1688 2092 66 117 1166 1034 799 685 1358 1411 1976 958 964 1791 2315 2462 1838 1022 1152 2030 2168 2226 646 912 172 658 2014 2005 1058 1121 555 1801 2468 1947 2469 810 42 1772 318 477 2006 406 1754 1513 364 2117 1431 1240 1229 1176 948 819 1341 1615 1446 2105 258 2391 1708 1250 652 1413 2235 2287 982 87 2065 1097 517 1381 623 1072 179 106 868 746 2133 1088 981 1307 175 678 262 778 275 656 1688 2092 1040 1149 2122 1034 799 685 1557 1207 1725 958 964 1791 1370 663 31 2198 2349 136 2251 1628 2234 2356 2136 1993 2068 466 661 1185 1918 2278 1658 1270 2428 249 238 44 334 421 209 1373 1467 1561 1610 2409 280 1506 1953 554 478 1921 977 1434 378 2048 199 1062 1136 519 1994 1605 811 1329 1143 352 1526 874 1284 108 1537 788 1476 1465 144 744 1218 1578 2398 1835 2209 2020 2371 2177 303 937 2383 151 381 2166 449 1146 474 2474 2228 415 2364 1377 2116 1514 1464 2291 619 1867 163 9 2472 1340 1423 292 541 830 1968 274 2289 1003 2271 439 739 2091 146 238 44 334 421 1224 2363 155 1731 1610 2409 280 1506 1870 14 926 1014 977 1434 378 2048 332 1703 1524 1234 1994 1605 811 1329 1444 603 2051 1313 874 1284 108 1799 1205 2095 1379 423 1845 501 76 1412 1835 2209 2020 1425 349 737 2199 1438 1102 1408 533 1986 1146 474 2474 1076 718 1170 1377 2116 1514 833 936 182 1867 163 9 1625 1830 2101 800 2242 36 1038 97 523 1030 647 232 2214 158 1926 881 282 502 209 1373 1467 1561 1610 2409 280 1506 2220 83 2281 622 1747 2402 621 1159 199 1062 1136 519 1994 1605 811 1329 1214 411 1289 2202 2239 2024 1637 949 629 1622 900 1728 2341 931 1465 144 744 2022 50 1519 133 2430 2071 1094 2324 2118 937 2383 151 1648 1794 2432 2228 415 2364 1377 2116 1514 2368 1364 193 445 2405 2067 287 1955 1437 1301 538 978 292 541 830 409 1481 2145 17 1050 1365 2183 683 522 1809 115 1101 1610 2409 280 1506 1870 14 926 1014 1747 2402 621 1159 1399 1840 1848 72 1994 1605 811 1329 1444 603 2051 1313 2239 2024 1637 949 1698 1471 2040 1549 1728 2341 931 581 2148 712 501 76 1412 847 1527 938 1094 2324 2118 2297 344 832 1408 533 1986 286 1262 1701 1377 2116 1514 833 936 182 445 2405 2067 530 1755 431 1301 538 978 963 1912 1780 1038 97 523 805 1006 626 1186 1403 1621 1692 1345 954 410 1233 189 1953 554 478 1921 977 1434 378 2048 199 1062 1136 519 1994 1605 811 1329 1856 816 1455 1119 71 2237 1478 1427 1077 297 1483 2042 709 631 455 1011 1218 1578 2398 1835 2209 2020 2371 2177 303 937 2383 151 2307 195 2268 1310 229 215 2106 1320 953 821 1749 627 27 255 1906 1160 1296 1999 283 1070 2179 1142 2457 460 2045 429 1985 770 1973 1939 515 1634 1523 1876 1430 780 1003 2271 439 1853 2135 1043 1756 1046 1242 977 1434 378 2048 332 1703 1524 1234 1994 1605 811 1329 1444 603 2051 1313 71 2237 1478 1427 2446 1277 1498 2392 709 631 455 1011 924 1380 2072 395 1835 2209 2020 1425 349 737 2199 1438 1102 1408 533 1986 1310 229 215 363 503 613 2156 1048 680 827 704 128 1160 1296 1999 66 117 1166 1142 2457 460 851 1110 224 770 1973 1939 1282 2137 1269 383 1504 1958 1744 866 290 2214 158 1926 1453 489 1978 706 30 2477 199 1062 1136 519 1994 1605 811 1329 1214 411 1289 2202 2239 2024 1637 949 1077 297 1483 2042 709 631 455 1011 946 2084 234 1803 487 1636 551 288 133 2430 2071 1094 2324 2118 937 2383 151 1648 1794 2432 1633 145 1177 430 591 212 821 1749 627 979 2000 1276 283 1070 2179 1142 2457 460 731 1099 266 989 961 767 865 1782 1839 493 754 114 1876 1430 780 1873 1757 2353 2183 683 522 1841 786 205 2210 1272 2075 1994 1605 811 1329 1444 603 2051 1313 2239 2024 1637 949 1698 1471 2040 1549 709 631 455 1011 924 1380 2072 395 487 1636 551 288 852 482 1063 908 1094 2324 2118 2297 344 832 1408 533 1986 286 1262 1701 430 591 212 677 1923 1946 827 704 128 644 1209 837 1142 2457 460 851 1110 224 989 961 767 1920 1468 1583 493 754 114 2206 1171 2180 1744 866 290 2194 454 732 1692 1345 954 1956 1814 1765 1925 113 150 1224 2363 155 1731 1847 484 2215 1520 1870 14 926 1014 1271 553 1984 2057 332 1703 1524 1234 1772 318 477 2006 1444 603 2051 1313 2141 2327 2285 124 1799 1205 2095 1190 1208 897 75 2467 270 2018 1709 1265 1425 349 737 2345 1260 2115 2028 404 692 944 980 1294 1076 718 1170 1952 2207 1135 833 936 182 1727 2461 1197 1625 1830 2101 346 1098 233 1219 1704 1137 1687 728 127 1317 1361 46 620 1385 507 2104 2264 725 1847 484 2215 1520 1957 939 2144 12 1271 553 1984 2057 689 630 1530 1529 1772 318 477 2006 406 1754 1513 364 2141 2327 2285 124 1264 594 1287 186 1190 1208 897 1898 1566 905 1960 1581 1563 1500 2178 2229 2345 1260 2115 690 2270 560 623 1072 179 1044 918 1522 1952 2207 1135 10 2039 1118 1727 2461 1197 913 2412 1407 346 1098 233 480 104 1943 301 1180 556 1193 2152 2187 1676 1251 1885 40 887 2411 307 1025 540 1870 14 926 1014 1271 553 1984 2057 1399 1840 1848 72 688 213 790 2395 1444 603 2051 1313 2141 2327 2285 124 1698 1471 2040 1549 1818 684 99 1147 581 2148 712 1971 121 1585 2018 1709 1265 1629 1528 1334 2297 344 832 2049 1386 699 944 980 1294 2090 1539 2304 833 936 182 1727 2461 1197 530 1755 431 397 605 1414 963 1912 1780 0 1281 1346 1687 728 127 299 1777 526 2151 125 1718 394 174 385 2415 1611 910 1271 553 1984 2057 689 630 1530 1529 688 213 790 2395 1556 645 1874 544 2141 2327 2285 124 1264 594 1287 186 1818 684 99 1147 2384 1164 803 575 1971 121 1585 494 1879 1268 1500 2178 2229 1204 1518 2258 2049 1386 699 2012 2420 1897 1044 918 1522 462 782 2147 1727 2461 1197 913 2412 1407 397 605 1414 748 933 1109 0 1281 1346 616 1415 2139 1193 2152 2187 1145 1175 1600 2143 997 95 1517 856 2435 1975 491 2044 332 1703 1524 1234 1772 318 477 2006 1444 603 2051 1313 2141 2327 2285 124 2446 1277 1498 2392 1615 1446 2105 258 924 1380 2072 395 2052 250 60 1445 1425 349 737 2345 1260 2115 2028 404 692 944 980 1294 363 503 613 479 894 337 998 2276 2182 2160 1643 2259 66 117 1166 1034 799 685 851 1110 224 1157 1783 1106 1282 2137 1269 564 993 1670 1022 1152 2030 201 845 1116 620 1385 507 1173 1165 1352 2088 159 2406 1772 318 477 2006 406 1754 1513 364 2141 2327 2285 124 1264 594 1287 186 1615 1446 2105 258 2391 1708 1250 652 2052 250 60 1445 1693 32 2299 707 2345 1260 2115 690 2270 560 623 1072 179 1044 918 1522 479 894 337 2019 1239 921 262 778 275 1199 354 595 1034 799 685 1557 1207 1725 1157 1783 1106 1842 54 1732 564 993 1670 1037 170 2232 2251 1628 2234 1330 1569 957 40 887 2411 1356 885 1789 1005 727 1114 1444 603 2051 1313 2141 2327 2285 124 1698 1471 2040 1549 1818 684 99 1147 924 1380 2072 395 2052 250 60 1445 852 482 1063 908 934 2212 1087 356 2297 344 832 2049 1386 699 944 980 1294 2090 1539 2304 677 1923 1946 511 990 1790 2160 1643 2259 992 640 2282 851 1110 224 1157 1783 1106 1920 1468 1583 1655 557 611 2206 1171 2180 1907 2011 1797 201 845 1116 1452 1315 2350 394 174 385 1181 528 1051 965 64 2126 2141 2327 2285 124 1264 594 1287 186 1818 684 99 1147 2384 1164 803 575 2052 250 60 1445 1693 32 2299 707 934 2212 1087 356 355 1538 2443 1283 2049 1386 699 2012 2420 1897 1044 918 1522 462 782 2147 511 990 1790 1722 855 2275 1199 354 595 1977 2173 147 1157 1783 1106 1842 54 1732 1655 557 611 1053 708 1593 1907 2011 1797 1816 230 1359 1330 1569 957 1691 1245 971 1517 856 2435 1129 1369 2256 166 1663 468 214 0 56 1667 2216 387 1112 252 1212 1761 532 382 1679 1607 945 2175 1167 109 2097 590 190 1828 1895 740 1770 1910 1753 1331 914 743 543 94 843 549 169 2233 1684 1805 139 2196 615 1959 2037 1865 2058 773 1067 542 2236 1568 1900 442 578 1459 168 1086 1608 2185 771 985 738 1082 374 759 1711 574 1875 389 70 361 1124 437 1558 2085 735 373 1639 1016 261 85 1700 943 1798 2366 1235 1699 2080 923 904 2159 2403 1950 1371 277 1215 173 1811 1074 1546 107 1367 2329 695 1982 1713 160 1614 293 1855 2316 420 1662 858 1421 446 1881 2273 1 306 1311 1402 859 2458 135 760 1810 2437 877 650 1155 1571 2419 672 698 1489 2002 792 403 686 853 1742 1065 828 907 675 657 4 1752 495 260 550 2284 1138 766 1827 1258 1596 2399 82 91 531 1253 2014 2005 1058 1185 1918 2278 739 2091 146 881 282 502 1809 115 1101 410 1233 189 1756 1046 1242 706 30 2477 2210 1272 2075 1925 113 150 2104 2264 725 307 1025 540 2415 1611 910 1975 491 2044 2088 159 2406 1005 727 1114 965 64 2126 166 1663 468 64 0 0 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 82 85 88 91 94 97 100 103 106 109 112 115 118 121 124 127 130 133 136 139 142 145 148 151 154 157 160 163 166 169 172 175 178 181 184 187 190 193 196 199 202 205 208 211 64 0 0 1 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 0 0 0 13 1 0
-3 0 0 1584 0 1 2132 1491 339 2205 291 721 191 18446744073709551615 0 499 973 2459 18446744073709551615 0 1319 1227 871 18446744073709551615 0 330 1664 1760 18446744073709551615 1 86 347 1134 424 1990 2346 1666 18446744073709551615 0 2400 154 889 18446744073709551615 0 1141 245 1395 18446744073709551615 0 2388 1125 1793 18446744073709551615 1 18 2266 2093 1291 1719 2410 1039 18446744073709551615 0 2249 1103 1570 18446744073709551615 0 345 2053 587 18446744073709551615 0 1635 1433 801 18446744073709551615 0 1831 321 372 18446744073709551615 0 53 1817 1130 18446744073709551615 0 1237 1779 357 18446744073709551615 0 2119 662 1325 18446744073709551615 0 120 598 1023 18446744073709551615 0 863 1551 1531 18446744073709551615 0 2260 1553 1653 18446744073709551615 0 1819 711 617 18446744073709551615 0 1376 438 1989 18446744073709551615 0 884 878 2288 18446744073709551615 0 1426 2098 2061 18446744073709551615 0 2376 568 123 18446744073709551615 0 1552 164 2294 18446744073709551615 0 2269 1721 2031 18446744073709551615 0 2368 1364 193 18446744073709551615 0 731 1099 266 18446744073709551615 0 572 1733 1493 18446744073709551615 0 784 2109 1071 18446744073709551615 0 748 933 1109 18446744073709551615 0 1053 708 1593 18446744073709551615 0 1342 81 440 18446744073709551615 0 2099 1669 1824 18446744073709551615 0 267 1172 2408 18446744073709551615 0 2035 643 1382 18446744073709551615 0 583 1273 1560 18446744073709551615 0 434 840 78 18446744073709551615 0 2307 195 2268 18446744073709551615 0 1633 145 1177 18446744073709551615 0 1248 1254 138 18446744073709551615 0 2133 1088 981 18446744073709551615 0 2019 1239 921 18446744073709551615 0 1722 855 2275 18446744073709551615 0 979 2000 1276 18446744073709551615 0 644 1209 837 18446744073709551615 0 992 640 2282 18446744073709551615 0 1977 2173 147 18446744073709551615 0 35 1868 2374 18446744073709551615 0 1318 1462 525 18446744073709551615 0 1933 2460 2181 18446744073709551615 0 15 2414 2452 18446744073709551615 0 1763 673 2476 18446744073709551615 0 1095 59 1458 18446744073709551615 0 2240 2354 1419 18446744073709551615 0 1623 196 1450 18446744073709551615 0 1739 2129 1354 18446744073709551615 0 736 400 1216 18446744073709551615 0 1013 417 659 18446744073709551615 0 1686 750 814 18446744073709551615 0 239 1479 2293 18446744073709551615 0 1309 2332 486 18446744073709551615 0 1823 891 16 18446744073709551615 0 111 1697 1267 18446744073709551615 0 2393 1899 730 18446744073709551615 0 955 1126 1534 18446744073709551615 0 381 2166 449 18446744073709551615 0 27 255 1906 18446744073709551615 0 1073 228 2314 18446744073709551615 0 839 1548 569 18446744073709551615 0 1143 352 1526 18446744073709551615 0 629 1622 900 18446744073709551615 0 920 314 208 18446744073709551615 0 844 1184 48 18446744073709551615 0 10 2039 1118 18446744073709551615 0 1557 1207 1725 18446744073709551615 0 648 1189 2456 18446744073709551615 0 5 84 248 18446744073709551615 0 1898 1566 905 18446744073709551615 0 494 1879 1268 18446744073709551615 0 2022 50 1519 18446744073709551615 0 847 1527 938 18446744073709551615 0 1629 1528 1334 18446744073709551615 0 1204 1518 2258 18446744073709551615 0 112 461 962 18446744073709551615 0 693 1029 74 18446744073709551615 0 530 1755 431 18446744073709551615 0 1920 1468 1583 18446744073709551615 0 2089 2365 1740 18446744073709551615 0 2244 322 2434 18446744073709551615 0 363 503 613 18446744073709551615 0 677 1923 1946 18446744073709551615 0 2106 1320 953 18446744073709551615 0 2156 1048 680 18446744073709551615 0 998 2276 2182 18446744073709551615 0 262 778 275 18446744073709551615 0 1076 718 1170 18446744073709551615 0 66 117 1166 18446744073709551615 0 1785 1657 807 18446744073709551615 0 210 2008 1122 18446744073709551615 0 75 2467 270 18446744073709551615 0 1960 1581 1563 18446744073709551615 0 1537 788 1476 18446744073709551615 0 1379 423 1845 18446744073709551615 0 1799 1205 2095 18446744073709551615 0 581 2148 712 18446744073709551615 0 2087 2267 2193 18446744073709551615 0 289 1482 57 18446744073709551615 0 909 527 1041 1 2431 22 1089 2436 2017 225 529 18446744073709551615 0 2241 818 2382 18446744073709551615 0 300 795 2340 1 988 371 996 1919 1384 1966 537 18446744073709551615 0 412 925 432 18446744073709551615 0 2367 333 2170 18446744073709551615 0 1812 207 29 18446744073709551615 0 63 2246 1800 18446744073709551615 0 20 2362 1804 18446744073709551615 0 829 1161 2223 18446744073709551615 0 2140 1015 2445 18446744073709551615 0 178 893 2386 18446744073709551615 0 1992 464 2013 18446744073709551615 0 134 2262 1954 18446744073709551615 0 772 1913 1495 18446744073709551615 0 1871 1712 2224 18446744073709551615 0 1139 1153 1515 18446744073709551615 0 2253 1864 1198 1 994 7 1743 2280 1543 1668 791 18446744073709551615 0 2218 2448 2308 18446744073709551615 0 194 1901 1000 1 968 119 815 101 1766 1256 329 18446744073709551615 0 1861 1169 243 18446744073709551615 0 1488 1836 377 18446744073709551615 0 1930 198 366 18446744073709551615 0 1191 902 1195 18446744073709551615 0 2026 1323 1746 18446744073709551615 0 204 2191 47 18446744073709551615 0 473 2060 1020 18446744073709551615 0 278 1758 723 18446744073709551615 0 1496 1573 1222 18446744073709551615 0 1617 1154 459 18446744073709551615 0 1889 1888 512 18446744073709551615 0 734 1113 2442 18446744073709551615 0 1442 2172 1998 18446744073709551615 0 203 2389 214 1 1545 2355 1409 310 518 1487 341 18446744073709551615 0 259 1392 1475 18446744073709551615 0 1540 362 1387 1 919 1942 1808 1400 1988 271 2107 18446744073709551615 0 802 929 1949 18446744073709551615 0 276 1778 850 18446744073709551615 0 1601 1606 1435 18446744073709551615 0 888 960 2438 18446744073709551615 0 775 1886 335 18446744073709551615 0 2029 521 714 18446744073709551615 0 177 1796 1645 18446744073709551615 0 1429 470 2300 18446744073709551615 0 774 2190 2217 18446744073709551615 0 2228 415 2364 18446744073709551615 0 283 1070 2179 18446744073709551615 0 1218 1578 2398 18446744073709551615 0 133 2430 2071 18446744073709551615 0 1544 2361 1851 18446744073709551615 0 98 448 824 18446744073709551615 0 1393 1019 1162 18446744073709551615 0 211 670 1745 18446744073709551615 0 1332 2001 1357 18446744073709551615 0 2082 1127 983 18446744073709551615 0 1902 1833 2257 18446744073709551615 0 697 1461 2186 18446744073709551615 0 745 428 720 18446744073709551615 0 1040 1149 2122 18446744073709551615 0 1213 1398 870 18446744073709551615 0 982 87 2065 18446744073709551615 0 913 2412 1407 18446744073709551615 0 1842 54 1732 18446744073709551615 0 690 2270 560 18446744073709551615 0 2012 2420 1897 18446744073709551615 0 1156 28 2454 18446744073709551615 0 1938 1858 1494 18446744073709551615 0 984 1536 227 18446744073709551615 0 368 237 876 18446744073709551615 0 1648 1794 2432 18446744073709551615 0 286 1262 1701 18446744073709551615 0 445 2405 2067 18446744073709551615 0 989 961 767 18446744073709551615 0 2010 1104 820 18446744073709551615 0 1012 2328 539 18446744073709551615 0 2292 2298 1665 18446744073709551615 0 674 596 779 18446744073709551615 0 2090 1539 2304 18446744073709551615 0 462 782 2147 18446744073709551615 0 397 605 1414 18446744073709551615 0 1655 557 611 18446744073709551615 0 452 2424 2423 18446744073709551615 0 755 2201 804 18446744073709551615 0 393 475 2301 18446744073709551615 0 1422 2248 2311 18446744073709551615 0 1887 21 1609 18446744073709551615 0 106 868 746 18446744073709551615 0 1417 221 1404 18446744073709551615 0 1307 175 678 18446744073709551615 0 1310 229 215 18446744073709551615 0 430 591 212 18446744073709551615 0 821 1749 627 18446744073709551615 0 827 704 128 18446744073709551615 0 479 894 337 18446744073709551615 0 511 990 1790 18446744073709551615 0 2160 1643 2259 18446744073709551615 0 1199 354 595 18446744073709551615 0 1190 1208 897 18446744073709551615 0 1971 121 1585 18446744073709551615 0 2018 1709 1265 18446744073709551615 0 1500 2178 2229 18446744073709551615 0 874 1284 108 18446744073709551615 0 1728 2341 931 18446744073709551615 0 1465 144 744 18446744073709551615 0 501 76 1412 18446744073709551615 0 2265 2347 2331 18446744073709551615 0 3 2357 2335 18446744073709551615 0 1564 148 1353 18446744073709551615 0 2449 585 405 18446744073709551615 0 906 826 185 18446744073709551615 0 1174 388 2083 18446744073709551615 0 1052 917 427 18446744073709551615 0 93 2146 1123 18446744073709551615 0 2028 404 692 18446744073709551615 0 623 1072 179 18446744073709551615 0 1952 2207 1135 18446744073709551615 0 1034 799 685 18446744073709551615 0 510 911 1424 18446744073709551615 0 1061 1723 1027 18446744073709551615 0 1516 2261 1375 18446744073709551615 0 2056 73 1736 18446744073709551615 0 2371 2177 303 18446744073709551615 0 2199 1438 1102 18446744073709551615 0 1146 474 2474 18446744073709551615 0 1160 1296 1999 18446744073709551615 0 2338 418 450 18446744073709551615 0 1179 1081 1056 18446744073709551615 0 579 304 825 18446744073709551615 0 2153 183 2231 18446744073709551615 0 833 936 182 18446744073709551615 0 851 1110 224 18446744073709551615 0 1425 349 737 18446744073709551615 0 2297 344 832 18446744073709551615 0 1436 49 365 18446744073709551615 0 2114 1987 481 18446744073709551615 0 1972 360 1057 18446744073709551615 0 1829 927 296 18446744073709551615 0 1660 279 1512 18446744073709551615 0 343 1390 534 18446744073709551615 0 1300 1322 1521 18446744073709551615 0 137 1931 1764 18446744073709551615 0 1441 1100 162 18446744073709551615 0 2426 1017 1405 18446744073709551615 0 1350 2200 281 18446744073709551615 0 2021 2451 1554 18446744073709551615 0 1157 1783 1106 18446744073709551615 0 1727 2461 1197 18446744073709551615 0 1044 918 1522 18446744073709551615 0 944 980 1294 18446744073709551615 0 2049 1386 699 18446744073709551615 0 2345 1260 2115 18446744073709551615 0 1142 2457 460 18446744073709551615 0 1377 2116 1514 18446744073709551615 0 1408 533 1986 18446744073709551615 0 937 2383 151 18446744073709551615 0 1094 2324 2118 18446744073709551615 0 1835 2209 2020 18446744073709551615 0 656 1688 2092 18446744073709551615 0 1492 2318 1862 18446744073709551615 0 1097 517 1381 18446744073709551615 0 719 456 1324 18446744073709551615 0 1413 2235 2287 18446744073709551615 0 2444 1674 1815 18446744073709551615 0 2464 785 633 18446744073709551615 0 864 2112 2313 18446744073709551615 0 1295 2203 392 18446744073709551615 0 33 1302 1183 18446744073709551615 0 2359 2306 463 18446744073709551615 0 1961 1410 1024 18446744073709551615 0 524 1344 55 18446744073709551615 0 2358 23 1111 18446744073709551615 0 309 504 2370 18446744073709551615 0 666 1869 257 18446744073709551615 0 1724 1238 1641 18446744073709551615 0 614 1562 1580 18446744073709551615 0 41 1632 2247 18446744073709551615 0 2317 13 1182 18446744073709551615 0 604 571 1582 18446744073709551615 0 1241 52 2394 18446744073709551615 0 940 391 1927 18446744073709551615 0 967 254 1255 18446744073709551615 0 1280 1849 562 18446744073709551615 0 808 320 1440 18446744073709551615 0 667 1672 1049 18446744073709551615 0 682 1850 319 18446744073709551615 0 315 986 408 18446744073709551615 0 2378 152 654 18446744073709551615 0 2074 753 1775 18446744073709551615 0 941 369 1451 1 1591 447 1120 1418 1510 1363 1290 18446744073709551615 0 2046 43 1303 18446744073709551615 0 636 1882 2348 1 637 1068 1305 817 846 848 879 18446744073709551615 0 1705 974 1009 18446744073709551615 0 375 1759 223 1 1941 2034 1285 1383 607 2063 1863 18446744073709551615 366 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 0 9 14 19 24 33 38 43 48 57 62 67 72 77 82 87 92 97 102 107 112 117 122 127 132 137 142 147 152 157 162 167 172 177 182 187 192 197 202 207 212 217 222 227 232 237 242 247 252 257 262 267 272 277 282 287 292 297 302 307 312 317 322 327 332 337 342 347 352 357 362 367 372 377 382 387 392 397 402 407 412 417 422 427 432 437 442 447 452 457 462 467 472 477 482 487 492 497 502 507 512 517 522 527 532 537 542 547 552 565 570 583 588 593 598 603 608 613 618 623 628 633 638 643 648 661 666 679 684 689 694 699 704 709 714 719 724 729 734 739 744 757 762 775 780 785 790 795 800 805 810 815 820 825 830 835 840 845 850 855 860 865 870 875 880 885 890 895 900 905 910 915 920 925 930 935 940 945 950 955 960 965 970 975 980 985 990 995 1000 1005 1010 1015 1020 1025 1030 1035 1040 1045 1050 1055 1060 1065 1070 1075 1080 1085 1090 1095 1100 1105 1110 1115 1120 1125 1130 1135 1140 1145 1150 1155 1160 1165 1170 1175 1180 1185 1190 1195 1200 1205 1210 1215 1220 1225 1230 1235 1240 1245 1250 1255 1260 1265 1270 1275 1280 1285 1290 1295 1300 1305 1310 1315 1320 1325 1330 1335 1340 1345 1350 1355 1360 1365 1370 1375 1380 1385 1390 1395 1400 1405 1410 1415 1420 1425 1430 1435 1440 1445 1450 1455 1460 1465 1470 1475 1480 1485 1490 1495 1500 1505 1510 1515 1520 1525 1530 1535 1548 1553 1566 1571 0 0 1272 0 1 2127 2120 751 715 2066 1511 2213 724 1567 165 1178 2255 285 18446744073709551615 0 401 651 1896 1 122 2413 860 1249 1878 2154 500 976 1035 1343 641 2373 2416 18446744073709551615 1 1406 1200 2465 2110 497 1997 1140 1904 1266 1525 2279 284 1965 18446744073709551615 0 1096 653 396 1 713 797 1680 849 1416 1642 2124 1368 1940 1748 441 1787 1497 18446744073709551615 1 2103 1595 1647 1694 1439 240 187 1059 340 156 298 570 1630 18446744073709551615 0 435 642 11 1 1675 1774 634 536 548 776 1297 1741 1187 1083 1321 219 1577 18446744073709551615 0 1944 1456 932 18446744073709551615 0 1093 1007 1299 18446744073709551615 0 1279 886 1004 18446744073709551615 0 2128 947 655 18446744073709551615 0 1654 2195 1339 18446744073709551615 0 793 1236 1651 18446744073709551615 0 660 1646 1616 18446744073709551615 0 1767 2 899 18446744073709551615 0 513 1937 1228 18446744073709551615 0 576 1638 573 18446744073709551615 0 1690 1045 302 18446744073709551615 0 426 1773 842 18446744073709551615 0 2125 700 1202 18446744073709551615 0 798 1066 857 18446744073709551615 0 861 68 1509 18446744073709551615 0 1963 2007 1877 18446744073709551615 0 2336 188 1707 18446744073709551615 0 2250 2041 2417 18446744073709551615 0 1499 2123 1391 18446744073709551615 0 1682 1685 171 18446744073709551615 0 703 312 2162 18446744073709551615 0 149 457 2221 18446744073709551615 0 1220 1507 1936 18446744073709551615 0 1326 606 1613 18446744073709551615 0 496 752 1834 18446744073709551615 0 367 1338 218 18446744073709551615 0 1432 1360 823 18446744073709551615 0 1696 1337 1108 18446744073709551615 0 2108 1771 1932 18446744073709551615 0 1795 809 2439 18446744073709551615 0 508 625 1588 18446744073709551615 0 351 794 999 18446744073709551615 0 2150 1366 566 18446744073709551615 0 1275 1843 1246 18446744073709551615 0 1565 100 1576 18446744073709551615 0 1644 1084 1980 18446744073709551615 0 2054 370 2385 18446744073709551615 0 61 930 1203 18446744073709551615 0 45 624 467 18446744073709551615 0 2197 1715 1677 18446744073709551615 0 2396 2342 1894 18446744073709551615 0 676 2003 327 18446744073709551615 0 483 2055 696 18446744073709551615 0 305 1807 915 18446744073709551615 0 582 1274 1168 18446744073709551615 0 1221 2323 2025 18446744073709551615 0 6 966 1333 18446744073709551615 0 1010 1447 749 18446744073709551615 0 1401 338 202 18446744073709551615 0 806 1922 1857 18446744073709551615 0 436 2059 2305 18446744073709551615 0 1586 132 2073 18446744073709551615 0 618 813 485 18446744073709551615 0 1091 1469 901 18446744073709551615 0 1768 2375 995 18446744073709551615 0 1860 1247 632 18446744073709551615 0 2142 2407 236 18446744073709551615 0 1474 235 2453 18446744073709551615 0 1335 669 1650 18446744073709551615 0 1042 2425 1891 18446744073709551615 0 2204 2397 764 18446744073709551615 0 1473 952 256 18446744073709551615 0 453 1702 498 18446744073709551615 0 399 1751 2102 18446744073709551615 0 2164 2192 1730 18446744073709551615 0 2130 781 1854 18446744073709551615 0 956 592 612 18446744073709551615 0 197 2339 1802 18446744073709551615 0 1261 783 716 18446744073709551615 0 679 747 1837 18446744073709551615 0 316 313 1314 18446744073709551615 0 1201 1132 883 18446744073709551615 0 1031 1822 1055 18446744073709551615 0 890 1163 1374 18446744073709551615 0 295 1738 1547 18446744073709551615 0 358 2184 1915 18446744073709551615 0 2227 272 1659 18446744073709551615 0 796 1820 1872 18446744073709551615 0 416 638 822 18446744073709551615 0 419 2377 687 18446744073709551615 0 1550 2079 77 18446744073709551615 0 1962 1826 1150 18446744073709551615 0 691 2326 2138 18446744073709551615 0 1968 274 2289 18446744073709551615 0 2113 19 1328 18446744073709551615 0 414 2078 895 18446744073709551615 0 1030 647 232 18446744073709551615 0 384 1602 742 18446744073709551615 0 1589 1575 26 18446744073709551615 0 558 1230 69 18446744073709551615 0 17 1050 1365 18446744073709551615 0 951 1033 350 18446744073709551615 0 2077 701 2169 18446744073709551615 0 1186 1403 1621 18446744073709551615 0 875 588 398 18446744073709551615 0 425 465 1196 18446744073709551615 0 1394 1584 58 18446744073709551615 0 733 1259 509 18446744073709551615 0 2167 1991 2171 18446744073709551615 0 1903 1226 118 18446744073709551615 0 472 1945 1649 18446744073709551615 0 1914 1597 1640 18446744073709551615 0 1917 2163 471 18446744073709551615 0 90 1726 1117 18446744073709551615 0 1678 2047 2009 18446744073709551615 0 838 586 2131 18446744073709551615 0 2158 1909 559 18446744073709551615 0 157 1832 2096 18446744073709551615 0 761 2473 2086 18446744073709551615 0 664 1490 1734 18446744073709551615 0 1306 1133 433 18446744073709551615 0 2302 1750 92 18446744073709551615 0 1317 1361 46 18446744073709551615 0 1298 1883 1312 18446744073709551615 0 601 263 2369 18446744073709551615 0 1676 1251 1885 18446744073709551615 0 38 2421 110 18446744073709551615 0 492 1620 2303 18446744073709551615 0 2151 125 1718 18446744073709551615 0 331 2333 1948 18446744073709551615 0 1105 1396 324 18446744073709551615 0 2143 997 95 18446744073709551615 0 2286 729 2225 18446744073709551615 0 1505 710 241 18446744073709551615 0 681 1463 1206 18446744073709551615 0 253 2427 1158 18446744073709551615 0 1599 922 1967 18446744073709551615 0 1443 1378 1618 18446744073709551615 0 359 1480 176 18446744073709551615 0 2069 1080 458 18446744073709551615 0 1792 216 1336 18446744073709551615 0 51 505 1624 18446744073709551615 0 609 969 1627 18446744073709551615 0 2472 1340 1423 18446744073709551615 0 975 220 1148 18446744073709551615 0 1232 1008 1327 18446744073709551615 0 800 2242 36 18446744073709551615 0 342 880 269 18446744073709551615 0 2111 1151 153 18446744073709551615 0 244 2004 246 18446744073709551615 0 831 726 873 18446744073709551615 0 1225 1192 665 18446744073709551615 0 1533 1486 328 18446744073709551615 0 1021 1263 1786 18446744073709551615 0 2475 1720 62 18446744073709551615 0 348 2381 1905 18446744073709551615 0 2211 2027 777 18446744073709551615 0 928 79 812 18446744073709551615 0 407 2351 2319 18446744073709551615 0 515 1634 1523 18446744073709551615 0 758 2174 2387 18446744073709551615 0 1358 1411 1976 18446744073709551615 0 383 1504 1958 18446744073709551615 0 2337 1079 1681 18446744073709551615 0 1951 950 1257 18446744073709551615 0 490 488 1852 18446744073709551615 0 2470 1631 577 18446744073709551615 0 2038 1844 1078 18446744073709551615 0 1362 1388 1532 18446744073709551615 0 1866 2230 326 18446744073709551615 0 1555 1729 959 18446744073709551615 0 717 2238 1710 18446744073709551615 0 722 1349 2134 18446744073709551615 0 1219 1704 1137 18446744073709551615 0 2168 2226 646 18446744073709551615 0 2404 834 1036 18446744073709551615 0 301 1180 556 18446744073709551615 0 2356 2136 1993 18446744073709551615 0 2064 1762 1252 18446744073709551615 0 268 2222 142 18446744073709551615 0 2315 2462 1838 18446744073709551615 0 1769 181 769 18446744073709551615 0 451 2450 1559 18446744073709551615 0 2471 2188 102 18446744073709551615 0 2198 2349 136 18446744073709551615 0 1501 2429 1784 18446744073709551615 0 958 964 1791 18446744073709551615 0 1022 1152 2030 18446744073709551615 0 912 172 658 18446744073709551615 0 1370 663 31 18446744073709551615 0 2251 1628 2234 18446744073709551615 0 2068 466 661 18446744073709551615 0 1464 2291 619 18446744073709551615 0 1867 163 9 18446744073709551615 0 292 541 830 18446744073709551615 0 1003 2271 439 18446744073709551615 0 1625 1830 2101 18446744073709551615 0 1038 97 523 18446744073709551615 0 2214 158 1926 18446744073709551615 0 287 1955 1437 18446744073709551615 0 1301 538 978 18446744073709551615 0 409 1481 2145 18446744073709551615 0 2183 683 522 18446744073709551615 0 963 1912 1780 18446744073709551615 0 805 1006 626 18446744073709551615 0 1692 1345 954 18446744073709551615 0 2045 429 1985 18446744073709551615 0 770 1973 1939 18446744073709551615 0 1876 1430 780 18446744073709551615 0 1853 2135 1043 18446744073709551615 0 1282 2137 1269 18446744073709551615 0 1744 866 290 18446744073709551615 0 1453 489 1978 18446744073709551615 0 865 1782 1839 18446744073709551615 0 493 754 114 18446744073709551615 0 1873 1757 2353 18446744073709551615 0 1841 786 205 18446744073709551615 0 2206 1171 2180 18446744073709551615 0 2194 454 732 18446744073709551615 0 1956 1814 1765 18446744073709551615 0 346 1098 233 18446744073709551615 0 1687 728 127 18446744073709551615 0 620 1385 507 18446744073709551615 0 480 104 1943 18446744073709551615 0 1193 2152 2187 18446744073709551615 0 40 887 2411 18446744073709551615 0 0 1281 1346 18446744073709551615 0 299 1777 526 18446744073709551615 0 394 174 385 18446744073709551615 0 616 1415 2139 18446744073709551615 0 1145 1175 1600 18446744073709551615 0 1517 856 2435 18446744073709551615 0 564 993 1670 18446744073709551615 0 201 845 1116 18446744073709551615 0 1173 1165 1352 18446744073709551615 0 1037 170 2232 18446744073709551615 0 1330 1569 957 18446744073709551615 0 1356 885 1789 18446744073709551615 0 1907 2011 1797 18446744073709551615 0 1452 1315 2350 18446744073709551615 0 1181 528 1051 18446744073709551615 0 1816 230 1359 18446744073709551615 0 1691 1245 971 18446744073709551615 0 1129 1369 2256 18446744073709551615 282 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 34 182 107 202 722 802 742 822 257 347 282 367 877 947 897 967 68 117 142 162 267 292 312 332 427 447 472 492 582 602 622 642 0 127 172 217 412 457 502 537 712 757 792 837 1012 1047 1082 1117 277 322 362 397 592 632 667 697 892 927 962 997 1167 1197 1227 1257 467 547 487 562 1057 1127 1072 1142 617 687 637 702 1187 1247 1202 1262 812 832 852 867 957 977 992 1007 1097 1112 1132 1147 1222 1237 1252 1267 662 677 692 707 517 532 552 567 357 377 392 407 192 212 232 247 917 987 932 1002 307 387 327 402 767 847 782 862 137 227 157 242 1032 1067 1102 1137 737 777 817 857 437 482 522 557 102 152 197 237 1207 1192 1177 1162 1232 1172 1217 1157 1242 1212 1182 1152 1077 1062 1042 1027 1107 1037 1092 1022 1122 1087 1052 1017 937 922 907 887 972 902 952 882 982 942 912 872 787 772 752 732 827 747 807 727 842 797 762 717 647 627 607 587 672 597 657 577 682 652 612 572 497 477 452 432 527 442 512 422 542 507 462 417 337 317 297 272 372 287 352 262 382 342 302 252 167 147 122 83 207 112 187 49 222 177 132 15 73 23 Policy::Sequential<3,3>
+DEAL::0 0 0 0 3 0 0 0 4 528 0 1217 903 1574 88 1892 610 1929 1981 635 2463 1457 2441 741 89 1683 1590 1979 1983 1652 222 1716 2321 65 649 946 2084 234 1803 355 1538 2443 1283 167 668 916 1477 1484 1292 2015 143 892 1893 336 311 1075 2149 180 1018 1859 2320 1047 1054 987 1060 265 325 2220 83 2281 622 1556 645 1874 544 1064 516 2422 1470 1856 816 1455 1119 2391 1708 1250 652 852 482 1063 908 2062 1717 789 705 1604 2033 1485 756 1658 1270 2428 249 1957 939 2144 12 1399 1840 1848 72 2446 1277 1498 2392 1224 2363 155 1731 1347 247 1466 584 1347 247 1466 584 2032 608 970 1448 1231 1821 599 565 1231 1821 599 565 1995 2094 1673 2161 1671 200 1594 1996 1671 200 1594 1996 1144 1032 1449 226 1460 2447 972 1293 1002 546 1974 376 1934 2330 1085 2155 1788 1244 506 768 2283 2208 1211 841 1107 2252 671 942 1781 1542 105 862 1214 411 1289 2202 1969 1502 141 2466 2384 1164 803 575 2219 413 2070 1541 1288 1188 379 1587 1572 1278 2165 2334 1077 297 1483 2042 1176 948 819 1341 1693 32 2299 707 487 1636 551 288 934 2212 1087 356 628 2263 2352 1420 422 600 353 2043 1603 552 161 2076 1131 1355 639 8 1592 2433 1598 896 1619 206 836 567 2309 589 1090 757 1970 2036 2322 317 1210 2274 2455 597 1953 554 478 1921 2243 443 1389 1472 209 1373 1467 1561 184 308 1243 1813 406 1754 1513 364 103 1935 1194 1661 689 630 1530 1529 1747 2402 621 1159 688 213 790 2395 2390 96 323 242 1698 1471 2040 1549 563 67 2290 2100 924 1380 2072 395 71 2237 1478 1427 1615 1446 2105 258 332 1703 1524 1234 1026 2176 1776 251 1847 484 2215 1520 238 44 334 421 1870 14 926 1014 130 765 1115 2272 1924 2360 869 24 1924 2360 869 24 580 39 2254 1846 386 231 1428 2310 514 1316 535 1535 1908 476 1028 1579 1908 476 1028 1579 2081 2379 602 444 2277 1508 520 1890 787 1069 192 2296 2121 1911 1825 390 2121 1911 1825 390 1304 2295 1348 116 129 2418 1612 2157 199 1062 1136 519 264 898 1372 2050 1454 867 80 469 1947 2469 810 42 1264 594 1287 186 294 2189 1128 1884 2239 2024 1637 949 2325 1695 593 561 1818 684 99 1147 762 2343 1689 1503 2117 1431 1240 1229 709 631 455 1011 2052 250 60 1445 1271 553 1984 2057 1610 2409 280 1506 2440 37 2312 2372 991 854 872 694 1772 318 477 2006 1626 1964 2344 935 977 1434 378 2048 25 131 1308 1806 1444 603 2051 1313 380 34 1351 1656 273 2016 1916 1880 402 1714 763 2245 1928 140 1737 702 1928 140 1737 702 217 1286 126 1001 2380 1706 545 547 1092 1735 2401 1223 2023 882 1397 835 1121 555 1801 2468 1994 1605 811 1329 2141 2327 2285 124 975 0 2132 1491 339 2205 291 721 191 499 973 2459 1319 1227 871 330 1664 1760 86 347 1134 424 1990 2346 1666 2400 154 889 1141 245 1395 2388 1125 1793 18 2266 2093 1291 1719 2410 1039 2249 1103 1570 345 2053 587 1635 1433 801 1831 321 372 53 1817 1130 1237 1779 357 2119 662 1325 120 598 1023 863 1551 1531 2260 1553 1653 1819 711 617 1376 438 1989 884 878 2288 1426 2098 2061 2376 568 123 1552 164 2294 2269 1721 2031 2368 1364 193 731 1099 266 572 1733 1493 784 2109 1071 748 933 1109 1053 708 1593 1342 81 440 2099 1669 1824 267 1172 2408 2035 643 1382 583 1273 1560 434 840 78 2307 195 2268 1633 145 1177 1248 1254 138 2133 1088 981 2019 1239 921 1722 855 2275 979 2000 1276 644 1209 837 992 640 2282 1977 2173 147 35 1868 2374 1318 1462 525 1933 2460 2181 15 2414 2452 1763 673 2476 1095 59 1458 2240 2354 1419 1623 196 1450 1739 2129 1354 736 400 1216 1013 417 659 1686 750 814 239 1479 2293 1309 2332 486 1823 891 16 111 1697 1267 2393 1899 730 955 1126 1534 381 2166 449 27 255 1906 1073 228 2314 839 1548 569 1143 352 1526 629 1622 900 920 314 208 844 1184 48 10 2039 1118 1557 1207 1725 648 1189 2456 5 84 248 1898 1566 905 494 1879 1268 2022 50 1519 847 1527 938 1629 1528 1334 1204 1518 2258 112 461 962 693 1029 74 530 1755 431 1920 1468 1583 2089 2365 1740 2244 322 2434 363 503 613 677 1923 1946 2106 1320 953 2156 1048 680 998 2276 2182 262 778 275 1076 718 1170 66 117 1166 1785 1657 807 210 2008 1122 75 2467 270 1960 1581 1563 1537 788 1476 1379 423 1845 1799 1205 2095 581 2148 712 2087 2267 2193 289 1482 57 909 527 1041 2431 22 1089 2436 2017 225 529 2241 818 2382 300 795 2340 988 371 996 1919 1384 1966 537 412 925 432 2367 333 2170 1812 207 29 63 2246 1800 20 2362 1804 829 1161 2223 2140 1015 2445 178 893 2386 1992 464 2013 134 2262 1954 772 1913 1495 1871 1712 2224 1139 1153 1515 2253 1864 1198 994 7 1743 2280 1543 1668 791 2218 2448 2308 194 1901 1000 968 119 815 101 1766 1256 329 1861 1169 243 1488 1836 377 1930 198 366 1191 902 1195 2026 1323 1746 204 2191 47 473 2060 1020 278 1758 723 1496 1573 1222 1617 1154 459 1889 1888 512 734 1113 2442 1442 2172 1998 203 2389 214 1545 2355 1409 310 518 1487 341 259 1392 1475 1540 362 1387 919 1942 1808 1400 1988 271 2107 802 929 1949 276 1778 850 1601 1606 1435 888 960 2438 775 1886 335 2029 521 714 177 1796 1645 1429 470 2300 774 2190 2217 2228 415 2364 283 1070 2179 1218 1578 2398 133 2430 2071 1544 2361 1851 98 448 824 1393 1019 1162 211 670 1745 1332 2001 1357 2082 1127 983 1902 1833 2257 697 1461 2186 745 428 720 1040 1149 2122 1213 1398 870 982 87 2065 913 2412 1407 1842 54 1732 690 2270 560 2012 2420 1897 1156 28 2454 1938 1858 1494 984 1536 227 368 237 876 1648 1794 2432 286 1262 1701 445 2405 2067 989 961 767 2010 1104 820 1012 2328 539 2292 2298 1665 674 596 779 2090 1539 2304 462 782 2147 397 605 1414 1655 557 611 452 2424 2423 755 2201 804 393 475 2301 1422 2248 2311 1887 21 1609 106 868 746 1417 221 1404 1307 175 678 1310 229 215 430 591 212 821 1749 627 827 704 128 479 894 337 511 990 1790 2160 1643 2259 1199 354 595 1190 1208 897 1971 121 1585 2018 1709 1265 1500 2178 2229 874 1284 108 1728 2341 931 1465 144 744 501 76 1412 2265 2347 2331 3 2357 2335 1564 148 1353 2449 585 405 906 826 185 1174 388 2083 1052 917 427 93 2146 1123 2028 404 692 623 1072 179 1952 2207 1135 1034 799 685 510 911 1424 1061 1723 1027 1516 2261 1375 2056 73 1736 2371 2177 303 2199 1438 1102 1146 474 2474 1160 1296 1999 2338 418 450 1179 1081 1056 579 304 825 2153 183 2231 833 936 182 851 1110 224 1425 349 737 2297 344 832 1436 49 365 2114 1987 481 1972 360 1057 1829 927 296 1660 279 1512 343 1390 534 1300 1322 1521 137 1931 1764 1441 1100 162 2426 1017 1405 1350 2200 281 2021 2451 1554 1157 1783 1106 1727 2461 1197 1044 918 1522 944 980 1294 2049 1386 699 2345 1260 2115 1142 2457 460 1377 2116 1514 1408 533 1986 937 2383 151 1094 2324 2118 1835 2209 2020 656 1688 2092 1492 2318 1862 1097 517 1381 719 456 1324 1413 2235 2287 2444 1674 1815 2464 785 633 864 2112 2313 1295 2203 392 33 1302 1183 2359 2306 463 1961 1410 1024 524 1344 55 2358 23 1111 309 504 2370 666 1869 257 1724 1238 1641 614 1562 1580 41 1632 2247 2317 13 1182 604 571 1582 1241 52 2394 940 391 1927 967 254 1255 1280 1849 562 808 320 1440 667 1672 1049 682 1850 319 315 986 408 2378 152 654 2074 753 1775 941 369 1451 1591 447 1120 1418 1510 1363 1290 2046 43 1303 636 1882 2348 637 1068 1305 817 846 848 879 1705 974 1009 375 1759 223 1941 2034 1285 1383 607 2063 1863 828 0 1406 1200 2465 2110 497 1997 1140 1904 1266 1525 2279 284 1965 2336 188 1707 1093 1007 1299 703 312 2162 681 1463 1206 831 726 873 359 1480 176 2475 1720 62 351 794 999 806 1922 1857 2054 370 2385 1091 1469 901 490 488 1852 268 2222 142 1866 2230 326 2471 2188 102 2103 1595 1647 1694 1439 240 187 1059 340 156 298 570 1630 2128 947 655 513 1937 1228 2125 700 1202 1275 1843 1246 45 624 467 483 2055 696 6 966 1333 2130 781 1854 679 747 1837 295 1738 1547 416 638 822 1394 1584 58 472 1945 1649 1678 2047 2009 761 2473 2086 2127 2120 751 715 2066 1511 2213 724 1567 165 1178 2255 285 793 1236 1651 861 68 1509 1326 606 1613 453 1702 498 1201 1132 883 1550 2079 77 384 1602 742 2286 729 2225 51 505 1624 2111 1151 153 928 79 812 1464 2291 619 287 1955 1437 2045 429 1985 865 1782 1839 1644 1084 1980 582 1274 1168 618 813 485 1042 2425 1891 2167 1991 2171 2158 1909 559 1298 1883 1312 331 2333 1948 1362 1388 1532 2404 834 1036 451 2450 1559 1370 663 31 480 104 1943 616 1415 2139 1037 170 2232 1816 230 1359 890 1163 1374 558 1230 69 796 1820 1872 2077 701 2169 409 1481 2145 1873 1757 2353 805 1006 626 2194 454 732 90 1726 1117 492 1620 2303 157 1832 2096 1105 1396 324 299 1777 526 1452 1315 2350 1145 1175 1600 1691 1245 971 1533 1486 328 2211 2027 777 758 2174 2387 2337 1079 1681 1769 181 769 1501 2429 1784 912 172 658 2068 466 661 1853 2135 1043 1453 489 1978 1841 786 205 1956 1814 1765 1173 1165 1352 1356 885 1789 1181 528 1051 1129 1369 2256 1317 1361 46 1676 1251 1885 2151 125 1718 2143 997 95 1968 274 2289 1030 647 232 17 1050 1365 1186 1403 1621 1586 132 2073 1860 1247 632 1335 669 1650 1473 952 256 1499 2123 1391 1220 1507 1936 1432 1360 823 1795 809 2439 1219 1704 1137 1022 1152 2030 301 1180 556 2251 1628 2234 676 2003 327 1474 235 2453 1221 2323 2025 2204 2397 764 2472 1340 1423 515 1634 1523 800 2242 36 383 1504 1958 1767 2 899 367 1338 218 426 1773 842 2108 1771 1932 1625 1830 2101 963 1912 1780 1282 2137 1269 2206 1171 2180 1443 1378 1618 1232 1008 1327 1021 1263 1786 1358 1411 1976 197 2339 1802 2227 272 1659 2113 19 1328 951 1033 350 1944 1456 932 1690 1045 302 1682 1685 171 1696 1337 1108 1517 856 2435 394 174 385 40 887 2411 620 1385 507 1330 1569 957 1193 2152 2187 201 845 1116 1687 728 127 1907 2011 1797 564 993 1670 0 1281 1346 346 1098 233 1692 1345 954 2183 683 522 2214 158 1926 1003 2271 439 1744 866 290 1038 97 523 1876 1430 780 292 541 830 493 754 114 770 1973 1939 1301 538 978 1867 163 9 2356 2136 1993 2168 2226 646 717 2238 1710 2038 1844 1078 2198 2349 136 1555 1729 959 2315 2462 1838 2470 1631 577 958 964 1791 2064 1762 1252 722 1349 2134 1951 950 1257 342 880 269 975 220 1148 1792 216 1336 1599 922 1967 348 2381 1905 2069 1080 458 1225 1192 665 253 2427 1158 407 2351 2319 244 2004 246 609 969 1627 1505 710 241 664 1490 1734 838 586 2131 1914 1597 1640 733 1259 509 601 263 2369 1903 1226 118 2302 1750 92 425 465 1196 38 2421 110 1306 1133 433 1917 2163 471 875 588 398 419 2377 687 358 2184 1915 316 313 1314 956 592 612 414 2078 895 1261 783 716 691 2326 2138 2164 2192 1730 1589 1575 26 1962 1826 1150 1031 1822 1055 399 1751 2102 1010 1447 749 305 1807 915 2197 1715 1677 1565 100 1576 1768 2375 995 61 930 1203 436 2059 2305 2150 1366 566 2142 2407 236 1401 338 202 2396 2342 1894 508 625 1588 798 1066 857 576 1638 573 1654 2195 1339 435 642 11 1675 1774 634 536 548 776 1297 1741 1187 1083 1321 219 1577 149 457 2221 1279 886 1004 2250 2041 2417 1096 653 396 713 797 1680 849 1416 1642 2124 1368 1940 1748 441 1787 1497 496 752 1834 1963 2007 1877 660 1646 1616 401 651 1896 122 2413 860 1249 1878 2154 500 976 1035 1343 641 2373 2416 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 18446744073709551615 0 0 4 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 214 0 56 1667 2216 387 1112 252 1212 1761 532 382 1679 1607 945 2175 1167 109 2097 590 190 1828 1895 740 1770 1910 1753 1331 914 743 543 94 843 549 169 2233 1684 1805 139 2196 615 1959 2037 1865 2058 773 1067 542 2236 1568 1900 442 578 1459 168 1086 1608 2185 771 985 738 1082 374 759 1711 574 1875 389 70 361 1124 437 1558 2085 735 373 1639 1016 261 85 1700 943 1798 2366 1235 1699 2080 923 904 2159 2403 1950 1371 277 1215 173 1811 1074 1546 107 1367 2329 695 1982 1713 160 1614 293 1855 2316 420 1662 858 1421 446 1881 2273 1 306 1311 1402 859 2458 135 760 1810 2437 877 650 1155 1571 2419 672 698 1489 2002 792 403 686 853 1742 1065 828 907 675 657 4 1752 495 260 550 2284 1138 766 1827 1258 1596 2399 82 91 531 1253 2014 2005 1058 1185 1918 2278 739 2091 146 881 282 502 1809 115 1101 410 1233 189 1756 1046 1242 706 30 2477 2210 1272 2075 1925 113 150 2104 2264 725 307 1025 540 2415 1611 910 1975 491 2044 2088 159 2406 1005 727 1114 965 64 2126 166 1663 468 0 0 3 0 0 0 4 133 0 0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300 304 308 312 316 320 324 328 332 336 340 344 348 352 356 360 364 368 372 376 380 384 388 392 396 400 404 408 412 416 420 424 428 432 436 440 444 448 452 456 460 464 468 472 476 480 484 488 492 496 500 504 508 512 516 520 524 528 309 0 0 7 10 13 16 23 26 29 32 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 346 349 352 359 362 365 368 371 374 377 380 383 386 389 392 395 398 401 408 411 414 421 424 427 430 433 436 439 442 445 448 451 454 457 460 463 470 473 476 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 729 732 735 738 741 744 747 750 753 756 759 762 765 768 771 774 777 780 783 786 789 792 795 798 801 804 807 810 813 816 819 822 825 828 831 834 837 840 843 846 849 852 855 858 861 864 867 870 873 876 879 882 885 888 891 894 897 900 903 906 909 912 915 918 921 924 927 930 933 936 939 942 949 952 955 962 965 968 247 0 0 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 71 74 77 80 83 86 89 92 95 98 101 104 107 110 113 116 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666 669 672 675 678 681 684 687 690 693 696 699 702 705 708 711 714 717 720 723 726 739 742 745 748 751 764 767 770 773 776 789 802 857 954 1 0 4294967295 4 0 0 0 0 0 0 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4 0 0 0 0 0 0 64 0 0 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 82 85 88 91 94 97 100 103 106 109 112 115 118 121 124 127 130 133 136 139 142 145 148 151 154 157 160 163 166 169 172 175 178 181 184 187 190 193 196 199 202 205 208 211 0 0 3 0 0 0 0 0 5826 0 1217 903 1574 88 1347 247 1466 584 1231 1821 599 565 1908 476 1028 1579 1671 200 1594 1996 1924 2360 869 24 2121 1911 1825 390 1928 140 1737 702 86 347 1134 424 1990 2346 1666 994 7 1743 2280 1543 1668 791 2132 1491 339 2205 291 721 191 968 119 815 101 1766 1256 329 919 1942 1808 1400 1988 271 2107 1941 2034 1285 1383 607 2063 1863 2431 22 1089 2436 2017 225 529 637 1068 1305 817 846 848 879 18 2266 2093 1291 1719 2410 1039 988 371 996 1919 1384 1966 537 1545 2355 1409 310 518 1487 341 1591 447 1120 1418 1510 1363 1290 2127 2120 751 715 2066 1511 2213 724 1567 165 1178 2255 285 122 2413 860 1249 1878 2154 500 976 1035 1343 641 2373 2416 1406 1200 2465 2110 497 1997 1140 1904 1266 1525 2279 284 1965 713 797 1680 849 1416 1642 2124 1368 1940 1748 441 1787 1497 2103 1595 1647 1694 1439 240 187 1059 340 156 298 570 1630 1675 1774 634 536 548 776 1297 1741 1187 1083 1321 219 1577 56 1667 2216 387 1112 252 1212 1761 532 382 1679 1607 945 2175 1167 109 2097 590 190 1828 1895 740 1770 1910 1753 1347 247 1466 584 167 668 916 1477 1908 476 1028 1579 1592 2433 1598 896 1924 2360 869 24 1603 552 161 2076 1928 140 1737 702 402 1714 763 2245 2253 1864 1198 1739 2129 1354 499 973 2459 1861 1169 243 375 1759 223 1350 2200 281 2241 818 2382 2046 43 1303 300 795 2340 1763 673 2476 941 369 1451 1441 1100 162 401 651 1896 1944 1456 932 1093 1007 1299 1279 886 1004 2128 947 655 1654 2195 1339 1331 914 743 1231 1821 599 565 1908 476 1028 1579 1484 1292 2015 143 2309 589 1090 757 2121 1911 1825 390 1928 140 1737 702 1210 2274 2455 597 25 131 1308 1806 2400 154 889 2218 2448 2308 194 1901 1000 239 1479 2293 802 929 1949 1705 974 1009 636 1882 2348 2338 418 450 203 2389 214 941 369 1451 2393 1899 730 579 304 825 793 1236 1651 660 1646 1616 1096 653 396 1767 2 899 513 1937 1228 576 1638 573 543 94 843 1908 476 1028 1579 1592 2433 1598 896 2309 589 1090 757 1604 2033 1485 756 1928 140 1737 702 402 1714 763 2245 25 131 1308 1806 1026 2176 1776 251 2218 2448 2308 736 400 1216 1861 1169 243 1309 2332 486 1705 974 1009 2021 2451 1554 2046 43 1303 1179 1081 1056 941 369 1451 1441 1100 162 579 304 825 1785 1657 807 660 1646 1616 1690 1045 302 1279 886 1004 426 1773 842 2125 700 1202 798 1066 857 549 169 2233 1671 200 1594 1996 1924 2360 869 24 2121 1911 1825 390 1928 140 1737 702 892 1893 336 311 628 2263 2352 1420 2243 443 1389 1472 991 854 872 694 1540 362 1387 375 1759 223 909 527 1041 636 1882 2348 1073 228 2314 906 826 185 35 1868 2374 1052 917 427 2249 1103 1570 412 925 432 259 1392 1475 2074 753 1775 861 68 1509 1963 2007 1877 2336 188 1707 2250 2041 2417 435 642 11 1499 2123 1391 1684 1805 139 1924 2360 869 24 1603 552 161 2076 1928 140 1737 702 402 1714 763 2245 628 2263 2352 1420 2062 1717 789 705 991 854 872 694 130 765 1115 2272 375 1759 223 1350 2200 281 2241 818 2382 2046 43 1303 906 826 185 2087 2267 2193 1318 1462 525 93 2146 1123 412 925 432 1095 59 1458 2074 753 1775 2426 1017 1405 1963 2007 1877 1682 1685 171 703 312 2162 149 457 2221 1654 2195 1339 1220 1507 1936 2196 615 1959 2121 1911 1825 390 1928 140 1737 702 1210 2274 2455 597 25 131 1308 1806 2243 443 1389 1472 991 854 872 694 1658 1270 2428 249 238 44 334 421 802 929 1949 1705 974 1009 636 1882 2348 2338 418 450 839 1548 569 1174 388 2083 1052 917 427 1537 788 1476 259 1392 1475 2074 753 1775 955 1126 1534 2153 183 2231 1326 606 1613 496 752 1834 2250 2041 2417 367 1338 218 576 1638 573 1432 1360 823 2037 1865 2058 1928 140 1737 702 402 1714 763 2245 25 131 1308 1806 1026 2176 1776 251 991 854 872 694 130 765 1115 2272 238 44 334 421 1224 2363 155 1731 1705 974 1009 2021 2451 1554 2046 43 1303 1179 1081 1056 1174 388 2083 289 1482 57 93 2146 1123 1379 423 1845 2074 753 1775 2426 1017 1405 2153 183 2231 210 2008 1122 496 752 1834 1696 1337 1108 149 457 2221 2108 1771 1932 798 1066 857 1795 809 2439 773 1067 542 167 668 916 1477 2032 608 970 1448 1592 2433 1598 896 2081 2379 602 444 1603 552 161 2076 386 231 1428 2310 402 1714 763 2245 217 1286 126 1001 1739 2129 1354 1488 1836 377 1319 1227 871 1191 902 1195 1350 2200 281 2378 152 654 829 1161 2223 682 1850 319 1763 673 2476 178 893 2386 1441 1100 162 808 320 1440 1944 1456 932 508 625 1588 351 794 999 2150 1366 566 1275 1843 1246 1565 100 1576 2236 1568 1900 2032 608 970 1448 1892 610 1929 1981 2081 2379 602 444 1460 2447 972 1293 386 231 1428 2310 1934 2330 1085 2155 217 1286 126 1001 264 898 1372 2050 1488 1836 377 1831 321 372 330 1664 1760 2026 1323 1746 2378 152 654 1393 1019 1162 2140 1015 2445 667 1672 1049 178 893 2386 120 598 1023 808 320 1440 1544 2361 1851 508 625 1588 1644 1084 1980 2054 370 2385 61 930 1203 45 624 467 2197 1715 1677 442 578 1459 1592 2433 1598 896 2081 2379 602 444 1604 2033 1485 756 1970 2036 2322 317 402 1714 763 2245 217 1286 126 1001 1026 2176 1776 251 1626 1964 2344 935 736 400 1216 1930 198 366 1191 902 1195 1823 891 16 2021 2451 1554 315 986 408 682 1850 319 510 911 1424 1441 1100 162 808 320 1440 1785 1657 807 1516 2261 1375 1690 1045 302 2396 2342 1894 2150 1366 566 676 2003 327 483 2055 696 305 1807 915 168 1086 1608 2081 2379 602 444 1460 2447 972 1293 1970 2036 2322 317 1075 2149 180 1018 217 1286 126 1001 264 898 1372 2050 1626 1964 2344 935 184 308 1243 1813 1930 198 366 53 1817 1130 2026 1323 1746 111 1697 1267 315 986 408 211 670 1745 667 1672 1049 1061 1723 1027 808 320 1440 1544 2361 1851 1516 2261 1375 920 314 208 2396 2342 1894 582 1274 1168 61 930 1203 1221 2323 2025 6 966 1333 1010 1447 749 2185 771 985 1603 552 161 2076 386 231 1428 2310 402 1714 763 2245 217 1286 126 1001 2062 1717 789 705 422 600 353 2043 130 765 1115 2272 2440 37 2312 2372 1350 2200 281 2378 152 654 829 1161 2223 682 1850 319 2087 2267 2193 2265 2347 2331 1933 2460 2181 1564 148 1353 1095 59 1458 1992 464 2013 2426 1017 1405 1280 1849 562 1682 1685 171 1401 338 202 806 1922 1857 436 2059 2305 1565 100 1576 1586 132 2073 738 1082 374 386 231 1428 2310 1934 2330 1085 2155 217 1286 126 1001 264 898 1372 2050 422 600 353 2043 1859 2320 1047 1054 2440 37 2312 2372 103 1935 1194 1661 2378 152 654 1393 1019 1162 2140 1015 2445 667 1672 1049 2265 2347 2331 648 1189 2456 15 2414 2452 2449 585 405 1992 464 2013 863 1551 1531 1280 1849 562 98 448 824 1401 338 202 618 813 485 1091 1469 901 1768 2375 995 2197 1715 1677 1860 1247 632 759 1711 574 402 1714 763 2245 217 1286 126 1001 1026 2176 1776 251 1626 1964 2344 935 130 765 1115 2272 2440 37 2312 2372 1224 2363 155 1731 1847 484 2215 1520 2021 2451 1554 315 986 408 682 1850 319 510 911 1424 289 1482 57 3 2357 2335 1564 148 1353 75 2467 270 2426 1017 1405 1280 1849 562 210 2008 1122 2056 73 1736 1696 1337 1108 2142 2407 236 436 2059 2305 1474 235 2453 305 1807 915 1335 669 1650 1875 389 70 217 1286 126 1001 264 898 1372 2050 1626 1964 2344 935 184 308 1243 1813 2440 37 2312 2372 103 1935 1194 1661 1847 484 2215 1520 1957 939 2144 12 315 986 408 211 670 1745 667 1672 1049 1061 1723 1027 3 2357 2335 5 84 248 2449 585 405 1960 1581 1563 1280 1849 562 98 448 824 2056 73 1736 844 1184 48 2142 2407 236 1042 2425 1891 1768 2375 995 2204 2397 764 1010 1447 749 1473 952 256 361 1124 437 1484 1292 2015 143 2309 589 1090 757 1995 2094 1673 2161 2277 1508 520 1890 1210 2274 2455 597 25 131 1308 1806 1304 2295 1348 116 2380 1706 545 547 1141 245 1395 204 2191 47 239 1479 2293 278 1758 723 888 960 2438 967 254 1255 2338 418 450 1241 52 2394 2393 1899 730 579 304 825 276 1778 850 2317 13 1182 453 1702 498 399 1751 2102 1767 2 899 2164 2192 1730 2130 781 1854 956 592 612 1558 2085 735 2309 589 1090 757 1604 2033 1485 756 2277 1508 520 1890 1619 206 836 567 25 131 1308 1806 1026 2176 1776 251 2380 1706 545 547 273 2016 1916 1880 204 2191 47 1013 417 659 1309 2332 486 1496 1573 1222 967 254 1255 1300 1322 1521 1179 1081 1056 604 571 1582 579 304 825 1785 1657 807 2317 13 1182 1660 279 1512 399 1751 2102 197 2339 1802 426 1773 842 1261 783 716 679 747 1837 316 313 1314 373 1639 1016 1995 2094 1673 2161 2277 1508 520 1890 635 2463 1457 2441 2283 2208 1211 841 1304 2295 1348 116 2380 1706 545 547 1781 1542 105 862 294 2189 1128 1884 2388 1125 1793 473 2060 1020 278 1758 723 1376 438 1989 775 1886 335 940 391 1927 1241 52 2394 1156 28 2454 276 1778 850 2317 13 1182 1552 164 2294 984 1536 227 1201 1132 883 1031 1822 1055 2164 2192 1730 890 1163 1374 295 1738 1547 358 2184 1915 261 85 1700 2277 1508 520 1890 1619 206 836 567 2283 2208 1211 841 987 1060 265 325 2380 1706 545 547 273 2016 1916 1880 294 2189 1128 1884 2390 96 323 242 473 2060 1020 1686 750 814 1496 1573 1222 884 878 2288 940 391 1927 137 1931 1764 604 571 1582 1938 1858 1494 2317 13 1182 1660 279 1512 984 1536 227 112 461 962 1031 1822 1055 2227 272 1659 1261 783 716 796 1820 1872 416 638 822 419 2377 687 943 1798 2366 1210 2274 2455 597 25 131 1308 1806 1304 2295 1348 116 2380 1706 545 547 1658 1270 2428 249 238 44 334 421 209 1373 1467 1561 1610 2409 280 1506 888 960 2438 967 254 1255 2338 418 450 1241 52 2394 1143 352 1526 874 1284 108 1537 788 1476 1465 144 744 955 1126 1534 2153 183 2231 1601 1606 1435 41 1632 2247 1550 2079 77 1962 1826 1150 367 1338 218 691 2326 2138 956 592 612 1968 274 2289 1235 1699 2080 25 131 1308 1806 1026 2176 1776 251 2380 1706 545 547 273 2016 1916 1880 238 44 334 421 1224 2363 155 1731 1610 2409 280 1506 1870 14 926 1014 967 254 1255 1300 1322 1521 1179 1081 1056 604 571 1582 874 1284 108 1799 1205 2095 1379 423 1845 501 76 1412 2153 183 2231 210 2008 1122 41 1632 2247 343 1390 534 1962 1826 1150 2113 19 1328 2108 1771 1932 414 2078 895 316 313 1314 1030 647 232 923 904 2159 1304 2295 1348 116 2380 1706 545 547 1781 1542 105 862 294 2189 1128 1884 209 1373 1467 1561 1610 2409 280 1506 2220 83 2281 622 1747 2402 621 1159 775 1886 335 940 391 1927 1241 52 2394 1156 28 2454 629 1622 900 1728 2341 931 1465 144 744 2022 50 1519 1601 1606 1435 41 1632 2247 2269 1721 2031 368 237 876 384 1602 742 1589 1575 26 691 2326 2138 558 1230 69 358 2184 1915 17 1050 1365 2403 1950 1371 2380 1706 545 547 273 2016 1916 1880 294 2189 1128 1884 2390 96 323 242 1610 2409 280 1506 1870 14 926 1014 1747 2402 621 1159 1399 1840 1848 72 940 391 1927 137 1931 1764 604 571 1582 1938 1858 1494 1728 2341 931 581 2148 712 501 76 1412 847 1527 938 41 1632 2247 343 1390 534 368 237 876 693 1029 74 1589 1575 26 951 1033 350 414 2078 895 2077 701 2169 419 2377 687 1186 1403 1621 277 1215 173 1604 2033 1485 756 1970 2036 2322 317 1619 206 836 567 787 1069 192 2296 1026 2176 1776 251 1626 1964 2344 935 273 2016 1916 1880 1092 1735 2401 1223 1013 417 659 1617 1154 459 1823 891 16 734 1113 2442 1300 1322 1521 614 1562 1580 510 911 1424 666 1869 257 1785 1657 807 1516 2261 1375 1660 279 1512 2358 23 1111 197 2339 1802 875 588 398 676 2003 327 425 465 1196 1394 1584 58 733 1259 509 1811 1074 1546 1970 2036 2322 317 1075 2149 180 1018 787 1069 192 2296 1002 546 1974 376 1626 1964 2344 935 184 308 1243 1813 1092 1735 2401 1223 1454 867 80 469 1617 1154 459 1237 1779 357 111 1697 1267 1442 2172 1998 614 1562 1580 1902 1833 2257 1061 1723 1027 309 504 2370 1516 2261 1375 920 314 208 2358 23 1111 1332 2001 1357 875 588 398 2167 1991 2171 1221 2323 2025 1903 1226 118 472 1945 1649 1914 1597 1640 107 1367 2329 1619 206 836 567 787 1069 192 2296 987 1060 265 325 1107 2252 671 942 273 2016 1916 1880 1092 1735 2401 1223 2390 96 323 242 2325 1695 593 561 1686 750 814 1889 1888 512 734 1113 2442 1426 2098 2061 137 1931 1764 1724 1238 1641 666 1869 257 2010 1104 820 1660 279 1512 2358 23 1111 112 461 962 2292 2298 1665 2227 272 1659 1917 2163 471 425 465 1196 90 1726 1117 1678 2047 2009 838 586 2131 695 1982 1713 787 1069 192 2296 1002 546 1974 376 1107 2252 671 942 741 89 1683 1590 1092 1735 2401 1223 1454 867 80 469 2325 1695 593 561 1969 1502 141 2466 1889 1888 512 2119 662 1325 1442 2172 1998 2376 568 123 1724 1238 1641 697 1461 2186 309 504 2370 1012 2328 539 2358 23 1111 1332 2001 1357 2292 2298 1665 572 1733 1493 1917 2163 471 2158 1909 559 1903 1226 118 157 1832 2096 761 2473 2086 664 1490 1734 160 1614 293 1026 2176 1776 251 1626 1964 2344 935 273 2016 1916 1880 1092 1735 2401 1223 1224 2363 155 1731 1847 484 2215 1520 1870 14 926 1014 1271 553 1984 2057 1300 1322 1521 614 1562 1580 510 911 1424 666 1869 257 1799 1205 2095 1190 1208 897 75 2467 270 2018 1709 1265 210 2008 1122 2056 73 1736 343 1390 534 524 1344 55 2113 19 1328 1306 1133 433 1474 235 2453 2302 1750 92 733 1259 509 1317 1361 46 1855 2316 420 1626 1964 2344 935 184 308 1243 1813 1092 1735 2401 1223 1454 867 80 469 1847 484 2215 1520 1957 939 2144 12 1271 553 1984 2057 689 630 1530 1529 614 1562 1580 1902 1833 2257 1061 1723 1027 309 504 2370 1190 1208 897 1898 1566 905 1960 1581 1563 1500 2178 2229 2056 73 1736 844 1184 48 524 1344 55 2082 1127 983 1306 1133 433 1298 1883 1312 2204 2397 764 601 263 2369 1914 1597 1640 1676 1251 1885 1662 858 1421 273 2016 1916 1880 1092 1735 2401 1223 2390 96 323 242 2325 1695 593 561 1870 14 926 1014 1271 553 1984 2057 1399 1840 1848 72 688 213 790 2395 137 1931 1764 1724 1238 1641 666 1869 257 2010 1104 820 581 2148 712 1971 121 1585 2018 1709 1265 1629 1528 1334 343 1390 534 524 1344 55 693 1029 74 674 596 779 951 1033 350 38 2421 110 2302 1750 92 492 1620 2303 838 586 2131 2151 125 1718 446 1881 2273 1092 1735 2401 1223 1454 867 80 469 2325 1695 593 561 1969 1502 141 2466 1271 553 1984 2057 689 630 1530 1529 688 213 790 2395 1556 645 1874 544 1724 1238 1641 697 1461 2186 309 504 2370 1012 2328 539 1971 121 1585 494 1879 1268 1500 2178 2229 1204 1518 2258 524 1344 55 2082 1127 983 674 596 779 784 2109 1071 38 2421 110 331 2333 1948 601 263 2369 1105 1396 324 664 1490 1734 2143 997 95 1 306 1311 892 1893 336 311 628 2263 2352 1420 2243 443 1389 1472 991 854 872 694 1144 1032 1449 226 580 39 2254 1846 129 2418 1612 2157 2023 882 1397 835 1073 228 2314 906 826 185 35 1868 2374 1052 917 427 1429 470 2300 1961 1410 1024 2367 333 2170 33 1302 1183 345 2053 587 63 2246 1800 2029 521 714 864 2112 2313 2286 729 2225 1505 710 241 681 1463 1206 253 2427 1158 1499 2123 1391 1599 922 1967 1402 859 2458 628 2263 2352 1420 2062 1717 789 705 991 854 872 694 130 765 1115 2272 580 39 2254 1846 1131 1355 639 8 2023 882 1397 835 380 34 1351 1656 906 826 185 2087 2267 2193 1318 1462 525 93 2146 1123 1961 1410 1024 1972 360 1057 1812 207 29 1295 2203 392 63 2246 1800 2240 2354 1419 864 2112 2313 1436 49 365 1505 710 241 1443 1378 1618 359 1480 176 2069 1080 458 1220 1507 1936 1792 216 1336 135 760 1810 2243 443 1389 1472 991 854 872 694 1658 1270 2428 249 238 44 334 421 129 2418 1612 2157 2023 882 1397 835 1953 554 478 1921 977 1434 378 2048 839 1548 569 1174 388 2083 1052 917 427 1537 788 1476 774 2190 2217 2359 2306 463 33 1302 1183 2371 2177 303 2029 521 714 864 2112 2313 381 2166 449 1146 474 2474 51 505 1624 609 969 1627 253 2427 1158 2472 1340 1423 1432 1360 823 975 220 1148 2437 877 650 991 854 872 694 130 765 1115 2272 238 44 334 421 1224 2363 155 1731 2023 882 1397 835 380 34 1351 1656 977 1434 378 2048 332 1703 1524 1234 1174 388 2083 289 1482 57 93 2146 1123 1379 423 1845 2359 2306 463 1829 927 296 1295 2203 392 2199 1438 1102 864 2112 2313 1436 49 365 1146 474 2474 1076 718 1170 609 969 1627 1232 1008 1327 2069 1080 458 800 2242 36 1795 809 2439 342 880 269 1155 1571 2419 1144 1032 1449 226 580 39 2254 1846 129 2418 1612 2157 2023 882 1397 835 1979 1983 1652 222 2219 413 2070 1541 1572 1278 2165 2334 762 2343 1689 1503 1429 470 2300 1961 1410 1024 2367 333 2170 33 1302 1183 583 1273 1560 452 2424 2423 1342 81 440 393 475 2301 1635 1433 801 20 2362 1804 177 1796 1645 2464 785 633 2111 1151 153 244 2004 246 831 726 873 1225 1192 665 1599 922 1967 1533 1486 328 672 698 1489 580 39 2254 1846 1131 1355 639 8 2023 882 1397 835 380 34 1351 1656 2219 413 2070 1541 1064 516 2422 1470 762 2343 1689 1503 563 67 2290 2100 1961 1410 1024 1972 360 1057 1812 207 29 1295 2203 392 452 2424 2423 2089 2365 1740 2099 1669 1824 1422 2248 2311 20 2362 1804 1623 196 1450 2464 785 633 2114 1987 481 244 2004 246 1021 1263 1786 2475 1720 62 348 2381 1905 1792 216 1336 2211 2027 777 2002 792 403 129 2418 1612 2157 2023 882 1397 835 1953 554 478 1921 977 1434 378 2048 1572 1278 2165 2334 762 2343 1689 1503 1856 816 1455 1119 71 2237 1478 1427 774 2190 2217 2359 2306 463 33 1302 1183 2371 2177 303 434 840 78 755 2201 804 393 475 2301 2106 1320 953 177 1796 1645 2464 785 633 27 255 1906 1160 1296 1999 928 79 812 407 2351 2319 1225 1192 665 515 1634 1523 975 220 1148 758 2174 2387 686 853 1742 2023 882 1397 835 380 34 1351 1656 977 1434 378 2048 332 1703 1524 1234 762 2343 1689 1503 563 67 2290 2100 71 2237 1478 1427 2446 1277 1498 2392 2359 2306 463 1829 927 296 1295 2203 392 2199 1438 1102 755 2201 804 2244 322 2434 1422 2248 2311 2156 1048 680 2464 785 633 2114 1987 481 1160 1296 1999 66 117 1166 407 2351 2319 1358 1411 1976 348 2381 1905 383 1504 1958 342 880 269 2337 1079 1681 1065 828 907 2062 1717 789 705 422 600 353 2043 130 765 1115 2272 2440 37 2312 2372 1131 1355 639 8 514 1316 535 1535 380 34 1351 1656 1121 555 1801 2468 2087 2267 2193 2265 2347 2331 1933 2460 2181 1564 148 1353 1972 360 1057 2444 1674 1815 134 2262 1954 719 456 1324 2240 2354 1419 1871 1712 2224 1436 49 365 1492 2318 1862 1443 1378 1618 1951 950 1257 490 488 1852 2470 1631 577 1586 132 2073 2038 1844 1078 675 657 4 422 600 353 2043 1859 2320 1047 1054 2440 37 2312 2372 103 1935 1194 1661 514 1316 535 1535 1788 1244 506 768 1121 555 1801 2468 1947 2469 810 42 2265 2347 2331 648 1189 2456 15 2414 2452 2449 585 405 2444 1674 1815 1213 1398 870 772 1913 1495 1097 517 1381 1871 1712 2224 2260 1553 1653 1492 2318 1862 745 428 720 1951 950 1257 1362 1388 1532 1866 2230 326 1555 1729 959 1860 1247 632 717 2238 1710 1752 495 260 130 765 1115 2272 2440 37 2312 2372 1224 2363 155 1731 1847 484 2215 1520 380 34 1351 1656 1121 555 1801 2468 332 1703 1524 1234 1772 318 477 2006 289 1482 57 3 2357 2335 1564 148 1353 75 2467 270 1829 927 296 1413 2235 2287 719 456 1324 2028 404 692 1436 49 365 1492 2318 1862 1076 718 1170 1952 2207 1135 1232 1008 1327 722 1349 2134 2470 1631 577 1219 1704 1137 1335 669 1650 2168 2226 646 550 2284 1138 2440 37 2312 2372 103 1935 1194 1661 1847 484 2215 1520 1957 939 2144 12 1121 555 1801 2468 1947 2469 810 42 1772 318 477 2006 406 1754 1513 364 3 2357 2335 5 84 248 2449 585 405 1960 1581 1563 1413 2235 2287 982 87 2065 1097 517 1381 623 1072 179 1492 2318 1862 745 428 720 1952 2207 1135 10 2039 1118 722 1349 2134 2404 834 1036 1555 1729 959 301 1180 556 1473 952 256 2356 2136 1993 766 1827 1258 1131 1355 639 8 514 1316 535 1535 380 34 1351 1656 1121 555 1801 2468 1064 516 2422 1470 1288 1188 379 1587 563 67 2290 2100 2117 1431 1240 1229 1972 360 1057 2444 1674 1815 134 2262 1954 719 456 1324 2089 2365 1740 1887 21 1609 267 1172 2408 1417 221 1404 1623 196 1450 1139 1153 1515 2114 1987 481 656 1688 2092 1021 1263 1786 2064 1762 1252 268 2222 142 2315 2462 1838 2038 1844 1078 1769 181 769 1596 2399 82 514 1316 535 1535 1788 1244 506 768 1121 555 1801 2468 1947 2469 810 42 1288 1188 379 1587 1716 2321 65 649 2117 1431 1240 1229 1176 948 819 1341 2444 1674 1815 1213 1398 870 772 1913 1495 1097 517 1381 1887 21 1609 1248 1254 138 2035 643 1382 1307 175 678 1139 1153 1515 1819 711 617 656 1688 2092 1040 1149 2122 2064 1762 1252 451 2450 1559 2471 2188 102 2198 2349 136 717 2238 1710 1501 2429 1784 91 531 1253 380 34 1351 1656 1121 555 1801 2468 332 1703 1524 1234 1772 318 477 2006 563 67 2290 2100 2117 1431 1240 1229 2446 1277 1498 2392 1615 1446 2105 258 1829 927 296 1413 2235 2287 719 456 1324 2028 404 692 2244 322 2434 106 868 746 1417 221 1404 998 2276 2182 2114 1987 481 656 1688 2092 66 117 1166 1034 799 685 1358 1411 1976 958 964 1791 2315 2462 1838 1022 1152 2030 2168 2226 646 912 172 658 2014 2005 1058 1121 555 1801 2468 1947 2469 810 42 1772 318 477 2006 406 1754 1513 364 2117 1431 1240 1229 1176 948 819 1341 1615 1446 2105 258 2391 1708 1250 652 1413 2235 2287 982 87 2065 1097 517 1381 623 1072 179 106 868 746 2133 1088 981 1307 175 678 262 778 275 656 1688 2092 1040 1149 2122 1034 799 685 1557 1207 1725 958 964 1791 1370 663 31 2198 2349 136 2251 1628 2234 2356 2136 1993 2068 466 661 1185 1918 2278 1658 1270 2428 249 238 44 334 421 209 1373 1467 1561 1610 2409 280 1506 1953 554 478 1921 977 1434 378 2048 199 1062 1136 519 1994 1605 811 1329 1143 352 1526 874 1284 108 1537 788 1476 1465 144 744 1218 1578 2398 1835 2209 2020 2371 2177 303 937 2383 151 381 2166 449 1146 474 2474 2228 415 2364 1377 2116 1514 1464 2291 619 1867 163 9 2472 1340 1423 292 541 830 1968 274 2289 1003 2271 439 739 2091 146 238 44 334 421 1224 2363 155 1731 1610 2409 280 1506 1870 14 926 1014 977 1434 378 2048 332 1703 1524 1234 1994 1605 811 1329 1444 603 2051 1313 874 1284 108 1799 1205 2095 1379 423 1845 501 76 1412 1835 2209 2020 1425 349 737 2199 1438 1102 1408 533 1986 1146 474 2474 1076 718 1170 1377 2116 1514 833 936 182 1867 163 9 1625 1830 2101 800 2242 36 1038 97 523 1030 647 232 2214 158 1926 881 282 502 209 1373 1467 1561 1610 2409 280 1506 2220 83 2281 622 1747 2402 621 1159 199 1062 1136 519 1994 1605 811 1329 1214 411 1289 2202 2239 2024 1637 949 629 1622 900 1728 2341 931 1465 144 744 2022 50 1519 133 2430 2071 1094 2324 2118 937 2383 151 1648 1794 2432 2228 415 2364 1377 2116 1514 2368 1364 193 445 2405 2067 287 1955 1437 1301 538 978 292 541 830 409 1481 2145 17 1050 1365 2183 683 522 1809 115 1101 1610 2409 280 1506 1870 14 926 1014 1747 2402 621 1159 1399 1840 1848 72 1994 1605 811 1329 1444 603 2051 1313 2239 2024 1637 949 1698 1471 2040 1549 1728 2341 931 581 2148 712 501 76 1412 847 1527 938 1094 2324 2118 2297 344 832 1408 533 1986 286 1262 1701 1377 2116 1514 833 936 182 445 2405 2067 530 1755 431 1301 538 978 963 1912 1780 1038 97 523 805 1006 626 1186 1403 1621 1692 1345 954 410 1233 189 1953 554 478 1921 977 1434 378 2048 199 1062 1136 519 1994 1605 811 1329 1856 816 1455 1119 71 2237 1478 1427 1077 297 1483 2042 709 631 455 1011 1218 1578 2398 1835 2209 2020 2371 2177 303 937 2383 151 2307 195 2268 1310 229 215 2106 1320 953 821 1749 627 27 255 1906 1160 1296 1999 283 1070 2179 1142 2457 460 2045 429 1985 770 1973 1939 515 1634 1523 1876 1430 780 1003 2271 439 1853 2135 1043 1756 1046 1242 977 1434 378 2048 332 1703 1524 1234 1994 1605 811 1329 1444 603 2051 1313 71 2237 1478 1427 2446 1277 1498 2392 709 631 455 1011 924 1380 2072 395 1835 2209 2020 1425 349 737 2199 1438 1102 1408 533 1986 1310 229 215 363 503 613 2156 1048 680 827 704 128 1160 1296 1999 66 117 1166 1142 2457 460 851 1110 224 770 1973 1939 1282 2137 1269 383 1504 1958 1744 866 290 2214 158 1926 1453 489 1978 706 30 2477 199 1062 1136 519 1994 1605 811 1329 1214 411 1289 2202 2239 2024 1637 949 1077 297 1483 2042 709 631 455 1011 946 2084 234 1803 487 1636 551 288 133 2430 2071 1094 2324 2118 937 2383 151 1648 1794 2432 1633 145 1177 430 591 212 821 1749 627 979 2000 1276 283 1070 2179 1142 2457 460 731 1099 266 989 961 767 865 1782 1839 493 754 114 1876 1430 780 1873 1757 2353 2183 683 522 1841 786 205 2210 1272 2075 1994 1605 811 1329 1444 603 2051 1313 2239 2024 1637 949 1698 1471 2040 1549 709 631 455 1011 924 1380 2072 395 487 1636 551 288 852 482 1063 908 1094 2324 2118 2297 344 832 1408 533 1986 286 1262 1701 430 591 212 677 1923 1946 827 704 128 644 1209 837 1142 2457 460 851 1110 224 989 961 767 1920 1468 1583 493 754 114 2206 1171 2180 1744 866 290 2194 454 732 1692 1345 954 1956 1814 1765 1925 113 150 1224 2363 155 1731 1847 484 2215 1520 1870 14 926 1014 1271 553 1984 2057 332 1703 1524 1234 1772 318 477 2006 1444 603 2051 1313 2141 2327 2285 124 1799 1205 2095 1190 1208 897 75 2467 270 2018 1709 1265 1425 349 737 2345 1260 2115 2028 404 692 944 980 1294 1076 718 1170 1952 2207 1135 833 936 182 1727 2461 1197 1625 1830 2101 346 1098 233 1219 1704 1137 1687 728 127 1317 1361 46 620 1385 507 2104 2264 725 1847 484 2215 1520 1957 939 2144 12 1271 553 1984 2057 689 630 1530 1529 1772 318 477 2006 406 1754 1513 364 2141 2327 2285 124 1264 594 1287 186 1190 1208 897 1898 1566 905 1960 1581 1563 1500 2178 2229 2345 1260 2115 690 2270 560 623 1072 179 1044 918 1522 1952 2207 1135 10 2039 1118 1727 2461 1197 913 2412 1407 346 1098 233 480 104 1943 301 1180 556 1193 2152 2187 1676 1251 1885 40 887 2411 307 1025 540 1870 14 926 1014 1271 553 1984 2057 1399 1840 1848 72 688 213 790 2395 1444 603 2051 1313 2141 2327 2285 124 1698 1471 2040 1549 1818 684 99 1147 581 2148 712 1971 121 1585 2018 1709 1265 1629 1528 1334 2297 344 832 2049 1386 699 944 980 1294 2090 1539 2304 833 936 182 1727 2461 1197 530 1755 431 397 605 1414 963 1912 1780 0 1281 1346 1687 728 127 299 1777 526 2151 125 1718 394 174 385 2415 1611 910 1271 553 1984 2057 689 630 1530 1529 688 213 790 2395 1556 645 1874 544 2141 2327 2285 124 1264 594 1287 186 1818 684 99 1147 2384 1164 803 575 1971 121 1585 494 1879 1268 1500 2178 2229 1204 1518 2258 2049 1386 699 2012 2420 1897 1044 918 1522 462 782 2147 1727 2461 1197 913 2412 1407 397 605 1414 748 933 1109 0 1281 1346 616 1415 2139 1193 2152 2187 1145 1175 1600 2143 997 95 1517 856 2435 1975 491 2044 332 1703 1524 1234 1772 318 477 2006 1444 603 2051 1313 2141 2327 2285 124 2446 1277 1498 2392 1615 1446 2105 258 924 1380 2072 395 2052 250 60 1445 1425 349 737 2345 1260 2115 2028 404 692 944 980 1294 363 503 613 479 894 337 998 2276 2182 2160 1643 2259 66 117 1166 1034 799 685 851 1110 224 1157 1783 1106 1282 2137 1269 564 993 1670 1022 1152 2030 201 845 1116 620 1385 507 1173 1165 1352 2088 159 2406 1772 318 477 2006 406 1754 1513 364 2141 2327 2285 124 1264 594 1287 186 1615 1446 2105 258 2391 1708 1250 652 2052 250 60 1445 1693 32 2299 707 2345 1260 2115 690 2270 560 623 1072 179 1044 918 1522 479 894 337 2019 1239 921 262 778 275 1199 354 595 1034 799 685 1557 1207 1725 1157 1783 1106 1842 54 1732 564 993 1670 1037 170 2232 2251 1628 2234 1330 1569 957 40 887 2411 1356 885 1789 1005 727 1114 1444 603 2051 1313 2141 2327 2285 124 1698 1471 2040 1549 1818 684 99 1147 924 1380 2072 395 2052 250 60 1445 852 482 1063 908 934 2212 1087 356 2297 344 832 2049 1386 699 944 980 1294 2090 1539 2304 677 1923 1946 511 990 1790 2160 1643 2259 992 640 2282 851 1110 224 1157 1783 1106 1920 1468 1583 1655 557 611 2206 1171 2180 1907 2011 1797 201 845 1116 1452 1315 2350 394 174 385 1181 528 1051 965 64 2126 2141 2327 2285 124 1264 594 1287 186 1818 684 99 1147 2384 1164 803 575 2052 250 60 1445 1693 32 2299 707 934 2212 1087 356 355 1538 2443 1283 2049 1386 699 2012 2420 1897 1044 918 1522 462 782 2147 511 990 1790 1722 855 2275 1199 354 595 1977 2173 147 1157 1783 1106 1842 54 1732 1655 557 611 1053 708 1593 1907 2011 1797 1816 230 1359 1330 1569 957 1691 1245 971 1517 856 2435 1129 1369 2256 166 1663 468 0 0 3 0 1 0 4294967295 8 0 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 64 0 0 219 308 397 486 575 664 753 842 931 1020 1109 1198 1287 1376 1465 1554 1643 1732 1821 1910 1999 2088 2177 2266 2355 2444 2533 2622 2711 2800 2889 2978 3067 3156 3245 3334 3423 3512 3601 3690 3779 3868 3957 4046 4135 4224 4313 4402 4491 4580 4669 4758 4847 4936 5025 5114 5203 5292 5381 5470 5559 5648 5737 0 0 3 0 1 0 0 8 0 0 0 0 0 0 0 0 0 64 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 0 65535 8 0 65535 65535 65535 65535 65535 65535 65535 65535 64 0 0 1 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 65535 4 126 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 91 92 93 94 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 125 126 127 128 129 130 131 132 367 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 113 114 115 116 117 118 119 120 121 122 123 124 125 126 128 129 131 132 133 134 135 136 137 138 139 140 141 142 143 144 146 147 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 303 304 306 307 309 283 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 233 234 235 236 238 239 240 241 243 0 0 0 0 4 132 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 309 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 246 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 2478 2478 0 0 0 0 1 0 0 0 0 2478 0 1 2478 0 1 0 2478 0 0 1 0 1 0 0 2478 0 1 2478 0 0 0 0 0 73 23 Policy::Sequential<3,3>
DEAL::OK