libMesh
periodic_boundary_base.C
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2024 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 
18 // Local Includes
19 #include "libmesh/libmesh_config.h"
20 
21 #ifdef LIBMESH_ENABLE_PERIODIC
22 
23 #include "libmesh/periodic_boundary_base.h"
24 
25 #include "libmesh/boundary_info.h" // BoundaryInfo::invalid_id
26 
27 // C++ Includes
28 #include <memory>
29 
30 
31 namespace libMesh
32 {
33 
35  myboundary(BoundaryInfo::invalid_id),
36  pairedboundary(BoundaryInfo::invalid_id)
37 {
38 }
39 
40 
41 
43  myboundary(o.myboundary),
44  pairedboundary(o.pairedboundary),
45  variables(o.variables)
46 {
47  // Make a deep copy of _transformation_matrix, if it's not null
49  {
50  this->_transformation_matrix = std::make_unique<DenseMatrix<Real>>();
52  }
53 }
54 
55 
56 
57 void PeriodicBoundaryBase::set_variable(unsigned int var)
58 {
59  variables.insert(var);
60 }
61 
62 
63 
65 {
66  variables.insert(pb.variables.begin(), pb.variables.end());
67 }
68 
69 
70 
71 bool PeriodicBoundaryBase::is_my_variable(unsigned int var_num) const
72 {
73  bool a = variables.empty() || (!variables.empty() && variables.find(var_num) != variables.end());
74  return a;
75 }
76 
77 
78 
80 {
81  return bool(_transformation_matrix);
82 }
83 
84 
85 
87 {
88  libmesh_error_msg_if(!has_transformation_matrix(),
89  "Transformation matrix is not defined");
90 
91  return *_transformation_matrix;
92 }
93 
94 
95 
97 {
98  // Make a deep copy of matrix
99  this->_transformation_matrix = std::make_unique<DenseMatrix<Real>>();
100  *(this->_transformation_matrix) = matrix;
101 
102  // if _transformation_matrix is defined then it must be the same sie as variables.
103  libmesh_assert_equal_to(_transformation_matrix->m(), variables.size());
104  libmesh_assert_equal_to(_transformation_matrix->n(), variables.size());
105 }
106 
107 
108 
109 const std::set<unsigned int> & PeriodicBoundaryBase::get_variables() const
110 {
111  return variables;
112 }
113 
114 } // namespace libMesh
115 
116 #endif // LIBMESH_ENABLE_PERIODIC
const std::set< unsigned int > & get_variables() const
Get the set of variables for this periodic boundary condition.
The libMesh namespace provides an interface to certain functionality in the library.
void merge(const PeriodicBoundaryBase &pb)
void set_variable(unsigned int var)
std::set< unsigned int > variables
Set of variables for this periodic boundary, empty means all variables possible.
void set_transformation_matrix(const DenseMatrix< Real > &matrix)
Set the transformation matrix.
The BoundaryInfo class contains information relevant to boundary conditions including storing faces...
Definition: boundary_info.h:57
const DenseMatrix< Real > & get_transformation_matrix() const
Get the transformation matrix, if it is defined.
bool is_my_variable(unsigned int var_num) const
The base class for defining periodic boundaries.
std::unique_ptr< DenseMatrix< Real > > _transformation_matrix
A DenseMatrix that defines the mapping of variables on this boundary and the counterpart boundary...