Index: /issm/trunk-jpl/src/m/classes/autodiff.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/autodiff.m	(revision 13428)
+++ /issm/trunk-jpl/src/m/classes/autodiff.m	(revision 13429)
@@ -9,4 +9,5 @@
 		dependents   = {};
 		independents = {};
+		driver       = 'fos_forward';
 	end
 	methods
@@ -24,6 +25,9 @@
 		function md = checkconsistency(obj,md,solution,analyses) % {{{
 
-		%Early return 
-		if ~obj.isautodiff, return; end
+			%Early return 
+			if ~obj.isautodiff, return; end
+
+			%Driver value:
+			md = checkfield(md,'autodiff.driver','values',{'fos_forward'});
 
 		end % }}}
@@ -31,10 +35,12 @@
 			disp(sprintf('   automatic differentiation parameters:'));
 			fielddisplay(obj,'isautodiff','indicates if the automatic differentiation is activated');
-			fielddisplay(obj,'dependents','list of dependent variables ; ex: {''Thickness'',''FrictionCoefficient''}');
-			fielddisplay(obj,'independents','list of independent variables ; ex: {''IceVolume'',''MassFlux''}');
+			fielddisplay(obj,'dependents','list of dependent variables');
+			fielddisplay(obj,'independents','list of independent variables');
+			fielddisplay(obj,'driver','ADOLC driver');
 		end % }}}
 		function marshall(obj,fid) % {{{
 
 			WriteData(fid,'object',obj,'fieldname','isautodiff','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','driver','format','String');
 			
 			%early return
@@ -42,27 +48,59 @@
 
 			%process dependent variables
-			num_dependents=numel(obj.dependents);
-			WriteData(fid,'data',num_dependents,'enum',AutodiffNumDependentsEnum(),'format','Integer');
-			
-			if(num_dependents),
-				data=zeros(1,num_dependents);
-				for i=1:num_dependents,
-					data(i)=StringToEnum(obj.dependents{i});
+			num_dependent_objects=numel(obj.dependents);
+			WriteData(fid,'data',num_dependent_objects,'enum',AutodiffNumDependentObjectsEnum(),'format','Integer');
+
+			if(num_dependent_objects),
+				names=zeros(num_dependent_objects,1);
+				types=zeros(num_dependent_objects,1);
+
+				for i=1:num_dependent_objects,
+					dep=obj.dependents{i};
+
+					names(i)=StringToEnum(dep.name);
+					types(i)=dep.typetoscalar();
 				end
-				WriteData(fid,'data',data,'enum',AutodiffDependentsEnum(),'format','DoubleMat','mattype',3);
+				WriteData(fid,'data',names,'enum',AutodiffDependentObjectNamesEnum(),'format','IntMat','mattype',3);
+				WriteData(fid,'data',types,'enum',AutodiffDependentObjectTypesEnum(),'format','IntMat','mattype',3);
 			end
 			
+			
 			%process independent variables
-			num_independents=numel(obj.independents);
-			WriteData(fid,'data',num_independents,'enum',AutodiffNumIndependentsEnum(),'format','Integer');
-			
-			if(num_independents)
-				data=zeros(1,num_independents);
-				for i=1:num_independents,
-					data(i)=StringToEnum(obj.independents{i});
+			num_independent_objects=numel(obj.independents);
+			WriteData(fid,'data',num_independent_objects,'enum',AutodiffNumIndependentObjectsEnum(),'format','Integer');
+
+			if(num_independent_objects),
+				names=zeros(num_independent_objects,1);
+				types=zeros(num_independent_objects,1);
+
+				for i=1:num_independent_objects,
+					indep=obj.independents{i};
+
+					names(i)=StringToEnum(indep.name);
+					types(i)=indep.typetoscalar();
 				end
-				WriteData(fid,'data',data,'enum',AutodiffIndependentsEnum(),'format','DoubleMat','mattype',3);
+				WriteData(fid,'data',names,'enum',AutodiffIndependentObjectNamesEnum(),'format','IntMat','mattype',3);
+				WriteData(fid,'data',types,'enum',AutodiffIndependentObjectTypesEnum(),'format','IntMat','mattype',3);
 			end
 
+			%if driver is fos_forward, build index: 
+			if strcmpi(obj.driver,'fos_forward'),
+				index=0;
+				
+				for i=1:num_independent_objects,
+					indep=obj.independents{i};
+					if ~isnan(indep.fos_forward_index),
+						index=index+indep.fos_forward_index;
+						break;
+					else
+						if strcmpi(indep.type,'scalar'),
+							index=index+1;
+						else
+							index=index+indep.nods;
+						end
+					end
+				end
+				WriteData(fid,'data',index-1,'enum',AutodiffFosForwardIndexEnum(),'format','Integer'); %c-index numbering.
+			end
 		end % }}}
 	end
Index: /issm/trunk-jpl/src/m/classes/dependent.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/dependent.m	(revision 13429)
+++ /issm/trunk-jpl/src/m/classes/dependent.m	(revision 13429)
@@ -0,0 +1,46 @@
+%DEPENDENT class definition
+%
+%   Usage:
+%      dependent=dependent();
+
+classdef dependent
+	properties (SetAccess=public) 
+		name                 = '';
+		type                 = '';
+	end
+	methods
+		 function obj= dependent(varargin) % {{{
+			 
+			 %use provided options to change fields
+			 options=pairoptions(varargin{:});
+
+			 %OK get other fields
+			 obj=AssignObjectFields(pairoptions(varargin{:}),obj);
+
+		 end
+		 %}}}
+		function obj = setdefaultparameters(obj) % {{{
+			%do nothing
+
+		end % }}}
+		function md = checkconsistency(obj,md,solution,analyses) % {{{
+			%do nothing for now
+
+		end % }}}
+		function disp(obj) % {{{
+			disp(sprintf('   dependent variable :'));
+
+			fielddisplay(obj,'name','variable name (must match corresponding Enum)');
+			fielddisplay(obj,'type','type of variable (''vertex'' or ''scalar'')');
+
+		end % }}}
+		function scalar=typetoscalar(obj) % {{{
+		if strcmpi(obj.type,'scalar'),
+			scalar=0;
+		elseif strcmpi(obj.type,'vertex'),
+			scalar=1;
+		end
+
+		end % }}}
+	end
+end
Index: /issm/trunk-jpl/src/m/classes/independent.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/independent.m	(revision 13429)
+++ /issm/trunk-jpl/src/m/classes/independent.m	(revision 13429)
@@ -0,0 +1,55 @@
+%INDEPENDENT class definition
+%
+%   Usage:
+%      independent=independent();
+
+classdef independent
+	properties (SetAccess=public) 
+		name                 = '';
+		type                 = '';
+		fos_forward_index    = NaN;
+		nods                 = 0;
+	end
+	methods
+		 function obj= independent(varargin) % {{{
+			 
+			 %use provided options to change fields
+			 options=pairoptions(varargin{:});
+
+			 %OK get other fields
+			 obj=AssignObjectFields(pairoptions(varargin{:}),obj);
+
+		 end
+		 %}}}
+		function obj = setdefaultparameters(obj) % {{{
+			%do nothing
+
+		end % }}}
+		function md = checkconsistency(obj,md,solution,analyses) % {{{
+			%do nothing for now
+			if ~isnan(obj.fos_forward_index),
+				if obj.nods==0,
+					error('independent checkconsistency error: nods should be set to the size of the independent variable');
+				end
+			end
+
+		end % }}}
+		function disp(obj) % {{{
+			disp(sprintf('   independent variable :'));
+
+			fielddisplay(obj,'name','variable name (must match corresponding Enum)');
+			fielddisplay(obj,'type','type of variable (''vertex'' or ''scalar'')');
+			if ~isnan(obj.fos_forward_index),
+				fielddisplay(obj,'fos_forward_index','index for fos_foward driver of ADOLC');
+			end
+
+		end % }}}
+		function scalar=typetoscalar(obj) % {{{
+			if strcmpi(obj.type,'scalar'),
+				scalar=0;
+			elseif strcmpi(obj.type,'vertex'),
+				scalar=1;
+			end
+		end % }}}
+	end
+end
