Вычисление транспонирования тензора в Paraview - PullRequest
0 голосов
/ 10 апреля 2020

Мне необходимо вычислить следующее в Paraview:

enter image description here

Как рассчитать транспонирование, использованное в приведенной выше формуле? В основном я хотел бы знать, как рассчитать транспонирование матрицы в Paraview.

1 Ответ

2 голосов
/ 25 апреля 2020

Как рекомендует @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)
...