Index: /issm/trunk-jpl/src/m/classes/autodiff.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/autodiff.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/autodiff.m	(revision 10969)
@@ -6,7 +6,7 @@
 classdef autodiff
 	properties (SetAccess=public) 
-		isautodiff = modelfield('default',false,'marshall',true,'format','Boolean');
-		forward    = modelfield('default',true,'marshall',true,'format','Boolean');
-		reverse    = modelfield('default',false,'marshall',true,'format','Boolean');
+		isautodiff = false;
+		forward    = true;
+		reverse    = false;
 	end
 	methods
@@ -28,10 +28,4 @@
 		function obj = setdefaultparameters(obj) % {{{
 
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 		end % }}}
 		function checkconsistency(obj,md,solution,analyses) % {{{
@@ -46,4 +40,9 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','isautodiff','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','forward','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','reverse','format','Boolean');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/balancethickness.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/balancethickness.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/balancethickness.m	(revision 10969)
@@ -6,7 +6,7 @@
 classdef balancethickness
 	properties (SetAccess=public) 
-		spcthickness      = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		thickening_rate   = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		stabilization     = modelfield('default',0,'marshall',true,'format','Integer');
+		spcthickness      = NaN;
+		thickening_rate   = NaN;
+		stabilization     = 0;
 	end
 	methods
@@ -27,11 +27,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			%Type of stabilization used
@@ -55,4 +48,9 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','spcthickness','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','thickening_rate','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/basalforcings.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/basalforcings.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/basalforcings.m	(revision 10969)
@@ -6,7 +6,7 @@
 classdef basalforcings
 	properties (SetAccess=public) 
-		melting_rate             = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		melting_rate_correction  = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		geothermalflux           = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
+		melting_rate             = NaN;
+		melting_rate_correction  = NaN;
+		geothermalflux           = NaN;
 	end
 	methods
@@ -28,10 +28,4 @@
 		function obj = setdefaultparameters(obj) % {{{
 
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 		end % }}}
 		function checkconsistency(obj,md,solution,analyses) % {{{
@@ -56,4 +50,9 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','melting_rate','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','melting_rate_correction','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','geothermalflux','format','DoubleMat','mattype',1);
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/constants.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/constants.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/constants.m	(revision 10969)
@@ -6,7 +6,7 @@
 classdef constants
 	properties (SetAccess=public) 
-		g                    = modelfield('default',0,'marshall',true,'format','Double');
-		yts                  = modelfield('default',0,'marshall',true,'format','Double');
-		referencetemperature = modelfield('default',0,'marshall',true,'format','Double');
+		g                    = 0;
+		yts                  = 0;
+		referencetemperature = 0;
 	end
 	methods
@@ -27,11 +27,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			%acceleration due to gravity (m/s^2)
@@ -60,4 +53,9 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','g','format','Double');
+			WriteData(fid,'object',obj,'fieldname','yts','format','Double');
+			WriteData(fid,'object',obj,'fieldname','referencetemperature','format','Double');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/diagnostic.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/diagnostic.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/diagnostic.m	(revision 10969)
@@ -6,21 +6,21 @@
 classdef diagnostic
 	properties (SetAccess=public) 
-		spcvx                    = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		spcvy                    = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		spcvz                    = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		restol                   = modelfield('default',0,'marshall',true,'format','Double');
-		reltol                   = modelfield('default',0,'marshall',true,'format','Double');
-		abstol                   = modelfield('default',0,'marshall',true,'format','Double');
-		stokesreconditioning     = modelfield('default',0,'marshall',true,'format','Double');
-		viscosity_overshoot      = modelfield('default',0,'marshall',true,'format','Double');
-		icefront                 = modelfield('default',NaN,'marshall',true,'preprocess','marshallicefront','format','DoubleMat','mattype',3);
-		maxiter                  = modelfield('default',0,'marshall',true,'format','Integer');
-		shelf_dampening          = modelfield('default',0,'marshall',true,'format','Integer');
-		vertex_pairing           = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',3);
-		penalty_factor           = modelfield('default',0,'marshall',true,'format','Double');
-		rift_penalty_lock        = modelfield('default',0,'marshall',true,'format','Integer');
-		rift_penalty_threshold   = modelfield('default',0,'marshall',true,'format','Integer');
-		referential              = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		requested_outputs        = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',3);
+		spcvx                    = NaN;
+		spcvy                    = NaN;
+		spcvz                    = NaN;
+		restol                   = 0;
+		reltol                   = 0;
+		abstol                   = 0;
+		stokesreconditioning     = 0;
+		viscosity_overshoot      = 0;
+		icefront                 = NaN;
+		maxiter                  = 0;
+		shelf_dampening          = 0;
+		vertex_pairing           = NaN;
+		penalty_factor           = NaN;
+		rift_penalty_lock        = NaN;
+		rift_penalty_threshold   = 0;
+		referential              = NaN;
+		requested_outputs        = NaN;
 	end
 	methods
@@ -41,11 +41,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			 %maximum of non-linear iterations.
@@ -157,4 +150,29 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','spcvx','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','spcvy','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','spcvz','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','restol','format','Double');
+			WriteData(fid,'object',obj,'fieldname','reltol','format','Double');
+			WriteData(fid,'object',obj,'fieldname','abstol','format','Double');
+			WriteData(fid,'object',obj,'fieldname','stokesreconditioning','format','Double');
+			WriteData(fid,'object',obj,'fieldname','viscosity_overshoot','format','Double');
+			WriteData(fid,'object',obj,'fieldname','maxiter','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','shelf_dampening','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','vertex_pairing','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'fieldname','penalty_factor','format','Double');
+			WriteData(fid,'object',obj,'fieldname','rift_penalty_lock','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','rift_penalty_threshold','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','referential','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','requested_outputs','format','DoubleMat','mattype',3);
+
+			%marshall ice front
+			data=obj.icefront;
+			pos=find(data(:,end)==0); data(pos,end)=AirEnum;
+			pos=find(data(:,end)==1); data(pos,end)=WaterEnum;
+			pos=find(data(:,end)==2); data(pos,end)=IceEnum;
+			WriteData(fid,'data',data,'enum',DiagnosticIcefrontEnum,'format','DoubleMat','mattype',3);
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/flowequation.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/flowequation.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/flowequation.m	(revision 10969)
@@ -6,12 +6,12 @@
 classdef flowequation
 	properties (SetAccess=public) 
-		ismacayealpattyn     = modelfield('default',0,'marshall',true,'format','Boolean');
-		ishutter             = modelfield('default',0,'marshall',true,'format','Boolean');
-		isstokes             = modelfield('default',0,'marshall',true,'format','Boolean');
-		vertex_equation      = modelfield('default',NaN,'marshall',true,'preprocess','marshallapproximations','format','DoubleMat','mattype',1);
-		element_equation     = modelfield('default',NaN,'marshall',true,'preprocess','marshallapproximations','format','DoubleMat','mattype',2);
-		bordermacayeal       = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		borderpattyn         = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		borderstokes         = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
+		ismacayealpattyn     = 0;
+		ishutter             = 0;
+		isstokes             = 0;
+		vertex_equation      = NaN;
+		element_equation     = NaN;
+		bordermacayeal       = NaN;
+		borderpattyn         = NaN;
+		borderstokes         = NaN;
 	end
 	methods
@@ -32,11 +32,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 		end % }}}
@@ -82,4 +75,33 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','ismacayealpattyn','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','ishutter','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','isstokes','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','bordermacayeal','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','borderpattyn','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','borderstokes','format','DoubleMat','mattype',1);
+			%convert approximations to enums
+			data=obj.vertex_equation;
+			pos=find(data==0); data(pos,end)=NoneApproximationEnum;
+			pos=find(data==1); data(pos,end)=HutterApproximationEnum;
+			pos=find(data==2); data(pos,end)=MacAyealApproximationEnum;
+			pos=find(data==3); data(pos,end)=PattynApproximationEnum;
+			pos=find(data==4); data(pos,end)=StokesApproximationEnum;
+			pos=find(data==5); data(pos,end)=MacAyealPattynApproximationEnum;
+			pos=find(data==6); data(pos,end)=MacAyealStokesApproximationEnum;
+			pos=find(data==7); data(pos,end)=PattynStokesApproximationEnum;
+			WriteData(fid,'data',data,'enum',FlowequationVertexEquationEnum,'format','DoubleMat','mattype',1);
+			data=obj.element_equation;
+			pos=find(data==0); data(pos,end)=NoneApproximationEnum;
+			pos=find(data==1); data(pos,end)=HutterApproximationEnum;
+			pos=find(data==2); data(pos,end)=MacAyealApproximationEnum;
+			pos=find(data==3); data(pos,end)=PattynApproximationEnum;
+			pos=find(data==4); data(pos,end)=StokesApproximationEnum;
+			pos=find(data==5); data(pos,end)=MacAyealPattynApproximationEnum;
+			pos=find(data==6); data(pos,end)=MacAyealStokesApproximationEnum;
+			pos=find(data==7); data(pos,end)=PattynStokesApproximationEnum;
+			WriteData(fid,'data',data,'enum',FlowequationElementEquationEnum,'format','DoubleMat','mattype',2);
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/friction.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/friction.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/friction.m	(revision 10969)
@@ -6,7 +6,7 @@
 classdef friction
 	properties (SetAccess=public) 
-		coefficient = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		p           = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',2);
-		q           = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',2);
+		coefficient = NaN;
+		p           = NaN;
+		q           = NaN;
 	end
 	methods
@@ -28,11 +28,4 @@
 		function obj = setdefaultparameters(obj) % {{{
 
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
-
 		end % }}}
 		function checkconsistency(obj,md,solution,analyses) % {{{
@@ -51,4 +44,9 @@
 			fielddisplay(obj,'q','q exponent');
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','p','format','DoubleMat','mattype',2);
+			WriteData(fid,'object',obj,'fieldname','q','format','DoubleMat','mattype',2);
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/geometry.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/geometry.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/geometry.m	(revision 10969)
@@ -6,9 +6,9 @@
 classdef geometry
 	properties (SetAccess=public) 
-		surface           = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1,'enum',SurfaceEnum);
-		thickness         = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1,'enum',ThicknessEnum);
-		bed               = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1,'enum',BedEnum);
-		bathymetry        = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1,'enum',BathymetryEnum);
-		hydrostatic_ratio = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
+		surface           = NaN;
+		thickness         = NaN;
+		bed               = NaN;
+		bathymetry        = NaN;
+		hydrostatic_ratio = NaN;
 	end
 	methods
@@ -29,11 +29,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 		end % }}}
@@ -57,4 +50,11 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'data',obj.surface,'format','DoubleMat','mattype',1,'enum',SurfaceEnum);
+			WriteData(fid,'data',obj.thickness,'format','DoubleMat','mattype',1,'enum',ThicknessEnum);
+			WriteData(fid,'data',obj.bed,'format','DoubleMat','mattype',1,'enum',BedEnum);
+			WriteData(fid,'data',obj.bathymetry,'format','DoubleMat','mattype',1,'enum',BathymetryEnum);
+			WriteData(fid,'object',obj,'fieldname','hydrostatic_ratio','format','DoubleMat','mattype',1);
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/groundingline.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/groundingline.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/groundingline.m	(revision 10969)
@@ -6,6 +6,6 @@
 classdef groundingline
 	properties (SetAccess=public) 
-		migration    = modelfield('default','','marshall',true,'preprocess','StringToEnum','format','Integer');
-		melting_rate = modelfield('default',NaN,'marshall',true,'format','Double');
+		migration    = '';
+		melting_rate = NaN;
 	end
 	methods
@@ -26,11 +26,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			%Type of migration
@@ -68,4 +61,8 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'data',StringToEnum(obj.migration),'enum',GroundinglineMigrationEnum,'format','Integer');
+			WriteData(fid,'object',obj,'fieldname','melting_rate','format','Double');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/hydrology.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/hydrology.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/hydrology.m	(revision 10969)
@@ -6,11 +6,11 @@
 classdef hydrology
 	properties (SetAccess=public) 
-		spcwatercolumn = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		n              = modelfield('default',0,'marshall',true,'format','Double'); 
-		CR             = modelfield('default',0,'marshall',true,'format','Double');
-		p              = modelfield('default',0,'marshall',true,'format','Double');
-		q              = modelfield('default',0,'marshall',true,'format','Double');
-		kn             = modelfield('default',0,'marshall',true,'format','Double');
-		stabilization  = modelfield('default',0,'marshall',true,'format','Double');
+		spcwatercolumn = NaN;
+		n              = 0;
+		CR             = 0;
+		p              = 0;
+		q              = 0;
+		kn             = 0;
+		stabilization  = 0;
 	end
 	methods
@@ -31,11 +31,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			%Parameters from Johnson's 2002 thesis, section 3.5.4			 
@@ -69,4 +62,13 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','spcwatercolumn','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','n','format','Double'); 
+			WriteData(fid,'object',obj,'fieldname','CR','format','Double');
+			WriteData(fid,'object',obj,'fieldname','p','format','Double');
+			WriteData(fid,'object',obj,'fieldname','q','format','Double');
+			WriteData(fid,'object',obj,'fieldname','kn','format','Double');
+			WriteData(fid,'object',obj,'fieldname','stabilization','format','Double');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/initialization.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/initialization.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/initialization.m	(revision 10969)
@@ -6,12 +6,12 @@
 classdef initialization
 	properties (SetAccess=public) 
-		vx            = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1,'enum',VxEnum);
-		vy            = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1,'enum',VyEnum);
-		vz            = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1,'enum',VzEnum);
-		vel           = modelfield('default',NaN,'marshall',false);
-		pressure      = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1,'enum',PressureEnum);
-		temperature   = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1,'enum',TemperatureEnum);
-		watercolumn   = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1,'enum',WatercolumnEnum);
-		waterfraction = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1,'enum',WaterfractionEnum);
+		vx            = NaN;
+		vy            = NaN;
+		vz            = NaN;
+		vel           = NaN;
+		pressure      = NaN;
+		temperature   = NaN;
+		watercolumn   = NaN;
+		waterfraction = NaN;
 	end
 	methods
@@ -32,11 +32,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 		end % }}}
@@ -83,4 +76,13 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'data',obj.vx,'format','DoubleMat','mattype',1,'enum',VxEnum);
+			WriteData(fid,'data',obj.vy,'format','DoubleMat','mattype',1,'enum',VyEnum);
+			WriteData(fid,'data',obj.vz,'format','DoubleMat','mattype',1,'enum',VzEnum);
+			WriteData(fid,'data',obj.pressure,'format','DoubleMat','mattype',1,'enum',PressureEnum);
+			WriteData(fid,'data',obj.temperature,'format','DoubleMat','mattype',1,'enum',TemperatureEnum);
+			WriteData(fid,'data',obj.watercolumn,'format','DoubleMat','mattype',1,'enum',WatercolumnEnum);
+			WriteData(fid,'data',obj.waterfraction,'format','DoubleMat','mattype',1,'enum',WaterfractionEnum);
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/inversion.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/inversion.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/inversion.m	(revision 10969)
@@ -18,6 +18,4 @@
 		step_threshold              = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',3);
 		gradient_only               = modelfield('default',0,'marshall',true,'format','Boolean');
-		num_control_parameters      = modelfield('default',0,'marshall',true,'format','Integer');
-		num_cost_functions          = modelfield('default',0,'marshall',true,'format','Integer');
 		vx_obs                      = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
 		vy_obs                      = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
@@ -126,6 +124,4 @@
 			fielddisplay(obj,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
 			fielddisplay(obj,'gradient_only','stop control method solution at gradient');
-			%fielddisplay(obj,'num_control_parameters','number of control_parameters');
-			%fielddisplay(obj,'num_cost_functions','number of cost_functions');
 			fielddisplay(obj,'vx_obs','observed velocity x component [m/a]');
 			fielddisplay(obj,'vy_obs','observed velocity y component [m/a]');
@@ -143,4 +139,46 @@
 			disp('   503: ThicknessAbsGradient');
 		end % }}}
+		function marshall(obj,fid) % {{{
+
+			WriteData(fid,'object',obj,'fieldname','iscontrol','format','Boolean');
+			if ~obj.iscontrol, return; end
+			WriteData(fid,'object',obj,'fieldname','nsteps','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','maxiter_per_step','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','gradient_scaling','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'fieldname','cost_function_threshold','format','Double');
+			WriteData(fid,'object',obj,'fieldname','min_parameters','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'fieldname','max_parameters','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'fieldname','step_threshold','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'fieldname','gradient_only','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','vx_obs','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','vy_obs','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','vz_obs','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','thickness_obs','format','DoubleMat','mattype',1);
+
+			%process control parameters
+			num_control_parameters=numel(obj.control_parameters);
+			data=zeros(1,num_control_parameters);
+			for i=1:num_control_parameters,
+				data(i)=StringToEnum(obj.control_parameters{i});
+			end
+			WriteData(fid,'data',data,'enum',InversionControlParametersEnum,'format','DoubleMat','mattype',3);
+			WriteData(fid,'data',num_control_parameters,'enum',InversionNumControlParametersEnum,'format','Integer');
+
+			%process cost functions
+			num_cost_functions=size(obj.cost_functions,2);
+			data=obj.cost_functions;
+			pos=find(data==101); data(pos)=SurfaceAbsVelMisfitEnum;
+			pos=find(data==102); data(pos)=SurfaceRelVelMisfitEnum;
+			pos=find(data==103); data(pos)=SurfaceLogVelMisfitEnum;
+			pos=find(data==104); data(pos)=SurfaceLogVxVyMisfitEnum;
+			pos=find(data==105); data(pos)=SurfaceAverageVelMisfitEnum;
+			pos=find(data==201); data(pos)=ThicknessAbsMisfitEnum;
+			pos=find(data==501); data(pos)=DragCoefficientAbsGradientEnum;
+			pos=find(data==502); data(pos)=RheologyBbarAbsGradientEnum;
+			pos=find(data==503); data(pos)=ThicknessAbsGradientEnum;
+			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum,'format','DoubleMat','mattype',3);
+			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum,'format','Integer');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/mask.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/mask.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/mask.m	(revision 10969)
@@ -6,10 +6,10 @@
 classdef mask
 	properties (SetAccess=public) 
-		elementonfloatingice = modelfield('default',NaN,'marshall',true,'format','BooleanMat','mattype',2);
-		elementongroundedice = modelfield('default',NaN,'marshall',true,'format','BooleanMat','mattype',2);
-		elementonwater       = modelfield('default',NaN,'marshall',true,'format','BooleanMat','mattype',2);
-		vertexonfloatingice  = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		vertexongroundedice  = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		vertexonwater        = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
+		elementonfloatingice = NaN;
+		elementongroundedice = NaN;
+		elementonwater       = NaN;
+		vertexonfloatingice  = NaN;
+		vertexongroundedice  = NaN;
+		vertexonwater        = NaN;
 	end
 	methods
@@ -31,11 +31,4 @@
 		function obj = setdefaultparameters(obj) % {{{
 
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
-
 		end % }}}
 		function checkconsistency(obj,md,solution,analyses) % {{{
@@ -49,5 +42,4 @@
 		end % }}}
 		function disp(obj) % {{{
-
 			fielddisplay(obj,'elementonfloatingice','element on floating ice flags list');
 			fielddisplay(obj,'vertexonfloatingice','vertex on floating ice flags list');
@@ -57,4 +49,12 @@
 			fielddisplay(obj,'vertexonwater','vertex on water flags list');
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','elementonfloatingice','format','BooleanMat','mattype',2);
+			WriteData(fid,'object',obj,'fieldname','elementongroundedice','format','BooleanMat','mattype',2);
+			WriteData(fid,'object',obj,'fieldname','elementonwater','format','BooleanMat','mattype',2);
+			WriteData(fid,'object',obj,'fieldname','vertexonfloatingice','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','vertexongroundedice','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','vertexonwater','format','DoubleMat','mattype',1);
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/materials.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/materials.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/materials.m	(revision 10969)
@@ -6,17 +6,17 @@
 classdef materials
 	properties (SetAccess=public) 
-		rho_ice                    = modelfield('default',0,'marshall',true,'format','Double');
-		rho_water                  = modelfield('default',0,'marshall',true,'format','Double');
-		mu_water                   = modelfield('default',0,'marshall',true,'format','Double');
-		heatcapacity               = modelfield('default',0,'marshall',true,'format','Double');
-		latentheat                 = modelfield('default',0,'marshall',true,'format','Double');
-		thermalconductivity        = modelfield('default',0,'marshall',true,'format','Double');
-		meltingpoint               = modelfield('default',0,'marshall',true,'format','Double');
-		beta                       = modelfield('default',0,'marshall',true,'format','Double');
-		mixed_layer_capacity       = modelfield('default',0,'marshall',true,'format','Double');
-		thermal_exchange_velocity  = modelfield('default',0,'marshall',true,'format','Double');
-		rheology_B   = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		rheology_n   = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',2);
-		rheology_law = modelfield('default','','marshall',true,'preprocess','StringToEnum','format','Integer');
+		rho_ice                    = 0;
+		rho_water                  = 0;
+		mu_water                   = 0;
+		heatcapacity               = 0;
+		latentheat                 = 0;
+		thermalconductivity        = 0;
+		meltingpoint               = 0;
+		beta                       = 0;
+		mixed_layer_capacity       = 0;
+		thermal_exchange_velocity  = 0;
+		rheology_B   = NaN;
+		rheology_n   = NaN;
+		rheology_law = '';
 	end
 	methods
@@ -37,11 +37,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			%ice density (kg/m^3)
@@ -104,4 +97,19 @@
 			fielddisplay(obj,'rheology_law','law for the temperature dependance of the rheology: ''None'', ''Paterson'' or ''Arrhenius''');
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','rho_ice','format','Double');
+			WriteData(fid,'object',obj,'fieldname','rho_water','format','Double');
+			WriteData(fid,'object',obj,'fieldname','mu_water','format','Double');
+			WriteData(fid,'object',obj,'fieldname','heatcapacity','format','Double');
+			WriteData(fid,'object',obj,'fieldname','latentheat','format','Double');
+			WriteData(fid,'object',obj,'fieldname','thermalconductivity','format','Double');
+			WriteData(fid,'object',obj,'fieldname','meltingpoint','format','Double');
+			WriteData(fid,'object',obj,'fieldname','beta','format','Double');
+			WriteData(fid,'object',obj,'fieldname','mixed_layer_capacity','format','Double');
+			WriteData(fid,'object',obj,'fieldname','thermal_exchange_velocity','format','Double');
+			WriteData(fid,'object',obj,'fieldname','rheology_B','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','rheology_n','format','DoubleMat','mattype',2);
+			WriteData(fid,'data',StringToEnum(obj.rheology_law),'enum',MaterialsRheologyLawEnum,'format','Integer');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/mesh.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/mesh.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/mesh.m	(revision 10969)
@@ -6,43 +6,43 @@
 classdef mesh
 	properties (SetAccess=public) 
-		x                           = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		y                           = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		z                           = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		elements                    = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',2);
-		dimension                   = modelfield('default',0,'marshall',true,'format','Integer');
-		numberoflayers              = modelfield('default',0,'marshall',true,'format','Integer');
-		numberofelements            = modelfield('default',0,'marshall',true,'format','Integer');
-		numberofvertices            = modelfield('default',0,'marshall',true,'format','Integer');
-		numberofedges               = modelfield('default',0,'marshall',true,'format','Integer');
+		x                           = NaN;
+		y                           = NaN;
+		z                           = NaN
+		elements                    = NaN
+		dimension                   = 0;
+		numberoflayers              = 0;
+		numberofelements            = 0;
+		numberofvertices            = 0;
+		numberofedges               = 0;
 		
-		lat                         = modelfield('default',NaN,'marshall',false);
-		long                        = modelfield('default',NaN,'marshall',false);
-		hemisphere                  = modelfield('default',NaN,'marshall',false);
-
-		elementonbed                = modelfield('default',NaN,'marshall',true,'format','BooleanMat','mattype',2);
-		elementonsurface            = modelfield('default',NaN,'marshall',true,'format','BooleanMat','mattype',2);
-		vertexonbed                 = modelfield('default',NaN,'marshall',true,'format','BooleanMat','mattype',1);
-		vertexonsurface             = modelfield('default',NaN,'marshall',true,'format','BooleanMat','mattype',1);
-		lowerelements               = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',2);
-		lowervertex                 = modelfield('default',NaN,'marshall',false);
-		upperelements               = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',2);
-		uppervertex                 = modelfield('default',NaN,'marshall',false);
-		vertexonboundary            = modelfield('default',NaN,'marshall',false);
-
-		edges                       = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',3);
-		segments                    = modelfield('default',NaN,'marshall',false);
-		segmentmarkers              = modelfield('default',NaN,'marshall',false);
-		vertexconnectivity          = modelfield('default',NaN,'marshall',false);
-		elementconnectivity         = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',3);
-		average_vertex_connectivity = modelfield('default',0,'marshall',true,'format','Integer');
-
-		x2d                         = modelfield('default',NaN,'marshall',false);
-		y2d                         = modelfield('default',NaN,'marshall',false);
-		elements2d                  = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',3);
-		numberofvertices2d          = modelfield('default',0,'marshall',true,'format','Integer');
-		numberofelements2d          = modelfield('default',0,'marshall',true,'format','Integer');
-
-		extractedvertices           = modelfield('default',NaN,'marshall',false);
-		extractedelements           = modelfield('default',NaN,'marshall',false);
+		lat                         = NaN
+		long                        = NaN
+		hemisphere                  = NaN
+
+		elementonbed                = NaN
+		elementonsurface            = NaN
+		vertexonbed                 = NaN
+		vertexonsurface             = NaN
+		lowerelements               = NaN
+		lowervertex                 = NaN
+		upperelements               = NaN
+		uppervertex                 = NaN
+		vertexonboundary            = NaN
+
+		edges                       = NaN
+		segments                    = NaN
+		segmentmarkers              = NaN
+		vertexconnectivity          = NaN
+		elementconnectivity         = NaN
+		average_vertex_connectivity = 0;
+
+		x2d                         = NaN
+		y2d                         = NaN
+		elements2d                  = NaN
+		numberofvertices2d          = 0;
+		numberofelements2d          = 0;
+
+		extractedvertices           = NaN
+		extractedelements           = NaN
 	end
 	methods
@@ -63,11 +63,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			%the connectivity is the avergaded number of nodes linked to a
@@ -183,4 +176,27 @@
 			fielddisplay(obj,'hemisphere','Indicate hemisphere ''n'' or ''s'' ');
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','x','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','y','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','z','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','elements','format','DoubleMat','mattype',2);
+			WriteData(fid,'object',obj,'fieldname','dimension','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','numberoflayers','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','numberofelements','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','numberofvertices','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','numberofedges','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','elementonbed','format','BooleanMat','mattype',2);
+			WriteData(fid,'object',obj,'fieldname','elementonsurface','format','BooleanMat','mattype',2);
+			WriteData(fid,'object',obj,'fieldname','vertexonbed','format','BooleanMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','vertexonsurface','format','BooleanMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','lowerelements','format','DoubleMat','mattype',2);
+			WriteData(fid,'object',obj,'fieldname','upperelements','format','DoubleMat','mattype',2);
+			WriteData(fid,'object',obj,'fieldname','edges','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'fieldname','elementconnectivity','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'fieldname','average_vertex_connectivity','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','elements2d','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'fieldname','numberofvertices2d','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','numberofelements2d','format','Integer');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/miscellaneous.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/miscellaneous.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/miscellaneous.m	(revision 10969)
@@ -6,7 +6,7 @@
 classdef miscellaneous
 	properties (SetAccess=public) 
-		notes = modelfield('default','','marshall',false);
-		name  = modelfield('default','','marshall',true,'format','String');
-		dummy = modelfield('default',NaN,'marshall',false);
+		notes = '';
+		name  = '';
+		dummy = struct();
 	end
 	methods
@@ -33,10 +33,4 @@
 		function obj = setdefaultparameters(obj) % {{{
 
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 		end % }}}
 		function disp(obj) % {{{
@@ -48,4 +42,7 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','name','format','String');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/model/model.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/model/model.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/model/model.m	(revision 10969)
@@ -8,42 +8,42 @@
 		 % {{{1
 		 %Careful here: no other class should be used as default value this is a bug of matlab
-		 mesh             = modelfield('default',0,'marshall',true);
-		 mask             = modelfield('default',0,'marshall',true);
-
-		 geometry         = modelfield('default',0,'marshall',true);
-		 constants        = modelfield('default',0,'marshall',true);
-		 surfaceforcings  = modelfield('default',0,'marshall',true);
-		 basalforcings    = modelfield('default',0,'marshall',true);
-		 materials        = modelfield('default',0,'marshall',true);
-		 friction         = modelfield('default',0,'marshall',true);
-		 flowequation     = modelfield('default',0,'marshall',true);
-		 timestepping     = modelfield('default',0,'marshall',true);
-		 initialization   = modelfield('default',0,'marshall',true);
-		 rifts            = modelfield('default',0,'marshall',true);
-
-		 debug            = modelfield('default',0,'marshall',false);
-		 verbose          = modelfield('default',0,'marshall',true,'preprocess','marshallverbose','format','Integer');
-		 settings         = modelfield('default',0,'marshall',true);
-		 solver           = modelfield('default',0,'marshall',false);
-		 cluster          = modelfield('default',0,'marshall',false);
-
-		 balancethickness = modelfield('default',0,'marshall',true);
-		 diagnostic       = modelfield('default',0,'marshall',true);
-		 groundingline    = modelfield('default',0,'marshall',true);
-		 hydrology        = modelfield('default',0,'marshall',true);
-		 prognostic       = modelfield('default',0,'marshall',true);
-		 thermal          = modelfield('default',0,'marshall',true);
-		 steadystate      = modelfield('default',0,'marshall',true);
-		 transient        = modelfield('default',0,'marshall',true);
-
-		 autodiff         = modelfield('default',0,'marshall',true);
-		 flaim            = modelfield('default',0,'marshall',false);
-		 inversion        = modelfield('default',0,'marshall',true);
-		 qmu              = modelfield('default',0,'marshall',true);
-
-		 results          = modelfield('default',0,'marshall',false);
-		 radaroverlay     = modelfield('default',0,'marshall',false);
-		 miscellaneous    = modelfield('default',0,'marshall',true);
-		 private          = modelfield('default',0,'marshall',false);
+		 mesh             = 0;
+		 mask             = 0;
+
+		 geometry         = 0;
+		 constants        = 0;
+		 surfaceforcings  = 0;
+		 basalforcings    = 0;
+		 materials        = 0;
+		 friction         = 0;
+		 flowequation     = 0;
+		 timestepping     = 0;
+		 initialization   = 0;
+		 rifts            = 0;
+
+		 debug            = 0;
+		 verbose          = 0;
+		 settings         = 0;
+		 solver           = 0;
+		 cluster          = 0;
+
+		 balancethickness = 0;
+		 diagnostic       = 0;
+		 groundingline    = 0;
+		 hydrology        = 0;
+		 prognostic       = 0;
+		 thermal          = 0;
+		 steadystate      = 0;
+		 transient        = 0;
+
+		 autodiff         = 0;
+		 flaim            = 0;
+		 inversion        = 0;
+		 qmu              = 0;
+
+		 results          = 0;
+		 radaroverlay     = 0;
+		 miscellaneous    = 0;
+		 private          = 0;
 
 		 %}}}
@@ -388,46 +388,39 @@
 		 function md = setdefaultparameters(md) % {{{1
 
-			 %first, use the defaults provided by the properties definition above. 
-			 fieldnames=fields(md);
-			 for i=1:length(fieldnames),
-				 fieldname=fieldnames{i};
-				 md.(fieldname)=md.(fieldname).default;
-			 end
-
 			 %initialize subclasses
-			 md.cluster          = none;
-			 md.solver           = solver;
+			 md.mesh             = mesh();
+			 md.mask             = mask();
+			 md.constants        = constants();
+			 md.geometry         = geometry();
+			 md.initialization   = initialization();
+			 md.surfaceforcings  = surfaceforcings();
+			 md.basalforcings    = basalforcings();
+			 md.friction         = friction();
+			 md.rifts            = rifts();
+			 md.timestepping     = timestepping();
+			 md.groundingline    = groundingline();
+			 md.materials        = materials();
+			 md.flowequation     = flowequation();
+			 md.debug            = debug();
+			 md.verbose          = verbose('solution',true,'qmu',true,'control',true);
+			 md.settings         = settings();
+			 md.solver           = solver();
 			 md.solver           = addoptions(md.solver,DiagnosticVertAnalysisEnum,mumpsoptions);
+			 md.cluster          = none();
+			 md.balancethickness = balancethickness();
+			 md.diagnostic       = diagnostic();
+			 md.hydrology        = hydrology();
+			 md.prognostic       = prognostic();
+			 md.thermal          = thermal();
+			 md.steadystate      = steadystate();
+			 md.transient        = transient();
+			 md.autodiff         = autodiff();
+			 md.flaim            = flaim();
+			 md.inversion        = inversion();
+			 md.qmu              = qmu();
+			 md.radaroverlay     = radaroverlay();
 			 md.results          = struct();
-			 md.debug            = debug;
-			 md.constants        = constants;
-			 md.flaim            = flaim;
-			 md.surfaceforcings  = surfaceforcings;
-			 md.basalforcings    = basalforcings;
-			 md.friction         = friction;
-			 md.private          = private;
-			 md.rifts            = rifts;
-			 md.hydrology        = hydrology;
-			 md.settings         = settings;
-			 md.radaroverlay     = radaroverlay;
-			 md.thermal          = thermal;
-			 md.miscellaneous    = miscellaneous;
-			 md.timestepping     = timestepping;
-			 md.groundingline    = groundingline;
-			 md.prognostic       = prognostic;
-			 md.materials        = materials;
-			 md.mask             = mask;
-			 md.qmu              = qmu;
-			 md.balancethickness = balancethickness;
-			 md.flowequation     = flowequation;
-			 md.steadystate      = steadystate;
-			 md.inversion        = inversion;
-			 md.transient        = transient;
-			 md.diagnostic       = diagnostic;
-			 md.initialization   = initialization;
-			 md.geometry         = geometry;
-			 md.verbose          = verbose('solution',true,'qmu',true,'control',true);
-			 md.autodiff         = autodiff;
-			 md.mesh             = mesh;
+			 md.miscellaneous    = miscellaneous();
+			 md.private          = private();
 		 end
 		 %}}}
Index: /issm/trunk-jpl/src/m/classes/private.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/private.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/private.m	(revision 10969)
@@ -6,7 +6,7 @@
 classdef private
 	properties (SetAccess=public) 
-		 runtimename = modelfield('default','','marshall',false);
-		 bamg        = modelfield('default',0,'marshall',false);
-		 solution    = modelfield('default','','marshall',false);
+		 runtimename = '';
+		 bamg        = struct();
+		 solution    = '';
 	end
 	methods
@@ -28,11 +28,4 @@
 		function obj = setdefaultparameters(obj) % {{{
 
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
-
 		end % }}}
 		function checkconsistency(obj,md,solution,analyses) % {{{
Index: /issm/trunk-jpl/src/m/classes/prognostic.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/prognostic.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/prognostic.m	(revision 10969)
@@ -6,9 +6,9 @@
 classdef prognostic
 	properties (SetAccess=public) 
-		 spcthickness           = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		 hydrostatic_adjustment = modelfield('default',0,'marshall',true,'preprocess','StringToEnum','format','Integer');
-		 stabilization          = modelfield('default',0,'marshall',true,'format','Integer');
-		 vertex_pairing         = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',3);
-		 penalty_factor         = modelfield('default',0,'marshall',true,'format','Double');
+		 spcthickness           = NaN;
+		 hydrostatic_adjustment = 0;
+		 stabilization          = 0;
+		 vertex_pairing         = NaN;
+		 penalty_factor         = 0;
 	end
 	methods
@@ -29,11 +29,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			%Type of stabilization to use 0:nothing 1:artificial_diffusivity 3:Discontinuous Galerkin
@@ -67,4 +60,11 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','spcthickness','format','DoubleMat','mattype',1);
+			WriteData(fid,'data',StringToEnum(obj.hydrostatic_adjustment),'format','Integer','enum',PrognosticHydrostaticAdjustmentEnum);
+			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','vertex_pairing','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',obj,'fieldname','penalty_factor','format','Double');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/qmu.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/qmu.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/qmu.m	(revision 10969)
@@ -6,20 +6,20 @@
 classdef qmu
 	properties (SetAccess=public) 
-		isdakota                    = modelfield('default',0,'marshall',true,'format','Boolean');
-		variables                   = modelfield('default',struct(),'marshall',false);
-		responses                   = modelfield('default',struct(),'marshall',false);
-		method                      = modelfield('default',struct(),'marshall',false);
-		params                      = modelfield('default',struct(),'marshall',false);
-		results                     = modelfield('default',struct(),'marshall',false);
-		partition                   = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',2);
-		numberofpartitions          = modelfield('default',0,'marshall',true,'format','Integer');
-		numberofresponses           = modelfield('default',0,'marshall',true,'format','Integer');
-		variabledescriptors         = modelfield('default',{},'marshall',true,'format','StringArray');
-		responsedescriptors         = modelfield('default',{},'marshall',true,'format','StringArray');
-		mass_flux_profile_directory = modelfield('default',NaN,'marshall',false);
-		mass_flux_profiles          = modelfield('default',NaN,'marshall',false);
-		mass_flux_segments          = modelfield('default',{},'marshall',true,'format','MatArray');
-		adjacency                   = modelfield('default',NaN,'marshall',false);
-		vertex_weight               = modelfield('default',NaN,'marshall',false);
+		isdakota                    = 0;
+		variables                   = struct();
+		responses                   = struct();
+		method                      = struct();
+		params                      = struct();
+		results                     = struct();
+		partition                   = NaN;
+		numberofpartitions          = 0;
+		numberofresponses           = 0;
+		variabledescriptors         = {};
+		responsedescriptors         = {};
+		mass_flux_profile_directory = NaN;
+		mass_flux_profiles          = NaN;
+		mass_flux_segments          = {};
+		adjacency                   = NaN;
+		vertex_weight               = NaN;
 	end
 	methods
@@ -40,11 +40,5 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
+	
 		end % }}}
 		function checkconsistency(obj,md,solution,analyses) % {{{
@@ -165,4 +159,14 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','isdakota','format','Boolean');
+			if ~obj.isdakota, return; end
+			WriteData(fid,'object',obj,'fieldname','partition','format','DoubleMat','mattype',2);
+			WriteData(fid,'object',obj,'fieldname','numberofpartitions','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','numberofresponses','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','variabledescriptors','format','StringArray');
+			WriteData(fid,'object',obj,'fieldname','responsedescriptors','format','StringArray');
+			WriteData(fid,'object',obj,'fieldname','mass_flux_segments','format','MatArray');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/rifts.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/rifts.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/rifts.m	(revision 10969)
@@ -6,7 +6,6 @@
 classdef rifts
 	properties (SetAccess=public) 
-		riftstruct     = modelfield('default',NaN,'marshall',true,'preprocess','marshallrifts','format','DoubleMat','mattype',3);
-		riftproperties = modelfield('default',NaN,'marshall',false);
-		numrifts       = modelfield('default',0,'marshall',true,'format','Integer');
+		riftstruct     = NaN;
+		riftproperties = NaN;
 	end
 	methods
@@ -28,13 +27,12 @@
 		function obj = setdefaultparameters(obj) % {{{
 
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 		end % }}}
 		function checkconsistency(obj,md,solution,analyses) % {{{
-			if obj.numrifts,
+			if isempty(obj.riftstruct) | isnans(obj.riftstruct),
+				numrifts=0;
+			else
+				numrifts=numel(obj.riftstruct);
+			end
+			if numrifts,
 				if ~(md.mesh.dimension==2),
 					checkmessage(['model not consistent: models with rifts are only supported in 2d for now!']);
@@ -50,5 +48,5 @@
 			else
 				if ~isnans(obj.riftstruct),
-					checkmessage(['riftstruct shoud be NaN since obj.numrifts is 0!']);
+					checkmessage(['riftstruct shoud be NaN since numrifts is 0!']);
 				end
 			end
@@ -62,4 +60,34 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+
+			%Process rift info
+			if isempty(obj.riftstruct) | isnans(obj.riftstruct),
+				numrifts=0;
+			else
+				numrifts=numel(obj.riftstruct);
+			end
+			numpairs=0;
+			for i=1:numrifts,
+				numpairs=numpairs+size(obj.riftstruct(i).penaltypairs,1);
+			end
+
+			% 2 for nodes + 2 for elements+ 2 for  normals + 1 for length + 1 for fill + 1 for friction + 1 for fraction + 1 for fractionincrement + 1 for state.
+			data=zeros(numpairs,12);
+			count=1;
+			for i=1:numrifts,
+				numpairsforthisrift=size(obj.riftstruct(i).penaltypairs,1);
+				data(count:count+numpairsforthisrift-1,1:7)=obj.riftstruct(i).penaltypairs;
+				data(count:count+numpairsforthisrift-1,8)=obj.riftstruct(i).fill;
+				data(count:count+numpairsforthisrift-1,9)=obj.riftstruct(i).friction;
+				data(count:count+numpairsforthisrift-1,10)=obj.riftstruct(i).fraction;
+				data(count:count+numpairsforthisrift-1,11)=obj.riftstruct(i).fractionincrement;
+				data(count:count+numpairsforthisrift-1,12)=obj.riftstruct(i).state;
+				count=count+numpairsforthisrift;
+			end
+
+			WriteData(fid,'data',numrifts,'enum',RiftsNumriftsEnum,'format','Integer');
+			WriteData(fid,'data',data,'enum',RiftsRiftstructEnum,'format','DoubleMat','mattype',3);
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/settings.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/settings.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/settings.m	(revision 10969)
@@ -6,9 +6,9 @@
 classdef settings
 	properties (SetAccess=public) 
-		io_gather           = modelfield('default',0,'marshall',true,'format','Boolean');
-		lowmem              = modelfield('default',0,'marshall',true,'format','Boolean');
-		results_on_vertices = modelfield('default',0,'marshall',true,'format','Boolean');
-		output_frequency    = modelfield('default',0,'marshall',true,'format','Integer');
-		waitonlock          = modelfield('default',0,'marshall',true,'format','Boolean');
+		io_gather           = 0;
+		lowmem              = 0;
+		results_on_vertices = 0;
+		output_frequency    = 0;
+		waitonlock          = 0;
 	end
 	methods
@@ -29,11 +29,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			%are we short in memory ? (0 faster but requires more memory)
@@ -71,4 +64,11 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','io_gather','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','lowmem','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','results_on_vertices','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','output_frequency','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','waitonlock','format','Boolean');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/steadystate.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/steadystate.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/steadystate.m	(revision 10969)
@@ -6,7 +6,7 @@
 classdef steadystate
 	properties (SetAccess=public) 
-		reltol            = modelfield('default',0,'marshall',true,'format','Double');
-		maxiter           = modelfield('default',0,'marshall',true,'format','Integer');
-		requested_outputs = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',3);
+		reltol            = 0;
+		maxiter           = 0;
+		requested_outputs = NaN;
 	end
 	methods
@@ -27,12 +27,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
-
 			%maximum of steady state iterations
 			obj.maxiter=100;
@@ -62,4 +54,9 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','reltol','format','Double');
+			WriteData(fid,'object',obj,'fieldname','maxiter','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','requested_outputs','format','DoubleMat','mattype',3);
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/surfaceforcings.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/surfaceforcings.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/surfaceforcings.m	(revision 10969)
@@ -6,7 +6,7 @@
 classdef surfaceforcings
 	properties (SetAccess=public) 
-		accumulation_rate = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		ablation_rate     = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		mass_balance      = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
+		accumulation_rate = NaN;
+		ablation_rate     = NaN;
+		mass_balance      = NaN;
 	end
 	methods
@@ -28,10 +28,4 @@
 		function obj = setdefaultparameters(obj) % {{{
 
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 		end % }}}
 		function checkconsistency(obj,md,solution,analyses) % {{{
@@ -52,4 +46,9 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','accumulation_rate','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','ablation_rate','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','mass_balance','format','DoubleMat','mattype',1);
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/thermal.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/thermal.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/thermal.m	(revision 10969)
@@ -6,10 +6,10 @@
 classdef thermal
 	properties (SetAccess=public) 
-		spctemperature    = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
-		penalty_threshold = modelfield('default',0,'marshall',true,'format','Integer');
-		stabilization     = modelfield('default',0,'marshall',true,'format','Integer');
-		maxiter           = modelfield('default',0,'marshall',true,'format','Integer');
-		penalty_lock      = modelfield('default',0,'marshall',true,'format','Integer');
-		penalty_factor    = modelfield('default',0,'marshall',true,'format','Double');
+		spctemperature    = NaN;
+		penalty_threshold = 0;
+		stabilization     = 0;
+		maxiter           = 0;
+		penalty_lock      = 0;
+		penalty_factor    = 0;
 	end
 	methods
@@ -30,11 +30,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			%Number of unstable constraints acceptable
@@ -68,4 +61,12 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','spctemperature','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',obj,'fieldname','penalty_threshold','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','maxiter','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','penalty_lock','format','Integer');
+			WriteData(fid,'object',obj,'fieldname','penalty_factor','format','Double');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/timestepping.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/timestepping.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/timestepping.m	(revision 10969)
@@ -6,8 +6,8 @@
 classdef timestepping
 	properties (SetAccess=public) 
-		time_step       = modelfield('default',0,'marshall',true,'format','Double');
-		final_time      = modelfield('default',0,'marshall',true,'format','Double');
-		time_adapt      = modelfield('default',0,'marshall',true,'format','Boolean');
-		cfl_coefficient = modelfield('default',0,'marshall',true,'format','Double');
+		time_step       = 0;
+		final_time      = 0;
+		time_adapt      = 0;
+		cfl_coefficient = 0;
 	end
 	methods
@@ -28,11 +28,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			%time between 2 time steps
@@ -60,4 +53,10 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','time_step','format','Double');
+			WriteData(fid,'object',obj,'fieldname','final_time','format','Double');
+			WriteData(fid,'object',obj,'fieldname','time_adapt','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','cfl_coefficient','format','Double');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/transient.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/transient.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/transient.m	(revision 10969)
@@ -6,9 +6,9 @@
 classdef transient
 	properties (SetAccess=public) 
-		isprognostic      = modelfield('default',0,'marshall',true,'format','Boolean');
-		isdiagnostic      = modelfield('default',0,'marshall',true,'format','Boolean');
-		isthermal         = modelfield('default',0,'marshall',true,'format','Boolean');
-		isgroundingline   = modelfield('default',0,'marshall',true,'format','Boolean');
-		requested_outputs = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',3);
+		isprognostic      = 0;
+		isdiagnostic      = 0;
+		isthermal         = 0;
+		isgroundingline   = 0;
+		requested_outputs = NaN;
 	end
 	methods
@@ -29,11 +29,4 @@
 		end % }}}
 		function obj = setdefaultparameters(obj) % {{{
-
-			%first, use the defaults provided by the properties definition above. 
-			fieldnames=fields(obj);
-			for i=1:length(fieldnames),
-				fieldname=fieldnames{i};
-				obj.(fieldname)=obj.(fieldname).default;
-			end
 
 			%full analysis: Diagnostic, Prognostic and Thermal but no groundingline migration for now
@@ -65,4 +58,11 @@
 
 		end % }}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'object',obj,'fieldname','isprognostic','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','isdiagnostic','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','isthermal','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','isgroundingline','format','Boolean');
+			WriteData(fid,'object',obj,'fieldname','requested_outputs','format','DoubleMat','mattype',3);
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/classes/verbose.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/verbose.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/classes/verbose.m	(revision 10969)
@@ -23,11 +23,11 @@
 		% {{{1
 		%BEGINFIELDS
-		mprocessor=false;
-		module=false;
-		solution=false;
-		solver=false;
-		convergence=false;
-		control=false;
-		qmu=false;
+		mprocessor  = false;
+		module      = false;
+		solution    = false;
+		solver      = false;
+		convergence = false;
+		control     = false;
+		qmu         = false;
 		%ENDFIELDS
 		% }}}
@@ -117,4 +117,7 @@
 		end
 		%}}}
+		function marshall(obj,fid) % {{{
+			WriteData(fid,'data',VerboseToBinary(obj),'enum',VerboseEnum,'format','Integer');
+		end % }}}
 	end
 end
Index: /issm/trunk-jpl/src/m/model/WriteData.m
===================================================================
--- /issm/trunk-jpl/src/m/model/WriteData.m	(revision 10969)
+++ /issm/trunk-jpl/src/m/model/WriteData.m	(revision 10969)
@@ -0,0 +1,260 @@
+function WriteData(fid,varargin)
+%WRITEDATA - write model field in binary file
+%
+%   Usage:
+%      WriteData(fid,varargin);
+
+%process options
+options=pairoptions(varargin{:});
+
+%Get data properties
+if exist(options,'object');
+	%This is a object field, construct enum and data
+	obj       = getfieldvalue(options,'object');
+	fieldname = getfieldvalue(options,'fieldname');
+	classname = class(obj);
+
+	enum      = BuildEnum([classname '_' fieldname]);
+	data      = obj.(fieldname);
+else
+	%No processing required
+	data = getfieldvalue(options,'data');
+	enum = getfieldvalue(options,'enum');
+end
+format  = getfieldvalue(options,'format');
+mattype = getfieldvalue(options,'mattype',0);    %only required for matrices
+
+%Process sparse matrices
+if issparse(data),
+	data=full(data);
+end
+
+%Step 1: write the enum to identify this record uniquely
+fwrite(fid,enum,'int'); 
+
+%Step 2: write the data itself.
+if     strcmpi(format,'Boolean'),% {{{
+	if(numel(data)~=1), error(['field ' field ' cannot be marshalled as it has more than one element!']); end
+
+	%first write length of record
+	fwrite(fid,4+4,'int');  %1 bool (disguised as an int)+code
+
+	%write data code: 
+	fwrite(fid,FormatToCode(format),'int'); 
+
+	%now write integer
+	fwrite(fid,data,'int');  %send an int, not easy to send a bool
+	% }}}
+elseif strcmpi(format,'Integer'), % {{{
+	if(numel(data)~=1), error(['field ' EnumToString(enum) ' cannot be marshalled as it has more than one element!']); end
+
+	%first write length of record
+	fwrite(fid,4+4,'int');  %1 integer + code
+
+	%write data code: 
+	fwrite(fid,FormatToCode(format),'int'); 
+
+	%now write integer
+	fwrite(fid,data,'int'); 
+	% }}}
+elseif strcmpi(format,'Double'), % {{{
+	if(numel(data)~=1), error(['field ' field ' cannot be marshalled as it has more than one element!']); end
+
+	%first write length of record
+	fwrite(fid,8+4,'int');  %1 double+code
+
+	%write data code: 
+	fwrite(fid,FormatToCode(format),'int'); 
+
+	%now write double
+	fwrite(fid,data,'double'); 
+	% }}}
+elseif strcmpi(format,'String'), % {{{
+	%first write length of record
+	fwrite(fid,length(data)+4+4,'int');  %string + string size + code
+
+	%write data code: 
+	fwrite(fid,FormatToCode(format),'int'); 
+
+	%now write string
+	fwrite(fid,length(data),'int'); 
+	fwrite(fid,data,'char'); 
+	% }}}
+elseif strcmpi(format,'BooleanMat'), % {{{
+
+	%Get size
+	s=size(data);
+	%if matrix = NaN, then do not write anything
+	if (s(1)==1 & s(2)==1 & isnan(data)),
+		s(1)=0; s(2)=0;
+	end
+
+	%first write length of record
+	fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int');  %2 integers (32 bits) + the double matrix + code + matrix type
+
+	%write data code and matrix type: 
+	fwrite(fid,FormatToCode(format),'int'); 
+	fwrite(fid,mattype,'int');
+
+	%now write matrix
+	fwrite(fid,s(1),'int'); 
+	fwrite(fid,s(2),'int'); 
+	if s(1)*s(2),
+		fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
+	end
+	% }}}
+elseif strcmpi(format,'IntMat'), % {{{
+
+	%Get size
+	s=size(data);
+	%if matrix = NaN, then do not write anything
+	if (s(1)==1 & s(2)==1 & isnan(data)),
+		s(1)=0; s(2)=0;
+	end
+
+	%first write length of record
+	fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int');  %2 integers (32 bits) + the double matrix + code + matrix type
+
+	%write data code and matrix type: 
+	fwrite(fid,FormatToCode(format),'int'); 
+	fwrite(fid,mattype,'int');
+
+	%now write matrix
+	fwrite(fid,s(1),'int'); 
+	fwrite(fid,s(2),'int'); 
+	if s(1)*s(2),
+		fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
+	end
+	% }}}
+elseif strcmpi(format,'DoubleMat'), % {{{
+
+	%Get size
+	s=size(data);
+	%if matrix = NaN, then do not write anything
+	if (s(1)==1 & s(2)==1 & isnan(data)),
+		s(1)=0; s(2)=0;
+	end
+
+	%first write length of record
+	fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int');  %2 integers (32 bits) + the double matrix + code + matrix type
+
+	%write data code and matrix type: 
+	fwrite(fid,FormatToCode(format),'int'); 
+	fwrite(fid,mattype,'int');
+
+	%now write matrix
+	fwrite(fid,s(1),'int'); 
+	fwrite(fid,s(2),'int'); 
+	if s(1)*s(2),
+		fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
+	end
+	% }}}
+elseif strcmpi(format,'MatArray'), % {{{
+
+	numrecords=numel(data);
+
+	%first get length of record
+	recordlength=4+4; %number of records + code
+	for i=1:numrecords,
+		matrix=data{i};
+		s=size(matrix);
+		recordlength=recordlength+4*2+... %row and col of matrix
+			s(1)*s(2)*8; %matrix of doubles
+	end
+
+	%write length of record
+	fwrite(fid,recordlength,'int'); 
+
+	%write data code: 
+	fwrite(fid,FormatToCode(format),'int'); 
+
+	%write data, first number of records
+	fwrite(fid,numrecords,'int'); 
+
+	%write each matrix: 
+	for i=1:numrecords,
+		matrix=data{i};
+		s=size(matrix);
+		fwrite(fid,s(1),'int'); 
+		fwrite(fid,s(2),'int'); 
+		fwrite(fid,matrix','double');
+	end
+	% }}}
+elseif strcmpi(format,'StringArray'), % {{{
+
+	%first get length of string array: 
+	num=numel(data);
+	%now get length of record: 
+	recordlength=4+4; %for length of array + code
+	for i=1:num,
+		string=data{i};
+		recordlength=recordlength+4+length(string); %for each string
+	end
+
+	%write length of record
+	fwrite(fid,recordlength,'int'); 
+
+	%write data code: 
+	fwrite(fid,FormatToCode(format),'int'); 
+
+	%now write length of string array
+	fwrite(fid,num,'int'); 
+
+	%now write the strings
+	for i=1:num,
+		string=data{i};
+		fwrite(fid,length(string),'int'); 
+		fwrite(fid,string,'char'); 
+	end
+	% }}}
+else  % {{{
+	error(['WriteData error message: data type: ' num2str(format) ' not supported yet! (' EnumToString(enum) ')']);
+end % }}}
+end
+
+function enum=BuildEnum(string) % {{{
+%BUILDENUM - build enum out of string
+%
+%   Usage:
+%      enum=BuildEnum(string)
+
+	if findstr(string,'_'),
+		indices=findstr(string,'_');
+		for i=1:length(indices),
+			string(indices(i)+1)=upper(string(indices(i)+1));
+		end
+		string(indices)=[];
+	end
+
+	%take first letter of string and make it uppercase: 
+	string(1)=upper(string(1));
+
+	%Get Enum
+	enum=eval([string 'Enum();']); 
+end % }}}
+function code=FormatToCode(format) % {{{1
+%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.
+	if     strcmpi(format,'Boolean'),
+		code=1;
+	elseif strcmpi(format,'Integer'), 
+		code=2;
+	elseif strcmpi(format,'Double'), 
+		code=3;
+	elseif strcmpi(format,'String'), 
+		code=4;
+	elseif strcmpi(format,'BooleanMat'),
+		code=5;
+	elseif strcmpi(format,'IntMat'),
+		code=6;
+	elseif strcmpi(format,'DoubleMat'),
+		code=7;
+	elseif strcmpi(format,'MatArray'), 
+		code=8;
+	elseif strcmpi(format,'StringArray'),
+		code=9;
+	else 
+		error('FormatToCode error message: data type not supported yet!');
+	end
+end% }}}
Index: /issm/trunk-jpl/src/m/model/marshall.m
===================================================================
--- /issm/trunk-jpl/src/m/model/marshall.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/model/marshall.m	(revision 10969)
@@ -1,6 +1,6 @@
 function marshall(md)
-%MARSHALL - output JPL-package compatible binary file from @model md, for certain solution type.
+%MARSHALL - output compatible binary file from @model md, for certain solution type.
 %
-%   The routine creates a JPL-package compatible binary file from @model md
+%   The routine creates a compatible binary file from @model md
 %   This binary file will be used for parallel runs in JPL-package
 %
@@ -16,7 +16,23 @@
 end
 
-%automatically marshall model md, using template information available from an empty model class.
-template=model.template();
-MarshallObject(fid,template,md,'');
+%Go through al model field check that it is a class and call checkconsistency
+fields=properties(md);
+for i=1:length(fields),
+	field=fields{i};
+
+	%Some properties do not need to be marshalled
+	if ismember(field,{'results' 'debug' 'radaroverlay' 'solver' 'cluster'  'flaim' 'private'}),
+		continue;
+	end
+
+	%Check that current field is an object
+	if ~isobject(md.(field))
+		checkmessage(['field ''' char(field) ''' is not an object']);
+	end
+
+	%Marshall current object
+	%disp(['marshalling ' field '...']);
+	md.(field).marshall(fid);
+end
 
 %close file
@@ -25,346 +41,2 @@
 	error(['marshall error message: could not close file ' [md.miscellaneous.name '.bin']]);
 end
-
-function MarshallObject(fid,template,object,prefix) % {{{
-fields=fieldnames(template);
-for i=1:length(fields),
-	fieldname=fields{i};
-	if ~isa(template.(fieldname),'modelfield'),
-		%Recursive call
-		MarshallObject(fid,template.(fieldname),object.(fieldname),[prefix fieldname])
-	elseif template.(fieldname).marshall,
-		if ~isempty(template.(fieldname).preprocess),
-			eval(['fieldvalue=' template.(fieldname).preprocess '(object.(fieldname));']);
-		else
-			fieldvalue=object.(fieldname);
-		end
-
-		%Capitalize for enums
-		fieldnamecap=fieldname;
-		fieldnamecap(1)=upper(fieldname(1));
-		prefixcap=prefix;
-		if ~isempty(prefix), prefixcap(1)=upper(prefix(1)); end
-
-		%Write Data
-		WriteData(fid,[prefixcap fieldnamecap],fieldvalue,template.(fieldname));
-	end
-end
-	% }}}
-function WriteData(fid,fieldname,fieldvalue,fieldprop) % {{{
-%WRITEDATA - write model field in binary file
-%
-%   Usage:
-%      WriteData(fid,fieldname,fieldvalue,fieldprop)
-%
-
-%first recover data, enum of the data and type of data
-data=fieldvalue;
-if fieldprop.enum==NoneEnum,
-	enum=BuildEnum(fieldname);
-else
-	%Field enum overloaded
-	enum=fieldprop.enum;
-end
-data_type=fieldprop.format;
-
-if issparse(data),
-	data=full(data);
-end
-
-%Ok! write the enum (name) to identify this record uniquely
-fwrite(fid,enum,'int'); 
-
-%Now, write the data itself.
-if     strcmpi(data_type,'Boolean'),% {{{
-	if(numel(data)~=1), error(['field ' field ' cannot be marshalled as it has more than one element!']); end
-
-	%first write length of record
-	fwrite(fid,4+4,'int');  %1 bool (disguised as an int)+code
-
-	%write data code: 
-	fwrite(fid,TypeToCode(data_type),'int'); 
-
-	%now write integer
-	fwrite(fid,data,'int');  %send an int, not easy to send a bool
-	% }}}
-elseif strcmpi(data_type,'Integer'), % {{{
-	if(numel(data)~=1), error(['field ' field ' cannot be marshalled as it has more than one element!']); end
-
-	%first write length of record
-	fwrite(fid,4+4,'int');  %1 integer + code
-
-	%write data code: 
-	fwrite(fid,TypeToCode(data_type),'int'); 
-
-	%now write integer
-	fwrite(fid,data,'int'); 
-	% }}}
-elseif strcmpi(data_type,'Double'), % {{{
-	if(numel(data)~=1), error(['field ' field ' cannot be marshalled as it has more than one element!']); end
-
-	%first write length of record
-	fwrite(fid,8+4,'int');  %1 double+code
-
-	%write data code: 
-	fwrite(fid,TypeToCode(data_type),'int'); 
-
-	%now write double
-	fwrite(fid,data,'double'); 
-	% }}}
-elseif strcmpi(data_type,'String'), % {{{
-	%first write length of record
-	fwrite(fid,length(data)+4+4,'int');  %string + string size + code
-
-	%write data code: 
-	fwrite(fid,TypeToCode(data_type),'int'); 
-
-	%now write string
-	fwrite(fid,length(data),'int'); 
-	fwrite(fid,data,'char'); 
-	% }}}
-elseif strcmpi(data_type,'BooleanMat'), % {{{
-
-	%matrix type:
-	mattype=fieldprop.mattype;
-
-	%Get size
-	s=size(data);
-	%if matrix = NaN, then do not write anything
-	if (s(1)==1 & s(2)==1 & isnan(data)),
-		s(1)=0; s(2)=0;
-	end
-
-	%first write length of record
-	fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int');  %2 integers (32 bits) + the double matrix + code + matrix type
-
-	%write data code and matrix type: 
-	fwrite(fid,TypeToCode(data_type),'int'); 
-	fwrite(fid,mattype,'int');
-
-	%now write matrix
-	fwrite(fid,s(1),'int'); 
-	fwrite(fid,s(2),'int'); 
-	if s(1)*s(2),
-		fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
-	end
-	% }}}
-elseif strcmpi(data_type,'IntMat'), % {{{
-
-	%matrix type:
-	mattype=fieldtype{2};
-
-	%Get size
-	s=size(data);
-	%if matrix = NaN, then do not write anything
-	if (s(1)==1 & s(2)==1 & isnan(data)),
-		s(1)=0; s(2)=0;
-	end
-
-	%first write length of record
-	fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int');  %2 integers (32 bits) + the double matrix + code + matrix type
-
-	%write data code and matrix type: 
-	fwrite(fid,TypeToCode(data_type),'int'); 
-	fwrite(fid,mattype,'int');
-
-	%now write matrix
-	fwrite(fid,s(1),'int'); 
-	fwrite(fid,s(2),'int'); 
-	if s(1)*s(2),
-		fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
-	end
-	% }}}
-elseif strcmpi(data_type,'DoubleMat'), % {{{
-
-	%matrix type:
-	mattype=fieldprop.mattype;
-
-	%Get size
-	s=size(data);
-	%if matrix = NaN, then do not write anything
-	if (s(1)==1 & s(2)==1 & isnan(data)),
-		s(1)=0; s(2)=0;
-	end
-
-	%first write length of record
-	fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int');  %2 integers (32 bits) + the double matrix + code + matrix type
-
-	%write data code and matrix type: 
-	fwrite(fid,TypeToCode(data_type),'int'); 
-	fwrite(fid,mattype,'int');
-
-	%now write matrix
-	fwrite(fid,s(1),'int'); 
-	fwrite(fid,s(2),'int'); 
-	if s(1)*s(2),
-		fwrite(fid,data','double'); %get to the "c" convention, hence the transpose
-	end
-	% }}}
-elseif strcmpi(data_type,'MatArray'), % {{{
-
-	numrecords=numel(data);
-
-	%first get length of record
-	recordlength=4+4; %number of records + code
-	for i=1:numrecords,
-		matrix=data{i};
-		s=size(matrix);
-		recordlength=recordlength+4*2+... %row and col of matrix
-			s(1)*s(2)*8; %matrix of doubles
-	end
-
-	%write length of record
-	fwrite(fid,recordlength,'int'); 
-
-	%write data code: 
-	fwrite(fid,TypeToCode(data_type),'int'); 
-
-	%write data, first number of records
-	fwrite(fid,numrecords,'int'); 
-
-	%write each matrix: 
-	for i=1:numrecords,
-		matrix=data{i};
-		s=size(matrix);
-		fwrite(fid,s(1),'int'); 
-		fwrite(fid,s(2),'int'); 
-		fwrite(fid,matrix','double');
-	end
-	% }}}
-elseif strcmpi(data_type,'StringArray'), % {{{
-
-	%first get length of string array: 
-	num=numel(data);
-	%now get length of record: 
-	recordlength=4+4; %for length of array + code
-	for i=1:num,
-		string=data{i};
-		recordlength=recordlength+4+length(string); %for each string
-	end
-
-	%write length of record
-	fwrite(fid,recordlength,'int'); 
-
-	%write data code: 
-	fwrite(fid,TypeToCode(data_type),'int'); 
-
-	%now write length of string array
-	fwrite(fid,num,'int'); 
-
-	%now write the strings
-	for i=1:num,
-		string=data{i};
-		fwrite(fid,length(string),'int'); 
-		fwrite(fid,string,'char'); 
-	end
-	% }}}
-else 
-	error(['WriteData error message: data type: ' num2str(data_type) ' not supported yet! (' EnumToString(enum) ')']);
-end
-% }}}
-function enum=BuildEnum(string) % {{{
-%BUILDENUM - build enum out of string
-%
-%   Usage:
-%      enum=BuildEnum(string)
-
-if findstr(string,'_'),
-	indices=findstr(string,'_');
-	for i=1:length(indices),
-		string(indices(i)+1)=upper(string(indices(i)+1));
-	end
-	string(indices)=[];
-end
-
-%take first letter of string and make it uppercase: 
-string(1)=upper(string(1));
-
-%Get Enum
-enum=eval([string 'Enum']); 
-% }}}
-function code=TypeToCode(data_type) % {{{1
-%This routine takes the data_type string, and hardcodes it into an integer, which 
-%is passed along the record, in order to identify the nature of the dataset being 
-%sent.
-if     strcmpi(data_type,'Boolean'),
-	code=1;
-elseif strcmpi(data_type,'Integer'), 
-	code=2;
-elseif strcmpi(data_type,'Double'), 
-	code=3;
-elseif strcmpi(data_type,'String'), 
-	code=4;
-elseif strcmpi(data_type,'BooleanMat'),
-	code=5;
-elseif strcmpi(data_type,'IntMat'),
-	code=6;
-elseif strcmpi(data_type,'DoubleMat'),
-	code=7;
-elseif strcmpi(data_type,'MatArray'), 
-	code=8;
-elseif strcmpi(data_type,'StringArray'),
-	code=9;
-else 
-	error('TypeToCode error message: data type not supported yet!');
-end% }}}
-
-%FIXME Some processing, should be moved to the corresponding classes in the future
-function out=marshallverbose(in)
-	out = VerboseToBinary(in);
-function out=marshallicefront(in)
-	out=in;
-	pos=find(in(:,end)==0); out(pos,end)=AirEnum;
-	pos=find(in(:,end)==1); out(pos,end)=WaterEnum;
-	pos=find(in(:,end)==2); out(pos,end)=IceEnum;
-
-function out=marshallrifts(in)
-	if isempty(in) | isnans(in),
-		numrifts=0;
-	else
-		numrifts=numel(in);
-	end
-	numpairs=0;
-	for i=1:numrifts,
-		numpairs=numpairs+size(in(i).penaltypairs,1);
-	end
-
-	out=zeros(numpairs,12); % 2 for nodes + 2 for elements+ 2 for  normals + 1 for length + 1 for fill + 1 for friction + 1 for fraction + 1 for fractionincrement + 1 for state.
-
-	count=1;
-	for i=1:numrifts,
-		numpairsforthisrift=size(in(i).penaltypairs,1);
-		out(count:count+numpairsforthisrift-1,1:7)=in(i).penaltypairs;
-		out(count:count+numpairsforthisrift-1,8)=in(i).fill;
-		out(count:count+numpairsforthisrift-1,9)=in(i).friction;
-		out(count:count+numpairsforthisrift-1,10)=in(i).fraction;
-		out(count:count+numpairsforthisrift-1,11)=in(i).fractionincrement;
-		out(count:count+numpairsforthisrift-1,12)=in(i).state;
-		count=count+numpairsforthisrift;
-	end
-function out=marshallapproximations(in),
-	out=in;
-	pos=find(in==0); out(pos,end)=NoneApproximationEnum;
-	pos=find(in==1); out(pos,end)=HutterApproximationEnum;
-	pos=find(in==2); out(pos,end)=MacAyealApproximationEnum;
-	pos=find(in==3); out(pos,end)=PattynApproximationEnum;
-	pos=find(in==4); out(pos,end)=StokesApproximationEnum;
-	pos=find(in==5); out(pos,end)=MacAyealPattynApproximationEnum;
-	pos=find(in==6); out(pos,end)=MacAyealStokesApproximationEnum;
-	pos=find(in==7); out(pos,end)=PattynStokesApproximationEnum;
-
-function out=marshallcontroltype(in)
-	out=zeros(1,numel(in));
-	for i=1:numel(in),
-		out(i)=StringToEnum(in{i});
-	end
-function out=marshallcmresponses(in),
-	out=in;
-	pos=find(in==101); out(pos)=SurfaceAbsVelMisfitEnum;
-	pos=find(in==102); out(pos)=SurfaceRelVelMisfitEnum;
-	pos=find(in==103); out(pos)=SurfaceLogVelMisfitEnum;
-	pos=find(in==104); out(pos)=SurfaceLogVxVyMisfitEnum;
-	pos=find(in==105); out(pos)=SurfaceAverageVelMisfitEnum;
-	pos=find(in==201); out(pos)=ThicknessAbsMisfitEnum;
-	pos=find(in==501); out(pos)=DragCoefficientAbsGradientEnum;
-	pos=find(in==502); out(pos)=RheologyBbarAbsGradientEnum;
-	pos=find(in==503); out(pos)=ThicknessAbsGradientEnum;
Index: sm/trunk-jpl/src/m/model/presolve.m
===================================================================
--- /issm/trunk-jpl/src/m/model/presolve.m	(revision 10968)
+++ 	(revision )
@@ -1,16 +1,0 @@
-function md=presolve(md)
-%PRESOLVE - pre-solve phase operations.
-%
-%   Usage:
-%      md=presolve(md)
-
-%deal with rifts.
-if isempty(md.rifts.riftstruct) | isnans(md.rifts.riftstruct),
-	md.rifts.numrifts=0;
-else
-	md.rifts.numrifts=numel(md.rifts.riftstruct);
-end
-
-%Control methods
-md.inversion.num_control_parameters=numel(md.inversion.control_parameters);
-md.inversion.num_cost_functions=size(md.inversion.cost_functions,2);
Index: /issm/trunk-jpl/src/m/model/solve.m
===================================================================
--- /issm/trunk-jpl/src/m/model/solve.m	(revision 10968)
+++ /issm/trunk-jpl/src/m/model/solve.m	(revision 10969)
@@ -52,7 +52,4 @@
 end
 
-%preprocesses model before solving
-md=presolve(md);
-
 %Save model as is (in case of a crash)
 assignin('base',inputname(1),md);
