MFEM v4.8.0
Finite element discretization library
Loading...
Searching...
No Matches
mesh_extras.hpp
Go to the documentation of this file.
1// Copyright (c) 2010-2025, Lawrence Livermore National Security, LLC. Produced
2// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
3// LICENSE and NOTICE for details. LLNL-CODE-806117.
4//
5// This file is part of the MFEM library. For more information and source code
6// availability visit https://mfem.org.
7//
8// MFEM is free software; you can redistribute it and/or modify it under the
9// terms of the BSD-3 license. We welcome feedback and contributions, see file
10// CONTRIBUTING.md for details.
11
12#ifndef MFEM_MESH_EXTRAS
13#define MFEM_MESH_EXTRAS
14
15#include "mfem.hpp"
16#include <sstream>
17
18namespace mfem
19{
20
21namespace common
22{
23
24class ElementMeshStream : public std::stringstream
25{
26public:
28};
29
30/// Merges vertices which lie at the same location
31void MergeMeshNodes(Mesh * mesh, int logging);
32
33/// Convert a set of attribute numbers to a marker array
34/** The marker array will be of size max_attr and it will contain only zeroes
35 and ones. Ones indicate which attribute numbers are present in the attrs
36 array. In the special case when attrs has a single entry equal to -1 the
37 marker array will contain all ones. */
38void AttrToMarker(int max_attr, const Array<int> &attrs, Array<int> &marker);
39
40
41/// Generalized Kershaw mesh transformation in 2D and 3D, see D. Kershaw,
42/// "Differencing of the diffusion equation in Lagrangian hydrodynamic codes",
43/// JCP, 39:375–395, 1981.
44/** The input mesh should be Cartesian nx x ny x nz with nx divisible by 6 and
45 ny, nz divisible by 2.
46 The parameters @a epsy and @a epsz must be in (0, 1].
47 Uniform mesh is recovered for epsy=epsz=1.
48 The @a smooth parameter controls the transition between different layers. */
49// Usage:
50// common::KershawTransformation kershawT(pmesh->Dimension(), 0.3, 0.3, 2);
51// pmesh->Transform(kershawT);
53{
54private:
55 int dim;
56 real_t epsy, epsz;
57 int smooth;
58
59public:
60 KershawTransformation(const int dim_, real_t epsy_ = 0.3,
61 real_t epsz_ = 0.3, int smooth_ = 1)
62 : VectorCoefficient(dim_), dim(dim_), epsy(epsy_),
63 epsz(epsz_), smooth(smooth_)
64 {
65 MFEM_VERIFY(dim > 1,"Kershaw transformation only works for 2D and 3D"
66 "meshes.");
67 MFEM_VERIFY(smooth >= 1 && smooth <= 3,
68 "Kershaw parameter smooth must be in [1, 3]");
69 MFEM_VERIFY(epsy > 0 && epsy <=1,
70 "Kershaw parameter epsy must be in (0, 1].");
71 if (dim == 3)
72 {
73 MFEM_VERIFY(epsz > 0 && epsz <=1,
74 "Kershaw parameter epsz must be in (0, 1].");
75 }
76 }
77
78 // 1D transformation at the right boundary.
79 real_t right(const real_t eps, const real_t x)
80 {
81 return (x <= 0.5) ? (2-eps) * x : 1 + eps*(x-1);
82 }
83
84 // 1D transformation at the left boundary
85 real_t left(const real_t eps, const real_t x)
86 {
87 return 1-right(eps,1-x);
88 }
89
90 // Transition from a value of "a" for x=0, to a value of "b" for x=1.
91 // Controlled through "smooth" parameter.
92 real_t step(const real_t a, const real_t b, real_t x)
93 {
94 if (x <= 0) { return a; }
95 if (x >= 1) { return b; }
96 if (smooth == 1) { return a + (b-a) * (x); }
97 else if (smooth == 2) { return a + (b-a) * (x*x*(3-2*x)); }
98 else { return a + (b-a) * (x*x*x*(x*(6*x-15)+10)); }
99 }
100
102 const IntegrationPoint &ip) override;
103
105};
106
107/// Transform a [0,1]^D mesh into a spiral. The parameters are:
108/// @a turns - number of turns around the origin,
109/// @a width - for D >= 2, the width of the spiral arm,
110/// @ gap - gap between adjacent spiral arms at the end of each turn,
111/// @ height - for D = 3, the maximum height of the spiral.
112// Usage:
113// common::SpiralTransformation spiralT(spaceDim, 2.4, 0.1, 0.05, 1.0);
114// pmesh->Transform(spiralT);
116{
117private:
118 real_t dim, turns, width, gap, height;
119
120public:
121 SpiralTransformation(int dim_, real_t turns_ = 1.0, real_t width_ = 0.1,
122 real_t gap_ = 0.05, real_t height_ = 1.0)
123 : VectorCoefficient(dim_), dim(dim_),
124 turns(turns_), width(width_), gap(gap_), height(height_)
125 {
126 MFEM_VERIFY(turns > 0 && width > 0 && gap > 0 && height > 0,
127 "Spiral transformation requires positive parameters: turns, "
128 " width, gap, and height.");
129 }
130
132 const IntegrationPoint &ip) override;
133
135};
136
137
138} // namespace common
139
140} // namespace mfem
141
142#endif
Type
Constants for the classes derived from Element.
Definition element.hpp:41
Class for integration point with weight.
Definition intrules.hpp:35
Mesh data type.
Definition mesh.hpp:64
Base class for vector Coefficients that optionally depend on time and space.
virtual void Eval(Vector &V, ElementTransformation &T, const IntegrationPoint &ip)=0
Evaluate the vector coefficient in the element described by T at the point ip, storing the result in ...
Vector data type.
Definition vector.hpp:82
real_t right(const real_t eps, const real_t x)
void Eval(Vector &V, ElementTransformation &T, const IntegrationPoint &ip) override
Evaluate the vector coefficient in the element described by T at the point ip, storing the result in ...
KershawTransformation(const int dim_, real_t epsy_=0.3, real_t epsz_=0.3, int smooth_=1)
real_t step(const real_t a, const real_t b, real_t x)
real_t left(const real_t eps, const real_t x)
void Eval(Vector &V, ElementTransformation &T, const IntegrationPoint &ip) override
Evaluate the vector coefficient in the element described by T at the point ip, storing the result in ...
SpiralTransformation(int dim_, real_t turns_=1.0, real_t width_=0.1, real_t gap_=0.05, real_t height_=1.0)
int dim
Definition ex24.cpp:53
real_t b
Definition lissajous.cpp:42
real_t a
Definition lissajous.cpp:41
void MergeMeshNodes(Mesh *mesh, int logging)
Merges vertices which lie at the same location.
void AttrToMarker(int max_attr, const Array< int > &attrs, Array< int > &marker)
Convert a set of attribute numbers to a marker array.
float real_t
Definition config.hpp:43