tgrid.c - slidergrid - grid of elastic sliders on a frictional surface
HTML git clone git://src.adamsgaard.dk/slidergrid
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
tgrid.c (2734B)
---
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "typedefs.h"
4 #include "slider.h"
5 #include "vector_math.h"
6 #include "debug.h"
7
8 slider* create_regular_slider_grid(
9 const int nx,
10 const int ny,
11 const int nz,
12 const Float dx,
13 const Float dy,
14 const Float dz)
15 {
16 slider* sliders;
17 sliders = malloc(sizeof(slider)*nx*ny*nz);
18
19 int i = 0; int ix, iy, iz, j;
20 for (iz = 0; iz < nz; iz++) {
21 for (iy = 0; iy < ny; iy++) {
22 for (ix = 0; ix < nx; ix++) {
23 sliders[i].pos.x = dx * ix;
24 sliders[i].pos.y = dy * iy;
25 sliders[i].pos.z = dz * iz;
26 i++;
27
28 for (j=0; j<MAX_NEIGHBORS; j++)
29 sliders[i].neighbors[j] = -1;
30 }
31 }
32 }
33
34 return sliders;
35 }
36
37 slider* create_regular_slider_grid_with_randomness(
38 const int nx,
39 const int ny,
40 const int nz,
41 const Float dx,
42 const Float dy,
43 const Float dz)
44 {
45 slider* sliders;
46 sliders = malloc(sizeof(slider)*nx*ny*nz);
47
48 int i = 0; int ix, iy, iz, j;
49 for (iz = 0; iz < nz; iz++) {
50 for (iy = 0; iy < ny; iy++) {
51 for (ix = 0; ix < nx; ix++) {
52 sliders[i].pos.x = dx * ix;
53 sliders[i].pos.y = dy * iy;
54 sliders[i].pos.z = dz * iz;
55 i++;
56
57 for (j=0; j<MAX_NEIGHBORS; j++)
58 sliders[i].neighbors[j] = -1;
59 }
60 }
61 }
62
63 return sliders;
64 }
65
66 /* Find neighboring sliders within a defined cutoff distance */
67 void find_and_bond_to_neighbors_n2(
68 slider* sliders,
69 const int N,
70 const Float cutoff)
71 {
72 int i, j, n_neighbors;
73 Float3 dist;
74 Float dist_norm;
75 for (i=0; i<N; i++) {
76 n_neighbors = 0;
77 for (j=0; j<N; j++) {
78 if (i != j) {
79 dist = subtract_float3(sliders[i].pos, sliders[j].pos);
80 dist_norm = norm_float3(dist);
81
82 #ifdef DEBUG_FIND_AND_BOND_TO_NEIGHBORS
83 printf("i=%d, j=%d, dist = %f %f %f, dist_norm = %f, "
84 "cutoff = %f\n",
85 i, j,
86 dist.x, dist.y, dist.z,
87 dist_norm, cutoff);
88 #endif
89
90 if (dist_norm < cutoff) {
91 sliders[i].neighbors[n_neighbors] = j;
92 sliders[i].neighbor_distance[n_neighbors] = dist;
93
94 if (n_neighbors == MAX_NEIGHBORS - 1)
95 fprintf(stderr, "Error: MAX_NEIGHBORS exceeded for "
96 "slider %d.\n", i);
97 n_neighbors++;
98 }
99 }
100 }
101 }
102 }