ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

KrakenC声传播损失计算:从环境文件到TL场绘制全流程解析

KrakenC声传播损失计算:从环境文件到TL场绘制全流程解析 简介面向水下声学建模、海洋工程与环境监测等场景中的声传播分析需求这份压缩包提供了基于KrakenC与Kraken的声场计算与声传播仿真方法。KrakenC是Kraken的扩展版本两者都依托有限元与边界元方法求解复杂水声环境中的波动方程可用于声呐性能评估、水下噪声控制与设备设计优化。压缩包内仅含1个MATLAB脚本m文件包体约772B便于快速部署。脚本通过调用KrakenC库接口在MATLAB中完成几何模型导入、物理参数设置、网格构建、声源定义、波动方程求解、传播损失计算与结果可视化等完整流程为水声研究者与工程师提供了一条简洁的声场计算路径。资源发布至今已有598人学习适合需要快速掌握KrakenC/Kraken声场仿真流程的入门及进阶人员。通过研读脚本可以深入理解从声源设定到传播损失输出的全链路实现细节学习KrakenC与MATLAB的集成方式为后续开展水下声场模拟、设备性能评估和观测精度提升打下基础。1. 声场计算里那个绕不开的 KrakenC从“能传多远”到直接算 TL多数做水下探测、通信链路预算或者水声环境评估的人早晚会碰到同一个问题在这个海域、这个频率、这个声源深度下信号到底能传多远。这个问题不是一个固定公式能回答的——声速剖面、海底地形、沉积层吸收都会改变传播路径。业内公认的做法是把环境参数写进传播模型输出一条条随距离变化的传播损失曲线。Kraken 是法向模式模型中最常用的实现之一几十年来被引用数千次后来出现的 KrakenC 是它的 C 语言重写版本把原来的 Fortran 代码封装成更干净的命令行工具。krakenc_tl.zip 这类包里通常直接放了编译好的 krakenc 可执行文件、field 程序和一些示例环境文件让你跳过编译环节从零开始算出一整张随距离和深度变化的声场图。下面就把从环境文件到 TL 输出的完整链路走一遍。2. 法向模式法为什么能算出声传播损失2.1 本征值问题是怎么来的在水平分层的海洋环境中密度和声速只随深度变化。将柱坐标下的波动方程做变量分离后深度方向的声压满足常微分方程同时水平方向得到满足色散关系的传播常数。方程里的 k 不是任意取的它必须和边界条件以及声速剖面一起满足本征值条件。每满足一个条件就得到一阶模式对应的深度函数叫本征函数工程上叫“简正波”。声源发射的声波进入这个波导后只有有限几阶模式能有效传播其余的在传播过程中衰减殆尽。# 用均匀网格离散深度本征值问题的最小示例 # 作用是建立“模式本征向量”的直觉不是 KrakenC 的内部实现 import numpy as np def mode_demo(z, c, f100.0): # z: 深度数组(m)c: 声速数组(m/s)f: 频率(Hz) omega 2.0 * np.pi * f N len(z) dz z[1] - z[0] A np.zeros((N, N)) for i in range(N): # 对角元差分二阶导加当地声速决定的波数 A[i, i] 2.0 / dz**2 (omega / c[i])**2 if i 0: A[i, i - 1] -1.0 / dz**2 if i N - 1: A[i, i 1] -1.0 / dz**2 w, v np.linalg.eig(A) order np.argsort(w.real) return w.real[order], v[:, order]代码里A[i, i]两项分别来自深度二阶导的差分格式和当地波数-1.0/dz**2是二阶导的邻近耦合项。调用np.linalg.eig得到特征值和特征向量后按实部排序。特征值对应水平波数的平方特征向量就是模式在深度方向的振型。比如w, v mode_demo(z, c, 100.0)返回的w里前几个值就是低阶模式对应的传播常数平方v的每一列则是该模式在深度网格上的振型。KrakenC 内部用的是更精确的 Galerkin 加权残差法而不是这么粗的差分但两者本质都在解决同一个本征值问题的离散化。2.2 模式数少为什么反而好法向模式法的优势在于只要频率不高有效的模式数量通常是几阶到几十阶。和射线法逐条声线追踪相比模式法天然包含了衍射和干涉和抛物方程法逐距离步进相比模式法不需要处理角谱扩展问题一次计算得到整个深度场。代价是假设环境在水平方向不变一旦海底地形或声速剖面沿距离快速变化模式耦合会变得复杂这是法向模式模型公认的边界。模型水平变化支持频率特性一次运行输出主要误差来源法向模式(KrakenC)弱中低频全深度、全距离 TL 场模式截断、单模耦合射线(Bellhop)强高频声线路径和到达结构影区/Fresnel焦散抛物方程(RAM)强低频全深度场距离步进步长、角度限制实际水声工程里的链路预算比如深海声道通信大多在几十到几百赫兹工作正好落在法向模式的舒适区。这也是 KrakenC 被广泛用于环境噪声预报、声呐性能预测和匹配场定位的原因。2.3 传播损失怎么从模式叠加里出来每阶模式在水平方向按自己的复传播常数前进幅度以指数形式衰减衰减的快慢由海底吸收决定。接收点声压是各阶模式的复振幅叠加。传播损失 TL 定义是 20 倍 log10 的声压幅度比单位 dB。TL 场给出后声呐方程里的传播项就确定了所有后续预算都可以展开。每阶模式都有自己的相速度和群速度它们在深度上形成不同的振型组合。远场的干涉条纹来自两阶较强模式之间的拍频。模式号越高在层内振荡越多进入海底越深衰减也越大。因此长距离传播时高号模式很快消失剩下的低阶模式形成了稳定的深海声道传播结构。这解释了一个很实际的现象在汇聚区CZ里信号突然增强就是因为特定几阶模式在该深度近似同相叠加。3. 把 KrakenC 跑起来的文件体系与命令行约定3.1 环境文件里每一段在说什么KrakenC 的运行起点是一个文本环境文件后缀通常用.env。这个文件按固定顺序描述介质。第一行是任意标题第二行是频率第三行是介质结构描述比如海水是否分多层之后的若干行是声速剖面即深度和声速的配对接着是底质参数包括密度、纵波速度、横波速度和衰减最后描述源深度和接收深度设置。由于这个格式从 Fortran 时代延续下来很多人第一次打开会看到一堆看起来重复的数字其实每段数字对应不同的物理量不能随意删改。段落典型内容作用标题行KRAKEN 开头的任意字符识别任务名频率行100.0 表示100 Hz决定模式数、网格密度介质层1 SSP表示单层海水控制分层方式声速剖面深度(m) 与声速(m/s) 成对核心输入底质数据密度、吸收系数决定边界衰减在 krakenc_tl.zip 解压后的目录里一般会带有两三个示例.env文件写新任务时先复制一份示例再改第二行的频率和声速剖面比从空白文件写起要稳得多。3.2 编译好的 krakenc 怎么调用# 生成模式文件输出到 test.mod ./krakenc test.env # 生成传播损失场 ./fieldc test.flpkrakenc读入test.env后会输出test.mod这个模式文件包含每一阶模式的复本征值、振型和衰减系数。如果终端里看不见输出信息可能是没有给可执行文件加执行权限用chmod x krakenc之后重试。fieldc读入场参数文件test.flp合成声压场结果写到test.shd或test.tl。两步分离的设计是有意的模式文件只和环境有关和接收阵无关。同一环境换不同接收阵只需要重跑fieldc不需要重算模式这在批量仿真中省下大量时间。3.3 场参数文件里几个容易错的量场参数文件同样是个文本文件通常第一行是标题接着给出源深度、接收深度范围、接收深度点数、距离范围和距离点数。深度单位是米距离单位是公里这个差异非常容易造成读数混乱。曾经有同事把距离范围写成 0.5 到 100以为是 100m实际是 100km结果图上所有近距离细节全被拉伸没了。FIELD 20.0 100 5.0 5000.0 200 0.5 100.0这里 20.0 是声源深度 20m100 是从 5m 到 5000m 的接收深度点数200 是从 0.5km 到 100km 的距离点数。修改这些数字时注意保持顺序field 程序是按位置读数的。4. 从环境文件到声场图一个 500 Hz 深海算例4.1 写一个带声道轴的深海环境以 5000m 深海为例声道轴大约在 1000m声速从海面往声道轴递减再往深处递增。把这个剖面写成deep.envKRAKEN deep 500Hz 500.0 1 SSP 0.0 1500.0 200.0 1490.0 1000.0 1480.0 2000.0 1490.0 3500.0 1510.0 5000.0 1550.0 0.0说明标题行随意只要以字母开头。500.0 是频率 500Hz。第三行的1 SSP表示海水只算一层声速剖面用深度-声速点对描述。随后 6 行是剖面点KrakenC 在点之间做插值。末尾的0.0在简化示例中表示液态半空间海底实际工程里需要替换成密度和吸收矩阵字段位置以包内示例文件为准。4.2 跑通模式计算./krakenc deep.env正常输出会显示找到多少阶模式以及每阶模式的相速度和衰减系数。这里判断算没算对的标准不是“有没有报错”而是模式数和衰减的变化趋势。500Hz 在 5000m 深海中有效模式数量通常在十几阶到几十阶之间如果你看到模式数是 0 或者大得离谱先检查声速剖面里是不是出现了小于 0 的值或错位的换行。提示如果同一份 .env 文件在 Windows 的 Fortran 版 Kraken 下正常在 Linux 的 KrakenC 下报格式错误多半是文件换行符和行末空格的问题用dos2unix处理后再跑。4.3 用 fieldc 合成 TL 场编写deep.flp文件FIELD 20.0 100 5.0 5000.0 200 0.5 100.0这里选源深度 20m接近实际声呐拖体深度接收深度 100 个点覆盖 5m 到 5000m距离 200 个点从 0.5km 到 100km。fieldc 运行后得到的deep.tl是传播损失矩阵每一行对应一个接收深度每一列对应一个距离数值单位是 dB。有些场景下需要复数声压做阵列信号处理那就保留deep.shd文件二进制格式读取需要配合包里配套的读取脚本。4.4 用 Python 画出声道传播结构# 读取 .tl 文本矩阵并绘制声场传播损失图 import numpy as np import matplotlib.pyplot as plt tl np.loadtxt(deep.tl) # 形状 (接收深度数, 距离数) nz, nr tl.shape z np.linspace(5.0, 5000.0, nz) # 深度轴单位 m r np.linspace(0.5, 100.0, nr) # 距离轴单位 km plt.figure(figsize(11, 6)) plt.pcolormesh(r, z, tl, shadingauto, cmapjet, vmin40, vmax100) plt.colorbar(labelTransmission Loss (dB)) plt.xlabel(Range (km)) plt.ylabel(Depth (m)) plt.ylim(5000, 0) # 海面朝上 plt.title(KrakenC TL field at 500 Hz) plt.tight_layout() plt.savefig(deep_tl.png, dpi150)np.loadtxt读入文本矩阵后用shape取出行列数然后生成深度轴和距离轴。pcolormesh绘图时要求三个数组维度匹配所以先用linspace构造两个一维坐标。vmin40, vmax100是为了把色标压到合理区间不让近场几十 dB 的强信号把远处细节冲掉。ylim反转深度轴符合水声制图习惯。4.5 看图的重点运行完这段代码应该能看到在声道轴深度附近传播的低阶模式形成清晰波导声能量沿着深海声道传到上百公里而在海面和海底附近出现明显的衰减边界。如果图上只有均匀衰减的同心圆弧没有明显的声道聚焦结构那么声速剖面的声道轴位置或源深度很可能写错了。5. 摸清 KrakenC 边界模式截断、参数修正与常见误差源5.1 模式截断别让自由模式数毁了曲线法向模式模型把连续声场截断成有限阶模式截断数设多少直接决定精度。常见做法是从 krakenc 输出的模式列表里看每阶模式的衰减系数算一下在最大仿真距离上还能贡献多少 dB。例如某阶模式衰减 0.1 dB/km在 100 km 处总衰减 10 dB对总声场影响不算小要保留衰减 1 dB/km 的模式到 100 km 衰减了 100 dB基本可以忽略。批次任务里把模式数范围写进配置先跑低分辨率试探再按间距向上调整到曲线收敛。5.2 Kraken 和 KrakenC 的差异不是玄学Fortran 原版对老机器的兼容性好编译参数多适合研究者复现文献数据KrakenC 的优势集中在工程集成单一可执行文件无 Fortran 运行时依赖输出文本可被 Python 直接读取Linux/Windows 都能用。数值结果几乎一致个别场景下有微小差异主要来源是矩阵求解器和浮点累积精度的不同。如果你在两个版本之间切换发现 TL 差了好几 dB先检查环境文件而不是怀疑编译版本。5.3 验证算例一个所有工具都能算的理想波导拿 Pekeris 波导做交叉验证最靠谱等声速海水层加液态半空间底这个场景有解析解Bellhop 和 KrakenC 都能算。验证时固定频率和源深分别用 KrakenC 和 Bellhop 跑同样的距离截面对比 10 km 和 50 km 处的 TL 曲线。深海声道场景下还要对比汇聚区位置汇聚区范围差 5% 以内可以接受。如果对不上优先怀疑声速剖面插值方式KrakenC 在深度点之间采用线性插值和分层常梯度近似而 Bellhop 是基于声线步进两者对剖面离散的敏感度不同。5.4 一个提高批量效率的具体技巧仿真多个海域或频率时把环境文件按编号组织在 shell 里循环调用for f in *.env; do ./krakenc $f ./fieldc ${f%.env}.flp done这个循环会依序处理当前目录下所有环境文件。${f%.env}.flp是 shell 参数扩展把site01.env变成site01.flp保证同名配对。脚本跑完后检查.mod文件的时间戳比翻日志更可靠地判断哪一步失败。本文还有配套的精品资源点击获取
返回列表