首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提高Fipy效率

如何提高Fipy效率
EN

Stack Overflow用户
提问于 2016-12-01 11:32:59
回答 1查看 157关注 0票数 0

我正在使用fipy来解决一个计算域中具有孤立区域的扩散问题。请参见示意图。下图:where there is no flux between isolated BC, and flux exists at periodic BC

fipy.FaceVariable的帮助下,在@Daniel Wheeler的帮助下,该问题在Fipy下进行了建模,并使用了fipy.FaceVariable定义的可变系数。

然而,计算速度无法满足我的命令,这比使用有限差分法的cython代码要慢得多。如果我想加速fipy计算,我该怎么做?以下是我的演示代码:

代码语言:javascript
复制
from pylab import *
from numpy import *
import fipy
from scipy.spatial import Delaunay
from fipy.variables.cellVariable import CellVariable
from fipy.terms.transientTerm import TransientTerm
from fipy.terms.diffusionTerm import DiffusionTerm
from fipy.viewers import Viewer

import time


nx, ny = 100.0, 100.0
dx, dy = 1.0, 1.0
mesh = fipy.PeriodicGrid2D(dx=dx, dy=dy, nx=nx, ny=ny)
x, y = mesh.cellCenters
D1 = 10.0
D2 = 1.0

X, Y = mesh.faceCenters 

print x
phi = CellVariable(name="Carbon", mesh=mesh, value=0.0)
coeff = fipy.FaceVariable(mesh=mesh, value=10.0)

pos1 = X == 50.0
pos2 = Y == 50.0
pos = pos1+ pos2
coeff[pos] = 0
posA1 = logical_and(x >= 20.0, x <= 30.0)
posA2 = logical_and(y >= 20.0, y <= 30.0)
posA = logical_and(posA1, posA2)
posB1 = logical_and(x >= 20.0, x <= 30.0)
posB2 = logical_and(y >= 70.0, y <= 80.0)
posB = logical_and(posB1, posB2)
posC1 = logical_and(x >= 70.0, x <= 80.0)
posC2 = logical_and(y >= 20.0, y <= 30.0)
posC = logical_and(posC1, posC2)
posD1 = logical_and(x >= 70.0, x <= 80.0)
posD2 = logical_and(y >= 70.0, y <= 80.0)
posD = logical_and(posD1, posD2)

phi[posA] = 10
phi[posB] = 20
phi[posC] = 100
phi[posD] = 30

eq = TransientTerm() == DiffusionTerm(coeff=coeff)
timeStepDuration = 10 * 0.9 * 1.0**2 / (2 * 1.0)
steps = 100

for step in range(steps):
    eq.solve(var=phi, dt=timeStepDuration)

viewer = Viewer(vars=phi)
viewer.plot()

time.sleep(60)
EN

回答 1

Stack Overflow用户

发布于 2016-12-02 23:50:04

如果Cython代码是显式的,那么它将具有时间步长限制。FiPy是隐式的,因此由于稳定性,没有时间步长限制。随着时间步长的增加,可能会出现精度问题。如果将上述问题中的时间步长增加10倍,并运行10个步骤(而不是100步),则解决方案会稍有变化,但在绘制结果时看起来类似。使用FiPy的效用和好处取决于问题的性质,以及是否需要高精度,或者仅仅是一个工程解决方案。

此外,请注意,FiPy中的第一个时间步长相当慢,因为它正在构建变量关系和缓存数据。例如,在上面的代码中,第一个时间步长需要~1s,而后续的时间步长需要~0.1s。在与FiPy进行时间比较时,这一点值得注意。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40902182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档