Index: /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 6747)
+++ /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 6748)
@@ -158,4 +158,9 @@
 	AirEnum,
 	MelangeEnum,
+	/*}}}*/
+	/*Rift state {{{1*/
+	FreeEnum,
+	OpenEnum,
+	ClosedEnum,
 	/*}}}*/
 	/*Inputs {{{1*/
Index: /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 6747)
+++ /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 6748)
@@ -134,4 +134,7 @@
 		case AirEnum : return "Air";
 		case MelangeEnum : return "Melange";
+		case FreeEnum : return "Free";
+		case OpenEnum : return "Open";
+		case ClosedEnum : return "Closed";
 		case AccumulationRateEnum : return "AccumulationRate";
 		case AdjointxEnum : return "Adjointx";
Index: /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 6747)
+++ /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 6748)
@@ -132,4 +132,7 @@
 	else if (strcmp(name,"Air")==0) return AirEnum;
 	else if (strcmp(name,"Melange")==0) return MelangeEnum;
+	else if (strcmp(name,"Free")==0) return FreeEnum;
+	else if (strcmp(name,"Open")==0) return OpenEnum;
+	else if (strcmp(name,"Closed")==0) return ClosedEnum;
 	else if (strcmp(name,"AccumulationRate")==0) return AccumulationRateEnum;
 	else if (strcmp(name,"Adjointx")==0) return AdjointxEnum;
Index: /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.h
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 6747)
+++ /issm/trunk/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 6748)
@@ -6,5 +6,5 @@
 #define _MODEL_PROCESSORX_H_
 
-#define RIFTINFOSIZE 11
+#define RIFTINFOSIZE 12
 
 class DataSet;
Index: /issm/trunk/src/c/objects/Loads/Riftfront.cpp
===================================================================
--- /issm/trunk/src/c/objects/Loads/Riftfront.cpp	(revision 6747)
+++ /issm/trunk/src/c/objects/Loads/Riftfront.cpp	(revision 6748)
@@ -87,4 +87,5 @@
 	this->length=*(iomodel->riftinfo+RIFTINFOSIZE*i+6);
 	this->fraction=*(iomodel->riftinfo+RIFTINFOSIZE*i+9);
+	this->state=*(iomodel->riftinfo+RIFTINFOSIZE*i+11);
 
 	//intialize inputs, and add as many inputs per element as requested: 
@@ -156,4 +157,5 @@
 	printf("   fraction: %i\n",fraction);
 	printf("   fractionincrement: %i\n",fractionincrement);
+	printf("   state: %i\n",state);
 	printf("   frozen: %s\n",frozen ? "true":"false");
 		
@@ -209,4 +211,5 @@
 	memcpy(marshalled_dataset,&fraction,sizeof(fraction));marshalled_dataset+=sizeof(fraction);
 	memcpy(marshalled_dataset,&frozen,sizeof(frozen));marshalled_dataset+=sizeof(frozen);
+	memcpy(marshalled_dataset,&state,sizeof(state));marshalled_dataset+=sizeof(state);
 	memcpy(marshalled_dataset,&counter,sizeof(counter));marshalled_dataset+=sizeof(counter);
 	memcpy(marshalled_dataset,&prestable,sizeof(prestable));marshalled_dataset+=sizeof(prestable);
@@ -243,4 +246,5 @@
 		+sizeof(fraction)
 		+sizeof(frozen)
+		+sizeof(state)
 		+sizeof(counter)
 		+sizeof(prestable)
@@ -273,4 +277,5 @@
 	memcpy(&fraction,marshalled_dataset,sizeof(fraction));marshalled_dataset+=sizeof(fraction);
 	memcpy(&frozen,marshalled_dataset,sizeof(frozen));marshalled_dataset+=sizeof(frozen);
+	memcpy(&state,marshalled_dataset,sizeof(state));marshalled_dataset+=sizeof(state);
 	memcpy(&counter,marshalled_dataset,sizeof(counter));marshalled_dataset+=sizeof(counter);
 	memcpy(&prestable,marshalled_dataset,sizeof(prestable));marshalled_dataset+=sizeof(prestable);
@@ -338,4 +343,5 @@
 	riftfront->active=this->active;
 	riftfront->frozen=this->frozen;
+	riftfront->state=this->state;
 	riftfront->counter=this->counter;
 	riftfront->prestable=this->prestable;
@@ -702,4 +708,16 @@
 	}
 
+	/*Is this rift segment state specified by user input? :*/
+	if (this->state==OpenEnum || this->state==ClosedEnum){
+
+		if(this->state==OpenEnum)this->active=0;
+		if(this->state==ClosedEnum)this->active=1;
+		
+		/*this segment is like frozen, no instability here: */
+		*punstable=0;
+		return 1;
+	}
+
+
 	/*recover parameters: */
 	this->inputs->GetParameterValue(&fractionincrement,FractionIncrementEnum);
Index: /issm/trunk/src/c/objects/Loads/Riftfront.h
===================================================================
--- /issm/trunk/src/c/objects/Loads/Riftfront.h	(revision 6747)
+++ /issm/trunk/src/c/objects/Loads/Riftfront.h	(revision 6748)
@@ -41,4 +41,5 @@
 		double   length;
 		double   fraction;
+		int      state;
 		
 		Parameters* parameters; //pointer to solution parameters
Index: /issm/trunk/src/c/shared/TriMesh/TriMeshUtils.cpp
===================================================================
--- /issm/trunk/src/c/shared/TriMesh/TriMeshUtils.cpp	(revision 6747)
+++ /issm/trunk/src/c/shared/TriMesh/TriMeshUtils.cpp	(revision 6748)
@@ -10,4 +10,5 @@
 #include "../../include/include.h"
 
+#define RIFTPENALTYPAIRSWIDTH 8
 int IsGridOnRift(int* riftsegments, int nriftsegs, int grid){
 
@@ -986,5 +987,5 @@
 
 		/*allocate riftpenaltypairs, and riftnumpenaltypairs: */
-		if((numsegs/2-1)!=0)riftpenaltypairs=(double*)xcalloc((numsegs/2-1)*7,sizeof(double));
+		if((numsegs/2-1)!=0)riftpenaltypairs=(double*)xcalloc((numsegs/2-1)*RIFTPENALTYPAIRSWIDTH,sizeof(double));
 		
 		/*Go through only one flank of the rifts, not counting the tips: */
Index: /issm/trunk/src/m/model/presolve.m
===================================================================
--- /issm/trunk/src/m/model/presolve.m	(revision 6747)
+++ /issm/trunk/src/m/model/presolve.m	(revision 6748)
@@ -31,5 +31,5 @@
 end
 
-md.riftinfo=zeros(numpairs,10); % 2 for grids + 2 for elements+ 2 for  normals + 1 for length + 1 for fill + 1 for friction + 1 for fraction.
+md.riftinfo=zeros(numpairs,12); % 2 for grids + 2 for elements+ 2 for  normals + 1 for length + 1 for fill + 1 for friction + 1 for fraction + 1 for fractionincrement + 1 for state.
 
 count=1;
@@ -41,4 +41,5 @@
 	md.riftinfo(count:count+numpairsforthisrift-1,10)=md.rifts(i).fraction;
 	md.riftinfo(count:count+numpairsforthisrift-1,11)=md.rifts(i).fractionincrement;
+	md.riftinfo(count:count+numpairsforthisrift-1,12)=md.rifts(i).state;
 	count=count+numpairsforthisrift;
 end
Index: /issm/trunk/src/mex/TriMeshProcessRifts/TriMeshProcessRifts.cpp
===================================================================
--- /issm/trunk/src/mex/TriMeshProcessRifts/TriMeshProcessRifts.cpp	(revision 6747)
+++ /issm/trunk/src/mex/TriMeshProcessRifts/TriMeshProcessRifts.cpp	(revision 6748)
@@ -27,5 +27,5 @@
 	/*empty rifts structure: */
 	double* pNaN=NULL;
-	const	char*	fnames[9];
+	const	char*	fnames[10];
 	mwSize     ndim=2;
 	mwSize		dimensions[2] = {1,1};
@@ -47,4 +47,7 @@
 	double* segmentmarkers_in=NULL;
 
+	/* state: */
+	double* state=NULL;
+
 	int     num_seg;
 
@@ -238,8 +241,9 @@
 		fnames[7] = "fraction";
 		fnames[8] = "fractionincrement";
+		fnames[9] = "state";
 
 		dimensions[0]=out_numrifts;
 
-		pmxa_array=mxCreateStructArray( ndim,dimensions,9,fnames);
+		pmxa_array=mxCreateStructArray( ndim,dimensions,10,fnames);
 		
 		for (i=0;i<out_numrifts;i++){
@@ -287,4 +291,15 @@
 			mxSetField(pmxa_array,i,"fraction",mxCreateDoubleScalar(0)); //default is ice
 			mxSetField(pmxa_array,i,"fractionincrement",mxCreateDoubleScalar(0.1)); 
+
+			/*State: */
+			state=(double*)xmalloc(out_riftsnumpenaltypairs[i]*sizeof(double));
+			for(j=0;j<out_riftsnumpenaltypairs[i];j++)state[j]=FreeEnum;
+			pmxa_array2= mxCreateDoubleMatrix(0,0,mxREAL);
+			mxSetM(pmxa_array2,1);
+			mxSetN(pmxa_array2,out_riftsnumpenaltypairs[i]);
+			mxSetPr(pmxa_array2,state);
+			mexCallMATLAB( 1, &pmxa_array3, 1, &pmxa_array2, "transpose");
+			
+			mxSetField(pmxa_array,i,"state",pmxa_array3);
 		}
 	}
