           d_r =
             if o.r < (nodeArc.innerRadius + containerPadding) then Math.max(k_r, min_k_r)
             else if (nodeArc.outerRadius - containerPadding) < o.r then -Math.max(k_r, min_k_r)
-            else 0
+            else if (o.r - (0.5 * (nodeArc.innerRadius + nodeArc.outerRadius)) > 0) then 0 else 0
 
           d_thetaDirection = 0
           smallestAngleBetween = (source, target) ->

    layoutHeight = defineControl("Layout height", true, true, 0, 1200, 700)
    padding = defineControl("Node padding", true, false, 0, 15, 6)

    forceGravity = defineControl("Gravity", false, false, 0, 1, 0, (g) -> force.gravity(g))
    forceAlpha = defineControl("Alpha", false, false, 0, 3, 0.1, (a) -> force.alpha(a))
    forceCharge = defineControl("Charge", false, false, -50, 50, -20, (c) -> force.charge(c))
    forceFriction = defineControl("Friction", false, false, .9, 1, .95, (f) -> force.friction(f))

    containerForce = defineControl("Container force", false, false, 0, 100, 50)
    minAlpha = defineControl("Minimum alpha", false, false, 0, 1, 0, (a) -> if forceAlpha() < a then forceAlpha(a))

            x1 > nx2 or x2 < nx1 or y1 > ny2 or y2 < ny1

      ### TODO different force for each arc ###
      launchForces = (arc) ->
        forces.push(d3.layout.force()
          .nodes(arc)
          .links([])
          .linkStrength(0)
          .size([layoutWidth(), layoutHeight()]))
      launchForces(ring) for ring, i_r in slice for slice, i_s in data

      masterForce
        .gravity(forceGravity())
        .alpha(forceAlpha())
        .charge(forceCharge())
        .friction(forceFriction())
        .start()

      masterForce.apply (force)->
        nodeEnterSelection.call(force.drag)

      ### Initialize directionality tracking vars ###
      nodes.forEach (o) ->
