Установка значений в CellVariable - PullRequest
1 голос
/ 09 марта 2019

У меня есть следующая функция:

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 или что-то подобное?

1 Ответ

1 голос
/ 12 марта 2019

Проблема в том, что 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)

У вас есть два варианта:

  1. Поставка sinkCoords, которая соответствует клеточным центрам, например, (15.5, 15.5, 1.5
  2. Предел patchSize до половины размера ячейки

Пункт 2, вероятно, хорошая идея, несмотря ни на что.

Вам необходимо убедиться, что вы ведете учет или весь диапазон, например, (z > pos[0]-patchSize) & (z <= pos[0]+patchSize), в противном случае у вас есть хороший шанс не найти никаких ячеек.

...