twrite and read simulation status file - slidergrid - grid of elastic sliders o… | |
git clone git://src.adamsgaard.dk/slidergrid | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit c75d7fcd51c3d68c8063daf7493815f71331bb39 | |
parent c480661f83d878f15281bef803e8a6dbb174b5f6 | |
Author: Anders Damsgaard <[email protected]> | |
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(-) | |
--- | |
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, | |
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… | |
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; | |
} |