Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 24997)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 24998)
@@ -4491,5 +4491,4 @@
 	char   root[50];
 	int    index;
-	int    npart;
 	double femmodel_response;
 	int    flag;
@@ -4498,6 +4497,15 @@
 	double *responses_pointer = NULL;
 
-	/*retrieve npart: */
-	parameters->FindParam(&npart,QmuNumberofpartitionsEnum);
+	IssmDouble **response_partitions         = NULL;
+	IssmDouble * response_partition         = NULL;
+	int * response_partitions_npart         = NULL;
+	int          response_partitions_num;
+	int          npart;
+
+	/*retrieve partition vectors for responses that are scaled:*/
+	this->parameters->FindParam(&response_partitions,&response_partitions_num,NULL,NULL,QmuResponsePartitionsEnum); 
+	this->parameters->FindParam(&response_partitions_npart,NULL,NULL,QmuResponsePartitionsNpartEnum); 
+	
+	/*retrieve my_rank: */
 	my_rank=IssmComm::GetRank();
 
@@ -4517,6 +4525,10 @@
 			GetVectorFromInputsx(&vertex_response,this, StringToEnumx(root),VertexPIdEnum);
 
+			/*recover partition vector: */
+			response_partition=response_partitions[i];
+			npart=response_partitions_npart[i];
+
 			/*Now, average it onto the partition nodes: */
-			AverageOntoPartitionx(&qmu_response,elements,nodes,vertices,loads,materials,parameters,vertex_response);
+			AverageOntoPartitionx(&qmu_response,elements,nodes,vertices,loads,materials,parameters,vertex_response,response_partition,npart);
 
 			/*Copy onto our dakota responses: */
@@ -4579,4 +4591,11 @@
 	}
 	/*}}}*/
+
+	/*Free ressources:*/
+	for(i=0;i<response_partitions_num;i++){
+		IssmDouble* matrix=response_partitions[i];
+		xDelete<IssmDouble>(matrix);
+	}
+	xDelete<IssmDouble*>(response_partitions);
 
 }
Index: /issm/trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp	(revision 24997)
+++ /issm/trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp	(revision 24998)
@@ -14,8 +14,5 @@
 #include "../../toolkits/toolkits.h"
 
-void AverageOntoPartitionx(double** paverage, Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,double* vertex_response){
-
-	int     npart;
-	double *qmu_vpart  = NULL;
+void AverageOntoPartitionx(double** paverage, Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,double* vertex_response,double* qmu_part,int npart){
 
 	/*output: */
@@ -24,10 +21,4 @@
 	Vector<IssmDouble>* vec_average=NULL;
 	double* average=NULL;
-
-	/*First, recover qmu partition of vertices: */
-	parameters->FindParam(&qmu_vpart,NULL,QmuVpartitionEnum);
-
-	/*Some parameters: */
-	parameters->FindParam(&npart,QmuNumberofpartitionsEnum);
 
 	/*average onto the separate areas. The result will be a npart sized vector. */
@@ -41,5 +32,5 @@
 	for(int i=0;i<elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-		element->AverageOntoPartition(partition_contributions,partition_areas,vertex_response,qmu_vpart);
+		element->AverageOntoPartition(partition_contributions,partition_areas,vertex_response,qmu_part);
 	}
 
@@ -55,5 +46,4 @@
 
 	/*Free ressources:*/
-	xDelete<double>(qmu_vpart);
 	delete partition_contributions;
 	delete partition_areas;
Index: /issm/trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.h	(revision 24997)
+++ /issm/trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.h	(revision 24998)
@@ -8,5 +8,5 @@
 #include "../../classes/classes.h"
 
-void AverageOntoPartitionx(double** average, Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,double* vertex_response);
+void AverageOntoPartitionx(double** paverage, Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,double* vertex_response,double* qmu_part,int npart);
 
 #endif  /* _AVERAGEONTOPARTITIONXX_H */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp	(revision 24997)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp	(revision 24998)
@@ -73,7 +73,4 @@
 		parameters->AddObject(new StringArrayParam(QmuResponsedescriptorsEnum,responsedescriptors,numresponsedescriptors));
 
-		/*Load partitioning vectors (both vertex and element based: */
-		parameters->AddObject(iomodel->CopyConstantObject("md.qmu.numberofpartitions",QmuNumberofpartitionsEnum));
-		
 		/*Load partitioning vectors specific to variables:*/
 		iomodel->FetchData(&array,&mdims_array,&ndims_array,&num_partitions,"md.qmu.variablepartitions");
@@ -81,4 +78,33 @@
 		iomodel->FetchData(&intarray,&M,&N,"md.qmu.variablepartitions_npart");
 		parameters->AddObject(new IntMatParam(QmuVariablePartitionsNpartEnum,intarray,M,N));
+
+		/*free arrays: {{{*/
+		for(i=0;i<num_partitions;i++){
+			IssmDouble* matrix=array[i];
+			xDelete<IssmDouble>(matrix);
+		}
+		xDelete<int>(mdims_array); 
+		xDelete<int>(ndims_array);
+		xDelete<IssmDouble*>(array);
+		xDelete<int>(intarray);
+		/*}}}*/
+
+		/*Load partitioning vectors specific to responses:*/
+		iomodel->FetchData(&array,&mdims_array,&ndims_array,&num_partitions,"md.qmu.responsepartitions");
+		parameters->AddObject(new DoubleMatArrayParam(QmuResponsePartitionsEnum,array,num_partitions,mdims_array,ndims_array));
+		iomodel->FetchData(&intarray,&M,&N,"md.qmu.responsepartitions_npart");
+		parameters->AddObject(new IntMatParam(QmuResponsePartitionsNpartEnum,intarray,M,N));
+
+		/*free arrays: {{{*/
+		for(i=0;i<num_partitions;i++){
+			IssmDouble* matrix=array[i];
+			xDelete<IssmDouble>(matrix);
+		}
+		xDelete<int>(mdims_array); 
+		xDelete<int>(ndims_array);
+		xDelete<IssmDouble*>(array);
+		xDelete<int>(intarray);
+		/*}}}*/
+
 
 		/*Deal with data needed because of qmu variables*/
@@ -124,13 +150,6 @@
 		xDelete<char>(qmuoutname);
 
-		for(i=0;i<num_partitions;i++){
-			IssmDouble* matrix=array[i];
-			xDelete<IssmDouble>(matrix);
-		}
-		xDelete<int>(mdims_array); 
-		xDelete<int>(ndims_array);
-		xDelete<IssmDouble*>(array);
-		xDelete<int>(intarray);
-
+		
+		
 	}
 
Index: /issm/trunk-jpl/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 24997)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 24998)
@@ -290,14 +290,13 @@
 syn keyword cConstant QmuInNameEnum
 syn keyword cConstant QmuIsdakotaEnum
-syn keyword cConstant QmuNumberofpartitionsEnum
 syn keyword cConstant QmuOutNameEnum
 syn keyword cConstant QmuOutputEnum
 syn keyword cConstant QmuCurrEvalIdEnum
-syn keyword cConstant QmuEpartitionEnum
-syn keyword cConstant QmuVpartitionEnum
 syn keyword cConstant QmuResponsedescriptorsEnum
 syn keyword cConstant QmuVariableDescriptorsEnum
 syn keyword cConstant QmuVariablePartitionsEnum
 syn keyword cConstant QmuVariablePartitionsNpartEnum
+syn keyword cConstant QmuResponsePartitionsEnum
+syn keyword cConstant QmuResponsePartitionsNpartEnum
 syn keyword cConstant RestartFileNameEnum
 syn keyword cConstant ResultsEnum
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 24997)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 24998)
@@ -284,14 +284,13 @@
 	QmuInNameEnum,
 	QmuIsdakotaEnum,
-	QmuNumberofpartitionsEnum,
 	QmuOutNameEnum,
 	QmuOutputEnum,
 	QmuCurrEvalIdEnum,
-	QmuEpartitionEnum,
-	QmuVpartitionEnum,
 	QmuResponsedescriptorsEnum,
 	QmuVariableDescriptorsEnum,
 	QmuVariablePartitionsEnum,
 	QmuVariablePartitionsNpartEnum,
+	QmuResponsePartitionsEnum,
+	QmuResponsePartitionsNpartEnum,
 	RestartFileNameEnum,
 	ResultsEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 24997)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 24998)
@@ -292,14 +292,13 @@
 		case QmuInNameEnum : return "QmuInName";
 		case QmuIsdakotaEnum : return "QmuIsdakota";
-		case QmuNumberofpartitionsEnum : return "QmuNumberofpartitions";
 		case QmuOutNameEnum : return "QmuOutName";
 		case QmuOutputEnum : return "QmuOutput";
 		case QmuCurrEvalIdEnum : return "QmuCurrEvalId";
-		case QmuEpartitionEnum : return "QmuEpartition";
-		case QmuVpartitionEnum : return "QmuVpartition";
 		case QmuResponsedescriptorsEnum : return "QmuResponsedescriptors";
 		case QmuVariableDescriptorsEnum : return "QmuVariableDescriptors";
 		case QmuVariablePartitionsEnum : return "QmuVariablePartitions";
 		case QmuVariablePartitionsNpartEnum : return "QmuVariablePartitionsNpart";
+		case QmuResponsePartitionsEnum : return "QmuResponsePartitions";
+		case QmuResponsePartitionsNpartEnum : return "QmuResponsePartitionsNpart";
 		case RestartFileNameEnum : return "RestartFileName";
 		case ResultsEnum : return "Results";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 24997)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 24998)
@@ -298,14 +298,13 @@
 	      else if (strcmp(name,"QmuInName")==0) return QmuInNameEnum;
 	      else if (strcmp(name,"QmuIsdakota")==0) return QmuIsdakotaEnum;
-	      else if (strcmp(name,"QmuNumberofpartitions")==0) return QmuNumberofpartitionsEnum;
 	      else if (strcmp(name,"QmuOutName")==0) return QmuOutNameEnum;
 	      else if (strcmp(name,"QmuOutput")==0) return QmuOutputEnum;
 	      else if (strcmp(name,"QmuCurrEvalId")==0) return QmuCurrEvalIdEnum;
-	      else if (strcmp(name,"QmuEpartition")==0) return QmuEpartitionEnum;
-	      else if (strcmp(name,"QmuVpartition")==0) return QmuVpartitionEnum;
 	      else if (strcmp(name,"QmuResponsedescriptors")==0) return QmuResponsedescriptorsEnum;
 	      else if (strcmp(name,"QmuVariableDescriptors")==0) return QmuVariableDescriptorsEnum;
 	      else if (strcmp(name,"QmuVariablePartitions")==0) return QmuVariablePartitionsEnum;
 	      else if (strcmp(name,"QmuVariablePartitionsNpart")==0) return QmuVariablePartitionsNpartEnum;
+	      else if (strcmp(name,"QmuResponsePartitions")==0) return QmuResponsePartitionsEnum;
+	      else if (strcmp(name,"QmuResponsePartitionsNpart")==0) return QmuResponsePartitionsNpartEnum;
 	      else if (strcmp(name,"RestartFileName")==0) return RestartFileNameEnum;
 	      else if (strcmp(name,"Results")==0) return ResultsEnum;
@@ -383,9 +382,9 @@
 	      else if (strcmp(name,"SmbIsthermal")==0) return SmbIsthermalEnum;
 	      else if (strcmp(name,"SmbIsturbulentflux")==0) return SmbIsturbulentfluxEnum;
+	      else if (strcmp(name,"SmbK")==0) return SmbKEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"SmbK")==0) return SmbKEnum;
-	      else if (strcmp(name,"SmbNumRequestedOutputs")==0) return SmbNumRequestedOutputsEnum;
+	      if (strcmp(name,"SmbNumRequestedOutputs")==0) return SmbNumRequestedOutputsEnum;
 	      else if (strcmp(name,"SmbPfac")==0) return SmbPfacEnum;
 	      else if (strcmp(name,"SmbRdl")==0) return SmbRdlEnum;
@@ -506,9 +505,9 @@
 	      else if (strcmp(name,"BaseSlopeY")==0) return BaseSlopeYEnum;
 	      else if (strcmp(name,"Bed")==0) return BedEnum;
+	      else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
-	      else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
+	      if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
 	      else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
 	      else if (strcmp(name,"CalvingHabFraction")==0) return CalvingHabFractionEnum;
@@ -629,9 +628,9 @@
 	      else if (strcmp(name,"HydrologyWatercolumnMax")==0) return HydrologyWatercolumnMaxEnum;
 	      else if (strcmp(name,"HydrologyWaterVx")==0) return HydrologyWaterVxEnum;
+	      else if (strcmp(name,"HydrologyWaterVy")==0) return HydrologyWaterVyEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"HydrologyWaterVy")==0) return HydrologyWaterVyEnum;
-	      else if (strcmp(name,"Ice")==0) return IceEnum;
+	      if (strcmp(name,"Ice")==0) return IceEnum;
 	      else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
 	      else if (strcmp(name,"Input")==0) return InputEnum;
@@ -752,9 +751,9 @@
 	      else if (strcmp(name,"SmbFAC")==0) return SmbFACEnum;
 	      else if (strcmp(name,"SmbGdn")==0) return SmbGdnEnum;
+	      else if (strcmp(name,"SmbGdnini")==0) return SmbGdniniEnum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"SmbGdnini")==0) return SmbGdniniEnum;
-	      else if (strcmp(name,"SmbGsp")==0) return SmbGspEnum;
+	      if (strcmp(name,"SmbGsp")==0) return SmbGspEnum;
 	      else if (strcmp(name,"SmbGspini")==0) return SmbGspiniEnum;
 	      else if (strcmp(name,"SmbHref")==0) return SmbHrefEnum;
@@ -875,9 +874,9 @@
 	      else if (strcmp(name,"WaterfractionDrainage")==0) return WaterfractionDrainageEnum;
 	      else if (strcmp(name,"WaterfractionDrainageIntegrated")==0) return WaterfractionDrainageIntegratedEnum;
+	      else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
-	      else if (strcmp(name,"Waterheight")==0) return WaterheightEnum;
+	      if (strcmp(name,"Waterheight")==0) return WaterheightEnum;
 	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
 	      else if (strcmp(name,"Outputdefinition1")==0) return Outputdefinition1Enum;
@@ -998,9 +997,9 @@
 	      else if (strcmp(name,"BalancethicknessApparentMassbalance")==0) return BalancethicknessApparentMassbalanceEnum;
 	      else if (strcmp(name,"BalancethicknessSoftAnalysis")==0) return BalancethicknessSoftAnalysisEnum;
+	      else if (strcmp(name,"BalancethicknessSoftSolution")==0) return BalancethicknessSoftSolutionEnum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"BalancethicknessSoftSolution")==0) return BalancethicknessSoftSolutionEnum;
-	      else if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum;
+	      if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum;
 	      else if (strcmp(name,"BalancethicknessSpcthickness")==0) return BalancethicknessSpcthicknessEnum;
 	      else if (strcmp(name,"BalancevelocityAnalysis")==0) return BalancevelocityAnalysisEnum;
@@ -1121,9 +1120,9 @@
 	      else if (strcmp(name,"HydrologyPismAnalysis")==0) return HydrologyPismAnalysisEnum;
 	      else if (strcmp(name,"HydrologyShaktiAnalysis")==0) return HydrologyShaktiAnalysisEnum;
+	      else if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
          else stage=10;
    }
    if(stage==10){
-	      if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
-	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
+	      if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
 	      else if (strcmp(name,"Hydrologydc")==0) return HydrologydcEnum;
 	      else if (strcmp(name,"Hydrologypism")==0) return HydrologypismEnum;
@@ -1244,9 +1243,9 @@
 	      else if (strcmp(name,"P1xP4")==0) return P1xP4Enum;
 	      else if (strcmp(name,"P2")==0) return P2Enum;
+	      else if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
          else stage=11;
    }
    if(stage==11){
-	      if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
-	      else if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
+	      if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
 	      else if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
 	      else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
@@ -1367,9 +1366,9 @@
 	      else if (strcmp(name,"SealevelWeights")==0) return SealevelWeightsEnum;
 	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
+	      else if (strcmp(name,"StressTensor")==0) return StressTensorEnum;
          else stage=12;
    }
    if(stage==12){
-	      if (strcmp(name,"StressTensor")==0) return StressTensorEnum;
-	      else if (strcmp(name,"StressbalanceViscosityOvershoot")==0) return StressbalanceViscosityOvershootEnum;
+	      if (strcmp(name,"StressbalanceViscosityOvershoot")==0) return StressbalanceViscosityOvershootEnum;
 	      else if (strcmp(name,"SubelementMigration4")==0) return SubelementMigration4Enum;
 	      else if (strcmp(name,"TimesteppingTimeAdapt")==0) return TimesteppingTimeAdaptEnum;
Index: /issm/trunk-jpl/src/m/classes/qmu.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/qmu.m	(revision 24997)
+++ /issm/trunk-jpl/src/m/classes/qmu.m	(revision 24998)
@@ -15,5 +15,4 @@
 		vpartition                   = NaN;
 		epartition                   = NaN;
-		numberofpartitions          = 0;
 		numberofresponses           = 0;
 		variabledescriptors         = {};
@@ -21,4 +20,6 @@
 		variablepartitions_npart    = [];
 		responsedescriptors         = {};
+		responsepartitions          = {};
+		responsepartitions_npart    = [];
 		mass_flux_profile_directory = NaN;
 		mass_flux_profiles          = NaN;
@@ -194,5 +195,4 @@
 			WriteData(fid,prefix,'object',self,'fieldname','vpartition','format','DoubleMat','mattype',2);
 			WriteData(fid,prefix,'object',self,'fieldname','epartition','format','DoubleMat','mattype',2);
-			WriteData(fid,prefix,'object',self,'fieldname','numberofpartitions','format','Integer');
 			WriteData(fid,prefix,'object',self,'fieldname','numberofresponses','format','Integer');
 			WriteData(fid,prefix,'object',self,'fieldname','variabledescriptors','format','StringArray');
@@ -200,4 +200,6 @@
 			WriteData(fid,prefix,'object',self,'fieldname','variablepartitions_npart','format','IntMat','mattype',3);
 			WriteData(fid,prefix,'object',self,'fieldname','responsedescriptors','format','StringArray');
+			WriteData(fid,prefix,'object',self,'fieldname','responsepartitions','format','MatArray');
+			WriteData(fid,prefix,'object',self,'fieldname','responsepartitions_npart','format','IntMat','mattype',3);
 			if ~isempty(self.mass_flux_segments),
 				WriteData(fid,prefix,'data',self.mass_flux_segments,'name','md.qmu.mass_flux_segments','format','MatArray');
Index: /issm/trunk-jpl/src/m/classes/qmu/response_function.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/qmu/response_function.m	(revision 24997)
+++ /issm/trunk-jpl/src/m/classes/qmu/response_function.m	(revision 24998)
@@ -53,6 +53,6 @@
                 disp(sprintf('          rell: %s'      ,string_vec(rf(i).rell)));
                 disp(sprintf('         grell: %s'    ,string_vec(rf(i).grell)));
-                if ~isempty(self.partition),
-                    disp(sprintf('     partition: %s'    ,string_vec(rf(i).partition)));
+                if ~isempty(rf.partition),
+					fielddisplay(rf,'partition','partition vector defining where response will be computed');
                 end
                 disp(sprintf('\n'));
Index: /issm/trunk-jpl/src/m/partition/partitioner.m
===================================================================
--- /issm/trunk-jpl/src/m/partition/partitioner.m	(revision 24997)
+++ /issm/trunk-jpl/src/m/partition/partitioner.m	(revision 24998)
@@ -1,3 +1,3 @@
-function md=partitioner(md,varargin)
+function partitionvector=partitioner(md,varargin)
 %PARTITIONER - partition mesh 
 %
@@ -10,8 +10,8 @@
 %   recomputeadjacency:  'on' by default (set to 'off' to compute existing one)
 %   type: 'node' or 'element' partition vector (default to 'node') 
-%   Output: md.qmu.partition recover the partition vector
+%   Output: partitionvector: the partition vector
 %   
 %   Usage:
-%      md=partitioner(md,'package','chaco','npart',100,'weighting','on');
+%      partitionvector=partitioner(md,'package','chaco','npart',100,'weighting','on');
 %
 
@@ -140,13 +140,4 @@
 end
 
-if strcmpi(vectortype,'element')
-	md.qmu.epartition=part;
-	if isempty(md.qmu.vpartition) | (prod(size(md.qmu.vpartition))==1 & isnan(md.qmu.vpartition))
-		md.qmu.vpartition=zeros(md.mesh.numberofvertices,1);
-	end
-else
-	md.qmu.vpartition=part;
-	if isempty(md.qmu.epartition) | (prod(size(md.qmu.epartition))==1 & isnan(md.qmu.epartition))
-		md.qmu.epartition=zeros(md.mesh.numberofelements,1);
-	end
-end
+%output 
+partitionvector=part;
Index: /issm/trunk-jpl/src/m/qmu/preqmu.m
===================================================================
--- /issm/trunk-jpl/src/m/qmu/preqmu.m	(revision 24997)
+++ /issm/trunk-jpl/src/m/qmu/preqmu.m	(revision 24998)
@@ -103,4 +103,20 @@
 end
 
+%build a MatArray of response partitions: 
+response_fieldnames=fieldnames(md.qmu.responses(ivar));
+responsepartitions={};
+responsepartitions_npart=[];
+for i=1:length(response_fieldnames),
+	field_name=response_fieldnames{i};
+	fieldresponse=md.qmu.responses(ivar).(field_name);
+	if fieldresponse.isscaled();
+		responsepartitions{end+1}=fieldresponse.partition;
+		responsepartitions_npart(end+1)=qmupart2npart(fieldresponse.partition);
+	else
+		responsepartitions{end+1}=[];
+		responsepartitions_npart(end+1)=0;
+	end
+end
+
 
 %register the fields that will be needed by the Qmu model.
@@ -110,4 +126,6 @@
 md.qmu.variablepartitions_npart=variablepartitions_npart;
 md.qmu.responsedescriptors=responsedescriptors;
+md.qmu.responsepartitions=responsepartitions;
+md.qmu.responsepartitions_npart=responsepartitions_npart;
 
 %now, we have to provide all the info necessary for the solutions to compute the responses. For ex, if mass_flux 
Index: /issm/trunk-jpl/src/m/qmu/setupdesign/QmuSetupResponses.m
===================================================================
--- /issm/trunk-jpl/src/m/qmu/setupdesign/QmuSetupResponses.m	(revision 24997)
+++ /issm/trunk-jpl/src/m/qmu/setupdesign/QmuSetupResponses.m	(revision 24998)
@@ -13,6 +13,7 @@
 	%ok, dealing with semi-discrete distributed response. Distribute according to how many 
 	%partitions we want
+	npart=qmupart2npart(responses.partition);
 
-	for j=1:md.qmu.numberofpartitions
+	for j=1:npart,
 		dresp(end+1)           =responses;
 		dresp(end  ).descriptor=sprintf('%s_%d',responses.descriptor,j);
