Index: /issm/trunk-jpl/src/c/analyses/Analysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/Analysis.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/analyses/Analysis.h	(revision 16818)
@@ -16,4 +16,5 @@
 class ElementVector;
 class ElementMatrix;
+class Gauss;
 
 class Analysis{
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 16817)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 16818)
@@ -813,5 +813,108 @@
 /*Finite Element Analysis*/
 ElementMatrix* StressbalanceAnalysis::CreateKMatrix(Element* element){/*{{{*/
-	_error_("not implemented yet");
+	int approximation;
+	element->GetInputValue(&approximation,ApproximationEnum);
+	switch(approximation){
+		case SSAApproximationEnum: 
+			return CreateKMatrixSSA(element);
+		case NoneApproximationEnum:
+			return NULL;
+		default:
+			_error_("Approximation "<<EnumToStringx(approximation)<<" not supported");
+	}
+}/*}}}*/
+ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSA(Element* element){/*{{{*/
+
+	/*Intermediaries*/
+	int      meshtype;
+	Element* basalelement;
+
+	/*Get basal element*/
+	element->FindParam(&meshtype,MeshTypeEnum);
+	switch(meshtype){
+		case Mesh2DhorizontalEnum:
+			basalelement = element;
+			break;
+		case Mesh3DEnum:
+			if(!element->IsOnBed()) return NULL;
+			basalelement = element->SpawnBasalElement();
+			break;
+		default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
+	}
+
+	/*compute all stiffness matrices for this element*/
+	ElementMatrix* Ke1=CreateKMatrixSSAViscous(element);
+	ElementMatrix* Ke2=CreateKMatrixSSAFriction(element);
+	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2);
+
+	/*clean-up and return*/
+	if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+	delete Ke1;
+	delete Ke2;
+	return Ke;
+}/*}}}*/
+ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSAViscous(Element* element){/*{{{*/
+
+	/*Intermediaries*/
+	IssmDouble  viscosity,newviscosity,oldviscosity;
+	IssmDouble  viscosity_overshoot,thickness,Jdet;
+	IssmDouble  D_scalar;
+	IssmDouble *xyz_list = NULL;
+
+	/*Fetch number of nodes and dof for this finite element*/
+	int numnodes = element->GetNumberOfNodes();
+	int numdof   = numnodes*2;
+
+	/*Initialize Element matrix and vectors*/
+	ElementMatrix* Ke     = element->NewElementMatrix(SSAApproximationEnum);
+	IssmDouble*    B      = xNew<IssmDouble>(3*numdof);
+	IssmDouble*    Bprime = xNew<IssmDouble>(3*numdof);
+	IssmDouble*    D      = xNewZeroInit<IssmDouble>(3*3);
+
+	/*Retrieve all inputs and parameters*/
+	element->GetVerticesCoordinates(&xyz_list);
+	Input* thickness_input=element->GetInput(ThicknessEnum); _assert_(thickness_input);
+	Input* vx_input=element->GetInput(VxEnum);               _assert_(vx_input);
+	Input* vy_input=element->GetInput(VyEnum);               _assert_(vy_input);
+	Input* vxold_input=element->GetInput(VxPicardEnum);      _assert_(vxold_input);
+	Input* vyold_input=element->GetInput(VyPicardEnum);      _assert_(vyold_input);
+	element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
+
+	/* Start  looping on the number of gaussian points: */
+	Gauss* gauss = element->NewGauss(2);
+	for(int ig=gauss->begin();ig<gauss->end();ig++){
+		gauss->GaussPoint(ig);
+
+		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+		this->GetBSSA(B,element,xyz_list,gauss);
+		this->GetBSSAprime(Bprime,element,xyz_list,gauss);
+
+		element->ViscositySSA(&viscosity,xyz_list,gauss,vx_input,vy_input);
+		element->ViscositySSA(&oldviscosity,xyz_list,gauss,vxold_input,vyold_input);
+		thickness_input->GetInputValue(&thickness, gauss);
+
+		newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
+		D_scalar=2.*newviscosity*thickness*gauss->weight*Jdet;
+		for(int i=0;i<3;i++) D[i*3+i]=D_scalar;
+
+		TripleMultiply(B,3,numdof,1,
+					D,3,3,0,
+					Bprime,3,numdof,0,
+					&Ke->values[0],1);
+	}
+
+	/*Transform Coordinate System*/
+	element->TransformStiffnessMatrixCoord(Ke,XYEnum);
+
+	/*Clean up and return*/
+	delete gauss;
+	xDelete<IssmDouble>(xyz_list);
+	xDelete<IssmDouble>(D);
+	xDelete<IssmDouble>(Bprime);
+	xDelete<IssmDouble>(B);
+	return Ke;
+}/*}}}*/
+ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSAFriction(Element* element){/*{{{*/
+	return NULL;
 }/*}}}*/
 ElementVector* StressbalanceAnalysis::CreatePVector(Element* element){/*{{{*/
@@ -1128,4 +1231,68 @@
 
 	return NULL;
+}/*}}}*/
+void StressbalanceAnalysis::GetBSSA(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+	 * For node i, Bi can be expressed in the actual coordinate system
+	 * by: 
+	 *       Bi=[ dN/dx           0    ]
+	 *          [   0           dN/dy  ]
+	 *          [ 1/2*dN/dy  1/2*dN/dx ]
+	 * where N is the finiteelement function for node i.
+	 *
+	 * We assume B has been allocated already, of size: 3x(NDOF2*numnodes)
+	 */
+
+	/*Fetch number of nodes for this finite element*/
+	int numnodes = element->GetNumberOfNodes();
+
+	/*Get nodal functions derivatives*/
+	IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
+	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+
+	/*Build B: */
+	for(int i=0;i<numnodes;i++){
+		B[2*numnodes*0+2*i+0] = dbasis[0*numnodes+i];
+		B[2*numnodes*0+2*i+1] = 0.;
+		B[2*numnodes*1+2*i+0] = 0.;
+		B[2*numnodes*1+2*i+1] = dbasis[1*numnodes+i];
+		B[2*numnodes*2+2*i+0] = .5*dbasis[1*numnodes+i];
+		B[2*numnodes*2+2*i+1] = .5*dbasis[0*numnodes+i];
+	}
+
+	/*Clean-up*/
+	xDelete<IssmDouble>(dbasis);
+}/*}}}*/
+void StressbalanceAnalysis::GetBSSAprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+	 * For node i, Bi' can be expressed in the actual coordinate system
+	 * by: 
+	 *       Bi_prime=[ 2*dN/dx    dN/dy ]
+	 *                [   dN/dx  2*dN/dy ]
+	 *                [   dN/dy    dN/dx ]
+	 * where hNis the finiteelement function for node i.
+	 *
+	 * We assume B' has been allocated already, of size: 3x(NDOF2*numnodes)
+	 */
+
+	/*Fetch number of nodes for this finite element*/
+	int numnodes = element->GetNumberOfNodes();
+
+	/*Get nodal functions derivatives*/
+	IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
+	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+
+	/*Build B': */
+	for(int i=0;i<numnodes;i++){
+		Bprime[2*numnodes*0+2*i+0] = 2.*dbasis[0*numnodes+i];
+		Bprime[2*numnodes*0+2*i+1] =    dbasis[1*numnodes+i];
+		Bprime[2*numnodes*1+2*i+0] =    dbasis[0*numnodes+i];
+		Bprime[2*numnodes*1+2*i+1] = 2.*dbasis[1*numnodes+i];
+		Bprime[2*numnodes*2+2*i+0] =    dbasis[1*numnodes+i];
+		Bprime[2*numnodes*2+2*i+1] =    dbasis[0*numnodes+i];
+	}
+
+	/*Clean-up*/
+	xDelete<IssmDouble>(dbasis);
 }/*}}}*/
 void StressbalanceAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 16818)
@@ -22,4 +22,7 @@
 		/*Finite element Analysis*/
 		ElementMatrix* CreateKMatrix(Element* element);
+		ElementMatrix* CreateKMatrixSSA(Element* element);
+		ElementMatrix* CreateKMatrixSSAViscous(Element* element);
+		ElementMatrix* CreateKMatrixSSAFriction(Element* element);
 		ElementVector* CreatePVector(Element* element);
 		ElementVector* CreatePVectorFS(Element* element);
@@ -33,4 +36,6 @@
 		ElementVector* CreatePVectorSSADrivingStress(Element* element);
 		ElementVector* CreatePVectorSSAFront(Element* element);
+		void GetBSSA(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+		void GetBSSAprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
 		void GetSolutionFromInputsFS(Vector<IssmDouble>* solution,Element* element);
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 16818)
@@ -70,4 +70,8 @@
 		virtual void   TransformSolutionCoord(IssmDouble* values,int numnodes,int transformenum)=0;
 		virtual void   TransformSolutionCoord(IssmDouble* values,int numnodes,int* transformenum_list)=0;
+		virtual void   TransformStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum)=0;
+		virtual void   TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* transformenum_list)=0;
+		virtual void   TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum)=0;
+		virtual void   TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list)=0;
 		virtual Element* GetBasalElement(void)=0;
 		virtual void	GetDofList(int** pdoflist,int approximation_enum,int setenum)=0;
@@ -122,4 +126,5 @@
 		virtual Gauss* NewGaussBase(int order)=0;
 		virtual ElementVector*  NewElementVector(int approximation_enum=NoneApproximationEnum)=0;
+		virtual ElementMatrix*  NewElementMatrix(int approximation_enum=NoneApproximationEnum)=0;
 		virtual void   InputScale(int enum_type,IssmDouble scale_factor)=0;
 		virtual void   GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum)=0;
@@ -134,4 +139,5 @@
 		virtual IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa)=0;
 		virtual void   ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input)=0;
+		virtual void   ViscositySSA(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input)=0;
 		virtual int    VelocityInterpolation()=0;
 		virtual int    PressureInterpolation()=0;
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 16818)
@@ -2548,4 +2548,9 @@
 }
 /*}}}*/
+/*FUNCTION Penta::NewElementMatrix{{{*/
+ElementMatrix* Penta::NewElementMatrix(int approximation_enum){
+	return new ElementMatrix(nodes,this->NumberofNodes(),this->parameters,approximation_enum);
+}
+/*}}}*/
 /*FUNCTION Penta::NodalFunctions{{{*/
 void Penta::NodalFunctions(IssmDouble* basis, Gauss* gauss){
@@ -3112,5 +3117,5 @@
 	return dt;
 }/*}}}*/
-/*FUNCTION Penta::TransformLoadVectorCoord{{{*/
+/*FUNCTION Penta::TransformLoadVectorCoord(ElementVector* pe,int transformenum){{{*/
 void Penta::TransformLoadVectorCoord(ElementVector* pe,int transformenum){
 
@@ -3119,5 +3124,5 @@
 }
 /*}}}*/
-/*FUNCTION Penta::TransformLoadVectorCoord{{{*/
+/*FUNCTION Penta::TransformLoadVectorCoord(ElementVector* pe,int* transformenum_list){{{*/
 void Penta::TransformLoadVectorCoord(ElementVector* pe,int* transformenum_list){
 
@@ -3151,4 +3156,11 @@
 
 	::TransformSolutionCoord(values,this->nodes,numnodes,transformenum_list);
+
+}
+/*}}}*/
+/*FUNCTION Penta::TransformStiffnessMatrixCoord(ElementMatrix* pe,int transformenum){{{*/
+void Penta::TransformStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum){
+
+	::TransformStiffnessMatrixCoord(Ke,this->nodes,this->NumberofNodes(),transformenum);
 
 }
@@ -5171,5 +5183,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYEnum);
+	::TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYEnum);
 
 	/*Clean up and return*/
@@ -5251,5 +5263,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYZEnum);
+	::TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYZEnum);
 
 	/*Clean up and return*/
@@ -6653,5 +6665,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
+	::TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
 
 	/*Clean-up and return*/
@@ -6739,5 +6751,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
+	::TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
 
 	/*Clean up and return*/
@@ -6865,5 +6877,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
+	::TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
 
 	/*Clean-up and return*/
@@ -6991,5 +7003,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
+	::TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
 
 	/*Clean up and return*/
@@ -7057,5 +7069,5 @@
 
 	/*Transform Coordinate System*/ //Do not transform, already done in the matrices
-	TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
+	::TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list);
 
 	/*clean-up and return*/
@@ -7280,5 +7292,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,tria->nodes,NUMVERTICES2D,XYEnum);
+	::TransformStiffnessMatrixCoord(Ke,tria->nodes,NUMVERTICES2D,XYEnum);
 
 	/*Clean up and return*/
@@ -7415,5 +7427,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,tria->nodes,NUMVERTICES2D,XYEnum);
+	::TransformStiffnessMatrixCoord(Ke,tria->nodes,NUMVERTICES2D,XYEnum);
 
 	/*Clean up and return*/
@@ -7514,5 +7526,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
+	::TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
 
 	/*Clean up and return*/
@@ -7605,5 +7617,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
+	::TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
 
 	/*Clean up and return*/
@@ -7821,5 +7833,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,(vnumnodes+pnumnodes),cs_list);
+	::TransformStiffnessMatrixCoord(Ke,nodes,(vnumnodes+pnumnodes),cs_list);
 
 	/*Clean up and return*/
@@ -7893,5 +7905,5 @@
 
 	/*DO NOT Transform Coordinate System: this stiffness matrix is already expressed in tangential coordinates*/
-	//TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYZEnum);
+	//::TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYZEnum);
 
 	/*Clean up and return*/
@@ -9275,5 +9287,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYEnum);
+	::TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYEnum);
 
 	/*Clean up and return*/
@@ -9366,5 +9378,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,(vnumnodes+pnumnodes),cs_list);
+	::TransformStiffnessMatrixCoord(Ke,nodes,(vnumnodes+pnumnodes),cs_list);
 
 	/*Clean up and return*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 16818)
@@ -23,5 +23,5 @@
 class ElementMatrix;
 class ElementVector;
-
+class GaussPenta;
 #include "../../shared/Exceptions/exceptions.h"
 #include "../../shared/Enum/Enum.h"
@@ -249,4 +249,5 @@
 		Gauss*         NewGaussBase(int order);
 		ElementVector* NewElementVector(int approximation_enum);
+		ElementMatrix* NewElementMatrix(int approximation_enum);
 		void           NodalFunctions(IssmDouble* basis,Gauss* gauss);
 		void           NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
@@ -266,4 +267,9 @@
 		void           TransformSolutionCoord(IssmDouble* values,int numnodes,int transformenum);      /*Tiling only*/
 		void           TransformSolutionCoord(IssmDouble* values,int numnodes,int* transformenum_list);/*Tiling only*/
+		void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum);
+		void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* transformenum_list){_error_("not implemented yet");};
+		void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum){_error_("not implemented yet");};
+		void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};
+		void           ViscositySSA(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){_error_("not implemented");};
 
 		#ifdef _HAVE_STRESSBALANCE_
Index: /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 16818)
@@ -55,5 +55,5 @@
 /*Reference Element numerics*/
 /*FUNCTION PentaRef::GetBSSAHO {{{*/
-void PentaRef::GetBSSAHO(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBSSAHO(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 
 	 * For node i, Bi can be expressed in the actual coordinate system
@@ -86,5 +86,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBSSAFS{{{*/
-void PentaRef::GetBSSAFS(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBSSAFS(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 
 	 * For node i, Bi can be expressed in the actual coordinate system
@@ -146,5 +146,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBHO {{{*/
-void PentaRef::GetBHO(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBHO(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 
 	 * For node i, Bi can be expressed in the actual coordinate system
@@ -186,5 +186,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBprimeHO {{{*/
-void PentaRef::GetBprimeHO(IssmDouble* B,IssmDouble* xyz_list,GaussPenta* gauss){
+void PentaRef::GetBprimeHO(IssmDouble* B,IssmDouble* xyz_list,Gauss* gauss){
 	/*Compute B  prime matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 
 	 * For node i, Bi can be expressed in the actual coordinate system
@@ -226,5 +226,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBprimeSSAFS{{{*/
-void PentaRef::GetBprimeSSAFS(IssmDouble* Bprime, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBprimeSSAFS(IssmDouble* Bprime, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute Bprime  matrix. Bprime=[Bprime1 Bprime2 Bprime3 Bprime4 Bprime5 Bprime6] where Bprimei is of size 5*NDOF2. 
 	 * For node i, Bprimei can be expressed in the actual coordinate system
@@ -278,5 +278,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBFSstrainrate {{{*/
-void PentaRef::GetBFSstrainrate(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBFSstrainrate(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 
 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 3*NDOF4. 
@@ -331,5 +331,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBFS {{{*/
-void PentaRef::GetBFS(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBFS(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 
 	/*Compute B  matrix. B=[Bv1 Bv2 ... Bp1 Bp2 ...] where Bvi is of size 3*NDOF3. 
@@ -410,5 +410,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBFSGLS {{{*/
-void PentaRef::GetBFSGLS(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBFSGLS(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 
 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 3*NDOF4. 
@@ -476,5 +476,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBprimeFS {{{*/
-void PentaRef::GetBprimeFS(IssmDouble* B_prime, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBprimeFS(IssmDouble* B_prime, IssmDouble* xyz_list, Gauss* gauss){
 	/*	Compute B'  matrix. B'=[B1' B2' B3' B4' B5' B6' Bb'] where Bi' is of size 3*NDOF2. 
 	 *	For node i, Bi' can be expressed in the actual coordinate system
@@ -554,5 +554,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBprimeFSGLS {{{*/
-void PentaRef::GetBprimeFSGLS(IssmDouble* B_prime, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBprimeFSGLS(IssmDouble* B_prime, IssmDouble* xyz_list, Gauss* gauss){
 	/*	Compute B'  matrix. B'=[B1' B2' B3' B4' B5' B6' Bb'] where Bi' is of size 3*NDOF2. 
 	 *	For node i, Bi' can be expressed in the actual coordinate system
@@ -621,5 +621,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBAdvec{{{*/
-void PentaRef::GetBAdvec(IssmDouble* B_advec, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBAdvec(IssmDouble* B_advec, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
 	 * For node i, Bi' can be expressed in the actual coordinate system
@@ -652,5 +652,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBConduct{{{*/
-void PentaRef::GetBConduct(IssmDouble* B_conduct, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBConduct(IssmDouble* B_conduct, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
 	 * For node i, Bi' can be expressed in the actual coordinate system
@@ -683,5 +683,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBVert{{{*/
-void PentaRef::GetBVert(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBVert(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 	/*	Compute B  matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];
 		where hi is the interpolation function for node i.*/
@@ -704,5 +704,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBprimeAdvec{{{*/
-void PentaRef::GetBprimeAdvec(IssmDouble* Bprime_advec, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBprimeAdvec(IssmDouble* Bprime_advec, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
 	 * For node i, Bi' can be expressed in the actual coordinate system
@@ -735,5 +735,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBprimeVert{{{*/
-void PentaRef::GetBprimeVert(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetBprimeVert(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 
 	GetNodalFunctions(B,gauss);
@@ -742,5 +742,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetBHOFriction{{{*/
-void PentaRef::GetBHOFriction(IssmDouble* B, GaussPenta* gauss){
+void PentaRef::GetBHOFriction(IssmDouble* B, Gauss* gauss){
 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is square and of size 2x2. 
 	 ** For node i, Bi can be expressed in the actual coordinate system
@@ -772,5 +772,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetLFS{{{*/
-void PentaRef::GetLFS(IssmDouble* LFS, GaussPenta* gauss){
+void PentaRef::GetLFS(IssmDouble* LFS, Gauss* gauss){
 	/* Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof. 
 	 * For node i, Li can be expressed in the actual coordinate system
@@ -812,5 +812,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetLprimeFS {{{*/
-void PentaRef::GetLprimeFS(IssmDouble* LprimeFS, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetLprimeFS(IssmDouble* LprimeFS, IssmDouble* xyz_list, Gauss* gauss_in){
 	/* Compute Lprime  matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof. 
 	 * For node i, Lpi can be expressed in the actual coordinate system
@@ -851,4 +851,8 @@
 	IssmDouble L1L2l3[NUMNODESP1_2d];
 	IssmDouble dbasis[3][NUMNODESP1];
+
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
 
 	/*Get L1L2l3 in actual coordinate system: */
@@ -921,5 +925,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetLSSAFS {{{*/
-void PentaRef::GetLSSAFS(IssmDouble* LFS, GaussPenta* gauss){
+void PentaRef::GetLSSAFS(IssmDouble* LFS, Gauss* gauss_in){
 	/*
 	 * Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof. 
@@ -939,4 +943,8 @@
 	int num_dof=2;
 	IssmDouble L1L2l3[NUMNODESP1_2d];
+
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
 
 	/*Get L1L2l3 in actual coordinate system: */
@@ -967,5 +975,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetLprimeSSAFS {{{*/
-void PentaRef::GetLprimeSSAFS(IssmDouble* LprimeFS, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetLprimeSSAFS(IssmDouble* LprimeFS, IssmDouble* xyz_list, Gauss* gauss_in){
 	/* Compute Lprime  matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof. 
 	 * For node i, Lpi can be expressed in the actual coordinate system
@@ -986,4 +994,8 @@
 	IssmDouble L1L2l3[NUMNODESP1_2d];
 	IssmDouble dbasis[3][NUMNODESP1];
+
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
 
 	/*Get L1L2l3 in actual coordinate system: */
@@ -1070,5 +1082,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetLFSSSA {{{*/
-void PentaRef::GetLFSSSA(IssmDouble* LFS, GaussPenta* gauss){
+void PentaRef::GetLFSSSA(IssmDouble* LFS, Gauss* gauss_in){
 	/* Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof. 
 	 * For node i, Li can be expressed in the actual coordinate system
@@ -1083,4 +1095,8 @@
 	int num_dof=3;
 	IssmDouble L1L2l3[NUMNODESP1_2d];
+
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
 
 	/*Get L1L2l3 in actual coordinate system: */
@@ -1107,5 +1123,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetLprimeFSSSA {{{*/
-void PentaRef::GetLprimeFSSSA(IssmDouble* LprimeFS, IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetLprimeFSSSA(IssmDouble* LprimeFS, IssmDouble* xyz_list, Gauss* gauss_in){
 	/* Compute Lprime  matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof. 
 	 * For node i, Lpi can be expressed in the actual coordinate system
@@ -1121,4 +1137,8 @@
 	IssmDouble dbasis[3][NUMNODESP1];
 
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
+
 	/*Get L1L2l3 in actual coordinate system: */
 	L1L2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0;
@@ -1141,5 +1161,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetJacobian {{{*/
-void PentaRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussPenta* gauss){
+void PentaRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,Gauss* gauss_in){
 	/*The Jacobian is constant over the element, discard the gaussian points. 
 	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
@@ -1150,4 +1170,8 @@
 	IssmDouble y1,y2,y3,y4,y5,y6;
 	IssmDouble z1,z2,z3,z4,z5,z6;
+
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
 
 	/*Figure out xi,eta and zi (parametric coordinates), for this gaussian point: */
@@ -1194,5 +1218,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetJacobianDeterminant {{{*/
-void PentaRef::GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss){
+void PentaRef::GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss){
 	/*On a penta, Jacobian varies according to coordinates. We need to get the Jacobian, and take 
 	 * the determinant of it: */
@@ -1209,5 +1233,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetTriaJacobianDeterminant{{{*/
-void PentaRef::GetTriaJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss){
+void PentaRef::GetTriaJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss){
 	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
 	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
@@ -1229,5 +1253,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetSegmentJacobianDeterminant{{{*/
-void PentaRef::GetSegmentJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss){
+void PentaRef::GetSegmentJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss){
 	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
 	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
@@ -1246,5 +1270,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetJacobianInvert {{{*/
-void PentaRef::GetJacobianInvert(IssmDouble* Jinv, IssmDouble* xyz_list,GaussPenta* gauss){
+void PentaRef::GetJacobianInvert(IssmDouble* Jinv, IssmDouble* xyz_list,Gauss* gauss){
 
 	/*Jacobian*/
@@ -1259,8 +1283,12 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctions{{{*/
-void PentaRef::GetNodalFunctions(IssmDouble* basis,GaussPenta* gauss){
+void PentaRef::GetNodalFunctions(IssmDouble* basis,Gauss* gauss_in){
 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
 
 	_assert_(basis);
+
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
 
 	/*Get current coordinates in reference element*/
@@ -1340,5 +1368,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsVelocity{{{*/
-void PentaRef::GetNodalFunctionsVelocity(IssmDouble* basis,GaussPenta* gauss){
+void PentaRef::GetNodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss){
 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
 
@@ -1375,5 +1403,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsPressure{{{*/
-void PentaRef::GetNodalFunctionsPressure(IssmDouble* basis,GaussPenta* gauss){
+void PentaRef::GetNodalFunctionsPressure(IssmDouble* basis,Gauss* gauss){
 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
 
@@ -1410,5 +1438,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsDerivatives{{{*/
-void PentaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss){
 
 	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
@@ -1445,5 +1473,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsDerivativesVelocity{{{*/
-void PentaRef::GetNodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetNodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss){
 	switch(this->element_type){
 		case P1P1Enum:
@@ -1478,5 +1506,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsDerivativesPressure{{{*/
-void PentaRef::GetNodalFunctionsDerivativesPressure(IssmDouble* dbasis,IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetNodalFunctionsDerivativesPressure(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss){
 	switch(this->element_type){
 		case P1P1Enum:
@@ -1511,10 +1539,14 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsDerivativesReference{{{*/
-void PentaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussPenta* gauss){
+void PentaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,Gauss* gauss_in){
 
 	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
 	 * natural coordinate system) at the gaussian point. */
 
-	_assert_(dbasis && gauss);
+	_assert_(dbasis && gauss_in);
+
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
 
 	/*Get current coordinates in reference element*/
@@ -1739,6 +1771,10 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsMINI{{{*/
-void PentaRef::GetNodalFunctionsMINI(IssmDouble* l1l7, GaussPenta* gauss){
+void PentaRef::GetNodalFunctionsMINI(IssmDouble* l1l7, Gauss* gauss_in){
 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
+
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
 
 	l1l7[0]=gauss->coord1*(1.0-gauss->coord4)/2.0;
@@ -1753,5 +1789,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsMINIDerivatives{{{*/
-void PentaRef::GetNodalFunctionsMINIDerivatives(IssmDouble* dbasismini,IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetNodalFunctionsMINIDerivatives(IssmDouble* dbasismini,IssmDouble* xyz_list, Gauss* gauss){
 
 	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
@@ -1783,8 +1819,13 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsMINIDerivativesReference{{{*/
-void PentaRef::GetNodalFunctionsMINIDerivativesReference(IssmDouble* dbasis,GaussPenta* gauss){
-
+void PentaRef::GetNodalFunctionsMINIDerivativesReference(IssmDouble* dbasis,Gauss* gauss_in){
 	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
 	 * natural coordinate system) at the gaussian point. */
+
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
+
+
 	IssmDouble zeta=gauss->coord4;
 
@@ -1820,6 +1861,10 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsP1 {{{*/
-void PentaRef::GetNodalFunctionsP1(IssmDouble* basis, GaussPenta* gauss){
+void PentaRef::GetNodalFunctionsP1(IssmDouble* basis, Gauss* gauss_in){
 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
+
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
 
 	basis[0]=gauss->coord1*(1-gauss->coord4)/2.0;
@@ -1833,5 +1878,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsP1Derivatives {{{*/
-void PentaRef::GetNodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetNodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss){
 
 	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
@@ -1862,8 +1907,12 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetNodalFunctionsP1DerivativesReference {{{*/
-void PentaRef::GetNodalFunctionsP1DerivativesReference(IssmDouble* dbasis,GaussPenta* gauss){
+void PentaRef::GetNodalFunctionsP1DerivativesReference(IssmDouble* dbasis,Gauss* gauss_in){
 
 	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
 	 * natural coordinate system) at the gaussian point. Those values vary along xi,eta,z */
+
+	/*Cast gauss to GaussPenta*/
+	_assert_(gauss_in->Enum()==GaussPentaEnum);
+	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
 
 	IssmDouble zeta=gauss->coord4;
@@ -1896,5 +1945,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetQuadJacobianDeterminant{{{*/
-void PentaRef::GetQuadJacobianDeterminant(IssmDouble* Jdet,IssmDouble xyz_list[4][3],GaussPenta* gauss){
+void PentaRef::GetQuadJacobianDeterminant(IssmDouble* Jdet,IssmDouble xyz_list[4][3],Gauss* gauss){
 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
 
@@ -1922,5 +1971,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetInputValue{{{*/
-void PentaRef::GetInputValue(IssmDouble* pvalue,IssmDouble* plist,GaussPenta* gauss){
+void PentaRef::GetInputValue(IssmDouble* pvalue,IssmDouble* plist,Gauss* gauss){
 	/*P1 interpolation on Gauss point*/
 
@@ -1937,5 +1986,5 @@
 /*}}}*/
 /*FUNCTION PentaRef::GetInputDerivativeValue{{{*/
-void PentaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss){
 	/*From node values of parameter p (p_list[0], p_list[1], p_list[2],
 	 * p_list[3], p_list[4] and p_list[4]), return parameter derivative value at
Index: /issm/trunk-jpl/src/c/classes/Elements/PentaRef.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/PentaRef.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Elements/PentaRef.h	(revision 16818)
@@ -7,5 +7,5 @@
 #define _PENTAREF_H_
 
-class GaussPenta;
+class Gauss;
 class PentaRef{
 
@@ -22,49 +22,47 @@
 
 		/*Numerics*/
-		void GetNodalFunctions(IssmDouble* basis, GaussPenta* gauss);
-		void GetNodalFunctionsVelocity(IssmDouble* basis, GaussPenta* gauss);
-		void GetNodalFunctionsPressure(IssmDouble* basis, GaussPenta* gauss);
-		void GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,GaussPenta* gauss);
-		void GetNodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,GaussPenta* gauss);
-		void GetNodalFunctionsDerivativesPressure(IssmDouble* dbasis,IssmDouble* xyz_list,GaussPenta* gauss);
-		void GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussPenta* gauss);
-		void GetNodalFunctionsP1(IssmDouble* l1l6, GaussPenta* gauss);
-		void GetNodalFunctionsMINI(IssmDouble* l1l7, GaussPenta* gauss);
-		void GetNodalFunctionsP1Derivatives(IssmDouble* dh1dh6,IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetNodalFunctionsMINIDerivatives(IssmDouble* dh1dh7,IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetNodalFunctionsP1DerivativesReference(IssmDouble* dl1dl6,GaussPenta* gauss);
-		void GetNodalFunctionsMINIDerivativesReference(IssmDouble* dl1dl7,GaussPenta* gauss);
-		void GetQuadJacobianDeterminant(IssmDouble*  Jdet, IssmDouble xyz_list[4][3],GaussPenta* gauss);
-		void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussPenta* gauss);
-		void GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss);
-		void GetTriaJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss);
-		void GetSegmentJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss);
-		void GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,GaussPenta* gauss);
-		void GetBSSAHO(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBSSAFS(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBHO(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBFSstrainrate(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBFS(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBFSGLS(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBprimeSSAFS(IssmDouble* Bprime, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBprimeHO(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBprimeFS(IssmDouble* B_prime, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBprimeFSGLS(IssmDouble* B_prime, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBprimeVert(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBAdvec(IssmDouble* B_advec, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBConduct(IssmDouble* B_conduct, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBVert(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBprimeAdvec(IssmDouble* Bprime_advec, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetBHOFriction(IssmDouble* L, GaussPenta* gauss);
-		void GetLFS(IssmDouble* LFS, GaussPenta* gauss);
-		void GetLprimeFS(IssmDouble* LprimeFS, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetLSSAFS(IssmDouble* LSSAFS, GaussPenta* gauss);
-		void GetLprimeSSAFS(IssmDouble* LprimeSSAFS, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetLFSSSA(IssmDouble* LFSSSA, GaussPenta* gauss);
-		void GetLprimeFSSSA(IssmDouble* LprimeFSSSA, IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetInputValue(IssmDouble* pvalue,IssmDouble* plist, GaussPenta* gauss);
-		void GetInputValue(IssmDouble* pvalue,IssmDouble* plist,GaussTria* gauss){_error_("only PentaGauss are supported");};
-		void GetInputDerivativeValue(IssmDouble* pvalues, IssmDouble* plist,IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetInputDerivativeValue(IssmDouble* pvalues, IssmDouble* plist,IssmDouble* xyz_list, GaussTria* gauss){_error_("only PentaGauss are supported");};
+		void GetNodalFunctions(IssmDouble* basis, Gauss* gauss);
+		void GetNodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss);
+		void GetNodalFunctionsPressure(IssmDouble* basis, Gauss* gauss);
+		void GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+		void GetNodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+		void GetNodalFunctionsDerivativesPressure(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+		void GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,Gauss* gauss);
+		void GetNodalFunctionsP1(IssmDouble* l1l6, Gauss* gauss);
+		void GetNodalFunctionsMINI(IssmDouble* l1l7, Gauss* gauss);
+		void GetNodalFunctionsP1Derivatives(IssmDouble* dh1dh6,IssmDouble* xyz_list, Gauss* gauss);
+		void GetNodalFunctionsMINIDerivatives(IssmDouble* dh1dh7,IssmDouble* xyz_list, Gauss* gauss);
+		void GetNodalFunctionsP1DerivativesReference(IssmDouble* dl1dl6,Gauss* gauss);
+		void GetNodalFunctionsMINIDerivativesReference(IssmDouble* dl1dl7,Gauss* gauss);
+		void GetQuadJacobianDeterminant(IssmDouble*  Jdet, IssmDouble xyz_list[4][3],Gauss* gauss);
+		void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,Gauss* gauss);
+		void GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
+		void GetTriaJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
+		void GetSegmentJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
+		void GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,Gauss* gauss);
+		void GetBSSAHO(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBSSAFS(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBHO(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBFSstrainrate(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBFS(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBFSGLS(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBprimeSSAFS(IssmDouble* Bprime, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBprimeHO(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBprimeFS(IssmDouble* B_prime, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBprimeFSGLS(IssmDouble* B_prime, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBprimeVert(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBAdvec(IssmDouble* B_advec, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBConduct(IssmDouble* B_conduct, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBVert(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBprimeAdvec(IssmDouble* Bprime_advec, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBHOFriction(IssmDouble* L, Gauss* gauss);
+		void GetLFS(IssmDouble* LFS, Gauss* gauss);
+		void GetLprimeFS(IssmDouble* LprimeFS, IssmDouble* xyz_list, Gauss* gauss);
+		void GetLSSAFS(IssmDouble* LSSAFS, Gauss* gauss);
+		void GetLprimeSSAFS(IssmDouble* LprimeSSAFS, IssmDouble* xyz_list, Gauss* gauss);
+		void GetLFSSSA(IssmDouble* LFSSSA, Gauss* gauss);
+		void GetLprimeFSSSA(IssmDouble* LprimeFSSSA, IssmDouble* xyz_list, Gauss* gauss);
+		void GetInputValue(IssmDouble* pvalue,IssmDouble* plist, Gauss* gauss);
+		void GetInputDerivativeValue(IssmDouble* pvalues, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss);
 
 		void BasalNodeIndices(int* pnumindices,int** pindices,int finiteelement);
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 16818)
@@ -138,5 +138,7 @@
 		Gauss*      NewGaussBase(int order){_error_("not implemented yet");};
 		ElementVector* NewElementVector(int approximation_enum){_error_("not implemented yet");};
+		ElementMatrix* NewElementMatrix(int approximation_enum){_error_("not implemented yet");};
 		void           ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not implemented yet");};
+		void           ViscositySSA(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){_error_("not implemented");};
 		#ifdef _HAVE_THERMAL_
 		void UpdateBasalConstraintsEnthalpy(void){_error_("not implemented yet");};
@@ -178,4 +180,8 @@
 		void        TransformSolutionCoord(IssmDouble* values,int numnodes,int transformenum){_error_("not implemented yet");};
 		void        TransformSolutionCoord(IssmDouble* values,int numnodes,int* transformenum_list){_error_("not implemented yet");};
+		void        TransformStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum){_error_("not implemented yet");};
+		void        TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* transformenum_list){_error_("not implemented yet");};
+		void        TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum){_error_("not implemented yet");};
+		void        TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};
 		void UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
 		void UpdateConstraintsExtrudeFromTop(){_error_("not implemented");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 16818)
@@ -1502,6 +1502,6 @@
 }
 /*}}}*/
-/*FUNCTION Tria::GetStrainRate2d(IssmDouble* epsilon,IssmDouble* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input){{{*/
-void Tria::GetStrainRate2d(IssmDouble* epsilon,IssmDouble* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input){
+/*FUNCTION Tria::GetStrainRate2d(IssmDouble* epsilon,IssmDouble* xyz_list, Gauss* gauss, Input* vx_input, Input* vy_input){{{*/
+void Tria::GetStrainRate2d(IssmDouble* epsilon,IssmDouble* xyz_list, Gauss* gauss, Input* vx_input, Input* vy_input){
 	/*Compute the 2d Strain Rate (3 components):
 	 * epsilon=[exx eyy exy] */
@@ -2194,4 +2194,9 @@
 }
 /*}}}*/
+/*FUNCTION Tria::NewElementMatrix{{{*/
+ElementMatrix* Tria::NewElementMatrix(int approximation_enum){
+	return new ElementMatrix(nodes,this->NumberofNodes(),this->parameters,approximation_enum);
+}
+/*}}}*/
 /*FUNCTION Tria::NoIceInElement {{{*/
 bool   Tria::NoIceInElement(){
@@ -2712,5 +2717,5 @@
 }
 /*}}}*/
-/*FUNCTION Tria::TransformSolutionCoord{{{*/
+/*FUNCTION Tria::TransformSolutionCoord(IssmDouble* values,int transformenum){{{*/
 void Tria::TransformSolutionCoord(IssmDouble* values,int transformenum){
 
@@ -2719,5 +2724,5 @@
 }
 /*}}}*/
-/*FUNCTION Tria::TransformSolutionCoord{{{*/
+/*FUNCTION Tria::TransformSolutionCoord(IssmDouble* values,int* transformenum_list){{{*/
 void Tria::TransformSolutionCoord(IssmDouble* values,int* transformenum_list){
 
@@ -2726,5 +2731,5 @@
 }
 /*}}}*/
-/*FUNCTION Tria::TransformLoadVectorCoord{{{*/
+/*FUNCTION Tria::TransformLoadVectorCoord(ElementVector* pe,int transformenum){{{*/
 void Tria::TransformLoadVectorCoord(ElementVector* pe,int transformenum){
 
@@ -2733,8 +2738,15 @@
 }
 /*}}}*/
-/*FUNCTION Tria::TransformLoadVectorCoord{{{*/
+/*FUNCTION Tria::TransformLoadVectorCoord(ElementVector* pe,int* transformenum_list){{{*/
 void Tria::TransformLoadVectorCoord(ElementVector* pe,int* transformenum_list){
 
 	::TransformLoadVectorCoord(pe,this->nodes,this->NumberofNodes(),transformenum_list);
+
+}
+/*}}}*/
+/*FUNCTION Tria::TransformStiffnessMatrixCoord(ElementMatrix* pe,int transformenum){{{*/
+void Tria::TransformStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum){
+
+	::TransformStiffnessMatrixCoord(Ke,this->nodes,this->NumberofNodes(),transformenum);
 
 }
@@ -2884,4 +2896,18 @@
 }
 /*}}}*/
+/*FUNCTION Tria::ViscositySSA{{{*/
+void Tria::ViscositySSA(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){
+
+	/*Intermediaries*/
+	IssmDouble viscosity;
+	IssmDouble epsilon[3];/* epsilon=[exx,eyy,exy];    */
+
+	this->GetStrainRate2d(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
+	material->GetViscosity2d(&viscosity, &epsilon[0]);
+
+	/*Assign output pointer*/
+	*pviscosity=viscosity;
+}
+/*}}}*/
 
 #ifdef _HAVE_RESPONSES_
@@ -3531,5 +3557,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,(vnumnodes+pnumnodes),cs_list);
+	::TransformStiffnessMatrixCoord(Ke,nodes,(vnumnodes+pnumnodes),cs_list);
 
 	/*Clean up and return*/
@@ -3604,5 +3630,5 @@
 
 	/*DO NOT Transform Coordinate System: this stiffness matrix is already expressed in tangential coordinates*/
-	//TransformStiffnessMatrixCoord(Ke,nodes,(vnumnodes+pnumnodes),cs_list);
+	//::TransformStiffnessMatrixCoord(Ke,nodes,(vnumnodes+pnumnodes),cs_list);
 
 	/*Clean up and return*/
@@ -3684,5 +3710,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
+	::TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
 
 	/*Clean up and return*/
@@ -3769,5 +3795,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
+	::TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
 
 	/*Clean up and return*/
@@ -4299,5 +4325,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
+	::TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
 
 	/*Clean up and return*/
@@ -6016,5 +6042,5 @@
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
+	::TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
 
 	/*Clean up and return*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 16818)
@@ -22,4 +22,5 @@
 class ElementVector;
 class Vertex;
+class GaussTria;
 
 #include "../../shared/Exceptions/exceptions.h"
@@ -265,5 +266,5 @@
 		void           GetInputValue(IssmDouble* pvalue,int enum_type);
 		void           GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype);
-		void           GetStrainRate2d(IssmDouble* epsilon,IssmDouble* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input);
+		void           GetStrainRate2d(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss, Input* vx_input, Input* vy_input);
 		void	         InputChangeName(int enum_type,int enum_type_old);
 		void	         InputUpdateFromSolutionOneDof(IssmDouble* solution,int enum_type);
@@ -277,4 +278,5 @@
 		Gauss*         NewGaussBase(int order){_error_("not implemented yet");};
 		ElementVector* NewElementVector(int approximation_enum);
+		ElementMatrix* NewElementMatrix(int approximation_enum);
 		void           NodalFunctions(IssmDouble* basis,Gauss* gauss);
 		void           NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
@@ -293,5 +295,11 @@
 		void           TransformSolutionCoord(IssmDouble* values,int numnodes,int transformenum){_error_("not implemented yet");};
 		void           TransformSolutionCoord(IssmDouble* values,int numnodes,int* transformenum_list){_error_("not implemented yet");};
+		void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum);
+		void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* transformenum_list){_error_("not implemented yet");};
+		void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum){_error_("not implemented yet");};
+		void           TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};
 		void           ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not implemented yet");};
+		void           ViscositySSA(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+
 		#ifdef _HAVE_STRESSBALANCE_
 		ElementMatrix* CreateKMatrixStressbalanceSSA(void);
Index: /issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 16818)
@@ -52,5 +52,5 @@
 /*Reference Element numerics*/
 /*FUNCTION TriaRef::GetBHydro {{{*/
-void TriaRef::GetBHydro(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetBHydro(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
 	 * For node i, Bi can be expressed in the actual coordinate system
@@ -81,5 +81,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetBSSA {{{*/
-void TriaRef::GetBSSA(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetBSSA(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
 	 * For node i, Bi can be expressed in the actual coordinate system
@@ -115,5 +115,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetBSSAFS {{{*/
-void TriaRef::GetBSSAFS(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetBSSAFS(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 
 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
@@ -150,5 +150,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetSegmentBFlux{{{*/
-void TriaRef::GetSegmentBFlux(IssmDouble* B,GaussTria* gauss, int index1,int index2){
+void TriaRef::GetSegmentBFlux(IssmDouble* B,Gauss* gauss, int index1,int index2){
 	/*Compute B  matrix. B=[phi1 phi2 -phi3 -phi4]
 	 *
@@ -176,5 +176,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetSegmentBprimeFlux{{{*/
-void TriaRef::GetSegmentBprimeFlux(IssmDouble* Bprime,GaussTria* gauss, int index1,int index2){
+void TriaRef::GetSegmentBprimeFlux(IssmDouble* Bprime,Gauss* gauss, int index1,int index2){
 	/*Compute Bprime  matrix. Bprime=[phi1 phi2 phi3 phi4]
 	 *
@@ -202,5 +202,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetBExtrusion{{{*/
-void TriaRef::GetBExtrusion(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetBExtrusion(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 	/*	Compute B  matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];
 		where hi is the interpolation function for node i.*/
@@ -223,5 +223,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetBFS {{{*/
-void TriaRef::GetBFS(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetBFS(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute B  matrix. B=[Bv1 Bv2 ... Bp1 Bp2 ...] where Bvi is of size 3*NDOF3. 
 	 * For node i, Bvi can be expressed in the actual coordinate system
@@ -278,5 +278,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetBprimeFS {{{*/
-void TriaRef::GetBprimeFS(IssmDouble* B_prime, IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetBprimeFS(IssmDouble* B_prime, IssmDouble* xyz_list, Gauss* gauss){
 	/*	Compute B'  matrix. B'=[B1' B2' B3' B4' B5' B6' Bb'] where Bi' is of size 3*NDOF2. 
 	 *	For node i, Bi' can be expressed in the actual coordinate system
@@ -333,5 +333,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetBMasstransport{{{*/
-void TriaRef::GetBMasstransport(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetBMasstransport(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
 	 * For node i, Bi can be expressed in the actual coordinate system
@@ -362,5 +362,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetBprimeSSA {{{*/
-void TriaRef::GetBprimeSSA(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetBprimeSSA(IssmDouble* Bprime, IssmDouble* xyz_list, Gauss* gauss){
 
 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
@@ -397,5 +397,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetBprimeSSAFS {{{*/
-void TriaRef::GetBprimeSSAFS(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetBprimeSSAFS(IssmDouble* Bprime, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute Bprime  matrix. Bprime=[Bprime1 Bprime2 Bprime3] where Bprimei is of size 3*NDOF2. 
 	 * For node i, Bprimei can be expressed in the actual coordinate system
@@ -434,5 +434,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetBprimeMasstransport{{{*/
-void TriaRef::GetBprimeMasstransport(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetBprimeMasstransport(IssmDouble* Bprime, IssmDouble* xyz_list, Gauss* gauss){
 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
 	 * For node i, Bi' can be expressed in the actual coordinate system
@@ -463,5 +463,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetBSSAFriction{{{*/
-void TriaRef::GetBSSAFriction(IssmDouble* B, IssmDouble* xyz_list,GaussTria* gauss){
+void TriaRef::GetBSSAFriction(IssmDouble* B, IssmDouble* xyz_list,Gauss* gauss){
 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is square and of size 2. 
 	 * For node i, Bi can be expressed in the actual coordinate system
@@ -494,5 +494,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetLFS{{{*/
-void TriaRef::GetLFS(IssmDouble* LFS, GaussTria* gauss){
+void TriaRef::GetLFS(IssmDouble* LFS, Gauss* gauss){
 	/* Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof. 
 	 * For node i, Li can be expressed in the actual coordinate system
@@ -527,5 +527,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetJacobian{{{*/
-void TriaRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussTria* gauss){
+void TriaRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,Gauss* gauss){
 	/*The Jacobian is constant over the element, discard the gaussian points. 
 	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
@@ -545,5 +545,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetSegmentJacobianDeterminant{{{*/
-void TriaRef::GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss){
+void TriaRef::GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss){
 	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
 	 * J is assumed to have been allocated*/
@@ -560,5 +560,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetJacobianDeterminant{{{*/
-void TriaRef::GetJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss){
+void TriaRef::GetJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss){
 	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
 	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
@@ -575,5 +575,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetJacobianInvert{{{*/
-void TriaRef::GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,GaussTria* gauss){
+void TriaRef::GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,Gauss* gauss){
 
 	/*Jacobian*/
@@ -588,6 +588,6 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetNodalFunctions(IssmDouble* basis,GaussTria* gauss){{{*/
-void TriaRef::GetNodalFunctions(IssmDouble* basis,GaussTria* gauss){
+/*FUNCTION TriaRef::GetNodalFunctions(IssmDouble* basis,Gauss* gauss){{{*/
+void TriaRef::GetNodalFunctions(IssmDouble* basis,Gauss* gauss){
 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
 
@@ -597,9 +597,13 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetNodalFunctions(IssmDouble* basis,GaussTria* gauss,int finiteelement){{{*/
-void TriaRef::GetNodalFunctions(IssmDouble* basis,GaussTria* gauss,int finiteelement){
+/*FUNCTION TriaRef::GetNodalFunctions(IssmDouble* basis,Gauss* gauss,int finiteelement){{{*/
+void TriaRef::GetNodalFunctions(IssmDouble* basis,Gauss* gauss_in,int finiteelement){
 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
 
 	_assert_(basis);
+
+	/*Cast gauss to GaussTria*/
+	_assert_(gauss_in->Enum()==GaussTriaEnum);
+	GaussTria* gauss = dynamic_cast<GaussTria*>(gauss_in);
 
 	switch(finiteelement){
@@ -633,5 +637,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetNodalFunctionsVelocity{{{*/
-void TriaRef::GetNodalFunctionsVelocity(IssmDouble* basis,GaussTria* gauss){
+void TriaRef::GetNodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss){
 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
 
@@ -668,5 +672,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetNodalFunctionsPressure{{{*/
-void TriaRef::GetNodalFunctionsPressure(IssmDouble* basis,GaussTria* gauss){
+void TriaRef::GetNodalFunctionsPressure(IssmDouble* basis,Gauss* gauss){
 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
 
@@ -703,5 +707,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetSegmentNodalFunctions{{{*/
-void TriaRef::GetSegmentNodalFunctions(IssmDouble* basis,GaussTria* gauss,int index1,int index2){
+void TriaRef::GetSegmentNodalFunctions(IssmDouble* basis,Gauss* gauss,int index1,int index2){
 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
 
@@ -742,6 +746,6 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussTria* gauss){{{*/
-void TriaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussTria* gauss){
+/*FUNCTION TriaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss){{{*/
+void TriaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss){
 
 	GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss,this->element_type);
@@ -749,6 +753,6 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussTria* gauss,int finiteelement){{{*/
-void TriaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussTria* gauss,int finiteelement){
+/*FUNCTION TriaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss,int finiteelement){{{*/
+void TriaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss,int finiteelement){
 
 	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
@@ -781,5 +785,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetNodalFunctionsDerivativesPressure{{{*/
-void TriaRef::GetNodalFunctionsDerivativesPressure(IssmDouble* dbasis,IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetNodalFunctionsDerivativesPressure(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss){
 	switch(this->element_type){
 		case P1P1Enum:
@@ -814,5 +818,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetNodalFunctionsDerivativesVelocity{{{*/
-void TriaRef::GetNodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetNodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss){
 	switch(this->element_type){
 		case P1P1Enum:
@@ -846,6 +850,6 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussTria* gauss){{{*/
-void TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussTria* gauss){
+/*FUNCTION TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,Gauss* gauss){{{*/
+void TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,Gauss* gauss){
 	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
 	 * natural coordinate system) at the gaussian point. */
@@ -855,10 +859,14 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussTria* gauss,int finiteelement){{{*/
-void TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussTria* gauss,int finiteelement){
+/*FUNCTION TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,Gauss* gauss,int finiteelement){{{*/
+void TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,Gauss* gauss_in,int finiteelement){
 	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
 	 * natural coordinate system) at the gaussian point. */
 
-	_assert_(dbasis && gauss);
+	_assert_(dbasis && gauss_in);
+
+	/*Cast gauss to GaussTria*/
+	_assert_(gauss_in->Enum()==GaussTriaEnum);
+	GaussTria* gauss = dynamic_cast<GaussTria*>(gauss_in);
 
 	switch(finiteelement){
@@ -915,5 +923,5 @@
 /*}}}*/
 /*FUNCTION TriaRef::GetInputDerivativeValue{{{*/
-void TriaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussTria* gauss){
+void TriaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss){
 
 	/*From node values of parameter p (plist[0],plist[1],plist[2]), return parameter derivative value at gaussian 
@@ -947,12 +955,12 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, GaussTria* gauss){{{*/
-void TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, GaussTria* gauss){
+/*FUNCTION TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss){{{*/
+void TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss){
 
 	GetInputValue(p,plist,gauss,this->element_type);
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, GaussTria* gauss,int finiteelement){{{*/
-void TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, GaussTria* gauss,int finiteelement){
+/*FUNCTION TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss,int finiteelement){{{*/
+void TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss,int finiteelement){
 
 	/*Output*/
Index: /issm/trunk-jpl/src/c/classes/Elements/TriaRef.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/TriaRef.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Elements/TriaRef.h	(revision 16818)
@@ -7,5 +7,5 @@
 #define _TRIAREF_H_
 
-class GaussTria;
+class Gauss;
 
 class TriaRef{
@@ -23,36 +23,36 @@
 
 		/*Numerics*/
-		void GetBExtrusion(IssmDouble* B_prime, IssmDouble* xyz_list, GaussTria* gauss);
-		void GetBFS(IssmDouble* B_prime, IssmDouble* xyz_list, GaussTria* gauss);
-		void GetBSSA(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss);
-		void GetBSSAFS(IssmDouble* B , IssmDouble* xyz_list, GaussTria* gauss);
-		void GetBprimeFS(IssmDouble* B_prime, IssmDouble* xyz_list, GaussTria* gauss);
-		void GetBprimeSSA(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss);
-		void GetBprimeSSAFS(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss);
-		void GetBprimeMasstransport(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss);
-		void GetBMasstransport(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss);
-		void GetBHydro(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss);
-		void GetBSSAFriction(IssmDouble* L, IssmDouble* xyz_list,GaussTria* gauss);
-		void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussTria* gauss);
-		void GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss);
-		void GetJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss);
-		void GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,GaussTria* gauss);
-		void GetLFS(IssmDouble* LFS, GaussTria* gauss);
-		void GetNodalFunctions(IssmDouble* basis,GaussTria* gauss);
-		void GetNodalFunctions(IssmDouble* basis,GaussTria* gauss,int finiteelement);
-		void GetNodalFunctionsVelocity(IssmDouble* basis, GaussTria* gauss);
-		void GetNodalFunctionsPressure(IssmDouble* basis, GaussTria* gauss);
-		void GetSegmentNodalFunctions(IssmDouble* basis,GaussTria* gauss, int index1,int index2);
-		void GetSegmentBFlux(IssmDouble* B,GaussTria* gauss, int index1,int index2);
-		void GetSegmentBprimeFlux(IssmDouble* Bprime,GaussTria* gauss, int index1,int index2);
-		void GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussTria* gauss);
-		void GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussTria* gauss,int finiteelement);
-		void GetNodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,GaussTria* gauss);
-		void GetNodalFunctionsDerivativesPressure(IssmDouble* dbasis,IssmDouble* xyz_list,GaussTria* gauss);
-		void GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussTria* gauss);
-		void GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussTria* gauss,int finiteelement);
-		void GetInputValue(IssmDouble* pp, IssmDouble* plist, GaussTria* gauss);
-		void GetInputValue(IssmDouble* pp, IssmDouble* plist, GaussTria* gauss,int finiteelement);
-		void GetInputDerivativeValue(IssmDouble* pp, IssmDouble* plist,IssmDouble* xyz_list, GaussTria* gauss);
+		void GetBExtrusion(IssmDouble* B_prime, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBFS(IssmDouble* B_prime, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBSSA(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBSSAFS(IssmDouble* B , IssmDouble* xyz_list, Gauss* gauss);
+		void GetBprimeFS(IssmDouble* B_prime, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBprimeSSA(IssmDouble* Bprime, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBprimeSSAFS(IssmDouble* Bprime, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBprimeMasstransport(IssmDouble* Bprime, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBMasstransport(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBHydro(IssmDouble* B, IssmDouble* xyz_list, Gauss* gauss);
+		void GetBSSAFriction(IssmDouble* L, IssmDouble* xyz_list,Gauss* gauss);
+		void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,Gauss* gauss);
+		void GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss);
+		void GetJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss);
+		void GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,Gauss* gauss);
+		void GetLFS(IssmDouble* LFS, Gauss* gauss);
+		void GetNodalFunctions(IssmDouble* basis,Gauss* gauss);
+		void GetNodalFunctions(IssmDouble* basis,Gauss* gauss,int finiteelement);
+		void GetNodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss);
+		void GetNodalFunctionsPressure(IssmDouble* basis, Gauss* gauss);
+		void GetSegmentNodalFunctions(IssmDouble* basis,Gauss* gauss, int index1,int index2);
+		void GetSegmentBFlux(IssmDouble* B,Gauss* gauss, int index1,int index2);
+		void GetSegmentBprimeFlux(IssmDouble* Bprime,Gauss* gauss, int index1,int index2);
+		void GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss);
+		void GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss,int finiteelement);
+		void GetNodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+		void GetNodalFunctionsDerivativesPressure(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+		void GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,Gauss* gauss);
+		void GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,Gauss* gauss,int finiteelement);
+		void GetInputValue(IssmDouble* pp, IssmDouble* plist, Gauss* gauss);
+		void GetInputValue(IssmDouble* pp, IssmDouble* plist, Gauss* gauss,int finiteelement);
+		void GetInputDerivativeValue(IssmDouble* pp, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss);
 
 		void NodeOnEdgeIndices(int* pnumindices,int** pindices,int index,int finiteelement);
Index: /issm/trunk-jpl/src/c/classes/Inputs/BoolInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/BoolInput.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/BoolInput.h	(revision 16818)
@@ -7,9 +7,5 @@
 
 /*Headers:*/
-/*{{{*/
 #include "./Input.h"
-class GaussTria;
-class GaussPenta;
-/*}}}*/
 
 class BoolInput: public Input{
@@ -54,11 +50,11 @@
 		void GetInputAllTimeAverages(IssmDouble** pvalues,IssmDouble** ptimes, int* pnumtimes){_error_("not implemented yet");};
 		void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime){_error_("not implemented yet");};
-		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
 		void ChangeEnum(int newenumtype);
 		void SquareMin(IssmDouble* psquaremin, Parameters* parameters);
Index: /issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp	(revision 16818)
@@ -235,14 +235,10 @@
 	values->GetInputValue(pvalue);
 }/*}}}*/
-/*FUNCTION ControlInput::GetInputValue(Issm* pvalue,Gauss* gauss){{{*/
+/*FUNCTION ControlInput::GetInputValue(IssmDouble* pvalue,Gauss* gauss){{{*/
 void ControlInput::GetInputValue(IssmDouble* pvalue,Gauss* gauss){
 	values->GetInputValue(pvalue,gauss);
 }/*}}}*/
-/*FUNCTION ControlInput::GetGradientValue(IssmDouble* pvalue,GaussTria* gauss){{{*/
-void ControlInput::GetGradientValue(IssmDouble* pvalue,GaussTria* gauss){
-	gradient->GetInputValue(pvalue,gauss);
-}/*}}}*/
-/*FUNCTION ControlInput::GetGradientValue(IssmDouble* pvalue,GaussPenta* gauss){{{*/
-void ControlInput::GetGradientValue(IssmDouble* pvalue,GaussPenta* gauss){
+/*FUNCTION ControlInput::GetGradientValue{{{*/
+void ControlInput::GetGradientValue(IssmDouble* pvalue,Gauss* gauss){
 	gradient->GetInputValue(pvalue,gauss);
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Inputs/ControlInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/ControlInput.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/ControlInput.h	(revision 16818)
@@ -9,6 +9,6 @@
 /*{{{*/
 #include "./Input.h"
-class GaussTria;
-class GaussPenta;
+class Gauss;
+class Gauss;
 /*}}}*/
 
@@ -47,6 +47,5 @@
 		/*}}}*/
 		/*numerics: {{{*/
-		void GetGradientValue(IssmDouble* pvalue,GaussTria* gauss);
-		void GetGradientValue(IssmDouble* pvalue,GaussPenta* gauss);
+		void GetGradientValue(IssmDouble* pvalue,Gauss* gauss);
 		void SetInput(Input* in_input);
 		void GetInputValue(bool* pvalue);
@@ -60,11 +59,11 @@
 		void GetInputAllTimeAverages(IssmDouble** pvalues,IssmDouble** ptimes, int* pnumtimes){_error_("not implemented yet");};
 		void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime){_error_("not implemented yet");};
-		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
 		void ChangeEnum(int newenumtype){_error_("not implemented yet");};
 		void SquareMin(IssmDouble* psquaremin,Parameters* parameters){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.h	(revision 16818)
@@ -9,6 +9,6 @@
 /*{{{*/
 #include "./Input.h"
-class GaussTria;
-class GaussPenta;
+class Gauss;
+class Gauss;
 /*}}}*/
 
@@ -55,11 +55,11 @@
 		void GetInputAllTimeAverages(IssmDouble** pvalues,IssmDouble** ptimes, int* pnumtimes){_error_("not implemented yet");};
 		void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime){_error_("not implemented yet");};
-		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
 		void ChangeEnum(int newenumtype){_error_("not implemented yet");};
 		void SquareMin(IssmDouble* psquaremin,Parameters* parameters){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Inputs/DoubleInput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/DoubleInput.cpp	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/DoubleInput.cpp	(revision 16818)
@@ -123,42 +123,42 @@
 void DoubleInput::GetInputValue(IssmDouble* pvalue,Gauss* gauss){*pvalue=this->value;}
 /*}}}*/
-/*FUNCTION DoubleInput::GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss){{{*/
-void DoubleInput::GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss){
+/*FUNCTION DoubleInput::GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){{{*/
+void DoubleInput::GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){
 	/*Epsilon is zero as vx is constant over the element*/
 	for(int i=0;i<3;i++) epsilonvx[i]=0;
 }
 /*}}}*/
-/*FUNCTION DoubleInput::GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss){{{*/
-void DoubleInput::GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss){
+/*FUNCTION DoubleInput::GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){{{*/
+void DoubleInput::GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){
 	/*Epsilon is zero as vy is constant over the element*/
 	for(int i=0;i<3;i++) epsilonvy[i]=0;
 }
 /*}}}*/
-/*FUNCTION DoubleInput::GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){{{*/
-void DoubleInput::GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){
+/*FUNCTION DoubleInput::GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){{{*/
+void DoubleInput::GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){
 	/*Epsilon is zero as vx is constant over the element*/
 	for(int i=0;i<6;i++) epsilonvx[i]=0;
 }
 /*}}}*/
-/*FUNCTION DoubleInput::GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){{{*/
-void DoubleInput::GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){
+/*FUNCTION DoubleInput::GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){{{*/
+void DoubleInput::GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){
 	/*Epsilon is zero as vy is constant over the element*/
 	for(int i=0;i<6;i++) epsilonvy[i]=0;
 }
 /*}}}*/
-/*FUNCTION DoubleInput::GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss){{{*/
-void DoubleInput::GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss){
+/*FUNCTION DoubleInput::GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss){{{*/
+void DoubleInput::GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss){
 	/*Epsilon is zero as vz is constant over the element*/
 	for(int i=0;i<6;i++) epsilonvz[i]=0;
 }
 /*}}}*/
-/*FUNCTION DoubleInput::GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){{{*/
-void DoubleInput::GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){
+/*FUNCTION DoubleInput::GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){{{*/
+void DoubleInput::GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){
 	/*Epsilon is zero as vx is constant over the element*/
 	for(int i=0;i<5;i++) epsilonvx[i]=0;
 }
 /*}}}*/
-/*FUNCTION DoubleInput::GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){{{*/
-void DoubleInput::GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){
+/*FUNCTION DoubleInput::GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){{{*/
+void DoubleInput::GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){
 	/*Epsilon is zero as vy is constant over the element*/
 	for(int i=0;i<5;i++) epsilonvy[i]=0;
Index: /issm/trunk-jpl/src/c/classes/Inputs/DoubleInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/DoubleInput.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/DoubleInput.h	(revision 16818)
@@ -9,6 +9,6 @@
 /*{{{*/
 #include "./Input.h"
-class GaussTria;
-class GaussPenta;
+class Gauss;
+class Gauss;
 /*}}}*/
 
@@ -53,11 +53,11 @@
 		void GetInputAllTimeAverages(IssmDouble** pvalues,IssmDouble** ptimes, int* pnumtimes){_error_("not implemented yet");};
 		void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime){_error_("not implemented yet");};
-		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss);
-		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss);
-		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss);
+		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss);
 		void ChangeEnum(int newenumtype);
 		void SquareMin(IssmDouble* psquaremin,Parameters* parameters);
Index: /issm/trunk-jpl/src/c/classes/Inputs/Input.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/Input.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/Input.h	(revision 16818)
@@ -12,8 +12,8 @@
 class Node;
 class Gauss;
-class GaussTria;
+class Gauss;
 class GaussSeg;
 class Parameters;
-class GaussPenta;
+class Gauss;
 template <class doubletype> class Vector;
 /*}}}*/
@@ -36,11 +36,11 @@
 		virtual void GetInputAllTimeAverages(IssmDouble** pvalues,IssmDouble** ptimes, int* pnumtimes)=0;
 		virtual void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime)=0;
-		virtual void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss)=0;
-		virtual void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss)=0;
-		virtual void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss)=0;
-		virtual void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss)=0;
-		virtual void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss)=0;
-		virtual void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss)=0;
-		virtual void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss)=0;
+		virtual void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss)=0;
+		virtual void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss)=0;
+		virtual void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss)=0;
+		virtual void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss)=0;
+		virtual void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss)=0;
+		virtual void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss)=0;
+		virtual void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss)=0;
 		virtual void ChangeEnum(int newenumtype)=0;
 		virtual void Configure(Parameters* parameters)=0;
Index: /issm/trunk-jpl/src/c/classes/Inputs/IntInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/IntInput.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/IntInput.h	(revision 16818)
@@ -9,6 +9,6 @@
 /*{{{*/
 #include "./Input.h"
-class GaussTria;
-class GaussPenta;
+class Gauss;
+class Gauss;
 /*}}}*/
 
@@ -55,11 +55,11 @@
 		void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime){_error_("not implemented yet");};
 
-		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
 		void ChangeEnum(int newenumtype);
 		void SquareMin(IssmDouble* psquaremin,Parameters* parameters);
Index: /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.cpp	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.cpp	(revision 16818)
@@ -155,5 +155,5 @@
 /*}}}*/
 /*FUNCTION PentaInput::GetVxStrainRate3d{{{*/
-void PentaInput::GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaInput::GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){
 
 	/*Intermediary*/
@@ -181,5 +181,5 @@
 /*}}}*/
 /*FUNCTION PentaInput::GetVyStrainRate3d{{{*/
-void PentaInput::GetVyStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaInput::GetVyStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){
 
 	/*Intermediary*/
@@ -206,5 +206,5 @@
 /*}}}*/
 /*FUNCTION PentaInput::GetVzStrainRate3d{{{*/
-void PentaInput::GetVzStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaInput::GetVzStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){
 
 	/*Intermediary*/
@@ -231,5 +231,5 @@
 /*}}}*/
 /*FUNCTION PentaInput::GetVxStrainRate3dHO{{{*/
-void PentaInput::GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaInput::GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){
 
 	int i;
@@ -257,5 +257,5 @@
 /*}}}*/
 /*FUNCTION PentaInput::GetVyStrainRate3dHO{{{*/
-void PentaInput::GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){
+void PentaInput::GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){
 
 	int i;
Index: /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.h	(revision 16818)
@@ -10,6 +10,6 @@
 #include "./Input.h"
 #include "../Elements/PentaRef.h"
-class GaussTria;
-class GaussPenta;
+class Gauss;
+class Gauss;
 /*}}}*/
 
@@ -54,11 +54,11 @@
 		void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime){_error_("not implemented yet");};
 
-		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss);
-		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss);
+		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss);
 		void ChangeEnum(int newenumtype);
 
Index: /issm/trunk-jpl/src/c/classes/Inputs/SegInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/SegInput.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/SegInput.h	(revision 16818)
@@ -11,5 +11,5 @@
 #include "../Elements/SegRef.h"
 class GaussSeg;
-class GaussPenta;
+class Gauss;
 /*}}}*/
 
@@ -54,11 +54,11 @@
 		void GetInputAllTimeAverages(IssmDouble** pvalues,IssmDouble** ptimes, int* pnumtimes){_error_("not implemented yet");};
 		void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime){_error_("not implemented yet");};
-		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
 		void ChangeEnum(int newenumtype){_error_("not implemented yet");};
 
Index: /issm/trunk-jpl/src/c/classes/Inputs/TransientInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/TransientInput.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/TransientInput.h	(revision 16818)
@@ -9,7 +9,7 @@
 /*{{{*/
 #include "./Input.h"
-class GaussTria;
+class Gauss;
 class Parameters;
-class GaussPenta;
+class Gauss;
 /*}}}*/
 
@@ -59,11 +59,11 @@
 		void GetInputAllTimeAverages(IssmDouble** pvalues,IssmDouble** ptimes, int* pnumtimes);
 		void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime);
-		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
 		void ChangeEnum(int newenumtype);
 
Index: /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.cpp	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.cpp	(revision 16818)
@@ -142,5 +142,5 @@
 /*}}}*/
 /*FUNCTION TriaInput::GetVxStrainRate2d{{{*/
-void TriaInput::GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss){
+void TriaInput::GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){
 
 	/*Intermediary*/
@@ -168,5 +168,5 @@
 /*}}}*/
 /*FUNCTION TriaInput::GetVyStrainRate2d{{{*/
-void TriaInput::GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss){
+void TriaInput::GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){
 
 	/*Intermediary*/
Index: /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h	(revision 16817)
+++ /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h	(revision 16818)
@@ -10,6 +10,6 @@
 #include "./Input.h"
 #include "../Elements/TriaRef.h"
-class GaussTria;
-class GaussPenta;
+class Gauss;
+class Gauss;
 /*}}}*/
 
@@ -54,11 +54,11 @@
 		void GetInputAllTimeAverages(IssmDouble** pvalues,IssmDouble** ptimes, int* pnumtimes);
 		void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime);
-		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussTria* gauss);
-		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussTria* gauss);
-		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
-		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate2d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVyStrainRate2d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss);
+		void GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVxStrainRate3dHO(IssmDouble* epsilonvx,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
+		void GetVyStrainRate3dHO(IssmDouble* epsilonvy,IssmDouble* xyz_list, Gauss* gauss){_error_("not implemented yet");};
 		void ChangeEnum(int newenumtype);
 
