Introduction
Introduction Statistics Contact Development Disclaimer Help
tuncommented upward differences - sphere - GPU-based 3D discrete element method…
git clone git://src.adamsgaard.dk/sphere
Log
Files
Refs
LICENSE
---
commit 4c82b126bcbb9bddf389a904d7162d147084e07d
parent 1c127a36deb9a4332f35818d424bd02942612594
Author: Anders Damsgaard <[email protected]>
Date: Wed, 23 Apr 2014 15:41:48 +0200
uncommented upward differences
Diffstat:
M src/navierstokes.cuh | 107 +++++++++++++++++++++++++++++…
1 file changed, 106 insertions(+), 1 deletion(-)
---
diff --git a/src/navierstokes.cuh b/src/navierstokes.cuh
t@@ -1132,13 +1132,54 @@ __device__ Float divergence(
// Read 6 neighbor cells
__syncthreads();
const Float3 xn = dev_vectorfield[idx(x-1,y,z)];
+ //const Float3 v = dev_vectorfield[idx(x,y,z)];
const Float3 xp = dev_vectorfield[idx(x+1,y,z)];
const Float3 yn = dev_vectorfield[idx(x,y-1,z)];
const Float3 yp = dev_vectorfield[idx(x,y+1,z)];
const Float3 zn = dev_vectorfield[idx(x,y,z-1)];
const Float3 zp = dev_vectorfield[idx(x,y,z+1)];
- // Calculate the central-difference gradients and divergence
+ // Calculate upwind coefficients
+ /*const Float3 a = MAKE_FLOAT3(
+ copysign(1.0, v.x),
+ copysign(1.0, v.y),
+ copysign(1.0, v.z));
+ const Float a_xn = fmin(a.x, 0);
+ const Float a_xp = fmax(a.x, 0);
+ const Float a_yn = fmin(a.y, 0);
+ const Float a_yp = fmax(a.y, 0);
+ const Float a_zn = fmin(a.z, 0);
+ const Float a_zp = fmax(a.z, 0);
+
+ // Calculate the upwind differences
+ const Float grad_uw_xn = (v.x - xn.x)/dx;
+ const Float grad_uw_xp = (xp.x - v.x)/dx;
+ const Float grad_uw_yn = (v.y - yn.y)/dy;
+ const Float grad_uw_yp = (yp.y - v.y)/dy;
+ const Float grad_uw_zn = (v.z - zn.z)/dz;
+ const Float grad_uw_zp = (zp.z - v.z)/dz;
+
+ const Float3 grad_uw = MAKE_FLOAT3(
+ a_xp*grad_uw_xn + a_xn*grad_uw_xp,
+ a_yp*grad_uw_yn + a_yn*grad_uw_yp,
+ a_zp*grad_uw_zn + a_zn*grad_uw_zp);
+
+ // Calculate the central-difference gradients
+ const Float3 grad_cd = MAKE_FLOAT3(
+ (xp.x - xn.x)/(2.0*dx),
+ (yp.y - yn.y)/(2.0*dy),
+ (zp.z - zn.z)/(2.0*dz));
+
+ // Weighting parameter
+ const Float tau = 0.5;
+
+ // Determine the weighted average of both discretizations
+ const Float3 grad = tau*grad_uw + (1.0 - tau)*grad_cd;
+
+ // Calculate the divergence
+ return grad.x + grad.y + grad.z;*/
+
+ // Calculate the central difference gradrients and the divergence
return
(xp.x - xn.x)/(2.0*dx) +
(yp.y - yn.y)/(2.0*dy) +
t@@ -1357,6 +1398,7 @@ __global__ void findNSdivphiviv(
// Read porosity and velocity in the 6 neighbor cells
__syncthreads();
const Float phi_xn = dev_ns_phi[idx(x-1,y,z)];
+ //const Float phi = dev_ns_phi[idx(x,y,z)];
const Float phi_xp = dev_ns_phi[idx(x+1,y,z)];
const Float phi_yn = dev_ns_phi[idx(x,y-1,z)];
const Float phi_yp = dev_ns_phi[idx(x,y+1,z)];
t@@ -1364,12 +1406,75 @@ __global__ void findNSdivphiviv(
const Float phi_zp = dev_ns_phi[idx(x,y,z+1)];
const Float3 v_xn = dev_ns_v[idx(x-1,y,z)];
+ //const Float3 v = dev_ns_v[idx(x,y,z)];
const Float3 v_xp = dev_ns_v[idx(x+1,y,z)];
const Float3 v_yn = dev_ns_v[idx(x,y-1,z)];
const Float3 v_yp = dev_ns_v[idx(x,y+1,z)];
const Float3 v_zn = dev_ns_v[idx(x,y,z-1)];
const Float3 v_zp = dev_ns_v[idx(x,y,z+1)];
+ // Calculate upwind coefficients
+ /*const Float3 a = MAKE_FLOAT3(
+ copysign(1.0, v.x),
+ copysign(1.0, v.y),
+ copysign(1.0, v.z));
+
+ // Calculate the divergence based on the upwind differences (Griebel et
+ // al. 1998, eq. 3.9)
+ const Float3 div_uw = MAKE_FLOAT3(
+ // x
+ ((1.0 + a.x)*(phi*v.x*v.x - phi_xn*v_xn.x*v_xn.x) +
+ (1.0 - a.x)*(phi_xp*v_xp.x*v_xp.x - phi*v.x*v.x))/(2.0*dx) +
+
+ ((1.0 + a.y)*(phi*v.x*v.y - phi_yn*v_yn.x*v_yn.y) +
+ (1.0 - a.y)*(phi_yp*v_yp.x*v_yp.y - phi*v.x*v.y))/(2.0*dy) +
+
+ ((1.0 + a.z)*(phi*v.x*v.z - phi_zn*v_zn.x*v_zn.z) +
+ (1.0 - a.z)*(phi_zp*v_zp.x*v_zp.z - phi*v.x*v.z))/(2.0*dz),
+
+ // y
+ ((1.0 + a.x)*(phi*v.y*v.x - phi_xn*v_xn.y*v_xn.x) +
+ (1.0 - a.x)*(phi_xp*v_xp.y*v_xp.x - phi*v.y*v.x))/(2.0*dx) +
+
+ ((1.0 + a.y)*(phi*v.y*v.y - phi_yn*v_yn.y*v_yn.y) +
+ (1.0 - a.y)*(phi_yp*v_yp.y*v_yp.y - phi*v.y*v.y))/(2.0*dy) +
+
+ ((1.0 + a.z)*(phi*v.y*v.z - phi_zn*v_zn.y*v_zn.z) +
+ (1.0 - a.z)*(phi_zp*v_zp.y*v_zp.z - phi*v.y*v.z))/(2.0*dz),
+
+ // z
+ ((1.0 + a.x)*(phi*v.z*v.x - phi_xn*v_xn.z*v_xn.x) +
+ (1.0 - a.x)*(phi_xp*v_xp.z*v_xp.x - phi*v.z*v.x))/(2.0*dx) +
+
+ ((1.0 + a.y)*(phi*v.z*v.y - phi_yn*v_yn.z*v_yn.y) +
+ (1.0 - a.y)*(phi_yp*v_yp.z*v_yp.y - phi*v.z*v.y))/(2.0*dy) +
+
+ ((1.0 + a.z)*(phi*v.z*v.z - phi_zn*v_zn.z*v_zn.z) +
+ (1.0 - a.z)*(phi_zp*v_zp.z*v_zp.z - phi*v.z*v.z))/(2.0*dz));
+
+
+ // Calculate the divergence based on the central-difference gradients
+ const Float3 div_cd = MAKE_FLOAT3(
+ // x
+ (phi_xp*v_xp.x*v_xp.x - phi_xn*v_xn.x*v_xn.x)/(2.0*dx) +
+ (phi_yp*v_yp.x*v_yp.y - phi_yn*v_yn.x*v_yn.y)/(2.0*dy) +
+ (phi_zp*v_zp.x*v_zp.z - phi_zn*v_zn.x*v_zn.z)/(2.0*dz),
+ // y
+ (phi_xp*v_xp.y*v_xp.x - phi_xn*v_xn.y*v_xn.x)/(2.0*dx) +
+ (phi_yp*v_yp.y*v_yp.y - phi_yn*v_yn.y*v_yn.y)/(2.0*dy) +
+ (phi_zp*v_zp.y*v_zp.z - phi_zn*v_zn.y*v_zn.z)/(2.0*dz),
+ // z
+ (phi_xp*v_xp.z*v_xp.x - phi_xn*v_xn.z*v_xn.x)/(2.0*dx) +
+ (phi_yp*v_yp.z*v_yp.y - phi_yn*v_yn.z*v_yn.y)/(2.0*dy) +
+ (phi_zp*v_zp.z*v_zp.z - phi_zn*v_zn.z*v_zn.z)/(2.0*dz));
+
+ // Weighting parameter
+ const Float tau = 0.5;
+
+ // Determine the weighted average of both discretizations
+ const Float3 div_phi_vi_v = tau*div_uw + (1.0 - tau)*div_cd;
+ */
+
// Calculate the divergence: div(phi*v_i*v)
const Float3 div_phi_vi_v = MAKE_FLOAT3(
// x
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.