ñ¨øö変üµÌõ数ªòéΤªÆ¡¢òÁÊÇñ¨øöì¤èâªÎͪߩªòªäªÃªÆªßªèª¦¡£
ñ¨øö変üµÌõ数ªòéΤªëªÈù»ªÎªèª¦ªÊÌ«íªâíªìªë¡£
参ÍÅ£º×µ体ͪߩªÈó¬ÝÂÛö¡¢ßÍê«・ùÁõ½îÊßö
x, yñ¨øöͧª«ªé×âßÌîܪʥî, ¥çñ¨øöͧªË칪·ªÆÍªß©ªòú¼ª¦¡£¥î, ¥çªÎñ¨øöͧªÇªÏ¡¢¥Ä¥î, ¥Ä¥çªÏ1ªÇª¢ªê¡¢òÁÞÌÊÇû¡ªÇª¢ªë¡£図3.20ªÎªèª¦ªË実ð·ªÎx, yñ¨øöͧªÇ¡¢(a)ªÎªèª¦ªËíªêơ¢ñ¨øö変üµÌõ数ªòéΤªëª³ªÈªÇ¡¢Íªß©内ªÇªÏ(b)ªÎªèª¦ªÊÌ«íªÇªÎͪߩªËªÊªë¡£変üµªÎÞÂÛ°ªÏÊÛ単ªÇª¢ªë¡£
2óêªñ¨øöͧªÎ1óø¶Ú°ÝÂÛ°ïïãÒªÎíÞùêªÏß¾ªÎãҪΪ誦ªË変üµª·ªÆª¢ª²ªëªÈª¤ª¤¡£ª³ª³ªÇ¡¢
ªÈ
ªÏÜÅ÷תËó¬Ýª·ªÆÏ´ªáªìªÐª¤ª¤¡£ ¥Ä¥î, ¥Ä¥çªÏ1¡£ª·ª«ª·¡¢
ªÏÏ´ªáªëù±é©ª¬ª¢ªë¡£Ï´ªáÛ°ªÏܬòµªÇÛժ롣£¨3óꪪÀªÈ9ªÄ£©
2óø¶Ú°ÝÂÛ°ïïãÒªÎíÞùêì¤ù»ªÎªèª¦ªË変üµª¹ªëª¬¡¢
ªÎªèª¦ªËªÞªÈªáªÆïÚ×⪷ª¿ªÛª¦ª¬¡¢ýªÇ楽ªËªÊªë¡£ªÞªÈªáª¿ªÈªªÎ¡¢ãÒªÏܬòµªÇÛժ롣
ªÈªªÎÏ´ªáªÊª±ªìªÐªÊªéªÊª¤変数ªÈª·ªÆªÏ¡¢
ªÎ2ªÄªÇª¢ªë¡££¨3óꪪÎíÞùêªÏ3ªÄ£©ª³ªÎ変数ªòÏ´ªáÛ°ªâܬòµªÇÛժ롣
ñ¼ëò£¡£¡ù±ªºí»ªéòµªÇªÞªÈªáªÆªßªëª³ªÈ¡£
ýªÏ¡¢Navier-StokesãÒªòñ¨øö変üµª·ªÆ¡¢ª½ªìªòÐѪުǪΪ誦ªËó¬ÝªÇͪߩª¹ªìªÐª¤ª¤¡£
2óꪪÎíÞùꡢϴªáªÊª¤ªÈª¤ª±ªÊª¤変数6ªÄªò໪ËÏ´ªáªë¡££¨n«ëー«×ªÎîñ£©
ì¤îñͪߩª·ª¿Î·内×µªìªÎC«³ー«Éª«ªéáóï᪹ªìªÐª¤ª¤¡£ì¤ù»ªÏáóï᪷ª¿«³ー«ÉªÇª¢ªë¡£
#include <iostream>
#include <fstream>
#include <cmath>
#include <time.h>
#include <cstdlib>
#include <cstring>
#include <stdio.h>
#include <omp.h>
using namespace std;
#define IMAX 100
#define JMAX 20
#define NMAX 500
#define dt 0.01
#define dx 0.1
#define dy 0.1
#define Re 100.0
int n = 0;
void initialization_values(double u0[][IMAX + 1],
double u[][IMAX + 1], double v0[][IMAX + 1], double v[][IMAX + 1], double
p0[][IMAX + 1], double rhs[][IMAX + 1],
double
x0[][IMAX + 1], double y0[][IMAX + 1], double us[][IMAX + 1], double vs[][IMAX
+ 1], double i0x[][IMAX + 1], double i0y[][IMAX + 1],
double
j0x[][IMAX + 1], double j0y[][IMAX + 1], double d2i[][IMAX + 1], double
d2j[][IMAX + 1]) {
int
i, j;
#pragma omp parallel for private(i)
for
(j = 0; j < JMAX + 1; j++) {
for
(i = 0; i < IMAX + 1; i++) {
u0[j][i]
= 0.0;
u[j][i]
= 0.0;
v0[j][i]
= 0.0;
v[j][i]
= 0.0;
p0[j][i]
= 0.0;
rhs[j][i]
= 0.0;
x0[j][i]
= 0.0;
y0[j][i]
= 0.0;
us[j][i]
= 0.0;
vs[j][i]
= 0.0;
i0x[j][i]
= 0.0;
i0y[j][i]
= 0.0;
j0x[j][i]
= 0.0;
j0y[j][i]
= 0.0;
d2i[j][i]
= 0.0;
d2j[j][i]
= 0.0;
}
}
}
void domain(double x0[][IMAX + 1], double y0[][IMAX +
1]) {
int
i, j;
#pragma omp parallel for private(i)
for
(j = 0; j < JMAX + 1; j++) {
for
(i = 0; i < IMAX + 1; i++) {
x0[j][i]
= dx * (double)i;
y0[j][i]
= dy * (double)j;
}
}
}
void change_domain_calculation(double x0[][IMAX + 1],
double y0[][IMAX + 1], double i0x[][IMAX + 1], double i0y[][IMAX + 1],
double
j0x[][IMAX + 1], double j0y[][IMAX + 1], double d2i[][IMAX + 1], double
d2j[][IMAX + 1]) {
double
J, kvx, kvy, x0i, y0i, x0j, y0j;
int
i, j;
#pragma omp parallel for private(i, J, kvx, kvy, x0i,
y0i, x0j, y0j)
for
(j = 1; j < JMAX; j++) {
for
(i = 1; i < IMAX; i++) {
x0i
= (-x0[j][i - 1] + x0[j][i + 1])*0.5;
y0i
= (-y0[j][i - 1] + y0[j][i + 1])*0.5;
x0j
= (-x0[j - 1][i] + x0[j + 1][i])*0.5;
y0j
= (-y0[j - 1][i] + y0[j + 1][i])*0.5;
J
= x0i * y0j - x0j * y0i;
i0x[j][i]
= y0j / J;
i0y[j][i]
= -x0j / J;
j0x[j][i]
= -y0i / J;
j0y[j][i]
= x0i / J;
kvx
= (i0x[j][i] * i0x[j][i] + i0y[j][i] * i0y[j][i])*(x0[j][i - 1] + x0[j][i + 1]
- 2.0 * x0[j][i])
+
(j0x[j][i] * j0x[j][i] + j0y[j][i] * j0y[j][i])*(x0[j - 1][i] + x0[j + 1][i] -
2.0 * x0[j][i])
+
2.0*(i0x[j][i] * j0x[j][i] + i0y[j][i] * j0y[j][i])*(x0[j - 1][i - 1] - x0[j -
1][i + 1] - x0[j + 1][i - 1] + x0[j + 1][i + 1])*0.25;
kvy
= (i0x[j][i] * i0x[j][i] + i0y[j][i] * i0y[j][i])*(y0[j][i - 1] + y0[j][i + 1]
- 2.0 * y0[j][i])
+
(j0x[j][i] * j0x[j][i] + j0y[j][i] * j0y[j][i])*(y0[j - 1][i] + y0[j + 1][i] -
2.0 * y0[j][i])
+
2.0*(i0x[j][i] * j0x[j][i] + i0y[j][i] * j0y[j][i])*(y0[j - 1][i - 1] - y0[j -
1][i + 1] - y0[j + 1][i - 1] + y0[j + 1][i + 1])*0.25;
d2i[j][i]
= (-kvx * y0j + kvy * x0j) / J;
d2j[j][i]
= (kvx * y0i - kvy * x0i) / J;
}
}
}
void initial_condition(double u0[][IMAX + 1], double
v0[][IMAX + 1]) {
int
i, j;
#pragma omp parallel for private(i)
for
(j = 0; j < JMAX + 1; j++) {
for
(i = 0; i < IMAX + 1; i++) {
u0[j][i]
= 1.0;
v0[j][i]
= 0.0;
}
}
}
void vel_boundary_condition(double u0[][IMAX + 1],
double v0[][IMAX + 1]) {
int
i, j;
#pragma omp parallel for
for
(i = 0; i < IMAX + 1; i++) {
u0[0][i]
= 0.0;
v0[0][i]
= 0.0;
u0[JMAX][i]
= 0.0;
v0[JMAX][i]
= 0.0;
}
#pragma omp parallel for
for
(j = 0; j < JMAX + 1; j++) {
u0[j][0]
= 1.0;
v0[j][0]
= 0.0;
u0[j][IMAX]
= u0[j][IMAX - 1];
v0[j][IMAX]
= v0[j][IMAX - 1];
}
}
void pre_boundary_condition(double p0[][IMAX + 1]) {
int
i, j;
#pragma omp parallel for
for
(i = 0; i < IMAX + 1; i++) {
p0[0][i]
= p0[1][i];
p0[JMAX][i]
= p0[JMAX - 1][i];
}
#pragma omp parallel for
for
(j = 0; j < JMAX + 1; j++) {
p0[j][0]
= 0.0;
p0[j][IMAX]
= p0[j][IMAX - 1];
}
}
void rhs_calculation(double u0[][IMAX + 1], double
v0[][IMAX + 1], double rhs[][IMAX + 1], double i0x[][IMAX + 1], double
i0y[][IMAX + 1],
double
j0x[][IMAX + 1], double j0y[][IMAX + 1]) {
double
umi1, vmi1, upi1, vpi1, umj1, vmj1, upj1, vpj1, ix, iy, jx, jy;
int
i, j;
#pragma omp parallel for private(i, umi1, vmi1, upi1,
vpi1, umj1, vmj1, upj1, vpj1, ix, iy, jx, jy)
for
(j = 1; j < JMAX; j++) {
for
(i = 1; i < IMAX; i++) {
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
umi1
= u0[j][i - 1];
vmi1
= v0[j][i - 1];
upi1
= u0[j][i + 1];
vpi1
= v0[j][i + 1];
umj1
= u0[j - 1][i];
vmj1
= v0[j - 1][i];
upj1
= u0[j + 1][i];
vpj1
= v0[j + 1][i];
rhs[j][i]
= ((-umi1 + upi1)*ix + (-umj1 + upj1)*jx + (-vmi1 + vpi1)*iy + (-vmj1 +
vpj1)*jy)*0.5 / dt
-
(((-umi1 + upi1)*ix + (-umj1 + upj1)*jx) * ((-umi1 + upi1)*ix + (-umj1 +
upj1)*jx))*0.25
-
(((-vmi1 + vpi1)*iy + (-vmj1 + vpj1)*jy) * ((-vmi1 + vpi1)*iy + (-vmj1 +
vpj1)*jy))*0.25
-
0.5 * (((-vmi1 + vpi1)*ix + (-vmj1 + vpj1)*jx) * ((-umi1 + upi1)*iy + (-umj1 +
upj1)*jy));
}
}
}
void pre_calculation(double p0[][IMAX + 1], double
rhs[][IMAX + 1], double i0x[][IMAX + 1], double i0y[][IMAX + 1],
double
j0x[][IMAX + 1], double j0y[][IMAX + 1], double d2i[][IMAX + 1], double
d2j[][IMAX + 1]) {
double
p000, pmi1, ppi1, pmj1, ppj1, pmm1, ppp1, pmp1, ppm1, ix, iy, jx, jy, di, dj,
SGM = 1.05;
int
i, j;
#pragma omp parallel for private(i,p000, pmi1, ppi1,
pmj1, ppj1, pmm1, ppp1, pmp1, ppm1, ix, iy, jx, jy, di, dj) firstprivate(SGM)
for
(j = 1; j < JMAX; j += 2) {
for
(i = 1; i < IMAX; i++) {
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
p000
= p0[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
pmm1
= p0[j - 1][i - 1];
ppp1
= p0[j + 1][i + 1];
pmp1
= p0[j - 1][i + 1];
ppm1
= p0[j + 1][i - 1];
p0[j][i]
= (
(ix
* ix + iy * iy)*(pmi1 + ppi1) + (jx * jx + jy * jy)*(pmj1 + ppj1)
+
2.0*(ix * jx + iy * jy)*(pmm1 - pmp1 - ppm1 + ppp1)
+
di * (-pmi1 + ppi1)*0.5 + dj * (-pmj1 + ppj1)*0.5
-
rhs[j][i]) / (2.0*(ix * ix + iy * iy + jx * jx + jy * jy));
p0[j][i]
= p000 + SGM * (p0[j][i] - p000);
}
}
#pragma omp parallel for private(i,p000, pmi1, ppi1,
pmj1, ppj1, pmm1, ppp1, pmp1, ppm1, ix, iy, jx, jy, di, dj) firstprivate(SGM)
for
(j = 2; j < JMAX; j += 2) {
for
(i = 1; i < IMAX; i++) {
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
p000
= p0[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
pmm1
= p0[j - 1][i - 1];
ppp1
= p0[j + 1][i + 1];
pmp1
= p0[j - 1][i + 1];
ppm1
= p0[j + 1][i - 1];
p0[j][i]
= (
(ix
* ix + iy * iy)*(pmi1 + ppi1) + (jx * jx + jy * jy)*(pmj1 + ppj1)
+
2.0*(ix * jx + iy * jy)*(pmm1 - pmp1 - ppm1 + ppp1)
+
di * (-pmi1 + ppi1)*0.5 + dj * (-pmj1 + ppj1)*0.5
-
rhs[j][i]) / (2.0*(ix * ix + iy * iy + jx * jx + jy * jy));
p0[j][i]
= p000 + SGM * (p0[j][i] - p000);
}
}
}
void vel_explicit_calculation(double u0[][IMAX + 1],
double u[][IMAX + 1], double v0[][IMAX + 1], double v[][IMAX + 1], double
p0[][IMAX + 1], double us[][IMAX + 1], double vs[][IMAX + 1],
double
i0x[][IMAX + 1], double i0y[][IMAX + 1], double j0x[][IMAX + 1], double
j0y[][IMAX + 1], double d2i[][IMAX + 1], double d2j[][IMAX + 1]) {
double
u000, umi1, upi1, umj1, upj1, umi2, upi2, umj2, upj2,
v000,
vmi1, vpi1, vmj1, vpj1, vmi2, vpi2, vmj2, vpj2,
rhs_u,
rhs_v, ix, iy, jx, jy, di, dj, umm1, upp1, ump1, upm1, vmm1, vpp1, vmp1, vpm1,
pmi1,
ppi1, pmj1, ppj1;
int
i, j;
#pragma omp parallel for private(i, u000, umi1, upi1,
umj1, upj1, umi2, upi2, umj2, upj2, v000, vmi1, vpi1, vmj1, vpj1, vmi2, vpi2,
vmj2, vpj2, rhs_u, rhs_v, ix, iy, jx, jy, di, dj, umm1, upp1, ump1, upm1, vmm1,
vpp1, vmp1, vpm1, pmi1, ppi1, pmj1, ppj1)
for
(j = 2; j < JMAX - 1; j++) {
for
(i = 2; i < IMAX - 1; i++) {
u000
= u[j][i];
v000
= v[j][i];
umi1
= u[j][i - 1];
vmi1
= v[j][i - 1];
upi1
= u[j][i + 1];
vpi1
= v[j][i + 1];
umj1
= u[j - 1][i];
vmj1
= v[j - 1][i];
upj1
= u[j + 1][i];
vpj1
= v[j + 1][i];
umi2
= u[j][i - 2];
vmi2
= v[j][i - 2];
upi2
= u[j][i + 2];
vpi2
= v[j][i + 2];
umj2
= u[j - 2][i];
vmj2
= v[j - 2][i];
upj2
= u[j + 2][i];
vpj2
= v[j + 2][i];
umm1
= u[j - 1][i - 1];
upp1
= u[j + 1][i + 1];
ump1
= u[j - 1][i + 1];
upm1
= u[j + 1][i - 1];
vmm1
= v[j - 1][i - 1];
vpp1
= v[j + 1][i + 1];
vmp1
= v[j - 1][i + 1];
vpm1
= v[j + 1][i - 1];
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
rhs_u
= ((ix * ix + iy * iy)*(umi1 + upi1 - 2.0*u000) + (jx * jx + jy * jy)*(umj1 +
upj1 - 2.0*u000)
+
2.0*(ix * jx + iy * jy)*(umm1 - ump1 - upm1 + upp1)
+
di * (-umi1 + upi1)*0.5 + dj * (-umj1 + upj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *ix + (-pmj1 + ppj1)*jx)*0.5
+
((u000*ix + v000 * iy)*(umi2 + 8.0*(-umi1 + upi1) - upi2) + fabs(u000*ix + v000
* iy)*(umi2 - 4.0*(umi1 + upi1) + upi2 + 6.0*u000)) / 12.0
+
((u000*jx + v000 * jy)*(umj2 + 8.0*(-umj1 + upj1) - upj2) + fabs(u000*jx + v000
* jy)*(umj2 - 4.0*(umj1 + upj1) + upj2 + 6.0*u000)) / 12.0
);
rhs_v
= ((ix * ix + iy * iy)*(vmi1 + vpi1 - 2.0*v000) + (jx * jx + jy * jy)*(vmj1 +
vpj1 - 2.0*v000)
+
2.0*(ix * jx + iy * jy)*(vmm1 - vmp1 - vpm1 + vpp1)
+
di * (-vmi1 + vpi1)*0.5 + dj * (-vmj1 + vpj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *iy + (-pmj1 + ppj1)*jy)*0.5
+
((u000*ix + v000 * iy)*(vmi2 + 8.0*(-vmi1 + vpi1) - vpi2) + fabs(u000*ix + v000
* iy)*(vmi2 - 4.0*(vmi1 + vpi1) + vpi2 + 6.0*v000)) / 12.0
+
((u000*jx + v000 * jy)*(vmj2 + 8.0*(-vmj1 + vpj1) - vpj2) + fabs(u000*jx + v000
* jy)*(vmj2 - 4.0*(vmj1 + vpj1) + vpj2 + 6.0*v000)) / 12.0
);
u0[j][i]
= u000 + dt * 0.5*(3.0*rhs_u - us[j][i]);
v0[j][i]
= v000 + dt * 0.5*(3.0*rhs_v - vs[j][i]);
us[j][i]
= rhs_u;
vs[j][i]
= rhs_v;
}
}
for
(j = 1; j < JMAX; j += JMAX - 2) {
#pragma omp parallel for private(u000, umi1, upi1,
umj1, upj1, v000, vmi1, vpi1, vmj1, vpj1, rhs_u, rhs_v, ix, iy, jx, jy, di, dj,
umm1, upp1, ump1, upm1, vmm1, vpp1, vmp1, vpm1, pmi1, ppi1, pmj1, ppj1)
for
(i = 1; i < IMAX; i++) {
u000
= u[j][i];
v000
= v[j][i];
umi1
= u[j][i - 1];
vmi1
= v[j][i - 1];
upi1
= u[j][i + 1];
vpi1
= v[j][i + 1];
umj1
= u[j - 1][i];
vmj1
= v[j - 1][i];
upj1
= u[j + 1][i];
vpj1
= v[j + 1][i];
umm1
= u[j - 1][i - 1];
upp1
= u[j + 1][i + 1];
ump1
= u[j - 1][i + 1];
upm1
= u[j + 1][i - 1];
vmm1
= v[j - 1][i - 1];
vpp1
= v[j + 1][i + 1];
vmp1
= v[j - 1][i + 1];
vpm1
= v[j + 1][i - 1];
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
rhs_u
= ((ix * ix + iy * iy)*(umi1 + upi1 - 2.0*u000) + (jx * jx + jy * jy)*(umj1 +
upj1 - 2.0*u000)
+
2.0*(ix * jx + iy * jy)*(umm1 - ump1 - upm1 + upp1)
+
di * (-umi1 + upi1)*0.5 + dj * (-umj1 + upj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *ix + (-pmj1 + ppj1)*jx)*0.5
+
((u000*ix + v000 * iy)*(-umi1 + upi1) + fabs(u000*ix + v000 * iy)*(-umi1 - upi1
+ 2.0*u000)) *0.5
+
((u000*jx + v000 * jy)*(-umj1 + upj1) + fabs(u000*jx + v000 * jy)*(-umj1 - upj1
+ 2.0*u000)) *0.5
);
rhs_v
= ((ix * ix + iy * iy)*(vmi1 + vpi1 - 2.0*v000) + (jx * jx + jy * jy)*(vmj1 +
vpj1 - 2.0*v000)
+
2.0*(ix * jx + iy * jy)*(vmm1 - vmp1 - vpm1 + vpp1)
+
di * (-vmi1 + vpi1)*0.5 + dj * (-vmj1 + vpj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *iy + (-pmj1 + ppj1)*jy)*0.5
+
((u000*ix + v000 * iy)*(-vmi1 + vpi1) + fabs(u000*ix + v000 * iy)*(-vmi1 - vpi1
+ 2.0*v000)) *0.5
+
((u000*jx + v000 * jy)*(-vmj1 + vpj1) + fabs(u000*jx + v000 * jy)*(-vmj1 - vpj1
+ 2.0*v000)) *0.5
);
u0[j][i]
= u000 + dt * 0.5*(3.0*rhs_u - us[j][i]);
v0[j][i]
= v000 + dt * 0.5*(3.0*rhs_v - vs[j][i]);
us[j][i]
= rhs_u;
vs[j][i]
= rhs_v;
}
}
#pragma omp parallel for private(i, u000, umi1, upi1,
umj1, upj1, v000, vmi1, vpi1, vmj1, vpj1, rhs_u, rhs_v, ix, iy, jx, jy, di, dj,
umm1, upp1, ump1, upm1, vmm1, vpp1, vmp1, vpm1, pmi1, ppi1, pmj1, ppj1)
for
(j = 2; j < JMAX - 1; j++) {
for
(i = 1; i < IMAX; i += IMAX - 2) {
u000
= u[j][i];
v000
= v[j][i];
umi1
= u[j][i - 1];
vmi1
= v[j][i - 1];
upi1
= u[j][i + 1];
vpi1
= v[j][i + 1];
umj1
= u[j - 1][i];
vmj1
= v[j - 1][i];
upj1
= u[j + 1][i];
vpj1
= v[j + 1][i];
umm1
= u[j - 1][i - 1];
upp1
= u[j + 1][i + 1];
ump1
= u[j - 1][i + 1];
upm1
= u[j + 1][i - 1];
vmm1
= v[j - 1][i - 1];
vpp1
= v[j + 1][i + 1];
vmp1
= v[j - 1][i + 1];
vpm1
= v[j + 1][i - 1];
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
rhs_u
= ((ix * ix + iy * iy)*(umi1 + upi1 - 2.0*u000) + (jx * jx + jy * jy)*(umj1 +
upj1 - 2.0*u000)
+
2.0*(ix * jx + iy * jy)*(umm1 - ump1 - upm1 + upp1)
+
di * (-umi1 + upi1)*0.5 + dj * (-umj1 + upj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *ix + (-pmj1 + ppj1)*jx)*0.5
+
((u000*ix + v000 * iy)*(-umi1 + upi1) + fabs(u000*ix + v000 * iy)*(-umi1 - upi1
+ 2.0*u000)) *0.5
+
((u000*jx + v000 * jy)*(-umj1 + upj1) + fabs(u000*jx + v000 * jy)*(-umj1 - upj1
+ 2.0*u000)) *0.5
);
rhs_v
= ((ix * ix + iy * iy)*(vmi1 + vpi1 - 2.0*v000) + (jx * jx + jy * jy)*(vmj1 +
vpj1 - 2.0*v000)
+
2.0*(ix * jx + iy * jy)*(vmm1 - vmp1 - vpm1 + vpp1)
+
di * (-vmi1 + vpi1)*0.5 + dj * (-vmj1 + vpj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *iy + (-pmj1 + ppj1)*jy)*0.5
+
((u000*ix + v000 * iy)*(-vmi1 + vpi1) + fabs(u000*ix + v000 * iy)*(-vmi1 - vpi1
+ 2.0*v000)) *0.5
+
((u000*jx + v000 * jy)*(-vmj1 + vpj1) + fabs(u000*jx + v000 * jy)*(-vmj1 - vpj1
+ 2.0*v000)) *0.5
);
u0[j][i]
= u000 + dt * 0.5*(3.0*rhs_u - us[j][i]);
v0[j][i]
= v000 + dt * 0.5*(3.0*rhs_v - vs[j][i]);
us[j][i]
= rhs_u;
vs[j][i]
= rhs_v;
}
}
}
void vel_implicit_calculation(double u0[][IMAX + 1],
double u[][IMAX + 1], double v0[][IMAX + 1], double v[][IMAX + 1], double
p0[][IMAX + 1], double us[][IMAX + 1], double vs[][IMAX + 1],
double
i0x[][IMAX + 1], double i0y[][IMAX + 1], double j0x[][IMAX + 1], double
j0y[][IMAX + 1], double d2i[][IMAX + 1], double d2j[][IMAX + 1]) {
double
u000, umi1, upi1, umj1, upj1, umi2, upi2, umj2, upj2,
v000,
vmi1, vpi1, vmj1, vpj1, vmi2, vpi2, vmj2, vpj2,
rhs_u,
rhs_v, leftvel, SGM2 = 1.05, ix, iy, jx, jy, di, dj, umm1, upp1, ump1, upm1,
vmm1, vpp1, vmp1, vpm1,
pmi1,
ppi1, pmj1, ppj1;
int
i, j;
#pragma omp parallel for private(i, u000, umi1, upi1,
umj1, upj1, umi2, upi2, umj2, upj2, v000, vmi1, vpi1, vmj1, vpj1, vmi2, vpi2,
vmj2, vpj2, rhs_u, rhs_v, leftvel, ix, iy, jx, jy, di, dj, umm1, upp1, ump1,
upm1, vmm1, vpp1, vmp1, vpm1, pmi1, ppi1, pmj1, ppj1) firstprivate(SGM2)
for
(j = 2; j < JMAX - 1; j += 3) {
for
(i = 2; i < IMAX - 1; i++) {
u000
= u0[j][i];
v000
= v0[j][i];
umi1
= u0[j][i - 1];
vmi1
= v0[j][i - 1];
upi1
= u0[j][i + 1];
vpi1
= v0[j][i + 1];
umj1
= u0[j - 1][i];
vmj1
= v0[j - 1][i];
upj1
= u0[j + 1][i];
vpj1
= v0[j + 1][i];
umi2
= u0[j][i - 2];
vmi2
= v0[j][i - 2];
upi2
= u0[j][i + 2];
vpi2
= v0[j][i + 2];
umj2
= u0[j - 2][i];
vmj2
= v0[j - 2][i];
upj2
= u0[j + 2][i];
vpj2
= v0[j + 2][i];
umm1
= u0[j - 1][i - 1];
upp1
= u0[j + 1][i + 1];
ump1
= u0[j - 1][i + 1];
upm1
= u0[j + 1][i - 1];
vmm1
= v0[j - 1][i - 1];
vpp1
= v0[j + 1][i + 1];
vmp1
= v0[j - 1][i + 1];
vpm1
= v0[j + 1][i - 1];
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
leftvel
= 2.0*(ix * ix + iy * iy + jx * jx + jy * jy) / Re + (fabs(u000*ix + v000 * iy)
+ fabs(u000*jx + v000 * jy))*0.5;
rhs_u
= ((ix * ix + iy * iy)*(umi1 + upi1) + (jx * jx + jy * jy)*(umj1 + upj1)
+
2.0*(ix * jx + iy * jy)*(umm1 - ump1 - upm1 + upp1)
+
di * (-umi1 + upi1)*0.5 + dj * (-umj1 + upj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *ix + (-pmj1 + ppj1)*jx)*0.5
+
((u000*ix + v000 * iy)*(umi2 + 8.0*(-umi1 + upi1) - upi2) + fabs(u000*ix + v000
* iy)*(umi2 - 4.0*(umi1 + upi1) + upi2)) / 12.0
+
((u000*jx + v000 * jy)*(umj2 + 8.0*(-umj1 + upj1) - upj2) + fabs(u000*jx + v000
* jy)*(umj2 - 4.0*(umj1 + upj1) + upj2)) / 12.0
);
rhs_v
= ((ix * ix + iy * iy)*(vmi1 + vpi1) + (jx * jx + jy * jy)*(vmj1 + vpj1)
+
2.0*(ix * jx + iy * jy)*(vmm1 - vmp1 - vpm1 + vpp1)
+
di * (-vmi1 + vpi1)*0.5 + dj * (-vmj1 + vpj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *iy + (-pmj1 + ppj1)*jy)*0.5
+
((u000*ix + v000 * iy)*(vmi2 + 8.0*(-vmi1 + vpi1) - vpi2) + fabs(u000*ix + v000
* iy)*(vmi2 - 4.0*(vmi1 + vpi1) + vpi2)) / 12.0
+
((u000*jx + v000 * jy)*(vmj2 + 8.0*(-vmj1 + vpj1) - vpj2) + fabs(u000*jx + v000
* jy)*(vmj2 - 4.0*(vmj1 + vpj1) + vpj2)) / 12.0
);
u0[j][i]
= (u[j][i] + dt * 0.5 * (rhs_u + us[j][i])) / (1.0 + dt * 0.5 * leftvel);
v0[j][i]
= (v[j][i] + dt * 0.5 * (rhs_v + vs[j][i])) / (1.0 + dt * 0.5 * leftvel);
u0[j][i]
= u000 + SGM2 * (u0[j][i] - u000);
v0[j][i]
= v000 + SGM2 * (v0[j][i] - v000);
}
}
#pragma omp parallel for private(i, u000, umi1, upi1,
umj1, upj1, umi2, upi2, umj2, upj2, v000, vmi1, vpi1, vmj1, vpj1, vmi2, vpi2,
vmj2, vpj2, rhs_u, rhs_v, leftvel, ix, iy, jx, jy, di, dj, umm1, upp1, ump1,
upm1, vmm1, vpp1, vmp1, vpm1, pmi1, ppi1, pmj1, ppj1) firstprivate(SGM2)
for
(j = 3; j < JMAX - 1; j += 3) {
for
(i = 2; i < IMAX - 1; i++) {
u000
= u0[j][i];
v000
= v0[j][i];
umi1
= u0[j][i - 1];
vmi1
= v0[j][i - 1];
upi1
= u0[j][i + 1];
vpi1
= v0[j][i + 1];
umj1
= u0[j - 1][i];
vmj1
= v0[j - 1][i];
upj1
= u0[j + 1][i];
vpj1
= v0[j + 1][i];
umi2
= u0[j][i - 2];
vmi2
= v0[j][i - 2];
upi2
= u0[j][i + 2];
vpi2
= v0[j][i + 2];
umj2
= u0[j - 2][i];
vmj2
= v0[j - 2][i];
upj2
= u0[j + 2][i];
vpj2
= v0[j + 2][i];
umm1
= u0[j - 1][i - 1];
upp1
= u0[j + 1][i + 1];
ump1
= u0[j - 1][i + 1];
upm1
= u0[j + 1][i - 1];
vmm1
= v0[j - 1][i - 1];
vpp1
= v0[j + 1][i + 1];
vmp1
= v0[j - 1][i + 1];
vpm1
= v0[j + 1][i - 1];
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
leftvel
= 2.0*(ix * ix + iy * iy + jx * jx + jy * jy) / Re + (fabs(u000*ix + v000 * iy)
+ fabs(u000*jx + v000 * jy))*0.5;
rhs_u
= ((ix * ix + iy * iy)*(umi1 + upi1) + (jx * jx + jy * jy)*(umj1 + upj1)
+
2.0*(ix * jx + iy * jy)*(umm1 - ump1 - upm1 + upp1)
+
di * (-umi1 + upi1)*0.5 + dj * (-umj1 + upj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *ix + (-pmj1 + ppj1)*jx)*0.5
+
((u000*ix + v000 * iy)*(umi2 + 8.0*(-umi1 + upi1) - upi2) + fabs(u000*ix + v000
* iy)*(umi2 - 4.0*(umi1 + upi1) + upi2)) / 12.0
+
((u000*jx + v000 * jy)*(umj2 + 8.0*(-umj1 + upj1) - upj2) + fabs(u000*jx + v000
* jy)*(umj2 - 4.0*(umj1 + upj1) + upj2)) / 12.0
);
rhs_v
= ((ix * ix + iy * iy)*(vmi1 + vpi1) + (jx * jx + jy * jy)*(vmj1 + vpj1)
+
2.0*(ix * jx + iy * jy)*(vmm1 - vmp1 - vpm1 + vpp1)
+
di * (-vmi1 + vpi1)*0.5 + dj * (-vmj1 + vpj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *iy + (-pmj1 + ppj1)*jy)*0.5
+
((u000*ix + v000 * iy)*(vmi2 + 8.0*(-vmi1 + vpi1) - vpi2) + fabs(u000*ix + v000
* iy)*(vmi2 - 4.0*(vmi1 + vpi1) + vpi2)) / 12.0
+
((u000*jx + v000 * jy)*(vmj2 + 8.0*(-vmj1 + vpj1) - vpj2) + fabs(u000*jx + v000
* jy)*(vmj2 - 4.0*(vmj1 + vpj1) + vpj2)) / 12.0
);
u0[j][i]
= (u[j][i] + dt * 0.5 * (rhs_u + us[j][i])) / (1.0 + dt * 0.5 * leftvel);
v0[j][i]
= (v[j][i] + dt * 0.5 * (rhs_v + vs[j][i])) / (1.0 + dt * 0.5 * leftvel);
u0[j][i]
= u000 + SGM2 * (u0[j][i] - u000);
v0[j][i]
= v000 + SGM2 * (v0[j][i] - v000);
}
}
#pragma omp parallel for private(i, u000, umi1, upi1,
umj1, upj1, umi2, upi2, umj2, upj2, v000, vmi1, vpi1, vmj1, vpj1, vmi2, vpi2,
vmj2, vpj2, rhs_u, rhs_v, leftvel, ix, iy, jx, jy, di, dj, umm1, upp1, ump1,
upm1, vmm1, vpp1, vmp1, vpm1, pmi1, ppi1, pmj1, ppj1) firstprivate(SGM2)
for
(j = 4; j < JMAX - 1; j += 3) {
for
(i = 2; i < IMAX - 1; i++) {
u000
= u0[j][i];
v000
= v0[j][i];
umi1
= u0[j][i - 1];
vmi1
= v0[j][i - 1];
upi1
= u0[j][i + 1];
vpi1
= v0[j][i + 1];
umj1
= u0[j - 1][i];
vmj1
= v0[j - 1][i];
upj1
= u0[j + 1][i];
vpj1
= v0[j + 1][i];
umi2
= u0[j][i - 2];
vmi2
= v0[j][i - 2];
upi2
= u0[j][i + 2];
vpi2
= v0[j][i + 2];
umj2
= u0[j - 2][i];
vmj2
= v0[j - 2][i];
upj2
= u0[j + 2][i];
vpj2
= v0[j + 2][i];
umm1
= u0[j - 1][i - 1];
upp1
= u0[j + 1][i + 1];
ump1
= u0[j - 1][i + 1];
upm1
= u0[j + 1][i - 1];
vmm1
= v0[j - 1][i - 1];
vpp1
= v0[j + 1][i + 1];
vmp1
= v0[j - 1][i + 1];
vpm1
= v0[j + 1][i - 1];
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
leftvel
= 2.0*(ix * ix + iy * iy + jx * jx + jy * jy) / Re + (fabs(u000*ix + v000 * iy)
+ fabs(u000*jx + v000 * jy))*0.5;
rhs_u
= ((ix * ix + iy * iy)*(umi1 + upi1) + (jx * jx + jy * jy)*(umj1 + upj1)
+
2.0*(ix * jx + iy * jy)*(umm1 - ump1 - upm1 + upp1)
+
di * (-umi1 + upi1)*0.5 + dj * (-umj1 + upj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *ix + (-pmj1 + ppj1)*jx)*0.5
+
((u000*ix + v000 * iy)*(umi2 + 8.0*(-umi1 + upi1) - upi2) + fabs(u000*ix + v000
* iy)*(umi2 - 4.0*(umi1 + upi1) + upi2)) / 12.0
+
((u000*jx + v000 * jy)*(umj2 + 8.0*(-umj1 + upj1) - upj2) + fabs(u000*jx + v000
* jy)*(umj2 - 4.0*(umj1 + upj1) + upj2)) / 12.0
);
rhs_v
= ((ix * ix + iy * iy)*(vmi1 + vpi1) + (jx * jx + jy * jy)*(vmj1 + vpj1)
+
2.0*(ix * jx + iy * jy)*(vmm1 - vmp1 - vpm1 + vpp1)
+
di * (-vmi1 + vpi1)*0.5 + dj * (-vmj1 + vpj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *iy + (-pmj1 + ppj1)*jy)*0.5
+
((u000*ix + v000 * iy)*(vmi2 + 8.0*(-vmi1 + vpi1) - vpi2) + fabs(u000*ix + v000
* iy)*(vmi2 - 4.0*(vmi1 + vpi1) + vpi2)) / 12.0
+
((u000*jx + v000 * jy)*(vmj2 + 8.0*(-vmj1 + vpj1) - vpj2) + fabs(u000*jx + v000
* jy)*(vmj2 - 4.0*(vmj1 + vpj1) + vpj2)) / 12.0
);
u0[j][i]
= (u[j][i] + dt * 0.5 * (rhs_u + us[j][i])) / (1.0 + dt * 0.5 * leftvel);
v0[j][i]
= (v[j][i] + dt * 0.5 * (rhs_v + vs[j][i])) / (1.0 + dt * 0.5 * leftvel);
u0[j][i]
= u000 + SGM2 * (u0[j][i] - u000);
v0[j][i]
= v000 + SGM2 * (v0[j][i] - v000);
}
}
for
(j = 1; j < JMAX; j += JMAX - 2) {
#pragma omp parallel for private(u000, umi1, upi1,
umj1, upj1, v000, vmi1, vpi1, vmj1, vpj1, rhs_u, rhs_v, leftvel, ix, iy, jx,
jy, di, dj, umm1, upp1, ump1, upm1, vmm1, vpp1, vmp1, vpm1, pmi1, ppi1, pmj1,
ppj1) firstprivate(SGM2)
for
(i = 1; i < IMAX; i += 2) {
u000
= u0[j][i];
v000
= v0[j][i];
umi1
= u0[j][i - 1];
vmi1
= v0[j][i - 1];
upi1
= u0[j][i + 1];
vpi1
= v0[j][i + 1];
umj1
= u0[j - 1][i];
vmj1
= v0[j - 1][i];
upj1
= u0[j + 1][i];
vpj1
= v0[j + 1][i];
umm1
= u0[j - 1][i - 1];
upp1
= u0[j + 1][i + 1];
ump1
= u0[j - 1][i + 1];
upm1
= u0[j + 1][i - 1];
vmm1
= v0[j - 1][i - 1];
vpp1
= v0[j + 1][i + 1];
vmp1
= v0[j - 1][i + 1];
vpm1
= v0[j + 1][i - 1];
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
leftvel
= 2.0*(ix * ix + iy * iy + jx * jx + jy * jy) / Re + fabs(u000*ix + v000 * iy)
+ fabs(u000*jx + v000 * jy);
rhs_u
= ((ix * ix + iy * iy)*(umi1 + upi1) + (jx * jx + jy * jy)*(umj1 + upj1)
+
2.0*(ix * jx + iy * jy)*(umm1 - ump1 - upm1 + upp1)
+
di * (-umi1 + upi1)*0.5 + dj * (-umj1 + upj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *ix + (-pmj1 + ppj1)*jx)*0.5
+
((u000*ix + v000 * iy)*(-umi1 + upi1) + fabs(u000*ix + v000 * iy)*(-umi1 -
upi1)) *0.5
+
((u000*jx + v000 * jy)*(-umj1 + upj1) + fabs(u000*jx + v000 * jy)*(-umj1 -
upj1)) *0.5
);
rhs_v
= ((ix * ix + iy * iy)*(vmi1 + vpi1) + (jx * jx + jy * jy)*(vmj1 + vpj1)
+
2.0*(ix * jx + iy * jy)*(vmm1 - vmp1 - vpm1 + vpp1)
+
di * (-vmi1 + vpi1)*0.5 + dj * (-vmj1 + vpj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *iy + (-pmj1 + ppj1)*jy)*0.5
+
((u000*ix + v000 * iy)*(-vmi1 + vpi1) + fabs(u000*ix + v000 * iy)*(-vmi1 -
vpi1)) *0.5
+
((u000*jx + v000 * jy)*(-vmj1 + vpj1) + fabs(u000*jx + v000 * jy)*(-vmj1 -
vpj1)) *0.5
);
u0[j][i]
= (u[j][i] + dt * 0.5 * (rhs_u + us[j][i])) / (1.0 + dt * 0.5 * leftvel);
v0[j][i]
= (v[j][i] + dt * 0.5 * (rhs_v + vs[j][i])) / (1.0 + dt * 0.5 * leftvel);
u0[j][i]
= u000 + SGM2 * (u0[j][i] - u000);
v0[j][i]
= v000 + SGM2 * (v0[j][i] - v000);
}
#pragma omp parallel for private(u000, umi1, upi1,
umj1, upj1, v000, vmi1, vpi1, vmj1, vpj1, rhs_u, rhs_v, leftvel, ix, iy, jx,
jy, di, dj, umm1, upp1, ump1, upm1, vmm1, vpp1, vmp1, vpm1, pmi1, ppi1, pmj1,
ppj1) firstprivate(SGM2)
for
(i = 2; i < IMAX; i += 2) {
u000
= u0[j][i];
v000
= v0[j][i];
umi1
= u0[j][i - 1];
vmi1
= v0[j][i - 1];
upi1
= u0[j][i + 1];
vpi1
= v0[j][i + 1];
umj1
= u0[j - 1][i];
vmj1
= v0[j - 1][i];
upj1
= u0[j + 1][i];
vpj1
= v0[j + 1][i];
umm1
= u0[j - 1][i - 1];
upp1
= u0[j + 1][i + 1];
ump1
= u0[j - 1][i + 1];
upm1
= u0[j + 1][i - 1];
vmm1
= v0[j - 1][i - 1];
vpp1
= v0[j + 1][i + 1];
vmp1
= v0[j - 1][i + 1];
vpm1
= v0[j + 1][i - 1];
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
leftvel
= 2.0*(ix * ix + iy * iy + jx * jx + jy * jy) / Re + fabs(u000*ix + v000 * iy)
+ fabs(u000*jx + v000 * jy);
rhs_u
= ((ix * ix + iy * iy)*(umi1 + upi1) + (jx * jx + jy * jy)*(umj1 + upj1)
+
2.0*(ix * jx + iy * jy)*(umm1 - ump1 - upm1 + upp1)
+
di * (-umi1 + upi1)*0.5 + dj * (-umj1 + upj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *ix + (-pmj1 + ppj1)*jx)*0.5
+
((u000*ix + v000 * iy)*(-umi1 + upi1) + fabs(u000*ix + v000 * iy)*(-umi1 -
upi1)) *0.5
+
((u000*jx + v000 * jy)*(-umj1 + upj1) + fabs(u000*jx + v000 * jy)*(-umj1 -
upj1)) *0.5
);
rhs_v
= ((ix * ix + iy * iy)*(vmi1 + vpi1) + (jx * jx + jy * jy)*(vmj1 + vpj1)
+
2.0*(ix * jx + iy * jy)*(vmm1 - vmp1 - vpm1 + vpp1)
+
di * (-vmi1 + vpi1)*0.5 + dj * (-vmj1 + vpj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *iy + (-pmj1 + ppj1)*jy)*0.5
+
((u000*ix + v000 * iy)*(-vmi1 + vpi1) + fabs(u000*ix + v000 * iy)*(-vmi1 -
vpi1)) *0.5
+
((u000*jx + v000 * jy)*(-vmj1 + vpj1) + fabs(u000*jx + v000 * jy)*(-vmj1 -
vpj1)) *0.5
);
u0[j][i]
= (u[j][i] + dt * 0.5 * (rhs_u + us[j][i])) / (1.0 + dt * 0.5 * leftvel);
v0[j][i]
= (v[j][i] + dt * 0.5 * (rhs_v + vs[j][i])) / (1.0 + dt * 0.5 * leftvel);
u0[j][i]
= u000 + SGM2 * (u0[j][i] - u000);
v0[j][i]
= v000 + SGM2 * (v0[j][i] - v000);
}
}
#pragma omp parallel for private(i, u000, umi1, upi1,
umj1, upj1, v000, vmi1, vpi1, vmj1, vpj1, rhs_u, rhs_v, leftvel, ix, iy, jx,
jy, di, dj, umm1, upp1, ump1, upm1, vmm1, vpp1, vmp1, vpm1, pmi1, ppi1, pmj1,
ppj1) firstprivate(SGM2)
for
(j = 2; j < JMAX - 1; j += 2) {
for
(i = 1; i < IMAX; i += IMAX - 2) {
u000
= u0[j][i];
v000
= v0[j][i];
umi1
= u0[j][i - 1];
vmi1
= v0[j][i - 1];
upi1
= u0[j][i + 1];
vpi1
= v0[j][i + 1];
umj1
= u0[j - 1][i];
vmj1
= v0[j - 1][i];
upj1
= u0[j + 1][i];
vpj1
= v0[j + 1][i];
umm1
= u0[j - 1][i - 1];
upp1
= u0[j + 1][i + 1];
ump1
= u0[j - 1][i + 1];
upm1
= u0[j + 1][i - 1];
vmm1
= v0[j - 1][i - 1];
vpp1
= v0[j + 1][i + 1];
vmp1
= v0[j - 1][i + 1];
vpm1
= v0[j + 1][i - 1];
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
leftvel
= 2.0*(ix * ix + iy * iy + jx * jx + jy * jy) / Re + fabs(u000*ix + v000 * iy)
+ fabs(u000*jx + v000 * jy);
rhs_u
= ((ix * ix + iy * iy)*(umi1 + upi1) + (jx * jx + jy * jy)*(umj1 + upj1)
+
2.0*(ix * jx + iy * jy)*(umm1 - ump1 - upm1 + upp1)
+
di * (-umi1 + upi1)*0.5 + dj * (-umj1 + upj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *ix + (-pmj1 + ppj1)*jx)*0.5
+
((u000*ix + v000 * iy)*(-umi1 + upi1) + fabs(u000*ix + v000 * iy)*(-umi1 - upi1))
*0.5
+
((u000*jx + v000 * jy)*(-umj1 + upj1) + fabs(u000*jx + v000 * jy)*(-umj1 -
upj1)) *0.5
);
rhs_v
= ((ix * ix + iy * iy)*(vmi1 + vpi1) + (jx * jx + jy * jy)*(vmj1 + vpj1)
+
2.0*(ix * jx + iy * jy)*(vmm1 - vmp1 - vpm1 + vpp1)
+
di * (-vmi1 + vpi1)*0.5 + dj * (-vmj1 + vpj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *iy + (-pmj1 + ppj1)*jy)*0.5
+
((u000*ix + v000 * iy)*(-vmi1 + vpi1) + fabs(u000*ix + v000 * iy)*(-vmi1 -
vpi1)) *0.5
+
((u000*jx + v000 * jy)*(-vmj1 + vpj1) + fabs(u000*jx + v000 * jy)*(-vmj1 -
vpj1)) *0.5
);
u0[j][i]
= (u[j][i] + dt * 0.5 * (rhs_u + us[j][i])) / (1.0 + dt * 0.5 * leftvel);
v0[j][i]
= (v[j][i] + dt * 0.5 * (rhs_v + vs[j][i])) / (1.0 + dt * 0.5 * leftvel);
u0[j][i]
= u000 + SGM2 * (u0[j][i] - u000);
v0[j][i]
= v000 + SGM2 * (v0[j][i] - v000);
}
}
#pragma omp parallel for private(i, u000, umi1, upi1,
umj1, upj1, v000, vmi1, vpi1, vmj1, vpj1, rhs_u, rhs_v, leftvel, ix, iy, jx,
jy, di, dj, umm1, upp1, ump1, upm1, vmm1, vpp1, vmp1, vpm1, pmi1, ppi1, pmj1,
ppj1) firstprivate(SGM2)
for
(j = 3; j < JMAX - 1; j += 2) {
for
(i = 1; i < IMAX; i += IMAX - 2) {
u000
= u0[j][i];
v000
= v0[j][i];
umi1
= u0[j][i - 1];
vmi1
= v0[j][i - 1];
upi1
= u0[j][i + 1];
vpi1
= v0[j][i + 1];
umj1
= u0[j - 1][i];
vmj1
= v0[j - 1][i];
upj1
= u0[j + 1][i];
vpj1
= v0[j + 1][i];
umm1
= u0[j - 1][i - 1];
upp1
= u0[j + 1][i + 1];
ump1
= u0[j - 1][i + 1];
upm1
= u0[j + 1][i - 1];
vmm1
= v0[j - 1][i - 1];
vpp1
= v0[j + 1][i + 1];
vmp1
= v0[j - 1][i + 1];
vpm1
= v0[j + 1][i - 1];
ix
= i0x[j][i];
jx
= j0x[j][i];
iy
= i0y[j][i];
jy
= j0y[j][i];
di
= d2i[j][i];
dj
= d2j[j][i];
pmi1
= p0[j][i - 1];
ppi1
= p0[j][i + 1];
pmj1
= p0[j - 1][i];
ppj1
= p0[j + 1][i];
leftvel
= 2.0*(ix * ix + iy * iy + jx * jx + jy * jy) / Re + fabs(u000*ix + v000 * iy)
+ fabs(u000*jx + v000 * jy);
rhs_u
= ((ix * ix + iy * iy)*(umi1 + upi1) + (jx * jx + jy * jy)*(umj1 + upj1)
+
2.0*(ix * jx + iy * jy)*(umm1 - ump1 - upm1 + upp1)
+
di * (-umi1 + upi1)*0.5 + dj * (-umj1 + upj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *ix + (-pmj1 + ppj1)*jx)*0.5
+
((u000*ix + v000 * iy)*(-umi1 + upi1) + fabs(u000*ix + v000 * iy)*(-umi1 -
upi1)) *0.5
+
((u000*jx + v000 * jy)*(-umj1 + upj1) + fabs(u000*jx + v000 * jy)*(-umj1 -
upj1)) *0.5
);
rhs_v
= ((ix * ix + iy * iy)*(vmi1 + vpi1) + (jx * jx + jy * jy)*(vmj1 + vpj1)
+
2.0*(ix * jx + iy * jy)*(vmm1 - vmp1 - vpm1 + vpp1)
+
di * (-vmi1 + vpi1)*0.5 + dj * (-vmj1 + vpj1)*0.5) / Re
-
(
((-pmi1
+ ppi1) *iy + (-pmj1 + ppj1)*jy)*0.5
+
((u000*ix + v000 * iy)*(-vmi1 + vpi1) + fabs(u000*ix + v000 * iy)*(-vmi1 -
vpi1)) *0.5
+
((u000*jx + v000 * jy)*(-vmj1 + vpj1) + fabs(u000*jx + v000 * jy)*(-vmj1 -
vpj1)) *0.5
);
u0[j][i]
= (u[j][i] + dt * 0.5 * (rhs_u + us[j][i])) / (1.0 + dt * 0.5 * leftvel);
v0[j][i]
= (v[j][i] + dt * 0.5 * (rhs_v + vs[j][i])) / (1.0 + dt * 0.5 * leftvel);
u0[j][i]
= u000 + SGM2 * (u0[j][i] - u000);
v0[j][i]
= v000 + SGM2 * (v0[j][i] - v000);
}
}
}
void write_data_vt(double u0[][IMAX + 1], double
x[][IMAX + 1], double y[][IMAX + 1]) {
ofstream
rdi;
rdi.precision(18);
char
str[20];
sprintf_s(str,
"data%d.dat", n);// Convert i to a char
string
datafile = "./data/";
datafile.append(str);
rdi.open(datafile.c_str());
for
(int j = 0; j < JMAX + 1; j++) {
for
(int i = 0; i < IMAX + 1; i++) {
rdi
<< x[j][i] << ' ' << y[j][i] << ' ' << u0[j][i]
<< endl;
}
rdi
<< endl;
}
rdi.close();
}
int main() {
cout.precision(15);
double
check0 = 0.0, check1 = 0.0, check2 = 0.0, check3 = 0.0;
typedef
double IJ[IMAX + 1];
IJ
*u0, *u, *v0, *v, *p0, *rhs, *x0, *y0, *us, *vs, *i0x, *i0y, *j0x, *j0y, *d2i,
*d2j;
u0
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
u
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
v0
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
v
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
p0
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
rhs
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
x0
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
y0
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
us
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
vs
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
i0x
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
i0y
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
j0x
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
j0y
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
d2i
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
d2j
= (IJ *)malloc((IMAX + 1) * (JMAX + 1) * sizeof(double));
initialization_values(u0,
u, v0, v, p0, rhs, x0, y0, us, vs, i0x, i0y, j0x, j0y, d2i, d2j);
domain(x0,
y0);
change_domain_calculation(x0,
y0, i0x, i0y, j0x, j0y, d2i, d2j);
initial_condition(u0,
v0);
vel_boundary_condition(u0,
v0);
pre_boundary_condition(p0);
write_data_vt(u0,
x0, y0);
for
(n = 1; n < NMAX + 1; n++) {
rhs_calculation(u0,
v0, rhs, i0x, i0y, j0x, j0y);
for
(int loop = 1; loop < 51; loop++) {
pre_calculation(p0,
rhs, i0x, i0y, j0x, j0y, d2i, d2j);
}
check0
= p0[5][5];
pre_calculation(p0,
rhs, i0x, i0y, j0x, j0y, d2i, d2j);
check1
= p0[5][5];
pre_boundary_condition(p0);
memcpy(u,
u0, ((IMAX + 1)*(JMAX + 1) * sizeof(double)));
memcpy(v,
v0, ((IMAX + 1)*(JMAX + 1) * sizeof(double)));
vel_explicit_calculation(u0,
u, v0, v, p0, us, vs, i0x, i0y, j0x, j0y, d2i, d2j);
for
(int loop = 1; loop < 6; loop++) {
vel_implicit_calculation(u0,
u, v0, v, p0, us, vs, i0x, i0y, j0x, j0y, d2i, d2j);
}
check2
= u0[5][5];
vel_implicit_calculation(u0,
u, v0, v, p0, us, vs, i0x, i0y, j0x, j0y, d2i, d2j);
check3
= u0[5][5];
if
(n % 100 == 0) {
cout
<< n << ' ' << fabs(check1 - check0) << ' ' <<
fabs(check2 - check3) << endl;
}
vel_boundary_condition(u0,
v0);
if
(n % 100 == 0) {
write_data_vt(u0,
x0, y0);
}
}
free(u0);
free(u);
free(v0);
free(v);
free(p0);
free(rhs);
free(x0);
free(y0);
free(us);
free(vs);
free(i0x);
free(i0y);
free(j0x);
free(j0y);
free(d2i);
free(d2j);
return
0;
}
実ð·ñ¨øö変üµÌõ数ªòìýªìªÆÍªß©ªòª·ªÆªßªÆ¡¢ì¤îñªÈÔÒª¸Ì¿Íýª¬õóªìªÐª¤ª¤¡£áóï᪹ªëªÈªªÏ¡¢rhs_calculationªÎݻݪò໪Ëáóï᪷ªÆ¡¢ª½ªÎªÞªÞͪߩªòüÞª·ªÆ¡¢ï᪷ª¤Ì¿Íýª¬õóªëª«ü¬ì㪹ªë¡£ªÇªª¿ªé¡¢pre_calculationªÎݻݪòáóï᪷ü¬ì㪷¡¢ï᪷ª¯ªÊªÃªÆª¤ªëª«ªòü¬ì㪹ªë¡£ª½ªÎýªÏåÕú°ÛöªÎáÜÓø¡¢õÌðûîܪ˪Ïëäú°ÛöªÎáÜÓøªòáóï᪷ü¬ì㪹ªìªÐª¤ª¤¡£
ª·ª«ª·¡¢ÐѪÎÌ«íªÀªÈÌ«í変üµÌõ数ªòÞŪ¦ëòÚ«ª¬ªÊª¤¡£ª½ªÎª¿ªá¡¢yÛ°ú¾Ì«íÊà̰ªòÞªÔõÊà̰ªËíªêÆÍªß©ªòª·ªÆªßªèª¦¡£
úÞÎyÛ°ú¾Ì«íªÎãÒªÏ
y0[j][i] = dy * (double)j;
ªÇª¢ªë¡£
ª³ªìªò¡¢ÔõÝï数ÖªªÎûúªÎãÒªòÞŪêơ¢yª¬0ÜõÐΪÎÌ«íªòᬪ«ª¯ª·¡¢2ªËÐΪ¯ªÊªëªÛªÉðØª¯ªÊªëÌ«íªòíªêƪߪ誦¡£
ÔõÝï数ÖªªÎûúªÎãҪϡ¢
ª³ª³ªÇ¡¢aªÏôøú£¡¢rªÏÍëÝïªÇª¢ªë¡£実ð·¡¢yÛ°ú¾ªÎÌ«íªòì¤ù»ªÎªèª¦ªËáóï᪷ͪߩª¹ªë¡£
y0[j][i] = 0.05*(pow(1.0677448,(double)(j))-1.0)/(0.0677448);
ÔõÊà̰ªÎÌ«íªÈÞªÔõÊà̰ªÎÌ«íªÎö·ªòÝïÎòª¹ªëªÈì¤ù»ªÎªèª¦ªÊøúªËªÊªë¡£
j |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
ÔõÊà̰ |
0 |
0.1 |
0.2 |
0.3 |
0.4 |
0.5 |
0.6 |
0.7 |
0.8 |
0.9 |
1 |
1.1 |
1.2 |
1.3 |
1.4 |
1.5 |
1.6 |
1.7 |
1.8 |
1.9 |
2 |
ÞªÔõÊà̰ |
0 |
0.05 |
0.103387 |
0.160391 |
0.221257 |
0.286246 |
0.355638 |
0.42973 |
0.508842 |
0.593314 |
0.683507 |
0.779811 |
0.88264 |
0.992434 |
1.109666 |
1.23484 |
1.368494 |
1.511203 |
1.663579 |
1.826278 |
1.999998 |
ͪߩ̿ÍýªÏì¤ù»ªËªÊªë¡£
yª¬0ªÎÜõÐΪÏÌ«íª¬á¬ª«ª¯ªÆ¡¢2ªÎÜõÐΪÏðØª¯ªÊªÃªÆª¤ªëª³ªÈª¬ªïª«ªë¡£í»ÝªÇü¬ì㪹ªëª³ªÈ¡£
ª³ª³ªÇ¡¢ñ¨øö変üµÌõ数ªËªÄª¤ªÆ¡¢ªâª¦ìéüÞÍŪ¨ªÆªßªèª¦¡£
2óꪪÎíÞùꡢϴªáªÊª¤ªÈª¤ª±ªÊª¤変数ª¬6ªÄðí¹ªë¡£ª·ª«ª·¡¢ß¾ªÎªèª¦ªÊÌ«íªÀªÈ¡¢yÛ°ú¾ªËÞªÔõÊà̰ªÇª¢ªêñ¨øö変üµÍöÊàªÎ¥çÛ°ú¾ª·ª«関与ª·ªÊª¤¡£ª³ªÎªèª¦ªË1ªÄªÎÛ°ú¾ªÀª±ªò変ª¨ªëíÞùêªËù±é©ªÊñ¨øö変üµÌõ数ªÏ2ªÄªÀª±ªÇª¤ª¤¡£ß¾ªÎÌ«í条ËìªÀªÈ¡¢
ªËªÊªëú£ªÏ¥ÄxªòÞŪ¦ìéÚõªÎó¬ÝªǪ¤ª¤¡£
yªÀª±¥çÛ°ú¾ªËÞªÔõÊà̰ªËªÊªÃªÆª¤ªëª¿ªá¡¢yªË関ª¹ªëø¶Ú°ÝªÀª±ñ¨øö変üµÌõ数ªòÞŪ¨ªÐͪߩª¬ªÇªªë¡£«á«ê«Ã«ÈªÈª·ªÆªÏòÁÊÇñ¨øöͧªÎͪߩª³ªÈª«ªéñ¨øö変üµÌõ数ªòÓôìýª¹ªëªÈª¡¢áóï᪬ù±é©ªÊݻݪ¬á´ªÊª¯ªÊªëª³ªÈª«ªé¡¢«Ð«¯ª¬Ð¼îܪËÊõªë¡£ªÞª¿¡¢Íªß©ß¾¡¢参ðΪ¹ªë変数ªÎ数ª¬Êõªëª³ªÈª«ªé¡¢Íªß©áÜÓøªâáܪ¯ªÊªë¡£ª³ªÎãÁªÎñ¨øö変üµÌõ数ªÏì¤ù»ªÎªèª¦ªËÏ´ªáªéªìªë¡£
ö¢ªêùꪨªº¡¢ÐñÜâû¡ª«ªéÍŪ¨ªÆªßªëªÈ¡¢
ªËªÊªë¡£×â릪Ȫ·ªÆªÏ¡¢yªÏ¥îªÈòÁÎߪ·ªÆª¤ªëª«ªéªÇª¢ªë¡£Ì¿ÏÑ¡¢
ªÈªÊªê¡¢ªòÏ´ªáª¿ªé¡¢
ªÎó¬Ýª¬ªÇªªë¡£
ªÎÏ´ªáÛ°ªÏ既ðíªÎÏ´ªáÛ°ªÇÏ´ªáªìªÐª¤ª¤¡£
í»ªéÏ´ªáªÆªßª¿ªé¡¢
ªÎªèª¦ªËªÊªë¡£2óø¶Ú°ÝÂÛ°ïïãҪϡ¢
ªÈªÊªê¡¢ªòÏ´ªáªëªÈ¡¢
ªÎó¬ÝªâªÇªªë¡£
ªâí»ªéÏ´ªáªÆªßªëªÈ¡¢
ªÇª¢ªë¡£ù±ªºí»ªéÏ´ªáªÆªßªëª³ªÈ¡£
6ªÄªÎ変数ª¬îïÝ»ù±é©ªÊÌ«íªÏì¤ù»ªÎªèª¦ªË¡¢
r0 = (D0*0.5 +
0.004*(pow(1.0221, (double)(i)) - 1.0) / 0.0221);
x0[j][i]
= r0 * cos((double)(j)*1.0 / rde);
y0[j][i]
= r0 * sin((double)(j)*1.0 / rde);
å÷÷Õñ¨øöªòíªê¿ªÈªªÇª¢ªë¡£
xªÏiªÈj¡¢ªÄªÞªê¡¢¥îªÈ¥çªË関ªïªÃªÆª¤ªë¡£yªâ¥îªÈ¥çªË関ªïªÃªÆª¤ªë¡£ª³ªÎíÞùêªÀªÈ¡¢6ªÄªÎñ¨øö変üµÌõ数ª¬ù±é©ªÇª¢ªë¡£
ªÞª¿¡¢
x0[j][i] = 0.05*(pow(1.0677448,(double)(i))-1.0)/(0.0677448);
y0[j][i] = 0.05*(pow(1.0677448,(double)(j))-1.0)/(0.0677448);
ª³ªÎªèª¦ªË¡¢xªÏiªÈ¡¢yªÏjªÈ関Ìõª·ªÆª¤ªÆ¡¢ÞªÔõÊà̰ªÇª¢ªìªÏ¡¢4ªÄªÎ変数ª¬ù±é©ªÇª¢ªë¡£