Enhancednced solver.

This commit is contained in:
2023-09-19 12:10:00 +02:00
parent eb14891126
commit 70611112d5
97 changed files with 20278 additions and 351510 deletions

View File

@@ -57,9 +57,9 @@ int main (int argc, char** argv)
void (*solver_generic[])() = {solve, solveRB, solveRBA};
//print(&solver, solver.s);
// printGrid(&solver, solver.s);
//exit(0);
// exit(0);
S = getTimeStamp();
@@ -68,14 +68,17 @@ int main (int argc, char** argv)
if (tau > 0.0) computeTimestep(&solver);
setBoundaryConditions(&solver);
setSpecialBoundaryCondition(&solver);
setObjectBoundaryCondition(&solver);
computeFG(&solver);
computeRHS(&solver);
if (nt % 100 == 0) normalizePressure(&solver);
//if (nt % 100 == 0) normalizePressure(&solver);
solver_generic[variant - 1](&solver);
adaptUV(&solver);
/* Added function for particle tracing. Will inject and advance particles as per timePeriod */
//trace(&particletracer, solver.u, solver.v, t);
// trace(&particletracer, solver.u, solver.v, t);
t += solver.dt;
nt++;
@@ -96,6 +99,11 @@ int main (int argc, char** argv)
freeParticles(&particletracer);
// printf("\nU : \n\n");
// print(&solver, solver.u);
// printf("\nV : \n\n");
// print(&solver, solver.v);
printf("Solution took %.2fs\n", E - S);
writeResult(&solver);
return EXIT_SUCCESS;

View File

@@ -43,6 +43,20 @@ void print(Solver* solver, double* grid)
fflush(stdout);
}
void printGrid(Solver* solver, int* grid)
{
int imax = solver->imax;
for (int j = 0; j < solver->jmax + 2; j++) {
printf("%02d: ", j);
for (int i = 0; i < solver->imax + 2; i++) {
printf("%2d ", grid[j * (imax + 2) + i]);
}
printf("\n");
}
fflush(stdout);
}
static void printConfig(Solver* solver)
{
printf("Parameters for #%s#\n", solver->problem);
@@ -111,7 +125,7 @@ void initSolver(Solver* solver, Parameter* params)
solver->rhs[i] = 0.0;
solver->f[i] = 0.0;
solver->g[i] = 0.0;
solver->s[i] = 1.0;
solver->s[i] = NONE;
}
double dx = solver->dx;
@@ -121,7 +135,7 @@ void initSolver(Solver* solver, Parameter* params)
int iCenter = 0, jCenter = 0, iRectLength = 0, jRectLength = 0, radius = 0;
double* s = solver->s;
int* s = solver->s;
switch(params->shape)
{
@@ -148,8 +162,7 @@ void initSolver(Solver* solver, Parameter* params)
{
if(i1 <= i && i <= i2 && j1 <= j && j <= j2)
{
// if(i == i1 || i == i2 || j == j1 || j == j2) S(i, j) = 2.0;
S(i, j) = 0.0;
S(i, j) = LOCAL;
}
}
}
@@ -166,7 +179,7 @@ void initSolver(Solver* solver, Parameter* params)
{
if(distance(i, j, iCenter, jCenter) <= radius)
{
S(i, j) = 0.0;
S(i, j) = LOCAL;
}
}
}
@@ -176,6 +189,30 @@ void initSolver(Solver* solver, Parameter* params)
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;
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
}
}
#ifdef VERBOSE
printConfig(solver);
#endif
@@ -191,11 +228,14 @@ void computeRHS(Solver* solver)
double* rhs = solver->rhs;
double* f = solver->f;
double* g = solver->g;
int* s = solver->s;
for (int j = 1; j < jmax + 1; j++) {
for (int i = 1; i < imax + 1; i++) {
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);
}
}
}
@@ -266,7 +306,7 @@ void solveRB(Solver* solver)
double idy2 = 1.0 / dy2;
double factor = solver->omega * 0.5 * (dx2 * dy2) / (dx2 + dy2);
double* p = solver->p;
double* s = solver->s;
int* s = solver->s;
double* rhs = solver->rhs;
double epssq = eps * eps;
int it = 0;
@@ -278,22 +318,24 @@ void solveRB(Solver* solver)
res = 0.0;
jsw = 1;
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) {
// val = S(i+1, j) + S(i-1, j) + S(i, j+1) + S(i, j-1);
// if(val == 0 || S(i,j) == 0)
for (int j = 1; j < jmax + 1; j++)
{
for (int i = isw; i < imax + 1; i += 2)
{
// if(S(i,j) == NONE)
// {
// continue;
// }
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;
}
@@ -310,6 +352,8 @@ void solveRB(Solver* solver)
P(imax + 1, j) = P(imax, j);
}
//setObjectPBoundaryCondition(solver);
res = res / (double)(imax * jmax);
#ifdef DEBUG
@@ -561,12 +605,122 @@ 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;
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,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;
}
}
}
}
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;
}
}
}
}
void computeFG(Solver* solver)
{
double* u = solver->u;
double* v = solver->v;
double* f = solver->f;
double* g = solver->g;
int* s = solver->s;
int imax = solver->imax;
int jmax = solver->jmax;
double gx = solver->gx;
@@ -579,45 +733,84 @@ 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++) {
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))) +
gamma * inverseDx * 0.25 *
(fabs(U(i, j) + U(i + 1, j)) * (U(i, j) - U(i + 1, j)) +
fabs(U(i, j) + U(i - 1, j)) * (U(i, j) - U(i - 1, j)));
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))) +
gamma * inverseDx * 0.25 *
(fabs(U(i, j) + U(i + 1, j)) * (U(i, j) - U(i + 1, j)) +
fabs(U(i, j) + U(i - 1, j)) * (U(i, j) - U(i - 1, j)));
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))) +
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)));
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))) +
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))) +
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)) *
(V(i, j) - V(i - 1, j)));
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))) +
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)) *
(V(i, j) - V(i - 1, j)));
dv2dy = inverseDy * 0.25 *
((V(i, j) + V(i, j + 1)) * (V(i, j) + V(i, j + 1)) -
(V(i, j) + V(i, j - 1)) * (V(i, j) + V(i, j - 1))) +
gamma * inverseDy * 0.25 *
(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)));
dv2dy = inverseDy * 0.25 *
((V(i, j) + V(i, j + 1)) * (V(i, j) + V(i, j + 1)) -
(V(i, j) + V(i, j - 1)) * (V(i, j) + V(i, j - 1))) +
gamma * inverseDy * 0.25 *
(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);
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;
}
}
}
}
@@ -641,7 +834,7 @@ void adaptUV(Solver* solver)
double* p = solver->p;
double* u = solver->u;
double* v = solver->v;
double* s = solver->s;
int* s = solver->s;
double* f = solver->f;
double* g = solver->g;
double factorX = solver->dt / solver->dx;
@@ -653,19 +846,6 @@ void adaptUV(Solver* solver)
{
for (int i = 1; i < imax + 1; i++)
{
val = S(i+1, j) + S(i-1, j) + S(i, j+1) + S(i, j-1);
if(S(i,j) == 0 && val == 0)
{
U(i, j) = 0;
V(i, j) = 0;
continue;
}
// else if(S(i,j) == 2.0)
// {
// U(i, j) = -U(i, j);
// V(i, j) = -V(i, j);
// continue;
// }
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

@@ -8,6 +8,7 @@
#define __SOLVER_H_
#include "parameter.h"
enum OBJECTBOUNDARY { NONE = 0, TOP, BOTTOM, LEFT, RIGHT, TOPLEFT, BOTTOMLEFT, TOPRIGHT, BOTTOMRIGHT, LOCAL };
enum BC { NOSLIP = 1, SLIP, OUTFLOW, PERIODIC };
/// @brief
enum SHAPE { NOSHAPE = 0, RECT, CIRCLE };
@@ -20,7 +21,8 @@ typedef struct {
/* arrays */
double *p, *rhs;
double *f, *g;
double *u, *v, *s;
double *u, *v;
int *s;
/* parameters */
double eps, omega, rho;
double re, tau, gamma;
@@ -42,8 +44,12 @@ extern void normalizePressure(Solver*);
extern void computeTimestep(Solver*);
extern void setBoundaryConditions(Solver*);
extern void setSpecialBoundaryCondition(Solver*);
extern void setObjectBoundaryCondition(Solver*);
extern void setObjectPBoundaryCondition(Solver*);
extern void computeFG(Solver*);
extern void adaptUV(Solver*);
extern void writeResult(Solver*);
extern void print(Solver*, double*);
extern void printGrid(Solver*, int*);
#endif