libMesh
Loading...
Searching...
No Matches
mesh_assign.C
Go to the documentation of this file.
1#include <libmesh/mesh.h>
2#include <libmesh/distributed_mesh.h>
3#include <libmesh/mesh_generation.h>
4#include <libmesh/mesh_refinement.h>
5#include <libmesh/boundary_info.h>
6#include <libmesh/elem.h>
7#include <libmesh/equation_systems.h>
8#include <libmesh/zero_function.h>
9#include <libmesh/dirichlet_boundaries.h>
10#include <libmesh/dof_map.h>
11#include <libmesh/parallel.h>
12#include <libmesh/replicated_mesh.h>
13
15
16#include "test_comm.h"
17#include "libmesh_cppunit.h"
18
19
20using namespace libMesh;
21
22class MeshAssignTest : public CppUnit::TestCase {
27public:
29
30/* Tests need a 2d mesh and Dirichlet boundary conditions */
31#if LIBMESH_DIM > 1
32# ifdef LIBMESH_ENABLE_DIRICHLET
43# endif
44#endif
45
47
48protected:
49
50public:
51 void setUp()
52 {
53 }
54
55 void tearDown()
56 {
57 }
58
59 void testMeshMoveAssign(const std::string & mesh_type,
60 const std::string & mesh_creation_type)
61 {
62 // Create two mesh ptrs.
63 std::shared_ptr<UnstructuredMesh> mesh_one;
64 std::shared_ptr<UnstructuredMesh> mesh_two;
65
72 if (mesh_type.compare("Mesh") == 0)
73 {
74 mesh_one = std::make_shared<Mesh>(*TestCommWorld);
75 }
76 else if (mesh_type.compare("replicated") == 0)
77 {
78 mesh_one = std::make_shared<ReplicatedMesh>(*TestCommWorld);
79 }
80 else if (mesh_type.compare("distributed") == 0)
81 {
82 mesh_one = std::make_shared<DistributedMesh>(*TestCommWorld);
83 }
84 else
85 {
86 libmesh_error_msg("Error: specified mesh_type not understood");
87 }
88
90 2, 2,
91 0., 1.,
92 0., 1.,
93 QUAD9);
94
95 // build_square adds boundary_ids 0,1,2,3 for the bottom, right,
96 // top, and left sides, respectively.
97
103 EquationSystems es(*mesh_one);
104 System & system = es.add_system<System> ("SimpleSystem");
105 system.add_variable("u", FIRST);
106
107 // Now set the Dirichlet bcs: u = 1.0, when boundary id = 0 and 1.
108 // The function describing the boundary value
109 ConstFunction<Number> one(1.0);
110
111 // The boundary ids of the boundaries where the value is to be set.
112 const boundary_id_type all_bdry_ids[4] = {0, 1, 2, 3};
113 const std::set<boundary_id_type> bottom_right_bdry_ids(all_bdry_ids, all_bdry_ids + 1);
114
115 // The variables for which we are defining the bc.
116 std::vector<unsigned int> variables = {0};
117 variables.push_back(0);
118
119 DirichletBoundary dirichlet_bc(bottom_right_bdry_ids, variables, &one);
120
121 system.get_dof_map().add_dirichlet_boundary(dirichlet_bc);
122
123 es.init();
124
125 if (mesh_type.compare("Mesh") == 0)
126 {
127 mesh_two = std::make_shared<Mesh>(*TestCommWorld);
128 }
129 else if (mesh_type.compare("replicated") == 0)
130 {
131 mesh_two = std::make_shared<ReplicatedMesh>(*TestCommWorld);
132 }
133 else if (mesh_type.compare("distributed") == 0)
134 {
135 mesh_two = std::make_shared<DistributedMesh>(*TestCommWorld);
136 }
137 else
138 {
139 libmesh_error_msg("Error: specified mesh_type not understood");
140 }
141
142#ifdef LIBMESH_ENABLE_AMR // We refine or read refined meshes for this test
143 if(mesh_creation_type.compare("from_memory") == 0)
144 {
152 2, 2,
153 0., 1.,
154 0., 1.,
155 QUAD4);
156
157 // Uniformly refine mesh_two
158 std::unique_ptr<MeshRefinement> mesh_refinement(std::make_unique<MeshRefinement>(*mesh_two));
159
160 mesh_refinement->uniformly_refine(1);
161
162 std::unique_ptr<MeshBase> mesh_two_clone =
163 mesh_two->clone();
164
165 // Move mesh_two into mesh_one
166 system.get_mesh().clear();
167 system.get_mesh().assign(std::move(*mesh_two));
168 mesh_two->clear();
169
170 // Assert that the moved into mesh has the right number of elements.
171 CPPUNIT_ASSERT_EQUAL(system.get_mesh().n_elem(), static_cast<dof_id_type>(20));
172
173 CPPUNIT_ASSERT(system.get_mesh() == *mesh_two_clone);
174
175 // Reinit the dofs and other system related data structures
176 // based on its mesh
178
179 // Reinit
180 system.get_equation_systems().reinit();
181
182 // Write out the mesh xda, this currently fails with DistributedMesh,
183 // running on more than 8 processors, when the mesh to be moved in is
184 // read from a file.
185 system.get_mesh().write("mesh.out.memory.moved.xda");
186
187 system.get_mesh().clear();
188 }
189 else if (mesh_creation_type.compare("from_file") == 0)
190 {
191 mesh_two->read("meshes/mesh_assign_test_mesh.xda");
192
193 std::unique_ptr<MeshBase> mesh_two_clone =
194 mesh_two->clone();
195
196 system.get_mesh().clear();
197 system.get_mesh().assign(std::move(*mesh_two));
198
199 mesh_two->clear();
200
201 // Assert that the moved into mesh has the right number of elements.
202 CPPUNIT_ASSERT_EQUAL(system.get_mesh().n_elem(), static_cast<dof_id_type>(42));
203
204 CPPUNIT_ASSERT(system.get_mesh() == *mesh_two_clone);
205
207 system.get_equation_systems().reinit();
208
209 system.get_mesh().write("mesh.out.file.moved.xda");
210
211 system.get_mesh().clear();
212 }
213 else
214 {
215 libmesh_error_msg("Error: invalid mesh two case type.");
216 }
217#endif // LIBMESH_ENABLE_AMR
218 }
219
220 template <class SrcClass, class DestClass>
222 {
223 SrcClass src_mesh(*TestCommWorld);
224
226
227 DestClass dest_mesh(src_mesh);
228
229 // Check for consistency
230 CPPUNIT_ASSERT(TestCommWorld->verify(dest_mesh.n_elem()));
231 CPPUNIT_ASSERT(TestCommWorld->verify(dest_mesh.n_nodes()));
232 dof_id_type n_dest_elem = dest_mesh.n_local_elem();
233 TestCommWorld->sum(n_dest_elem);
234 dof_id_type n_dest_nodes = dest_mesh.n_local_nodes();
235 TestCommWorld->sum(n_dest_nodes);
236 CPPUNIT_ASSERT_EQUAL(n_dest_elem, dest_mesh.n_elem());
237 CPPUNIT_ASSERT_EQUAL(n_dest_nodes, dest_mesh.n_nodes());
238 CPPUNIT_ASSERT_EQUAL(src_mesh.n_elem(), dest_mesh.n_elem());
239 CPPUNIT_ASSERT_EQUAL(src_mesh.n_nodes(), dest_mesh.n_nodes());
240 }
241
243 { LOG_UNIT_TEST; testMeshMoveAssign("Mesh", "from_memory"); }
244
246 { LOG_UNIT_TEST; testMeshMoveAssign("replicated", "from_memory"); }
247
249 { LOG_UNIT_TEST; testMeshMoveAssign("distributed", "from_memory"); }
250
252 { LOG_UNIT_TEST; testMeshMoveAssign("Mesh", "from_file"); }
253
255 { LOG_UNIT_TEST; testMeshMoveAssign("replicated", "from_file"); }
256
258 { LOG_UNIT_TEST; testMeshMoveAssign("distributed", "from_file"); }
259
261 { LOG_UNIT_TEST; testCopyConstruct<ReplicatedMesh, ReplicatedMesh>(); }
262
264 { LOG_UNIT_TEST; testCopyConstruct<DistributedMesh, ReplicatedMesh>(); }
265
267 { LOG_UNIT_TEST; testCopyConstruct<ReplicatedMesh, DistributedMesh>(); }
268
270 { LOG_UNIT_TEST; testCopyConstruct<DistributedMesh, DistributedMesh>(); }
271
272}; // End definition of class MeshAssignTest
273
void testReplicatedMeshConstructFromDistributed()
CPPUNIT_TEST(testMeshMoveAssignFromFile)
void testDistributedMeshMoveAssignFromMemory()
CPPUNIT_TEST(testReplicatedMeshMoveAssignFromFile)
CPPUNIT_TEST(testReplicatedMeshMoveAssignFromMemory)
CPPUNIT_TEST(testDistributedMeshConstructFromDistributed)
CPPUNIT_TEST(testMeshMoveAssignFromMemory)
void testMeshMoveAssignFromMemory()
void testCopyConstruct()
CPPUNIT_TEST(testDistributedMeshMoveAssignFromMemory)
void testDistributedMeshConstructFromDistributed()
void testReplicatedMeshMoveAssignFromMemory()
CPPUNIT_TEST(testDistributedMeshConstructFromReplicated)
CPPUNIT_TEST(testReplicatedMeshConstructFromDistributed)
void testMeshMoveAssign(const std::string &mesh_type, const std::string &mesh_creation_type)
Definition mesh_assign.C:59
LIBMESH_CPPUNIT_TEST_SUITE(MeshAssignTest)
This test verifies the operations of the move assignment operator for MeshBase and derived classes.
void testDistributedMeshMoveAssignFromFile()
void testReplicatedMeshMoveAssignFromFile()
CPPUNIT_TEST(testReplicatedMeshConstructFromReplicated)
void testReplicatedMeshConstructFromReplicated()
void testDistributedMeshConstructFromReplicated()
CPPUNIT_TEST(testDistributedMeshMoveAssignFromFile)
void testMeshMoveAssignFromFile()
Function that returns a single value that never changes.
This class allows one to associate Dirichlet boundary values with a given set of mesh boundary ids an...
void add_dirichlet_boundary(const DirichletBoundary &dirichlet_boundary)
Adds a copy of the specified Dirichlet boundary to the system.
This is the EquationSystems class.
virtual void reinit()
Handle any mesh changes and reinitialize all the systems on the updated mesh.
virtual void init()
Initialize all the systems.
virtual System & add_system(std::string_view system_type, std::string_view name)
Add the system of type system_type named name to the systems array.
virtual void reinit_mesh()
Handle the association of a completely new mesh with the EquationSystem and all the Systems assigned ...
virtual dof_id_type n_elem() const =0
virtual void write(const std::string &name) const =0
virtual void clear()
Deletes all the element and node data that is currently stored.
Definition mesh_base.C:1036
virtual MeshBase & assign(MeshBase &&other_mesh)=0
Shim to allow operator = (&&) to behave like a virtual function without having to be one.
Manages consistently variables, degrees of freedom, and coefficient vectors.
Definition system.h:100
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition system.C:1344
const DofMap & get_dof_map() const
Definition system.h:2417
const EquationSystems & get_equation_systems() const
Definition system.h:767
const MeshBase & get_mesh() const
Definition system.h:2401
Communicator * TestCommWorld
CPPUNIT_TEST_SUITE_REGISTRATION(MeshAssignTest)
void build_square(UnstructuredMesh &mesh, const unsigned int nx, const unsigned int ny, const Real xmin=0., const Real xmax=1., const Real ymin=0., const Real ymax=1., const ElemType type=INVALID_ELEM, const bool gauss_lobatto_grid=false)
A specialized build_cube() for 2D meshes.
The libMesh namespace provides an interface to certain functionality in the library.
int8_t boundary_id_type
Definition id_types.h:51
uint8_t dof_id_type
Definition id_types.h:67