Sine Wave Geometry with Exact Amplitude


I’m currently trying to create a geometry resembling a sine wave. So far I have an example where the geometry satisfies more or less my expectations, but the amplitude can not be specified precisely. In this approach, I’m using 5 points to create a single sine wave. The corresponding code can be found at the very bottom of this post.

I tried to multiply the amplitude to “stretch” the sine wave, but the results are confusing me, since I can’t figure out the pattern it’s following. Below the output of the program with the values 1, 2 and 4 for the amplitude. (The height of the geometry at the right-hand border is 2.)

Obviously, there are downsides to my current approach. For example the sine wave for amplitude = 4 isn’t that well-formed…

I suppose, my problem can be explained through this statement from the documentation:

The curve and its tangential direction coincides with the control polygon at the start and the end-point.[/quote]

Thus, my question: how can I define a sine wave geometry, where I can define exactly the amplitude?

Edit: I’m also thankful for any further explications on how the spline geometries are working. Like how the curve is calculated between three points.

Code for the generation of the examples in this post:

from netgen import geom2d
from ngsolve import *
from ngsolve.webgui import Draw
from math import pi, sin, cos

# small function to create a sinusidial form
pts = []
amplitude = 1
wavelength = 2 # the length to perform a complete sinus cycle

# create points for a single sinus iteration
pts.append([0, 0])
pts.append([wavelength*0.25, amplitude])
pts.append([wavelength*0.5, 0])
pts.append([wavelength*0.75, -1*amplitude])
pts.append([wavelength, 0])

# auxilliary points
pts.append([wavelength, -2])
pts.append([0, -2])

# init geometry object
geo = geom2d.SplineGeometry()
geoPtsIdxs = []
for p in pts:

# define sinusiodal geometry
geo.Append(["spline3", geoPtsIdxs[0], geoPtsIdxs[1], geoPtsIdxs[2]], leftdomain=0, rightdomain=1, bc='intern')
geo.Append(["spline3", geoPtsIdxs[2], geoPtsIdxs[3], geoPtsIdxs[4]], leftdomain=0, rightdomain=1, bc='intern')
# close the geometry
geo.Append(["line", geoPtsIdxs[4], geoPtsIdxs[5]], leftdomain=0, rightdomain=1, bc='intern')
geo.Append(["line", geoPtsIdxs[5], geoPtsIdxs[6]], leftdomain=0, rightdomain=1, bc='intern')
geo.Append(["line", geoPtsIdxs[6], geoPtsIdxs[0]], leftdomain=0, rightdomain=1, bc='intern')

geo.SetMaterial(1, "testregion1")
ngmesh=geo.GenerateMesh(maxh=0.5) #0.05
mesh = Mesh(ngmesh)