forked from moebiusband/NuSiF-Solver
		
	Split red-balack and standard sor solvers
This commit is contained in:
		
							
								
								
									
										76
									
								
								BasicSolver/2D-seq/src/solver-rb.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								BasicSolver/2D-seq/src/solver-rb.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| /* | ||||
|  * Copyright (C)  NHR@FAU, University Erlangen-Nuremberg. | ||||
|  * All rights reserved. This file is part of nusif-solver. | ||||
|  * Use of this source code is governed by a MIT style | ||||
|  * license that can be found in the LICENSE file. | ||||
|  */ | ||||
| #include "solver.h" | ||||
| #include "util.h" | ||||
|  | ||||
| void initSolver(Solver* s, Discretization* d, Parameter* p) | ||||
| { | ||||
|     s->grid    = &d->grid; | ||||
|     s->itermax = p->itermax; | ||||
|     s->eps     = p->eps; | ||||
|     s->omega   = p->omg; | ||||
| } | ||||
|  | ||||
| void solve(Solver* solver, double* p, double* rhs) | ||||
| { | ||||
|     int imax      = solver->grid->imax; | ||||
|     int jmax      = solver->grid->jmax; | ||||
|     double eps    = solver->eps; | ||||
|     int itermax   = solver->itermax; | ||||
|     double dx2    = solver->grid->dx * solver->grid->dx; | ||||
|     double dy2    = solver->grid->dy * solver->grid->dy; | ||||
|     double idx2   = 1.0 / dx2; | ||||
|     double idy2   = 1.0 / dy2; | ||||
|     double factor = solver->omega * 0.5 * (dx2 * dy2) / (dx2 + dy2); | ||||
|     double epssq  = eps * eps; | ||||
|     int it        = 0; | ||||
|     double res    = 1.0; | ||||
|     int pass, jsw, isw; | ||||
|  | ||||
|     while ((res >= epssq) && (it < itermax)) { | ||||
|         res = 0.0; | ||||
|         jsw = 1; | ||||
|  | ||||
|         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) { | ||||
|  | ||||
|                     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++; | ||||
|     } | ||||
|  | ||||
| #ifdef VERBOSE | ||||
|     printf("Solver took %d iterations to reach %f\n", it, sqrt(res)); | ||||
| #endif | ||||
| } | ||||
| @@ -15,7 +15,7 @@ void initSolver(Solver* s, Discretization* d, Parameter* p) | ||||
|     s->omega   = p->omg; | ||||
| } | ||||
|  | ||||
| void solveSOR(Solver* solver, double* p, double* rhs) | ||||
| void solve(Solver* solver, double* p, double* rhs) | ||||
| { | ||||
|     int imax      = solver->grid->imax; | ||||
|     int jmax      = solver->grid->jmax; | ||||
| @@ -66,63 +66,3 @@ void solveSOR(Solver* solver, double* p, double* rhs) | ||||
|     printf("Solver took %d iterations to reach %f\n", it, sqrt(res)); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void solve(Solver* solver, double* p, double* rhs) | ||||
| { | ||||
|     int imax      = solver->grid->imax; | ||||
|     int jmax      = solver->grid->jmax; | ||||
|     double eps    = solver->eps; | ||||
|     int itermax   = solver->itermax; | ||||
|     double dx2    = solver->grid->dx * solver->grid->dx; | ||||
|     double dy2    = solver->grid->dy * solver->grid->dy; | ||||
|     double idx2   = 1.0 / dx2; | ||||
|     double idy2   = 1.0 / dy2; | ||||
|     double factor = solver->omega * 0.5 * (dx2 * dy2) / (dx2 + dy2); | ||||
|     double epssq  = eps * eps; | ||||
|     int it        = 0; | ||||
|     double res    = 1.0; | ||||
|     int pass, jsw, isw; | ||||
|  | ||||
|     while ((res >= epssq) && (it < itermax)) { | ||||
|         res = 0.0; | ||||
|         jsw = 1; | ||||
|  | ||||
|         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) { | ||||
|  | ||||
|                     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++; | ||||
|     } | ||||
|  | ||||
| #ifdef VERBOSE | ||||
|     printf("Solver took %d iterations to reach %f\n", it, sqrt(res)); | ||||
| #endif | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user