2D-MPI Multigrid complete and tested

This commit is contained in:
2024-03-05 21:45:17 +01:00
parent 9c8ee975c5
commit b4bef94066
51 changed files with 1300314 additions and 40197 deletions

View File

@@ -44,6 +44,7 @@ eps 0.0001 # stopping tolerance for pressure iteration
rho 0.52
omg 1.8 # relaxation parameter for SOR iteration
gamma 0.9 # upwind differencing factor gamma
levels 5 # Multigrid levels
# Particle Tracing Data:
# -----------------------

View File

@@ -26,8 +26,8 @@ p_init 1.0 # initial value for pressure
xlength 30.0 # domain size in x-direction
ylength 4.0 # domain size in y-direction
imax 200 # number of interior cells in x-direction
jmax 50 # number of interior cells in y-direction
imax 1200 # number of interior cells in x-direction
jmax 160 # number of interior cells in y-direction
# Time Data:
# ---------

File diff suppressed because it is too large Load Diff

View File

@@ -680,9 +680,10 @@ double smoothRB(Solver* solver)
void multiGrid(Solver* solver)
{
double res = 0.0;
int imax = solver->imax;
int jmax = solver->jmax;
if (solver->currentlevel == (solver->levels - 1)) {
int imax = solver->imax;
int jmax = solver->jmax;
if (solver->currentlevel == (solver->levels - 1) ||
(solver->imax <= 40 || solver->jmax <= 40)) {
for (int i = 0; i < 5; i++) {
smoothRB(solver);
}
@@ -692,18 +693,7 @@ void multiGrid(Solver* solver)
for (int i = 0; i < 5; i++) {
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);
}
setPressureBoundaryCondition(solver);
}
}
Solver coarseSolver = copySolver(solver);
@@ -726,46 +716,26 @@ void multiGrid(Solver* solver)
correct(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);
}
setPressureBoundaryCondition(solver);
}
for (int i = 0; i < 5; i++) {
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);
}
setPressureBoundaryCondition(solver);
}
}
#ifdef VERBOSE
if (solver->currentlevel == 0) {printf("Residuum: %.6f\n", res); }
#ifdef VERBOSE
if (solver->currentlevel == 0) {
printf("Residuum: %.6f\n", res);
}
#endif
}
void restrictMG(Solver* solver)
{
int imax = solver->imax;
int jmax = solver->jmax;
int imax = solver->imax / 2;
int jmax = solver->jmax / 2;
double* r = solver->r[solver->currentlevel + 1];
double* oldr = solver->r[solver->currentlevel];
@@ -892,3 +862,19 @@ void writeResult(Solver* solver)
fclose(fp);
}
void setPressureBoundaryCondition(Solver* solver)
{
double* p = solver->p;
int imax = solver->imax;
int jmax = solver->jmax;
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);
}
}

View File

@@ -59,6 +59,7 @@ extern void computeTimestep(Solver*);
extern void setBoundaryConditions(Solver*);
extern void setSpecialBoundaryCondition(Solver*);
extern void setObjectBoundaryCondition(Solver*);
extern void setPressureBoundaryCondition(Solver*);
extern void computeFG(Solver*);
extern void adaptUV(Solver*);
extern void writeResult(Solver*);

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 17 KiB