python从零开始搭建fdtd架构-2 Source与Grid设置

python从零开始搭建fdtd架构-2 Source与Grid设置

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

2、添加点光源

2.1 光源波形

​ 本处点光源设置为正弦波,具有幅度、周期和相位三个参数。其中q表示经过的时间

src = amplitude * sin(2 * pi * q / period + phase_shift)
E[x, y, z, 2] += src
2.2 网格设置

​ 仿真任意器件都需要设置网格大小。新建网格类如下,其中shape表示输入求解域三维的长度数据,为

class Grid:
    def __init__(self, shape, grid_spacing=0.05e-6, permittivity=1.0, permeability=1.0):
        self.Nx, self.Ny, self.Nz = shape
		self.grid_spacing = float(grid_spacing)
        self.D = int(self.Nx > 1) + int(self.Ny > 1) + int(self.Nz > 1)
        self.courant_number = 0.99 * float(self.D) ** (-0.5)
        self.time_step = self.courant_number * self.grid_spacing / const.c
        self.E = np.zeros((self.Nx, self.Ny, self.Nz, 3))
        self.H = np.zeros((self.Nx, self.Ny, self.Nz, 3))
        self.inverse_permittivity = np.ones((self.Nx, self.Ny, self.Nz, 3)) / float(permittivity)
        self.inverse_permeability = np.ones((self.Nx, self.Ny, self.Nz, 3)) / float(permeability)

        self.time_steps_passed = 0
        self.sources = []
2.3 更新电磁场
    def run(self, total_time, progress_bar=True):
        time = range(0, int(total_time), 1)
        for _ in time:
            self.step()

    def step(self):
        self.update_E()
        self.update_H()
        self.time_steps_passed += 1

    def update_E(self):
        curl = curl_H(self.H)
        self.E += self.courant_number * self.inverse_permittivity * curl
        for src in self.sources:
            src.update_E()

    def update_H(self):
        curl = curl_E(self.E)
        self.H -= self.courant_number * self.inverse_permeability * curl
        for src in self.sources:
            src.update_H()
2.4 设置属性

​ 在python中__setitem__(self,key,value)方法时python魔法方法的一种,这个方法会让类按照一定的方法存储和key映射的value。该值可以使用另一种魔法方法__getitem__(self,key)来获取。

使用场景:当期望定义的类具备按照键存储值时,即类能够执行data[‘key’]=value

目的:如果给类定义了__setitem__方法,则可以方便的给类进行赋值。

    def __setitem__(self, key, attr):
        x, y, z = key
        attr._register_grid(grid=self,x=x,y=y,z=z)
2.5 建立点光源类
class PointSource:
    def __init__( self, period = 15, amplitude = 1.0, phase_shift = 0.0,name= None):
        self.grid = None
        self.period = period
        self.amplitude = amplitude
        self.phase_shift = phase_shift
        self.name = name

    def _register_grid(self, grid, x, y, z):
        self.grid = grid
        self.grid.sources.append(self)
        setattr(grid, self.name, self)
        self.x, self.y, self.z = (x, y, z)

    def update_E(self):
        q = self.grid.time_steps_passed
        src = self.amplitude * sin(2 * pi * q / self.period + self.phase_shift)
        self.grid.E[self.x, self.y, 0, 2] += src

    def update_H(self):
        pass
2.6 建立简单的test文件
WAVELENGTH = 1550e-9
SPEED_LIGHT = 299_792_458.0  # [m/s] speed of light

N = 1
nstep = 200
grid = Grid((160, 120, N))

grid[80, 60, 1] = PointSource(period=WAVELENGTH / SPEED_LIGHT, name="source")

import matplotlib.pyplot as plt
import matplotlib

for i in range(nstep):
    grid.step()  # running simulation 1 timestep a time and animating
    if i % 5 == 0:
        plt.figure()
        norm = Norm(vmax=-0.1,vmin=0.1)
       plt.imshow(grid.E[:,:,0,2],interpolation='bilinear',cmap=plt.cm.jet,norm=norm)
        plt.colorbar()
        plt.show()

其仿真结果如下:
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
时域有限差分法(FDTD)是一种计算电磁学问题的数值方法,适用于求解Maxwell方程。该方法的主要思想是将空间和时间都离散化成网格,并通过有限差分近似地代替偏微分运算。通过迭代计算可以得到网格点上的电磁场的值,从而求解出整个空间内电磁场的分布。 FDTD方法有很多优点,比如适用于任意形状的结构、处理非线性材料、计算效率高等。同时,也有一些缺点,比如需要选取合适的网格尺寸、误差随时间增加等问题。但总的来说,FDTD方法在计算电磁学问题方面有着广泛的应用。 本文着重介绍了FDTD的基本原理、算法流程和注意事项。其中,最重要的是在计算过程中要考虑不同介质的性质,可以通过模拟电介质的强度、磁导率、电导率和介电常数等参数来准确计算电磁场的分布。文章也提到了一些改进方法和应用场景,比如在光子晶体、天线和微波器件的设计中,可以利用FDTD方法来求解电磁场分布和传输特性,从而优化设计方案。 作为一种数值方法,FDTD方法的应用需要基于实际模型和精确的参数,因此需要进行大量的实验和数据处理。同时,不同版本的FDTD算法也在不断发展和改进中,可以更加准确地模拟和预测电磁场的分布和传输特性。本文所述的内容虽然比较简要,但足以深入了解FDTD的基本原理和应用价值,对于有兴趣研究电磁学问题的人员具有很大的参考价值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

skyer_lhb

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

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

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

打赏作者

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

抵扣说明:

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

余额充值