libMesh
subdomains_ex3.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 
20 // <h1>Subdomains Example 3 - Integrating discontinuous data that cuts the mesh</h1>
21 // \author Benjamin S. Kirk
22 // \date 2013
23 
24 
25 // C++ include files that we need
26 #include <iostream>
27 #include <algorithm>
28 #include <math.h>
29 
30 // Basic include file needed for the mesh functionality.
31 #include "libmesh/libmesh.h"
32 #include "libmesh/mesh.h"
33 #include "libmesh/mesh_generation.h"
34 #include "libmesh/mesh_refinement.h"
35 #include "libmesh/quadrature_gauss.h"
36 #include "libmesh/quadrature_composite.h"
37 #include "libmesh/fe.h"
38 #include "libmesh/elem.h"
39 #include "libmesh/parallel.h"
40 
41 // Bring in everything from the libMesh namespace
42 using namespace libMesh;
43 
44 // declare the functions we will use
45 void integrate_function (const MeshBase & mesh);
46 
47 // signed distance function
48 const Real radius = 0.5;
49 
50 Real distance (const Point & p)
51 {
52  Point cent(0.8, 0.9);
53  return ((p-cent).norm() - radius);
54 }
55 
56 Real integrand (const Point & p)
57 {
58  return (distance(p) < 0) ? 10. : 1.;
59 }
60 
61 
62 
63 // Begin the main program.
64 int main (int argc, char ** argv)
65 {
66  // Initialize libMesh and any dependent libraries, like in example 2.
67  LibMeshInit init (argc, argv);
68 
69  // This example requires Adaptive Mesh Refinement support - although
70  // it only refines uniformly, the refinement code used is the same
71  // underneath. It also requires libmesh support for Triangle and
72  // Tetgen, which means that libmesh must be configured with
73  // --disable-strict-lgpl for this example to run.
74 #if !defined(LIBMESH_HAVE_TRIANGLE) || !defined(LIBMESH_HAVE_TETGEN) || !defined(LIBMESH_ENABLE_AMR)
75  libmesh_example_requires(false, "--disable-strict-lgpl --enable-amr");
76 #else
77 
78  // Skip this 2D example if libMesh was compiled as 1D-only.
79  libmesh_example_requires(2 <= LIBMESH_DIM, "2D support");
80 
81  // Read the mesh from file. This is the coarse mesh that will be used
82  // in example 10 to demonstrate adaptive mesh refinement. Here we will
83  // simply read it in and uniformly refine it 5 times before we compute
84  // with it.
85  Mesh mesh(init.comm());
86 
87  {
88  unsigned int dim=2;
89 
90  if (argc == 3 && std::atoi(argv[2]) == 3)
91  {
92  libmesh_here();
93  dim=3;
94  }
95 
96  mesh.read ((dim==2) ? "mesh.xda" : "hybrid_3d.xda");
97  }
98 
99  // Create a MeshRefinement object to handle refinement of our mesh.
100  // This class handles all the details of mesh refinement and coarsening.
101  MeshRefinement mesh_refinement (mesh);
102 
103  // Uniformly refine the mesh 4 times. This is the
104  // first time we use the mesh refinement capabilities
105  // of the library.
106  mesh_refinement.uniformly_refine (4);
107 
108  // Print information about the mesh to the screen.
109  mesh.print_info();
110 
111  // integrate the desired function
113 
114  // All done.
115  return 0;
116 #endif
117 }
118 
119 
120 
122 {
123 #if defined(LIBMESH_HAVE_TRIANGLE) && defined(LIBMESH_HAVE_TETGEN)
124 
125  std::vector<Real> vertex_distance;
126 
128  //QGauss qrule (mesh.mesh_dimension(), FIRST);
129 
130  std::unique_ptr<FEBase> fe (FEBase::build (mesh.mesh_dimension(), FEType (FIRST, LAGRANGE)));
131 
132  Real int_val=0.;
133 
134  const std::vector<Point> & q_points = fe->get_xyz();
135  const std::vector<Real> & JxW = fe->get_JxW();
136 
137  for (const auto & elem : mesh.active_local_element_ptr_range())
138  {
139  vertex_distance.clear();
140 
141  for (unsigned int v=0; v<elem->n_vertices(); v++)
142  vertex_distance.push_back (distance(elem->point(v)));
143 
144  qrule.init (*elem, vertex_distance);
145 
146  fe->reinit (elem,
147  &(qrule.get_points()),
148  &(qrule.get_weights()));
149 
150 
151  // TODO: would it be valuable to have the composite quadrature rule sort
152  // from smallest to largest JxW value to help prevent
153  // ... large + small + large + large + small ...
154  // type truncation errors?
155  for (std::size_t qp=0; qp<q_points.size(); qp++)
156  int_val += JxW[qp] * integrand(q_points[qp]);
157  }
158 
159  mesh.comm().sum (int_val);
160 
161  libMesh::out << "\n***********************************\n"
162  << " int_val = " << int_val << std::endl
163  << " exact_val = " << 1*(2*2 - radius*radius*pi) + 10.*(radius*radius*pi)
164  << "\n***********************************\n"
165  << std::endl;
166 #else
168 #endif
169 }
libMesh::pi
const Real pi
.
Definition: libmesh.h:237
integrate_function
void integrate_function(const MeshBase &mesh)
Definition: subdomains_ex3.C:121
libMesh::Mesh
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50
libMesh::MeshBase::read
virtual void read(const std::string &name, void *mesh_data=nullptr, bool skip_renumber_nodes_and_elements=false, bool skip_find_neighbors=false)=0
Interfaces for reading/writing a mesh to/from a file.
libMesh::QComposite::init
virtual void init(const Elem &elem, const std::vector< Real > &vertex_distance_func, unsigned int p_level=0) override
Overrides the base class init() function, and uses the ElemCutter to subdivide the element into "insi...
Definition: quadrature_composite.C:67
libMesh::MeshBase::active_local_element_ptr_range
virtual SimpleRange< element_iterator > active_local_element_ptr_range()=0
libMesh
The libMesh namespace provides an interface to certain functionality in the library.
Definition: factoryfunction.C:55
libMesh::ParallelObject::comm
const Parallel::Communicator & comm() const
Definition: parallel_object.h:94
mesh
MeshBase & mesh
Definition: mesh_communication.C:1257
libMesh::MeshBase::mesh_dimension
unsigned int mesh_dimension() const
Definition: mesh_base.C:135
dim
unsigned int dim
Definition: adaptivity_ex3.C:113
libMesh::TriangleWrapper::init
void init(triangulateio &t)
Initializes the fields of t to nullptr/0 as necessary.
libMesh::MeshRefinement
Implements (adaptive) mesh refinement algorithms for a MeshBase.
Definition: mesh_refinement.h:61
libMesh::MeshBase
This is the MeshBase class.
Definition: mesh_base.h:78
radius
const Real radius
Definition: subdomains_ex3.C:48
libMesh::libmesh_ignore
void libmesh_ignore(const Args &...)
Definition: libmesh_common.h:526
integrand
Real integrand(const Point &p)
Definition: subdomains_ex3.C:56
libMesh::FEGenericBase::build
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
main
int main(int argc, char **argv)
Definition: subdomains_ex3.C:64
libMesh::Point
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:38
libMesh::LibMeshInit
The LibMeshInit class, when constructed, initializes the dependent libraries (e.g.
Definition: libmesh.h:83
distance
Real distance(const Point &p)
Definition: subdomains_ex3.C:50
libMesh::QComposite
This class implements generic composite quadrature rules.
Definition: quadrature_composite.h:51
libMesh::FEType
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
Definition: fe_type.h:178
libMesh::MeshBase::print_info
void print_info(std::ostream &os=libMesh::out) const
Prints relevant information about the mesh.
Definition: mesh_base.C:585
std::norm
MetaPhysicL::DualNumber< T, D > norm(const MetaPhysicL::DualNumber< T, D > &in)
libMesh::LAGRANGE
Definition: enum_fe_family.h:36
libMesh::Real
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Definition: libmesh_common.h:121
libMesh::out
OStreamProxy out
libMesh::MeshRefinement::uniformly_refine
void uniformly_refine(unsigned int n=1)
Uniformly refines the mesh n times.
Definition: mesh_refinement.C:1678
libMesh::FIRST
Definition: enum_order.h:42