spml/et_module モジュールは 2 次元水路領域での流体運動をスペクトル法により 数値計算を実行するための Fortran90 関数を提供する. 周期的な境界条件を扱うための X 方向へのフーリエ変換と 境界壁を扱うための Y 方向のチェビシェフ変換を用いる場合の スペクトル計算のためのさまざまな関数を提供する. 内部で ae_module, at_module を用いている. 最下部ではフーリエ変換およびチェビシェフ変換のエンジンとして ISPACK/FTPACK の Fortran77 サブルーチンを用いている.
| 初期化 | 機能 |
|---|---|
| et_initial | スペクトル変換の格子点数, 波数, 領域の大きさの設定 |
| 座標変数 | 機能 |
| x_X, y_Y | 格子点座標(X,Y座標)を格納した 1 次元配列. |
| x_X_Weigtht, y_Y_Weight | 重み座標を格納した 1 次元配列. |
| yx_X, yx_Y | 格子点データの XY 座標(X,Y)(格子点データ型 2 次元配列) |
| 基本変換 | 機能 |
| yx_et | スペクトルデータから格子データへの変換(2 次元) |
| et_yx | 格子データからスペクトルデータへの変換(2 次元) |
| ax_ae, x_e | X 方向のスペクトルデータから格子データへの変換 |
| ay_at, y_t | Y 方向のスペクトルデータから格子データへの変換 |
| ae_ax, e_x | X 方向の格子点データからスペクトルデータへの変換 |
| at_ay, t_y | Y 方向の格子点データからスペクトルデータへの変換 |
| 微分 | 機能 |
| et_Lapla_et | スペクトルデータにラプラシアンを作用させる |
| et_Dx_et, ae_Dx_ae, e_Dx_e | スペクトルデータにX 微分を作用させる |
| et_Dy_et at_Dy_at, t_Dy_t | スペクトルデータに Y 微分を作用させる |
| 非線形計算 | 機能 |
| et_Jacobian_et_et | 2 つのスペクトルデータからヤコビアンを計算する. |
| 境界値問題 | 機能 |
| et_Boundaries | ディリクレ, ノイマン境界条件の適用 |
| et_LaplaInv_et | スペクトルデータにラプラシアンの逆変換を作用させる. |
| ey_Vor2Strm_ey, et_Vor2Strm_et, et_Vor2Strm1_et | 渦度から流線を計算する. |
| 積分・平均 | 機能 |
| IntYX_yx, AvrYX_yx | 2 次元格子点データの全領域積分および平均. |
| y_IntX_yx, y_AvrX_yx | 2 次元格子点データの X 方向積分および平均. |
| IntX_x, AvrX_x | 1 次元(X)格子点データの X 方向積分および平均. |
| x_IntY_yx, x_AvrY_yx | 2 次元格子点データの Y 方向積分および平均. |
| IntY_y, AvrY_y | 1 次元(Y)格子点データの Y 方向積分および平均. |
integer,intent(in) :: i, j ! 格子点の設定(X,Y)
integer,intent(in) :: k, l ! 切断波数の設定(X,Y)
real(8),intent(in) :: xmin, xmax ! X 座標の範囲
real(8),intent(in) :: ymin, ymax ! Y 座標の範囲
real(8), dimension(-km:km,0:lm),intent(inout) :: et
! 境界条件を適用するデータ. 修正された値を返す.
real(8), dimension(-km:km,2), intent(in), optional :: values
! 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
! 省略時は値/勾配 0 となる.
character(len=2), intent(in), optional :: cond
! 境界条件. 省略時は 'DD'
! DD : 両端ディリクレ
! DN,ND : ディリクレ/ノイマン条件
! NN : 両端ノイマン
real(8), dimension(0:im-1) :: x_X
real(8), dimension(0:jm) :: y_Y
real(8), dimension(0:im-1) :: x_X_Weigtht
real(8), dimension(0:jm) :: y_Y_Weigtht
real(8), dimension(0:jm,0:im-1) :: yx_X, yx_Y
yx_Data = yx_X ** 2 + yx_Y **2
という具合に数式と同じ形で書くことができる.
real(8), dimension(0:jm,0:im-1) :: yx_et
real(8), dimension(-km:km,0:lm), intent(in) :: et
real(8), dimension(-km:km,0:lm) :: et_yx
real(8), dimension(0:jm,0:im-1), intent(in) :: yx
real(8), dimension(0:im-1) :: x_e
real(8), dimension(-km:km), intent(in) :: e
real(8), dimension(size(ae,1),0:im-1) :: ax_ae
real(8), dimension(:,-km:km), intent(in) :: ae
real(8), dimension(0:jm) :: y_t
real(8), dimension(0:lm), intent(in) :: t
real(8), dimension(size(at,1),0:jm) :: ay_at
real(8), dimension(:,0:lm), intent(in) :: at
real(8), dimension,-km:km) :: e_x
real(8), dimension(0:im-1), intent(in) :: x
real(8), dimension(size(ax,1),-km:km) :: ae_ax
real(8), dimension(:,0:im-1), intent(in) :: ax
real(8), dimension(0:lm) :: t_y
real(8), dimension(0:jm), intent(in) :: y
real(8), dimension(size(ay,1),0:lm) :: at_ay
real(8), dimension(:,0:jm), intent(in) :: ay
real(8), dimension(-km:km,0:lm) :: et_Lapla_et
real(8), dimension(-km:km,0:lm), intent(in) :: et
real(8), dimension(-km:km,0:lm) :: et_Dx_et
real(8), dimension(-km:km,0:lm), intent(in) :: et
real(8), dimension(size(ae,1),-km:km) :: ae_Dx_ae
real(8), dimension(:,-km:km), intent(in) :: ae
real(8), dimension(-km:km) :: e_Dx_a
real(8), dimension(-km:km), intent(in) :: e
real(8), dimension(-km:km,0:lm) :: et_Dy_et
real(8), dimension(-km:km,0:lm), intent(in) :: et
real(8), dimension(size(at,1),0:lm) :: at_Dy_at
real(8), dimension(:,0:lm), intent(in) :: at
real(8), dimension(0:lm) :: t_Dy_t
real(8), dimension(0:lm), intent(in) :: t
real(8), dimension(-km:km,0:lm) :: et_Jacobian_et_et
real(8), dimension(-km:km,0:lm), intent(in) :: et_a, et_b
real(8), dimension(-km:km,0:lm) :: et_LaplaInv_et
real(8), dimension(-km:km,0:lm),intent(in) :: et
real(8), dimension(-km:km,2), intent(in), optional :: values ! Y=0,jmでの境界値
| 渦度 \zeta を与えて流線 \psi を求める.
! \nabla^2 \psi = \zeta,
! \psi = const. at boundaries.
! 粘着条件
! \DP{\psi}{y} = 0 at boundaries
! 応力なし条件
! \DP[2]{\psi}{y} = 0 at boundaries
real(8), dimension(-km:km,0:jm),intent(in) :: ey
! 入力渦度分布
real(8), dimension(-km:km,0:jm) :: ey_Vor2Strm_ey
! 出力流線分布
real(8), dimension(2), intent(in), optional :: values
! 流線境界値. 境界で一定なので波数 0 成分のみ
! 省略時は 0.
character(len=2), intent(in), optional :: cond
! 境界条件スイッチ. 省略時は 'RR'
! RR : 両端粘着条件
! RF,FR : 粘着/応力なし条件
! FF : 両端応力なし条件
! 渦度 \zeta を与えて流線 \psi を求める.
! \nabla^2 \psi = \zeta,
! \psi = const. at boundaries.
! 粘着条件
! \DP{\psi}{y} = 0 at boundaries
! 応力なし条件
! \DP[2]{\psi}{y} = 0 at boundaries
!
! l=0,1,lm-1,lm 成分の式の代わりに境界条件を与える.
! 渦度の低次成分を無視することは
! \nabla^4 \psi = \zeta^2 を解いていることに相当.
! 4 階の微分方程式にすることで境界条件の数とつじつまがあう.
real(8), dimension(-km:km,0:lm),intent(in) :: et
real(8), dimension(-km:km,0:lm) :: et_Vor2Strm_et
! 流線境界値. 境界で一定なので波数 0 成分のみ
real(8), dimension(2), intent(in), optional :: values
! 境界条件スイッチ
logical, dimension(2), intent(in), optional :: rigid
! 渦度 \zeta を与えて流線 \psi を求める.
! \nabla^2 \psi = \zeta,
! \psi = const. at boundaries.
! 粘着条件
! \DP{\psi}{y} = 0 at boundaries
! 応力なし条件
! \DP[2]{\psi}{y} = 0 at boundaries
!
! \nabla^4 \psi = \nabla^2\zeta を解く
! 4 階の微分方程式にすることで境界条件の数とつじつまがあう.
real(8), dimension(-km:km,0:lm),intent(in) :: et
real(8), dimension(-km:km,0:lm) :: et_Vor2Strm1_et
! 流線境界値. 境界で一定なので波数 0 成分のみ
real(8), dimension(2), intent(in), optional :: values
! 境界条件スイッチ
logical, dimension(2), intent(in), optional :: rigid