Index: /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 22557)
+++ /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 22558)
@@ -572,24 +572,26 @@
 
 /*Methods relating to parameters: */
-char* OptionsFromAnalysis(Parameters* parameters,int analysis_type){ /*{{{*/
+char* OptionsFromAnalysis(char** pouttoolkit,Parameters* parameters,int analysis_type){ /*{{{*/
 
 	/* figure out ISSM options for current analysis, return a string. */ 
 
 	/*output: */
-	char*   outstring=NULL;
+	char *outstring  = NULL;
+	char *outtoolkit = NULL;
 
 	/*intermediary: */
 	int          dummy;
-	IssmDouble  *analyses    = NULL;
+	int         *analyses    = NULL;
 	char       **strings     = NULL;
 	char        *string      = NULL;
+	char       **toolkits    = NULL;
+	char        *toolkit     = NULL;
 	int          numanalyses;
 	int          found       = -1;
 	int          i;
 
-	numanalyses=0;
 	parameters->FindParam(&strings,&numanalyses,ToolkitsOptionsStringsEnum);
-
-	parameters->FindParam(&analyses,&dummy,ToolkitsOptionsAnalysesEnum);
+	parameters->FindParam(&toolkits,&dummy,ToolkitsTypesEnum); _assert_(dummy==numanalyses); 
+	parameters->FindParam(&analyses,&dummy,ToolkitsOptionsAnalysesEnum); _assert_(dummy==numanalyses); 
 
 	if(numanalyses==0)return NULL; //we did not find petsc options, don't bother.
@@ -611,19 +613,25 @@
 		}
 	}
-	if (found==-1){
+	if(found==-1){
 		_error_("could find neither a default analysis nor analysis " << EnumToStringx(analysis_type));
 	}
 
-	/*ok, grab the option string: */
+	/*1. Grab the option toolkit: */
+	outtoolkit=xNew<char>(strlen(toolkits[found])+1);
+	strcpy(outtoolkit,toolkits[found]);
+	*pouttoolkit = outtoolkit;
+
+	/*2. Grab the option string: */
 	outstring=xNew<char>(strlen(strings[found])+1);
 	strcpy(outstring,strings[found]);
 
 	/*Free ressources*/
-	xDelete<IssmDouble>(analyses);
 	for(i=0;i<numanalyses;i++){
-		string=strings[i];
-		xDelete<char>(string);
-	}
+		xDelete<char>(toolkits[i]);
+		xDelete<char>(strings[i]);
+	}
+	xDelete<char*>(toolkits);
 	xDelete<char*>(strings);
+	xDelete<int>(analyses);
 	return outstring;
 } 
@@ -638,11 +646,12 @@
 	 */ 
 
-	char* options=NULL;
+	char* options = NULL;
+	char* toolkit = NULL;
 
 	/*Recover first the options string for this analysis: */
-	options=OptionsFromAnalysis(parameters,analysis_type);
+	options=OptionsFromAnalysis(&toolkit,parameters,analysis_type);
 
 	/*Initialize our Toolkit Options: */
-	ToolkitOptions::Init(options);
+	ToolkitOptions::Init(toolkit,options);
 
 	#ifdef _HAVE_PETSC_
@@ -672,4 +681,5 @@
 
 	xDelete<char>(options);
+	xDelete<char>(toolkit);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/main/globals.h
===================================================================
--- /issm/trunk-jpl/src/c/main/globals.h	(revision 22557)
+++ /issm/trunk-jpl/src/c/main/globals.h	(revision 22558)
@@ -16,4 +16,5 @@
  * database if we use Petsc. Can also be used to characterize the ISSM toolkit,
  * often used when Petsc is not allowed*/
+char* ToolkitOptions::toolkittype;
 char* ToolkitOptions::toolkitoptions;
 #endif
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp	(revision 22557)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp	(revision 22558)
@@ -21,4 +21,5 @@
 	int         num_indices;
 	char* options=NULL;
+	char* toolkit=NULL;
 
 	IssmDouble* xp=NULL;
@@ -35,6 +36,6 @@
 
 		/*Solver pointers depend on what type of solver we are implementing: */
-		options=OptionsFromAnalysis(parameters,DefaultAnalysisEnum); //options database is not filled in yet, use default.
-		ToolkitOptions::Init(options);
+		options=OptionsFromAnalysis(&toolkit,parameters,DefaultAnalysisEnum);
+		ToolkitOptions::Init(toolkit,options);
 
 		switch(IssmSolverTypeFromToolkitOptions()){
Index: /issm/trunk-jpl/src/c/modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.cpp	(revision 22557)
+++ /issm/trunk-jpl/src/c/modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.cpp	(revision 22558)
@@ -19,16 +19,20 @@
 void ParseToolkitsOptionsx(Parameters* parameters,FILE* fid){
 
-	char line [1000];
+	char line[1000];
+	char word1[1000];
+	char word2[1000];
 	int my_rank;
 	int i;
 
 	/*intermediary: */
-	IssmDouble* analyses=NULL;
-	char** strings=NULL;
-	int numanalyses;
-	char* string=NULL;
-	char* newstring=NULL;
-	char* catstring=NULL;
-	int   stringlength;
+	int         *analyses     = NULL;
+	char       **strings      = NULL;
+	char        *string       = NULL;
+	char       **toolkits     = NULL;
+	char        *toolkit      = NULL;
+	char        *newstring    = NULL;
+	char        *catstring    = NULL;
+	int          numanalyses;
+	int          stringlength,toolkitlength;
 
 	/*Get my_rank:*/
@@ -39,21 +43,27 @@
 		/*Now, go through lines and figure out how many analyses we have: */
 		numanalyses=0;
-		while ( fgets(line, sizeof line, fid) ){
+		while(fgets(line, sizeof line, fid)){
 			/*skip comments and empty lines: */
-			if ((line[0]=='%') || (line[0]=='\n') || (line[0]==' ') || (line[0]=='\t') || (line[0]=='\r'))continue;
+			if ((line[0]=='%') || (line[0]=='\n') || (line[0]==' ') || (line[0]=='\t') || (line[0]=='\r')) continue;
 			/*ok, first time, we should get an analysis enum, starting with a +: */
-			if (line[0]=='+')numanalyses++;
-			else continue;
+			if (line[0]=='+'){
+				numanalyses++;
+			}
+			else{
+				continue;
+			}
 		}
 
 		/*Now, allocate analyses and strings: */
-		analyses=xNew<IssmDouble>(numanalyses);
-		strings=xNew<char*>(numanalyses);
-		for(i=0;i<numanalyses;i++)strings[i]=NULL; 
+		analyses = xNew<int>(numanalyses);
+		strings  = xNew<char*>(numanalyses);
+		toolkits = xNew<char*>(numanalyses);
+		for(i=0;i<numanalyses;i++) strings[i]  = NULL; 
+		for(i=0;i<numanalyses;i++) toolkits[i] = NULL; 
 
 		/*Go back to beginning of file:*/
 		fseek(fid,0,SEEK_SET);
 		numanalyses=0;
-		while ( fgets(line, sizeof line, fid) ){
+		while( fgets(line, sizeof line, fid)){
 
 			/*skip comments and empty lines: */
@@ -63,10 +73,18 @@
 			line[strlen(line)-1]='\0';
 
-			if (line[0]=='+'){ /*this is the analysis line: */
+			if(line[0]=='+'){ /*this is the analysis line: */
 				analyses[numanalyses]=StringToEnumx(&line[1]);  //skip the '+'
 				numanalyses++;
+				/*Now get toolkit (should be following line)*/
+				if(!fgets(line, sizeof line, fid)) _error_("could not read toolkit for analysis " << &line[1]);
+				sscanf(line,"-%s %s",&word1[0],&word2[0]);
+				if(strcmp(word1,"toolkit")!=0) _error_("toolkit option does not follow analysis");
+				toolkit=xNew<char>((strlen(word2)+1)); 
+				xMemCpy<char>(toolkit,word2,(strlen(word2)+1));
+				toolkits[numanalyses-1]=toolkit;
+				continue;
 			}
-			else{ /*this is an option corresponding to analysis numanalyses-1. Add it 
-			to the already existing options*/
+			else{
+				/*this is an option corresponding to analysis numanalyses-1. Add it to the already existing options*/
 				if(strings[numanalyses-1]==NULL){
 					string=xNew<char>((strlen(line)+1)); 
@@ -97,9 +115,20 @@
 	ISSM_MPI_Bcast(&numanalyses,1,ISSM_MPI_INT,0,IssmComm::GetComm());
 	if(my_rank!=0){
-		analyses=xNew<IssmDouble>(numanalyses);
-		strings=xNew<char*>(numanalyses);
+		analyses  = xNew<int>(numanalyses);
+		toolkits  = xNew<char*>(numanalyses);
+		strings   = xNew<char*>(numanalyses);
 	}
-	ISSM_MPI_Bcast(analyses,numanalyses,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+	ISSM_MPI_Bcast(analyses,numanalyses,ISSM_MPI_INT,0,IssmComm::GetComm());
 	for(i=0;i<numanalyses;i++){
+		char* toolkit=toolkits[i];
+		if(my_rank==0){
+			if(toolkit==NULL) _error_("PETSc options for analysis " << EnumToStringx(reCast<int>(analyses[i])) << " have been declared but were not found");
+		}
+		if(my_rank==0)toolkitlength=(strlen(toolkit)+1)*sizeof(char);
+		ISSM_MPI_Bcast(&toolkitlength,1,ISSM_MPI_INT,0,IssmComm::GetComm());
+		if(my_rank!=0)toolkit=xNew<char>(toolkitlength);
+		ISSM_MPI_Bcast(toolkit,toolkitlength,ISSM_MPI_CHAR,0,IssmComm::GetComm());
+		if(my_rank!=0)toolkits[i]=toolkit;
+
 		char* string=strings[i];
 		if(my_rank==0){
@@ -115,10 +144,13 @@
 	/*Ok, out of strings and analyses and numanalyses, create parameters, and plug them into parameters container: */
 	parameters->AddObject(new StringArrayParam(ToolkitsOptionsStringsEnum,strings,numanalyses));
-	parameters->AddObject(new DoubleVecParam(ToolkitsOptionsAnalysesEnum,analyses,numanalyses));
+	parameters->AddObject(new StringArrayParam(ToolkitsTypesEnum,toolkits,numanalyses));
+	parameters->AddObject(new IntVecParam(ToolkitsOptionsAnalysesEnum,analyses,numanalyses));
 
 	/*Clean up and return*/
 	for(i=0;i<numanalyses;i++) xDelete<char>(strings[i]);
+	for(i=0;i<numanalyses;i++) xDelete<char>(toolkits[i]);
 	xDelete<char*>(strings);
-	xDelete<IssmDouble>(analyses);
+	xDelete<char*>(toolkits);
+	xDelete<int>(analyses);
 	return;
 }
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22557)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22558)
@@ -809,4 +809,5 @@
 	LockFileNameEnum,
 	RestartFileNameEnum,
+	ToolkitsTypesEnum,
 	ToolkitsOptionsAnalysesEnum,
 	ToolkitsOptionsStringsEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22557)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22558)
@@ -797,4 +797,5 @@
 		case LockFileNameEnum : return "LockFileName";
 		case RestartFileNameEnum : return "RestartFileName";
+		case ToolkitsTypesEnum : return "ToolkitsTypes";
 		case ToolkitsOptionsAnalysesEnum : return "ToolkitsOptionsAnalyses";
 		case ToolkitsOptionsStringsEnum : return "ToolkitsOptionsStrings";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22557)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22558)
@@ -815,4 +815,5 @@
 	      else if (strcmp(name,"LockFileName")==0) return LockFileNameEnum;
 	      else if (strcmp(name,"RestartFileName")==0) return RestartFileNameEnum;
+	      else if (strcmp(name,"ToolkitsTypes")==0) return ToolkitsTypesEnum;
 	      else if (strcmp(name,"ToolkitsOptionsAnalyses")==0) return ToolkitsOptionsAnalysesEnum;
 	      else if (strcmp(name,"ToolkitsOptionsStrings")==0) return ToolkitsOptionsStringsEnum;
@@ -874,9 +875,9 @@
 	      else if (strcmp(name,"SealevelriseTransitions")==0) return SealevelriseTransitionsEnum;
 	      else if (strcmp(name,"SealevelriseRequestedOutputs")==0) return SealevelriseRequestedOutputsEnum;
-	      else if (strcmp(name,"SealevelriseNumRequestedOutputs")==0) return SealevelriseNumRequestedOutputsEnum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"LoveNfreq")==0) return LoveNfreqEnum;
+	      if (strcmp(name,"SealevelriseNumRequestedOutputs")==0) return SealevelriseNumRequestedOutputsEnum;
+	      else if (strcmp(name,"LoveNfreq")==0) return LoveNfreqEnum;
 	      else if (strcmp(name,"LoveFrequencies")==0) return LoveFrequenciesEnum;
 	      else if (strcmp(name,"LoveShNmax")==0) return LoveShNmaxEnum;
@@ -997,9 +998,9 @@
 	      else if (strcmp(name,"SegInput")==0) return SegInputEnum;
 	      else if (strcmp(name,"Tria")==0) return TriaEnum;
-	      else if (strcmp(name,"TriaInput")==0) return TriaInputEnum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"Tetra")==0) return TetraEnum;
+	      if (strcmp(name,"TriaInput")==0) return TriaInputEnum;
+	      else if (strcmp(name,"Tetra")==0) return TetraEnum;
 	      else if (strcmp(name,"TetraInput")==0) return TetraInputEnum;
 	      else if (strcmp(name,"Penta")==0) return PentaEnum;
@@ -1120,9 +1121,9 @@
 	      else if (strcmp(name,"P1xP2")==0) return P1xP2Enum;
 	      else if (strcmp(name,"P1xP3")==0) return P1xP3Enum;
-	      else if (strcmp(name,"P1xP4")==0) return P1xP4Enum;
          else stage=10;
    }
    if(stage==10){
-	      if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
+	      if (strcmp(name,"P1xP4")==0) return P1xP4Enum;
+	      else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
 	      else if (strcmp(name,"P1P1")==0) return P1P1Enum;
 	      else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;
Index: /issm/trunk-jpl/src/c/toolkits/ToolkitOptions.cpp
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/ToolkitOptions.cpp	(revision 22557)
+++ /issm/trunk-jpl/src/c/toolkits/ToolkitOptions.cpp	(revision 22558)
@@ -9,21 +9,24 @@
 #include "../shared/MemOps/MemOps.h"
 
-void ToolkitOptions::Init(char* options){ /*{{{*/
+void  ToolkitOptions::Init(const char* toolkit_in,const char* options){ /*{{{*/
 
 	/*First, avoid a leak: */
 	xDelete<char>(toolkitoptions);
+	xDelete<char>(toolkittype);
 
 	/*copy options into toolkitoptions:*/
+	_assert_(toolkit_in);
 	_assert_(options);
-	toolkitoptions= xNew<char>(strlen(options)+1); 
-	sprintf(toolkitoptions,   "%s",options);
-
+	toolkittype = xNew<char>(strlen(toolkit_in)+1); 
+	sprintf(toolkittype,"%s",toolkit_in);
+	toolkitoptions = xNew<char>(strlen(options)+1); 
+	sprintf(toolkitoptions,"%s",options);
 }/*}}}*/
 char* ToolkitOptions::GetToolkitType(){  /*{{{*/
 
-	/*Look for token: -toolkit, and return value:*/
-
-	return TokenValue(toolkitoptions,"toolkit");
-
+	_assert_(toolkittype); 
+	char* toolkittype_out = xNew<char>(strlen(toolkittype)+1); 
+	sprintf(toolkittype_out,"%s",toolkittype);
+	return toolkittype_out;
 }/*}}}*/
 char* ToolkitOptions::GetToolkitOptionValue(const char* option){  /*{{{*/
Index: /issm/trunk-jpl/src/c/toolkits/ToolkitOptions.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/ToolkitOptions.h	(revision 22557)
+++ /issm/trunk-jpl/src/c/toolkits/ToolkitOptions.h	(revision 22558)
@@ -11,8 +11,9 @@
 
 	private:
+		static char* toolkittype;
 		static char* toolkitoptions;
 
 	public:
-		static void Init(char* options);
+		static void Init(const char* type_in,const char* options);
 		static char* GetToolkitType(void);
 		static char* GetToolkitOptionValue(const char* option);
Index: /issm/trunk-jpl/src/c/toolkits/objects/Matrix.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/objects/Matrix.h	(revision 22557)
+++ /issm/trunk-jpl/src/c/toolkits/objects/Matrix.h	(revision 22558)
@@ -127,6 +127,4 @@
 		void InitCheckAndSetType(void){/*{{{*/
 
-			char* toolkittype=NULL;
-
 			#ifdef _HAVE_PETSC_
 			pmatrix=NULL;
@@ -135,5 +133,5 @@
 
 			/*retrieve toolkittype: */
-			toolkittype=ToolkitOptions::GetToolkitType();
+			char* toolkittype=ToolkitOptions::GetToolkitType();
 
 			/*set matrix type: */
@@ -149,5 +147,7 @@
 				type=IssmMatType;
 			}
-			else _error_("unknow toolkit type ");
+			else{
+				_error_("unknow toolkit type ");
+			}
 
 			/*Free ressources: */
Index: /issm/trunk-jpl/src/c/toolkits/objects/Vector.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/objects/Vector.h	(revision 22557)
+++ /issm/trunk-jpl/src/c/toolkits/objects/Vector.h	(revision 22558)
@@ -98,6 +98,4 @@
 		void InitCheckAndSetType(void){ /*{{{*/
 
-			char* toolkittype=NULL;
-
 			#ifdef _HAVE_PETSC_
 			pvector=NULL;
@@ -106,8 +104,9 @@
 
 			/*retrieve toolkittype: */
-			toolkittype=ToolkitOptions::GetToolkitType();
+			char* toolkittype=ToolkitOptions::GetToolkitType();
+			_assert_(toolkittype); 
 
 			/*set vector type: */
-			if (strcmp(toolkittype,"petsc")==0){
+			if(strcmp(toolkittype,"petsc")==0){
 				#ifdef _HAVE_PETSC_
 				type=PetscVecType; 
@@ -120,5 +119,7 @@
 				type=IssmVecType;
 			}
-			else _error_("unknow toolkit type ");
+			else{
+				_error_("unknow toolkit type ");
+			}
 
 			/*Free ressources: */
