У меня есть следующая функция:
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.
Проблема заключается в том, что при отладке яЯ нахожу каждое значение приемника, сопоставленное с несколькими позициями, «близко» к фактической цели.После первой итерации (pos = <type 'tuple'>: (16, 16, 2)
) цикла я получаю:
[np.unravel_index(i,(20,20,20)) for i,x in enumerate(list(sinkGrid)) if x > 0]
, который возвращает значение 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)
Мое наблюдение заключается в следующемвсегда "более низкие" координаты, но:
1) Почему только на некоторых соседях?Почему бы тогда мне не получить полную окрестность Мура?
2) Почему только на соседях, которые находятся ниже по крайней мере в одном измерении?
3) Что вызывает это?Это просто какая-то грубая ошибка.Если это так, я должен использовать patchSize-k
или что-то подобное?