文件
AcousticSO/tl_realtime.py
T

207 行
8.6 KiB
Python

# -*- coding: utf-8 -*-
import warnings
warnings.filterwarnings('ignore')
import argparse, json
from common import NoIndent, MyEncoder
def _argparse():
parser = argparse.ArgumentParser(description='tl realtime client')
parser.add_argument('-a', '--argfile', action='store', dest='argfile', required=True, help='name of arguments file')
return parser.parse_args()
def main():
parser = _argparse()
argfile = parser.argfile
if argfile[-5:] != '.json':
print('输入的参数文件名有误')
return
with open(argfile,'r') as jsonFile:
paramData = json.load(jsonFile)
if ("freq" not in paramData) or ("sourceDepth" not in paramData) or\
("receiveDepth" not in paramData) or ("modelType" not in paramData) or\
("bathyfile" not in paramData) or ("sspfile" not in paramData) or\
("z_min" not in paramData) or ("z_max" not in paramData) or\
("cp_min" not in paramData) or ("cp_max" not in paramData) or\
("cs_min" not in paramData) or ("cs_max" not in paramData) or\
("rho_min" not in paramData) or ("rho_max" not in paramData) or\
("ap_min" not in paramData) or ("ap_max" not in paramData) or\
("as_min" not in paramData) or ("as_max" not in paramData) or\
("Cb_p" not in paramData) or ("Cb_s" not in paramData) or\
("Rhob" not in paramData) or ("Ab_p" not in paramData) or\
("Ab_s" not in paramData) or ("png" not in paramData) or\
("outParam" not in paramData):
print(f'{argfile}中的参数有误,请核实!')
return
freq = float(paramData["freq"])
sourceDepth = float(paramData["sourceDepth"])
receiveDepth = float(paramData["receiveDepth"])
modelType = paramData["modelType"]
btyfile = paramData["bathyfile"]
sspfile = paramData["sspfile"]
z_min = float(paramData["z_min"])
z_max = float(paramData["z_max"])
cp_min = float(paramData["cp_min"])
cp_max = float(paramData["cp_max"])
cs_min = float(paramData["cs_min"])
cs_max = float(paramData["cs_max"])
rho_min = float(paramData["rho_min"])
rho_max = float(paramData["rho_max"])
ap_min = float(paramData["ap_min"])
ap_max = float(paramData["ap_max"])
as_min = float(paramData["as_min"])
as_max = float(paramData["as_max"])
Cb_p = float(paramData["Cb_p"])
Cb_s = float(paramData["Cb_s"])
Rhob = float(paramData["Rhob"])
Ab_p = float(paramData["Ab_p"])
Ab_s = float(paramData["Ab_s"])
png = paramData["png"]
outParam = paramData["outParam"]
from scipy.interpolate import Akima1DInterpolator
import numpy as np
from pyat.AcousticPara import BathyM, Base, Sed, SSP_
from pyat.tlcore import call_Bellhop, call_krakenc, call_ram
import matplotlib.pyplot as plt
bathym, ssp, sed, base = [], [], [], []
with open(btyfile, 'r') as f:
lines = f.readlines()
if len(lines) < 1:
print(f'{btyfile}中的参数有误,请核实!')
return
# 读取数据
data = np.loadtxt(btyfile, skiprows=1, usecols=(0, 1))
bathym = BathyM(data[:, 0], data[:, 1])
profile_num = 0
with open(sspfile, 'r') as f:
try:
line = f.readline()
profile_num = int((line.split())[0])
while line:
line = f.readline()
if '距离' in line:
ranges, depths, vels = [], [], []
line = f.readline()
while line and ('分隔符' not in line):
ranges.append(1)
depths.append(float((line.split())[0]))
vels.append(float((line.split())[1]))
line = f.readline()
ssp.append(SSP_(ranges, depths, vels))
except Exception as err:
print(f'{sspfile}中的参数有误,请核实!')
print(err)
return
"""akima 0829"""
z_ssp = np.array([])
for i in range(len(ssp)):
z_ssp = np.append(z_ssp, ssp[i].z)
z_ssp = np.unique(z_ssp)
z_ssp = np.sort(z_ssp)
for i in range(len(ssp)):
dep = ssp[i].z
vel = ssp[i].c
# 对剖面进行垂向插值处理
depInterp = z_ssp[z_ssp<=ssp[i].z[-1]]
# 应用Akima插值算法,对ssp进行插值
func = Akima1DInterpolator(dep, vel)
velInterp = func(depInterp)
# 剖面赋值
ssp[i].z = depInterp
ssp[i].c = velInterp
len_real = len(depInterp)-1
#for it in range(len_real,int(deep_max)):
# ssp[i].c = np.append(ssp[i].c,0)
# Sediment
z = np.array([z_min, z_max])
cp = np.array([cp_min, cp_max])
cs = np.array([cs_min, cs_max])
rho = np.array([rho_min, rho_max])
a_p = np.array([ap_min, ap_max])
a_s = np.array([as_min, as_max])
for it in range(profile_num):
sed.append(Sed(z, cp, cs, rho, a_p, a_s))
# Base
base = []
for it in range(profile_num):
base.append(Base(Cb_p, Cb_s, Rhob, Ab_p, Ab_s))
ranges, depths, TL = [], [], []
if modelType == 'bellhop':
sd = np.array([sourceDepth]) # Source depth
rd = np.linspace(0, receiveDepth, int(receiveDepth / 10)) # Receiving depth
[Pos, TL] = call_Bellhop(freq, sd, rd, bathym, ssp, sed, base)
ranges, depths, TL = Pos.r.range, Pos.r.depth, TL[0,0,:,:]
# Plot
if png:
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.show()
print(TL[0, 0, :, :])
elif modelType == 'kraken':
sd = np.array([sourceDepth]) # Source depth
rd = np.linspace(0, receiveDepth, int(receiveDepth / 10)) # Receiving depth
[Pos, TL] = call_krakenc(freq, sd, rd, bathym, ssp, sed, base)
ranges, depths, TL = Pos.r.range, Pos.r.depth, TL[0,0,:,:]
# Plot
if png:
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.show()
elif modelType == 'ram':
# 调用ram模块
[rd, rr, TL] = call_ram(freq, sourceDepth, receiveDepth, bathym, ssp, sed)
ranges, depths, TL = rr, rd, TL
# Plot
if png:
plt.pcolormesh(rr, rd, TL, vmin=60, vmax=130, cmap='jet_r', shading='auto')
plt.xlabel("Range/m")
plt.ylabel("Depth/m")
plt.gca().invert_yaxis()
plt.colorbar()
plt.show()
# 保存地形数据
bathym.r = np.around(bathym.r, decimals=0)
bathym.d = np.around(bathym.d, decimals=0)
bathymData = {
"param": paramData,
"count": len(bathym.d),
"descript": "距离、深度",
"data": NoIndent(list(zip(bathym.r, bathym.d)))
}
with open(("" if outParam["outPath"]=="" else outParam["outPath"] + "/")+"tlRealtimeOut_bathym.json", 'w') as jsonFile:
json_data = json.dumps(bathymData, cls=MyEncoder, indent=2, ensure_ascii=False)
jsonFile.write(json_data)
# 保存传播损失数据
tlpoint = []
depths = np.around(depths, decimals=0)
ranges = np.around(ranges, decimals=0)
TL = np.around(TL, decimals=2)
tlpoint = list(zip(np.tile(depths.reshape(len(depths),1),len(ranges)).flatten(), np.tile(ranges,(len(depths),1)).flatten(), TL.flatten()))
tlData = {
"param": paramData,
"count": len(ranges)*len(depths),
"descript": "距离、深度、损失",
"data": NoIndent(tlpoint)
}
with open(("" if outParam["outPath"]=="" else outParam["outPath"] + "/")+"tlRealtimeOut_tl.json", 'w') as jsonFile:
json_data = json.dumps(tlData, cls=MyEncoder, indent=2, ensure_ascii=False)
jsonFile.write(json_data)
if __name__ == '__main__':
main()