Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #27_08_21
- '''
- From:
- "Modeling a Catenary Cable as a Bunch of Masses Connected by Springs"
- in Rhett Allain's Physics Explained Channel
- tested on: Linux Mint 20.2, Geany 1.36, python 3.8.10,
- Web Epiphany, i5-7260U CPU @ 2.20GHz × 2, Iris Plus Graphics 640
- vpython version: ['7.6.1', 'jupyter']
- '''
- from vpython import *
- import sys
- def main():
- print(version)
- scene.width, scene.height = 1900, 980
- scene.align = 'left'
- scene.autoscale = False
- scene.autozoom = False
- scene.userspin = True
- scene.userzoom = True
- scene.userpan = False
- scene.resizable = False
- scene.range = 0.25
- CATENARY = 1
- HORIZONTAL = 1
- RATE = 200
- dt = 0.001
- # NUMBER OF BALLS (CHAIN LINKS)
- N = 20
- # LINEAR LENGTH OF CHAIN IN "RELAXED" STATE
- L = 0.2
- # TOTAL MASS
- M = 0.1
- # INDIVIDUAL MASS
- #mass = M/N
- mass = 0.005
- # SPRING CONSTANT
- k = 70
- # GRAVITY ACCELERATION VECTOR
- A = vec(0, -9.8, 0)
- # Fdrag = -C * momentum (p)
- C = 3.0
- if CATENARY:
- leftend = vec(-0.1, 0.1, 0)
- else:
- leftend = vec(0, 0.2, 0)
- if HORIZONTAL or CATENARY:
- ds = vec(1, 0, 0) * L/(N-1)
- else:
- ds = vec(0, -1, 0) * L/(N-1)
- # SPRING "RELAXED" LENGTH
- Srel = L/(N-1)
- # BALL RADIUS
- R = 0.004
- # CONSTRUCT THE CHAIN
- balls = []
- for i in range(N):
- balls += [sphere(pos=leftend+i*ds, radius=R, m=mass,
- color=color.white, p=vec(0,0,0), F=vec(0,0,0))]
- springs = []
- for i in range(N-1):
- springs += [cylinder(pos=leftend+i*ds, axis=ds, radius=R/6)]
- t = 0
- while t < 4:
- rate(RATE)
- # CHAIN LEFTEND
- balls[0].F = vec(0,0,0)
- # CHAIN MIDDLE
- for i in range(1, N-1):
- Fgrav = balls[i].m * A
- Fspr0 = -k*(mag(springs[i-1].axis)-Srel) * norm(springs[i-1].axis)
- Fspr1 = +k*(mag(springs[i].axis)-Srel) * norm(springs[i].axis)
- Fdrag = -C * balls[i].p
- balls[i].F = Fspr0 + Fspr1 + Fgrav + Fdrag
- # CHAIN RIGHTEND
- if CATENARY:
- balls[-1].F = vec(0,0,0)
- else:
- Fgrav = balls[-1].m * A
- Fspr0 = -k*(mag(springs[-1].axis)-Srel) * norm(springs[-1].axis)
- Fdrag = -C * balls[-1].p
- balls[-1].F = Fspr0 + Fgrav + Fdrag
- for ball in balls:
- ball.p += ball.F * dt
- ball.pos += ball.p * dt/ball.m
- for i in range(1, N):
- springs[i-1].axis = balls[i].pos - balls[i-1].pos
- springs[i-1].pos = balls[i-1].pos
- t += dt
- # PRINT FINAL LENGTH OF CHAIN
- Lnew = 0
- for i in range(1,N):
- dLnew = mag(balls[i].pos - balls[i-1].pos)
- Lnew += dLnew
- print('New Length', Lnew)
- class g: ...
- if __name__ == '__main__':
- sys.exit(main())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement