| 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:]) |