Changeset 217590b in sasmodels for sasmodels/models/fractal.c


Ignore:
Timestamp:
Oct 20, 2016 4:48:48 PM (8 years ago)
Author:
Paul Kienzle <pkienzle@…>
Branches:
master, core_shell_microgels, costrafo411, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
Children:
5c94f41
Parents:
2b9e63f
git-author:
Paul Kienzle <pkienzle@…> (10/20/16 16:47:25)
git-committer:
Paul Kienzle <pkienzle@…> (10/20/16 16:48:48)
Message:

fractal, fractal_core_shell: support fractal_dim as low as 0.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/models/fractal.c

    r6d96b66 r217590b  
    1 #define INVALID(p) (p.fractal_dim <= 0.0) 
     1#define INVALID(p) (p.fractal_dim < 0.0) 
    22 
    33static double 
     
    1010   double sld_solvent) 
    1111{ 
     12    const double sq = fractal_sq(q, radius, fractal_dim, cor_length); 
     13 
    1214    //calculate P(q) for the spherical subunits 
    13     const double pq = M_4PI_3*cube(radius) * square((sld_block-sld_solvent)*sph_j1c(q*radius)); 
    14      
    15     //calculate S(q),  using Teixeira, Eq(15) 
    16     double sq; 
    17     if (q > 0. && fractal_dim > 1.) { 
    18         // q>0, D>0 
    19         const double D = fractal_dim; 
    20         const double Dm1 = fractal_dim - 1.0; 
    21         // Note: for large Dm1, sin(Dm1*atan(q*cor_length) can go negative 
    22         const double t1 = D*sas_gamma(Dm1)*sin(Dm1*atan(q*cor_length)); 
    23         const double t2 = pow(q*radius, -D); 
    24         const double t3 = pow(1.0 + 1.0/square(q*cor_length), -0.5*Dm1); 
    25         sq = 1.0 + t1 * t2 * t3; 
    26     } else if (q > 0.) { 
    27         // q>0, D=1 
    28         sq = 1.0 + atan(q*cor_length) / (q*radius); 
    29     } else if (fractal_dim > 1.) { 
    30         // q=0, D>1 
    31         const double D = fractal_dim; 
    32         sq = 1.0 + pow(cor_length/radius, D)*sas_gamma(D+1.0); 
    33     } else { 
    34         // q=0, D=1 
    35         sq = 1.0 + cor_length/radius; 
    36     } 
     15    const double V = M_4PI_3*cube(radius); 
     16    const double pq = V * square((sld_block-sld_solvent)*sph_j1c(q*radius)); 
    3717 
    3818    // scale to units cm-1 sr-1 (assuming data on absolute scale) 
     
    4121    //    combined: 1e-4 * I(q) 
    4222 
    43     return 1.e-4 * volfraction * pq * sq; 
     23    return 1.e-4 * volfraction * sq * pq; 
    4424} 
    4525 
Note: See TracChangeset for help on using the changeset viewer.