Changes in / [9c490bc:19bf626] in sasmodels


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/kernel_iq.c

    r9c490bc r208f0a4  
    4040           double sld_solvent 
    4141 
    42    PARAMETER_CALL(var) is the declaration of a call to the kernel. 
     42   CALL_IQ(q, nq, i, pars) is the declaration of a call to the kernel. 
    4343 
    4444       Cylinder: 
    4545 
    46            #define PARAMETER_CALL(var) \ 
     46           #define CALL_IQ(q, nq, i, var) \ 
     47           Iq(q[i], \ 
    4748           var.length, \ 
    4849           var.radius, \ 
    4950           var.sld, \ 
    50            var.sld_solvent 
     51           var.sld_solvent) 
    5152 
    5253       Multi-shell cylinder: 
    53            #define PARAMETER_CALL(var) \ 
     54           #define CALL_IQ(q, nq, i, var) \ 
     55           Iq(q[i], \ 
    5456           var.num_shells, \ 
    5557           var.length, \ 
    5658           var.radius, \ 
    5759           var.sld, \ 
    58            var.sld_solvent 
     60           var.sld_solvent) 
     61 
     62   CALL_VOLUME(var) is similar, but for calling the form volume. 
    5963 
    6064   INVALID is a test for model parameters in the correct range 
     
    104108        par_offset = {2, 3, 303, 313}  // parameter offsets 
    105109        par_coord = {0, 3, 2, 1} // bitmap of parameter dependencies 
     110        fast_coord_index = {5, 3, x, x} 
    106111        fast_coord_count = 2  // two parameters vary with *length* distribution 
    107         fast_coord_index = {5, 3, x, x, x, x} 
     112        theta_var = -1   // no spherical correction 
     113        fast_theta = 0   // spherical correction angle is not pd 1 
    108114    } 
    109115 
     
    197203Scale and background cannot be coordinated with other polydisperse parameters 
    198204 
    199 Cutoff paramater is basically used to restrict the region where integration 
    200 is peformed i.e. polydispersity hypercude is limitted spheres. 
    201  
     205Oriented objects in 2-D need a spherical correction on the angular variation 
     206in order to preserve the 'surface area' of the weight distribution. 
     207 
     208TODO: cutoff 
    202209*/ 
    203210 
     
    213220    int par_offset[NPARS];  // offset of par values in the par & weight vector 
    214221    int par_coord[NPARS];   // polydispersity coordination bitvector 
     222    int fast_coord_index[NPARS]; // index of the fast coordination parameters 
    215223    int fast_coord_count;   // number of parameters coordinated with pd 1 
    216     int fast_coord_index[NPARS]; // index of the fast coordination parameters 
     224    int theta_var;          // id of spherical correction variable 
     225    int fast_theta;         // true if spherical correction depends on pd 1 
    217226} ProblemDetails; 
    218227 
     
    317326  double weight = 1.0;        // set to 1 in case there are no weights 
    318327  double vol_weight = 1.0;    // set to 1 in case there are no vol weights 
     328  double spherical_correction = 1.0;  // correction for latitude variation 
    319329 
    320330  // Loop over the weights then loop over q, accumulating values 
     
    322332    // check if indices need to be updated 
    323333    if (pd_index[0] >= pd_length[0]) { 
     334 
     335      // RESET INDICES 
    324336      pd_index[0] = loop_index%pd_length[0]; 
    325337      partial_weight = 1.0; 
     
    331343        if (pd_isvol[k]) partial_volweight *= wi; 
    332344      } 
    333       weight = partial_weight * weights[pd_offset[0]+pd_index[0]] 
    334345      for (int k=0; k < NPARS; k++) { 
    335346        int coord = par_coord[k]; 
     
    346357        parvec[k] = pars[this_offset]; 
    347358      } 
     359      weight = partial_weight * weights[pd_offset[0]+pd_index[0]] 
     360      if (theta_var >= 0) { 
     361        spherical_correction = fabs(cos(M_PI_180*parvec[theta_var])); 
     362      } 
     363      if (!fast_theta) weight *= spherical_correction; 
     364 
    348365    } else { 
     366 
     367      // INCREMENT INDICES 
    349368      pd_index[0] += 1; 
    350369      const double wi = weights[pd_offset[0]+pd_index[0]]; 
     
    355374            = pars[offset[fast_coord_index[k]] + pd_index[0]]; 
    356375      } 
    357     } 
     376      if (fast_theta) weight *= fabs(cos(M_PI_180*parvec[theta_var])); 
     377 
     378    } 
     379 
    358380    #ifdef INVALID 
    359381    if (INVALID(local_pars)) continue; 
    360382    #endif 
     383 
    361384    if (weight > cutoff) { 
    362385      norm += weight; 
    363       vol += vol_weight * form_volume(VOLUME_PARAMETERS); 
     386      vol += vol_weight * CALL_VOLUME(local_pars); 
    364387      norm_vol += vol_weight; 
    365388 
     
    369392      for (int i=0; i < nq; i++) { 
    370393      { 
    371         const double scattering = IQ_FUNC(IQ_PARS, IQ_PARAMETERS); 
     394        const double scattering = CALL_IQ(q, nq, i, local_pars); 
    372395        //const double scattering = Iq(q[i], IQ_PARAMETERS); 
    373396        result[i] += weight*scattering; 
Note: See TracChangeset for help on using the changeset viewer.