Working 2D-mpi for enhanced solver

This commit is contained in:
2023-10-09 16:56:43 +02:00
parent fcff353999
commit 86f7677f34
31 changed files with 39012 additions and 171322 deletions

View File

@@ -39,7 +39,7 @@ $(BUILD_DIR)/%.s: %.c
.PHONY: clean distclean tags info asm format
clean: viz
clean: vis
$(info ===> CLEAN)
@rm -rf $(BUILD_DIR)
@rm -f tags
@@ -48,7 +48,7 @@ distclean: clean
$(info ===> DIST CLEAN)
@rm -f $(TARGET)
viz:
vis:
$(info ===> REMOVING VIZUALISATION FILES)
@rm -f vtk_files/particle*.vtk
@rm -f vis_files/particle*.dat

View File

@@ -15,7 +15,7 @@ bcRight 3 #
gx 0.0 # Body forces (e.g. gravity)
gy 0.0 #
re 16500.0 # Reynolds number
re 36500.0 # Reynolds number
u_init 1.0 # initial value for velocity in x-direction
v_init 0.0 # initial value for velocity in y-direction
@@ -48,10 +48,10 @@ gamma 0.9 # upwind differencing factor gamma
# Particle Tracing Data:
# -----------------------
numberOfParticles 60
startTime 100.0
injectTimePeriod 0.5
writeTimePeriod 0.2
numberOfParticles 200
startTime 0
injectTimePeriod 1.0
writeTimePeriod 0.5
x1 0.0
y1 0.5

File diff suppressed because it is too large Load Diff

View File

@@ -25,8 +25,7 @@
static double distance(double i, double j, double iCenter, double jCenter)
{
return sqrt(pow(iCenter - i, 2)
+ pow(jCenter - j, 2) * 1.0);
return sqrt(pow(iCenter - i, 2) + pow(jCenter - j, 2) * 1.0);
}
void print(Solver* solver, double* grid)
@@ -106,7 +105,6 @@ void initSolver(Solver* solver, Parameter* params)
solver->gamma = params->gamma;
solver->rho = params->rho;
int imax = solver->imax;
int jmax = solver->jmax;
size_t size = (imax + 2) * (jmax + 2) * sizeof(double);
@@ -134,75 +132,86 @@ void initSolver(Solver* solver, Parameter* params)
solver->dtBound = 0.5 * solver->re * 1.0 / invSqrSum;
double xCenter = 0, yCenter = 0, radius = 0;
double x1=0, x2=0, y1=0, y2=0;
double x1 = 0, x2 = 0, y1 = 0, y2 = 0;
int* s = solver->s;
switch(params->shape)
{
case NOSHAPE:
break;
case RECT:
x1 = params->xCenter - params->xRectLength/2;
x2 = params->xCenter + params->xRectLength/2;
y1 = params->yCenter - params->yRectLength/2;
y2 = params->yCenter + params->yRectLength/2;
switch (params->shape) {
case NOSHAPE:
break;
case RECT:
x1 = params->xCenter - params->xRectLength / 2;
x2 = params->xCenter + params->xRectLength / 2;
y1 = params->yCenter - params->yRectLength / 2;
y2 = params->yCenter + params->yRectLength / 2;
for (int j = 1; j < jmax + 1; j++)
{
for (int i = 1; i < imax + 1; i++)
{
if((x1 <= (i*dx)) && ((i*dx) <= x2) && (y1 <= (j*dy)) && ((j*dy) <= y2))
{
S(i, j) = LOCAL;
}
for (int j = 1; j < jmax + 1; j++) {
for (int i = 1; i < imax + 1; i++) {
if ((x1 <= (i * dx)) && ((i * dx) <= x2) && (y1 <= (j * dy)) &&
((j * dy) <= y2)) {
S(i, j) = LOCAL;
}
}
}
break;
case CIRCLE:
xCenter = params->xCenter;
yCenter = params->yCenter;
radius = params->circleRadius;
break;
case CIRCLE:
xCenter = params->xCenter;
yCenter = params->yCenter;
radius = params->circleRadius;
for (int j = 1; j < jmax + 1; j++)
{
for (int i = 1; i < imax + 1; i++)
{
if(distance((i*dx), (j*dy), xCenter, yCenter) <= radius)
{
S(i, j) = LOCAL;
}
for (int j = 1; j < jmax + 1; j++) {
for (int i = 1; i < imax + 1; i++) {
if (distance((i * dx), (j * dy), xCenter, yCenter) <= radius) {
S(i, j) = LOCAL;
}
}
}
break;
default:
break;
break;
default:
break;
}
for (int j = 1; j < jmax + 1; j++)
{
for (int i = 1; i < imax + 1; i++)
{
// if( S(i+1,j+1) == NONE && S(i+1,j) == NONE && S(i,j+1) == NONE && S(i-1,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOMRIGHT;
// else if( S(i-1,j+1) == NONE && S(i-1,j) == NONE && S(i,j+1) == NONE && S(i+1,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOMLEFT;
// else if( S(i+1,j-1) == NONE && S(i,j-1) == NONE && S(i+1,j) == NONE && S(i-1,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = TOPRIGHT;
// else if( S(i-1,j-1) == NONE && S(i,j-1) == NONE && S(i-1,j) == NONE && S(i+1,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = TOPLEFT;
// else if( S(i+1,j) == NONE && S(i-1,j) == LOCAL && S(i,j) == LOCAL ) S(i,j) = RIGHT;
// else if( S(i,j+1) == NONE && S(i,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOM;
// else if( S(i-1,j) == NONE && S(i+1,j) == LOCAL && S(i,j) == LOCAL ) S(i,j) = LEFT;
// else if( S(i,j-1) == NONE && S(i,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = TOP;
for (int j = 1; j < jmax + 1; j++) {
for (int i = 1; i < imax + 1; i++) {
// if( S(i+1,j+1) == NONE && S(i+1,j) == NONE && S(i,j+1) == NONE &&
// S(i-1,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOMRIGHT; else if(
// S(i-1,j+1) == NONE && S(i-1,j) == NONE && S(i,j+1) == NONE && S(i+1,j-1) ==
// LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOMLEFT; else if( S(i+1,j-1) == NONE
// && S(i,j-1) == NONE && S(i+1,j) == NONE && S(i-1,j+1) == LOCAL && S(i,j) ==
// LOCAL ) S(i,j) = TOPRIGHT; else if( S(i-1,j-1) == NONE && S(i,j-1) == NONE
// && S(i-1,j) == NONE && S(i+1,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j) =
// TOPLEFT; else if( S(i+1,j) == NONE && S(i-1,j) == LOCAL && S(i,j) == LOCAL
// ) S(i,j) = RIGHT; else if( S(i,j+1) == NONE && S(i,j-1) == LOCAL && S(i,j)
// == LOCAL ) S(i,j) = BOTTOM; else if( S(i-1,j) == NONE && S(i+1,j) == LOCAL
// && S(i,j) == LOCAL ) S(i,j) = LEFT; else if( S(i,j-1) == NONE && S(i,j+1)
// == LOCAL && S(i,j) == LOCAL ) S(i,j) = TOP;
if( S(i,j-1) == NONE && S(i,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOM; //TOP
if( S(i-1,j) == NONE && S(i+1,j) == LOCAL && S(i,j) == LOCAL ) S(i,j) = LEFT; //LEFT
if( S(i+1,j) == NONE && S(i-1,j) == LOCAL && S(i,j) == LOCAL ) S(i,j) = RIGHT; //RIGHT
if( S(i,j+1) == NONE && S(i,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = TOP; //BOTTOM
if( S(i-1,j-1) == NONE && S(i,j-1) == NONE && S(i-1,j) == NONE && S(i+1,j+1) == LOCAL && (S(i,j) == LOCAL || S(i,j) == LEFT || S(i,j) == BOTTOM ) ) S(i,j) = BOTTOMLEFT; //TOPLEFT
if( S(i+1,j-1) == NONE && S(i,j-1) == NONE && S(i+1,j) == NONE && S(i-1,j+1) == LOCAL && (S(i,j) == LOCAL || S(i,j) == RIGHT || S(i,j) == BOTTOM ) ) S(i,j) = BOTTOMRIGHT; //TOPRIGHT
if( S(i-1,j+1) == NONE && S(i-1,j) == NONE && S(i,j+1) == NONE && S(i+1,j-1) == LOCAL && (S(i,j) == LOCAL || S(i,j) == LEFT || S(i,j) == TOP )) S(i,j) = TOPLEFT; //BOTTOMLEFT
if( S(i+1,j+1) == NONE && S(i+1,j) == NONE && S(i,j+1) == NONE && S(i-1,j-1) == LOCAL && (S(i,j) == LOCAL || S(i,j) == RIGHT || S(i,j) == TOP ) ) S(i,j) = TOPRIGHT; //BOTTOMRIGHT
if (S(i, j - 1) == NONE && S(i, j + 1) == LOCAL && S(i, j) == LOCAL)
S(i, j) = BOTTOM; // TOP
if (S(i - 1, j) == NONE && S(i + 1, j) == LOCAL && S(i, j) == LOCAL)
S(i, j) = LEFT; // LEFT
if (S(i + 1, j) == NONE && S(i - 1, j) == LOCAL && S(i, j) == LOCAL)
S(i, j) = RIGHT; // RIGHT
if (S(i, j + 1) == NONE && S(i, j - 1) == LOCAL && S(i, j) == LOCAL)
S(i, j) = TOP; // BOTTOM
if (S(i - 1, j - 1) == NONE && S(i, j - 1) == NONE && S(i - 1, j) == NONE &&
S(i + 1, j + 1) == LOCAL &&
(S(i, j) == LOCAL || S(i, j) == LEFT || S(i, j) == BOTTOM))
S(i, j) = BOTTOMLEFT; // TOPLEFT
if (S(i + 1, j - 1) == NONE && S(i, j - 1) == NONE && S(i + 1, j) == NONE &&
S(i - 1, j + 1) == LOCAL &&
(S(i, j) == LOCAL || S(i, j) == RIGHT || S(i, j) == BOTTOM))
S(i, j) = BOTTOMRIGHT; // TOPRIGHT
if (S(i - 1, j + 1) == NONE && S(i - 1, j) == NONE && S(i, j + 1) == NONE &&
S(i + 1, j - 1) == LOCAL &&
(S(i, j) == LOCAL || S(i, j) == LEFT || S(i, j) == TOP))
S(i, j) = TOPLEFT; // BOTTOMLEFT
if (S(i + 1, j + 1) == NONE && S(i + 1, j) == NONE && S(i, j + 1) == NONE &&
S(i - 1, j - 1) == LOCAL &&
(S(i, j) == LOCAL || S(i, j) == RIGHT || S(i, j) == TOP))
S(i, j) = TOPRIGHT; // BOTTOMRIGHT
}
}
@@ -223,12 +232,11 @@ void computeRHS(Solver* solver)
double* g = solver->g;
int* s = solver->s;
for (int j = 1; j < jmax + 1; j++)
{
for (int i = 1; i < imax + 1; i++)
{
// if(S(i,j) == NONE)
RHS(i, j) = idt * ((F(i, j) - F(i - 1, j)) * idx + (G(i, j) - G(i, j - 1)) * idy);
for (int j = 1; j < jmax + 1; j++) {
for (int i = 1; i < imax + 1; i++) {
// if(S(i,j) == NONE)
RHS(i, j) = idt *
((F(i, j) - F(i - 1, j)) * idx + (G(i, j) - G(i, j - 1)) * idy);
}
}
}
@@ -276,7 +284,7 @@ void solve(Solver* solver)
}
res = res / (double)(imax * jmax);
#ifdef DEBUG
printf("%d Residuum: %e\n", it, res);
#endif
@@ -311,7 +319,6 @@ void solveRB(Solver* solver)
res = 0.0;
jsw = 1;
for (int i = 1; i < imax + 1; i++) {
P(i, 0) = P(i, 1);
P(i, jmax + 1) = P(i, jmax);
@@ -324,23 +331,20 @@ void solveRB(Solver* solver)
// setObjectPBoundaryCondition(solver);
for (pass = 0; pass < 2; pass++)
{
for (pass = 0; pass < 2; pass++) {
isw = jsw;
for (int j = 1; j < jmax + 1; j++)
{
for (int i = isw; i < imax + 1; i += 2)
{
for (int j = 1; j < jmax + 1; j++) {
for (int i = isw; i < imax + 1; i += 2) {
// if(S(i,j) == NONE)
// {
double r = RHS(i, j) -
((P(i + 1, j) - 2.0 * P(i, j) + P(i - 1, j)) * idx2 +
(P(i, j + 1) - 2.0 * P(i, j) + P(i, j - 1)) * idy2);
double r = RHS(i, j) -
((P(i + 1, j) - 2.0 * P(i, j) + P(i - 1, j)) * idx2 +
(P(i, j + 1) - 2.0 * P(i, j) + P(i, j - 1)) * idy2);
P(i, j) -= (factor * r );
res += (r * r);
P(i, j) -= (factor * r);
res += (r * r);
// }
}
isw = 3 - isw;
@@ -349,7 +353,7 @@ void solveRB(Solver* solver)
}
res = res / (double)(imax * jmax);
#ifdef DEBUG
printf("%d Residuum: %e\n", it, res);
#endif
@@ -400,7 +404,7 @@ void solveRBA(Solver* solver)
}
isw = 3 - isw;
}
jsw = 3 - jsw;
jsw = 3 - jsw;
omega = (it == 0 && pass == 0 ? 1.0 / (1.0 - 0.5 * rho * rho)
: 1.0 / (1.0 - 0.25 * rho * rho * omega));
}
@@ -589,8 +593,7 @@ void setSpecialBoundaryCondition(Solver* solver)
for (int i = 1; i < imax; i++) {
U(i, jmax + 1) = 2.0 - U(i, jmax);
}
}
else if (strcmp(solver->problem, "canal") == 0) {
} else if (strcmp(solver->problem, "canal") == 0) {
double ylength = solver->ylength;
double y;
@@ -598,18 +601,12 @@ void setSpecialBoundaryCondition(Solver* solver)
y = mDy * (j - 0.5);
U(0, j) = y * (ylength - y) * 4.0 / (ylength * ylength);
}
}
else if (strcmp(solver->problem, "backstep") == 0)
{
for (int j = 1; j < jmax + 1; j++)
{
if(S(0,j) == NONE) U(0, j) = 1.0;
} else if (strcmp(solver->problem, "backstep") == 0) {
for (int j = 1; j < jmax + 1; j++) {
if (S(0, j) == NONE) U(0, j) = 1.0;
}
}
else if (strcmp(solver->problem, "karman") == 0)
{
for (int j = 1; j < jmax + 1; j++)
{
} else if (strcmp(solver->problem, "karman") == 0) {
for (int j = 1; j < jmax + 1; j++) {
U(0, j) = 1.0;
}
}
@@ -617,62 +614,59 @@ void setSpecialBoundaryCondition(Solver* solver)
void setObjectBoundaryCondition(Solver* solver)
{
int imax = solver->imax;
int jmax = solver->jmax;
double* u = solver->u;
double* v = solver->v;
int* s = solver->s;
int imax = solver->imax;
int jmax = solver->jmax;
double* u = solver->u;
double* v = solver->v;
int* s = solver->s;
for (int j = 1; j < jmax + 1; j++)
{
for (int i = 1; i < imax + 1; i++)
{
switch(S(i,j))
{
case TOP:
U(i,j) = -U(i,j+1);
U(i-1,j) = -U(i-1,j+1);
V(i,j) = 0.0;
break;
case BOTTOM:
U(i,j) = -U(i,j-1);
U(i-1,j) = -U(i-1,j-1);
V(i,j) = 0.0;
break;
case LEFT:
U(i-1,j) = 0.0;
V(i,j) = -V(i-1,j);
V(i,j-1) = -V(i-1,j-1);
break;
case RIGHT:
U(i,j) = 0.0;
V(i,j) = -V(i+1,j);
V(i,j-1) = -V(i+1,j-1);
break;
case TOPLEFT:
U(i,j) = -U(i,j+1);
U(i-1,j) = 0.0;
V(i,j) = 0.0;
V(i,j-1) = -V(i-1,j-1);
break;
case TOPRIGHT:
U(i,j) = 0.0;
U(i-1,j) = -U(i-1,j+1);
V(i,j) = 0.0;
V(i,j-1) = -V(i+1,j-1);
break;
case BOTTOMLEFT:
U(i,j) = -U(i,j-1);
U(i-1,j) = 0.0;
V(i,j) = -V(i-1,j);
V(i,j-1) = 0.0;
break;
case BOTTOMRIGHT:
U(i,j) = 0.0;
U(i-1,j) = -U(i-1,j-1);
V(i,j) = -V(i,j+1);
V(i,j-1) = 0.0;
break;
for (int j = 1; j < jmax + 1; j++) {
for (int i = 1; i < imax + 1; i++) {
switch (S(i, j)) {
case TOP:
U(i, j) = -U(i, j + 1);
U(i - 1, j) = -U(i - 1, j + 1);
V(i, j) = 0.0;
break;
case BOTTOM:
U(i, j) = -U(i, j - 1);
U(i - 1, j) = -U(i - 1, j - 1);
V(i, j) = 0.0;
break;
case LEFT:
U(i - 1, j) = 0.0;
V(i, j) = -V(i - 1, j);
V(i, j - 1) = -V(i - 1, j - 1);
break;
case RIGHT:
U(i, j) = 0.0;
V(i, j) = -V(i + 1, j);
V(i, j - 1) = -V(i + 1, j - 1);
break;
case TOPLEFT:
U(i, j) = -U(i, j + 1);
U(i - 1, j) = 0.0;
V(i, j) = 0.0;
V(i, j - 1) = -V(i - 1, j - 1);
break;
case TOPRIGHT:
U(i, j) = 0.0;
U(i - 1, j) = -U(i - 1, j + 1);
V(i, j) = 0.0;
V(i, j - 1) = -V(i + 1, j - 1);
break;
case BOTTOMLEFT:
U(i, j) = -U(i, j - 1);
U(i - 1, j) = 0.0;
V(i, j) = -V(i - 1, j);
V(i, j - 1) = 0.0;
break;
case BOTTOMRIGHT:
U(i, j) = 0.0;
U(i - 1, j) = -U(i - 1, j - 1);
V(i, j) = -V(i, j + 1);
V(i, j - 1) = 0.0;
break;
}
}
}
@@ -680,45 +674,42 @@ void setObjectBoundaryCondition(Solver* solver)
void setObjectPBoundaryCondition(Solver* solver)
{
int imax = solver->imax;
int jmax = solver->jmax;
double* p = solver->p;
int* s = solver->s;
for (int j = 1; j < jmax + 1; j++)
{
for (int i = 1; i < imax + 1; i++)
{
switch (S(i,j))
{
case TOP:
P(i,j) = P(i,j+1);
break;
case BOTTOM:
P(i,j) = P(i,j-1);
break;
case LEFT:
P(i,j) = P(i-1,j);
break;
case RIGHT:
P(i,j) = P(i,j+1);
break;
case TOPLEFT:
P(i,j) = (P(i-1,j) + P(i,j+1))/2;
break;
case TOPRIGHT:
P(i,j) = (P(i+1,j) + P(i,j+1))/2;
break;
case BOTTOMLEFT:
P(i,j) = (P(i-1,j) + P(i,j-1))/2;
break;
case BOTTOMRIGHT:
P(i,j) = (P(i+1,j) + P(i,j-1))/2;
break;
default:
break;
int imax = solver->imax;
int jmax = solver->jmax;
double* p = solver->p;
int* s = solver->s;
for (int j = 1; j < jmax + 1; j++) {
for (int i = 1; i < imax + 1; i++) {
switch (S(i, j)) {
case TOP:
P(i, j) = P(i, j + 1);
break;
case BOTTOM:
P(i, j) = P(i, j - 1);
break;
case LEFT:
P(i, j) = P(i - 1, j);
break;
case RIGHT:
P(i, j) = P(i, j + 1);
break;
case TOPLEFT:
P(i, j) = (P(i - 1, j) + P(i, j + 1)) / 2;
break;
case TOPRIGHT:
P(i, j) = (P(i + 1, j) + P(i, j + 1)) / 2;
break;
case BOTTOMLEFT:
P(i, j) = (P(i - 1, j) + P(i, j - 1)) / 2;
break;
case BOTTOMRIGHT:
P(i, j) = (P(i + 1, j) + P(i, j - 1)) / 2;
break;
default:
break;
}
}
}
@@ -743,12 +734,9 @@ void computeFG(Solver* solver)
double du2dx, dv2dy, duvdx, duvdy;
double du2dx2, du2dy2, dv2dx2, dv2dy2;
for (int j = 1; j < jmax + 1; j++)
{
for (int i = 1; i < imax + 1; i++)
{
if(S(i,j) == NONE)
{
for (int j = 1; j < jmax + 1; j++) {
for (int i = 1; i < imax + 1; i++) {
if (S(i, j) == NONE) {
du2dx = inverseDx * 0.25 *
((U(i, j) + U(i + 1, j)) * (U(i, j) + U(i + 1, j)) -
(U(i, j) + U(i - 1, j)) * (U(i, j) + U(i - 1, j))) +
@@ -758,19 +746,24 @@ void computeFG(Solver* solver)
duvdy = inverseDy * 0.25 *
((V(i, j) + V(i + 1, j)) * (U(i, j) + U(i, j + 1)) -
(V(i, j - 1) + V(i + 1, j - 1)) * (U(i, j) + U(i, j - 1))) +
(V(i, j - 1) + V(i + 1, j - 1)) *
(U(i, j) + U(i, j - 1))) +
gamma * inverseDy * 0.25 *
(fabs(V(i, j) + V(i + 1, j)) * (U(i, j) - U(i, j + 1)) +
fabs(V(i, j - 1) + V(i + 1, j - 1)) *
(U(i, j) - U(i, j - 1)));
du2dx2 = inverseDx * inverseDx * (U(i + 1, j) - 2.0 * U(i, j) + U(i - 1, j));
du2dy2 = inverseDy * inverseDy * (U(i, j + 1) - 2.0 * U(i, j) + U(i, j - 1));
F(i, j) = U(i, j) + dt * (inverseRe * (du2dx2 + du2dy2) - du2dx - duvdy + gx);
du2dx2 = inverseDx * inverseDx *
(U(i + 1, j) - 2.0 * U(i, j) + U(i - 1, j));
du2dy2 = inverseDy * inverseDy *
(U(i, j + 1) - 2.0 * U(i, j) + U(i, j - 1));
F(i, j) = U(i, j) +
dt * (inverseRe * (du2dx2 + du2dy2) - du2dx - duvdy + gx);
duvdx = inverseDx * 0.25 *
((U(i, j) + U(i, j + 1)) * (V(i, j) + V(i + 1, j)) -
(U(i - 1, j) + U(i - 1, j + 1)) * (V(i, j) + V(i - 1, j))) +
(U(i - 1, j) + U(i - 1, j + 1)) *
(V(i, j) + V(i - 1, j))) +
gamma * inverseDx * 0.25 *
(fabs(U(i, j) + U(i, j + 1)) * (V(i, j) - V(i + 1, j)) +
fabs(U(i - 1, j) + U(i - 1, j + 1)) *
@@ -783,42 +776,42 @@ void computeFG(Solver* solver)
(fabs(V(i, j) + V(i, j + 1)) * (V(i, j) - V(i, j + 1)) +
fabs(V(i, j) + V(i, j - 1)) * (V(i, j) - V(i, j - 1)));
dv2dx2 = inverseDx * inverseDx * (V(i + 1, j) - 2.0 * V(i, j) + V(i - 1, j));
dv2dy2 = inverseDy * inverseDy * (V(i, j + 1) - 2.0 * V(i, j) + V(i, j - 1));
G(i, j) = V(i, j) + dt * (inverseRe * (dv2dx2 + dv2dy2) - duvdx - dv2dy + gy);
}
else
{
switch(S(i,j))
{
case TOP:
G(i,j) = V(i,j);
break;
case BOTTOM:
G(i,j-1) = V(i,j-1);
break;
case LEFT:
F(i-1,j) = U(i-1,j);
break;
case RIGHT:
F(i,j) = U(i,j);
break;
case TOPLEFT:
F(i-1,j) = U(i-1,j);
G(i,j) = V(i,j);
break;
case TOPRIGHT:
F(i,j) = U(i,j);
G(i,j) = V(i,j);
break;
case BOTTOMLEFT:
F(i-1,j) = U(i-1,j);
G(i,j-1) = V(i,j-1);
break;
case BOTTOMRIGHT:
F(i,j) = U(i,j);
G(i,j-1) = V(i,j-1);
break;
dv2dx2 = inverseDx * inverseDx *
(V(i + 1, j) - 2.0 * V(i, j) + V(i - 1, j));
dv2dy2 = inverseDy * inverseDy *
(V(i, j + 1) - 2.0 * V(i, j) + V(i, j - 1));
G(i, j) = V(i, j) +
dt * (inverseRe * (dv2dx2 + dv2dy2) - duvdx - dv2dy + gy);
} else {
switch (S(i, j)) {
case TOP:
G(i, j) = V(i, j);
break;
case BOTTOM:
G(i, j - 1) = V(i, j - 1);
break;
case LEFT:
F(i - 1, j) = U(i - 1, j);
break;
case RIGHT:
F(i, j) = U(i, j);
break;
case TOPLEFT:
F(i - 1, j) = U(i - 1, j);
G(i, j) = V(i, j);
break;
case TOPRIGHT:
F(i, j) = U(i, j);
G(i, j) = V(i, j);
break;
case BOTTOMLEFT:
F(i - 1, j) = U(i - 1, j);
G(i, j - 1) = V(i, j - 1);
break;
case BOTTOMRIGHT:
F(i, j) = U(i, j);
G(i, j - 1) = V(i, j - 1);
break;
}
}
}
@@ -834,7 +827,7 @@ void computeFG(Solver* solver)
for (int i = 1; i < imax + 1; i++) {
G(i, 0) = V(i, 0);
G(i, jmax) = V(i, jmax);
}
}
}
void adaptUV(Solver* solver)
@@ -852,10 +845,8 @@ void adaptUV(Solver* solver)
double val = 0;
for (int j = 1; j < jmax + 1; j++)
{
for (int i = 1; i < imax + 1; i++)
{
for (int j = 1; j < jmax + 1; j++) {
for (int i = 1; i < imax + 1; i++) {
U(i, j) = F(i, j) - (P(i + 1, j) - P(i, j)) * factorX;
V(i, j) = G(i, j) - (P(i, j + 1) - P(i, j)) * factorY;
}

View File

@@ -1,7 +1,7 @@
set terminal png size 3600,768 enhanced font ,28
set output 'velocity.png'
set xrange[0:30]
set yrange[0:4]
set xrange[0:7]
set yrange[0:1.5]
set size ratio -1
set datafile separator whitespace

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

After

Width:  |  Height:  |  Size: 188 KiB

View File

@@ -1,8 +1,10 @@
unset border; unset tics; unset key;
set term gif animate delay 50
set term gif animate delay 10
set output "trace.gif"
set xrange [0:7]
set yrange [0:1.5]
set size ratio -1
set object 1 rect from 0.0,0.0 to 1.0,0.5 lw 5

Binary file not shown.

Before

Width:  |  Height:  |  Size: 732 KiB

After

Width:  |  Height:  |  Size: 453 KiB