From: Griffith, B. E. <bo...@em...> - 2018-05-15 16:04:52
|
On May 15, 2018, at 10:23 AM, John Peterson <jwp...@gm...<mailto:jwp...@gm...>> wrote: On Tue, May 15, 2018 at 8:17 AM, Griffith, Boyce Eugene <bo...@em...<mailto:bo...@em...>> wrote: On May 15, 2018, at 10:13 AM, John Peterson <jwp...@gm...<mailto:jwp...@gm...>> wrote: On Tue, May 15, 2018 at 5:37 AM, Griffith, Boyce Eugene <bo...@em...<mailto:bo...@em...>> wrote: Folks -- Is there an easy way in the library to get normal vectors on surface meshes (e.g. 2D elements in 3D space, 1D elements in 2D space, etc)? It seems like most of the support for this assumes that these are only needed for doing surface integrals on volumetric meshes, but I am sure I am overlooking something. The "simplest" way is to build an FE object and only pre-request the normals by calling: const std::vector<Point> & face_normals = fe_face->get_normals(); I may be making a blunder here, but this doesn't seem to work if the dimension of the quadrature rule is equal to the dimension of the mesh --- the normals do not appear to be computed. Hmm... yes generally you would use a dim-1 dimensional quadrature rule in this context, e.g. the following (from adaptivity_ex4) should work: std::unique_ptr<FEBase> fe_face (FEBase::build(dim, fe_type)); std::unique_ptr<QBase> qface(fe_type.default_quadrature_rule(dim-1)); fe_face->attach_quadrature_rule (qface.get()); const std::vector<Point> & face_normals = fe_face->get_normals(); fe_face->reinit(elem, s); I need to integrate on a surface mesh (for instance, a boundary mesh extracted from a volumetric mesh --- although it could simply be a surface that is not derived from a volumetric mesh) and to get the normals --- something like: std::unique_ptr<FEBase> fe_surface(FEBase::build(dim, fe_type)); std::unique_ptr<QBase> quad_surface(fe_type.default_quadrature_rule(dim)); fe_surface->attach_quadrature_rule (quad_surface.get()); const std::vector<Point> & face_normals = fe_surface->get_normals(); fe_surface->reinit(elem); Again, I do know that I can do this myself --- I was just going to see if the library already does it. where "s" is the numerical index of a side. -- John |