Index: /issm/trunk/src/c/modules/DakotaResponsesx/DakotaResponses.cpp
===================================================================
--- /issm/trunk/src/c/modules/DakotaResponsesx/DakotaResponses.cpp	(revision 4439)
+++ /issm/trunk/src/c/modules/DakotaResponsesx/DakotaResponses.cpp	(revision 4439)
@@ -0,0 +1,97 @@
+/*!\file:  DakotaResponses.cpp
+ * \brief  compute dakota responses, using a list of response descriptors.
+ */ 
+
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "../../Container/Container.h"    
+#include "../../shared/shared.h"
+#include "../../include/include.h"
+#include "../../EnumDefinitions/EnumDefinitions.h"
+#include "../modules.h"
+
+void DakotaResponses(double* responses,char** responses_descriptors,int numresponses,FemModel* femmodel){
+
+	int i;
+	int dummy;
+	extern int my_rank;
+	
+	/*intermediary: */
+	char* response_descriptor=NULL;
+	double femmodel_response;
+			
+
+	for(i=0;i<numresponses;i++){
+
+		response_descriptor=responses_descriptors[i];
+
+		/*Compute response for this response_descriptor:*/
+
+		if(strcmp(response_descriptor,"min_vel")==0){
+			MinVelx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"max_vel")==0){
+			MaxVelx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"min_vx")==0){
+			MinVxx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"max_vx")==0){
+			MaxVxx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"max_abs_vx")==0){
+			MaxAbsVxx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"min_vy")==0){
+			MinVyx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"max_vy")==0){
+			MaxVyx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"max_abs_vy")==0){
+			MaxAbsVyx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"min_vz")==0){
+			MinVzx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"max_vz")==0){
+			MaxVzx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"max_abs_vz")==0){
+			MaxAbsVzx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"misfit")==0){
+			Misfitx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
+		}
+		else if(strcmp(response_descriptor,"mass_flux")==0){
+
+			double*   segments=NULL;
+			int       num_segments;
+			
+			/*retrieve qmu_mass_flux_segments: */
+			femmodel->parameters->FindParam(&segments,&num_segments,&dummy,QmuMassFluxSegmentsEnum);
+
+			/*call mass flux module: */
+			MassFluxx(&femmodel_response,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,segments,num_segments);
+
+			/*Free ressources:*/
+			xfree((void**)&segments);
+
+		}
+		else{
+			ISSMERROR("%s%s%s"," response descriptor : ",response_descriptor," not supported yet!");
+		}
+			
+		/*send response back to Dakota only on cpu 0: */
+		if(my_rank==0)responses[i]=femmodel_response;
+	}
+
+}
+
+
+
+
Index: /issm/trunk/src/c/modules/DakotaResponsesx/InputUpdateFromDakotax.cpp
===================================================================
--- /issm/trunk/src/c/modules/DakotaResponsesx/InputUpdateFromDakotax.cpp	(revision 4439)
+++ /issm/trunk/src/c/modules/DakotaResponsesx/InputUpdateFromDakotax.cpp	(revision 4439)
@@ -0,0 +1,24 @@
+/*!\file InputUpdateFromDakotax
+ * \brief: update datasets using  parameter inputs
+ */
+
+#include "./InputUpdateFromDakotax.h"
+#include "../../shared/shared.h"
+#include "../../include/include.h"
+#include "../../toolkits/toolkits.h"
+#include "../../EnumDefinitions/EnumDefinitions.h"
+
+void InputUpdateFromDakotax(FemModel* femmodel, double* variables,char** variables_descriptors,int numvariables){
+
+	int     verbose;
+	int     qmu_npart;
+	double* qmu_part=NULL;
+	int     dummy;
+
+	/*retrieve parameters: */
+	femmodel->parameters->FindParam(&verbose,VerboseEnum);
+	femmodel->parameters->FindParam(&qmu_npart,QmuNPartEnum);
+	femmodel->parameters->FindParam(&qmu_part,&dummy,QmuPartEnum);
+
+	ISSMERROR(" not supported yet!");
+}
Index: /issm/trunk/src/c/modules/DakotaResponsesx/InputUpdateFromDakotax.h
===================================================================
--- /issm/trunk/src/c/modules/DakotaResponsesx/InputUpdateFromDakotax.h	(revision 4439)
+++ /issm/trunk/src/c/modules/DakotaResponsesx/InputUpdateFromDakotax.h	(revision 4439)
@@ -0,0 +1,14 @@
+/*!\file:  InputUpdateFromDakotax.h
+ * \brief header file for updating datasets from inputs
+ */ 
+
+#ifndef _INPUTUPDATEFROMDAKOTAXX_H
+#define _INPUTUPDATEFROMDAKOTAXX_H
+
+#include "../../objects/objects.h"
+#include "../../Container/Container.h"
+
+void InputUpdateFromDakotax(FemModel* femmodel,double* variables,char** variables_descriptors,int numvariables);
+
+#endif  /* _INPUTUPDATEFROMDAKOTAXX_H */
+
Index: /issm/trunk/src/c/modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp
===================================================================
--- /issm/trunk/src/c/modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp	(revision 4438)
+++ /issm/trunk/src/c/modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp	(revision 4439)
@@ -11,8 +11,8 @@
 void InputUpdateFromDakotax(FemModel* femmodel, double* variables,char** variables_descriptors,int numvariables){
 
-	int verbose;
-	int qmu_npart;
-	int dummy;
+	int     verbose;
+	int     qmu_npart;
 	double* qmu_part=NULL;
+	int     dummy;
 
 	/*retrieve parameters: */
Index: /issm/trunk/src/c/modules/OutputResultsx/MatlabWriteResults.cpp
===================================================================
--- /issm/trunk/src/c/modules/OutputResultsx/MatlabWriteResults.cpp	(revision 4438)
+++ /issm/trunk/src/c/modules/OutputResultsx/MatlabWriteResults.cpp	(revision 4439)
@@ -24,4 +24,5 @@
 	/*output: */
 	mxArray* dataref=NULL;
+	mxArray* processeddataref=NULL;
 	mwSize nfields;
 	mwSize maxfields;
@@ -90,8 +91,11 @@
 		result->SetMatlabField(dataref);
 	}
-	
+
+	/*Now, process the patch in the dataref structure, by calling MatlabProcessPatch.m 
+	 *on the current dataref structure: */
+	mexCallMATLAB(1,&processeddataref,1,&dataref, "MatlabProcessPatch");
+
 	/*Assign output pointers:*/
-	*pdataref=dataref;
-
+	*pdataref=processeddataref;
 }
 #endif
Index: sm/trunk/src/c/modules/Qmux/DakotaResponses.cpp
===================================================================
--- /issm/trunk/src/c/modules/Qmux/DakotaResponses.cpp	(revision 4438)
+++ 	(revision )
@@ -1,97 +1,0 @@
-/*!\file:  DakotaResponses.cpp
- * \brief  compute dakota responses, using a list of response descriptors.
- */ 
-
-#ifdef HAVE_CONFIG_H
-	#include "config.h"
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include "../../Container/Container.h"    
-#include "../../shared/shared.h"
-#include "../../include/include.h"
-#include "../../EnumDefinitions/EnumDefinitions.h"
-#include "../modules.h"
-
-void DakotaResponses(double* responses,char** responses_descriptors,int numresponses,FemModel* femmodel){
-
-	int i;
-	int dummy;
-	extern int my_rank;
-	
-	/*intermediary: */
-	char* response_descriptor=NULL;
-	double femmodel_response;
-			
-
-	for(i=0;i<numresponses;i++){
-
-		response_descriptor=responses_descriptors[i];
-
-		/*Compute response for this response_descriptor:*/
-
-		if(strcmp(response_descriptor,"min_vel")==0){
-			MinVelx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"max_vel")==0){
-			MaxVelx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"min_vx")==0){
-			MinVxx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"max_vx")==0){
-			MaxVxx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"max_abs_vx")==0){
-			MaxAbsVxx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"min_vy")==0){
-			MinVyx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"max_vy")==0){
-			MaxVyx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"max_abs_vy")==0){
-			MaxAbsVyx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"min_vz")==0){
-			MinVzx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"max_vz")==0){
-			MaxVzx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"max_abs_vz")==0){
-			MaxAbsVzx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"misfit")==0){
-			Misfitx( &femmodel_response, femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
-		}
-		else if(strcmp(response_descriptor,"mass_flux")==0){
-
-			double*   segments=NULL;
-			int       num_segments;
-			
-			/*retrieve qmu_mass_flux_segments: */
-			femmodel->parameters->FindParam(&segments,&num_segments,&dummy,QmuMassFluxSegmentsEnum);
-
-			/*call mass flux module: */
-			MassFluxx(&femmodel_response,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,segments,num_segments);
-
-			/*Free ressources:*/
-			xfree((void**)&segments);
-
-		}
-		else{
-			ISSMERROR("%s%s%s"," response descriptor : ",response_descriptor," not supported yet!");
-		}
-			
-		/*send response back to Dakota only on cpu 0: */
-		if(my_rank==0)responses[i]=femmodel_response;
-	}
-
-}
-
-
-
-
Index: /issm/trunk/src/c/modules/Qmux/SpawnCore.cpp
===================================================================
--- /issm/trunk/src/c/modules/Qmux/SpawnCore.cpp	(revision 4438)
+++ /issm/trunk/src/c/modules/Qmux/SpawnCore.cpp	(revision 4439)
@@ -24,12 +24,9 @@
 		SpawnCoreSerial(responses, numresponses, variables, variables_descriptors,numvariables, (mxArray*)femmodel, counter);
 	#else
-
 		/*Call SpawnCoreParallel unless counter=-1 on cpu0, in which case, bail out and return 0: */
 		MPI_Bcast(&counter,1,MPI_INT,0,MPI_COMM_WORLD); 
 		if(counter==-1)return 0;
-
 		SpawnCoreParallel(responses, numresponses, variables, variables_descriptors,numvariables, (FemModel*)femmodel,counter);
 	#endif
-
 	return 1;
 }
Index: /issm/trunk/src/c/modules/Qmux/SpawnCoreParallel.cpp
===================================================================
--- /issm/trunk/src/c/modules/Qmux/SpawnCoreParallel.cpp	(revision 4438)
+++ /issm/trunk/src/c/modules/Qmux/SpawnCoreParallel.cpp	(revision 4439)
@@ -46,4 +46,5 @@
 	int      dummy;
 	int      solution_type;
+	void (*solutioncore)(FemModel*)    = NULL;
 
 	/*synchronize all cpus, as CPU 0 is probably late (it is starting the entire dakota strategy!) : */
@@ -54,4 +55,5 @@
 	femmodel->parameters->FindParam(&verbose,VerboseEnum);
 	femmodel->parameters->FindParam(&responses_descriptors,&dummy,ResponseDescriptorsEnum);
+	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
 
 	/* only cpu 0, running dakota is providing us with variables and variables_descriptors and numresponses: broadcast onto other cpus: */
@@ -59,32 +61,13 @@
 
 	/*Modify core inputs in objects contained in femmodel, to reflect the dakota variables inputs: */
-	InputUpdateFromDakotax(femmodel,variables,variables_descriptors,numvariables);
+	InputUpdateFromDakotax(femmodel->elements,femmodel->nodes,femmodel->vertices,loads,femmodel->materials,femmodel->parameters,variables,variables_descriptors,numvariables);
 
-	/*Run the analysis core solution sequence: */
-	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
+	/*Run the core solution sequence: */
 	if(verbose)_printf_("%s%s%s\n","Starting ",EnumAsString(solution_type)," core:");
-	switch(solution_type){
-		case DiagnosticAnalysisEnum:
-			diagnostic_core(femmodel);
-			break;
-		case ThermalAnalysisEnum:
-			thermal_core(femmodel);
-			break;
-		case PrognosticAnalysisEnum:
-			prognostic_core(femmodel);
-			break;
-		case Transient2DAnalysisEnum:
-			transient2d_core(femmodel);
-			break;
-		case Transient3DAnalysisEnum:
-			transient3d_core(femmodel);
-		default:
-			ISSMERROR("%s%s%s"," solution_type: ",EnumAsString(solution_type),", not supported yet!");
-			break;
-	}
+	SolutionConfiguration(NULL,NULL,&solutioncore); solution_core(femmodel);
 
 	/*compute responses: */
 	if(verbose)_printf_("compute dakota responses:\n");
-	DakotaResponses(responses,responses_descriptors,numresponses,femmodel);
+	DakotaResponsesx(responses,femmodel->elements,femmodel->nodes,femmodel->vertices,loads,femmodel->materials,femmodel->parameters,responses_descriptors,numresponses,);
 
 	/*Free ressources:*/
Index: /issm/trunk/src/c/modules/Qmux/SpawnCoreSerial.cpp
===================================================================
--- /issm/trunk/src/c/modules/Qmux/SpawnCoreSerial.cpp	(revision 4438)
+++ /issm/trunk/src/c/modules/Qmux/SpawnCoreSerial.cpp	(revision 4439)
@@ -31,5 +31,5 @@
 
 	//mexCallMATLAB arrays
-	mxArray* array[7];
+	mxArray* array[5];
 
 	//output from SpawnCore in matlab routine.
Index: /issm/trunk/src/c/solutions/SolutionConfiguration.cpp
===================================================================
--- /issm/trunk/src/c/solutions/SolutionConfiguration.cpp	(revision 4438)
+++ /issm/trunk/src/c/solutions/SolutionConfiguration.cpp	(revision 4439)
@@ -145,7 +145,8 @@
 	
 	/*Assign output pointers:*/
-	*pnumanalyses=numanalyses;
-	*panalyses=analyses;
-	*psolutioncore=solutioncore;
+	if(pnumanalyses) *pnumanalyses=numanalyses;
+	if(panalyses)*panalyses=analyses;
+	else xfree((void**)&analyses);
+	if(psolutioncore)*psolutioncore=solutioncore;
 
 }
Index: sm/trunk/src/m/classes/public/ProcessPatch.m
===================================================================
--- /issm/trunk/src/m/classes/public/ProcessPatch.m	(revision 4438)
+++ 	(revision )
@@ -1,52 +1,0 @@
-function structure=ProcessPatch(structure);
-%PROCESSPATCH - create a structure from a patch
-%
-%   Usage:
-%      Result=ProcessPatch(Result);
-
-%Get out if no Patch
-if (~isfield(structure,'Patch')),
-	return;
-else
-	Patch=structure(1).Patch;
-	numvertices=structure(1).PatchVertices;
-end
-
-%Get number of fields;
-fields=unique(Patch(:,1));
-steps=unique(Patch(:,2));
-
-%parse steps
-for j=1:length(steps),
-
-	posstep=find(Patch(:,2)==steps(j));
-	
-	%Take all the lines of the Patch for this timestep
-	temporarypatch=Patch(posstep,:);
-	time=temporarypatch(1,3);
-	step=temporarypatch(1,2);
-
-	%parse fields
-	for i=1:length(fields),
-
-		%get name
-		fieldname=EnumAsString(fields(i));
-
-		%get line positions
-		pos=find(temporarypatch(:,1)==fields(i));
-
-		%Fill Result structure
-		structure(step).steps=step;
-		structure(step).time=time;
-		structure(step).(fieldname).element=temporarypatch(pos,4);
-		structure(step).(fieldname).interpolation=temporarypatch(pos,5);
-		structure(step).(fieldname).index=temporarypatch(pos,6:5+numvertices);
-		structure(step).(fieldname).value=temporarypatch(pos,6+numvertices:end);
-
-	end
-end
-
-%remove fields
-structure=rmfield(structure,'Patch');
-structure=rmfield(structure,'PatchVertices');
-structure=rmfield(structure,'PatchNodes');
Index: /issm/trunk/src/m/classes/public/parseresultsfromdisk.m
===================================================================
--- /issm/trunk/src/m/classes/public/parseresultsfromdisk.m	(revision 4438)
+++ /issm/trunk/src/m/classes/public/parseresultsfromdisk.m	(revision 4439)
@@ -29,5 +29,5 @@
 
 %process patch if necessary
-results=ProcessPatch(results);
+results=MatlabProcessPatch(results);
 
 fclose(fid);
Index: /issm/trunk/src/m/classes/public/solve.m
===================================================================
--- /issm/trunk/src/m/classes/public/solve.m	(revision 4438)
+++ /issm/trunk/src/m/classes/public/solve.m	(revision 4439)
@@ -53,5 +53,5 @@
 
 %Launch correct solution sequence
-md=issm(md);
+md=issm(md,md.analysis_type);
 
 %post processes qmu results if necessary
Index: sm/trunk/src/m/issm.m
===================================================================
--- /issm/trunk/src/m/issm.m	(revision 4438)
+++ 	(revision )
@@ -1,47 +1,0 @@
-function md=issm(md);
-%ISSM - ISSM main parallel program
-%
-%   Usage:
-%      md=issm(md)
-%
-	%timing
-	t1=clock;
-
-	solution_type=md.analysis_type;
-
-	%out of solution_type, figure out solution core function pointer, and types of analyses needed:
-	[analyses,numanalyses,solutioncore]=SolutionConfiguration(solution_type);
-
-	displaystring(md.verbose,'%s',['create finite element model']);
-	femmodel=NewFemModel(md,solution_type,analyses,numanalyses);
-
-	%retrieve parameters
-	verbose=femmodel.parameters.Verbose;
-	qmu_analysis=femmodel.parameters.QmuAnalysis;
-	control_analysis=femmodel.parameters.ControlAnalysis;
-
-	%compute solution
-	if ~qmu_analysis,
-		if ~control_analysis,
-			
-			displaystring(verbose,'%s',['call computational core']);
-			eval(['femmodel=' solutioncore '(femmodel);']);
-
-		else,
-			
-			displaystring(verbose,'%s',['call computational core']);
-			femmodel=control_core(femmodel);
-
-		end
-		
-		displaystring(verbose,'%s',['write results'])
-		results=OutputResults(femmodel.elements, femmodel.nodes , femmodel.vertices , femmodel.loads , femmodel.materials, femmodel.parameters, femmodel.results);
-		md.results.(EnumAsString(solution_type))=ProcessPatch(results);
-	else
-		%launch dakota driver for diagnostic core solution
-		Qmu(femmodel,femmodel.parameters);
-	end
-
-	%stop timing
-	t2=clock;
-	displaystring(md.verbose,'\n%s\n',['solution converged in ' num2str(etime(t2,t1)) ' seconds']);
Index: /issm/trunk/src/m/solutions/MatlabProcessPatch.m
===================================================================
--- /issm/trunk/src/m/solutions/MatlabProcessPatch.m	(revision 4439)
+++ /issm/trunk/src/m/solutions/MatlabProcessPatch.m	(revision 4439)
@@ -0,0 +1,52 @@
+function structure=MatlabProcessPatch(structure);
+%PROCESSPATCH - create a structure from a patch
+%
+%   Usage:
+%      Result=ProcessPatch(Result);
+
+%Get out if no Patch
+if (~isfield(structure,'Patch')),
+	return;
+else
+	Patch=structure(1).Patch;
+	numvertices=structure(1).PatchVertices;
+end
+
+%Get number of fields;
+fields=unique(Patch(:,1));
+steps=unique(Patch(:,2));
+
+%parse steps
+for j=1:length(steps),
+
+	posstep=find(Patch(:,2)==steps(j));
+	
+	%Take all the lines of the Patch for this timestep
+	temporarypatch=Patch(posstep,:);
+	time=temporarypatch(1,3);
+	step=temporarypatch(1,2);
+
+	%parse fields
+	for i=1:length(fields),
+
+		%get name
+		fieldname=EnumAsString(fields(i));
+
+		%get line positions
+		pos=find(temporarypatch(:,1)==fields(i));
+
+		%Fill Result structure
+		structure(step).steps=step;
+		structure(step).time=time;
+		structure(step).(fieldname).element=temporarypatch(pos,4);
+		structure(step).(fieldname).interpolation=temporarypatch(pos,5);
+		structure(step).(fieldname).index=temporarypatch(pos,6:5+numvertices);
+		structure(step).(fieldname).value=temporarypatch(pos,6+numvertices:end);
+
+	end
+end
+
+%remove fields
+structure=rmfield(structure,'Patch');
+structure=rmfield(structure,'PatchVertices');
+structure=rmfield(structure,'PatchNodes');
Index: /issm/trunk/src/m/solutions/SpawnCore.m
===================================================================
--- /issm/trunk/src/m/solutions/SpawnCore.m	(revision 4438)
+++ /issm/trunk/src/m/solutions/SpawnCore.m	(revision 4439)
@@ -6,52 +6,17 @@
 %
 
-%recover parameters
+%retrieve parameters
 verbose=femmodel.parameters.Verbose;
 responsedescriptors=femmodel.parameters.responsedescriptors; 
-npart=femmodel.parameters.qmu_npart;
-part=femmodel.parameters.qmu_part+1; %C indexing
-numberofnodes=femmodel.parameters.NumberOfNodes;
+solution_type=femmodel.parameters.SolutionType;
 
 displaystring(verbose,'%s%i',['   qmu iteration:'],counter);
 
 %first update the inputs to the femmodel using the variables provided to us by dakota.
-count=1;
-while count<=numel(variables)
-	
-	descriptor=variabledescriptors{count};
-	if ~qmuisdistributed(descriptor),
-		inputs=add(inputs,descriptor,variables(count),'double');
-
-		count=count+1;
-	else
-		root=qmuroot(descriptor);
-		param=femmodel.parameters.(root);
-
-		%next npart values in variables are partition values for this param, collect them.
-		partition=variables(count:count+npart-1);
-
-		%update parameter:
-		param=param.*partition(part);
-
-		%add parameter to inputs
-		inputs=add(inputs,root,param,'doublevec',1,numberofnodes);
-
-		%skip next npart iterations, they all deal with the same parameter descriptor
-		count=count+npart;
-	end
-end
-
+[femmodel.elements femmodel.loads]=InputUpdateFromDakota(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,variables,variabledescriptors);
 
 %now run the core solution
-if analysis_type==DiagnosticAnalysisEnum(),
-
-	results=diagnostic_core(femmodel);
-
-else
-	error(['SpawnCore error message: could not find core solutoin for analysis type: ' analysis_type]);
-end
-
-%process results
-processedresults=processresults(femmodel,results);
+[dummy,dummy,solutioncore]=SolutionConfiguration(solution_type);
+eval(['femmodel=' solutioncore '(femmodel);']);
 
 %now process the results to get response function values
@@ -59,4 +24,4 @@
 for i=1:numel(responsedescriptors),
 	descriptor=responsedescriptors{i};
-	responses(i)=qmuresponse(femmodel,results,processedresults,descriptor);
+	responses(i)=qmuresponse(femmodel,descriptor);
 end
Index: /issm/trunk/src/m/solutions/issm.m
===================================================================
--- /issm/trunk/src/m/solutions/issm.m	(revision 4439)
+++ /issm/trunk/src/m/solutions/issm.m	(revision 4439)
@@ -0,0 +1,44 @@
+function md=issm(md,solution_type);
+%ISSM - ISSM main parallel program
+%
+%   Usage:
+%      md=issm(md)
+%
+	%timing
+	t1=clock;
+
+	%out of solution_type, figure out solution core function pointer, and types of analyses needed:
+	[analyses,numanalyses,solutioncore]=SolutionConfiguration(solution_type);
+
+	displaystring(md.verbose,'%s',['create finite element model']);
+	femmodel=NewFemModel(md,solution_type,analyses,numanalyses);
+
+	%retrieve parameters
+	verbose=femmodel.parameters.Verbose;
+	qmu_analysis=femmodel.parameters.QmuAnalysis;
+	control_analysis=femmodel.parameters.ControlAnalysis;
+
+	%compute solution
+	if ~qmu_analysis,
+		if ~control_analysis,
+			
+			displaystring(verbose,'%s',['call computational core']);
+			eval(['femmodel=' solutioncore '(femmodel);']);
+
+		else,
+			
+			displaystring(verbose,'%s',['call computational core']);
+			femmodel=control_core(femmodel);
+
+		end
+		
+		displaystring(verbose,'%s',['write results'])
+		md.results.(EnumAsString(solution_type))=OutputResults(femmodel.elements, femmodel.nodes , femmodel.vertices , femmodel.loads , femmodel.materials, femmodel.parameters, femmodel.results);
+	else
+		%launch dakota driver for diagnostic core solution
+		Qmu(femmodel,femmodel.parameters);
+	end
+
+	%stop timing
+	t2=clock;
+	displaystring(md.verbose,'\n%s\n',['solution converged in ' num2str(etime(t2,t1)) ' seconds']);
Index: /issm/trunk/src/mex/InputUpdateFromDakota/InputUpdateFromDakota.cpp
===================================================================
--- /issm/trunk/src/mex/InputUpdateFromDakota/InputUpdateFromDakota.cpp	(revision 4439)
+++ /issm/trunk/src/mex/InputUpdateFromDakota/InputUpdateFromDakota.cpp	(revision 4439)
@@ -0,0 +1,77 @@
+/*\file InputUpdateFromDakota.c
+*\brief: update inputs using dakota input variables
+*/
+
+#include "./InputUpdateFromDakota.h"
+
+void mexFunction( int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]){
+
+	/*diverse: */
+	int   noerr=1;
+
+	/*input datasets: */
+	Elements*   elements=NULL;
+	Nodes*      nodes=NULL;
+	Vertices*   vertices=NULL;
+	Loads*      loads=NULL;
+	Materials*  materials=NULL;
+	Parameters* parameters=NULL;
+	double*     variables=NULL;
+	char**      variables_descriptors=NULL;
+	int         numvariables;
+	mxArray*    pfield=NULL;
+
+	/*Boot module: */
+	MODULEBOOT();
+
+	/*checks on arguments on the matlab side: */
+	CheckNumMatlabArguments(nlhs,NLHS,nrhs,NRHS,__FUNCT__,&InputUpdateFromDakotaUsage);
+
+	/*Input datasets: */
+	FetchData((DataSet**)&elements,ELEMENTSIN);
+	FetchData((DataSet**)&nodes,NODESIN);
+	FetchData((DataSet**)&vertices,VERTICESIN);
+	FetchData((DataSet**)&loads,LOADSIN);
+	FetchData((DataSet**)&materials,MATERIALSIN);
+	FetchParams(&parameters,PARAMETERSIN);
+	
+	/*dakota input: */
+	FetchData(&variables,&numvariables,VARIABLESIN);
+
+	variables_descriptors=(char**)xmalloc(numvariables*sizeof(char*));
+	for(i=0;i<numvariables;i++){
+		pfield=mxGetCell(VARIABLESDESCRIPTORS,i);
+		variables_descriptors[i]=mxGetString(pfield);
+	}
+	
+	/*!Generate internal degree of freedom numbers: */
+	InputUpdateFromDakotax(elements,nodes,vertices,loads, materials,parameters,variables,variables_descriptors,numvariables);
+
+	/*write output datasets: */
+	WriteData(ELEMENTS,elements);
+	WriteData(LOADS,loads);
+
+	/*Free ressources: */
+	delete elements;
+	delete nodes;
+	delete vertices;
+	delete loads;
+	delete materials;
+	delete parameters;
+	
+	xfree((void**)&variables);
+	for(i=0;i<numvariables;i++){
+		char* string=variables_descriptors[i]; xfree((void**)&string);
+	}
+	xfree((void**)&variables_descriptors);
+
+	/*end module: */
+	MODULEEND();
+}
+
+void InputUpdateFromDakotaUsage(void)
+{
+	_printf_("\n");
+	_printf_("   usage: [elements loads] = %s(elements,nodes,vertices,loads,materials,parameters,variables,variables_descriptors);\n",__FUNCT__);
+	_printf_("\n");
+}
Index: /issm/trunk/src/mex/InputUpdateFromDakota/InputUpdateFromDakota.h
===================================================================
--- /issm/trunk/src/mex/InputUpdateFromDakota/InputUpdateFromDakota.h	(revision 4439)
+++ /issm/trunk/src/mex/InputUpdateFromDakota/InputUpdateFromDakota.h	(revision 4439)
@@ -0,0 +1,40 @@
+/*
+	InputUpdateFromDakota.h
+*/
+
+#ifndef _UPDATEINPUTSFROMDAKOTA_H
+#define _UPDATEINPUTSFROMDAKOTA_H
+
+/* local prototypes: */
+void InputUpdateFromDakotaUsage(void);
+
+#include "../../c/modules/modules.h"
+#include "../../c/Container/Container.h"
+#include "../../c/shared/shared.h"
+#include "../../c/EnumDefinitions/EnumDefinitions.h"
+
+#undef __FUNCT__ 
+#define __FUNCT__  "InputUpdateFromDakota"
+
+/* serial input macros: */
+#define ELEMENTSIN (mxArray*)prhs[0]
+#define NODESIN (mxArray*)prhs[1]
+#define VERTICESIN (mxArray*)prhs[2]
+#define LOADSIN (mxArray*)prhs[3]
+#define MATERIALSIN (mxArray*)prhs[4]
+#define PARAMETERSIN (mxArray*)prhs[5]
+#define VARIABLES (mxArray*)prhs[6]
+#define VARIABLESDESCRIPTORS (mxArray*)prhs[7]
+
+/* serial output macros: */
+#define ELEMENTS (mxArray**)&plhs[0]
+#define LOADS (mxArray**)&plhs[1]
+
+/* serial arg counts: */
+#undef NLHS
+#define NLHS  2
+#undef NRHS
+#define NRHS  8
+
+#endif  /* _UPDATEINPUTSFROMDAKOTA_H */
+
Index: /issm/trunk/src/mex/Makefile.am
===================================================================
--- /issm/trunk/src/mex/Makefile.am	(revision 4438)
+++ /issm/trunk/src/mex/Makefile.am	(revision 4439)
@@ -66,4 +66,5 @@
 				TriMeshRefine\
 				InputUpdateFromConstant\
+				InputUpdateFromDakota\
 				InputUpdateFromSolution\
 				InputUpdateFromVector\
@@ -278,4 +279,7 @@
 			  InputUpdateFromConstant/InputUpdateFromConstant.h
 
+InputUpdateFromDakota_SOURCES = InputUpdateFromDakota/InputUpdateFromDakota.cpp\
+			  InputUpdateFromDakota/InputUpdateFromDakota.h
+
 InputUpdateFromSolution_SOURCES = InputUpdateFromSolution/InputUpdateFromSolution.cpp\
 			  InputUpdateFromSolution/InputUpdateFromSolution.h
