Update CUDA particle matter interaction according to latest changes in opal

This commit is contained in:
Uldis Locans
2017-04-27 18:15:35 +02:00
parent 61919ae53c
commit a94ed9f3b8

View File

@ -42,6 +42,23 @@ __device__ inline double3 cross(double3 &lhs, double3 &rhs) {
return tmp; return tmp;
} }
__device__ inline double3 ArbitraryRotation(double3 &W, double3 &Rorg, double Theta) {
double c=cos(Theta);
double s=sin(Theta);
double dotW = sqrt(dot(W,W));
W.x = W.x / dotW;
W.y = W.y / dotW;
W.z = W.z / dotW;
double dotWR = dot(W, Rorg) * (1.0 - c);
double3 crossW = cross(W, Rorg);
double3 tmp;
tmp.x = Rorg.x * c + crossW.x * s + W.x * dotWR;
tmp.y = Rorg.y * c + crossW.y * s + W.y * dotWR;
tmp.z = Rorg.z * c + crossW.z * s + W.z * dotWR;
return tmp;
}
__device__ inline bool checkHit(double &z, double *par) { __device__ inline bool checkHit(double &z, double *par) {
/* check if particle is in the degrader material */ /* check if particle is in the degrader material */
@ -101,6 +118,7 @@ __device__ inline void Rot(double &px, double &pz, double &x, double &z, double
double Psixz; double Psixz;
double pxz; double pxz;
/*
if (px>=0 && pz>=0) if (px>=0 && pz>=0)
Psixz = atan(px/pz); Psixz = atan(px/pz);
else if (px>0 && pz<0) else if (px>0 && pz<0)
@ -109,7 +127,8 @@ __device__ inline void Rot(double &px, double &pz, double &x, double &z, double
Psixz = atan(px/pz) + 2*PI; Psixz = atan(px/pz) + 2*PI;
else else
Psixz = atan(px/pz) + PI; Psixz = atan(px/pz) + PI;
*/
Psixz = atan2(px, pz);
pxz = sqrt(px*px + pz*pz); pxz = sqrt(px*px + pz*pz);
if(coord==1) { if(coord==1) {
@ -151,20 +170,9 @@ __device__ inline void coulombScat(double3 &R, double3 &P, curandState &state, d
} }
//__syncthreads(); //__syncthreads();
double xplane = z1 * deltas * theta0 / sqrt(12.0) + z2 * deltas * theta0 / 2.0; double xplane = z1 * deltas * theta0 / sqrt(12.0) + z2 * deltas * theta0 / 2.0;
Rot(P.x, P.z, R.x, R.z, xplane, normP, thetacou, deltas, 1, par); Rot(P.x, P.z, R.x, R.z, xplane, normP, thetacou, deltas, 1, par);
double P2 = curand_uniform_double(&state);//gsl_rng_uniform(rGen_m);
if( (P2 < 0.0047) && enableRutherfordScattering) {
double P3 = curand_uniform_double(&state);//gsl_rng_uniform(rGen_m);
double thetaru = 2.5 * sqrt(1 / P3) * sqrt(2.0) * theta0;
double P4 = curand_uniform_double(&state);//gsl_rng_uniform(rGen_m);
if(P4 > 0.5)
thetaru = -thetaru;
Rot(P.x,P.z,R.x,R.z, xplane, normP, thetaru, deltas, 0, par);
}
// y-direction: See Physical Review, "Multiple Scattering" // y-direction: See Physical Review, "Multiple Scattering"
z1 = curand_normal_double(&state);//gsl_ran_gaussian(rGen_m,1.0); z1 = curand_normal_double(&state);//gsl_ran_gaussian(rGen_m,1.0);
z2 = curand_normal_double(&state);//gsl_ran_gaussian(rGen_m,1.0); z2 = curand_normal_double(&state);//gsl_ran_gaussian(rGen_m,1.0);
@ -181,14 +189,23 @@ __device__ inline void coulombScat(double3 &R, double3 &P, curandState &state, d
double yplane = z1 * deltas * theta0 / sqrt(12.0) + z2 * deltas * theta0 / 2.0; double yplane = z1 * deltas * theta0 / sqrt(12.0) + z2 * deltas * theta0 / 2.0;
Rot(P.y,P.z,R.y,R.z, yplane, normP, thetacou, deltas, 2, par); Rot(P.y,P.z,R.y,R.z, yplane, normP, thetacou, deltas, 2, par);
P2 = curand_uniform_double(&state);//gsl_rng_uniform(rGen_m); double P2 = curand_uniform_double(&state);//gsl_rng_uniform(rGen_m);
if( (P2 < 0.0047) && enableRutherfordScattering) { if( (P2 < 0.0047) && enableRutherfordScattering) {
double P3 = curand_uniform_double(&state);//gsl_rng_uniform(rGen_m); double P3 = curand_uniform_double(&state);//gsl_rng_uniform(rGen_m);
double thetaru = 2.5 * sqrt(1 / P3) * sqrt(2.0) * theta0; //double thetaru = 2.5 * sqrt(1 / P3) * sqrt(2.0) * theta0;
double P4 = curand_uniform_double(&state);//gsl_rng_uniform(rGen_m); double thetaru = 2.5 * sqrt(1 / P3) * 2.0 * theta0;
if(P4 > 0.5) double phiru = 2.0 * M_PI * curand_uniform_double(&state);
thetaru = -thetaru; double th0=atan2(sqrt(P.x*P.x+P.y*P.y),fabs(P.z));
Rot(P.y,P.z,R.y,R.z, yplane, normP, thetaru, deltas, 0, par); double3 W,X;
double dotP = sqrt(dot(P,P));
X.x = cos(phiru)*sin(thetaru) * dotP;
X.y = sin(phiru)*sin(thetaru) * dotP;
X.z = cos(thetaru) * dotP;
W.x = -P.y;
W.y = P.x;
W.z = 0.0;
P = ArbitraryRotation(W, X, th0);
} }
} }