Introduction
Introduction Statistics Contact Development Disclaimer Help
tgather headers in granular.h, rename np to ng, split operations on grain array…
git clone git://src.adamsgaard.dk/granular
Log
Files
Refs
README
LICENSE
---
commit df197a3f20247716945dd8fa4ce272bbf797d422
parent fef9eb22a304c90e4aed9a94978a8efe6c13fb26
Author: Anders Damsgaard <[email protected]>
Date: Sun, 28 Mar 2021 09:22:21 +0200
gather headers in granular.h, rename np to ng, split operations on grain arrays
Diffstat:
M arrays.h | 2 ++
M grain.c | 1 -
A grains.c | 128 +++++++++++++++++++++++++++++…
A grains.h | 12 ++++++++++++
M granular.c | 4 ++--
M granular.h | 7 +++++++
M granular2vtu.c | 2 +-
M granularpacking.c | 9 +++------
M packing.c | 38 ++++++++++++++++-------------…
M simulation.c | 132 +++++++----------------------…
M simulation.h | 9 +++++----
11 files changed, 208 insertions(+), 136 deletions(-)
---
diff --git a/arrays.h b/arrays.h
t@@ -1,6 +1,8 @@
#ifndef ARRAYS_
#define ARRAYS_
+#include <stdio.h>
+
unsigned int idx3(
const unsigned int i, const unsigned int j, const unsigned int k,
const unsigned int nx, const unsigned int ny);
diff --git a/grain.c b/grain.c
t@@ -279,4 +279,3 @@ grain_kinetic_energy(const struct grain *g)
return grain_translational_kinetic_energy(g) +
grain_rotational_kinetic_energy(g);
}
-
diff --git a/grains.c b/grains.c
t@@ -0,0 +1,128 @@
+#include <stdio.h>
+#include <math.h>
+#include "grain.h"
+
+#define VTK_FLOAT_FMT "%.17g "
+
+#define VTK_XML_SCALAR(M, N, T, F) \
+ fprintf(stream,\
+ "\t\t\t\t<DataArray type=\"" T "\" Name=\"" N "\" "\
+ "NumberOfComponents=\"1\" format=\"ascii\">\n");\
+ for (i = 0; i < ng; i++)\
+ fprintf(stream, F, grains[i].M);\
+ fprintf(stream, "\n\t\t\t\t</DataArray>\n");
+
+#define VTK_XML_VECTOR(M, N, T, F) \
+ fprintf(stream,\
+ "\t\t\t\t<DataArray type=\"" T "\" Name=\"" N "\" "\
+ "NumberOfComponents=\"3\" format=\"ascii\">\n");\
+ for (i = 0; i < ng; i++)\
+ for (d = 0; d < 3; d++)\
+ fprintf(stream, F, grains[i].M[d]);\
+ fprintf(stream, "\n\t\t\t\t</DataArray>\n");
+
+void
+grains_print(FILE *stream, const struct grain *grains, size_t ng)
+{
+ size_t i;
+
+ for (i = 0; i < ng; i++)
+ grain_print(stream, &grains[i]);
+}
+
+void
+grains_print_vtk(FILE *stream, const struct grain *grains, size_t ng)
+{
+ size_t i, d;
+
+ fprintf(stream,
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+ "<VTKFile type=\"UnstructuredGrid\" version=\"1.0\" "
+ "byte_order=\"LittleEndian\">\n"
+ "\t<UnstructuredGrid>\n"
+ "\t\t<Piece NumberOfPoints=\"%zu\" NumberOfCells=\"0\">\n", ng…
+ fprintf(stream, "\t\t\t<Points>\n");
+ VTK_XML_VECTOR(pos, "Position [m]", "Float64", VTK_FLOAT_FMT);
+ fprintf(stream, "\t\t\t</Points>\n");
+
+ fprintf(stream,
+ "\t\t\t<Cells>\n"
+ "\t\t\t\t<DataArray type=\"Int32\" Name=\"connectivity\" "
+ "NumberOfComponents=\"1\" format=\"ascii\"/>\n"
+ "\t\t\t\t<DataArray type=\"Int32\" Name=\"offsets\" "
+ "NumberOfComponents=\"1\" format=\"ascii\"/>\n"
+ "\t\t\t\t<DataArray type=\"UInt8\" Name=\"types\" "
+ "NumberOfComponents=\"1\" format=\"ascii\"/>\n"
+ "\t\t\t</Cells>\n");
+
+ fprintf(stream,
+ "\t\t\t<PointData Scalars=\"Diameter [m]\" "
+ "Vectors=\"Angular position [-]\">\n");
+
+ fprintf(stream,
+ "\t\t\t\t<DataArray type=\"Float64\" Name=\"Diameter [m]\" "
+ "NumberOfComponents=\"1\" format=\"ascii\">\n");
+ for (i = 0; i < ng; i++)
+ fprintf(stream, VTK_FLOAT_FMT, grains[i].radius * 2.0);
+ fprintf(stream,
+ "\n"
+ "\t\t\t\t</DataArray>\n");
+
+ VTK_XML_VECTOR(vel, "Velocity [m/s]", "Float64", VTK_FLOAT_FMT);
+ VTK_XML_VECTOR(acc, "Acceleration [m/s^2]", "Float64", VTK_FLOAT_FMT);
+ VTK_XML_VECTOR(force, "Force [N]", "Float64", VTK_FLOAT_FMT);
+ VTK_XML_VECTOR(angpos, "Angular position [rad]", "Float64", VTK_FLOAT_…
+ VTK_XML_VECTOR(angvel, "Angular velocity [rad/s]", "Float64", VTK_FLOA…
+ VTK_XML_VECTOR(angacc, "Angular acceleration [rad/s^2]", "Float64", VT…
+ VTK_XML_VECTOR(torque, "Torque [N/m]", "Float64", VTK_FLOAT_FMT);
+ VTK_XML_VECTOR(disp, "Displacement [m]", "Float64", VTK_FLOAT_FMT);
+ VTK_XML_VECTOR(forceext, "External body force [N]", "Float64", VTK_FLO…
+ VTK_XML_SCALAR(density, "Density [kg/m^3]", "Float64", VTK_FLOAT_FMT);
+ VTK_XML_SCALAR(fixed, "Fixed [-]", "Int64", "%d ");
+ VTK_XML_SCALAR(rotating, "Rotating [-]", "Int64", "%d ");
+ VTK_XML_SCALAR(enabled, "Enabled [-]", "Int64", "%d ");
+ VTK_XML_SCALAR(youngs_modulus, "Young's modulus [Pa]", "Float64", VTK_…
+ VTK_XML_SCALAR(poissons_ratio, "Poisson's ratio [-]", "Float64", VTK_F…
+ VTK_XML_SCALAR(friction_coeff, "Friction coefficient [-]", "Float64", …
+ VTK_XML_SCALAR(tensile_strength, "Tensile strength [Pa]", "Float64", V…
+ VTK_XML_SCALAR(shear_strength, "Shear strength [Pa]", "Float64", VTK_F…
+ VTK_XML_SCALAR(fracture_toughness, "Fracture toughness [Pa]", "Float64…
+ VTK_XML_VECTOR(gridpos, "Grid position [-]", "UInt64", "%zu ");
+ VTK_XML_SCALAR(ncontacts, "Number of contacts [-]", "UInt64", "%zu ");
+ VTK_XML_VECTOR(contact_stress, "Contact stress [Pa]", "Float64", VTK_F…
+ VTK_XML_SCALAR(thermal_energy, "Thermal energy [J]", "Float64", VTK_FL…
+ VTK_XML_SCALAR(color, "Color [-]", "Int64", "%d ");
+
+ fprintf(stream, "\t\t\t</PointData>\n");
+
+ fprintf(stream,
+ "\t\t</Piece>\n"
+ "\t</UnstructuredGrid>\n"
+ "</VTKFile>\n");
+}
+
+double
+grains_minimum_grain_edge(const struct grain *grains, size_t ng, int d)
+{
+ size_t i;
+ double res = INFINITY;
+
+ for (i = 0; i < ng; i++)
+ if (res > grains[i].pos[d] - grains[i].radius)
+ res = grains[i].pos[d] - grains[i].radius;
+
+ return res;
+}
+
+double
+grains_maximum_grain_edge(const struct grain *grains, size_t ng, int d)
+{
+ size_t i;
+ double res = -INFINITY;
+
+ for (i = 0; i < ng; i++)
+ if (res < grains[i].pos[d] + grains[i].radius)
+ res = grains[i].pos[d] + grains[i].radius;
+
+ return res;
+}
diff --git a/grains.h b/grains.h
t@@ -0,0 +1,12 @@
+#ifndef GRANULAR_GRAINS_
+#define GRANULAR_GRAINS_
+
+#include "grain.h"
+
+void grains_print(FILE *stream, const struct grain *grains, size_t ng);
+void grains_print_vtk(FILE *stream, const struct grain *grains, size_t ng);
+
+double sim_minimum_grain_edge(const struct grain *grains, size_t ng, int d);
+double sim_maximum_grain_edge(const struct grain *grains, size_t ng, int d);
+
+#endif
diff --git a/granular.c b/granular.c
t@@ -1,7 +1,7 @@
#include <stdlib.h>
#include <err.h>
#include <unistd.h>
-#include "simulation.h"
+#include "granular.h"
#include "arg.h"
char *argv0;
t@@ -42,7 +42,7 @@ main(int argc, char *argv[])
usage();
break;
case 'I':
- sim.file_dt = atof(EARGF(usage()));
+ sim.dt_file = atof(EARGF(usage()));
break;
case 'j':
sim.dt = atof(EARGF(usage()));
diff --git a/granular.h b/granular.h
t@@ -1,6 +1,13 @@
#ifndef GRANULAR_
#define GRANULAR_
+#include "arrays.h"
+#include "grain.h"
+#include "grains.h"
+#include "packing.h"
+#include "simulation.h"
+#include "util.h"
+
#define PI 3.14159265358979323846
#define DEG2RAD(x) (x*PI/180.0)
diff --git a/granular2vtu.c b/granular2vtu.c
t@@ -1,7 +1,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <err.h>
-#include "simulation.h"
+#include "granular.h"
int
main(void)
diff --git a/granularpacking.c b/granularpacking.c
t@@ -1,10 +1,7 @@
#include <stdlib.h>
#include <stdlib.h>
#include <err.h>
-#include "packing.h"
-#include "simulation.h"
-#include "arrays.h"
-#include "util.h"
+#include "granular.h"
#include "arg.h"
char *argv0;
t@@ -83,12 +80,12 @@ main(int argc, char *argv[])
switch (packing) {
case 0:
- sim.np += rectangular_packing(&sim.grains, n,
+ sim.ng += rectangular_packing(&sim.grains, n,
d_min / 2.0, d_max / 2.0,
sizefunc, padding, origo);
break;
case 1:
- sim.np += triangular_packing(&sim.grains, n,
+ sim.ng += triangular_packing(&sim.grains, n,
d_min / 2.0, d_max / 2.0,
sizefunc, padding, origo);
break;
diff --git a/packing.c b/packing.c
t@@ -15,7 +15,7 @@ rectangular_packing(struct grain **grains,
double padding_factor,
double origo[3])
{
- size_t i, j, k, l, np, N = 0;
+ size_t i, j, k, l, ng, N = 0;
double dx_padding = radius_max * 2.0 * padding_factor;
double dx = radius_max * 2.0 + dx_padding;
t@@ -30,18 +30,18 @@ rectangular_packing(struct grain **grains,
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_…
- (*grains)[np].pos[0] = i * dx + 0.5 * dx + ori…
- (*grains)[np].pos[1] = j * dx + 0.5 * dx + ori…
- (*grains)[np].pos[2] = k * dx + 0.5 * dx + ori…
+ ng = idx3(i, j, k, n[0], n[1]);
+ grain_defaults(&(*grains)[ng]);
+ (*grains)[ng].radius = gsd(radius_min, radius_…
+ (*grains)[ng].pos[0] = i * dx + 0.5 * dx + ori…
+ (*grains)[ng].pos[1] = j * dx + 0.5 * dx + ori…
+ (*grains)[ng].pos[2] = k * dx + 0.5 * dx + ori…
for (l = 0; l < 3; l++)
- (*grains)[np].pos[l] +=
+ (*grains)[ng].pos[l] +=
random_value_uniform(-0.5 * dx…
0.5 * dx_…
#ifdef VERBOSE
- printf("added grain %zu\n", np);
+ printf("added grain %zu\n", ng);
#endif
}
t@@ -56,7 +56,7 @@ triangular_packing(struct grain **grains,
double padding_factor,
double origo[3])
{
- size_t i, j, k, l, np, N = 0;
+ size_t i, j, k, l, ng, 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);
t@@ -72,20 +72,20 @@ triangular_packing(struct grain **grains,
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_…
- (*grains)[np].pos[0] = i * dx + 0.5 * dx + ori…
+ ng = idx3(i, j, k, n[0], n[1]);
+ grain_defaults(&(*grains)[ng]);
+ (*grains)[ng].radius = gsd(radius_min, radius_…
+ (*grains)[ng].pos[0] = i * dx + 0.5 * dx + ori…
if (j % 2 == 0)
- (*grains)[np].pos[0] += 0.5 * dx;
- (*grains)[np].pos[1] = j * dy + 0.5 * dx + ori…
- (*grains)[np].pos[2] = k * dx + 0.5 * dx + ori…
+ (*grains)[ng].pos[0] += 0.5 * dx;
+ (*grains)[ng].pos[1] = j * dy + 0.5 * dx + ori…
+ (*grains)[ng].pos[2] = k * dx + 0.5 * dx + ori…
for (l = 0; l < 2; l++)
- (*grains)[np].pos[l] +=
+ (*grains)[ng].pos[l] +=
random_value_uniform(-0.5 * dx…
…
#ifdef VERBOSE
- printf("added grain %zu\n", np);
+ printf("added grain %zu\n", ng);
#endif
}
diff --git a/simulation.c b/simulation.c
t@@ -7,29 +7,11 @@
#include <err.h>
#include <string.h>
#include "grain.h"
+#include "grains.h"
#include "simulation.h"
#include "arrays.h"
#include "util.h"
-#define VTK_FLOAT_FMT "%.17g "
-
-#define VTK_XML_SCALAR(M, N, T, F) \
- fprintf(stream,\
- "\t\t\t\t<DataArray type=\"" T "\" Name=\"" N "\" "\
- "NumberOfComponents=\"1\" format=\"ascii\">\n");\
- for (i = 0; i < n; i++)\
- fprintf(stream, F, grains[i].M);\
- fprintf(stream, "\n\t\t\t\t</DataArray>\n");
-
-#define VTK_XML_VECTOR(M, N, T, F) \
- fprintf(stream,\
- "\t\t\t\t<DataArray type=\"" T "\" Name=\"" N "\" "\
- "NumberOfComponents=\"3\" format=\"ascii\">\n");\
- for (i = 0; i < n; i++)\
- for (d = 0; d < 3; d++)\
- fprintf(stream, F, grains[i].M[d]);\
- fprintf(stream, "\n\t\t\t\t</DataArray>\n");
-
struct simulation
sim_new(void)
{
t@@ -44,7 +26,7 @@ sim_defaults(struct simulation *sim)
size_t i;
snprintf(sim->name, sizeof(sim->name), DEFAULT_SIMULATION_NAME);
- sim->np = 0;
+ sim->ng = 0;
for (i = 0; i < 3; i++) {
sim->constacc[i] = 0.0;
sim->nd[i] = 1;
t@@ -54,9 +36,11 @@ sim_defaults(struct simulation *sim)
sim->t = 0.0;
sim->t_end = 0.0;
sim->dt = 0.0;
- sim->file_dt = 1.0;
+ sim->dt_file = 1.0;
sim->n_file = 0;
- sim->np = 0;
+ sim->iter = 0;
+ sim->t_file = 0;
+ sim->ng = 0;
sim->grains = NULL;
}
t@@ -65,15 +49,15 @@ sim_free(struct simulation *sim)
{
free(sim->grains);
sim->grains = NULL;
- sim->np = 0;
+ sim->ng = 0;
}
void
sim_add_grain(struct simulation *sim, struct grain *g)
{
- if (!(sim->grains = xreallocarray(sim->grains, sim->np + 1, sizeof(*g)…
+ if (!(sim->grains = xreallocarray(sim->grains, sim->ng + 1, sizeof(*g)…
err(1, "%s: sim.grains reallocarray", __func__);
- sim->grains[sim->np++] = *g;
+ sim->grains[sim->ng++] = *g;
free(g);
}
t@@ -91,98 +75,40 @@ sim_read_grains(struct simulation *sim, FILE *stream)
}
void
-print_grains(FILE *stream, const struct grain *grains, size_t n)
+sim_print_grains(FILE *stream, const struct simulation *sim)
{
- size_t i;
-
- for (i = 0; i < n; i++)
- grain_print(stream, &grains[i]);
+ grains_print(stream, sim->grains, sim->ng);
}
void
-sim_print_grains(FILE *stream, const struct simulation *sim)
+sim_print_grains_vtk(FILE *stream, const struct simulation *sim)
{
- print_grains(stream, sim->grains, sim->np);
+ grains_print_vtk(stream, sim->grains, sim->ng);
}
void
-print_grains_vtk(FILE *stream, const struct grain *grains, size_t n)
+sim_step_time(struct simulation *sim)
{
- size_t i, d;
-
- fprintf(stream,
- "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
- "<VTKFile type=\"UnstructuredGrid\" version=\"1.0\" "
- "byte_order=\"LittleEndian\">\n"
- "\t<UnstructuredGrid>\n"
- "\t\t<Piece NumberOfPoints=\"%zu\" NumberOfCells=\"0\">\n", n);
- fprintf(stream, "\t\t\t<Points>\n");
- VTK_XML_VECTOR(pos, "Position [m]", "Float64", VTK_FLOAT_FMT);
- fprintf(stream, "\t\t\t</Points>\n");
-
- fprintf(stream,
- "\t\t\t<Cells>\n"
- "\t\t\t\t<DataArray type=\"Int32\" Name=\"connectivity\" "
- "NumberOfComponents=\"1\" format=\"ascii\"/>\n"
- "\t\t\t\t<DataArray type=\"Int32\" Name=\"offsets\" "
- "NumberOfComponents=\"1\" format=\"ascii\"/>\n"
- "\t\t\t\t<DataArray type=\"UInt8\" Name=\"types\" "
- "NumberOfComponents=\"1\" format=\"ascii\"/>\n"
- "\t\t\t</Cells>\n");
-
- fprintf(stream,
- "\t\t\t<PointData Scalars=\"Diameter [m]\" "
- "Vectors=\"Angular position [-]\">\n");
-
- fprintf(stream,
- "\t\t\t\t<DataArray type=\"Float64\" Name=\"Diameter [m]\" "
- "NumberOfComponents=\"1\" format=\"ascii\">\n");
- for (i = 0; i < n; i++)
- fprintf(stream, VTK_FLOAT_FMT, grains[i].radius * 2.0);
- fprintf(stream,
- "\n"
- "\t\t\t\t</DataArray>\n");
-
- VTK_XML_VECTOR(vel, "Velocity [m/s]", "Float64", VTK_FLOAT_FMT);
- VTK_XML_VECTOR(acc, "Acceleration [m/s^2]", "Float64", VTK_FLOAT_FMT);
- VTK_XML_VECTOR(force, "Force [N]", "Float64", VTK_FLOAT_FMT);
- VTK_XML_VECTOR(angpos, "Angular position [rad]", "Float64", VTK_FLOAT_…
- VTK_XML_VECTOR(angvel, "Angular velocity [rad/s]", "Float64", VTK_FLOA…
- VTK_XML_VECTOR(angacc, "Angular acceleration [rad/s^2]", "Float64", VT…
- VTK_XML_VECTOR(torque, "Torque [N/m]", "Float64", VTK_FLOAT_FMT);
- VTK_XML_VECTOR(disp, "Displacement [m]", "Float64", VTK_FLOAT_FMT);
- VTK_XML_VECTOR(forceext, "External body force [N]", "Float64", VTK_FLO…
- VTK_XML_SCALAR(density, "Density [kg/m^3]", "Float64", VTK_FLOAT_FMT);
- VTK_XML_SCALAR(fixed, "Fixed [-]", "Int64", "%d ");
- VTK_XML_SCALAR(rotating, "Rotating [-]", "Int64", "%d ");
- VTK_XML_SCALAR(enabled, "Enabled [-]", "Int64", "%d ");
- VTK_XML_SCALAR(youngs_modulus, "Young's modulus [Pa]", "Float64", VTK_…
- VTK_XML_SCALAR(poissons_ratio, "Poisson's ratio [-]", "Float64", VTK_F…
- VTK_XML_SCALAR(friction_coeff, "Friction coefficient [-]", "Float64", …
- VTK_XML_SCALAR(tensile_strength, "Tensile strength [Pa]", "Float64", V…
- VTK_XML_SCALAR(shear_strength, "Shear strength [Pa]", "Float64", VTK_F…
- VTK_XML_SCALAR(fracture_toughness, "Fracture toughness [Pa]", "Float64…
- VTK_XML_VECTOR(gridpos, "Grid position [-]", "UInt64", "%zu ");
- VTK_XML_SCALAR(ncontacts, "Number of contacts [-]", "UInt64", "%zu ");
- VTK_XML_VECTOR(contact_stress, "Contact stress [Pa]", "Float64", VTK_F…
- VTK_XML_SCALAR(thermal_energy, "Thermal energy [J]", "Float64", VTK_FL…
- VTK_XML_SCALAR(color, "Color [-]", "Int64", "%d ");
-
- fprintf(stream, "\t\t\t</PointData>\n");
+ size_t i;
- fprintf(stream,
- "\t\t</Piece>\n"
- "\t</UnstructuredGrid>\n"
- "</VTKFile>\n");
-}
+ for (i = 0; i < sim->ng; i++) {
+ /* sim_detect_contacts(sim); */
+ /* sim_resolve_interactions(sim); */
+ /* grain_temporal_integration(sim->g[i], sim->dt); */
+ }
-void
-sim_print_grains_vtk(FILE *stream, const struct simulation *sim)
-{
- print_grains_vtk(stream, sim->grains, sim->np);
+ sim->t += sim->dt;
+ sim->t_file += sim->dt;
+ sim->iter++;
}
void
sim_run_time_loop(struct simulation *sim)
{
+ if (sim->dt > sim->dt_file)
+ sim->dt = sim->dt_file;
+
+ do {
+ sim_step_time(sim);
+ } while (sim->t - sim->dt < sim->t_end);
}
diff --git a/simulation.h b/simulation.h
t@@ -24,11 +24,13 @@ struct simulation {
double t;
double t_end;
double dt;
- double file_dt;
+ double dt_file;
size_t n_file;
+ size_t iter;
+ double t_file;
/* grains */
- size_t np;
+ size_t ng;
struct grain *grains;
};
t@@ -39,11 +41,10 @@ void sim_free(struct simulation *sim);
void sim_add_grain(struct simulation *sim, struct grain *g);
void sim_read_grains(struct simulation *sim, FILE *stream);
-void print_grains(FILE *stream, const struct grain *grains, size_t n);
void sim_print_grains(FILE *stream, const struct simulation *sim);
-void print_grains_vtk(FILE *stream, const struct grain *grains, size_t n);
void sim_print_grains_vtk(FILE *stream, const struct simulation *sim);
+void sim_step_time(struct simulation *sim);
void sim_run_time_loop(struct simulation *sim);
#endif
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.