source: sasmodels/Testers/TEST-Kernel-Ellipse.cpp @ 1726b21

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 1726b21 was 099e053, checked in by HMP1 <helen.park@…>, 10 years ago

further organizing

  • Property mode set to 100644
File size: 2.9 KB
RevLine 
[099e053]1__kernel void EllipsoidKernel(__global const real *qx, __global const real *qy, __global const int *place, __global const real *array,
2__global real *final, const real scale, const real sub, const int length, const int size)//, __local real *poly)
3{
4    //__local real rada, radaw, radb, radbw, th, thw, ph, phw;
5
6    __local real rada;
7    int uno=0; int dos=1; int count = 0;
8    int l = get_local_id(0);
9    for(int j = 0; j < 4; j++)
10    {
11        for(int i = place[uno]; i < place[dos]; i++)
12        {
13            rada[count] = array[i]
14            radaw[count] = array[]
15        }
16    uno+=2;
17    dos+=2;
18    count = 0;
19    }
20
21
22    int i = get_global_id(0);
23    if(i < length){
24    //do local mem?
25    real sum=0.0; real vol=0.0; real norm_vol=0.0; real norm=0.0;
26
27    for(int a = 0; a < place[0]; a++) //radius_a values
28    {
29        real radius_a = array[a];
30        real radius_a_weight = array[a+place[0]];
31        for(int b = place[1]; b < place[2]; b++) //radius_b values
32        {
33            real radius_b = array[b];
34            real radius_b_weight = array[b+place[2]];
35            for(int t = place[3]; t < place[4]; t++) //Axis_theta values
36            {
37                real axis_theta = array[t];
38                real axis_theta_weight = array[t+place[4]];
39                for(int p = place[5]; p < place[6]; p++) //axis_phi values
40                {
41                    real axis_phi = array[p];
42                    real axis_phi_weight = array[p+place[6]];
43
44                    real ret = 0;
45                    real q = sqrt(qx[i]*qx[i] + qy[i]*qy[i]);
46                    real pi = 4.0*atan(1.0);
47                    real theta = axis_theta*pi/180.0;
48                    real cos_val = cos(theta)*cos(axis_phi*pi/180.0)*(qx[i]/q) + sin(theta)*(qy[i]/q);
49
50                    real arg = q*radius_b*sqrt(1.0+(cos_val*cos_val*(((radius_a*radius_a/(radius_b*radius_b))-1.0))));
51                    if(arg == 0.0){
52                     ret = 1.0/3.0;
53                    }
54                    else{
55                        ret = (sin(arg)-arg*cos(arg))/(arg*arg*arg);
56                    }
57                    ret*=ret*9.0*sub*sub*4.0/3.0*acos(-1.0)*radius_b*radius_b*radius_a*scale*(1.0e8);
58                    real _ptvalue = radius_a_weight*radius_b_weight*axis_theta_weight*radius_a*axis_phi_weight*ret*pow(radius_b, 2);
59                    if(size > 1){
60                        _ptvalue *= fabs(cos(axis_theta*pi/180.0));
61                    }
62
63                    sum += _ptvalue;
64                    vol += radius_a_weight*radius_b_weight*pow(radius_b, 2)*radius_a;
65                    norm_vol += radius_a_weight*radius_b_weight;
66                    norm += radius_a_weight*radius_b_weight*axis_theta_weight*axis_phi_weight;
67                }
68            }
69        }
70    }
71
72    if(size > 1){
73        norm /= asin(1.0);
74    }
75    if(vol != 0.0 && norm_vol != 0.0){
76        sum *= norm_vol/vol;
77    }
78
79    final[i] = sum/norm;
80}
81}
Note: See TracBrowser for help on using the repository browser.