Index: /issm/trunk/src/c/modules/Mergesolutionfromftogx/Mergesolutionfromftogx.cpp
===================================================================
--- /issm/trunk/src/c/modules/Mergesolutionfromftogx/Mergesolutionfromftogx.cpp	(revision 4953)
+++ /issm/trunk/src/c/modules/Mergesolutionfromftogx/Mergesolutionfromftogx.cpp	(revision 4954)
@@ -21,5 +21,5 @@
 	/*Merge f set back into n set: */
 	u_n=NewVec(nodesets->GetNSize());
-	VecMerge(u_n,uf,nodesets->GetPV_F(),nodesets->GetFSize());
+	if(uf) VecMerge(u_n,uf,nodesets->GetPV_F(),nodesets->GetFSize());
 
 	/*merge single point constraints into n set: */
Index: /issm/trunk/src/c/modules/Reduceloadfromgtofx/Reduceloadfromgtofx.cpp
===================================================================
--- /issm/trunk/src/c/modules/Reduceloadfromgtofx/Reduceloadfromgtofx.cpp	(revision 4953)
+++ /issm/trunk/src/c/modules/Reduceloadfromgtofx/Reduceloadfromgtofx.cpp	(revision 4954)
@@ -64,25 +64,30 @@
 		if (nodesets->GetSSize()){
 
-			VecPartition(&pf, pn, nodesets->GetPV_F(),nodesets->GetFSize());
+			if(nodesets->GetFSize()){
+				VecPartition(&pf, pn, nodesets->GetPV_F(),nodesets->GetFSize());
 
-			/*pf = pf - Kfs * y_s;*/
-			MatGetLocalSize(Kfs,&Kfsm,&Kfsn);
-			Kfsy_s=NewVecFromLocalSize(Kfsm);
-			if (flag_ys0){
+				/*pf = pf - Kfs * y_s;*/
+				MatGetLocalSize(Kfs,&Kfsm,&Kfsn);
+				Kfsy_s=NewVecFromLocalSize(Kfsm);
+				if (flag_ys0){
 
-				/*Create y_s0, full of 0: */
-				VecDuplicate(y_s,&y_s0);
-				VecSet(y_s0,0.0);
-				VecAssemblyBegin(y_s0);
-				VecAssemblyEnd(y_s0);
+					/*Create y_s0, full of 0: */
+					VecDuplicate(y_s,&y_s0);
+					VecSet(y_s0,0.0);
+					VecAssemblyBegin(y_s0);
+					VecAssemblyEnd(y_s0);
 
-				MatMultPatch(Kfs,y_s0,Kfsy_s);
+					MatMultPatch(Kfs,y_s0,Kfsy_s);
+				}
+				else{
+					MatMultPatch(Kfs,y_s,Kfsy_s);
+				}
+
+				a=-1;
+				VecAXPY(pf,a,Kfsy_s);  
 			}
 			else{
-				MatMultPatch(Kfs,y_s,Kfsy_s);
+				pf=NULL;
 			}
-
-			a=-1;
-			VecAXPY(pf,a,Kfsy_s);  
 		}
 		else{
Index: /issm/trunk/src/c/modules/Reducematrixfromgtofx/Reducematrixfromgtofx.cpp
===================================================================
--- /issm/trunk/src/c/modules/Reducematrixfromgtofx/Reducematrixfromgtofx.cpp	(revision 4953)
+++ /issm/trunk/src/c/modules/Reducematrixfromgtofx/Reducematrixfromgtofx.cpp	(revision 4954)
@@ -19,8 +19,9 @@
 	//Reduce matrix from n-size to f-size
 	if(nodesets->GetSSize()){
-		
-		MatPartition(&Kff, Knn, nodesets->GetPV_F(),nodesets->GetFSize(),nodesets->GetPV_F(),nodesets->GetFSize()); 
-		MatPartition(&Kfs, Knn, nodesets->GetPV_F(),nodesets->GetFSize(),nodesets->GetPV_S(),nodesets->GetSSize()); 
 
+		if(nodesets->GetFSize()){
+			MatPartition(&Kff, Knn, nodesets->GetPV_F(),nodesets->GetFSize(),nodesets->GetPV_F(),nodesets->GetFSize()); 
+			MatPartition(&Kfs, Knn, nodesets->GetPV_F(),nodesets->GetFSize(),nodesets->GetPV_S(),nodesets->GetSSize()); 
+		}
 	}
 	else{
Index: /issm/trunk/src/c/modules/Solverx/Solverx.cpp
===================================================================
--- /issm/trunk/src/c/modules/Solverx/Solverx.cpp	(revision 4953)
+++ /issm/trunk/src/c/modules/Solverx/Solverx.cpp	(revision 4954)
@@ -29,4 +29,10 @@
 	PetscTruth flag;
 	int solver_type;
+
+	/*First, check that f-set is not NULL, ie model is fully constrained: */
+	if(!Kff){
+		*puf=NULL;
+		return;
+	}
 
 	/*If initial guess for solution exists, use it to create uf, otherwise, 
Index: /issm/trunk/src/c/solutions/convergence.cpp
===================================================================
--- /issm/trunk/src/c/solutions/convergence.cpp	(revision 4953)
+++ /issm/trunk/src/c/solutions/convergence.cpp	(revision 4954)
@@ -31,6 +31,10 @@
 	double yts;
 
-	/*Check arguments*/
-	ISSMASSERT(Kff && pf && uf && old_uf);
+	/*If uf is NULL in input, f-set is nil, model is fully constrained, therefore converged from 
+	 * the get go: */
+	if(!uf){
+		*pconverged=1;
+		return;
+	}
 
 	/*get convergence options*/
Index: /issm/trunk/src/m/classes/public/ismodelselfconsistent.m
===================================================================
--- /issm/trunk/src/m/classes/public/ismodelselfconsistent.m	(revision 4953)
+++ /issm/trunk/src/m/classes/public/ismodelselfconsistent.m	(revision 4954)
@@ -188,14 +188,4 @@
 %DIAGNOSTIC{{{1
 if md.analysis_type==DiagnosticSolutionEnum,
-
-	%CHECK THAT WE ARE NOT FULLY CONSTRAINED
-	if isempty(find(~md.spcvelocity(:,1:2))),
-		error(['model not consistent: model ' md.name ' is totally constrained horizontally, no need to solve!']);
-	end
-	if (md.dim==3),
-		if isempty(find(~md.spcvelocity(:,3))),
-			error(['model not consistent: model ' md.name ' is totally constrained vertically, no need to solve!']);
-		end
-	end
 
 	%HUTTER ON ICESHELF WARNING
Index: /issm/trunk/src/m/solutions/convergence.m
===================================================================
--- /issm/trunk/src/m/solutions/convergence.m	(revision 4953)
+++ /issm/trunk/src/m/solutions/convergence.m	(revision 4954)
@@ -1,3 +1,6 @@
 function converged=convergence(K_ff,p_f,u_f,u_f_old,parameters)
+
+%before we start, check that u_f actually holds values, otherwise, we are done converging
+if isempty(u_f), converged=true;  return; end
 
 %Get convergence options
Index: /issm/trunk/src/m/solvers/solver_diagnostic_nonlinear.m
===================================================================
--- /issm/trunk/src/m/solvers/solver_diagnostic_nonlinear.m	(revision 4953)
+++ /issm/trunk/src/m/solvers/solver_diagnostic_nonlinear.m	(revision 4954)
@@ -34,11 +34,12 @@
 		displaystring(femmodel.parameters.Verbose,'%s','   Generating penalty matrices:');
 		[K_gg , p_g, kmax]=PenaltySystemMatrices(K_gg_nopenalty,p_g_nopenalty,femmodel.elements,femmodel.nodes,femmodel.vertices,loads,femmodel.materials,femmodel.parameters);
+		
 
 		displaystring(femmodel.parameters.Verbose,'%s','   reducing matrix from g to f set');
 		[K_ff, K_fs] = Reducematrixfromgtof( K_gg, femmodel.Gmn, femmodel.nodesets); 
-
+		
 		displaystring(femmodel.parameters.Verbose,'%s','   reduce load from g size to f size');
 		p_f = Reduceloadfromgtof( p_g, femmodel.Gmn, K_fs, femmodel.ys, femmodel.nodesets);
-		
+
 		displaystring(femmodel.parameters.Verbose,'%s','   solving');
 		uf=Solver(K_ff,p_f,old_uf,femmodel.parameters);
@@ -54,5 +55,5 @@
 		
 		displaystring(femmodel.parameters.Verbose,'%s%i','      number of unstable constraints: ',num_unstable_constraints);
-		
+
 		%Figure out if convergence have been reached
 		converged=convergence(K_ff,p_f,uf,old_uf,femmodel.parameters);
Index: /issm/trunk/test/Verification/test01_IceShelfIceFrontM2d/Square.par
===================================================================
--- /issm/trunk/test/Verification/test01_IceShelfIceFrontM2d/Square.par	(revision 4953)
+++ /issm/trunk/test/Verification/test01_IceShelfIceFrontM2d/Square.par	(revision 4954)
@@ -2,5 +2,5 @@
 
 %dynamics
-md.verbose=0;
+md.verbose=1;
 md.dt=1; %1 year
 md.ndt=md.dt*10; 
@@ -36,2 +36,8 @@
 md.time=50;
 md.waitonlock=30;
+
+%spc all velocities
+md.spcvelocity(:,1:3)=1;
+md.spcvelocity(:,4)=0;
+md.spcvelocity(:,5)=100;
+md.spcvelocity(:,6)=0;
