Как рекомендует @Nico Vuaille, вы должны использовать поддержку Numpy в ParaView. Просто примените программируемый фильтр к интересующему набору данных и предоставьте сценарий, сравнимый со следующим:
import numpy as np
u = inputs[0].PointData['Velocity']
# Calculate gradient here, say uGrad
output.PointData.append(uGrad, 'Gradient')
РЕДАКТИРОВАТЬ : Я на самом деле пытался сгенерировать ваши расчеты с одним из моих наборов данных и понял, что мой ответ и комментарии не очень полезны. Поэтому, это то, что я хотел бы предложить сейчас, и это должно работать:
- Загрузить ваш набор данных в ParaView
- Применить фильтр «Градиент / Градиент неструктурированного набора данных» к вашему набору данных и выбрать скорость поле в качестве поля ввода (я использовал Градиент неструктурированного набора данных , из которого у вас есть возможность также напрямую обрабатывать поля дивергенции и завихренности).
- Примените фильтр программируемого фильтра к результирующий набор данных, полученный вами на предыдущем шаге, и приведенный ниже код.
Script
import numpy as np
grad = inputs[0].PointData['Gradients']
omega = (grad - np.transpose(grad, axes=(0, 2, 1))) / 2
output.PointData.append(omega, 'Omega')
В конечном итоге в конвейере ParaView должен появиться еще один элемент, содержащий только ожидаемую Omega .
РЕДАКТИРОВАТЬ 2 : Входной файл использует формат XMDF. При загрузке в ParaView он интерпретируется как мультиблочный набор данных блоков. В результате фрагмент кода, предоставленный аргументу Script программируемого фильтра, должен быть обновлен до:
import paraview.vtk.numpy_interface.dataset_adapter as dsa
for i in range(inputs[0].GetNumberOfBlocks()):
data = dsa.WrapDataObject(inputs[0].GetBlock(i))
grad = data.PointData['Gradients']
omega = (grad - np.transpose(grad, axes=(0, 2, 1))) / 2
data.PointData.append(omega, 'Omega')
output.SetBlock(i, data.VTKObject)