tadd triangular regular packing - granular - granular dynamics simulation | |
git clone git://src.adamsgaard.dk/granular | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 1927846d99dbff890b20ba9d7d13c48cfcad2fdf | |
parent 500ff9f09f7696dfd10e1ac9dcb3d52ed232546b | |
Author: Anders Damsgaard <[email protected]> | |
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(-) | |
--- | |
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,… | |
+ (*grains)[np].pos[0] = i * dx + 0.5 * … | |
+ if (j % 2 == 0) | |
+ (*grains)[np].pos[0] += 0.5 * … | |
+ (*grains)[np].pos[1] = j * dy + 0.5 * … | |
+ (*grains)[np].pos[2] = j * dx + 0.5 * … | |
+ for (l = 0; l < 2; l++) | |
+ (*grains)[np].pos[l] += | |
+ random_value_uniform(-… | |
+ … | |
+#ifdef VERBOSE | |
+ printf("added grain %zu\n", np); | |
+#endif | |
+ } | |
+ | |
+ return N; | |
+} | |
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);*/ | |
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_unifor… | |
+ /* np = rectangular_packing(&sim.grains, n, 1.0, 1.0, random_value_uni… | |
+ np = triangular_packing(&sim.grains, n, 1.0, 1.0, random_value_uniform… | |
print_grains(stdout, sim.grains, np); | |
free(origo); |