Index: /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 6140)
+++ /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 6141)
@@ -83,4 +83,5 @@
 	MacAyealApproximationEnum,
 	MacAyealPattynApproximationEnum,
+	MacAyealStokesApproximationEnum,
 	NoneApproximationEnum,
 	PattynApproximationEnum,
@@ -250,4 +251,5 @@
 	VzObsEnum,
 	VzOldEnum,
+	VzMacAyealEnum,
 	VzPattynEnum,
 	VzStokesEnum,
Index: /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 6140)
+++ /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 6141)
@@ -73,4 +73,5 @@
 		case MacAyealApproximationEnum : return "MacAyealApproximation";
 		case MacAyealPattynApproximationEnum : return "MacAyealPattynApproximation";
+		case MacAyealStokesApproximationEnum : return "MacAyealStokesApproximation";
 		case NoneApproximationEnum : return "NoneApproximation";
 		case PattynApproximationEnum : return "PattynApproximation";
@@ -224,4 +225,5 @@
 		case VzObsEnum : return "VzObs";
 		case VzOldEnum : return "VzOld";
+		case VzMacAyealEnum : return "VzMacAyeal";
 		case VzPattynEnum : return "VzPattyn";
 		case VzStokesEnum : return "VzStokes";
Index: /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 6140)
+++ /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 6141)
@@ -71,4 +71,5 @@
 	else if (strcmp(name,"MacAyealApproximation")==0) return MacAyealApproximationEnum;
 	else if (strcmp(name,"MacAyealPattynApproximation")==0) return MacAyealPattynApproximationEnum;
+	else if (strcmp(name,"MacAyealStokesApproximation")==0) return MacAyealStokesApproximationEnum;
 	else if (strcmp(name,"NoneApproximation")==0) return NoneApproximationEnum;
 	else if (strcmp(name,"PattynApproximation")==0) return PattynApproximationEnum;
@@ -222,4 +223,5 @@
 	else if (strcmp(name,"VzObs")==0) return VzObsEnum;
 	else if (strcmp(name,"VzOld")==0) return VzOldEnum;
+	else if (strcmp(name,"VzMacAyeal")==0) return VzMacAyealEnum;
 	else if (strcmp(name,"VzPattyn")==0) return VzPattynEnum;
 	else if (strcmp(name,"VzStokes")==0) return VzStokesEnum;
Index: /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 6140)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 6141)
@@ -122,4 +122,44 @@
 					}
 					else ISSMERROR("if vertices_type is PattynStokes, you shoud have gridonpattyn or gridonstokes");
+			}
+			/*Also add spcs of coupling: zero at the border pattyn/stokes for the appropriate dofs*/
+			else if ((int)iomodel->vertices_type[i]==MacAyealStokesApproximationEnum){
+				/*If grion,pattyn spc stokes dofs: 3 4 & 5*/
+					if ((int)iomodel->gridonpattyn[i]){
+						constraints->AddObject(new Spc(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,0,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+						count++;
+						constraints->AddObject(new Spc(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,4,0,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+						count++;
+						constraints->AddObject(new Spc(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,5,0,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+						count++;
+						if ((int)iomodel->spcvelocity[6*i+0]){
+							constraints->AddObject(new Spc(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,*(iomodel->spcvelocity+6*i+3)/iomodel->yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							count++;
+						}
+						if ((int)iomodel->spcvelocity[6*i+1]){
+							constraints->AddObject(new Spc(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,*(iomodel->spcvelocity+6*i+4)/iomodel->yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							count++;
+						}
+
+					}
+					else if ((int)iomodel->gridonstokes[i]){ //spc pattyn grids: 1 & 2
+						constraints->AddObject(new Spc(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,0,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+						count++;
+						constraints->AddObject(new Spc(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,0,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+						count++;
+						if ((int)iomodel->spcvelocity[6*i+0]){
+							constraints->AddObject(new Spc(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,*(iomodel->spcvelocity+6*i+3)/iomodel->yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							count++;
+						}
+						if ((int)iomodel->spcvelocity[6*i+1]){
+							constraints->AddObject(new Spc(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,4,*(iomodel->spcvelocity+6*i+4)/iomodel->yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							count++;
+						}
+						if ((int)iomodel->spcvelocity[6*i+2]){
+							constraints->AddObject(new Spc(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,5,*(iomodel->spcvelocity+6*i+5)/iomodel->yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+							count++;
+						}
+					}
+					else ISSMERROR("if vertices_type is MacAyealStokes, you shoud have gridonpattyn or gridonstokes");
 			}
 			/*Now add the regular spcs*/
Index: /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp	(revision 6140)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp	(revision 6141)
@@ -88,5 +88,10 @@
 			count++;
 		}
-
+		else if ((int)*(iomodel->elements_type+element)==(MacAyealStokesApproximationEnum)){
+			loads->AddObject(new Icefront(iomodel->loadcounter+count+1,i,iomodel,MacAyeal3dIceFrontEnum,DiagnosticHorizAnalysisEnum));
+			count++;
+			loads->AddObject(new Icefront(iomodel->loadcounter+count+1,i,iomodel,StokesIceFrontEnum,DiagnosticHorizAnalysisEnum));
+			count++;
+		}
 	}
 
@@ -102,4 +107,6 @@
 	IoModelFetchData(&iomodel->gridonstokes,NULL,NULL,iomodel_handle,"gridonstokes");
 	IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,"elements");
+	IoModelFetchData(&iomodel->spcvelocity,NULL,NULL,iomodel_handle,"spcvelocity");
+	IoModelFetchData(&iomodel->vertices_type,NULL,NULL,iomodel_handle,"vertices_type");
 	CreateSingleNodeToElementConnectivity(iomodel);
 	
@@ -108,5 +115,7 @@
 		if(iomodel->my_vertices[i]==1 && iomodel->singlenodetoelementconnectivity[i]!=0){
 
-			if ((iomodel->gridonbed[i]) && (iomodel->gridonicesheet[i]) && (iomodel->gridonstokes[i])){
+			//if ((iomodel->gridonbed[i]) && (iomodel->gridonicesheet[i]) && ((int)iomodel->vertices_type[i]==StokesApproximationEnum || (int)iomodel->vertices_type[i]==PattynStokesApproximationEnum)){
+			if ((iomodel->gridonbed[i]) && (iomodel->gridonstokes[i])){
+			//if ((iomodel->gridonbed[i]) && (iomodel->gridonicesheet[i]) && (iomodel->gridonstokes[i])){
 				
 				loads->AddObject(new Pengrid(iomodel->loadcounter+count+1,i,iomodel,DiagnosticHorizAnalysisEnum));
@@ -120,4 +129,6 @@
 	xfree((void**)&iomodel->gridonicesheet);
 	xfree((void**)&iomodel->elements);
+	xfree((void**)&iomodel->spcvelocity);
+	xfree((void**)&iomodel->vertices_type);
 	xfree((void**)&iomodel->singlenodetoelementconnectivity);
 
Index: /issm/trunk/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp	(revision 6140)
+++ /issm/trunk/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp	(revision 6141)
@@ -51,4 +51,14 @@
 			doftype[5]=StokesApproximationEnum;
 		}
+		else if (vertices_type[0]==MacAyealStokesApproximationEnum){
+			numdofs=6;
+			doftype=(int*)xmalloc(numdofs*sizeof(int));
+			doftype[0]=MacAyealApproximationEnum;
+			doftype[1]=MacAyealApproximationEnum;
+			doftype[2]=StokesApproximationEnum;
+			doftype[3]=StokesApproximationEnum;
+			doftype[4]=StokesApproximationEnum;
+			doftype[5]=StokesApproximationEnum;
+		}
 		else ISSMERROR("Approximationtype %i (%s) not implemented yet for DiagnosticHoriz",(int)*vertices_type,EnumToString((int)*vertices_type));
 	}
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 6140)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 6141)
@@ -1863,4 +1863,18 @@
 				}
 			}
+			if(*(iomodel->elements_type+index)==MacAyealStokesApproximationEnum){
+				/*Create VzMacAyeal and VzStokes Enums*/
+				if(iomodel->vz && iomodel->gridonstokes){
+					for(i=0;i<6;i++) nodeinputs[i]=iomodel->vz[penta_vertex_ids[i]-1]/iomodel->yts*iomodel->gridonstokes[penta_vertex_ids[i]-1];
+					this->inputs->AddInput(new PentaVertexInput(VzStokesEnum,nodeinputs));
+					for(i=0;i<6;i++) nodeinputs[i]=iomodel->vz[penta_vertex_ids[i]-1]/iomodel->yts*(1-iomodel->gridonstokes[penta_vertex_ids[i]-1]);
+					this->inputs->AddInput(new PentaVertexInput(VzMacAyealEnum,nodeinputs));
+				}
+				else{
+					for(i=0;i<6;i++)nodeinputs[i]=0;
+					this->inputs->AddInput(new PentaVertexInput(VzStokesEnum,nodeinputs));
+					this->inputs->AddInput(new PentaVertexInput(VzMacAyealEnum,nodeinputs));
+				}
+			}
 			break;
 
Index: /issm/trunk/src/c/objects/Node.cpp
===================================================================
--- /issm/trunk/src/c/objects/Node.cpp	(revision 6140)
+++ /issm/trunk/src/c/objects/Node.cpp	(revision 6141)
@@ -98,4 +98,9 @@
 			}
 			if (iomodel->vertices_type[io_index]==MacAyealPattynApproximationEnum && iomodel->gridonmacayeal[io_index]){
+				if(!iomodel->gridonbed[io_index]){
+					for(k=1;k<=gsize;k++) this->FreezeDof(k);
+				}
+			}
+			if (iomodel->vertices_type[io_index]==MacAyealStokesApproximationEnum && iomodel->gridonmacayeal[io_index]){
 				if(!iomodel->gridonbed[io_index]){
 					for(k=1;k<=gsize;k++) this->FreezeDof(k);
