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);