IS-A-2024-010

許可なく複製する事を禁じる

インサイトの商品・サービス+AI・データサイエンス活動
2024/05/25
JSCEAM2024
Corporate Seminar @Room FInsight, Inc.
Akio Miyoshi
Copyright (C) 2024, Insight, Inc.

1

目次
1. LLMの計算力学教育への適用トライアル(7)2. 生成AI チャット経験の紹介(プログラミングや計算力学)(8)3. Github copilotチャット経験の紹介(6)4. Meshman_ParticleViewer_HPCの最新版紹介(3)5. 計算力学2級スマホアプリの更新版紹介(2)
6. Meshman_ParticlePackingとOSSのDEMア
プリ(2)7. データサイエンス勉強会の更新版紹介(2)Copyright (C) 2024, Insight, Inc.

2

1. LLMの計算力学教育への適用トライアル(1)• LLM(Large Language Model)• Chat GPTが有名だが、他にも有る。
• 弊社で試した物:• ELYZA-japanese-Llama-2-7b• Phi-3• 試した工夫• fine tuning• RAG(Retrieval Augmented Generation)• role(役割)の指定

Copyright (C) 2024, Insight, Inc.

3

1. LLMの計算力学教育への適用トライアル(2)• LLM選定のポイント• ライセンス形態• 日本語対応• サイズ

Copyright (C) 2024, Insight, Inc.

4

1. LLMの計算力学教育への適用トライアル(3)• LLM利用の切っ掛け• 計算力学資格取得支援テキストのスマホ化• 知識データベースが、ワープロからデータ処理しやすい形となった• 合格対策テキストの更なる高度化に使えないか?

Copyright (C) 2024, Insight, Inc.

5

1. LLMの計算力学教育への適用トライアル(4)プロンプト：”「ニュートン・コーツの積分法」について教えて”

Elyza + RAG

テキスト該当箇所

Phi-3 +RAG

Copyright (C) 2024, Insight, Inc.

6

1. LLMの計算力学教育への適用トライアル(5)問題作成: ChatGPT 4o
固体力学に関するテキストから抜粋した一節を、下の「テキストからの抜粋」に示します。その内容に関して、何らかの練習問題を、以下の「フォーマット」に従って作成してください。ただし、テキストの内容はマークダウン言語で書かれています。また、出力する問題の内容はマークダウン言語で作成し、レンダリングされないように文字列として出力してください。
# テキストからの抜粋## 3.4 曲げ応力
梁の曲げ応力を考える際に、一つの仮定を設ける。即ち「梁の軸線に垂直な断面(=横断面)は変形後も平面を保ちかつ軸線に垂直である」という仮定である。
----------- 途中略 ----------式(3.4-2)を式(3.4-3)に代入して整理すると、結局$¥sigma$と$M$との関係は、$$¥sigma=¥frac{M}{I_z}y ¥qquad式(3.4-4)$$
但し、$I_z=¥int_{A}{y^2¥ dA}$であり、断面二次モーメントと呼ぶ。
# 問題のフォーマット
```text### 問題:{問題の内容}### 選択肢:A. {選択肢1} <br>
B. {選択肢2} <br>
C. {選択肢3} <br>
D. {選択肢4} <br>```Copyright (C) 2024, Insight, Inc.

7

1. LLMの計算力学教育への適用トライアル(6)問題作成: Phi-3 + RAG「曲げ応力」に関して、何らかの練習問題を、以下の「フォーマット」に従って作成してください。ただし、出力する問題の内容はマークダウン言語で作成し、文字列として出力してください。
# フォーマット```text### 問題:{問題の内容}### 選択肢:A. {選択肢1} <br>
B. {選択肢2} <br>
C. {選択肢3} <br>
D. {選択肢4} <br>```Copyright (C) 2024, Insight, Inc.

8

資料請求(1)Copyright (C) 2024, Insight, Inc.

9

2. 生成AI チャット経験の紹介(プログラミングや計算力学)(1)•
質問1(Edge のBing Copilot)
ADVENTUREのmshフォーマットの有限要素四面体二次要素メッシュをVTKレガシーフォーマットに変換するpython3コードを書け•
回答1•
Pythonのmeshioライブラリを使用して、Adventure mshフォーマットの有限要素四面体二次要素メッシュをVTKレガシーフォーマットに変換することができます。以下にそのコードを示します：
import meshio# Adventure mshファイルの読み込み
mesh = meshio.read('input.msh')# VTKフォーマットに変換して保存
meshio.write('output.vtk', mesh)••••

このコードは、input.mshという名前のAdventure mshファイルを読み込み、同じメッシュデータをoutput.vtkという名前のVTKファイルに書き出します。
ただし、このコードはmeshioライブラリがインストールされていることを前提としています。もしまだインストールされていない場合は、以下のコマンドでインストールできます：
pip install meshio<後略>

Copyright (C) 2024, Insight, Inc.

10

2. 生成AI チャット経験の紹介(プログラミングや計算力学)(2)••••••••••••••••••••••

質問2 (Edge のBing Copilot)
ADVENTURE mshフォーマットを誤解されているように思います。ADVENTURE mshのフォーマットは以下の通りです。「以下に四面体メッシュデータのフォーマットを示します．
メッシュのコネクティビティについては 図 6.3-1 を参照してください．
節点番号，要素番号は 0 から始まります．
拡張子は msh です．
170776 fl 全要素数
19900 19890 22150 22160 fl 1 件目の要素を構成する節点並び～ 省略 ～
38274 38139 38266 38607 fl 170776 件目の要素を構成する節点並び
38608 fl 全節点数
-31.223900 -3.384220 -5.000000 fl 1 件目の節点の座標～ 省略 ～
31.223900 3.384220 5.000000 fl 38608 件目の節点の座標
2 fl ボリューム（領域）数2567 fl 第 1 ボリュームの要素数
0 fl 第 1 ボリュームの 1 件目の要素番号
1～ 省略 ～
2566 fl 第 1 ボリュームの 2567 件目の要素番号～ 省略 ～
注）上記は四面体一次要素の場合．二次要素の場合には要素のコネクティビティが 10 個となります．」<後略>

Copyright (C) 2024, Insight, Inc.

11

2. 生成AI チャット経験の紹介(プログラミングや計算力学)(3)
回答2 (Edge のBing Copilot)
申し訳ありません、ADVENTURE mshフォーマット•の詳細について誤解がありました。ご指摘いただき •ありがとうございます。このフォーマットについて •の新たな理解を元に、Pythonでの変換コードを改め•て提供します。
•
まず、ADVENTURE mshフォーマットのデータを読 •み込むための関数を作成します。その後、読み込ん ••だデータをVTKフォーマットに変換して出力します。
••
import numpy as np••
import vtk•••
def read_adventure_msh(filename):•with open(filename, 'r') as f:••lines = f.readlines()••# 全要素数と全節点数を取得
•
<略>
•
•
# 要素を構成する節点並びを取得•<略>•# 節点の座標を取得
•
<略>
•
•
return np.array(nodes), np.array(elements)
Copyright (C) 2024, Insight, Inc.
••def write_vtk(nodes, elements, filename):# VTKのUnstructuredGridオブジェクトを作成
grid = vtk.vtkUnstructuredGrid()# 節点の座標を設定<略># 要素を設定<略># VTKファイルに書き出し<略># ADVENTURE mshファイルを読み込み
nodes, elements =read_adventure_msh('input.msh')# VTKフォーマットに変換して保存
write_vtk(nodes, elements, 'output.vtk')
このコードは、input.mshという名前のADVENTURE mshファイルを読み込み、同じメッシュデータをoutput.vtkという名前のVTKファイルに書き出します。
<後略>

12

2. 生成AI チャット経験の紹介(プログラミングや計算力学)(4)• 質問3 (Edge のBing Copilot)
0.0 0.0 1.0 fl 4 件目の節点の座標• 四面体二次要素をADVENTURE 0.5 0.0 0.0 fl 5 件目の節点の座標
mshのフォーマットで、極単純 0.0 0.5 0.0 fl 6 件目の節点の座標なメッシュデータを作って提示 0.0 0.0 0.5 fl 7 件目の節点の座標
せよ0.5 0.5 0.0 fl 8 件目の節点の座標
0.5 0.0 0.5 fl 9 件目の節点の座標• 回答30.0 0.5 0.5 fl 10 件目の節点の座標
1 fl 全要素数
0 1 2 3 4 5 6 9 7 8 fl 1 件目の要素 1 fl ボリューム（領域）数1 fl 第 1 ボリュームの要素数を構成する節点並び
0 fl 第 1 ボリュームの 1 件目の要
10 fl 全節点数
0.0 0.0 0.0 fl 1 件目の節点の座標 素番号1.0 0.0 0.0 fl 2 件目の節点の座標
0.0 1.0 0.0 fl 3 件目の節点の座標

Copyright (C) 2024, Insight, Inc.

13

2. 生成AI チャット経験の紹介(プログラミングや計算力学)(5)••

質問4 (Edge のBing Copilot)
ミーゼスの降伏条件を、誰が発案したかは別として、主応力で表現した、単位体積当たりの弾性歪エネル
ギーの内、剪断歪エネルギーが、材料固有の一定値に達した時に降伏すると言う考え方である事を、明解に解説せよ。

••

回答4
ミーゼスの降伏条件は、材料の降伏理論の一つで、1913年にMisesが提案したものです³。この理論は、材料内の最大せん断ひずみエネルギーの値が、限界値に達すると降伏するという考え方を基にしています⁵。
具体的には、材料に働く応力が複雑で、多方向から荷重が加わるような状況でも、その応力状態を単位体積当たりの弾性歪エネルギーとして表現します²。そして、その弾性歪エネルギーのうち、剪断歪エネルギーが材料固有の一定値（降伏応力）に達した時に、材料が降伏すると考えます
この降伏条件を数式で表すと、次のようになります⁵:••

ここで、σ1 、σ2 、𝜎𝜎3 は主応力を、 𝜎𝜎Mises はミーゼス応力（あるいは相当応力）、 𝜎𝜎𝑌𝑌 は降伏応力を表します⁵。
この式は、3つの主応力による剪断歪エネルギーが降伏応力に等しくなるとき、材料が降伏することを示しています⁵。つまり、この条件が満たされると、材料は弾性変形から塑性変形へと移行すると考えられます⁵。
•以上が、ミーゼスの降伏条件についての基本的な説明です。この理論は、複雑な応力状態に対する材料の挙動を理解するための重要なツールとなっています²。ただし、実際の材料の挙動は、材料の種類や状態により異なるため、具体的な設計や解析には、適切な材料データや試験結果に基づく考慮が必要です¹。
•<後略>
Copyright (C) 2024, Insight, Inc.
••14

2. 生成AI チャット経験の紹介(プログラミングや計算力学)(6)••

質問5 (Edge のBing Copilot)
以下のコードは、粒子が床で跳ね返る事は考慮するが、球同士の衝突を考慮していない。
球同士の衝突と壁との衝突も考慮するように改造せよ。尚四方を囲む壁の位置は、明示的に与える事。粒子の初期配置は四方の壁の範囲内とする事。

self.history = []def compute_force(self, other):g = 9.8
self.force = np.array([0, 0, -self.mass * g])for o in other:
import numpy as np
if o is not self:
import matplotlib.pyplot as plt
r = np.linalg.norm(self.position o.position)from mpl_toolkits.mplot3d import Axes3D
if r < (self.diameter + o.diameter) / 2:
from matplotlib.animation import FuncAnimationk, d, f = 1.0, 0.1, 0.1
self.force += -k * (self.position class Particle:o.position) - ¥def __init__(self, mass, diameter, position,d * (self.velocity - o.velocity) - f *velocity):
self.velocity
self.mass = mass
self.diameter = diameter
self.position = np.array(position,dtype=float)
self.velocity = np.array(velocity,dtype=float)
self.force = np.zeros(3)Copyright (C) 2024, Insight, Inc.

15

2. 生成AI チャット経験の紹介(プログラミングや計算力学)(7)•質問5続き(Edge のBing Copilot)
def update(self, dt):
self.velocity += self.force / self.mass * dt
self.position += self.velocity * dt
# 床で跳ね返る
if self.position[2] < 0:
self.position[2] = 0# 反発係数を設定
restitution_coefficient = 0.8
self.velocity[2] = -restitution_coefficient *self.velocity[2]self.history.append(self.position.copy().tolist())
def simulate(particles, dt, steps):for _ in range(steps):for p in particles:
p.compute_force(particles)
for p in particles:
p.update(dt)def animate(i):ax.cla()Copyright (C) 2024, Insight, Inc.

for p in particles:
ax.scatter(*p.history[i])ax.set_xlim((-10., 10.))ax.set_ylim((-10, 10))ax.set_zlim((0, 10))ax.set_xlabel('x')
ax.set_ylabel('y')
ax.view_init(elev=10., azim=i*2)# 粒子を作成
particles = [Particle(np.random.uniform(0.5, 1.5),np.random.uniform(0.05, 0.15), np.random.uniform(-5, 5, 3), [0, 0, 0]) for i inrange(20)]# シミュレーションを実行
simulate(particles, 0.02, 1000)# 結果をプロット
fig = plt.figure()ax = fig.add_subplot(111, projection='3d')ani = FuncAnimation(fig, animate, frames=len(particles[0].history), interval=20)
plt.show()16

2. 生成AI チャット経験の紹介(プログラミングや計算力学)(8)•
回答5
def update(self, dt):
self.velocity += self.force / self.mass * dt
self.position += self.velocity * dt
# 床で跳ね返る
if self.position[2] < box[0][2]:self.position[2] = box[0][2]# 反発係数を設定
restitution_coefficient = 0.8
self.velocity[2] = -restitution_coefficient *self.velocity[2]# 壁で跳ね返る
for i in range(3):if self.position[i] < box[0][i] or self.position[i] >box[1][i]:self.velocity[i] = -restitution_coefficient *self.velocity[i]self.history.append(self.position.copy().tolist())

Copyright (C) 2024, Insight, Inc.

17

3. Github copilotチャット
経験の紹介(1)
1. コメントを文脈から自動生成して呉れる• 以下の4行が存在する。
•
y_train_pred_label = np.argmax(y_train_pred, axis=1)•
y_test_pred_label = np.argmax(y_test_pred, axis=1)•t_train_label = np.argmax(t_train, axis=1)•t_test_label = np.argmax(t_test, axis=1)• 先頭行の上に空行を作り、#oをタイプしただけで、意図を読み取り、• # one-hot表現からラベルに変換を補って呉れた。
• #だけだと、• # 予測結果をラベルに変換と補って呉れるのでTABキーで承認する。
Copyright (C) 2024, Insight, Inc.

18

3. Github copilotチャット
経験の紹介(2)2. ログプリント文を文脈から自動生成して呉れる
以下の4行が存在する。
# 訓練正答の場合の画像と予測結果を表示
if train_correct_indices:
draw_predit_and_image(train_correct_indices, y_train_pred_label, x_train, '訓練正答')
最終行の後に空行を作り、else:迄入力すると、
my_learner.logger.info('train_correct_indices is empty.')を提示して呉れる。
2行(ifブロック開始行)の行末にスペースを2個タイプすると、コメントを打ちたい意図を察知して呉れて# 空でない場合を補って呉れる。
Copyright (C) 2024, Insight, Inc.

19

3. Github copilotチャット
経験の紹介(3)
3. jsonファイルの読み込み"length": 200.0,
3.1 成功例"center_z_min": 100.0,
問1:"center_z_max": 150.0,
json ファイルの中身は以下の通りである。それを"radius": 15.0,
考慮して、全フィールドを適切な変数に代入せよ"n_parametric_cases": 1,「{"my_case_id": 101"version": "1.21",}」"distance": 4.0,
"yield_stress": 225,
3.2 回答1"tensile_strength": 265,
要望した全てのフィールドに対応する変数を作り、"poisson_ratio": 0.3,
JSONオブジェクトから代入をして呉れた。非常に"youngs_modulus": 205800,手間が省けた。
"hardening_coeff": 20580,"adv_base_dir": "C:/tools/AdvOnWin0_43b", 問2(失敗例)"out_dir_base":
data.jsonの中身を質問の中に貼り付けない時は、"../examples/beam_10x50x200_2",
data.jsonがソースファイルと同じフォルダに在っても、それを読みに行く程親切では無い。
"my_angle": 90,"initial_n_steps": 20,"gm3d_name": "beam_10x50x200_2.gm3d","thickness": 10.0,"width": 50.0,
Copyright (C) 2024, Insight, Inc.

20

3. Github copilotチャット
経験の紹介(4)4. 実行時引数のUsageの作成
4.1 問1(失敗)
argv[1]の為のUsageを作成せよ(左のチャット用ブロック)
4.2 回答1
コードに直接追記する提案をして欲しかった。

Copyright (C) 2024, Insight, Inc.

21

3. Github copilotチャット
経験の紹介(5)4. 実行時引数のUsageの作成
4.3 問2
argv[1]が無い時に、正しいUsageを表示せよ
4.3 回答2
満足。

Copyright (C) 2024, Insight, Inc.

22

3. Github copilotチャット
経験の紹介(6)4. 実行時引数のUsageの作成
4.3 問2
argv[1]が無い時に、正しいUsageを表示せよ
4.3 回答2
満足。

Copyright (C) 2024, Insight, Inc.

23

4. Meshman_ParticleViewer_HPCの最新版紹介(1)• 無限zoom• どれだけ拡大しても、手前の面でモデルが切られる事が無い。
• 又、拡大時にはマウス操作感度が調節され低くなる。

• 粒子データでも、陰影で立体的に描画する• 粒子データの表面を抽出し、描画を軽くする• 全ての粒子を表示する事も可能

Copyright (C) 2024, Insight, Inc.

24

4. Meshman_ParticleViewer_HPCの最新版紹介(2)• 無限zoom

Copyright (C) 2024, Insight, Inc.

25

4. Meshman_ParticleViewer_HPCの最新版紹介(3)• バグ修正(2024/05)• 問題点：
時系列データなどを可視化する際に、ファイルリストのダイアログを使用する。
そのダイアログ内で表示するファイルの切り替えを行うと、フォーカスがメインウィンドウに移動してしまっていた。
• 修正：
フォーカス移動の処理を修正し、表示するファイルを切り替えた際に、ファイルリストのダイアログからフォーカスが移動しないようにした。
これにより、方向キーの操作で連続的にファイルを切り替えられるようになった。

ファイル名をクリック
or↑↓キーでファイル切り替え

ファイルリストのダイアログ
Copyright (C) 2024, Insight, Inc.

26

5. 計算力学2級スマホアプリの更新版紹介(1)• Android版

Copyright (C) 2024, Insight, Inc.

27

5. 計算力学2級スマホアプリの更新版紹介(2)• iPhone版

Copyright (C) 2024, Insight, Inc.

28

6. Meshman_ParticlePackingとOSSのDEMアプリ(1)• Meshman_ParticlePackingが粒子初期位置を生成• 後工程でDEM(離散要素法)解析• OSSのYade• Python I/Fを利用してYadeを操作• 熱伝導解析に成功

Copyright (C) 2024, Insight, Inc.

29

6. Meshman_ParticlePackingとOSSのDEMアプリ(2)O.engines = [Chat-Gpt4oForceResetter(),
問:OSS のDEMアプリYADEでHooper Binから粉体を落とす解析を行いたい。
Python Interfaceで典型例を記述せよ
InsertionSortCollider([Bo1_Sphere_Aabb(), Bo1_Facet_Aabb()]),
回答:
InteractionLoop(from yade import pack, plot
[Ig2_Sphere_Sphere_ScGeom(), Ig2_Facet_Sphere_ScGeom()],# Create simulation scene[Ip2_FrictMat_FrictMat_FrictPhys()],O.bodies.append(geom.facetBox((0,0,0), (1,1,1), wallMask=31)) # Boundary[Law2_ScGeom_FrictPhys_CundallStrack()]box),# Create Hooper Bin using facets
hooperBin = [facet([(-0.5, -0.5, 0), (0.5, -0.5, 0), (0, 0, 0.5)]),facet([(0.5, -0.5, 0), (0.5, 0.5, 0), (0, 0, 0.5)]),facet([(0.5, 0.5, 0), (-0.5, 0.5, 0), (0, 0, 0.5)]),facet([(-0.5, 0.5, 0), (-0.5, -0.5, 0), (0, 0, 0.5)])]
O.bodies.append(hooperBin)]

NewtonIntegrator(gravity=(0,0,-9.81), damping=0.4),
PyRunner(command='checkUnbalanced()', realPeriod=2, label='checker')# Function to check unbalanced force
def checkUnbalanced():if O.iter < 5000: returnif utils.unbalancedForce() < 0.05:
O.pause()plot.saveDataTxt('hooperBin.dat.bz2')# Define material for particles
sphereMat = FrictMat(young=1e7, poisson=0.3, frictionAngle=radians(30), # Start simulation
density=2600)
O.dt = utils.PWaveTimeStep()O.saveTmp()# Create particles (spheres)
O.run()
sp = pack.SpherePack()# Visualization
sp.makeCloud((-0.4,-0.4,0.5), (0.4,0.4,0.9), rMean=0.05, rRelFuzz=0.3)
from yade import qt
sp.toSimulation(material=sphereMat)
qt.Controller()
qt.View()# Simulation engines

Copyright (C) 2024, Insight, Inc.

30

7. データサイエンス勉強会の更新版紹介(1)• 深層学習シリーズ• 深層学習1• 深層学習2• レベル6:学習の枠組み• レベル7:2層NNの学習の実装• CAEへの適用事例• 深層学習3
Copyright (C) 2024, Insight, Inc.

31

7. データサイエンス勉強会の更新版紹介(2)• 深層学習2• 参考実装のソースのバグフィックス• 数値微分を利用した微分• 分類が正常に行われるようになった• 計算が遅い為デバグに著しい工数が掛かっていた。
• Bing Copilotを利用してバグフィックスを行った

Copyright (C) 2024, Insight, Inc.

32

資料請求(1)Copyright (C) 2024, Insight, Inc.

33