波浪模拟
项目描述
waver
在Python中运行nD网格上变量速度的波动方程的模拟。这个库的设计和实现方式在很大程度上借鉴了fdtd库,一个Python 3D电磁FDTD模拟器。
此包允许对波浪模拟进行相当程度的定制。您可以
- 指定网格的大小和间距
- 指定模拟的时间步长,这将确保模拟的稳定性
- 指定模拟的持续时间
- 设置一个变量速度数组(每个网格点一个值),以便在环境中包含“对象”
- 设置波浪的源,可以是点、线或任何(n-1)D子数组
- 使用探测器记录波浪,可以是整个网格、整个边界或特定的边界
- 使用便利方法在同一网格和探测器组合上运行具有不同源的多个模拟
您可以使用napari,一个Python的多维图像查看器,以便轻松可视化检测到的波浪。某些功能也作为napari插件提供,允许从图形用户界面运行模拟。
结果可能如下所示
https://user-images.githubusercontent.com/6531703/128283012-a784ec06-4df9-4ddf-bf4f-e21b927fe4a3.mov
安装
您可以通过pip安装waver
pip install waver
用法
便利方法
使用waver最便捷的方法是使用两种便捷方法之一,这两种方法将为您创建和运行模拟,并返回结果。
第一种方法 run_single_source
允许您在单个网格上使用单个源运行单个模拟,并使用探测器记录结果。例如
from waver.simulation import run_single_source
single_sim_params = {
'size': (12.8e-3, 12.8e-3),
'spacing': 100e-6,
'duration': 80e-6,
'min_speed': 343,
'max_speed': 686,
'speed': 686,
'time_step': 50e-9,
'temporal_downsample': 2,
'location': (6.4e-3, 6.4e-3),
'period': 5e-6,
'ncycles':1,
}
detected_wave, speed_grid = run_single_source(**single_sim_params)
第二种方法 run_multiple_sources
允许您在相同的网格上使用相同的探测器运行多个模拟,并返回结果。例如
from waver.simulation import run_multiple_sources
multi_sim_params = {
'size': (12.8e-3, 12.8e-3),
'spacing': 100e-6,
'duration': 80e-6,
'min_speed': 343,
'max_speed': 686,
'speed': 686,
'time_step': 50e-9,
'temporal_downsample': 2,
'sources': [{
'location': (6.4e-3, 6.4e-3),
'period': 5e-6,
'ncycles':1,
}]
}
detected_wave, speed_grid = run_multiple_sources(**multi_sim_params)
这两种方法的主要区别在于 run_multiple_sources
接收一个 sources
参数,它接受一个字典列表,其键对应于在 run_single_source
中找到的与源相关的关键字参数。
可视化
如果您想快速可视化 run_multiple_sources
的结果,可以使用 run_and_visualize
命令,该命令将运行模拟并随后启动 napari,如 examples/2D/point_source.py 中的示例所示
from waver.datasets import run_and_visualize
run_and_visualize(**multi_sim_params)
数据集
如果您想在许多不同的速度网格上运行模拟,可以使用 generate_simulation_dataset
方法作为便捷方式。结果将保存到您选择的 zarr 文件中。然后您可以使用 load_simulation_dataset
加载数据集。
from waver.datasets import generate_simulation_dataset
# Define root path for simulation
path = './simulation_dataset.zarr'
runs = 5
# Define a simulation, 12.8mm, 100um spacing
dataset_sim_params = {
'size': (12.8e-3, 12.8e-3),
'spacing': 100e-6,
'duration': 80e-6,
'min_speed': 343,
'max_speed': 686,
'speed': 'mixed_random_ifft',
'time_step': 50e-9,
'sources': [{
'location': (None, 0),
'period': 5e-6,
'ncycles':1,
}],
'temporal_downsample': 2,
'boundary': 1,
'edge': 1,
}
# Run and save simulation
generate_simulation_dataset(path, runs, **dataset_sim_params)
generate_simulation_dataset
允许 speed
为字符串,该字符串将指定为模拟网格随机生成速度值的特定方法。
模拟对象
如果您想更详细地了解模拟是如何定义的,您可能想使用底层模拟对象 Simulation
并手动设置如 Source
和 Detector
等关键对象。以下是一个完整的示例
# Create a simulation
sim = Simulation(size=size, spacing=spacing, max_speed=max_speed, time_step=time_step)
# Set speed array
sim.set_speed(speed=speed, min_speed=min_speed, max_speed=max_speed)
# Add source
sim.add_source(location=location, period=period, ncycles=ncycles, phase=phase)
# Add detector grid
sim.add_detector(spatial_downsample=spatial_downsample,
boundary=boundary, edge=edge)
# Run simulation
sim.run(duration=duration, temporal_downsample=temporal_downsample, progress=progress, leave=leave)
# Print simulation wave and speed data
print('wave: ', sim.detected_wave)
print('speed: ', sim.grid_speed)
注意这些步骤是在 run_single_source
方法中为您作为便捷方式执行的。
已知限制
最近添加了 完美匹配层 边界,但在所有条件下可能表现不佳。欢迎在此处提供更多贡献。
目前模拟速度相当慢。我希望能添加一个 JAX 后端,但我还没有这样做。欢迎贡献。
贡献
非常欢迎贡献。可以使用 tox 运行测试,请在提交拉取请求之前确保覆盖率至少保持不变。
许可证
在 BSD-3 许可证下分发,"waver" 是免费和开源软件
问题
如果您遇到任何问题,请 提交一个问题 并附上详细描述。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。