Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/analyses/MasstransportAnalysis.cpp
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/analyses/MasstransportAnalysis.cpp	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/analyses/MasstransportAnalysis.cpp	(revision 22481)
@@ -123,4 +123,5 @@
 	bool   ismovingfront;
 	bool   issmb;
+	int    basalforcingsmodel;
 
 	/*Fetch data needed: */
@@ -130,4 +131,5 @@
 	iomodel->FindConstant(&ismovingfront,"md.transient.ismovingfront");
 	iomodel->FindConstant(&issmb,"md.transient.issmb");
+	iomodel->FindConstant(&basalforcingsmodel,"md.basalforcings.model");
 
 	/*Finite element type*/
@@ -155,4 +157,9 @@
 	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
 	iomodel->FetchDataToInput(elements,"md.basalforcings.floatingice_melting_rate",BasalforcingsFloatingiceMeltingRateEnum);
+	if (basalforcingsmodel==SpatialLinearFloatingMeltRateEnum){
+		iomodel->FetchDataToInput(elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
+		iomodel->FetchDataToInput(elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
+		iomodel->FetchDataToInput(elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
+	}
 	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
 	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/analyses/ThermalAnalysis.cpp
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/analyses/ThermalAnalysis.cpp	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/analyses/ThermalAnalysis.cpp	(revision 22481)
@@ -754,5 +754,5 @@
 	IssmDouble *xyz_list  = NULL;
 	IssmDouble  n=3.0;
-	bool        hack      = false;
+	bool        hack      = true;
 
 	/*Fetch number of nodes and dof for this finite element*/
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/classes/Elements/Element.cpp	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/classes/Elements/Element.cpp	(revision 22481)
@@ -1730,4 +1730,32 @@
 
 }/*}}}*/
+void       Element::SpatialLinearFloatingiceMeltingRate(){/*{{{*/
+
+	int numvertices      = this->GetNumberOfVertices();
+	IssmDouble* deepwatermelt     = xNew<IssmDouble>(numvertices);
+	IssmDouble* deepwaterel     = xNew<IssmDouble>(numvertices);
+	IssmDouble* upperwaterel     = xNew<IssmDouble>(numvertices);
+	IssmDouble* base     = xNew<IssmDouble>(numvertices);
+	IssmDouble* values   = xNew<IssmDouble>(numvertices);
+
+	this->GetInputListOnVertices(base,BaseEnum);
+	this->GetInputListOnVertices(deepwatermelt,BasalforcingsDeepwaterMeltingRateEnum);
+	this->GetInputListOnVertices(deepwaterel,BasalforcingsDeepwaterElevationEnum);
+	this->GetInputListOnVertices(upperwaterel,BasalforcingsUpperwaterElevationEnum);
+	
+	for(int i=0;i<numvertices;i++){
+		if(base[i]>upperwaterel[i])      values[i]=0;
+		else if (base[i]<deepwaterel[i]) values[i]=deepwatermelt[i];
+		else values[i]=deepwatermelt[i]*(base[i]-upperwaterel[i])/(deepwaterel[i]-upperwaterel[i]);
+	}
+
+	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
+	xDelete<IssmDouble>(base);
+	xDelete<IssmDouble>(deepwaterel);
+	xDelete<IssmDouble>(deepwatermelt);
+	xDelete<IssmDouble>(upperwaterel);
+	xDelete<IssmDouble>(values);
+
+}/*}}}*/
 void       Element::MantlePlumeGeothermalFlux(){/*{{{*/
 
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/classes/Elements/Element.h
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/classes/Elements/Element.h	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/classes/Elements/Element.h	(revision 22481)
@@ -126,4 +126,5 @@
 		bool               IsWaterInElement();
 		void               LinearFloatingiceMeltingRate(); 
+		void               SpatialLinearFloatingiceMeltingRate(); 
 		void               MantlePlumeGeothermalFlux(); 
 		void               MarshallElement(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction,int numanalyses);
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/classes/Elements/Tria.cpp	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/classes/Elements/Tria.cpp	(revision 22481)
@@ -4389,4 +4389,7 @@
 	if(!(this->inputs->Max(MaskIceLevelsetEnum)<0) && !IsWaterInElement()) return; 
 
+	/*early return if we are fully floating: */
+	if (this->inputs->Max(MaskGroundediceLevelsetEnum)<=0)return;
+
 	/*recover computational flags: */
 	this->parameters->FindParam(&computerigid,SealevelriseRigidEnum);
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 22481)
@@ -29,4 +29,8 @@
 			MismipFloatingiceMeltingRatex(femmodel);
 			break;
+		case SpatialLinearFloatingMeltRateEnum:
+			if(VerboseSolution())_printf0_("	call Spatial Linear Floating melting rate module\n");
+			SpatialLinearFloatingiceMeltingRatex(femmodel);
+			break;
 		default:
 			_error_("Basal forcing model "<<EnumToStringx(basalforcing_model)<<" not supported yet");
@@ -43,4 +47,12 @@
 
 }/*}}}*/
+void SpatialLinearFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
+
+	for(int i=0;i<femmodel->elements->Size();i++){
+		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		element->SpatialLinearFloatingiceMeltingRate();
+	}
+
+}/*}}}*/
 void MismipFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
 
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h	(revision 22481)
@@ -11,4 +11,5 @@
 void FloatingiceMeltingRatex(FemModel* femmodel);
 void LinearFloatingiceMeltingRatex(FemModel* femmodel);
+void SpatialLinearFloatingiceMeltingRatex(FemModel* femmodel);
 void MismipFloatingiceMeltingRatex(FemModel* femmodel);
 
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 22481)
@@ -118,4 +118,7 @@
 			parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum));
 			break;
+		case SpatialLinearFloatingMeltRateEnum:
+			/*Nothing to add to parameters:*/
+			break;
 		case MismipFloatingMeltRateEnum:
 			parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.meltrate_factor",BasalforcingsMeltrateFactorEnum));
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/Enum/EnumDefinitions.h	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/Enum/EnumDefinitions.h	(revision 22481)
@@ -77,4 +77,5 @@
 	MismipFloatingMeltRateEnum,
 	MantlePlumeGeothermalFluxEnum,
+	SpatialLinearFloatingMeltRateEnum,
 	BedEnum,
 	BaseEnum,
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/Enum/EnumToStringx.cpp	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/Enum/EnumToStringx.cpp	(revision 22481)
@@ -83,4 +83,5 @@
 		case MismipFloatingMeltRateEnum : return "MismipFloatingMeltRate";
 		case MantlePlumeGeothermalFluxEnum : return "MantlePlumeGeothermalFlux";
+		case SpatialLinearFloatingMeltRateEnum : return "SpatialLinearFloatingMeltRate";
 		case BedEnum : return "Bed";
 		case BaseEnum : return "Base";
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/Enum/StringToEnumx.cpp	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/Enum/StringToEnumx.cpp	(revision 22481)
@@ -83,4 +83,5 @@
 	      else if (strcmp(name,"MismipFloatingMeltRate")==0) return MismipFloatingMeltRateEnum;
 	      else if (strcmp(name,"MantlePlumeGeothermalFlux")==0) return MantlePlumeGeothermalFluxEnum;
+	      else if (strcmp(name,"SpatialLinearFloatingMeltRate")==0) return SpatialLinearFloatingMeltRateEnum;
 	      else if (strcmp(name,"Bed")==0) return BedEnum;
 	      else if (strcmp(name,"Base")==0) return BaseEnum;
@@ -136,9 +137,9 @@
 	      else if (strcmp(name,"EffectivePressure")==0) return EffectivePressureEnum;
 	      else if (strcmp(name,"EplHead")==0) return EplHeadEnum;
-	      else if (strcmp(name,"EplHeadOld")==0) return EplHeadOldEnum;
          else stage=2;
    }
    if(stage==2){
-	      if (strcmp(name,"EplHeadSlopeX")==0) return EplHeadSlopeXEnum;
+	      if (strcmp(name,"EplHeadOld")==0) return EplHeadOldEnum;
+	      else if (strcmp(name,"EplHeadSlopeX")==0) return EplHeadSlopeXEnum;
 	      else if (strcmp(name,"EplHeadSlopeY")==0) return EplHeadSlopeYEnum;
 	      else if (strcmp(name,"EplZigZagCounter")==0) return EplZigZagCounterEnum;
@@ -259,9 +260,9 @@
 	      else if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum;
 	      else if (strcmp(name,"CalvingLevermann")==0) return CalvingLevermannEnum;
-	      else if (strcmp(name,"CalvingDev")==0) return CalvingDevEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"CalvingMinthickness")==0) return CalvingMinthicknessEnum;
+	      if (strcmp(name,"CalvingDev")==0) return CalvingDevEnum;
+	      else if (strcmp(name,"CalvingMinthickness")==0) return CalvingMinthicknessEnum;
 	      else if (strcmp(name,"DefaultCalving")==0) return DefaultCalvingEnum;
 	      else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum;
@@ -382,9 +383,9 @@
 	      else if (strcmp(name,"SmbSolution")==0) return SmbSolutionEnum;
 	      else if (strcmp(name,"SmbNumRequestedOutputs")==0) return SmbNumRequestedOutputsEnum;
-	      else if (strcmp(name,"SmbRequestedOutputs")==0) return SmbRequestedOutputsEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"SmbIsInitialized")==0) return SmbIsInitializedEnum;
+	      if (strcmp(name,"SmbRequestedOutputs")==0) return SmbRequestedOutputsEnum;
+	      else if (strcmp(name,"SmbIsInitialized")==0) return SmbIsInitializedEnum;
 	      else if (strcmp(name,"SmbDzini")==0) return SmbDziniEnum;
 	      else if (strcmp(name,"SmbDini")==0) return SmbDiniEnum;
@@ -505,9 +506,9 @@
 	      else if (strcmp(name,"PressurePicard")==0) return PressurePicardEnum;
 	      else if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
-	      else if (strcmp(name,"ResetPenalties")==0) return ResetPenaltiesEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
+	      if (strcmp(name,"ResetPenalties")==0) return ResetPenaltiesEnum;
+	      else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
 	      else if (strcmp(name,"SurfaceArea")==0) return SurfaceAreaEnum;
 	      else if (strcmp(name,"SurfaceAverageVelMisfit")==0) return SurfaceAverageVelMisfitEnum;
@@ -628,9 +629,9 @@
 	      else if (strcmp(name,"Outputdefinition25")==0) return Outputdefinition25Enum;
 	      else if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum;
-	      else if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum;
+	      if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum;
+	      else if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum;
 	      else if (strcmp(name,"Outputdefinition29")==0) return Outputdefinition29Enum;
 	      else if (strcmp(name,"Outputdefinition30")==0) return Outputdefinition30Enum;
@@ -751,9 +752,9 @@
 	      else if (strcmp(name,"ToolkitsOptionsAnalyses")==0) return ToolkitsOptionsAnalysesEnum;
 	      else if (strcmp(name,"ToolkitsOptionsStrings")==0) return ToolkitsOptionsStringsEnum;
-	      else if (strcmp(name,"QmuErrName")==0) return QmuErrNameEnum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"QmuInName")==0) return QmuInNameEnum;
+	      if (strcmp(name,"QmuErrName")==0) return QmuErrNameEnum;
+	      else if (strcmp(name,"QmuInName")==0) return QmuInNameEnum;
 	      else if (strcmp(name,"QmuOutName")==0) return QmuOutNameEnum;
 	      else if (strcmp(name,"Regular")==0) return RegularEnum;
@@ -874,9 +875,9 @@
 	      else if (strcmp(name,"Matenhancedice")==0) return MatenhancediceEnum;
 	      else if (strcmp(name,"Matestar")==0) return MatestarEnum;
-	      else if (strcmp(name,"Matpar")==0) return MatparEnum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"Node")==0) return NodeEnum;
+	      if (strcmp(name,"Matpar")==0) return MatparEnum;
+	      else if (strcmp(name,"Node")==0) return NodeEnum;
 	      else if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum;
 	      else if (strcmp(name,"Neumannflux")==0) return NeumannfluxEnum;
@@ -997,9 +998,9 @@
 	      else if (strcmp(name,"MaxAbsVz")==0) return MaxAbsVzEnum;
 	      else if (strcmp(name,"FloatingArea")==0) return FloatingAreaEnum;
-	      else if (strcmp(name,"GroundedArea")==0) return GroundedAreaEnum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"IceMass")==0) return IceMassEnum;
+	      if (strcmp(name,"GroundedArea")==0) return GroundedAreaEnum;
+	      else if (strcmp(name,"IceMass")==0) return IceMassEnum;
 	      else if (strcmp(name,"IceVolume")==0) return IceVolumeEnum;
 	      else if (strcmp(name,"IceVolumeAboveFloatation")==0) return IceVolumeAboveFloatationEnum;
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/io/Marshalling/IoCodeConversions.cpp
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 22481)
@@ -92,4 +92,5 @@
 		case 3: return MismipFloatingMeltRateEnum;
 		case 4: return MantlePlumeGeothermalFluxEnum;
+		case 5: return SpatialLinearFloatingMeltRateEnum;
 		default: _error_("Marshalled Basal Forcings code \""<<enum_in<<"\" not supported yet");
 	}
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/classes/model.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/classes/model.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/classes/model.m	(revision 22481)
@@ -328,5 +328,5 @@
 
 		end % }}}
-		function md2 = extract(md,area) % {{{
+		function md2 = extract(md,area,varargin) % {{{
 			%extract - extract a model according to an Argus contour or flag list
 			%
@@ -350,6 +350,9 @@
 			md1=md;
 
+			%recover optoins: 
+			options=pairoptions(varargin{:});
+
 			%some checks
-			if ((nargin~=2) | (nargout~=1)),
+			if ((nargin<2) | (nargout~=1)),
 				help extract
 				error('extract error message: bad usage');
@@ -363,10 +366,12 @@
 
 			%kick out all elements with 3 dirichlets
-			spc_elem=find(~flag_elem);
-			spc_node=sort(unique(md1.mesh.elements(spc_elem,:)));
-			flag=ones(md1.mesh.numberofvertices,1);
-			flag(spc_node)=0;
-			pos=find(sum(flag(md1.mesh.elements),2)==0);
-			flag_elem(pos)=0;
+			if getfieldvalue(options,'spccheck',1)
+				spc_elem=find(~flag_elem);
+				spc_node=sort(unique(md1.mesh.elements(spc_elem,:)));
+				flag=ones(md1.mesh.numberofvertices,1);
+				flag(spc_node)=0;
+				pos=find(sum(flag(md1.mesh.elements),2)==0);
+				flag_elem(pos)=0;
+			end
 
 			%extracted elements and nodes lists
@@ -1389,9 +1394,13 @@
 
 		end % }}}
-		function savemodeljs(md,modelname,websiteroot) % {{{
-
+		function savemodeljs(md,modelname,websiteroot,varargin) % {{{
+		
 			%the goal of this routine is to save the model as a javascript array that can be included in any html 
 			%file: 
 
+			options=pairoptions(varargin{:});
+			optimization=getfieldvalue(options,'optimize',0);
+
+			
 			%disp: 
 			disp(['saving model ''' modelname ''' in file ' websiteroot '/js/' modelname '.js']);
@@ -1412,4 +1421,12 @@
 				end
 
+				%some optimization: 
+				if optimization==1,
+					%optimize for plotting only:
+					if ~ismember(field,{'geometry','mesh','mask'}),
+						continue;
+					end
+				end
+
 				%Check that current field is an object
 				if ~isobject(md.(field))
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/classes/sealevelmodel.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/classes/sealevelmodel.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/classes/sealevelmodel.m	(revision 22481)
@@ -133,4 +133,47 @@
 			end
 		end % }}}
+		function listcaps(self) % {{{
+			for  i=1:length(self.icecaps),
+				disp(sprintf('%i: %s',i,self.icecaps{i}.miscellaneous.name));
+			end
+		end % }}}
+		function viscousiterations(self) % {{{
+			for  i=1:length(self.icecaps),
+				ic=self.icecaps{i}; 
+				mvi=ic.results.TransientSolution(1).StressbalanceConvergenceNumSteps;
+				for j=2:length(ic.results.TransientSolution)-1,
+					mvi=max(mvi,ic.results.TransientSolution(j).StressbalanceConvergenceNumSteps);
+				end
+				disp(sprintf('%i, %s: %i',i,self.icecaps{i}.miscellaneous.name,mvi));
+			end
+		end % }}}
+		function maxtimestep(self) % {{{
+			for  i=1:length(self.icecaps),
+				ic=self.icecaps{i}; 
+				mvi=length(ic.results.TransientSolution);
+				timei=ic.results.TransientSolution(end).time;
+				disp(sprintf('%i, %s: %i/%g',i,self.icecaps{i}.miscellaneous.name,mvi,timei));
+			end
+			mvi=length(self.earth.results.TransientSolution);
+			timei=self.earth.results.TransientSolution(end).time;
+			disp(sprintf('Earth: %i/%g',mvi,timei));
+		end % }}}
+		function self=homogeneize(self) % {{{
+			mintimestep=Inf;
+			for  i=1:length(self.icecaps),
+				ic=self.icecaps{i}; 
+				mintimestep=min(mintimestep, length(ic.results.TransientSolution));
+			end
+			mintimestep=min(mintimestep, length(self.earth.results.TransientSolution));
+			
+			for  i=1:length(self.icecaps),
+				ic=self.icecaps{i}; 
+				ic.results.TransientSolution=ic.results.TransientSolution(1:mintimestep);
+				self.icecaps{i}=ic;
+			end
+			ic=self.earth;
+			ic.results.TransientSolution=ic.results.TransientSolution(1:mintimestep);
+			self.earth=ic;
+		end % }}}
 	end
 end
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/classes/spatiallinearbasalforcings.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/classes/spatiallinearbasalforcings.m	(revision 22481)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/classes/spatiallinearbasalforcings.m	(revision 22481)
@@ -0,0 +1,110 @@
+%SPATIAL LINEAR BASAL FORCINGS class definition
+%
+%   Usage:
+%      spatiallinearbasalforcings=spatiallinearbasalforcings();
+
+classdef spatiallinearbasalforcings
+	properties (SetAccess=public) 
+		groundedice_melting_rate  = NaN;
+		deepwater_melting_rate    = NaN;
+		deepwater_elevation       = NaN;
+		upperwater_elevation      = NaN;
+		geothermalflux            = NaN;
+	end
+	methods
+		function self = spatiallinearbasalforcings(varargin) % {{{
+			switch nargin
+				case 0
+					self=setdefaultparameters(self);
+				case 1
+					lb=varargin{1};
+					if strcmpi(class(lb),'linearbasalforcings'),
+						nvertices=length(lb.groundedice_melting_rate);
+						self.groundedice_melting_rate=lb.groundedice_melting_rate;
+						self.geothermalflux=lb.geothermalflux;
+						self.deepwater_elevation=lb.deepwater_elevation*ones(nvertices,1);
+						self.deepwater_melting_rate=lb.deepwater_melting_rate*ones(nvertices,1);
+						self.upperwater_elevation=lb.upperwater_elevation*ones(nvertices,1);
+					else 
+						self=structtoobj(spatiallinearbasalforcings(),varargin{1});
+					end
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function self = extrude(self,md) % {{{
+			self.groundedice_melting_rate=project3d(md,'vector',self.groundedice_melting_rate,'type','node','layer',1); 
+			self.deepwater_melting_rate=project3d(md,'vector',self.deepwater_melting_rate,'type','node','layer',1); 
+			self.deepwater_elevation=project3d(md,'vector',self.deepwater_elevation,'type','node','layer',1); 
+			self.upperwater_elevation=project3d(md,'vector',self.upperwater_elevation,'type','node','layer',1); 
+			self.geothermalflux=project3d(md,'vector',self.geothermalflux,'type','node','layer',1); %bedrock only gets geothermal flux
+		end % }}}
+		function self = initialize(self,md) % {{{
+
+			if isnan(self.groundedice_melting_rate),
+				self.groundedice_melting_rate=zeros(md.mesh.numberofvertices,1);
+				disp('      no basalforcings.groundedice_melting_rate specified: values set as zero');
+			end
+
+		end % }}}
+		function self = setdefaultparameters(self) % {{{
+
+			%default values for melting parameterization: can't, we don't have the vertices information!
+			%self.deepwater_melting_rate = 50;
+			%self.deepwater_elevation    = -800;
+			%self.upperwater_elevation   = -400;
+
+		end % }}}
+		function md = checkconsistency(self,md,solution,analyses) % {{{
+
+			if ismember('MasstransportAnalysis',analyses) & ~(strcmp(solution,'TransientSolution') & md.transient.ismasstransport==0),
+				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'Inf',1,'timeseries',1);
+				md = checkfield(md,'fieldname','basalforcings.deepwater_melting_rate','NaN',1,'Inf',1,'timeseries',1,'>=',0);
+				md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','NaN',1,'Inf',1,'timeseries',1);
+				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','NaN',1,'Inf',1,'timeseries',1,'<',0);
+			end
+			if ismember('BalancethicknessAnalysis',analyses),
+				error('not implemented yet!');
+				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
+				md = checkfield(md,'fieldname','basalforcings.deepwater_melting_rate','>=',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','<','basalforcings.upperwater_elevation','numel',1);
+				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','<=',0,'numel',1);
+			end
+			if ismember('ThermalAnalysis',analyses) & ~(strcmp(solution,'TransientSolution') & md.transient.isthermal==0),
+				error('not implemented yet!');
+				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'Inf',1,'timeseries',1);
+				md = checkfield(md,'fieldname','basalforcings.deepwater_melting_rate','>=',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','<','basalforcings.upperwater_elevation','numel',1);
+				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','<',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'Inf',1,'timeseries',1,'>=',0);
+			end
+		end % }}}
+		function disp(self) % {{{
+			disp(sprintf('   basal forcings parameters:'));
+
+			fielddisplay(self,'groundedice_melting_rate','basal melting rate (positive if melting) [m/yr]');
+			fielddisplay(self,'deepwater_melting_rate','basal melting rate (positive if melting applied for floating ice whith base < deepwater_elevation) [m/yr]');
+			fielddisplay(self,'deepwater_elevation','elevation of ocean deepwater [m]');
+			fielddisplay(self,'upperwater_elevation','elevation of ocean upperwater [m]');
+			fielddisplay(self,'geothermalflux','geothermal heat flux [W/m^2]');
+
+		end % }}}
+		function marshall(self,prefix,md,fid) % {{{
+
+			yts=md.constants.yts;
+
+			floatingice_melting_rate=zeros(md.mesh.numberofvertices,1);
+			pos=find(md.geometry.base<=md.basalforcings.deepwater_elevation);
+			floatingice_melting_rate(pos)=md.basalforcings.deepwater_melting_rate(pos);
+			pos=find(md.geometry.base>md.basalforcings.deepwater_elevation & md.geometry.base<md.basalforcings.upperwater_elevation);
+			floatingice_melting_rate(pos)=md.basalforcings.deepwater_melting_rate(pos).*(md.geometry.base(pos)-md.basalforcings.upperwater_elevation(pos))./(md.basalforcings.deepwater_elevation(pos)-md.basalforcings.upperwater_elevation(pos));
+			WriteData(fid,prefix,'name','md.basalforcings.model','data',5,'format','Integer');
+			WriteData(fid,prefix,'data',floatingice_melting_rate,'format','DoubleMat','name','md.basalforcings.floatingice_melting_rate','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts)
+			WriteData(fid,prefix,'object',self,'fieldname','groundedice_melting_rate','format','DoubleMat','name','md.basalforcings.groundedice_melting_rate','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts)
+			WriteData(fid,prefix,'object',self,'fieldname','geothermalflux','name','md.basalforcings.geothermalflux','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
+			WriteData(fid,prefix,'object',self,'fieldname','deepwater_melting_rate','format','DoubleMat','name','md.basalforcings.deepwater_melting_rate','scale',1./yts,'mattype',1)
+			WriteData(fid,prefix,'object',self,'fieldname','deepwater_elevation','format','DoubleMat','name','md.basalforcings.deepwater_elevation','mattype',1)
+			WriteData(fid,prefix,'object',self,'fieldname','upperwater_elevation','format','DoubleMat','name','md.basalforcings.upperwater_elevation','mattype',1)
+		end % }}}
+	end
+end
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/exp/contourlevelzero.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/exp/contourlevelzero.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/exp/contourlevelzero.m	(revision 22481)
@@ -16,4 +16,9 @@
 x=md.mesh.x;
 y=md.mesh.y;
+if isfield(md.mesh,'z'),
+	z=md.mesh.z;
+else
+	z=zeros(md.mesh.numberofvertices,1);
+end
 index=md.mesh.elements;
 
@@ -82,4 +87,7 @@
 y1=zeros(numelems,1);
 y2=zeros(numelems,1);
+z1=zeros(numelems,1);
+z2=zeros(numelems,1);
+
 edge_l=zeros(numelems,2);
 
@@ -96,4 +104,7 @@
 		y1(j)=y(Seg1(poselem(j),1))+weight1*(y(Seg1(poselem(j),2))-y(Seg1(poselem(j),1)));
 		y2(j)=y(Seg2(poselem(j),1))+weight2*(y(Seg2(poselem(j),2))-y(Seg2(poselem(j),1)));
+		z1(j)=z(Seg1(poselem(j),1))+weight1*(z(Seg1(poselem(j),2))-z(Seg1(poselem(j),1)));
+		z2(j)=z(Seg2(poselem(j),1))+weight2*(z(Seg2(poselem(j),2))-z(Seg2(poselem(j),1)));
+
 		edge_l(j,1)=Seg1_num(poselem(j));
 		edge_l(j,2)=Seg2_num(poselem(j));
@@ -105,4 +116,7 @@
 		y1(j)=y(Seg1(poselem(j),1))+weight1*(y(Seg1(poselem(j),2))-y(Seg1(poselem(j),1)));
 		y2(j)=y(Seg3(poselem(j),1))+weight3*(y(Seg3(poselem(j),2))-y(Seg3(poselem(j),1)));
+		z1(j)=z(Seg1(poselem(j),1))+weight1*(z(Seg1(poselem(j),2))-z(Seg1(poselem(j),1)));
+		z2(j)=z(Seg3(poselem(j),1))+weight3*(z(Seg3(poselem(j),2))-z(Seg3(poselem(j),1)));
+
 		edge_l(j,1)=Seg1_num(poselem(j));
 		edge_l(j,2)=Seg3_num(poselem(j));
@@ -114,4 +128,7 @@
 		y1(j)=y(Seg2(poselem(j),1))+weight2*(y(Seg2(poselem(j),2))-y(Seg2(poselem(j),1)));
 		y2(j)=y(Seg3(poselem(j),1))+weight3*(y(Seg3(poselem(j),2))-y(Seg3(poselem(j),1)));
+		z1(j)=z(Seg2(poselem(j),1))+weight2*(z(Seg2(poselem(j),2))-z(Seg2(poselem(j),1)));
+		z2(j)=z(Seg3(poselem(j),1))+weight3*(z(Seg3(poselem(j),2))-z(Seg3(poselem(j),1)));
+
 		edge_l(j,1)=Seg2_num(poselem(j));
 		edge_l(j,2)=Seg3_num(poselem(j));
@@ -130,5 +147,6 @@
 	%take the right edge of the second segment and connect it to the next segments if any
 	e1=edge_l(1,1);   e2=edge_l(1,2);
-	xc=[x1(1);x2(1)]; yc=[y1(1);y2(1)];
+	xc=[x1(1);x2(1)]; yc=[y1(1);y2(1)]; zc=[z1(1);z2(1)];
+
 
 	%erase the lines corresponding to this edge
@@ -136,4 +154,5 @@
 	x1(1)=[]; x2(1)=[];
 	y1(1)=[]; y2(1)=[];
+	z1(1)=[]; z2(1)=[];
 
 	[ro1,co1]=find(edge_l==e1);
@@ -142,5 +161,5 @@
 
 		if co1==1,
-			xc=[x2(ro1);xc]; yc=[y2(ro1);yc];
+			xc=[x2(ro1);xc]; yc=[y2(ro1);yc];zc=[z2(ro1);zc];
 
 			%next edge:
@@ -148,5 +167,5 @@
 
 		else
-			xc=[x1(ro1);xc]; yc=[y1(ro1);yc];
+			xc=[x1(ro1);xc]; yc=[y1(ro1);yc];zc=[z1(ro1);zc];
 
 			%next edge:
@@ -158,4 +177,5 @@
 		x1(ro1)=[]; x2(ro1)=[];
 		y1(ro1)=[]; y2(ro1)=[];
+		z1(ro1)=[]; z2(ro1)=[];
 
 		%next connection
@@ -169,10 +189,10 @@
 
 		if co2==1,
-			xc=[xc;x2(ro2)]; yc=[yc;y2(ro2)];
+			xc=[xc;x2(ro2)]; yc=[yc;y2(ro2)];zc=[zc;z2(ro2)];
 
 			%next edge:
 			e2=edge_l(ro2,2);
 		else
-			xc=[xc;x1(ro2)]; yc=[yc;y1(ro2)];
+			xc=[xc;x1(ro2)]; yc=[yc;y1(ro2)]; zc=[zc;z1(ro2)];
 
 			%next edge:
@@ -184,4 +204,5 @@
 		x1(ro2)=[]; x2(ro2)=[];
 		y1(ro2)=[]; y2(ro2)=[];
+		z1(ro2)=[]; z2(ro2)=[];
 
 		%next connection
@@ -192,4 +213,5 @@
 	contours(end+1).x=xc;
 	contours(end).y=yc;
+	contours(end).z=zc;
 	contours(end).name='';
 	contours(end).nods=length(xc);
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/mesh/meshintersect.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/mesh/meshintersect.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/mesh/meshintersect.m	(revision 22481)
@@ -28,4 +28,8 @@
 			end
 			error('one or more vertices on the global mesh were duplicated!');
+		elseif isempty(s),
+			plot(distance)
+			min(distance)
+			error('could not find vertices in common, relax tolerance?');
 		else
 			indices(i)=s;
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/mesh/modelmerge2d.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/mesh/modelmerge2d.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/mesh/modelmerge2d.m	(revision 22481)
@@ -10,5 +10,5 @@
 	tolerance=getfieldvalue(options,'tolerance',10^-5);
 	
-	md=model();
+	md=md1; %by default, we transfer all the settings from md1 to md.
 
 	%first ,copy md1 mesh into md.mesh to initialize: 
@@ -83,6 +83,84 @@
 	md.mesh.vertexonboundary(md.mesh.segments(:,1:2))=1;
 
+	if getfieldvalue(options,'full',0),
+		%we are asked to merge the classes fields too. We need have vertex and element mappings first: 
+		%vertex intersections:
+		md.mesh.extractedvertices={meshintersect(x,y,md1.mesh.x,md1.mesh.y,'tolerance',1e-5), meshintersect(x,y,md2.mesh.x,md2.mesh.y,'tolerance',1e-5)};
+		%element intersections:
+		xe=x(md.mesh.elements)*[1;1;1]/3; ye=y(md.mesh.elements)*[1;1;1]/3;
+		x1e=md1.mesh.x(md1.mesh.elements)*[1;1;1]/3; y1e=md1.mesh.y(md1.mesh.elements)*[1;1;1]/3;
+		x2e=md2.mesh.x(md2.mesh.elements)*[1;1;1]/3; y2e=md2.mesh.y(md2.mesh.elements)*[1;1;1]/3;
+		md.mesh.extractedelements= {meshintersect(xe,ye,x1e,y1e,'tolerance',1e-5) , meshintersect(xe,ye,x2e,y2e,'tolerance',1e-5)};
+
+		%now we can go through classes and transfer.
+		md=transfer_fields(md,md1,md2,'geometry',{'thickness','surface','bed','base'});
+		md=transfer_fields(md,md1,md2,'mask',{'groundedice_levelset','ice_levelset','ocean_levelset','land_levelset','glacier_levelset'});
+		md=transfer_fields(md,md1,md2,'smb',{'mass_balance'});
+		if strcmpi(class(md1.basalforcings),'linearbasalforcings'),
+			md=transfer_fields(md,md1,md2,'basalforcings',{'groundedice_melting_rate','geothermalflux'});
+		else
+			md=transfer_fields(md,md1,md2,'basalforcings',{'groundedice_melting_rate','deepwater_melting_rate','deepwater_elevation','upperwater_elevation','geothermalflux'});
+		end
+		md=transfer_fields(md,md1,md2,'materials',{'rheology_B','rheology_n'});
+		md=transfer_fields(md,md1,md2,'friction',{'coefficient','p','q'});
+		md=transfer_fields(md,md1,md2,'flowequation',{'vertex_equation','element_equation','borderSSA','borderFS','borderHO'});
+		md=transfer_fields(md,md1,md2,'initialization',{'vx','vy','vz','vel','pressure','temperature'});
+		md=transfer_fields(md,md1,md2,'slr',{'deltathickness','sealevel','spcthickness','steric_rate'});
+		md=transfer_fields(md,md1,md2,'masstransport',{'spcthickness'});
+		md=transfer_fields(md,md1,md2,'thermal',{'spctemperature'});
+		md=transfer_fields(md,md1,md2,'inversion',{'min_parameters','max_parameters','vx_obs','vy_obs','vz_obs'});
+		md.inversion.cost_functions_coefficients=zeros(md.mesh.numberofvertices,3);
+		md.inversion.cost_functions_coefficients(md.mesh.extractedvertices{1},:)=md1.inversion.cost_functions_coefficients;
+		md.inversion.cost_functions_coefficients(md.mesh.extractedvertices{2},:)=md2.inversion.cost_functions_coefficients;
+
+		%boundary conditions: 
+		md=transfer_fields(md,md1,md2,'stressbalance',{'spcvx','spcvy','spcvz'});
+		md.stressbalance.loadingforce=zeros(md.mesh.numberofvertices,3);
+		md.stressbalance.referential=NaN*ones(md.mesh.numberofvertices,6);
+		bound1=zeros(md.mesh.numberofvertices,1); bound1(md.mesh.extractedvertices{1})=md1.mesh.vertexonboundary;
+		bound2=zeros(md.mesh.numberofvertices,1); bound2(md.mesh.extractedvertices{2})=md2.mesh.vertexonboundary;
+		boundary=bound1 & bound2;
+		pos=find(boundary); md.stressbalance.spcvx(pos)=NaN; md.stressbalance.spcvy(pos)=NaN; md.stressbalance.spcvz(pos)=NaN;
+	end
+
+	
 	%some checks: 
 	if max(md.mesh.elements)>md.mesh.numberofvertices, 
 		error('issue in modelmerge, one of the element ids is > number of vertices!');
 	end
+
+end %end of function
+
+function prop=transfer_vertices(md,md1,md2,field1,field2) % {{{
+	f1=getfield(md1,field1); f2=getfield(f1,field2); 
+	if length(f2)==md1.mesh.numberofvertices,
+		prop=zeros(md.mesh.numberofvertices,1); 
+		prop(md.mesh.extractedvertices{1})=f2;
+		f1=getfield(md2,field1); f2=getfield(f1,field2); prop(md.mesh.extractedvertices{2})=f2;
+	else
+		prop=zeros(md.mesh.numberofvertices+1,1);  prop(end)=f2(end);
+		prop(md.mesh.extractedvertices{1})=f2(1:end-1);
+		f1=getfield(md2,field1); f2=getfield(f1,field2); prop(md.mesh.extractedvertices{2})=f2(1:end-1);
+		prop=zeros(md.mesh.numberofvertices+1,1); 
+	end
+	
+	
+end %end of function %}}}
+function prop=transfer_elements(md,md1,md2,field1,field2) % {{{
+	prop=zeros(md.mesh.numberofelements,1); 
+	f1=getfield(md1,field1); f2=getfield(f1,field2); prop(md.mesh.extractedelements{1})=f2;
+	f1=getfield(md2,field1); f2=getfield(f1,field2); prop(md.mesh.extractedelements{2})=f2;
+
+end %end of function %}}}
+function md=transfer_fields(md,md1,md2,classname,classfields) % {{{
+
+	for i=1:length(classfields),
+		field1=eval(['md1.' classname '.' classfields{i}]); 
+		if length(field1)==md1.mesh.numberofvertices | length(field1)==md1.mesh.numberofvertices+1,
+			eval(['md.' classname '.' classfields{i} '=transfer_vertices(md,md1,md2,''' classname ''',''' classfields{i} ''');']);
+		else
+			eval(['md.' classname '.' classfields{i} '=transfer_elements(md,md1,md2,''' classname ''',''' classfields{i} ''');']);
+		end
+	end
+
+end %end of function %}}}
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/applyoptions.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/applyoptions.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/applyoptions.m	(revision 22481)
@@ -265,4 +265,24 @@
 	end
 end
+
+%shpdisp
+if exist(options,'shpdisp'),
+	filename=(getfieldvalue(options,'shpdisp'));
+	style=(getfieldvalue(options,'shpstyle',{'r.-'}));
+	linewidth=(getfieldvalue(options,'linewidth',1));
+	for i=1:length(getfieldvalue(options,'shpdisp')),
+		filenamei=filename{i};
+		stylei=style{i};
+		if length(linewidth)==1,
+			linewidthi=linewidth;
+		else
+			linewidthi=linewidth{i};
+		end
+		%shpdisp(filenamei,'linestyle',stylei,'linewidth',linewidthi,'multiplier',getfieldvalue(options,'unit',1));
+		shpdisp(filenamei,1,stylei,linewidthi,getfieldvalue(options,'unit',1));
+	end
+end
+
+
 
 %text (default value is empty, not NaN...)
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/googlemaps.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/googlemaps.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/googlemaps.m	(revision 22481)
@@ -121,5 +121,5 @@
 
 %Write image
-imwrite(final,'temp.png','png')
+imwrite(final,'temp.png','png');
 [ulmx ulmy]=ll2mercator(ullat,ullon);
 [lrmx lrmy]=ll2mercator(lrlat,lrlon);
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_contour.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_contour.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_contour.m	(revision 22481)
@@ -21,5 +21,5 @@
 if datatype==1,
 	%elements -> take average
-	data=averaging(md,data,0)
+	data=averaging(md,data,0);
 elseif datatype==2,
 	%nodes -> do nothing
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_riftrelvel.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_riftrelvel.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_riftrelvel.m	(revision 22481)
@@ -110,4 +110,8 @@
 hold off
 
+%xlim and ylim: 
+if ~exist(options,'xlim') options=addfielddefault(options,'xlim',[min(md.mesh.x) max(md.mesh.x)]); end 
+if ~exist(options,'ylim') options=addfielddefault(options,'ylim',[min(md.mesh.y) max(md.mesh.y)]); end
+
 %apply options
 quiver_colorbar(quivers,options);
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_rifts.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_rifts.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_rifts.m	(revision 22481)
@@ -24,6 +24,9 @@
 			normal(1)=penaltypairs(j,5);
 			normal(2)=penaltypairs(j,6);
-			x(penaltypairs(j,1))=x(penaltypairs(j,1))-normal(1)*offset;
-			y(penaltypairs(j,1))=y(penaltypairs(j,1))-normal(2)*offset;
+			x(penaltypairs(j,1))=x(penaltypairs(j,1))-normal(1)*offset/2;
+			y(penaltypairs(j,1))=y(penaltypairs(j,1))-normal(2)*offset/2;
+			x(penaltypairs(j,2))=x(penaltypairs(j,2))+normal(1)*offset/2;
+			y(penaltypairs(j,2))=y(penaltypairs(j,2))+normal(2)*offset/2;
+
 		end
 		if length(md.rifts.riftstruct(i).tips)==3,
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_riftvel.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_riftvel.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/plot_riftvel.m	(revision 22481)
@@ -101,4 +101,8 @@
 hold off
 
+%xlim and ylim: 
+if ~exist(options,'xlim') options=addfielddefault(options,'xlim',[min(md.mesh.x) max(md.mesh.x)]); end 
+if ~exist(options,'ylim') options=addfielddefault(options,'ylim',[min(md.mesh.y) max(md.mesh.y)]); end
+
 %apply options
 quiver_colorbar(quivers,options);
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/showregion.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/showregion.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/plot/showregion.m	(revision 22481)
@@ -29,6 +29,6 @@
 mdy=[min(md.mesh.y) max(md.mesh.y)];
 
-line(A.x,A.y,'color','b');
 patch([Ax(1)  Ax(2)  Ax(2)  Ax(1) Ax(1)],[Ay(1)  Ay(1)  Ay(2)  Ay(2) Ay(1)],[1 1 1],'EdgeColor',[0 0 0],'LineWidth',1,'FaceLighting','none')
 patch( [mdx(1) mdx(2) mdx(2) mdx(1)],[mdy(1) mdy(1) mdy(2) mdy(2)],ones(4,1),'EdgeColor',[0 0 0],'FaceColor','r','FaceAlpha',0.5)
+line(A.x,A.y,'color','k');
 colorbar('off');
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/solve/loadresultsfromcluster.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/solve/loadresultsfromcluster.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/solve/loadresultsfromcluster.m	(revision 22481)
@@ -1,17 +1,26 @@
-function md=loadresultsfromcluster(md,runtimename)
+function md=loadresultsfromcluster(md,varargin)
 %LOADRESULTSFROMCLUSTER - load results of solution sequence from cluster
 %
 %   Usage:
-%      md=loadresultsfromcluster(md,runtimename);
+%      md=loadresultsfromcluster(md,varargin);
+%      options include runtimename and nolog.
+
+%process options: 
+options=pairoptions(varargin{:});
+nolog=getfieldvalue(options,'nolog',0);
 
 %retrieve cluster, to be able to call its methods
 cluster=md.cluster;
 
-if nargin==2,
-	md.private.runtimename=runtimename;
+if exist(options,'runtimename'),
+	md.private.runtimename=getfieldvalue(optoins,'runtimename');
 end
 
 %Download outputs from the cluster
-filelist={[md.miscellaneous.name '.outlog'],[md.miscellaneous.name '.errlog']};
+if ~nolog,
+	filelist={[md.miscellaneous.name '.outlog'],[md.miscellaneous.name '.errlog']};
+else
+	filelist={};
+end
 if md.qmu.isdakota,
 	filelist{end+1}=[md.miscellaneous.name '.qmu.err'];
@@ -35,6 +44,8 @@
 	delete([['qmu' num2str(feature('GetPid')) '/']  md.miscellaneous.name '.errlog']);
 else
-	delete([md.miscellaneous.name '.outlog']);
-	delete([md.miscellaneous.name '.errlog']);
+	if ~nolog,
+		delete([md.miscellaneous.name '.outlog']);
+		delete([md.miscellaneous.name '.errlog']);
+	end
 	delete([md.miscellaneous.name '.outbin']);
 	if exist([md.private.runtimename '.tar.gz']) & ~ispc(),
Index: /issm/branches/trunk-larour-NatGeoScience2016/src/m/solve/loadresultsfromclusterslm.m
===================================================================
--- /issm/branches/trunk-larour-NatGeoScience2016/src/m/solve/loadresultsfromclusterslm.m	(revision 22480)
+++ /issm/branches/trunk-larour-NatGeoScience2016/src/m/solve/loadresultsfromclusterslm.m	(revision 22481)
@@ -10,5 +10,5 @@
 	%go through icecaps and download results
 	for i=1:length(slm.icecaps),
-		slm.icecaps{i}=loadresultsfromcluster(slm.icecaps{i});
+		slm.icecaps{i}=loadresultsfromcluster(slm.icecaps{i},'nolog',1);
 	end
-	slm.earth=loadresultsfromcluster(slm.earth);
+	slm.earth=loadresultsfromcluster(slm.earth,'nolog',1);
