From edab03a8e0b519ea41a7ec91e200ac2d9456c4a9 Mon Sep 17 00:00:00 2001
From: Thomas Fischer <thomas.fischer@ufz.de>
Date: Wed, 14 Dec 2011 16:09:08 +0100
Subject: [PATCH] CG method works correctly again

---
 MathLib/LinAlg/Solvers/CGParallel.cpp | 42 +++++++++++++--------------
 1 file changed, 20 insertions(+), 22 deletions(-)

diff --git a/MathLib/LinAlg/Solvers/CGParallel.cpp b/MathLib/LinAlg/Solvers/CGParallel.cpp
index 742fa96b0e1..c752961e30d 100644
--- a/MathLib/LinAlg/Solvers/CGParallel.cpp
+++ b/MathLib/LinAlg/Solvers/CGParallel.cpp
@@ -80,34 +80,32 @@ unsigned CGParallel(CRSMatrix<double,unsigned> const * mat, double const * const
 		}
 		mat->precondApply(rhat);
 
-		#pragma omp parallel
-		{
-			// rho = r * r^;
-			rho = scpr(r, rhat, N);
-
-			if (l > 1) {
-				double beta = rho / rho1;
-				// p = r^ + beta * p
-				#pragma omp parallel for
-				for (k = 0; k < N; k++) {
-					p[k] = rhat[k] + beta * p[k];
-				}
-			} else {
+		// rho = r * r^;
+		rho = scpr(r, rhat, N);
+
+		if (l > 1) {
+			double beta = rho / rho1;
+			// p = r^ + beta * p
+			#pragma omp parallel for
+			for (k = 0; k < N; k++) {
+				p[k] = rhat[k] + beta * p[k];
+			}
+		} else {
 //				blas::copy(N, rhat, p);
-				#pragma omp parallel for
-				for (k = 0; k < N; k++) {
-					p[k] = rhat[k];
-				}
+			#pragma omp parallel for
+			for (k = 0; k < N; k++) {
+				p[k] = rhat[k];
 			}
 		}
 
 		// q = Ap
 		mat->amux(D_ONE, p, q);
+
+		// alpha = rho / p*q
+		double alpha = rho / scpr(p, q, N);
+
 		#pragma omp parallel
 		{
-			// alpha = rho / p*q
-			double alpha = rho / scpr(p, q, N);
-
 			// x += alpha * p
 			#pragma omp for nowait
 			for (k = 0; k < N; k++) {
@@ -121,10 +119,10 @@ unsigned CGParallel(CRSMatrix<double,unsigned> const * mat, double const * const
 			}
 
 			#pragma omp barrier
-
-			resid = sqrt(scpr(r, r, N));
 		} // end #pragma omp parallel
 
+		resid = sqrt(scpr(r, r, N));
+
 		if (resid <= eps * nrmb) {
 			eps = resid / nrmb;
 			nsteps = l;
-- 
GitLab