Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 15620)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 15621)
@@ -3095,16 +3095,15 @@
 	/*Intermediaries*/
 	int        i;
-	int        penta_node_ids[6];
 	int        penta_vertex_ids[6];
 	IssmDouble nodeinputs[6];
 	IssmDouble yts;
-	int        stabilization;
 	bool       dakota_analysis;
 	bool       isFS;
 	IssmDouble beta,heatcapacity,referencetemperature,meltingpoint,latentheat;
+	int        numnodes;
+	int*       penta_node_ids = NULL;
 
 	/*Fetch parameters: */
 	iomodel->Constant(&yts,ConstantsYtsEnum);
-	iomodel->Constant(&stabilization,PrognosticStabilizationEnum);
 	iomodel->Constant(&dakota_analysis,QmuIsdakotaEnum);
 	iomodel->Constant(&isFS,FlowequationIsFSEnum);
@@ -3120,4 +3119,5 @@
 	/*}}}*/
 
+	/*Recover element type*/
 	this->SetElementType(finiteelement_type,analysis_counter);
 
@@ -3126,12 +3126,41 @@
 
 	/*Recover nodes ids needed to initialize the node hook.*/
-	for(i=0;i<6;i++){ 
-		//go recover node ids, needed to initialize the node hook.
-		//WARNING: We assume P1 elements here!!!!!
-		penta_node_ids[i]=iomodel->nodecounter+iomodel->elements[6*index+i]; //ids for vertices are in the elements array from Matlab
+	switch(finiteelement_type){
+		case P1Enum:
+			numnodes         = 6;
+			penta_node_ids   = xNew<int>(numnodes);
+			penta_node_ids[0]=iomodel->nodecounter+iomodel->elements[6*index+0];
+			penta_node_ids[1]=iomodel->nodecounter+iomodel->elements[6*index+1];
+			penta_node_ids[2]=iomodel->nodecounter+iomodel->elements[6*index+2];
+			penta_node_ids[3]=iomodel->nodecounter+iomodel->elements[6*index+3];
+			penta_node_ids[4]=iomodel->nodecounter+iomodel->elements[6*index+4];
+			penta_node_ids[5]=iomodel->nodecounter+iomodel->elements[6*index+5];
+			break;
+		case P2Enum:
+			numnodes         = 15;
+			penta_node_ids   = xNew<int>(numnodes);
+			penta_node_ids[ 0]=iomodel->nodecounter+iomodel->elements[6*index+0];
+			penta_node_ids[ 1]=iomodel->nodecounter+iomodel->elements[6*index+1];
+			penta_node_ids[ 2]=iomodel->nodecounter+iomodel->elements[6*index+2];
+			penta_node_ids[ 3]=iomodel->nodecounter+iomodel->elements[6*index+3];
+			penta_node_ids[ 4]=iomodel->nodecounter+iomodel->elements[6*index+4];
+			penta_node_ids[ 5]=iomodel->nodecounter+iomodel->elements[6*index+5];
+			penta_node_ids[ 6]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+0]+1;
+			penta_node_ids[ 7]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+1]+1;
+			penta_node_ids[ 8]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+2]+1;
+			penta_node_ids[ 9]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+3]+1;
+			penta_node_ids[10]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+4]+1;
+			penta_node_ids[11]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+5]+1;
+			penta_node_ids[12]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+6]+1;
+			penta_node_ids[13]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+7]+1;
+			penta_node_ids[14]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+8]+1;
+			break;
+		default:
+			_error_("Finite element "<<EnumToStringx(finiteelement_type)<<" not supported yet");
 	}
 
 	/*hooks: */
-	this->SetHookNodes(penta_node_ids,6,analysis_counter); this->nodes=NULL; //set hook to nodes, for this analysis type
+	this->SetHookNodes(penta_node_ids,numnodes,analysis_counter); this->nodes=NULL; //set hook to nodes, for this analysis type
+	xDelete<int>(penta_node_ids);
 
 	/*Fill with IoModel*/
@@ -6843,23 +6872,23 @@
 ElementMatrix* Penta::CreateKMatrixDiagnosticHOViscous(void){
 
-	/*Constants*/
-	const int    numdof=NDOF2*NUMVERTICES;
-
 	/*Intermediaries */
-	int        i,j;
-	int        approximation;
-	IssmDouble xyz_list[NUMVERTICES][3];
-	IssmDouble Jdet;
-	IssmDouble viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity
-	IssmDouble epsilon[5],oldepsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
-	IssmDouble D_scalar;
-	IssmDouble D[5][5]={0.0};            // material matrix, simple scalar matrix.
-	IssmDouble B[5][numdof];
-	IssmDouble Bprime[5][numdof];
-	Tria*      tria=NULL;
+	int         i,j;
+	int         approximation;
+	IssmDouble  xyz_list[NUMVERTICES][3];
+	IssmDouble  Jdet;
+	IssmDouble  viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity
+	IssmDouble  epsilon[5],oldepsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
+	IssmDouble  D_scalar;
 	GaussPenta *gauss=NULL;
 
-	/*Initialize Element matrix*/
-	ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,HOApproximationEnum);
+	/*Fetch number of nodes and dof for this finite element*/
+	int numnodes = this->NumberofNodes();
+	int numdof   = numnodes*NDOF2;
+
+	/*Initialize Element matrix and vectors*/
+	ElementMatrix* Ke     = new ElementMatrix(nodes,numnodes,this->parameters,HOApproximationEnum);
+	IssmDouble*    B      = xNew<IssmDouble>(5*numdof);
+	IssmDouble*    Bprime = xNew<IssmDouble>(5*numdof);
+	IssmDouble*    D      = xNewZeroInit<IssmDouble>(5*5);
 
 	/*Retrieve all inputs and parameters*/
@@ -6879,6 +6908,6 @@
 
 		GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);
-		GetBHO(&B[0][0], &xyz_list[0][0], gauss);
-		GetBprimeHO(&Bprime[0][0], &xyz_list[0][0], gauss);
+		GetBHO(&B[0], &xyz_list[0][0], gauss);
+		GetBprimeHO(&Bprime[0], &xyz_list[0][0], gauss);
 
 		this->GetStrainRate3dHO(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input);
@@ -6889,17 +6918,20 @@
 
 		D_scalar=2*newviscosity*gauss->weight*Jdet;
-		for (i=0;i<5;i++) D[i][i]=D_scalar;
-
-		TripleMultiply( &B[0][0],5,numdof,1,
-					&D[0][0],5,5,0,
-					&Bprime[0][0],5,numdof,0,
+		for (i=0;i<5;i++) D[i*5+i]=D_scalar;
+
+		TripleMultiply(B,5,numdof,1,
+					D,5,5,0,
+					Bprime,5,numdof,0,
 					&Ke->values[0],1);
 	}
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYEnum);
+	TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
 
 	/*Clean up and return*/
 	delete gauss;
+	xDelete<IssmDouble>(D);
+	xDelete<IssmDouble>(Bprime);
+	xDelete<IssmDouble>(B);
 	return Ke;
 }
@@ -6908,24 +6940,26 @@
 ElementMatrix* Penta::CreateKMatrixDiagnosticHOFriction(void){
 
-	/*Constants*/
-	const int numdof   = NDOF2*NUMVERTICES;
-
 	/*Intermediaries */
-	int       i,j;
-	int       analysis_type,migration_style;
-	IssmDouble xyz_list[NUMVERTICES][3];
-	IssmDouble xyz_list_tria[NUMVERTICES2D][3]={0.0};
-	IssmDouble alpha2,Jdet;
-	IssmDouble phi=1.0;
-	IssmDouble L[2][numdof];
-	IssmDouble DL[2][2]={{ 0,0 },{0,0}}; //for basal drag
-	IssmDouble DL_scalar;
-	Friction  *friction = NULL;
-	GaussPenta *gauss=NULL;
+	int         i,j;
+	int         analysis_type,migration_style;
+	IssmDouble  xyz_list[NUMVERTICES][3];
+	IssmDouble  xyz_list_tria[NUMVERTICES2D][3]={0.};
+	IssmDouble  alpha2,Jdet;
+	IssmDouble  phi=1.0;
+	IssmDouble  DL_scalar;
+	Friction   *friction = NULL;
+	GaussPenta *gauss    = NULL;
 
 	/*Initialize Element matrix and return if necessary*/
 	if(IsFloating() || !IsOnBed()) return NULL;
 
-	ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,HOApproximationEnum);
+	/*Fetch number of nodes and dof for this finite element*/
+	int numnodes = this->NumberofNodes();
+	int numdof   = numnodes*NDOF2;
+
+	/*Initialize Element matrix and vectors*/
+	ElementMatrix* Ke     = new ElementMatrix(nodes,numnodes,this->parameters,HOApproximationEnum);
+	IssmDouble*    B      = xNew<IssmDouble>(2*numdof);
+	IssmDouble*    D      = xNewZeroInit<IssmDouble>(2*2);
 
 	/*Retrieve all inputs and parameters*/
@@ -6951,6 +6985,6 @@
 		gauss->GaussPoint(ig);
 
-		GetTriaJacobianDeterminant(&Jdet, &xyz_list_tria[0][0],gauss);
-		GetBHOFriction(&L[0][0],gauss);
+		GetTriaJacobianDeterminant(&Jdet,&xyz_list_tria[0][0],gauss);
+		GetBHOFriction(&B[0],gauss);
 
 		friction->GetAlpha2(&alpha2, gauss,VxEnum,VyEnum,VzEnum); 
@@ -6958,17 +6992,19 @@
 
 		DL_scalar=alpha2*gauss->weight*Jdet;
-		for (i=0;i<2;i++) DL[i][i]=DL_scalar;
-
-		TripleMultiply( &L[0][0],2,numdof,1,
-					&DL[0][0],2,2,0,
-					&L[0][0],2,numdof,0,
+		for (i=0;i<2;i++) D[i*2+i]=DL_scalar;
+
+		TripleMultiply(B,2,numdof,1,
+					D,2,2,0,
+					B,2,numdof,0,
 					&Ke->values[0],1);
 	}
 
 	/*Transform Coordinate System*/
-	TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYEnum);
+	TransformStiffnessMatrixCoord(Ke,nodes,numnodes,XYEnum);
 
 	/*Clean up and return*/
 	delete gauss;
+	xDelete<IssmDouble>(D);
+	xDelete<IssmDouble>(B);
 	delete friction;
 	return Ke;
Index: /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 15620)
+++ /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 15621)
@@ -45,6 +45,4 @@
 /*FUNCTION PentaRef::SetElementType{{{*/
 void PentaRef::SetElementType(int type,int type_counter){
-
-	_assert_(type==P1Enum || type==P1DGEnum);
 
 	/*initialize element type*/
@@ -143,68 +141,71 @@
 	 * where h is the interpolation function for node i.
 	 *
-	 * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
-	 */
-
-	IssmDouble dbasis[3][NUMNODESP1];
-
-	/*Get dbasis in actual coordinate system: */
-	GetNodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list, gauss);
+	 * We assume B has been allocated already, of size: 5x(NDOF2*numnodes)
+	 */
+
+
+	/*Fetch number of nodes for this finite element*/
+	int numnodes = this->NumberofNodes();
+
+	/*Get nodal functions derivatives*/
+	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
+	GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss);
 
 	/*Build B: */
-	for (int i=0;i<NUMNODESP1;i++){
-		B[NDOF2*NUMNODESP1*0+NDOF2*i+0] = dbasis[0][i];
-		B[NDOF2*NUMNODESP1*0+NDOF2*i+1] = 0.;
-
-		B[NDOF2*NUMNODESP1*1+NDOF2*i+0] = 0.;
-		B[NDOF2*NUMNODESP1*1+NDOF2*i+1] = dbasis[1][i];
-
-		B[NDOF2*NUMNODESP1*2+NDOF2*i+0] = .5*dbasis[1][i];
-		B[NDOF2*NUMNODESP1*2+NDOF2*i+1] = .5*dbasis[0][i];
-
-		B[NDOF2*NUMNODESP1*3+NDOF2*i+0] = .5*dbasis[2][i];
-		B[NDOF2*NUMNODESP1*3+NDOF2*i+1] = 0.;
-
-		B[NDOF2*NUMNODESP1*4+NDOF2*i+0] = 0.;
-		B[NDOF2*NUMNODESP1*4+NDOF2*i+1] = .5*dbasis[2][i];
-	}
-
+	for(int i=0;i<numnodes;i++){
+		B[NDOF2*numnodes*0+NDOF2*i+0] = dbasis[0*numnodes+i];
+		B[NDOF2*numnodes*0+NDOF2*i+1] = 0.;
+		B[NDOF2*numnodes*1+NDOF2*i+0] = 0.;
+		B[NDOF2*numnodes*1+NDOF2*i+1] = dbasis[1*numnodes+i];
+		B[NDOF2*numnodes*2+NDOF2*i+0] = .5*dbasis[1*numnodes+i];
+		B[NDOF2*numnodes*2+NDOF2*i+1] = .5*dbasis[0*numnodes+i];
+		B[NDOF2*numnodes*3+NDOF2*i+0] = .5*dbasis[2*numnodes+i];
+		B[NDOF2*numnodes*3+NDOF2*i+1] = 0.;
+		B[NDOF2*numnodes*4+NDOF2*i+0] = 0.;
+		B[NDOF2*numnodes*4+NDOF2*i+1] = .5*dbasis[2*numnodes+i];
+	}
+
+	/*Clean-up*/
+	xDelete<IssmDouble>(dbasis);
 }
 /*}}}*/
 /*FUNCTION PentaRef::GetBprimeHO {{{*/
-void PentaRef::GetBprimeHO(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss_coord){
+void PentaRef::GetBprimeHO(IssmDouble* B,IssmDouble* xyz_list,GaussPenta* 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
 	 * by: 
 	 *       Bi=[ 2*dh/dx     dh/dy   ]
-	 *                [   dh/dx    2*dh/dy  ]
-	 *                [ dh/dy      dh/dx    ]
-	 *                [ dh/dz         0     ]
-	 *                [  0         dh/dz    ]
+	 *          [   dh/dx    2*dh/dy  ]
+	 *          [ dh/dy      dh/dx    ]
+	 *          [ dh/dz         0     ]
+	 *          [  0         dh/dz    ]
 	 * where h is the interpolation function for node i.
 	 *
-	 * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
-	 */
-	IssmDouble dbasis[3][NUMNODESP1];
-
-	/*Get dbasis in actual coordinate system: */
-	GetNodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list, gauss_coord);
+	 * We assume B has been allocated already, of size: 5x(NDOF2*numnodes)
+	 */
+
+	/*Fetch number of nodes for this finite element*/
+	int numnodes = this->NumberofNodes();
+
+	/*Get nodal functions derivatives*/
+	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
+	GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss);
 
 	/*Build BPrime: */
-	for(int i=0;i<NUMNODESP1;i++){
-		B[NDOF2*NUMNODESP1*0+NDOF2*i+0]=2.*dbasis[0][i]; 
-		B[NDOF2*NUMNODESP1*0+NDOF2*i+1]=dbasis[1][i];
-
-		B[NDOF2*NUMNODESP1*1+NDOF2*i+0]=dbasis[0][i];
-		B[NDOF2*NUMNODESP1*1+NDOF2*i+1]=2.*dbasis[1][i];
-
-		B[NDOF2*NUMNODESP1*2+NDOF2*i+0]=dbasis[1][i]; 
-		B[NDOF2*NUMNODESP1*2+NDOF2*i+1]=dbasis[0][i]; 
-
-		B[NDOF2*NUMNODESP1*3+NDOF2*i+0]=dbasis[2][i]; 
-		B[NDOF2*NUMNODESP1*3+NDOF2*i+1]=0.;
-
-		B[NDOF2*NUMNODESP1*4+NDOF2*i+0]=0.;
-		B[NDOF2*NUMNODESP1*4+NDOF2*i+1]=dbasis[2][i]; 
-	}
+	for(int i=0;i<numnodes;i++){
+		B[NDOF2*numnodes*0+NDOF2*i+0]=2.*dbasis[0*numnodes+i]; 
+		B[NDOF2*numnodes*0+NDOF2*i+1]=dbasis[1*numnodes+i];
+		B[NDOF2*numnodes*1+NDOF2*i+0]=dbasis[0*numnodes+i];
+		B[NDOF2*numnodes*1+NDOF2*i+1]=2.*dbasis[1*numnodes+i];
+		B[NDOF2*numnodes*2+NDOF2*i+0]=dbasis[1*numnodes+i]; 
+		B[NDOF2*numnodes*2+NDOF2*i+1]=dbasis[0*numnodes+i]; 
+		B[NDOF2*numnodes*3+NDOF2*i+0]=dbasis[2*numnodes+i]; 
+		B[NDOF2*numnodes*3+NDOF2*i+1]=0.;
+		B[NDOF2*numnodes*4+NDOF2*i+0]=0.;
+		B[NDOF2*numnodes*4+NDOF2*i+1]=dbasis[2*numnodes+i]; 
+	}
+
+	/*Clean-up*/
+	xDelete<IssmDouble>(dbasis);
 }
 /*}}}*/
@@ -1183,4 +1184,7 @@
 		dbasis[numnodes*2+i]=Jinv[2][0]*dbasis_ref[0*numnodes+i]+Jinv[2][1]*dbasis_ref[1*numnodes+i]+Jinv[2][2]*dbasis_ref[2*numnodes+i];
 	}
+
+	/*Clean up*/
+	xDelete<IssmDouble>(dbasis_ref);
 
 }
@@ -1622,4 +1626,5 @@
 	switch(this->element_type){
 		case P1Enum:   return NUMNODESP1;
+		case P2Enum:   return NUMNODESP2;
 		case MINIEnum: return NUMNODESP1b;
 		default:       _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet");
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 15620)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 15621)
@@ -2320,5 +2320,5 @@
 /*}}}*/
 /*FUNCTION Tria::Update{{{*/
-void Tria::Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement_type){
+void Tria::Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finiteelement_type){
 
 	/*Intermediaries*/
@@ -2346,5 +2346,5 @@
 
 	/*Recover element type*/
-	this->SetElementType(finitelement_type,analysis_counter);
+	this->SetElementType(finiteelement_type,analysis_counter);
 
 	/*Recover vertices ids needed to initialize inputs*/
@@ -2354,5 +2354,5 @@
 
 	/*Recover nodes ids needed to initialize the node hook.*/
-	switch(finitelement_type){
+	switch(finiteelement_type){
 		case P1Enum:
 			numnodes        = 3;
@@ -2380,5 +2380,5 @@
 			break;
 		default:
-			_error_("Finite element "<<EnumToStringx(finitelement_type)<<" not supported yet");
+			_error_("Finite element "<<EnumToStringx(finiteelement_type)<<" not supported yet");
 	}
 
Index: /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp	(revision 15620)
+++ /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp	(revision 15621)
@@ -8,5 +8,5 @@
 #include "../ModelProcessorx/ModelProcessorx.h"
 
-void IoModelToConstraintsx(Constraints* constraints,IoModel* iomodel,int vector_enum,int analysis_type,int finite_element){
+void IoModelToConstraintsx(Constraints* constraints,IoModel* iomodel,int vector_enum,int analysis_type,int finite_element,int dof){
 
 	/*intermediary: */
@@ -49,5 +49,5 @@
 			if((iomodel->my_vertices[i])){
 				if (!xIsNan<IssmDouble>(spcdata[i])){
-					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,spcdata[i],analysis_type));
+					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,dof,spcdata[i],analysis_type));
 					count++;
 				}
@@ -61,5 +61,5 @@
 					if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,
-										1,(spcdata[v1]+spcdata[v2])/2.,analysis_type));
+										dof,(spcdata[v1]+spcdata[v2])/2.,analysis_type));
 						count++;
 					}
@@ -90,5 +90,5 @@
 
 				if(spcpresent){
-					constraints->AddObject(new SpcTransient(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,N,times,values,analysis_type));
+					constraints->AddObject(new SpcTransient(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,dof,N,times,values,analysis_type));
 					count++;
 				}
@@ -108,5 +108,5 @@
 					}
 					if(spcpresent){
-						constraints->AddObject(new SpcTransient(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,1,
+						constraints->AddObject(new SpcTransient(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,dof,
 										N,times,values,analysis_type));
 						count++;
Index: /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.h	(revision 15620)
+++ /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.h	(revision 15621)
@@ -8,5 +8,5 @@
 
 /* local prototypes: */
-void IoModelToConstraintsx(Constraints* constraints,IoModel* iomodel,int vector_enum,int analysis_type,int finite_element);
+void IoModelToConstraintsx(Constraints* constraints,IoModel* iomodel,int vector_enum,int analysis_type,int finite_element,int dof=1);
 
 #endif  /* _IOMODELTOELEMENTINPUTX_H */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateEdges.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateEdges.cpp	(revision 15620)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateEdges.cpp	(revision 15621)
@@ -82,5 +82,5 @@
 				if(edgestemp[e*2+1]==v2+1){
 					exist = true;
-					element_edge_connectivity[i*elementnbv+j]=e;
+					element_edge_connectivity[i*elementnbe+j]=e;
 					break;
 				}
@@ -96,5 +96,5 @@
 
 				/*Update Connectivity*/
-				element_edge_connectivity[i*elementnbv+j]=nbe;
+				element_edge_connectivity[i*elementnbe+j]=nbe;
 
 				/*Update chain*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 15620)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 15621)
@@ -13,10 +13,9 @@
 	int        i,j;
 	int        count;
-	IssmDouble yts;
 	IssmDouble g;
 	IssmDouble rho_ice;
 	IssmDouble FSreconditioning;
 	bool       isSSA,isL1L2,isHO,isFS;
-	int        fe_ssa;
+	int        fe_ssa,fe_ho;
 	bool       spcpresent = false;
 	int        Mx,Nx;
@@ -44,5 +43,4 @@
 
 	/*Fetch parameters: */
-	iomodel->Constant(&yts,ConstantsYtsEnum);
 	iomodel->Constant(&g,ConstantsGEnum);
 	iomodel->Constant(&rho_ice,MaterialsRhoIceEnum);
@@ -53,4 +51,5 @@
 	iomodel->Constant(&isFS,FlowequationIsFSEnum);
 	iomodel->Constant(&fe_ssa,FlowequationFeSSAEnum);
+	iomodel->Constant(&fe_ho,FlowequationFeHOEnum);
 
 	/*Recover pointer: */
@@ -108,9 +107,9 @@
 						count++;
 						if (!xIsNan<IssmDouble>(spcvx[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,spcvx[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
-							count++;
-						}
-						if (!xIsNan<IssmDouble>(spcvy[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,4,spcvy[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,spcvx[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							count++;
+						}
+						if (!xIsNan<IssmDouble>(spcvy[i])){
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,4,spcvy[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 							count++;
 						}
@@ -123,9 +122,9 @@
 						count++;
 						if (!xIsNan<IssmDouble>(spcvx[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,spcvx[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
-							count++;
-						}
-						if (!xIsNan<IssmDouble>(spcvy[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,spcvy[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,spcvx[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							count++;
+						}
+						if (!xIsNan<IssmDouble>(spcvy[i])){
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,spcvy[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 							count++;
 						}
@@ -145,9 +144,9 @@
 						count++;
 						if (!xIsNan<IssmDouble>(spcvx[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,spcvx[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
-							count++;
-						}
-						if (!xIsNan<IssmDouble>(spcvy[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,spcvy[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,spcvx[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							count++;
+						}
+						if (!xIsNan<IssmDouble>(spcvy[i])){
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,spcvy[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 							count++;
 						}
@@ -160,13 +159,13 @@
 						count++;
 						if (!xIsNan<IssmDouble>(spcvx[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,spcvx[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
-							count++;
-						}
-						if (!xIsNan<IssmDouble>(spcvy[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,4,spcvy[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,spcvx[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							count++;
+						}
+						if (!xIsNan<IssmDouble>(spcvy[i])){
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,4,spcvy[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 							count++;
 						}
 						if (!xIsNan<IssmDouble>(spcvz[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,5,spcvz[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,5,spcvz[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 							count++;
 						}
@@ -185,9 +184,9 @@
 						count++;
 						if (!xIsNan<IssmDouble>(spcvx[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,spcvx[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
-							count++;
-						}
-						if (!xIsNan<IssmDouble>(spcvy[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,spcvy[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,spcvx[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							count++;
+						}
+						if (!xIsNan<IssmDouble>(spcvy[i])){
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,spcvy[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 							count++;
 						}
@@ -200,13 +199,13 @@
 						count++;
 						if (!xIsNan<IssmDouble>(spcvx[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,spcvx[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
-							count++;
-						}
-						if (!xIsNan<IssmDouble>(spcvy[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,4,spcvy[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,spcvx[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							count++;
+						}
+						if (!xIsNan<IssmDouble>(spcvy[i])){
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,4,spcvy[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 							count++;
 						}
 						if (!xIsNan<IssmDouble>(spcvz[i])){
-							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,5,spcvz[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,5,spcvz[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 							count++;
 						}
@@ -217,5 +216,5 @@
 			else{
 				if (Mx==iomodel->numberofvertices && !xIsNan<IssmDouble>(spcvx[i])){
-					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,spcvx[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,spcvx[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 					count++;
 
@@ -226,5 +225,5 @@
 					spcpresent=false;
 					for(j=0;j<Nx;j++){
-						values[j]=spcvx[i*Nx+j]/yts;
+						values[j]=spcvx[i*Nx+j];
 						if(!xIsNan<IssmDouble>(values[j]))spcpresent=true; //NaN means no spc by default
 					}
@@ -242,5 +241,5 @@
 
 				if (My==iomodel->numberofvertices && !xIsNan<IssmDouble>(spcvy[i])){
-					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,spcvy[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vy.
+					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,spcvy[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vy.
 					count++;
 				}
@@ -250,5 +249,5 @@
 					spcpresent=false;
 					for(j=0;j<Ny;j++){
-						values[j]=spcvy[i*Ny+j]/yts;
+						values[j]=spcvy[i*Ny+j];
 						if(!xIsNan<IssmDouble>(values[j]))spcpresent=true; //NaN means no spc by default
 					}
@@ -266,5 +265,5 @@
 				if (reCast<int,IssmDouble>(vertices_type[i])==FSApproximationEnum ||  (reCast<int,IssmDouble>(vertices_type[i])==NoneApproximationEnum)){
 					if (Mz==iomodel->numberofvertices && !xIsNan<IssmDouble>(spcvz[i])){
-						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,spcvz[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 2 to vy
+						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,spcvz[i],DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 2 to vy
 						count++;
 					}
@@ -274,5 +273,5 @@
 						spcpresent=false;
 						for(j=0;j<Nz;j++){
-							values[j]=spcvz[i*Nz+j]/yts;
+							values[j]=spcvz[i*Nz+j];
 							if(!xIsNan<IssmDouble>(values[j]))spcpresent=true; //NaN means no spc by default
 						}
@@ -313,5 +312,5 @@
 
 	/*SPC Quadratic elements*/
-	if(isSSA && fe_ssa==1){
+	if((isSSA && fe_ssa==1) || (isHO && fe_ho==1)){
 
 		int   v1,v2;
@@ -330,10 +329,10 @@
 				if(!xIsNan<IssmDouble>(spcvx[v1]) && !xIsNan<IssmDouble>(spcvx[v2])){
 					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,
-									1,(spcvx[v1]+spcvx[v2])/(2.*yts),DiagnosticHorizAnalysisEnum));
+									1,(spcvx[v1]+spcvx[v2])/(2.),DiagnosticHorizAnalysisEnum));
 					count++;
 				}
 				if(!xIsNan<IssmDouble>(spcvy[v1]) && !xIsNan<IssmDouble>(spcvy[v2])){
 					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,
-									2,(spcvy[v1]+spcvy[v2])/(2.*yts),DiagnosticHorizAnalysisEnum));
+									2,(spcvy[v1]+spcvy[v2])/(2.),DiagnosticHorizAnalysisEnum));
 					count++;
 				}
@@ -341,5 +340,5 @@
 					if(!xIsNan<IssmDouble>(spcvz[v1]) && !xIsNan<IssmDouble>(spcvz[v2])){
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,
-										3,(spcvz[v1]+spcvz[v2])/(2.*yts),DiagnosticHorizAnalysisEnum));
+										3,(spcvz[v1]+spcvz[v2])/(2.),DiagnosticHorizAnalysisEnum));
 						count++;
 					}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 15620)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 15621)
@@ -49,5 +49,10 @@
 		else if(isHO){
 			approximation = HOApproximationEnum;
-			finiteelement = P1Enum;
+			iomodel->Constant(&temp,FlowequationFeHOEnum);
+			switch(temp){
+				case 0 : finiteelement = P1Enum; break;
+				case 1 : finiteelement = P2Enum; break;
+				default: _error_("finite element "<<temp<<" not supported");
+			}
 		}
 		else if(isFS){
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp	(revision 15620)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp	(revision 15621)
@@ -54,5 +54,10 @@
 		}
 		else if(isHO){
-			finiteelement = P1Enum;
+			iomodel->Constant(&temp,FlowequationFeHOEnum);
+			switch(temp){
+				case 0 : finiteelement = P1Enum; break;
+				case 1 : finiteelement = P2Enum; break;
+				default: _error_("finite element "<<temp<<" not supported");
+			}
 		}
 		else if(isFS){
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 15620)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 15621)
@@ -72,6 +72,7 @@
 	FlowequationIsHOEnum,
 	FlowequationIsFSEnum,
+	FlowequationFeSSAEnum,
+	FlowequationFeHOEnum,
 	FlowequationFeFSEnum,
-	FlowequationFeSSAEnum,
 	FlowequationVertexEquationEnum,
 	FrictionCoefficientEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 15620)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 15621)
@@ -80,6 +80,7 @@
 		case FlowequationIsHOEnum : return "FlowequationIsHO";
 		case FlowequationIsFSEnum : return "FlowequationIsFS";
+		case FlowequationFeSSAEnum : return "FlowequationFeSSA";
+		case FlowequationFeHOEnum : return "FlowequationFeHO";
 		case FlowequationFeFSEnum : return "FlowequationFeFS";
-		case FlowequationFeSSAEnum : return "FlowequationFeSSA";
 		case FlowequationVertexEquationEnum : return "FlowequationVertexEquation";
 		case FrictionCoefficientEnum : return "FrictionCoefficient";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 15620)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 15621)
@@ -80,6 +80,7 @@
 	      else if (strcmp(name,"FlowequationIsHO")==0) return FlowequationIsHOEnum;
 	      else if (strcmp(name,"FlowequationIsFS")==0) return FlowequationIsFSEnum;
+	      else if (strcmp(name,"FlowequationFeSSA")==0) return FlowequationFeSSAEnum;
+	      else if (strcmp(name,"FlowequationFeHO")==0) return FlowequationFeHOEnum;
 	      else if (strcmp(name,"FlowequationFeFS")==0) return FlowequationFeFSEnum;
-	      else if (strcmp(name,"FlowequationFeSSA")==0) return FlowequationFeSSAEnum;
 	      else if (strcmp(name,"FlowequationVertexEquation")==0) return FlowequationVertexEquationEnum;
 	      else if (strcmp(name,"FrictionCoefficient")==0) return FrictionCoefficientEnum;
@@ -136,9 +137,9 @@
 	      else if (strcmp(name,"InversionIscontrol")==0) return InversionIscontrolEnum;
 	      else if (strcmp(name,"InversionTao")==0) return InversionTaoEnum;
-	      else if (strcmp(name,"InversionIncompleteAdjoint")==0) return InversionIncompleteAdjointEnum;
          else stage=2;
    }
    if(stage==2){
-	      if (strcmp(name,"InversionMaxParameters")==0) return InversionMaxParametersEnum;
+	      if (strcmp(name,"InversionIncompleteAdjoint")==0) return InversionIncompleteAdjointEnum;
+	      else if (strcmp(name,"InversionMaxParameters")==0) return InversionMaxParametersEnum;
 	      else if (strcmp(name,"InversionMaxiterPerStep")==0) return InversionMaxiterPerStepEnum;
 	      else if (strcmp(name,"InversionMinParameters")==0) return InversionMinParametersEnum;
@@ -259,9 +260,9 @@
 	      else if (strcmp(name,"ThermalIsenthalpy")==0) return ThermalIsenthalpyEnum;
 	      else if (strcmp(name,"GiaMantleViscosity")==0) return GiaMantleViscosityEnum;
-	      else if (strcmp(name,"GiaLithosphereThickness")==0) return GiaLithosphereThicknessEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"Thickness")==0) return ThicknessEnum;
+	      if (strcmp(name,"GiaLithosphereThickness")==0) return GiaLithosphereThicknessEnum;
+	      else if (strcmp(name,"Thickness")==0) return ThicknessEnum;
 	      else if (strcmp(name,"TimesteppingStartTime")==0) return TimesteppingStartTimeEnum;
 	      else if (strcmp(name,"TimesteppingFinalTime")==0) return TimesteppingFinalTimeEnum;
@@ -382,9 +383,9 @@
 	      else if (strcmp(name,"VectorParam")==0) return VectorParamEnum;
 	      else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
-	      else if (strcmp(name,"RiftfrontType")==0) return RiftfrontTypeEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"Segment")==0) return SegmentEnum;
+	      if (strcmp(name,"RiftfrontType")==0) return RiftfrontTypeEnum;
+	      else if (strcmp(name,"Segment")==0) return SegmentEnum;
 	      else if (strcmp(name,"SegmentRiftfront")==0) return SegmentRiftfrontEnum;
 	      else if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
@@ -505,9 +506,9 @@
 	      else if (strcmp(name,"MINI")==0) return MINIEnum;
 	      else if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum;
-	      else if (strcmp(name,"TaylorHood")==0) return TaylorHoodEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
+	      if (strcmp(name,"TaylorHood")==0) return TaylorHoodEnum;
+	      else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
 	      else if (strcmp(name,"BoolElementResult")==0) return BoolElementResultEnum;
 	      else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
Index: /issm/trunk-jpl/src/m/classes/flowequation.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/flowequation.m	(revision 15620)
+++ /issm/trunk-jpl/src/m/classes/flowequation.m	(revision 15621)
@@ -12,4 +12,5 @@
 		isFS             = 0;
 		fe_SSA           = 0;
+		fe_HO            = 0;
 		fe_FS            = 0;
 		vertex_equation  = NaN;
@@ -78,4 +79,7 @@
 				md = checkfield(md,'flowequation.isHO','numel',[1],'values',[0 1]);
 				md = checkfield(md,'flowequation.isFS','numel',[1],'values',[0 1]);
+				md = checkfield(md,'flowequation.fe_SSA','numel',[1],'values',[0 1]);
+				md = checkfield(md,'flowequation.fe_HO','numel',[1],'values',[0 1]);
+				md = checkfield(md,'flowequation.fe_FS','numel',[1],'values',[0]);
 				md = checkfield(md,'flowequation.borderSSA','size',[md.mesh.numberofvertices 1],'values',[0 1]);
 				md = checkfield(md,'flowequation.borderHO','size',[md.mesh.numberofvertices 1],'values',[0 1]);
@@ -123,6 +127,7 @@
 			WriteData(fid,'object',obj,'fieldname','isHO','format','Boolean');
 			WriteData(fid,'object',obj,'fieldname','isFS','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','fe_SSA','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','fe_HO','format','Integer');
 			WriteData(fid,'object',obj,'fieldname','fe_FS','format','Integer');
-			WriteData(fid,'object',obj,'fieldname','fe_SSA','format','Integer');
 			WriteData(fid,'object',obj,'fieldname','borderSSA','format','DoubleMat','mattype',1);
 			WriteData(fid,'object',obj,'fieldname','borderHO','format','DoubleMat','mattype',1);
Index: /issm/trunk-jpl/src/m/classes/flowequation.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/flowequation.py	(revision 15620)
+++ /issm/trunk-jpl/src/m/classes/flowequation.py	(revision 15621)
@@ -22,4 +22,5 @@
 		self.isFS             = 0
 		self.fe_SSA           = 0
+		self.fe_HO            = 0
 		self.fe_FS            = 0
 		self.vertex_equation  = float('NaN')
@@ -60,4 +61,7 @@
 			md = checkfield(md,'flowequation.isHO','numel',[1],'values',[0,1])
 			md = checkfield(md,'flowequation.isFS','numel',[1],'values',[0,1])
+			md = checkfield(md,'flowequation.fe_SSA','numel',[1],'values',[0,1])
+			md = checkfield(md,'flowequation.fe_HO','numel',[1],'values',[0,1])
+			md = checkfield(md,'flowequation.fe_FS','numel',[1],'values',[0])
 			md = checkfield(md,'flowequation.borderSSA','size',[md.mesh.numberofvertices],'values',[0,1])
 			md = checkfield(md,'flowequation.borderHO','size',[md.mesh.numberofvertices],'values',[0,1])
@@ -85,6 +89,7 @@
 		WriteData(fid,'object',self,'fieldname','isHO','format','Boolean')
 		WriteData(fid,'object',self,'fieldname','isFS','format','Boolean')
+		WriteData(fid,'object',self,'fieldname','fe_SSA','format','Integer')
+		WriteData(fid,'object',self,'fieldname','fe_HO','format','Integer')
 		WriteData(fid,'object',self,'fieldname','fe_FS','format','Integer')
-		WriteData(fid,'object',self,'fieldname','fe_SSA','format','Integer')
 		WriteData(fid,'object',self,'fieldname','borderSSA','format','DoubleMat','mattype',1)
 		WriteData(fid,'object',self,'fieldname','borderHO','format','DoubleMat','mattype',1)
Index: /issm/trunk-jpl/src/m/classes/stressbalance.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/stressbalance.m	(revision 15620)
+++ /issm/trunk-jpl/src/m/classes/stressbalance.m	(revision 15621)
@@ -153,7 +153,10 @@
 		end % }}}
 		function marshall(obj,md,fid) % {{{
-			WriteData(fid,'object',obj,'class','diagnostic','fieldname','spcvx','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
-			WriteData(fid,'object',obj,'class','diagnostic','fieldname','spcvy','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
-			WriteData(fid,'object',obj,'class','diagnostic','fieldname','spcvz','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+
+			yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'object',obj,'class','diagnostic','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',obj,'class','diagnostic','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',obj,'class','diagnostic','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
 			WriteData(fid,'object',obj,'class','diagnostic','fieldname','restol','format','Double');
 			WriteData(fid,'object',obj,'class','diagnostic','fieldname','reltol','format','Double');
Index: /issm/trunk-jpl/src/m/classes/stressbalance.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/stressbalance.py	(revision 15620)
+++ /issm/trunk-jpl/src/m/classes/stressbalance.py	(revision 15621)
@@ -154,7 +154,10 @@
 	# }}}
 	def marshall(self,md,fid):    # {{{
-		WriteData(fid,'object',self,'class','diagnostic','fieldname','spcvx','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
-		WriteData(fid,'object',self,'class','diagnostic','fieldname','spcvy','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
-		WriteData(fid,'object',self,'class','diagnostic','fieldname','spcvz','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+
+		yts=365.0*24.0*3600.0
+
+		WriteData(fid,'object',self,'class','diagnostic','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+		WriteData(fid,'object',self,'class','diagnostic','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+		WriteData(fid,'object',self,'class','diagnostic','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
 		WriteData(fid,'object',self,'class','diagnostic','fieldname','restol','format','Double')
 		WriteData(fid,'object',self,'class','diagnostic','fieldname','reltol','format','Double')
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 15620)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 15621)
@@ -891,4 +891,32 @@
 	return StringToEnum('FlowequationIsFS')[0]
 
+def FlowequationFeSSAEnum():
+	"""
+	FLOWEQUATIONFESSAENUM - Enum of FlowequationFeSSA
+
+	WARNING: DO NOT MODIFY THIS FILE
+				this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+				Please read src/c/shared/Enum/README for more information
+
+	   Usage:
+	      macro=FlowequationFeSSAEnum()
+	"""
+
+	return StringToEnum('FlowequationFeSSA')[0]
+
+def FlowequationFeHOEnum():
+	"""
+	FLOWEQUATIONFEHOENUM - Enum of FlowequationFeHO
+
+	WARNING: DO NOT MODIFY THIS FILE
+				this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+				Please read src/c/shared/Enum/README for more information
+
+	   Usage:
+	      macro=FlowequationFeHOEnum()
+	"""
+
+	return StringToEnum('FlowequationFeHO')[0]
+
 def FlowequationFeFSEnum():
 	"""
@@ -905,18 +933,4 @@
 	return StringToEnum('FlowequationFeFS')[0]
 
-def FlowequationFeSSAEnum():
-	"""
-	FLOWEQUATIONFESSAENUM - Enum of FlowequationFeSSA
-
-	WARNING: DO NOT MODIFY THIS FILE
-				this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
-				Please read src/c/shared/Enum/README for more information
-
-	   Usage:
-	      macro=FlowequationFeSSAEnum()
-	"""
-
-	return StringToEnum('FlowequationFeSSA')[0]
-
 def FlowequationVertexEquationEnum():
 	"""
@@ -7931,4 +7945,4 @@
 	"""
 
-	return 565
-
+	return 566
+
Index: /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m	(revision 15620)
+++ /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m	(revision 15621)
@@ -9,3 +9,3 @@
 %      macro=MaximumNumberOfEnums()
 
-macro=565;
+macro=566;
