Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 15635)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 15636)
@@ -3177,4 +3177,17 @@
 			penta_node_ids[4]=iomodel->nodecounter+iomodel->elements[6*index+4];
 			penta_node_ids[5]=iomodel->nodecounter+iomodel->elements[6*index+5];
+			break;
+		case P1xP2Enum:
+			numnodes         = 9;
+			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;
 			break;
 		case P2xP1Enum:
Index: /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 15635)
+++ /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 15636)
@@ -19,4 +19,5 @@
 #define NUMNODESP1_2d 3
 #define NUMNODESP1b   7
+#define NUMNODESP1xP2 9
 #define NUMNODESP2xP1 12
 #define NUMNODESP2    15
@@ -1129,4 +1130,17 @@
 			basis[10]=4.*gauss->coord3*gauss->coord1*(1.+gauss->coord4)/2.;
 			basis[11]=4.*gauss->coord1*gauss->coord2*(1.+gauss->coord4)/2.;
+			return;
+		case P1xP2Enum:
+			/*Corner nodes*/
+			basis[ 0]=gauss->coord1*gauss->coord4*(gauss->coord4-1.)/2.;
+			basis[ 1]=gauss->coord2*gauss->coord4*(gauss->coord4-1.)/2.;
+			basis[ 2]=gauss->coord3*gauss->coord4*(gauss->coord4-1.)/2.;
+			basis[ 3]=gauss->coord1*gauss->coord4*(gauss->coord4+1.)/2.;
+			basis[ 4]=gauss->coord2*gauss->coord4*(gauss->coord4+1.)/2.;
+			basis[ 5]=gauss->coord3*gauss->coord4*(gauss->coord4+1.)/2.;
+			/*mid-sides of quads*/
+			basis[ 6]=gauss->coord1*(1.-gauss->coord4*gauss->coord4);
+			basis[ 7]=gauss->coord2*(1.-gauss->coord4*gauss->coord4);
+			basis[ 8]=gauss->coord3*(1.-gauss->coord4*gauss->coord4);
 			return;
 		case P2Enum:
@@ -1309,4 +1323,43 @@
 			dbasis[NUMNODESP2xP1*2+11] = 2.*gauss->coord1*gauss->coord2;
 			return;
+		case P1xP2Enum:
+			/*Nodal function 1*/
+			dbasis[NUMNODESP1xP2*0+0]   = zeta*(zeta-1.)/4.;
+			dbasis[NUMNODESP1xP2*1+0]   = SQRT3/12.*zeta*(zeta-1.);
+			dbasis[NUMNODESP1xP2*2+0]   = .5*(1.-2.*zeta)*gauss->coord1;
+			/*Nodal function 2*/
+			dbasis[NUMNODESP1xP2*0+1]   = zeta*(1.-zeta)/4.;
+			dbasis[NUMNODESP1xP2*1+1]   = SQRT3/12.*zeta*(zeta-1);
+			dbasis[NUMNODESP1xP2*2+1]   = .5*(1.-2.*zeta)*gauss->coord2;
+			/*Nodal function 3*/
+			dbasis[NUMNODESP1xP2*0+2]   = 0.;
+			dbasis[NUMNODESP1xP2*1+2]   = SQRT3/6.*zeta*(1.-zeta);
+			dbasis[NUMNODESP1xP2*2+2]   = .5*(1.-2.*zeta)*gauss->coord3;
+			/*Nodal function 4*/
+			dbasis[NUMNODESP1xP2*0+3]   = -zeta*(1.+zeta)/4.;
+			dbasis[NUMNODESP1xP2*1+3]   = -SQRT3/12.*(1.+zeta);
+			dbasis[NUMNODESP1xP2*2+3]   = .5*(1.+2.*zeta)*gauss->coord1;
+			/*Nodal function 5*/
+			dbasis[NUMNODESP1xP2*0+4]   = zeta*(1.+zeta)/4.;
+			dbasis[NUMNODESP1xP2*1+4]   = -SQRT3/12.*zeta*(1.+zeta);
+			dbasis[NUMNODESP1xP2*2+4]   = .5*(1.+2.*zeta)*gauss->coord2;
+			/*Nodal function 6*/
+			dbasis[NUMNODESP1xP2*0+5]   = 0.;
+			dbasis[NUMNODESP1xP2*1+5]   = SQRT3/6.*zeta*(1.+zeta);
+			dbasis[NUMNODESP1xP2*2+5]   = .5*(1.+2.*zeta)*gauss->coord3;
+
+			/*Nodal function 7*/
+			dbasis[NUMNODESP1xP2*0+6 ] = -0.5*(1.-zeta*zeta);
+			dbasis[NUMNODESP1xP2*1+6 ] = -SQRT3/6.*(1.-zeta*zeta);
+			dbasis[NUMNODESP1xP2*2+6 ] = -2.*zeta*gauss->coord1;
+			/*Nodal function 8*/
+			dbasis[NUMNODESP1xP2*0+7 ] = 0.5*(1.-zeta*zeta);
+			dbasis[NUMNODESP1xP2*1+7 ] = -SQRT3/6.*(1.-zeta*zeta);
+			dbasis[NUMNODESP1xP2*2+7 ] = -2.*zeta*gauss->coord2;
+			/*Nodal function 9*/
+			dbasis[NUMNODESP1xP2*0+8 ] = 0.;
+			dbasis[NUMNODESP1xP2*1+8 ] = SQRT3/3.*(1.-zeta*zeta);
+			dbasis[NUMNODESP1xP2*2+8 ] = -2.*zeta*gauss->coord3;
+			return;
 		case P2Enum:
 			/*Nodal function 1*/
@@ -1628,4 +1681,5 @@
 		case P2Enum:    return NUMNODESP2;
 		case P2xP1Enum: return NUMNODESP2xP1;
+		case P1xP2Enum: return NUMNODESP1xP2;
 		case MINIEnum:  return NUMNODESP1b;
 		default:       _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet");
Index: /issm/trunk-jpl/src/c/classes/gauss/GaussPenta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/gauss/GaussPenta.cpp	(revision 15635)
+++ /issm/trunk-jpl/src/c/classes/gauss/GaussPenta.cpp	(revision 15636)
@@ -415,4 +415,19 @@
 			}
 			break;
+		case 9: //P1xP2 Lagrange element
+			switch(iv){
+				case 0: coord1=1.; coord2=0.; coord3=0.; coord4=-1.; break;
+				case 1: coord1=0.; coord2=1.; coord3=0.; coord4=-1.; break;
+				case 2: coord1=0.; coord2=0.; coord3=1.; coord4=-1.; break;
+				case 3: coord1=1.; coord2=0.; coord3=0.; coord4=+1.; break;
+				case 4: coord1=0.; coord2=1.; coord3=0.; coord4=+1.; break;
+				case 5: coord1=0.; coord2=0.; coord3=1.; coord4=+1.; break;
+
+				case 6: coord1=1.; coord2=0.; coord3=0.; coord4=0.; break;
+				case 7: coord1=0.; coord2=1.; coord3=0.; coord4=0.; break;
+				case 8: coord1=0.; coord2=0.; coord3=1.; coord4=0.; break;
+				default: _error_("node index should be in [0 5]");
+			}
+			break;
 		case 12: //P2xP1 Lagrange element
 			switch(iv){
Index: /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp	(revision 15635)
+++ /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp	(revision 15636)
@@ -42,8 +42,11 @@
 			/*Nothing else to do*/
 			break;
-		case P2Enum:
+		case P1xP2Enum:
 			EdgesPartitioning(&my_edges,iomodel);
 			break;
 		case P2xP1Enum:
+			EdgesPartitioning(&my_edges,iomodel);
+			break;
+		case P2Enum:
 			EdgesPartitioning(&my_edges,iomodel);
 			break;
@@ -82,4 +85,27 @@
 											dof,(spcdata[v1]+spcdata[v2])/2.,analysis_type));
 							count++;
+						}
+					}
+				}
+				break;
+			case P1xP2Enum:
+				for(i=0;i<iomodel->numberofvertices;i++){
+					if((iomodel->my_vertices[i])){
+						if (!xIsNan<IssmDouble>(spcdata[i])){
+							constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,dof,spcdata[i],analysis_type));
+							count++;
+						}
+					}
+				}
+				for(i=0;i<iomodel->numberofedges;i++){
+					if(iomodel->edges[i*3+2]==2){
+						if(my_edges[i]){
+							v1 = iomodel->edges[3*i+0]-1;
+							v2 = iomodel->edges[3*i+1]-1;
+							if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){
+								constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,
+												dof,(spcdata[v1]+spcdata[v2])/2.,analysis_type));
+								count++;
+							}
 						}
 					}
@@ -177,4 +203,44 @@
 						}
 						xDelete<IssmDouble>(values);
+					}
+				}
+				break;
+			case P1xP2Enum:
+				for(i=0;i<iomodel->numberofvertices;i++){
+					if((iomodel->my_vertices[i])){
+
+						/*figure out times and values: */
+						values=xNew<IssmDouble>(N);
+						spcpresent=false;
+						for(j=0;j<N;j++){
+							values[j]=spcdata[i*N+j];
+							if(!xIsNan<IssmDouble>(values[j]))spcpresent=true; //NaN means no spc by default
+						}
+
+						if(spcpresent){
+							constraints->AddObject(new SpcTransient(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,dof,N,times,values,analysis_type));
+							count++;
+						}
+						xDelete<IssmDouble>(values);
+					}
+				}
+				for(i=0;i<iomodel->numberofedges;i++){
+					if(iomodel->edges[i*3+2]==2){
+						if(my_edges[i]){
+							v1 = iomodel->edges[3*i+0]-1;
+							v2 = iomodel->edges[3*i+1]-1;
+							values=xNew<IssmDouble>(N);
+							spcpresent=false;
+							for(j=0;j<N;j++){
+								values[j]=(spcdata[v1*N+j]+spcdata[v2*N+j])/2.;
+								if(!xIsNan<IssmDouble>(values[j])) spcpresent=true; //NaN means no spc by default
+							}
+							if(spcpresent){
+								constraints->AddObject(new SpcTransient(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,dof,
+												N,times,values,analysis_type));
+								count++;
+							}
+							xDelete<IssmDouble>(values);
+						}
 					}
 				}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp	(revision 15635)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp	(revision 15636)
@@ -44,4 +44,23 @@
 			break;
 
+		case P1xP2Enum:
+			EdgesPartitioning(&my_edges,iomodel);
+			for(i=0;i<iomodel->numberofvertices;i++){
+				if(iomodel->my_vertices[i]){
+					nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i,iomodel,analysis,approximation));
+				}
+			}
+
+			counter = iomodel->numberofvertices;
+			for(i=0;i<iomodel->numberofedges;i++){
+				if(iomodel->edges[i*3+2]==2){
+					if(my_edges[i]){
+						node = new Node(iomodel->nodecounter+iomodel->numberofvertices+i+1,counter+1,0,iomodel,analysis,approximation);
+						nodes->AddObject(node);
+					}
+					counter++;
+				}
+			}
+			break;
 		case P2xP1Enum:
 			EdgesPartitioning(&my_edges,iomodel);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 15635)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 15636)
@@ -88,4 +88,5 @@
 				case 1 : finiteelement = P2Enum;    break;
 				case 2 : finiteelement = P2xP1Enum; break;
+				case 3 : finiteelement = P1xP2Enum; break;
 				default: _error_("finite element "<<temp<<" not supported");
 			}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 15635)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 15636)
@@ -54,4 +54,5 @@
 				case 1 : finiteelement = P2Enum;    break;
 				case 2 : finiteelement = P2xP1Enum; break;
+				case 3 : finiteelement = P1xP2Enum; break;
 				default: _error_("finite element "<<temp<<" not supported");
 			}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp	(revision 15635)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp	(revision 15636)
@@ -59,4 +59,5 @@
 				case 1 : finiteelement = P2Enum;    break;
 				case 2 : finiteelement = P2xP1Enum; break;
+				case 3 : finiteelement = P1xP2Enum; break;
 				default: _error_("finite element "<<temp<<" not supported");
 			}
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 15635)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 15636)
@@ -503,4 +503,5 @@
 	P2Enum,
 	P2xP1Enum,
+	P1xP2Enum,
 	MINIEnum,
 	MINIcondensedEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 15635)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 15636)
@@ -495,4 +495,5 @@
 		case P2Enum : return "P2";
 		case P2xP1Enum : return "P2xP1";
+		case P1xP2Enum : return "P1xP2";
 		case MINIEnum : return "MINI";
 		case MINIcondensedEnum : return "MINIcondensed";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 15635)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 15636)
@@ -504,10 +504,11 @@
 	      else if (strcmp(name,"P2")==0) return P2Enum;
 	      else if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
+	      else if (strcmp(name,"P1xP2")==0) return P1xP2Enum;
 	      else if (strcmp(name,"MINI")==0) return MINIEnum;
-	      else if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"TaylorHood")==0) return TaylorHoodEnum;
+	      if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum;
+	      else if (strcmp(name,"TaylorHood")==0) return TaylorHoodEnum;
 	      else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
 	      else if (strcmp(name,"BoolElementResult")==0) return BoolElementResultEnum;
Index: /issm/trunk-jpl/src/m/classes/flowequation.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/flowequation.m	(revision 15635)
+++ /issm/trunk-jpl/src/m/classes/flowequation.m	(revision 15636)
@@ -80,5 +80,5 @@
 				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 2]);
+				md = checkfield(md,'flowequation.fe_HO','numel',[1],'values',[0:3]);
 				md = checkfield(md,'flowequation.fe_FS','numel',[1],'values',[0]);
 				md = checkfield(md,'flowequation.borderSSA','size',[md.mesh.numberofvertices 1],'values',[0 1]);
Index: /issm/trunk-jpl/src/m/classes/flowequation.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/flowequation.py	(revision 15635)
+++ /issm/trunk-jpl/src/m/classes/flowequation.py	(revision 15636)
@@ -62,5 +62,5 @@
 			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_HO','numel',[1],'values',numpy.arange(0,3+1))
 			md = checkfield(md,'flowequation.fe_FS','numel',[1],'values',[0])
 			md = checkfield(md,'flowequation.borderSSA','size',[md.mesh.numberofvertices],'values',[0,1])
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 15635)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 15636)
@@ -6701,4 +6701,18 @@
 	return StringToEnum('P2xP1')[0]
 
+def P1xP2Enum():
+	"""
+	P1XP2ENUM - Enum of P1xP2
+
+	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=P1xP2Enum()
+	"""
+
+	return StringToEnum('P1xP2')[0]
+
 def MINIEnum():
 	"""
@@ -7945,4 +7959,4 @@
 	"""
 
-	return 566
-
+	return 567
+
Index: sm/trunk-jpl/src/m/enum/IcelevelsetEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/IcelevelsetEnum.m	(revision 15635)
+++ 	(revision )
@@ -1,11 +1,0 @@
-function macro=IcelevelsetEnum()
-%ICELEVELSETENUM - Enum of Icelevelset
-%
-%   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=IcelevelsetEnum()
-
-macro=StringToEnum('Icelevelset');
Index: /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m	(revision 15635)
+++ /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m	(revision 15636)
@@ -9,3 +9,3 @@
 %      macro=MaximumNumberOfEnums()
 
-macro=566;
+macro=567;
Index: /issm/trunk-jpl/src/m/enum/P1xP2Enum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/P1xP2Enum.m	(revision 15636)
+++ /issm/trunk-jpl/src/m/enum/P1xP2Enum.m	(revision 15636)
@@ -0,0 +1,11 @@
+function macro=P1xP2Enum()
+%P1XP2ENUM - Enum of P1xP2
+%
+%   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=P1xP2Enum()
+
+macro=StringToEnum('P1xP2');
