更改了声线计算方式,合理分配了角度和声线进行并行运算。
这个提交包含在:
+81
-37
@@ -3,7 +3,9 @@ from env import Pos, Source, Dom, cInt, SSPraw, SSP, HS, BotBndry, TopBndry, Bnd
|
||||
from os import system
|
||||
import numpy as np
|
||||
from config import AtBinPath
|
||||
|
||||
from multiprocessing import Pool
|
||||
from scipy.stats import norm
|
||||
import math
|
||||
|
||||
def write_ssp(sspfile, ssp, bathm, NZmax):
|
||||
if sspfile[-3:] != 'ssp':
|
||||
@@ -33,7 +35,9 @@ def write_bathy(btyfile, bathm):
|
||||
f.write(' ' + str(bathm.r[row]) + ' ' + str(bathm.d[row]) + '\r\n')
|
||||
return
|
||||
|
||||
|
||||
def call_Bellhop_p(filename):
|
||||
system(AtBinPath + "/bellhop " + filename)
|
||||
|
||||
def calZmax(ssp):
|
||||
d = np.array([], dtype=int)
|
||||
for it in range(len(ssp)):
|
||||
@@ -96,20 +100,31 @@ def call_Bellhop(freq, sd, rd, bathm, ssp, sed, base):
|
||||
bdy = Bndry(top, bottom)
|
||||
# Beam params
|
||||
run_type = 'C' # incoherently sum beams, see AT docs for more info
|
||||
nbeams = 3000
|
||||
alpha = np.linspace(-45, 45, 2) # min and max launch angle -20 degrees to 20 degrees
|
||||
NAlphaRange = 12
|
||||
Alpha = alphadiv(NAlphaRange,Rmax) # min and max launch angle -20 degrees to 20 degrees
|
||||
totalBeams = beamsnumber(freq, Rmax, max(bathm.r))
|
||||
box = Box(Zmax, max(bathm.r)) # bound the region you let the beams go, depth in meters and range in km
|
||||
deltas = 0 # length step of ray trace, 0 means automatically choose
|
||||
beam = Beam(RunType=run_type, Nbeams=nbeams, alpha=alpha, box=box, deltas=deltas) # package
|
||||
Filenames = []
|
||||
for iAlphaRange in range(len(Alpha) - 1):
|
||||
alpha = np.array([Alpha[iAlphaRange], Alpha[iAlphaRange + 1]])
|
||||
nbeams = int(totalBeams * (alpha[1] - alpha[0]) / 180)
|
||||
|
||||
# Write *.env file
|
||||
write_env(filename + '.env', 'BELLHOP', 'Pekeris profile', freq, sspB, bdy, pos, beam, cInt, Rmax)
|
||||
write_ssp(filename, ssp, bathm, NZmax)
|
||||
write_bathy(filename, bathm)
|
||||
beam = Beam(RunType=run_type, Nbeams=nbeams, alpha=alpha, box=box, deltas=deltas) # package
|
||||
filenameI = filename + str(iAlphaRange)
|
||||
write_env(filenameI + '.env', 'BELLHOP', 'Pekeris profile', freq, sspB, bdy, pos, beam, cInt, Rmax)
|
||||
write_ssp(filenameI, ssp, bathm, NZmax)
|
||||
write_bathy(filenameI, bathm)
|
||||
Filenames.append(filenameI)
|
||||
|
||||
pool = Pool(NAlphaRange)
|
||||
pool.map(call_Bellhop_p, Filenames)
|
||||
|
||||
system(AtBinPath + "/bellhop " + filename)
|
||||
# Read sound field
|
||||
[x, x, x, x, Pos1, pressure] = read_shd(filename + '.shd')
|
||||
[x, x, x, x, Pos1, pressure] = read_shd(filename + '0.shd')
|
||||
for iAlphaRange in range(NAlphaRange - 1):
|
||||
[x, x, x, x, Pos1, pressure1] = read_shd(filename + str(iAlphaRange) + '.shd')
|
||||
pressure = pressure + pressure1
|
||||
TL = -10 * np.log10(np.square(np.abs(pressure))) # Transmission Loss
|
||||
|
||||
return Pos1, TL
|
||||
@@ -197,32 +212,61 @@ def find_cvgcRays(rays_total):
|
||||
Rays.append(ray)
|
||||
return Rays
|
||||
|
||||
def alphadiv(NalphaRange, Rmax):
|
||||
angle = [-90, 90]
|
||||
if Rmax > 100 and Rmax <= 1000:
|
||||
sigma = 25
|
||||
elif Rmax > 1000:
|
||||
sigma = 15
|
||||
else:
|
||||
sigma = 40
|
||||
for i in range(1, NalphaRange):
|
||||
angle.append(norm.ppf(i / NalphaRange, loc=0, scale=sigma))
|
||||
|
||||
angle.sort()
|
||||
return angle
|
||||
|
||||
def beamsnumber(freq, Rmax, depth):
|
||||
if Rmax > 700:
|
||||
nbeams = max(int(0.01 * Rmax * 1000 * freq / 1500), 300)
|
||||
elif Rmax > 300 and Rmax <= 700:
|
||||
nbeams = max(int(0.05 * Rmax * 1000 * freq / 1500), 300)
|
||||
elif Rmax > 100 and Rmax <= 300:
|
||||
nbeams = max(int(0.1 * Rmax * 1000 * freq / 1500), 300)
|
||||
else:
|
||||
nbeams = max(int(0.3 * Rmax * 1000 * freq / 1500), 300)
|
||||
|
||||
d_theta_recommended = math.atan(depth / (10.0 * Rmax * 1000))
|
||||
nbeams = max(int(math.pi / d_theta_recommended), nbeams)
|
||||
|
||||
return nbeams
|
||||
|
||||
# if __name__=="__main__":
|
||||
''' ********************************************** '''
|
||||
''' ******************** Test ******************** '''
|
||||
# freq = 25 # Frequency
|
||||
# sd = np.array([10.0]) # Source depth
|
||||
# rd = np.linspace(0, 4000, 401) # Receiving depth
|
||||
# # 定义坐标
|
||||
# lat = 19.00
|
||||
# lon = 116.00
|
||||
# # 定义时间段
|
||||
# timeIndex = db.timeDict['Annual']
|
||||
# # 创建类
|
||||
# data = db.DataBase()
|
||||
# # 设置时间段
|
||||
# data.set_timePeriod(timeIndex)
|
||||
''' ********************************************** '''
|
||||
''' ******************** Test ******************** '''
|
||||
# freq = 25 # Frequency
|
||||
# sd = np.array([10.0]) # Source depth
|
||||
# rd = np.linspace(0, 4000, 401) # Receiving depth
|
||||
# # 定义坐标
|
||||
# lat = 19.00
|
||||
# lon = 116.00
|
||||
# # 定义时间段
|
||||
# timeIndex = db.timeDict['Annual']
|
||||
# # 创建类
|
||||
# data = db.DataBase()
|
||||
# # 设置时间段
|
||||
# data.set_timePeriod(timeIndex)
|
||||
|
||||
# [bathm, ssp, sed, base] = GetEnv(data, freq, Coord(lon, lat), R=100, azi=90)
|
||||
# [Pos, TL] = call_Bellhop(freq, sd, rd, bathm, ssp, sed, base)
|
||||
# [bathm, ssp, sed, base] = GetEnv(data, freq, Coord(lon, lat), R=100, azi=90)
|
||||
# [Pos, TL] = call_Bellhop(freq, sd, rd, bathm, ssp, sed, base)
|
||||
|
||||
# #[x, x, x, x, Pos, pressure] = read_shd('envB.shd')
|
||||
# #TL = -10 * np.log10(np.square(np.abs(pressure))) # Transmission Loss
|
||||
# # Plot
|
||||
# plt.pcolor(Pos.r.range, Pos.r.depth, TL[0,0,:,:], vmin=40, vmax=130,cmap='jet_r', shading='auto')
|
||||
# plt.xlabel("Range/m")
|
||||
# plt.ylabel("Depth/m")
|
||||
# plt.gca().invert_yaxis()
|
||||
# plt.colorbar()
|
||||
# plt.plot(bathm.r*1000, bathm.d, color='k')
|
||||
# plt.show()
|
||||
# #[x, x, x, x, Pos, pressure] = read_shd('envB.shd')
|
||||
# #TL = -10 * np.log10(np.square(np.abs(pressure))) # Transmission Loss
|
||||
# # Plot
|
||||
# plt.pcolor(Pos.r.range, Pos.r.depth, TL[0,0,:,:], vmin=40, vmax=130,cmap='jet_r', shading='auto')
|
||||
# plt.xlabel("Range/m")
|
||||
# plt.ylabel("Depth/m")
|
||||
# plt.gca().invert_yaxis()
|
||||
# plt.colorbar()
|
||||
# plt.plot(bathm.r*1000, bathm.d, color='k')
|
||||
# plt.show()
|
||||
在新工单中引用
屏蔽一个用户