MindSpore AI科学计算系列 | AD_FDTD基于昇思MindSpore的端到端可微分电磁求解器

背景

昇思MindSpore联合华为诺亚方舟实验室团队合作构建了端到端可微的时域有限差分FDTD(Finite-Difference Time-Domain, FDTD)电磁求解器,并且在贴片天线、贴片滤波器以及二维电磁逆散射等场景中得到了验证。

FDTD最早由K.S.Yee于1966年提出,K.S.Yee对电磁场E、H分量在空间和时间上采取交替抽样的方式进行离散和迭代计算。经过50多年的发展FDTD已经成为成熟的数值方法,并且应用范围非常广泛,如辐射天线的分析、微波器件和导行波结构的研究、散射和雷达截面计算、周期结构分析、电子封装、核电磁脉冲的传播和散射等。尽管如此,传统的数值方法仍面临计算效率低下、计算流程复杂等问题,尤其是在电磁逆问题中。

随着人工智能技术的发展,AI融合计算(AI与传统数值方法融合)有望解决上述问题。在本工作中,我们基于昇思MindSpore构建了端到端可微分的电磁求解器AD_FDTD。该求解器可以采用昇思MindSpore的神经网络算子重写FDTD正向求解过程,也可以利用昇思MindSpore的自动微分能力对电磁逆问题中的介质参数进行端到端的优化。未来我们还可以将FDTD中部分复杂的求解过程用AI代理模型替代,可以说端到端可微分的电磁求解器为电磁技术探索和发展提供了更多的可能。

1、可微分FDTD求解器原理

时域Maxwell方程组有如下形式:

数值求解要求我们将该方程离散化。首先处理对时间的偏导数。FDTD采用蛙跳格式交替更新电场和磁场,得到以下时间步进格式:

显然,按上式更新电磁场的过程可以等价于一个循环神经网络。

在Yee网格上,电场和磁场交替排列,因而可用中心差分近似微分算子,而差分算子可以等价为卷积算子。例如:

该操作等价于卷积操作,卷积核为

综上所述,FDTD求解时域Maxwell方程组的过程可以用循环卷积网络[1]的结构表示。借助昇思MindSpore的可微分算子重写FDTD求解过程,便可得到端到端可微的FDTD电磁求解器。

2、应用案例

接下来将分别通过正向仿真案例和反向优化案例带大家了解该求解器的特性和使用方法。

案例:

https://www.mindspore.cn/mindelec/docs/zh-CN/master/AD_FDTD.html

代码:

https://gitee.com/mindspore/mindscience/tree/master/MindElec/examples/AD_FDTD

2.1正向仿真案例:贴片天线S参数仿真

电磁仿真在天线、芯片和手机等产品设计过程中应用广泛,主要目的是获取待仿真目标的传输特性(散射参数、电磁场等)。散射参数(S参数)是建立在输入波、反射波基础上的网络参数,常用于分析微波电路的性能。

利用代码包提供的API,用户可以按照“导入依赖”、“定义激励波形”、“定义天线结构”、“定义求解器并求解”的顺序建立S参数仿真流程。

首先导入相关依赖:

from src import CFSParameters, Gaussian
from src import Antenna, SParameterSolver
from src import GridHelper, UniformBrick, PECPlate, VoltageSource
from src import VoltageMonitor, CurrentMonitor
from src import full3d

然后,定义激励端口电压的时域波形,这里为高斯波形:

def get_waveform_t(nt, dt, fmax):
    t = (np.arange(0, nt) + 0.5) * dt
    waveform = Gaussian(fmax)
    waveform_t = waveform(t)
    return waveform_t, t

本案例的仿真目标为贴片天线和贴片滤波器,其结构分别如下图所示[2]:

根据天线结构图,利用代码包提供的API完成天线结构的建模:

贴片天线:

def get_invert_f_antenna(air_buffers, npml):
    """ Get grid for IFA. """
    # Define FDTD grid
    cell_lengths = (0.262e-3, 0.4e-3, 0.4e-3)
    obj_lengths = (0.787e-3, 40e-3, 40e-3)
    cell_numbers = (
        2 * npml + 2 * air_buffers[0] + int(obj_lengths[0] / cell_lengths[0]),
        2 * npml + 2 * air_buffers[1] + int(obj_lengths[1] / cell_lengths[1]),
        2 * npml + 2 * air_buffers[2] + int(obj_lengths[2] / cell_lengths[2]),
    )
    grid = GridHelper(cell_numbers, cell_lengths, origin=(
        npml + air_buffers[0] + int(obj_lengths[0] / cell_lengths[0]),
        npml + air_buffers[1],
        npml + air_buffers[2],
    ))
    # Define antenna
    grid[-3:0, 0:100, 0:100] = UniformBrick(epsr=2.2)
    grid[0, 0:71, 60:66] = PECPlate('x')
    grid[0, 40:71, 75:81] = PECPlate('x')
    grid[0, 65:71, 21:81] = PECPlate('x')
    grid[0, 52:58, 40:81] = PECPlate('x')
    grid[-3:0, 40, 75:81] = PECPlate('y')
    grid[-3, 0:40, 0:100] = PECPlate('x')
    # Define sources
    grid[-3:0, 0, 60:66] = VoltageSource(amplitude=1., r=50., polarization='xp')
    # Define monitors
    grid[-3:0, 0, 61:66] = VoltageMonitor('xp')
    grid[-1, 0, 60:66] = CurrentMonitor('xp')
    return grid

贴片滤波器:

def get_microstrip_filter(air_buffers, npml):
    """ microstrip filter """
    # Define FDTD grid
    cell_lengths = (0.4064e-3, 0.4233e-3, 0.265e-3)
    obj_lengths = (50 * cell_lengths[0],
                   46 * cell_lengths[1],
                   3 * cell_lengths[2])
    cell_numbers = (
        2 * npml + 2 * air_buffers[0] + int(obj_lengths[0] / cell_lengths[0]),
        2 * npml + 2 * air_buffers[1] + int(obj_lengths[1] / cell_lengths[1]),
        2 * npml + 2 * air_buffers[2] + int(obj_lengths[2] / cell_lengths[2]),
    )
    grid = GridHelper(cell_numbers, cell_lengths, origin=(
        npml + air_buffers[0],
        npml + air_buffers[1],
        npml + air_buffers[2],
    ))
    # Define antenna
    grid[0:50, 0:46, 0:3] = UniformBrick(epsr=2.2)
    grid[14:20, 0:20, 3] = PECPlate('z')
    grid[30:36, 26:46, 3] = PECPlate('z')
    grid[0:50, 20:26, 3] = PECPlate('z')
    grid[0:50, 0:46, 0] = PECPlate('z')
    # Define sources
    grid[14:20, 0, 0:3] = VoltageSource(1., 50., 'zp')
    # Define load
    grid[30:36, 46, 0:3] = Resistor(50., 'z')
    # Define monitors
    grid[14:20, 10, 0:3] = VoltageMonitor('zp')
    grid[14:20, 10, 3] = CurrentMonitor('yp')
    grid[30:36, 36, 0:3] = VoltageMonitor('zp')
    grid[30:36, 36, 3] = CurrentMonitor('yn')
    return grid

最后,定义基于可微分FDTD的S参数求解器并求解:

# define fdtd network
fdtd_net = full3d.ADFDTD(grid_helper.cell_numbers, grid_helper.cell_lengths,
                            nt, dt, ns, antenna, cpml)
# define solver
solver = SParameterSolver(fdtd_net)
# solve
outputs = solver.solve(waveform_t)

比较可微分FDTD计算得到的S参数与文献[1]的结果,发现可微分FDTD的计算结果与传统数值算法的计算结果精度相当:

2.2优化案例:求解电磁逆散射问题

在本案例中,我们利用昇思MindSpore的自动微分能力,通过可微分的FDTD方法,根据接收天线接收到的时域信号重建介质体。本案例求解的二维电磁逆散射问题如下所示[3]:

在案例中,整个仿真区域剖分为100x100的网格,优化区域(蓝色方框)为40x40网格,优化区域外设置4个激励源(红色三角)和8个观察点(绿色圆点),待反演目标为两个相对介电常数为4的介质体。

利用代码包提供的API,用户可按照“导入依赖”、“导入数据集”、“定义介质模型”、“定义可微分FDTD网络”、 “定义损失函数和优化器”、“模型训练与评估”的顺序构建电磁逆散射问题的端到端优化求解流程。

首先,导入相关依赖:

from src import transverse_magnetic, EMInverseSolver
from src import Gaussian, CFSParameters
from src import BaseTopologyDesigner

然后,导入数据集。数据集包括接收天线处的时域电场分量,由传统数值算法计算得到;以及真实的相对介电常数分布,用于评估反演效果:

def load_labels(nt, dataset_dir):
    field_label_path = os.path.join(dataset_dir, 'ez_labels.npy')
    field_labels = tensor(np.load(field_label_path))[:nt]
    epsr_label_path = os.path.join(dataset_dir, 'epsr_labels.npy')
    epsr_labels = tensor(np.load(epsr_label_path))
    return field_labels, epsr_labels

然后,定义反演区域,包括可训练参数到相对介电常数的映射、激励源位置、接收天线位置:

class InverseDomain(BaseTopologyDesigner):
    def generate_object(self, rho):
        """Generate material tensors.
        """
        # generate background material tensors
        epsr = self.background_epsr * self.grid
        sige = self.background_sige * self.grid
        epsr[30:70, 30:70] = self.background_epsr + elu(rho, alpha=1e-2)
        return epsr, sige

    def update_sources(self, *args):
        """Set locations of sources.
        """
        sources, _, waveform, _ = args
        jz = sources[0]
        jz[0, :, 20, 50] = waveform
        jz[1, :, 50, 20] = waveform
        jz[2, :, 80, 50] = waveform
        jz[3, :, 50, 80] = waveform
        return jz

    def get_outputs_at_each_step(self, *args):
        """Compute output each step.
        """
        ez, _, _ = args[0]
        rx = [
            ez[:, 0, 25, 25],
            ez[:, 0, 25, 50],
            ez[:, 0, 25, 75],
            ez[:, 0, 50, 25],
            ez[:, 0, 50, 75],
            ez[:, 0, 75, 25],
            ez[:, 0, 75, 50],
            ez[:, 0, 75, 75],
        ]
        return vstack(rx)

这里,我们通过elu激活函数避免反演得到的非物理的相对介电常数。

接着,定义可微分FDTD网络。根据之前的描述,FDTD求解时域Maxwell方程组的过程可以等价为循环卷积网络。以二维TM问题为例,FDTD求解过程中各场量的更新过程如下:

代码已实现上述更新过程,用户可直接调用相关API定义可微分FDTD网络。

最后,定义损失函数和优化器并进行训练和评估:

# define fdtd network
fdtd_net = transverse_magnetic.ADFDTD(
    cell_numbers, cell_lengths, nt, dt, ns,
    inverse_domain, cpml, rho_init)
# define sovler for inverse problem
epochs = options.epochs
lr = options.lr
loss_fn = nn.MSELoss(reduction='sum')
optimizer = nn.Adam(fdtd_net.trainable_params(), learning_rate=lr)
solver = EMInverseSolver(fdtd_net, loss_fn, optimizer)
# solve
solver.solve(epochs, waveform_t, field_labels)

反演得到的相对介电常数的PSNR和SSIM分别为27.84dB和0.96,具体分布情况如下图所示:

3、总结

我们推出了基于昇思MindSpore的端到端可微分FDTD电磁求解器,能够实现电磁仿真的可微求解,并且在贴片天线、贴片滤波器以及二维电磁逆散射等场景进行了原型验证。在贴片天线、贴片滤波器案例中,S参数仿真精度与传统数值方法相当;在二维电磁逆散射案例中,反演得到的介质参数的结构相似度(SSIM)达96%。我们欢迎更多的企业、科研院所参与到我们的开源社区中来,持续演进可微分FDTD电磁求解器,共同探索AI+电磁的未来。

参考文献

[1] L. Guo, et al., Electromagnetic Modeling Using an FDTD-Equivalent Recurrent Convolution Neural Network: Accurate Computing on a Deep Learning Framework [J], IEEE Antennas and Propagation Magazine, 2021.

[2] A. Z. Elsherbeni and V. Demir, The Finite-Difference Time-Domain Method for Electromagnetics with MATLAB Simulations [M], 2ed, 2016.

[3] P. Zhang, et al., A Maxwell’s Equations Based Deep Learning Method for Time Domain Electromagnetic Simulations [J], IEEE Journal on Multiscale and Multiphysics Computational Techniques, vol. 6, pp. 35-40, 2021.

MindSpore官方资料

官方QQ群 : 871543426

官网:https://www.mindspore.cn/

Gitee : https://gitee.com/mindspore/mindspore

GitHub : https://github.com/mindspore-ai/mindspore

论坛:https://www.hiascend.com/forum/forum-0106101385921175002-1.html

Openl启智社区:https://openi.pcl.ac.cn/ 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值