我在 3D 网格上有一个变量,我正在尝试制定一个计划。我很惊讶这个问题以前没有被问过,它看起来是一个简单而常见的问题,但我还没有找到任何好的方法。我会很感激任何建议。
假设我有一个平行六面体 3x3x5,并且我正在尝试提取 z 平面。
from fipy import *
from numpy import *
#Describes a 3x3x5 mesh
nx = 3
ny = 3
nz = 5
dx = 1
dy = 1
dz = 1
#Creates a 3D mesh and a 2D mesh to store the plane
mesh3D = Grid3D(dx, dy, dz, nx, ny, nz)
mesh2D = Grid2D(dx, dy, nx, ny)
#Defines the same variable, in 3D and in 2D
var2D = CellVariable(mesh = mesh2D)
var3D = CellVariable(mesh = mesh3D)
#Fills the 3D matrix
for i in xrange(nx*ny*nz*dx*dy*dz):
var3D[i] = i
print var3D
输出:
[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.]
3D 变量看起来正确填充。
首先,我尝试使用此链接http://permalink.gmane.org/gmane.comp.python.fipy/1576中描述的方式
CellVariable的call方法可以对通过call方法传入的一组坐标进行插值(调用方法只需使用括号访问,就像在函数调用中一样)。它返回一组与传入的每个坐标相对应的值。 order 参数仅确定插值的顺序。
我不确定这实际是如何工作的,但据我了解,这应该插入一个具有 0 阶的平面,因此它应该提取特定平面上的确切值。如果我错了,请纠正我。
x3D, y3D, z3D = mesh3D.getCellCenters()
x2D, y2D = mesh2D.getCellCenters()
for zcut in xrange(nz*dz):
var2D.setValue(var3D((x2D, y2D, zcut * ones(var2D.getMesh().getNumberOfCells())), order=0))
print "z-plane = %d" % zcut
print var2D
raw_input("Press any key to close")
奇怪的是它不起作用。偶数索引没问题,但奇数索引是连续平面的副本。
z-plane = 0
[ 0. 1. 2. 3. 4. 5. 6. 7. 8.]
z-plane = 1
[ 0. 1. 2. 3. 4. 5. 6. 7. 8.]
z-plane = 2
[ 18. 19. 20. 21. 22. 23. 24. 25. 26.]
z-plane = 3
[ 18. 19. 20. 21. 22. 23. 24. 25. 26.]
z-plane = 4
[ 36. 37. 38. 39. 40. 41. 42. 43. 44.]
我认为某处一定有一个愚蠢的错误,但我不知道。任何想法?