応答スペクトル解析の実行
応答スペクトル解析は3つのcommandで実行します。まずoutput databaseからモードデータを抽出し、次にcase fileに従ってモードを合成し、最後にピーク結果を読み取ります。Abaqusが必要なのは最初の抽出だけなので、1回の抽出結果から任意の数のスペクトルや合成則を評価できます。同じ抽出結果は ランダム応答解析、スペクトルの代わりにスペクトル密度を受け取ります。
1 開始前の準備
このユーティリティは、Coreform IGA for Abaqus ソースツリーに存在します。 interop/abaqus/response_spectrum/。製品にはインストールされていませんので、追加してください。 PYTHONPATH コマンドを実行する前に。以下の例では、その場所にシェル変数を使用しています。
export RESPONSE_SPECTRUM_DIR=/path/to/cf/interop/abaqus/response_spectrum
export PYTHONPATH="$RESPONSE_SPECTRUM_DIR"組み合わせステップには NumPy も必要です。抽出ステップでは、Abaqus Python 内に同梱されている NumPy を使用するため、追加のものは何も必要ありません。
2 周波数抽出ステップの準備
出力データベースには、 *FREQUENCY 質量正規化固有ベクトルを使用したステップ。これは、Lanczos および AMS 固有ソルバーのデフォルトです。関与因子はその正規化とのみ一致するため、変位正規化抽出では誤ったピークが生成されます。
周波数ステップでは、結合するすべての変数のフィールド出力も書き込む必要があります。次の手順では、20 のモードを抽出し、変位、反力、応力モード形状を記録します。
*Step, name=FREQ, perturbation
*Frequency, eigensolver=Lanczos, normalization=mass
20,
*Output, field
*Node Output
U, RF
*Element Output, directions=YES
S
*End Stepリクエストする必要はありません V または A。ピーク速度と加速度は、速度と加速度のスペクトルを使用して変位モード形状から導出されます。
固有振動数、一般化質量、参加係数、およびモード有効質量は履歴データとして出力データベースに自動的に書き込まれるため、追加の出力要求は必要ありません。
3 モードデータの抽出
を実行します。 extract コマンドの下 abaqus python。これは出力データベースを読み取る唯一のステップであるため、Abaqus ライセンスが必要な唯一のステップです。
cd /path/to/your/job
abaqus python -m respspec extract myjob.odb myjob_modal.npz --fields U,S,RFコマンドは書きます myjob_modal.npz、固有振動数、参加係数、一般化質量、および要求されたモード形状フィールドを保持する単一の NumPy アーカイブ。
欠落しているフィールドはエラーであるため、周波数ステップが実際に書き込んだフィールドのみを渡します。追加 --frequency-step NAME ジョブに複数の周波数抽出が含まれる場合。最初のものがデフォルトで使用されます。
次に進む前に、抽出を確認します。
python3 -m respspec info myjob_modal.npzレポートには、各モードとその周波数、翻訳参加係数、および一般化質量がリストされ、その後に使用可能なフィールドが続きます。一般化された質量が 1 に等しい場合、モードが質量正規化されていることを確認します。
4 ケースファイルの作成
case fileは、スペクトル、加振方向、合成則、モード減衰を定義するJSON documentです。以下の例、または abaqus_models/validation_cases.py、検証パイプラインは以下に JSON として書き込みます。 abaqus_models/jobs/cases/.
{
"spectra": {
"DESIGN": {
"type": "ACCELERATION",
"gravity": null,
"rows": [[0.8, 0.5, 0.05], [22.0, 50.0, 0.05], [5.0, 5000.0, 0.05]]
}
},
"excitations": [
{"spectrum": "DESIGN", "direction": [1, 0, 0], "scale": 1.0, "duration": null},
{"spectrum": "DESIGN", "direction": [0, 1, 0], "scale": 0.7, "duration": null}
],
"modal_summation": "CQC",
"directional_summation": "SRSS",
"damping": 0.05
}各スペクトル行は、次と同じ順序で、大きさ、時間あたりのサイクル数で表した周波数、および減衰比です。 *SPECTRUM データ行。加振方向は単位ベクトルでなければならず、それらは相互に直交する必要があります。を参照してください。 事件ファイルのリファレンス すべてのフィールドとそれが受け入れる値について。
5 モードの合成
combine コマンドは、抽出されたモードデータにケースファイルを適用します。これは、Abaqus プロセスやライセンスなしで、通常の Python インタープリターの下で実行されます。
python3 -m respspec combine myjob_modal.npz mycase.json myjob_peaks.npz --fields U,V,A,Sこのコマンドは、各フィールドの出力ポイントの数と最大の大きさを出力し、ピークを myjob_peaks.npz。別のスペクトルまたは合成則が必要な場合は、別のケースファイルを使用して再実行してください。抽出を繰り返す必要はありません。
6 結果の読み取り
ピークは出力データベースではなく NumPy アーカイブとして保存されるため、Python で読み取ります。各フィールドには出力ポイントを識別するラベルが付いており、これにより値をノードまたは要素にマップし直すことができます。
import numpy as np
from respspec.modal_data import load_peak_fields_npz
peaks = load_peak_fields_npz("myjob_peaks.npz")
displacement = peaks["U"]
values = displacement.values[0] # (n_points, n_components)
worst = int(np.argmax(np.linalg.norm(values, axis=1)))
print(displacement.component_labels) # ('U1', 'U2', 'U3')
print(int(displacement.node_labels[worst]), values[worst])応力は、要素と積分点によってラベル付けされた積分点の成分として返されます。
応力成分を結合します。決して不変要素ではありません。すべての合成則は符号を破棄するため、すでに結合されている成分から計算されたピークミーゼス応力は正しい結果ですが、モードごとのミーゼス値を結合すると正しい結果ではありません。
7 Abaqusとの比較
同じジョブにソルバーで計算されたジョブも含まれている場合 *RESPONSE SPECTRUM ステップでは、それらの結果を抽出し、それらに対して Python の組み合わせをチェックできます。追加 --peaks を抽出commandに追加すると、応答スペクトルstepごとに1つのarchiveを書き出します。
abaqus python -m respspec extract myjob.odb myjob_modal.npz \
--fields U,S,RF --peaks myjob_peaks_abaqus --peak-fields U,V,A,S次に、2 つのピークのセットをフィールドごとに比較します。
python3 -m respspec compare myjob_peaks.npz myjob_peaks_abaqus/STEPNAME_peaks.npzレポートには、各フィールドの最大絶対差、フィールドのピーク値でスケールされた差、および点ごとの最悪の相対誤差が示されます。
S: points= 9400 ref_max= 3.58890e+06 max_abs= 4.501e-01 scaled= 1.25e-07 pointwise_rel= 1.85e-07 worst@896/S11
PASS: worst scaled error 1.254e-07 (tolerance 1.0e-04)いずれかのフィールドが許容値を超えるとコマンドはゼロ以外のステータスで終了するため、スクリプトで直接使用できます。使用 --tolerance しきい値を変更します。
ご了承ください RF は比較対象に含まれません。AbaqusはSIMベースの応答スペクトルstepでは反力を出力しないため、比較できるsolver側の値がありません。