Introduction
Introduction Statistics Contact Development Disclaimer Help
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;
}
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.