Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 10528)
+++ /issm/trunk/src/c/Makefile.am	(revision 10529)
@@ -487,4 +487,5 @@
 							./shared/Elements/TransformLoadVectorCoord.cpp \
 							./shared/Elements/TransformStiffnessMatrixCoord.cpp \
+							./shared/Elements/TransformInvStiffnessMatrixCoord.cpp \
 							./shared/Elements/TransformSolutionCoord.cpp
 diagnostic_psources =./solutions/diagnostic_core.cpp\
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 10528)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 10529)
@@ -5565,4 +5565,23 @@
 ElementMatrix* Penta::CreateKMatrixCouplingPattynStokes(void){
 
+	/*Constants*/
+	const int numnodes  = 2 *NUMVERTICES;
+	const int numdofp     = NDOF2 *NUMVERTICES;
+	const int numdofs     = NDOF4 *NUMVERTICES;
+	const int numdoftotal = (NDOF2+NDOF4) *NUMVERTICES;
+
+	/*Intermediaries*/
+	Node     *node_list[numnodes];
+	int       cs_list[numnodes];
+	int       i,j;
+
+	/*Prepare node list*/
+	for(i=0;i<NUMVERTICES;i++){
+		node_list[i+0*NUMVERTICES] = this->nodes[i];
+		node_list[i+1*NUMVERTICES] = this->nodes[i];
+		cs_list[i+0*NUMVERTICES] = XYEnum;
+		cs_list[i+1*NUMVERTICES] = XYZPEnum;
+	}
+
 	/*compute all stiffness matrices for this element*/
 	ElementMatrix* Ke1=new ElementMatrix(this->nodes,NUMVERTICES,this->parameters,PattynApproximationEnum);
@@ -5571,12 +5590,6 @@
 	delete Ke1;
 	delete Ke2;
-	Ke1=CreateKMatrixDiagnosticPattyn();
-	Ke2=CreateKMatrixDiagnosticStokes();
-
-	/*Constants*/
-	const int numdofp     = NDOF2 *NUMVERTICES;
-	const int numdofs     = NDOF4 *NUMVERTICES;
-	const int numdoftotal = (NDOF2+NDOF4) *NUMVERTICES;
-	int       i,j;
+	Ke1=CreateKMatrixDiagnosticPattyn(); TransformInvStiffnessMatrixCoord(Ke1,this->nodes,NUMVERTICES,XYEnum);
+	Ke2=CreateKMatrixDiagnosticStokes(); TransformInvStiffnessMatrixCoord(Ke2,this->nodes,NUMVERTICES,XYZPEnum);
 
 	for(i=0;i<numdofs;i++) for(j=0;j<NUMVERTICES;j++){
@@ -5588,4 +5601,7 @@
 		Ke->values[i*numdoftotal+numdofp+NDOF4*j+1]+=Ke1->values[i*numdofp+NDOF2*j+1];
 	}
+
+	/*Transform Coordinate System*/
+	TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
 
 	/*clean-up and return*/
Index: /issm/trunk/src/c/shared/Elements/TransformInvStiffnessMatrixCoord.cpp
===================================================================
--- /issm/trunk/src/c/shared/Elements/TransformInvStiffnessMatrixCoord.cpp	(revision 10529)
+++ /issm/trunk/src/c/shared/Elements/TransformInvStiffnessMatrixCoord.cpp	(revision 10529)
@@ -0,0 +1,53 @@
+/*!\file:  TransformInvStiffnessMatrixCoord.cpp
+ * \brief transform stiffness matrix inverse coordinate system
+ */ 
+#include "./elements.h"
+
+void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum){
+
+	int* cs_array=NULL;
+
+	/*All nodes have the same Coordinate System*/
+	cs_array=(int*)xmalloc(numnodes*sizeof(int));
+	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
+
+	/*Call core*/
+	TransformInvStiffnessMatrixCoord(Ke,nodes,numnodes,cs_array);
+
+	/*Clean-up*/
+	xfree((void**)&cs_array);
+}
+
+void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array){
+
+	int     i,j;
+	int     numdofs   = 0;
+	double *transform = NULL;
+	double *values    = NULL;
+
+	/*Get total number of dofs*/
+	for(i=0;i<numnodes;i++){
+		switch(cs_array[i]){
+			case XYEnum:   numdofs+=2; break;
+			case XYZPEnum: numdofs+=4; break;
+			default: _error_("Coordinate system %s not supported yet",EnumToStringx(cs_array[i]));
+		}
+	}
+
+	/*Copy current stiffness matrix*/
+	values=(double*)xmalloc(Ke->nrows*Ke->ncols*sizeof(double));
+	for(i=0;i<Ke->nrows;i++) for(j=0;j<Ke->ncols;j++) values[i*Ke->ncols+j]=Ke->values[i*Ke->ncols+j];
+
+	/*Get Coordinate Systems transform matrix*/
+	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
+
+	/*Transform matrix: R*Ke*R^T */
+	TripleMultiply(transform,numdofs,numdofs,0,
+				values,Ke->nrows,Ke->ncols,0,
+				transform,numdofs,numdofs,1,
+				&Ke->values[0],0);
+
+	/*Free Matrix*/
+	xfree((void**)&transform);
+	xfree((void**)&values);
+}
Index: /issm/trunk/src/c/shared/Elements/elements.h
===================================================================
--- /issm/trunk/src/c/shared/Elements/elements.h	(revision 10528)
+++ /issm/trunk/src/c/shared/Elements/elements.h	(revision 10529)
@@ -19,4 +19,6 @@
 void   CoordinateSystemTransform(double** ptransform,Node** nodes,int numnodes,int* cs_array);
 #ifdef _HAVE_DIAGNOSTIC_
+void   TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
+void   TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
 void   TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
 void   TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
