Index: /issm/trunk/src/c/Container/DataSet.cpp
===================================================================
--- /issm/trunk/src/c/Container/DataSet.cpp	(revision 9297)
+++ /issm/trunk/src/c/Container/DataSet.cpp	(revision 9298)
@@ -448,5 +448,4 @@
 void DataSet::Echo(){
 
-
 	vector<Object*>::iterator object;
 
@@ -493,4 +492,5 @@
 	int i;
 
+	_assert_(this);
 	if(!sorted)_error_(" trying to binary search on a non-sorted dataset!");
 
Index: /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 9297)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 9298)
@@ -167,13 +167,22 @@
 			/*Now add the regular spcs*/
 			else{
-				if (!isnan(iomodel->spcvx[i]) || (int)iomodel->nodeonhutter[i]){
+				if (!isnan(iomodel->spcvx[i])){
 					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,iomodel->spcvx[i]/iomodel->yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 					count++;
 				}
+				else if (iomodel->nodeonhutter[i]){
+					constraints->AddObject(new SpcDynamic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,DiagnosticHorizAnalysisEnum)); 
+					count++;
+				}
 				
-				if (!isnan(iomodel->spcvy[i]) || (int)iomodel->nodeonhutter[i]){
-					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,iomodel->spcvy[i]/iomodel->yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 2 to vy
-					count++;
-				}
+				if (!isnan(iomodel->spcvy[i])){
+					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,iomodel->spcvy[i]/iomodel->yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vy.
+					count++;
+				}
+				else if (iomodel->nodeonhutter[i]){
+					constraints->AddObject(new SpcDynamic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,DiagnosticHorizAnalysisEnum)); 
+					count++;
+				}
+
 				if (!isnan(iomodel->spcvz[i]) && ((int)iomodel->vertices_type[i]==StokesApproximationEnum ||  ((int)iomodel->vertices_type[i]==NoneApproximationEnum))){
 					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,iomodel->spcvz[i]/iomodel->yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 2 to vy
Index: /issm/trunk/src/c/modules/SpcNodesx/SpcNodesx.cpp
===================================================================
--- /issm/trunk/src/c/modules/SpcNodesx/SpcNodesx.cpp	(revision 9297)
+++ /issm/trunk/src/c/modules/SpcNodesx/SpcNodesx.cpp	(revision 9298)
@@ -12,7 +12,5 @@
 void SpcNodesx(Nodes* nodes,Constraints* constraints,Parameters* parameters, int analysis_type){
 
-	int i;
-			
-	for(i=0;i<constraints->Size();i++){
+	for(int i=0;i<constraints->Size();i++){
 	
 		Constraint* constraint=(Constraint*)constraints->GetObjectByOffset(i);
Index: /issm/trunk/src/c/modules/UpdateDynamicConstraintsx/UpdateDynamicConstraintsx.cpp
===================================================================
--- /issm/trunk/src/c/modules/UpdateDynamicConstraintsx/UpdateDynamicConstraintsx.cpp	(revision 9297)
+++ /issm/trunk/src/c/modules/UpdateDynamicConstraintsx/UpdateDynamicConstraintsx.cpp	(revision 9298)
@@ -10,33 +10,28 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void UpdateDynamicConstraintsx(Nodes* nodes,Parameters* parameters,Vec ys){
+void UpdateDynamicConstraintsx(Constraints* constraints,Nodes* nodes,Parameters* parameters,Vec yg){
 	
-	int i;
 	int configuration_type;
-	double* ys_serial=NULL;
+	double* yg_serial=NULL;
 
-	/*retrieve parameters: */
+	/*Get current configuration*/
 	parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
 
-	if(nodes->NumberOfNodes(configuration_type)){ 
+	/*serialize yg, so nodes can index into it: */
+	VecToMPISerial(&yg_serial,yg);
 
-		/*serialize ys, so nodes can index into it: */
-		VecToMPISerial(&ys_serial,ys);
+	for(int i=0;i<constraints->Size();i++){
 
-		/*Go through all nodes, and ask them to retrieve values from ys and then update their spc values :*/
-		for(i=0;i<nodes->Size();i++){
+		Constraint* constraint=(Constraint*)constraints->GetObjectByOffset(i);
 
-			Node* node=(Node*)nodes->GetObjectByOffset(i);
+		/*Check this constraint belongs to this analysis: */
+		if(constraint->InAnalysis(configuration_type) && constraint->Enum()==SpcDynamicEnum){
 
-			/*Check that this node corresponds to our analysis currently being carried out: */
-			if (node->InAnalysis(configuration_type)){
+			((SpcDynamic*)constraint)->SetDynamicConstraint(nodes,yg_serial);
 
-				/*For this object, reset values of spc fields in the node: */
-				node->UpdateSpcs(ys_serial);
-			}
 		}
 	}
 
 	/*Free ressources:*/
-	xfree((void**)&ys_serial);
+	xfree((void**)&yg_serial);
 }
Index: /issm/trunk/src/c/modules/UpdateDynamicConstraintsx/UpdateDynamicConstraintsx.h
===================================================================
--- /issm/trunk/src/c/modules/UpdateDynamicConstraintsx/UpdateDynamicConstraintsx.h	(revision 9297)
+++ /issm/trunk/src/c/modules/UpdateDynamicConstraintsx/UpdateDynamicConstraintsx.h	(revision 9298)
@@ -9,5 +9,5 @@
 #include "../../objects/objects.h"
 
-void UpdateDynamicConstraintsx(Nodes* nodes,Parameters* parameters,Vec ys);
+void UpdateDynamicConstraintsx(Constraints* constraints,Nodes* nodes,Parameters* parameters,Vec yg);
 
 #endif  /* _UPDATESPCSX_H */
Index: /issm/trunk/src/c/objects/Constraints/SpcDynamic.cpp
===================================================================
--- /issm/trunk/src/c/objects/Constraints/SpcDynamic.cpp	(revision 9297)
+++ /issm/trunk/src/c/objects/Constraints/SpcDynamic.cpp	(revision 9298)
@@ -24,11 +24,12 @@
 /*}}}1*/
 /*FUNCTION SpcDynamic::SpcDynamic(int spc_sid,int spc_nodeid,...){{{1*/
-SpcDynamic::SpcDynamic(int spc_sid,int spc_nodeid, int spc_dof,double spc_value,int spc_analysis_type){
+SpcDynamic::SpcDynamic(int spc_sid,int spc_nodeid, int spc_dof,int spc_analysis_type){
 
 	sid=spc_sid;
 	nodeid=spc_nodeid;
 	dof=spc_dof;
-	value=spc_value;
+	value=0;
 	analysis_type=spc_analysis_type;
+	isset=false;
 
 	return;
@@ -50,4 +51,5 @@
 	printf("   dof: %i\n",dof);
 	printf("   value: %g\n",value);
+	printf("   isset: %s\n",isset?"true":"false");
 	printf("   analysis_type: %s\n",EnumToStringx(analysis_type));
 	return;
@@ -57,10 +59,5 @@
 void SpcDynamic::DeepEcho(void){
 
-	printf("SpcDynamic:\n");
-	printf("   sid: %i\n",sid);
-	printf("   nodeid: %i\n",nodeid);
-	printf("   dof: %i\n",dof);
-	printf("   value: %g\n",value);
-	printf("   analysis_type: %s\n",EnumToStringx(analysis_type));
+	this->Echo();
 	return;
 }		
@@ -95,4 +92,5 @@
 	memcpy(marshalled_dataset,&dof,sizeof(dof));marshalled_dataset+=sizeof(dof);
 	memcpy(marshalled_dataset,&value,sizeof(value));marshalled_dataset+=sizeof(value);
+	memcpy(marshalled_dataset,&isset,sizeof(isset));marshalled_dataset+=sizeof(isset);
 	memcpy(marshalled_dataset,&analysis_type,sizeof(analysis_type));marshalled_dataset+=sizeof(analysis_type);
 
@@ -108,4 +106,5 @@
 		+sizeof(dof)
 		+sizeof(value)
+		+sizeof(isset)
 		+sizeof(analysis_type)
 		+sizeof(int); //sizeof(int) for enum type
@@ -127,4 +126,5 @@
 	memcpy(&dof,marshalled_dataset,sizeof(dof));marshalled_dataset+=sizeof(dof);
 	memcpy(&value,marshalled_dataset,sizeof(value));marshalled_dataset+=sizeof(value);
+	memcpy(&isset,marshalled_dataset,sizeof(isset));marshalled_dataset+=sizeof(isset);
 	memcpy(&analysis_type,marshalled_dataset,sizeof(analysis_type));marshalled_dataset+=sizeof(analysis_type);
 
@@ -164,4 +164,6 @@
 	/*Apply constraint: */
 	if(node){ //in case the spc is dealing with a node on another cpu
+
+		/*We should first check that the value has been set... (test306)*/
 		node->ApplyConstraint(dof,value);
 	}
@@ -183,6 +185,19 @@
 /*FUNCTION SpcDynamic::GetValue {{{1*/
 double SpcDynamic::GetValue(){
+	_assert_(this->isset);
 	_assert_(!isnan(value));
 	return value;
 }
 /*}}}1*/
+/*FUNCTION SpcDynamic::SetDynamicConstraint {{{1*/
+void SpcDynamic::SetDynamicConstraint(Nodes* nodes,double* yg_serial){
+
+	int pos;
+
+	Node* node=(Node*)nodes->GetObjectById(NULL,nodeid);
+	pos=node->GetDof(dof,GsetEnum);
+
+	this->value=yg_serial[pos];
+	this->isset=true;
+}
+/*}}}1*/
Index: /issm/trunk/src/c/objects/Constraints/SpcDynamic.h
===================================================================
--- /issm/trunk/src/c/objects/Constraints/SpcDynamic.h	(revision 9297)
+++ /issm/trunk/src/c/objects/Constraints/SpcDynamic.h	(revision 9298)
@@ -19,4 +19,5 @@
 		int dof; /*!component*/
 		double value; /*value*/
+		bool isset;
 		int analysis_type;
 
@@ -25,5 +26,5 @@
 		/*SpcDynamic constructors, destructors:{{{1*/
 		SpcDynamic();
-		SpcDynamic(int sid,int nodeid, int dof,double value,int analysis_type);
+		SpcDynamic(int sid,int nodeid, int dof,int analysis_type);
 		~SpcDynamic();
 		/*}}}*/
@@ -47,4 +48,5 @@
 		int    GetDof();
 		double GetValue();
+		void   SetDynamicConstraint(Nodes* nodes,double *yg_serial);
 		/*}}}*/
 
Index: /issm/trunk/src/c/solutions/ResetBoundaryConditions.cpp
===================================================================
--- /issm/trunk/src/c/solutions/ResetBoundaryConditions.cpp	(revision 9297)
+++ /issm/trunk/src/c/solutions/ResetBoundaryConditions.cpp	(revision 9298)
@@ -10,8 +10,7 @@
 	
 	/*variables: */
-	Vec yg=NULL;
-	Vec ys=NULL;
-	Nodes* nodes=NULL;
-	int i;
+	Vec    yg    = NULL;
+	Nodes *nodes = NULL;
+	int    i;
 
 	_printf_(VerboseSolution(),"%s\n","   updating boundary conditions...");
@@ -25,11 +24,9 @@
 	/*retrieve boundary conditions from element inputs :*/
 	GetSolutionFromInputsx( &yg, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,  femmodel->parameters);
-	Reducevectorgtosx(&ys,yg,femmodel->nodes,femmodel->parameters);
 
 	/*update spcs using this new vector of constraints: */
-	UpdateDynamicConstraintsx(femmodel->nodes,femmodel->parameters,ys);
+	UpdateDynamicConstraintsx(femmodel->constraints,femmodel->nodes,femmodel->parameters,yg);
 
 	/*Free ressources:*/
-	VecFree(&ys);
 	VecFree(&yg);
 }
Index: /issm/trunk/src/m/solutions/ResetBoundaryConditions.m
===================================================================
--- /issm/trunk/src/m/solutions/ResetBoundaryConditions.m	(revision 9297)
+++ /issm/trunk/src/m/solutions/ResetBoundaryConditions.m	(revision 9298)
@@ -14,6 +14,5 @@
 	%recreate constraints vector for the current analysis
 	ug=GetSolutionFromInputs(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters);
-	ys=Reducevectorgtos(ug,femmodel.nodes,femmodel.parameters);
 
 	%update values of spcs inside nodes
-	femmodel.nodes=UpdateDynamicConstraints(femmodel.nodes,femmodel.parameters,ys);
+	femmodel.nodes=UpdateDynamicConstraints(femmodel.constraints,femmodel.nodes,femmodel.parameters,ug);
Index: /issm/trunk/src/mex/UpdateDynamicConstraints/UpdateDynamicConstraints.cpp
===================================================================
--- /issm/trunk/src/mex/UpdateDynamicConstraints/UpdateDynamicConstraints.cpp	(revision 9297)
+++ /issm/trunk/src/mex/UpdateDynamicConstraints/UpdateDynamicConstraints.cpp	(revision 9298)
@@ -8,7 +8,8 @@
 
 	/*input datasets: */
-	Nodes* nodes=NULL;
-	Parameters* parameters=NULL;
-	Vec ys=NULL;
+	Constraints *constraints = NULL;
+	Nodes       *nodes       = NULL;
+	Parameters  *parameters  = NULL;
+	Vec          yg          = NULL;
 
 	/*Boot module: */
@@ -19,10 +20,11 @@
 
 	/*Input datasets: */
+	FetchMatlabData((DataSet**)&constraints,CONSTRAINTSIN);
 	FetchMatlabData((DataSet**)&nodes,NODESIN);
 	FetchMatlabData((Parameters**)&parameters,PARAMETERS);
-	FetchMatlabData(&ys,YS);
+	FetchMatlabData(&yg,YS);
 	
 	/*!Generate internal degree of freedom numbers: */
-	UpdateDynamicConstraintsx(nodes,parameters,ys);
+	UpdateDynamicConstraintsx(constraints,nodes,parameters,yg);
 
 	/*write output datasets: */
@@ -30,4 +32,6 @@
 
 	/*Free ressources: */
+	VecFree(&yg);
+	delete constraints;
 	delete nodes;
 	delete parameters;
Index: /issm/trunk/src/mex/UpdateDynamicConstraints/UpdateDynamicConstraints.h
===================================================================
--- /issm/trunk/src/mex/UpdateDynamicConstraints/UpdateDynamicConstraints.h	(revision 9297)
+++ /issm/trunk/src/mex/UpdateDynamicConstraints/UpdateDynamicConstraints.h	(revision 9298)
@@ -17,7 +17,8 @@
 
 /* serial input macros: */
-#define NODESIN (mxArray*)prhs[0]
-#define PARAMETERS (mxArray*)prhs[1]
-#define YS (mxArray*)prhs[2]
+#define CONSTRAINTSIN (mxArray*)prhs[0]
+#define NODESIN (mxArray*)prhs[1]
+#define PARAMETERS (mxArray*)prhs[2]
+#define YS (mxArray*)prhs[3]
 
 /* serial output macros: */
@@ -28,5 +29,5 @@
 #define NLHS  1
 #undef NRHS
-#define NRHS  3
+#define NRHS  4
 
 #endif  /* _UPDATESPCS_H */
