libMesh
Loading...
Searching...
No Matches
subdomains_ex2.C
Go to the documentation of this file.
1// The libMesh Finite Element Library.
2// Copyright (C) 2002-2026 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
20// <h1>Subdomains Example 2 - Subdomain-Restricted Variables</h1>
21// \author Benjamin S. Kirk
22// \date 2011
23//
24// This example builds on the fourth example program by showing how
25// to restrict solution fields to a subdomain (or union of
26// subdomains).
27
28
29// C++ include files that we need
30#include <iostream>
31#include <algorithm>
32#include <math.h>
33
34// Basic include file needed for the mesh functionality.
35#include "libmesh/libmesh.h"
36#include "libmesh/mesh.h"
37#include "libmesh/mesh_generation.h"
38#include "libmesh/exodusII_io.h"
39#include "libmesh/gnuplot_io.h"
40#include "libmesh/linear_implicit_system.h"
41#include "libmesh/equation_systems.h"
42
43// Define the Finite Element object.
44#include "libmesh/fe.h"
45
46// Define Gauss quadrature rules.
47#include "libmesh/quadrature_gauss.h"
48
49// Define the DofMap, which handles degree of freedom
50// indexing.
51#include "libmesh/dof_map.h"
52
53// Define useful datatypes for finite element
54// matrix and vector components.
55#include "libmesh/sparse_matrix.h"
56#include "libmesh/numeric_vector.h"
57#include "libmesh/dense_matrix.h"
58#include "libmesh/dense_vector.h"
59
60// Define the PerfLog, a performance logging utility.
61// It is useful for timing events in a code and giving
62// you an idea where bottlenecks lie.
63#include "libmesh/perf_log.h"
64
65// The definition of a geometric element
66#include "libmesh/elem.h"
67
68#include "libmesh/string_to_enum.h"
69#include "libmesh/getpot.h"
70#include "libmesh/enum_solver_package.h"
71
72// Bring in everything from the libMesh namespace
73using namespace libMesh;
74
75
76
77// Function prototype. This is the function that will assemble
78// the linear system for our Poisson problem. Note that the
79// function will take the EquationSystems object and the
80// name of the system we are assembling as input. From the
81// EquationSystems object we have access to the Mesh and
82// other objects we might need.
84 const std::string & system_name);
85
86// Exact solution function prototype.
87Real exact_solution (const Real x,
88 const Real y = 0.,
89 const Real z = 0.);
90
91// Begin the main program.
92int main (int argc, char ** argv)
93{
94 // Initialize libMesh and any dependent libraries, like in example 2.
95 LibMeshInit init (argc, argv);
96
97 // This example requires a linear solver package.
98 libmesh_example_requires(libMesh::default_solver_package() != INVALID_SOLVER_PACKAGE,
99 "--enable-petsc, --enable-trilinos, or --enable-eigen");
100
101 // Declare a performance log for the main program
102 // PerfLog perf_main("Main Program");
103
104 // Create a GetPot object to parse the command line
105 GetPot command_line (argc, argv);
106
107 // Check for proper calling arguments.
108 libmesh_error_msg_if(argc < 3, "Usage:\n" << "\t " << argv[0] << " -d 2(3)" << " -n 15");
109
110 // Brief message to the user regarding the program name
111 // and command line arguments.
112 libMesh::out << "Running " << argv[0];
113
114 for (int i=1; i<argc; i++)
115 libMesh::out << " " << argv[i];
116
117 libMesh::out << std::endl << std::endl;
118
119 // Read problem dimension from command line. Use int
120 // instead of unsigned since the GetPot overload is ambiguous
121 // otherwise.
122 const int dim = libMesh::command_line_next("-d", 2);
123
124 // Skip higher-dimensional examples on a lower-dimensional libMesh build
125 libmesh_example_requires(dim <= LIBMESH_DIM, "2D/3D support");
126
127 // Create a mesh with user-defined dimension on the default MPI
128 // communicator.
129 Mesh mesh (init.comm(), dim);
130
131 // Read number of elements from command line
132 const int ps = libMesh::command_line_next("-n", 15);
133
134 // Read FE order from command line
135 std::string order = "SECOND";
136 order = libMesh::command_line_next("-o", order);
137 order = libMesh::command_line_next("-Order", order);
138
139 // Read FE Family from command line
140 std::string family = "LAGRANGE";
141 family = libMesh::command_line_next("-f", family);
142 family = libMesh::command_line_next("-FEFamily", family);
143
144 // Cannot use discontinuous basis.
145 libmesh_error_msg_if(((family == "MONOMIAL") || (family == "XYZ")) &&
146 mesh.processor_id() == 0,
147 "This example requires a C^0 (or higher) FE basis.");
148
149 // Use the MeshTools::Generation mesh generator to create a uniform
150 // grid on the square [-1,1]^D. We instruct the mesh generator
151 // to build a mesh of 8x8 Quad9 elements in 2D, or Hex27
152 // elements in 3D. Building these higher-order elements allows
153 // us to use higher-order approximation, as in example 3.
154
155 Real halfwidth = dim > 1 ? 1. : 0.;
156 Real halfheight = dim > 2 ? 1. : 0.;
157
158 if ((family == "LAGRANGE") && (order == "FIRST"))
159 {
160 // No reason to use high-order geometric elements if we are
161 // solving with low-order finite elements.
163 ps,
164 (dim>1) ? ps : 0,
165 (dim>2) ? ps : 0,
166 -1., 1.,
167 -halfwidth, halfwidth,
168 -halfheight, halfheight,
169 (dim==1) ? EDGE2 :
170 ((dim == 2) ? QUAD4 : HEX8));
171 }
172
173 else
174 {
176 ps,
177 (dim>1) ? ps : 0,
178 (dim>2) ? ps : 0,
179 -1., 1.,
180 -halfwidth, halfwidth,
181 -halfheight, halfheight,
182 (dim==1) ? EDGE3 :
183 ((dim == 2) ? QUAD9 : HEX27));
184 }
185
186 for (auto & elem : mesh.element_ptr_range())
187 {
188 const Point cent = elem->vertex_average();
189 if (dim > 1)
190 {
191 if ((cent(0) > 0) == (cent(1) > 0))
192 elem->subdomain_id() = 1;
193 }
194 else if (cent(0) > 0)
195 elem->subdomain_id() = 1;
196 }
197
198 // Make sure the mesh knows we added new subdomains.
200
201 // Print information about the mesh to the screen.
203
204 // Create an equation systems object.
205 EquationSystems equation_systems (mesh);
206
207 // Declare the system and its variables.
208 // Create a system named "Poisson"
209 LinearImplicitSystem & system =
210 equation_systems.add_system<LinearImplicitSystem> ("Poisson");
211
212
213 std::set<subdomain_id_type> active_subdomains;
214
215
216 // Add the variable "u" to "Poisson". "u"
217 // will be approximated using second-order approximation.
218 active_subdomains.clear(); active_subdomains.insert(0);
219 system.add_variable("u",
220 Utility::string_to_enum<Order> (order),
221 Utility::string_to_enum<FEFamily>(family),
222 &active_subdomains);
223
224 // Add the variable "v" to "Poisson". "v"
225 // will be approximated using second-order approximation.
226 active_subdomains.clear(); active_subdomains.insert(1);
227 system.add_variable("v",
228 Utility::string_to_enum<Order> (order),
229 Utility::string_to_enum<FEFamily>(family),
230 &active_subdomains);
231
232 // Give the system a pointer to the matrix assembly
233 // function.
235
236 // Initialize the data structures for the equation system.
237 equation_systems.init();
238
239 // Print information about the system to the screen.
240 equation_systems.print_info();
242
243 // Solve the system "Poisson", just like example 2.
244 equation_systems.get_system("Poisson").solve();
245
246 // After solving the system write the solution
247 // to a GMV-formatted plot file.
248 if (dim == 1)
249 {
250 GnuPlotIO plot(mesh, "Subdomains Example 2, 1D", GnuPlotIO::GRID_ON);
251 plot.write_equation_systems("gnuplot_script", equation_systems);
252 }
253 else
254 {
255#ifdef LIBMESH_HAVE_EXODUS_API
257 "out_3.e" : "out_2.e", equation_systems);
258#endif // #ifdef LIBMESH_HAVE_EXODUS_API
259 }
260
261 // All done.
262 return 0;
263}
264
265
266
267
268//
269//
270//
271// We now define the matrix assembly function for the
272// Poisson system. We need to first compute element
273// matrices and right-hand sides, and then take into
274// account the boundary conditions, which will be handled
275// via a penalty method.
277 const std::string & libmesh_dbg_var(system_name))
278{
279 // It is a good idea to make sure we are assembling
280 // the proper system.
281 libmesh_assert_equal_to (system_name, "Poisson");
282
283 // Declare a performance log. Give it a descriptive
284 // string to identify what part of the code we are
285 // logging, since there may be many PerfLogs in an
286 // application.
287 PerfLog perf_log ("Matrix Assembly");
288
289 // Get a constant reference to the mesh object.
290 const MeshBase & mesh = es.get_mesh();
291
292 // The dimension that we are running
293 const unsigned int dim = mesh.mesh_dimension();
294
295 // Get a reference to the LinearImplicitSystem we are solving
296 LinearImplicitSystem & system = es.get_system<LinearImplicitSystem>("Poisson");
297
298 // A reference to the DofMap object for this system. The DofMap
299 // object handles the index translation from node and element numbers
300 // to degree of freedom numbers. We will talk more about the DofMap
301 // in future examples.
302 const DofMap & dof_map = system.get_dof_map();
303
304 // Get a constant reference to the Finite Element type
305 // for the first (and only) variable in the system.
306 FEType fe_type = dof_map.variable_type(0);
307
308 // Build a Finite Element object of the specified type. Since the
309 // FEBase::build() member dynamically creates memory we will
310 // store the object as a std::unique_ptr<FEBase>. This can be thought
311 // of as a pointer that will clean up after itself.
312 std::unique_ptr<FEBase> fe (FEBase::build(dim, fe_type));
313
314 // A 5th order Gauss quadrature rule for numerical integration.
315 QGauss qrule (dim, FIFTH);
316
317 // Tell the finite element object to use our quadrature rule.
318 fe->attach_quadrature_rule (&qrule);
319
320 // Declare a special finite element object for
321 // boundary integration.
322 std::unique_ptr<FEBase> fe_face (FEBase::build(dim, fe_type));
323
324 // Boundary integration requires one quadrature rule,
325 // with dimensionality one less than the dimensionality
326 // of the element.
327 QGauss qface(dim-1, FIFTH);
328
329 // Tell the finite element object to use our
330 // quadrature rule.
331 fe_face->attach_quadrature_rule (&qface);
332
333 // Here we define some references to cell-specific data that
334 // will be used to assemble the linear system.
335 // We begin with the element Jacobian * quadrature weight at each
336 // integration point.
337 const std::vector<Real> & JxW = fe->get_JxW();
338
339 // The physical XY locations of the quadrature points on the element.
340 // These might be useful for evaluating spatially varying material
341 // properties at the quadrature points.
342 const std::vector<Point> & q_point = fe->get_xyz();
343
344 // The element shape functions evaluated at the quadrature points.
345 const std::vector<std::vector<Real>> & phi = fe->get_phi();
346
347 // The element shape function gradients evaluated at the quadrature
348 // points.
349 const std::vector<std::vector<RealGradient>> & dphi = fe->get_dphi();
350
351 // Define data structures to contain the element matrix
352 // and right-hand-side vector contribution. Following
353 // basic finite element terminology we will denote these
354 // "Ke" and "Fe". More detail is in example 3.
357
358 // This vector will hold the degree of freedom indices for
359 // the element. These define where in the global system
360 // the element degrees of freedom get mapped.
361 std::vector<dof_id_type> dof_indices, dof_indices2;
362
363 // The global system matrix
364 SparseMatrix<Number> & matrix = system.get_system_matrix();
365
366 // Now we will loop over all the "local" elements in the mesh. We
367 // will compute the element matrix and right-hand-side contribution.
368 // See example 3 for a discussion of the element iterators. Here we
369 // only want to loop over elements that are owned by the local
370 // processor. This allows each processor to compute its components
371 // of the global matrix.
372 //
373 // "PARALLEL CHANGE"
374 for (const auto & elem : as_range(mesh.local_elements_begin(),
375 mesh.local_elements_end()))
376 {
377 // Start logging the shape function initialization.
378 // This is done through a simple function call with
379 // the name of the event to log.
380 perf_log.push("elem init");
381
382 // Get the degree of freedom indices for the
383 // current element. These define where in the global
384 // matrix and right-hand-side this element will
385 // contribute to.
386 dof_map.dof_indices (elem, dof_indices, 0);
387 dof_map.dof_indices (elem, dof_indices2, 1);
388
389 // libMesh::out << "dof_indices.size()="
390 // << dof_indices.size()
391 // << ", dof_indices2.size()="
392 // << dof_indices2.size()
393 // << std::endl;
394
395 // Compute the element-specific data for the current
396 // element. This involves computing the location of the
397 // quadrature points (q_point) and the shape functions
398 // (phi, dphi) for the current element.
399 fe->reinit (elem);
400
401 // Zero the element matrix and right-hand side before
402 // summing them. We use the resize member here because
403 // the number of degrees of freedom might have changed from
404 // the last element. Note that this will be the case if the
405 // element type is different (i.e. the last element was a
406 // triangle, now we are on a quadrilateral).
407 Ke.resize (std::max(dof_indices.size(), dof_indices2.size()),
408 std::max(dof_indices.size(), dof_indices2.size()));
409
410 Fe.resize (std::max(dof_indices.size(), dof_indices2.size()));
411
412 // Stop logging the shape function initialization.
413 // If you forget to stop logging an event the PerfLog
414 // object will probably catch the error and abort.
415 perf_log.pop("elem init");
416
417 // Now we will build the element matrix. This involves
418 // a double loop to integrate the test functions (i) against
419 // the trial functions (j).
420 //
421 // We have split the numeric integration into two loops
422 // so that we can log the matrix and right-hand-side
423 // computation separately.
424 //
425 // Now start logging the element matrix computation
426 perf_log.push ("Ke");
427
428 for (unsigned int qp=0; qp<qrule.n_points(); qp++)
429 for (std::size_t i=0; i<phi.size(); i++)
430 for (std::size_t j=0; j<phi.size(); j++)
431 Ke(i,j) += JxW[qp]*(dphi[i][qp]*dphi[j][qp]);
432
433
434 // Stop logging the matrix computation
435 perf_log.pop ("Ke");
436
437 // Now we build the element right-hand-side contribution.
438 // This involves a single loop in which we integrate the
439 // "forcing function" in the PDE against the test functions.
440 //
441 // Start logging the right-hand-side computation
442 perf_log.push ("Fe");
443
444 for (unsigned int qp=0; qp<qrule.n_points(); qp++)
445 {
446 // fxy is the forcing function for the Poisson equation.
447 // In this case we set fxy to be a finite difference
448 // Laplacian approximation to the (known) exact solution.
449 //
450 // We will use the second-order accurate FD Laplacian
451 // approximation, which in 2D on a structured grid is
452 //
453 // u_xx + u_yy = (u(i-1,j) + u(i+1,j) +
454 // u(i,j-1) + u(i,j+1) +
455 // -4*u(i,j))/h^2
456 //
457 // Since the value of the forcing function depends only
458 // on the location of the quadrature point (q_point[qp])
459 // we will compute it here, outside of the i-loop
460 const Real x = q_point[qp](0);
461#if LIBMESH_DIM > 1
462 const Real y = q_point[qp](1);
463#else
464 const Real y = 0;
465#endif
466#if LIBMESH_DIM > 2
467 const Real z = q_point[qp](2);
468#else
469 const Real z = 0;
470#endif
471 const Real eps = 1.e-3;
472
473 const Real uxx = (exact_solution(x-eps, y, z) +
474 exact_solution(x+eps, y, z) +
475 -2.*exact_solution(x, y, z))/eps/eps;
476
477 const Real uyy = (exact_solution(x, y-eps, z) +
478 exact_solution(x, y+eps, z) +
479 -2.*exact_solution(x, y, z))/eps/eps;
480
481 const Real uzz = (exact_solution(x, y, z-eps) +
482 exact_solution(x, y, z+eps) +
483 -2.*exact_solution(x, y, z))/eps/eps;
484
485 Real fxy;
486 if (dim==1)
487 {
488 // In 1D, compute the rhs by differentiating the
489 // exact solution twice.
490 const Real pi = libMesh::pi;
491 fxy = (0.25*pi*pi)*sin(.5*pi*x);
492 }
493 else
494 {
495 fxy = - (uxx + uyy + ((dim==2) ? 0. : uzz));
496 }
497
498 // Add the RHS contribution
499 for (std::size_t i=0; i<phi.size(); i++)
500 Fe(i) += JxW[qp]*fxy*phi[i][qp];
501 }
502
503 // Stop logging the right-hand-side computation
504 perf_log.pop ("Fe");
505
506 // At this point the interior element integration has
507 // been completed. However, we have not yet addressed
508 // boundary conditions. For this example we will only
509 // consider simple Dirichlet boundary conditions imposed
510 // via the penalty method. This is discussed at length in
511 // example 3.
512 {
513 // Start logging the boundary condition computation. We use a
514 // macro to log everything in this scope.
515 LOG_SCOPE_WITH("BCs", "", perf_log);
516
517 // The following loops over the sides of the element.
518 // If the element has no neighbor on a side then that
519 // side MUST live on a boundary of the domain.
520 for (auto side : elem->side_index_range())
521 if ((elem->neighbor_ptr(side) == nullptr) ||
522 (elem->neighbor_ptr(side)->subdomain_id() != elem->subdomain_id()))
523 {
524
525 // The penalty value. \frac{1}{\epsilon}
526 // in the discussion above.
527 const Real penalty = 1.e10;
528
529 // The value of the shape functions at the quadrature
530 // points.
531 const std::vector<std::vector<Real>> & phi_face = fe_face->get_phi();
532
533 // The Jacobian * Quadrature Weight at the quadrature
534 // points on the face.
535 const std::vector<Real> & JxW_face = fe_face->get_JxW();
536
537 // The XYZ locations (in physical space) of the
538 // quadrature points on the face. This is where
539 // we will interpolate the boundary value function.
540 const std::vector<Point> & qface_point = fe_face->get_xyz();
541
542 // Compute the shape function values on the element
543 // face.
544 fe_face->reinit(elem, side);
545
546 // Loop over the face quadrature points for integration.
547 for (unsigned int qp=0; qp<qface.n_points(); qp++)
548 {
549 // The location on the boundary of the current
550 // face quadrature point.
551 const Real xf = qface_point[qp](0);
552#if LIBMESH_DIM > 1
553 const Real yf = qface_point[qp](1);
554#else
555 const Real yf = 0.;
556#endif
557#if LIBMESH_DIM > 2
558 const Real zf = qface_point[qp](2);
559#else
560 const Real zf = 0.;
561#endif
562
563
564 // The boundary value.
565 const Real value = exact_solution(xf, yf, zf);
566
567 // Matrix contribution of the L2 projection.
568 for (std::size_t i=0; i<phi_face.size(); i++)
569 for (std::size_t j=0; j<phi_face.size(); j++)
570 Ke(i,j) += JxW_face[qp]*penalty*phi_face[i][qp]*phi_face[j][qp];
571
572 // Right-hand-side contribution of the L2
573 // projection.
574 for (std::size_t i=0; i<phi_face.size(); i++)
575 Fe(i) += JxW_face[qp]*penalty*value*phi_face[i][qp];
576 }
577 }
578 }
579
580
581 // The element matrix and right-hand-side are now built
582 // for this element. Add them to the global matrix and
583 // right-hand-side vector. The PetscMatrixBase::add_matrix()
584 // and PetscVector::add_vector() members do this for us.
585 // Start logging the insertion of the local (element)
586 // matrix and vector into the global matrix and vector
587 LOG_SCOPE_WITH("matrix insertion", "", perf_log);
588
589 if (dof_indices.size())
590 {
591 matrix.add_matrix (Ke, dof_indices);
592 system.rhs->add_vector (Fe, dof_indices);
593 }
594
595 if (dof_indices2.size())
596 {
597 matrix.add_matrix (Ke, dof_indices2);
598 system.rhs->add_vector (Fe, dof_indices2);
599 }
600 }
601
602 // That's it. We don't need to do anything else to the
603 // PerfLog. When it goes out of scope (at this function return)
604 // it will print its log to the screen. Pretty easy, huh?
605}
unsigned int dim
Number(* exact_solution)(const Point &p, const Parameters &, const std::string &, const std::string &)
Defines a dense matrix for use in Finite Element-type computations.
void resize(const unsigned int new_m, const unsigned int new_n)
Resizes the matrix to the specified size and calls zero().
Defines a dense vector for use in Finite Element-type computations.
void resize(const unsigned int n)
Resize the vector.
This class handles the numbering of degrees of freedom on a mesh.
Definition dof_map.h:181
This is the EquationSystems class.
void print_info(std::ostream &os=libMesh::out) const
Prints information about the equation systems, by default to libMesh::out.
const MeshBase & get_mesh() const
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.
const T_sys & get_system(std::string_view name) const
The ExodusII_IO class implements reading meshes in the ExodusII file format from Sandia National Labs...
Definition exodusII_io.h:53
virtual void write_equation_systems(const std::string &fname, const EquationSystems &es, const std::set< std::string > *system_names=nullptr) override
Writes out the solution for no specific time or timestep.
NumericVector< Number > * rhs
The system matrix.
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
Definition fe_type.h:197
This class implements writing meshes using GNUplot, designed for use only with 1D meshes.
Definition gnuplot_io.h:44
const SparseMatrix< Number > & get_system_matrix() const
The LibMeshInit class, when constructed, initializes the dependent libraries (e.g.
Definition libmesh.h:92
Manages consistently variables, degrees of freedom, coefficient vectors, matrices and linear solvers ...
virtual void clear() override
Clear all the data structures associated with the system.
This is the MeshBase class.
Definition mesh_base.h:81
unsigned int mesh_dimension() const
Definition mesh_base.C:430
void print_info(std::ostream &os=libMesh::out, const unsigned int verbosity=0, const bool global=true) const
Prints relevant information about the mesh.
Definition mesh_base.C:1755
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
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition mesh.h:51
virtual void add_vector(const T *v, const std::vector< numeric_index_type > &dof_indices)
Computes , where v is a pointer and each dof_indices[i] specifies where to add value v[i].
processor_id_type processor_id() const
The PerfLog class allows monitoring of specific events.
Definition perf_log.h:154
void pop(const char *label, const char *header="")
Pop the event label off the stack, resuming any lower event.
Definition perf_log.C:185
void push(const char *label, const char *header="")
Push the event label onto the stack, pausing any active event.
Definition perf_log.C:147
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition point.h:40
unsigned int n_points() const
Definition quadrature.h:131
This class implements specific orders of Gauss quadrature.
Generic sparse matrix.
virtual void add_matrix(const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols)=0
Add the full matrix dm to the SparseMatrix.
void attach_assemble_function(void fptr(EquationSystems &es, const std::string &name))
Register a user function to use in assembling the system matrix and RHS.
Definition system.C:1959
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
MeshBase & mesh
void build_cube(UnstructuredMesh &mesh, const unsigned int nx=0, const unsigned int ny=0, const unsigned int nz=0, const Real xmin=0., const Real xmax=1., const Real ymin=0., const Real ymax=1., const Real zmin=0., const Real zmax=1., const ElemType type=INVALID_ELEM, const bool gauss_lobatto_grid=false)
Builds a (elements) cube.
The libMesh namespace provides an interface to certain functionality in the library.
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
Helper function that allows us to treat a homogenous pair as a range.
SolverPackage default_solver_package()
Definition libmesh.C:1064
OStreamProxy out
const Real pi
.
Definition libmesh.h:292
T command_line_next(std::string name, T default_value)
Use GetPot's search()/next() functions to get following arguments from the command line.
Definition libmesh.C:1025
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void assemble_poisson(EquationSystems &es, const std::string &system_name)
int main()
static const bool value
Definition xdr_io.C:55