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