File: poly_gauss_coil.c

package info (click to toggle)
mccode 3.5.19%2Bds5-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 1,113,256 kB
  • sloc: ansic: 40,697; python: 25,137; yacc: 8,438; sh: 5,405; javascript: 4,596; lex: 1,632; cpp: 742; perl: 296; lisp: 273; makefile: 226; fortran: 132
file content (29 lines) | stat: -rw-r--r-- 952 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    
double Iq(double q, double i_zero, double rg, double polydispersity);

#pragma acc routine seq
double Iq(double q, double i_zero, double rg, double polydispersity) {
    double u = polydispersity - 1.0;
    double z = q * q * (rg * rg / (1.0 + 2.0 * u));

    // need to trap the case of the polydispersity being 1 (ie, monodisperse!)
    double result;
    if (polydispersity == 1.0) {
        if (q == 0.0) {
            result = 1.0;
        } else {
            result = 2.0 * (expm1(-z) + z) / (q * q);
        }
    } else {
        // Taylor series around z=0 of (2*(1+uz)^(-1/u) + z - 1) / (z^2(u+1))
        double p[3] = {(+1 + 5 * u + 6 * u * u) / 12.0, (-1 - 2 * u) / 3.0, (+1)};
        result = 2.0 * (pow(1.0 + u * z, -1.0 / u) + z - 1.0) / (1.0 + u);
        if (z > 1e-4) {
            result /= (q * q * z * z);
        } else {
            result = p[0] * z * z + p[1] * z + p[2];
        }
    }
    return i_zero * result;
}