関数TF_calculate_V マニュアル

(The documentation of function TF_calculate_V)

Last Update: 2023/8/4


◆機能・用途(Purpose)

時刻\(t-\Delta t\)での速度場と時刻\(t-\Delta t/2\)での応力場を用いて 時刻\(t\)での速度場を計算する。 デバッグモードでは時刻\(t-\Delta t/2\)での応力場と 時刻\(t\)での速度場を出力する。
Compute the velocity field at time \(t\) given the velocity field at time \(t-\Delta t\) and the stress field at time \(t-\Delta t/2\). Output the stress field at time \(t-\Delta t/2\) and the velocity field at time \(t\) in case of the debugging mode.


◆形式(Format)

#include "waterPML_sub/calculate_V.h"
inline void TF_calculate_V
(const struct grid stg,const struct waterPML_parameters parameters,
 int ∗Nigv,int ∗∗igv2ig,const int it,
 char ∗∗type, double ∗∗c0,double ∗∗c1, double ∗∗∗T,double ∗∗∗f,
 struct sequence ∗stfun,double ∗∗∗V)


◆引数(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.
Nigv 下記のigv2ig[i]の配列要素数を並べた1次元配列(引数:i)。 igv2igは2次元配列であるが、その第2引数の個数は第1引数iによって異なるので、 個数をiを引数とする1次元配列で与える必要がある。
A 1-D array (argument: i) composed of the numbers of array components of igv2ig[i] defined below. This must be a 1-D array with argument i because the number of 2nd arguments of the 2-D array igv2ig depends on the 1st argument i.
igv2ig 異なる方法で表した位置を対応付けるための2次元配列。 第1引数は速度\(V_i^k\)の成分番号\(i\)、 第2引数は位置を表す\(V_i^k\)用の 通し番号igv(ループ制御用; 方法3-1) であり、igv2ig[i][igv]はその地点における 半格子点の通し番号ig(方法2) を表す。
A 2-D array that relates the locations expressed by different methods. The 1st argument is the index i of a velocity component \(V_i^k\), and the 2nd argument is the consecutive index igv (for loop; method 3-1) that represents a location for \(V_i^k\). Each array component igv2ig[i][igv] indicates the consecutive index ig of the half-grid node (method 2) at that location.
it 速度場を計算したい時刻\(t\)に対応する時刻番号。 計算の時間刻み(パラメータdtの値)を\(\Delta t\)として \(t=\mbox{(it)}\Delta t\)である。
An index of time defined as \(t=\mbox{(it)}\Delta t\), where \(t\) is the target time of the computation of the velocity field and \(\Delta t\) is the time stepping of the computation given by parameter dt.
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\).
c1 差分方程式の係数\(c_1^k(\posx)\) (計算式 の(8)式) を格納した2次元配列。 第1引数が\(k\)の値、 第2引数が位置\(\posx\)に対応する\(c_1^k\)用の 通し番号(位置の表現方法3-2)
A 2-D array composed of the coefficients \(c_1^k(\posx)\) of difference equations (Eq. 8 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_1^k\) at the location \(\posx\).
T 時刻\(t-\Delta t/2\)における応力成分\(\tau_{ij}^l\)を並べた3次元配列。 第1引数は\((i,j)\)の組を表す インデックスiT、 第2引数は\(l\)であり、 第3引数は位置を表す\(\tau_{ij}^l\)用の 通し番号(位置の表現方法3-2) である。
A 3-D array composed of the stress components \(\tau_{ij}^l\) at time \(t-\Delta t/2\). 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\).
f 地震波動ソースの等価体積力(位置の関数)を表す3次元配列。 地震波動ソースの与え方 で説明したように、waterPMLコマンドでは地震波動ソースを 位置の関数\(F_i^{(is)}(\posx)\)と時間の関数\(s^{(is)}(t)\)の積の 重ね合わせとして表現するが、 このうちの\(F_i^{(is)}(\posx)\)をこの引数で与える。 3次元配列の第1引数はソース番号is、第2引数は力の成分番号i、 第3引数は位置を表す地震波動ソース用の 通し番号(位置の表現方法3-2) である。
A 3-D array to represent the equivalent body force (a function of position) of each seismic wave source. As is explained in Defining the seismic wave source, the waterPML command expresses the seismic wave source by summing the product of a function of position \(F_i^{(is)}(\posx)\) and a function of time \(s^{(is)}(t)\). This argument gives \(F_i^{(is)}(\posx)\). The 1st argument of the 3-D array is the index of source is, the 2nd is the direction i and the 3rd is the consecutive index (method 3-2) that represents a location for the seismic wave source.
stfun 地震波動ソースの等価体積力(時間の関数)を並べた1次元配列。 stfun[is]は上記\(s^{(is)}(t)\)を表す。
A 1-D array composed of the equivalent body forces (functions of time) of the seismic wave source; stfun[is] represents \(s^{(is)}(t)\) introduced above.
V 速度成分\(V_i^k\)を並べた3次元配列。 第1引数は\(i\)、第2引数は\(k\)であり、 第3引数は位置を表す\(V_i^k\)用の 通し番号(位置の表現方法3-2) である。 関数呼び出し時には時刻\(t-\Delta t\)での値を与える。 関数内で時刻\(t\)での値に書き換えられる。
A 3-D array composed of the velocity components \(V_i^k\). 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\). Give the values at time \(t-\Delta t\) as the inputs to the function. The values are replaced by the values at time \(t\) within the function.


◆動作(Behaviour)

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

マクロDEBUG_MODE の値をYESに変更した場合、以下のファイルを出力する。
When the value of macro DEBUG_MODE is changed to YES, the files below are created.

ファイル名
File name
出力されるデータ
Data written
output_dir/debug/Tijl.ttime

  • output_dir:
    パラメータoutput_dirの値。
    The value of parameter output_dir.

  • i:
    出力する応力\(\tau_{ij}^l\)の成分番号\(i\)の値。
    The value of component index \(i\) of stress \(\tau_{ij}^l\) to output.

  • j:
    出力する応力\(\tau_{ij}^l\)の成分番号\(j\)の値。
    The value of component index \(j\) of stress \(\tau_{ij}^l\) to output.

  • l:
    出力する応力\(\tau_{ij}^l\)の成分番号\(l\)の値。
    The value of component index \(l\) of stress \(\tau_{ij}^l\) to output.

  • time:
    時刻\(t-\Delta t/2\)の値(小数点以下4桁の実数)。
    The value of time \(t-\Delta t/2\) (a real number with four digits in the decimal part).

時刻\(t-\Delta t/2\)での応力場。
The stress field at time \(t-\Delta t/2\).
output_dir/debug/Vik.ttime

  • output_dir:
    パラメータoutput_dirの値。
    The value of parameter output_dir.

  • i:
    出力する速度\(V_i^k\)の成分番号\(i\)の値。
    The value of component index \(i\) of velocity \(V_i^k\) to output.

  • k:
    出力する速度\(V_i^k\)の成分番号\(k\)の値。
    The value of component index \(k\) of velocity \(V_i^k\) to output.

  • time:
    時刻\(t\)の値(小数点以下4桁の実数)。
    The value of time \(t\) (a real number with four digits in the decimal part).

時刻\(t\)での速度場。
The velocity field at time \(t\).


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

関数TF_calculate_Vで行っているのは 離散化された計算式 の(9)式 \[\begin{eqnarray} V_i^k(\posx_{i-1/2},t) &=& c_0^k(\posx_{i-1/2})V_i^k(\posx_{i-1/2},t_{-1}) \nonumber \\ & & +c_1^k(\posx_{i-1/2})\left[ \sum_l \left\{\tau_{ik}^l\left(\posx_{i-1/2}^{k+1/2},t_{-1/2}\right) -\tau_{ik}^l\left(\posx_{i-1/2}^{k-1/2},t_{-1/2}\right)\right\} \right. \nonumber \\ & & \left. +\delta_{k0}|\Delta\posx_k|f_i(\posx_{i-1/2},t_{-1/2}) \right] \label{eq.Vik} \end{eqnarray}\] である。 全ての\(i\), \(k\)および 速度定義点\(\posx_{i-1/2}\) について、この式に基づく計算を行っている。
The function TF_calculate_V computes Eq. (9) of discretized formula, which is reproduced in Eq. (\ref{eq.Vik}). The function performs this computation for all \(i\), \(k\), and the velocity definition points \(\posx_{i-1/2}\).

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

(\ref{eq.Vik})式
Eq. (\ref{eq.Vik})
ソースコード
Source code
\(V_i^k(\posx_{i-1/2},t_{-1})\) 更新前(Before update):
  • V[i][k][index_V]
  • Vik[index_V]
\(V_i^k(\posx_{i-1/2},t)\) 更新後(After update):
  • V[i][k][index_V]
  • Vik[index_V]
\(\tau_{ik}^0\left(\posx_{i-1/2}^{k+1/2},t_{-1/2}\right)\)
  • T[iT][0][index_T_plus]
  • TiT0[index_T_plus])
\(\tau_{ik}^0\left(\posx_{i-1/2}^{k-1/2},t_{-1/2}\right)\)
  • T[iT][0][index_T_minus]
  • TiT0[index_T_minus])
\(\tau_{ik}^1\left(\posx_{i-1/2}^{k+1/2},t_{-1/2}\right)\)
  • T[iT][1][index_T_plus]
  • TiT1[index_T_plus])
\(\tau_{ik}^1\left(\posx_{i-1/2}^{k-1/2},t_{-1/2}\right)\)
  • T[iT][1][index_T_minus]
  • TiT1[index_T_minus])
\(\tau_{ik}^2\left(\posx_{i-1/2}^{k+1/2},t_{-1/2}\right)\)
  • T[iT][2][index_T_plus]
  • TiT2[index_T_plus])
\(\tau_{ik}^2\left(\posx_{i-1/2}^{k-1/2},t_{-1/2}\right)\)
  • T[iT][2][index_T_minus]
  • TiT2[index_T_minus])
\(c_0^k(\posx_{i-1/2})\)
  • c0[k][index_c0]
\(c_1^k(\posx_{i-1/2})\)
  • c1[k][index_c1]
  • c1_tmp
\(f_i(\posx_{i-1/2},t_{-1/2})\)
  • f[is][i][index_f]∗ stfun[is].value[it-parameters.itmin]
\(\posx_{i-1/2}\)
  • igv:
    ループ制御変数(方法3-1)
    A control variable for loop (method 3-1)

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

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

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

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

  • index_f:
    等価体積力(位置の関数\(F_i^{(is)}\))の配列要素番号(方法3-2)
    An array index for a coefficient of the equivalent body force (a function of position \(F_i^{(is)}\); method 3-2)

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

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

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

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


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

//速度\(V_i^k\)の成分\(i\)に関するループ
//Loop for component \(i\) of velocity \(V_i^k\)
for(i=0;i<=2;i++){

     //速度\(V_i^k\)の成分\(k\)に関するループ
//Loop for component \(k\) of velocity \(V_i^k\)
for(k=0;k<=2;k++){

     //位置に関するループ(速度定義点のみ)
//Loop for locations (only for velocity definition points)
for(igv=0;igv<=igv_max;igv++){

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

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

  • igを元にindex_c0, index_c1, index_Vを計算
    Compute index_c0, index_c1, and index_V from ig

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

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

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

  • (\ref{eq.Vik})式の右辺第2項、第3項を求めて速度に加算する
    Compute and add the 2nd and 3rd terms of the right hand side of Eq. (\ref{eq.Vik}) to the velocity

}
}
}

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