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