     printf("time: iteration.\n");
     printCudaTimer(&timerIteration);
     resetCudaTimer(&timerIteration);
+
+    cudaMemset(graphSwing, 0, sizeof(float));
+    cudaMemset(graphTract, 0, sizeof(float));
+
+    // Run reductions on vertex swing and traction.
+    startCudaTimer(&timer);
+    fa2GraphSwingTract<<<numblocks_reduction, BLOCK_SIZE>>>(
+        g->numvertices,
+        swg, tra, numNeighbours,
+        graphSwing, graphTract);
+    stopCudaTimer(&timer);
+    printf("time: graph swing and traction.\n");
+    printCudaTimer(&timer);
+    resetCudaTimer(&timer);
+
+    code = cudaGetLastError();
+    if (code != cudaSuccess)
+    {
+      printf("Error in kernel 1.\n%s\n", cudaGetErrorString(code));
+      exit(EXIT_FAILURE);
+    }
+
+    fa2MoveVertices<<<numblocks, BLOCK_SIZE>>>(
+        vxLocs,
+        vyLocs,
+        g->numvertices,
+        tra,
+        swg,
+        forceX,
+        forceY,
+        oldForceX,
+        oldForceY,
+        graphSwing,
+        graphTract);
   }
 
   startCudaTimer(&timerMem2);

  cudaMemset(numNeighbours, 0, g->numvertices * sizeof(int));
  cudaMemset(tra, 0, g->numvertices * sizeof(float));
  cudaMemset(swg, 0, g->numvertices * sizeof(float));
  cudaMemset(oldForceX, 0, g->numvertices * sizeof(float));
  cudaMemset(oldForceY, 0, g->numvertices * sizeof(float));
  cudaMemset(graphSwing, 0, sizeof(float));

        numNeighbours,
        tra,
        swg,
        forceX,
        forceY,
        oldForceX,
        oldForceY,
        graphSwing,
