関数TF_calculate_T マニュアル

(The documentation of function TF_calculate_T)

Last Update: 2023/8/4


◆機能・用途(Purpose)

時刻\(t-\Delta t/2\)での応力場と時刻\(t\)での速度場を用いて 時刻\(t+\Delta t/2\)での応力場を計算する。
Compute the stress field at time \(t+\Delta t/2\) given the stress field at time \(t-\Delta t/2\) and the velocity field at time \(t\).


◆形式(Format)

#include "waterPML_sub/calculate_T.h"
inline void TF_calculate_T
(const struct grid stg,const struct waterPML_parameters parameters,
 int ∗Nigt,int ∗∗igt2ig,char ∗∗type, double ∗∗c0,double ∗∗c2,
 double ∗∗∗V,double ∗∗∗T)


◆引数(Arguments)

stg 異なる方法で表した位置を対応付けるための構造体。 この構造体では 半格子点の通し番号ig(方法2) を元に同じ地点における 特定の量のための通し番号(配列要素番号用; 方法3-2) を求めるための対応関係を与える。
A structure to relate the locations expressed by different methods. This structure defines the consecutive index for a specific quantity (for array indices; method 3-2) for each location given by the consecutive index for a half-grid node (method 2).
parameters コマンドライン引数で与えたパラメータ一式を格納した構造体。
A structure composed of the parameters given by command-line arguments.
Nigt 下記のigt2ig[iT]の配列要素数を並べた1次元配列(引数:iT)。 igt2igは2次元配列であるが、その第2引数の個数は第1引数iTによって異なるので、 個数をiTを引数とする1次元配列で与える必要がある。
A 1-D array (argument: iT) composed of the numbers of array components of igt2ig[iT] defined below. This must be a 1-D array with argument iT because the number of 2nd arguments of the 2-D array igt2ig depends on the 1st argument iT.
igt2ig 異なる方法で表した位置を対応付けるための2次元配列。 第1引数は応力\(\tau_{ij}^l\)の成分\((i,j)\)を表す インデックスiT、 第2引数は位置を表す\(\tau_{ij}^l\)用の 通し番号igt(ループ制御用; 方法3-1) であり、igt2ig[iT][igt]はその地点における 半格子点の通し番号ig(方法2) を表す。
A 2-D array that relates the locations expressed by different methods. The 1st argument is the index iT that represents the combination \((i,j)\) of a stress component \(\tau_{ij}^l\), and the 2nd argument is the consecutive index igt (for loop; method 3-1) that represents a location for \(\tau_{ij}^l\). Each array component igt2ig[iT][igt] indicates the consecutive index ig of the half-grid node (method 2) at that location.
type 半格子点の属性を並べた2次元配列。詳細は こちらのページ 参照。
A 2-D array composed of the attributes of half-grid nodes. For detail, see this page.
c0 差分方程式の係数\(c_0^k(\posx)\) (計算式 の(7)式) を格納した2次元配列。 第1引数が\(k\)の値、 第2引数が位置\(\posx\)に対応する\(c_0^k\)用の 通し番号(位置の表現方法3-2)
A 2-D array composed of the coefficients \(c_0^k(\posx)\) of difference equations (Eq. 7 of the formula). The 1st argument is \(k\), and the 2nd argument is the consecutive index (method 3-2 to represent the location) for \(c_0^k\) at the location \(\posx\).
c2 差分方程式の係数\(c_2^{ijpl}(\posx)\) (計算式 の(14)式) を格納した2次元配列。 第1引数が\((i,j,p,l)\)の組に対応する インデックスicの値、 第2引数が位置\(\posx\)に対応する\(c_2^{ijpl}\)用の 通し番号(位置の表現方法3-2)
A 2-D array composed of the coefficients \(c_2^{ijpl}(\posx)\) of difference equations (Eq. 14 of the formula). The 1st argument is the value of index ic corresponding to the component \((i,j,p,l)\), and the 2nd argument is the consecutive index (method 3-2 to represent the location) for \(c_2^{ijpl}\) at the location \(\posx\).
V 時刻\(t\)における速度成分\(V_i^k\)を並べた3次元配列。 第1引数は\(i\)、第2引数は\(k\)であり、 第3引数は位置を表す\(V_i^k\)用の 通し番号(位置の表現方法3-2) である。
A 3-D array composed of the velocity components \(V_i^k\) at time \(t\). The 1st argument is \(i\), the 2nd is \(k\), and the 3rd is the consecutive index (method 3-2) that represents a location for \(V_i^k\).
T 応力成分\(\tau_{ij}^l\)を並べた3次元配列。 第1引数は\((i,j)\)の組を表す インデックスiT、 第2引数は\(l\)であり、 第3引数は位置を表す\(\tau_{ij}^l\)用の 通し番号(位置の表現方法3-2) である。 関数呼び出し時には時刻\(t-\Delta t/2\)での値を与える。 関数内で時刻\(t+\Delta t/2\)での値に書き換えられる。
A 3-D array composed of the stress components \(\tau_{ij}^l\). The 1st argument is the index iT corresponding to the components \((i,j)\), the 2nd argument is \(l\), and the 3rd is the consecutive index (method 3-2) that represents a location for \(\tau_{ij}^l\). Give the values at time \(t-\Delta t/2\) as the inputs to the function. The values are replaced by the values at time \(t+\Delta t/2\) within the function.


◆動作(Behaviour)

引数Tの配列要素の値が関数内で更新される。
The values of the array components of argument T are updated within the function.


◆関数内部のコーディング (Coding in the function)

関数TF_calculate_Tで行っているのは 離散化された計算式 の(15)式 \[\begin{eqnarray} \tau_{ij}^l\left(\posx_{i-1/2}^{j+1/2},t_{+1/2}\right) &=& c_0^l\left(\posx_{i-1/2}^{j+1/2}\right) \tau_{ij}^l\left(\posx_{i-1/2}^{j+1/2},t_{-1/2}\right) +\sum_p \left[ c_2^{ijpl}\left(\posx_{i-1/2}^{j+1/2}\right) \right. \nonumber \\ & & \left. \sum_k \left\{V_p^k\left(\posx_{i-1/2,j+1/2}^{l+1/2},t\right) -V_p^k\left(\posx_{i-1/2,j+1/2}^{l-1/2},t\right)\right\} \right] \label{eq.Tijl} \end{eqnarray}\] である。 全ての\(i\), \(j\), \(l\)および 応力定義点\(\posx_{i-1/2}^{j+1/2}\) について、この式に基づく計算を行っている。
The function TF_calculate_T computes Eq. (15) of discretized formula, which is reproduced in Eq. (\ref{eq.Tijl}). The function performs this computation for all \(i\), \(j\), \(l\), and the stress definition points \(\posx_{i-1/2}^{j+1/2}\).

(\ref{eq.Tijl})式中の変数とソースコード中の変数との対応関係を 下表に整理する。
See the table below for the relation between the variables in Eq. (\ref{eq.Tijl}) and those in the source code.

(\ref{eq.Tijl})式
Eq. (\ref{eq.Tijl})
ソースコード
Source code
\(\tau_{ij}^l\left(\posx_{i-1/2}^{j+1/2},t_{-1/2}\right)\) 更新前(Before update):
  • T[iT][l][index_T]
  • TiTl[index_T]
\(\tau_{ij}^l\left(\posx_{i-1/2}^{j+1/2},t_{+1/2}\right)\) 更新後(After update):
  • T[iT][l][index_T]
  • TiTl[index_T]
\(V_p^0\left(\posx_{i-1/2,j+1/2}^{l+1/2},t\right)\)
  • V[p][0][index_V_plus]
  • Vp0[index_V_plus])
\(V_p^0\left(\posx_{i-1/2,j+1/2}^{l-1/2},t\right)\)
  • V[p][0][index_V_minus]
  • Vp0[index_V_minus])
\(V_p^1\left(\posx_{i-1/2,j+1/2}^{l+1/2},t\right)\)
  • V[p][1][index_V_plus]
  • Vp1[index_V_plus])
\(V_p^1\left(\posx_{i-1/2,j+1/2}^{l-1/2},t\right)\)
  • V[p][1][index_V_minus]
  • Vp1[index_V_minus])
\(V_p^2\left(\posx_{i-1/2,j+1/2}^{l+1/2},t\right)\)
  • V[p][2][index_V_plus]
  • Vp2[index_V_plus])
\(V_p^2\left(\posx_{i-1/2,j+1/2}^{l-1/2},t\right)\)
  • V[p][2][index_V_minus]
  • Vp2[index_V_minus])
\(c_0^l\left(\posx_{i-1/2}^{j+1/2}\right)\)
  • c0[l][index_c0]
\(c_2^{ijpl}\left(\posx_{i-1/2}^{j+1/2}\right)\)
  • c2[ic][index_c2]
  • c2_tmp
\(\posx_{i-1/2}^{j+1/2}\)
  • igt:
    ループ制御変数(方法3-1)
    A control variable for loop (method 3-1)

  • ig:
    半格子点の通し番号(方法2)
    A consecutive index of the half-grid node (method 2)

  • index_T:
    応力成分\(\tau_{ij}^l\)の配列要素番号(方法3-2)
    An array index for a stress component \(\tau_{ij}^l\) (method 3-2)

  • index_c0:
    差分方程式の係数\(c_0^l\)の配列要素番号(方法3-2)
    An array index for a coefficient of difference equation \(c_0^l\) (method 3-2)

  • index_c2:
    差分方程式の係数\(c_2^{ijpl}\)の配列要素番号(方法3-2)
    An array index for a coefficient of difference equation \(c_2^{ijpl}\) (method 3-2)

\(\posx_{i-1/2,j+1/2}^{l+1/2}\)
  • ig_plus:
    半格子点の通し番号(方法2)
    A consecutive index of the half-grid node (method 2)

  • index_V_plus:
    速度成分\(V_p^k\)の配列要素番号(方法3-2)
    An array index for a velocity component \(V_p^k\) (method 3-2)

\(\posx_{i-1/2,j+1/2}^{l-1/2}\)
  • ig_minus:
    半格子点の通し番号(方法2)
    A consecutive index of the half-grid node (method 2)

  • index_V_minus:
    速度成分\(V_p^k\)の配列要素番号(方法3-2)
    An array index for a velocity component \(V_p^k\) (method 3-2)


関数TF_calculate_Tのソースコードの構造の 根幹的な部分を抜き出すと以下のようになる。
Essentially, the source code of function TF_calculate_T is constructed based on the structure shown below.

//応力\(\tau_{ij}^l\)の成分\((i,j)\)に関するループ
//Loop for components \((i,j)\) of stress \(\tau_{ij}^l\)
for(iT=0;iT<=5;iT++){

     //応力\(\tau_{ij}^l\)の成分\(l\)に関するループ
//Loop for component \(l\) of stress \(\tau_{ij}^l\)
for(l=0;l<=2;l++){

     //位置に関するループ(応力定義点のみ)
//Loop for locations (only for stress definition points)
for(igt=0;igt<=igt_max;igt++){

  • igtを元にigを計算
    Compute ig from igt

  • igを元にig_plus, ig_minusを計算
    Compute ig_plus and ig_minus from ig

  • igを元にindex_c0, index_c2, index_Tを計算
    Compute index_c0, index_c2, and index_T from ig

  • ig_plusを元にindex_V_plusを計算
    Compute index_V_plus from ig_plus

  • ig_minusを元にindex_V_minusを計算
    Compute index_V_minus from ig_minus

  • 応力を\(c_0^l\)倍する((\ref{eq.Tijl})式の右辺第1項の計算)
    Compute the 1st term of the right hand side of Eq. (\ref{eq.Tijl}) by muitiplying \(c_0^l\) with the given stress

  • (\ref{eq.Tijl})式の右辺第2項を求めて応力に加算する
    Compute and add the 2nd term of the right hand side of Eq. (\ref{eq.Tijl}) to the stress

}
}
}

ソースコードでは応力成分を T[iT][l][index_T] と書く代わりに、 最初にT[iT][l]のアドレスを double ∗型変数TiTl に代入した上で TiTl[index_T] と書いている。 これは配列要素の探索を減らして高速化するためであり、 速度成分や\(c_2^{ijpl}\)に対しても同様の考え方を用いている。
In the source code, a stress component is expressed as TiTl[index_T] instead of directly writing as T[iT][l][index_T]. Here, TiTl is a double ∗-type variable defined to represent the address T[iT][l]. This replacement makes the program faster by reducing the search for array components. Similar replacements are used for velocity components and \(c_2^{ijpl}\).