如何从FiPy中的3D变量中提取平面(3D到2D)

时间:2015-04-25 10:24:05

标签: python numpy scipy fipy

我在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

中描述的方式
  

a的调用方法   CellVariable可以插入传入的一组坐标   通过调用方法(只需使用调用方法)   像函数调用中的括号)。它返回一组值   对应于传入的每个坐标   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.]

我认为某处肯定会有一个愚蠢的错误,但我不知道。有什么想法吗?

0 个答案:

没有答案