将值设置为 CellVariable
Setting values into a CellVariable
我有以下功能:
def setupSinkGrid_(self, sinkCoords,mesh,x,y,z,patchSize=1) :
sinkGrid = CellVariable(name="source", mesh=mesh, value=0)
sinkGrid.setValue(0.)
for pos,v in sinkCoords.iteritems():
sinkGrid.setValue(v, where=(z > pos[0]-patchSize) & (z < pos[0]+patchSize) & (y > pos[1]-patchSize) & (y < pos[1]+patchSize) & (x > pos[2]-patchSize) & (x < pos[2]+patchSize))
return sinkGrid
其中 mesh、x、y 和 z 先前定义为:
mesh=Grid3D(dx=dx,dy=dy,nx=nx,ny=ny, dz=dz, nz=nz)
phi=CellVariable(name="solutionvariable",mesh=mesh,value=0.)
x, y, z = mesh.cellCenters
sinkCoords 是坐标到值的字典。例如:{(1,2,3) => 4}
表示 1,2,3 处的值为 4。
想法是将每个这样的坐标映射到 sinkGrid 上。
问题是在我调试时,我发现每个接收器值映射到多个位置 "close to" 实际目标。在循环的第一次迭代(pos = <type 'tuple'>: (16, 16, 2)
)之后,我得到:
[np.unravel_index(i,(20,20,20)) for i,x in enumerate(list(sinkGrid)) if x > 0]
其中 returns 值 25 设置为 8 个不同的索引。
0 = {tuple} <type 'tuple'>: (15, 15, 1)
1 = {tuple} <type 'tuple'>: (15, 15, 2)
2 = {tuple} <type 'tuple'>: (15, 16, 1)
3 = {tuple} <type 'tuple'>: (15, 16, 2)
4 = {tuple} <type 'tuple'>: (16, 15, 1)
5 = {tuple} <type 'tuple'>: (16, 15, 2)
6 = {tuple} <type 'tuple'>: (16, 16, 1)
7 = {tuple} <type 'tuple'>: (16, 16, 2)
我的观察是这些总是 "lower" 坐标但是:
1) 为什么只针对某些邻居?为什么我得不到完整的摩尔邻域?
2) 为什么只在至少一维较低的邻居上?
3) 这是什么原因造成的?这只是一些路由错误吗?如果是这样,我应该使用 patchSize-k
或类似的东西吗?
问题是x
、y
和z
是单元格中心的坐标,它们位于((0.5, 0.5, 0.5), (1.5, 0.5, 0.5), ...).
(16, 16, 2) +/- 1
将包含位于:
的单元格
(15.5, 15.5, 1.5)
(15.5, 15.5, 2.5)
(15.5, 16.5, 1.5)
(15.5, 16.5, 2.5)
(16.5, 15.5, 1.5)
(16.5, 15.5, 2.5)
(16.5, 16.5, 1.5)
(16.5, 16.5, 2.5)
您有两个选择:
- 供应
sinkCoords
对应于细胞中心,例如 (15.5, 15.5, 1.5
- 将
patchSize
限制为单元格尺寸的一半
无论如何,第 2 项可能是个好主意。
您需要确保您计算的是整个范围,例如 (z > pos[0]-patchSize) & (z <= pos[0]+patchSize)
,否则您很可能找不到任何单元格。
我有以下功能:
def setupSinkGrid_(self, sinkCoords,mesh,x,y,z,patchSize=1) :
sinkGrid = CellVariable(name="source", mesh=mesh, value=0)
sinkGrid.setValue(0.)
for pos,v in sinkCoords.iteritems():
sinkGrid.setValue(v, where=(z > pos[0]-patchSize) & (z < pos[0]+patchSize) & (y > pos[1]-patchSize) & (y < pos[1]+patchSize) & (x > pos[2]-patchSize) & (x < pos[2]+patchSize))
return sinkGrid
其中 mesh、x、y 和 z 先前定义为:
mesh=Grid3D(dx=dx,dy=dy,nx=nx,ny=ny, dz=dz, nz=nz)
phi=CellVariable(name="solutionvariable",mesh=mesh,value=0.)
x, y, z = mesh.cellCenters
sinkCoords 是坐标到值的字典。例如:{(1,2,3) => 4}
表示 1,2,3 处的值为 4。
想法是将每个这样的坐标映射到 sinkGrid 上。
问题是在我调试时,我发现每个接收器值映射到多个位置 "close to" 实际目标。在循环的第一次迭代(pos = <type 'tuple'>: (16, 16, 2)
)之后,我得到:
[np.unravel_index(i,(20,20,20)) for i,x in enumerate(list(sinkGrid)) if x > 0]
其中 returns 值 25 设置为 8 个不同的索引。
0 = {tuple} <type 'tuple'>: (15, 15, 1)
1 = {tuple} <type 'tuple'>: (15, 15, 2)
2 = {tuple} <type 'tuple'>: (15, 16, 1)
3 = {tuple} <type 'tuple'>: (15, 16, 2)
4 = {tuple} <type 'tuple'>: (16, 15, 1)
5 = {tuple} <type 'tuple'>: (16, 15, 2)
6 = {tuple} <type 'tuple'>: (16, 16, 1)
7 = {tuple} <type 'tuple'>: (16, 16, 2)
我的观察是这些总是 "lower" 坐标但是:
1) 为什么只针对某些邻居?为什么我得不到完整的摩尔邻域?
2) 为什么只在至少一维较低的邻居上?
3) 这是什么原因造成的?这只是一些路由错误吗?如果是这样,我应该使用 patchSize-k
或类似的东西吗?
问题是x
、y
和z
是单元格中心的坐标,它们位于((0.5, 0.5, 0.5), (1.5, 0.5, 0.5), ...).
(16, 16, 2) +/- 1
将包含位于:
(15.5, 15.5, 1.5)
(15.5, 15.5, 2.5)
(15.5, 16.5, 1.5)
(15.5, 16.5, 2.5)
(16.5, 15.5, 1.5)
(16.5, 15.5, 2.5)
(16.5, 16.5, 1.5)
(16.5, 16.5, 2.5)
您有两个选择:
- 供应
sinkCoords
对应于细胞中心,例如(15.5, 15.5, 1.5
- 将
patchSize
限制为单元格尺寸的一半
无论如何,第 2 项可能是个好主意。
您需要确保您计算的是整个范围,例如 (z > pos[0]-patchSize) & (z <= pos[0]+patchSize)
,否则您很可能找不到任何单元格。