ここでは,CreateBeamShellコンポーネントを使って球形ラチスシェルの解析を行ってみます。コンポーネントの説明用に作成したghファイルをベースに作業を始めます。

パラメータは$N=M=7$,$X=Y=20[\textrm{m}]$,$h=6[\textrm{m}]$,$center=[0,0,0]$としました。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a2172e0e-9ace-4592-9ee5-36db6c0688fe/Untitled.png

まずは,AssembleGeometriesVisualizeModelと接続してみましょう。節点並びに要素節点関係が生成されていることが確認できます。ここではCreateBeamShellのPreviewはOFFとしておきました。なお,ここではAssembleGeometriesにおいてmat, secの値は与えていませんので,材料番号,断面番号は全ての部材に対して0が割り当てられています。コードアングルもデフォルト値の0となっています。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1576b01b-a9d9-4fa9-b1f6-171168101a15/Untitled.png

続いて,この骨組に面荷重を与えることを考えます。面荷重は,Rhinoビューポート上で直接モデリングをしている場合にはSurfloadなどを使って入力しますが,今回はGHPythonを用いて与えます。面荷重は,面を構成する4つの頂点の座標と,荷重値[kN/m2]のベクトルで構成され

$$ \small\begin{bmatrix}\begin{bmatrix}\textrm{節点番号1}&\textrm{節点番号2}&\textrm{節点番号3}&\textrm{節点番号4}&\textrm{荷重値}[\textrm{kN/m}^2]\end{bmatrix},\cdots\end{bmatrix} $$

という形式で与えられます。面は全部で$(N-1)\times(M-1)$個存在し,$x$方向に$i$,$y$方向に$j$をとってforループをつくることを考えると,$(i,j)$の面の頂点の節点番号は,反時計回りに節点を構成すると

$$ \textrm{節点番号1:}i\times M+j\qquad\textrm{節点番号2:}(i+1)\times M+j\qquad\textrm{節点番号3:}(i+1)\times M+j+1\qquad\textrm{節点番号4:}i\times M+j+1\qquad $$

のようになるので,次のコードで面荷重が作成できる。ここでは,面荷重の値をNumberSliderで変更できるように,入力変数$S$として定義した。

sf_load=[]
for i in range(N-1):
    for j in range(M-1):
        n1=i*M+j
        n2=(i+1)*M+j
        n3=(i+1)*M+j+1
        n4=i*M+j+1
        sf_load.append([n1,n2,n3,n4,S])

なお,このコードではsf_loadに面荷重の情報を2重リストで定義しているが,GHPythonの2重リストをOpenSees for Grasshopperで読み込むためには,Treeに変換する必要があるため,SetsタブのListグループにあるLTConvを用いてGHPythonの2重リストからTreeに変換をした上で,VisualizeModelに接続しよう。ここまでの操作が正しく行われていれば,面荷重の入力状況を確認することができる。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d1994234-11ca-481b-bb7c-734eeb8c1728/Untitled.png

材料と断面は,Comparison of rigid frame structure and arch structureの例題と同様に定義しておきます。ただし,スパンに対して断面が小さすぎるので,ここではP1とP2の値は0.5mとしました。EleVecをつくったあとで,R, IJ, l_vecを接続すると,断面の入力状態を確認できる。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7829660a-29de-4a2b-abd0-15b85d3975c3/Untitled.png

続いて,AssembleLoadsに単位体積重量rhoと断面積Aに加えて,sf_loadをf_loadに接続する。s_loadへの接続とf_loadへの接続は微妙に結果が異なり,前者は純粋に面の負担面積に応じた鉛直下向きの集中荷重が頂点に振り分けられるだけなのに対し,f_loadは亀の甲分割された三角形ないしは台形分布荷重が各梁に作用したときのCMQが等価節点力として考慮される。ここでは,より不利な後者で荷重入力することにします。なお,四辺形が同一平面上にない場合,正確な面荷重の値は算出されませんが,OpenSees for Grasshopperでは,面が同一平面上に存在しなかったとしても,仮想的な同一平面を定義して近似的に面荷重を生成します。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d020e537-e3f6-4eb3-b534-dd7ce2b4db82/Untitled.png

続いて,このラチスシェルが,4隅を長さ$L[\textrm{m}]$の柱によって支えられているような構造を考えてみましょう。柱の長さ$L[\textrm{m}]$と節点座標NOD,線分BEAMを引数に取れば,先程のコードに下記を追加する形で柱のジオメトリをBEAMに追加生成できます。

import ghpythonlib.components as gc
pts=[NOD[0],NOD[M-1],NOD[M*(N-1)],NOD[N*M-1]]
for pt in pts:
    pt2=gc.ConstructPoint(pt.X,pt.Y,-L)
    BEAM.append(gc.Line(pt,pt2))

ここでは,4隅の節点の節点番号はそれぞれ$0, M-1, M\times(N-1), N\times(M-1)$であり,それらの点と,その点から$z$座標が$L$下がった点とを結ぶ線分を作成しています。