Index: /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 6004)
+++ /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 6005)
@@ -64,5 +64,4 @@
 	parameters->AddObject(new DoubleParam(ViscosityOvershootEnum,iomodel->viscosity_overshoot));
 	parameters->AddObject(new BoolParam(WaitOnLockEnum,iomodel->waitonlock));
-	parameters->AddObject(new StringParam(PetscRcEnum,iomodel->petscrc));
 	parameters->AddObject(new IntParam(NumberOfElementsEnum,iomodel->numberofelements));
 	parameters->AddObject(new BoolParam(KffEnum,iomodel->kff));
Index: /issm/trunk/src/c/objects/IoModel.cpp
===================================================================
--- /issm/trunk/src/c/objects/IoModel.cpp	(revision 6004)
+++ /issm/trunk/src/c/objects/IoModel.cpp	(revision 6005)
@@ -48,5 +48,5 @@
 		xfree((void**)&this->gridonpattyn);
 	}
-	xfree((void**)&this->petscrc);
+	xfree((void**)&this->numpetscoptions);
 	xfree((void**)&this->elementonbed);
 	xfree((void**)&this->elementonsurface);
@@ -182,5 +182,5 @@
 	IoModelFetchData(&this->connectivity,iomodel_handle,"connectivity");
 	IoModelFetchData(&this->lowmem,iomodel_handle,"lowmem");
-	IoModelFetchData(&this->petscrc,iomodel_handle,"petscrc");
+	IoModelFetchData(&this->numpetscoptions,iomodel_handle,"numpetscoptions");
 	IoModelFetchData(&this->viscosity_overshoot,iomodel_handle,"viscosity_overshoot");
 	IoModelFetchData(&this->artdiff,iomodel_handle,"artificial_diffusivity");
@@ -227,5 +227,5 @@
 	this->control_analysis=0;
 	this->control_parameter=NULL;
-	this->petscrc=NULL;
+	this->numpetscoptions=NULL;
 	this->numberofvariables=0;
 	this->numvariabledescriptors=0;
Index: /issm/trunk/src/c/objects/IoModel.h
===================================================================
--- /issm/trunk/src/c/objects/IoModel.h	(revision 6004)
+++ /issm/trunk/src/c/objects/IoModel.h	(revision 6005)
@@ -22,5 +22,5 @@
 		int     qmu_analysis;
 		int     control_analysis;
-		char*   petscrc;
+		char*   numpetscoptions;
 
 		/*2d mesh: */
Index: /issm/trunk/src/c/objects/Loads/Icefront.h
===================================================================
--- /issm/trunk/src/c/objects/Loads/Icefront.h	(revision 6004)
+++ /issm/trunk/src/c/objects/Loads/Icefront.h	(revision 6005)
@@ -88,4 +88,3 @@
 		/*}}}*/
 };
-
 #endif  /* _ICEFRONT_H_ */
Index: /issm/trunk/src/c/toolkits/petsc/patches/NewMat.cpp
===================================================================
--- /issm/trunk/src/c/toolkits/petsc/patches/NewMat.cpp	(revision 6004)
+++ /issm/trunk/src/c/toolkits/petsc/patches/NewMat.cpp	(revision 6005)
@@ -94,5 +94,6 @@
 	/*preallocation  according to type: */
 	MatGetType(outmatrix,&type);
-	if(strcmp(type,"mpiaij")==0){
+	if((strcmp(type,"mpiaij")==0) || (strcmp(type,"aijmumps")==0)){
+		printf("here\n");
 		MatMPIAIJSetPreallocation(outmatrix,d_nz,NULL,o_nz,NULL);
 	}
Index: /issm/trunk/src/m/classes/@model/model.m
===================================================================
--- /issm/trunk/src/m/classes/@model/model.m	(revision 6004)
+++ /issm/trunk/src/m/classes/@model/model.m	(revision 6005)
@@ -266,5 +266,5 @@
 	%PETSc and MATLAB solver string
 	md.petscoptions=NaN;
-	md.petscrc='';
+	md.numpetscoptions=1;
 
 	%Analysis and sub_analysis
Index: /issm/trunk/src/m/classes/@model/setdefaultparameters.m
===================================================================
--- /issm/trunk/src/m/classes/@model/setdefaultparameters.m	(revision 6004)
+++ /issm/trunk/src/m/classes/@model/setdefaultparameters.m	(revision 6005)
@@ -235,6 +235,9 @@
 md.alloc_cleanup=1;
 
-%set petsc options cell array, so that PETSC uses the correct solvers
-md=solversettomumps(md);
+%set petsc options for different analysis
+md.petscoptions=petscoptions;
+md.petscoptions=addoptions(md.petscoptions,DiagnosticHorizAnalysisEnum,asmoptions);
+md.petscoptions=addoptions(md.petscoptions,DiagnosticVertAnalysisEnum,mumpsoptions);
+md.numpetscoptions=3; %don't forget the default analysis!
 
 %solution speed-up
Index: /issm/trunk/src/m/classes/petscoptions.m
===================================================================
--- /issm/trunk/src/m/classes/petscoptions.m	(revision 6005)
+++ /issm/trunk/src/m/classes/petscoptions.m	(revision 6005)
@@ -0,0 +1,58 @@
+%PETSCOPTIONS class definition
+%
+%   Usage:
+%      options=petscoptions();
+
+classdef petscoptions
+    properties (SetAccess=public) 
+		 % {{{1
+		 options={NoneAnalysisEnum,asmoptions};
+		 %used when marshalling
+		 analyses=[];
+		 strings={};
+		 %}}}
+	 end
+	 methods
+		 function disp(o) % {{{1
+			 %  display the object
+			 disp(sprintf('class ''%s'' object ''%s'' = \n',class(o),inputname(1)));
+			 %  display the options
+			 for i=1:size(o.options,1),
+				 analysis=o.options{i,1};
+				 ioptions=o.options{i,2};
+				 string=PetscOptions2PetscRc(ioptions);
+				 disp(sprintf('   %s -> ''%s''',EnumToString(analysis),string));
+			 end
+			 disp(sprintf('\n'));
+		 end
+		 %}}}
+		 function o=addoptions(o,analysis,solveroptions) % {{{1
+			 %first, find out if analysis has already been supplied
+			 found=0;
+			 for i=1:size(o.options,1),
+				 inanalysis=o.options{i,1};
+				 if inanalysis==analysis,
+					 found=1;
+					 o.options{i,1}=analysis;
+					 o.options{i,2}=solveroptions;
+					 break;
+				 end
+			 end
+			 if ~found,
+				 o.options{end+1,1}=analysis;
+				 o.options{end,2}=solveroptions;
+			 end
+		 end
+		 %}}}
+		 function o=marshall(o)%{{{1
+			 %marshall options into analyses and strings
+			 o.analyses=zeros(size(o.options,1),1);
+			 o.strings=cell(size(o.options,1),1);
+			 for i=1:size(o.options,1),
+				 o.analyses(i)=o.options{i,1};
+				 o.strings{i}=petscoptiontostring(o.options{i,2});
+			 end
+		 end
+		 %}}}
+	end
+end
Index: /issm/trunk/src/m/clusters/astrid.m
===================================================================
--- /issm/trunk/src/m/clusters/astrid.m	(revision 6004)
+++ /issm/trunk/src/m/clusters/astrid.m	(revision 6005)
@@ -9,5 +9,5 @@
     properties (SetAccess=public) 
 		 % {{{1
-		 name='astrid'
+		 name='astrid';
 		 login='larour';
 		 np=15;
Index: /issm/trunk/src/m/model/PetscOptions2PetscRc.m
===================================================================
--- /issm/trunk/src/m/model/PetscOptions2PetscRc.m	(revision 6004)
+++ /issm/trunk/src/m/model/PetscOptions2PetscRc.m	(revision 6005)
@@ -3,4 +3,5 @@
 %
 % Usage:     petscstring=PetscOptions2PetscRc(petscoptions,filename);
+%            petscstring=PetscOptions2PetscRc(petscoptions);
 %
 % Example:   md.petscsrc=PetscOptions2PetscRc(md.petscoptions,'petsc.rc');
@@ -9,12 +10,14 @@
 
 
-%open file for writing
-fid=fopen(filename,'w');
-if fid==-1,
-	error(['PetscOptions2PetscRc error: could not open ' filename ' for writing']);
+if nargin==2,
+	%open file for writing
+	fid=fopen(filename,'w');
+	if fid==-1,
+		error(['PetscOptions2PetscRc error: could not open ' filename ' for writing']);
+	end
+
+	%write header
+	fprintf(fid,'%s%s%s\n\n','%Petsc options file: ',filename,' written from Matlab petscoptions array');
 end
-
-%write header
-fprintf(fid,'%s%s%s\n\n','%Petsc options file: ',filename,' written from Matlab petscoptions array');
 
 %initialize petscstring: 
@@ -28,13 +31,19 @@
 	elseif length(option)==1,
 		%this option has only one argument
-		fprintf(fid,'-%s\n',option{1});
+		if(nargin==2),
+			fprintf(fid,'-%s\n',option{1});
+		end
 		petscstring=[petscstring ' -' option{1}];
 	elseif length(option)==2,
 		%option with value. value can be string or scalar
 		if isscalar(option{2}),
-			fprintf(fid,'-%s %g\n',option{1},option{2});
+			if(nargin==2),
+				fprintf(fid,'-%s %g\n',option{1},option{2});
+			end
 			petscstring=[petscstring ' -' option{1} ' ' num2str(option{2})];
 		elseif ischar(option{2}),
-			fprintf(fid,'-%s %s\n',option{1},option{2});
+			if(nargin==2),
+				fprintf(fid,'-%s %s\n',option{1},option{2});
+			end
 			petscstring=[petscstring ' -' option{1} ' ' option{2}];
 		else
@@ -44,4 +53,3 @@
 		error(['PetscOptions2PetscRc error: option #' num2str(i) ' is not well formatted']);
 	end
-
 end
Index: /issm/trunk/src/m/model/marshall.m
===================================================================
--- /issm/trunk/src/m/model/marshall.m	(revision 6004)
+++ /issm/trunk/src/m/model/marshall.m	(revision 6005)
@@ -180,4 +180,11 @@
 WriteData(fid,md.outputfilename,'String','outputfilename');
 
+%petsc options:
+WriteData(fid,md.numpetscoptions,'Integer','numpetscoptions');
+WriteData(fid,md.petscoptions.analyses,'Mat','petscoptionsanalyses');
+for i=1:md.numpetscoptions,
+	WriteData(fid,md.petscoptions.strings{i},'String',['petscoptionsstrings_' num2str(i-1)]);
+end
+
 %close file
 st=fclose(fid);
Index: /issm/trunk/src/m/model/petscoptiontostring.m
===================================================================
--- /issm/trunk/src/m/model/petscoptiontostring.m	(revision 6005)
+++ /issm/trunk/src/m/model/petscoptiontostring.m	(revision 6005)
@@ -0,0 +1,30 @@
+function petscstring=petscoptiontostring(petscoptions)
+%PETSCOPTIONTOSTRING: build a Petsc compatible options string
+%
+% Usage:     petscstring=PetscOptions2PetscRc(petscoptions);
+%
+
+%initialize petscstring: 
+petscstring='';
+
+%start writing options
+for i=1:length(petscoptions),
+	option=petscoptions{i};
+	if isempty(option),
+		%do nothing
+	elseif length(option)==1,
+		%this option has only one argument
+		petscstring=[petscstring ' -' option{1}];
+	elseif length(option)==2,
+		%option with value. value can be string or scalar
+		if isscalar(option{2}),
+			petscstring=[petscstring ' -' option{1} ' ' num2str(option{2})];
+		elseif ischar(option{2}),
+			petscstring=[petscstring ' -' option{1} ' ' option{2}];
+		else
+			error(['PetscOptions2PetscRc error: option #' num2str(i) ' is not well formatted']);
+		end
+	else 
+		error(['PetscOptions2PetscRc error: option #' num2str(i) ' is not well formatted']);
+	end
+end
Index: /issm/trunk/src/m/model/presolve.m
===================================================================
--- /issm/trunk/src/m/model/presolve.m	(revision 6004)
+++ /issm/trunk/src/m/model/presolve.m	(revision 6005)
@@ -34,4 +34,5 @@
 end
 
-%deal with petsc options
-md.petscrc=PetscOptions2PetscRc(md.petscoptions,[md.name '.petsc']);
+%package together petscoptions: 
+md.petscoptions=marshall(md.petscoptions);
+md.numpetscoptions=size(md.petscoptions.analyses,1);
Index: /issm/trunk/src/m/model/solvers/asmoptions.m
===================================================================
--- /issm/trunk/src/m/model/solvers/asmoptions.m	(revision 6005)
+++ /issm/trunk/src/m/model/solvers/asmoptions.m	(revision 6005)
@@ -0,0 +1,31 @@
+function options=asmoptions(varargin)
+%ASMOPTIONS - return Additive Shwartz Method petsc options
+%
+%   Usage:
+%      options=asmoptions;
+			 
+%retrieve options provided in varargin
+arguments=pairoptions(varargin{:});
+
+%default asm options
+options={{'mat_type','aij'},{'ksp_type','gmres'},{'pc_type','asm'},{'sub_pc_type','lu'},{'pc_asm_overlap',3},{'ksp_max_it',100},{'ksp_rtol',1e-30'}};
+
+%now, go through our arguments, and write over default options.
+for i=1:size(arguments.list,1),
+	arg1=arguments.list{i,1};
+	arg2=arguments.list{i,2};
+	found=0;
+	for j=1:size(options,2),
+		joption=options{j};
+		if strcmpi(joption{1},arg1),
+			joption{2}=arg2;
+			options{j}=joption;
+			found=1;
+			break;
+		end
+	end
+	if ~found,
+		%this option did not exist, add it: 
+		options{end+1}={arg1,arg2};
+	end
+end
Index: /issm/trunk/src/m/model/solvers/mumpsoptions.m
===================================================================
--- /issm/trunk/src/m/model/solvers/mumpsoptions.m	(revision 6005)
+++ /issm/trunk/src/m/model/solvers/mumpsoptions.m	(revision 6005)
@@ -0,0 +1,31 @@
+function options=mumpsoptions(varargin)
+%MUMPSOPTIONS - return MUMPS direct solver  petsc options
+%
+%   Usage:
+%      options=mumpsoptions;
+			 
+%retrieve options provided in varargin
+arguments=pairoptions(varargin{:});
+
+%default mumps options
+options={{'mat_type','aijmumps'},{'ksp_type','preonly'},{'pc_type','lu'},{'mat_mumps_icntl_14',120},{'pc_factor_shift_positive_definite','true'}};
+
+%now, go through our arguments, and write over default options.
+for i=1:size(arguments.list,1),
+	arg1=arguments.list{i,1};
+	arg2=arguments.list{i,2};
+	found=0;
+	for j=1:size(options,2),
+		joption=options{j};
+		if strcmpi(joption{1},arg1),
+			joption{2}=arg2;
+			options{j}=joption;
+			found=1;
+			break;
+		end
+	end
+	if ~found,
+		%this option did not exist, add it: 
+		options{end+1}={arg1,arg2};
+	end
+end
Index: /issm/trunk/src/m/utils/OS/oshostname.m
===================================================================
--- /issm/trunk/src/m/utils/OS/oshostname.m	(revision 6004)
+++ /issm/trunk/src/m/utils/OS/oshostname.m	(revision 6005)
@@ -21,2 +21,4 @@
 	hostname=ddewhite(hostname);
 end
+
+hostname='ericmac';
Index: /issm/trunk/src/mex/SystemMatrices/SystemMatrices.h
===================================================================
--- /issm/trunk/src/mex/SystemMatrices/SystemMatrices.h	(revision 6004)
+++ /issm/trunk/src/mex/SystemMatrices/SystemMatrices.h	(revision 6005)
@@ -36,4 +36,5 @@
 #define PF   (mxArray**)&plhs[4]
 #define KMAX (mxArray**)&plhs[5]
+#define KMAX (mxArray**)&plhs[2]
 
 /* serial arg counts: */
