python从零开始搭建fdtd架构-1原理

本文介绍如何使用Python从零开始构建时域有限差分(FDTD)算法架构,涵盖网格、边界条件、光源及监视器设置等内容,并深入解析FDTD原理及其在电磁仿真中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python从零开始搭建fdtd架构-1原理

本系列文章从零开始用python搭建时域有限差分算法的架构,具有网格设置、边界条件设置、光源设置、监视器设置、多种图形设置等功能。能够仿真出二维光栅或者三维端面耦合器的耦合效率。本章主要讲解fdtd的主要原理。

1、fdtd原理简介

1.1基本方程

​ 构造FDTD算法的出发点是麦克斯韦时域方程

∇ × H = ∂ D / ∂ t + J ∇ × E = − ∂ B / ∂ t − M ∇ ⋅ D = ρ e ∇ ⋅ B = ρ m \nabla \times H =\partial D /\partial t + J \\ \nabla \times E =-\partial B /\partial t - M \\ \nabla \cdot D = \rho_{e} \\ \nabla \cdot B = \rho_{m} ×H=D/t+J×E=B/tMD=ρeB=ρm
式中:E为电场强度( V / m V/m V/m);D为电位移( C / m 2 C/m^2 C/m2 );H为磁场强度( A / m A/m A/m);B为磁通量密度( W b / m 2 Wb/m^2 Wb/m2 );J为电流密度( A / m 2 A/m^2 A/m2 );M为磁流密度( V / m 2 V/m^2 V/m2 );rhoe为电荷密度( C / m 2 C/m^2 C/m2);rhom为磁荷密度( W b / m 2 Wb/m^2 Wb/m2 )。

​ 对线性、各向同性和非色散媒质可以写成:
D = ϵ E B = μ H D = \epsilon E \\ B = \mu H D=ϵEB=μH
式中: ϵ \epsilon ϵ为媒质的介电常数, μ \mu μ为媒质的磁导率。在自由空间,有:

ϵ = ϵ 0 = 8.854 × 1 0 − 12 F / m μ = μ 0 = 4 π × 1 0 − 7 H / m \epsilon = \epsilon_0 = 8.854 \times 10^{-12} \enspace F/m \\ \mu = \mu_0 = 4 \pi \times 10^{-7} \enspace H/m ϵ=ϵ0=8.854×1012F/mμ=μ0=4π×107H/m
​ 上式有两个矢量方程组成,在三维空间每个矢量方程可以分解为三个标量方程,因此麦克斯韦旋度方程可以表示成六个标量方程,在直角坐标系下,有:

∂ D x ∂ t = 1 ϵ 0 μ 0 ( ∂ H z ∂ y − ∂ H y ∂ z ) ∂ D y ∂ t = 1 ϵ 0 μ 0 ( ∂ H x ∂ z − ∂ H z ∂ x ) ∂ D z ∂ t = 1 ϵ 0 μ 0 ( ∂ H y ∂ x − ∂ H x ∂ y ) ∂ H x ∂ t = 1 ϵ 0 μ 0 ( ∂ E y ∂ z − ∂ E z ∂ y ) ∂ H y ∂ t = 1 ϵ 0 μ 0 ( ∂ E z ∂ x − ∂ E x ∂ z ) ∂ H z ∂ t = 1 ϵ 0 μ 0 ( ∂ E x ∂ y − ∂ E y ∂ x ) \frac{\partial D_x}{\partial t} = \frac{1}{\sqrt{\epsilon_0 \mu_0}} (\frac{\partial H_z}{\partial y}-\frac{\partial H_y}{\partial z}) \\ \frac{\partial D_y}{\partial t} = \frac{1}{\sqrt{\epsilon_0 \mu_0}} (\frac{\partial H_x}{\partial z}-\frac{\partial H_z}{\partial x}) \\ \frac{\partial D_z}{\partial t} = \frac{1}{\sqrt{\epsilon_0 \mu_0}} (\frac{\partial H_y}{\partial x}-\frac{\partial H_x}{\partial y}) \\ \frac{\partial H_x}{\partial t} = \frac{1}{\sqrt{\epsilon_0 \mu_0}} (\frac{\partial E_y}{\partial z}-\frac{\partial E_z}{\partial y}) \\ \frac{\partial H_y}{\partial t} = \frac{1}{\sqrt{\epsilon_0 \mu_0}} (\frac{\partial E_z}{\partial x}-\frac{\partial E_x}{\partial z}) \\ \frac{\partial H_z}{\partial t} = \frac{1}{\sqrt{\epsilon_0 \mu_0}} (\frac{\partial E_x}{\partial y}-\frac{\partial E_y}{\partial x}) \\ tDx=ϵ0μ0 1(yHzzHy)tDy=ϵ0μ0 1(zHxxHz)tDz=ϵ0μ0 1(xHyyHx)tHx=ϵ0μ0 1(zEyyEz)tHy=ϵ0μ0 1(xEzzEx)tHz=ϵ0μ0 1(yExxEy)

1.2 三维问题FDTD更新方程

​ 最初的FDTD是由Yee细胞来描述的,假设E和H场交错在一个单元格周围,其原点在位置i、j和k。每个E场位于距离原点方向方向的半个单元格宽度;除了方向外,每个H场在每个方向上都偏移半个单元格。

电磁场的更新方程如下:

D z n + 1 / 2 ( i , j , k + 1 2 ) = D z n − 1 / 2 ( i , j , k + 1 2 ) + Δ t Δ x ⋅ ϵ 0 μ 0 [ H y n ( i + 1 2 , j , k + 1 2 ) − H y n ( i − 1 2 , j , k + 1 2 ) − H x n ( i , j + 1 2 , k + 1 2 ) + H x n ( i , j − 1 2 , k + 1 2 ) ] H z n + 1 ( i + 1 2 , j + 1 2 , k ) = H z n ( i + 1 2 , j + 1 2 , k ) + Δ t Δ x ⋅ ϵ 0 μ 0 [ E x n + 1 / 2 ( i + 1 2 , j + 1 , k ) − E x n + 1 / 2 ( i + 1 2 , j , k ) − E y n + 1 / 2 ( i + 1 , j + 1 2 , k ) + E y n + 1 / 2 ( i , j + 1 2 , k ) ] D_z^{n+1/2}(i,j,k+\frac{1}{2}) =D_z^{n-1/2} (i,j,k+\frac{1}{2})+\frac{\Delta t}{\Delta x \cdot \sqrt{\epsilon_0 \mu_0}} \\ [H_y^n(i+\frac{1}{2},j,k+\frac{1}{2}) -H_y^n(i-\frac{1}{2},j,k+\frac{1}{2}) \\-H_x^n(i,j+\frac{1}{2},k+\frac{1}{2})+H_x^n(i,j-\frac{1}{2},k+\frac{1}{2})] \\ H_z^{n+1}(i+\frac{1}{2},j+\frac{1}{2},k)=H_z^{n}(i+\frac{1}{2},j+\frac{1}{2},k)+\frac{\Delta t}{\Delta x \cdot \sqrt{\epsilon_0 \mu_0}} \\ [E_x^{n+1/2}(i+\frac{1}{2},j+1,k) -E_x^{n+1/2}(i+\frac{1}{2},j,k) \\-E_y^{n+1/2}(i+1,j+\frac{1}{2},k)+E_y^{n+1/2}(i,j+\frac{1}{2},k)] Dzn+1/2(i,j,k+21)=Dzn1/2(i,j,k+21)+Δxϵ0μ0 Δt[Hyn(i+21,j,k+21)Hyn(i21,j,k+21)Hxn(i,j+21,k+21)+Hxn(i,j21,k+21)]Hzn+1(i+21,j+21,k)=Hzn(i+21,j+21,k)+Δxϵ0μ0 Δt[Exn+1/2(i+21,j+1,k)Exn+1/2(i+21,j,k)Eyn+1/2(i+1,j+21,k)+Eyn+1/2(i,j+21,k)]

其中n+1表示一个时间步长之后。对于3D FDTD仿真,电场和磁场都是思维数据,其中前三维表示x、y、z空间,第四位表示x、y、z分量。Nx、Ny、Nz表示空间长度。

E = np.zeros((Nx, Ny, Nz, 3))
H = np.zeros((Nx, Ny, Nz, 3))

计算旋度:

def curl_E(E) :
    curl = np.zeros(E.shape)

    curl[:, :-1, :, 0] += E[:, 1:, :, 2] - E[:, :-1, :, 2]
    curl[:, :, :-1, 0] -= E[:, :, 1:, 1] - E[:, :, :-1, 1]

    curl[:, :, :-1, 1] += E[:, :, 1:, 0] - E[:, :, :-1, 0]
    curl[:-1, :, :, 1] -= E[1:, :, :, 2] - E[:-1, :, :, 2]

    curl[:-1, :, :, 2] += E[1:, :, :, 1] - E[:-1, :, :, 1]
    curl[:, :-1, :, 2] -= E[:, 1:, :, 0] - E[:, :-1, :, 0]
    return curl


def curl_H(H) :
    curl = np.zeros(H.shape)

    curl[:, 1:, :, 0] += H[:, 1:, :, 2] - H[:, :-1, :, 2]
    curl[:, :, 1:, 0] -= H[:, :, 1:, 1] - H[:, :, :-1, 1]

    curl[:, :, 1:, 1] += H[:, :, 1:, 0] - H[:, :, :-1, 0]
    curl[1:, :, :, 1] -= H[1:, :, :, 2] - H[:-1, :, :, 2]

    curl[1:, :, :, 2] += H[1:, :, :, 1] - H[:-1, :, :, 1]
    curl[:, 1:, :, 2] -= H[:, 1:, :, 0] - H[:, :-1, :, 0]

    return curl
1.3 FDTD方法的稳定条件

​ FDTD方法的数值稳定性要求时间增量delta t相对于空间网格小于一特定值,即有:

Δ t ⩽ 1 c 1 ( Δ x ) 2 + 1 ( Δ y ) 2 + 1 ( Δ z ) 2 \Delta t \leqslant \frac{1}{c \sqrt{\frac{1}{(\Delta x)^2}+\frac{1}{(\Delta y)^2}+\frac{1}{(\Delta z)^2}}} Δtc(Δx)21+(Δy)21+(Δz)21 1
式中c为自由空间中的光速。方程表明,在一个时间步长内,不容许波进行距离超过一个网格的尺寸。

D = int(Nx > 1) + int(Ny > 1) + int(Nz > 1) #计算仿真维度
max_courant_number = float(self.D) ** (-0.5)
courant_number = 0.99 * max_courant_number #计算稳定因子
inverse_permittivity = np.ones((Nx, Ny, Nz, 3)) / float(permittivity) #计算介电常数的倒数
inverse_permeability = np.ones((Nx, Ny, Nz, 3)) / float(permeability)#计算磁导率的倒数

curl = curl_H(self.H)
E += courant_number * inverse_permittivity * curl #更新电场

curl = curl_E(E)
H -= courant_number * inverse_permeability * curl #更新磁场
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

skyer_lhb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值