Index: /issm/trunk/src/m/solutions/cielo/GradJCompute.m
===================================================================
--- /issm/trunk/src/m/solutions/cielo/GradJCompute.m	(revision 1203)
+++ /issm/trunk/src/m/solutions/cielo/GradJCompute.m	(revision 1204)
@@ -11,5 +11,5 @@
 displaystring(debug,'%s','         computing velocities...');
 [u_g K_ff0 K_fs0 ]=diagnostic_core_nonlinear(m,inputs,analysis_type,sub_analysis_type);
-inputs=add(inputs,'velocity',u_g,'doublevec',2,m.parameters.numberofnodes);
+inputs=add(inputs,'velocity',u_g,'doublevec',m.parameters.numberofdofspernode,m.parameters.numberofnodes);
 
 %Buid Du, difference between observed velocity and model velocity.
@@ -26,5 +26,5 @@
 %Merge back to g set
 lambda_g= Mergesolutionfromftog( lambda_f, m.Gmn, m.ys0, m.nodesets ); 
-inputs=add(inputs,'adjoint',lambda_g,'doublevec',2,m.parameters.numberofnodes);
+inputs=add(inputs,'adjoint',lambda_g,'doublevec',m.parameters.numberofdofspernode,m.parameters.numberofnodes);
 
 %Compute gradJ 
Index: /issm/trunk/src/m/solutions/cielo/control_core.m
===================================================================
--- /issm/trunk/src/m/solutions/cielo/control_core.m	(revision 1203)
+++ /issm/trunk/src/m/solutions/cielo/control_core.m	(revision 1204)
@@ -8,4 +8,7 @@
 %recover models
 m_dh=models.dh;
+m_dv=models.dv;
+m_ds=models.ds;
+m_sl=models.sl;
 
 %recover parameters common to all solutions
@@ -22,4 +25,46 @@
 options=ControlOptions(m_dh.parameters);
 
+%Take car of Stokes : compute slope and get spc once for all
+if isstokes,
+
+	%bed slope
+	displaystring(debug,'\n%s',['      computing bed slope (x and y derivatives)...']);
+	slopex=diagnostic_core_linear(m_sl,inputs,'slope_compute','bedx');
+	slopey=diagnostic_core_linear(m_sl,inputs,'slope_compute','bedy');
+	slopex=FieldExtrude(m_sl.elements,m_sl.nodes,m_sl.loads,m_sl.materials,slopex,'slopex',0);
+	slopey=FieldExtrude(m_sl.elements,m_sl.nodes,m_sl.loads,m_sl.materials,slopey,'slopey',0);
+	inputs=add(inputs,'bedslopex',slopex,'doublevec',m_sl.parameters.numberofdofspernode,m_sl.parameters.numberofnodes);
+	inputs=add(inputs,'bedslopey',slopey,'doublevec',m_sl.parameters.numberofdofspernode,m_sl.parameters.numberofnodes);
+
+	%3d velocity
+	displaystring(debug,'\n%s',['      get vertical spcs: launch diagnostic...']);
+	displaystring(debug,'\n%s',['         computing horizontal velocities...']);
+	u_g=diagnostic_core_nonlinear(m_dh,inputs,'diagnostic','horiz');
+	displaystring(debug,'\n%s',['         extruding horizontal velocities...']);
+	u_g_horiz=FieldExtrude(m_dh.elements,m_dh.nodes,m_dh.loads,m_dh.materials,u_g,'velocity',1);
+	displaystring(debug,'\n%s',['         computing vertical velocities...']);
+	inputs=add(inputs,'velocity',u_g_horiz,'doublevec',m_dh.parameters.numberofdofspernode,m_dh.parameters.numberofnodes);
+	u_g_vert=diagnostic_core_linear(m_dv,inputs,'diagnostic','vert');
+	displaystring(debug,'\n%s',['         combining horizontal and vertical velocities...']);
+	u_g=zeros(m_dh.parameters.numberofnodes*3,1);
+	u_g(dofsetgen([1,2],3,m_dh.parameters.numberofnodes*3))=u_g_horiz;
+	u_g(dofsetgen([3],3,m_dh.parameters.numberofnodes*3))=u_g_vert;
+	displaystring(debug,'\n%s',['         computing pressure according to MacAyeal...']);
+	p_g=ComputePressure(m_dh.elements,m_dh.nodes,m_dh.loads,m_dh.materials,m_dh.parameters,inputs);
+	p_g=p_g/m_ds.parameters.stokesreconditioning;
+	%recombine u_g and p_g: 
+	u_g_stokes=zeros(m_ds.nodesets.gsize,1);
+	u_g_stokes(dofsetgen([1,2,3],4,m_ds.nodesets.gsize))=u_g;
+	u_g_stokes(dofsetgen([4],4,m_ds.nodesets.gsize))=p_g;
+	inputs=add(inputs,'velocity',u_g_stokes,'doublevec',4,m_ds.parameters.numberofnodes);
+	displaystring(debug,'\n%s',['         update boundary conditions for stokes using velocities previously computed...']);
+	m_ds.y_g=zeros(m_ds.nodesets.gsize,1);
+	m_ds.y_g(dofsetgen([1,2,3],4,m_ds.nodesets.gsize))=u_g;
+	[m_ds.ys m_ds.ys0]=Reducevectorgtos(m_ds.y_g,m_ds.nodesets);
+	displaystring(debug,'\n%s',['         computing stokes velocities and pressure ...']);
+	u_g=diagnostic_core_nonlinear(m_ds,inputs,'diagnostic','stokes');
+	inputs=add(inputs,'velocity',u_g,'doublevec',4,m_ds.parameters.numberofnodes);
+end
+
 for n=1:m_dh.parameters.nsteps,
 
@@ -34,9 +79,18 @@
 
 	%Update inputs in datasets
-	[m_dh.elements,m_dh.nodes,m_dh.loads,m_dh.materials]=UpdateFromInputs(m_dh.elements,m_dh.nodes,m_dh.loads,m_dh.materials,inputs);
+	if isstokes,
+		[m_ds.elements,m_ds.nodes,m_ds.loads,m_ds.materials]=UpdateFromInputs(m_ds.elements,m_ds.nodes,m_ds.loads,m_ds.materials,inputs);
+	else
+		[m_dh.elements,m_dh.nodes,m_dh.loads,m_dh.materials]=UpdateFromInputs(m_dh.elements,m_dh.nodes,m_dh.loads,m_dh.materials,inputs);
+	end
 
 	displaystring(debug,'\n%s',['      computing gradJ...']);
-	[u_g c(n).grad_g]=GradJCompute(m_dh,inputs,'diagnostic','horiz');
-	inputs=add(inputs,'velocity',u_g,'doublevec',2,m_dh.parameters.numberofnodes);
+	if isstokes,
+		[u_g c(n).grad_g]=GradJCompute(m_ds,inputs,'diagnostic','stokes');
+		inputs=add(inputs,'velocity',u_g,'doublevec',4,m_ds.parameters.numberofnodes);
+	else
+		[u_g c(n).grad_g]=GradJCompute(m_dh,inputs,'diagnostic','horiz');
+		inputs=add(inputs,'velocity',u_g,'doublevec',2,m_dh.parameters.numberofnodes);
+	end
 
 	displaystring(debug,'\n%s',['      normalizing directions...']);
@@ -53,5 +107,9 @@
 
 	displaystring(debug,'\n%s',['      optimizing along gradient direction...']);
-	[search_scalar c(n).J]=ControlOptimization('objectivefunctionC',0,1,options,m_dh,inputs,param_g,c(n).grad_g,n,'diagnostic','horiz');
+	if isstokes,
+		[search_scalar c(n).J]=ControlOptimization('objectivefunctionC',0,1,options,m_dh,inputs,param_g,c(n).grad_g,n,'diagnostic','horiz');
+	else
+		[search_scalar c(n).J]=ControlOptimization('objectivefunctionC',0,1,options,m_ds,inputs,param_g,c(n).grad_g,n,'diagnostic','horiz');
+	end
 
 	displaystring(debug,'\n%s',['      updating parameter using optimized search scalar...']);
