25 #include <queso/Defines.h>
27 #ifdef QUESO_HAVE_LIBMESH
30 #include <queso/LibMeshFunction.h>
31 #include <queso/FunctionOperatorBuilder.h>
32 #include <libmesh/libmesh.h>
33 #include <libmesh/mesh.h>
34 #include <libmesh/mesh_generation.h>
35 #include <libmesh/equation_systems.h>
36 #include <libmesh/explicit_system.h>
37 #include <libmesh/system_norm.h>
38 #include <libmesh/exodusII_io.h>
41 #include <libmesh/fe.h>
44 #include <libmesh/quadrature_gauss.h>
48 #include <libmesh/sparse_matrix.h>
49 #include <libmesh/numeric_vector.h>
50 #include <libmesh/dense_matrix.h>
51 #include <libmesh/dense_vector.h>
52 #include <libmesh/elem.h>
56 #include <libmesh/dof_map.h>
57 #include <libmesh/utility.h>
58 #include <libmesh/string_to_enum.h>
59 #include <libmesh/enum_order.h>
60 #include <libmesh/enum_fe_family.h>
64 LibMeshFunction::LibMeshFunction(
65 const FunctionOperatorBuilder & builder, libMesh::MeshBase & m)
67 equation_systems(new libMesh::EquationSystems(m)),
70 this->equation_systems->add_system<libMesh::ExplicitSystem>(
"Function");
71 this->equation_systems->get_system(
"Function").add_variable(
"u",
72 libMesh::Utility::string_to_enum<libMeshEnums::Order>(this->builder.order),
73 libMesh::Utility::string_to_enum<libMeshEnums::FEFamily>(this->builder.family));
74 this->equation_systems->init();
77 LibMeshFunction::~LibMeshFunction()
81 void LibMeshFunction::print_info()
const
84 this->equation_systems->get_mesh().print_info(std::cerr);
87 void LibMeshFunction::save_function(
const std::string & filename,
double time)
const
92 libMesh::ExodusII_IO(this->equation_systems->get_mesh()).write_timestep(
93 filename, *this->equation_systems, 1, time);
98 const LibMeshFunction & rhs_derived =
dynamic_cast<
99 const LibMeshFunction &
>(rhs);
101 this->equation_systems->get_system<libMesh::ExplicitSystem>(
"Function").solution->add(
102 scale, *(rhs_derived.equation_systems->get_system<libMesh::ExplicitSystem>(
103 "Function").solution));
106 void LibMeshFunction::pointwise_mult(
const FunctionBase & f1,
107 const FunctionBase & f2)
109 const LibMeshFunction & f1_derived =
static_cast<
110 const LibMeshFunction &
>(f1);
111 const LibMeshFunction & f2_derived =
static_cast<
112 const LibMeshFunction &
>(f2);
114 this->equation_systems->get_system<libMesh::ExplicitSystem>(
"Function").solution->pointwise_mult(
115 *(f1_derived.equation_systems->get_system<libMesh::ExplicitSystem>(
"Function").solution),
116 *(f2_derived.equation_systems->get_system<libMesh::ExplicitSystem>(
"Function").solution));
119 void LibMeshFunction::scale(
double scale) {
120 this->equation_systems->get_system<libMesh::ExplicitSystem>(
121 "Function").solution->scale(scale);
124 void LibMeshFunction::zero() {
125 this->equation_systems->get_system<libMesh::ExplicitSystem>(
126 "Function").solution->zero();
129 double LibMeshFunction::L2_norm()
const {
130 libMesh::ExplicitSystem & system =
131 this->equation_systems->get_system<libMesh::ExplicitSystem>(
"Function");
133 double norm = system.calculate_norm(*system.solution, libMesh::SystemNorm(L2));
137 boost::shared_ptr<FunctionBase> LibMeshFunction::zero_clone()
const
139 LibMeshFunction * clone =
new LibMeshFunction(this->builder,
140 this->equation_systems->get_mesh());
141 clone->equation_systems->get_system<libMesh::ExplicitSystem>(
142 "Function").solution->zero();
144 boost::shared_ptr<FunctionBase> ptr(clone);
148 boost::shared_ptr<libMesh::EquationSystems>
149 LibMeshFunction::get_equation_systems()
const {
150 return this->equation_systems;
155 #endif // QUESO_HAVE_LIBMESH