Index: /issm/trunk/src/c/objects/Loads/Penpair.cpp
===================================================================
--- /issm/trunk/src/c/objects/Loads/Penpair.cpp	(revision 5556)
+++ /issm/trunk/src/c/objects/Loads/Penpair.cpp	(revision 5557)
@@ -207,5 +207,33 @@
 
 	if (analysis_type==DiagnosticHorizAnalysisEnum){
-		PenaltyCreateKMatrixDiagnosticHoriz(Kgg,kmax);
+		Node** nodes=NULL;
+		int approximation0,approximation1;
+		nodes=(Node**)hnodes->deliverp();
+		approximation0=nodes[0]->GetApproximation();
+		approximation1=nodes[1]->GetApproximation();
+
+		switch(approximation0){
+			case MacAyealApproximationEnum:
+				switch(approximation1){
+					case MacAyealApproximationEnum: PenaltyCreateKMatrixDiagnosticHoriz(Kgg,kmax); break;
+					case PattynApproximationEnum:   PenaltyCreateKMatrixDiagnosticHoriz(Kgg,kmax); break;
+					default: ISSMERROR("not supported yet");
+				}
+				break;
+			case PattynApproximationEnum:
+				switch(approximation1){
+					case MacAyealApproximationEnum: PenaltyCreateKMatrixDiagnosticHoriz(Kgg,kmax); break;
+					case PattynApproximationEnum:   PenaltyCreateKMatrixDiagnosticHoriz(Kgg,kmax); break;
+					default: ISSMERROR("not supported yet");
+				}
+				break;
+			case StokesApproximationEnum:
+				switch(approximation1){
+					case StokesApproximationEnum: PenaltyCreateKMatrixDiagnosticStokes(Kgg,kmax); break;
+					default: ISSMERROR("not supported yet");
+				}
+				break;
+			default: ISSMERROR("not supported yet");
+		}
 	}
 	else if (analysis_type==DiagnosticStokesAnalysisEnum){
Index: /issm/trunk/src/c/objects/Node.cpp
===================================================================
--- /issm/trunk/src/c/objects/Node.cpp	(revision 5556)
+++ /issm/trunk/src/c/objects/Node.cpp	(revision 5557)
@@ -84,4 +84,5 @@
 	if (iomodel->gridonicesheet) this->inputs->AddInput(new BoolInput(NodeOnIceSheetEnum,(IssmBool)iomodel->gridonicesheet[io_index]));
 	if (iomodel->numbernodetoelementconnectivity) this->inputs->AddInput(new IntInput(NumberNodeToElementConnectivityEnum,iomodel->numbernodetoelementconnectivity[io_index]));
+	if (analysis_type==DiagnosticHorizAnalysisEnum) this->inputs->AddInput(new IntInput(ApproximationEnum,iomodel->vertices_type[io_index]));
 
 	/*set single point constraints: */
@@ -444,4 +445,15 @@
 }
 /*}}}*/
+/*FUNCTION Node::GetApproximation {{{1*/
+int   Node::GetApproximation(){
+
+	int approximation;
+
+	/*recover parameters: */
+	inputs->GetParameterValue(&approximation,ApproximationEnum);
+
+	return approximation;
+}
+/*}}}*/
 /*FUNCTION Node::GetConnectivity {{{1*/
 int Node::GetConnectivity(){
Index: /issm/trunk/src/c/objects/Node.h
===================================================================
--- /issm/trunk/src/c/objects/Node.h	(revision 5556)
+++ /issm/trunk/src/c/objects/Node.h	(revision 5557)
@@ -71,4 +71,5 @@
 		void  SetVertexDof(int in_dof);
 		bool  InAnalysis(int analysis_type);
+		int   GetApproximation();
 		int   GetNumberOfDofs(int approximation_enum=0);
 		int   IsClone();
