MFEM v4.9.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/// Transform a mesh according to an arbitrary affine transformation
41/// y = A x + b
42/// Where A is a spaceDim x spaceDim matrix and b is a vector of size spaceDim.
43/// If A is of size zero the transformation will be y = b.
44/// If b is of size zero the transformation will be y = A x.
45///
46/// Note that no error checking related to the determinant of A is performed.
47/// If A has a non-positive determinant it is likely to produce an invalid
48/// transformed mesh.
50{
51private:
53 Vector b;
54 Vector x;
55
56public:
57 AffineTransformation(int dim_, const DenseMatrix &A_, const Vector & b_)
58 : VectorCoefficient(dim_), A(A_), b(b_), x(dim_)
59 {
60 MFEM_VERIFY((A.Height() == dim_ && A.Width() == dim_) ||
61 (A.Height() == 0 && A.Width() == 0),
62 "Affine transformation given an invalid matrix");
63 MFEM_VERIFY(b.Size() == dim_ || b.Size() == 0,
64 "Affine transformation given an invalid vector");
65 }
66
68 const IntegrationPoint &ip) override;
69
71};
72
73/// Generalized Kershaw mesh transformation in 2D and 3D, see D. Kershaw,
74/// "Differencing of the diffusion equation in Lagrangian hydrodynamic codes",
75/// JCP, 39:375–395, 1981.
76/** The input mesh should be Cartesian nx x ny x nz with nx divisible by 6 and
77 ny, nz divisible by 2.
78 The parameters @a epsy and @a epsz must be in (0, 1].
79 Uniform mesh is recovered for epsy=epsz=1.
80 The @a smooth parameter controls the transition between different layers. */
81// Usage:
82// common::KershawTransformation kershawT(pmesh->Dimension(), 0.3, 0.3, 2);
83// pmesh->Transform(kershawT);
85{
86private:
87 int dim;
88 real_t epsy, epsz;
89 int smooth;
90
91public:
92 KershawTransformation(const int dim_, real_t epsy_ = 0.3,
93 real_t epsz_ = 0.3, int smooth_ = 1)
94 : VectorCoefficient(dim_), dim(dim_), epsy(epsy_),
95 epsz(epsz_), smooth(smooth_)
96 {
97 MFEM_VERIFY(dim > 1,"Kershaw transformation only works for 2D and 3D"
98 "meshes.");
99 MFEM_VERIFY(smooth >= 1 && smooth <= 3,
100 "Kershaw parameter smooth must be in [1, 3]");
101 MFEM_VERIFY(epsy > 0 && epsy <=1,
102 "Kershaw parameter epsy must be in (0, 1].");
103 if (dim == 3)
104 {
105 MFEM_VERIFY(epsz > 0 && epsz <=1,
106 "Kershaw parameter epsz must be in (0, 1].");
107 }
108 }
109
110 // 1D transformation at the right boundary.
111 real_t right(const real_t eps, const real_t x)
112 {
113 return (x <= 0.5) ? (2-eps) * x : 1 + eps*(x-1);
114 }
115
116 // 1D transformation at the left boundary
117 real_t left(const real_t eps, const real_t x)
118 {
119 return 1-right(eps,1-x);
120 }
121
122 // Transition from a value of "a" for x=0, to a value of "b" for x=1.
123 // Controlled through "smooth" parameter.
124 real_t step(const real_t a, const real_t b, real_t x)
125 {
126 if (x <= 0) { return a; }
127 if (x >= 1) { return b; }
128 if (smooth == 1) { return a + (b-a) * (x); }
129 else if (smooth == 2) { return a + (b-a) * (x*x*(3-2*x)); }
130 else { return a + (b-a) * (x*x*x*(x*(6*x-15)+10)); }
131 }
132
134 const IntegrationPoint &ip) override;
135
137};
138
139/// Transform a [0,1]^D mesh into a spiral. The parameters are:
140/// @a turns - number of turns around the origin,
141/// @a width - for D >= 2, the width of the spiral arm,
142/// @ gap - gap between adjacent spiral arms at the end of each turn,
143/// @ height - for D = 3, the maximum height of the spiral.
144// Usage:
145// common::SpiralTransformation spiralT(spaceDim, 2.4, 0.1, 0.05, 1.0);
146// pmesh->Transform(spiralT);
148{
149private:
150 real_t dim, turns, width, gap, height;
151
152public:
153 SpiralTransformation(int dim_, real_t turns_ = 1.0, real_t width_ = 0.1,
154 real_t gap_ = 0.05, real_t height_ = 1.0)
155 : VectorCoefficient(dim_), dim(dim_),
156 turns(turns_), width(width_), gap(gap_), height(height_)
157 {
158 MFEM_VERIFY(turns > 0 && width > 0 && gap > 0 && height > 0,
159 "Spiral transformation requires positive parameters: turns, "
160 " width, gap, and height.");
161 }
162
164 const IntegrationPoint &ip) override;
165
167};
168
169
170} // namespace common
171
172} // namespace mfem
173
174#endif
Data type dense matrix using column-major storage.
Definition densemat.hpp:24
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:65
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
Definition operator.hpp:66
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols().
Definition operator.hpp:72
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
AffineTransformation(int dim_, const DenseMatrix &A_, const Vector &b_)
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 ...
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:46