libMesh
coupled_system.C
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2019 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 
19 #include "libmesh/dirichlet_boundaries.h"
20 #include "libmesh/dof_map.h"
21 #include "libmesh/fe_base.h"
22 #include "libmesh/fe_interface.h"
23 #include "libmesh/fem_context.h"
24 #include "libmesh/getpot.h"
25 #include "libmesh/mesh.h"
26 #include "libmesh/parallel.h"
27 #include "libmesh/quadrature.h"
28 #include "libmesh/string_to_enum.h"
29 #include "libmesh/zero_function.h"
30 #include "libmesh/auto_ptr.h" // libmesh_make_unique
31 
32 #include "coupled_system.h"
33 
34 // Bring in everything from the libMesh namespace
35 using namespace libMesh;
36 
37 // Function to set the Dirichlet boundary function for the inlet boundary velocities
38 class BdyFunction : public FunctionBase<Number>
39 {
40 public:
41  BdyFunction (unsigned int u_var,
42  unsigned int v_var,
43  int sign) :
44  _u_var(u_var),
45  _v_var(v_var),
46  _sign(sign)
47  { this->_initialized = true; }
48 
49  virtual Number operator() (const Point &,
50  const Real = 0)
51  { libmesh_not_implemented(); }
52 
53  virtual void operator() (const Point & p,
54  const Real,
55  DenseVector<Number> & output)
56  {
57  output.resize(2);
58  output.zero();
59  const Real y=p(1);
60  // Set the parabolic inflow boundary conditions at stations 0 & 1
61  output(_u_var) = (_sign)*((y-2) * (y-3));
62  output(_v_var) = 0;
63  }
64 
65  virtual std::unique_ptr<FunctionBase<Number>> clone() const
66  { return libmesh_make_unique<BdyFunction>(_u_var, _v_var, int(_sign)); }
67 
68 private:
69  const unsigned int _u_var, _v_var;
70  const Real _sign;
71 };
72 
73 
75 {
76  // Check the input file for Reynolds number, application type,
77  // approximation type
78  GetPot infile("coupled_system.in");
79  Peclet = infile("Peclet", 1.);
80  unsigned int pressure_p = infile("pressure_p", 1);
81  std::string fe_family = infile("fe_family", std::string("LAGRANGE"));
82 
83  // LBB needs better-than-quadratic velocities for better-than-linear
84  // pressures, and libMesh needs non-Lagrange elements for
85  // better-than-quadratic velocities.
86  libmesh_assert((pressure_p == 1) || (fe_family != "LAGRANGE"));
87 
88  FEFamily fefamily = Utility::string_to_enum<FEFamily>(fe_family);
89 
90  // Add the velocity components "u" & "v". They
91  // will be approximated using second-order approximation.
92  u_var = this->add_variable ("u", static_cast<Order>(pressure_p+1),
93  fefamily);
94  v_var = this->add_variable ("v", static_cast<Order>(pressure_p+1),
95  fefamily);
96 
97  // Add the pressure variable "p". This will
98  // be approximated with a first-order basis,
99  // providing an LBB-stable pressure-velocity pair.
100  p_var = this->add_variable ("p", static_cast<Order>(pressure_p),
101  fefamily);
102 
103  // Add the Concentration variable "C". They will
104  // be approximated using second-order approximation, the same as the velocity components
105  C_var = this->add_variable ("C", static_cast<Order>(pressure_p+1),
106  fefamily);
107 
108  // Tell the system to march velocity and concentration forward in
109  // time, with first order time derivatives, but leave pressure as a
110  // constraint only
111  this->time_evolving(u_var, 1);
112  this->time_evolving(v_var, 1);
113  this->time_evolving(C_var, 1);
114 
115  // Useful debugging options
116  this->verify_analytic_jacobians = infile("verify_analytic_jacobians", 0.);
117 
118  // Set Dirichlet boundary conditions
119  const boundary_id_type left_inlet_id = 0;
120  std::set<boundary_id_type> left_inlet_bdy;
121  left_inlet_bdy.insert(left_inlet_id);
122 
123  const boundary_id_type right_inlet_id = 1;
124  std::set<boundary_id_type> right_inlet_bdy;
125  right_inlet_bdy.insert(right_inlet_id);
126 
127  const boundary_id_type outlets_id = 2;
128  std::set<boundary_id_type> outlets_bdy;
129  outlets_bdy.insert(outlets_id);
130 
131  const boundary_id_type wall_id = 3;
132  std::set<boundary_id_type> wall_bdy;
133  wall_bdy.insert(wall_id);
134 
135  // The uv identifier for the setting the inlet and wall velocity boundary conditions
136  std::vector<unsigned int> uv(1, u_var);
137  uv.push_back(v_var);
138  // The C_only identifier for setting the concentrations at the inlets
139  std::vector<unsigned int> C_only(1, C_var);
140 
141  // The zero and constant functions
143  ConstFunction<Number> one(1);
144 
145  // We need two boundary functions for the inlets, because the signs on the velocities
146  // will be different
147  int velocity_sign = 1;
148  BdyFunction inflow_left(u_var, v_var, -velocity_sign);
149  BdyFunction inflow_right(u_var, v_var, velocity_sign);
150 
151 #ifdef LIBMESH_ENABLE_DIRICHLET
152  // On the walls we will apply the no slip and no penetration boundary condition, u=0, v=0
153  this->get_dof_map().add_dirichlet_boundary
154  (DirichletBoundary (wall_bdy, uv, &zero));
155 
156  // On the inlet (left), we apply parabolic inflow boundary conditions for the velocity, u = - (y-2)*(y-3), v=0
157  // and set C = 1
158  this->get_dof_map().add_dirichlet_boundary
159  (DirichletBoundary (left_inlet_bdy, uv, &inflow_left));
160  this->get_dof_map().add_dirichlet_boundary
161  (DirichletBoundary (left_inlet_bdy, C_only, &one));
162 
163  // On the inlet (right), we apply parabolic inflow boundary conditions for the velocity, u = (y-2)*(y-3), v=0
164  // and set C = 0
165  this->get_dof_map().add_dirichlet_boundary
166  (DirichletBoundary (right_inlet_bdy, uv, &inflow_right));
167  this->get_dof_map().add_dirichlet_boundary
168  (DirichletBoundary (right_inlet_bdy, C_only, &zero));
169 #endif // LIBMESH_ENABLE_DIRICHLET
170 
171  // Note that the remaining boundary conditions are the natural boundary conditions for the concentration
172  // on the wall (grad(c) dot n = 0) and natural boundary conditions for the velocity and the concentration
173  // on the outlets ((grad(velocity) dot n - p n) dot t = 0, grad(C) dot n = 0)
174 
175  // Do the parent's initialization after variables and boundary constraints are defined
177 }
178 
180 {
181  FEMContext & c = cast_ref<FEMContext &>(context);
182 
183  // We should prerequest all the data
184  // we will need to build the linear system.
185  // Note that the concentration and velocity components
186  // use the same basis.
187  FEBase * u_elem_fe = nullptr;
188  c.get_element_fe(u_var, u_elem_fe);
189  u_elem_fe->get_JxW();
190  u_elem_fe->get_phi();
191  u_elem_fe->get_dphi();
192  u_elem_fe->get_xyz();
193 
194  FEBase * p_elem_fe = nullptr;
195  c.get_element_fe(p_var, p_elem_fe);
196  p_elem_fe->get_phi();
197 
198  FEBase * side_fe = nullptr;
199  c.get_side_fe(u_var, side_fe);
200 
201  side_fe->get_JxW();
202  side_fe->get_phi();
203  side_fe->get_xyz();
204 }
205 
206 
207 bool CoupledSystem::element_time_derivative (bool request_jacobian,
208  DiffContext & context)
209 {
210  FEMContext & c = cast_ref<FEMContext &>(context);
211 
212  // First we get some references to cell-specific data that
213  // will be used to assemble the linear system.
214  FEBase * u_elem_fe = nullptr;
215  c.get_element_fe(u_var, u_elem_fe);
216 
217  // Element Jacobian * quadrature weights for interior integration
218  const std::vector<Real> & JxW = u_elem_fe->get_JxW();
219 
220  // The velocity shape functions at interior quadrature points.
221  const std::vector<std::vector<Real>> & phi = u_elem_fe->get_phi();
222 
223  // The velocity shape function gradients at interior
224  // quadrature points.
225  const std::vector<std::vector<RealGradient>> & dphi = u_elem_fe->get_dphi();
226 
227  // The pressure shape functions at interior
228  // quadrature points.
229  FEBase * p_elem_fe = nullptr;
230  c.get_element_fe(p_var, p_elem_fe);
231 
232  const std::vector<std::vector<Real>> & psi = p_elem_fe->get_phi();
233 
234  // The number of local degrees of freedom in each variable
235  const unsigned int n_p_dofs = c.n_dof_indices(p_var);
236  const unsigned int n_u_dofs = c.n_dof_indices(u_var);
237  libmesh_assert_equal_to (n_u_dofs, c.n_dof_indices(v_var));
238 
239  // The subvectors and submatrices we need to fill:
240  DenseSubMatrix<Number> & Kuu = c.get_elem_jacobian(u_var, u_var);
241  DenseSubMatrix<Number> & Kup = c.get_elem_jacobian(u_var, p_var);
243 
244  DenseSubMatrix<Number> & Kvv = c.get_elem_jacobian(v_var, v_var);
245  DenseSubMatrix<Number> & Kvp = c.get_elem_jacobian(v_var, p_var);
247 
248  DenseSubMatrix<Number> & KCu = c.get_elem_jacobian(C_var, u_var);
249  DenseSubMatrix<Number> & KCv = c.get_elem_jacobian(C_var, v_var);
250  DenseSubMatrix<Number> & KCC = c.get_elem_jacobian(C_var, C_var);
252 
253  // Now we will build the element Jacobian and residual.
254  // Constructing the residual requires the solution and its
255  // gradient from the previous timestep. This must be
256  // calculated at each quadrature point by summing the
257  // solution degree-of-freedom values by the appropriate
258  // weight functions.
259  unsigned int n_qpoints = c.get_element_qrule().n_points();
260 
261  for (unsigned int qp=0; qp != n_qpoints; qp++)
262  {
263  // Compute the solution & its gradient at the old Newton iterate
264  Number p = c.interior_value(p_var, qp),
265  u = c.interior_value(u_var, qp),
266  v = c.interior_value(v_var, qp);
267  Gradient grad_u = c.interior_gradient(u_var, qp),
268  grad_v = c.interior_gradient(v_var, qp),
269  grad_C = c.interior_gradient(C_var, qp);
270 
271  // Definitions for convenience. It is sometimes simpler to do a
272  // dot product if you have the full vector at your disposal.
273  NumberVectorValue U (u, v);
274  const Number C_x = grad_C(0);
275  const Number C_y = grad_C(1);
276 
277  // First, an i-loop over the velocity degrees of freedom.
278  // We know that n_u_dofs == n_v_dofs so we can compute contributions
279  // for both at the same time.
280  for (unsigned int i=0; i != n_u_dofs; i++)
281  {
282  // Stokes equations residuals
283  Fu(i) += JxW[qp] *
284  (p*dphi[i][qp](0) - // pressure term
285  (grad_u*dphi[i][qp])); // diffusion term
286 
287  Fv(i) += JxW[qp] *
288  (p*dphi[i][qp](1) - // pressure term
289  (grad_v*dphi[i][qp])); // diffusion term
290 
291  // Concentration Equation Residual
292  FC(i) += JxW[qp] *
293  ((U*grad_C)*phi[i][qp] + // convection term
294  (1./Peclet)*(grad_C*dphi[i][qp])); // diffusion term
295 
296  // Note that the Fp block is identically zero unless we are using
297  // some kind of artificial compressibility scheme...
298 
299  if (request_jacobian && c.elem_solution_derivative)
300  {
302 
303  // Matrix contributions for the uu and vv couplings.
304  for (unsigned int j=0; j != n_u_dofs; j++)
305  {
306  Kuu(i,j) += JxW[qp] * (-(dphi[i][qp]*dphi[j][qp])); // diffusion term
307 
308  Kvv(i,j) += JxW[qp] * (-(dphi[i][qp]*dphi[j][qp])); // diffusion term
309 
310  KCu(i,j) += JxW[qp] * ((phi[j][qp]*C_x)*phi[i][qp]); // convection term
311 
312  KCv(i,j) += JxW[qp] * ((phi[j][qp]*C_y)*phi[i][qp]); // convection term
313 
314  KCC(i,j) += JxW[qp]*
315  ((U*dphi[j][qp])*phi[i][qp] + // nonlinear term (convection)
316  (1./Peclet)*(dphi[j][qp]*dphi[i][qp])); // diffusion term
317  }
318 
319  // Matrix contributions for the up and vp couplings.
320  for (unsigned int j=0; j != n_p_dofs; j++)
321  {
322  Kup(i,j) += JxW[qp]*psi[j][qp]*dphi[i][qp](0);
323  Kvp(i,j) += JxW[qp]*psi[j][qp]*dphi[i][qp](1);
324  }
325  }
326  }
327  } // end of the quadrature point qp-loop
328 
329  return request_jacobian;
330 }
331 
332 
333 bool CoupledSystem::element_constraint (bool request_jacobian,
334  DiffContext & context)
335 {
336  FEMContext & c = cast_ref<FEMContext &>(context);
337 
338  // Here we define some references to cell-specific data that
339  // will be used to assemble the linear system.
340  FEBase * u_elem_fe = nullptr;
341  c.get_element_fe(u_var, u_elem_fe);
342 
343  FEBase * p_elem_fe = nullptr;
344  c.get_element_fe(p_var, p_elem_fe);
345 
346  // Element Jacobian * quadrature weight for interior integration
347  const std::vector<Real> & JxW = u_elem_fe->get_JxW();
348 
349  // The velocity shape function gradients at interior
350  // quadrature points.
351  const std::vector<std::vector<RealGradient>> & dphi = u_elem_fe->get_dphi();
352 
353  // The pressure shape functions at interior
354  // quadrature points.
355  const std::vector<std::vector<Real>> & psi = p_elem_fe->get_phi();
356 
357  // The number of local degrees of freedom in each variable
358  const unsigned int n_u_dofs = c.n_dof_indices(u_var);
359  const unsigned int n_p_dofs = c.n_dof_indices(p_var);
360 
361  // The subvectors and submatrices we need to fill:
362  DenseSubMatrix<Number> & Kpu = c.get_elem_jacobian(p_var, u_var);
363  DenseSubMatrix<Number> & Kpv = c.get_elem_jacobian(p_var, v_var);
365 
366  // Add the constraint given by the continuity equation
367  unsigned int n_qpoints = c.get_element_qrule().n_points();
368  for (unsigned int qp=0; qp != n_qpoints; qp++)
369  {
370  // Compute the velocity gradient at the old Newton iterate
371  Gradient
372  grad_u = c.interior_gradient(u_var, qp),
373  grad_v = c.interior_gradient(v_var, qp);
374 
375  // Now a loop over the pressure degrees of freedom. This
376  // computes the contributions of the continuity equation.
377  for (unsigned int i=0; i != n_p_dofs; i++)
378  {
379  Fp(i) += JxW[qp] * psi[i][qp] *
380  (grad_u(0) + grad_v(1));
381 
382  if (request_jacobian && c.elem_solution_derivative)
383  {
385 
386  for (unsigned int j=0; j != n_u_dofs; j++)
387  {
388  Kpu(i,j) += JxW[qp]*psi[i][qp]*dphi[j][qp](0);
389  Kpv(i,j) += JxW[qp]*psi[i][qp]*dphi[j][qp](1);
390  }
391  }
392  }
393  } // end of the quadrature point qp-loop
394 
395  return request_jacobian;
396 }
397 
399 {
400  // We need to overload the postprocess function to set the
401  // computed_QoI variable of the CoupledSystem class to the qoi value
402  // stored in System::qoi[0]
403  computed_QoI = System::qoi[0];
404 }
405 
406 // These functions supply the nonlinear weighting for the adjoint residual error estimate which
407 // arise due to the convection term in the convection-diffusion equation:
408 // ||e((u_1)_h C,1)||_{L2} ||e(C^*)||_{L2} + ||e(u1 C,1_h)||_{L2} ||e(C^*)||_{L2}
409 // ||e((u_2)_h C,2)||_{L2} ||e(C^*)||_{L2} + ||e(u2 C,2_h)||_{L2} ||e(C^*)||_{L2}
410 // These functions compute (u_1)_h or C,1_h , and (u_2)_h or C,2_h , and supply it to the weighted patch recovery error estimator
411 // In CoupledFEMFunctionsx, the object built with var = 0, returns the (u_1)_h weight, while
412 // the object built with var = 1, returns the C,1_h weight. The switch statement
413 // distinguishes the behavior of the two objects
414 // Same thing for CoupledFEMFunctionsy
416  const Point & p,
417  const Real /* time */)
418 {
419  Number weight = 0.0;
420 
421  switch(var)
422  {
423  case 0:
424  {
425  Gradient grad_C = c.point_gradient(3, p);
426 
427  weight = grad_C(0);
428  }
429  break;
430 
431  case 3:
432  {
433  Number u = c.point_value(0, p);
434 
435  weight = u;
436  }
437  break;
438 
439  default:
440  libmesh_error_msg("Wrong variable number " \
441  << var \
442  << " passed to CoupledFEMFunctionsx object! Quitting!");
443  }
444 
445  return weight;
446 }
447 
449  const Point & p,
450  const Real /* time */)
451 {
452  Number weight = 0.0;
453 
454  switch(var)
455  {
456  case 1:
457  {
458  Gradient grad_C = c.point_gradient(3, p);
459 
460  weight = grad_C(1);
461  }
462  break;
463 
464  case 3:
465  {
466  Number v = c.point_value(1, p);
467 
468  weight = v;
469  }
470  break;
471 
472  default:
473  libmesh_error_msg("Wrong variable number " \
474  << var \
475  << " passed to CoupledFEMFunctionsy object! Quitting!");
476  }
477 
478  return weight;
479 }
CoupledSystem::element_time_derivative
virtual bool element_time_derivative(bool request_jacobian, DiffContext &context)
Adds the time derivative contribution on elem to elem_residual.
Definition: coupled_system.C:207
libMesh::Number
Real Number
Definition: libmesh_common.h:195
libMesh::DiffContext::get_elem_residual
const DenseVector< Number > & get_elem_residual() const
Const accessor for element residual.
Definition: diff_context.h:249
libMesh::FEMContext::get_element_qrule
const QBase & get_element_qrule() const
Accessor for element interior quadrature rule for the dimension of the current _elem.
Definition: fem_context.h:790
libMesh::FunctionBase
Base class for functors that can be evaluated at a point and (optionally) time.
Definition: dirichlet_boundaries.h:44
libMesh::FEAbstract::get_xyz
const std::vector< Point > & get_xyz() const
Definition: fe_abstract.h:237
BdyFunction::_v_var
const unsigned int _v_var
Definition: coupled_system.C:69
CoupledSystem::postprocess
virtual void postprocess()
Runs a postprocessing loop over all elements, and if postprocess_sides is true over all sides.
Definition: coupled_system.C:398
libMesh::FEMSystem::init_data
virtual void init_data() override
Initializes the member data fields associated with the system, so that, e.g., assemble() may be used.
Definition: fem_system.C:843
libMesh::DenseSubMatrix
Defines a dense submatrix for use in Finite Element-type computations.
Definition: dense_submatrix.h:45
libMesh::QBase::n_points
unsigned int n_points() const
Definition: quadrature.h:126
libMesh
The libMesh namespace provides an interface to certain functionality in the library.
Definition: factoryfunction.C:55
libMesh::DenseVector::zero
virtual void zero() override
Set every element in the vector to 0.
Definition: dense_vector.h:379
libMesh::FEGenericBase
This class forms the foundation from which generic finite elements may be derived.
Definition: exact_error_estimator.h:39
libMesh::FEAbstract::get_JxW
const std::vector< Real > & get_JxW() const
Definition: fe_abstract.h:244
BdyFunction::_sign
const Real _sign
Definition: coupled_system.C:70
BdyFunction
Definition: coupled_system.C:38
libMesh::FEGenericBase::get_dphi
const std::vector< std::vector< OutputGradient > > & get_dphi() const
Definition: fe_base.h:214
libMesh::boundary_id_type
int8_t boundary_id_type
Definition: id_types.h:51
libMesh::FEMContext::point_value
Number point_value(unsigned int var, const Point &p) const
Definition: fem_context.C:833
BdyFunction::BdyFunction
BdyFunction(unsigned int u_var, unsigned int v_var, int sign)
Definition: coupled_system.C:41
libMesh::VectorValue< Number >
libMesh::zero
const Number zero
.
Definition: libmesh.h:243
libMesh::libmesh_assert
libmesh_assert(ctx)
libMesh::System::qoi
std::vector< Number > qoi
Values of the quantities of interest.
Definition: system.h:1574
CoupledSystem::element_constraint
virtual bool element_constraint(bool request_jacobian, DiffContext &context)
Adds the constraint contribution on elem to elem_residual.
Definition: coupled_system.C:333
libMesh::Point
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:38
coupled_system.h
CoupledSystem::init_context
virtual void init_context(DiffContext &context)
Definition: coupled_system.C:179
libMesh::FEMContext::point_gradient
Gradient point_gradient(unsigned int var, const Point &p) const
Definition: fem_context.C:879
BdyFunction::clone
virtual std::unique_ptr< FunctionBase< Number > > clone() const
Definition: coupled_system.C:65
libMesh::DiffContext::n_dof_indices
unsigned int n_dof_indices() const
Total number of dof indices on the element.
Definition: diff_context.h:399
libMesh::ZeroFunction
ConstFunction that simply returns 0.
Definition: zero_function.h:36
libMesh::DiffContext
This class provides all data required for a physics package (e.g.
Definition: diff_context.h:55
libMesh::DenseSubVector< Number >
CoupledFEMFunctionsx::operator()
virtual void operator()(const FEMContext &, const Point &, const Real, DenseVector< Number > &)
Definition: coupled_system.h:123
libMesh::DiffContext::elem_solution_derivative
Real elem_solution_derivative
The derivative of elem_solution with respect to the current nonlinear solution.
Definition: diff_context.h:500
libMesh::DenseVector::resize
void resize(const unsigned int n)
Resize the vector.
Definition: dense_vector.h:355
libMesh::FEMContext::get_element_fe
void get_element_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for interior finite element object for variable var for the largest dimension in the mesh.
Definition: fem_context.h:275
libMesh::FEMContext::interior_gradient
Gradient interior_gradient(unsigned int var, unsigned int qp) const
Definition: fem_context.C:426
CoupledSystem::init_data
virtual void init_data()
Initializes the member data fields associated with the system, so that, e.g., assemble() may be used.
Definition: coupled_system.C:74
libMesh::FEFamily
FEFamily
Definition: enum_fe_family.h:34
libMesh::DiffContext::get_elem_jacobian
const DenseMatrix< Number > & get_elem_jacobian() const
Const accessor for element Jacobian.
Definition: diff_context.h:283
libMesh::DirichletBoundary
This class allows one to associate Dirichlet boundary values with a given set of mesh boundary ids an...
Definition: dirichlet_boundaries.h:88
libMesh::FEMContext::get_side_fe
void get_side_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for edge/face (2D/3D) finite element object for variable var for the largest dimension in th...
Definition: fem_context.h:312
CoupledFEMFunctionsy::operator()
virtual void operator()(const FEMContext &, const Point &, const Real, DenseVector< Number > &)
Definition: coupled_system.h:154
libMesh::FEGenericBase::get_phi
const std::vector< std::vector< OutputShape > > & get_phi() const
Definition: fe_base.h:206
libMesh::Real
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Definition: libmesh_common.h:121
libMesh::MeshTools::weight
dof_id_type weight(const MeshBase &mesh, const processor_id_type pid)
Definition: mesh_tools.C:236
libMesh::ConstFunction
Function that returns a single value that never changes.
Definition: const_function.h:43
libMesh::FEMContext::interior_value
Number interior_value(unsigned int var, unsigned int qp) const
Definition: fem_context.C:371
libMesh::DenseVector< Number >
libMesh::FEMContext
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62