Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 17254)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 17255)
@@ -53,4 +53,78 @@
 	return false;
 }/*}}}*/
+void Element::CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes_list,int numnodes,int* cs_array){/*{{{*/
+
+	int         i,counter;
+	int         numdofs   = 0;
+	IssmDouble  norm;
+	IssmDouble *transform = NULL;
+	IssmDouble  coord_system[3][3];
+
+	/*Some checks in debugging mode*/
+	_assert_(numnodes && nodes_list);
+
+	/*Get total number of dofs*/
+	for(i=0;i<numnodes;i++){
+		switch(cs_array[i]){
+			case PressureEnum: numdofs+=1; break;
+			case XYEnum:       numdofs+=2; break;
+			case XYZEnum:      numdofs+=3; break;
+			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Allocate and initialize transform matrix*/
+	transform=xNew<IssmDouble>(numdofs*numdofs);
+	for(i=0;i<numdofs*numdofs;i++) transform[i]=0.0;
+
+	/*Create transform matrix for all nodes (x,y for 2d and x,y,z for 3d). It is a block matrix
+	 *for 3 nodes:
+
+	 *     | T1 0  0 |
+	 * Q = | 0  T2 0 |
+	 *     | 0  0  T3|
+	 *
+	 * Where T1 is the transform matrix for node 1. It is a simple copy of the coordinate system
+	 * associated to this node*/
+	counter=0;
+	for(i=0;i<numnodes;i++){
+		nodes_list[i]->GetCoordinateSystem(&coord_system[0][0]);
+		switch(cs_array[i]){
+			case PressureEnum:
+				/*DO NOT change anything*/
+				transform[(numdofs)*(counter) + counter] = 1.;
+				counter+=1;
+				break;
+			case XYEnum:
+				/*We remove the z component, we need to renormalize x and y: x=[x1 x2 0] y=[-x2 x1 0]*/
+				norm = sqrt( coord_system[0][0]*coord_system[0][0] + coord_system[1][0]*coord_system[1][0]); _assert_(norm>1.e-4);
+				transform[(numdofs)*(counter+0) + counter+0] =   coord_system[0][0]/norm;
+				transform[(numdofs)*(counter+0) + counter+1] = - coord_system[1][0]/norm;
+				transform[(numdofs)*(counter+1) + counter+0] =   coord_system[1][0]/norm;
+				transform[(numdofs)*(counter+1) + counter+1] =   coord_system[0][0]/norm;
+				counter+=2;
+				break;
+			case XYZEnum:
+				/*The 3 coordinates are changed (x,y,z)*/
+				transform[(numdofs)*(counter+0) + counter+0] = coord_system[0][0];
+				transform[(numdofs)*(counter+0) + counter+1] = coord_system[0][1];
+				transform[(numdofs)*(counter+0) + counter+2] = coord_system[0][2];
+				transform[(numdofs)*(counter+1) + counter+0] = coord_system[1][0];
+				transform[(numdofs)*(counter+1) + counter+1] = coord_system[1][1];
+				transform[(numdofs)*(counter+1) + counter+2] = coord_system[1][2];
+				transform[(numdofs)*(counter+2) + counter+0] = coord_system[2][0];
+				transform[(numdofs)*(counter+2) + counter+1] = coord_system[2][1];
+				transform[(numdofs)*(counter+2) + counter+2] = coord_system[2][2];
+				counter+=3;
+				break;
+			default:
+				_error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Assign output pointer*/
+	*ptransform=transform;
+}
+/*}}}*/
 void Element::DeleteMaterials(void){/*{{{*/
 	delete this->material;
@@ -537,37 +611,206 @@
 }/*}}}*/
 void Element::TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum){/*{{{*/
-	::TransformInvStiffnessMatrixCoord(Ke,this->nodes,this->GetNumberOfNodes(),transformenum);
-}/*}}}*/
-void Element::TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list){/*{{{*/
-	::TransformInvStiffnessMatrixCoord(Ke,nodes_list,numnodes,transformenum_list);
+
+	/*All nodes have the same Coordinate System*/
+	int numnodes  = this->GetNumberOfNodes();
+	int* cs_array = xNew<int>(numnodes);
+	for(int i=0;i<numnodes;i++) cs_array[i]=transformenum;
+
+	/*Call core*/
+	TransformInvStiffnessMatrixCoord(Ke,this->nodes,numnodes,cs_array);
+
+	/*Clean-up*/
+	xDelete<int>(cs_array);
+}/*}}}*/
+void Element::TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* cs_array){/*{{{*/
+
+	int         i,j;
+	int         numdofs   = 0;
+	IssmDouble *transform = NULL;
+	IssmDouble *values    = NULL;
+
+	/*Get total number of dofs*/
+	for(i=0;i<numnodes;i++){
+		switch(cs_array[i]){
+			case PressureEnum: numdofs+=1; break;
+			case XYEnum:       numdofs+=2; break;
+			case XYZEnum:      numdofs+=3; break;
+			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Copy current stiffness matrix*/
+	values=xNew<IssmDouble>(Ke->nrows*Ke->ncols);
+	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_list,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*/
+	xDelete<IssmDouble>(transform);
+	xDelete<IssmDouble>(values);
 }/*}}}*/
 void Element::TransformLoadVectorCoord(ElementVector* pe,int transformenum){/*{{{*/
-	::TransformLoadVectorCoord(pe,this->nodes,this->GetNumberOfNodes(),transformenum);
-}/*}}}*/
-void Element::TransformLoadVectorCoord(ElementVector* pe,int* transformenum_list){/*{{{*/
-	::TransformLoadVectorCoord(pe,this->nodes,this->GetNumberOfNodes(),transformenum_list);
+
+	/*All nodes have the same Coordinate System*/
+	int  numnodes = this->GetNumberOfNodes();
+	int* cs_array = xNew<int>(numnodes);
+	for(int i=0;i<numnodes;i++) cs_array[i]=transformenum;
+
+	/*Call core*/
+	this->TransformLoadVectorCoord(pe,this->nodes,numnodes,cs_array);
+
+	/*Clean-up*/
+	xDelete<int>(cs_array);
+}/*}}}*/
+void Element::TransformLoadVectorCoord(ElementVector* pe,int* cs_array){/*{{{*/
+
+	this->TransformLoadVectorCoord(pe,this->nodes,this->GetNumberOfNodes(),cs_array);
+
+}/*}}}*/
+void Element::TransformLoadVectorCoord(ElementVector* pe,Node** nodes_list,int numnodes,int* cs_array){/*{{{*/
+
+	int         i;
+	int         numdofs   = 0;
+	IssmDouble *transform = NULL;
+	IssmDouble *values    = NULL;
+
+	/*Get total number of dofs*/
+	for(i=0;i<numnodes;i++){
+		switch(cs_array[i]){
+			case PressureEnum: numdofs+=1; break;
+			case XYEnum:       numdofs+=2; break;
+			case XYZEnum:      numdofs+=3; break;
+			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Copy current load vector*/
+	values=xNew<IssmDouble>(pe->nrows);
+	for(i=0;i<pe->nrows;i++) values[i]=pe->values[i];
+
+	/*Get Coordinate Systems transform matrix*/
+	CoordinateSystemTransform(&transform,nodes_list,numnodes,cs_array);
+
+	/*Transform matrix: R^T*pe */
+	MatrixMultiply(transform,numdofs,numdofs,1,
+				values,pe->nrows,1,0,
+				&pe->values[0],0);
+
+	/*Free Matrices*/
+	xDelete<IssmDouble>(transform);
+	xDelete<IssmDouble>(values);
 }/*}}}*/
 void Element::TransformSolutionCoord(IssmDouble* values,int transformenum){/*{{{*/
-	::TransformSolutionCoord(values,this->nodes,this->GetNumberOfNodes(),transformenum);
+
+	/*All nodes have the same Coordinate System*/
+	int  numnodes = this->GetNumberOfNodes();
+	int* cs_array = xNew<int>(numnodes);
+	for(int i=0;i<numnodes;i++) cs_array[i]=transformenum;
+
+	/*Call core*/
+	this->TransformSolutionCoord(values,this->nodes,numnodes,cs_array);
+
+	/*Clean-up*/
+	xDelete<int>(cs_array);
 }/*}}}*/
 void Element::TransformSolutionCoord(IssmDouble* values,int* transformenum_list){/*{{{*/
-	::TransformSolutionCoord(values,this->nodes,this->GetNumberOfNodes(),transformenum_list);
+	this->TransformSolutionCoord(values,this->nodes,this->GetNumberOfNodes(),transformenum_list);
 }/*}}}*/
 void Element::TransformSolutionCoord(IssmDouble* values,int numnodes,int transformenum){/*{{{*/
-	::TransformSolutionCoord(values,this->nodes,numnodes,transformenum);
-}/*}}}*/
-void Element::TransformSolutionCoord(IssmDouble* values,int numnodes,int* transformenum_list){/*{{{*/
-	::TransformSolutionCoord(values,this->nodes,numnodes,transformenum_list);
-}/*}}}*/
-void Element::TransformLoadVectorCoord(ElementVector* Ke,Node** nodes_list,int numnodes,int* transformenum_list){/*{{{*/
-	::TransformLoadVectorCoord(Ke,nodes_list,numnodes,transformenum_list);
+	this->TransformSolutionCoord(values,this->nodes,numnodes,transformenum);
+}/*}}}*/
+void Element::TransformSolutionCoord(IssmDouble* solution,int numnodes,int* cs_array){/*{{{*/
+	this->TransformSolutionCoord(solution,this->nodes,numnodes,cs_array);
+}/*}}}*/
+void Element::TransformSolutionCoord(IssmDouble* values,Node** nodes_list,int numnodes,int transformenum){/*{{{*/
+	this->TransformSolutionCoord(values,nodes_list,numnodes,transformenum);
+}/*}}}*/
+void Element::TransformSolutionCoord(IssmDouble* solution,Node** nodes_list,int numnodes,int* cs_array){/*{{{*/
+
+	int         i;
+	int         numdofs   = 0;
+	IssmDouble *transform = NULL;
+	IssmDouble *values    = NULL;
+
+	/*Get total number of dofs*/
+	for(i=0;i<numnodes;i++){
+		switch(cs_array[i]){
+			case PressureEnum: numdofs+=1; break;
+			case XYEnum:       numdofs+=2; break;
+			case XYZEnum:      numdofs+=3; break;
+			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Copy current solution vector*/
+	values=xNew<IssmDouble>(numdofs);
+	for(i=0;i<numdofs;i++) values[i]=solution[i];
+
+	/*Get Coordinate Systems transform matrix*/
+	CoordinateSystemTransform(&transform,nodes_list,numnodes,cs_array);
+
+	/*Transform matrix: R*U */
+	MatrixMultiply(transform,numdofs,numdofs,0,
+				values,numdofs,1,0,
+				&solution[0],0);
+
+	/*Free Matrices*/
+	xDelete<IssmDouble>(transform);
+	xDelete<IssmDouble>(values);
 }/*}}}*/
 void Element::TransformStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum){/*{{{*/
-	::TransformStiffnessMatrixCoord(Ke,this->nodes,this->GetNumberOfNodes(),transformenum);
+
+	/*All nodes have the same Coordinate System*/
+	int  numnodes = this->GetNumberOfNodes();
+	int* cs_array = xNew<int>(numnodes);
+	for(int i=0;i<numnodes;i++) cs_array[i]=transformenum;
+
+	/*Call core*/
+	this->TransformStiffnessMatrixCoord(Ke,this->nodes,numnodes,cs_array);
+
+	/*Clean-up*/
+	xDelete<int>(cs_array);
 }/*}}}*/
 void Element::TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* transformenum_list){/*{{{*/
-	::TransformStiffnessMatrixCoord(Ke,this->nodes,this->GetNumberOfNodes(),transformenum_list);
-}/*}}}*/
-void Element::TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list){/*{{{*/
-	::TransformStiffnessMatrixCoord(Ke,nodes_list,numnodes,transformenum_list);
-}/*}}}*/
+	this->TransformStiffnessMatrixCoord(Ke,this->nodes,this->GetNumberOfNodes(),transformenum_list);
+}/*}}}*/
+void Element::TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* cs_array){/*{{{*/
+
+	int         numdofs = 0;
+	IssmDouble *transform = NULL;
+	IssmDouble *values    = NULL;
+
+	/*Get total number of dofs*/
+	for(int i=0;i<numnodes;i++){
+		switch(cs_array[i]){
+			case PressureEnum: numdofs+=1; break;
+			case XYEnum:       numdofs+=2; break;
+			case XYZEnum:      numdofs+=3; break;
+			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Copy current stiffness matrix*/
+	values=xNew<IssmDouble>(Ke->nrows*Ke->ncols);
+	for(int i=0;i<Ke->nrows*Ke->ncols;i++) values[i]=Ke->values[i];
+
+	/*Get Coordinate Systems transform matrix*/
+	CoordinateSystemTransform(&transform,nodes_list,numnodes,cs_array);
+
+	/*Transform matrix: R^T*Ke*R */
+	TripleMultiply(transform,numdofs,numdofs,1,
+				values,Ke->nrows,Ke->ncols,0,
+				transform,numdofs,numdofs,0,
+				&Ke->values[0],0);
+
+	/*Free Matrix*/
+	xDelete<IssmDouble>(transform);
+	xDelete<IssmDouble>(values);
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 17254)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 17255)
@@ -54,4 +54,5 @@
 		bool       AllActive(void);
 		bool       AnyActive(void);
+		void       CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array);
 		void       DeleteMaterials(void);
 		void       FindParam(bool* pvalue,int paramenum);
@@ -73,4 +74,21 @@
 		void       StrainRateFS(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
 		IssmDouble TMeltingPoint(IssmDouble pressure);
+		void       TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum);
+		void       TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
+		void       TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
+		void       TransformLoadVectorCoord(ElementVector* pe,int cs_enum);
+		void       TransformLoadVectorCoord(ElementVector* pe,int* cs_array);
+		void       TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum);
+		void       TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array);
+		void       TransformSolutionCoord(IssmDouble* solution,int cs_enum);
+		void       TransformSolutionCoord(IssmDouble* solution,int* cs_array);
+		void       TransformSolutionCoord(IssmDouble* solution,int numnodes,int cs_enum);
+		void       TransformSolutionCoord(IssmDouble* solution,int numnodes,int* cs_array);
+		void       TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum);
+		void       TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array);
+		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum);
+		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,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);
 		void       ViscousHeatingCreateInput(void);
 		void       ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
@@ -81,20 +99,7 @@
 		void       ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
 		void       ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
-		void       TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum);
-		void       TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list);
-		void       TransformLoadVectorCoord(ElementVector* pe,int transformenum);
-		void       TransformLoadVectorCoord(ElementVector* pe,int* transformenum_list);
 		void       TransformLoadVectorCoord(ElementVector* pe,int numnodes,int transformenum){_error_("not implemented yet");};/*Tiling only*/
 		void       TransformLoadVectorCoord(ElementVector* pe,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/
-		void       TransformLoadVectorCoord(ElementVector* pe,Node** nodes_list,int numnodes,int* transformenum_list);
-		void       TransformSolutionCoord(IssmDouble* values,int transformenum);
-		void       TransformSolutionCoord(IssmDouble* values,int* transformenum_list);
-		void       TransformSolutionCoord(IssmDouble* values,int numnodes,int transformenum);
-		void       TransformSolutionCoord(IssmDouble* values,int numnodes,int* transformenum_list);
-		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum);
-		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* transformenum_list);
-		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum);
 		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/
-		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list);
 
 		/*Virtual functions*/
Index: /issm/trunk-jpl/src/c/classes/Node.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Node.cpp	(revision 17254)
+++ /issm/trunk-jpl/src/c/classes/Node.cpp	(revision 17255)
@@ -896,273 +896,2 @@
 }
 /*}}}*/
-void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum){/*{{{*/
-
-	int* cs_array=NULL;
-
-	/*All nodes have the same Coordinate System*/
-	cs_array=xNew<int>(numnodes);
-	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
-
-	/*Call core*/
-	TransformInvStiffnessMatrixCoord(Ke,nodes,numnodes,cs_array);
-
-	/*Clean-up*/
-	xDelete<int>(cs_array);
-}
-/*}}}*/
-void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array){/*{{{*/
-
-	int     i,j;
-	int     numdofs   = 0;
-	IssmDouble *transform = NULL;
-	IssmDouble *values    = NULL;
-
-	/*Get total number of dofs*/
-	for(i=0;i<numnodes;i++){
-		switch(cs_array[i]){
-			case PressureEnum: numdofs+=1; break;
-			case XYEnum:       numdofs+=2; break;
-			case XYZEnum:      numdofs+=3; break;
-			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Copy current stiffness matrix*/
-	values=xNew<IssmDouble>(Ke->nrows*Ke->ncols);
-	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*/
-	xDelete<IssmDouble>(transform);
-	xDelete<IssmDouble>(values);
-}
-/*}}}*/
-void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum){/*{{{*/
-
-	int* cs_array=NULL;
-
-	/*All nodes have the same Coordinate System*/
-	cs_array=xNew<int>(numnodes);
-	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
-
-	/*Call core*/
-	TransformLoadVectorCoord(pe,nodes,numnodes,cs_array);
-
-	/*Clean-up*/
-	xDelete<int>(cs_array);
-}
-/*}}}*/
-void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array){/*{{{*/
-
-	int     i;
-	int     numdofs   = 0;
-	IssmDouble *transform = NULL;
-	IssmDouble *values    = NULL;
-
-	/*Get total number of dofs*/
-	for(i=0;i<numnodes;i++){
-		switch(cs_array[i]){
-			case PressureEnum: numdofs+=1; break;
-			case XYEnum:       numdofs+=2; break;
-			case XYZEnum:      numdofs+=3; break;
-			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Copy current load vector*/
-	values=xNew<IssmDouble>(pe->nrows);
-	for(i=0;i<pe->nrows;i++) values[i]=pe->values[i];
-
-	/*Get Coordinate Systems transform matrix*/
-	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
-
-	/*Transform matrix: R^T*pe */
-	MatrixMultiply(transform,numdofs,numdofs,1,
-				values,pe->nrows,1,0,
-				&pe->values[0],0);
-
-	/*Free Matrices*/
-	xDelete<IssmDouble>(transform);
-	xDelete<IssmDouble>(values);
-}
-/*}}}*/
-void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum){/*{{{*/
-
-	int* cs_array=NULL;
-
-	/*All nodes have the same Coordinate System*/
-	cs_array=xNew<int>(numnodes);
-	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
-
-	/*Call core*/
-	TransformSolutionCoord(solution,nodes,numnodes,cs_array);
-
-	/*Clean-up*/
-	xDelete<int>(cs_array);
-}
-/*}}}*/
-void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array){/*{{{*/
-
-	int     i;
-	int     numdofs   = 0;
-	IssmDouble *transform = NULL;
-	IssmDouble *values    = NULL;
-
-	/*Get total number of dofs*/
-	for(i=0;i<numnodes;i++){
-		switch(cs_array[i]){
-			case PressureEnum: numdofs+=1; break;
-			case XYEnum:       numdofs+=2; break;
-			case XYZEnum:      numdofs+=3; break;
-			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Copy current solution vector*/
-	values=xNew<IssmDouble>(numdofs);
-	for(i=0;i<numdofs;i++) values[i]=solution[i];
-
-	/*Get Coordinate Systems transform matrix*/
-	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
-
-	/*Transform matrix: R*U */
-	MatrixMultiply(transform,numdofs,numdofs,0,
-				values,numdofs,1,0,
-				&solution[0],0);
-
-	/*Free Matrices*/
-	xDelete<IssmDouble>(transform);
-	xDelete<IssmDouble>(values);
-}
-/*}}}*/
-void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum){/*{{{*/
-
-	int* cs_array=NULL;
-
-	/*All nodes have the same Coordinate System*/
-	cs_array=xNew<int>(numnodes);
-	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
-
-	/*Call core*/
-	TransformStiffnessMatrixCoord(Ke,nodes,numnodes,cs_array);
-
-	/*Clean-up*/
-	xDelete<int>(cs_array);
-}
-/*}}}*/
-void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array){/*{{{*/
-
-	int         numdofs = 0;
-	IssmDouble *transform = NULL;
-	IssmDouble *values    = NULL;
-
-	/*Get total number of dofs*/
-	for(int i=0;i<numnodes;i++){
-		switch(cs_array[i]){
-			case PressureEnum: numdofs+=1; break;
-			case XYEnum:       numdofs+=2; break;
-			case XYZEnum:      numdofs+=3; break;
-			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Copy current stiffness matrix*/
-	values=xNew<IssmDouble>(Ke->nrows*Ke->ncols);
-	for(int i=0;i<Ke->nrows*Ke->ncols;i++) values[i]=Ke->values[i];
-
-	/*Get Coordinate Systems transform matrix*/
-	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
-
-	/*Transform matrix: R^T*Ke*R */
-	TripleMultiply(transform,numdofs,numdofs,1,
-				values,Ke->nrows,Ke->ncols,0,
-				transform,numdofs,numdofs,0,
-				&Ke->values[0],0);
-
-	/*Free Matrix*/
-	xDelete<IssmDouble>(transform);
-	xDelete<IssmDouble>(values);
-}
-/*}}}*/
-void CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array){/*{{{*/
-
-	int         i,counter;
-	int         numdofs   = 0;
-	IssmDouble  norm;
-	IssmDouble *transform = NULL;
-	IssmDouble  coord_system[3][3];
-
-	/*Some checks in debugging mode*/
-	_assert_(numnodes && nodes);
-
-	/*Get total number of dofs*/
-	for(i=0;i<numnodes;i++){
-		switch(cs_array[i]){
-			case PressureEnum: numdofs+=1; break;
-			case XYEnum:       numdofs+=2; break;
-			case XYZEnum:      numdofs+=3; break;
-			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Allocate and initialize transform matrix*/
-	transform=xNew<IssmDouble>(numdofs*numdofs);
-	for(i=0;i<numdofs*numdofs;i++) transform[i]=0.0;
-
-	/*Create transform matrix for all nodes (x,y for 2d and x,y,z for 3d). It is a block matrix
-	 *for 3 nodes:
-
-	 *     | T1 0  0 |
-	 * Q = | 0  T2 0 |
-	 *     | 0  0  T3|
-	 *
-	 * Where T1 is the transform matrix for node 1. It is a simple copy of the coordinate system
-	 * associated to this node*/
-	counter=0;
-	for(i=0;i<numnodes;i++){
-		nodes[i]->GetCoordinateSystem(&coord_system[0][0]);
-		switch(cs_array[i]){
-			case PressureEnum:
-				/*DO NOT change anything*/
-				transform[(numdofs)*(counter) + counter] = 1.;
-				counter+=1;
-				break;
-			case XYEnum:
-				/*We remove the z component, we need to renormalize x and y: x=[x1 x2 0] y=[-x2 x1 0]*/
-				norm = sqrt( coord_system[0][0]*coord_system[0][0] + coord_system[1][0]*coord_system[1][0]); _assert_(norm>1.e-4);
-				transform[(numdofs)*(counter+0) + counter+0] =   coord_system[0][0]/norm;
-				transform[(numdofs)*(counter+0) + counter+1] = - coord_system[1][0]/norm;
-				transform[(numdofs)*(counter+1) + counter+0] =   coord_system[1][0]/norm;
-				transform[(numdofs)*(counter+1) + counter+1] =   coord_system[0][0]/norm;
-				counter+=2;
-				break;
-			case XYZEnum:
-				/*The 3 coordinates are changed (x,y,z)*/
-				transform[(numdofs)*(counter+0) + counter+0] = coord_system[0][0];
-				transform[(numdofs)*(counter+0) + counter+1] = coord_system[0][1];
-				transform[(numdofs)*(counter+0) + counter+2] = coord_system[0][2];
-				transform[(numdofs)*(counter+1) + counter+0] = coord_system[1][0];
-				transform[(numdofs)*(counter+1) + counter+1] = coord_system[1][1];
-				transform[(numdofs)*(counter+1) + counter+2] = coord_system[1][2];
-				transform[(numdofs)*(counter+2) + counter+0] = coord_system[2][0];
-				transform[(numdofs)*(counter+2) + counter+1] = coord_system[2][1];
-				transform[(numdofs)*(counter+2) + counter+2] = coord_system[2][2];
-				counter+=3;
-				break;
-			default:
-				_error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Assign output pointer*/
-	*ptransform=transform;
-}
-/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Node.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Node.h	(revision 17254)
+++ /issm/trunk-jpl/src/c/classes/Node.h	(revision 17255)
@@ -89,13 +89,4 @@
 int* GetGlobalDofList(Node** nodes,int numnodes,int setenum,int approximation);
 int  GetNumberOfDofs(Node** nodes,int numnodes,int setenum,int approximation);
-void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
-void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
-void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum);
-void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array);
-void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum);
-void TransformSolutionCoord(IssmDouble* solution,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);
-void CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array);
 
 #endif  /* _NODE_H_ */
