Changes in sasmodels/models/onion.c [abdd01c:d119f34] in sasmodels
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/models/onion.c
rabdd01c rd119f34 2 2 static double 3 3 f_exp(double q, double r, double sld_in, double sld_out, 4 double thickness, double A )4 double thickness, double A, double side) 5 5 { 6 const double vol = 4.0/3.0 * M_PI * r * r * r;6 const double vol = M_4PI_3 * cube(r); 7 7 const double qr = q * r; 8 const double bes = sph_j1c(qr); 8 9 const double alpha = A * r/thickness; 9 const double bes = sph_j1c(qr); 10 const double B = (sld_out - sld_in)/expm1(A); 11 const double C = sld_in - B; 12 double fun; 10 double result; 13 11 if (qr == 0.0) { 14 fun= 1.0;12 result = 1.0; 15 13 } else if (fabs(A) > 0.0) { 16 const double qrsq = qr *qr;17 const double alphasq = alpha *alpha;14 const double qrsq = qr * qr; 15 const double alphasq = alpha * alpha; 18 16 const double sumsq = alphasq + qrsq; 19 17 double sinqr, cosqr; 20 18 SINCOS(qr, sinqr, cosqr); 21 fun = -3.0( 22 ((alphasq - qrsq)*sinqr/qr - 2.0*alpha*cosqr) / sumsq 23 - (alpha*sinqr/qr - cosqr) 24 ) / sumsq; 19 const double t1 = (alphasq - qrsq)*sinqr/qr - 2.0*alpha*cosqr; 20 const double t2 = alpha*sinqr/qr - cosqr; 21 const double fun = -3.0*(t1/sumsq - t2)/sumsq; 22 const double slope = (sld_out - sld_in)/expm1(A); 23 const double contrast = slope*exp(A*side); 24 result = contrast*fun + (sld_in-slope)*bes; 25 25 } else { 26 fun =bes;26 result = sld_in*bes; 27 27 } 28 return vol * (B*fun + C*bes); 29 } 30 31 static double 32 f_linear(double q, double r, double sld, double slope) 33 { 34 const double vol = 4.0/3.0 * M_PI * r * r * r; 35 const double qr = q * r; 36 const double bes = sph_j1c(qr); 37 double fun = 0.0; 38 if (qr > 0.0) { 39 const double qrsq = qr*qr; 40 double sinqr, cosqr; 41 SINCOS(qr, sinqr, cosqr); 42 // Jae-He's code seems to simplify to this 43 // fun = 3.0 * slope * r * (2.0*qr*sinqr - (qrsq-2.0)*cosqr)/(qrsq*qrsq); 44 // Rederiving the math, we get the following instead: 45 fun = 3.0 * slope * r * (2.0*cosqr + qr*sinqr)/(qrsq*qrsq); 46 } 47 return vol * (sld*bes + fun); 48 } 49 50 static double 51 f_constant(double q, double r, double sld) 52 { 53 const double bes = sph_j1c(q * r); 54 const double vol = 4.0/3.0 * M_PI * r * r * r; 55 return sld * vol * bes; 28 return vol * result; 56 29 } 57 30 … … 64 37 r += thickness[i]; 65 38 } 66 return 4.0/3.0 * M_PI * r * r * r;39 return M_4PI_3*cube(r); 67 40 } 68 41 69 42 static double 70 Iq(double q, double core_sld, double core_radius, double solvent_sld,71 double n , double in_sld[], double out_sld[], double thickness[],43 Iq(double q, double sld_core, double core_radius, double sld_solvent, 44 double n_shells, double sld_in[], double sld_out[], double thickness[], 72 45 double A[]) 73 46 { 74 int i; 75 r = core_radius; 76 f = f_constant(q, r, core_sld); 77 for (i=0; i<n; i++){ 78 const double r0 = r; 79 r += thickness[i]; 80 if (r == r0) { 81 // no thickness, so nothing to add 82 } else if (fabs(A[i]) < 1.0e-16 || sld_out[i] == sld_in[i]) { 83 f -= f_constant(q, r0, sld_in[i]); 84 f += f_constant(q, r, sld_in[i]); 85 } else if (fabs(A[i]) < 1.0e-4) { 86 const double slope = (sld_out[i] - sld_in[i])/thickness[i]; 87 f -= f_linear(q, r0, sld_in[i], slope); 88 f += f_linear(q, r, sld_out[i], slope); 89 } else { 90 f -= f_exp(q, r0, sld_in[i], sld_out[i], thickness[i], A[i]); 91 f += f_exp(q, r, sld_in[i], sld_out[i], thickness[i], A[i]); 92 } 47 int n = (int)(n_shells+0.5); 48 double r_out = core_radius; 49 double f = f_exp(q, r_out, sld_core, 0.0, 0.0, 0.0, 0.0); 50 for (int i=0; i < n; i++){ 51 const double r_in = r_out; 52 r_out += thickness[i]; 53 f -= f_exp(q, r_in, sld_in[i], sld_out[i], thickness[i], A[i], 0.0); 54 f += f_exp(q, r_out, sld_in[i], sld_out[i], thickness[i], A[i], 1.0); 93 55 } 94 f -= f_ constant(q, r, solvent_sld);95 f2 = f * f * 1.0e-4;56 f -= f_exp(q, r_out, sld_solvent, 0.0, 0.0, 0.0, 0.0); 57 const double f2 = f * f * 1.0e-4; 96 58 97 59 return f2;
Note: See TracChangeset
for help on using the changeset viewer.