Index: /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19157)
+++ /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19158)
@@ -12,5 +12,5 @@
 
 void LevelsetAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
-	return;
+	IoModelToConstraintsx(constraints,iomodel,SpcLevelsetEnum,LevelsetAnalysisEnum,P1Enum);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 19157)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 19158)
@@ -910,4 +910,5 @@
 	/*Levelset related enums (will be moved to appropriate place when finished){{{*/
 	TransientIslevelsetEnum,
+	SpcLevelsetEnum,
 	ExtrapolationVariableEnum,
 	IceMaskNodeActivationEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 19157)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 19158)
@@ -871,4 +871,5 @@
 		case LliboutryDuvalEnum : return "LliboutryDuval";
 		case TransientIslevelsetEnum : return "TransientIslevelset";
+		case SpcLevelsetEnum : return "SpcLevelset";
 		case ExtrapolationVariableEnum : return "ExtrapolationVariable";
 		case IceMaskNodeActivationEnum : return "IceMaskNodeActivation";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 19157)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 19158)
@@ -892,4 +892,5 @@
 	      else if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
 	      else if (strcmp(name,"TransientIslevelset")==0) return TransientIslevelsetEnum;
+	      else if (strcmp(name,"SpcLevelset")==0) return SpcLevelsetEnum;
 	      else if (strcmp(name,"ExtrapolationVariable")==0) return ExtrapolationVariableEnum;
 	      else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
Index: /issm/trunk-jpl/src/m/classes/calving.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/calving.m	(revision 19157)
+++ /issm/trunk-jpl/src/m/classes/calving.m	(revision 19158)
@@ -7,4 +7,5 @@
 	properties (SetAccess=public) 
 		stabilization = 0;
+		spclevelset   = NaN;
 		calvingrate   = NaN;
 		meltingrate   = NaN;
@@ -30,4 +31,5 @@
 		end % }}}
 		function self = extrude(self,md) % {{{
+			self.spclevelset=project3d(md,'vector',self.spclevelset,'type','node');
 			self.calvingrate=project3d(md,'vector',self.calvingrate,'type','node');
 			self.meltingrate=project3d(md,'vector',self.meltingrate,'type','node');
@@ -43,4 +45,5 @@
 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
 
+			md = checkfield(md,'fieldname','calving.spclevelset','timeseries',1);
 			md = checkfield(md,'fieldname','calving.stabilization','values',[0 1 2]);
 			md = checkfield(md,'fieldname','calving.calvingrate(1:md.mesh.numberofvertices,:)','>=',0,'timeseries',1,'NaN',1);
@@ -50,4 +53,5 @@
 			disp(sprintf('   Calving parameters:'));
 			fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
+			fielddisplay(self,'spclevelset','Levelset constraints (NaN means no constraint)');
 			fielddisplay(self,'calvingrate','calving rate at given location [m/a]');
 			fielddisplay(self,'meltingrate','melting rate at given location [m/a]');
@@ -57,4 +61,5 @@
 			WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
 			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
+			WriteData(fid,'enum',SpcLevelsetEnum(),'data',self.spclevelset,'format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
 			WriteData(fid,'object',self,'fieldname','calvingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
 			WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
Index: /issm/trunk-jpl/src/m/classes/calving.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/calving.py	(revision 19157)
+++ /issm/trunk-jpl/src/m/classes/calving.py	(revision 19158)
@@ -17,4 +17,5 @@
 
 		self.stabilization = 0
+		self.spclevelset   = float('NaN')
 		self.calvingrate   = float('NaN')
 		self.meltingrate   = float('NaN')
@@ -27,4 +28,5 @@
 		string='   Calving parameters:'
 		string="%s\n%s"%(string,fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding'))
+		string="%s\n%s"%(string,fielddisplay(self,'spclevelset','levelset constraints (NaN means no constraint)'))
 		string="%s\n%s"%(string,fielddisplay(self,'calvingrate','calving rate at given location [m/a]'))
 		string="%s\n%s"%(string,fielddisplay(self,'meltingrate','melting rate at given location [m/a]'))
@@ -33,4 +35,5 @@
 		#}}}
 	def extrude(self,md): # {{{
+		self.spclevelset=project3d(md,'vector',self.spclevelset,'type','node')
 		self.calvingrate=project3d(md,'vector',self.calvingrate,'type','node')
 		self.meltingrate=project3d(md,'vector',self.meltingrate,'type','node')
@@ -50,4 +53,5 @@
 			return md
 
+		md = checkfield(md,'fieldname','calving.spclevelset','timeseries',1)
 		md = checkfield(md,'fieldname','calving.stabilization','values',[0,1,2]);
 		md = checkfield(md,'fieldname','calving.calvingrate','>=',0,'timeseries',1,'NaN',1);
@@ -62,4 +66,5 @@
 		WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
 		WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
+		WriteData(fid,'enum',SpcLevelsetEnum(),'data',self.spclevelset,'format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
 		WriteData(fid,'object',self,'fieldname','calvingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts)
 		WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts)
Index: /issm/trunk-jpl/src/m/classes/calvingdev.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/calvingdev.m	(revision 19157)
+++ /issm/trunk-jpl/src/m/classes/calvingdev.m	(revision 19158)
@@ -7,4 +7,5 @@
 	properties (SetAccess=public) 
 		stabilization = 0;
+		spclevelset   = NaN;
 		coeff         = NaN;
 		meltingrate   = NaN;
@@ -29,4 +30,9 @@
 			end
 		end % }}}
+		function self = extrude(self,md) % {{{
+			self.spclevelset=project3d(md,'vector',self.spclevelset,'type','node');
+			self.coeff=project3d(md,'vector',self.coeff,'type','node');
+			self.meltingrate=project3d(md,'vector',self.meltingrate,'type','node');
+		end % }}}
 		function self = setdefaultparameters(self) % {{{
 
@@ -41,4 +47,5 @@
 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
 
+			md = checkfield(md,'fieldname','calving.spclevelset','timeseries',1);
 			md = checkfield(md,'fieldname','calving.stabilization','values',[0 1 2]);
 			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
@@ -48,4 +55,5 @@
 			disp(sprintf('   Calving Pi parameters:'));
 			fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
+			fielddisplay(self,'spclevelset','Levelset constraints (NaN means no constraint)');
 			fielddisplay(self,'coeff','proportionality coefficient in Pi model');
 			fielddisplay(self,'meltingrate','melting rate at given location [m/a]');
@@ -56,4 +64,5 @@
 			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingDevEnum(),'format','Integer');
 			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
+			WriteData(fid,'enum',SpcLevelsetEnum(),'data',self.spclevelset,'format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
 			WriteData(fid,'enum',CalvingpiCoeffEnum(),'data',self.coeff,'format','DoubleMat','mattype',1);
 			WriteData(fid,'class','calving','object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
Index: /issm/trunk-jpl/src/m/classes/calvingpi.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/calvingpi.m	(revision 19157)
+++ /issm/trunk-jpl/src/m/classes/calvingpi.m	(revision 19158)
@@ -7,4 +7,5 @@
 	properties (SetAccess=public) 
 		stabilization = 0;
+		spclevelset   = NaN;
 		coeff         = NaN;
 		meltingrate   = NaN;
@@ -30,4 +31,5 @@
 		end % }}}
 		function self = extrude(self,md) % {{{
+			self.spclevelset=project3d(md,'vector',self.spclevelset,'type','node');
 			self.coeff=project3d(md,'vector',self.coeff,'type','node');
 			self.meltingrate=project3d(md,'vector',self.meltingrate,'type','node');
@@ -45,4 +47,5 @@
 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
 
+			md = checkfield(md,'fieldname','calving.spclevelset','timeseries',1);
 			md = checkfield(md,'fieldname','calving.stabilization','values',[0 1 2]);
 			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
@@ -52,4 +55,5 @@
 			disp(sprintf('   Calving Pi parameters:'));
 			fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
+			fielddisplay(self,'spclevelset','Levelset constraints (NaN means no constraint)');
 			fielddisplay(self,'coeff','proportionality coefficient in Pi model');
 			fielddisplay(self,'meltingrate','melting rate at given location [m/a]');
@@ -60,4 +64,5 @@
 			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingPiEnum(),'format','Integer');
 			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
+			WriteData(fid,'enum',SpcLevelsetEnum(),'data',self.spclevelset,'format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
 			WriteData(fid,'enum',CalvingpiCoeffEnum(),'data',self.coeff,'format','DoubleMat','mattype',1);
 			WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 19157)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 19158)
@@ -863,4 +863,5 @@
 def LliboutryDuvalEnum(): return StringToEnum("LliboutryDuval")[0]
 def TransientIslevelsetEnum(): return StringToEnum("TransientIslevelset")[0]
+def SpcLevelsetEnum(): return StringToEnum("SpcLevelset")[0]
 def ExtrapolationVariableEnum(): return StringToEnum("ExtrapolationVariable")[0]
 def IceMaskNodeActivationEnum(): return StringToEnum("IceMaskNodeActivation")[0]
Index: /issm/trunk-jpl/test/NightlyRun/test807.m
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/test807.m	(revision 19157)
+++ /issm/trunk-jpl/test/NightlyRun/test807.m	(revision 19158)
@@ -27,4 +27,5 @@
 md.calving.calvingrate=zeros(md.mesh.numberofvertices,1);
 md.calving.meltingrate=10000*ones(md.mesh.numberofvertices,1);
+md.calving.spclevelset=NaN(md.mesh.numberofvertices,1);
 
 md=solve(md,TransientSolutionEnum());
Index: /issm/trunk-jpl/test/NightlyRun/test807.py
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/test807.py	(revision 19157)
+++ /issm/trunk-jpl/test/NightlyRun/test807.py	(revision 19158)
@@ -40,4 +40,5 @@
 md.calving.calvingrate=numpy.zeros((md.mesh.numberofvertices,1))
 md.calving.meltingrate=10000*numpy.ones((md.mesh.numberofvertices,1))
+md.calving.spclevelset=numpy.float('NaN')*numpy.ones((md.mesh.numberofvertices,1))
 
 md=solve(md,TransientSolutionEnum())
Index: /issm/trunk-jpl/test/Par/SquareSheetConstrained.par
===================================================================
--- /issm/trunk-jpl/test/Par/SquareSheetConstrained.par	(revision 19157)
+++ /issm/trunk-jpl/test/Par/SquareSheetConstrained.par	(revision 19158)
@@ -32,4 +32,5 @@
 %Calving
 md.calving.calvingrate=zeros(md.mesh.numberofvertices,1);
+md.calving.spclevelset=NaN(md.mesh.numberofvertices,1);
 
 %Friction
Index: /issm/trunk-jpl/test/Par/SquareSheetConstrained.py
===================================================================
--- /issm/trunk-jpl/test/Par/SquareSheetConstrained.py	(revision 19157)
+++ /issm/trunk-jpl/test/Par/SquareSheetConstrained.py	(revision 19158)
@@ -42,4 +42,5 @@
 #Calving
 md.calving.calvingrate=0.*numpy.ones((md.mesh.numberofvertices,1))
+md.calving.spclevelset=float('NaN')*numpy.ones((md.mesh.numberofvertices,1))
 
 #Friction
Index: /issm/trunk-jpl/test/Par/ValleyGlacierShelf.par
===================================================================
--- /issm/trunk-jpl/test/Par/ValleyGlacierShelf.par	(revision 19157)
+++ /issm/trunk-jpl/test/Par/ValleyGlacierShelf.par	(revision 19158)
@@ -77,4 +77,5 @@
 md.calving.calvingrate = 0.*ones(md.mesh.numberofvertices,1);
 md.calving.meltingrate = 0.*ones(md.mesh.numberofvertices,1);
+md.calving.spclevelset=NaN(md.mesh.numberofvertices,1);
 md.masstransport.stabilization = 1.;
 
Index: /issm/trunk-jpl/test/Par/ValleyGlacierShelf.py
===================================================================
--- /issm/trunk-jpl/test/Par/ValleyGlacierShelf.py	(revision 19157)
+++ /issm/trunk-jpl/test/Par/ValleyGlacierShelf.py	(revision 19158)
@@ -84,4 +84,5 @@
 md.calving.calvingrate=0.*numpy.ones((md.mesh.numberofvertices,1))
 md.calving.meltingrate=0.*numpy.ones((md.mesh.numberofvertices,1))
+md.calving.spclevelset=float('NaN')*numpy.ones((md.mesh.numberofvertices,1))
 md.masstransport.stabilization=1.
 
