Index: /issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp	(revision 5476)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp	(revision 5477)
@@ -27,5 +27,4 @@
 	char**  variabledescriptors=NULL;
 	char*   descriptor=NULL;
-	char*   root=NULL;
 	double* dakota_parameter=NULL;
 
@@ -34,10 +33,7 @@
 	char* qmuerrname=NULL;
 	char* qmuoutname=NULL;
-	extern int my_rank;
-	
-	//tags
-	char variabledescriptors_tag[30]; //strlen("variabledescriptor"+number)+1
-	char responsedescriptors_tag[30]; //strlen("responsedescriptors"+number)+1
-	char massflux_tag[35];            //strlen("qmu_mass_flux_segments"+number)+1
+	
+	//descriptors:
+	char tag[50];
 	
 	/*parameters for mass flux: */
@@ -53,9 +49,4 @@
 	int      count;
 
-	/*fetching of parameters: */
-	int    found=0;
-	char** strings=NULL;
-	char*  string=NULL;
-
 	#ifdef _SERIAL_
 		mxArray* pfield=NULL;
@@ -85,6 +76,5 @@
 
 		/*Deal with variable descriptors: {{{1*/
-		variabledescriptors=(char**)xmalloc(iomodel->numberofvariables*sizeof(char*));
-
+		variabledescriptors=(char**)xmalloc(iomodel->numvariabledescriptors*sizeof(char*));
 
 		/*Fetch descriptors: logic varies if we are running parallel or serial. In parallel, qmumarshall 
@@ -94,5 +84,5 @@
 		#ifdef _SERIAL_
 		pfield=mxGetField(iomodel_handle,0,"variabledescriptors");
-		for(i=0;i<iomodel->numberofvariables;i++){
+		for(i=0;i<iomodel->numvariabledescriptors;i++){
 			pfield2=mxGetCell(pfield,i);
 			FetchData(&descriptor,pfield2);
@@ -100,7 +90,7 @@
 		}
 		#else
-		for(i=0;i<iomodel->numberofvariables;i++){
-			sprintf(variabledescriptors_tag,"%s%i","variabledescriptor",i+1);
-			IoModelFetchData(&descriptor,iomodel_handle,variabledescriptors_tag);
+		for(i=0;i<iomodel->numvariabledescriptors;i++){
+			sprintf(tag,"%s%i","variabledescriptor",i+1);
+			IoModelFetchData(&descriptor,iomodel_handle,tag);
 			variabledescriptors[i]=descriptor;
 		}
@@ -108,15 +98,15 @@
 
 		/*Ok, we have all the variable descriptors. Build a parameter with it: */
-		parameters->AddObject(new StringArrayParam(VariableDescriptorsEnum,variabledescriptors,iomodel->numberofvariables));
-
-		/*}}}*/
-
-		/*Deal with responses: {{{1*/
-		responsedescriptors=(char**)xmalloc(iomodel->numberofresponses*sizeof(char*));
+		parameters->AddObject(new StringArrayParam(VariableDescriptorsEnum,variabledescriptors,iomodel->numvariabledescriptors));
+
+		/*}}}*/
+
+		/*Deal with response descriptors: {{{1*/
+		responsedescriptors=(char**)xmalloc(iomodel->numresponsedescriptors*sizeof(char*));
 
 		/*Fetch descriptors: */
 		#ifdef _SERIAL_
 		pfield=mxGetField(iomodel_handle,0,"responsedescriptors");
-		for(i=0;i<iomodel->numberofresponses;i++){
+		for(i=0;i<iomodel->numresponsedescriptors;i++){
 			pfield2=mxGetCell(pfield,i);
 			FetchData(&descriptor,pfield2);
@@ -124,7 +114,7 @@
 		}
 		#else
-		for(i=0;i<iomodel->numberofresponses;i++){
-			sprintf(responsedescriptors_tag,"%s%i","responsedescriptor",i+1);
-			IoModelFetchData(&descriptor,iomodel_handle,responsedescriptors_tag);
+		for(i=0;i<iomodel->numresponsedescriptors;i++){
+			sprintf(tag,"%s%i","responsedescriptor",i+1);
+			IoModelFetchData(&descriptor,iomodel_handle,tag);
 			responsedescriptors[i]=descriptor;
 		}
@@ -132,5 +122,6 @@
 
 		/*Ok, we have all the response descriptors. Build a parameter with it: */
-		parameters->AddObject(new StringArrayParam(ResponseDescriptorsEnum,responsedescriptors,iomodel->numberofresponses));
+		parameters->AddObject(new StringArrayParam(ResponseDescriptorsEnum,responsedescriptors,iomodel->numresponsedescriptors));
+		parameters->AddObject(new    IntParam(QmuNumberOfResponsesEnum,iomodel->numberofresponses));
 		/*}}}*/
 
@@ -152,57 +143,28 @@
 		/*}}}*/
 
-		/*Deal with data needed because of qmu variable inputs: {{{1*/
-		
-		/*First, build a list of strings, used to make sure we don't deal with the same descriptor twice: */
-		if(iomodel->numberofvariables){
-			strings=(char**)xmalloc(iomodel->numberofvariables*sizeof(char*));
-			for(i=0;i<iomodel->numberofvariables;i++)strings[i]=NULL;
-		}
+		/*Deal with data needed because of qmu variables: {{{1*/
+		
+		for(i=0;i<iomodel->numvariabledescriptors;i++){
+
+			if (strncmp(variabledescriptors[i],"scaled_",7)==0){
+				/*Ok, we are dealing with a variable that is distributed over grids. Recover the name of the variable (ex: scaled_Thickness): */
+				sscanf(variabledescriptors[i],"scaled_%s",tag);
+				
+				/*Recover data: */
+				IoModelFetchData(&dakota_parameter,NULL,NULL,iomodel_handle,EnumToModelField(StringToEnum(tag)));
 					
-		/*Now, go through all our needed variables, and fetch the corresponding data: */
-		for(i=0;i<iomodel->numberofvariables;i++){
-
-			/*recover root of descriptor. Descriptors can come in 2 forms: Letters+Number or just letters (ex: Thickness1, RhoIce, Surface3). Strip the number
-			 * from the descriptor (root), so that we key off of this: */
-			descriptor=variabledescriptors[i];
-			if(isdistributed(&root,descriptor)){
-
-				//now, check that this root was not already processed, ie we did not already fetch the corresponding data! 
-				found=0;
-				for(j=0;j<iomodel->numberofvariables;j++){
-					if (strings[j]) if (strcmp(strings[j],root)==0)found=1;
-				}
-
-				/*If we did not, fetch data and add it to the parameters: */
-				if(!found){
-
-					/*Recover: */
-					IoModelFetchData(&dakota_parameter,NULL,NULL,iomodel_handle,EnumToModelField(StringToEnum(root)));
-					
-					/*Add to parameters: */
-					parameters->AddObject(new DoubleVecParam(StringToEnum(root),dakota_parameter,iomodel->numberofvertices));
+				/*Add to parameters: */
+				parameters->AddObject(new DoubleVecParam(StringToEnum(tag),dakota_parameter,iomodel->numberofvertices));
 				
-					/*Free ressources:*/
-					xfree((void**)&dakota_parameter);
-
-					/*Ensure we won't process this variable anymore: */
-					string=(char*)xmalloc((strlen(root)+1)*sizeof(char)); strcpy(string,root); strings[i]=string;
-				}
-			}
-			xfree((void**)&root);
-		}
-		/*Free strings: not needed anymore */
-		for(i=0;i<iomodel->numberofvariables;i++){
-			string=strings[i];
-			xfree((void**)&string);
-		}
-		xfree((void**)&strings);
+				/*Free ressources:*/
+				xfree((void**)&dakota_parameter);
+			}
+		}
 		/*}}}*/
 
 		/*Deal with data needed to compute qmu responses: {{{1*/
-		for(i=0;i<iomodel->numberofresponses;i++){
-			char* descriptor=responsedescriptors[i];
+		for(i=0;i<iomodel->numresponsedescriptors;i++){
 			
-			if(strncmp(descriptor,"MassFlux",8)==0){
+			if(strncmp(responsedescriptors[i],"indexed_MassFlux",16)==0){
 				qmu_mass_flux_present=true;
 			}
@@ -231,6 +193,6 @@
 			#else
 			for(i=0;i<M;i++){
-				sprintf(massflux_tag,"%s%i","qmu_mass_flux_segments",i+1); //names were created using Matlab indexing convention
-				IoModelFetchData(&temp_matrix,&temp_m,&temp_n,iomodel_handle,massflux_tag);
+				sprintf(tag,"%s%i","qmu_mass_flux_segments",i+1); //names were created using Matlab indexing convention
+				IoModelFetchData(&temp_matrix,&temp_m,&temp_n,iomodel_handle,tag);
 
 				/*This temp_matrix represents all the segments, for all elements. On this cpu, we only have a subset of these 
@@ -279,12 +241,12 @@
 
 		/*Free data: {{{1*/
-		for(i=0;i<iomodel->numberofresponses;i++){
-			char* descriptor=responsedescriptors[i];
+		for(i=0;i<iomodel->numresponsedescriptors;i++){
+			descriptor=responsedescriptors[i];
 			xfree((void**)&descriptor);
 		}
 		xfree((void**)&responsedescriptors);
 
-		for(i=0;i<iomodel->numberofvariables;i++){
-			char* descriptor=variabledescriptors[i];
+		for(i=0;i<iomodel->numvariabledescriptors;i++){
+			descriptor=variabledescriptors[i];
 			xfree((void**)&descriptor);
 		}
