Introduction
Introduction Statistics Contact Development Disclaimer Help
tfixed fatal bug in how threads return if outside of the grid - sphere - GPU-ba…
git clone git://src.adamsgaard.dk/sphere
Log
Files
Refs
LICENSE
---
commit 27f9122518041ed1ed936e25643d2f9f61cc8100
parent dcc2ab859cc3baaf0e40a897b221081f8e52364b
Author: Anders Damsgaard <[email protected]>
Date: Wed, 9 Oct 2013 11:10:54 +0200
fixed fatal bug in how threads return if outside of the grid
Diffstat:
M src/cohesion.cuh | 383 +++++++++++++++--------------…
1 file changed, 191 insertions(+), 192 deletions(-)
---
diff --git a/src/cohesion.cuh b/src/cohesion.cuh
t@@ -17,220 +17,219 @@ __global__ void bondsLinear(
{
// Find thread index
unsigned int idx = blockIdx.x * blockDim.x + threadIdx.x;
- if (idx >= devC_params.nb0)
- return;
+ if (idx < devC_params.nb0) {
+ //// Read values
- //// Read values
-
- // Read bond data
- __syncthreads();
- const uint2 bond = dev_bonds[idx]; // Particle indexes in bond pair
-
- // Check if the bond has been erased
- if (bond.x >= devC_np)
- return;
-
- const Float4 delta0_4 = dev_bonds_delta[idx];
- const Float4 omega0_4 = dev_bonds_omega[idx];
+ // Read bond data
+ __syncthreads();
+ const uint2 bond = dev_bonds[idx]; // Particle indexes in bond pair
- // Convert tangential vectors to Float3's
- // Uncorrected tangential component of displacement
- Float3 delta0_t = MAKE_FLOAT3(
- delta0_4.x,
- delta0_4.y,
- delta0_4.z);
- const Float delta0_n = delta0_4.w;
+ // Check if the bond has been erased
+ if (bond.x < devC_np) {
- // Uncorrected tangential component of rotation
- Float3 omega0_t = MAKE_FLOAT3(
- omega0_4.x,
- omega0_4.y,
- omega0_4.z);
- const Float omega0_n = omega0_4.w;
+ const Float4 delta0_4 = dev_bonds_delta[idx];
+ const Float4 omega0_4 = dev_bonds_omega[idx];
- // Read particle data
- const Float4 x_i = dev_x[bond.x];
- const Float4 x_j = dev_x[bond.y];
- const Float4 vel_i = dev_vel[bond.x];
- const Float4 vel_j = dev_vel[bond.y];
- const Float4 angvel4_i = dev_angvel[bond.x];
- const Float4 angvel4_j = dev_angvel[bond.y];
+ // Convert tangential vectors to Float3's
+ // Uncorrected tangential component of displacement
+ Float3 delta0_t = MAKE_FLOAT3(
+ delta0_4.x,
+ delta0_4.y,
+ delta0_4.z);
+ const Float delta0_n = delta0_4.w;
- const Float3 angvel_i = MAKE_FLOAT3(angvel4_i.x, angvel4_i.y, angvel4_i.z);
- const Float3 angvel_j = MAKE_FLOAT3(angvel4_j.x, angvel4_j.y, angvel4_j.z);
+ // Uncorrected tangential component of rotation
+ Float3 omega0_t = MAKE_FLOAT3(
+ omega0_4.x,
+ omega0_4.y,
+ omega0_4.z);
+ const Float omega0_n = omega0_4.w;
+ // Read particle data
+ const Float4 x_i = dev_x[bond.x];
+ const Float4 x_j = dev_x[bond.y];
+ const Float4 vel_i = dev_vel[bond.x];
+ const Float4 vel_j = dev_vel[bond.y];
+ const Float4 angvel4_i = dev_angvel[bond.x];
+ const Float4 angvel4_j = dev_angvel[bond.y];
- //// Bond geometry and inertia
+ const Float3 angvel_i = MAKE_FLOAT3(angvel4_i.x, angvel4_i.y, angv…
+ const Float3 angvel_j = MAKE_FLOAT3(angvel4_j.x, angvel4_j.y, angv…
- // Parallel-bond radius (Potyondy and Cundall 2004, eq. 12)
- const Float R_bar = devC_params.lambda_bar * fmin(x_i.w, x_j.w);
- // Bond cross section area (Potyondy and Cundall 2004, eq. 15)
- const Float A = PI * R_bar*R_bar;
+ //// Bond geometry and inertia
- // Bond moment of inertia (Potyondy and Cundall 2004, eq. 15)
- const Float I = 0.25 * PI * R_bar*R_bar*R_bar*R_bar;
+ // Parallel-bond radius (Potyondy and Cundall 2004, eq. 12)
+ const Float R_bar = devC_params.lambda_bar * fmin(x_i.w, x_j.w);
- // Bond polar moment of inertia (Potyondy and Cundall 2004, eq. 15)
- //const Float J = 0.50 * PI * R_bar*R_bar*R_bar*R_bar;
- const Float J = I*2.0;
+ // Bond cross section area (Potyondy and Cundall 2004, eq. 15)
+ const Float A = PI * R_bar*R_bar;
- // Inter-particle vector
- const Float3 x = MAKE_FLOAT3(
- x_i.x - x_j.x,
- x_i.y - x_j.y,
- x_i.z - x_j.z);
- const Float x_length = length(x);
+ // Bond moment of inertia (Potyondy and Cundall 2004, eq. 15)
+ const Float I = 0.25 * PI * R_bar*R_bar*R_bar*R_bar;
- // Find overlap (negative value if overlapping)
- const Float overlap = fmin(0.0, x_length - (x_i.w + x_j.w));
-
- // Normal vector of contact (points from i to j)
- Float3 n = x/x_length;
-
-
- //// Force
-
- // Correct tangential displacement vector for rotation of the contact plane
- //const Float3 delta_t0 = delta_t0_uncor - dot(delta_t0_uncor, n);
- delta0_t = delta0_t - (n * dot(n, delta0_t));
-
- // Contact displacement, Luding 2008 eq. 10
- const Float3 ddelta = (
- MAKE_FLOAT3(
- vel_i.x - vel_j.x,
- vel_i.y - vel_j.y,
- vel_i.z - vel_j.z)
- + (x_i.w + overlap/2.0) * cross(n, angvel_i)
- + (x_j.w + overlap/2.0) * cross(n, angvel_j)
- ) * devC_dt;
+ // Bond polar moment of inertia (Potyondy and Cundall 2004, eq. 15)
+ //const Float J = 0.50 * PI * R_bar*R_bar*R_bar*R_bar;
+ const Float J = I*2.0;
- // Normal component of the displacement increment
- //const Float ddelta_n = dot(ddelta, n);
- const Float ddelta_n = -dot(ddelta, n);
+ // Inter-particle vector
+ const Float3 x = MAKE_FLOAT3(
+ x_i.x - x_j.x,
+ x_i.y - x_j.y,
+ x_i.z - x_j.z);
+ const Float x_length = length(x);
+
+ // Find overlap (negative value if overlapping)
+ const Float overlap = fmin(0.0, x_length - (x_i.w + x_j.w));
+
+ // Normal vector of contact (points from i to j)
+ Float3 n = x/x_length;
+
+
+ //// Force
+
+ // Correct tangential displacement vector for rotation of the cont…
+ //const Float3 delta_t0 = delta_t0_uncor - dot(delta_t0_uncor, n);
+ delta0_t = delta0_t - (n * dot(n, delta0_t));
+
+ // Contact displacement, Luding 2008 eq. 10
+ const Float3 ddelta = (
+ MAKE_FLOAT3(
+ vel_i.x - vel_j.x,
+ vel_i.y - vel_j.y,
+ vel_i.z - vel_j.z)
+ + (x_i.w + overlap/2.0) * cross(n, angvel_i)
+ + (x_j.w + overlap/2.0) * cross(n, angvel_j)
+ ) * devC_dt;
+
+ // Normal component of the displacement increment
+ //const Float ddelta_n = dot(ddelta, n);
+ const Float ddelta_n = -dot(ddelta, n);
- // Normal component of the total displacement
- const Float delta_n = delta0_n + ddelta_n;
+ // Normal component of the total displacement
+ const Float delta_n = delta0_n + ddelta_n;
- // Tangential component of the displacement increment
- // Luding 2008, eq. 9
- const Float3 ddelta_t = ddelta - n * dot(n, ddelta);
+ // Tangential component of the displacement increment
+ // Luding 2008, eq. 9
+ const Float3 ddelta_t = ddelta - n * dot(n, ddelta);
- // Tangential component of the total displacement
- const Float3 delta_t = delta0_t + ddelta_t;
-
- // Normal force: Visco-elastic contact model
- // The elastic component caused by the overlap is subtracted.
- //f_n = devC_params.k_n * A * delta_n * n;
- const Float3 f_n = (devC_params.k_n * A * delta_n + devC_params.gamma_n * …
- //f_n += devC_params.k_n * overlap * n;
-
-
- // Tangential force: Visco-elastic contact model
- //f_t = -devC_params.k_t * A * delta_t;
- const Float3 f_t = -devC_params.k_t * A * delta_t - devC_params.gamma_t * …
-
- // Force vector
- const Float3 f = f_n + f_t;
-
-
- //// Torque
-
- // Correct tangential rotational vector for rotation of the contact plane
- omega0_t = omega0_t - (-n) * dot(omega0_t, -n);
- //omega0_t = omega0_t - (n * dot(n, omega0_t));
-
- // Contact rotational velocity
- Float3 domega = MAKE_FLOAT3(
- angvel_j.x - angvel_i.x,
- angvel_j.y - angvel_i.y,
- angvel_j.z - angvel_i.z) * devC_dt;
- /*const Float3 domega = MAKE_FLOAT3(
- angvel_i.x - angvel_j.x,
- angvel_i.y - angvel_j.y,
- angvel_i.z - angvel_j.z) * devC_dt;*/
-
- // Normal component of the rotational increment
- const Float domega_n = dot(domega, -n);
- //const Float domega_n = dot(-n, domega);
- //const Float domega_n = -dot(n, domega);
+ // Tangential component of the total displacement
+ const Float3 delta_t = delta0_t + ddelta_t;
- // Normal component of the total rotation
- const Float omega_n = omega0_n + domega_n;
+ // Normal force: Visco-elastic contact model
+ // The elastic component caused by the overlap is subtracted.
+ //f_n = devC_params.k_n * A * delta_n * n;
+ const Float3 f_n = (devC_params.k_n * A * delta_n + devC_params.ga…
+ //f_n += devC_params.k_n * overlap * n;
+
+
+ // Tangential force: Visco-elastic contact model
+ //f_t = -devC_params.k_t * A * delta_t;
+ const Float3 f_t = -devC_params.k_t * A * delta_t - devC_params.ga…
+
+ // Force vector
+ const Float3 f = f_n + f_t;
+
+
+ //// Torque
+
+ // Correct tangential rotational vector for rotation of the contac…
+ omega0_t = omega0_t - (-n) * dot(omega0_t, -n);
+ //omega0_t = omega0_t - (n * dot(n, omega0_t));
+
+ // Contact rotational velocity
+ Float3 domega = MAKE_FLOAT3(
+ angvel_j.x - angvel_i.x,
+ angvel_j.y - angvel_i.y,
+ angvel_j.z - angvel_i.z) * devC_dt;
+ /*const Float3 domega = MAKE_FLOAT3(
+ angvel_i.x - angvel_j.x,
+ angvel_i.y - angvel_j.y,
+ angvel_i.z - angvel_j.z) * devC_dt;*/
+
+ // Normal component of the rotational increment
+ const Float domega_n = dot(domega, -n);
+ //const Float domega_n = dot(-n, domega);
+ //const Float domega_n = -dot(n, domega);
- // Tangential component of the rotational increment
- //const Float3 domega_t = domega - (-n) * dot(domega, -n);
- const Float3 domega_t = domega - domega_n * (-n);
- //const Float3 domega_t = domega - n * dot(n, domega);
-
- // Tangential component of the total rotation
- const Float3 omega_t = omega0_t + domega_t;
-
- // Twisting torque: Visco-elastic contact model
- //const Float3 t_n = -devC_params.k_t * J * omega_n * n;
- const Float3 t_n = -devC_params.k_t * J * omega_n * -n;
- //t_n = devC_params.k_t * J * omega_n * n;
- //t_n = (devC_params.k_t * J * omega_n + devC_params.gamma_t * domega_n/de…
-
- // Bending torque: Visco-elastic contact model
- //t_t = -devC_params.k_n * I * omega_t;
- //const Float3 t_t = devC_params.k_n * I * omega_t;
- const Float3 t_t = -devC_params.k_n * I * omega_t;
- //t_t = -devC_params.k_n * I * omega_t - devC_params.gamma_n * domega_t/de…
- //t_t = devC_params.k_n * I * omega_t - devC_params.gamma_n * domega_t/dev…
-
- // Torque vector
- //t = t_n + t_t;
- //Float3 t_i = t_n + cross(-(x_i.w + overlap*0.5) * n, t_t);
- //Float3 t_j = t_n + cross(-(x_j.w + overlap*0.5) * n, t_t);
- //const Float3 t_i = t_n + cross(-(x_i.w + overlap*0.5) * n, f_t + t_t);
- //const Float3 t_j = t_n + cross(-(x_j.w + overlap*0.5) * n, f_t - t_t);
- const Float3 t_j = t_n + t_t;
- //const Float3 t_i = t_n - t_t; //t_n - t_t;
- //const Float3 t_j = t_n + t_t;
-
-
- //// Bond strength (Potyondy & Cundall 2004)
- // Extensions of Euler-Bernoulli beam bending theory
- // Max. stresses in bond periphery
-
- // Tensile stress
- const Float sigma_max = length(f_n) / A + length(t_t) * R_bar / I;
-
- // Shear stress
- const Float tau_max = length(f_t) / A + length(t_n) * R_bar / J;
-
- // Break bond if tensile and shear stresses exceed strengths
- if (sigma_max >= devC_params.sigma_b || tau_max >= devC_params.tau_b) {
- __syncthreads();
- dev_bonds[idx].x = devC_params.nb0;
- return;
+ // Normal component of the total rotation
+ const Float omega_n = omega0_n + domega_n;
+
+ // Tangential component of the rotational increment
+ //const Float3 domega_t = domega - (-n) * dot(domega, -n);
+ const Float3 domega_t = domega - domega_n * (-n);
+ //const Float3 domega_t = domega - n * dot(n, domega);
+
+ // Tangential component of the total rotation
+ const Float3 omega_t = omega0_t + domega_t;
+
+ // Twisting torque: Visco-elastic contact model
+ //const Float3 t_n = -devC_params.k_t * J * omega_n * n;
+ const Float3 t_n = -devC_params.k_t * J * omega_n * -n;
+ //t_n = devC_params.k_t * J * omega_n * n;
+ //t_n = (devC_params.k_t * J * omega_n + devC_params.gamma_t * dom…
+
+ // Bending torque: Visco-elastic contact model
+ //t_t = -devC_params.k_n * I * omega_t;
+ //const Float3 t_t = devC_params.k_n * I * omega_t;
+ const Float3 t_t = -devC_params.k_n * I * omega_t;
+ //t_t = -devC_params.k_n * I * omega_t - devC_params.gamma_n * dom…
+ //t_t = devC_params.k_n * I * omega_t - devC_params.gamma_n * dome…
+
+ // Torque vector
+ //t = t_n + t_t;
+ //Float3 t_i = t_n + cross(-(x_i.w + overlap*0.5) * n, t_t);
+ //Float3 t_j = t_n + cross(-(x_j.w + overlap*0.5) * n, t_t);
+ //const Float3 t_i = t_n + cross(-(x_i.w + overlap*0.5) * n, f_t +…
+ //const Float3 t_j = t_n + cross(-(x_j.w + overlap*0.5) * n, f_t -…
+ const Float3 t_j = t_n + t_t;
+ //const Float3 t_i = t_n - t_t; //t_n - t_t;
+ //const Float3 t_j = t_n + t_t;
+
+
+ //// Bond strength (Potyondy & Cundall 2004)
+ // Extensions of Euler-Bernoulli beam bending theory
+ // Max. stresses in bond periphery
+
+ // Tensile stress
+ const Float sigma_max = length(f_n) / A + length(t_t) * R_bar / I;
+
+ // Shear stress
+ const Float tau_max = length(f_t) / A + length(t_n) * R_bar / J;
+
+ // Break bond if tensile and shear stresses exceed strengths
+ if (sigma_max >= devC_params.sigma_b || tau_max >= devC_params.tau…
+ __syncthreads();
+ dev_bonds[idx].x = devC_params.nb0;
+ return;
+ }
+
+
+
+ //// Save values
+ __syncthreads();
+
+ // Save updated displacements in global memory
+ dev_bonds_delta[idx] = MAKE_FLOAT4(delta_t.x, delta_t.y, delta_t.z…
+ dev_bonds_omega[idx] = MAKE_FLOAT4(omega_t.x, omega_t.y, omega_t.z…
+
+ // Save forces and torques to the particle pairs
+ // !!! This is probably wrong, see Obermayer et al. 2013, C & GT (…
+ dev_force[bond.x] += MAKE_FLOAT4(f.x, f.y, f.z, 0.0);
+ dev_force[bond.y] -= MAKE_FLOAT4(f.x, f.y, f.z, 0.0);
+ //dev_torque[bond.x] += MAKE_FLOAT4(t.x, t.y, t.z, 0.0);
+ //dev_torque[bond.y] += MAKE_FLOAT4(t.x, t.y, t.z, 0.0);
+ //dev_torque[bond.x] += MAKE_FLOAT4(t_i.x, t_i.y, t_i.z, 0.0);
+ dev_torque[bond.x] -= MAKE_FLOAT4(t_j.x, t_j.y, t_j.z, 0.0);
+ dev_torque[bond.y] += MAKE_FLOAT4(t_j.x, t_j.y, t_j.z, 0.0);
+ //dev_torque[bond.y] += MAKE_FLOAT4(t_j.x, t_j.y, t_j.z, 0.0);
+ //dev_torque[bond.y] -= MAKE_FLOAT4(t_j.x, t_j.y, t_j.z, 0.0);
+ //dev_torque[bond.y] -= MAKE_FLOAT4(t.x, t.y, t.z, 0.0);
+ // make sure to remove write conflicts
+ }
}
-
-
-
- //// Save values
- __syncthreads();
-
- // Save updated displacements in global memory
- dev_bonds_delta[idx] = MAKE_FLOAT4(delta_t.x, delta_t.y, delta_t.z, delta_…
- dev_bonds_omega[idx] = MAKE_FLOAT4(omega_t.x, omega_t.y, omega_t.z, omega_…
-
- // Save forces and torques to the particle pairs
- // !!! This is probably wrong, see Obermayer et al. 2013, C & GT (49)
- dev_force[bond.x] += MAKE_FLOAT4(f.x, f.y, f.z, 0.0);
- dev_force[bond.y] -= MAKE_FLOAT4(f.x, f.y, f.z, 0.0);
- //dev_torque[bond.x] += MAKE_FLOAT4(t.x, t.y, t.z, 0.0);
- //dev_torque[bond.y] += MAKE_FLOAT4(t.x, t.y, t.z, 0.0);
- //dev_torque[bond.x] += MAKE_FLOAT4(t_i.x, t_i.y, t_i.z, 0.0);
- dev_torque[bond.x] -= MAKE_FLOAT4(t_j.x, t_j.y, t_j.z, 0.0);
- dev_torque[bond.y] += MAKE_FLOAT4(t_j.x, t_j.y, t_j.z, 0.0);
- //dev_torque[bond.y] += MAKE_FLOAT4(t_j.x, t_j.y, t_j.z, 0.0);
- //dev_torque[bond.y] -= MAKE_FLOAT4(t_j.x, t_j.y, t_j.z, 0.0);
- //dev_torque[bond.y] -= MAKE_FLOAT4(t.x, t.y, t.z, 0.0);
- // make sure to remove write conflicts
}
// Linear-elastic bond: Attractive force with normal- and shear components
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.