tadd granularenergy program and include in example - granular - granular dynami… | |
git clone git://src.adamsgaard.dk/granular | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit b52aa0ae6674ec667526bffdae46b8ebd959c272 | |
parent 500b39e44f515253bc271988f5f922a9e9c3f36a | |
Author: Anders Damsgaard <[email protected]> | |
Date: Wed, 5 May 2021 15:09:16 +0200 | |
add granularenergy program and include in example | |
Diffstat: | |
M Makefile | 4 ++++ | |
M examples/two-grain-collision.sh | 11 +++++++++++ | |
M grain.c | 6 ++++++ | |
M grain.h | 1 + | |
M grains.c | 19 +++++++++++++++++++ | |
M grains.h | 1 + | |
A granularenergy.1 | 45 +++++++++++++++++++++++++++++… | |
A granularenergy.c | 21 +++++++++++++++++++++ | |
M simulation.c | 6 ++++++ | |
M simulation.h | 1 + | |
10 files changed, 115 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
t@@ -11,6 +11,7 @@ DOCPREFIX = ${PREFIX}/share/doc/${NAME} | |
BIN = \ | |
granular\ | |
granular2vtu\ | |
+ granularenergy\ | |
granulargrain\ | |
granularpacking | |
SCRIPTS = \ | |
t@@ -68,6 +69,9 @@ granular: granular.o ${OBJ} | |
granular2vtu: granular2vtu.o ${OBJ} | |
${CC} granular2vtu.o ${OBJ} -o $@ ${GRANULAR_LDFLAGS} | |
+granularenergy: granularenergy.o ${OBJ} | |
+ ${CC} granularenergy.o ${OBJ} -o $@ ${GRANULAR_LDFLAGS} | |
+ | |
granulargrain: granulargrain.o ${OBJ} | |
${CC} granulargrain.o ${OBJ} -o $@ ${GRANULAR_LDFLAGS} | |
diff --git a/examples/two-grain-collision.sh b/examples/two-grain-collision.sh | |
t@@ -16,3 +16,14 @@ done | |
ffmpeg -y -framerate 5 -i ${id}.grains.%05d.png \ | |
-c:v libx264 -r 30 -pix_fmt yuv420p ${id}.mp4 | |
xdg-open ${id}.mp4 | |
+ | |
+> "${id}.energy.tsv" | |
+for f in ${id}.grains.*.tsv; do | |
+ granularenergy < "$f" >> "${id}.energy.tsv" | |
+done | |
+gnuplot -e "set term png;\ | |
+ set xlabel 'time step';\ | |
+ set ylabel 'Energy [J]';\ | |
+ plot '-' u 0:1 w lp t 'Total energy'" \ | |
+ < "${id}.energy.tsv" > "${id}.energy.png" | |
+xdg-open "${id}.energy.png" | |
diff --git a/grain.c b/grain.c | |
t@@ -319,6 +319,12 @@ grain_kinetic_energy(const struct grain *g) | |
grain_rotational_kinetic_energy(g); | |
} | |
+double | |
+grain_thermal_energy(const struct grain *g) | |
+{ | |
+ return g->thermal_energy; | |
+} | |
+ | |
static void | |
grain_temporal_integration_two_term_taylor(struct grain *g, double dt) | |
{ | |
diff --git a/grain.h b/grain.h | |
t@@ -56,6 +56,7 @@ void grain_force_reset(struct grain *g); | |
double grain_translational_kinetic_energy(const struct grain *g); | |
double grain_rotational_kinetic_energy(const struct grain *g); | |
double grain_kinetic_energy(const struct grain *g); | |
+double grain_thermal_energy(const struct grain *g); | |
void grain_temporal_integration(struct grain *g, double dt); | |
void grain_register_contact(struct grain *g, size_t i, size_t j, | |
diff --git a/grains.c b/grains.c | |
t@@ -97,6 +97,25 @@ grains_print_vtk(FILE *stream, const struct grain *grains, … | |
"</VTKFile>\n"); | |
} | |
+void | |
+grains_print_energy(FILE *stream, const struct grain *grains, size_t ng) | |
+{ | |
+ size_t i; | |
+ double E_kin = 0.0, | |
+ E_rot = 0.0, | |
+ E_thermal = 0.0; | |
+ | |
+ for (i = 0; i < ng; i++) { | |
+ E_kin += grain_translational_kinetic_energy(&grains[i]); | |
+ E_rot += grain_rotational_kinetic_energy(&grains[i]); | |
+ E_thermal += grain_thermal_energy(&grains[i]); | |
+ } | |
+ | |
+ fprintf(stream, "%.17g\t%.17g\t%.17g\t%.17g\n", | |
+ E_kin + E_rot + E_thermal, | |
+ E_kin, E_rot, E_thermal); | |
+} | |
+ | |
double | |
grains_minimum_grain_edge(const struct grain *grains, size_t ng, int d) | |
{ | |
diff --git a/grains.h b/grains.h | |
t@@ -5,6 +5,7 @@ | |
void grains_print(FILE *stream, const struct grain *grains, size_t ng); | |
void grains_print_vtk(FILE *stream, const struct grain *grains, size_t ng); | |
+void grains_print_energy(FILE *stream, const struct grain *grains, size_t ng); | |
double sim_minimum_grain_edge(const struct grain *grains, size_t ng, int d); | |
double sim_maximum_grain_edge(const struct grain *grains, size_t ng, int d); | |
diff --git a/granularenergy.1 b/granularenergy.1 | |
t@@ -0,0 +1,45 @@ | |
+.Dd $Mdocdate$ | |
+.Dt GRANULARENERGY 1 | |
+.Os | |
+.Sh NAME | |
+.Nm granularenergy | |
+.Nd calculate energy components from granular data | |
+.Sh SYNOPSIS | |
+.Nm | |
+.Sh DESCRIPTION | |
+The | |
+.Nm | |
+utility reads | |
+.Xr granular 5 | |
+formatted data and outputs the total and individual energy components | |
+for the entire granular assemblage as tab-separated values: | |
+.Pp | |
+.Bl -enum -width Ss -compact | |
+.It | |
+Total energy [J] | |
+.It | |
+Translational (linear) kinetic energy [J] | |
+.It | |
+Rotational (angular) kinetic energy [J] | |
+.It | |
+Thermal energy [J] | |
+.El | |
+.Sh EXIT STATUS | |
+.Nm | |
+exits 0 on success, and >0 if a runtime error occurs: | |
+.Pp | |
+.Bl -tag -width Ds -compact | |
+.It 0 | |
+successful exit | |
+.It 1 | |
+unspecified error | |
+.It 2 | |
+.Xr pledge 2 | |
+error | |
+.El | |
+.Sh SEE ALSO | |
+.Xr granular2img 1 , | |
+.Xr granular2vtk 1 , | |
+.Xr granular 5 | |
+.Sh AUTHORS | |
+.An Anders Damsgaard Aq Mt [email protected] | |
diff --git a/granularenergy.c b/granularenergy.c | |
t@@ -0,0 +1,21 @@ | |
+#include <stdlib.h> | |
+#include <unistd.h> | |
+#include <err.h> | |
+#include "granular.h" | |
+ | |
+int | |
+main(void) | |
+{ | |
+ struct simulation sim = sim_new(); | |
+ | |
+#ifdef __OpenBSD__ | |
+ if (pledge("stdio", NULL) == -1) | |
+ err(2, "pledge failed"); | |
+#endif | |
+ | |
+ sim_read_grains(&sim, stdin); | |
+ sim_print_grains_energy(stdout, &sim); | |
+ sim_free(&sim); | |
+ | |
+ return 0; | |
+} | |
diff --git a/simulation.c b/simulation.c | |
t@@ -92,6 +92,12 @@ sim_print_grains_vtk(FILE *stream, const struct simulation … | |
} | |
void | |
+sim_print_grains_energy(FILE *stream, const struct simulation *sim) | |
+{ | |
+ grains_print_energy(stream, sim->grains, sim->ng); | |
+} | |
+ | |
+void | |
sim_write_output_files(struct simulation *sim) | |
{ | |
int ret; | |
diff --git a/simulation.h b/simulation.h | |
t@@ -40,6 +40,7 @@ void sim_read_grains(struct simulation *sim, FILE *stream); | |
void sim_print_grains(FILE *stream, const struct simulation *sim); | |
void sim_print_grains_vtk(FILE *stream, const struct simulation *sim); | |
+void sim_print_grains_energy(FILE *stream, const struct simulation *sim); | |
void sim_write_output_files(struct simulation *sim); | |
void sim_force_reset(struct simulation *sim); |