Wind turbine noise propagation

In this example, we will model a real case. A wind turbine is positioned on the top of a ridge. The wind turbine hub height is 80 m. We need to prepare input files as follows:

  • elevation file
  • sound speed profile file

Read elevation and sound speed files

Assume that we already have elevation and sound speed profile files in text files. The structure of these files are [range, elevation] and [height, sound speed]. We can read to Julia using DelimitedFiles package.

using DelimitedFiles

# read elevation and sound speed files.
elv = readdlm("./temp/elevation.txt") # [range(km), elevation (m)]
ssp = readdlm("./temp/ssp.txt") # [height(m), sound speed(m/s)]

Point source 100 Hz at 80 m above ground level

Because the hub height is at 80 m above the ground level, thus the absolute source height is added the ground elevation value. In this case, it is 169 m.

source = Source(
    frequency = 100,
    height = -80 + (-169) # 169 is ground level
)

Receiver

Similar to previous examples, we will analyse for a height of 1000 m and a range of 10 km with resolution is 1 m both directions.

receiver = Receiver(
    depth_point = 1001,
    range_point = 10001,
    depth = Vec2(-1000f0,0f0),
    range = Vec2(0f0,10f0)
)

Terrain geometry

Input elevation files to 2D vector Vec2.

terrain = Terrain(
    interp_type = "C",
    profile = (Vec2(elv[:,1],elv[:,2]))
)

Boundary condition

The boundary conditions are similar as previous examples.

Zc = 12.81 + 11.62im
Theta, Rmag, Rphase = R_coeff(Zc;len=100)

brc = Vec3(Theta,Rmag,Rphase)
trc = Vec3([0f0,45f0,90f0],[0f0,0f0,0f0],[0f0,0f0,0f0])

reflection = Reflection_Coeff(
    top_coeff = trc,
    bottom_coeff = brc
)

Sound speed profile

We just need to read sound speed profile to 2D vector Vec2. Note in the case our wind profile is relatively simple, we can input directly to here instead of preparing a text file of sound speed profile.

sspl = Vec2(ssp[:,1],ssp[:,2]) # case 1
ssp = SSP(sound_speed_profile= sspl)

Analysis

If you are not familiar with below set-up, please look back previous examples.

opt = Analysis(
    filename = "RealCase_Bellhop_f100",
    analyse = "CG",
    option1 = "CFW",
    option2 = "F*",
    num_ray = 1601,
    alpha = Vec2(-80.0f0,80.0f0),
    box = Vec2(10f0,1000.0f0),
    step= 0
)

Create input files

Environment(opt,source, receiver,ssp,terrain,reflection)

Run Bellhop

fn= opt.filename
filename = "temp\\$fn"
run_bellhop = `bellhop $filename`
@time run(run_bellhop)

Results

Waiting for 29.4 seconds, here is our results!

p1 = PlotRay("$filename.ray",
        xlabs = "Range, m",
        ylabs = "Height, m")

        plot!(p1,elv[:,1]*1000,elv[:,2],
        lw=0,fill = 0, color = "#8c510a",legend = false)
        yflip!(true)

        scatter!(p1,[0], [source.height],
        markersize = 6, color = "#4daf4a")

#savefig(p1,"ray_real.png")

Transmission loss field

p2 = PlotShd("$filename.shd";
        xlabs = "Range, m",
        ylabs = "Transmission loss, dB",
        cblabs = "dB",
        climb = (40,120))

        plot!(p2,elv[:,1]*1000,elv[:,2],
        lw=0,fill = 0, color = "#8c510a", legend = false)
        yflip!(true)

        scatter!(p2,[0], [source.height],
        markersize = 6, color = "#4daf4a",
        label = "Source")

#savefig(p2,"trans_real.png")