tfix memory handling in packing algorithm - granular - granular dynamics simulation
(HTM) git clone git://src.adamsgaard.dk/granular
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 1b411163a43e1bd000e1a8762aaa73656d2e15f9
(DIR) parent 45a7df9609a6a4f68791e61d4fbd5ea6e11f4ef7
(HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Thu, 18 Mar 2021 21:01:12 +0100
fix memory handling in packing algorithm
Diffstat:
M Makefile | 10 ++++++++--
M arrays.c | 2 +-
M grain.c | 5 ++++-
M packing.c | 30 ++++++++++++++++--------------
M packing.h | 19 ++++++++++---------
A packingtest.c | 21 +++++++++++++++++++++
M simulation.c | 12 ++++++++++++
M simulation.h | 4 +++-
M util.h | 2 ++
9 files changed, 77 insertions(+), 28 deletions(-)
---
(DIR) diff --git a/Makefile b/Makefile
t@@ -9,8 +9,9 @@ MANPREFIX = ${PREFIX}/share/man
DOCPREFIX = ${PREFIX}/share/doc/${NAME}
BIN = \
- granular
-SRC = ${BIN:=.c} arrays.c grain.c simulation.c util.c
+ granular\
+ packingtest
+SRC = ${BIN:=.c} arrays.c grain.c granular.c packing.c simulation.c util.c
HDR = \
arg.h\
arrays.h\
t@@ -46,6 +47,11 @@ ${OBJ}: ${HDR}
.c.o:
${CC} ${GRANULAR_CFLAGS} ${GRANULAR_CPPFLAGS} -o $@ -c $<
+packingtest: packingtest.o arrays.o grain.o packing.o simulation.o util.o
+ ${CC}\
+ packingtest.o arrays.o grain.o packing.o simulation.o util.o\
+ -o $@ ${GRANULAR_LDFLAGS}
+
granular: granular.o arrays.o grain.o packing.o simulation.o util.o
${CC}\
granular.o arrays.o grain.o packing.o simulation.o util.o\
(DIR) diff --git a/arrays.c b/arrays.c
t@@ -154,7 +154,7 @@ empty(const int n)
check_magnitude(__func__, 1, n);
- if (!(out = malloc(n * sizeof(double))))
+ if (!(out = calloc(n, sizeof(double))))
err(1, "%s: calloc", __func__);
return out;
(DIR) diff --git a/grain.c b/grain.c
t@@ -110,7 +110,10 @@ grain_print(FILE *stream, const struct grain *g)
struct grain *
grain_read(char *line)
{
- struct grain *g = malloc(sizeof(*g));
+ struct grain *g;
+
+ if (!(g = malloc(sizeof(struct grain))))
+ err(1, "%s: grain malloc", __func__);
if (sscanf(line, "%lg\t" /* radius */
"%lg\t%lg\t%lg\t" /* pos */
(DIR) diff --git a/packing.c b/packing.c
t@@ -1,3 +1,4 @@
+#include <stdio.h>
#include <err.h>
#include "util.h"
#include "granular.h"
t@@ -6,15 +7,15 @@
#define VERBOSE
-struct grain *
-rectangular_packing(size_t n[3],
+size_t
+rectangular_packing(struct grain *grains[],
+ size_t n[3],
double radius_min, double radius_max,
double (*gsd)(double min, double max),
double padding_factor,
double origo[3])
{
- size_t i, j, k, l, ig;
- struct grain *grains;
+ size_t i, j, k, l, np = 0;
double dx_padding = radius_max * 2.0 * padding_factor;
double dx = radius_max * 2.0 + dx_padding;
t@@ -22,26 +23,27 @@ rectangular_packing(size_t n[3],
errx(1, "%s: radius_max (%g) is smaller than radius_min (%g)",
__func__, radius_max, radius_min);
- if (!(grains = calloc(n[0] * n[1] * n[2], sizeof(struct grain))))
+ printf("sizeof(*grains) = %ld\n", sizeof(struct grain));
+ if (!(*grains = calloc(n[0] * n[1] * n[2], sizeof(struct grain))))
err(1, "%s: grains calloc", __func__);
for (k = 0; k < n[2]; k++)
for (j = 0; j < n[1]; j++)
for (i = 0; i < n[0]; i++) {
- ig = idx3(i, j, k, n[0], n[1]);
- grain_defaults(&grains[ig]);
- grains[ig].radius = gsd(radius_min, radius_max);
- grains[ig].pos[0] = i * dx + 0.5 * dx + origo[0];
- grains[ig].pos[1] = j * dx + 0.5 * dx + origo[1];
- grains[ig].pos[2] = k * dx + 0.5 * dx + origo[2];
+ np = idx3(i, j, k, n[0], n[1]);
+ grain_defaults(&(*grains)[np]);
+ (*grains)[np].radius = gsd(radius_min, radius_max);
+ (*grains)[np].pos[0] = i * dx + 0.5 * dx + origo[0];
+ (*grains)[np].pos[1] = j * dx + 0.5 * dx + origo[1];
+ (*grains)[np].pos[2] = k * dx + 0.5 * dx + origo[2];
for (l = 0; l < 3; l++)
- grains[ig].pos[l] +=
+ (*grains)[np].pos[l] +=
random_value_uniform(-0.5 * dx_padding,
0.5 * dx_padding);
#ifdef VERBOSE
- printf("added grain %zu\n", ig);
+ printf("added grain %zu\n", np);
#endif
}
- return grains;
+ return np;
}
(DIR) diff --git a/packing.h b/packing.h
t@@ -4,16 +4,17 @@
#include "grain.h"
#include "simulation.h"
-struct grain * rectangular_packing(size_t n[3],
- double radius_min, double radius_max,
- double (*gsd)(double min, double max),
- double padding_factor,
- double *origo[3]);
+size_t rectangular_packing(struct grain *grains[],
+ size_t n[3],
+ double radius_min, double radius_max,
+ double (*gsd)(double min, double max),
+ double padding_factor,
+ double *origo[3]);
-struct grain ** triangular_packing_2d(int nx, int ny,
- double radius_min, double radius_max);
+/*struct grain ** triangular_packing_2d(int nx, int ny,
+ double radius_min, double radius_max);*/
-struct grain ** irregular_packing_2d(int nx, int ny,
- double radius_min, double radius_max);
+/*struct grain ** irregular_packing_2d(int nx, int ny,
+ double radius_min, double radius_max);*/
#endif
(DIR) diff --git a/packingtest.c b/packingtest.c
t@@ -0,0 +1,21 @@
+#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] = 5; n[1] = 5; n[2] = 1;
+ double *origo = zeros(3);
+
+ np = rectangular_packing(&sim.grains, n, 0.1, 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,7 +1,19 @@
+#include <stdio.h>
#include "simulation.h"
+#include "util.h"
void
free_sim(struct simulation *sim)
{
free(sim->grains);
}
+
+void
+print_grains(FILE *stream, const struct grain *grains, size_t n)
+{
+ size_t i;
+
+ /* fprintf(stream, "N = %zu\n", n); */
+ for (i = 0; i < n; i++)
+ grain_print(stream, &grains[i]);
+}
(DIR) diff --git a/simulation.h b/simulation.h
t@@ -40,7 +40,9 @@ struct simulation {
void init_sim(struct simulation *sim);
void free_sim(struct simulation *sim);
+void print_grains(FILE *stream, const struct grain *grains, size_t n);
+
void write_output_file(struct simulation *sim, const int normalize);
-void print_output(struct simulation *sim, FILE *fp, const int normalize);
+void print_output(FILE *stream, struct simulation *sim);
#endif
(DIR) diff --git a/util.h b/util.h
t@@ -1,6 +1,8 @@
#ifndef GRANULAR_UTIL_
#define GRANULAR_UTIL_
+#define LENGTH(X) (size_t)(sizeof X / sizeof X[0])
+
void warn_parameter_value(const char message[], const double value, int *status);
void check_float(const char name[], const double value, int *status);
void check_float_non_negative(const char name[], const double value, int *status);