const char merge_docstring[] =
- "Given two triangulations, create the triangulation that contains \n"
- "the cells of both triangulations. \n";
+ "Given two or more triangulations, create the triangulation that \n"
+ "contains the cells of given triangulations. \n";
+ const char replicate_docstring[] =
+ "Replicate a given triangulation in multiple coordinate axes. \n"
+ "This function creates a new Triangulation equal to a dim-dimensional \n"
+ "array of copies of input. \n";
+
+
+
const char distort_random_docstring[] =
"Distort the given triangulation by randomly moving around all the \n"
"vertices of the grid. The direction of movement of each vertex is \n"
"Execute both refinement and coarsening of the Triangulation. \n";
+
const char active_cells_docstring[] =
"Return the list of active cell accessors of the Triangulation. \n";
.def("merge_triangulations",
&TriangulationWrapper::merge_triangulations,
merge_docstring,
- boost::python::args("self", "triangulation_1", "triangulation_2"))
+ boost::python::args("self", "triangulations"))
.def("extrude_triangulation",
&TriangulationWrapper::extrude_triangulation,
extrude_docstring,
&TriangulationWrapper::flatten_triangulation,
flatten_triangulation_docstring,
boost::python::args("self", "tria_out"))
+ .def("replicate_triangulation",
+ &TriangulationWrapper::replicate_triangulation,
+ replicate_docstring,
+ boost::python::args("self", "tria_in", "extents"))
.def("distort_random",
&TriangulationWrapper::distort_random,
distort_random_overloads(
template <int dim, int spacedim>
void
- merge_triangulations(TriangulationWrapper &triangulation_1,
- TriangulationWrapper &triangulation_2,
- void * triangulation)
+ merge_triangulations(boost::python::list &triangulations,
+ void * triangulation)
{
Triangulation<dim, spacedim> *tria =
static_cast<Triangulation<dim, spacedim> *>(triangulation);
tria->clear();
- Triangulation<dim, spacedim> *tria_1 =
- static_cast<Triangulation<dim, spacedim> *>(
- triangulation_1.get_triangulation());
- Triangulation<dim, spacedim> *tria_2 =
- static_cast<Triangulation<dim, spacedim> *>(
- triangulation_2.get_triangulation());
- GridGenerator::merge_triangulations(*tria_1, *tria_2, *tria);
- // We need to reassign tria to triangulation because tria was cleared
- // inside merge_triangulations.
- triangulation = tria;
+
+ std::vector<const Triangulation<dim, spacedim> *> tria_ptrs;
+ size_t n_triangulations = boost::python::len(triangulations);
+ for (size_t i = 0; i < n_triangulations; ++i)
+ {
+ TriangulationWrapper &tria_wrapper =
+ boost::python::extract<TriangulationWrapper &>(triangulations[i]);
+ tria_ptrs.push_back(static_cast<const Triangulation<dim, spacedim> *>(
+ tria_wrapper.get_triangulation()));
+ }
+
+ GridGenerator::merge_triangulations(tria_ptrs, *tria);
}
+ template <int dim, int spacedim>
+ void
+ replicate_triangulation(TriangulationWrapper & tria_in,
+ const boost::python::list &extents,
+ void * tria_out)
+ {
+ Triangulation<dim, spacedim> *replicated_triangulation =
+ static_cast<Triangulation<dim, spacedim> *>(tria_out);
+ const Triangulation<dim, spacedim> *triangulation =
+ static_cast<Triangulation<dim, spacedim> *>(
+ tria_in.get_triangulation());
+ replicated_triangulation->clear();
+
+ std::vector<unsigned int> extents_vector(dim);
+ for (int d = 0; d < dim; ++d)
+ extents_vector[d] = boost::python::extract<unsigned>(extents[d]);
+
+ GridGenerator::replicate_triangulation(*triangulation,
+ extents_vector,
+ *replicated_triangulation);
+ }
+
+
+
template <int dim, int spacedim>
void
distort_random(const double factor,
void
TriangulationWrapper::merge_triangulations(
- TriangulationWrapper &triangulation_1,
- TriangulationWrapper &triangulation_2)
+ boost::python::list &triangulations)
{
- AssertThrow(
- triangulation_1.get_dim() == triangulation_2.get_dim(),
- ExcMessage(
- "Triangulation_1 and Triangulation_2 should have the same dimension."));
- AssertThrow(
- dim == triangulation_2.get_dim(),
- ExcMessage(
- "Triangulation and Triangulation_2 should have the same dimension."));
- AssertThrow(
- triangulation_1.get_spacedim() == triangulation_2.get_spacedim(),
- ExcMessage(
- "Triangulation_1 and Triangulation_2 should have the same space dimension."));
- AssertThrow(
- spacedim == triangulation_2.get_spacedim(),
- ExcMessage(
- "Triangulation and Triangulation_2 should have the same space dimension."));
+ AssertThrow(boost::python::len(triangulations) >= 2,
+ ExcMessage(
+ "You must provide at least two triangulations to merge."));
- if ((triangulation_1.get_dim() == 2) &&
- (triangulation_1.get_spacedim() == 2))
- internal::merge_triangulations<2, 2>(triangulation_1,
- triangulation_2,
- triangulation);
- else if ((triangulation_1.get_dim() == 2) &&
- (triangulation_1.get_spacedim() == 3))
- internal::merge_triangulations<2, 3>(triangulation_1,
- triangulation_2,
- triangulation);
+ size_t n_triangulations = boost::python::len(triangulations);
+ for (size_t i = 0; i < n_triangulations; ++i)
+ {
+ TriangulationWrapper &tria_wrapper =
+ boost::python::extract<TriangulationWrapper &>(triangulations[i]);
+
+ AssertThrow(dim == tria_wrapper.get_dim(),
+ ExcMessage(
+ "All triangulations must have the same dimension."));
+ AssertThrow(
+ spacedim == tria_wrapper.get_spacedim(),
+ ExcMessage("All triangulations must have the same space dimension."));
+ }
+
+ if ((dim == 2) && (spacedim == 2))
+ internal::merge_triangulations<2, 2>(triangulations, triangulation);
+ else if ((dim == 2) && (spacedim == 3))
+ internal::merge_triangulations<2, 3>(triangulations, triangulation);
else
- internal::merge_triangulations<3, 3>(triangulation_1,
- triangulation_2,
- triangulation);
+ internal::merge_triangulations<3, 3>(triangulations, triangulation);
}
+ void
+ TriangulationWrapper::replicate_triangulation(
+ TriangulationWrapper &triangulation_in,
+ boost::python::list & extents)
+ {
+ AssertThrow(
+ boost::python::len(extents) == dim,
+ ExcMessage(
+ "Size of the extents list must be equal to the triangulation dimension."));
+
+ AssertThrow((triangulation_in.get_dim() == dim) &&
+ (triangulation_in.get_spacedim() == spacedim),
+ ExcMessage(
+ "The input Triangulation must be of the same dimension"));
+
+
+ if ((dim == 2) && (spacedim == 2))
+ internal::replicate_triangulation<2, 2>(triangulation_in,
+ extents,
+ triangulation);
+ else if ((dim == 2) && (spacedim == 3))
+ internal::replicate_triangulation<2, 3>(triangulation_in,
+ extents,
+ triangulation);
+ else
+ internal::replicate_triangulation<3, 3>(triangulation_in,
+ extents,
+ triangulation);
+ }
+
+
+
void
TriangulationWrapper::distort_random(const double factor,
const bool keep_boundary)