Index: /issm/trunk-jpl/src/m/classes/SMBgradientscomponents.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/SMBgradientscomponents.m	(revision 23365)
+++ /issm/trunk-jpl/src/m/classes/SMBgradientscomponents.m	(revision 23365)
@@ -0,0 +1,90 @@
+%SMBgradientscomponents Class definition
+%
+%   Usage:
+%      SMBgradientscomponents=SMBgradientscomponents();
+
+classdef SMBgradientscomponents
+	properties (SetAccess=public)
+		accuref					  = NaN;
+		accualti				  = NaN;
+		accugrad				  = NaN;
+		runoffref				  = NaN;
+		runoffalti			  = NaN;
+		runoffgrad			  = NaN;
+		requested_outputs = {};
+	end
+	methods
+		function self=SMBgradientscomponents(varargin) % {{{
+			switch nargin
+				case 0
+					self=setdefaultparameters(self);
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+
+		function self = extrude(self,md) % {{{
+
+		%Nothing for now
+
+		end % }}}
+		function list = defaultoutputs(self,md) % {{{
+			list = {'runoff'};
+		end % }}}
+		function self = initialize(self,md) % {{{
+
+		%Nothing done for now
+
+		end % }}}
+		function self = setdefaultparameters(self) % {{{
+
+		%Nothing for now
+
+		end % }}}
+		function	md=checkconsistency(self,md,solution,analyses) % {{{
+			if ismember('MasstransportAnalysis',analyses),
+				md = checkfield(md,'fieldname','smb.accuref','timeseries',1,'NaN',1,'Inf',1);
+				md = checkfield(md,'fieldname','smb.accualti','numel',1,'NaN',1,'Inf',1);
+				md = checkfield(md,'fieldname','smb.accugrad','numel',1,'NaN',1,'Inf',1);
+				md = checkfield(md,'fieldname','smb.runoffref','timeseries',1,'NaN',1,'Inf',1);
+				md = checkfield(md,'fieldname','smb.runoffalti','numel',1,'NaN',1,'Inf',1);
+				md = checkfield(md,'fieldname','smb.runoffgrad','numel',1,'NaN',1,'Inf',1);
+			end
+			md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1);
+		end % }}}
+
+		function disp(self) % {{{
+			disp(sprintf('   surface forcings parameters:'));
+			disp(sprintf('\n   SMB gradients components parameters:'));
+			fielddisplay(self,'accuref',' reference value of the accumulation');
+			fielddisplay(self,'accualti',' Altitude at which the accumulation is equal to the reference value');
+			fielddisplay(self,'accugrad',' Gradient of the variation of the accumulation (0 for uniform accumulation)');
+			fielddisplay(self,'runoffref',' reference value of the runoff m w.e. y-1 (temperature times ddf)');
+			fielddisplay(self,'runoffalti',' Altitude at which the runoff is equal to the reference value');
+			fielddisplay(self,'runoffgrad',' Gradient of the variation of the runoff (0 for uniform runoff) m w.e. m-1 y-1 (lpase rate times ddf)');
+			fielddisplay(self,'requested_outputs','additional outputs requested');
+
+		end % }}}
+		function marshall(self,prefix,md,fid)    % {{{
+
+			WriteData(fid,prefix,'name','md.smb.model','data',11,'format','Integer');
+			WriteData(fid,prefix,'object',self,'class','smb','fieldname','accuref','format','DoubleMat','mattype',1,'timeserieslength',2,'yts',md.constants.yts,'scale',1./md.constants.yts);
+			WriteData(fid,prefix,'object',self,'class','smb','fieldname','accualti','format','Double');
+			WriteData(fid,prefix,'object',self,'class','smb','fieldname','accugrad','format','Double','scale',1./md.constants.yts);
+			WriteData(fid,prefix,'object',self,'class','smb','fieldname','runoffref','format','DoubleMat','mattype',1,'timeserieslength',2,'yts',md.constants.yts,'scale',1./md.constants.yts);
+			WriteData(fid,prefix,'object',self,'class','smb','fieldname','runoffalti','format','Double');
+			WriteData(fid,prefix,'object',self,'class','smb','fieldname','runoffgrad', ...
+								'format','Double','scale',1./md.constants.yts);
+
+			%process requested outputs
+			outputs = self.requested_outputs;
+			pos  = find(ismember(outputs,'default'));
+			if ~isempty(pos),
+				outputs(pos) = [];                         %remove 'default' from outputs
+				outputs      = [outputs defaultoutputs(self,md)]; %add defaults
+			end
+			WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray');
+
+		end % }}}
+	end
+end
Index: /issm/trunk-jpl/src/m/classes/SMBgradientscomponents.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/SMBgradientscomponents.py	(revision 23365)
+++ /issm/trunk-jpl/src/m/classes/SMBgradientscomponents.py	(revision 23365)
@@ -0,0 +1,78 @@
+from fielddisplay import fielddisplay
+from checkfield import checkfield
+from WriteData import WriteData
+from project3d import project3d
+
+class SMBgradientscomponents(object):
+	"""
+	SMBgradients Class definition
+
+	   Usage:
+	      SMBgradients=SMBgradientscomponents();
+	For now it has accumulation, runoff ans retention which could be aither refreezing and/or evaporation
+	"""
+
+	def __init__(self): # {{{
+		self.accuref					 = float('NaN')
+		self.accualti					 = float('NaN')
+		self.accugrad					 = float('NaN')
+		self.runoffref				 = float('NaN')
+		self.runoffalti				 = float('NaN')
+		self.runoffgrad				 = float('NaN')
+		self.requested_outputs = ['default']
+		#}}}
+	def __repr__(self): # {{{
+		string="   surface forcings parameters:"
+		string="%s\n%s"%(string,fielddisplay(self,'accuref',' reference value of the accumulation'))
+		string="%s\n%s"%(string,fielddisplay(self,'accualti',' Altitude at which the accumulation is equal to the reference value'))
+		string="%s\n%s"%(string,fielddisplay(self,'accugrad',' Gradient of the variation of the accumulation (0 for uniform accumulation)'))
+		string="%s\n%s"%(string,fielddisplay(self,'runoffref',' reference value of the runoff m w.e. y-1 (temperature times ddf)'))
+		string="%s\n%s"%(string,fielddisplay(self,'runoffalti',' Altitude at which the runoff is equal to the reference value'))
+		string="%s\n%s"%(string,fielddisplay(self,'runoffgrad',' Gradient of the variation of the runoff (0 for uniform runoff) m w.e. m-1 y-1 (lpase rate times ddf)'))
+		string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','additional outputs requested'))
+
+		return string
+		#}}}
+	def extrude(self,md): # {{{
+		#Nothing for now
+		return self
+	#}}}
+	def defaultoutputs(self,md): # {{{
+		return ['SmbMassBalance','SmbRunoff']
+	#}}}
+	def initialize(self,md): # {{{
+		#Nothing for now
+		return self
+	#}}}
+	def checkconsistency(self,md,solution,analyses):    # {{{
+		if 'MasstransportAnalysis' in analyses:
+			md = checkfield(md,'fieldname','smb.accuref','singletimeseries',1,'NaN',1,'Inf',1)
+			md = checkfield(md,'fieldname','smb.accualti','numel',[1],'NaN',1,'Inf',1)
+			md = checkfield(md,'fieldname','smb.accugrad','numel',[1],'NaN',1,'Inf',1)
+			md = checkfield(md,'fieldname','smb.runoffref','singletimeseries',1,'NaN',1,'Inf',1)
+			md = checkfield(md,'fieldname','smb.runoffalti','numel',[1],'NaN',1,'Inf',1)
+			md = checkfield(md,'fieldname','smb.runoffgrad','numel',[1],'NaN',1,'Inf',1)
+		md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1)
+		return md
+	# }}}
+	def marshall(self,prefix,md,fid):    # {{{
+
+		yts=md.constants.yts
+
+		WriteData(fid,prefix,'name','md.smb.model','data',11,'format','Integer')
+		WriteData(fid,prefix,'object',self,'class','smb','fieldname','accuref','format','DoubleMat','mattype',1,'timeserieslength',2,'yts',md.constants.yts,'scale',1./md.constants.yts)
+		WriteData(fid,prefix,'object',self,'class','smb','fieldname','accualti','format','Double')
+		WriteData(fid,prefix,'object',self,'class','smb','fieldname','accugrad','format','Double','scale',1./md.constants.yts)
+		WriteData(fid,prefix,'object',self,'class','smb','fieldname','runoffref','format','DoubleMat','mattype',1,'timeserieslength',2,'yts',md.constants.yts,'scale',1./md.constants.yts)
+		WriteData(fid,prefix,'object',self,'class','smb','fieldname','runoffalti','format','Double')
+		WriteData(fid,prefix,'object',self,'class','smb','fieldname','runoffgrad','format','Double','scale',1./md.constants.yts)
+
+		#process requested outputs
+		outputs = self.requested_outputs
+		indices = [i for i, x in enumerate(outputs) if x == 'default']
+		if len(indices) > 0:
+			outputscopy=outputs[0:max(0,indices[0]-1)]+self.defaultoutputs(md)+outputs[indices[0]+1:]
+			outputs    =outputscopy
+		WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray')
+
+	# }}}
Index: /issm/trunk-jpl/src/m/classes/clusters/stallo.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/clusters/stallo.m	(revision 23364)
+++ /issm/trunk-jpl/src/m/classes/clusters/stallo.m	(revision 23365)
@@ -105,7 +105,9 @@
 			 fprintf(fid,'#SBATCH --nodes=%i \n',cluster.numnodes);
 			 fprintf(fid,'#SBATCH --ntasks-per-node=%i \n',cluster.cpuspernode);
-			 fprintf(fid,'#SBATCH --time=%02i-%02i:%02i:00 \n',floor(cluster.time/(3600*24)),floor(cluster.time/3600),floor(mod(cluster.time,60)));
-			 fprintf(fid,'#SBATCH --mem-per-cpu=%iMB\n',1000*cluster.mem); ...
-       % mem in MB
+			 days=floor(cluster.time/(60*24));
+			 hours=floor((cluster.time-(days*60*24))/60);
+			 minutes=floor(mod((cluster.time-(days*60*24)-(hours*60)),60));
+			 fprintf(fid,'#SBATCH --time=%02i-%02i:%02i:00 \n',days,hours,minutes);
+			 fprintf(fid,'#SBATCH --mem-per-cpu=%iMB\n',1000*cluster.mem); % mem in MB
 			 if (mod(cluster.np,16)+mod(cluster.np,20))==0,
 			 	fprintf(fid,'#SBATCH --ntask=%i\n',cluster.np);
Index: /issm/trunk-jpl/src/m/classes/clusters/stallo.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/clusters/stallo.py	(revision 23364)
+++ /issm/trunk-jpl/src/m/classes/clusters/stallo.py	(revision 23365)
@@ -120,7 +120,7 @@
 		h,m=divmod(m, 60)
 		d,h=divmod(h, 60)
-#		timestring="%02d-%02d:%02d:%02d" % (d, h, m, s)
+		timestring="%02d-%02d:%02d:%02d" % (d, h, m, s)
 		fid.write('#SBATCH --time={}\n'.format(timestring)) #walltime is minutes
-		fid.write('#SBATCH --mem-per-cpu={}MB\n'.format(1000*self.mem))# mem is in MB (to keep it integral)
+		fid.write('#SBATCH --mem-per-cpu={}MB\n'.format(int(1000*self.mem)))# mem is in MB (to keep it integral)
 		if (np.mod(self.np,16)+np.mod(self.np,20))==0:
 			fid.write('#SBATCH --ntask=%i\n' % self.np)
Index: /issm/trunk-jpl/src/m/classes/taoinversion.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/taoinversion.py	(revision 23364)
+++ /issm/trunk-jpl/src/m/classes/taoinversion.py	(revision 23365)
@@ -97,5 +97,5 @@
 		else:
 			self.algorithm = 'tao_blmvm';
-		
+
 		#several responses can be used:
 		self.cost_functions=101;
@@ -110,8 +110,8 @@
 		if numel(self.cost_functions_coefficients) > 1:
 			self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node')
-		
+
 		if numel(self.min_parameters) > 1:
 			self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node')
-		
+
 		if numel(self.max_parameters)>1:
 			self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node')
@@ -123,5 +123,5 @@
 			return md
 		if not IssmConfig('_HAVE_TAO_')[0]:
-			md = checkmessage(md,['TAO has not been installed, ISSM needs to be reconfigured and recompiled with TAO'])
+			md = md.checkmessage('TAO has not been installed, ISSM needs to be reconfigured and recompiled with TAO')
 
 
Index: /issm/trunk-jpl/src/m/contrib/defleurian/paraview/enveloppeVTK.py
===================================================================
--- /issm/trunk-jpl/src/m/contrib/defleurian/paraview/enveloppeVTK.py	(revision 23364)
+++ /issm/trunk-jpl/src/m/contrib/defleurian/paraview/enveloppeVTK.py	(revision 23365)
@@ -85,5 +85,5 @@
 			if (np.size(res_struct.__dict__[solution])>num_of_timesteps):
 				num_of_timesteps=np.size(res_struct.__dict__[solution])
-				num_of_timesteps=int(num_of_timesteps)+1
+				num_of_timesteps=int(num_of_timesteps)
 	else:
 		num_of_timesteps=1
@@ -125,5 +125,5 @@
 				#getting the  fields in the solution
 				if(np.size(res_struct.__dict__[sol])>1):
-					fieldnames=dict.keys(res_struct.__dict__[sol].__getitem__(timestep-1).__dict__)
+					fieldnames=dict.keys(res_struct.__dict__[sol].__getitem__(timestep).__dict__)
 				else:
 					fieldnames=dict.keys(res_struct.__dict__[sol].__dict__)
@@ -131,5 +131,5 @@
 				for field in fieldnames:
 					if(np.size(res_struct.__dict__[sol])>1):
-						fieldstruct=res_struct.__dict__[sol].__getitem__(timestep-1).__dict__[field]
+						fieldstruct=res_struct.__dict__[sol].__getitem__(timestep).__dict__[field]
 					else:
 						fieldstruct=res_struct.__dict__[sol].__dict__[field]
Index: /issm/trunk-jpl/src/m/solve/WriteData.py
===================================================================
--- /issm/trunk-jpl/src/m/solve/WriteData.py	(revision 23364)
+++ /issm/trunk-jpl/src/m/solve/WriteData.py	(revision 23365)
@@ -7,5 +7,5 @@
 	"""
 	WRITEDATA - write model field in binary file
- 
+
 	   Usage:
 	      WriteData(fid,varargin)
@@ -57,5 +57,5 @@
 	#Step 1: write the enum to identify this record uniquely
 	fid.write(struct.pack('i',len(name)))
-	fid.write(struct.pack('%ds' % len(name),name)) 
+	fid.write(struct.pack('%ds' % len(name),name))
 
 	#Step 2: write the data itself.
@@ -67,6 +67,6 @@
 		fid.write(struct.pack('i',4+4))  #1 bool (disguised as an int)+code
 
-		#write data code: 
-		fid.write(struct.pack('i',FormatToCode(format))) 
+		#write data code:
+		fid.write(struct.pack('i',FormatToCode(format)))
 
 		#now write integer
@@ -81,9 +81,9 @@
 		fid.write(struct.pack('i',4+4))  #1 integer + code
 
-		#write data code: 
-		fid.write(struct.pack('i',FormatToCode(format))) 
+		#write data code:
+		fid.write(struct.pack('i',FormatToCode(format)))
 
 		#now write integer
-		fid.write(struct.pack('i',data)) 
+		fid.write(struct.pack('i',data))
 		# }}}
 
@@ -95,9 +95,9 @@
 		fid.write(struct.pack('i',8+4))  #1 double+code
 
-		#write data code: 
-		fid.write(struct.pack('i',FormatToCode(format))) 
+		#write data code:
+		fid.write(struct.pack('i',FormatToCode(format)))
 
 		#now write double
-		fid.write(struct.pack('d',data)) 
+		fid.write(struct.pack('d',data))
 		# }}}
 
@@ -106,10 +106,10 @@
 		fid.write(struct.pack('i',len(data)+4+4))  #string + string size + code
 
-		#write data code: 
-		fid.write(struct.pack('i',FormatToCode(format))) 
+		#write data code:
+		fid.write(struct.pack('i',FormatToCode(format)))
 
 		#now write string
-		fid.write(struct.pack('i',len(data))) 
-		fid.write(struct.pack('%ds' % len(data),data)) 
+		fid.write(struct.pack('i',len(data)))
+		fid.write(struct.pack('%ds' % len(data),data))
 		# }}}
 
@@ -135,17 +135,17 @@
 		fid.write(struct.pack('i',4+4+8*np.product(s)+4+4))    #2 integers (32 bits) + the double matrix + code + matrix type
 
-		#write data code and matrix type: 
-		fid.write(struct.pack('i',FormatToCode(format))) 
+		#write data code and matrix type:
+		fid.write(struct.pack('i',FormatToCode(format)))
 		fid.write(struct.pack('i',mattype))
 
 		#now write matrix
 		if np.ndim(data)==1:
-			fid.write(struct.pack('i',s[0])) 
-			fid.write(struct.pack('i',1)) 
+			fid.write(struct.pack('i',s[0]))
+			fid.write(struct.pack('i',1))
 			for i in xrange(s[0]):
 				fid.write(struct.pack('d',float(data[i])))    #get to the "c" convention, hence the transpose
 		else:
-			fid.write(struct.pack('i',s[0])) 
-			fid.write(struct.pack('i',s[1])) 
+			fid.write(struct.pack('i',s[0]))
+			fid.write(struct.pack('i',s[1]))
 			for i in xrange(s[0]):
 				for j in xrange(s[1]):
@@ -174,17 +174,17 @@
 		fid.write(struct.pack('i',4+4+8*np.product(s)+4+4))    #2 integers (32 bits) + the double matrix + code + matrix type
 
-		#write data code and matrix type: 
-		fid.write(struct.pack('i',FormatToCode(format))) 
+		#write data code and matrix type:
+		fid.write(struct.pack('i',FormatToCode(format)))
 		fid.write(struct.pack('i',mattype))
 
 		#now write matrix
 		if np.ndim(data) == 1:
-			fid.write(struct.pack('i',s[0])) 
-			fid.write(struct.pack('i',1)) 
+			fid.write(struct.pack('i',s[0]))
+			fid.write(struct.pack('i',1))
 			for i in xrange(s[0]):
 				fid.write(struct.pack('d',float(data[i])))    #get to the "c" convention, hence the transpose
 		else:
-			fid.write(struct.pack('i',s[0])) 
-			fid.write(struct.pack('i',s[1])) 
+			fid.write(struct.pack('i',s[0]))
+			fid.write(struct.pack('i',s[1]))
 			for i in xrange(s[0]):
 				for j in xrange(s[1]):
@@ -217,17 +217,17 @@
 		fid.write(struct.pack('i',recordlength))  #2 integers (32 bits) + the double matrix + code + matrix type
 
-		#write data code and matrix type: 
-		fid.write(struct.pack('i',FormatToCode(format))) 
+		#write data code and matrix type:
+		fid.write(struct.pack('i',FormatToCode(format)))
 		fid.write(struct.pack('i',mattype))
 
 		#now write matrix
 		if np.ndim(data) == 1:
-			fid.write(struct.pack('i',s[0])) 
-			fid.write(struct.pack('i',1)) 
+			fid.write(struct.pack('i',s[0]))
+			fid.write(struct.pack('i',1))
 			for i in xrange(s[0]):
 				fid.write(struct.pack('d',float(data[i])))    #get to the "c" convention, hence the transpose
 		else:
-			fid.write(struct.pack('i',s[0])) 
-			fid.write(struct.pack('i',s[1])) 
+			fid.write(struct.pack('i',s[0]))
+			fid.write(struct.pack('i',s[1]))
 			for i in xrange(s[0]):
 				for j in xrange(s[1]):
@@ -266,6 +266,6 @@
 		fid.write(struct.pack('i',recordlength))  #2 integers (32 bits) + the matrix + code + matrix type
 
-		#write data code and matrix type: 
-		fid.write(struct.pack('i',FormatToCode(format))) 
+		#write data code and matrix type:
+		fid.write(struct.pack('i',FormatToCode(format)))
 		fid.write(struct.pack('i',mattype))
 
@@ -276,12 +276,12 @@
 
 		if rangeA == 0:
-			A = A*0 
-		else:
-			A = (A-offsetA)/rangeA*255. 
-		
+			A = A*0
+		else:
+			A = (A-offsetA)/rangeA*255.
+
 		#now write matrix
 		if np.ndim(data) == 1:
-			fid.write(struct.pack('i',s[0])) 
-			fid.write(struct.pack('i',1)) 
+			fid.write(struct.pack('i',s[0]))
+			fid.write(struct.pack('i',1))
 			fid.write(struct.pack('d',float(offsetA)))
 			fid.write(struct.pack('d',float(rangeA)))
@@ -292,6 +292,6 @@
 
 		elif np.product(s) > 0:
-			fid.write(struct.pack('i',s[0])) 
-			fid.write(struct.pack('i',s[1])) 
+			fid.write(struct.pack('i',s[0]))
+			fid.write(struct.pack('i',s[1]))
 			fid.write(struct.pack('d',float(offsetA)))
 			fid.write(struct.pack('d',float(rangeA)))
@@ -324,11 +324,11 @@
 
 		#write length of record
-		fid.write(struct.pack('i',recordlength)) 
-
-		#write data code: 
-		fid.write(struct.pack('i',FormatToCode(format))) 
+		fid.write(struct.pack('i',recordlength))
+
+		#write data code:
+		fid.write(struct.pack('i',FormatToCode(format)))
 
 		#write data, first number of records
-		fid.write(struct.pack('i',len(data))) 
+		fid.write(struct.pack('i',len(data)))
 
 		for matrix in data:
@@ -343,11 +343,11 @@
 
 			if np.ndim(matrix) == 1:
-				fid.write(struct.pack('i',s[0])) 
-				fid.write(struct.pack('i',1)) 
+				fid.write(struct.pack('i',s[0]))
+				fid.write(struct.pack('i',1))
 				for i in xrange(s[0]):
 					fid.write(struct.pack('d',float(matrix[i])))    #get to the "c" convention, hence the transpose
 			else:
-				fid.write(struct.pack('i',s[0])) 
-				fid.write(struct.pack('i',s[1])) 
+				fid.write(struct.pack('i',s[0]))
+				fid.write(struct.pack('i',s[1]))
 				for i in xrange(s[0]):
 					for j in xrange(s[1]):
@@ -363,16 +363,16 @@
 
 		#write length of record
-		fid.write(struct.pack('i',recordlength)) 
-
-		#write data code: 
-		fid.write(struct.pack('i',FormatToCode(format))) 
+		fid.write(struct.pack('i',recordlength))
+
+		#write data code:
+		fid.write(struct.pack('i',FormatToCode(format)))
 
 		#now write length of string array
-		fid.write(struct.pack('i',len(data))) 
+		fid.write(struct.pack('i',len(data)))
 
 		#now write the strings
 		for string in data:
-			fid.write(struct.pack('i',len(string))) 
-			fid.write(struct.pack('%ds' % len(string),string)) 
+			fid.write(struct.pack('i',len(string)))
+			fid.write(struct.pack('%ds' % len(string),string))
 		# }}}
 
@@ -383,6 +383,6 @@
 def FormatToCode(format): # {{{
 	"""
-	This routine takes the format string, and hardcodes it into an integer, which 
-	is passed along the record, in order to identify the nature of the dataset being 
+	This routine takes the format string, and hardcodes it into an integer, which
+	is passed along the record, in order to identify the nature of the dataset being
 	sent.
 	"""
