timplement simulation initialization and dynamic grain memory allocation - granular - granular dynamics simulation
(HTM) git clone git://src.adamsgaard.dk/granular
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 3d5cc041769b612a57de8f5068a244c83b4612f9
(DIR) parent 512cf441b47308e28c16512418bccf09855cb678
(HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Fri, 19 Mar 2021 21:56:24 +0100
implement simulation initialization and dynamic grain memory allocation
Diffstat:
M Makefile | 12 +++++++++---
A granular2vtu.c | 28 ++++++++++++++++++++++++++++
A granularpacking.c | 22 ++++++++++++++++++++++
D packingtest.c | 22 ----------------------
M simulation.c | 30 ++++++++++++++++++++++++++++++
M simulation.h | 15 ++++++++-------
6 files changed, 97 insertions(+), 32 deletions(-)
---
(DIR) diff --git a/Makefile b/Makefile
t@@ -10,7 +10,8 @@ DOCPREFIX = ${PREFIX}/share/doc/${NAME}
BIN = \
granular\
- packingtest
+ granular2vtu\
+ granularpacking
SRC = ${BIN:=.c} arrays.c grain.c granular.c packing.c simulation.c util.c
HDR = \
arg.h\
t@@ -47,9 +48,14 @@ ${OBJ}: ${HDR}
.c.o:
${CC} ${GRANULAR_CFLAGS} ${GRANULAR_CPPFLAGS} -o $@ -c $<
-packingtest: packingtest.o arrays.o grain.o packing.o simulation.o util.o
+granularpacking: granularpacking.o arrays.o grain.o packing.o simulation.o util.o
${CC}\
- packingtest.o arrays.o grain.o packing.o simulation.o util.o\
+ granularpacking.o arrays.o grain.o packing.o simulation.o util.o\
+ -o $@ ${GRANULAR_LDFLAGS}
+
+granular2vtu: granular2vtu.o arrays.o grain.o simulation.o util.o
+ ${CC}\
+ granular2vtu.o arrays.o grain.o simulation.o util.o\
-o $@ ${GRANULAR_LDFLAGS}
granular: granular.o arrays.o grain.o packing.o simulation.o util.o
(DIR) diff --git a/granular2vtu.c b/granular2vtu.c
t@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <unistd.h>
+#include "grain.c"
+#include "simulation.h"
+#include "arrays.h"
+#include "util.h"
+
+int
+main(void)
+{
+ char *line = NULL;
+ size_t linesize = 0;
+ ssize_t linelen;
+ struct simulation sim;
+
+ init_sim(&sim);
+
+ while ((linelen = getline(&line, &linesize, stdin)) > 0)
+ add_grain(&sim, grain_read(line));
+
+ /* if (sim.np > 0) */
+ print_grains_vtk(stdout, sim.grains, sim.np);
+
+ free_sim(&sim);
+ free(line);
+
+ return 0;
+}
(DIR) diff --git a/granularpacking.c b/granularpacking.c
t@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include "packing.h"
+#include "simulation.h"
+#include "arrays.h"
+#include "util.h"
+
+int
+main(void)
+{
+ struct simulation sim;
+
+ size_t n[3], np = 0;
+ n[0] = 50; n[1] = 50; n[2] = 50;
+ double *origo = zeros(3);
+
+ /* np = rectangular_packing(&sim.grains, n, 1.0, 1.0, random_value_uniform, 0.0, &origo); */
+ np = triangular_packing(&sim.grains, n, 0.2, 1.0, random_value_uniform, 0.0, &origo);
+ print_grains(stdout, sim.grains, np);
+
+ free(origo);
+ free_sim(&sim);
+}
(DIR) diff --git a/packingtest.c b/packingtest.c
t@@ -1,22 +0,0 @@
-#include <stdio.h>
-#include "packing.h"
-#include "simulation.h"
-#include "arrays.h"
-#include "util.h"
-
-int
-main(void)
-{
- struct simulation sim;
-
- size_t n[3], np = 0;
- n[0] = 10; n[1] = 7; n[2] = 1;
- double *origo = zeros(3);
-
- /* np = rectangular_packing(&sim.grains, n, 1.0, 1.0, random_value_uniform, 0.0, &origo); */
- np = triangular_packing(&sim.grains, n, 1.0, 1.0, random_value_uniform, 0.0, &origo);
- print_grains(stdout, sim.grains, np);
-
- free(origo);
- free_sim(&sim);
-}
(DIR) diff --git a/simulation.c b/simulation.c
t@@ -1,14 +1,44 @@
#include <stdio.h>
+#include <err.h>
#include "simulation.h"
+#include "arrays.h"
#include "util.h"
void
+init_sim(struct simulation *sim)
+{
+ snprintf(sim->name, sizeof(sim->name), DEFAULT_SIMULATION_NAME);
+ sim->np = 0;
+ sim->gravacc = zeros(ND);
+ sim->origo = zeros(ND);
+ sim->L = ones(ND);
+ sim->t = 0.0;
+ sim->t_end = 0.0;
+ sim->dt = 0.0;
+ sim->file_dt = 1.0;
+ sim->n_file = 0;
+ sim->np = 0;
+}
+
+void
free_sim(struct simulation *sim)
{
+ free(sim->gravacc);
+ free(sim->origo);
+ free(sim->L);
free(sim->grains);
}
void
+add_grain(struct simulation *sim, const struct grain *g)
+{
+ if (!(sim->grains = realloc(sim->grains, sim->np * sizeof(struct grain))))
+ errx(1, "%s: sim.grains realloc", __func__);
+
+ sim->grains[sim->np++] = *g;
+}
+
+void
print_grains(FILE *stream, const struct grain *grains, size_t n)
{
size_t i;
(DIR) diff --git a/simulation.h b/simulation.h
t@@ -16,14 +16,12 @@ struct simulation {
char name[255];
/* gravitational acceleration [m/s^2] */
- double gravacc[ND];
+ double *gravacc;
/* grain sorting grid */
- size_t nd[ND];
- double origo[ND];
- double L[ND];
- double x[ND];
- double dx;
+ size_t *nd;
+ double *origo;
+ double *L;
/* temporal state [s] */
double t;
t@@ -33,12 +31,15 @@ struct simulation {
size_t n_file;
/* grains */
- size_t n;
+ size_t np;
struct grain *grains;
};
+void init_sim(struct simulation *sim);
void free_sim(struct simulation *sim);
+void add_grain(struct simulation *sim, const struct grain *g);
+
void print_grains(FILE *stream, const struct grain *grains, size_t n);
void print_grains_vtk(FILE *stream, const struct grain *grains, size_t n);