Ignore:
Timestamp:
Jan 5, 2012 6:24:51 PM (13 years ago)
Author:
Mathieu Doucet <doucetm@…>
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
20d91bd
Parents:
98fdccd
Message:

refactored bunch of models

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sansmodels/src/c_models/lamellarPS.cpp

    r67424cd r82c11d3  
    2323 
    2424#include <math.h> 
    25 #include "models.hh" 
    2625#include "parameters.hh" 
    2726#include <stdio.h> 
     27#include <stdlib.h> 
    2828using namespace std; 
     29#include "lamellarPS.h" 
    2930 
    3031extern "C" { 
    31         #include "libCylinder.h" 
    32         #include "lamellarPS.h" 
     32#include "libCylinder.h" 
     33} 
     34 
     35/*LamellarPS_kernel() was moved from libigor to get rid of polydipersity in del(thickness) that we provide from control panel. 
     36  LamellarPSX  :  calculates the form factor of a lamellar structure - with S(q) effects included 
     37------- 
     38------- resolution effects ARE NOT included, but only a CONSTANT default value, not the real q-dependent resolution!! 
     39 
     40 */ 
     41static double LamellarPS_kernel(double dp[], double q) 
     42{ 
     43  double scale,dd,del,sld_bi,sld_sol,contr,NN,Cp,bkg;   //local variables of coefficient wave 
     44  double inten, qval,Pq,Sq,alpha,temp,t1,t2,t3,dQ; 
     45  double Pi,Euler,dQDefault,fii; 
     46  int ii,NNint; 
     47  Euler = 0.5772156649;   // Euler's constant 
     48  dQDefault = 0.0;    //[=] 1/A, q-resolution, default value 
     49  dQ = dQDefault; 
     50 
     51  Pi = 4.0*atan(1.0); 
     52  qval = q; 
     53 
     54  scale = dp[0]; 
     55  dd = dp[1]; 
     56  del = dp[2]; 
     57  sld_bi = dp[3]; 
     58  sld_sol = dp[4]; 
     59  NN = trunc(dp[5]);    //be sure that NN is an integer 
     60  Cp = dp[6]; 
     61  bkg = dp[7]; 
     62 
     63  contr = sld_bi - sld_sol; 
     64 
     65  Pq = 2.0*contr*contr/qval/qval*(1.0-cos(qval*del)); 
     66 
     67  NNint = (int)NN;    //cast to an integer for the loop 
     68  ii=0; 
     69  Sq = 0.0; 
     70  for(ii=1;ii<(NNint-1);ii+=1) { 
     71 
     72    fii = (double)ii;   //do I really need to do this? 
     73 
     74    temp = 0.0; 
     75    alpha = Cp/4.0/Pi/Pi*(log(Pi*ii) + Euler); 
     76    t1 = 2.0*dQ*dQ*dd*dd*alpha; 
     77    t2 = 2.0*qval*qval*dd*dd*alpha; 
     78    t3 = dQ*dQ*dd*dd*ii*ii; 
     79 
     80    temp = 1.0-ii/NN; 
     81    temp *= cos(dd*qval*ii/(1.0+t1)); 
     82    temp *= exp(-1.0*(t2 + t3)/(2.0*(1.0+t1)) ); 
     83    temp /= sqrt(1.0+t1); 
     84 
     85    Sq += temp; 
     86  } 
     87 
     88  Sq *= 2.0; 
     89  Sq += 1.0; 
     90 
     91  inten = 2.0*Pi*scale*Pq*Sq/(dd*qval*qval); 
     92 
     93  inten *= 1.0e8;   // 1/A to 1/cm 
     94 
     95  return(inten+bkg); 
    3396} 
    3497 
    3598LamellarPSModel :: LamellarPSModel() { 
    36         scale      = Parameter(1.0); 
    37         spacing    = Parameter(400.0, true); 
    38         spacing.set_min(0.0); 
    39         delta     = Parameter(30.0); 
    40         delta.set_min(0.0); 
    41         sld_bi   = Parameter(6.3e-6); 
    42         sld_sol   = Parameter(1.0e-6); 
    43         n_plates     = Parameter(20.0); 
    44         caille = Parameter(0.1); 
    45         background = Parameter(0.0); 
     99  scale      = Parameter(1.0); 
     100  spacing    = Parameter(400.0, true); 
     101  spacing.set_min(0.0); 
     102  delta     = Parameter(30.0); 
     103  delta.set_min(0.0); 
     104  sld_bi   = Parameter(6.3e-6); 
     105  sld_sol   = Parameter(1.0e-6); 
     106  n_plates     = Parameter(20.0); 
     107  caille = Parameter(0.1); 
     108  background = Parameter(0.0); 
    46109 
    47110} 
     
    54117 */ 
    55118double LamellarPSModel :: operator()(double q) { 
    56         double dp[8]; 
     119  double dp[8]; 
    57120 
    58         // Fill parameter array for IGOR library 
    59         // Add the background after averaging 
    60         dp[0] = scale(); 
    61         dp[1] = spacing(); 
    62         dp[2] = delta(); 
    63         dp[3] = sld_bi(); 
    64         dp[4] = sld_sol(); 
    65         dp[5] = n_plates(); 
    66         dp[6] = caille(); 
    67         dp[7] = 0.0; 
     121  // Fill parameter array for IGOR library 
     122  // Add the background after averaging 
     123  dp[0] = scale(); 
     124  dp[1] = spacing(); 
     125  dp[2] = delta(); 
     126  dp[3] = sld_bi(); 
     127  dp[4] = sld_sol(); 
     128  dp[5] = n_plates(); 
     129  dp[6] = caille(); 
     130  dp[7] = 0.0; 
    68131 
    69132 
    70         // Get the dispersion points for spacing and delta (thickness) 
    71         vector<WeightPoint> weights_spacing; 
    72         spacing.get_weights(weights_spacing); 
    73         vector<WeightPoint> weights_delta; 
    74         delta.get_weights(weights_delta); 
     133  // Get the dispersion points for spacing and delta (thickness) 
     134  vector<WeightPoint> weights_spacing; 
     135  spacing.get_weights(weights_spacing); 
     136  vector<WeightPoint> weights_delta; 
     137  delta.get_weights(weights_delta); 
    75138 
    76         // Perform the computation, with all weight points 
    77         double sum = 0.0; 
    78         double norm = 0.0; 
     139  // Perform the computation, with all weight points 
     140  double sum = 0.0; 
     141  double norm = 0.0; 
    79142 
    80         // Loop over short_edgeA weight points 
    81         for(int i=0; i< (int)weights_spacing.size(); i++) { 
    82                 dp[1] = weights_spacing[i].value; 
    83                 for(int j=0; j< (int)weights_spacing.size(); j++) { 
    84                         dp[2] = weights_delta[i].value; 
     143  // Loop over short_edgeA weight points 
     144  for(int i=0; i< (int)weights_spacing.size(); i++) { 
     145    dp[1] = weights_spacing[i].value; 
     146    for(int j=0; j< (int)weights_spacing.size(); j++) { 
     147      dp[2] = weights_delta[i].value; 
    85148 
    86                         sum += weights_spacing[i].weight * weights_delta[j].weight * LamellarPS_kernel(dp, q); 
    87                         norm += weights_spacing[i].weight * weights_delta[j].weight; 
    88                 } 
    89         } 
    90         return sum/norm + background(); 
     149      sum += weights_spacing[i].weight * weights_delta[j].weight * LamellarPS_kernel(dp, q); 
     150      norm += weights_spacing[i].weight * weights_delta[j].weight; 
     151    } 
     152  } 
     153  return sum/norm + background(); 
    91154} 
    92155/** 
     
    97160 */ 
    98161double LamellarPSModel :: operator()(double qx, double qy) { 
    99         double q = sqrt(qx*qx + qy*qy); 
    100         return (*this).operator()(q); 
     162  double q = sqrt(qx*qx + qy*qy); 
     163  return (*this).operator()(q); 
    101164} 
    102165 
     
    109172 */ 
    110173double LamellarPSModel :: evaluate_rphi(double q, double phi) { 
    111         return (*this).operator()(q); 
     174  return (*this).operator()(q); 
    112175} 
    113176/** 
     
    116179 */ 
    117180double LamellarPSModel :: calculate_ER() { 
    118 //NOT implemented yet!!! 
    119         return 0.0; 
     181  //NOT implemented yet!!! 
     182  return 0.0; 
    120183} 
    121184 
Note: See TracChangeset for help on using the changeset viewer.