APDLサンプル:複数ケースの一括計算

単純支持梁曲げ計算シリーズの区切りとして、条件を変更した計算を順次処理するように改造したスクリプトの紹介。

APDL_sample1.txtの最初と最後にループ処理を追加する形で手を加えています。モデリングおよびソルバー設定は変更無し。

!APDL_sample1b.txt
!単純支持梁の曲げ計算-バッチ処理
finish
/clear
!---ループ開始処理を追加----------------------------------------
*do,m,1,4
*do,n,1,3
!スクリプトの存在するフォルダのパスを記録
/inquire,home_dir,directory
!計算結果を保存するフォルダを作成し、ワーキングディレクトリ変更
/mkdir,APDL_sampleA_mat%m%_t%n%
/cwd,APDL_sampleA_mat%m%_t%n%
/prep7
!パラメータリスト=============================================
!---材料と厚さのスイッチをループ変数で記述---
!varMarNum:材料スイッチ
!1:SS400相当
!2:SUS304相当
!3:A5052相当
!4:Brass相当
varMatNum=m
!梁の厚さスイッチ:
!薄(1)・中(2)・厚(3)の3パターン。材料によって異なる値を取る。
varBeamThinNum=n
!---追加・変更ここまで------------------------------------------------
!varBeamLength
varBeamLength=300
varBeamOverhang=10
varBeamWidth=30
*if,varMatNum,eq,1,then
*if,varBeamThinNum,eq,1,then
varBeamThin=2.3
*elseif,varBeamThinNum,eq,2,then
varBeamThin=3.2
*elseif,varBeamThinNum,eq,3,then
varBeamThin=4.5
*endif
*elseif,varMatNum,eq,2,then
*if,varBeamThinNum,eq,1,then
varBeamThin=2.0
*elseif,varBeamThinNum,eq,2,then
varBeamThin=3.0
*elseif,varBeamThinNum,eq,3,then
varBeamThin=4.0
*endif
*elseif,varMatNum,eq,3,then
*if,varBeamThinNum,eq,1,then
varBeamThin=3.0
*elseif,varBeamThinNum,eq,2,then
varBeamThin=4.0
*elseif,varBeamThinNum,eq,3,then
varBeamThin=5.0
*endif
*elseif,varMatNum,eq,4,then
*if,varBeamThinNum,eq,1,then
varBeamThin=3.0
*elseif,varBeamThinNum,eq,2,then
varBeamThin=4.0
*elseif,varBeamThinNum,eq,3,then
varBeamThin=5.0
*endif
*endif
!荷重ステップ条件(N/step)
varForceStep=6.0
varForceStepNum=5
!固定パラメータ=============================================
!材料物性[すべて線形]
!ヤング率[MPa]
*if,varMatNum,eq,1,then
mp,ex,1,210000
*elseif,varMatNum,eq,2,then
mp,ex,1,193000
*elseif,varMatNum,eq,3,then
mp,ex,1,70600
*elseif,varMatNum,eq,4,then
mp,ex,1,100000
*endif
!ポアソン比:全て0.3とする。
mp,prxy,1,0.3
!SOLID185:六面体8節点構造ソリッド要素
et,1,185
!モデル形状作成====================================
csys,0
blc4,0,0,varBeamLength/2,varBeamThin,-varBeamWidth/2
!厚さ方向3分割
lsel,s,length,,varBeamThin
lesize,all, , ,3, , , , ,1
!幅方向5分割
lsel,s,length,,varBeamWidth/2
lesize,all, , ,5, , , , ,1
!長さ方向30分割
lsel,s,length,,varBeamLength/2
lesize,all, , ,30, , , , ,1
allsel
type,1
mat,1
mshkey,1
vmesh,all
asel,s,loc,x,varBeamLength/2
extopt,esize,2,0,
extopt,aclear,1
extopt,attr,1,0,0
vext,all, , ,varBeamOverhang,0,0,
allsel
!拘束条件の定義
!荷重負荷節点
varForceNode=node(0,varBeamThin,0)
!支点
lsel,s,loc,y,0
lsel,r,loc,x,varBeamLength/2
cm,cmLineStay,line
DL,cmLineStay, ,UY,0
allsel
!対称面(X方向)
asel,s,loc,x,0
DA,all,SYMM
allsel
!対称面(Z方向)
asel,s,loc,z,0
DA,all,SYMM
allsel
!画面表示設定
/SHOW,WIN32C
/DEVICE,VECTOR,0
/DEVICE,BBOX,1
/DEVICE,DITHER,1
/DEVICE,ANIM,BMP
/PLOPTS,INFO,2
/PLOPTS,LEG1,1
/PLOPTS,LEG2,0
/PLOPTS,LEG3,1
/PLOPTS,FRAME,1
/PLOPTS,TITLE,1
/PLOPTS,MINM,1
/PLOPTS,FILE,0
/PLOPTS,LOGO,0
/PLOPTS,WINS,1
/PLOPTS,WP,0
/PLOPTS,DATE,0
/TRIAD,LBOT
/color,smax,red
/color,smin,blue
/TYPE,1,6
/CPLANE,0
/SHADE,1,2
/HBC,1,0
/PNUM,KP,0
/PNUM,LINE,0
/PNUM,AREA,0
/PNUM,VOLU,0
/PNUM,NODE,0
/PNUM,TABN,0
/PNUM,SVAL,0
/NUMBER,1
!*
/PNUM,MAT,1
/REPLOT
/VIEW,1,1,1,1
/ANG,1
/REP,FAST
/solu
!静的構造解析
antype,0
!大変形オプション
nlgeom,1
solc,on
nsubst,100,1e6,1
do,i,1,varForceStepNum F,varForceNode,FY,-varForceStepi
solve
*enddo
!結果表示(最終StepのY方向変位)
/post1
set,last
!*
/efacet,1
plnsol, u,y, 1,1.0
/cont,1,,-4,0.25,0
/replot
save
finish
!---ループ終了処理を追加----------------------------------------
!ワーキングディレクトリをマクロのあるフォルダに戻す
/CWD,home_dir(1,1)
!スカラーパラメータをファイルに保存して退避
parsav,scalar,APDL_sample_loop,parm
!データベースを全てクリアする
/clear
!ファイルに退避したスカラーパラメータを読み込む
parres,new,APDL_sample_loop,parm
*enddo
*enddo
!---追加ここまで------------------------------------------------

/clear コマンド はループインデックスも 含めた全てを初期化してしまうため、doループやif構文の中では使うなとヘルプには書いてあります。
しかし同時に、parsavとparresを利用してパラメータをファイルに保存、再度読み込むことで対応可能とも書いてあります。

以前に同様のバッチを作成したときはparsavではなくメッシュモデルを削除してループをさせていたのですが、そちらはメモリ管理上問題があるのか途中で停止したりしました。

形状や物性を変更して相対比較するような場合、こうした自動化処理は有効に働くでしょう。結果の取得もループを組むといいでしょう。