tadd triangular regular packing - granular - granular dynamics simulation
 (HTM) git clone git://src.adamsgaard.dk/granular
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 1927846d99dbff890b20ba9d7d13c48cfcad2fdf
 (DIR) parent 500ff9f09f7696dfd10e1ac9dcb3d52ed232546b
 (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
       Date:   Fri, 19 Mar 2021 13:33:52 +0100
       
       add triangular regular packing
       
       Diffstat:
         M packing.c                           |      49 +++++++++++++++++++++++++++++--
         M packing.h                           |      12 ++++++++----
         M packingtest.c                       |       5 +++--
       
       3 files changed, 58 insertions(+), 8 deletions(-)
       ---
 (DIR) diff --git a/packing.c b/packing.c
       t@@ -1,5 +1,6 @@
        #include <stdio.h>
        #include <err.h>
       +#include <math.h>
        #include "util.h"
        #include "granular.h"
        #include "grain.h"
       t@@ -10,8 +11,8 @@ 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])
       +                    double padding_factor,
       +                    double origo[3])
        {
                size_t i, j, k, l, np, N = 0;
                double dx_padding = radius_max * 2.0 * padding_factor;
       t@@ -45,3 +46,47 @@ rectangular_packing(struct grain *grains[],
        
                return N;
        }
       +
       +size_t
       +triangular_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, np, N = 0;
       +        double dx_padding = radius_max * 2.0 * padding_factor;
       +        double dx = radius_max * 2.0 + dx_padding;
       +        double dy = dx * sin(PI/3.0);
       +
       +        if (radius_max < radius_min)
       +                errx(1, "%s: radius_max (%g) is smaller than radius_min (%g)",
       +                     __func__, radius_max, radius_min);
       +
       +        if (!(*grains = calloc(n[0] * n[1], 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++) {
       +                                        N++;
       +                                        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];
       +                                        if (j % 2 == 0)
       +                                                (*grains)[np].pos[0] += 0.5 * dx;
       +                                        (*grains)[np].pos[1] = j * dy + 0.5 * dx + origo[1];
       +                                        (*grains)[np].pos[2] = j * dx + 0.5 * dx + origo[2];
       +                                        for (l = 0; l < 2; l++)
       +                                                (*grains)[np].pos[l] +=
       +                                                        random_value_uniform(-0.5 * dx_padding,
       +                                                                                                 0.5 * dx_padding);
       +#ifdef VERBOSE
       +                                        printf("added grain %zu\n", np);
       +#endif
       +                        }
       +
       +        return N;
       +}
 (DIR) diff --git a/packing.h b/packing.h
       t@@ -8,11 +8,15 @@ 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]);
       +                           double padding_factor,
       +                           double *origo[3]);
        
       -/*struct grain ** triangular_packing_2d(int nx, int ny,
       -                      double radius_min, double radius_max);*/
       +size_t triangular_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 ** irregular_packing_2d(int nx, int ny,
                             double radius_min, double radius_max);*/
 (DIR) diff --git a/packingtest.c b/packingtest.c
       t@@ -10,10 +10,11 @@ main(void)
                struct simulation sim;
        
                size_t n[3], np = 0;
       -        n[0] = 5; n[1] = 5; n[2] = 1;
       +        n[0] = 10; n[1] = 7; n[2] = 1;
                double *origo = zeros(3);
                
       -        np = rectangular_packing(&sim.grains, n, 0.1, 1.0, random_value_uniform, 0.0, &origo);
       +        /* 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);