Index: /issm/trunk/src/c/DataSet/DataSet.cpp
===================================================================
--- /issm/trunk/src/c/DataSet/DataSet.cpp	(revision 2346)
+++ /issm/trunk/src/c/DataSet/DataSet.cpp	(revision 2347)
@@ -1399,6 +1399,11 @@
 
 			num_unstable_constraints+=unstable;
-		}
-	}
+			if(unstable){
+				printf("id=%i\n",pengrid->GetId());
+			}
+		}
+	}
+	printf("num_unstable_constraints=%i\n",num_unstable_constraints);
+
 
 	#ifdef _PARALLEL_
Index: /issm/trunk/src/c/objects/Numpar.cpp
===================================================================
--- /issm/trunk/src/c/objects/Numpar.cpp	(revision 2346)
+++ /issm/trunk/src/c/objects/Numpar.cpp	(revision 2347)
@@ -31,4 +31,5 @@
 	viscosity_overshoot=UNDEF;
 	stokesreconditioning=UNDEF;
+	control_type=NULL;
 	cm_noisedampening=UNDEF;
 
@@ -51,4 +52,5 @@
 	printf("   viscosity_overshoot: %g\n",viscosity_overshoot);
 	printf("   stokesreconditioning: %g\n",stokesreconditioning);
+	printf("   control_type: %s\n",control_type);
 	printf("   cm_noisedampening: %g\n",cm_noisedampening);
 }
@@ -65,4 +67,5 @@
 	printf("   viscosity_overshoot: %g\n",viscosity_overshoot);
 	printf("   stokesreconditioning: %g\n",stokesreconditioning);
+	printf("   control_type: %s\n",control_type);
 	printf("   cm_noisedampening: %g\n",cm_noisedampening);
 }
@@ -90,4 +93,5 @@
 	memcpy(marshalled_dataset,&viscosity_overshoot,sizeof(viscosity_overshoot));marshalled_dataset+=sizeof(viscosity_overshoot);
 	memcpy(marshalled_dataset,&stokesreconditioning,sizeof(stokesreconditioning));marshalled_dataset+=sizeof(stokesreconditioning);
+	memcpy(marshalled_dataset,&control_type,sizeof(control_type));marshalled_dataset+=sizeof(control_type);
 	memcpy(marshalled_dataset,&cm_noisedampening,sizeof(cm_noisedampening));marshalled_dataset+=sizeof(cm_noisedampening);
 	
@@ -103,4 +107,5 @@
 		+sizeof(viscosity_overshoot)
 		+sizeof(stokesreconditioning)
+		+sizeof(control_type)
 		+sizeof(cm_noisedampening)
 		+sizeof(int); //sizeof(int) for enum type
@@ -128,4 +133,5 @@
 	memcpy(&viscosity_overshoot,marshalled_dataset,sizeof(viscosity_overshoot));marshalled_dataset+=sizeof(viscosity_overshoot);
 	memcpy(&stokesreconditioning,marshalled_dataset,sizeof(stokesreconditioning));marshalled_dataset+=sizeof(stokesreconditioning);
+	memcpy(&control_type,marshalled_dataset,sizeof(control_type));marshalled_dataset+=sizeof(control_type);
 	memcpy(&cm_noisedampening,marshalled_dataset,sizeof(cm_noisedampening));marshalled_dataset+=sizeof(cm_noisedampening);
 
@@ -163,4 +169,5 @@
 	if(!parameters->FindParam(&viscosity_overshoot,"viscosity_overshoot"))throw ErrorException(__FUNCT__," error message: could not update viscosity_overshoot field");
 	if(!parameters->FindParam(&stokesreconditioning,"stokesreconditioning"))throw ErrorException(__FUNCT__," error message: could not update stokesreconditioning field");
+	parameters->FindParam(&control_type,"control_type");
 	if(!parameters->FindParam(&cm_noisedampening,"cm_noisedampening"))throw ErrorException(__FUNCT__," error message: could not update cm_noisedampening field");
 
@@ -184,4 +191,5 @@
 	inputs->Recover("viscosity_overshoot",&viscosity_overshoot);
 	inputs->Recover("stokesreconditioning",&stokesreconditioning);
+	inputs->Recover("control_type",&control_type);
 	inputs->Recover("cm_noisedampening",&cm_noisedampening);
 
Index: /issm/trunk/src/c/objects/Numpar.h
===================================================================
--- /issm/trunk/src/c/objects/Numpar.h	(revision 2346)
+++ /issm/trunk/src/c/objects/Numpar.h	(revision 2347)
@@ -21,9 +21,9 @@
 		double viscosity_overshoot;
 		double stokesreconditioning;
+		char*  control_type;
 		double cm_noisedampening;
 
 		Numpar();
 		Numpar(int id);
-		Numpar(int    id, double meanvel, double epsvel, int    artdiff, double viscosity_overshoot, double stokesreconditioning, double cm_noisedampening);
 		~Numpar();
 
Index: /issm/trunk/src/c/objects/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Tria.cpp	(revision 2346)
+++ /issm/trunk/src/c/objects/Tria.cpp	(revision 2347)
@@ -2840,4 +2840,5 @@
 	const int    numdof=2*numgrids;
 	const int    NDOF2=2;
+	int          dofs1[1]={0};
 	int          dofs2[2]={0,1};
 	double       xyz_list[numgrids][3];
@@ -2962,24 +2963,19 @@
 		#endif
 		
-
-
-		/*Initialize Jelem with dampening term*/
-		/* NOT working for NOW
-		if (strcmp(control_type,"drag")==0 & !shelf){
+		/*Add dampening term to misfit*/
+		if (strcmp(numpar->control_type,"drag")==0 & !shelf){
 			GetParameterDerivativeValue(&dk[0], &k[0],&xyz_list[0][0], gauss_l1l2l3);
 			Jelem+=numpar->cm_noisedampening*1/2*(pow(dk[0],2)+pow(dk[1],2))*Jdet*gauss_weight;
-			if (id==1){
-				printf("id=%i value=%g k=[%g %g %g]\n",id,(pow(dk[0],2)+pow(dk[1],2)),k[0],k[1],k[2]);
+		}
+		else if (strcmp(numpar->control_type,"B")==0){
+			if(!inputs->Recover("B",&B[0],1,dofs1,numgrids,(void**)nodes)){
+				throw ErrorException(__FUNCT__,"parameter B not found in input");
 			}
-			if ((pow(dk[0],2)+pow(dk[1],2))>pow(10,-20)){
-				printf("id=%i value=%g k=[%g %g %g]\n",id,(pow(dk[0],2)+pow(dk[1],2)),k[0],k[1],k[2]);
-			}
-		}
-		else if (strcmp(control_type,"B")==0){
-			B=matice->GetB();
 			GetParameterDerivativeValue(&dB[0], &B[0],&xyz_list[0][0], gauss_l1l2l3);
 			Jelem+=numpar->cm_noisedampening*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss_weight;
 		}
-		*/
+		else{
+			throw ErrorException(__FUNCT__,exprintf("%s%s","unsupported control type: ",numpar->control_type));
+		}
 
 		/*Differents misfits are allowed: */
