我正在使用numba来加速包括许多for循环在内的函数。比在外面叫他们循环。
其中一个函数在循环调用时以不同的方式评估一个函数。
功能:
def collison(u, v, f, feq, omega, w, cx, cy, n, m):
for i in range(0, n):
for j in range(0, n):
t1 = u[i,j]*u[i,j] + v[i,j]*v[i,j]
for k in range(9):
t2 = u[i,j]*cx[k] + v[i,j]*cy[k]
feq[k,i,j] = rho[i,j]*w[k]*(1. + 3.*t2 + 4.5*t2**2 - 1.5*t1)
f[k,i,j] = omega*feq[k, i, j] + (1. - omega)*f[k, i, j]
return f
u
,v
- ndarray n x m
f
,feq
- ndarray 9 x n x m
我只是在声明之前添加装饰器:@nb.jit(nopython=True)
循环:
for tstep in range(mstep):
fk = collison(u, v, fw, feq, omega, w, cx, cy, n, m)
fs = stream(fk, n, m)
fw = wbrzeg(fs, n, m, u0)
rho, u, v = rhouv(fw, rho, u, v, cx, cy, n, m)
调用fw
时,collision
是否未更新?
答案 0 :(得分:3)
在Numba编译函数时,jitted函数rho
被视为常量。这与始终考虑更新的rho
。
请参阅Numba常见问题解答中的this entry。
答案 1 :(得分:0)
我并不完全确定你在这里尝试做什么,但是在tstep循环中,fw应该通过碰撞来改变,但是直到它之后它才会被实际使用过。'由wbrzeg(无论是什么)改变了。所以,在你的代码中,如果通过碰撞更新fw,它实际上并不重要......
这可能只是你的例子中的某个类型,但修复可能有助于实际了解你的问题的人(即不是我)......