-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnode.py
More file actions
97 lines (85 loc) · 3.72 KB
/
Copy pathnode.py
File metadata and controls
97 lines (85 loc) · 3.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# node class
from numpy import array, zeros
#from numba import jit, jitclass, int32, float64
#
#spec = [
# ('dof', int32),
# ('referencePosition', float64[:]),
# ('position', float64[:]),
# ('displacement', float64[:]),
# ('forces', float64[:]),
# ('alphaNM', float64),
# ('betaNM', float64),
# ('timeStep', int32),
# ('sigma', float64[:]),
# ('weightFactor', float64),
# ('vonMises', float64),
# ('uPrev', float64[:]),
# ('vPrev', float64[:]),
# ('aPrev', float64[:]),
# ('uTemp', float64[:]),
# ('vTemp', float64[:]),
# ('velocity', float64[:]),
# ('acceleration', float64[:]),
# ('stiffness', float64[:,:])
# ]
#
#@jitclass(spec)
class Node:
def __init__(self, dof, position, initValues, alphaNM, betaNM, timeStep):
self.dof = dof
self.referencePosition = array(position)
self.position = array(position)
self.displacement = array(initValues)
self.forces = zeros(dof)
self.alphaNM = alphaNM
self.betaNM = betaNM
self.timeStep = timeStep
self.sigma = zeros(6)
self.weightFactor = 0.0
self.vonMises = 0.0
self.uPrev = array(initValues)
self.vPrev = zeros(dof)
self.aPrev = zeros(dof)
self.uTemp = array(initValues)
self.vTemp = zeros(dof)
self.velocity = zeros(dof)
self.acceleration = zeros(dof)
self.stiffness = zeros((dof, dof))
def resetStresses(self):
self.sigma = zeros(6)
self.vonMises = 0.0
def resetWeightFactor(self):
self.weightFactor = 0.0
def resetForces(self):
self.forces = zeros(self.dof)
def computeVelocitiesAndAccelerations(self):
# commented lines left for future reference
# apparently a memory management or stride error occurs here
# value of uPrev, vPrev, aPrev change here, although untouched
#print(vPrev)
#for i in range(0, self.dof):
# #print(i, self.acceleration.shape, self.displacement, self.uTemp.shape)
# self.uTemp[i] = self.uPrev[i] + self.timeStep * self.vPrev[i] \
# + 1.0/2.0 * self.timeStep**2 * (1.0 - 2.0 * self.alphaNM) * self.aPrev[i]
# self.vTemp[i] = self.vPrev[i] + self.timeStep * (1.0 - self.betaNM) * self.aPrev[i]
# self.acceleration[i] = (self.displacement[i] - self.uTemp[i]) \
# / (self.alphaNM * self.timeStep**2)
# self.velocity[i] = self.vTemp[i] + self.betaNM * self.timeStep * self.acceleration[i]
# self.uTemp = self.uPrev + self.timeStep * self.vPrev + 0.5 * self.timeStep**2 * (1 - 2 * self.alphaNM) * self.aPrev
# self.vTemp = self.vPrev + self.timeStep * (1 - self.betaNM) * self.aPrev
# this is vector addition
self.acceleration = (self.displacement - self.uTemp) / (self.alphaNM * self.timeStep**2)
self.velocity = self.vTemp + self.betaNM * self.timeStep * self.acceleration
#print(self.vPrev, "\n")
def updatePosition(self):
# update history variables
self.uPrev = self.displacement
self.vPrev = self.velocity
self.aPrev = self.acceleration
# update positions
self.position[0:3] = self.referencePosition[0:3] + self.displacement[0:3]
self.position[3] = self.referencePosition[3] + self.displacement[3] - 300
# temporary variables for Newmark calculated here since otherwise error occurs
self.uTemp = self.uPrev + self.timeStep * self.vPrev + 0.5 * self.timeStep**2 * (1 - 2 * self.alphaNM) * self.aPrev
self.vTemp = self.vPrev + self.timeStep * (1 - self.betaNM) * self.aPrev