--- /dev/null
+New: Triangulation::execute_coarsening_and_refinement() now also performs
+p-coarsening and p-refinement on all attached hp::DoFHandler objects.
+<br>
+(Marc Fehling, 2019/03/18)
--- /dev/null
+New: Function DoFCellAccessor::active_fe_index_after_p_refinement_and_coarsening()
+returns the active fe index that a cell (of a hp::DoFHandler) will have if
+p-refinement would be performed.
+<br>
+(Marc Fehling, 2019/03/18)
* Return whether the p-refinement flag is set or not.
*
* @note The DoFHandler in use has to be of type hp::DoFHandler.
+ * An exception is thrown otherwise.
*/
bool
p_refine_flag_set() const;
* for active cells.
*
* @note The DoFHandler in use has to be of type hp::DoFHandler.
+ * An exception is thrown otherwise.
*/
void
set_p_refine_flag() const;
* Clear the p-refinement flag.
*
* @note The DoFHandler in use has to be of type hp::DoFHandler.
+ * An exception is thrown otherwise.
*/
void
clear_p_refine_flag() const;
* Return whether the p-coarsening flag is set or not.
*
* @note The DoFHandler in use has to be of type hp::DoFHandler.
+ * An exception is thrown otherwise.
*/
bool
p_coarsen_flag_set() const;
* for active cells.
*
* @note The DoFHandler in use has to be of type hp::DoFHandler.
+ * An exception is thrown otherwise.
*/
void
set_p_coarsen_flag() const;
* Clear the p-coarsening flag.
*
* @note The DoFHandler in use has to be of type hp::DoFHandler.
+ * An exception is thrown otherwise.
*/
void
clear_p_coarsen_flag() const;
+ /**
+ * Returns the active_fe_index that this cell would have if refinement would
+ * happen.
+ *
+ * Prediction is based on the current p-refinement flags set on this cell,
+ * returning FECollection::next_in_hierarchy() for p-refinement,
+ * FECollection::previous_in_hierarchy() for p-coarsening,
+ * or the current active_fe_index otherwise.
+ *
+ * If this cell is additionally flagged for h-refinement or h-coarsening,
+ * these predicted active_fe_indices will be used to determine the finite
+ * elements on the refined and coarsened cells. For h-refinement, the
+ * predicted active_fe_index will be distributed on its children. For
+ * h-coarsening, the predicted active_fe_index of this cell and its siblings
+ * will be used to determine the active_fe_index on parent cell.
+ *
+ * @note The DoFHandler in use has to be of type hp::DoFHandler.
+ * An exception is thrown otherwise.
+ */
+ unsigned int
+ active_fe_index_after_p_refinement_and_coarsening() const;
/**
* @}
*/
}
+
+template <typename DoFHandlerType, bool level_dof_access>
+inline unsigned int
+DoFCellAccessor<DoFHandlerType, level_dof_access>::
+ active_fe_index_after_p_refinement_and_coarsening() const
+{
+ if (p_refine_flag_set())
+ {
+ Assert(!p_coarsen_flag_set(), ExcInternalError());
+ return this->get_dof_handler().get_fe_collection().next_in_hierarchy(
+ active_fe_index());
+ }
+ else if (p_coarsen_flag_set())
+ {
+ Assert(!p_refine_flag_set(), ExcInternalError());
+ return this->get_dof_handler().get_fe_collection().previous_in_hierarchy(
+ active_fe_index());
+ }
+
+ return active_fe_index();
+}
+
+
DEAL_II_NAMESPACE_CLOSE
#endif
/**
* Whenever the underlying triangulation changes by either
- * refinement/coarsening and serialization, the active_fe_index of cells
+ * 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 active FE index of
- * cells that will be refined.
+ * 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 active FE index of
- * parent cells that will remain after coarsening.
+ * 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;
* the parent cell. See documentation of
* hp::FECollection::find_common_subspace() and
* hp::FECollection::find_dominated_fe() 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
{
// 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->active_fe_index()});
+ {cell,
+ cell
+ ->active_fe_index_after_p_refinement_and_coarsening()});
}
else if (cell->coarsen_flag_set())
{
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 dominating 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();
ExcInternalError());
fe_indices_children.insert(
- parent->child(child_index)->active_fe_index());
+ parent->child(child_index)
+ ->active_fe_index_after_p_refinement_and_coarsening());
}
Assert(!fe_indices_children.empty(),
ExcInternalError());
{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->p_refine_flag_set() || cell->p_coarsen_flag_set())
+ fe_transfer->persisting_cells_fe_index.insert(
+ {cell,
+ cell
+ ->active_fe_index_after_p_refinement_and_coarsening()});
+ }
}
}
{
const auto &fe_transfer = dof_handler.active_fe_index_transfer;
+ // Set active_fe_indices on persisting cells.
+ for (const auto &pair : fe_transfer->persisting_cells_fe_index)
+ {
+ const auto &cell = pair.first;
+
+ if (cell->is_locally_owned())
+ {
+ Assert(cell->active(), ExcInternalError());
+ cell->set_active_fe_index(pair.second);
+ }
+ }
+
// Distribute active_fe_indices from all refined cells on their
// respective children.
for (const auto &pair : fe_transfer->refined_cells_fe_index)
}
Assert(levels.size() == tria->n_levels(), ExcInternalError());
-
- // Resize active_fe_indices vectors. use zero indicator to extend
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);
- levels[i]->p_refine_flags.resize(tria->n_raw_cells(i), false);
- levels[i]->p_coarsen_flags.resize(tria->n_raw_cells(i), false);
+
+ // Resize p-flags vectors. Clear all flags after refinement finished.
+ levels[i]->p_refine_flags.assign(tria->n_raw_cells(i), false);
+ levels[i]->p_coarsen_flags.assign(tria->n_raw_cells(i), false);
}
}
// Gather all current active_fe_indices.
get_active_fe_indices(active_fe_index_transfer->active_fe_indices);
- // Overwrite values of cells that will be coarsened with the
- // active_fe_index determined beforehand for their parent.
+ // Overwrite active_fe_indices of cells that change by either
+ // h/p refinement/coarsening.
+ for (const auto &pair :
+ active_fe_index_transfer->persisting_cells_fe_index)
+ active_fe_index_transfer
+ ->active_fe_indices[pair.first->active_cell_index()] = pair.second;
+
+ for (const auto &pair :
+ active_fe_index_transfer->refined_cells_fe_index)
+ active_fe_index_transfer
+ ->active_fe_indices[pair.first->active_cell_index()] = pair.second;
+
for (const auto &pair :
active_fe_index_transfer->coarsened_cells_fe_index)
for (unsigned int child_index = 0;
--- /dev/null
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 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.
+//
+// ---------------------------------------------------------------------
+
+
+
+// Check execution of p-refinement and p-coarsening via
+// Triangulation::execute_coarsening_and_refinement()
+
+
+#include <deal.II/fe/fe_q.h>
+
+#include <deal.II/grid/grid_generator.h>
+#include <deal.II/grid/tria.h>
+
+#include <deal.II/hp/dof_handler.h>
+#include <deal.II/hp/fe_collection.h>
+
+#include "../tests.h"
+
+
+
+template <int dim>
+void
+test()
+{
+ Triangulation<dim> tria;
+ GridGenerator::hyper_cube(tria);
+ tria.refine_global(1);
+
+ hp::FECollection<dim> fe;
+ for (unsigned int i = 0; i < 3; ++i)
+ fe.push_back(FE_Q<dim>(i + 1));
+
+ hp::DoFHandler<dim> dh(tria);
+ dh.set_fe(fe);
+
+ // set default active_fe_index
+ for (const auto &cell : dh.active_cell_iterators())
+ cell->set_active_fe_index(1);
+
+ // set refine flags at least once
+ auto cell = dh.begin_active();
+ cell->set_p_refine_flag();
+ (++cell)->set_p_coarsen_flag();
+
+ tria.execute_coarsening_and_refinement();
+
+ // check if all flags were cleared and verify fe_indices
+ for (const auto &cell : dh.active_cell_iterators())
+ {
+ Assert(!cell->p_refine_flag_set() && !cell->p_coarsen_flag_set(),
+ ExcInternalError());
+
+ deallog << "cell:" << cell->id().to_string()
+ << ", fe_index:" << cell->active_fe_index() << std::endl;
+ }
+}
+
+
+int
+main()
+{
+ initlog();
+
+ deallog.push("1d");
+ test<1>();
+ deallog.pop();
+
+ deallog.push("2d");
+ test<2>();
+ deallog.pop();
+
+ deallog.push("3d");
+ test<3>();
+ deallog.pop();
+
+ deallog << "OK" << std::endl;
+}
--- /dev/null
+
+DEAL:1d::cell:0_1:0, fe_index:2
+DEAL:1d::cell:0_1:1, fe_index:0
+DEAL:2d::cell:0_1:0, fe_index:2
+DEAL:2d::cell:0_1:1, fe_index:0
+DEAL:2d::cell:0_1:2, fe_index:1
+DEAL:2d::cell:0_1:3, fe_index:1
+DEAL:3d::cell:0_1:0, fe_index:2
+DEAL:3d::cell:0_1:1, fe_index:0
+DEAL:3d::cell:0_1:2, fe_index:1
+DEAL:3d::cell:0_1:3, fe_index:1
+DEAL:3d::cell:0_1:4, fe_index:1
+DEAL:3d::cell:0_1:5, fe_index:1
+DEAL:3d::cell:0_1:6, fe_index:1
+DEAL:3d::cell:0_1:7, fe_index:1
+DEAL::OK
--- /dev/null
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 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.
+//
+// ---------------------------------------------------------------------
+
+
+
+// Check execution of p-refinement and p-coarsening via
+// parallel::distributed::Triangulation::execute_coarsening_and_refinement()
+
+
+#include <deal.II/distributed/tria.h>
+
+#include <deal.II/fe/fe_q.h>
+
+#include <deal.II/grid/grid_generator.h>
+
+#include <deal.II/hp/dof_handler.h>
+#include <deal.II/hp/fe_collection.h>
+
+#include "../tests.h"
+
+
+
+template <int dim>
+void
+test()
+{
+ parallel::distributed::Triangulation<dim> tria(MPI_COMM_WORLD);
+ GridGenerator::subdivided_hyper_cube(tria, 2);
+ tria.refine_global(1);
+
+ hp::FECollection<dim> fe;
+ for (unsigned int i = 0; i < 3; ++i)
+ fe.push_back(FE_Q<dim>(i + 1));
+
+ hp::DoFHandler<dim> dh(tria);
+ dh.set_fe(fe);
+
+ // set default active_fe_index and refine flags
+ bool flag = false;
+ for (const auto &cell : dh.active_cell_iterators())
+ if (cell->is_locally_owned())
+ {
+ cell->set_active_fe_index(1);
+
+ if (flag)
+ {
+ cell->set_p_refine_flag();
+ flag = false;
+ }
+ else
+ {
+ cell->set_p_coarsen_flag();
+ flag = true;
+ }
+ }
+
+ tria.execute_coarsening_and_refinement();
+
+ // check if all flags were cleared and verify fe_indices
+ for (const auto &cell : dh.active_cell_iterators())
+ if (cell->is_locally_owned())
+ {
+ Assert(!cell->p_refine_flag_set() && !cell->p_coarsen_flag_set(),
+ ExcInternalError());
+
+ deallog << "cell:" << cell->id().to_string()
+ << ", fe_index:" << cell->active_fe_index() << std::endl;
+ }
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1);
+ MPILogInitAll log;
+
+ deallog.push("2d");
+ test<2>();
+ deallog.pop();
+
+ deallog.push("3d");
+ test<3>();
+ deallog.pop();
+
+ deallog << "OK" << std::endl;
+}
--- /dev/null
+
+DEAL:0:2d::cell:0_1:0, fe_index:0
+DEAL:0:2d::cell:0_1:1, fe_index:2
+DEAL:0:2d::cell:0_1:2, fe_index:0
+DEAL:0:2d::cell:0_1:3, fe_index:2
+DEAL:0:2d::cell:1_1:0, fe_index:0
+DEAL:0:2d::cell:1_1:1, fe_index:2
+DEAL:0:2d::cell:1_1:2, fe_index:0
+DEAL:0:2d::cell:1_1:3, fe_index:2
+DEAL:0:2d::cell:2_1:0, fe_index:0
+DEAL:0:2d::cell:2_1:1, fe_index:2
+DEAL:0:2d::cell:2_1:2, fe_index:0
+DEAL:0:2d::cell:2_1:3, fe_index:2
+DEAL:0:2d::cell:3_1:0, fe_index:0
+DEAL:0:2d::cell:3_1:1, fe_index:2
+DEAL:0:2d::cell:3_1:2, fe_index:0
+DEAL:0:2d::cell:3_1:3, fe_index:2
+DEAL:0:3d::cell:0_1:0, fe_index:0
+DEAL:0:3d::cell:0_1:1, fe_index:2
+DEAL:0:3d::cell:0_1:2, fe_index:0
+DEAL:0:3d::cell:0_1:3, fe_index:2
+DEAL:0:3d::cell:0_1:4, fe_index:0
+DEAL:0:3d::cell:0_1:5, fe_index:2
+DEAL:0:3d::cell:0_1:6, fe_index:0
+DEAL:0:3d::cell:0_1:7, fe_index:2
+DEAL:0:3d::cell:1_1:0, fe_index:0
+DEAL:0:3d::cell:1_1:1, fe_index:2
+DEAL:0:3d::cell:1_1:2, fe_index:0
+DEAL:0:3d::cell:1_1:3, fe_index:2
+DEAL:0:3d::cell:1_1:4, fe_index:0
+DEAL:0:3d::cell:1_1:5, fe_index:2
+DEAL:0:3d::cell:1_1:6, fe_index:0
+DEAL:0:3d::cell:1_1:7, fe_index:2
+DEAL:0:3d::cell:2_1:0, fe_index:0
+DEAL:0:3d::cell:2_1:1, fe_index:2
+DEAL:0:3d::cell:2_1:2, fe_index:0
+DEAL:0:3d::cell:2_1:3, fe_index:2
+DEAL:0:3d::cell:2_1:4, fe_index:0
+DEAL:0:3d::cell:2_1:5, fe_index:2
+DEAL:0:3d::cell:2_1:6, fe_index:0
+DEAL:0:3d::cell:2_1:7, fe_index:2
+DEAL:0:3d::cell:3_1:0, fe_index:0
+DEAL:0:3d::cell:3_1:1, fe_index:2
+DEAL:0:3d::cell:3_1:2, fe_index:0
+DEAL:0:3d::cell:3_1:3, fe_index:2
+DEAL:0:3d::cell:3_1:4, fe_index:0
+DEAL:0:3d::cell:3_1:5, fe_index:2
+DEAL:0:3d::cell:3_1:6, fe_index:0
+DEAL:0:3d::cell:3_1:7, fe_index:2
+DEAL:0:3d::cell:4_1:0, fe_index:0
+DEAL:0:3d::cell:4_1:1, fe_index:2
+DEAL:0:3d::cell:4_1:2, fe_index:0
+DEAL:0:3d::cell:4_1:3, fe_index:2
+DEAL:0:3d::cell:4_1:4, fe_index:0
+DEAL:0:3d::cell:4_1:5, fe_index:2
+DEAL:0:3d::cell:4_1:6, fe_index:0
+DEAL:0:3d::cell:4_1:7, fe_index:2
+DEAL:0:3d::cell:5_1:0, fe_index:0
+DEAL:0:3d::cell:5_1:1, fe_index:2
+DEAL:0:3d::cell:5_1:2, fe_index:0
+DEAL:0:3d::cell:5_1:3, fe_index:2
+DEAL:0:3d::cell:5_1:4, fe_index:0
+DEAL:0:3d::cell:5_1:5, fe_index:2
+DEAL:0:3d::cell:5_1:6, fe_index:0
+DEAL:0:3d::cell:5_1:7, fe_index:2
+DEAL:0:3d::cell:6_1:0, fe_index:0
+DEAL:0:3d::cell:6_1:1, fe_index:2
+DEAL:0:3d::cell:6_1:2, fe_index:0
+DEAL:0:3d::cell:6_1:3, fe_index:2
+DEAL:0:3d::cell:6_1:4, fe_index:0
+DEAL:0:3d::cell:6_1:5, fe_index:2
+DEAL:0:3d::cell:6_1:6, fe_index:0
+DEAL:0:3d::cell:6_1:7, fe_index:2
+DEAL:0:3d::cell:7_1:0, fe_index:0
+DEAL:0:3d::cell:7_1:1, fe_index:2
+DEAL:0:3d::cell:7_1:2, fe_index:0
+DEAL:0:3d::cell:7_1:3, fe_index:2
+DEAL:0:3d::cell:7_1:4, fe_index:0
+DEAL:0:3d::cell:7_1:5, fe_index:2
+DEAL:0:3d::cell:7_1:6, fe_index:0
+DEAL:0:3d::cell:7_1:7, fe_index:2
+DEAL:0::OK
--- /dev/null
+
+DEAL:0:2d::cell:0_1:0, fe_index:0
+DEAL:0:2d::cell:0_1:1, fe_index:2
+DEAL:0:2d::cell:0_1:2, fe_index:0
+DEAL:0:2d::cell:0_1:3, fe_index:2
+DEAL:0:3d::cell:0_1:0, fe_index:0
+DEAL:0:3d::cell:0_1:1, fe_index:2
+DEAL:0:3d::cell:0_1:2, fe_index:0
+DEAL:0:3d::cell:0_1:3, fe_index:2
+DEAL:0:3d::cell:0_1:4, fe_index:0
+DEAL:0:3d::cell:0_1:5, fe_index:2
+DEAL:0:3d::cell:0_1:6, fe_index:0
+DEAL:0:3d::cell:0_1:7, fe_index:2
+DEAL:0:3d::cell:1_1:0, fe_index:0
+DEAL:0:3d::cell:1_1:1, fe_index:2
+DEAL:0:3d::cell:1_1:2, fe_index:0
+DEAL:0:3d::cell:1_1:3, fe_index:2
+DEAL:0:3d::cell:1_1:4, fe_index:0
+DEAL:0:3d::cell:1_1:5, fe_index:2
+DEAL:0:3d::cell:1_1:6, fe_index:0
+DEAL:0:3d::cell:1_1:7, fe_index:2
+DEAL:0:3d::cell:2_1:0, fe_index:0
+DEAL:0:3d::cell:2_1:1, fe_index:2
+DEAL:0:3d::cell:2_1:2, fe_index:0
+DEAL:0:3d::cell:2_1:3, fe_index:2
+DEAL:0:3d::cell:2_1:4, fe_index:0
+DEAL:0:3d::cell:2_1:5, fe_index:2
+DEAL:0:3d::cell:2_1:6, fe_index:0
+DEAL:0:3d::cell:2_1:7, fe_index:2
+DEAL:0::OK
+
+DEAL:1:2d::cell:1_1:0, fe_index:0
+DEAL:1:2d::cell:1_1:1, fe_index:2
+DEAL:1:2d::cell:1_1:2, fe_index:0
+DEAL:1:2d::cell:1_1:3, fe_index:2
+DEAL:1:2d::cell:2_1:0, fe_index:0
+DEAL:1:2d::cell:2_1:1, fe_index:2
+DEAL:1:2d::cell:2_1:2, fe_index:0
+DEAL:1:2d::cell:2_1:3, fe_index:2
+DEAL:1:3d::cell:3_1:0, fe_index:0
+DEAL:1:3d::cell:3_1:1, fe_index:2
+DEAL:1:3d::cell:3_1:2, fe_index:0
+DEAL:1:3d::cell:3_1:3, fe_index:2
+DEAL:1:3d::cell:3_1:4, fe_index:0
+DEAL:1:3d::cell:3_1:5, fe_index:2
+DEAL:1:3d::cell:3_1:6, fe_index:0
+DEAL:1:3d::cell:3_1:7, fe_index:2
+DEAL:1:3d::cell:4_1:0, fe_index:0
+DEAL:1:3d::cell:4_1:1, fe_index:2
+DEAL:1:3d::cell:4_1:2, fe_index:0
+DEAL:1:3d::cell:4_1:3, fe_index:2
+DEAL:1:3d::cell:4_1:4, fe_index:0
+DEAL:1:3d::cell:4_1:5, fe_index:2
+DEAL:1:3d::cell:4_1:6, fe_index:0
+DEAL:1:3d::cell:4_1:7, fe_index:2
+DEAL:1::OK
+
+
+DEAL:2:2d::cell:3_1:0, fe_index:0
+DEAL:2:2d::cell:3_1:1, fe_index:2
+DEAL:2:2d::cell:3_1:2, fe_index:0
+DEAL:2:2d::cell:3_1:3, fe_index:2
+DEAL:2:3d::cell:5_1:0, fe_index:0
+DEAL:2:3d::cell:5_1:1, fe_index:2
+DEAL:2:3d::cell:5_1:2, fe_index:0
+DEAL:2:3d::cell:5_1:3, fe_index:2
+DEAL:2:3d::cell:5_1:4, fe_index:0
+DEAL:2:3d::cell:5_1:5, fe_index:2
+DEAL:2:3d::cell:5_1:6, fe_index:0
+DEAL:2:3d::cell:5_1:7, fe_index:2
+DEAL:2:3d::cell:6_1:0, fe_index:0
+DEAL:2:3d::cell:6_1:1, fe_index:2
+DEAL:2:3d::cell:6_1:2, fe_index:0
+DEAL:2:3d::cell:6_1:3, fe_index:2
+DEAL:2:3d::cell:6_1:4, fe_index:0
+DEAL:2:3d::cell:6_1:5, fe_index:2
+DEAL:2:3d::cell:6_1:6, fe_index:0
+DEAL:2:3d::cell:6_1:7, fe_index:2
+DEAL:2:3d::cell:7_1:0, fe_index:0
+DEAL:2:3d::cell:7_1:1, fe_index:2
+DEAL:2:3d::cell:7_1:2, fe_index:0
+DEAL:2:3d::cell:7_1:3, fe_index:2
+DEAL:2:3d::cell:7_1:4, fe_index:0
+DEAL:2:3d::cell:7_1:5, fe_index:2
+DEAL:2:3d::cell:7_1:6, fe_index:0
+DEAL:2:3d::cell:7_1:7, fe_index:2
+DEAL:2::OK
+
--- /dev/null
+
+DEAL:0:2d::cell:0_1:0, fe_index:0
+DEAL:0:2d::cell:0_1:1, fe_index:2
+DEAL:0:2d::cell:0_1:2, fe_index:0
+DEAL:0:2d::cell:0_1:3, fe_index:2
+DEAL:0:3d::cell:0_1:0, fe_index:0
+DEAL:0:3d::cell:0_1:1, fe_index:2
+DEAL:0:3d::cell:0_1:2, fe_index:0
+DEAL:0:3d::cell:0_1:3, fe_index:2
+DEAL:0:3d::cell:0_1:4, fe_index:0
+DEAL:0:3d::cell:0_1:5, fe_index:2
+DEAL:0:3d::cell:0_1:6, fe_index:0
+DEAL:0:3d::cell:0_1:7, fe_index:2
+DEAL:0::OK
+
+DEAL:1:3d::cell:1_1:0, fe_index:0
+DEAL:1:3d::cell:1_1:1, fe_index:2
+DEAL:1:3d::cell:1_1:2, fe_index:0
+DEAL:1:3d::cell:1_1:3, fe_index:2
+DEAL:1:3d::cell:1_1:4, fe_index:0
+DEAL:1:3d::cell:1_1:5, fe_index:2
+DEAL:1:3d::cell:1_1:6, fe_index:0
+DEAL:1:3d::cell:1_1:7, fe_index:2
+DEAL:1::OK
+
+
+DEAL:2:2d::cell:1_1:0, fe_index:0
+DEAL:2:2d::cell:1_1:1, fe_index:2
+DEAL:2:2d::cell:1_1:2, fe_index:0
+DEAL:2:2d::cell:1_1:3, fe_index:2
+DEAL:2:3d::cell:2_1:0, fe_index:0
+DEAL:2:3d::cell:2_1:1, fe_index:2
+DEAL:2:3d::cell:2_1:2, fe_index:0
+DEAL:2:3d::cell:2_1:3, fe_index:2
+DEAL:2:3d::cell:2_1:4, fe_index:0
+DEAL:2:3d::cell:2_1:5, fe_index:2
+DEAL:2:3d::cell:2_1:6, fe_index:0
+DEAL:2:3d::cell:2_1:7, fe_index:2
+DEAL:2::OK
+
+
+DEAL:3:3d::cell:3_1:0, fe_index:0
+DEAL:3:3d::cell:3_1:1, fe_index:2
+DEAL:3:3d::cell:3_1:2, fe_index:0
+DEAL:3:3d::cell:3_1:3, fe_index:2
+DEAL:3:3d::cell:3_1:4, fe_index:0
+DEAL:3:3d::cell:3_1:5, fe_index:2
+DEAL:3:3d::cell:3_1:6, fe_index:0
+DEAL:3:3d::cell:3_1:7, fe_index:2
+DEAL:3::OK
+
+
+DEAL:4:2d::cell:2_1:0, fe_index:0
+DEAL:4:2d::cell:2_1:1, fe_index:2
+DEAL:4:2d::cell:2_1:2, fe_index:0
+DEAL:4:2d::cell:2_1:3, fe_index:2
+DEAL:4:3d::cell:4_1:0, fe_index:0
+DEAL:4:3d::cell:4_1:1, fe_index:2
+DEAL:4:3d::cell:4_1:2, fe_index:0
+DEAL:4:3d::cell:4_1:3, fe_index:2
+DEAL:4:3d::cell:4_1:4, fe_index:0
+DEAL:4:3d::cell:4_1:5, fe_index:2
+DEAL:4:3d::cell:4_1:6, fe_index:0
+DEAL:4:3d::cell:4_1:7, fe_index:2
+DEAL:4::OK
+
+
+DEAL:5:3d::cell:5_1:0, fe_index:0
+DEAL:5:3d::cell:5_1:1, fe_index:2
+DEAL:5:3d::cell:5_1:2, fe_index:0
+DEAL:5:3d::cell:5_1:3, fe_index:2
+DEAL:5:3d::cell:5_1:4, fe_index:0
+DEAL:5:3d::cell:5_1:5, fe_index:2
+DEAL:5:3d::cell:5_1:6, fe_index:0
+DEAL:5:3d::cell:5_1:7, fe_index:2
+DEAL:5::OK
+
+
+DEAL:6:2d::cell:3_1:0, fe_index:0
+DEAL:6:2d::cell:3_1:1, fe_index:2
+DEAL:6:2d::cell:3_1:2, fe_index:0
+DEAL:6:2d::cell:3_1:3, fe_index:2
+DEAL:6:3d::cell:6_1:0, fe_index:0
+DEAL:6:3d::cell:6_1:1, fe_index:2
+DEAL:6:3d::cell:6_1:2, fe_index:0
+DEAL:6:3d::cell:6_1:3, fe_index:2
+DEAL:6:3d::cell:6_1:4, fe_index:0
+DEAL:6:3d::cell:6_1:5, fe_index:2
+DEAL:6:3d::cell:6_1:6, fe_index:0
+DEAL:6:3d::cell:6_1:7, fe_index:2
+DEAL:6::OK
+
+
+DEAL:7:3d::cell:7_1:0, fe_index:0
+DEAL:7:3d::cell:7_1:1, fe_index:2
+DEAL:7:3d::cell:7_1:2, fe_index:0
+DEAL:7:3d::cell:7_1:3, fe_index:2
+DEAL:7:3d::cell:7_1:4, fe_index:0
+DEAL:7:3d::cell:7_1:5, fe_index:2
+DEAL:7:3d::cell:7_1:6, fe_index:0
+DEAL:7:3d::cell:7_1:7, fe_index:2
+DEAL:7::OK
+