[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48050] branches/smoke2/intern/smoke/ intern/FLUID_3D_SOLVERS.cpp: - Fix stopping criteria of CG

Daniel Genrich daniel.genrich at gmx.net
Mon Jun 18 20:12:18 CEST 2012


Revision: 48050
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48050
Author:   genscher
Date:     2012-06-18 18:12:18 +0000 (Mon, 18 Jun 2012)
Log Message:
-----------
- Fix stopping criteria of CG

Modified Paths:
--------------
    branches/smoke2/intern/smoke/intern/FLUID_3D_SOLVERS.cpp

Modified: branches/smoke2/intern/smoke/intern/FLUID_3D_SOLVERS.cpp
===================================================================
--- branches/smoke2/intern/smoke/intern/FLUID_3D_SOLVERS.cpp	2012-06-18 17:55:38 UTC (rev 48049)
+++ branches/smoke2/intern/smoke/intern/FLUID_3D_SOLVERS.cpp	2012-06-18 18:12:18 UTC (rev 48050)
@@ -181,10 +181,11 @@
 	size_t index;
 	float *_q, *_Precond, *_z, *_r, *_p;
 
-	float alpha = 0.0f, beta = 0;
+	float alpha = 0.0f, beta = 0.0f;
 
 	float eps  = SOLVER_ACCURACY;
-	float currentR = 0.0;
+	float currentR = 0.0f;
+	float targetR = 0.0f;
 
 	int k = 0;
 
@@ -248,8 +249,12 @@
 
 		// p = z
 		_p[index] = _z[index];
+
+		targetR += b[index] * b[index];
 	}
 
+	targetR = targetR * eps * eps;
+
 	while (k < _iterations)
 	{
 		alpha = 0.0f;
@@ -302,11 +307,11 @@
 			// r_k+1 = r_k - alpha A p
 			_r[index] -= alpha * _q[index];
 
-			currentR = (_r[index] > currentR) ? _r[index] : currentR;
+			currentR += _r[index] * _r[index];
 		}
 
 		//if (r_k+1 > EPSILON) exit
-		if(currentR < 0.001*eps)
+		if(currentR < targetR)
 			break;
 
 		deltaNew = 0.0f;
@@ -330,7 +335,8 @@
 
 		k++;
 	}
-	cout << k << " iterations converged to " << sqrt(currentR) << endl;
+	// tol_error = sqrt(residualNorm2 / rhsNorm2); FROM Eigen3
+	cout << k << " iterations converged to " << sqrt(currentR / targetR) << endl;
 
 	if (_Precond) delete[] _Precond;
 	if (_r) delete[] _r;




More information about the Bf-blender-cvs mailing list