Hertの接触応力を可視化する#

次の例は,PyVistaを使って円柱と平板のHertzの接触応力を可視化する方法を示したものである.

この例では,データセットをロードし,円筒とブロックの接触点を表す線を作成し,その線に沿って応力をサンプリングしています.最後に,データセットと応力分布をプロットしています.

背景 Hertzの接触応力とは,接触している2つの曲面の間に発生する応力を指します.1800年代後半にこの現象を初めて記述したドイツの物理学者,Heinrich Rudolf Hertzにちなんで命名されました.Hertzの接触応力は,材料科学や工学など,応力下での材料の挙動が重要視される分野で重要な概念です.

import matplotlib.pyplot as plt
import numpy as np

import pyvista as pv
from pyvista import examples

データセットを読み込む#

まず, pyvista.examples モジュールを使ってデータセットを読み込みます.このモジュールでは,応力解析に有用なFEA(有限要素解析)データセットを含む様々なデータセットにアクセスすることができます.

mesh = examples.download_fea_hertzian_contact_cylinder()
mesh
HeaderData Arrays
UnstructuredGridInformation
N Cells132258
N Points34185
X Bounds-0.000e+00, 2.000e-01
Y Bounds0.000e+00, 2.500e-02
Z Bounds0.000e+00, 3.000e-01
N Arrays16
NameFieldTypeN CompMinMax
DisplacementPointsfloat643-5.000e-042.945e-05
vonMisesPointsfloat6411.316e+021.707e+09
StressPointsfloat646-3.055e+095.274e+08
StrainPointsfloat646-1.937e-021.894e-02
PrincipalStress 1Pointsfloat641-1.787e+092.586e+08
PrincipalStress 2Pointsfloat641-2.594e+093.531e+07
PrincipalStress 3Pointsfloat641-3.078e+091.995e+06
PrincipalStrain 1Pointsfloat641-6.976e-041.448e-02
PrincipalStrain 2Pointsfloat641-1.145e-028.690e-04
PrincipalStrain 3Pointsfloat641-2.787e-02-8.375e-10
StrainEnergyDensityPointsfloat6411.172e-072.307e+07
PlasticStrainPointsfloat6460.000e+000.000e+00
EquivalentPlasticStrainPointsfloat6410.000e+000.000e+00
RankCellsfloat6410.000e+001.500e+01
MaterialCellsfloat6410.000e+001.000e+00
PartIDCellsint3211.000e+002.000e+00


データセットのプロット#

データセットを部分IDごとにプロットする.

mesh.plot(scalars='PartID', cmap=['green', 'blue'], show_scalar_bar=False)
fea hertzian contact pressure

接触点を表す線を作る#

円柱とプレートの接触点を表す線を作ります.

ypos = 0.024
a = [0.1, ypos, 0.2 - 1e-4]
b = [0.095, ypos, 0.2 - 1e-4]
line = pv.Line(a, b, resolution=100)
line.clear_data()
line
PolyDataInformation
N Cells1
N Points101
N Strips0
X Bounds9.500e-02, 1.000e-01
Y Bounds2.400e-02, 2.400e-02
Z Bounds1.999e-01, 1.999e-01
N Arrays0


線に沿った応力のサンプリング#

接触端に沿ったZ成分の応力をサンプリングし,予想される圧力と比較することができます.

期待値の配列はHertzの接触圧であり,非粘着性接触問題の解析的解である.これらの値の計算は読者に任された練習です(円柱の半径は0.05です). Contact Mechanics を参照してください.

# Sample the stress
sampled = line.sample(mesh, tolerance=1e-3)
x_coord = 0.1 - sampled.points[:, 0]
samp_z_stress = -sampled['Stress'][:, 2]

# Expected Hertzian contact pressure
h_pressure = np.array(
    [
        [0.0000, 1718094092],
        [0.0002, 1715185734],
        [0.0004, 1703502649],
        [0.0006, 1683850714],
        [0.0008, 1655946243],
        [0.001, 1619362676],
        [0.0012, 1573494764],
        [0.0014, 1517500856],
        [0.0016, 1450208504],
        [0.0018, 1369953775],
        [0.002, 1274289906],
        [0.0022, 1159408887],
        [0.0024, 1018830677],
        [0.0026, 839747409.8],
        [0.0028, 587969605.2],
        [0.003, 0],
        [0.005, 0],
    ]
)

plt.plot(x_coord, samp_z_stress, '.', label='Z Component Stress')
plt.plot(h_pressure[:, 0], h_pressure[:, 1], label='Hertzian contact pressure')
plt.legend()
plt.show()
fea hertzian contact pressure

Z応力分布の可視化#

これで,Z応力分布を可視化することができます. pyvista.Plotter を使用してプロットウィンドウを作成し,データセットをそこに追加します.

pl = pv.Plotter()
z_stress = np.abs(mesh['Stress'][:, 2])
pl.add_mesh(
    mesh,
    scalars=z_stress,
    clim=[0, 1.2e9],
    cmap='gouldian',
    scalar_bar_args={'title': 'Z Component Stress (Pa)', 'color': 'w'},
    lighting=True,
    show_edges=False,
    ambient=0.2,
)
pl.camera_position = 'xz'
pl.set_focus(a)
pl.camera.zoom(2.5)
pl.show()
fea hertzian contact pressure

Total running time of the script: (0 minutes 3.248 seconds)

Sphinx-Galleryによるギャラリー