Structural changes in 2D versions

This commit is contained in:
2023-06-27 16:24:55 +02:00
parent acc831e0b0
commit ca99356d45
62 changed files with 100926 additions and 56 deletions

View File

@@ -14,10 +14,13 @@
#include "parameter.h"
#include "solver.h"
enum VARIANT { SOR = 1, RB, RBA };
int main (int argc, char** argv)
{
int rank;
int variant = SOR;
Parameter params;
Solver solver;
@@ -25,18 +28,38 @@ int main (int argc, char** argv)
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
initParameter(&params);
if ( argc != 2 ) {
if ( argc < 2 ) {
printf("Usage: %s <configFile>\n",argv[0]);
exit(EXIT_SUCCESS);
}
readParameter(&params, argv[1]);
if (argc == 3)
{
variant = atoi(argv[2]);
}
if ( rank == 0 ) {
printParameter(&params);
}
initSolver(&solver, &params, 2);
solve(&solver);
switch (variant) {
case SOR:
printf("Plain SOR\n");
solve(&solver);
break;
case RB:
printf("Red-black SOR\n");
solveRB(&solver);
break;
case RBA:
printf("Red-black SOR with acceleration\n");
solveRBA(&solver);
break;
}
getResult(&solver);
MPI_Finalize();

View File

@@ -20,6 +20,7 @@ void initParameter(Parameter *param) {
param->itermax = 1000;
param->eps = 0.0001;
param->omg = 1.8;
param->rho = 0.99;
}
void readParameter(Parameter *param, const char *filename) {
@@ -54,6 +55,8 @@ void readParameter(Parameter *param, const char *filename) {
PARSE_INT(itermax);
PARSE_REAL(eps);
PARSE_REAL(omg);
PARSE_REAL(rho);
}
}

View File

@@ -11,7 +11,7 @@ typedef struct {
double xlength, ylength;
int imax, jmax;
int itermax;
double eps, omg, gamma;
double eps, omg, gamma, rho;
} Parameter;
void initParameter(Parameter*);

View File

@@ -198,10 +198,11 @@ int solve(Solver *solver)
double factor = omega * 0.5 * (dx2*dy2) / (dx2+dy2);
double* p = solver->p;
double* rhs = solver->rhs;
double epssq = eps * eps;
res = eps + 1.0;
while((res >= eps) && (it < itermax)) {
while((res >= epssq) && (it < itermax)) {
res = 0.0;
exchange(solver);
@@ -253,6 +254,154 @@ int solve(Solver *solver)
}
}
int solveRB(Solver* solver)
{
double r;
int it = 0;
double res;
int imax = solver->imax;
int jmax = solver->jmax;
int jmaxLocal = solver->jmaxLocal;
double eps= solver->eps;
double omega = solver->omega;
int itermax = solver->itermax;
double dx2 = solver->dx * solver->dx;
double dy2 = solver->dy * solver->dy;
double idx2 = 1.0/dx2;
double idy2 = 1.0/dy2;
double factor = omega * 0.5 * (dx2*dy2) / (dx2+dy2);
double* p = solver->p;
double* rhs = solver->rhs;
int pass, jsw, isw;
double epssq = eps * eps;
res = eps + 1.0;
while ((res >= epssq) && (it < itermax)) {
res = 0.0;
jsw = 1;
for (pass = 0; pass < 2; pass++) {
isw = jsw;
exchange(solver);
for (int j = 1; j < jmax + 1; j++) {
for (int i = isw; i < imax + 1; i += 2) {
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);
}
isw = 3 - isw;
}
jsw = 3 - jsw;
}
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);
}
res = res / (double)(imax * jmax);
#ifdef DEBUG
printf("%d Residuum: %e\n", it, res);
#endif
it++;
}
if ( solver->rank == 0 ) {
printf("Solver took %d iterations\n",it);
}
if( res < eps ){
return 1;
} else{
return 0;
}
}
int solveRBA(Solver* solver)
{
double r;
int it = 0;
double res;
int imax = solver->imax;
int jmax = solver->jmax;
int jmaxLocal = solver->jmaxLocal;
double eps= solver->eps;
double omega = solver->omega;
int itermax = solver->itermax;
double dx2 = solver->dx * solver->dx;
double dy2 = solver->dy * solver->dy;
double idx2 = 1.0/dx2;
double idy2 = 1.0/dy2;
double factor = omega * 0.5 * (dx2*dy2) / (dx2+dy2);
double* p = solver->p;
double* rhs = solver->rhs;
int pass, jsw, isw;
double rho = solver->rho;
double epssq = eps * eps;
res = eps + 1.0;
while ((res >= epssq) && (it < itermax)) {
res = 0.0;
jsw = 1;
for (pass = 0; pass < 2; pass++) {
isw = jsw;
exchange(solver);
for (int j = 1; j < jmax + 1; j++) {
for (int i = isw; i < imax + 1; i += 2) {
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) -= (omega * factor * r);
res += (r * r);
}
isw = 3 - isw;
}
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));
}
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);
}
res = res / (double)(imax * jmax);
#ifdef DEBUG
printf("%d Residuum: %e Omega: %e\n", it, res, omega);
#endif
it++;
}
printf("Final omega: %f\n", omega);
printf("Solver took %d iterations to reach %f\n", it, sqrt(res));
}
void writeResult(Solver* solver, double* m, char* filename)
{
int imax = solver->imax;

View File

@@ -17,7 +17,7 @@ typedef struct {
int size;
double *p, *rhs;
double eps, omega;
double eps, omega, rho;
int itermax;
} Solver;
@@ -26,4 +26,7 @@ extern void initSolver(Solver*, Parameter*, int problem);
extern void getResult(Solver*);
extern void writeResult(Solver*, double*, char*);
extern int solve(Solver*);
extern int solveRB(Solver*);
extern int solveRBA(Solver*);
#endif