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;
}