FEMモデルを用いた数値計算結果を評価する際、ミーゼス応力が利用される。しかし、ParaViewには応力テンソルを基にミーゼス応力を計算する仕組みが用意されていない。
またParaViewでテンソルを扱う場合、3×3行列形式で入力されることが好ましい。しかし、データ形式によっては6成分形式(σxx, σyy, σzz, σxy, σyz, σzx)で入力される場合も多く、3×3行列を前提としたフィルタが適用できない場合がある。
本スクリプトを適用すると、6成分形式の応力テンソルが3×3行列形式に展開され、ミーゼス応力が計算される。
動作確認バージョン
ParaView 4.3.1
Output Data Set Type
任意
Script
import math
s6_name = 'NodalSTRESS'
tri2mat = (
(0, 3, 4),
(3, 1, 5),
(4, 5, 2),
)
pdi = self.GetInput()
pdo = self.GetOutput()
pdo.ShallowCopy(pdi)
n = pdo.GetNumberOfPoints()
s9 = vtk.vtkDoubleArray()
s9.SetNumberOfComponents(9)
s9.SetName(s6_name + '_3x3')
mises = vtk.vtkDoubleArray()
mises.SetNumberOfComponents(1)
mises.SetName('Mises')
for i in range(n):
s = (
pdo.GetPointData().GetArray(s6_name).GetValue(i * 6 + tri2mat[0][0]),
pdo.GetPointData().GetArray(s6_name).GetValue(i * 6 + tri2mat[0][1]),
pdo.GetPointData().GetArray(s6_name).GetValue(i * 6 + tri2mat[0][2]),
pdo.GetPointData().GetArray(s6_name).GetValue(i * 6 + tri2mat[1][0]),
pdo.GetPointData().GetArray(s6_name).GetValue(i * 6 + tri2mat[1][1]),
pdo.GetPointData().GetArray(s6_name).GetValue(i * 6 + tri2mat[1][2]),
pdo.GetPointData().GetArray(s6_name).GetValue(i * 6 + tri2mat[2][0]),
pdo.GetPointData().GetArray(s6_name).GetValue(i * 6 + tri2mat[2][1]),
pdo.GetPointData().GetArray(s6_name).GetValue(i * 6 + tri2mat[2][2]),
)
for j in range(9):
s9.InsertNextValue(s[j])
sm = math.sqrt(0.5 * (\
(s[0] - s[4]) ** 2 + (s[4] - s[8]) ** 2 + (s[8] - s[0]) ** 2\
+ 3.0 * (s[1] ** 2 + s[2] ** 2 + s[3] ** 2 + s[5] ** 2 + s[6] ** 2 + s[7] ** 2)\
))
mises.InsertNextValue(sm)
pdo.GetPointData().AddArray(s9)
pdo.GetPointData().AddArray(mises)
コメントを残す