Index: /issm/trunk-jpl/src/m/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/m/Makefile.am	(revision 20294)
+++ /issm/trunk-jpl/src/m/Makefile.am	(revision 20295)
@@ -100,4 +100,5 @@
 				${ISSM_DIR}/src/m/classes/inversion.js \
 				${ISSM_DIR}/src/m/classes/mask.js \
+				${ISSM_DIR}/src/m/classes/maskpsl.js \
 				${ISSM_DIR}/src/m/classes/masstransport.js \
 				${ISSM_DIR}/src/m/classes/matice.js \
Index: /issm/trunk-jpl/src/m/classes/clusters/generic.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/clusters/generic.js	(revision 20294)
+++ /issm/trunk-jpl/src/m/classes/clusters/generic.js	(revision 20295)
@@ -74,11 +74,11 @@
 		solutionlength[0] = solutionbuffer.byteLength;
 		
-		var binbuffer = new Uint16Array(fid.buffer);
+		var binbuffer = new Uint16Array(fid.rawbuffer());
+
 		var binlength = new Uint32Array(1);
 		binlength[0] = binbuffer.byteLength;
 		
 		var data = new Blob([runtimenamelength,runtimenamebuffer,namelength,namebuffer,toolkitslength,toolkitsbuffer,solutionlength,solutionbuffer,binlength,binbuffer]);
-		//console.log(fid.buffer);
-		if (typeof(download) != "undefined") download(fid.buffer);
+		if (typeof(download) != "undefined") download(fid.rawbuffer());
 		oReq.send(data);
 		
@@ -86,5 +86,5 @@
 
 	} //}}}
-	this.ab2str = function(buf) {
+	this.ab2str = function(buf) { //{{{
 		return String.fromCharCode.apply(null, new Uint16Array(buf));
 	}
@@ -95,4 +95,4 @@
 		}
 		return buf;
-	}
+	} //}}}
 }
Index: /issm/trunk-jpl/src/m/classes/maskpsl.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/maskpsl.js	(revision 20295)
+++ /issm/trunk-jpl/src/m/classes/maskpsl.js	(revision 20295)
@@ -0,0 +1,89 @@
+//MASKPSL class definition
+//
+//   Usage:
+//      maskpsl= new maskpsl();
+
+function maskpsl () {
+	//properties 
+	// {{{
+		this.groundedice_levelset                           = NaN;
+		this.ice_levelset                           = NaN;
+		this.land_levelset                           = NaN;
+		this.ocean_levelset                           = NaN;
+		//}}}
+	//methods 
+		this.setdefaultparameters = function (){ //{{{
+		} // }}}
+		this.disp = function () { //{{{
+			console.log(sprintf("   mask:")); 
+
+			fielddisplay(this,"groundedice_levelset","is ice grounded ? grounded ice if > 0, grounding line position if = 0, floating ice if < 0");
+			fielddisplay(this,"ice_levelset","presence of ice if < 0, icefront position if = 0, no ice if > 0");
+			fielddisplay(this,"ocean_levelset","is the vertex on the ocean? yes if = 1, no if = 0");
+			fielddisplay(this,"land_levelset","is the vertex on land? yes if = 1, no if = 0");
+		} //}}}
+		this.classname = function () { //{{{
+			return "maskpsl";
+		} //}}}
+		this.checkconsistency = function(md,solution,analyses){ //{{{
+
+			checkfield(md,'fieldname','mask.groundedice_levelset','size',[md.mesh.numberofvertices, 1]);
+			checkfield(md,'fieldname','mask.ice_levelset'        ,'size',[md.mesh.numberofvertices, 1]);
+			checkfield(md,'fieldname','mask.ocean_levelset'        ,'size',[md.mesh.numberofvertices, 1]);
+			checkfield(md,'fieldname','mask.land_levelset'        ,'size',[md.mesh.numberofvertices, 1]);
+			
+			var isice=NewArrayFill(md.mesh.numberofvertices,0); 
+			for(var i=0;i<md.mesh.numberofvertices;i++)if(md.mask.ice_levelset[i]<=0)isice[i]=1;
+			if (ArraySum(isice)==0){
+				console.log('no ice present in the domain');
+			}
+			if (ArrayMax(md.mask.ice_levelset)<0){
+				console.log('no ice front provided');
+			}
+				
+			var icefront=NewArrayFill(md.mesh.numberofelements,0);
+			for(var i=0;i<md.mesh.numberofelements;i++){
+				for(var j=0;j<md.mesh.elements[0].length;j++){
+					icefront[i]+=(md.mask.ice_levelset[md.mesh.elements[i][j]-1]==0);
+				}
+			}
+			if ((ArrayMax(icefront)==3 & (md.mesh.elementtype() == 'Tria')) | (ArrayMax(icefront)==6 & md.mesh.elementtype() == 'Penta')){
+				if (md.mesh.elementtype()=='Tria'){
+					var pos=ArrayFindEqual(icefront,3); numberemptyelements=pos.length;
+				}
+				else if (md.mesh.elementtype() == 'Penta'){
+					var pos=ArrayFindEqual(icefront,6); numberemptyelements=pos.length;
+				}
+				throw Error(sprintf(" %i have all nodes on ice front, change md.mask.ice_levelset to fix it",numberemptyelements));
+			}
+		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'class','mask','fieldname','groundedice_levelset','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'class','mask','fieldname','ice_levelset','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'class','mask','fieldname','ocean_levelset','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'class','mask','fieldname','land_levelset','format','DoubleMat','mattype',1);
+
+			// get mask of vertices of elements with ice
+			var isice= NewArrayFill(md.mesh.numberofvertices,0);
+			for(var i=0;i<md.mesh.numberofvertices;i++)if(md.mask.ice_levelset[i]<=0)isice[i]=1;
+			
+			var vlist = NewArrayFill(md.mesh.numberofvertices,0);
+			var pos=[];
+			for(var i=0;i<md.mesh.numberofelements;i++){
+				var sum=0;
+				for(var j=0;j<md.mesh.elements[0].length;j++){
+					sum+=isice[md.mesh.elements[i][j]-1];
+				}
+				if(sum>0)pos.push(i);
+			}
+			for(var i=0;i<pos.length;i++){
+				for(var j=0;j<md.mesh.elements[0].length;j++){
+					vlist[md.mesh.elements[pos[i]][j]-1]=1;
+				}
+			}
+			WriteData(fid,'data',vlist,'enum',IceMaskNodeActivationEnum(),'format','DoubleMat','mattype',1);
+		}//}}}
+		this.fix=function() { //{{{
+		}//}}}
+
+}
Index: /issm/trunk-jpl/src/m/classes/maskpsl.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/maskpsl.m	(revision 20294)
+++ /issm/trunk-jpl/src/m/classes/maskpsl.m	(revision 20295)
@@ -83,4 +83,5 @@
 		function savemodeljs(self,fid,modelname) % {{{
 		
+			fprintf(fid,'%s.mask=new maskpsl();\n',modelname);
 			writejs1Darray(fid,[modelname '.mask.groundedice_levelset'],self.groundedice_levelset);
 			writejs1Darray(fid,[modelname '.mask.ice_levelset'],self.ice_levelset);
Index: /issm/trunk-jpl/src/m/classes/outputdefinition.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/outputdefinition.m	(revision 20294)
+++ /issm/trunk-jpl/src/m/classes/outputdefinition.m	(revision 20295)
@@ -50,5 +50,6 @@
 		end % }}}
 		function savemodeljs(self,fid,modelname) % {{{
-		
+
+			fprintf(fid,'%s.outputdefinition.definitions=[];\n',modelname);
 			if ~isempty(self.definitions),
 				error('outputdefinition savemodeljs error message: not supported yet!');
