Introduction
Introduction Statistics Contact Development Disclaimer Help
tadd acceleration as constant body force - granular - granular dynamics simulat…
git clone git://src.adamsgaard.dk/granular
Log
Files
Refs
README
LICENSE
---
commit cce359bcaf94938276bdd3e28515f088b2ceef5f
parent 0dc426c8b11d38d85d984ece057b53911b74330a
Author: Anders Damsgaard <[email protected]>
Date: Thu, 22 Apr 2021 16:13:17 +0200
add acceleration as constant body force
Diffstat:
M grain.c | 136 ++++++++++++++++-------------…
M granular.c | 4 +++-
M simulation.c | 21 +++++++++++++++------
M simulation.h | 4 +---
4 files changed, 87 insertions(+), 78 deletions(-)
---
diff --git a/grain.c b/grain.c
t@@ -21,24 +21,24 @@ grain_new(void)
void
grain_defaults(struct grain *g)
{
- int i;
+ int d;
g->diameter = 1.0;
- for (i = 0; i < 3; i++) {
- g->pos[i]
- = g->vel[i]
- = g->acc[i]
- = g->force[i]
- = g->angpos[i]
- = g->angvel[i]
- = g->angacc[i]
- = g->torque[i]
- = g->disp[i]
- = g->forceext[i]
- = g->contact_stress[i]
+ for (d = 0; d < 3; d++) {
+ g->pos[d]
+ = g->vel[d]
+ = g->acc[d]
+ = g->force[d]
+ = g->angpos[d]
+ = g->angvel[d]
+ = g->angacc[d]
+ = g->torque[d]
+ = g->disp[d]
+ = g->forceext[d]
+ = g->contact_stress[d]
= 0.0;
- g->gridpos[i]
- = g->acc_lock[i] = 0;
+ g->gridpos[d]
+ = g->acc_lock[d] = 0;
}
g->density = 2.5e3;
g->fixed = 0;
t@@ -53,8 +53,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]);
+ for (d = 0; d < MAXCONTACTS; d++)
+ contact_defaults(&g->contacts[d]);
g->thermal_energy = 0.0;
g->color = 0;
}
t@@ -62,28 +62,28 @@ grain_defaults(struct grain *g)
static void
print_padded_nd_double(FILE *stream, const double *arr)
{
- int i;
+ int d;
- for (i = 0; i < 3; i++)
- fprintf(stream, "%.*g\t", FLOATPREC, arr[i]);
+ for (d = 0; d < 3; d++)
+ fprintf(stream, "%.*g\t", FLOATPREC, arr[d]);
}
static void
print_padded_nd_int(FILE *stream, const int *arr)
{
- int i;
+ int d;
- for (i = 0; i < 3; i++)
- fprintf(stream, "%d\t", arr[i]);
+ for (d = 0; d < 3; d++)
+ fprintf(stream, "%d\t", arr[d]);
}
static void
print_padded_nd_uint(FILE *stream, const size_t *arr)
{
- int i;
+ int d;
- for (i = 0; i < 3; i++)
- fprintf(stream, "%zu\t", arr[i]);
+ for (d = 0; d < 3; d++)
+ fprintf(stream, "%zu\t", arr[d]);
}
void
t@@ -197,24 +197,24 @@ grain_read(char *line)
int
grain_check_values(const struct grain *g)
{
- int i;
+ int d;
int status = 0;
check_float_positive("grain->diameter", g->diameter, &status);
- for (i = 0; i < 3; i++) {
- check_float("grain->pos", g->pos[i], &status);
- check_float("grain->vel", g->vel[i], &status);
- check_float("grain->acc", g->acc[i], &status);
- check_int_bool("grain->acc_lock", g->acc_lock[i], &status);
- check_float("grain->force", g->force[i], &status);
- check_float("grain->angpos", g->angpos[i], &status);
- check_float("grain->angvel", g->angvel[i], &status);
- check_float("grain->angacc", g->angacc[i], &status);
- check_float("grain->torque", g->torque[i], &status);
- check_float("grain->disp", g->disp[i], &status);
- check_float("grain->forceext", g->forceext[i], &status);
- check_float("grain->contact_stress", g->contact_stress[i], &st…
+ for (d = 0; d < 3; d++) {
+ check_float("grain->pos", g->pos[d], &status);
+ check_float("grain->vel", g->vel[d], &status);
+ check_float("grain->acc", g->acc[d], &status);
+ check_int_bool("grain->acc_lock", g->acc_lock[d], &status);
+ check_float("grain->force", g->force[d], &status);
+ check_float("grain->angpos", g->angpos[d], &status);
+ check_float("grain->angvel", g->angvel[d], &status);
+ check_float("grain->angacc", g->angacc[d], &status);
+ check_float("grain->torque", g->torque[d], &status);
+ check_float("grain->disp", g->disp[d], &status);
+ check_float("grain->forceext", g->forceext[d], &status);
+ check_float("grain->contact_stress", g->contact_stress[d], &st…
}
check_float_non_negative("grain->density", g->density, &status);
t@@ -247,10 +247,10 @@ grain_check_values(const struct grain *g)
g->fracture_toughness,
&status);
- for (i = 0; i < 3; i++)
- if (g->gridpos[i] > 1)
+ for (d = 0; d < 3; d++)
+ if (g->gridpos[d] > 1)
warn_parameter_value("grain->gridpos is not 0 or 1",
- (double)g->gr…
+ (double)g->gr…
check_float_non_negative("grain->thermal_energy", g->thermal_energy, &…
t@@ -278,16 +278,16 @@ grain_moment_of_inertia(const struct grain *g)
void
grain_zero_kinematics(struct grain *g)
{
- int i;
-
- for (i = 0; i < 3; i++) {
- g->vel[i] = 0.0;
- g->acc[i] = 0.0;
- g->force[i] = 0.0;
- g->angvel[i] = 0.0;
- g->angacc[i] = 0.0;
- g->torque[i] = 0.0;
- g->disp[i] = 0.0;
+ int d;
+
+ for (d = 0; d < 3; d++) {
+ g->vel[d] = 0.0;
+ g->acc[d] = 0.0;
+ g->force[d] = 0.0;
+ g->angvel[d] = 0.0;
+ g->angacc[d] = 0.0;
+ g->torque[d] = 0.0;
+ g->disp[d] = 0.0;
}
}
t@@ -313,29 +313,29 @@ grain_kinetic_energy(const struct grain *g)
static void
grain_temporal_integration_two_term_taylor(struct grain *g, double dt)
{
- int i;
+ int d;
double dx, mass = grain_mass(g);
double moment_of_inertia = grain_moment_of_inertia(g);
- for (i = 0; i < 3; i++) {
- if (!g->acc_lock[i])
- g->acc[i] = g->force[i] / mass;
+ for (d = 0; d < 3; d++) {
+ if (!g->acc_lock[d])
+ g->acc[d] = (g->force[d] + g->forceext[d]) / mass;
if (g->rotating)
- g->angacc[i] = g->torque[i] / moment_of_inertia;
+ g->angacc[d] = g->torque[d] / moment_of_inertia;
}
if (g->fixed)
- for (i = 0; i < 3; i++)
- g->acc[i] = 0.0;
-
- for (i = 0; i < 3; i++) {
- dx = g->vel[i] * dt + 0.5 * g->acc[i] * dt * dt;
- g->pos[i] += dx;
- g->disp[i] += dx;
- g->angpos[i] += g->angvel[i] * dt + 0.5 * g->angacc[i] * dt * …
- g->vel[i] += g->acc[i] * dt;
- g->angvel[i] += g->angacc[i] * dt;
+ for (d = 0; d < 3; d++)
+ g->acc[d] = 0.0;
+
+ for (d = 0; d < 3; d++) {
+ dx = g->vel[d] * dt + 0.5 * g->acc[d] * dt * dt;
+ g->pos[d] += dx;
+ g->disp[d] += dx;
+ g->angpos[d] += g->angvel[d] * dt + 0.5 * g->angacc[d] * dt * …
+ g->vel[d] += g->acc[d] * dt;
+ g->angvel[d] += g->angacc[d] * dt;
}
}
diff --git a/granular.c b/granular.c
t@@ -24,6 +24,7 @@ main(int argc, char *argv[])
{
int ret;
struct simulation sim = sim_new();
+ double grav = 0.0;
#ifdef __OpenBSD__
if (pledge("stdio wpath cpath", NULL) == -1)
t@@ -37,7 +38,7 @@ main(int argc, char *argv[])
sim.t_end = atof(EARGF(usage()));
break;
case 'g':
- sim.constacc[1] = atof(EARGF(usage()));
+ grav = atof(EARGF(usage()));
break;
case 'h':
usage();
t@@ -63,6 +64,7 @@ main(int argc, char *argv[])
usage();
sim_read_grains(&sim, stdin);
+ sim_add_acceleration_scalar(&sim, grav, 1);
sim_set_timestep(&sim);
if (sim.t < sim.t_end)
sim_run_time_loop(&sim);
diff --git a/simulation.c b/simulation.c
t@@ -24,17 +24,16 @@ sim_new(void)
void
sim_defaults(struct simulation *sim)
{
- int i, ret;
+ int d, ret;
ret = snprintf(sim->name, sizeof(sim->name), DEFAULT_SIMULATION_NAME);
if (ret < 0 || (size_t)ret >= sizeof(sim->name))
errx(1, "%s: could not write simulation name", __func__);
sim->ng = 0;
- for (i = 0; i < 3; i++) {
- sim->constacc[i] = 0.0;
- sim->nd[i] = 1;
- sim->origo[i] = 0.0;
- sim->L[i] = 1.0;
+ for (d = 0; d < 3; d++) {
+ sim->nd[d] = 1;
+ sim->origo[d] = 0.0;
+ sim->L[d] = 1.0;
}
sim->t = 0.0;
sim->t_end = 0.0;
t@@ -144,6 +143,16 @@ sim_check_add_contact(struct simulation *sim, size_t i, s…
grain_register_contact(&sim->grains[i], j, i, centerdist, over…
}
+void
+sim_add_acceleration_scalar(struct simulation *sim, double acc, int dimension)
+{
+ size_t i;
+
+ for (i = 0; i < sim->ng; i++)
+ sim->grains[i].forceext[dimension]
+ += acc * grain_mass(&sim->grains[i]);
+}
+
/* Silbert et al. 2001 */
void
sim_set_timestep(struct simulation *sim)
diff --git a/simulation.h b/simulation.h
t@@ -12,9 +12,6 @@ struct simulation {
/* simulation name to use for output files */
char name[255];
- /* constant acceleration [m/s^2] */
- double constacc[3];
-
/* grain sorting grid */
size_t nd[3];
double origo[3];
t@@ -45,6 +42,7 @@ void sim_print_grains(FILE *stream, const struct simulation …
void sim_print_grains_vtk(FILE *stream, const struct simulation *sim);
void sim_write_output_files(struct simulation *sim);
+void sim_add_acceleration_scalar(struct simulation *sim, double acc, int dimen…
void sim_set_timestep(struct simulation *sim);
void sim_detect_contacts(struct simulation *sim);
void sim_step_time(struct simulation *sim);
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.