2015-04-25 3 views
2

У меня есть переменная на 3D-сетке, и я пытаюсь вырезать план. Я удивляюсь, что этот вопрос не задавался раньше, это выглядит простой и простой проблемой, но я не нашел хорошего пути. Буду признателен за любые советы.Как извлечь плоскость из 3D-переменной в FiPy (3D-2D)


Давайте предположим, что у меня есть параллелепипеда 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 позволяет интерполяции с набором координат, передаваемых в через вызова метод (вызов метода осуществляется только с помощью круглых скобок, например, в вызове функции). Он возвращает набор значений для , соответствующих каждой из переданных координат. Аргумент порядка просто определяет порядок интерполяции.

Я не уверен, как это работает, но из того, что я понимаю, это должно интерполировать одну плоскость с порядком 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

Для кого-то еще интересующегося, что такое 'fipy', это выглядит так: https://github.com/usnistgov/fipy. Поскольку это, по-видимому, довольно узкий пакет, и ваш вопрос, похоже, связан с тем, как работает этот пакет, вы можете иметь больше удачи в списке рассылки: http://www.ctcms.nist.gov/fipy/documentation/MAIL.html , Вы можете включить ссылку на этот вопрос, если вы напишете список рассылки, и вы можете опубликовать решение здесь, если вы получите полезные советы в другом месте. – YXD

+0

Смешно, было уже 17 вопросов, отмеченных как FiPy на StackOverflow, но это первый, в котором кто-то добавляет ссылку на проект. Фактически (если кому-то интересно) главная страница проекта - http://www.ctcms.nist.gov/fipy/index.html со всей документацией и инструкциями по установке, тогда как на GitHub есть только исходный код , Сказал, что, вероятно, неплохо попробовать составить список рассылки, но я все еще надеюсь, что другой «случайный пользователь FiPy» может прочитать этот вопрос и дать мне объяснение этого странного поведения или хорошего обходного пути. – alfrenardi

+0

Мы отслеживаем как список рассылки, так и StackOverflow. – jeguyer

ответ

1

Клетка центры расположены при г = 0,5, 1,5, 2,5, ... так FiPy делает это лучше, чтобы найти ближайший к клеткам г = 0, 1, 2, ...

Попробуйте

var2D.setValue(var3D((x2D, y2D, 
         zcut * ones(var2D.mesh.numberOfCells) + dx/2.), order=0)) 
+0

Это работает, но не могли бы вы объяснить мне, почему в половине случаев оно использует левое значение для вычисления значения и половину времени, когда оно использует правильное значение? Расстояние между левым центром или правым центром всегда одинаково для каждой ячейки (по крайней мере, в этом простом случае). Я не мог понять причину. – alfrenardi

+0

Процедура FiPy, которая вычисляет ближайший идентификатор ячейки к точке, вид которой отображается в https://github.com/usnistgov/fipy/blob/develop/fipy/meshes/uniformGrid3D.py#L530, использует [rint()] NumPy (http://docs.scipy.org/doc/numpy/reference/generated/numpy.rint.html). Возможно, более интуитивный результат будет получен из [fix()] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.fix.html), но это просто соглашение, в любом случае. – jeguyer

+0

Спасибо за объяснение. – alfrenardi

 Смежные вопросы

  • Нет связанных вопросов^_^