tpostprocessing.py - slidergrid - grid of elastic sliders on a frictional surface
(HTM) git clone git://src.adamsgaard.dk/slidergrid
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
tpostprocessing.py (7048B)
---
1 #!/usr/bin/env python
2 import sys
3 import getopt
4 import csv
5 import numpy as np
6 import matplotlib.pyplot as plt
7 import re
8
9 VERSION = '0.01'
10 SCRIPTNAME = sys.argv[0]
11
12
13 def print_usage():
14 print('usage: ' + SCRIPTNAME + ' [OPTIONS] <FOLDER1> [FOLDER2, ...]')
15 print('where FOLDER is an output folder placed in this directory')
16 print('options:')
17 print(' -h, --help show this information')
18 print(' -v, --version show version information')
19 print(' -s, --plot-sliders plot slider positions')
20 print(' -k, --plot-kinetic-energy plot kinetic energy')
21
22
23 def print_version():
24 print(SCRIPTNAME + ' ' + VERSION)
25 print('author: Anders Damsgaard, adamsgaard@ucsd.edu')
26 print('web: https://github.com/anders-dc/slidergrid')
27 print('Licensed under the GNU Public License v3, see LICENSE for details')
28
29
30 class slidergrid:
31
32 def __init__(self, folder):
33 self.folder = folder
34 self.id = re.sub('.*\/', '', re.sub('-.*$', '', self.folder))
35
36 def read_general(self, filename, verbose=True):
37 if verbose:
38 print('input file: ' + filename)
39
40 self.general_filename = filename
41 with open(self.general_filename, 'r') as f:
42 reader = csv.reader(f, delimiter='\t')
43 for raw in reader:
44 self.version = float(raw[0])
45 # self.id = raw[1]
46 self.file_number = extract_file_number(filename)
47 self.N = int(raw[2])
48 self.time = float(raw[3])
49 self.time_end = float(raw[4])
50 self.dt = float(raw[5])
51 self.file_interval = float(raw[6])
52 self.iteration = int(raw[7])
53 self.bond_length_limit = float(raw[8])
54
55 def plot_sliders(self, verbose=True):
56
57 fig = plt.figure()
58
59 # plot positions
60 plt.plot(self.pos[:, 0], self.pos[:, 1], '+')
61
62 plt.xlabel('$x$ [m]')
63 plt.ylabel('$y$ [m]')
64 outfile = self.folder + '/' + self.id + \
65 '.sliders.{:0=6}'.format(self.file_number) + '.pdf'
66 plt.legend(loc='best')
67 plt.tight_layout()
68 plt.savefig(outfile)
69 if verbose:
70 print(outfile)
71 plt.clf()
72 plt.close(fig)
73
74 def plot_all_sliders(self, verbose=False):
75 sim = slidergrid(self.folder)
76 for i in range(sim.status()):
77 sim.read_step(i + 1, verbose=verbose)
78 sim.plot_sliders()
79
80 def current_time(self):
81 return self.time
82
83 def current_kinetic_energy(self):
84 E_t = 0.0
85 E_r = 0.0
86 for idx in np.arange(self.N):
87 E_t += self.slider_translational_kinetic_energy(idx)
88 E_r += self.slider_rotational_kinetic_energy(idx)
89 return E_t, E_r
90
91 def slider_translational_kinetic_energy(self, idx):
92 return 0.5*self.mass[idx] \
93 * np.sqrt(np.dot(self.vel[idx, :], self.vel[idx, :]))**2
94
95 def slider_rotational_kinetic_energy(self, idx):
96 return 0.5*self.moment_of_inertia[idx] \
97 * np.sqrt(np.dot(self.angvel[idx, :], self.angvel[idx, :]))**2
98
99 def plot_kinetic_energy(self, verbose=False):
100 self.t_series = []
101 self.E_t_series = []
102 self.E_r_series = []
103
104 sim = slidergrid(self.folder)
105
106 for i in range(self.status()):
107 sim.read_step(i + 1, verbose=verbose)
108 self.t_series.append(sim.time)
109 E_t, E_r = sim.current_kinetic_energy()
110 self.E_t_series.append(E_t)
111 self.E_r_series.append(E_r)
112
113 fig = plt.figure()
114 plt.plot(self.t_series, self.E_t_series, label='$E_{translational}$')
115 plt.plot(self.t_series, self.E_r_series, label='$E_{rotational}$')
116 plt.xlabel('Time [s]')
117 plt.ylabel('Total kinetic energy [J]')
118 outfile = self.folder + '/' + self.id + '.E_kin.pdf'
119 plt.legend(loc='best')
120 plt.tight_layout()
121 plt.savefig(outfile)
122 print(outfile)
123 plt.clf()
124 plt.close(fig)
125
126 def status(self):
127 fh = None
128 try:
129 filepath = self.folder + '/' + self.id + '.status.dat'
130 fh = open(filepath)
131 data = fh.read()
132 return int(data.split()[2]) # Return last output file number
133 finally:
134 if fh is not None:
135 fh.close()
136
137 def read_first(self, verbose=True):
138 self.readstep(0, verbose)
139
140 def read_last(self, verbose=True):
141 self.readstep(self.status(), verbose)
142
143 def read_step(self, step, verbose=True):
144 self.read_sliders(
145 self.folder + '/{}.sliders.{:0=6}.txt'.format(
146 self.id,
147 step),
148 verbose)
149 self.read_general(
150 self.folder + '/{}.general.{:0=6}.txt'.format(
151 self.id,
152 step),
153 verbose)
154
155 def read_sliders(self, filename, verbose=True):
156
157 self.filename = filename
158 if verbose:
159 print('input file: ' + filename)
160
161 self.file_number = extract_file_number(filename)
162 raw = np.loadtxt(self.filename)
163 self.pos = raw[:, 0:3]
164 self.vel = raw[:, 3:6]
165 self.acc = raw[:, 6:9]
166 self.force = raw[:, 9:12]
167 self.angpos = raw[:, 12:15]
168 self.angvel = raw[:, 15:18]
169 self.angacc = raw[:, 18:21]
170 self.torque = raw[:, 21:24]
171 self.mass = raw[:, 24]
172 self.moment_of_inertia = raw[:, 25]
173
174
175 def iterate_over_folders_and_files(folders,
176 plot_sliders,
177 plot_kinetic_energy):
178 if len(folders) < 1:
179 print_usage()
180 sys.exit(1)
181
182 for folder in folders:
183 vis = slidergrid(folder)
184
185 if plot_sliders:
186 vis.plot_all_sliders()
187 elif plot_kinetic_energy:
188 vis.plot_kinetic_energy()
189 else:
190 print('No actions specified. Bye.')
191
192
193 def extract_file_number(string):
194 return int(re.findall('\d+', string)[0])
195
196
197 def main(argv):
198 folders = []
199 plot_sliders = False
200 plot_kinetic_energy = False
201 try:
202 opts, args = getopt.getopt(argv, 'hvsk',
203 ['help',
204 'version',
205 'plot-sliders',
206 'plot-kinetic-energy'])
207 except getopt.GetoptError:
208 # print_usage()
209 # sys.exit(2)
210 pass
211
212 for opt, arg in opts:
213 if opt in ('-h', '--help'):
214 print_usage()
215 sys.exit(0)
216
217 elif opt in ('-v', '--version'):
218 print_version()
219 sys.exit(0)
220
221 elif opt in ('-s', '--plot-sliders'):
222 plot_sliders = True
223
224 elif opt in ('-k', '--plot-kinetic-energy'):
225 plot_kinetic_energy = True
226
227 for arg in args:
228 folders.append(arg)
229
230 iterate_over_folders_and_files(folders, plot_sliders, plot_kinetic_energy)
231
232 if __name__ == '__main__':
233 main(sys.argv[1:])