libMesh
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 
20 using namespace libMesh;
21 
22 class MeshAssignTest : public CppUnit::TestCase {
27 public:
28  LIBMESH_CPPUNIT_TEST_SUITE( MeshAssignTest );
29 
30 /* Tests need a 2d mesh and Dirichlet boundary conditions */
31 #if LIBMESH_DIM > 1
32 # ifdef LIBMESH_ENABLE_DIRICHLET
33  CPPUNIT_TEST( testMeshMoveAssignFromMemory );
34  CPPUNIT_TEST( testReplicatedMeshMoveAssignFromMemory );
35  CPPUNIT_TEST( testDistributedMeshMoveAssignFromMemory );
36  CPPUNIT_TEST( testMeshMoveAssignFromFile );
37  CPPUNIT_TEST( testReplicatedMeshMoveAssignFromFile );
38  CPPUNIT_TEST( testDistributedMeshMoveAssignFromFile );
39  CPPUNIT_TEST( testReplicatedMeshConstructFromReplicated );
40  CPPUNIT_TEST( testReplicatedMeshConstructFromDistributed );
41  CPPUNIT_TEST( testDistributedMeshConstructFromReplicated );
42  CPPUNIT_TEST( testDistributedMeshConstructFromDistributed );
43 # endif
44 #endif
45 
46  CPPUNIT_TEST_SUITE_END();
47 
48 protected:
49 
50 public:
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 
225  MeshTools::Generation::build_square(src_mesh, 4, 4);
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 
This is the EquationSystems class.
void testCopyConstruct()
Definition: mesh_assign.C:221
void testDistributedMeshConstructFromDistributed()
Definition: mesh_assign.C:269
void testDistributedMeshConstructFromReplicated()
Definition: mesh_assign.C:266
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:171
const EquationSystems & get_equation_systems() const
Definition: system.h:721
void sum(T &r) const
This class allows one to associate Dirichlet boundary values with a given set of mesh boundary ids an...
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.
void testReplicatedMeshConstructFromDistributed()
Definition: mesh_assign.C:263
void testMeshMoveAssignFromMemory()
Definition: mesh_assign.C:242
The libMesh namespace provides an interface to certain functionality in the library.
const MeshBase & get_mesh() const
Definition: system.h:2358
void testDistributedMeshMoveAssignFromMemory()
Definition: mesh_assign.C:248
virtual MeshBase & assign(MeshBase &&other_mesh)=0
Shim to allow operator = (&&) to behave like a virtual function without having to be one...
CPPUNIT_TEST_SUITE_REGISTRATION(MeshAssignTest)
void testDistributedMeshMoveAssignFromFile()
Definition: mesh_assign.C:257
int8_t boundary_id_type
Definition: id_types.h:51
void testReplicatedMeshMoveAssignFromMemory()
Definition: mesh_assign.C:245
Manages consistently variables, degrees of freedom, and coefficient vectors.
Definition: system.h:96
void testReplicatedMeshMoveAssignFromFile()
Definition: mesh_assign.C:254
virtual void reinit()
Handle any mesh changes and reinitialize all the systems on the updated mesh.
void testReplicatedMeshConstructFromReplicated()
Definition: mesh_assign.C:260
void testMeshMoveAssign(const std::string &mesh_type, const std::string &mesh_creation_type)
Definition: mesh_assign.C:59
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:1357
virtual void reinit_mesh()
Handle the association of a completely new mesh with the EquationSystem and all the Systems assigned ...
virtual void clear()
Deletes all the element and node data that is currently stored.
Definition: mesh_base.C:920
virtual void write(const std::string &name) const =0
void testMeshMoveAssignFromFile()
Definition: mesh_assign.C:251
timpi_pure bool verify(const T &r) const
void tearDown()
Definition: mesh_assign.C:55
Function that returns a single value that never changes.
void add_dirichlet_boundary(const DirichletBoundary &dirichlet_boundary)
Adds a copy of the specified Dirichlet boundary to the system.
virtual void init()
Initialize all the systems.
virtual dof_id_type n_elem() const =0
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.
const DofMap & get_dof_map() const
Definition: system.h:2374
uint8_t dof_id_type
Definition: id_types.h:67