Introduction
Introduction Statistics Contact Development Disclaimer Help
tpostprocessing.py - slidergrid - grid of elastic sliders on a frictional surfa…
git clone git://src.adamsgaard.dk/slidergrid
Log
Files
Refs
README
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, [email protected]')
26 print('web: https://github.com/anders-dc/slidergrid')
27 print('Licensed under the GNU Public License v3, see LICENSE for det…
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, :]))*…
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_{translationa…
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_e…
231
232 if __name__ == '__main__':
233 main(sys.argv[1:])
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.