Index: /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 22423)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 22424)
@@ -7,5 +7,5 @@
 #include "../../toolkits/toolkits.h"
 
-void GetVectorFromControlInputsx(Vector<IssmDouble>** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,const char* data,bool onsid){
+void GetVectorFromControlInputsx(Vector<IssmDouble>** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,const char* data,bool onsid){/*{{{*/
 
 	int  num_controls;
@@ -32,7 +32,6 @@
 	xDelete<int>(control_type);
 	*pvector=vector;
-}
-
-void GetVectorFromControlInputsx( IssmDouble** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data,bool onsid){
+}/*}}}*/
+void GetVectorFromControlInputsx( IssmDouble** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data,bool onsid){/*{{{*/
 
 	/*output: */
@@ -50,3 +49,68 @@
 	/*Assign output pointers:*/
 	*pvector=vector;
-}
+}/*}}}*/
+
+/*For autodiff, we sometimes need to cast our vectors to passive*/
+#ifdef _HAVE_ADOLC_
+void GetPassiveVectorFromControlInputsx(Vector<IssmPDouble>** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,const char* data,bool onsid){/*{{{*/
+
+	/*Get active vector first*/
+	Vector<IssmDouble>*   activevector=NULL;
+	Vector<IssmPDouble>*  vector=NULL;
+	int                   size;
+
+	/*Retrieve some parameters*/
+	GetVectorFromControlInputsx(&activevector, elements,nodes, vertices, loads, materials, parameters,data,onsid);
+
+	/*Serialize vector*/
+	activevector->GetSize(&size);
+	IssmDouble* dactivevector=activevector->ToMPISerial();
+
+	/*Cast to passive*/
+	vector=new Vector<IssmPDouble>(size);
+	for(int i=0;i<size;i++){
+		vector->SetValue(i,reCast<IssmPDouble>(dactivevector[i]),INS_VAL);
+	}
+	vector->Assemble();
+
+	/*Assign output pointers:*/
+	delete activevector;
+	xDelete<IssmDouble>(dactivevector);
+	*pvector=vector;
+
+}/*}}}*/
+void GetPassiveVectorFromControlInputsx(IssmPDouble** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data,bool onsid){/*{{{*/
+
+	/*Get active vector first*/
+	Vector<IssmDouble>*   activevector=NULL;
+	IssmPDouble*          vector=NULL;
+	int                   size;
+
+	/*Retrieve some parameters*/
+	GetVectorFromControlInputsx(&activevector, elements,nodes, vertices, loads, materials, parameters,data,onsid);
+
+	/*Serialize vector*/
+	activevector->GetSize(&size);
+	IssmDouble* dactivevector=activevector->ToMPISerial();
+
+	/*Cast to passive*/
+	vector=xNew<IssmPDouble>(size);
+	for(int i=0;i<size;i++) vector[i] = reCast<IssmPDouble>(dactivevector[i]);
+
+	/*Assign output pointers:*/
+	delete activevector;
+	xDelete<IssmDouble>(dactivevector);
+	*pvector=vector;
+
+}/*}}}*/
+#else
+void GetPassiveVectorFromControlInputsx(Vector<IssmPDouble>** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,const char* data,bool onsid){/*{{{*/
+
+	GetVectorFromControlInputsx(pvector, elements,nodes, vertices, loads, materials, parameters,data,onsid);
+
+}/*}}}*/
+void GetPassiveVectorFromControlInputsx(IssmPDouble** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data,bool onsid){/*{{{*/
+
+	GetVectorFromControlInputsx(pvector, elements,nodes, vertices, loads, materials, parameters,data,onsid);
+}/*}}}*/
+#endif
Index: /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h	(revision 22423)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h	(revision 22424)
@@ -11,3 +11,6 @@
 void	GetVectorFromControlInputsx( IssmDouble** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value",bool onsid=false);
 
+void	GetPassiveVectorFromControlInputsx(Vector<double>** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value",bool onsid=false);
+void	GetPassiveVectorFromControlInputsx(double** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value",bool onsid=false);
+
 #endif  /* _GETVECTORFROMCONTROLINPUTSXX_H */
Index: /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp	(revision 22423)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp	(revision 22424)
@@ -7,5 +7,5 @@
 #include "../../toolkits/toolkits.h"
 
-void GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type){
+void GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type){/*{{{*/
 
 	int i;
@@ -35,7 +35,6 @@
 	/*Assign output pointers:*/
 	*pvector=vector;
-}
-
-void GetVectorFromInputsx(IssmDouble** pvector,FemModel* femmodel,int name, int type){
+}/*}}}*/
+void GetVectorFromInputsx(IssmDouble** pvector,FemModel* femmodel,int name, int type){/*{{{*/
 
 	/*output: */
@@ -53,7 +52,6 @@
 	/*Assign output pointers:*/
 	*pvector=vector;
-}
-
-void GetVectorFromInputsx(IssmDouble** pvector,int* pvector_size, FemModel* femmodel,int name){
+}/*}}}*/
+void GetVectorFromInputsx(IssmDouble** pvector,int* pvector_size, FemModel* femmodel,int name){/*{{{*/
 
 	int interpolation_type;
@@ -76,3 +74,3 @@
 	}
 	else _error_("interpolation type : " << interpolation_type << " not supported yet!");
-}
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.h	(revision 22423)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.h	(revision 22424)
@@ -10,5 +10,5 @@
 void	GetVectorFromInputsx( Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type);
 void	GetVectorFromInputsx( IssmDouble** pvector,FemModel* femmodel,int name,int type);
-void    GetVectorFromInputsx(IssmDouble** pvector,int* pvector_size, FemModel* femmodel,int name);
+void  GetVectorFromInputsx(IssmDouble** pvector,int* pvector_size, FemModel* femmodel,int name);
 
 #endif  /* _GETVECTORFROMINPUTSXX_H */
