tadd contact struct, will maybe be moved outside of grains - granular - granula… | |
git clone git://src.adamsgaard.dk/granular | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 04d5e7eefa6dad607385b133b32056e06b8d3fd4 | |
parent 96dfeaee4f7fc99516cc12cb75e44c922891b3c1 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Thu, 8 Apr 2021 21:11:03 +0200 | |
add contact struct, will maybe be moved outside of grains | |
Diffstat: | |
M Makefile | 2 ++ | |
A contact.h | 18 ++++++++++++++++++ | |
M grain.c | 3 +++ | |
M grain.h | 4 ++++ | |
M simulation.c | 63 ++++++++++++++++++++++++++++-… | |
5 files changed, 84 insertions(+), 6 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
t@@ -17,6 +17,7 @@ SCRIPTS = \ | |
SRC = \ | |
arrays.c\ | |
+ contact.c\ | |
grain.c\ | |
grains.c\ | |
packing.c\ | |
t@@ -25,6 +26,7 @@ SRC = \ | |
HDR = \ | |
arg.h\ | |
arrays.h\ | |
+ contact.h\ | |
grain.h\ | |
grains.h\ | |
granular.h\ | |
diff --git a/contact.h b/contact.h | |
t@@ -0,0 +1,18 @@ | |
+#ifndef GRANULAR_CONTACT_ | |
+#define GRANULAR_CONTACT_ | |
+ | |
+#include <stdlib.h> | |
+ | |
+struct contact { | |
+ int active; | |
+ size_t i, j; | |
+ double centerdist[3]; | |
+ double overlap; | |
+ double age; | |
+ double stress[3]; | |
+}; | |
+ | |
+void contact_defaults(struct contact *c); | |
+void contact_new(struct contact *c, size_t i, size_t j); | |
+ | |
+#endif | |
diff --git a/grain.c b/grain.c | |
t@@ -6,6 +6,7 @@ | |
#include "util.h" | |
#include "grain.h" | |
#include "arrays.h" | |
+#include "contact.h" | |
#define FLOATPREC 17 | |
t@@ -48,6 +49,8 @@ grain_defaults(struct grain *g) | |
g->shear_strength = 1e8; | |
g->fracture_toughness = 1e8; | |
g->ncontacts = 0; | |
+ for (i = 0; i < MAXCONTACTS; i++) | |
+ contact_defaults(&g->contacts[i]); | |
g->thermal_energy = 0.0; | |
g->color = 0; | |
} | |
diff --git a/grain.h b/grain.h | |
t@@ -2,6 +2,9 @@ | |
#define GRANULAR_GRAIN_ | |
#include <stdio.h> | |
+#include "contact.h" | |
+ | |
+#define MAXCONTACTS 32 | |
struct grain { | |
t@@ -28,6 +31,7 @@ struct grain { | |
double fracture_toughness; | |
size_t gridpos[3]; | |
size_t ncontacts; | |
+ struct contact contacts[MAXCONTACTS]; | |
double contact_stress[3]; | |
double thermal_energy; | |
int color; | |
diff --git a/simulation.c b/simulation.c | |
t@@ -23,7 +23,7 @@ sim_new(void) | |
void | |
sim_defaults(struct simulation *sim) | |
{ | |
- size_t i; | |
+ int i; | |
snprintf(sim->name, sizeof(sim->name), DEFAULT_SIMULATION_NAME); | |
sim->ng = 0; | |
t@@ -86,16 +86,67 @@ sim_print_grains_vtk(FILE *stream, const struct simulation… | |
grains_print_vtk(stream, sim->grains, sim->ng); | |
} | |
+double | |
+sim_grain_pair_overlap(struct simulation *sim, size_t i, size_t j) | |
+{ | |
+ double pos[3], overlap; | |
+ int d; | |
+ | |
+ if (i < j) { | |
+ for (d = 0; d < 3; d++) | |
+ pos[d] = sim->grains[i].pos[d] - sim->grains[j].pos[d]; | |
+ overlap = euclidean_norm(pos, 3) | |
+ - (sim->grains[i].radius + sim->grains[j].radius); | |
+ } | |
+ | |
+ return overlap; | |
+} | |
+ | |
+static void | |
+sim_check_add_contact(struct simulation *sim, size_t i, size_t j) | |
+{ | |
+ | |
+ double overlap; | |
+ int ic; | |
+ | |
+ for (ic = 0; ic <= MAXCONTACTS; ic++) { | |
+ continue; /* TODO */ | |
+ } | |
+ | |
+ overlap = sim_grain_pair_overlap(sim, i, j); | |
+ if (overlap < 0.0) { | |
+ for (ic = 0; ic <= MAXCONTACTS; ic++) { | |
+ | |
+ if (ic == MAXCONTACTS) | |
+ errx(1, "MAXCONTACTS (%d) exceeded (grains %zu… | |
+ MAXCONTACTS, i, j); | |
+ | |
+ /* TODO */ | |
+ } | |
+ } | |
+} | |
+ | |
+static void | |
+sim_detect_contacts(struct simulation *sim) | |
+{ | |
+ size_t i, j; | |
+ | |
+ for (i = 0; i < sim->ng; i++) | |
+ for (j = 0; j < sim->ng; j++) | |
+ if (i < j) | |
+ sim_check_add_contact(sim, i, j); | |
+} | |
+ | |
void | |
sim_step_time(struct simulation *sim) | |
{ | |
size_t i; | |
- for (i = 0; i < sim->ng; i++) { | |
- /* sim_detect_contacts(sim); */ | |
- /* sim_resolve_interactions(sim); */ | |
- /* grain_temporal_integration(sim->g[i], sim->dt); */ | |
- } | |
+ sim_detect_contacts(sim); | |
+ /* sim_resolve_interactions(sim); */ | |
+ | |
+ for (i = 0; i < sim->ng; i++) | |
+ grain_temporal_integration(&sim->grains[i], sim->dt); | |
sim->t += sim->dt; | |
sim->t_file += sim->dt; |