source: sasmodels/Kernel-CapCyl.cpp @ 496b252

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 496b252 was 2de9a5e, checked in by HMP1 <helen.park@…>, 10 years ago

Update for Aaron

  • Property mode set to 100644
File size: 2.4 KB
RevLine 
[2de9a5e]1__kernel void CapCylinderKernel(__global const float *qx, __global const float *qy, __global float *_ptvalue, __global float *vol_i,
[8a20be5]2const float rad_cyl, const float rad_cap, const float length, const float thet, const float ph, const float sub,
3const float scale, const float phi_weight, const float theta_float, const float rad_cap_weight, const float rad_cyl_weight,
[2de9a5e]4const float length_weight, const int total, const int size, __const float Gauss76Wt, __const float Gauss76Z)
[8a20be5]5//ph is phi, sub is sldc-slds, thet is theta
6{
7    int i = get_global_id(0);
8    if(i < total)
9    {
[2de9a5e]10        float q = sqrt(qx[i]*qx[i] + qy[i]*qy[i]);
[8a20be5]11        float pi = 4.0*atan(1.0);
12        float theta = thet*pi/180.0;
13        float phi = ph*pi/180.0;
14        float cyl_x = cos(theta)*cos(phi);
15        float cyl_y = sin(theta);
16        float cos_val = cyl_x*qx[i]/q + cyl_y*qy[i]/q;
17        float alpha = acos(cos_val);
[2de9a5e]18        float yyy=0; float ans1=0; float ans2=0; float y=0; float xx=0; float ans=0; float zij=0; float be=0; float summj=0;
[8a20be5]19
20        float hDist = -1.0*sqrt(fabs(rad_cap*rad_cap-rad_cyl*rad_cyl));
[2de9a5e]21        vol_i[i] = pi*rad_cyl*rad_cyl*length+2.0*pi/3.0*((rad_cap-hDist)*(rad_cap-hDist)*(2*rad_cap+hDist));
[8a20be5]22        float vaj = -1.0*hDist/rad_cap;
23
[2de9a5e]24        for(int j=0;j<76;j++) //the 76 corresponds to the Gauss constants
[8a20be5]25        {
[8faffcd]26            zij = (Gauss76Z[j]*(1.0-vaj)+vaj+1.0)/2.0;
27            yyy = Gauss76Wt[j]*ConvLens_kernel(length,rad_cyl,rad_cap,q,zij,alpha);
[8a20be5]28            summj += yyy;
29        }
30        float inner = (1.0-vaj)/2.0*summj*4.0*pi*rad_cap*rad_cap*rad_cap;
31        float arg1 = q*length/2.0*cos(alpha);
32        float arg2 = q*rad_cyl*sin(alpha);
33        yyy = inner;
34
35        if(arg2 == 0) {be = 0.5;}
36        else {
[8faffcd]37            be = NR_BessJ1(arg2)/arg2;
[8a20be5]38        }
39
[8faffcd]40        if(arg1 == 0.0) {
[8a20be5]41            yyy += pi*rad_cyl*rad_cyl*length*2.0*be;
42        } 
43        else {
44            yyy += pi*rad_cyl*rad_cyl*length*sin(arg1)/arg1*2.0*be;
45        }
46        float answer=yyy*yyy*1.0e8*sub*sub*scale/pi*rad_cyl*rad_cyl*length+2.0*pi*(2.0*rad_cap*rad_cap*rad_cap/3.0+rad_cap*rad_cap*hDist-hDist*hDist*hDist/3.0);
[2de9a5e]47        answer/=sin(alpha);
[8a20be5]48
49        _ptvalue[i] = rad_cyl_weight*length_weight*rad_cap_weight*theta_weight*phi_weight*vol_i[i]*answer
50        if (_ptvalue[i] == INFINITY || _ptvalue == NAN){
51            _ptvalue[i] = 0.0;
52        }
53        if (size>1) {
54            _ptvalue[i] *= fabs(cos(thet*pi/180.0));
55        }
56    }
57}
Note: See TracBrowser for help on using the repository browser.