Python版AEiで二分探査法

Python版のAEiを作成しました。
手始めに、Calculixの接触問題で入力荷重を変化させ、二分探査法により歪が特定の値となる荷重値を求めるデモを作成しました。

解析を実行するスクリプトは以下のとおり。

import sys
import AEpy as AEI

pmax = 1.0
pmin = 0.1
target = 2.0e-5

while (pmax - pmin) > 1.0e-6:
	pmid = (pmax + pmin) / 2.0
	BASE = 'case_test'
	INP = BASE + '.inp'
	DAT = BASE + '.dat'
	FRD = BASE + '.frd'
	AEI.a('FRDNAME', FRD)
	AEI.a('MYLOAD',pmid, 'L')
	AEI.b('bolt_tmp.txt', INP)
	AEI.b('cgx.txt', 'my.frd')
	AEI.c('ccx ' + BASE)
	AEI.c('cgx -b my.frd')
	AEI.c('python my_max.py ' + DAT + ' result.csv')
	M = AEI.d('result.csv')
	eps = float(M[0][0])
	print('LOAD=', pmid, 'eps=', eps, 'target=', target)
	if eps > target:
		pmax = pmid
	else:
		pmin = pmid

AEiスクリプトで埋込SRモデルの解析を連続実行する

動的サブストラクチャ解析の一つに、建屋の一部(または全部)が表層地盤に埋め込まれた構造を、地盤の応答解析の結果を引き継ぎ、建屋の応答解析を実施するという方法があります。

この場合、建屋側面地盤の非線形性を等価線形解析で求め、この物性で求めた建屋側面のインピーダンスから地盤剛性と地盤減衰を算出して、建屋に接続して解析を行うことが一般的です。

以下は、その一連の解析を、入力地震動を変更しながら、また地盤物性と建屋減衰を変更してAEiスクリプトで連続実行するデモです。

入力地震動はエルセントロNSと日本建築センター模擬波(基盤波)、八戸NSの3種、地盤物性は標準、+σ、-σの3種、建屋減衰は5%と3%の2種で合計18ケースの解析を実施します。

なお、地盤の応答解析以外は自前のプログラムを使用しております。

地盤の応答解析は吉田望氏が作成されたDYNEQ336を使用させていただきました。
たいへん使いやすく、ドキュメントもしっかりいて素晴らしいものだと思います。

デモ動画のOSはMacOSですが、AEiスクリプトはWindowsでも、Linuxでも動作します。

参考として以下にaeiスクリプトを記載します。

print " aei スクリプトで、入力地震動と地盤物性を変化させ、埋込SRを連続解析して各ケースの解析結果のレポートを作成する"
pause

print "解析定義のExcelから解析ケースのシートを抽出する"
cmd{
	excelcsv -proc ex2csv -excel analysis.xlsx -sheet case -csv case.csv
	cat case.csv
	}
	pause

# 連続解析のループ
for i = 1 to 18
	L = i + 1

	print "解析ケースのCSVから入力波と地盤の情報を変数に代入する"
	csvfile = case.csv
	$NUM  = csv_r[L]_c[1]
	$SOIL = csv_r[L]_c[2]
	$WAVE = csv_r[L]_c[3]
	$WNUM = csv_r[L]_c[4]
	$WSTP = csv_r[L]_c[5]
	$BLDH = csv_r[L]_c[6]
	print "ケースNo   = ",$NUM
	print "地盤条件   = ",$SOIL
	print "入力地震動 = ",$WAVE,"( ",$WSTP,")"
	print "建屋減衰   = ",$BLDH
	pause

	print "各解析データのファイル名を定義する"
	$CASE = CASE<$NUM>
	$INPUT_WAV = <$WAVE>.wav
	$JBNWAV    = <$SOIL>_<$WAVE>
	$SHAKE_DAT = Shake_<$JBNWAV>.dat
	$SHAKE_OUT = Shake_<$JBNWAV>.out
	$SHAKE_WAV = Shake_<$JBNWAV>.wav
	$NOVAK_DAT = Novak_<$JBNWAV>.dat
	$NOVAK_OUT = Novak_<$JBNWAV>.out
	$ADMIT_DAT = Admit_<$SOIL>.dat
	$ADMIT_OUT = Admit_<$SOIL>.out
	$NAMAZ_DAT = <$CASE>_Namaz_<$JBNWAV>_h<$BLDH>.dat
	$NAMAZ_OUT = <$CASE>_Namaz_<$JBNWAV>_h<$BLDH>.out
	$NAMAZ_WAV = <$CASE>_Namaz_<$JBNWAV>_h<$BLDH>.wav
	print "Shake DATA  = ",$SHAKE_DAT
	print "Novak DATA  = ",$NOVAK_DAT
	print "Admit DATA  = ",$ADMIT_DAT
	print "Namaz DATA  = ",$NAMAZ_DAT
	pause

	print "解析定義のExcelから地盤情報を抽出して地盤物性を変数に代入する"
	cmd{
		excelcsv -proc ex2csv -excel analysis.xlsx -sheet <$SOIL> -csv JIBAN.csv
		cat JIBAN.csv
		}
	csvfile = JIBAN.csv
	for j = 1 to 7
		M = j + 1
		$G[j]  = csv_r[M]_c[2]
		$VS[j] = csv_r[M]_c[3]
		$RO[j] = csv_r[M]_c[4]
		$PO[j] = csv_r[M]_c[5]
		$T[j]  = csv_r[M]_c[6]
		$SH[j] = csv_r[M]_c[7]
	next j
	pause

	print "解析定義のExcelから入力波のCSVを抽出してShakeが読み込める書式に変換する"
	cmd{
		excelcsv -proc ex2csv -excel analysis.xlsx -sheet WAVE -csv WAVE.csv
		csv2wav.sh -c WAVE.csv -w <$INPUT_WAV> -r <$WNUM> -s <$WSTP>
		}
	pause

	print "Shakeデータを作成して解析を実行する"
	makedata shake.template $SHAKE_DAT
	print "Shakeのプログラムは 吉田望 氏 が作成された DYNEQ336 を使わせていただいています。"
	cmd{ sub.sh DYNEQ336 $SHAKE_DAT $SHAKE_OUT }
	pause

	print "アドミッタンスばねデータを作成して解析を実行する"
	makedata admit.template $ADMIT_DAT
	cmd{ sub.sh admit $ADMIT_DAT $ADMIT_OUT }
	pause
	
	print "Shake解析結果からNovakばね計算に必要な情報を取得する"
	cmd{
		shake2csv.sh -L $SHAKE_OUT -c SHAKE.csv
		cat SHAKE.csv
		}
	csvfile = SHAKE.csv
	for j = 1 to 7
		$SKG[j]  = csv_r[j]_c[1]
		$SKVS[j] = csv_r[j]_c[2]
	next j
	pause

	print "novakばねデータを作成して解析を実行する"
	makedata novak.template $NOVAK_DAT
	cmd{ sub.sh novak $NOVAK_DAT $NOVAK_OUT }
	pause
	
	print "アドミッタンスばねのKとCを取り出す(Cの計算は暫定的に1.0Hz)"
	cmd{
		admit2csv.sh -L $ADMIT_OUT -c ADMIT.csv -f 1.0
		cat ADMIT.csv
		}
	pause

	print "novakばねのKとCを取り出す(Cの計算は暫定的に1.0Hz)"
	cmd{
		novak2csv.sh -L $NOVAK_OUT -c NOVAK.csv -f 1.0
		cat NOVAK.csv
		}
	pause

	print "アドミッタンスばねとnovakばねの値を変数に代入する(Cの計算は暫定的に1.0Hz)"
	csvfile = ADMIT.csv
	$ADMK[1] = csv_r[1]_c[1]
	$ADMK[2] = csv_r[2]_c[1]
	$ADMC[1] = csv_r[1]_c[3]
	$ADMC[2] = csv_r[2]_c[3]
	print "SWAY K = ",$ADMK[1]," ROCK K = ",$ADMK[2]
	print "SWAY C = ",$ADMC[1]," ROCK C = ",$ADMC[2]
	csvfile = NOVAK.csv
	for j = 1 to 6
		$NVKK[j] = csv_r[j]_c[1]
		$NVKC[j] = csv_r[j]_c[3]
		print "NOVAK K= ",$NVKK[j]," NOVAK C= ",$NVKC[j]
	next j
	pause

	print "固有値解析用データ作成と実行(一度、1.0Hzの減衰で応答解析を実施する)"
	makedata namazu.template $NAMAZ_DAT
	cmd{ sub.sh namazu $NAMAZ_DAT $NAMAZ_OUT }
	pause

	print "解析モデルの地盤-建屋連成1次の振動数を取得する"
	cmd{
		namazu2csv.sh -L $NAMAZ_OUT -c NAMAZU.csv
		cat NAMAZU.csv
		}
	pause

	print "連成1次の減衰を取得する"
	csvfile = NAMAZU.csv
	$FREQ = csv_r[1]_c[1]
	cmd{
		admit2csv.sh -L $ADMIT_OUT -c ADMIT.csv -f $FREQ
		novak2csv.sh -L $NOVAK_OUT -c NOVAK.csv -f $FREQ
		}
	pause

	print "アドミッタンスばねとnovakばねの値を変数に代入する"
	csvfile = ADMIT.csv
	$ADMK[1] = csv_r[1]_c[1]
	$ADMK[2] = csv_r[2]_c[1]
	$ADMC[1] = csv_r[1]_c[3]
	$ADMC[2] = csv_r[2]_c[3]
	print "SWAY K = ",$ADMK[1]," ROCK K = ",$ADMK[2]
	print "SWAY C = ",$ADMC[1]," ROCK C = ",$ADMC[2]
	csvfile = NOVAK.csv
	for j = 1 to 6
		$NVKK[j] = csv_r[j]_c[1]
		$NVKC[j] = csv_r[j]_c[3]
		print "NOVAK K= ",$NVKK[j]," NOVAK C= ",$NVKC[j]
	next j
	pause

	print "応答解析を実施する"
	makedata namazu.template $NAMAZ_DAT
	cmd{ sub.sh namazu $NAMAZ_DAT $NAMAZ_OUT }
	pause
	
	print "応答スペクトル計算"
	pause
	cmd{
		wav2csv -in $INPUT_WAV -csv <$INPUT_WAV>.csv -fmt '(8f10.0)' -step $WSTP -dt 0.01
		wav2csv -in $NAMAZ_WAV -csv <$NAMAZ_WAV>.csv -fmt '(8f10.0)' -step $WSTP -dt 0.01
		duhamel -c <$INPUT_WAV>.csv -d 0.05 -s 0.02 -e 5.0 -r 1 -b 300
		duhamel -c <$NAMAZ_WAV>.csv -d 0.05 -s 0.02 -e 5.0 -r 1 -b 300
		duhamel -c <$NAMAZ_WAV>.csv -d 0.05 -s 0.02 -e 5.0 -r 2 -b 300
		duhamel -c <$NAMAZ_WAV>.csv -d 0.05 -s 0.02 -e 5.0 -r 3 -b 300
		duhamel -c <$NAMAZ_WAV>.csv -d 0.05 -s 0.02 -e 5.0 -r 4 -b 300
		duhamel -c <$NAMAZ_WAV>.csv -d 0.05 -s 0.02 -e 5.0 -r 5 -b 300
		}
	pause

	print "一括後処理(関連するCSVファイルを全てTemplateのExcelに貼り付ける)"
	cmd{
		sr_post.sh <$CASE> <$WAVE> <$SOIL> <$BLDH> <$INPUT_WAV> <$CASE>_<$WAVE>_<$SOIL>_<$BLDH>.xlsx
		open <$CASE>_<$WAVE>_<$SOIL>_<$BLDH>.pdf
		}
	pause

next i

AEiでCalculiXのBoltサンプルの荷重を変化させて歪みが一定値を超える荷重を得る

CalculiX は強力な非線形ソルバーなので、容易に静的な荷重を斬増させて非線形解析することができます。

解析コード本体で荷重を増加させていくことが可能なのですが、今回はAEi(Analysis Execution interpreter)を使って外部から静的な加力荷重を変化させて、歪みがある一定の数値を超える荷重値を調べます。

以下では、外力を0.1ずつ増加させ、歪み(Exx)が 5.0E-5 を超える荷重値を得るというデモです。

AEI and CalculiX Bolt Sample

上記は外力を線形に増加させただけですが、後処理に小さなプログラムを用意すれば、後段の解析に結果を受け渡しながら連続的に解析を実行することも可能です。

また、等価線形解析機能がないソルバーの結果を読み込んで前回解析との差分から後段解析の物性値を作成するプログラムを用意すれば、外部で等価線形解析を実施することも可能です。

自動車分野におけるAEiの可能性

自動車の質量を低減することは燃費性能を向上させることになり、昨今の世界的なCO2排出量の削減の流れとともに重要な達成目標になっています。一方、衝突安全性の確保など、車体に要求される性能も高まっていて、この「質量の低減」と「車体性能の向上」の両立が課題となっています。

設計のプロセスにおいては長くCAEの技術が利用されてきましたが、解析の種別と各解析モデルにおけるパラメータの変化は多岐に渡ります。

解析の種別は車体のねじり剛性の確保を確認する解析から、生存空間量を確認する側面衝突解析や前面・後面衝突解析などがあり、これらの解析に対し、変化させる設計変数として、車体の材質や材料の板厚などがあります。

目標質量値を定め、これらの多岐に渡る解析を実施するわけですが、例えば生存空間量などの解析結果の評価をする小さなプログラム(或いは既存の仕組み)と組合せることで、解析パラメータを変化させていきながら結果を評価していくAEIという考え方は有効なのではないかと考えています。

AEi(解析連続実行)

AEi(Analysis Execution interpreter )は if 文制御、for 文ループを備え、簡単な記述でCSVファイルからデータを読み込み、変数に代入することができる独自言語のインタープリタです。

この変数を、解析データの元となるテンプレートデータに展開することで解析データを作成し、解析を実行します。

簡単な処理の流れを以下に記載します。

1)テンプレートデータ
解析データの元となるテンプレートデータに「$◯◯◯」という$変数名で変化させていくデータを記述する。

2)CSVファイルの数値を$変数に代入する
この変化させていく$変数にCSVファイルから読み込んだ数値や文字列などを代入し、それらの値でテンプレートデータを書き換え、解析用のデータを作成する。

3)解析を実行する
作成されたデータを解析コードに渡して解析を実行する。