I tried modifying the ad_gravity.py
example as follows (in words - we have a point charges on a rubber band in a field). The code below does NOT work (it bombs out with “kernel simplicity rule”). However, writing the way it might be written in python (or C):
for i in range(N):
r = x[i]- x[(i+1)%N)]
U[None]+= spring * len0 * (r.norm()-len0)**2
Does not seem to work - it does not actually seem to have a spring between the first and the last mass.
Any words of wisdom would be appreciated.
def compute_U():
for i, j in ti.ndrange(N, N):
r = x[i] - x[j]
# r.norm(1e-3) is equivalent to ti.sqrt(r.norm()**2 + 1e-3)
# This is to prevent 1/0 error which can cause wrong derivative
U[None] += -G / r.norm(1e-3) # U += -1 / |r|
for i in range(N-1):
r = x[i]- x[(i+1)]
U[None]+= spring * len0 * (r.norm()-len0)**2
r = x[N-1]-x[0]
U[None]+= spring * len0 * (r.norm()-len0)**2