ラベル Pythonその他 の投稿を表示しています。 すべての投稿を表示
ラベル Pythonその他 の投稿を表示しています。 すべての投稿を表示

2021/06/20

Rhino+GrasshopperでのCPythonの実行環境(GH_CPython)

RhinocerosにおけるビジュアルコーディングツールであるGrasshopperには、python言語でのコーディングが可能なGh pythonがあらかじめ付属しています。しかし、このGh pythonは通常のPython(CPython)環境ではなく、Rhinocerosが動いているNET Framework上で動作するironPythonであるため、Rhinoceros上での描画アドインは動かせるものの、一般的にPython言語で用いられている多くの拡張モジュールをGh python上で通常実行することができません。Python環境において複雑な数値計算や最適化、応力解析などを実行できる無数の拡張モジュール(Numpy、Deep、Openseespyなど)が、一般的には利用できないのです。

一方、こうした数値計算は建築設計や構造解析において多く活用されており、これらをRhino+Grasshopperのプログラム上でもなんとか利用できる環境が構築できると便利です。

上記を可能とするために、Grasshopper上で一般的なpython言語であるCPythonを実行できるライブラリGH_CPythonの活用が考えられます。本ページではそのインストール方法を紹介してみます。なお、GH_CPythonを用いたRhino+Grasshopper上でのCPythonの実行においては、あらかじめPythonライブラリのインストールが必要となります。

なお、Pythonのインストールについては、本ブログの別ページ Kの勉強部屋: OpenSeesPyの導入① (kozoarcheng.blogspot.com) をご覧ください。


<GH_CPythonの実行環境の構築>

1.Githubまたはfood4Rhinoにて、GH_CPythonをダウンロード

GH_CPython | Food4Rhino

2.ダウンロードしたファイルのうち、GH_CPython.gha と FastColoredTextBox.dllを自身のRhino+Grasshopperインストールファイル中のLibrariesフォルダ(もしくはComponentsフォルダ)に移動。(ダウンロードファイルはプロパティにてセキュリティを解除する。)

3.Rhinocerosを管理者アカウントで実行

4.GH_CPythonをGrasshopper上で開き、「Python」→「Choose Interpreter」をクリックし、以下のように自身のPCにインストール済みのpython.exeのディレクトリを指定



基本的には、上記の操作でGrasshopper上にて、CPythonの環境構築ができると思います。

CPythonにおいては、本サイトで使用法を紹介している応力解析アドインOpenseespyなども実行できることから、上記の環境構築により、Rhino+Grasshopperで構築したプログラムフローにおける3Dcadやビジュアルコーディングと構造物の応力解析、時刻歴応答解析などの数値解析を連動させた処理が可能となり、使い方によっては解析上非常に有用なツールとなりえるかと思います。

上記で説明した内容については、作者(MahmoudAbdelRahman氏)のGithubである下記にも記載がありますので、適宜ご参照頂ければと思います。

Home · MahmoudAbdelRahman/GH_CPython Wiki · GitHub

2020/05/24

クラウドベースの3次元構造解析ツール SkyCiv

Openseesの学習が少し停滞しておりますので、更新滞っております。

Openseesとはあまり関係ありませんが、使えそうなクラウドベースの構造解析ツールをたまたま見つけたので紹介します。その名も、「Sky Civ」です。以下、ページにて詳細を確認できます。(私は、本ソフトの製作者の回し者ではありませんので、悪しからず。。)

https://skyciv.com/

通常構造解析ツールは自分のパソコンにインストールしてそのパソコンでライセンスを取得してしようする形式が基本ですが、これですと、基本的に解析結果を確認できるのでは会社のパソコンのみとなります。
一方、設計者が外出先でちょっと条件を変えた解析結果をすぐ見たいといったニーズはあるかと思います。今回紹介するSky Civはクラウドベースの3次元構造解析ツールで、いつでも、どこでも、ただパソコンさえあれば、構造解析を行うことが可能です。構造設計者にとっては、いつでも仕事に打ち込める環境が整ってしまうということで、ますますワーカホリックが加速されるツールといえます。
本ツールは線形解析、非線形解析、固有値解析に対応しています。
クラウドベースのツールということで、professionalバージョンで109ドル(現在)のサブスクリプションモデルを採用しています。なかなかいいお値段しますが、通常の汎用構造解析ツールと比べると安いのか。。今回は、Freeversion(3次元応力解析の場合、解析モデルのノード10節点以下の制約あり)を少し触ってみました。



解析モデルはウェブブラウザ上で動作するクラウドツールの操作画面にて、節点をクラウド上の表シートにコピペで入力し、表示された節点同士をマウスでつなぐことで簡単に作成できます。その操作性は直感的でかなり良好です。



部材断面も様々なタイプの形状が既に組み込まれており、変更したい寸法部分をクリックして、寸法を入力することで直感的に入力できます。サクサク動きます。



応力解析結果も簡単に確認できました。
計算書も簡易なものですが、ボタン一つでpdfのファイルとして自動出力されます。


また、解析ファイルはクラウド上に保存されますので、どんなPC環境でも常に呼び出すことが可能です。リモートワークにも最適です。今回対象としたモデルはシンプルなフレームモデルだったからか、一般的な構造解析ツールと比較しても、全体的に動きが軽快で操作が快適な印象を受けました。

ソフトウェアを自分のパソコンにインストールしなくてもクラウド上でどこでも解析が行え、結果をどこでも自由に確認できることから、チームで設計を行う上でのコミュニケーションツールとして役立ちそうです。MicrosoftTeamsとの解析結果の連携し、解析結果やコメントを設計チームでスムーズに共有することも可能となっているようです。また、Pythonなどの自作プログラムと組み合わせた高度な活用を想定し、JSON形式によるAPIも装備しています。

さらに、比較的解析時間の大きい複雑なモデルを想定した場合、こうしたクラウド上のツールがスパコン等と連携することで手早く解析できるなどの可能性が考えられ、こうしたクラウドベースのツールの今後の進化にも注視する必要がありそうです。

2020/05/05

Grasshopperによる3次元ジオメトリのOpenseesによる応力解析

今回は、Openseesにより構成した3次元の応力解析プログラムの実務的な利用について考えてみます。特に複雑な形状モデルを対象とする場合、3次元の形状データから、目視や手入力による作業で応力解析プログラムのインプットを作成することを考えると、膨大で複雑な数値データの入力が必要となることから、大変面倒な作業が必要となってしまいます。そこで、近年建築分野で普及が進んでいる3DcadであるRhinoceros+Grasshopperにより作成した形状データをもとにプログラムによるOpenseesの解析入力ファイルの作成にトライしてみます。また、Rhinoceros+Grasshopperによる入力データの作成および解析結果のKaramba3Dによる解析結果の簡単な検証を試みます。

・Rhinoceros+Grasshopperとは
RhinocerosはRobert McNeel & Associates社が開発した3次元CADであり、NURBS局面などの複雑なジオメトリを柔軟に扱えることから、近年、建築分野でも多く活用されています。またGrasshopperはRhinocerosをスクリプトベースで自由に操ることができるツールで、視覚的なアイコンをつなぐことで容易にプログラムが構成できるため、コンピュテーショナルデザインなどに活用されています。さらに近年は世界中のエンジニア・プログラマーにより開発された最適化や応力解析などの多くの外部モデュールが公開されており、その多くがフリーで利用可能となっています。そうしたツールは以下のサイトfood4Rhinoで利用可能となっています。

https://www.food4rhino.com/

・Karamba3Dとは
Grasshopperには、多くの外部機能がPythonのモジュールのように提供されており、Karamba3DはRhinoceros上のジオメトリを用いた応力解析を容易におこなうことができる応力解析モジュールです。近年は有料化されていますが、(unlimitedlicenceで1150ユーロ)多くの構造エンジニアにも使用され始めています。また、最適化ツールなどの機能拡張が日々行われています。

https://www.karamba3d.com/

まず、応力解析の対象とするトラス屋根モデルを以下のように懸垂円筒状のトラスモデルとして作成してみました。作成に当たってはトラス要素のジオメトリを簡便に作成できる外部モデュール(Lunchbox)を使用しています。Lunchboxについても先述したfood4Rhinoにてフリーで弾雨ロードすることが可能です。


Grasshopper上では、上記のようなアイコンをつなげるだけの簡単なコーディングで以下のような複雑なトラスの構造モデルが作成できます。立体的な幾何学を扱うにはとっても便利なツールです。



このような複雑な形状の構造解析モデルの座標や要素の情報を一つ一つinputファイルに記述するのは例えExcelファイルによる記述であってもとても大変です。

しかし、幸いなことに、Grasshopper上ではPythonで書いたプログラムをコンポーネントとして扱うことができるため、作成したジオメトリデータ(line、座標データなど)とPythonを連携させて使用することできます。そこで、Grasshopper上で作成したジオメトリデータをOpenseesの構造解析用のインプットデータとしての節点、要素の数値データに置換するプログラムをPythonで作成し、そのプログラムをつかってOpenseesによる3次元解析プログラムのインプットデータを作成しました。プログラムといっても、Rhinoceros上のジオメトリの節点座標と、各梁要素の材端座標を拾って、input用のデータ書式に再構成するだけのシンプルなものとなります。

例題として、作成した解析モデルの頂部の中心節点に鉛直荷重が加わった場合の応力解析をOpenseesにより行います。
前回可視化に利用したPlotlyにより、Openseesによる応力解析結果を視覚化するとこんな感じになります。


軸力図

軸力図については圧縮材が赤色、引張材が青色となるように設定しました。


最大曲げモーメントの分布図


そして変位図


Karambaによる変位図

上記のOpenseesによる解析結果とKarambaによる解析結果とを比較すると、変形性状は概ね対応していることがわかります。上記では、Grasshopper→Openseesによる応力解析により複雑な形状の構造物の応力解析ができました。Pythonによるコーディングにおいて幾何学形状を扱うことは労力がかかります。そうしたことから、このように幾何学の扱いに長けており、デザイナーによるコーディングも可能なRhinoceros+Grasshopperをデザインなどで使用し、それらの分析にOpenseesを活用するといったスキームは、その間をつなぐ環境がしっかりと構築されれば、建築設計実務でも十分活用できるのではと考えます。

2020/04/29

Plotlyによる応力解析結果の出力

前回まではmatplotlibを用いた2次元画像による応力解析結果の可視化を試してみました。
しかし、3次元の構造解析モデルの応力解析結果を確認する場合、汎用解析ツールのUIのように
同じく3次元空間でグリグリとオブジェクトを回しながら結果確認ができると実務的に便利です。
そこで今回は、Pythonにも対応しているインタラクティブなデータ可視化ライブラリPlotlyを用いてOpenseesPyによる3次元トラスの応力解析結果の出力を行います。

Plotlyはオープンソースのデータ可視化ライブラリです。
Pythonだけでなく、JAVAscriptやMATLAB等にも対応しています。
同じデータ可視化ライブラリであるmatplotlibは主にグラフデータの画像出力に対応していましたが、
Plotlyでは出力したグラフデータをブラウザ上でマウスなどを動かしながらインタラクティブな状態で確認できます。
Pythonでの使用にはOpenseesPyの場合と同じく、ライブラリのインストールおよびプログラムへのインポートが必要となります。
インストール法や使用方法の詳細につきましては、以下サイトをご覧ください。

https://plotly.com/python/

今回もこれまでに構築した3次元トラス解析プログラムをベースに検討を進めます。
Plotlyを使ってデータをグラフ化するプロセスを以下に簡単に示します。

・ライブラリのインポート

import plotly.offline as po
import plotly.graph_objs as go
上記によりPlotlyをプログラムにインポートします。

・初期化

po.init_notebook_mode()
上記によりPlotlyを初期化します。

・グラフの定義

graph=go.Scatter3d(x=node_x, y=node_y, z=node_z, name='beam%s'%(int(ele_no[i])), mode='lines+text', line=dict(width=int(area[i]),color=color_tag),
hovertext='AxialForce %s'%(round(temp[0],2)), showlegend=True)
上記スクリプトの形式で描画するグラフを定義します。
なお、上記スクリプトはモデル図兼応力図を描くためのスクリプトになります。

モデルの各梁要素を線グラフとして描画します。線の太さは梁要素の断面積のデータから、線の色は応力解析により得られた梁要素の軸力から決定するように定義しています。なお、軸力についてはグラフ上でカーソルを合わせると確認できる「hovertext」として定義しています。

・レイアウトの定義とグラフの描画

data.append(graph)
layout = go.Layout(xaxis=dict(showgrid=False))
fig2 = dict(data = data, layout=layout)
po.plot(fig2, filename="model")
定義したグラフデータを保存したdataリストとグラフのレイアウト等を定義したlayoutリストをfig2に呼び出して、po.plotにて描画しています。


上記のPlotlyによるデータ図化機能を応用して、結果としてグリグリ動かせるモデル軸力図・変形図が出力できました。
ブラウザ上の画面で動かせる形式になっており、
マウスを梁上に移動させると軸力も表示させることができます。


変位図を出力したり、画面上で選択することで、モデル図応力図と変位図の2つのグラフを同時に出現させたりすることもできます。
マウスで図を回転させたり、拡大したりすることが非常に直感的に行えます。



以上、汎用の構造解析ツールのような操作感覚で、解析結果を確認することができました。
今後さらに複雑な立体トラスモデルの応力解析結果を確認する場合には、非常に役立ちそうなツールだと思います。
最後に今回使用したソースコードを以下に示します。
#plotlyによる描画
po.init_notebook_mode()
trace1 = go.Scatter3d(x=cor_x, y=cor_y, z=cor_z, mode='markers+text', marker_color='blue', marker_size=2, name="Node", text=no, showlegend=True)
data = [trace1]

#モデル図・軸力図の描画
for i in range(len(ele_no)):
    temp2=[]
    temp3=[]
    node_x=[]
    node_y=[]
    node_z=[]
    temp2=nodeCoord(int(n1[i]))
    temp3=nodeCoord(int(n2[i]))
    node_x.append(temp2[0])
    node_x.append(temp3[0])
    node_y.append(temp2[1])
    node_y.append(temp3[1])
    node_z.append(temp2[2])
    node_z.append(temp3[2])
    
    temp=basicForce(int(ele_no[i]))#各部材の応力値をRGB値に変換
    if temp[0] >=0:
        if max_tens == 0:
            color_tag='rgb(0,0,'+str(255*temp[0])+')'
        else:
            color_tag='rgb(0,0,'+str(255*temp[0]/max_tens)+')'     
    else:
        if max_comp == 0:
            color_tag='rgb('+str(-255*temp[0])+',0,0)'
        else:  
            color_tag='rgb('+str(-255*temp[0]/max_comp)+',0,0)'
            
    graph=go.Scatter3d(x=node_x, y=node_y, z=node_z, 
                               name='beam%s'%(int(ele_no[i])), mode='lines+text', line=dict(width=int(area[i]),color=color_tag),
                               hovertext='AxialForce %s'%(round(temp[0],2)), showlegend=True)

    data.append(graph)

#変位図の描画
node_x=[]
node_y=[]
node_z=[]
temp2=[]
temp3=[]
for i in range(len(ele_no)):
    temp2=[x + y * mag_factor for (x, y) in zip(nodeCoord(int(n1[i])),nodeDisp(int(n1[i])))]
    temp3=[x + y * mag_factor for (x, y) in zip(nodeCoord(int(n2[i])),nodeDisp(int(n2[i])))]
    node_x.append(temp2[0])
    node_x.append(temp3[0])
    node_y.append(temp2[1])
    node_y.append(temp3[1])
    node_z.append(temp2[2])
    node_z.append(temp3[2])
graph=go.Scatter3d(x=node_x, y=node_y, z=node_z, 
                               name="Disp", mode='lines', line_color='blue',line=dict(width=2, dash='dot'),
                               showlegend=True)
data.append(graph)

layout = go.Layout(xaxis=dict(showgrid=False))
fig2 = dict(data = data, layout=layout)
po.plot(fig2, filename="model")

2020/04/12

Matplotlibによる応力・変形図の図化出力(3D対応)

前回紹介したMatplotlibによる図化出力ですが、以下の手順で3次元トラスの応力解析結果の図化出力にも拡張できました。蛇足ですが説明します。

図化出力のプログラムの頭に以下のコードを記載します。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

また、グラフのスクリプトを記述する際には、以下を記載します。
ax1 = fig.add_subplot(2,1,1, projection='3d')

以上を考慮するとMatplotlibによるグラフにおいてz軸の概念が導入され、2次元のグラフ描画と同様のルールでグラフの表示カスタマイズ(軸最大値の設定、表示する角度の設定など)も可能となります。Matplotlibによる3次元グラフ描画の詳細については以下のサイトに記載があります。


上記を踏まえて組んだプログラムにより、以下のように3次元のグラフが描画できました。意外といろいろなことができるんですね。Matplotlib。


参考として、今回の図化出力に用いた3次元トラスの応力解析結果の描画部分のソースコードを以下に示します。

#変位図、応力図を描く    
fig = plt.figure(figsize=(6, 9))
max_x=5
max_y=5#グラフの表示範囲を設定
max_z=5

ax1 = fig.add_subplot(2,1,1, projection='3d')
ax2 = fig.add_subplot(2,1,2, projection='3d')
for e in getEleTags():
    color_tag=0
    nodes = eleNodes(e)
    Nnodes = len(nodes)

    xyz = np.zeros((Nnodes,3), dtype=np.double)
    uu   = np.zeros((Nnodes,3), dtype=np.double)
    for i in range(Nnodes):
        xyz[i,:] = nodeCoord(nodes[i])#return coordinate
        uu[i,:] = nodeDisp(nodes[i])#return current displacement

    x = np.zeros(12,dtype=np.double)
    y = np.zeros(12,dtype=np.double)
    z = np.zeros(12,dtype=np.double)    
    u = np.zeros(12,dtype=np.double)
    v = np.zeros(12,dtype=np.double)
    t = np.zeros(12,dtype=np.double) 

    conec = [0, 1]

    x = xyz[conec,0]
    y = xyz[conec,1]
    z = xyz[conec,2]
    x[2::3] = np.nan
    y[2::3] = np.nan
    z[2::3] = np.nan

    mag_factor = 20.#変形図の拡大率
    u = xyz[conec,0] + mag_factor*uu[conec,0]
    v = xyz[conec,1] + mag_factor*uu[conec,1]
    t = xyz[conec,2] + mag_factor*uu[conec,2]
    u[2::3] = np.nan
    v[2::3] = np.nan
    t[2::3] = np.nan
    
    temp=basicForce(e)#各部材の応力をプロット
    if temp[0] >=0:
        if max_tens == 0:
            color_tag=temp[0]
        else:
            color_tag=temp[0]/max_tens*1       
        ax1.text(np.mean(x),np.mean(y),np.mean(z),round(temp[0],2))
        ax1.plot(x,y,z,color=[0,float(1-color_tag),1],lw=area[e-1])
    else:
        if max_comp == 0:
            color_tag=temp[0]
        else:        
            color_tag=-temp[0]/max_comp*1
        ax1.text(np.mean(x),np.mean(y),np.mean(z),round(temp[0],2))
        ax1.plot(x,y,z,color=[1,0,float(1-color_tag)],lw=area[e-1])

    ax2.plot(x,y,z,marker="o",color="0.5")       
    ax2.plot(u,v,t,color="0.",linestyle="dashed")#変形図をプロット

#各グラフのフォーマットの設定
ax1.set_title("Stress Diagram")
ax1.view_init(elev=40, azim=180)
ax1.set_xlim(-1,max_x)
ax1.set_ylim(-1,max_y)
ax1.set_zlim(-1,max_z)
ax1.grid(False)
ax1.set_xticks([]) 
ax1.set_yticks([]) 
ax1.set_zticks([]) 
ax2.set_title("Displacement Diagram")
ax2.view_init(elev=40, azim=180)
ax2.set_xlim(-1,max_x)
ax2.set_ylim(-1,max_y)
ax2.set_zlim(-1,max_z)
ax2.grid(False)
ax2.set_xticks([]) 
ax2.set_yticks([]) 
ax2.set_zticks([]) 
plt.show()

2020/04/11

Matplotlibによる応力・変形図の図化出力

今回はOpenSeesPyによる解析結果の図化出力して遊んでみます。
図化出力の対象は前回までに構築した2次元のトラス解析プログラムの応力解析による結果とします。OpenSeesPyにより出力される節点変位、部材軸力などの数値データを図上に整理します。

図化出力にはpythonのグラフ描画ライブラリMatplotlibを用いることにします。Matplotlibはグラフのみならず様々な図の出力に応用できるようなのです。
私はまだそんなに玄人ではありませんので、少しずつ勉強しながら使っていくことにします。

今回はとりあえず応力解析結果として、部材の軸力図と変形図を出力することにしました。

軸力図は以下のような定義とします。
軸力図における部材の軸力分布はグラフの線色で表現します。
圧縮軸力は赤線、引張軸力は青線で表現、また各部材の軸力の度合いは色のグラデーションで表現します。
さらに、設定した構造部材の断面積を線の太さで表現することにしました。

これらを踏まえて、圧縮軸力となる部材と引張軸力となる部材でそれぞれ場合分けし、軸力図の出力部分は以下のようなコードとしました。

if temp[0] >=0: if max_tens == 0: color_tag=temp[0] else: color_tag=temp[0]/max_tens*1 ax1.text(np.mean(x),np.mean(y),round(temp[0],2)) ax1.plot(x,y,color=[0,float(1-color_tag),1],lw=area[e-1]) else: if max_comp == 0: color_tag=temp[0] else: color_tag=-temp[0]/max_comp*1 ax1.text(np.mean(x),np.mean(y),round(temp[0],2)) ax1.plot(x,y,color=[1,0,float(1-color_tag)],lw=area[e-1])

変形図については、各節点座標とOpenSeesPyのアウトプットコマンドnodeDispで得られた各節点変位の和をグラフ上にプロットします。変位図のプロットの際には、設定した拡大率(mag_factor)により実際の変位を拡大表示します。

以上、組んだプログラムを用いて以下のような応力図が出力できました。


以下のような2次元の任意形状のトラスの応力解析結果の出力に対応します。


このように、色々な形状を設定しながら遊んでみるとトラス構造物の応力の流れが直感的に把握できます。しかし、煩雑なモデルになればなるほどExcelでちまちまと節点や部材の情報を入力するのが面倒になってきます。

そこで今後、CADなどのプログラムと連携させ、より複雑な形状を簡易にインプットできるようなシステムの構築にも挑戦できたらと思います。

今回紹介した図化出力プログラムのソースコードは以下の通りです。
正直、Matplotlibはまだまだ全然使いこなせている感じがしません。
それでも。。
本来はグラフを作成するツールで、枠線、軸線を消したり、2段にまとめたレイアウトとすることによりシンプルな図化出力ができました。
今後も引き続き勉強していきます。

#変位図、応力図を描く    
fig = plt.figure()
max_x=9
max_y=5#グラフの表示範囲を設定

#グラフレイアウトの設定 
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)

#各要素ごとに出力
for e in getEleTags():
    color_tag=0
    nodes = eleNodes(e)
    Nnodes = len(nodes)

    xyz = np.zeros((Nnodes,2), dtype=np.double)
    uu   = np.zeros((Nnodes,2), dtype=np.double)
    for i in range(Nnodes):
        xyz[i,:] = nodeCoord(nodes[i])#return coordinate
        uu[i,:] = nodeDisp(nodes[i])#return current displacement

    x = np.zeros(12,dtype=np.double)
    y = np.zeros(12,dtype=np.double)
    u = np.zeros(12,dtype=np.double)
    v = np.zeros(12,dtype=np.double)

    conec = [0, 1]

    x = xyz[conec,0]
    y = xyz[conec,1]
    x[2::3] = np.nan
    y[2::3] = np.nan

    mag_factor = 10.#変形図の拡大率
    u = xyz[conec,0] + mag_factor*uu[conec,0]
    v = xyz[conec,1] + mag_factor*uu[conec,1]
    u[2::3] = np.nan
    v[2::3] = np.nan
    
    temp=basicForce(e)#各部材の応力をプロット
    if temp[0] >=0:
        if max_tens == 0:
            color_tag=temp[0]
        else:
            color_tag=temp[0]/max_tens*1       
        ax1.text(np.mean(x),np.mean(y),round(temp[0],2))
        ax1.plot(x,y,color=[0,float(1-color_tag),1],lw=area[e-1])
    else:
        if max_comp == 0:
            color_tag=temp[0]
        else:        
            color_tag=-temp[0]/max_comp*1
        ax1.text(np.mean(x),np.mean(y),round(temp[0],2))
        ax1.plot(x,y,color=[1,0,float(1-color_tag)],lw=area[e-1])

    ax2.plot(x,y,marker="o",color="0.5")       
    ax2.plot(u,v,color="0.",linestyle="dashed")#変形図をプロット

#軸ラベルを消す
ax1.tick_params(labelbottom=False,
                labelleft=False,
                labelright=False,
                labeltop=False,
                bottom=False,
                left=False,
                right=False,
                top=False)
ax2.tick_params(labelbottom=False,
                labelleft=False,
                labelright=False,
                labeltop=False,
                bottom=False,
                left=False,
                right=False,
                top=False)

#各グラフのフォーマットの設定
ax1.set_title("Stress Diagram")
ax1.set_xlim(-1,max_x)
ax1.set_ylim(-1,max_y)
ax1.spines["right"].set_color("none")
ax1.spines["left"].set_color("none")
ax1.spines["top"].set_color("none")
ax1.spines["bottom"].set_color("none")
ax2.set_title("Displacement Diagram")
ax2.set_xlim(-1,max_x)
ax2.set_ylim(-1,max_y)
ax2.spines["right"].set_color("none")
ax2.spines["left"].set_color("none")
ax2.spines["top"].set_color("none")
ax2.spines["bottom"].set_color("none")
plt.show()