libMesh
Public Member Functions | List of all members
WriteVecAndScalar Class Reference
Inheritance diagram for WriteVecAndScalar:
[legend]

Public Member Functions

 LIBMESH_CPPUNIT_TEST_SUITE (WriteVecAndScalar)
 This test ensures you can write both vector and scalar variables. More...
 
 CPPUNIT_TEST (testWriteExodusDistributed)
 
 CPPUNIT_TEST (testWriteExodusReplicated)
 
 CPPUNIT_TEST (testWriteNemesisDistributed)
 
 CPPUNIT_TEST (testWriteNemesisReplicated)
 
 CPPUNIT_TEST_SUITE_END ()
 
void setupTests (UnstructuredMesh &mesh, EquationSystems &equation_systems)
 
void testSolution (const MeshBase &read_mesh, const System &sys2)
 
template<typename MeshType >
void testWriteExodus (const std::string &filename)
 
void testWriteExodusReplicated ()
 
void testWriteExodusDistributed ()
 
template<typename MeshType >
void testWriteNemesis (const std::string &filename)
 
void testWriteNemesisReplicated ()
 
void testWriteNemesisDistributed ()
 

Detailed Description

Definition at line 20 of file write_vec_and_scalar.C.

Member Function Documentation

◆ CPPUNIT_TEST() [1/4]

WriteVecAndScalar::CPPUNIT_TEST ( testWriteExodusDistributed  )

◆ CPPUNIT_TEST() [2/4]

WriteVecAndScalar::CPPUNIT_TEST ( testWriteExodusReplicated  )

◆ CPPUNIT_TEST() [3/4]

WriteVecAndScalar::CPPUNIT_TEST ( testWriteNemesisDistributed  )

◆ CPPUNIT_TEST() [4/4]

WriteVecAndScalar::CPPUNIT_TEST ( testWriteNemesisReplicated  )

◆ CPPUNIT_TEST_SUITE_END()

WriteVecAndScalar::CPPUNIT_TEST_SUITE_END ( )

◆ LIBMESH_CPPUNIT_TEST_SUITE()

WriteVecAndScalar::LIBMESH_CPPUNIT_TEST_SUITE ( WriteVecAndScalar  )

This test ensures you can write both vector and scalar variables.

◆ setupTests()

void WriteVecAndScalar::setupTests ( UnstructuredMesh mesh,
EquationSystems equation_systems 
)
inline

Definition at line 39 of file write_vec_and_scalar.C.

References libMesh::EquationSystems::add_system(), libMesh::System::add_variable(), libMesh::MeshBase::allow_renumbering(), libMesh::MeshTools::Generation::build_square(), libMesh::FIRST, libMesh::EquationSystems::init(), libMesh::LAGRANGE, mesh, libMesh::ParallelObject::n_processors(), libMesh::NEDELEC_ONE, libMesh::Real, libMesh::NumericVector< T >::set(), and libMesh::System::solution.

40  {
41  // We set our initial conditions based on build_square node ids
42  mesh.allow_renumbering(false);
43 
45  1, 1,
46  -1., 1.,
47  -1., 1.,
48  Utility::string_to_enum<ElemType>("TRI6"));
49 
50  ExplicitSystem & system = equation_systems.add_system<ExplicitSystem>("Tester");
51  system.add_variable("u", FIRST, NEDELEC_ONE);
52  system.add_variable("v", FIRST, LAGRANGE);
53 
54  // Initialize the system
55  equation_systems.init();
56 
57  // Mimic the initial conditions of u(i)=2*i in the serial case,
58  // but indexed by node id rather than dof id.
59  std::vector<Real> initial_vector({10, 0, 12, 8, 4, 2, 16, 6, 14});
60 
61  NumericVector<Number> & sys_solution = *(system.solution);
62  for (const auto & node : mesh.node_ptr_range())
63  {
64  dof_id_type dof_id;
65  if (node->n_comp(0,0))
66  {
67  dof_id = node->dof_number(0,0,0);
68  }
69  else
70  {
71  CPPUNIT_ASSERT(node->n_comp(0,1));
72  dof_id = node->dof_number(0,1,0);
73  }
74  if (dof_id >= sys_solution.first_local_index() &&
75  dof_id < sys_solution.last_local_index())
76  sys_solution.set(dof_id, initial_vector[node->id()]);
77  if (mesh.n_processors() == 1)
78  CPPUNIT_ASSERT_EQUAL(initial_vector[node->id()], dof_id*Real(2));
79  }
80  sys_solution.close();
81  }
void allow_renumbering(bool allow)
If false is passed in then this mesh will no longer be renumbered when being prepared for use...
Definition: mesh_base.h:1173
MeshBase & mesh
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.
processor_id_type n_processors() const
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
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:1305
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void set(const numeric_index_type i, const T value)=0
Sets v(i) = value.
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.
Manages consistently variables, degrees of freedom, and coefficient vectors for explicit systems...
uint8_t dof_id_type
Definition: id_types.h:67

◆ testSolution()

void WriteVecAndScalar::testSolution ( const MeshBase read_mesh,
const System sys2 
)
inline

Definition at line 84 of file write_vec_and_scalar.C.

References std::abs(), libMesh::libmesh_real(), libMesh::ParallelObject::processor_id(), libMesh::Real, and libMesh::System::solution.

85  {
86  // VariableGroup optimization means that DoFs iterate over each of
87  // the 3 variables on each node before proceeding to the next
88  // node.
89  // u_x, u_y, v
90  const std::vector<Real> gold_vector = {-1, 3, 10,
91  0, 1, 12,
92  2, 0, 14,
93  0, 1.5, 11,
94  0.5, 1, 13,
95  0.5, 1.5, 12,
96  3, 4, 16,
97  3, 1.5, 15,
98  0.5, 4, 13};
99 
100  // Translation from node id to dof indexing order as gets done in
101  // serial
102  const std::vector<dof_id_type>
103  node_reordering({0, 3, 1, 8, 5, 4, 6, 7, 2});
104 
105  Real tol = 1e-12;
106  NumericVector<Number> & sys2_soln(*sys2.solution);
107  for (const auto & node : read_mesh.node_ptr_range())
108  {
109  if (node->processor_id() != read_mesh.processor_id())
110  continue;
111 
112  // We write out real, imaginary, and magnitude for complex
113  // numbers
114 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
115  const unsigned int v2 = 3;
116 #else
117  const unsigned int v2 = 1;
118 #endif
119  CPPUNIT_ASSERT_EQUAL(node->n_vars(0), 3*v2);
120 
121  CPPUNIT_ASSERT_LESS(node_reordering.size(), std::size_t(node->id()));
122  const dof_id_type gold_i_ux = node_reordering[node->id()] * 3;
123  const dof_id_type gold_i_uy = gold_i_ux + 1;
124  const dof_id_type gold_i_v = gold_i_uy + 1;
125  CPPUNIT_ASSERT_LESS(gold_vector.size(), std::size_t(gold_i_v));
126 
127  LIBMESH_ASSERT_FP_EQUAL(libmesh_real(sys2_soln(node->dof_number(0,0,0))),
128  gold_vector[gold_i_ux], tol);
129  LIBMESH_ASSERT_FP_EQUAL(libmesh_real(sys2_soln(node->dof_number(0,v2,0))),
130  gold_vector[gold_i_uy], tol);
131  LIBMESH_ASSERT_FP_EQUAL(libmesh_real(sys2_soln(node->dof_number(0,2*v2,0))),
132  gold_vector[gold_i_v], tol);
133 
134  // Let's check imaginary parts and magnitude for good measure
135 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
136  LIBMESH_ASSERT_FP_EQUAL(libmesh_real(sys2_soln(node->dof_number(0,1,0))),
137  0.0, tol);
138  LIBMESH_ASSERT_FP_EQUAL(libmesh_real(sys2_soln(node->dof_number(0,2,0))),
139  std::abs(gold_vector[gold_i_ux]), tol);
140  LIBMESH_ASSERT_FP_EQUAL(libmesh_real(sys2_soln(node->dof_number(0,4,0))),
141  0.0, tol);
142  LIBMESH_ASSERT_FP_EQUAL(libmesh_real(sys2_soln(node->dof_number(0,5,0))),
143  std::abs(gold_vector[gold_i_uy]), tol);
144  LIBMESH_ASSERT_FP_EQUAL(libmesh_real(sys2_soln(node->dof_number(0,7,0))),
145  0.0, tol);
146  LIBMESH_ASSERT_FP_EQUAL(libmesh_real(sys2_soln(node->dof_number(0,8,0))),
147  std::abs(gold_vector[gold_i_v]), tol);
148 #endif
149  }
150  }
T libmesh_real(T a)
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
Definition: type_vector.h:57
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
Definition: system.h:1573
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
processor_id_type processor_id() const
uint8_t dof_id_type
Definition: id_types.h:67

◆ testWriteExodus()

template<typename MeshType >
void WriteVecAndScalar::testWriteExodus ( const std::string &  filename)
inline

Definition at line 154 of file write_vec_and_scalar.C.

References libMesh::EquationSystems::add_system(), libMesh::System::add_variable(), TIMPI::Communicator::barrier(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::get_nodal_var_names(), libMesh::EquationSystems::init(), libMesh::LAGRANGE, mesh, libMesh::ExodusII_IO::read(), libMesh::SECOND, TestCommWorld, and libMesh::MeshOutput< MT >::write_equation_systems().

155  {
156  MeshType mesh(*TestCommWorld);
157  EquationSystems equation_systems(mesh);
158 
159  setupTests(mesh, equation_systems);
160 
161 #ifdef LIBMESH_HAVE_EXODUS_API
162  // Make sure any previous reads are done before the writing starts
164 
165  // We write the file in the ExodusII format.
166  ExodusII_IO(mesh).write_equation_systems(filename, equation_systems);
167 
168  // Make sure that the writing is done before the reading starts.
170 
171  // Now read it back in
172  MeshType read_mesh(*TestCommWorld);
173  ExodusII_IO exio(read_mesh);
174  exio.read(filename);
175 
176  read_mesh.prepare_for_use();
177  EquationSystems es2(read_mesh);
178  ExplicitSystem & sys2 = es2.add_system<ExplicitSystem>("Test");
179 
180  const std::vector<std::string> & nodal_vars(exio.get_nodal_var_names());
181 
182  for (const auto & var_name : nodal_vars)
183  sys2.add_variable(var_name, SECOND, LAGRANGE);
184 
185  es2.init();
186 
187  for (const auto & var_name : nodal_vars)
188  exio.copy_nodal_solution(sys2, var_name, var_name, 1);
189 
190  testSolution(read_mesh, sys2);
191 #endif // #ifdef LIBMESH_HAVE_EXODUS_API
192  }
This is the EquationSystems class.
virtual void write_equation_systems(const std::string &, const EquationSystems &, const std::set< std::string > *system_names=nullptr)
This method implements writing a mesh with data to a specified file where the data is taken from the ...
Definition: mesh_output.C:31
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:159
The ExodusII_IO class implements reading meshes in the ExodusII file format from Sandia National Labs...
Definition: exodusII_io.h:52
void barrier() const
MeshBase & mesh
void testSolution(const MeshBase &read_mesh, const System &sys2)
void setupTests(UnstructuredMesh &mesh, EquationSystems &equation_systems)
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:1305
Manages consistently variables, degrees of freedom, and coefficient vectors for explicit systems...

◆ testWriteExodusDistributed()

void WriteVecAndScalar::testWriteExodusDistributed ( )
inline

Definition at line 196 of file write_vec_and_scalar.C.

196 { LOG_UNIT_TEST; testWriteExodus<DistributedMesh>("dist.e"); }

◆ testWriteExodusReplicated()

void WriteVecAndScalar::testWriteExodusReplicated ( )
inline

Definition at line 195 of file write_vec_and_scalar.C.

195 { LOG_UNIT_TEST; testWriteExodus<ReplicatedMesh>("rep.e"); }

◆ testWriteNemesis()

template<typename MeshType >
void WriteVecAndScalar::testWriteNemesis ( const std::string &  filename)
inline

Definition at line 200 of file write_vec_and_scalar.C.

References libMesh::EquationSystems::add_system(), libMesh::System::add_variable(), TIMPI::Communicator::barrier(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::Nemesis_IO::get_nodal_var_names(), libMesh::EquationSystems::init(), libMesh::LAGRANGE, libMesh::libmesh_ignore(), mesh, libMesh::Nemesis_IO::read(), libMesh::SECOND, TestCommWorld, and libMesh::MeshOutput< MT >::write_equation_systems().

201  {
202  MeshType mesh(*TestCommWorld);
203  EquationSystems equation_systems(mesh);
204 
205  setupTests(mesh, equation_systems);
206 
207 #ifdef LIBMESH_HAVE_NEMESIS_API
208  // Make sure any previous reads are done before the writing starts
210 
211  // We write the file in the Nemesis format.
212  Nemesis_IO(mesh).write_equation_systems(filename, equation_systems);
213 
214  // Make sure that the writing is done before the reading starts.
216 
217  // Now read it back in
218  MeshType read_mesh(*TestCommWorld);
219  Nemesis_IO nemio(read_mesh);
220  nemio.read(filename);
221 
222  read_mesh.prepare_for_use();
223  EquationSystems es2(read_mesh);
224  ExplicitSystem & sys2 = es2.add_system<ExplicitSystem>("Test");
225 
226  const std::vector<std::string> & nodal_vars(nemio.get_nodal_var_names());
227 
228  for (const auto & var_name : nodal_vars)
229  sys2.add_variable(var_name, SECOND, LAGRANGE);
230 
231  es2.init();
232 
233  for (const auto & var_name : nodal_vars)
234  nemio.copy_nodal_solution(sys2, var_name, var_name, 1);
235 
236  // FIXME - Nemesis still needs work for vector-valued variables
237  // testSolution(read_mesh, sys2);
238 #else
239  libmesh_ignore(filename);
240 #endif // #ifdef LIBMESH_HAVE_NEMESIS_API
241  }
This is the EquationSystems class.
virtual void write_equation_systems(const std::string &, const EquationSystems &, const std::set< std::string > *system_names=nullptr)
This method implements writing a mesh with data to a specified file where the data is taken from the ...
Definition: mesh_output.C:31
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:159
void barrier() const
MeshBase & mesh
void libmesh_ignore(const Args &...)
The Nemesis_IO class implements reading parallel meshes in the Nemesis file format from Sandia Nation...
Definition: nemesis_io.h:51
void setupTests(UnstructuredMesh &mesh, EquationSystems &equation_systems)
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:1305
Manages consistently variables, degrees of freedom, and coefficient vectors for explicit systems...

◆ testWriteNemesisDistributed()

void WriteVecAndScalar::testWriteNemesisDistributed ( )
inline

Definition at line 244 of file write_vec_and_scalar.C.

244 { LOG_UNIT_TEST; testWriteNemesis<DistributedMesh>("dist.nem"); }

◆ testWriteNemesisReplicated()

void WriteVecAndScalar::testWriteNemesisReplicated ( )
inline

Definition at line 243 of file write_vec_and_scalar.C.

243 { LOG_UNIT_TEST; testWriteNemesis<ReplicatedMesh>("rep.nem"); }

The documentation for this class was generated from the following file: