#磁性 #磁盘 #非轴心 #螺线管

rustycoils

计算圆柱对称螺线管和电流环系统的非轴心磁场的快速方法

2 个版本

0.1.1 2021 年 7 月 13 日
0.1.0 2021 年 7 月 13 日

#251科学

MIT 许可证

120KB
2.5K SLoC

热丝线圈

Actions Status Actions Status License: MIT

这个库实现了一种数值方法,用于确定具有圆柱对称的电流系统的非轴心磁场,即螺线管和线圈。其底层算法来自 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