File: linear_pearls.c

package info (click to toggle)
mccode 3.5.19%2Bds5-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, 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 (76 lines) | stat: -rw-r--r-- 2,080 bytes parent folder | download | duplicates (6)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
double form_volume(double radius, double num_pearls);

double Iq(double q,
            double radius,
            double edge_sep,
            double fp_num_pearls,
            double pearl_sld,
            double solvent_sld);

double linear_pearls_kernel(double q,
            double radius,
            double edge_sep,
            int num_pearls,
            double pearl_sld,
            double solvent_sld);


double form_volume(double radius, double fp_num_pearls)
{
    int num_pearls = (int)(fp_num_pearls + 0.5);
    // Pearl volume
    double pearl_vol = M_4PI_3 * cube(radius);
    // Return total volume
    return num_pearls * pearl_vol;;
}

double linear_pearls_kernel(double q,
            double radius,
            double edge_sep,
            int num_pearls,
            double pearl_sld,
            double solvent_sld)
{
    //relative sld
    double contrast_pearl = pearl_sld - solvent_sld;
    //each volume
    double pearl_vol = M_4PI_3 * cube(radius);
    //total volume
    double tot_vol = num_pearls * pearl_vol;
    //mass
    double m_s = contrast_pearl * pearl_vol;
    //center to center distance between the neighboring pearls
    double separation = edge_sep + 2.0 * radius;

    //sine functions of a pearl
    double psi = sas_3j1x_x(q * radius);

    // N pearls interaction terms
    double structure_factor = (double)num_pearls;
    for(int num=1; num<num_pearls; num++) {
        structure_factor += 2.0*(num_pearls-num)*sas_sinx_x(q*separation*num);
    }
    // form factor for num_pearls
    double form_factor = 1.0e-4 * structure_factor * square(m_s*psi) / tot_vol;

    return form_factor;
}

double Iq(double q,
            double radius,
            double edge_sep,
            double fp_num_pearls,
            double pearl_sld,
            double solvent_sld)
{

    int num_pearls = (int)(fp_num_pearls + 0.5);
	double result = linear_pearls_kernel(q,
                    radius,
                    edge_sep,
                    num_pearls,
                    pearl_sld,
                    solvent_sld);

	return result;
}