ミーゼス応力の計算

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)
タグ: , , ,

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*