Changeset 82c11d3 in sasview for sansmodels/src/c_models/lamellarPS.cpp
- Timestamp:
- Jan 5, 2012 6:24:51 PM (13 years ago)
- 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
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sansmodels/src/c_models/lamellarPS.cpp
r67424cd r82c11d3 23 23 24 24 #include <math.h> 25 #include "models.hh"26 25 #include "parameters.hh" 27 26 #include <stdio.h> 27 #include <stdlib.h> 28 28 using namespace std; 29 #include "lamellarPS.h" 29 30 30 31 extern "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 */ 41 static 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); 33 96 } 34 97 35 98 LamellarPSModel :: LamellarPSModel() { 36 37 38 39 40 41 42 43 44 45 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); 46 109 47 110 } … … 54 117 */ 55 118 double LamellarPSModel :: operator()(double q) { 56 119 double dp[8]; 57 120 58 59 60 61 62 63 64 65 66 67 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; 68 131 69 132 70 71 72 73 74 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); 75 138 76 77 78 139 // Perform the computation, with all weight points 140 double sum = 0.0; 141 double norm = 0.0; 79 142 80 81 82 83 84 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; 85 148 86 87 88 89 90 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(); 91 154 } 92 155 /** … … 97 160 */ 98 161 double LamellarPSModel :: operator()(double qx, double qy) { 99 100 162 double q = sqrt(qx*qx + qy*qy); 163 return (*this).operator()(q); 101 164 } 102 165 … … 109 172 */ 110 173 double LamellarPSModel :: evaluate_rphi(double q, double phi) { 111 174 return (*this).operator()(q); 112 175 } 113 176 /** … … 116 179 */ 117 180 double LamellarPSModel :: calculate_ER() { 118 //NOT implemented yet!!!119 181 //NOT implemented yet!!! 182 return 0.0; 120 183 } 121 184
Note: See TracChangeset
for help on using the changeset viewer.