Implemented Function pointer for SOR, RB and RBA variants
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -22,7 +22,7 @@ enum VARIANT { SOR = 1, RB, RBA };
|
||||
int main (int argc, char** argv)
|
||||
{
|
||||
int rank;
|
||||
int variant = SOR;
|
||||
int variant = RB;
|
||||
double S, E;
|
||||
Parameter params;
|
||||
Solver solver;
|
||||
@@ -47,15 +47,17 @@ int main (int argc, char** argv)
|
||||
initSolver(&solver, ¶ms);
|
||||
initProgress(solver.te);
|
||||
|
||||
void (*solver_generic[])(solver) = {solve, solveRB, solveRBA};
|
||||
|
||||
|
||||
double tau = solver.tau;
|
||||
double te = solver.te;
|
||||
double t = 0.0;
|
||||
|
||||
S = getTimeStamp();
|
||||
switch (variant) {
|
||||
case SOR:
|
||||
printf("Plain SOR\n");
|
||||
while (t <= te) {
|
||||
|
||||
while (t <= te)
|
||||
{
|
||||
if (tau > 0.0) {
|
||||
computeTimestep(&solver);
|
||||
}
|
||||
@@ -64,49 +66,9 @@ int main (int argc, char** argv)
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
solve(&solver);
|
||||
(*solver_generic[variant - 1])(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
case RB:
|
||||
printf("Red-black SOR\n");
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) {
|
||||
computeTimestep(&solver);
|
||||
}
|
||||
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
solveRB(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case RBA:
|
||||
printf("Red-black SOR with acceleration\n");
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) {
|
||||
computeTimestep(&solver);
|
||||
}
|
||||
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
solveRBA(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef VERBOSE
|
||||
if (rank == 0) {
|
||||
printf("TIME %f , TIMESTEP %f\n", t, solver.dt);
|
||||
@@ -114,6 +76,7 @@ int main (int argc, char** argv)
|
||||
#else
|
||||
printProgress(t);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
E = getTimeStamp();
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 206 KiB |
File diff suppressed because it is too large
Load Diff
@@ -21,7 +21,7 @@ enum VARIANT { SOR = 1, RB, RBA };
|
||||
int main (int argc, char** argv)
|
||||
{
|
||||
int rank;
|
||||
int variant = SOR;
|
||||
int variant = RB;
|
||||
double S, E;
|
||||
Parameter params;
|
||||
Solver solver;
|
||||
@@ -52,12 +52,12 @@ int main (int argc, char** argv)
|
||||
double tau = solver.tau;
|
||||
double te = solver.te;
|
||||
double t = 0.0;
|
||||
|
||||
int (*solver_generic[])(solver) = {solve, solveRB, solveRBA};
|
||||
|
||||
S = getTimeStamp();
|
||||
switch (variant) {
|
||||
case SOR:
|
||||
printf("Plain SOR\n");
|
||||
while (t <= te) {
|
||||
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) {
|
||||
computeTimestep(&solver);
|
||||
}
|
||||
@@ -66,48 +66,9 @@ int main (int argc, char** argv)
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
solve(&solver);
|
||||
(*solver_generic[variant - 1])(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
case RB:
|
||||
printf("Red-black SOR\n");
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) {
|
||||
computeTimestep(&solver);
|
||||
}
|
||||
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
solveRB(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
case RBA:
|
||||
printf("Red-black SOR with acceleration\n");
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) {
|
||||
computeTimestep(&solver);
|
||||
}
|
||||
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
solveRBA(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef VERBOSE
|
||||
if (rank == 0) {
|
||||
printf("TIME %f , TIMESTEP %f\n", t, solver.dt);
|
||||
@@ -115,6 +76,8 @@ int main (int argc, char** argv)
|
||||
#else
|
||||
printProgress(t);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
E = getTimeStamp();
|
||||
stopProgress();
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 184 KiB |
File diff suppressed because it is too large
Load Diff
@@ -22,7 +22,7 @@ enum VARIANT { SOR = 1, RB, RBA };
|
||||
int main (int argc, char** argv)
|
||||
{
|
||||
int rank;
|
||||
int variant = SOR;
|
||||
int variant = RB;
|
||||
|
||||
double S, E;
|
||||
Parameter params;
|
||||
@@ -52,11 +52,14 @@ int main (int argc, char** argv)
|
||||
double te = solver.te;
|
||||
double t = 0.0;
|
||||
|
||||
int (*solver_generic[])(solver) = {solve, solveRB, solveRBA};
|
||||
|
||||
|
||||
S = getTimeStamp();
|
||||
switch (variant) {
|
||||
case SOR:
|
||||
printf("Plain SOR\n");
|
||||
while (t <= te) {
|
||||
|
||||
|
||||
while (t <= te)
|
||||
{
|
||||
if (tau > 0.0) {
|
||||
computeTimestep(&solver);
|
||||
}
|
||||
@@ -65,47 +68,10 @@ int main (int argc, char** argv)
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
solve(&solver);
|
||||
(*solver_generic[variant - 1])(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
case RB:
|
||||
printf("Red-black SOR\n");
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) {
|
||||
computeTimestep(&solver);
|
||||
}
|
||||
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
solveRB(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
case RBA:
|
||||
printf("Red-black SOR with acceleration\n");
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) {
|
||||
computeTimestep(&solver);
|
||||
}
|
||||
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
solveRBA(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
#ifdef VERBOSE
|
||||
if (rank == 0) {
|
||||
@@ -114,6 +80,7 @@ int main (int argc, char** argv)
|
||||
#else
|
||||
printProgress(t);
|
||||
#endif
|
||||
}
|
||||
|
||||
E = getTimeStamp();
|
||||
stopProgress();
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,7 @@ enum VARIANT { SOR = 1, RB, RBA };
|
||||
int main (int argc, char** argv)
|
||||
{
|
||||
int rank;
|
||||
int variant = SOR;
|
||||
int variant = RB;
|
||||
|
||||
double S, E;
|
||||
Parameter params;
|
||||
@@ -49,76 +49,29 @@ int main (int argc, char** argv)
|
||||
double t = 0.0;
|
||||
int nt = 0;
|
||||
|
||||
void (*solver_generic[])(solver) = {solve, solveRB, solveRBA};
|
||||
|
||||
S = getTimeStamp();
|
||||
|
||||
|
||||
switch (variant) {
|
||||
case SOR:
|
||||
printf("Plain SOR\n");
|
||||
while (t <= te)
|
||||
{
|
||||
if (tau > 0.0) computeTimestep(&solver);
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
if (nt % 100 == 0) normalizePressure(&solver);
|
||||
solve(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
nt++;
|
||||
|
||||
#ifdef VERBOSE
|
||||
printf("TIME %f , TIMESTEP %f\n", t, solver.dt);
|
||||
#else
|
||||
printProgress(t);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case RB:
|
||||
printf("Red-black SOR\n");
|
||||
while (t <= te)
|
||||
{
|
||||
if (tau > 0.0) computeTimestep(&solver);
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
if (nt % 100 == 0) normalizePressure(&solver);
|
||||
solveRB(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
nt++;
|
||||
|
||||
#ifdef VERBOSE
|
||||
printf("TIME %f , TIMESTEP %f\n", t, solver.dt);
|
||||
#else
|
||||
printProgress(t);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case RBA:
|
||||
printf("Red-black SOR with acceleration\n");
|
||||
while (t <= te)
|
||||
{
|
||||
if (tau > 0.0) computeTimestep(&solver);
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
if (nt % 100 == 0) normalizePressure(&solver);
|
||||
solveRBA(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
nt++;
|
||||
|
||||
#ifdef VERBOSE
|
||||
printf("TIME %f , TIMESTEP %f\n", t, solver.dt);
|
||||
#else
|
||||
printProgress(t);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
while (t <= te)
|
||||
{
|
||||
if (tau > 0.0) computeTimestep(&solver);
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
if (nt % 100 == 0) normalizePressure(&solver);
|
||||
(*solver_generic[variant - 1])(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
nt++;
|
||||
|
||||
#ifdef VERBOSE
|
||||
printf("TIME %f , TIMESTEP %f\n", t, solver.dt);
|
||||
#else
|
||||
printProgress(t);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
E = getTimeStamp();
|
||||
|
@@ -24,7 +24,7 @@
|
||||
0.59 0.01 -0.008094 -0.000200 0.008096
|
||||
0.61 0.01 -0.007642 -0.000251 0.007647
|
||||
0.64 0.01 -0.007095 -0.000297 0.007101
|
||||
0.66 0.01 -0.006463 -0.000335 0.006471
|
||||
0.66 0.01 -0.006463 -0.000335 0.006472
|
||||
0.69 0.01 -0.005762 -0.000365 0.005774
|
||||
0.71 0.01 -0.005011 -0.000386 0.005026
|
||||
0.74 0.01 -0.004229 -0.000396 0.004248
|
||||
@@ -76,7 +76,7 @@
|
||||
0.89 0.04 -0.001666 -0.000909 0.001898
|
||||
0.91 0.04 -0.000758 -0.000580 0.000954
|
||||
0.94 0.04 -0.000202 -0.000248 0.000320
|
||||
0.96 0.04 0.000029 0.000027 0.000039
|
||||
0.96 0.04 0.000029 0.000026 0.000039
|
||||
0.99 0.04 0.000035 0.000132 0.000136
|
||||
0.01 0.06 -0.000034 -0.000123 0.000127
|
||||
0.04 0.06 -0.000273 0.000256 0.000374
|
||||
@@ -268,7 +268,7 @@
|
||||
0.69 0.16 -0.061532 -0.022524 0.065525
|
||||
0.71 0.16 -0.055295 -0.023898 0.060238
|
||||
0.74 0.16 -0.048728 -0.024670 0.054617
|
||||
0.76 0.16 -0.041987 -0.024793 0.048760
|
||||
0.76 0.16 -0.041986 -0.024793 0.048760
|
||||
0.79 0.16 -0.035235 -0.024238 0.042766
|
||||
0.81 0.16 -0.028644 -0.022992 0.036731
|
||||
0.84 0.16 -0.022386 -0.021072 0.030744
|
||||
@@ -294,7 +294,7 @@
|
||||
0.34 0.19 -0.075708 0.026077 0.080073
|
||||
0.36 0.19 -0.081370 0.023110 0.084588
|
||||
0.39 0.19 -0.086279 0.019648 0.088488
|
||||
0.41 0.19 -0.090340 0.015772 0.091707
|
||||
0.41 0.19 -0.090340 0.015773 0.091707
|
||||
0.44 0.19 -0.093475 0.011565 0.094187
|
||||
0.46 0.19 -0.095621 0.007112 0.095885
|
||||
0.49 0.19 -0.096736 0.002500 0.096768
|
||||
@@ -389,7 +389,7 @@
|
||||
0.71 0.24 -0.077691 -0.046320 0.090451
|
||||
0.74 0.24 -0.068991 -0.048114 0.084111
|
||||
0.76 0.24 -0.059958 -0.048721 0.077257
|
||||
0.79 0.24 -0.050796 -0.048075 0.069939
|
||||
0.79 0.24 -0.050796 -0.048075 0.069938
|
||||
0.81 0.24 -0.041727 -0.046141 0.062210
|
||||
0.84 0.24 -0.032981 -0.042925 0.054132
|
||||
0.86 0.24 -0.024797 -0.038478 0.045776
|
||||
@@ -408,7 +408,7 @@
|
||||
0.19 0.26 -0.045674 0.054903 0.071418
|
||||
0.21 0.26 -0.055333 0.056832 0.079320
|
||||
0.24 0.26 -0.065054 0.057332 0.086712
|
||||
0.26 0.26 -0.074620 0.056461 0.093574
|
||||
0.26 0.26 -0.074621 0.056461 0.093574
|
||||
0.29 0.26 -0.083835 0.054302 0.099885
|
||||
0.31 0.26 -0.092517 0.050954 0.105620
|
||||
0.34 0.26 -0.100504 0.046530 0.110752
|
||||
@@ -606,7 +606,7 @@
|
||||
0.14 0.39 -0.040517 0.098443 0.106455
|
||||
0.16 0.39 -0.053081 0.106833 0.119293
|
||||
0.19 0.39 -0.066194 0.112215 0.130284
|
||||
0.21 0.39 -0.079501 0.114706 0.139563
|
||||
0.21 0.39 -0.079502 0.114706 0.139563
|
||||
0.24 0.39 -0.092687 0.114466 0.147287
|
||||
0.26 0.39 -0.105476 0.111690 0.153623
|
||||
0.29 0.39 -0.117633 0.106594 0.158744
|
||||
@@ -630,7 +630,7 @@
|
||||
0.74 0.39 -0.111319 -0.114027 0.159355
|
||||
0.76 0.39 -0.098068 -0.117318 0.152908
|
||||
0.79 0.39 -0.084249 -0.117805 0.144830
|
||||
0.81 0.39 -0.070186 -0.115275 0.134960
|
||||
0.81 0.39 -0.070185 -0.115275 0.134960
|
||||
0.84 0.39 -0.056251 -0.109576 0.123171
|
||||
0.86 0.39 -0.042866 -0.100636 0.109385
|
||||
0.89 0.39 -0.030488 -0.088477 0.093583
|
||||
@@ -696,7 +696,7 @@
|
||||
0.39 0.44 -0.170816 0.082592 0.189735
|
||||
0.41 0.44 -0.177729 0.066561 0.189784
|
||||
0.44 0.44 -0.183191 0.049483 0.189756
|
||||
0.46 0.44 -0.187155 0.031606 0.189805
|
||||
0.46 0.44 -0.187155 0.031605 0.189805
|
||||
0.49 0.44 -0.189584 0.013174 0.190041
|
||||
0.51 0.44 -0.190442 -0.005565 0.190523
|
||||
0.54 0.44 -0.189701 -0.024360 0.191258
|
||||
@@ -763,7 +763,7 @@
|
||||
0.06 0.49 -0.013496 0.088857 0.089876
|
||||
0.09 0.49 -0.024333 0.115469 0.118005
|
||||
0.11 0.49 -0.037314 0.136818 0.141815
|
||||
0.14 0.49 -0.051761 0.152957 0.161477
|
||||
0.14 0.49 -0.051761 0.152956 0.161477
|
||||
0.16 0.49 -0.067064 0.164072 0.177249
|
||||
0.19 0.49 -0.082692 0.170453 0.189452
|
||||
0.21 0.49 -0.098201 0.172458 0.198457
|
||||
@@ -797,7 +797,7 @@
|
||||
0.91 0.49 -0.027263 -0.120196 0.123249
|
||||
0.94 0.49 -0.015090 -0.091937 0.093167
|
||||
0.96 0.49 -0.006161 -0.058588 0.058911
|
||||
0.99 0.49 -0.001306 -0.020753 0.020794
|
||||
0.99 0.49 -0.001307 -0.020753 0.020794
|
||||
0.01 0.51 -0.001267 0.022927 0.022962
|
||||
0.04 0.51 -0.005931 0.063665 0.063941
|
||||
0.06 0.51 -0.014434 0.098757 0.099806
|
||||
@@ -818,7 +818,7 @@
|
||||
0.44 0.51 -0.197267 0.063695 0.207295
|
||||
0.46 0.51 -0.201225 0.041450 0.205450
|
||||
0.49 0.51 -0.203822 0.018572 0.204666
|
||||
0.51 0.51 -0.205038 -0.004702 0.205092
|
||||
0.51 0.51 -0.205038 -0.004703 0.205092
|
||||
0.54 0.51 -0.204841 -0.028133 0.206764
|
||||
0.56 0.51 -0.203186 -0.051464 0.209603
|
||||
0.59 0.51 -0.200018 -0.074415 0.213412
|
||||
@@ -930,7 +930,7 @@
|
||||
0.24 0.59 -0.127806 0.228465 0.261784
|
||||
0.26 0.59 -0.140687 0.218257 0.259671
|
||||
0.29 0.59 -0.152059 0.204463 0.254808
|
||||
0.31 0.59 -0.161946 0.187726 0.247927
|
||||
0.31 0.59 -0.161947 0.187726 0.247927
|
||||
0.34 0.59 -0.170423 0.168596 0.239726
|
||||
0.36 0.59 -0.177595 0.147530 0.230879
|
||||
0.39 0.59 -0.183579 0.124907 0.222043
|
||||
@@ -1022,7 +1022,7 @@
|
||||
0.54 0.64 -0.176772 -0.028584 0.179068
|
||||
0.56 0.64 -0.177447 -0.056962 0.186366
|
||||
0.59 0.64 -0.177740 -0.085477 0.197226
|
||||
0.61 0.64 -0.177485 -0.113961 0.210922
|
||||
0.61 0.64 -0.177485 -0.113961 0.210921
|
||||
0.64 0.64 -0.176458 -0.142170 0.226604
|
||||
0.66 0.64 -0.174383 -0.169764 0.243370
|
||||
0.69 0.64 -0.170939 -0.196274 0.260276
|
||||
@@ -1058,7 +1058,7 @@
|
||||
0.44 0.66 -0.153866 0.082763 0.174713
|
||||
0.46 0.66 -0.154549 0.055784 0.164308
|
||||
0.49 0.66 -0.155334 0.028385 0.157906
|
||||
0.51 0.66 -0.156288 0.000597 0.156290
|
||||
0.51 0.66 -0.156288 0.000597 0.156289
|
||||
0.54 0.66 -0.157423 -0.027557 0.159817
|
||||
0.56 0.66 -0.158690 -0.056046 0.168296
|
||||
0.59 0.66 -0.159981 -0.084810 0.181071
|
||||
@@ -1125,7 +1125,7 @@
|
||||
0.11 0.71 -0.064931 0.286424 0.293692
|
||||
0.14 0.71 -0.081730 0.303029 0.313857
|
||||
0.16 0.71 -0.095581 0.307708 0.322211
|
||||
0.19 0.71 -0.106003 0.303115 0.321115
|
||||
0.19 0.71 -0.106002 0.303115 0.321115
|
||||
0.21 0.71 -0.113003 0.291579 0.312711
|
||||
0.24 0.71 -0.116908 0.275028 0.298844
|
||||
0.26 0.71 -0.118215 0.254982 0.281053
|
||||
@@ -1186,7 +1186,7 @@
|
||||
0.64 0.74 -0.077679 -0.130864 0.152182
|
||||
0.66 0.74 -0.085621 -0.160050 0.181513
|
||||
0.69 0.74 -0.093957 -0.189964 0.211930
|
||||
0.71 0.74 -0.102094 -0.220307 0.242814
|
||||
0.71 0.74 -0.102095 -0.220307 0.242814
|
||||
0.74 0.74 -0.109290 -0.250517 0.273319
|
||||
0.76 0.74 -0.114650 -0.279666 0.302255
|
||||
0.79 0.74 -0.117166 -0.306352 0.327993
|
||||
@@ -1486,7 +1486,7 @@
|
||||
0.14 0.94 0.236018 0.149848 0.279569
|
||||
0.16 0.94 0.308503 0.117843 0.330244
|
||||
0.19 0.94 0.370556 0.093841 0.382253
|
||||
0.21 0.94 0.422981 0.075644 0.429691
|
||||
0.21 0.94 0.422980 0.075644 0.429691
|
||||
0.24 0.94 0.467064 0.061599 0.471109
|
||||
0.26 0.94 0.504083 0.050535 0.506610
|
||||
0.29 0.94 0.535145 0.041634 0.536762
|
||||
|
@@ -31,9 +31,9 @@ p_init 0.0 # initial value for pressure
|
||||
xlength 30.0 # domain size in x-direction
|
||||
ylength 4.0 # domain size in y-direction
|
||||
zlength 4.0 # domain size in z-direction
|
||||
imax 200 # number of interior cells in x-direction
|
||||
jmax 50 # number of interior cells in y-direction
|
||||
kmax 50 # number of interior cells in z-direction
|
||||
imax 40 # number of interior cells in x-direction
|
||||
jmax 10 # number of interior cells in y-direction
|
||||
kmax 10 # number of interior cells in z-direction
|
||||
|
||||
# Time Data:
|
||||
# ---------
|
||||
@@ -47,6 +47,7 @@ tau 0.5 # safety factor for time stepsize control (<0 constant delt)
|
||||
|
||||
itermax 500 # maximal number of pressure iteration in one time step
|
||||
eps 0.0001 # stopping tolerance for pressure iteration
|
||||
rho 0.52
|
||||
omg 1.3 # relaxation parameter for SOR iteration
|
||||
gamma 0.9 # upwind differencing factor gamma
|
||||
#===============================================================================
|
||||
|
@@ -1,5 +1,5 @@
|
||||
# Supported: GCC, CLANG, ICC
|
||||
TAG ?= ICC
|
||||
TAG ?= CLANG
|
||||
ENABLE_OPENMP ?= false
|
||||
|
||||
#Feature options
|
||||
|
BIN
BasicSolver/3D-mpi-io/dcavity-p4.vtk
Normal file
BIN
BasicSolver/3D-mpi-io/dcavity-p4.vtk
Normal file
Binary file not shown.
@@ -31,9 +31,9 @@ p_init 0.0 # initial value for pressure
|
||||
xlength 1.0 # domain size in x-direction
|
||||
ylength 1.0 # domain size in y-direction
|
||||
zlength 1.0 # domain size in z-direction
|
||||
imax 128 # number of interior cells in x-direction
|
||||
jmax 128 # number of interior cells in y-direction
|
||||
kmax 128 # number of interior cells in z-direction
|
||||
imax 40 # number of interior cells in x-direction
|
||||
jmax 40 # number of interior cells in y-direction
|
||||
kmax 40 # number of interior cells in z-direction
|
||||
|
||||
# Time Data:
|
||||
# ---------
|
||||
@@ -47,6 +47,7 @@ tau 0.5 # safety factor for time stepsize control (<0 constant delt)
|
||||
|
||||
itermax 1000 # maximal number of pressure iteration in one time step
|
||||
eps 0.001 # stopping tolerance for pressure iteration
|
||||
rho 0.5
|
||||
omg 1.8 # relaxation parameter for SOR iteration
|
||||
gamma 0.9 # upwind differencing factor gamma
|
||||
#===============================================================================
|
||||
|
@@ -19,9 +19,15 @@
|
||||
#include "timing.h"
|
||||
#include "vtkWriter.h"
|
||||
|
||||
enum VARIANT { SOR = 1, RB, RBA };
|
||||
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
|
||||
int variant = RB;
|
||||
int rank;
|
||||
|
||||
double timeStart, timeStop;
|
||||
Parameter params;
|
||||
Solver solver;
|
||||
@@ -30,12 +36,21 @@ int main(int argc, char** argv)
|
||||
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
||||
initParameter(¶ms);
|
||||
|
||||
if (argc != 2) {
|
||||
if (argc < 2) {
|
||||
printf("Usage: %s <configFile>\n", argv[0]);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
readParameter(¶ms, argv[1]);
|
||||
|
||||
if (argc == 3)
|
||||
{
|
||||
variant = atoi(argv[2]);
|
||||
}
|
||||
|
||||
void (*solver_generic[])(solver) = {solve, solveRB, solveRBA};
|
||||
|
||||
|
||||
if (commIsMaster(&solver.comm)) {
|
||||
printParameter(¶ms);
|
||||
}
|
||||
@@ -57,7 +72,7 @@ int main(int argc, char** argv)
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
// if (nt % 100 == 0) normalizePressure(&solver);
|
||||
solve(&solver);
|
||||
(*solver_generic[variant - 1])(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
nt++;
|
||||
|
@@ -26,6 +26,7 @@ void initParameter(Parameter* param)
|
||||
param->re = 100.0;
|
||||
param->gamma = 0.9;
|
||||
param->tau = 0.5;
|
||||
param->rho = 0.99;
|
||||
}
|
||||
|
||||
void readParameter(Parameter* param, const char* filename)
|
||||
@@ -86,6 +87,8 @@ void readParameter(Parameter* param, const char* filename)
|
||||
PARSE_REAL(v_init);
|
||||
PARSE_REAL(w_init);
|
||||
PARSE_REAL(p_init);
|
||||
PARSE_REAL(rho);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -11,7 +11,7 @@ typedef struct {
|
||||
int imax, jmax, kmax;
|
||||
double xlength, ylength, zlength;
|
||||
int itermax;
|
||||
double eps, omg;
|
||||
double eps, omg, rho;
|
||||
double re, tau, gamma;
|
||||
double te, dt;
|
||||
double gx, gy, gz;
|
||||
|
@@ -103,6 +103,8 @@ void initSolver(Solver* s, Parameter* params)
|
||||
s->te = params->te;
|
||||
s->tau = params->tau;
|
||||
s->gamma = params->gamma;
|
||||
s->rho = params->rho;
|
||||
|
||||
|
||||
commInit(&s->comm, s->grid.kmax, s->grid.jmax, s->grid.imax);
|
||||
/* allocate arrays */
|
||||
@@ -288,6 +290,267 @@ void solve(Solver* s)
|
||||
#endif
|
||||
}
|
||||
|
||||
void solveRB(Solver* s)
|
||||
{
|
||||
int imaxLocal = s->comm.imaxLocal;
|
||||
int jmaxLocal = s->comm.jmaxLocal;
|
||||
int kmaxLocal = s->comm.kmaxLocal;
|
||||
|
||||
int imax = s->grid.imax;
|
||||
int jmax = s->grid.jmax;
|
||||
int kmax = s->grid.kmax;
|
||||
|
||||
double eps = s->eps;
|
||||
int itermax = s->itermax;
|
||||
double dx2 = s->grid.dx * s->grid.dx;
|
||||
double dy2 = s->grid.dy * s->grid.dy;
|
||||
double dz2 = s->grid.dz * s->grid.dz;
|
||||
double idx2 = 1.0 / dx2;
|
||||
double idy2 = 1.0 / dy2;
|
||||
double idz2 = 1.0 / dz2;
|
||||
|
||||
double factor = s->omega * 0.5 * (dx2 * dy2 * dz2) /
|
||||
(dy2 * dz2 + dx2 * dz2 + dx2 * dy2);
|
||||
double* p = s->p;
|
||||
double* rhs = s->rhs;
|
||||
double epssq = eps * eps;
|
||||
int it = 0;
|
||||
double res = 1.0;
|
||||
|
||||
int pass, ksw, jsw, isw;
|
||||
|
||||
|
||||
while ((res >= epssq) && (it < itermax)) {
|
||||
res = 0.0;
|
||||
ksw = 1;
|
||||
|
||||
for (pass = 0; pass < 2; pass++) {
|
||||
jsw = ksw;
|
||||
commExchange(&s->comm, p);
|
||||
|
||||
|
||||
for (int k = 1; k < kmaxLocal + 1; k++) {
|
||||
isw = jsw;
|
||||
for (int j = 1; j < jmaxLocal + 1; j++) {
|
||||
for (int i = isw; i < imaxLocal + 1; i += 2) {
|
||||
|
||||
double r =
|
||||
RHS(i, j, k) -
|
||||
((P(i + 1, j, k) - 2.0 * P(i, j, k) + P(i - 1, j, k)) * idx2 +
|
||||
(P(i, j + 1, k) - 2.0 * P(i, j, k) + P(i, j - 1, k)) *
|
||||
idy2 +
|
||||
(P(i, j, k + 1) - 2.0 * P(i, j, k) + P(i, j, k - 1)) *
|
||||
idz2);
|
||||
|
||||
P(i, j, k) -= (factor * r);
|
||||
res += (r * r);
|
||||
}
|
||||
isw = 3 - isw;
|
||||
}
|
||||
jsw = 3 - jsw;
|
||||
}
|
||||
ksw = 3 - ksw;
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, FRONT)) {
|
||||
for (int j = 1; j < jmaxLocal + 1; j++) {
|
||||
for (int i = 1; i < imaxLocal + 1; i++) {
|
||||
P(i, j, 0) = P(i, j, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, BACK)) {
|
||||
for (int j = 1; j < jmaxLocal + 1; j++) {
|
||||
for (int i = 1; i < imaxLocal + 1; i++) {
|
||||
P(i, j, kmaxLocal + 1) = P(i, j, kmaxLocal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, BOTTOM)) {
|
||||
for (int k = 1; k < kmaxLocal + 1; k++) {
|
||||
for (int i = 1; i < imaxLocal + 1; i++) {
|
||||
P(i, 0, k) = P(i, 1, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, TOP)) {
|
||||
for (int k = 1; k < kmaxLocal + 1; k++) {
|
||||
for (int i = 1; i < imaxLocal + 1; i++) {
|
||||
P(i, jmaxLocal + 1, k) = P(i, jmaxLocal, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, LEFT)) {
|
||||
for (int k = 1; k < kmaxLocal + 1; k++) {
|
||||
for (int j = 1; j < jmaxLocal + 1; j++) {
|
||||
P(0, j, k) = P(1, j, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, RIGHT)) {
|
||||
for (int k = 1; k < kmaxLocal + 1; k++) {
|
||||
for (int j = 1; j < jmaxLocal + 1; j++) {
|
||||
P(imaxLocal + 1, j, k) = P(imaxLocal, j, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
commReduction(&res, SUM);
|
||||
res = res / (double)(imax * jmax * kmax);
|
||||
#ifdef DEBUG
|
||||
if (commIsMaster(&s->comm)) {
|
||||
printf("%d Residuum: %e\n", it, res);
|
||||
}
|
||||
#endif
|
||||
//commExchange(&s->comm, p);
|
||||
it++;
|
||||
}
|
||||
|
||||
#ifdef VERBOSE
|
||||
if (commIsMaster(&s->comm)) {
|
||||
printf("Solver took %d iterations to reach %f\n", it, sqrt(res));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void solveRBA(Solver* s)
|
||||
{
|
||||
int imaxLocal = s->comm.imaxLocal;
|
||||
int jmaxLocal = s->comm.jmaxLocal;
|
||||
int kmaxLocal = s->comm.kmaxLocal;
|
||||
|
||||
int imax = s->grid.imax;
|
||||
int jmax = s->grid.jmax;
|
||||
int kmax = s->grid.kmax;
|
||||
|
||||
double eps = s->eps;
|
||||
int itermax = s->itermax;
|
||||
double dx2 = s->grid.dx * s->grid.dx;
|
||||
double dy2 = s->grid.dy * s->grid.dy;
|
||||
double dz2 = s->grid.dz * s->grid.dz;
|
||||
double idx2 = 1.0 / dx2;
|
||||
double idy2 = 1.0 / dy2;
|
||||
double idz2 = 1.0 / dz2;
|
||||
|
||||
double factor = 0.5 * (dx2 * dy2 * dz2) /
|
||||
(dy2 * dz2 + dx2 * dz2 + dx2 * dy2);
|
||||
double* p = s->p;
|
||||
double* rhs = s->rhs;
|
||||
double epssq = eps * eps;
|
||||
int it = 0;
|
||||
double res = 1.0;
|
||||
double rho = s->rho;
|
||||
double omega = 1.0;
|
||||
|
||||
int pass, ksw, jsw, isw;
|
||||
|
||||
while ((res >= epssq) && (it < itermax)) {
|
||||
res = 0.0;
|
||||
ksw = 1;
|
||||
|
||||
for (pass = 0; pass < 2; pass++) {
|
||||
jsw = ksw;
|
||||
commExchange(&s->comm, p);
|
||||
|
||||
|
||||
for (int k = 1; k < kmaxLocal + 1; k++) {
|
||||
isw = jsw;
|
||||
for (int j = 1; j < jmaxLocal + 1; j++) {
|
||||
for (int i = isw; i < imaxLocal + 1; i += 2) {
|
||||
|
||||
double r =
|
||||
RHS(i, j, k) -
|
||||
((P(i + 1, j, k) - 2.0 * P(i, j, k) + P(i - 1, j, k)) * idx2 +
|
||||
(P(i, j + 1, k) - 2.0 * P(i, j, k) + P(i, j - 1, k)) *
|
||||
idy2 +
|
||||
(P(i, j, k + 1) - 2.0 * P(i, j, k) + P(i, j, k - 1)) *
|
||||
idz2);
|
||||
|
||||
P(i, j, k) -= (omega * factor * r);
|
||||
res += (r * r);
|
||||
}
|
||||
isw = 3 - isw;
|
||||
}
|
||||
jsw = 3 - jsw;
|
||||
}
|
||||
ksw = 3 - ksw;
|
||||
omega = (it == 0 && pass == 0 ? 1.0 / (1.0 - 0.5 * rho * rho)
|
||||
: 1.0 / (1.0 - 0.25 * rho * rho * omega));
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, FRONT)) {
|
||||
for (int j = 1; j < jmaxLocal + 1; j++) {
|
||||
for (int i = 1; i < imaxLocal + 1; i++) {
|
||||
P(i, j, 0) = P(i, j, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, BACK)) {
|
||||
for (int j = 1; j < jmaxLocal + 1; j++) {
|
||||
for (int i = 1; i < imaxLocal + 1; i++) {
|
||||
P(i, j, kmaxLocal + 1) = P(i, j, kmaxLocal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, BOTTOM)) {
|
||||
for (int k = 1; k < kmaxLocal + 1; k++) {
|
||||
for (int i = 1; i < imaxLocal + 1; i++) {
|
||||
P(i, 0, k) = P(i, 1, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, TOP)) {
|
||||
for (int k = 1; k < kmaxLocal + 1; k++) {
|
||||
for (int i = 1; i < imaxLocal + 1; i++) {
|
||||
P(i, jmaxLocal + 1, k) = P(i, jmaxLocal, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, LEFT)) {
|
||||
for (int k = 1; k < kmaxLocal + 1; k++) {
|
||||
for (int j = 1; j < jmaxLocal + 1; j++) {
|
||||
P(0, j, k) = P(1, j, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commIsBoundary(&s->comm, RIGHT)) {
|
||||
for (int k = 1; k < kmaxLocal + 1; k++) {
|
||||
for (int j = 1; j < jmaxLocal + 1; j++) {
|
||||
P(imaxLocal + 1, j, k) = P(imaxLocal, j, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
commReduction(&res, SUM);
|
||||
res = res / (double)(imax * jmax * kmax);
|
||||
#ifdef DEBUG
|
||||
if (commIsMaster(&s->comm)) {
|
||||
printf("%d Residuum: %e\n", it, res);
|
||||
}
|
||||
#endif
|
||||
//commExchange(&s->comm, p);
|
||||
it++;
|
||||
}
|
||||
|
||||
#ifdef VERBOSE
|
||||
if (commIsMaster(&s->comm)) {
|
||||
printf("Solver took %d iterations to reach %f\n", it, sqrt(res));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static double maxElement(Solver* s, double* m)
|
||||
{
|
||||
int size = (s->comm.imaxLocal + 2) * (s->comm.jmaxLocal + 2) *
|
||||
|
@@ -20,7 +20,7 @@ typedef struct {
|
||||
double *f, *g, *h;
|
||||
double *u, *v, *w;
|
||||
/* parameters */
|
||||
double eps, omega;
|
||||
double eps, omega, rho;
|
||||
double re, tau, gamma;
|
||||
double gx, gy, gz;
|
||||
/* time stepping */
|
||||
@@ -36,6 +36,8 @@ typedef struct {
|
||||
void initSolver(Solver*, Parameter*);
|
||||
void computeRHS(Solver*);
|
||||
void solve(Solver*);
|
||||
void solveRB(Solver*);
|
||||
void solveRBA(Solver*);
|
||||
void normalizePressure(Solver*);
|
||||
void computeTimestep(Solver*);
|
||||
void setBoundaryConditions(Solver*);
|
||||
|
@@ -24,7 +24,7 @@ enum VARIANT { SOR = 1, RB, RBA };
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int rank;
|
||||
int variant = SOR;
|
||||
int variant = RB;
|
||||
|
||||
double timeStart, timeStop;
|
||||
Parameter params;
|
||||
@@ -57,60 +57,22 @@ int main(int argc, char** argv)
|
||||
double t = 0.0;
|
||||
int nt = 0;
|
||||
|
||||
|
||||
void (*solver_generic[])(solver) = {solve, solveRB, solveRBA};
|
||||
|
||||
timeStart = getTimeStamp();
|
||||
|
||||
switch (variant) {
|
||||
case SOR:
|
||||
printf("Plain SOR\n");
|
||||
while (t <= te) {
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) computeTimestep(&solver);
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
// if (nt % 100 == 0) normalizePressure(&solver);
|
||||
solve(&solver);
|
||||
(*solver_generic[variant - 1])(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
nt++;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case RB:
|
||||
printf("Red-black SOR\n");
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) computeTimestep(&solver);
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
// if (nt % 100 == 0) normalizePressure(&solver);
|
||||
solveRB(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
nt++;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case RBA:
|
||||
printf("Red-black SOR with acceleration\n");
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) computeTimestep(&solver);
|
||||
setBoundaryConditions(&solver);
|
||||
setSpecialBoundaryCondition(&solver);
|
||||
computeFG(&solver);
|
||||
computeRHS(&solver);
|
||||
// if (nt % 100 == 0) normalizePressure(&solver);
|
||||
solveRBA(&solver);
|
||||
adaptUV(&solver);
|
||||
t += solver.dt;
|
||||
nt++;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef VERBOSE
|
||||
if (rank == 0) {
|
||||
@@ -119,6 +81,9 @@ int main(int argc, char** argv)
|
||||
#else
|
||||
printProgress(t);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
timeStop = getTimeStamp();
|
||||
stopProgress();
|
||||
|
@@ -449,7 +449,6 @@ void solveRBA(Solver* s)
|
||||
int it = 0;
|
||||
double res = 1.0;
|
||||
int pass, ksw, jsw, isw;
|
||||
commExchange(&s->comm, p);
|
||||
|
||||
while ((res >= epssq) && (it < itermax)) {
|
||||
res = 0.0;
|
||||
|
@@ -71,7 +71,7 @@ static void createBulkArrays(Solver* s, double* pg, double* ug, double* vg, doub
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int rank;
|
||||
int variant = SOR;
|
||||
int variant = RB;
|
||||
|
||||
double timeStart, timeStop;
|
||||
Parameter params;
|
||||
@@ -100,53 +100,18 @@ int main(int argc, char** argv)
|
||||
|
||||
timeStart = getTimeStamp();
|
||||
|
||||
switch (variant) {
|
||||
case SOR:
|
||||
printf("Plain SOR\n");
|
||||
while (t <= te) {
|
||||
void (*solver_generic[])(solver) = {solve, solveRB, solveRBA};
|
||||
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) computeTimestep(&s);
|
||||
setBoundaryConditions(&s);
|
||||
setSpecialBoundaryCondition(&s);
|
||||
computeFG(&s);
|
||||
computeRHS(&s);
|
||||
solve(&s);
|
||||
(*solver_generic[variant - 1])(&s);
|
||||
adaptUV(&s);
|
||||
t += s.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case RB:
|
||||
printf("Red-black SOR\n");
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) computeTimestep(&s);
|
||||
setBoundaryConditions(&s);
|
||||
setSpecialBoundaryCondition(&s);
|
||||
computeFG(&s);
|
||||
computeRHS(&s);
|
||||
solveRB(&s);
|
||||
adaptUV(&s);
|
||||
t += s.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case RBA:
|
||||
printf("Red-black SOR with acceleration\n");
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) computeTimestep(&s);
|
||||
setBoundaryConditions(&s);
|
||||
setSpecialBoundaryCondition(&s);
|
||||
computeFG(&s);
|
||||
computeRHS(&s);
|
||||
solveRBA(&s);
|
||||
adaptUV(&s);
|
||||
t += s.dt;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
#ifdef VERBOSE
|
||||
if (rank == 0) {
|
||||
printf("TIME %f , TIMESTEP %f\n", t, s.dt);
|
||||
@@ -154,7 +119,7 @@ int main(int argc, char** argv)
|
||||
#else
|
||||
printProgress(t);
|
||||
#endif
|
||||
|
||||
}
|
||||
timeStop = getTimeStamp();
|
||||
#ifndef VERBOSE
|
||||
stopProgress();
|
||||
|
Reference in New Issue
Block a user