Index: /issm/trunk-jpl/src/c/classes/Constraints/SpcStatic.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Constraints/SpcStatic.cpp	(revision 24711)
+++ /issm/trunk-jpl/src/c/classes/Constraints/SpcStatic.cpp	(revision 24712)
@@ -104,5 +104,5 @@
 
 	/*Apply constraint: */
-	if(node){ //in case the spc is dealing with a node on another cpu
+	if(!this->penalty && node){ //in case the spc is dealing with a node on another cpu
 		node->ApplyConstraint(dof,value);
 	}
@@ -125,4 +125,30 @@
 }
 /*}}}*/
+void SpcStatic::PenaltyDofAndValue(int* pdof,IssmDouble* pvalue,Nodes* nodes,Parameters* parameters){/*{{{*/
+
+	if(!this->penalty) _error_("cannot return dof and value for non penalty constraint");
+
+	IssmDouble value_out = this->value;
+	int gdof;
+
+	/*Chase through nodes and find the node to which this SpcTransient applys: */
+	Node* node=(Node*)nodes->GetObjectById(NULL,nodeid);
+
+	if(node){ //in case the spc is dealing with a node on another cpu
+
+		/*Get gdof */
+		gdof = node->GetDof(dof,GsetEnum);
+		if(xIsNan<IssmDouble>(value_out)) gdof = -1;
+	}
+	else{
+		value_out = NAN;
+		gdof = -1;
+	}
+
+	/*Assign output pointers*/
+	*pdof   = gdof;
+	*pvalue = value_out;
+}
+/*}}}*/
 
 /*SpcStatic functions*/
Index: /issm/trunk-jpl/src/c/classes/Constraints/SpcStatic.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Constraints/SpcStatic.h	(revision 24711)
+++ /issm/trunk-jpl/src/c/classes/Constraints/SpcStatic.h	(revision 24712)
@@ -39,5 +39,5 @@
 		void ActivatePenaltyMethod(void);
 		void ConstrainNode(Nodes* nodes,Parameters* parameters);
-		void PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters){_error_("not implemented yet");};
+		void PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters);
 		void InputUpdateFromVectorDakota(IssmDouble* vector,Nodes* nodes,int name,int type);
 		/*}}}*/
