<h3>Specific improvements</h3>
<ol>
+ <li>New: DoFTools::make_periodicity_constraints and
+ GridTools::collect_periodic_faces now take a rotation matrix as optional
+ argument that describes how to rotate vector valued components of an
+ FESystem.
+ <br>
+ (Daniel Arndt, Matthias Maier, 2014/02/21)
+
<li>Improved: DoFRenumbering::Cuthill_McKee can now run with distributed
triangulations with the renumbering only done within each processor's
subdomain.
* denote which components of the finite element space shall be
* constrained with periodic boundary conditions. If it is left as
* specified by the default value all components are constrained. If it
- * is different from the default value, it is assumed that the number
- * of entries equals the number of components the finite element. This
- * can be used to enforce periodicity in only one variable in a system
- * of equations.
+ * is different from the default value, it is assumed that the number of
+ * entries equals the number of components of the finite element. This
+ * can be used to enforce periodicity in only one variable in a system of
+ * equations.
*
* @p face_orientation, @p face_flip and @p face_rotation describe an
* orientation that should be applied to @p face_1 prior to matching and
* and any combination of that...
* @endcode
*
- * More information on the topic can be found in the
- * @ref GlossFaceOrientation "glossary" article.
+ * The optional parameter @p rotation is a rotation matrix that is
+ * applied to all vector valued components of an FESystem on @p face_1
+ * prior to periodically constraining them to the DoFs of @p face_2.
*
- * @note For DoFHandler objects that are built on a
- * parallel::distributed::Triangulation object
- * parallel::distributed::Triangulation::add_periodicity has to be called
- * before.
+ * Detailed information can be found in the @see @ref
+ * GlossPeriodicConstraints "Glossary entry on periodic boundary
+ * conditions".
*
- * @author Matthias Maier, 2012
+ * @todo: Reference to soon be written example step and glossary article.
+ *
+ * @author Matthias Maier, 2012, 2014
*/
template<typename FaceIterator>
void
const ComponentMask &component_mask = ComponentMask(),
const bool face_orientation = true,
const bool face_flip = false,
- const bool face_rotation = false);
+ const bool face_rotation = false,
+ const FullMatrix<double> &rotation = IdentityMatrix(FaceIterator::space_dimension));
+
+
+
+ /**
+ * Insert the (algebraic) constraints due to periodic boundary
+ * conditions into a ConstraintMatrix @p constraint_matrix.
+ *
+ * This is the main high level interface for above low level variant of
+ * make_periodicity_constraints. It takes an std::vector @p
+ * periodic_faces as argument and applies above
+ * make_periodicity_constraints on each entry. The std::vector @p
+ * periodic_faces can be created by GridTools::collect_periodic_faces.
+ *
+ * @note For DoFHandler objects that are built on a
+ * parallel::distributed::Triangulation object
+ * parallel::distributed::Triangulation::add_periodicity has to be called
+ * before.
+ *
+ * @see @ref GlossPeriodicConstraints "Glossary entry on periodic
+ * boundary conditions" for further information.
+ *
+ * @author Daniel Arndt, Matthias Maier, 2013, 2014
+ */
+ template<typename DH>
+ void
+ make_periodicity_constraints
+ (const std::vector<GridTools::PeriodicFacePair<typename DH::cell_iterator> >
+ &periodic_faces,
+ dealii::ConstraintMatrix &constraint_matrix,
+ const ComponentMask &component_mask = ComponentMask());
* conditions into a ConstraintMatrix @p constraint_matrix.
*
* This function serves as a high level interface for the
- * make_periodicity_constraints function that takes face_iterator
- * arguments.
+ * make_periodicity_constraints function.
*
* Define a 'first' boundary as all boundary faces having boundary_id
* @p b_id1 and a 'second' boundary consisting of all faces belonging
* function will be used for which the respective flag was set in the
* component mask.
*
- * @note For DoFHandler objects that are built on a
- * parallel::distributed::Triangulation object
- * parallel::distributed::Triangulation::add_periodicity has to be called
- * before.
+ * @note: This function is a convenience wrapper. It internally calls
+ * GridTools::collect_periodic_faces with the supplied paramaters and
+ * feeds the output to above make_periodicity_constraints variant. If you
+ * need more functionality use GridTools::collect_periodic_faces
+ * directly.
*
- * @see @ref GlossBoundaryIndicator "Glossary entry on boundary indicators"
+ * @see @ref GlossPeriodicConstraints "Glossary entry on periodic
+ * boundary conditions" for further information.
*
* @author Matthias Maier, 2012
*/
const ComponentMask &component_mask = ComponentMask());
- /**
- * Same as above but with an optional argument @p offset.
- *
- * The @p offset is a vector tangential to the faces that is added to
- * the location of vertices of the 'first' boundary when attempting to
- * match them to the corresponding vertices of the 'second' boundary via
- * @p orthogonal_equality. This can be used to implement conditions such
- * as $u(0,y)=u(1,y+1)$.
- *
- * @note For DoFHandler objects that are built on a
- * parallel::distributed::Triangulation object
- * parallel::distributed::Triangulation::add_periodicity has to be called
- * before.
- *
- * @see @ref GlossBoundaryIndicator "Glossary entry on boundary indicators"
- *
- * @author Daniel Arndt, 2013, Matthias Maier, 2012
- */
- template<typename DH>
- void
- make_periodicity_constraints
- (const DH &dof_handler,
- const types::boundary_id b_id1,
- const types::boundary_id b_id2,
- const int direction,
- dealii::Tensor<1,DH::space_dimension> &offset,
- dealii::ConstraintMatrix &constraint_matrix,
- const ComponentMask &component_mask = ComponentMask());
-
/**
* This compatibility version of make_periodicity_constraints only works
* meshes with cells not in @ref GlossFaceOrientation
* "standard orientation".
*
- * @note For DoFHandler objects that are built on a
- * parallel::distributed::Triangulation object
- * parallel::distributed::Triangulation::add_periodicity has to be called
- * before.
+ * @note: This function is a convenience wrapper. It internally calls
+ * GridTools::collect_periodic_faces with the supplied paramaters and
+ * feeds the output to above make_periodicity_constraints variant. If you
+ * need more functionality use GridTools::collect_periodic_faces
+ * directly.
*
- * @see @ref GlossBoundaryIndicator "Glossary entry on boundary indicators"
+ * @see @ref GlossPeriodicConstraints "Glossary entry on periodic
+ * boundary conditions" for further information.
*/
template<typename DH>
void
const ComponentMask &component_mask = ComponentMask());
+
/**
- * Same as above but with an optional argument @p offset.
- *
* The @p offset is a vector tangential to the faces that is added to
* the location of vertices of the 'first' boundary when attempting to
* match them to the corresponding vertices of the 'second' boundary via
* @p orthogonal_equality. This can be used to implement conditions such
* as $u(0,y)=u(1,y+1)$.
*
- * @note This version of make_periodicity_constraints will not work on
- * meshes with cells not in @ref GlossFaceOrientation
- * "standard orientation".
- *
- * @note For DoFHandler objects that are built on a
- * parallel::distributed::Triangulation object
- * parallel::distributed::Triangulation::add_periodicity has to be called
- * before.
- *
- * @see @ref GlossBoundaryIndicator "Glossary entry on boundary indicators"
+ * @deprecated This function is deprecated. Use
+ * GridTools::collect_periodic_faces in conjunction with
+ * make_periodicity_constraints instead.
*/
template<typename DH>
void
make_periodicity_constraints
(const DH &dof_handler,
- const types::boundary_id b_id,
+ const types::boundary_id b_id1,
+ const types::boundary_id b_id2,
const int direction,
dealii::Tensor<1,DH::space_dimension> &offset,
dealii::ConstraintMatrix &constraint_matrix,
- const ComponentMask &component_mask = ComponentMask());
+ const ComponentMask &component_mask = ComponentMask()) DEAL_II_DEPRECATED;
+
/**
- * Same as above but the periodicity information is given by
- * @p periodic_faces. This std::vector can be created by
- * GridTools::collect_periodic_faces.
+ * The @p offset is a vector tangential to the faces that is added to
+ * the location of vertices of the 'first' boundary when attempting to
+ * match them to the corresponding vertices of the 'second' boundary via
+ * @p orthogonal_equality. This can be used to implement conditions such
+ * as $u(0,y)=u(1,y+1)$.
*
- * @note For DoFHandler objects that are built on a
- * parallel::distributed::Triangulation object
- * parallel::distributed::Triangulation::add_periodicity has to be called
- * before.
+ * @note This version of make_periodicity_constraints will not work on
+ * meshes with cells not in @ref GlossFaceOrientation
+ * "standard orientation".
+ *
+ * @deprecated This function is deprecated. Use
+ * GridTools::collect_periodic_faces in conjunction with
+ * make_periodicity_constraints instead.
*/
template<typename DH>
void
make_periodicity_constraints
- (const std::vector<GridTools::PeriodicFacePair<typename DH::cell_iterator> >
- &periodic_faces,
- dealii::ConstraintMatrix &constraint_matrix,
- const ComponentMask &component_mask = ComponentMask());
+ (const DH &dof_handler,
+ const types::boundary_id b_id,
+ const int direction,
+ dealii::Tensor<1,DH::space_dimension> &offset,
+ dealii::ConstraintMatrix &constraint_matrix,
+ const ComponentMask &component_mask = ComponentMask()) DEAL_II_DEPRECATED;
//@}
const std::set<types::boundary_id> &boundary_ids
= std::set<types::boundary_id>());
+
/**
- * Data type that provides all the information that is needed
- * to create periodicity constraints and a periodic p4est forest
- * with respect to two periodic cell faces
+ * Data type that provides all information necessary to create
+ * periodicity constraints and a periodic p4est forest with respect to
+ * two 'periodic' cell faces.
*/
template<typename CellIterator>
struct PeriodicFacePair
{
+ /**
+ * the cells associated with the two 'periodic' faces
+ */
CellIterator cell[2];
+
+ /**
+ * the local face indices (with respect to the specified cells) of the
+ * two 'periodic' faces
+ */
unsigned int face_idx[2];
+
+ /**
+ * the relative orientation of the first face with respect to the
+ * second face as described in orthogonal_equality and
+ * make_periodicity_constraints (and stored as a bitset).
+ */
std::bitset<3> orientation;
+
+ /**
+ * a rotation matrix that describes how vector valued DoFs of the first face
+ * should be rotated prior to constraining to the DoFs of the second
+ * face, see make_periodicity_constraints.
+ */
+ FullMatrix<double> rotation;
};
+
/**
* An orthogonal equality test for faces.
*
* them to the corresponding vertices of the 'second' boundary. This can
* be used to implement conditions such as $u(0,y)=u(1,y+1)$.
*
+ * Optionally a rotation matrix @p rotation can be specified that
+ * describes how vector valued DoFs of the first boundary @p b_id1 should
+ * be rotated prior to constraining to the DoFs of the second boundary @p
+ * b_id2, see make_periodicity_constraints.
+ *
* @note The created std::vector can be used in
* DoFTools::make_periodicity_constraints and in
* parallel::distributed::Triangulation::add_periodicity to enforce
* times with different boundary ids to generate a vector with all periodic
* pairs.
*
- * @author Daniel Arndt, Matthias Maier, 2013
+ * @author Daniel Arndt, Matthias Maier, 2013, 2014
*/
template<typename CONTAINER>
void
collect_periodic_faces
- (const CONTAINER &container,
+ (const CONTAINER &container,
const types::boundary_id b_id1,
const types::boundary_id b_id2,
const int direction,
std::vector<PeriodicFacePair<typename CONTAINER::cell_iterator> > &matched_pairs,
- const dealii::Tensor<1,CONTAINER::space_dimension> &offset = dealii::Tensor<1,CONTAINER::space_dimension>());
+ const Tensor<1,CONTAINER::space_dimension> &offset = dealii::Tensor<1,CONTAINER::space_dimension>(),
+ const FullMatrix<double> &rotation = IdentityMatrix(CONTAINER::space_dimension));
/**
* meshes with cells not in @ref GlossFaceOrientation
* "standard orientation".
*
- * @author Daniel Arndt, Matthias Maier, 2013
+ * @author Daniel Arndt, Matthias Maier, 2013, 2014
*/
template<typename CONTAINER>
void
collect_periodic_faces
- (const CONTAINER &container,
+ (const CONTAINER &container,
const types::boundary_id b_id,
const int direction,
std::vector<PeriodicFacePair<typename CONTAINER::cell_iterator> > &matched_pairs,
- const dealii::Tensor<1,CONTAINER::space_dimension> &offset = dealii::Tensor<1,CONTAINER::space_dimension>());
+ const dealii::Tensor<1,CONTAINER::space_dimension> &offset = dealii::Tensor<1,CONTAINER::space_dimension>(),
+ const FullMatrix<double> &rotation = IdentityMatrix(CONTAINER::space_dimension));
+
/**
}
+ // Implementation of the low level interface:
+
+
template <typename FaceIterator>
void
make_periodicity_constraints (const FaceIterator &face_1,
const ComponentMask &component_mask,
const bool face_orientation,
const bool face_flip,
- const bool face_rotation)
+ const bool face_rotation,
+ const FullMatrix<double> &rotation)
{
static const int dim = FaceIterator::AccessorType::dimension;
component_mask,
face_orientation,
face_flip,
- face_rotation);
+ face_rotation,
+ rotation);
}
}
else
{
if (face_2->has_children() == false)
set_periodicity_constraints(face_2, face_1,
- FullMatrix<double>(IdentityMatrix(face_1->get_fe(face_1->nth_active_fe_index(0)).dofs_per_face)),
+ FullMatrix<double>(IdentityMatrix(face_1->get_fe(face_1->nth_active_fe_index(0)).dofs_per_face)), // TODO
constraint_matrix,
component_mask,
face_orientation, face_flip, face_rotation);
else
set_periodicity_constraints(face_1, face_2,
- FullMatrix<double>(IdentityMatrix(face_1->get_fe(face_1->nth_active_fe_index(0)).dofs_per_face)),
+ FullMatrix<double>(IdentityMatrix(face_1->get_fe(face_1->nth_active_fe_index(0)).dofs_per_face)), // TODO
constraint_matrix,
component_mask,
face_orientation, face_flip, face_rotation);
+ template<typename DH>
+ void
+ make_periodicity_constraints
+ (const std::vector<GridTools::PeriodicFacePair<typename DH::cell_iterator> >
+ &periodic_faces,
+ dealii::ConstraintMatrix &constraint_matrix,
+ const ComponentMask &component_mask)
+ {
+ typedef std::vector<GridTools::PeriodicFacePair<typename DH::cell_iterator> >
+ FaceVector;
+ typename FaceVector::const_iterator it, end_periodic;
+ it = periodic_faces.begin();
+ end_periodic = periodic_faces.end();
+
+ // Loop over all periodic faces...
+ for (; it!=end_periodic; ++it)
+ {
+ typedef typename DH::face_iterator FaceIterator;
+ const FaceIterator face_1 = it->cell[0]->face(it->face_idx[0]);
+ const FaceIterator face_2 = it->cell[1]->face(it->face_idx[1]);
+
+ Assert(face_1->at_boundary() && face_2->at_boundary(),
+ ExcInternalError());
+
+ Assert (face_1 != face_2,
+ ExcInternalError());
+
+ // ... and apply the low level make_periodicity_constraints function to
+ // every matching pair:
+ make_periodicity_constraints(face_1,
+ face_2,
+ constraint_matrix,
+ component_mask,
+ it->orientation[0],
+ it->orientation[1],
+ it->orientation[2],
+ it->rotation);
+ }
+ }
+
+
+ // High level interface variants:
+
+
template<typename DH>
void
make_periodicity_constraints (const DH &dof_handler,
- template<typename DH>
- void
- make_periodicity_constraints
- (const std::vector<GridTools::PeriodicFacePair<typename DH::cell_iterator> >
- &periodic_faces,
- dealii::ConstraintMatrix &constraint_matrix,
- const ComponentMask &component_mask)
- {
- typedef std::vector<GridTools::PeriodicFacePair<typename DH::cell_iterator> >
- FaceVector;
- typename FaceVector::const_iterator it, end_periodic;
- it = periodic_faces.begin();
- end_periodic = periodic_faces.end();
-
-
- // And apply the low level make_periodicity_constraints function to
- // every matching pair:
- for (; it!=end_periodic; ++it)
- {
- typedef typename DH::face_iterator FaceIterator;
- const FaceIterator face_1 = it->cell[0]->face(it->face_idx[0]);
- const FaceIterator face_2 = it->cell[1]->face(it->face_idx[1]);
-
- Assert(face_1->at_boundary() && face_2->at_boundary(),
- ExcInternalError());
-
- Assert (face_1 != face_2,
- ExcInternalError());
-
- make_periodicity_constraints(face_1,
- face_2,
- constraint_matrix,
- component_mask,
- it->orientation[0],
- it->orientation[1],
- it->orientation[2]);
- }
- }
-
-
-
namespace internal
{
namespace Assembler
const DH::face_iterator &,
dealii::ConstraintMatrix &,
const ComponentMask &,
- bool, bool, bool);
+ bool, bool, bool,
+ const FullMatrix<double> &);
+
+ template
+ void
+ DoFTools::make_periodicity_constraints<DH>
+ (const std::vector<GridTools::PeriodicFacePair<DH::cell_iterator> > &,
+ dealii::ConstraintMatrix &,
+ const ComponentMask &);
+
template
void
dealii::Tensor<1,DH::space_dimension> &,
dealii::ConstraintMatrix &,
const ComponentMask &);
-
- template
- void
- DoFTools::make_periodicity_constraints<DH>
- (const std::vector<GridTools::PeriodicFacePair<DH::cell_iterator> > &,
- dealii::ConstraintMatrix &,
- const ComponentMask &);
-
#endif
}
std::set<std::pair<typename identity<CellIterator>::type, unsigned int> > &pairs2,
const int direction,
std::vector<PeriodicFacePair<CellIterator> > &matched_pairs,
- const dealii::Tensor<1,CellIterator::AccessorType::space_dimension> &offset)
+ const dealii::Tensor<1,CellIterator::AccessorType::space_dimension> &offset,
+ const FullMatrix<double> &rotation)
{
static const int space_dim = CellIterator::AccessorType::space_dimension;
Assert (0<=direction && direction<space_dim,
// remove the matched cell in pairs2 to speed up the
// matching:
const PeriodicFacePair<CellIterator> matched_face
- = {{cell1, cell2},{face_idx1, face_idx2}, orientation};
+ = {{cell1, cell2},{face_idx1, face_idx2}, orientation, rotation};
matched_pairs.push_back(matched_face);
pairs2.erase(it2);
++n_matches;
const types::boundary_id b_id2,
const int direction,
std::vector<PeriodicFacePair<typename CONTAINER::cell_iterator> > &matched_pairs,
- const dealii::Tensor<1,CONTAINER::space_dimension> &offset)
+ const Tensor<1,CONTAINER::space_dimension> &offset,
+ const FullMatrix<double> &rotation)
{
static const int dim = CONTAINER::dimension;
static const int space_dim = CONTAINER::space_dimension;
ExcMessage ("Unmatched faces on periodic boundaries"));
// and call match_periodic_face_pairs that does the actual matching:
- match_periodic_face_pairs(pairs1, pairs2, direction, matched_pairs, offset);
+ match_periodic_face_pairs(pairs1, pairs2, direction, matched_pairs, offset, rotation);
}
const types::boundary_id b_id,
const int direction,
std::vector<PeriodicFacePair<typename CONTAINER::cell_iterator> > &matched_pairs,
- const dealii::Tensor<1,CONTAINER::space_dimension> &offset)
+ const Tensor<1,CONTAINER::space_dimension> &offset,
+ const FullMatrix<double> &rotation)
{
static const int dim = CONTAINER::dimension;
static const int space_dim = CONTAINER::space_dimension;
#endif
// and call match_periodic_face_pairs that does the actual matching:
- match_periodic_face_pairs(pairs1, pairs2, direction, matched_pairs, offset);
+ match_periodic_face_pairs(pairs1, pairs2, direction, matched_pairs, offset, rotation);
#ifdef DEBUG
//check for standard orientation
const types::boundary_id,
const int,
std::vector<PeriodicFacePair<X::cell_iterator> > &,
- const Tensor<1,X::space_dimension> &);
+ const Tensor<1,X::space_dimension> &,
+ const FullMatrix<double> &);
template
void collect_periodic_faces<X> (const X &,
const types::boundary_id,
const int,
std::vector<PeriodicFacePair<X::cell_iterator> > &,
- const Tensor<1,X::space_dimension> &);
+ const Tensor<1,X::space_dimension> &,
+ const FullMatrix<double> &);
#endif
const types::boundary_id,
const int,
std::vector<PeriodicFacePair<parallel::distributed::Triangulation<deal_II_dimension, deal_II_space_dimension>::cell_iterator> > &,
- const Tensor<1,parallel::distributed::Triangulation<deal_II_dimension, deal_II_space_dimension>::space_dimension> &);
+ const Tensor<1,parallel::distributed::Triangulation<deal_II_dimension, deal_II_space_dimension>::space_dimension> &,
+ const FullMatrix<double> &);
template
void
const types::boundary_id,
const int,
std::vector<PeriodicFacePair<parallel::distributed::Triangulation<deal_II_dimension, deal_II_space_dimension>::cell_iterator> > &,
- const Tensor<1,parallel::distributed::Triangulation<deal_II_dimension, deal_II_space_dimension>::space_dimension> &);
+ const Tensor<1,parallel::distributed::Triangulation<deal_II_dimension, deal_II_space_dimension>::space_dimension> &,
+ const FullMatrix<double> &);
\}
#endif