Forum Message

 

 

We have moved the forum to https://forum.ngsolve.org . This is an archived version of the topics until 05/05/23. All the topics were moved to the new forum and conversations can be continued there. This forum is just kept as legacy to not invalidate old links. If you want to continue a conversation just look for the topic in the new forum.

Notice

The forum is in read only mode.

Sine Wave Geometry with Exact Amplitude

More
3 years 2 weeks ago - 3 years 2 weeks ago #3617 by ugzhaw
Hello,

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.


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:
Code:
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: geoPtsIdxs.append(geo.AddPoint(*p)) # 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) mesh.Curve(3) Draw(mesh)
Last edit: 3 years 2 weeks ago by ugzhaw. Reason: Precise
Time to create page: 0.143 seconds