SlideShare a Scribd company logo
第11回 数値流体力学への応用
(支配方程式,CPUプログラム)
長岡技術科学大学 電気電子情報工学専攻 出川智啓
今回の内容
2015/06/25先端GPGPUシミュレーション工学特論2
 支配方程式
 Taylor‐Green渦
 Cavity流れ
数値流体力学
2015/06/25先端GPGPUシミュレーション工学特論3
 数値計算を利用して,流体の挙動を計算
 Computational Fluid Dynamics(略してCFD)
 計算機の性能向上に伴い,必要不可欠な設計ツー
ルとなっている
 流体を取り扱う機器の性能評価
 流体中を移動する物体が受ける抵抗の評価など
 提案された当初はCOLORFUL Fluid Dynamicsと
揶揄されていた
支配方程式
2015/06/25先端GPGPUシミュレーション工学特論4
 2次元直交(x–y)座標系
 x方向速度をu, y方向速度をvと記述
 非圧縮性流れ
 流体の密度が変化しない
 水は圧縮性
 一般にマッハ0.3以下では非圧縮と見なす
 粘性流れ
 流体の粘り気により運動が妨げられる
支配方程式
2015/06/25先端GPGPUシミュレーション工学特論5
 連続の式およびNavier‐Stokes方程式
 質量と運動量の保存式に対応
 運動エネルギの保存は運動量保存式が兼ねる
 x, y方向速度u, v,圧力pの3変数を連立
0





y
v
x
u

























































2
2
2
2
2
2
2
2
1
1
y
v
x
v
y
p
y
v
v
x
v
u
t
v
y
u
x
u
x
p
y
u
v
x
u
u
t
u




連続の式
(質量保存式)
Navier‐Stokes方程式
(運動量保存式)
支配方程式
2015/06/25先端GPGPUシミュレーション工学特論6
 Navier‐Stokes方程式の回転を計算
 vに関する式をxで偏微分した式から,uに関する式をyで偏微
分した式を引く
 時間,空間的に連続であることを考慮して微分の順序を交換
 密度一定のため衝撃波のような不連続は発生しない







































































2
2
2
2
2
2
2
2
1
1
y
u
x
u
x
p
y
u
v
x
u
u
t
u
y
y
v
x
v
y
p
y
v
v
x
v
u
t
v
x




支配方程式
2015/06/25先端GPGPUシミュレーション工学特論7
 渦度(Vorticity)
 流体粒子の回転
 流れ関数(Streamfunction)
 二つの流れ関数の等高線(流線)間を通過する流量
y
u
x
v






v
x
u
y









x
v


y
u



1
2
v
x





y
u




支配方程式
2015/06/25先端GPGPUシミュレーション工学特論8
 渦度方程式
 渦度の移流・拡散方程式
 流れ関数のPoisson方程式
 流れ関数の定義式を渦度の定義式に代入
 変数の数が流れ関数,渦度の2個に低減






















2
2
2
2
yxy
v
x
u
t











2
2
2
2
yx




























yyxxy
u
x
v 

渦度の移流 渦度の拡散
計算手順
2015/06/25先端GPGPUシミュレーション工学特論9
1. 渦度方程式を計算して渦度を求める
2. 渦度を基に流れ関数のPoisson方程式を解いて
流れ関数を求める
3. 流れ関数の定義式から速度を求める
4. 1に戻って計算を繰り返す
渦度方程式の離散化
2015/06/25先端GPGPUシミュレーション工学特論10
 時間に前進差分,空間に中心差分を適用







 











2
1,,1,
2
,1,,1
1,1,
,
,1,1
,
,
1
,
22
22
ΔyΔx
Δy
v
Δx
u
Δt
n
ji
n
ji
n
ji
n
ji
n
ji
n
ji
n
ji
n
jin
ji
n
ji
n
jin
ji
n
ji
n
ji


















 










 





2
1,,1,
2
,1,,1
1,1,
,
,1,1
,,
1
,
22
22
ΔyΔx
Δt
Δy
v
Δx
uΔt
n
ji
n
ji
n
ji
n
ji
n
ji
n
ji
n
ji
n
jin
ji
n
ji
n
jin
ji
n
ji
n
ji




流れ関数のPoisson方程式の離散化
2015/06/25先端GPGPUシミュレーション工学特論11
 中心差分による離散化
 時刻n+1における流れ関数と渦度の関係
 流れ関数の定義式の離散化
1
,2
1
1,
1
,
1
1,
2
1
,1
1
,
1
,1 22 











 n
ji
n
ji
n
ji
n
ji
n
ji
n
ji
n
ji
ΔyΔx


Δx
v
Δy
u
n
ji
n
jin
ji
n
ji
n
jin
ji
2
2
1
,1
1
,11
,
1
1,
1
1,1
,














計算条件
2015/06/25先端GPGPUシミュレーション工学特論12
 Taylor‐Green渦
 セル状の渦が流体の粘性によ
り減衰
 移流と圧力勾配が釣り合うた
め,粘性の影響しか現れない
 計算条件
 拡散方程式の安定条件を満た
すように諸条件を設定
 境界条件
 流れ関数,渦度とも0
2
2
計算条件
2015/06/25先端GPGPUシミュレーション工学特論13
 Taylor‐Green渦
 セル状の渦が流体の粘性によ
り減衰
 移流と圧力勾配が釣り合うた
め,粘性の影響しか現れない
 計算条件
 拡散方程式の安定条件を満た
すように諸条件を設定
 境界条件
 流れ関数,渦度とも0
2
2

2−2
yxsinsin2
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define Lx  (2.0*M_PI)
#define Ly  (2.0*M_PI)
#define Nx  101
#define Ny  Nx
#define Nbytes (Nx*Ny*sizeof(double))
#define dx  (Lx/(Nx‐1))
#define dy  (Ly/(Ny‐1))
#define Kvisc (0.1)
#define dx2  (dx*2.0)
#define dy2  (dy*2.0)
#define dxdx (dx*dx)
#define dydy (dy*dy)
#define dxdxdydy (dxdx*dydy)
#define dxdy2 (2.0*(dxdx+dydy))
#define dt (0.01)
#define Nt (int)(1.0/dt)
#define ERR_TOL 1e‐12
#define Accel 1.7
パラメータ設定
2015/06/25先端GPGPUシミュレーション工学特論14
taylor_green.c
int main(void){
double *vrtx[2],*stmf,*u,*v;
int curr=0,next=1;
vrtx[curr] = (double *)malloc(Nbytes);
stmf = (double *)malloc(Nbytes);
u          = (double *)malloc(Nbytes);
v          = (double *)malloc(Nbytes);
vrtx[next] = (double *)malloc(Nbytes);
//Poisson方程式を満たす初期状態を計算
init(vrtx[curr],stmf,u,v,vrtx[next]);
computeStreamfunction_rbsor
(stmf,vrtx[curr]);//流れ関数
computeVelocity(stmf,u,v);      //速度
//時間積分
for(int n=1;n<=Nt;n++){
//渦度の計算
computeVorticity
(vrtx[curr],stmf,u,v,vrtx[next]);
//流れ関数の計算
computeStreamfunction_rbsor
(stmf,vrtx[next]);
//速度の計算
computeVelocity(stmf,u,v);
curr = next; next = 1‐curr;
}
free(vrtx[curr]);
free(stmf);
free(u);
free(v);
free(vrtx[next]);
return 0;
}
メイン
2015/06/25先端GPGPUシミュレーション工学特論15
taylor_green.c
void init(double *vrtx, double *stmf, double *u, double *v, double *vrtx_next){
int i,j;
for(j=0;j<Ny;j++){
for(i=0;i<Nx;i++){
double x = (double)i*dx;
double y = (double)j*dy;
vrtx[i+Nx*j] = 2.0*sin(2.0*M_PI*x/Lx)*sin(2.0*M_PI*y/Ly);
stmf[i+Nx*j] = 0.0;
v[i+Nx*j] = 0.0;
u[i+Nx*j] = 0.0;
vrtx_next[i+Nx*j] = 0.0;
}
}
}
初期化
2015/06/25先端GPGPUシミュレーション工学特論16
taylor_green.c
void computeVorticity
(double *vrtx, double *stmf, double *u, double *v,double *vrtx_next){
int i,j;
int ij,im1j,ip1j,ijm1,ijp1;
double conv,visc;
for(j=1;j<Ny‐1;j++)
for(i=1;i<Nx‐1;i++){
ij = i +Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ijm1 = i +Nx*(j‐1);
ijp1 = i +Nx*(j+1);
//移流項の計算
conv = u[ij]*(vrtx[ip1j]‐vrtx[im1j])/dx2 + v[ij]*(vrtx[ijp1]‐vrtx[ijm1])/dy2;
//粘性項の計算
visc = Kvisc*( (vrtx[im1j]‐2.0*vrtx[ij]+vrtx[ip1j])/dxdx
+(vrtx[ijm1]‐2.0*vrtx[ij]+vrtx[ijp1])/dydy);
//時間積分
vrtx_next[ij] = vrtx[ij] + dt*(‐conv+visc);
}
}
渦度方程式の計算(時間積分)
2015/06/25先端GPGPUシミュレーション工学特論17
taylor_green.c
void computeStreamfunction_rbsor
(double *stmf, double *vrtx){
int ite_SOR=0;
double err_n,err_d,err_relative;
double d_s;
int ij,ip1j,im1j,ijm1,ijp1;
do{
err_n = 0.0;
err_d = 0.0;
for(int j=1;j<Ny‐1;j++){
for(int i=1+j%2;i<Nx‐1;i+=2){
ij = i+Nx*j;
ip1j = (i+1)+Nx*(j  );
im1j = (i‐1)+Nx*(j  );
ijp1 = (i )+Nx*(j+1);
ijm1 = (i )+Nx*(j‐1);
d_s =( (stmf[im1j]+stmf[ip1j])/dxdx
+(stmf[ijm1]+stmf[ijp1])/dydy
‐(‐vrtx[ij])
//右辺が‐ωなのでマイナス付き
)*dxdxdydy/dxdy2 ‐stmf[ij];
stmf[ij] += Accel*d_s;
err_n += d_s*d_s;
err_d += stmf[ij]*stmf[ij];
}
}
流れ関数の計算(RB-SOR法)
2015/06/25先端GPGPUシミュレーション工学特論18
taylor_green.c
for(int j=1;j<Ny‐1;j++){
for(int i=2‐j%2;i<Nx‐1;i+=2){
ij = i+Nx*j;
ip1j = (i+1)+Nx*(j  );
im1j = (i‐1)+Nx*(j  );
ijp1 = (i )+Nx*(j+1);
ijm1 = (i )+Nx*(j‐1);
d_s =( (stmf[im1j]+stmf[ip1j])/dxdx
+(stmf[ijm1]+stmf[ijp1])/dydy
‐(‐vrtx[ij])
//右辺が‐ωなのでマイナス付き
)*dxdxdydy/dxdy2 ‐stmf[ij];
stmf[ij] += Accel*d_s;
err_n += d_s*d_s;
err_d += stmf[ij]*stmf[ij];
}
}
if(err_d<1e‐20)err_d=1.0;
err_relative = sqrt(err_n/err_d);
ite_SOR++;
}while(err_relative > ERR_TOL);
}
流れ関数の計算(RB-SOR法)
2015/06/25先端GPGPUシミュレーション工学特論19
taylor_green.c
void computeStreamfunction_cg
(double *stmf, double *vrtx){
double err;
int ij,ip1j,im1j,ijm1,ijp1;
double *p,*r,*Ap;
double alph,beta,rr,pAp,bb;
p  = (double *)malloc(Nbytes);
r  = (double *)malloc(Nbytes);
Ap = (double *)malloc(Nbytes);
for(int j=0;j<Ny;j++)
for(int i=0;i<Nx;i++){
ij = i+Nx*j;
p [ij] = 0.0;
r [ij] = 0.0;
Ap[ij] = 0.0;
}
alph=0.0;
beta=0.0;
bb = 0.0;
rr = 0.0;
for(int j=1;j<Ny‐1;j++)
for(int i=1;i<Nx‐1;i++){
ij = i+Nx*j;
ip1j = (i+1)+Nx*(j  );
im1j = (i‐1)+Nx*(j  );
ijp1 = (i )+Nx*(j+1);
ijm1 = (i )+Nx*(j‐1);
r[ij] = ‐vrtx[ij]//右辺が‐ωなのでマイナス付き
‐( (stmf[im1j]‐2*stmf[ij]+stmf[ip1j])/dxdx
+(stmf[ijm1]‐2*stmf[ij]+stmf[ijp1])/dydy);
rr += r[ij]*r[ij];
bb += vrtx[ij]*vrtx[ij];
}
流れ関数の計算(共役勾配法)
2015/06/25先端GPGPUシミュレーション工学特論20
taylor_green.c
do{
for(int j=0;j<Ny;j++)
for(int i=0;i<Nx;i++){
ij = i+Nx*j;
p [ij] = r[ij] + beta*p[ij];
}
pAp = 0.0;
for(int j=1;j<Ny‐1;j++)
for(int i=1;i<Nx‐1;i++){
ij = i+Nx*j;
ip1j = (i+1)+Nx*(j  );
im1j = (i‐1)+Nx*(j  );
ijp1 = (i )+Nx*(j+1);
ijm1 = (i )+Nx*(j‐1);
Ap[ij] = (p[im1j]‐2*p[ij]+p[ip1j])/dxdx
+(p[ijm1]‐2*p[ij]+p[ijp1])/dydy;
pAp += p[ij]*Ap[ij];
}
alph = rr/pAp;
rr = 0.0;
for(int j=0;j<Ny;j++)
for(int i=0;i<Nx;i++){
ij = i+Nx*j;
stmf[ij] = stmf[ij] + alph* p[ij];
r   [ij] = r   [ij] ‐ alph*Ap[ij];
rr += r[ij]*r[ij];
}
err = sqrt(rr/bb);
beta = rr/(alph*pAp);
}while(err > ERR_TOL);
free(r);
free(p);
free(Ap);
}
流れ関数の計算(共役勾配法)
2015/06/25先端GPGPUシミュレーション工学特論21
taylor_green.c
void computeVelocity
(double *stmf, double *u, double *v){
int i,j;
int ij,im1j,ip1j,ijm1,ijp1;
int im2j,ip2j,ijm2,ijp2;
//計算領域内部
for(j=1;j<Ny‐1;j++)
for(i=1;i<Nx‐1;i++){
ij = i +Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ijm1 = i +Nx*(j‐1);
ijp1 = i +Nx*(j+1);
u[ij] = (stmf[ijp1]‐stmf[ijm1])/dy2;
v[ij] =‐(stmf[ip1j]‐stmf[im1j])/dx2;
}
//下境界
j=0;
for(i=1;i<Nx‐1;i++){
ij = i +Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ijp1 = i +Nx*(j+1);
ijp2 = i +Nx*(j+2);
u[ij] = (‐3.0*stmf[ij]+4.0*stmf[ijp1]
‐stmf[ijp2])/dy2;
v[ij] =‐(stmf[ip1j]‐stmf[im1j])/dx2;
}
//上境界
j=Ny‐1;
for(i=1;i<Nx‐1;i++){
ij = i +Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ijm1 = i +Nx*(j‐1);
ijm2 = i +Nx*(j‐2);
u[ij] = ( 3.0*stmf[ij]‐4.0*stmf[ijm1]
+stmf[ijm2])/dy2;
v[ij] =‐(stmf[ip1j]‐stmf[im1j])/dx2;
}
プログラム(速度の計算)
2015/06/25先端GPGPUシミュレーション工学特論22
taylor_green.c
for(j=1;j<Ny‐1;j++){
//左境界
i=0;
ij = i +Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ip2j = i+2+Nx*j;
ijp1 = i +Nx*(j+1);
ijm1 = i +Nx*(j‐1);
u[ij] = (stmf[ijp1]‐stmf[ijm1])/dy2;
v[ij] =‐(‐3.0*stmf[ij]+4.0*stmf[ip1j]
‐stmf[ip2j])/dx2;
//右境界
i=Nx‐1;
ij = i +Nx*j;
im2j = i‐2+Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ijp1 = i +Nx*(j+1);
ijm1 = i +Nx*(j‐1);
u[ij] = (stmf[ijp1]‐stmf[ijm1])/dy2;
v[ij] =‐( 3.0*stmf[ij]‐4.0*stmf[im1j]
+stmf[im2j])/dx2;
}
//左下角
i=0   ;j=0;
ij = i +Nx*j;
ip1j = i+1+Nx*j;
ip2j = i+2+Nx*j;
ijp1 = i +Nx*(j+1);
ijp2 = i +Nx*(j+2);
u[ij] = (‐3.0*stmf[ij]+4.0*stmf[ijp1]
‐stmf[ijp2])/dy2;
v[ij] =‐(‐3.0*stmf[ij]+4.0*stmf[ip1j]
‐stmf[ip2j])/dx2;
プログラム(速度の計算)
2015/06/25先端GPGPUシミュレーション工学特論23
taylor_green.c
//右下角
i=Nx‐1;j=0;
ij = i +Nx*j;
im2j = i‐2+Nx*j;
im1j = i‐1+Nx*j;
ijp1 = i +Nx*(j+1);
ijp2 = i +Nx*(j+2);
u[ij] = (‐3.0*stmf[ij]+4.0*stmf[ijp1]
‐stmf[ijp2])/dy2;
v[ij] =‐( 3.0*stmf[ij]‐4.0*stmf[im1j]
+stmf[im2j])/dx2;
//左上角
i=0   ;j=Ny‐1;
ij = i +Nx*j;
ip1j = i+1+Nx*j;
ip2j = i+2+Nx*j;
ijm1 = i +Nx*(j‐1);
ijm2 = i +Nx*(j‐2);
u[ij] = ( 3.0*stmf[ij]‐4.0*stmf[ijm1]
+stmf[ijm2])/dy2;
v[ij] =‐(‐3.0*stmf[ij]+4.0*stmf[ip1j]
‐stmf[ip2j])/dx2;
//右上角
i=Nx‐1;j=Ny‐1;
ij = i +Nx*j;
im2j = i‐2+Nx*j;
im1j = i‐1+Nx*j;
ijm1 = i +Nx*(j‐1);
ijm2 = i +Nx*(j‐2);
u[ij] = ( 3.0*stmf[ij]‐4.0*stmf[ijm1]
+stmf[ijm2])/dy2;
v[ij] =‐( 3.0*stmf[ij]‐4.0*stmf[im1j]
+stmf[im2j])/dx2;
}
プログラム(速度の計算)
2015/06/25先端GPGPUシミュレーション工学特論24
taylor_green.c
速度の計算
2015/06/25先端GPGPUシミュレーション工学特論25
 計算する位置に応じて差分に使う点が変化
 計算領域内はx, y方向とも中心差分
for(j=1;j<Ny‐1;j++)
for(i=1;i<Nx‐1;i++){
ij = i +Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ijm1 = i +Nx*(j‐1);
ijp1 = i +Nx*(j+1);
u[ij] = (stmf[ijp1]‐stmf[ijm1])/dy2;
v[ij] =‐(stmf[ip1j]‐stmf[im1j])/dx2;
}
速度の計算
2015/06/25先端GPGPUシミュレーション工学特論26
 計算する位置に応じて差分に使う点が変化
 下方向の境界
 x方向は中心差分
 y方向は片側差分(j+1,j+2を参照)
j=0;
for(i=1;i<Nx‐1;i++){
ij = i +Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ijp1 = i +Nx*(j+1);
ijp2 = i +Nx*(j+2);
u[ij] = (‐3.0*stmf[ij]+4.0*stmf[ijp1]
‐stmf[ijp2])/dy2;
v[ij] =‐(stmf[ip1j]‐stmf[im1j])/dx2;
}
速度の計算
2015/06/25先端GPGPUシミュレーション工学特論27
 計算する位置に応じて差分に使う点が変化
 上方向の境界
 x方向は中心差分
 y方向は片側差分(j‐1,j‐2を参照)
j=Ny‐1;
for(i=1;i<Nx‐1;i++){
ij = i +Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ijm1 = i +Nx*(j‐1);
ijm2 = i +Nx*(j‐2);
u[ij] = ( 3.0*stmf[ij]‐4.0*stmf[ijm1]
+stmf[ijm2])/dy2;
v[ij] =‐(stmf[ip1j]‐stmf[im1j])/dx2;
}
速度の計算
2015/06/25先端GPGPUシミュレーション工学特論28
 計算する位置に応じて差分に使う点が変化
 左方向の境界
 x方向は片側差分(i+1,i+2を参照)
 y方向は中心差分
for(j=1;j<Ny‐1;j++){
i=0;
ij = i +Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ip2j = i+2+Nx*j;
ijp1 = i +Nx*(j+1);
ijm1 = i +Nx*(j‐1);
u[ij] = (stmf[ijp1]‐stmf[ijm1])/dy2;
v[ij] =‐(‐3.0*stmf[ij]+4.0*stmf[ip1j]
‐stmf[ip2j])/dx2;
}
速度の計算
2015/06/25先端GPGPUシミュレーション工学特論29
 計算する位置に応じて差分に使う点が変化
 右方向の境界
 x方向は片側差分(i‐1,i‐2を参照)
 y方向は中心差分
for(j=1;j<Ny‐1;j++){
i=Nx‐1;
ij = i +Nx*j;
im2j = i‐2+Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ijp1 = i +Nx*(j+1);
ijm1 = i +Nx*(j‐1);
u[ij] = (stmf[ijp1]‐stmf[ijm1])/dy2;
v[ij] =‐( 3.0*stmf[ij]‐4.0*stmf[im1j]
+stmf[im2j])/dx2;
}
速度の計算
2015/06/25先端GPGPUシミュレーション工学特論30
 計算する位置に応じて差分に使う点が変化
 左下の境界
 x方向は片側差分(i+1,i+2を参照)
 y方向は片側差分(j+1,j+2を参照)
i=0   ;j=0;
ij = i +Nx*j;
ip1j = i+1+Nx*j;
ip2j = i+2+Nx*j;
ijp1 = i +Nx*(j+1);
ijp2 = i +Nx*(j+2);
u[ij] = (‐3.0*stmf[ij]+4.0*stmf[ijp1]
‐stmf[ijp2])/dy2;
v[ij] =‐(‐3.0*stmf[ij]+4.0*stmf[ip1j]
‐stmf[ip2j])/dx2;
速度の計算
2015/06/25先端GPGPUシミュレーション工学特論31
 計算する位置に応じて差分に使う点が変化
 右下の境界
 x方向は片側差分(i‐1,i‐2を参照)
 y方向は片側差分(j+1,j+2を参照)
i=Nx‐1;j=0;
ij = i +Nx*j;
im2j = i‐2+Nx*j;
im1j = i‐1+Nx*j;
ijp1 = i +Nx*(j+1);
ijp2 = i +Nx*(j+2);
u[ij] = (‐3.0*stmf[ij]+4.0*stmf[ijp1]
‐stmf[ijp2])/dy2;
v[ij] =‐( 3.0*stmf[ij]‐4.0*stmf[im1j]
+stmf[im2j])/dx2;
速度の計算
2015/06/25先端GPGPUシミュレーション工学特論32
 計算する位置に応じて差分に使う点が変化
 左上の境界
 x方向は片側差分(i+1,i+2を参照)
 y方向は片側差分(j‐1,j‐2を参照)
i=0   ;j=Ny‐1;
ij = i +Nx*j;
ip1j = i+1+Nx*j;
ip2j = i+2+Nx*j;
ijm1 = i +Nx*(j‐1);
ijm2 = i +Nx*(j‐2);
u[ij] = ( 3.0*stmf[ij]‐4.0*stmf[ijm1]
+stmf[ijm2])/dy2;
v[ij] =‐(‐3.0*stmf[ij]+4.0*stmf[ip1j]
‐stmf[ip2j])/dx2;
速度の計算
2015/06/25先端GPGPUシミュレーション工学特論33
 計算する位置に応じて差分に使う点が変化
 右上の境界
 x方向は片側差分(i‐1,i‐2を参照)
 y方向は片側差分(j‐1,j‐2を参照)
i=Nx‐1;j=Ny‐1;
ij = i +Nx*j;
im2j = i‐2+Nx*j;
im1j = i‐1+Nx*j;
ijm1 = i +Nx*(j‐1);
ijm2 = i +Nx*(j‐2);
u[ij] = ( 3.0*stmf[ij]‐4.0*stmf[ijm1]
+stmf[ijm2])/dy2;
v[ij] =‐( 3.0*stmf[ij]‐4.0*stmf[im1j]
+stmf[im2j])/dx2;
計算結果
2015/06/25先端GPGPUシミュレーション工学特論34
流れ関数 渦度 速度(u, v)
計算結果(流れ関数)
2015/06/25先端GPGPUシミュレーション工学特論35
t=0 t=0.1 t=0.2
t=0.4 t=0.5 t=0.6
t=0.8 t=0.9 t=1.0
t=0.3
t=0.7
計算結果(渦度)
2015/06/25先端GPGPUシミュレーション工学特論36
t=0 t=0.1 t=0.2
t=0.4 t=0.5 t=0.6
t=0.8 t=0.9 t=1.0
t=0.3
t=0.7
計算結果(速度)
2015/06/25先端GPGPUシミュレーション工学特論37
t=0 t=0.1 t=0.2
t=0.4 t=0.5 t=0.6
t=0.8 t=0.9 t=1.0
t=0.3
t=0.7
計算条件
2015/06/25先端GPGPUシミュレーション工学特論38
 2次元正方キャビティ流れ
 正方形断面のくぼみに水が満
たされている
 くぼみにフタが置かれ,フタが
一定速度Uで移動
 計算条件
 レイノルズ数:Re=UL/=1000
 計算時間間隔: Ut/x=0.1
 計算時間:Ut/L=200まで
L
U
L
境界条件
2015/06/25先端GPGPUシミュレーション工学特論39
 流れ関数
 流れ関数の定義式から計算
 全ての壁上で=const.(一定値として0を採用)
0


 v
x

0


 v
x

0


u
y

0


u
y

より=const.
より=const.
より=const.
より=const.
境界条件
2015/06/25先端GPGPUシミュレーション工学特論40
 渦度
 流れ関数の定義式と流れ関数のPoisson方程式から計算








2
2
2
2
yx 2
2
x




,
2
2
1
,1
1
,
1
,11
,
Δx
n
ji
n
ji
n
jin
ji







 0
2
1
,1
1
,11
, 






Δx
v
n
ji
n
jin
ji

1
,1
1
,1



  n
ji
n
ji 
側壁面の境界条件
壁面上で=0より
離散化されたPoisson方程式と流れ関数の定義式を連立すると
0
Right Wallon
Left Wallon
2
2
21
,1
21
,1
1
,
Δx
Δx
n
ji
n
ji
n
ji









1
,
n
ji
1
,1


n
ji
1
,1


n
ji
1
,
n
ji
Δx
境界条件
2015/06/25先端GPGPUシミュレーション工学特論41
 渦度
 流れ関数の定義式と流れ関数のPoisson方程式から計算








2
2
2
2
yx
2
2
y




,
2
2
1
1,
1
,
1
1,1
,
Δy
n
ji
n
ji
n
jin
ji







 0
2
1
1,
1
1,1
, 






Δy
u
n
ji
n
jin
ji

1
1,
1
1,



  n
ji
n
ji 
下壁面の境界条件
壁面上で=0より
離散化されたPoisson方程式と流れ関数の定義式を連立すると
0
WallBottomon2 21
1,
1
, Δyn
ji
n
ji



 
1
,
n
ji
1
1,


n
ji
Δy
境界条件
2015/06/25先端GPGPUシミュレーション工学特論42
 渦度
 流れ関数の定義式と流れ関数のPoisson方程式から計算








2
2
2
2
yx
2
2
y




,
2
2
1
1,
1
,
1
1,1
,
Δy
n
ji
n
ji
n
jin
ji







 U
Δy
u
n
ji
n
jin
ji 






2
1
1,
1
1,1
,

1
1,
1
1, 2 


  n
ji
n
ji ΔyU 
上壁面の境界条件
壁面上で=0より
離散化されたPoisson方程式と流れ関数の定義式を連立すると
0
  WallTopon2 21
1,
1
, ΔyΔyUn
ji
n
ji  



1
,
n
ji
1
1,


n
ji
Δy
U
境界条件
2015/06/25先端GPGPUシミュレーション工学特論43
21
1,
1
,
1
,
2
0
Δyn
ji
n
ji
n
ji








21
,1
1
,
1
,
2
0
Δxn
ji
n
ji
n
ji








21
,1
1
,
1
,
2
0
Δxn
ji
n
ji
n
ji








  21
1,
1
,
1
,
2
0
ΔyΔyUn
ji
n
ji
n
ji








#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define Re 1000 //レイノルズ数
#define Lx  0.01  //溝の幅(=高さ)
#define Ly  Lx
#define Uwall 0.1 //移動壁の速度
#define Kvisc (Lx*Uwall/Re)
#define Nx  81
#define Ny  Nx
#define Nbytes (Nx*Ny*sizeof(double))
#define dx  (Lx/(Nx‐1))
#define dy  (Ly/(Ny‐1))
#define dx2  (dx*2.0)
#define dy2  (dy*2.0)
#define dxdx (dx*dx)
#define dydy (dy*dy)
#define dxdxdydy (dxdx*dydy)
#define dxdy2 (2.0*(dxdx+dydy))
#define ndt (0.1)         //CFL条件
#define dt (ndt*dx/Uwall) //時間刻み
#define endnT (100.0)     //終了時間(無次元)
#define Nt (int)(endnT/dt*Lx/Uwall)
#define ERR_TOL 1e‐12
#define Accel 1.7
パラメータ設定
2015/06/25先端GPGPUシミュレーション工学特論44
cavity.c
void init(double *vrtx, double *stmf, double *u, double *v, double *vrtx_next){
int i,j;
for(j=0;j<Ny;j++)
for(i=0;i<Nx;i++){
double x = (double)i*dx;
double y = (double)j*dy;
vrtx[i+Nx*j] = 0.0;
stmf[i+Nx*j] = 0.0;
v[i+Nx*j] = 0.0;
u[i+Nx*j] = 0.0;
vrtx_next[i+Nx*j] = 0.0;
}
//速度の境界条件.上壁面に速度Uwallを与える
j=Ny‐1;
for(i=0;i<Nx;i++){
u[i+Nx*j] = Uwall;
}
}
初期化
2015/06/25先端GPGPUシミュレーション工学特論45
cavity.c
void computeVorticity
(double *vrtx, double *stmf, double *u, double *v,double *vrtx_next){
int i,j;
int ij,im1j,ip1j,ijm1,ijp1;
double conv,visc;
for(j=1;j<Ny‐1;j++){
//左壁面
i=0;
ij = i +Nx*j;
ip1j = i+1+Nx*j;
vrtx[ij] = ‐2.0*stmf[ip1j]/dxdx;
vrtx_next[ij] = vrtx[ij];
//右壁面
i=Nx‐1;
ij = i +Nx*j;
im1j = i‐1+Nx*j;
vrtx[ij] = ‐2.0*stmf[im1j]/dxdx;
vrtx_next[ij] = vrtx[ij];
}
渦度方程式の計算(時間積分)
2015/06/25先端GPGPUシミュレーション工学特論46
21
,1
1
, 2 Δxn
ji
n
ji



 
21
,1
1
, 2 Δxn
ji
n
ji



 
cavity.c
//下壁面
j=0;
for(i=0;i<Nx;i++){
ij = i+Nx* j;
ijp1 = i+Nx*(j+1);
vrtx[ij] = ‐2.0*stmf[ijp1]/dydy;
vrtx_next[ij] = vrtx[ij];
}
//上壁面(移動壁)
j=Ny‐1;
for(i=0;i<Nx;i++){
ij = i+Nx* j;
ijm1 = i+Nx*(j‐1);
vrtx[ij] = ‐2.0*(stmf[ijm1]+Uwall*dy)/dydy;
vrtx_next[ij] = vrtx[ij];
}
渦度方程式の計算(時間積分)
2015/06/25先端GPGPUシミュレーション工学特論47
21
1,
1
, 2 Δyn
ji
n
ji



 
  21
1,
1
, 2 ΔyΔyUn
ji
n
ji  



U
cavity.c
//計算領域内部
for(j=1;j<Ny‐1;j++)
for(i=1;i<Nx‐1;i++){
ij = i +Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ijm1 = i +Nx*(j‐1);
ijp1 = i +Nx*(j+1);
//移流項を計算
conv = u[ij]*(vrtx[ip1j]‐vrtx[im1j])/dx2 + v[ij]*(vrtx[ijp1]‐vrtx[ijm1])/dy2;
//粘性項を計算
visc = Kvisc*( (vrtx[im1j]‐2.0*vrtx[ij]+vrtx[ip1j])/dxdx
+(vrtx[ijm1]‐2.0*vrtx[ij]+vrtx[ijp1])/dydy);
//時間積分
vrtx_next[ij] = vrtx[ij] + dt*(‐conv+visc);
}
}
渦度方程式の計算(時間積分)
2015/06/25先端GPGPUシミュレーション工学特論48
cavity.c
void computeVelocity(double *stmf, double *u, double *v){
int i,j;
int ij,im1j,ip1j,ijm1,ijp1;
int im2j,ip2j,ijm2,ijp2;
//境界条件は初期設定の際に設定済み
//壁の移動速度は時間で変化しないので何もしなくてよい
for(j=1;j<Ny‐1;j++)
for(i=1;i<Nx‐1;i++){
ij = i +Nx*j;
im1j = i‐1+Nx*j;
ip1j = i+1+Nx*j;
ijm1 = i +Nx*(j‐1);
ijp1 = i +Nx*(j+1);
u[ij] = (stmf[ijp1]‐stmf[ijm1])/dy2;
v[ij] =‐(stmf[ip1j]‐stmf[im1j])/dx2;
}
}
プログラム(速度の計算)
2015/06/25先端GPGPUシミュレーション工学特論49
cavity.c
計算結果
2015/06/25先端GPGPUシミュレーション工学特論50
流れ関数 渦度 速度(u, v)
計算結果(流れ関数)
2015/06/25先端GPGPUシミュレーション工学特論51
t=0 t=20 t=40
t=80 t=100 t=120
t=160 t=180 t=200
t=60
t=140
計算結果(渦度)
2015/06/25先端GPGPUシミュレーション工学特論52
t=0 t=20 t=40
t=80 t=100 t=120
t=160 t=180 t=200
t=60
t=140
計算結果(速度)
2015/06/25先端GPGPUシミュレーション工学特論53
t=0 t=20 t=40
t=80 t=100 t=120
t=160 t=180 t=200
t=60
t=140

More Related Content

PDF
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)
PDF
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)
PDF
2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念と メモリアクセス
PDF
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
PDF
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
PDF
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)
PDF
2015年度GPGPU実践プログラミング 第14回 N体問題
PDF
いまさら聞けない!CUDA高速化入門
2015年度先端GPGPUシミュレーション工学特論 第9回 偏微分方程式の差分計算 (移流方程式)
2015年度先端GPGPUシミュレーション工学特論 第10回 Poisson方程式の求解 (線形連立一次方程式)
2015年度先端GPGPUシミュレーション工学特論 第2回 GPUによる並列計算の概念と メモリアクセス
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)
2015年度GPGPU実践プログラミング 第14回 N体問題
いまさら聞けない!CUDA高速化入門

What's hot (20)

PPTX
Tensor コアを使った PyTorch の高速化
PPTX
[DL輪読会]PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metr...
PDF
GPGPU Seminar (GPGPU and CUDA Fortran)
PDF
高速な倍精度指数関数expの実装
PDF
【DL輪読会】Domain Generalization by Learning and Removing Domainspecific Features
PDF
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust)
PDF
2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細 (共有メモリ)
PDF
2015年度GPGPU実践プログラミング 第12回 偏微分方程式の差分計算
PPTX
大規模言語モデル開発を支える分散学習技術 - 東京工業大学横田理央研究室の藤井一喜さん
PDF
Icra2020 v2
PDF
2015年度GPGPU実践プログラミング 第7回 総和計算
PDF
第1回 配信講義 計算科学技術特論A (2021)
PDF
中3女子でもわかる constexpr
PPTX
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
PPTX
PILCO - 第一回高橋研究室モデルベース強化学習勉強会
PDF
分散型強化学習手法の最近の動向と分散計算フレームワークRayによる実装の試み
PDF
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)
PPTX
「機械学習:技術的負債の高利子クレジットカード」のまとめ
PDF
深層学習とベイズ統計
PDF
TVM の紹介
Tensor コアを使った PyTorch の高速化
[DL輪読会]PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metr...
GPGPU Seminar (GPGPU and CUDA Fortran)
高速な倍精度指数関数expの実装
【DL輪読会】Domain Generalization by Learning and Removing Domainspecific Features
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust)
2015年度先端GPGPUシミュレーション工学特論 第4回 GPUのメモリ階層の詳細 (共有メモリ)
2015年度GPGPU実践プログラミング 第12回 偏微分方程式の差分計算
大規模言語モデル開発を支える分散学習技術 - 東京工業大学横田理央研究室の藤井一喜さん
Icra2020 v2
2015年度GPGPU実践プログラミング 第7回 総和計算
第1回 配信講義 計算科学技術特論A (2021)
中3女子でもわかる constexpr
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
PILCO - 第一回高橋研究室モデルベース強化学習勉強会
分散型強化学習手法の最近の動向と分散計算フレームワークRayによる実装の試み
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)
「機械学習:技術的負債の高利子クレジットカード」のまとめ
深層学習とベイズ統計
TVM の紹介
Ad

Viewers also liked (20)

PDF
2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用 (高度な最適化)
PDF
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
PDF
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
PDF
気候モデル放射カーネルのGPUへの移植と高速化
PDF
2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史
PDF
2015年度GPGPU実践プログラミング 第11回 画像処理
PDF
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
PDF
2015年度GPGPU実践プログラミング 第13回 多粒子の運動
PDF
2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)
PDF
2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細 (threadとwarp)
PDF
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)
PDF
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
PDF
2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例
PDF
2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)
PDF
2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造
PDF
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
PDF
2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)
PDF
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
PDF
2015年度先端GPGPUシミュレーション工学特論 第1回補足 GPGPU教育計算機システムGROUSEの利用方法
PDF
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
2015年度先端GPGPUシミュレーション工学特論 第13回 数値流体力学への応用 (高度な最適化)
2015年度先端GPGPUシミュレーション工学特論 第14回 複数GPUの利用
2015年度先端GPGPUシミュレーション工学特論 第15回 CPUとGPUの協調
気候モデル放射カーネルのGPUへの移植と高速化
2015年度GPGPU実践基礎工学 第1回 学際的分野における先端シミュレーション技術の歴史
2015年度GPGPU実践プログラミング 第11回 画像処理
2015年度GPGPU実践基礎工学 第4回 CPUのアーキテクチャ
2015年度GPGPU実践プログラミング 第13回 多粒子の運動
2015年度GPGPU実践プログラミング 第10回 行列計算(行列-行列積の高度な最適化)
2015年度先端GPGPUシミュレーション工学特論 第3回 GPUプログラム構造の詳細 (threadとwarp)
2015年度先端GPGPUシミュレーション工学特論 第6回 プログラムの性能評価指針 (Flop/Byte,計算律速,メモリ律速)
2015年度GPGPU実践プログラミング 第8回 総和計算(高度な最適化)
2015年度GPGPU実践プログラミング 第1回 GPGPUの歴史と応用例
2015年度GPGPU実践基礎工学 第3回 GPUクラスタ上でのプログラミング(CUDA)
2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度先端GPGPUシミュレーション工学特論 第7回 総和計算(Atomic演算)
2015年度GPGPU実践プログラミング 第4回 GPUでの並列プログラミング(ベクトル和,移動平均,差分法)
2015年度先端GPGPUシミュレーション工学特論 第1回補足 GPGPU教育計算機システムGROUSEの利用方法
2015年度先端GPGPUシミュレーション工学特論 第1回 先端シミュレーションおよび産業界におけるGPUの役割
Ad

More from 智啓 出川 (15)

PDF
Fortranが拓く世界、VSCodeが架ける橋
PDF
Very helpful python code to find coefficients of the finite difference method
PDF
Why do we confuse String and Array of Characters in Fortran?
PDF
Pythonによる累乗近似
PDF
数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)
PDF
オブジェクト指向Fortranが拓く(はずだった)新しい世界
PPTX
Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...
PDF
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
PDF
GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS)
PDF
GPGPU Education at Nagaoka University of Technology: A Trial Run
PDF
Cuda fortranの利便性を高めるfortran言語の機能
PDF
PGI CUDA FortranとGPU最適化ライブラリの一連携法
PPTX
教育機関でのJetsonの活用の可能性
PDF
GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)
PDF
GPGPU Seminar (PyCUDA)
Fortranが拓く世界、VSCodeが架ける橋
Very helpful python code to find coefficients of the finite difference method
Why do we confuse String and Array of Characters in Fortran?
Pythonによる累乗近似
数値計算結果のPythonによる後処理について(1次元データのピーク値およびその位置の推定)
オブジェクト指向Fortranが拓く(はずだった)新しい世界
Schematic diagrams of GPUs' architecture and Time evolution of theoretical FL...
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
GPGPU Seminar (GPU Accelerated Libraries, 1 of 3, cuBLAS)
GPGPU Education at Nagaoka University of Technology: A Trial Run
Cuda fortranの利便性を高めるfortran言語の機能
PGI CUDA FortranとGPU最適化ライブラリの一連携法
教育機関でのJetsonの活用の可能性
GPGPU Seminar (Accelerataion of Lattice Boltzmann Method using CUDA Fortran)
GPGPU Seminar (PyCUDA)

2015年度先端GPGPUシミュレーション工学特論 第11回 数値流体力学への応用 (支配方程式,CPUプログラム)