Index: /issm/trunk/src/c/objects/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Tria.cpp	(revision 390)
+++ /issm/trunk/src/c/objects/Tria.cpp	(revision 391)
@@ -1624,6 +1624,6 @@
 		/*We are using an absolute misfit: */
 		for (i=0;i<numgrids;i++){
-			absolutex_list[i]=vx_list[i]-obs_vx_list[i];
-			absolutey_list[i]=vy_list[i]-obs_vy_list[i];
+			absolutex_list[i]=obs_vx_list[i]-vx_list[i];
+			absolutey_list[i]=obs_vy_list[i]-vy_list[i];
 		}
 	}
@@ -1635,6 +1635,6 @@
 			if(obs_vx_list[i]==0)scalex=0;
 			if(obs_vy_list[i]==0)scaley=0;
-			relativex_list[i]=scalex*(vx_list[i]-obs_vx_list[i]);
-			relativey_list[i]=scaley*(vy_list[i]-obs_vy_list[i]);
+			relativex_list[i]=scalex*(obs_vx_list[i]-vx_list[i]);
+			relativey_list[i]=scaley*(obs_vy_list[i]-vy_list[i]);
 		}
 	}
@@ -1644,5 +1644,5 @@
 			velocity_mag=sqrt(pow(vx_list[i],2)+pow(vy_list[i],2))+epsvel; //epsvel to avoid velocity being nil.
 			obs_velocity_mag=sqrt(pow(obs_vx_list[i],2)+pow(obs_vy_list[i],2))+epsvel; //epsvel to avoid observed velocity being nil.
-			scale=8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
+			scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
 			logarithmicx_list[i]=scale*vx_list[i];
 			logarithmicy_list[i]=scale*vy_list[i];
@@ -1781,6 +1781,6 @@
 	/* node data: */
 	const int    numgrids=3;
-	const int    numdofs=2*numgrids;
 	const int    NDOF2=2;
+	const int    numdofs=NDOF2*numgrids;
 	double       xyz_list[numgrids][3];
 	int          doflist[numdofs];
@@ -1823,5 +1823,5 @@
 
 	/*element vector at the gaussian points: */
-	double  grade_g[numgrids];
+	double  grade_g[numdofs];
 	double  grade_g_gaussian[numgrids];
 
@@ -1946,11 +1946,11 @@
 		GetNodalFunctions(l1l2l3, gauss_l1l2l3);
 
-		/*Build gradje_g_gaussian vector: */
+		/*Build gradje_g_gaussian vector (actually -dJ/ddrag): */
 		for (i=0;i<numgrids;i++){
-			grade_g_gaussian[i]=-2*drag*alpha_complement*( (lambda*vx+mu*vy))*Jdet*gauss_weight*l1l2l3[i]; 
+			grade_g_gaussian[i]=2*drag*alpha_complement*( (lambda*vx+mu*vy))*Jdet*gauss_weight*l1l2l3[i]; 
 		}
 		
 		/*Add gradje_g_gaussian vector to gradje_g: */
-		for( i=0; i<numdofs; i++)grade_g[i]+=grade_g_gaussian[i];
+		for( i=0; i<numgrids; i++)grade_g[i*numberofdofspernode]+=grade_g_gaussian[i];
 	}
 
@@ -2087,5 +2087,5 @@
 		#endif
 
-		/*Build gradje_g_gaussian vector: */
+		/*Build gradje_g_gaussian vector (actually -dJ/dB): */
 		for (i=0;i<numgrids;i++){
 			grade_g_gaussian[i]=-viscosity2*thickness*( (2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1])*Jdet*gauss_weight*l1l2l3[i]; 
@@ -2168,7 +2168,5 @@
 		obs_vx_list[i]=obs_velocity[doflist[i*numberofdofspernode+0]];
 		obs_vy_list[i]=obs_velocity[doflist[i*numberofdofspernode+1]];
-
-	}
-
+	}
 	
 	/* Get gaussian points and weights (make this a statically initialized list of points? fstd): */
@@ -2189,5 +2187,4 @@
 		gauss_l1l2l3[2]=*(third_gauss_area_coord+ig);
 
-	
 		/*Compute velocities at gaussian point: */
 		GetParameterValue(&velocity_x, &vx_list[0],gauss_l1l2l3);
