Index: /issm/trunk/src/c/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 208)
+++ /issm/trunk/src/c/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 209)
@@ -25,7 +25,7 @@
 	double* optscal=NULL;
 	double* maxiter=NULL; 
-	Vec     control_parameter=NULL;
-	Vec     vx_obs=NULL;
-	Vec     vy_obs=NULL;
+	double* control_parameter=NULL;
+	double* vx_obs=NULL;
+	double* vy_obs=NULL;
 
 	/*Get counter : */
@@ -100,29 +100,33 @@
 
 	/*Get vx_obs, vy_obs, and the parameter value: */
-	ModelFetchData((void**)&vx_obs,NULL,NULL,model_handle,"vx_obs","Vector",NULL);
-	ModelFetchData((void**)&vy_obs,NULL,NULL,model_handle,"vy_obs","Vector",NULL);
-	ModelFetchData((void**)&control_parameter,NULL,NULL,model_handle,model->control_type,"Vector",NULL);
+	ModelFetchData((void**)&vx_obs,NULL,NULL,model_handle,"vx_obs","Matrix","Mat");
+	ModelFetchData((void**)&vy_obs,NULL,NULL,model_handle,"vy_obs","Matrix","Mat");
+	ModelFetchData((void**)&control_parameter,NULL,NULL,model_handle,model->control_type,"Matrix","Mat");
 
-	VecScale(vx_obs,1.0/model->yts);
-	VecScale(vy_obs,1.0/model->yts);
+	if(vx_obs)for(i=0;i<model->numberofnodes;i++)vx_obs[i]=vx_obs[i]/model->yts;
+	if(vy_obs)for(i=0;i<model->numberofnodes;i++)vy_obs[i]=vy_obs[i]/model->yts;
 
 	count++;
-	param= new Param(count,"vx_obs",PETSCVEC);
-	param->SetVec(vx_obs);
+	param= new Param(count,"vx_obs",DOUBLEVEC);
+	if(vx_obs) param->SetDoubleVec(vx_obs,model->numberofnodes);
+	else param->SetDoubleVec(vx_obs,0);
 	parameters->AddObject(param);
 
 	count++;
-	param= new Param(count,"vy_obs",PETSCVEC);
-	param->SetVec(vy_obs);
+	param= new Param(count,"vy_obs",DOUBLEVEC);
+	if(vy_obs) param->SetDoubleVec(vy_obs,model->numberofnodes);
+	else param->SetDoubleVec(vy_obs,0);
 	parameters->AddObject(param);
 
 	count++;
-	param= new Param(count,"control_parameter",PETSCVEC);
-	param->SetVec(control_parameter);
+	param= new Param(count,"control_parameter",DOUBLEVEC);
+	if(control_parameter) param->SetDoubleVec(control_parameter,model->numberofnodes);
+	else param->SetDoubleVec(control_parameter,0);
 	parameters->AddObject(param);
-	
-	VecFree(&vx_obs);
-	VecFree(&vy_obs);
-	VecFree(&control_parameter);
+
+
+	xfree((void**)&vx_obs);
+	xfree((void**)&vy_obs);
+	xfree((void**)&control_parameter);
 
 
Index: /issm/trunk/src/c/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/CreateParameters.cpp	(revision 208)
+++ /issm/trunk/src/c/ModelProcessorx/CreateParameters.cpp	(revision 209)
@@ -27,7 +27,7 @@
 	double* maxiter=NULL; 
 	double* control_parameter=NULL;
-	Vec     vx=NULL;
-	Vec     vy=NULL;
-	Vec     vz=NULL;
+	double* vx=NULL;
+	double* vy=NULL;
+	double* vz=NULL;
 	
 	/*Initialize dataset: */
@@ -177,30 +177,33 @@
 	/*Diagnostic: */
 	/*Get vx and vy: */
-	ModelFetchData((void**)&vx,NULL,NULL,model_handle,"vx","Vector",NULL);
-	ModelFetchData((void**)&vy,NULL,NULL,model_handle,"vy","Vector",NULL);
-	ModelFetchData((void**)&vz,NULL,NULL,model_handle,"vz","Vector",NULL);
-
-	if(vx)VecScale(vx,1.0/model->yts);
-	if(vy)VecScale(vy,1.0/model->yts);
-	if(vz)VecScale(vz,1.0/model->yts);
-
-	count++;
-	param= new Param(count,"vx",PETSCVEC);
-	param->SetVec(vx);
-	parameters->AddObject(param);
-
-	count++;
-	param= new Param(count,"vy",PETSCVEC);
-	param->SetVec(vy);
-	parameters->AddObject(param);
-
-	count++;
-	param= new Param(count,"vz",PETSCVEC);
-	param->SetVec(vz);
-	parameters->AddObject(param);
-
-	VecFree(&vx);
-	VecFree(&vy);
-	VecFree(&vz);
+	ModelFetchData((void**)&vx,NULL,NULL,model_handle,"vx","Matrix","Mat");
+	ModelFetchData((void**)&vy,NULL,NULL,model_handle,"vy","Matrix","Mat");
+	ModelFetchData((void**)&vz,NULL,NULL,model_handle,"vz","Matrix","Mat");
+
+	if(vx) for(i=0;i<model->numberofnodes;i++)vx[i]=vx[i]/model->yts;
+	if(vy) for(i=0;i<model->numberofnodes;i++)vy[i]=vy[i]/model->yts;
+	if(vz) for(i=0;i<model->numberofnodes;i++)vz[i]=vz[i]/model->yts;
+
+	count++;
+	param= new Param(count,"vx",DOUBLEVEC);
+	if(vx) param->SetDoubleVec(vx,model->numberofnodes);
+	else param->SetDoubleVec(vx,0);
+	parameters->AddObject(param);
+
+	count++;
+	param= new Param(count,"vy",DOUBLEVEC);
+	if(vy) param->SetDoubleVec(vy,model->numberofnodes);
+	else param->SetDoubleVec(vy,0);
+	parameters->AddObject(param);
+
+	count++;
+	param= new Param(count,"vz",DOUBLEVEC);
+	if(vz) param->SetDoubleVec(vz,model->numberofnodes);
+	else param->SetDoubleVec(vz,0);
+	parameters->AddObject(param);
+
+	xfree((void**)&vx);
+	xfree((void**)&vy);
+	xfree((void**)&vz);
 
 	/*All our datasets are already ordered by ids. Set presort flag so that later on, when sorting is requested on these 
Index: /issm/trunk/src/c/ProcessParamsx/ProcessParamsx.cpp
===================================================================
--- /issm/trunk/src/c/ProcessParamsx/ProcessParamsx.cpp	(revision 208)
+++ /issm/trunk/src/c/ProcessParamsx/ProcessParamsx.cpp	(revision 209)
@@ -21,8 +21,4 @@
 
 	/*diagnostic: */
-	Vec     vec_vx=NULL;
-	Vec     vec_vy=NULL;
-	Vec     vec_vz=NULL;
-
 	double* vx=NULL;
 	double* vy=NULL;
@@ -64,12 +60,8 @@
 	   ){
 
-		parameters->FindParam((void*)&vec_vx,"vx");
-		parameters->FindParam((void*)&vec_vy,"vy");
-		parameters->FindParam((void*)&vec_vz,"vz");
+		parameters->FindParam((void*)&vx,"vx");
+		parameters->FindParam((void*)&vy,"vy");
+		parameters->FindParam((void*)&vz,"vz");
 
-		if(vec_vx)VecToMPISerial(&vx,vec_vx);
-		if(vec_vy)VecToMPISerial(&vy,vec_vy);
-		if(vec_vz)VecToMPISerial(&vz,vec_vz);
-			
 		u_g=(double*)xcalloc(numberofnodes*3,sizeof(double));
 
@@ -114,12 +106,9 @@
 	if(analysis_type==ControlAnalysisEnum()){
 
-		parameters->FindParam((void*)&vec_vx_obs,"vx_obs");
-		parameters->FindParam((void*)&vec_vy_obs,"vy_obs");
-		parameters->FindParam((void*)&vec_control_parameter,"control_parameter");
+		parameters->FindParam((void*)&vx_obs,"vx_obs");
+		parameters->FindParam((void*)&vy_obs,"vy_obs");
+		parameters->FindParam((void*)&control_parameter,"control_parameter");
 
 		/*Now, from vx_obs and vy_obs, build u_g_obs, correctly partitioned: */
-		VecToMPISerial(&vx_obs,vec_vx_obs);
-		VecToMPISerial(&vy_obs,vec_vy_obs);
-		VecToMPISerial(&control_parameter,vec_control_parameter);
 
 		u_g_obs=(double*)xcalloc(numberofnodes*2,sizeof(double));
@@ -160,14 +149,8 @@
 	xfree((void**)&vy);
 	xfree((void**)&vz);
-	VecFree(&vec_vx);
-	VecFree(&vec_vy);
-	VecFree(&vec_vz);
 	xfree((void**)&u_g);
 
 	xfree((void**)&vx_obs);
 	xfree((void**)&vy_obs);
-	VecFree(&vec_vx_obs);
-	VecFree(&vec_vy_obs);
-	VecFree(&vec_control_parameter);
 	xfree((void**)&control_parameter);
 	xfree((void**)&u_g_obs);
Index: /issm/trunk/src/c/objects/Param.cpp
===================================================================
--- /issm/trunk/src/c/objects/Param.cpp	(revision 208)
+++ /issm/trunk/src/c/objects/Param.cpp	(revision 209)
@@ -19,4 +19,9 @@
 		
 Param::Param(){
+	doublevec=NULL;
+	doublemat=NULL;
+	vec=NULL;
+	mat=NULL;
+
 	return;
 }
@@ -34,4 +39,9 @@
 		throw ErrorException(__FUNCT__,exprintf("%s%i"," unknow parameter type ",param_type));
 	}
+	doublevec=NULL;
+	doublemat=NULL;
+	vec=NULL;
+	mat=NULL;
+
 }
 
@@ -159,5 +169,8 @@
 		case DOUBLEVEC:
 			memcpy(marshalled_dataset,&M,sizeof(M));marshalled_dataset+=sizeof(M);
-			memcpy(marshalled_dataset,doublevec,M*sizeof(double));marshalled_dataset+=(M*sizeof(double));
+			if(M){
+				memcpy(marshalled_dataset,doublevec,M*sizeof(double));
+				marshalled_dataset+=(M*sizeof(double));
+			}
 			break;
 
@@ -165,5 +178,8 @@
 			memcpy(marshalled_dataset,&M,sizeof(M));marshalled_dataset+=sizeof(M);
 			memcpy(marshalled_dataset,&N,sizeof(N));marshalled_dataset+=sizeof(N);
-			memcpy(marshalled_dataset,doublevec,M*N*sizeof(double));marshalled_dataset+=(M*N*sizeof(double));
+			if(M*N){
+				memcpy(marshalled_dataset,doublevec,M*N*sizeof(double));
+				marshalled_dataset+=(M*N*sizeof(double));
+			}
 			break;
 
@@ -294,6 +310,8 @@
 	
 			memcpy(&M,marshalled_dataset,sizeof(M));marshalled_dataset+=sizeof(M);
-			doublevec=(double*)xmalloc(M*sizeof(double));
-			memcpy(doublevec,marshalled_dataset,M*sizeof(double));marshalled_dataset+=(M*sizeof(double));
+			if(M){
+				doublevec=(double*)xmalloc(M*sizeof(double));
+				memcpy(doublevec,marshalled_dataset,M*sizeof(double));marshalled_dataset+=(M*sizeof(double));
+			}
 			break;
 
@@ -301,6 +319,8 @@
 			memcpy(&M,marshalled_dataset,sizeof(M));marshalled_dataset+=sizeof(M);
 			memcpy(&N,marshalled_dataset,sizeof(N));marshalled_dataset+=sizeof(N);
-			doublemat=(double*)xmalloc(M*N*sizeof(double));
-			memcpy(doublemat,marshalled_dataset,M*N*sizeof(double));marshalled_dataset+=(M*N*sizeof(double));
+			if(M*N){
+				doublemat=(double*)xmalloc(M*N*sizeof(double));
+				memcpy(doublemat,marshalled_dataset,M*N*sizeof(double));marshalled_dataset+=(M*N*sizeof(double));
+			}
 			break;
 
@@ -390,6 +410,8 @@
 		double** pdoublevec=(double**)pvalue;
 		double* outdoublevec=NULL;
-		outdoublevec=(double*)xmalloc(M*sizeof(double));
-		memcpy(outdoublevec,doublevec,M*sizeof(double));
+		if(M){
+			outdoublevec=(double*)xmalloc(M*sizeof(double));
+			memcpy(outdoublevec,doublevec,M*sizeof(double));
+		}
 		*pdoublevec=outdoublevec;
 	}
@@ -397,6 +419,8 @@
 		double** pdoublemat=(double**)pvalue;
 		double* outdoublemat=NULL;
-		outdoublemat=(double*)xmalloc(M*N*sizeof(double));
-		memcpy(outdoublemat,doublemat,M*N*sizeof(double));
+		if(M*N){
+			outdoublemat=(double*)xmalloc(M*N*sizeof(double));
+			memcpy(outdoublemat,doublemat,M*N*sizeof(double));
+		}
 		*pdoublemat=outdoublemat;
 	}
@@ -478,6 +502,8 @@
 	
 	M=size;
-	doublevec=(double*)xmalloc(M*sizeof(double));
-	memcpy(doublevec,value,M*sizeof(double));
+	if(M){
+		doublevec=(double*)xmalloc(M*sizeof(double));
+		memcpy(doublevec,value,M*sizeof(double));
+	}
 
 }
Index: /issm/trunk/src/c/parallel/OutputControl.cpp
===================================================================
--- /issm/trunk/src/c/parallel/OutputControl.cpp	(revision 208)
+++ /issm/trunk/src/c/parallel/OutputControl.cpp	(revision 209)
@@ -25,4 +25,5 @@
 	int     one=1;
 	int     gsize;
+	int     nods;
 
 	/*serialize outputs: */
@@ -31,4 +32,5 @@
 	VecShift(partition_shifted,1.0); //matlab indexing starts at 1
 	VecToMPISerial(&serial_partition,partition_shifted);
+	VecGetSize(partition,&nods);
 	
 	VecToMPISerial(&serial_ug,u_g);
@@ -53,5 +55,5 @@
 
 		/*Write parameter to disk: */
-		WriteDataToDisk(p_g,&gsize,&one,"Mat",fid);
+		WriteDataToDisk(p_g,&nods,&one,"Mat",fid);
 
 		/*Write J to disk: */
Index: /issm/trunk/src/c/parallel/OutputDiagnostic.cpp
===================================================================
--- /issm/trunk/src/c/parallel/OutputDiagnostic.cpp	(revision 208)
+++ /issm/trunk/src/c/parallel/OutputDiagnostic.cpp	(revision 209)
@@ -27,4 +27,5 @@
 	int     one=1;
 	int     gsize;
+	int     nods;
 
 	/*serialize outputs: */
@@ -33,4 +34,5 @@
 	VecShift(partition_shifted,1.0); //matlab indexing starts at 1
 	VecToMPISerial(&serial_partition,partition_shifted);
+	VecGetSize(partition,&nods);
 
 	VecToMPISerial(&serial_ug,u_g);
@@ -49,5 +51,5 @@
 
 		/*Write partition: */
-		WriteDataToDisk(serial_partition,&gsize,&one,"Mat",fid);
+		WriteDataToDisk(serial_partition,&nods,&one,"Mat",fid);
 		
 		/*Write solution to disk: */
Index: /issm/trunk/src/m/classes/public/loadresultsfromdisk.m
===================================================================
--- /issm/trunk/src/m/classes/public/loadresultsfromdisk.m	(revision 208)
+++ /issm/trunk/src/m/classes/public/loadresultsfromdisk.m	(revision 209)
@@ -31,6 +31,8 @@
 
 	%Used to recover velocities
-	indx=part(1:2:end);
-	indy=part(2:2:end);
+	indx=1:2:gsize;
+	indy=2:2:gsize;
+	indx=indx(part);
+	indy=indy(part);
 
 	%Recover velocity
Index: /issm/trunk/src/mex/ModelProcessor/ModelProcessor.cpp
===================================================================
--- /issm/trunk/src/mex/ModelProcessor/ModelProcessor.cpp	(revision 208)
+++ /issm/trunk/src/mex/ModelProcessor/ModelProcessor.cpp	(revision 209)
@@ -41,5 +41,4 @@
 
 	/*Create parameters: */
-
 	CreateParameters(&parameters,model,MODEL);
 
Index: /issm/trunk/todo
===================================================================
--- /issm/trunk/todo	(revision 208)
+++ /issm/trunk/todo	(revision 209)
@@ -3,4 +3,3 @@
 Define default cluster in /etc/cielo.rc
 VelocityExtrude: debug 
-Add vx and vy as input parameters to diagnostic. 
 FindParam(vx) then DeleteParam("vx")? Should vx be a Vec? Can we find a way of partionting vx with partition, and staying in parallel?
