Index: /issm/trunk-jpl/jenkins/javascript/karma/karma.conf.js
===================================================================
--- /issm/trunk-jpl/jenkins/javascript/karma/karma.conf.js	(revision 20798)
+++ /issm/trunk-jpl/jenkins/javascript/karma/karma.conf.js	(revision 20799)
@@ -23,4 +23,5 @@
       'lib/bin/mask.js',
       'lib/bin/geometry.js',
+      'lib/bin/friction.js',
       'lib/bin/project3d.js',
       'lib/bin/model.js',
Index: /issm/trunk-jpl/jenkins/javascript/karma/lib/bin/friction.js
===================================================================
--- /issm/trunk-jpl/jenkins/javascript/karma/lib/bin/friction.js	(revision 20799)
+++ /issm/trunk-jpl/jenkins/javascript/karma/lib/bin/friction.js	(revision 20799)
@@ -0,0 +1,63 @@
+//FRICTION class definition
+//
+//   Usage:
+//      friction=friction();
+
+function friction (){
+	//methods
+	this.setdefaultparameters = function(){ // {{{
+
+	} // }}}
+	this.disp= function (){// {{{
+		console.log(sprintf('Basal shear stress parameters: Sigma_b = coefficient^2 * Neff ^r * |u_b|^(s-1) * u_b\n(effective stress Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p)'));
+		fielddisplay(this,'coefficient','friction coefficient [SI]');
+		fielddisplay(this,'p','p exponent');
+		fielddisplay(this,'q','q exponent');
+	} // }}}
+    this.extrude = function(md) {//{{{
+
+        console.log("coefficient");
+        console.log(self.coefficient);
+        console.log("p");
+        console.log(self.p);
+        console.log("q");
+        console.log(self.q);
+        self.coefficient = project3d(md, 'vector', self.coefficient, 'type', 'node', 'layer', 1);
+        self.p = project3d(md, 'vector', self.p, 'type', 'element');
+        self.q = project3d(md, 'vector', self.q, 'type', 'element');
+    }//}}}
+	this.classname= function (){// {{{
+		return "friction";
+	} // }}}
+		this.checkconsistency = function(md,solution,analyses){ //{{{
+
+			//Early return
+			if ((!ArrayAnyEqual(ArrayIsMember(StressbalanceAnalysisEnum(),analyses),1)) & (!ArrayAnyEqual(ArrayIsMember(StressbalanceAnalysisEnum(),analyses),1))){
+				return; 
+			}
+			md = checkfield(md,'fieldname','friction.coefficient','timeseries',1,'NaN',1,'Inf',1);
+			md = checkfield(md,'fieldname','friction.q','NaN',1,'Inf',1,'size',[md.mesh.numberofelements ,1]);
+			md = checkfield(md,'fieldname','friction.p','NaN',1,'Inf',1,'size',[md.mesh.numberofelements ,1]);
+
+		} // }}}
+		this.marshall=function(md,prefix,fid) { //{{{
+			var yts=365.0*24.0*3600.0;
+
+			WriteData(fid,prefix,'name','md.friction.law','data',1,'format','Integer');
+			WriteData(fid,prefix,'object',this,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+			//WriteData(fid,prefix,'object',this,'fieldname','coefficient','format','DoubleMat','mattype',1);
+			WriteData(fid,prefix,'object',this,'fieldname','p','format','DoubleMat','mattype',2);
+			WriteData(fid,prefix,'object',this,'fieldname','q','format','DoubleMat','mattype',2);
+			
+
+		}//}}}
+		this.fix=function() { //{{{
+		}//}}}
+	//properties 
+	//{{{
+	this.coefficient = NaN;
+	this.p           = NaN;
+	this.q           = NaN;
+	this.setdefaultparameters();
+	//}}}
+}
Index: /issm/trunk-jpl/jenkins/javascript/karma/lib/bin/model.js
===================================================================
--- /issm/trunk-jpl/jenkins/javascript/karma/lib/bin/model.js	(revision 20798)
+++ /issm/trunk-jpl/jenkins/javascript/karma/lib/bin/model.js	(revision 20799)
@@ -336,6 +336,6 @@
             md.mesh.long=project3d(md,'vector',md.mesh.long,'type','node');
 
-            md.geometry=md.geometry.extrude(md);
-                md.friction  = extrude(md.friction,md);
+                md.geometry=md.geometry.extrude(md);
+                md.friction  = md.friction.extrude(md);
                 md.inversion = extrude(md.inversion,md);
                 md.smb = extrude(md.smb,md);
Index: /issm/trunk-jpl/jenkins/javascript/karma/lib/bin/project3d.js
===================================================================
--- /issm/trunk-jpl/jenkins/javascript/karma/lib/bin/project3d.js	(revision 20798)
+++ /issm/trunk-jpl/jenkins/javascript/karma/lib/bin/project3d.js	(revision 20799)
@@ -57,5 +57,5 @@
     paddingvalue = options.getfieldvalue('padding',0);  //0 by default
 
-    if (vector2d.length === 1) {
+    if (isNaN(vector2d) || vector2d.length === 1) { // NaN treated as length 1 in MATLAB
         projected_vector=vector2d;
     } else if (type.toLowerCase() === 'node') {
Index: /issm/trunk-jpl/src/m/classes/friction.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/friction.js	(revision 20798)
+++ /issm/trunk-jpl/src/m/classes/friction.js	(revision 20799)
@@ -15,4 +15,16 @@
 		fielddisplay(this,'q','q exponent');
 	} // }}}
+    this.extrude = function(md) {//{{{
+
+        console.log("coefficient");
+        console.log(self.coefficient);
+        console.log("p");
+        console.log(self.p);
+        console.log("q");
+        console.log(self.q);
+        self.coefficient = project3d(md, 'vector', self.coefficient, 'type', 'node', 'layer', 1);
+        self.p = project3d(md, 'vector', self.p, 'type', 'element');
+        self.q = project3d(md, 'vector', self.q, 'type', 'element');
+    }//}}}
 	this.classname= function (){// {{{
 		return "friction";
