の
# Create a recorder to monitor element forces in columns
recorder EnvelopeElement -file ele32.txt -time -ele 1 2 forces
で、出力されるele32.txtの中のデータ ユークリッドノルムのソースコードについての解説です。
StaticAnalysis.cpp
のresult = theIntegrator->commit();
で、ele32.txtへ出力される timestampとユークリッドノルムが計算されています。
StaticAnalysis::analyze(int numSteps)
このcommit( ) が読んでいるファンクションの中に、
軸力、せん断力、曲げモーメント
を計算している部分があり、それは、PDeltaCrdTransf2d.cpp にあります。
(*) StaticAnalysis.cpp については、こちらも参照してください
PDeltaCrdTransf2d::getGlobalResistingForce(const Vector &pb, const Vector &p0)
赤でかこまれた部分で
pl[0], pl[3] が軸力
pl[1], pl[4] がせん断力
pl[2], pl[5] が曲げモーメント
を算出しています。
(特にせん断力 Vは、曲げモーメントの傾きから求めています)
つぎに
緑線の部分で 軸力とせん断力を部材座標系から全体座標系へ変換しています。
最終的に
pg(0), pg(3) に 軸力
pg(1), pg(4) に せん断力
pg(2), pg(5) に 曲げモーメント
を入力して、このfunctionは終了します。
次に、
recorder EnvelopeElement -file ele32.txt -time -ele 1 2 forces
コマンドで、出力されるデータを計算している部分です。
EnvelopeElementRecorder.cpp
EnvelopeElementRecorder::record(int commitTag, double timeStamp)
で、ユークリッドノルムが計算されています。
① から、(最終的に)EnvelopeElementRecorder::record(int commitTag, double timeStamp)
が呼ばれます。
② の
eleInfo.getData();
で、上記の
pg(0), pg(3) に 軸力
pg(1), pg(4) に せん断力
pg(2), pg(5) に 曲げモーメント
の値(ここでは、eleDataの成分になっています。)を取得します。
次に③、
normV += eleData(j) * eleData(j);
で、
の1/2 乗(√)の中身を計算してます。pg(1), pg(4) に せん断力
pg(2), pg(5) に 曲げモーメント
の値(ここでは、eleDataの成分になっています。)を取得します。
次に③、
normV += eleData(j) * eleData(j);
で、
1/2 乗(√)は、④で計算しています。
# Create a recorder to monitor element forces in columns
recorder EnvelopeElement -file ele32.txt -time -ele 1 2 forces
で、出力されるele32.txtの中のデータ は
<Time Stamp> <ユークリッドノルム> のペアで出力されていますが、
currentData( )に
<ユークリッドノルム>
が保存されることになります。
OpenSees のソースコード解析に挑戦してみる : 目次 |