python规则网格插值不规则边界_不规则边界PIC(Particle In Cell)程序两种路线的优缺点讨论...

PIC方法在等离子体模拟领域是比较常用的方法,属于动理学方法,主要用于低碰撞等离子体模拟。现存绝大部分PIC程序都是均匀网格,场求解采用有限差分方法。有限差分方法很难处理不规则边界。目前来看,为了模拟不规则边界,主要有两种路线:1. 均匀结构网格+Cut-Cell;2. 非结构网格(三角网格,多边形网格等)。两种路线各有优缺点。

均匀结构网格+Cut-Cell:

优点:

1. 大部分模拟区域为均匀网格,粒子推动、插值、投影简单,获取粒子所在网格的效率高。

2. 并行的实现相对简单。

3. 粒子和场的数据结构简单。

4. 实现高精度较容易。

5. 由于每个网格内的粒子连续存储,即小颗粒连续存储,应该更适合GPU并行。

缺点:

1. 网格生成软件要从头写,三维复杂位形情况难度可能非常大。

2. 网格系统较复杂,需要两套网格:整个区域均匀网格、不规则边界区域多边形网格。

3. 通用性差,网格或者数据很难与其他软件直接导入导出。

总结一下,均匀结构网格+Cut-Cell的有点主要有:程序编写相对简单,大部分情况计算速度快。缺点有:网格生成难,且较复杂(不是网格本身复杂,是表述网格的数据结构复杂),通用性差。

非结构网格,主要是采用有限元方法(FEM)或者有限体积方法(FVM)求解场。它的优缺点基本和上面介绍的反过来。有大量的现成软件用于生成网格,通用性好,但计算效率差。

有两个问题还需要以后详细研究对比:计算效率问题。假如模拟区域矩形,第一种方法的计算速度无疑会比第二种快。但是对于非常不规则的模拟区域,第一方法并行效率应该会下降很多,因为每个cpu核心负责计算的网格数相差较大,而第二种方法却能保证每个cpu核心计算网格数基本相等,且存在开源的网格划分软件metis。在这种情况下,第二种方法的计算速度会不会快于第一种方法,还需要进一步研究。

碰撞问题。库伦碰撞、电离碰撞、激发碰撞等过程通常采用蒙特卡洛方法处理,且一个网格内的粒子只与这个网格内的粒子碰撞,不与其他网格碰撞。不同形状的网格,对碰撞模拟的准确性影响如何,也是需要讨论的。另一种思路是,采用两套网格,粒子运动、插值、投影一套,碰撞另一套,但这又使程序更复杂。。。

没有完美。

目前我个人更倾向于第二种方法,对计算资源的提升盲目乐观。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
class PSO_VRP: def __init__(self, num_particles, num_iterations, num_customers, max_capacity, max_distance, distances, demands): self.num_particles = num_particles self.num_iterations = num_iterations self.num_customers = num_customers self.max_capacity = max_capacity self.max_distance = max_distance self.distances = distances self.demands = demands self.global_best_fitness = float('inf') self.global_best_position = [0] * num_customers self.particles = [] def initialize_particles(self): for _ in range(self.num_particles): particle = Particle(self.num_customers, self.max_capacity, self.max_distance) self.particles.append(particle) def update_particles(self): for particle in self.particles: for i in range(len(particle.position)): r1 = random.random() r2 = random.random() particle.velocity[i] = 0.5 * particle.velocity[i] + 2 * r1 * (particle.best_position[i] - particle.position[i]) + 2 * r2 * (self.global_best_position[i] - particle.position[i]) particle.velocity[i] = int(particle.velocity[i]) if particle.velocity[i] < 0: particle.velocity[i] = 0 elif particle.velocity[i] > self.num_customers - 1: particle.velocity[i] = self.num_customers - 1 particle.position = [(particle.position[i] + particle.velocity[i]) % (self.num_customers + 1) for i in range(len(particle.position))] def update_global_best(self): for particle in self.particles: if particle.best_fitness < self.global_best_fitness: self.global_best_fitness = particle.best_fitness self.global_best_position = particle.best_position.copy() def solve(self): self.initialize_particles() for _ in range(self.num_iterations): for particle in self.particles: particle.evaluate_fitness(self.distances, self.demands) self.update_global_best() self.update_particles() return self.global_best_position, self.global_best_fitness添加注释
最新发布
06-06

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值