twrite and read simulation status file - 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
       ---
 (DIR) commit c75d7fcd51c3d68c8063daf7493815f71331bb39
 (DIR) parent c480661f83d878f15281bef803e8a6dbb174b5f6
 (HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk>
       Date:   Tue,  5 Apr 2016 09:10:31 -0700
       
       write and read simulation status file
       
       Diffstat:
         M postprocessing.py                   |     111 +++++++++++++++++++++----------
         M slidergrid/simulation.c             |      31 +++++++++++++++++++++++++++++++
       
       2 files changed, 106 insertions(+), 36 deletions(-)
       ---
 (DIR) diff --git a/postprocessing.py b/postprocessing.py
       t@@ -5,6 +5,7 @@ import os
        import csv
        import numpy as np
        import matplotlib.pyplot as plt
       +import re
        
        VERSION = '0.01'
        SCRIPTNAME = sys.argv[0]
       t@@ -31,28 +32,18 @@ class slidergrid:
        
            def __init__(self, folder):
                self.folder = folder
       +        self.id = re.sub('.*\/', '', re.sub('-.*$', '', self.folder))
        
       -    def read_sliders(self, filename):
       -        self.filename = filename
       -        raw = np.loadtxt(self.folder + '/' + self.filename)
       -        self.pos = raw[:, 0:3]
       -        self.vel = raw[:, 3:6]
       -        self.acc = raw[:, 6:9]
       -        self.force = raw[:, 9:12]
       -        self.angpos = raw[:, 12:15]
       -        self.angvel = raw[:, 15:18]
       -        self.angacc = raw[:, 18:21]
       -        self.torque = raw[:, 21:24]
       -        self.mass = raw[:, 24]
       -        self.moment_of_inertia = raw[:, 25]
       +    def read_general(self, filename, verbose=True):
       +        if verbose:
       +            print('input file: ' + filename)
        
       -    def read_general(self, filename):
                self.general_filename = filename
       -        with open(self.folder + '/' + self.general_filename, 'r') as f:
       +        with open(self.general_filename, 'r') as f:
                    reader = csv.reader(f, delimiter='\t')
                    for raw in reader:
                        self.version = float(raw[0])
       -                self.sid = raw[1]
       +                # self.id = raw[1]
                        self.N = int(raw[2])
                        self.time = float(raw[3])
                        self.time_end = float(raw[4])
       t@@ -83,7 +74,7 @@ class slidergrid:
            def current_kinetic_energy(self):
                E_t = 0.0
                E_r = 0.0
       -        for idx in np.arange(np.size(self.mass)):
       +        for idx in np.arange(self.N):
                    E_t += self.slider_translational_kinetic_energy(idx)
                    E_r += self.slider_rotational_kinetic_energy(idx)
                return E_t, E_r
       t@@ -96,31 +87,79 @@ class slidergrid:
                return 0.5*self.moment_of_inertia[idx] \
                    * np.sqrt(np.dot(self.angvel[idx, :], self.angvel[idx, :]))**2
        
       -    def plot_kinetic_energy(self):
       +    def plot_kinetic_energy(self, verbose=False):
                self.t_series = []
                self.E_t_series = []
                self.E_r_series = []
       -        for filename in os.listdir(self.folder):
       -            if 'sliders' in filename \
       -                    and '.txt' in filename \
       -                    and '.pdf' not in filename \
       -                    and '.png' not in filename:
       -                self.read_sliders(filename)
       -                self.read_general(filename.replace('sliders', 'general'))
       -                self.t_series.append(self.time)
       -                E_t, E_r = self.current_kinetic_energy()
       -                self.E_t_series.append(E_t)
       -                self.E_r_series.append(E_r)
       -
       -        sorted_idx = np.argsort(self.t_series)
       -        print(sorted_idx)
       -        t_sorted = np.sort(self.t_series, order=sorted_idx)
       -        plt.plot(t_sorted, self.E_t_series)
       -        plt.plot(self.t_series[sorted_idx], self.E_r_series[sorted_idx])
       +
       +        sim = slidergrid(self.folder)
       +
       +        for i in range(self.status()):
       +            sim.read_step(i+1, verbose=verbose)
       +            self.t_series.append(sim.time)
       +            E_t, E_r = sim.current_kinetic_energy()
       +            self.E_t_series.append(E_t)
       +            self.E_r_series.append(E_r)
       +
       +        fig = plt.figure()
       +        plt.plot(self.t_series, self.E_t_series, label='$E_{translational}$')
       +        plt.plot(self.t_series, self.E_r_series, label='$E_{rotational}$')
       +        plt.xlabel('Time [s]')
       +        plt.ylabel('Total kinetic energy [J]')
                outfile = self.folder + '/E_kin.pdf'
       -        print(outfile)
       +        plt.legend(loc='best')
       +        plt.tight_layout()
                plt.savefig(outfile)
       +        print(outfile)
                plt.clf()
       +        plt.close(fig)
       +
       +    def status(self):
       +        fh = None
       +        try:
       +            filepath = self.folder + '/' + self.id + '.status.dat'
       +            fh = open(filepath)
       +            data = fh.read()
       +            return int(data.split()[2])  # Return last output file number
       +        finally:
       +            if fh is not None:
       +                fh.close()
       +
       +    def read_first(self, verbose=True):
       +        self.readstep(0, verbose)
       +
       +    def read_last(self, verbose=True):
       +        self.readstep(self.status(), verbose)
       +
       +    def read_step(self, step, verbose=True):
       +        self.read_sliders(
       +            self.folder + '/{}.sliders.{:0=6}.txt'.format(
       +                self.id,
       +                step),
       +            verbose)
       +        self.read_general(
       +            self.folder + '/{}.general.{:0=6}.txt'.format(
       +                self.id,
       +                step),
       +            verbose)
       +
       +    def read_sliders(self, filename, verbose=True):
       +
       +        self.filename = filename
       +        if verbose:
       +            print('input file: ' + filename)
       +
       +        raw = np.loadtxt(self.filename)
       +        self.pos = raw[:, 0:3]
       +        self.vel = raw[:, 3:6]
       +        self.acc = raw[:, 6:9]
       +        self.force = raw[:, 9:12]
       +        self.angpos = raw[:, 12:15]
       +        self.angvel = raw[:, 15:18]
       +        self.angacc = raw[:, 18:21]
       +        self.torque = raw[:, 21:24]
       +        self.mass = raw[:, 24]
       +        self.moment_of_inertia = raw[:, 25]
        
        
        def iterate_over_folders_and_files(folders,
 (DIR) diff --git a/slidergrid/simulation.c b/slidergrid/simulation.c
       t@@ -143,6 +143,29 @@ int save_slider_data_to_file(
            return 0;
        }
        
       +int save_status_to_file(const simulation* sim, const char* filename)
       +{
       +    FILE* f = fopen(filename, "w");
       +    if (f == NULL) {
       +        fprintf(stderr, "Error: Could not open output file %s.", filename);
       +        return 1;
       +    }
       +
       +    fprintf(f,
       +            "%f\t" // current time
       +            "%f\t" // percentage completed
       +            "%d"   // last output file number
       +            ,
       +            sim->time,
       +            100.0*sim->time/sim->time_end,
       +            sim->file_number
       +           );
       +
       +    fclose(f);
       +    return 0;
       +
       +}
       +
        int save_general_state_to_file(const simulation* sim, const char* filename)
        {
            FILE* f = fopen(filename, "w");
       t@@ -378,6 +401,14 @@ int write_simulation_output(simulation* sim, char* output_folder)
                return 1;
            }
        
       +    // simulation status, temporal values and last output file number
       +    sprintf(filename, "%s/%s.status.dat", output_folder, sim->id);
       +    if (save_status_to_file(sim, filename)) {
       +        fprintf(stderr, "\nFatal error: Could not save to output file "
       +                "'%s'.\n", filename);
       +        return 1;
       +    }
       +
            sim->file_number++;
            return 0;
        }