221 行
10 KiB
Python
可执行文件
221 行
10 KiB
Python
可执行文件
# -*- coding: utf-8 -*-
|
|
import warnings
|
|
warnings.filterwarnings('ignore')
|
|
|
|
import argparse, json
|
|
|
|
def _argparse():
|
|
parser = argparse.ArgumentParser(description='剖面分析工具, 根据标准化剖面,得到声道, 跃层分析结果')
|
|
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 ("realtime" not in paramData):
|
|
print(f'{argfile}中的参数有误,请核实!')
|
|
return
|
|
realtime = paramData["realtime"]
|
|
if not realtime:
|
|
if ("ETOPO1Path" not in paramData) or ("STPath" not in paramData) or\
|
|
("lat" not in paramData) or ("lon" not in paramData) or\
|
|
("timeType" not in paramData) or ("png" not in paramData) or\
|
|
("outParam" not in paramData):
|
|
print(f'{argfile}中的参数有误,请核实!')
|
|
return
|
|
ETOPO1Path = paramData["ETOPO1Path"]
|
|
STPath = paramData["STPath"]
|
|
lat = float(paramData["lat"])
|
|
lon = float(paramData["lon"])
|
|
timeType = paramData["timeType"]
|
|
png = paramData["png"]
|
|
outParam = paramData["outParam"]
|
|
if "outPath" not in outParam:
|
|
outParam["outPath"] = ""
|
|
|
|
from pyat.DataBase import DataBase
|
|
import matplotlib.pyplot as plt
|
|
from pyat.ProfileTool import ProfileTool
|
|
import numpy as np
|
|
# 定义时间段
|
|
timeIndex = timeType
|
|
# 创建类
|
|
data = DataBase(ETOPO1Path, STPath)
|
|
# 设置时间段
|
|
data.set_timePeriod(timeIndex)
|
|
# 设置坐标
|
|
data.set_coord(lat, lon)
|
|
# 全海深速度剖面
|
|
velPf = data.get_velFullProfile()
|
|
# 设置剖面分析工具
|
|
velPfTool = ProfileTool()
|
|
velPfTool.set_profile(velPf)
|
|
# 计算表面声道
|
|
surfCh = velPfTool.get_surfaceChannel()
|
|
# 计算深海声道
|
|
deepCh = velPfTool.get_deepChannel()
|
|
# 计算跃层信息
|
|
surfSL, mainSL = velPfTool.get_springLayer()
|
|
# 导出结果文件
|
|
velPfTool.export_profileParm('velPfParam.txt')
|
|
# 导出剖面文件
|
|
# data.export_velFullProfile_txt('velFullProfile.txt')
|
|
data.export_velFullProfile_nc('velFullProfile.nc')
|
|
# 打印结果
|
|
f = open('velPfParam.txt')
|
|
lines=f.readlines()
|
|
for line in lines:
|
|
print(line)
|
|
f.close()
|
|
|
|
#输出json文件
|
|
outData = {}
|
|
outData["param"] = paramData
|
|
outData["lat"] = f'{round(velPf.lat,4)}'
|
|
outData["lon"] = f'{round(velPf.lon,4)}'
|
|
outData["botDep"] = f'{round(velPf.botDep)}'
|
|
properties = {
|
|
"表面声道轴深度": f'{round(surfCh.depAxis,2)}' if surfCh.exist else "NONE",
|
|
"表面声道声速": f'{round(surfCh.velAxis,4)}' if surfCh.exist else "NONE",
|
|
"深海声道轴深度": f'{round(deepCh.depAxis,2)}' if deepCh.exist else "NONE",
|
|
"深海声道声速": f'{round(deepCh.velAxis,4)}' if deepCh.exist else "NONE",
|
|
"表面跃层区间": f'{round(surfSL.limit[0],2)}, {round(surfSL.limit[1],2)}' if surfSL.exist else "NONE",
|
|
"表面跃层强度": f'{round(surfSL.intensity,4)}' if surfSL.exist else "NONE",
|
|
"主跃层区间": f'{round(mainSL.limit[0],2)}, {round(mainSL.limit[1],2)}' if mainSL.exist else "NONE",
|
|
"主跃层强度": f'{round(mainSL.intensity,4)}' if mainSL.exist else "NONE",
|
|
}
|
|
velPf.x = np.around(velPf.x, decimals=0)
|
|
velPf.y = np.around(velPf.y, decimals=4)
|
|
outData["out"] = {
|
|
"properties": properties,
|
|
"声剖面列表": list(zip(velPf.x,velPf.y))
|
|
}
|
|
with open(("" if outParam["outPath"]=="" else outParam["outPath"] + "/")+"profileOut.json", 'w') as jsonFile:
|
|
json.dump(outData, jsonFile, indent=4, ensure_ascii=False)
|
|
|
|
if png:
|
|
# 绘图
|
|
fig, ax = plt.subplots()
|
|
# 声速剖面
|
|
ax.plot(velPf.y, velPf.x)
|
|
if surfCh.exist:
|
|
ax.axhline(surfCh.depAxis, linestyle='--',
|
|
color='r', label='surface channel axis')
|
|
if deepCh.exist:
|
|
ax.axhline(deepCh.depAxis, linestyle='--',
|
|
color='g', label='deep channel axis')
|
|
if surfSL.exist:
|
|
ax.fill_between([1480, 1550], surfSL.limit[0],
|
|
surfSL.limit[1], alpha=0.2, color='r')
|
|
if mainSL.exist:
|
|
ax.fill_between([1480, 1550], mainSL.limit[0],
|
|
mainSL.limit[1], alpha=0.2, color='g')
|
|
ax.set_xlim(1480, 1550)
|
|
ax.invert_yaxis()
|
|
ax.set_xlabel('velocity')
|
|
ax.set_ylabel('depth')
|
|
ax.legend(loc=4)
|
|
# 显示绘图
|
|
plt.show()
|
|
else:
|
|
if ("ETOPO1Path" not in paramData) or ("STPath" not in paramData) or\
|
|
("profileFile" not in paramData) or ("png" not in paramData) or\
|
|
("outParam" not in paramData):
|
|
print(f'{argfile}中的参数有误,请核实!')
|
|
return
|
|
ETOPO1Path = paramData["ETOPO1Path"]
|
|
STPath = paramData["STPath"]
|
|
profileFile = paramData["profileFile"]
|
|
png = paramData["png"]
|
|
outParam = paramData["outParam"]
|
|
if "outPath" not in outParam:
|
|
outParam["outPath"] = ""
|
|
|
|
import matplotlib.pyplot as plt
|
|
from pyat.ProfileTool import ProfileTool
|
|
from pyat.ProfileRead import readRawProfile, processProfile
|
|
import numpy as np
|
|
# 读取实测声速剖面
|
|
velRawPf = readRawProfile(profileFile)
|
|
# 对剖面进行后处理
|
|
velPf = processProfile(velRawPf, ETOPO1Path, STPath)
|
|
|
|
# 设置剖面分析工具
|
|
velPfTool = ProfileTool()
|
|
velPfTool.set_profile(velPf)
|
|
# 计算表面声道
|
|
surfCh = velPfTool.get_surfaceChannel()
|
|
# 计算深海声道
|
|
deepCh = velPfTool.get_deepChannel()
|
|
# 计算跃层信息
|
|
surfSL, mainSL = velPfTool.get_springLayer()
|
|
# 导出结果文件
|
|
velPfTool.export_profileParm('velPfParam.txt')
|
|
# 打印结果
|
|
f = open('velPfParam.txt')
|
|
lines=f.readlines()
|
|
for line in lines:
|
|
print(line)
|
|
f.close()
|
|
|
|
#输出json文件
|
|
outData = {}
|
|
outData["param"] = paramData
|
|
outData["lat"] = f'{round(velPf.lat,4)}'
|
|
outData["lon"] = f'{round(velPf.lon,4)}'
|
|
outData["botDep"] = f'{round(velPf.botDep)}'
|
|
properties = {
|
|
"表面声道轴深度": f'{round(surfCh.depAxis,2)}' if surfCh.exist else "NONE",
|
|
"表面声道声速": f'{round(surfCh.velAxis,4)}' if surfCh.exist else "NONE",
|
|
"深海声道轴深度": f'{round(deepCh.depAxis,2)}' if deepCh.exist else "NONE",
|
|
"深海声道声速": f'{round(deepCh.velAxis,4)}' if deepCh.exist else "NONE",
|
|
"表面跃层区间": f'{round(surfSL.limit[0],2)}, {round(surfSL.limit[1],2)}' if surfSL.exist else "NONE",
|
|
"表面跃层强度": f'{round(surfSL.intensity,4)}' if surfSL.exist else "NONE",
|
|
"主跃层区间": f'{round(mainSL.limit[0],2)}, {round(mainSL.limit[1],2)}' if mainSL.exist else "NONE",
|
|
"主跃层强度": f'{round(mainSL.intensity,4)}' if mainSL.exist else "NONE",
|
|
}
|
|
velPf.x = np.around(velPf.x, decimals=0)
|
|
velPf.y = np.around(velPf.y, decimals=4)
|
|
profileList = list(zip(velPf.x,velPf.y))
|
|
outData["out"] = {
|
|
"properties": properties,
|
|
"声剖面列表": profileList
|
|
}
|
|
with open(("" if outParam["outPath"]=="" else outParam["outPath"] + "/")+"profileOut.json", 'w') as jsonFile:
|
|
json.dump(outData, jsonFile, indent=4, ensure_ascii=False)
|
|
|
|
if png:
|
|
# 绘图
|
|
fig, ax = plt.subplots()
|
|
# 声速剖面
|
|
ax.plot(velPf.y, velPf.x)
|
|
if surfCh.exist:
|
|
ax.axhline(surfCh.depAxis, linestyle='--',
|
|
color='r', label='surface channel axis')
|
|
if deepCh.exist:
|
|
ax.axhline(deepCh.depAxis, linestyle='--',
|
|
color='g', label='deep channel axis')
|
|
if surfSL.exist:
|
|
ax.fill_between([1480, 1550], surfSL.limit[0],
|
|
surfSL.limit[1], alpha=0.2, color='r')
|
|
if mainSL.exist:
|
|
ax.fill_between([1480, 1550], mainSL.limit[0],
|
|
mainSL.limit[1], alpha=0.2, color='g')
|
|
ax.set_xlim(1480, 1550)
|
|
ax.invert_yaxis()
|
|
ax.set_xlabel('velocity')
|
|
ax.set_ylabel('depth')
|
|
ax.legend(loc=4)
|
|
# 显示绘图
|
|
plt.show()
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|