WIP: Pull Request for a complete Solver package #2
@ -32,7 +32,7 @@ jmax 45 # number of interior cells in y-direction
|
|||||||
# Time Data:
|
# Time Data:
|
||||||
# ---------
|
# ---------
|
||||||
|
|
||||||
te 60.0 # final time
|
te 100.0 # final time
|
||||||
dt 0.02 # time stepsize
|
dt 0.02 # time stepsize
|
||||||
tau 0.5 # safety factor for time stepsize control (<0 constant delt)
|
tau 0.5 # safety factor for time stepsize control (<0 constant delt)
|
||||||
|
|
||||||
@ -44,12 +44,13 @@ eps 0.0001 # stopping tolerance for pressure iteration
|
|||||||
rho 0.52
|
rho 0.52
|
||||||
omg 1.8 # relaxation parameter for SOR iteration
|
omg 1.8 # relaxation parameter for SOR iteration
|
||||||
gamma 0.9 # upwind differencing factor gamma
|
gamma 0.9 # upwind differencing factor gamma
|
||||||
|
levels 5 # Multigrid levels
|
||||||
|
|
||||||
# Particle Tracing Data:
|
# Particle Tracing Data:
|
||||||
# -----------------------
|
# -----------------------
|
||||||
|
|
||||||
numberOfParticles 200
|
numberOfParticles 200
|
||||||
startTime 0
|
startTime 100
|
||||||
injectTimePeriod 1.0
|
injectTimePeriod 1.0
|
||||||
writeTimePeriod 0.5
|
writeTimePeriod 0.5
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ levels 5 # Multigrid levels
|
|||||||
# -----------------------
|
# -----------------------
|
||||||
|
|
||||||
numberOfParticles 60
|
numberOfParticles 60
|
||||||
startTime 1000
|
startTime 100
|
||||||
injectTimePeriod 2.0
|
injectTimePeriod 2.0
|
||||||
writeTimePeriod 0.5
|
writeTimePeriod 0.5
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ eps 0.001 # stopping tolerance for pressure iteration
|
|||||||
rho 0.5
|
rho 0.5
|
||||||
omg 1.8 # relaxation parameter for SOR iteration
|
omg 1.8 # relaxation parameter for SOR iteration
|
||||||
gamma 0.9 # upwind differencing factor gamma
|
gamma 0.9 # upwind differencing factor gamma
|
||||||
|
levels 5 # Multigrid levels
|
||||||
|
|
||||||
# Particle Tracing Data:
|
# Particle Tracing Data:
|
||||||
# -----------------------
|
# -----------------------
|
||||||
|
@ -44,12 +44,13 @@ eps 0.001 # stopping tolerance for pressure iteration
|
|||||||
rho 0.52
|
rho 0.52
|
||||||
omg 1.75 # relaxation parameter for SOR iteration
|
omg 1.75 # relaxation parameter for SOR iteration
|
||||||
gamma 0.9 # upwind differencing factor gamma
|
gamma 0.9 # upwind differencing factor gamma
|
||||||
|
levels 5 # Multigrid levels
|
||||||
|
|
||||||
# Particle Tracing Data:
|
# Particle Tracing Data:
|
||||||
# -----------------------
|
# -----------------------
|
||||||
|
|
||||||
numberOfParticles 200
|
numberOfParticles 200
|
||||||
startTime 50
|
startTime 201
|
||||||
injectTimePeriod 1.0
|
injectTimePeriod 1.0
|
||||||
writeTimePeriod 0.5
|
writeTimePeriod 0.5
|
||||||
|
|
||||||
|
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
File diff suppressed because it is too large
Load Diff
@ -39,6 +39,8 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
printParameter(¶ms);
|
printParameter(¶ms);
|
||||||
initSolver(&solver, ¶ms);
|
initSolver(&solver, ¶ms);
|
||||||
|
printf("initsolver done\n");
|
||||||
|
|
||||||
initParticleTracer(&particletracer, ¶ms);
|
initParticleTracer(&particletracer, ¶ms);
|
||||||
printParticleTracerParameters(&particletracer);
|
printParticleTracerParameters(&particletracer);
|
||||||
|
|
||||||
@ -62,11 +64,12 @@ int main(int argc, char** argv)
|
|||||||
setBoundaryConditions(&solver);
|
setBoundaryConditions(&solver);
|
||||||
setSpecialBoundaryCondition(&solver);
|
setSpecialBoundaryCondition(&solver);
|
||||||
setObjectBoundaryCondition(&solver);
|
setObjectBoundaryCondition(&solver);
|
||||||
|
|
||||||
computeFG(&solver);
|
computeFG(&solver);
|
||||||
computeRHS(&solver);
|
computeRHS(&solver);
|
||||||
|
|
||||||
if (nt % 100 == 0) normalizePressure(&solver);
|
if (nt % 100 == 0) normalizePressure(&solver);
|
||||||
multiGrid(&solver);
|
multiGrid(&solver);
|
||||||
|
|
||||||
adaptUV(&solver);
|
adaptUV(&solver);
|
||||||
|
|
||||||
/* Added function for particle tracing. Will inject and advance particles as per
|
/* Added function for particle tracing. Will inject and advance particles as per
|
||||||
@ -84,18 +87,11 @@ int main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
printf("Total particles : %d\n", particletracer.totalParticles);
|
printf("Total particles : %d\n", particletracer.totalParticles);
|
||||||
|
|
||||||
// print(&solver, solver.p);
|
|
||||||
|
|
||||||
E = getTimeStamp();
|
E = getTimeStamp();
|
||||||
stopProgress();
|
stopProgress();
|
||||||
|
|
||||||
freeParticles(&particletracer);
|
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);
|
printf("Solution took %.2fs\n", E - S);
|
||||||
writeResult(&solver);
|
writeResult(&solver);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
@ -120,8 +120,10 @@ void advanceParticles(ParticleTracer* particletracer,
|
|||||||
|
|
||||||
void freeParticles(ParticleTracer* particletracer)
|
void freeParticles(ParticleTracer* particletracer)
|
||||||
{
|
{
|
||||||
free(particletracer->particlePool);
|
if (particletracer->particlePool != NULL) {
|
||||||
free(particletracer->linSpaceLine);
|
free(particletracer->particlePool);
|
||||||
|
free(particletracer->linSpaceLine);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeParticles(ParticleTracer* particletracer)
|
void writeParticles(ParticleTracer* particletracer)
|
||||||
@ -184,21 +186,28 @@ void initParticleTracer(ParticleTracer* particletracer, Parameter* params)
|
|||||||
particletracer->imax = params->imax;
|
particletracer->imax = params->imax;
|
||||||
particletracer->jmax = params->jmax;
|
particletracer->jmax = params->jmax;
|
||||||
|
|
||||||
particletracer->estimatedNumParticles = ((params->te - params->startTime) + 2) *
|
if (params->te > params->startTime) {
|
||||||
params->numberOfParticles;
|
particletracer->estimatedNumParticles = ((params->te - params->startTime) + 2) *
|
||||||
|
params->numberOfParticles;
|
||||||
|
|
||||||
particletracer->particlePool = malloc(
|
particletracer->particlePool = malloc(
|
||||||
sizeof(Particle) * particletracer->estimatedNumParticles);
|
sizeof(Particle) * particletracer->estimatedNumParticles);
|
||||||
particletracer->linSpaceLine = malloc(
|
particletracer->linSpaceLine = malloc(
|
||||||
sizeof(Particle) * particletracer->numberOfParticles);
|
sizeof(Particle) * particletracer->numberOfParticles);
|
||||||
|
|
||||||
for (int i = 0; i < particletracer->numberOfParticles; ++i) {
|
for (int i = 0; i < particletracer->numberOfParticles; ++i) {
|
||||||
double spacing = (double)i / (double)(particletracer->numberOfParticles - 1);
|
double spacing = (double)i / (double)(particletracer->numberOfParticles - 1);
|
||||||
particletracer->linSpaceLine[i].x = spacing * particletracer->x1 +
|
particletracer->linSpaceLine[i].x = spacing * particletracer->x1 +
|
||||||
(1.0 - spacing) * particletracer->x2;
|
(1.0 - spacing) * particletracer->x2;
|
||||||
particletracer->linSpaceLine[i].y = spacing * particletracer->y1 +
|
particletracer->linSpaceLine[i].y = spacing * particletracer->y1 +
|
||||||
(1.0 - spacing) * particletracer->y2;
|
(1.0 - spacing) * particletracer->y2;
|
||||||
particletracer->linSpaceLine[i].flag = true;
|
particletracer->linSpaceLine[i].flag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
particletracer->particlePool = NULL;
|
||||||
|
particletracer->linSpaceLine = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
#define E(i, j) e[(j) * (imax + 2) + (i)]
|
#define E(i, j) e[(j) * (imax + 2) + (i)]
|
||||||
#define R(i, j) r[(j) * (imax + 2) + (i)]
|
#define R(i, j) r[(j) * (imax + 2) + (i)]
|
||||||
#define oldR(i, j) oldr[(j) * (imax + 2) + (i)]
|
#define oldR(i, j) oldr[(j) * (imax + 2) + (i)]
|
||||||
|
#define oldE(i, j) olde[(j) * (imax + 2) + (i)]
|
||||||
#define RHS(i, j) rhs[(j) * (imax + 2) + (i)]
|
#define RHS(i, j) rhs[(j) * (imax + 2) + (i)]
|
||||||
|
|
||||||
static double distance(double i, double j, double iCenter, double jCenter)
|
static double distance(double i, double j, double iCenter, double jCenter)
|
||||||
{
|
{
|
||||||
@ -126,10 +126,10 @@ void initSolver(Solver* solver, Parameter* params)
|
|||||||
solver->f = allocate(64, size);
|
solver->f = allocate(64, size);
|
||||||
solver->g = allocate(64, size);
|
solver->g = allocate(64, size);
|
||||||
|
|
||||||
solver->r = malloc(levels * sizeof(int*));
|
solver->r = malloc(levels * sizeof(double*));
|
||||||
solver->e = malloc(levels * sizeof(int*));
|
solver->e = malloc(levels * sizeof(double*));
|
||||||
|
|
||||||
for (int j = 1; j <= levels; ++j) {
|
for (int j = 0; j < levels; ++j) {
|
||||||
|
|
||||||
solver->r[j] = allocate(64, size);
|
solver->r[j] = allocate(64, size);
|
||||||
solver->e[j] = allocate(64, size);
|
solver->e[j] = allocate(64, size);
|
||||||
@ -144,7 +144,7 @@ void initSolver(Solver* solver, Parameter* params)
|
|||||||
solver->f[i] = 0.0;
|
solver->f[i] = 0.0;
|
||||||
solver->g[i] = 0.0;
|
solver->g[i] = 0.0;
|
||||||
solver->s[i] = NONE;
|
solver->s[i] = NONE;
|
||||||
for (int j = 1; j <= levels; ++j) {
|
for (int j = 0; j < levels; ++j) {
|
||||||
|
|
||||||
solver->r[j][i] = 0.0;
|
solver->r[j][i] = 0.0;
|
||||||
solver->e[j][i] = 0.0;
|
solver->e[j][i] = 0.0;
|
||||||
@ -198,50 +198,52 @@ void initSolver(Solver* solver, Parameter* params)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 1; j < jmax + 1; j++) {
|
if (params->shape != NOSHAPE) {
|
||||||
for (int i = 1; i < imax + 1; i++) {
|
for (int j = 1; j < jmax + 1; j++) {
|
||||||
// if( S(i+1,j+1) == NONE && S(i+1,j) == NONE && S(i,j+1) == NONE &&
|
for (int i = 1; i < imax + 1; i++) {
|
||||||
// S(i-1,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOMRIGHT; else if(
|
// if( S(i+1,j+1) == NONE && S(i+1,j) == NONE && S(i,j+1) == NONE &&
|
||||||
// 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) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOMLEFT; else if(
|
// S(i-1,j+1) == NONE && S(i-1,j) == NONE && S(i,j+1) == NONE &&
|
||||||
// S(i+1,j-1) == NONE
|
// S(i+1,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOMLEFT; else if(
|
||||||
// && S(i,j-1) == NONE && S(i+1,j) == NONE && S(i-1,j+1) == LOCAL &&
|
// S(i+1,j-1) == NONE
|
||||||
// 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-1) == NONE
|
// S(i,j) == LOCAL ) S(i,j) = TOPRIGHT; else if( S(i-1,j-1) == NONE &&
|
||||||
// && S(i-1,j) == NONE && S(i+1,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j)
|
// S(i,j-1) == NONE
|
||||||
// = TOPLEFT; else if( S(i+1,j) == NONE && S(i-1,j) == LOCAL && S(i,j) ==
|
// && S(i-1,j) == NONE && S(i+1,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j)
|
||||||
// LOCAL ) S(i,j) = RIGHT; else if( S(i,j+1) == NONE && S(i,j-1) == LOCAL
|
// = TOPLEFT; else if( S(i+1,j) == NONE && S(i-1,j) == LOCAL && S(i,j) ==
|
||||||
// && S(i,j)
|
// LOCAL ) S(i,j) = RIGHT; else if( S(i,j+1) == NONE && S(i,j-1) == LOCAL
|
||||||
// == LOCAL ) S(i,j) = BOTTOM; else if( S(i-1,j) == NONE && S(i+1,j) ==
|
// && S(i,j)
|
||||||
// LOCAL
|
// == LOCAL ) S(i,j) = BOTTOM; else if( S(i-1,j) == NONE && S(i+1,j) ==
|
||||||
// && S(i,j) == LOCAL ) S(i,j) = LEFT; else if( S(i,j-1) == NONE &&
|
// LOCAL
|
||||||
// S(i,j+1)
|
// && S(i,j) == LOCAL ) S(i,j) = LEFT; else if( S(i,j-1) == NONE &&
|
||||||
// == LOCAL && S(i,j) == LOCAL ) S(i,j) = TOP;
|
// 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)
|
if (S(i, j - 1) == NONE && S(i, j + 1) == LOCAL && S(i, j) == LOCAL)
|
||||||
S(i, j) = BOTTOM; // TOP
|
S(i, j) = BOTTOM; // TOP
|
||||||
if (S(i - 1, j) == NONE && S(i + 1, j) == LOCAL && S(i, j) == LOCAL)
|
if (S(i - 1, j) == NONE && S(i + 1, j) == LOCAL && S(i, j) == LOCAL)
|
||||||
S(i, j) = LEFT; // LEFT
|
S(i, j) = LEFT; // LEFT
|
||||||
if (S(i + 1, j) == NONE && S(i - 1, j) == LOCAL && S(i, j) == LOCAL)
|
if (S(i + 1, j) == NONE && S(i - 1, j) == LOCAL && S(i, j) == LOCAL)
|
||||||
S(i, j) = RIGHT; // RIGHT
|
S(i, j) = RIGHT; // RIGHT
|
||||||
if (S(i, j + 1) == NONE && S(i, j - 1) == LOCAL && S(i, j) == LOCAL)
|
if (S(i, j + 1) == NONE && S(i, j - 1) == LOCAL && S(i, j) == LOCAL)
|
||||||
S(i, j) = TOP; // BOTTOM
|
S(i, j) = TOP; // BOTTOM
|
||||||
if (S(i - 1, j - 1) == NONE && S(i, j - 1) == NONE && S(i - 1, j) == NONE &&
|
if (S(i - 1, j - 1) == NONE && S(i, j - 1) == NONE &&
|
||||||
S(i + 1, j + 1) == LOCAL &&
|
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) == LOCAL || S(i, j) == LEFT || S(i, j) == BOTTOM))
|
||||||
S(i, j) = BOTTOMLEFT; // TOPLEFT
|
S(i, j) = BOTTOMLEFT; // TOPLEFT
|
||||||
if (S(i + 1, j - 1) == NONE && S(i, j - 1) == NONE && S(i + 1, j) == NONE &&
|
if (S(i + 1, j - 1) == NONE && S(i, j - 1) == NONE &&
|
||||||
S(i - 1, j + 1) == LOCAL &&
|
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) == LOCAL || S(i, j) == RIGHT || S(i, j) == BOTTOM))
|
||||||
S(i, j) = BOTTOMRIGHT; // TOPRIGHT
|
S(i, j) = BOTTOMRIGHT; // TOPRIGHT
|
||||||
if (S(i - 1, j + 1) == NONE && S(i - 1, j) == NONE && S(i, j + 1) == NONE &&
|
if (S(i - 1, j + 1) == NONE && S(i - 1, j) == NONE &&
|
||||||
S(i + 1, j - 1) == LOCAL &&
|
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) == LOCAL || S(i, j) == LEFT || S(i, j) == TOP))
|
||||||
S(i, j) = TOPLEFT; // BOTTOMLEFT
|
S(i, j) = TOPLEFT; // BOTTOMLEFT
|
||||||
if (S(i + 1, j + 1) == NONE && S(i + 1, j) == NONE && S(i, j + 1) == NONE &&
|
if (S(i + 1, j + 1) == NONE && S(i + 1, j) == NONE &&
|
||||||
S(i - 1, j - 1) == LOCAL &&
|
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) == LOCAL || S(i, j) == RIGHT || S(i, j) == TOP))
|
||||||
S(i, j) = TOPRIGHT; // BOTTOMRIGHT
|
S(i, j) = TOPRIGHT; // BOTTOMRIGHT
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -649,7 +651,7 @@ void adaptUV(Solver* solver)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void smoothRB(Solver* solver)
|
double smoothRB(Solver* solver)
|
||||||
{
|
{
|
||||||
int imax = solver->imax;
|
int imax = solver->imax;
|
||||||
int jmax = solver->jmax;
|
int jmax = solver->jmax;
|
||||||
@ -689,12 +691,15 @@ void smoothRB(Solver* solver)
|
|||||||
}
|
}
|
||||||
|
|
||||||
res = res / (double)(imax * jmax);
|
res = res / (double)(imax * jmax);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void multiGrid(Solver* solver)
|
void multiGrid(Solver* solver)
|
||||||
{
|
{
|
||||||
|
double res = 0.0;
|
||||||
if (solver->currentlevel == solver->levels) {
|
int imax = solver->imax;
|
||||||
|
int jmax = solver->jmax;
|
||||||
|
if (solver->currentlevel == (solver->levels - 1)) {
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
smoothRB(solver);
|
smoothRB(solver);
|
||||||
}
|
}
|
||||||
@ -703,11 +708,9 @@ void multiGrid(Solver* solver)
|
|||||||
|
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
smoothRB(solver);
|
smoothRB(solver);
|
||||||
if (solver->currentlevel == 1) {
|
if (solver->currentlevel == 0) {
|
||||||
|
|
||||||
double* p = solver->p;
|
double* p = solver->p;
|
||||||
int imax = solver->imax;
|
|
||||||
int jmax = solver->jmax;
|
|
||||||
|
|
||||||
for (int i = 1; i < imax + 1; i++) {
|
for (int i = 1; i < imax + 1; i++) {
|
||||||
P(i, 0) = P(i, 1);
|
P(i, 0) = P(i, 1);
|
||||||
@ -720,14 +723,18 @@ void multiGrid(Solver* solver)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Solver coarseSolver = copySolver(solver);
|
||||||
Solver* coarseSolver = copySolver(solver);
|
|
||||||
|
|
||||||
// restrict
|
// restrict
|
||||||
restrictMG(solver);
|
restrictMG(solver);
|
||||||
|
|
||||||
|
coarseSolver.p = solver->e[coarseSolver.currentlevel];
|
||||||
|
coarseSolver.rhs = solver->r[coarseSolver.currentlevel];
|
||||||
|
coarseSolver.imax /= 2;
|
||||||
|
coarseSolver.jmax /= 2;
|
||||||
|
|
||||||
// MGSolver on residual and error.
|
// MGSolver on residual and error.
|
||||||
multiGrid(coarseSolver);
|
multiGrid(&coarseSolver);
|
||||||
|
|
||||||
// prolongate
|
// prolongate
|
||||||
prolongate(solver);
|
prolongate(solver);
|
||||||
@ -735,11 +742,9 @@ void multiGrid(Solver* solver)
|
|||||||
// correct p on finest level using residual
|
// correct p on finest level using residual
|
||||||
correct(solver);
|
correct(solver);
|
||||||
|
|
||||||
if (solver->currentlevel == 1) {
|
if (solver->currentlevel == 0) {
|
||||||
|
|
||||||
double* p = solver->p;
|
double* p = solver->p;
|
||||||
int imax = solver->imax;
|
|
||||||
int jmax = solver->jmax;
|
|
||||||
|
|
||||||
for (int i = 1; i < imax + 1; i++) {
|
for (int i = 1; i < imax + 1; i++) {
|
||||||
P(i, 0) = P(i, 1);
|
P(i, 0) = P(i, 1);
|
||||||
@ -753,16 +758,33 @@ void multiGrid(Solver* solver)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
smoothRB(solver);
|
res = smoothRB(solver);
|
||||||
|
if (solver->currentlevel == 0) {
|
||||||
|
|
||||||
|
double* p = solver->p;
|
||||||
|
|
||||||
|
for (int i = 1; i < imax + 1; i++) {
|
||||||
|
P(i, 0) = P(i, 1);
|
||||||
|
P(i, jmax + 1) = P(i, jmax);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j = 1; j < jmax + 1; j++) {
|
||||||
|
P(0, j) = P(1, j);
|
||||||
|
P(imax + 1, j) = P(imax, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef VERBOSE
|
||||||
|
if (solver->currentlevel == 0) {printf("Residuum: %.6f\n", res); }
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void restrictMG(Solver* solver)
|
void restrictMG(Solver* solver)
|
||||||
{
|
{
|
||||||
int imax = solver->imax;
|
int imax = solver->imax;
|
||||||
int jmax = solver->jmax;
|
int jmax = solver->jmax;
|
||||||
double* r = solver->r[solver->currentlevel];
|
double* r = solver->r[solver->currentlevel + 1];
|
||||||
double* oldr = solver->r[solver->currentlevel - 1];
|
double* oldr = solver->r[solver->currentlevel];
|
||||||
|
|
||||||
for (int j = 1; j < jmax + 1; j++) {
|
for (int j = 1; j < jmax + 1; j++) {
|
||||||
for (int i = 1; i < imax + 1; ++i) {
|
for (int i = 1; i < imax + 1; ++i) {
|
||||||
@ -780,12 +802,12 @@ void prolongate(Solver* solver)
|
|||||||
{
|
{
|
||||||
int imax = solver->imax;
|
int imax = solver->imax;
|
||||||
int jmax = solver->jmax;
|
int jmax = solver->jmax;
|
||||||
double* r = solver->r[solver->currentlevel];
|
double* olde = solver->r[solver->currentlevel + 1];
|
||||||
double* oldr = solver->r[solver->currentlevel - 1];
|
double* e = solver->r[solver->currentlevel];
|
||||||
|
|
||||||
for (int j = 2; j < jmax + 1; j += 2) {
|
for (int j = 2; j < jmax + 1; j += 2) {
|
||||||
for (int i = 2; i < imax + 1; i += 2) {
|
for (int i = 2; i < imax + 1; i += 2) {
|
||||||
oldR(i, j) = R(i / 2, j / 2);
|
E(i, j) = oldE(i / 2, j / 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -803,36 +825,36 @@ void correct(Solver* solver)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Solver* copySolver(Solver* solver)
|
Solver copySolver(Solver* solver)
|
||||||
{
|
{
|
||||||
Solver* newSolver;
|
Solver newSolver;
|
||||||
newSolver->problem = solver->problem;
|
newSolver.problem = solver->problem;
|
||||||
newSolver->bcLeft = solver->bcLeft;
|
newSolver.bcLeft = solver->bcLeft;
|
||||||
newSolver->bcRight = solver->bcRight;
|
newSolver.bcRight = solver->bcRight;
|
||||||
newSolver->bcBottom = solver->bcBottom;
|
newSolver.bcBottom = solver->bcBottom;
|
||||||
newSolver->bcTop = solver->bcTop;
|
newSolver.bcTop = solver->bcTop;
|
||||||
newSolver->imax = solver->imax;
|
newSolver.imax = solver->imax;
|
||||||
newSolver->jmax = solver->jmax;
|
newSolver.jmax = solver->jmax;
|
||||||
newSolver->xlength = solver->xlength;
|
newSolver.xlength = solver->xlength;
|
||||||
newSolver->ylength = solver->ylength;
|
newSolver.ylength = solver->ylength;
|
||||||
newSolver->dx = solver->xlength / solver->imax;
|
newSolver.dx = solver->xlength / solver->imax;
|
||||||
newSolver->dy = solver->ylength / solver->jmax;
|
newSolver.dy = solver->ylength / solver->jmax;
|
||||||
newSolver->eps = solver->eps;
|
newSolver.eps = solver->eps;
|
||||||
newSolver->omega = solver->omega;
|
newSolver.omega = solver->omega;
|
||||||
newSolver->itermax = solver->itermax;
|
newSolver.itermax = solver->itermax;
|
||||||
newSolver->re = solver->re;
|
newSolver.re = solver->re;
|
||||||
newSolver->gx = solver->gx;
|
newSolver.gx = solver->gx;
|
||||||
newSolver->gy = solver->gy;
|
newSolver.gy = solver->gy;
|
||||||
newSolver->dt = solver->dt;
|
newSolver.dt = solver->dt;
|
||||||
newSolver->te = solver->te;
|
newSolver.te = solver->te;
|
||||||
newSolver->tau = solver->tau;
|
newSolver.tau = solver->tau;
|
||||||
newSolver->gamma = solver->gamma;
|
newSolver.gamma = solver->gamma;
|
||||||
newSolver->rho = solver->rho;
|
newSolver.rho = solver->rho;
|
||||||
newSolver->levels = solver->levels;
|
newSolver.levels = solver->levels;
|
||||||
newSolver->currentlevel = solver->currentlevel;
|
newSolver.currentlevel = solver->currentlevel + 1;
|
||||||
|
|
||||||
newSolver->r = solver->r;
|
newSolver.r = solver->r;
|
||||||
newSolver->e = solver->e;
|
newSolver.e = solver->e;
|
||||||
|
|
||||||
return newSolver;
|
return newSolver;
|
||||||
}
|
}
|
||||||
|
@ -48,12 +48,12 @@ typedef struct {
|
|||||||
|
|
||||||
extern void initSolver(Solver*, Parameter*);
|
extern void initSolver(Solver*, Parameter*);
|
||||||
extern void computeRHS(Solver*);
|
extern void computeRHS(Solver*);
|
||||||
extern void smoothRB(Solver*);
|
extern double smoothRB(Solver*);
|
||||||
extern void residualRB(Solver*);
|
extern void residualRB(Solver*);
|
||||||
extern void restrictMG(Solver*);
|
extern void restrictMG(Solver*);
|
||||||
extern void prolongate(Solver*);
|
extern void prolongate(Solver*);
|
||||||
extern void correct(Solver*);
|
extern void correct(Solver*);
|
||||||
extern Solver* copySolver(Solver*);
|
extern Solver copySolver(Solver*);
|
||||||
extern void multiGrid(Solver*);
|
extern void multiGrid(Solver*);
|
||||||
extern void normalizePressure(Solver*);
|
extern void normalizePressure(Solver*);
|
||||||
extern void computeTimestep(Solver*);
|
extern void computeTimestep(Solver*);
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
set terminal png size 3600,768 enhanced font ,28
|
set terminal png size 3600,768 enhanced font ,28
|
||||||
set output 'velocity.png'
|
set output 'velocity.png'
|
||||||
set xrange[0:7]
|
|
||||||
set yrange[0:1.5]
|
|
||||||
set size ratio -1
|
set size ratio -1
|
||||||
set datafile separator whitespace
|
set datafile separator whitespace
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
After Width: | Height: | Size: 364 KiB |
@ -259,7 +259,6 @@ void solve(Solver* solver)
|
|||||||
double res = 1.0;
|
double res = 1.0;
|
||||||
|
|
||||||
while ((res >= epssq) && (it < itermax)) {
|
while ((res >= epssq) && (it < itermax)) {
|
||||||
res = 0.0;
|
|
||||||
|
|
||||||
for (int j = 1; j < jmax + 1; j++) {
|
for (int j = 1; j < jmax + 1; j++) {
|
||||||
for (int i = 1; i < imax + 1; i++) {
|
for (int i = 1; i < imax + 1; i++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user