source: sasmodels/sasmodels/models/lib/librefl.c @ eb97b11

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since eb97b11 was eb97b11, checked in by wojciech, 8 years ago

Profile function clean-up

  • Property mode set to 100644
File size: 4.7 KB
Line 
1double err_mod_func(double n_sub, double ind, double nu);
2double linearfunc(double n_sub, double ind, double nu);
3double power_r(double n_sub, double ind, double nu);
4double power_l(double n_sub, double ind, double nu);
5double exp_r(double n_sub, double ind, double nu);
6double exp_l(double n_sub, double ind, double nu);
7double intersldfunc(int fun_type, double n_sub, double i, double nu, double sld_l, double sld_r);
8double interfunc(int fun_type, double n_sub, double i, double sld_l, double sld_r);
9
10// normalized and modified erf
11//   |
12// 1 +                __  - - - -
13//   |             _
14//       |            _
15//   |        __
16// 0 + - - -
17//   |-------------+------------+--
18//   0           center       n_sub    --->
19//                                     ind
20//
21// n_sub = total no. of bins(or sublayers)
22// ind = x position: 0 to max
23// nu = max x to integration
24double err_mod_func(double n_sub, double ind, double nu)
25{
26  double center, func;
27  if (nu == 0.0)
28                nu = 1.0e-14;
29        if (n_sub == 0.0)
30                n_sub = 1.0;
31
32
33        //ind = (n_sub-1.0)/2.0-1.0 +ind;
34        center = n_sub/2.0;
35        // transform it so that min(ind) = 0
36        ind -= center;
37        // normalize by max limit
38        ind /= center;
39        // divide by sqrt(2) to get Gaussian func
40        nu /= sqrt(2.0);
41        ind *= nu;
42        // re-scale and normalize it so that max(erf)=1, min(erf)=0
43        func = erf(ind)/erf(nu)/2.0;
44        // shift it by +0.5 in y-direction so that min(erf) = 0
45        func += 0.5;
46
47        return func;
48}
49double linearfunc(double n_sub, double ind, double nu)
50{
51  double bin_size, func;
52        if (n_sub == 0.0)
53                n_sub = 1.0;
54
55        bin_size = 1.0/n_sub;  //size of each sub-layer
56        // rescale
57        ind *= bin_size;
58        func = ind;
59
60        return func;
61}
62// use the right hand side from the center of power func
63double power_r(double n_sub, double ind, double nu)
64{
65  double bin_size,func;
66        if (nu == 0.0)
67                nu = 1.0e-14;
68        if (n_sub == 0.0)
69                n_sub = 1.0;
70
71        bin_size = 1.0/n_sub;  //size of each sub-layer
72        // rescale
73        ind *= bin_size;
74        func = pow(ind, nu);
75
76        return func;
77}
78// use the left hand side from the center of power func
79double power_l(double n_sub, double ind, double nu)
80{
81  double bin_size, func;
82        if (nu == 0.0)
83                nu = 1.0e-14;
84        if (n_sub == 0.0)
85                n_sub = 1.0;
86
87        bin_size = 1.0/n_sub;  //size of each sub-layer
88        // rescale
89        ind *= bin_size;
90        func = 1.0-pow((1.0-ind),nu);
91
92        return func;
93}
94// use 1-exp func from x=0 to x=1
95double exp_r(double n_sub, double ind, double nu)
96{
97  double bin_size, func;
98        if (nu == 0.0)
99                nu = 1.0e-14;
100        if (n_sub == 0.0)
101                n_sub = 1.0;
102
103        bin_size = 1.0/n_sub;  //size of each sub-layer
104        // rescale
105        ind *= bin_size;
106        // modify func so that func(0) =0 and func(max)=1
107        func = 1.0-exp(-nu*ind);
108        // normalize by its max
109        func /= (1.0-exp(-nu));
110
111        return func;
112}
113
114// use the left hand side mirror image of exp func
115double exp_l(double n_sub, double ind, double nu)
116{
117  double bin_size, func;
118        if (nu == 0.0)
119                nu = 1.0e-14;
120        if (n_sub == 0.0)
121                n_sub = 1.0;
122
123        bin_size = 1.0/n_sub;  //size of each sub-layer
124        // rescale
125        ind *= bin_size;
126        // modify func
127        func = exp(-nu*(1.0-ind))-exp(-nu);
128        // normalize by its max
129        func /= (1.0-exp(-nu));
130
131        return func;
132}
133
134// To select function called
135// At nu = 0 (singular point), call line function
136double intersldfunc(int fun_type, double n_sub, double i, double nu, double sld_l, double sld_r)
137{
138        double sld_i, func;
139        // this condition protects an error from the singular point
140        if (nu == 0.0){
141                nu = 1.0e-13;
142        }
143        // select func
144        switch(fun_type){
145                case 1 :
146                        func = power_r(n_sub, i, nu);
147                        break;
148                case 2 :
149                        func = power_l(n_sub, i, nu);
150                        break;
151                case 3 :
152                        func = exp_r(n_sub, i, nu);
153                        break;
154                case 4 :
155                        func = exp_l(n_sub, i, nu);
156                        break;
157                case 5 :
158                        func = linearfunc(n_sub, i, nu);
159                        break;
160                default:
161                        func = err_mod_func(n_sub, i, nu);
162                        break;
163        }
164        // compute sld
165        if (sld_r>sld_l){
166                sld_i = (sld_r-sld_l)*func+sld_l; //sld_cal(sld[i],sld[i+1],n_sub,dz,thick);
167        }
168        else if (sld_r<sld_l){
169                func = 1.0-func;
170                sld_i = (sld_l-sld_r)*func+sld_r; //sld_cal(sld[i],sld[i+1],n_sub,dz,thick);
171        }
172        else{
173                sld_i = sld_r;
174        }
175        return sld_i;
176}
177
178
179// used by refl.c
180double interfunc(int fun_type, double n_sub, double i, double sld_l, double sld_r)
181{
182        double sld_i, func;
183        switch(fun_type){
184                case 0 :
185                        func = err_mod_func(n_sub, i, 2.5);
186                        break;
187                default:
188                        func = linearfunc(n_sub, i, 1.0);
189                        break;
190        }
191        if (sld_r>sld_l){
192                sld_i = (sld_r-sld_l)*func+sld_l; //sld_cal(sld[i],sld[i+1],n_sub,dz,thick);
193        }
194        else if (sld_r<sld_l){
195                func = 1.0-func;
196                sld_i = (sld_l-sld_r)*func+sld_r; //sld_cal(sld[i],sld[i+1],n_sub,dz,thick);
197        }
198        else{
199                sld_i = sld_r;
200        }
201        return sld_i;
202}
Note: See TracBrowser for help on using the repository browser.