Index: /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 5902)
+++ /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 5903)
@@ -365,5 +365,5 @@
 	NodalEnum,
 	ResponseDescriptorsEnum,
-	SolverStringEnum,
+	PetscRcEnum,
 	SparsityEnum,
 	TolXEnum,
Index: /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 5902)
+++ /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 5903)
@@ -327,5 +327,5 @@
 		case NodalEnum : return "Nodal";
 		case ResponseDescriptorsEnum : return "ResponseDescriptors";
-		case SolverStringEnum : return "SolverString";
+		case PetscRcEnum : return "PetscRc";
 		case SparsityEnum : return "Sparsity";
 		case TolXEnum : return "TolX";
Index: /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 5902)
+++ /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 5903)
@@ -325,5 +325,5 @@
 	else if (strcmp(name,"Nodal")==0) return NodalEnum;
 	else if (strcmp(name,"ResponseDescriptors")==0) return ResponseDescriptorsEnum;
-	else if (strcmp(name,"SolverString")==0) return SolverStringEnum;
+	else if (strcmp(name,"PetscRc")==0) return PetscRcEnum;
 	else if (strcmp(name,"Sparsity")==0) return SparsityEnum;
 	else if (strcmp(name,"TolX")==0) return TolXEnum;
Index: /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 5902)
+++ /issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 5903)
@@ -64,5 +64,5 @@
 	parameters->AddObject(new DoubleParam(ViscosityOvershootEnum,iomodel->viscosity_overshoot));
 	parameters->AddObject(new BoolParam(WaitOnLockEnum,iomodel->waitonlock));
-	parameters->AddObject(new StringParam(SolverStringEnum,iomodel->solverstring));
+	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/modules/Solverx/Solverx.cpp
===================================================================
--- /issm/trunk/src/c/modules/Solverx/Solverx.cpp	(revision 5902)
+++ /issm/trunk/src/c/modules/Solverx/Solverx.cpp	(revision 5903)
@@ -27,5 +27,7 @@
 	PetscTruth flag;
 	int solver_type;
-	char* solver_string=NULL;
+	char* petscrc=NULL;
+	bool  fromlocalsize=true;
+
 
 	/*Display message*/
@@ -44,35 +46,41 @@
 	}
 	else{
-		MatGetLocalSize(Kff,&local_m,&local_n);uf=NewVec(local_n,true);
+		MatGetLocalSize(Kff,&local_m,&local_n);uf=NewVec(local_n,fromlocalsize);
 	}
 
-	/*Before preparing the solver, add options to the options database*/
-	parameters->FindParam(&solver_string,SolverStringEnum);
-	PetscOptionsInsertMultipleString(solver_string);
 
-	/*Process solver_string to see if we are not using special types of external solvers: */
-	PetscOptionsDetermineSolverType(&solver_type,solver_string);
+	/*Process petscrc to see if we are not using special types of external solvers: */
+	parameters->FindParam(&petscrc,PetscRcEnum);
+	PetscOptionsDetermineSolverType(&solver_type,petscrc);
+	
+	/*In serial mode, we don't have a petsc.rc file to boot the Petsc options. Do it now 
+	 * using the petscrc string recover in the parameters: */
+	#ifdef _SERIAL_
+		PetscOptionsInsertMultipleString(petscrc);
 
-	#if _PETSC_VERSION_ == 2 
-	if (solver_type==MUMPSPACKAGE_LU){
-		/*Convert Kff to MATTAIJMUMPS: */
-		MatConvert(Kff,MATAIJMUMPS,MAT_REUSE_MATRIX,&Kff);
-	}
-	if (solver_type==MUMPSPACKAGE_CHOL){
-		/*Convert Kff to MATTSBAIJMUMPS: */
-		MatConvert(Kff,MATSBAIJMUMPS,MAT_REUSE_MATRIX,&Kff);
-	}
-	if (solver_type==SPOOLESPACKAGE_LU){
-		/*Convert Kff to MATTSBAIJMUMPS: */
-		MatConvert(Kff,MATAIJSPOOLES,MAT_REUSE_MATRIX,&Kff);
-	}
-	if (solver_type==SPOOLESPACKAGE_CHOL){
-		/*Convert Kff to MATTSBAIJMUMPS: */
-		MatConvert(Kff,MATSBAIJSPOOLES,MAT_REUSE_MATRIX,&Kff);
-	}
-	if (solver_type==SUPERLUDISTPACKAGE){
-		/*Convert Kff to MATTSBAIJMUMPS: */
-		MatConvert(Kff,MATSUPERLU_DIST,MAT_REUSE_MATRIX,&Kff);
-	}
+		/*In serial mode, matrices have been loaded at MPIAIJ or AIJ matrices. 
+		 * We need to convert them if we are going to run the solvers successfully: */
+		#if _PETSC_VERSION_ == 2 
+			if (solver_type==MUMPSPACKAGE_LU){
+				/*Convert Kff to MATTAIJMUMPS: */
+				MatConvert(Kff,MATAIJMUMPS,MAT_REUSE_MATRIX,&Kff);
+			}
+			if (solver_type==MUMPSPACKAGE_CHOL){
+				/*Convert Kff to MATTSBAIJMUMPS: */
+				MatConvert(Kff,MATSBAIJMUMPS,MAT_REUSE_MATRIX,&Kff);
+			}
+			if (solver_type==SPOOLESPACKAGE_LU){
+				/*Convert Kff to MATTSBAIJMUMPS: */
+				MatConvert(Kff,MATAIJSPOOLES,MAT_REUSE_MATRIX,&Kff);
+			}
+			if (solver_type==SPOOLESPACKAGE_CHOL){
+				/*Convert Kff to MATTSBAIJMUMPS: */
+				MatConvert(Kff,MATSBAIJSPOOLES,MAT_REUSE_MATRIX,&Kff);
+			}
+			if (solver_type==SUPERLUDISTPACKAGE){
+				/*Convert Kff to MATTSBAIJMUMPS: */
+				MatConvert(Kff,MATSUPERLU_DIST,MAT_REUSE_MATRIX,&Kff);
+			}
+		#endif
 	#endif
 
@@ -82,10 +90,12 @@
 	KSPSetFromOptions(ksp);
 
-	#if _PETSC_VERSION_ == 3 
-	/*specific solver?: */
-	KSPGetPC(ksp,&pc);
-	if (solver_type==MUMPSPACKAGE_LU){
-		PCFactorSetMatSolverPackage(pc,MAT_SOLVER_MUMPS);
-	}
+	#ifdef _SERIAL_
+		#if _PETSC_VERSION_ == 3 
+		/*specific solver?: */
+		KSPGetPC(ksp,&pc);
+		if (solver_type==MUMPSPACKAGE_LU){
+			PCFactorSetMatSolverPackage(pc,MAT_SOLVER_MUMPS);
+		}
+		#endif
 	#endif
 
@@ -98,4 +108,6 @@
 		}
 	}
+
+	/*Solve: */
 	KSPSolve(ksp,pf,uf);
 	
@@ -106,5 +118,5 @@
 	/*Free ressources:*/
 	KSPFree(&ksp);
-	xfree((void**)&solver_string);
+	xfree((void**)&petscrc);
 	
 	/*Assign output pointers:*/
Index: /issm/trunk/src/c/modules/SystemMatricesx/SystemMatricesx.cpp
===================================================================
--- /issm/trunk/src/c/modules/SystemMatricesx/SystemMatricesx.cpp	(revision 5902)
+++ /issm/trunk/src/c/modules/SystemMatricesx/SystemMatricesx.cpp	(revision 5903)
@@ -160,5 +160,5 @@
 		}
 	}
-	
+
 	/*Assign output pointers: */
 	if(pKgg) *pKgg=Kgg;
Index: /issm/trunk/src/c/objects/IoModel.cpp
===================================================================
--- /issm/trunk/src/c/objects/IoModel.cpp	(revision 5902)
+++ /issm/trunk/src/c/objects/IoModel.cpp	(revision 5903)
@@ -48,5 +48,5 @@
 		xfree((void**)&this->gridonpattyn);
 	}
-	xfree((void**)&this->solverstring);
+	xfree((void**)&this->petscrc);
 	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->solverstring,iomodel_handle,"solverstring");
+	IoModelFetchData(&this->petscrc,iomodel_handle,"petscrc");
 	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->solverstring=NULL;
+	this->petscrc=NULL;
 	this->numberofvariables=0;
 	this->numvariabledescriptors=0;
Index: /issm/trunk/src/c/objects/IoModel.h
===================================================================
--- /issm/trunk/src/c/objects/IoModel.h	(revision 5902)
+++ /issm/trunk/src/c/objects/IoModel.h	(revision 5903)
@@ -22,5 +22,5 @@
 		int     qmu_analysis;
 		int     control_analysis;
-		char*   solverstring;
+		char*   petscrc;
 
 		/*2d mesh: */
Index: /issm/trunk/src/c/solutions/issm.cpp
===================================================================
--- /issm/trunk/src/c/solutions/issm.cpp	(revision 5902)
+++ /issm/trunk/src/c/solutions/issm.cpp	(revision 5903)
@@ -42,5 +42,5 @@
 
 	/*Initialize Petsc and get start time*/
-	PetscInitialize(&argc,&argv,(char *)0,"");  
+	PetscInitialize(&argc,&argv,"petsc.rc","");  
 	MPI_Barrier(MPI_COMM_WORLD); start=MPI_Wtime();
 
Index: /issm/trunk/src/m/classes/@model/model.m
===================================================================
--- /issm/trunk/src/m/classes/@model/model.m	(revision 5902)
+++ /issm/trunk/src/m/classes/@model/model.m	(revision 5903)
@@ -270,6 +270,6 @@
 
 	%PETSc and MATLAB solver string
-	md.solverstring='';
-	md.solver_type='';
+	md.petscoptions=NaN;
+	md.petscrc='';
 
 	%Analysis and sub_analysis
Index: /issm/trunk/src/m/classes/@model/setdefaultparameters.m
===================================================================
--- /issm/trunk/src/m/classes/@model/setdefaultparameters.m	(revision 5902)
+++ /issm/trunk/src/m/classes/@model/setdefaultparameters.m	(revision 5903)
@@ -250,10 +250,6 @@
 md.alloc_cleanup=1;
 
-%the string of solverstring is used directly by PETSc to solve finite element
-%systems KU=F. By default, we use MUMPS solver
+%set petsc options cell array, so that PETSC uses the correct solvers
 md=solversettomumps(md);
-
-%Ice solver: 'general' for Matlab's default solver (or 'lu' or 'sholesky')
-md.solver_type='general';
 
 %solution speed-up
Index: /issm/trunk/src/m/enum/EnumToString.m
===================================================================
--- /issm/trunk/src/m/enum/EnumToString.m	(revision 5902)
+++ /issm/trunk/src/m/enum/EnumToString.m	(revision 5903)
@@ -322,5 +322,5 @@
 case NodalEnum(), string='Nodal'; return
 case ResponseDescriptorsEnum(), string='ResponseDescriptors'; return
-case SolverStringEnum(), string='SolverString'; return
+case PetscRcEnum(), string='PetscRc'; return
 case SparsityEnum(), string='Sparsity'; return
 case TolXEnum(), string='TolX'; return
Index: /issm/trunk/src/m/enum/PetscRcEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PetscRcEnum.m	(revision 5903)
+++ /issm/trunk/src/m/enum/PetscRcEnum.m	(revision 5903)
@@ -0,0 +1,11 @@
+function macro=PetscRcEnum()
+%PETSCRCENUM - Enum of PetscRc
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/SynchronizeMatlabEnum
+%            Please read src/c/README for more information
+%
+%   Usage:
+%      macro=PetscRcEnum()
+
+macro=311;
Index: sm/trunk/src/m/enum/SolverStringEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SolverStringEnum.m	(revision 5902)
+++ 	(revision )
@@ -1,11 +1,0 @@
-function macro=SolverStringEnum()
-%SOLVERSTRINGENUM - Enum of SolverString
-%
-%   WARNING: DO NOT MODIFY THIS FILE
-%            this file has been automatically generated by src/c/SynchronizeMatlabEnum
-%            Please read src/c/README for more information
-%
-%   Usage:
-%      macro=SolverStringEnum()
-
-macro=311;
Index: /issm/trunk/src/m/enum/StringToEnum.m
===================================================================
--- /issm/trunk/src/m/enum/StringToEnum.m	(revision 5902)
+++ /issm/trunk/src/m/enum/StringToEnum.m	(revision 5903)
@@ -320,5 +320,5 @@
 			elseif (strcmpi(name,'Nodal')), enum=NodalEnum(); return
 			elseif (strcmpi(name,'ResponseDescriptors')), enum=ResponseDescriptorsEnum(); return
-			elseif (strcmpi(name,'SolverString')), enum=SolverStringEnum(); return
+			elseif (strcmpi(name,'PetscRc')), enum=PetscRcEnum(); return
 			elseif (strcmpi(name,'Sparsity')), enum=SparsityEnum(); return
 			elseif (strcmpi(name,'TolX')), enum=TolXEnum(); return
Index: /issm/trunk/src/m/model/PetscOptions2PetscRc.m
===================================================================
--- /issm/trunk/src/m/model/PetscOptions2PetscRc.m	(revision 5903)
+++ /issm/trunk/src/m/model/PetscOptions2PetscRc.m	(revision 5903)
@@ -0,0 +1,47 @@
+function petscstring=PetscOptions2PetscRc(petscoptions,filename)
+%PETSCOPTIONS2PETSCRC: build a Petsc compatible options file, from the petscoptions model field  + return options string
+%
+% Usage:     petscstring=PetscOptions2PetscRc(petscoptions,filename);
+%
+% Example:   md.petscsrc=PetscOptions2PetscRc(md.petscoptions,'petsc.rc');
+%
+% See also: solversettomumps, solversettoasm, etc ...
+
+
+%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');
+
+%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
+		fprintf(fid,'-%s\n',option{1});
+		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});
+			petscstring=[petscstring ' -' option{1} ' ' num2str(option{2})];
+		elseif ischar(option{2}),
+			fprintf(fid,'-%s %s\n',option{1},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/marshall.m
===================================================================
--- /issm/trunk/src/m/model/marshall.m	(revision 5902)
+++ /issm/trunk/src/m/model/marshall.m	(revision 5903)
@@ -134,5 +134,5 @@
 WriteData(fid,md.lowmem,'Integer','lowmem');
 WriteData(fid,md.optscal,'Mat','optscal');
-WriteData(fid,md.solverstring,'String','solverstring');
+WriteData(fid,md.petscrc,'String','petscrc');
 WriteData(fid,md.viscosity_overshoot,'Scalar','viscosity_overshoot');
 WriteData(fid,md.stokesreconditioning,'Scalar','stokesreconditioning');
Index: /issm/trunk/src/m/model/presolve.m
===================================================================
--- /issm/trunk/src/m/model/presolve.m	(revision 5902)
+++ /issm/trunk/src/m/model/presolve.m	(revision 5903)
@@ -33,2 +33,5 @@
 	count=count+numpairsforthisrift;
 end
+
+%deal with petsc options
+md.petscrc=PetscOptions2PetscRc(md.petscoptions,'petsc.rc');
Index: /issm/trunk/src/m/model/queue/LaunchQueueJob.m
===================================================================
--- /issm/trunk/src/m/model/queue/LaunchQueueJob.m	(revision 5902)
+++ /issm/trunk/src/m/model/queue/LaunchQueueJob.m	(revision 5903)
@@ -22,5 +22,5 @@
 	
 	%compress the files into one zip.
-	compressstring=['tar -zcf ' md.runtimename '.tar.gz ' md.name '.bin ' md.name '.queue '];
+	compressstring=['tar -zcf ' md.runtimename '.tar.gz ' md.name '.bin ' md.name '.queue petsc.rc'];
 	if md.qmu_analysis,
 		compressstring=[compressstring md.name '.qmu.in'];
Index: /issm/trunk/src/m/model/solvers/solversettoasm.m
===================================================================
--- /issm/trunk/src/m/model/solvers/solversettoasm.m	(revision 5902)
+++ /issm/trunk/src/m/model/solvers/solversettoasm.m	(revision 5903)
@@ -5,5 +5,5 @@
 %      md=solversettoasm(md)
 
-%md.solverstring=' -mat_type aij -ksp_type cgs -pc_type asm -sub_mat_type mumps -sub_pc_type lu -pc_asm_overlap 4 -pc_factor_shift_positive_definite true';
-%md.solverstring=' -mat_type aij -ksp_type cgs -pc_type asm -sub_pc_type lu -pc_asm_overlap 4 ';
-md.solverstring=' -mat_type aij -ksp_type gmres -pc_type asm -sub_pc_type lu -pc_asm_overlap 4 ';
+%md.petscoptions={{'mat_type','aij'},{'ksp_type','cgs'},{'pc_type','asm'},{sub_mat_type','mumps'},{'sub_pc_type','lu'},{'pc_asm_overlap',4},{'pc_factor_shift_positive_definite','true'}};
+%md.petscoptions={{'mat_type','aij'},{'ksp_type','cgs'},{'pc_type','asm'},{'sub_pc_type','lu'},{'pc_asm_overlap',4}};
+md.petscoptions={{'mat_type','aij'},{'ksp_type','gmres'},{'pc_type','asm'},{'sub_pc_type','lu'},{'pc_asm_overlap',4}};
Index: /issm/trunk/src/m/model/solvers/solversettomatlab.m
===================================================================
--- /issm/trunk/src/m/model/solvers/solversettomatlab.m	(revision 5902)
+++ /issm/trunk/src/m/model/solvers/solversettomatlab.m	(revision 5903)
@@ -5,3 +5,3 @@
 %      md=solversettomatlab(md)
 
-md.solverstring='-ksp_type matlab';
+md.petscoptions={{'ksp_type','matlab'}};
Index: /issm/trunk/src/m/model/solvers/solversettomumps.m
===================================================================
--- /issm/trunk/src/m/model/solvers/solversettomumps.m	(revision 5902)
+++ /issm/trunk/src/m/model/solvers/solversettomumps.m	(revision 5903)
@@ -5,6 +5,3 @@
 %      md=solversettomumps(md)
 
-md.solverstring='-mat_type aijmumps -ksp_type preonly -pc_type lu -mat_mumps_icntl_14 120 -pc_factor_shift_positive_definite true';
-
-%optional
-%md.solverstring=[md.solverstring ' -mat_mumps_icntl_14 40 -mat_mumps_icntl_4 0 -mat_mumps_sym 1 -mat_ignore_lower_triangular'];
+md.petscoptions={{'mat_type','aijmumps'},{'ksp_type','preonly'},{'pc_type','lu'},{'mat_mumps_icntl_14',120},{'pc_factor_shift_positive_definite','true'}};
Index: /issm/trunk/src/m/model/solvers/solversettosor.m
===================================================================
--- /issm/trunk/src/m/model/solvers/solversettosor.m	(revision 5902)
+++ /issm/trunk/src/m/model/solvers/solversettosor.m	(revision 5903)
@@ -5,6 +5,3 @@
 %      md=solversettosor(md)
 
-md.mat_type='aij';
-md.ksp_type='cg';
-md.pc_type='sor';
-md.solver_extra_option=' -pc_sor_omega 1.1 -pc_sor_its 2 ';
+md.petscoptions={{'mat_type','aij'},{'ksp_type','cg'},{'pc_type','sor'},{'pc_sor_omega',1.1},{pc_sor_its',2}};
Index: /issm/trunk/src/mex/Solver/Solver.cpp
===================================================================
--- /issm/trunk/src/mex/Solver/Solver.cpp	(revision 5902)
+++ /issm/trunk/src/mex/Solver/Solver.cpp	(revision 5903)
@@ -12,5 +12,5 @@
 	Vec         uf0           = NULL;
 	Vec         uf            = NULL;
-	char       *solver_string = NULL;
+	char       *petscrc = NULL;
 	Parameters *parameters    = NULL;
 	int         verbose;
@@ -27,9 +27,9 @@
 	/*First, check solver string: */
 	FetchParams(&parameters,PARAMETERS);
-	parameters->FindParam(&solver_string,SolverStringEnum);
+	parameters->FindParam(&petscrc,PetscRcEnum);
 	int verbose; parameters->FindParam(&verbose,VerboseEnum);
 	
 	/*Fetch rest of data only if not running the matlab solver: */
-	if (strcmp(solver_string,matlabstring)!=0){
+	if (strcmp(petscrc,matlabstring)!=0){
 		/*Input datasets: */
 		FetchData(&Kff,KFF);
@@ -55,5 +55,5 @@
 	VecFree(&uf);
 	delete parameters;
-	xfree((void**)&solver_string);
+	xfree((void**)&petscrc);
 
 	MODULEEND();
Index: /issm/trunk/test/NightlyRun/test104.m
===================================================================
--- /issm/trunk/test/NightlyRun/test104.m	(revision 5902)
+++ /issm/trunk/test/NightlyRun/test104.m	(revision 5903)
@@ -5,4 +5,5 @@
 md=setelementstype(md,'macayeal','all');
 md.cluster=oshostname;
+md.verbose=1;
 md=solve(md,'analysis_type',DiagnosticSolutionEnum);
 
