Index: /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_linear.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_linear.cpp	(revision 20600)
+++ /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_linear.cpp	(revision 20601)
@@ -19,4 +19,13 @@
 	Vector<IssmDouble>*  ys  = NULL;
 	int  configuration_type;
+	
+	/*solver convergence test: */
+	IssmDouble nKUF;
+	IssmDouble nF;
+	IssmDouble solver_residue;
+	Vector<IssmDouble>* KU=NULL;
+	Vector<IssmDouble>* KUF=NULL;
+
+
 
 	/*Recover parameters: */
@@ -27,10 +36,27 @@
 	Reduceloadx(pf, Kfs, ys); delete Kfs;
 	Solverx(&uf, Kff, pf, NULL, df, femmodel->parameters); 
+	
+	/*Check that the solver converged nicely: */
+		
+	//compute KUF = KU - F = K*U - F
+	KU=uf->Duplicate(); Kff->MatMult(uf,KU);
+	KUF=KU->Duplicate(); KU->Copy(KUF); KUF->AYPX(pf,-1.0);
+
+	//compute norm(KUF), norm(F) and residue
+	nKUF=KUF->Norm(NORM_TWO);
+	nF=pf->Norm(NORM_TWO);
+	solver_residue=nKUF/nF;
+	if(solver_residue>pow(10,-6))_error_("   solver residue too high!: norm(KU-F)/norm(F)=" << solver_residue << "\n");
+
+	//clean up
+	delete KU; delete KUF;
 	delete Kff; delete pf; delete df;
-//#ifdef  _HAVE_ADOLC_
-//        for (int i =0; i<uf->svector->M; ++i) {
-//          ADOLC_DUMP_MACRO(uf->svector->vector[i]);
-//        }
-//#endif
+
+	//#ifdef  _HAVE_ADOLC_
+	//        for (int i =0; i<uf->svector->M; ++i) {
+	//          ADOLC_DUMP_MACRO(uf->svector->vector[i]);
+	//        }
+	//#endif
+	
 	Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete uf; delete ys;
 	InputUpdateFromSolutionx(femmodel,ug); 
