2 个版本
0.1.1 | 2021 年 7 月 13 日 |
---|---|
0.1.0 | 2021 年 7 月 13 日 |
#251 在 科学
120KB
2.5K SLoC
热丝线圈
这个库实现了一种数值方法,用于确定具有圆柱对称的电流系统的非轴心磁场,即螺线管和线圈。其底层算法来自 R.H. Jackson 的《拉普拉斯方程的非轴心扩展解:应用于线圈磁场的精确和快速计算》一文。该方法利用了原始线圈/环形状,对于这些形状的轴心磁场(及其所有导数)是解析已知的。这些导数的幂级数可用于确定完整的非轴心磁场。只要感兴趣的位置足够接近轴心,这种方法就可以提供非常快速和精确的磁场计算。正如论文中所述,该算法旨在“足够快以供交互使用,足够紧凑以嵌入到其他代码中”。
基于椭圆积分的无穷薄线环存在完全解析解,可以组合起来计算更复杂的线圈系统的场。当使用多个线环来模拟螺线管或一组线圈时,这可能变得很慢。特别是当感兴趣的磁场区域靠近轴心时。在这种情况下,这里实现的方法很有用,包括螺线管等扩展形状作为基本原始形状。例如,这出现在原子光学实验中,模拟原子在由螺线管或线圈系统提供的(不)均匀磁场中移动的原子束。在每个时间步长,都需要计算靠近系统轴心的原子分布的磁场。这种情况只需要接近轴心的场值,对于包含许多原子的模拟,需要重复计算许多场值。
此包是用 Rust 编写的,以利用其速度和并行化能力,但实际上,这只是因为我想要一个使用 Rust 的项目的借口,并在另一个仓库中(rustpycoils)使用 pyo3 编写了一个 Python 包装器。
算法使用了具有圆柱对称的原始形状
- 理想电流环
- 环形盘
- 薄螺线管
- 厚螺线管(线圈)
警告
我非常快地拼凑了这个东西,它仍然是一个非常初级的原型。我已经测试了一个理想线圈的情况,它有一个简单的解析解,看起来是可行的(测试脚本在 idealloop.rs。但我还没有测试其他原语,只是检查了在一定范围内,它们从组合多个电流线圈中得到相同的答案。如果有人想使用这个软件包的当前版本,请在使用之前将其解决方案与其他方法进行对照。
使用方法
该包暴露了一个单一的struct
//object containing primitives sharing a symmetry axis
mycoil = AxialSystem::default();
它定义了一个对称轴。目前,这个对称轴只能定义在三个笛卡尔轴上(默认为x轴)。最终这将变得任意。
mycoil.transform_x();
mycoil.transform_y();
mycoil.transform_z();
可以使用独特的UTF-8标识符将单个原语线圈添加到AxialSystem中。单位是国际单位制,半径、厚度、长度和位置以米为单位,电流以安培为单位。原语的位置是从一端定义的,即位于原点5米处的10米长螺线管将在5米处有一个开口,第二个在15米处。
//define physical parameters
let radius = 1.0;
let thickness = 0.1;
let current = 1.0;
let length = 5.0;
let position = 2.0; //position along the symmetry axis
mycoil.add_loop("loop1",radius,position,current);
mycoil.add_annular("foo",radius,thickness,position,current);
mycoil.add_solenoid("bar",radius,length,position,length);
mycoil.add_coil("coil1",radius,length,thickness,position,current);
可以使用以下函数修改控制这些原语的参数
//change radius of the current loop
mycoil.modify_radius("loop1",6.0);
//change length of the solenoid "bar"
mycoil.modify_length("bar",3.0);
//change length of the coil "coil1"
mycoil.modify_position("coil1",3.0);
//change thickness of the annular "foo"
mycoil.modify_thickness("foo",1.0);
//change current of the annular "foo"
mycoil.modify_current("foo",1.0);
这些函数接受关键字来一次性修改多个原语。请注意,这些关键字不能用作原语的标识符。
保留字 | 含义 |
---|---|
* | 适用于所有 |
LOOP | 适用于电流线圈 |
ANNULAR | 适用于环形线圈 |
SOLENOID | 适用于螺线管 |
COIL | 适用于线圈 |
//changes all the current of all primitives
mycoil.modify_current("*",6.0);
//changes all the current of all current loop primitives
mycoil.modify_current("LOOP",6.0);
//changes all the radius of all annular primitives
mycoil.modify_radius("ANNULAR",6.0);
//changes all the length of all solenoid primitives
mycoil.modify_length("SOLENOID",6.0);
//changes all the length of all coil primitives
mycoil.modify_thickness("COIL",6.0);
可以通过以下方式计算笛卡尔方向中的磁场
[mag_x,mag_y,mag_z] = mycoil.get_field([x,y,z],1e-10);
其中1e-10是停止包括幂级数中额外项的容差,它以绝对误差定义。
待办事项
我计划很快实现的事情
- 对称轴的任意方向
- 沿不同轴组合多个AxialSystem
依赖关系
~0–550KB
~11K SLoC