Changeset 2d1b700 in sasview for sansmodels


Ignore:
Timestamp:
Jan 5, 2012 10:52:13 AM (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:
dd60b45
Parents:
7ffa8196
Message:

refactor refl model and auto-generate c++ wrapper at compile time.

Location:
sansmodels/src
Files:
2 deleted
5 edited

Legend:

Unmodified
Added
Removed
  • sansmodels/src/c_extensions/refl.h

    r67424cd r2d1b700  
    33#if !defined(o_h) 
    44#define refl_h 
     5#include "parameters.hh" 
    56 
    67/** 
     
    3132 //[ORIENTATION_PARAMS]= <text> </text> 
    3233 
    33 typedef struct { 
    34         /// number of layers 
    35         //  [DEFAULT]=n_layers=1 
    36         int n_layers; 
     34class ReflModel{ 
     35public: 
     36  // Model parameters 
     37  /// number of layers 
     38  //  [DEFAULT]=n_layers=1 
     39  Parameter n_layers; 
    3740    /// Scale factor 
    3841    //  [DEFAULT]=scale= 1.0 
    39         double scale; 
    40     /// thick_inter0 [A] 
     42  Parameter scale; 
     43    /// thick_inter0 [A] 
    4144    //  [DEFAULT]=thick_inter0=1.0 [A] 
    42         double thick_inter0; 
    43         ///     func_inter0 
    44         //  [DEFAULT]=func_inter0= 0 
    45         double func_inter0; 
    46         ///     sld_bottom0 [1/A^(2)] 
    47         //  [DEFAULT]=sld_bottom0= 2.07e-6 [1/A^(2)] 
    48         double sld_bottom0; 
    49         ///     sld_medium [1/A^(2)] 
    50         //  [DEFAULT]=sld_medium= 1.0e-6 [1/A^(2)] 
    51         double sld_medium; 
    52         /// Background 
    53         //  [DEFAULT]=background=0 
    54         double background; 
     45  Parameter thick_inter0; 
     46  /// func_inter0 
     47  //  [DEFAULT]=func_inter0= 0 
     48  Parameter func_inter0; 
     49  /// sld_bottom0 [1/A^(2)] 
     50  //  [DEFAULT]=sld_bottom0= 2.07e-6 [1/A^(2)] 
     51  Parameter sld_bottom0; 
     52  /// sld_medium [1/A^(2)] 
     53  //  [DEFAULT]=sld_medium= 1.0e-6 [1/A^(2)] 
     54  Parameter sld_medium; 
     55  /// Background 
     56  //  [DEFAULT]=background=0 
     57  Parameter background; 
    5558 
    5659    //  [DEFAULT]=sld_flat1=4.0e-06 [1/A^(2)] 
    57     double sld_flat1; 
     60    Parameter sld_flat1; 
    5861    //  [DEFAULT]=sld_flat2=3.5e-06 [1/A^(2)] 
    59     double sld_flat2; 
     62    Parameter sld_flat2; 
    6063    //  [DEFAULT]=sld_flat3=4.0e-06 [1/A^(2)] 
    61     double sld_flat3; 
     64    Parameter sld_flat3; 
    6265    //  [DEFAULT]=sld_flat4=3.5e-06 [1/A^(2)] 
    63     double sld_flat4; 
     66    Parameter sld_flat4; 
    6467    //  [DEFAULT]=sld_flat5=4.0e-06 [1/A^(2)] 
    65     double sld_flat5; 
     68    Parameter sld_flat5; 
    6669    //  [DEFAULT]=sld_flat6=3.5e-06 [1/A^(2)] 
    67     double sld_flat6; 
     70    Parameter sld_flat6; 
    6871    //  [DEFAULT]=sld_flat7=4.0e-06 [1/A^(2)] 
    69     double sld_flat7; 
     72    Parameter sld_flat7; 
    7073    //  [DEFAULT]=sld_flat8=3.5e-06 [1/A^(2)] 
    71     double sld_flat8; 
     74    Parameter sld_flat8; 
    7275    //  [DEFAULT]=sld_flat9=4.0e-06 [1/A^(2)] 
    73     double sld_flat9; 
     76    Parameter sld_flat9; 
    7477    //  [DEFAULT]=sld_flat10=3.5e-06 [1/A^(2)] 
    75     double sld_flat10; 
     78    Parameter sld_flat10; 
    7679 
    7780    //  [DEFAULT]=thick_inter1=1 [A] 
    78     double thick_inter1; 
     81    Parameter thick_inter1; 
    7982    //  [DEFAULT]=thick_inter2=1 [A] 
    80     double thick_inter2; 
     83    Parameter thick_inter2; 
    8184    //  [DEFAULT]=thick_inter3=1 [A] 
    82     double thick_inter3; 
     85    Parameter thick_inter3; 
    8386    //  [DEFAULT]=thick_inter4=1 [A] 
    84     double thick_inter4; 
     87    Parameter thick_inter4; 
    8588    //  [DEFAULT]=thick_inter5=1 [A] 
    86     double thick_inter5; 
     89    Parameter thick_inter5; 
    8790    //  [DEFAULT]=thick_inter6=1 [A] 
    88     double thick_inter6; 
     91    Parameter thick_inter6; 
    8992    //  [DEFAULT]=thick_inter7=1 [A] 
    90     double thick_inter7; 
     93    Parameter thick_inter7; 
    9194    //  [DEFAULT]=thick_inter8=1 [A] 
    92     double thick_inter8; 
     95    Parameter thick_inter8; 
    9396    //  [DEFAULT]=thick_inter9=1 [A] 
    94     double thick_inter9; 
     97    Parameter thick_inter9; 
    9598    //  [DEFAULT]=thick_inter10=1 [A] 
    96     double thick_inter10; 
     99    Parameter thick_inter10; 
    97100 
    98101    //  [DEFAULT]=thick_flat1=10 [A] 
    99     double thick_flat1; 
     102    Parameter thick_flat1; 
    100103    //  [DEFAULT]=thick_flat2=100 [A] 
    101     double thick_flat2; 
     104    Parameter thick_flat2; 
    102105    //  [DEFAULT]=thick_flat3=100 [A] 
    103     double thick_flat3; 
     106    Parameter thick_flat3; 
    104107    //  [DEFAULT]=thick_flat4=100 [A] 
    105     double thick_flat4; 
     108    Parameter thick_flat4; 
    106109    //  [DEFAULT]=thick_flat5=100 [A] 
    107     double thick_flat5; 
     110    Parameter thick_flat5; 
    108111    //  [DEFAULT]=thick_flat6=100 [A] 
    109     double thick_flat6; 
     112    Parameter thick_flat6; 
    110113    //  [DEFAULT]=thick_flat7=100 [A] 
    111     double thick_flat7; 
     114    Parameter thick_flat7; 
    112115    //  [DEFAULT]=thick_flat8=100 [A] 
    113     double thick_flat8; 
     116    Parameter thick_flat8; 
    114117    //  [DEFAULT]=thick_flat9=100 [A] 
    115     double thick_flat9; 
     118    Parameter thick_flat9; 
    116119    //  [DEFAULT]=thick_flat10=100 [A] 
    117     double thick_flat10; 
     120    Parameter thick_flat10; 
    118121 
    119122    //  [DEFAULT]=func_inter1=0 
    120     double func_inter1; 
     123    Parameter func_inter1; 
    121124    //  [DEFAULT]=func_inter2=0 
    122     double func_inter2; 
     125    Parameter func_inter2; 
    123126    //  [DEFAULT]=func_inter3=0 
    124     double func_inter3; 
     127    Parameter func_inter3; 
    125128    //  [DEFAULT]=func_inter4=0 
    126     double func_inter4; 
     129    Parameter func_inter4; 
    127130    //  [DEFAULT]=func_inter5=0 
    128     double func_inter5; 
     131    Parameter func_inter5; 
    129132    //  [DEFAULT]=func_inter6=0 
    130     double func_inter6; 
     133    Parameter func_inter6; 
    131134    //  [DEFAULT]=func_inter7=0 
    132     double func_inter7; 
     135    Parameter func_inter7; 
    133136    //  [DEFAULT]=func_inter8=0 
    134     double func_inter8; 
     137    Parameter func_inter8; 
    135138    //  [DEFAULT]=func_inter9=0 
    136     double func_inter9; 
     139    Parameter func_inter9; 
    137140    //  [DEFAULT]=func_inter10=0 
    138     double func_inter10; 
     141    Parameter func_inter10; 
    139142 
    140143 
    141 } ReflParameters; 
     144  // Constructor 
     145  ReflModel(); 
    142146 
    143 double re_kernel(double dq[], double q); 
    144  
    145 /// 1D scattering function 
    146 double refl_analytical_1D(ReflParameters *pars, double q); 
    147  
    148 /// 2D scattering function 
    149 double refl_analytical_2D(ReflParameters *pars, double q, double phi); 
    150 double refl_analytical_2DXY(ReflParameters *pars, double qx, double qy); 
     147  // Operators to get I(Q) 
     148  double operator()(double q); 
     149  double operator()(double qx, double qy); 
     150  double calculate_ER(); 
     151  double evaluate_rphi(double q, double phi); 
     152}; 
    151153 
    152154#endif 
  • sansmodels/src/c_models/models.hh

    r7ffa8196 r2d1b700  
    2626 
    2727using namespace std; 
    28  
    29 class ReflModel{ 
    30 public: 
    31         // Model parameters 
    32         Parameter n_layers; 
    33         Parameter scale; 
    34         Parameter thick_inter0; 
    35         Parameter func_inter0; 
    36         Parameter sld_bottom0; 
    37         Parameter sld_medium; 
    38         Parameter background; 
    39  
    40         Parameter sld_flat1; 
    41         Parameter sld_flat2; 
    42         Parameter sld_flat3; 
    43         Parameter sld_flat4; 
    44         Parameter sld_flat5; 
    45         Parameter sld_flat6; 
    46         Parameter sld_flat7; 
    47         Parameter sld_flat8; 
    48         Parameter sld_flat9; 
    49         Parameter sld_flat10; 
    50  
    51         Parameter thick_inter1; 
    52         Parameter thick_inter2; 
    53         Parameter thick_inter3; 
    54         Parameter thick_inter4; 
    55         Parameter thick_inter5; 
    56         Parameter thick_inter6; 
    57         Parameter thick_inter7; 
    58         Parameter thick_inter8; 
    59         Parameter thick_inter9; 
    60         Parameter thick_inter10; 
    61  
    62         Parameter thick_flat1; 
    63         Parameter thick_flat2; 
    64         Parameter thick_flat3; 
    65         Parameter thick_flat4; 
    66         Parameter thick_flat5; 
    67         Parameter thick_flat6; 
    68         Parameter thick_flat7; 
    69         Parameter thick_flat8; 
    70         Parameter thick_flat9; 
    71         Parameter thick_flat10; 
    72  
    73         Parameter func_inter1; 
    74         Parameter func_inter2; 
    75         Parameter func_inter3; 
    76         Parameter func_inter4; 
    77         Parameter func_inter5; 
    78         Parameter func_inter6; 
    79         Parameter func_inter7; 
    80         Parameter func_inter8; 
    81         Parameter func_inter9; 
    82         Parameter func_inter10; 
    83  
    84         // Constructor 
    85         ReflModel(); 
    86  
    87         // Operators to get I(Q) 
    88         double operator()(double q); 
    89         double operator()(double qx, double qy); 
    90         double calculate_ER(); 
    91         double evaluate_rphi(double q, double phi); 
    92 }; 
    93  
    9428 
    9529class ReflAdvModel{ 
  • sansmodels/src/c_models/refl.cpp

    r67424cd r2d1b700  
    11 
    22#include <math.h> 
    3 #include "models.hh" 
    43#include "parameters.hh" 
    54#include <stdio.h> 
     5#include <stdlib.h> 
     6#include "refl.h" 
    67using namespace std; 
    78 
    89extern "C" { 
    9         #include "refl.h" 
    10 } 
    11  
     10#include "libmultifunc/librefl.h" 
     11} 
     12 
     13#define lamda 4.62 
     14 
     15double re_kernel(double dp[], double q) { 
     16  int n = dp[0]; 
     17  int i,j; 
     18 
     19  double scale = dp[1]; 
     20  double thick_inter_sub = dp[2]; 
     21  double sld_sub = dp[4]; 
     22  double sld_super = dp[5]; 
     23  double background = dp[6]; 
     24 
     25  double total_thick=0.0; 
     26  double nsl=21.0; //nsl = Num_sub_layer: 
     27  int n_s; 
     28  double sld_i,dz,phi,R,ko2; 
     29  double fun; 
     30  double pi; 
     31 
     32  double* sld; 
     33  double* thick_inter; 
     34  double* thick; 
     35  int*fun_type; 
     36  complex  phi1,alpha,alpha2,kn,fnm,fnp,rn,Xn,nn,nn2,an,nnp1,one,two,n_sub,n_sup,knp1,Xnp1; 
     37 
     38  sld = (double*)malloc((n+2)*sizeof(double)); 
     39  thick_inter = (double*)malloc((n+2)*sizeof(double)); 
     40  thick = (double*)malloc((n+2)*sizeof(double)); 
     41  fun_type = (int*)malloc((n+2)*sizeof(int)); 
     42 
     43  fun_type[0] = dp[3]; 
     44  for (i =1; i<=n; i++){ 
     45    sld[i] = dp[i+6]; 
     46    thick_inter[i]= dp[i+16]; 
     47    thick[i] = dp[i+26]; 
     48    fun_type[i] = dp[i+36]; 
     49    total_thick += thick[i] + thick_inter[i]; 
     50  } 
     51  sld[0] = sld_sub; 
     52  sld[n+1] = sld_super; 
     53 
     54  thick[0] = total_thick/5.0; 
     55  thick[n+1] = total_thick/5.0; 
     56  thick_inter[0] = thick_inter_sub; 
     57  thick_inter[n+1] = 0.0; 
     58 
     59  pi = 4.0*atan(1.0); 
     60  Xn = cassign(0.0,0.0); 
     61  one = cassign(1.0,0.0); 
     62  two = cassign(0.0,-2.0); 
     63 
     64  //Checking if floor is available. 
     65  //no imaginary sld inputs in this function yet 
     66  n_sub=cassign(1.0-sld_sub*pow(lamda,2.0)/(2.0*pi),0.0); 
     67  n_sup=cassign(1.0-sld_super*pow(lamda,2.0)/(2.0*pi),0.0); 
     68  ko2 = pow(2.0*pi/lamda,2.0); 
     69 
     70  phi = asin(lamda*q/(4.0*pi)); 
     71  phi1 = cplx_div(rcmult(phi,one),n_sup); 
     72  alpha = cplx_mult(n_sup,cplx_cos(phi1)); 
     73  alpha2 = cplx_mult(alpha,alpha); 
     74 
     75  nnp1=n_sub; 
     76  knp1=cplx_sqrt(rcmult(ko2,cplx_sub(cplx_mult(nnp1,nnp1),alpha2)));  //nnp1*ko*sin(phinp1) 
     77  Xnp1=cassign(0.0,0.0); 
     78  dz = 0.0; 
     79  // iteration for # of layers +sub from the top 
     80  for (i=1;i<=n+1; i++){ 
     81    if (fun_type[i-1]==1) 
     82      fun = 5; 
     83    else 
     84      fun = 0; 
     85    //iteration for 9 sub-layers 
     86    for (j=0;j<2;j++){ 
     87      for (n_s=0;n_s<nsl; n_s++){ 
     88        if (j==1){ 
     89          if (i==n+1) 
     90            break; 
     91          dz = thick[i]; 
     92          sld_i = sld[i]; 
     93        } 
     94        else{ 
     95          dz = thick_inter[i-1]/nsl;//nsl; 
     96          if (sld[i-1] == sld[i]){ 
     97            sld_i = sld[i]; 
     98          } 
     99          else{ 
     100            sld_i = intersldfunc(fun,nsl, n_s+0.5, 2.5, sld[i-1], sld[i]); 
     101          } 
     102        } 
     103        nn = cassign(1.0-sld_i*pow(lamda,2.0)/(2.0*pi),0.0); 
     104        nn2=cplx_mult(nn,nn); 
     105 
     106        kn=cplx_sqrt(rcmult(ko2,cplx_sub(nn2,alpha2)));        //nn*ko*sin(phin) 
     107        an=cplx_exp(rcmult(dz,cplx_mult(two,kn))); 
     108 
     109        fnm=cplx_sub(kn,knp1); 
     110        fnp=cplx_add(kn,knp1); 
     111        rn=cplx_div(fnm,fnp); 
     112        Xn=cplx_mult(an,cplx_div(cplx_add(rn,Xnp1),cplx_add(one,cplx_mult(rn,Xnp1))));    //Xn=an*((rn+Xnp1*anp1)/(1+rn*Xnp1*anp1)) 
     113 
     114        Xnp1=Xn; 
     115        knp1=kn; 
     116 
     117        if (j==1) 
     118          break; 
     119      } 
     120    } 
     121  } 
     122  R=pow(Xn.re,2.0)+pow(Xn.im,2.0); 
     123  // This temperarily fixes the total reflection for Rfunction and linear. 
     124  // ToDo: Show why it happens that Xn.re=0 and Xn.im >1! 
     125  if (Xn.im == 0.0){ 
     126    R=1.0; 
     127  } 
     128  R *= scale; 
     129  R += background; 
     130 
     131  free(sld); 
     132  free(thick_inter); 
     133  free(thick); 
     134  free(fun_type); 
     135 
     136  return R; 
     137 
     138} 
    12139ReflModel :: ReflModel() { 
    13         n_layers = Parameter(1.0); 
    14         scale = Parameter(1.0); 
    15         thick_inter0 = Parameter(1.0); 
    16         func_inter0 = Parameter(0); 
    17         sld_bottom0 = Parameter(2.07e-06); 
    18         sld_medium = Parameter(1.0e-06); 
    19     background = Parameter(0.0); 
    20  
    21  
    22     sld_flat1 = Parameter(3.0e-06); 
    23     sld_flat2 = Parameter(3.5e-06); 
    24     sld_flat3 = Parameter(4.0e-06); 
    25     sld_flat4 = Parameter(3.5e-06); 
    26     sld_flat5 = Parameter(4.0e-06); 
    27     sld_flat6 = Parameter(3.5e-06); 
    28     sld_flat7 = Parameter(4.0e-06); 
    29     sld_flat8 = Parameter(3.5e-06); 
    30     sld_flat9 = Parameter(4.0e-06); 
    31     sld_flat10 = Parameter(3.5e-06); 
    32  
    33  
    34     thick_inter1 = Parameter(1); 
    35     thick_inter2 = Parameter(1); 
    36     thick_inter3 = Parameter(1); 
    37     thick_inter4 = Parameter(1); 
    38     thick_inter5 = Parameter(1); 
    39     thick_inter6 = Parameter(1); 
    40     thick_inter7 = Parameter(1); 
    41     thick_inter8 = Parameter(1); 
    42     thick_inter9 = Parameter(1); 
    43     thick_inter10 = Parameter(1); 
    44  
    45  
    46     thick_flat1 = Parameter(15); 
    47     thick_flat2 = Parameter(100); 
    48     thick_flat3 = Parameter(100); 
    49     thick_flat4 = Parameter(100); 
    50     thick_flat5 = Parameter(100); 
    51     thick_flat6 = Parameter(100); 
    52     thick_flat7 = Parameter(100); 
    53     thick_flat8 = Parameter(100); 
    54     thick_flat9 = Parameter(100); 
    55     thick_flat10 = Parameter(100); 
    56  
    57  
    58     func_inter1 = Parameter(0); 
    59     func_inter2 = Parameter(0); 
    60     func_inter3 = Parameter(0); 
    61     func_inter4 = Parameter(0); 
    62     func_inter5 = Parameter(0); 
    63     func_inter6 = Parameter(0); 
    64     func_inter7 = Parameter(0); 
    65     func_inter8 = Parameter(0); 
    66     func_inter9 = Parameter(0); 
    67     func_inter10 = Parameter(0); 
     140  n_layers = Parameter(1.0); 
     141  scale = Parameter(1.0); 
     142  thick_inter0 = Parameter(1.0); 
     143  func_inter0 = Parameter(0); 
     144  sld_bottom0 = Parameter(2.07e-06); 
     145  sld_medium = Parameter(1.0e-06); 
     146  background = Parameter(0.0); 
     147 
     148 
     149  sld_flat1 = Parameter(3.0e-06); 
     150  sld_flat2 = Parameter(3.5e-06); 
     151  sld_flat3 = Parameter(4.0e-06); 
     152  sld_flat4 = Parameter(3.5e-06); 
     153  sld_flat5 = Parameter(4.0e-06); 
     154  sld_flat6 = Parameter(3.5e-06); 
     155  sld_flat7 = Parameter(4.0e-06); 
     156  sld_flat8 = Parameter(3.5e-06); 
     157  sld_flat9 = Parameter(4.0e-06); 
     158  sld_flat10 = Parameter(3.5e-06); 
     159 
     160 
     161  thick_inter1 = Parameter(1); 
     162  thick_inter2 = Parameter(1); 
     163  thick_inter3 = Parameter(1); 
     164  thick_inter4 = Parameter(1); 
     165  thick_inter5 = Parameter(1); 
     166  thick_inter6 = Parameter(1); 
     167  thick_inter7 = Parameter(1); 
     168  thick_inter8 = Parameter(1); 
     169  thick_inter9 = Parameter(1); 
     170  thick_inter10 = Parameter(1); 
     171 
     172 
     173  thick_flat1 = Parameter(15); 
     174  thick_flat2 = Parameter(100); 
     175  thick_flat3 = Parameter(100); 
     176  thick_flat4 = Parameter(100); 
     177  thick_flat5 = Parameter(100); 
     178  thick_flat6 = Parameter(100); 
     179  thick_flat7 = Parameter(100); 
     180  thick_flat8 = Parameter(100); 
     181  thick_flat9 = Parameter(100); 
     182  thick_flat10 = Parameter(100); 
     183 
     184 
     185  func_inter1 = Parameter(0); 
     186  func_inter2 = Parameter(0); 
     187  func_inter3 = Parameter(0); 
     188  func_inter4 = Parameter(0); 
     189  func_inter5 = Parameter(0); 
     190  func_inter6 = Parameter(0); 
     191  func_inter7 = Parameter(0); 
     192  func_inter8 = Parameter(0); 
     193  func_inter9 = Parameter(0); 
     194  func_inter10 = Parameter(0); 
    68195 
    69196} 
     
    75202 */ 
    76203double ReflModel :: operator()(double q) { 
    77         double dp[47]; 
    78         // Fill parameter array for IGOR library 
    79         // Add the background after averaging 
    80         dp[0] = n_layers(); 
    81         dp[1] = scale(); 
    82         dp[2] = thick_inter0(); 
    83         dp[3] = func_inter0(); 
    84         dp[4] = sld_bottom0(); 
    85         dp[5] = sld_medium(); 
    86         dp[6] = background(); 
    87  
    88         dp[7] = sld_flat1(); 
    89         dp[8] = sld_flat2(); 
    90         dp[9] = sld_flat3(); 
    91         dp[10] = sld_flat4(); 
    92         dp[11] = sld_flat5(); 
    93         dp[12] = sld_flat6(); 
    94         dp[13] = sld_flat7(); 
    95         dp[14] = sld_flat8(); 
    96         dp[15] = sld_flat9(); 
    97         dp[16] = sld_flat10(); 
    98  
    99         dp[17] = thick_inter1(); 
    100         dp[18] = thick_inter2(); 
    101         dp[19] = thick_inter3(); 
    102         dp[20] = thick_inter4(); 
    103         dp[21] = thick_inter5(); 
    104         dp[22] = thick_inter6(); 
    105         dp[23] = thick_inter7(); 
    106         dp[24] = thick_inter8(); 
    107         dp[25] = thick_inter9(); 
    108         dp[26] = thick_inter10(); 
    109  
    110         dp[27] = thick_flat1(); 
    111         dp[28] = thick_flat2(); 
    112         dp[29] = thick_flat3(); 
    113         dp[30] = thick_flat4(); 
    114         dp[31] = thick_flat5(); 
    115         dp[32] = thick_flat6(); 
    116         dp[33] = thick_flat7(); 
    117         dp[34] = thick_flat8(); 
    118         dp[35] = thick_flat9(); 
    119         dp[36] = thick_flat10(); 
    120  
    121         dp[37] = func_inter1(); 
    122         dp[38] = func_inter2(); 
    123         dp[39] = func_inter3(); 
    124         dp[40] = func_inter4(); 
    125         dp[41] = func_inter5(); 
    126         dp[42] = func_inter6(); 
    127         dp[43] = func_inter7(); 
    128         dp[44] = func_inter8(); 
    129         dp[45] = func_inter9(); 
    130         dp[46] = func_inter10(); 
    131  
    132         // Get the dispersion points for the radius 
    133         //vector<WeightPoint> weights_thick; 
    134         //thick_inter0.get_weights(weights_thick_inter0); 
    135  
    136  
    137         return re_kernel(dp,q); 
     204  double dp[47]; 
     205  // Fill parameter array for IGOR library 
     206  // Add the background after averaging 
     207  dp[0] = n_layers(); 
     208  dp[1] = scale(); 
     209  dp[2] = thick_inter0(); 
     210  dp[3] = func_inter0(); 
     211  dp[4] = sld_bottom0(); 
     212  dp[5] = sld_medium(); 
     213  dp[6] = background(); 
     214 
     215  dp[7] = sld_flat1(); 
     216  dp[8] = sld_flat2(); 
     217  dp[9] = sld_flat3(); 
     218  dp[10] = sld_flat4(); 
     219  dp[11] = sld_flat5(); 
     220  dp[12] = sld_flat6(); 
     221  dp[13] = sld_flat7(); 
     222  dp[14] = sld_flat8(); 
     223  dp[15] = sld_flat9(); 
     224  dp[16] = sld_flat10(); 
     225 
     226  dp[17] = thick_inter1(); 
     227  dp[18] = thick_inter2(); 
     228  dp[19] = thick_inter3(); 
     229  dp[20] = thick_inter4(); 
     230  dp[21] = thick_inter5(); 
     231  dp[22] = thick_inter6(); 
     232  dp[23] = thick_inter7(); 
     233  dp[24] = thick_inter8(); 
     234  dp[25] = thick_inter9(); 
     235  dp[26] = thick_inter10(); 
     236 
     237  dp[27] = thick_flat1(); 
     238  dp[28] = thick_flat2(); 
     239  dp[29] = thick_flat3(); 
     240  dp[30] = thick_flat4(); 
     241  dp[31] = thick_flat5(); 
     242  dp[32] = thick_flat6(); 
     243  dp[33] = thick_flat7(); 
     244  dp[34] = thick_flat8(); 
     245  dp[35] = thick_flat9(); 
     246  dp[36] = thick_flat10(); 
     247 
     248  dp[37] = func_inter1(); 
     249  dp[38] = func_inter2(); 
     250  dp[39] = func_inter3(); 
     251  dp[40] = func_inter4(); 
     252  dp[41] = func_inter5(); 
     253  dp[42] = func_inter6(); 
     254  dp[43] = func_inter7(); 
     255  dp[44] = func_inter8(); 
     256  dp[45] = func_inter9(); 
     257  dp[46] = func_inter10(); 
     258 
     259  // Get the dispersion points for the radius 
     260  //vector<WeightPoint> weights_thick; 
     261  //thick_inter0.get_weights(weights_thick_inter0); 
     262 
     263 
     264  return re_kernel(dp,q); 
    138265} 
    139266 
     
    145272 */ 
    146273double ReflModel :: operator()(double qx, double qy) { 
    147         // For 2D set qy as q, ignoring qx. 
    148         double q = qy;//sqrt(qx*qx + qy*qy); 
    149         if (q < 0.0){ 
    150                 return 0.0; 
    151         } 
    152         return (*this).operator()(q); 
     274  // For 2D set qy as q, ignoring qx. 
     275  double q = qy;//sqrt(qx*qx + qy*qy); 
     276  if (q < 0.0){ 
     277    return 0.0; 
     278  } 
     279  return (*this).operator()(q); 
    153280} 
    154281 
     
    161288 */ 
    162289double ReflModel :: evaluate_rphi(double q, double phi) { 
    163         return (*this).operator()(q); 
     290  return (*this).operator()(q); 
    164291} 
    165292 
     
    169296 */ 
    170297double ReflModel :: calculate_ER() { 
    171         //NOT implemented yet!!! 
    172         return 0.0; 
    173 } 
     298  //NOT implemented yet!!! 
     299  return 0.0; 
     300} 
  • sansmodels/src/python_wrapper/WrapperGenerator.py

    rd62f422 r2d1b700  
    5656    """ 
    5757     
    58     def __init__(self, filename): 
     58    def __init__(self, filename, output_dir='.'): 
    5959        """ Initialization """ 
    6060         
     
    9090        ## parameters with orientation 
    9191        self.orientation_params =[] 
     92        ## output directory for wrappers 
     93        self.output_dir = output_dir 
    9294         
    9395         
     
    289291            The file is written in C[PYTHONCLASS].c 
    290292        """ 
    291          
    292         file = open("C"+self.pythonClass+'.cpp', 'w') 
    293         template = open("classTemplate.txt", 'r') 
     293        file_path = os.path.join(self.output_dir, "C"+self.pythonClass+'.cpp') 
     294        file = open(file_path, 'w') 
     295         
     296        template = open(os.path.join(os.path.dirname(__file__), "classTemplate.txt"), 'r') 
    294297         
    295298        tmp_buf = template.read() 
     
    414417            The file is written in ../[PYTHONCLASS].py 
    415418        """ 
    416          
    417         file = open("../sans/models/"+self.pythonClass+'.py', 'w') 
    418         template = open("modelTemplate.txt", 'r') 
     419        file_path = os.path.join(self.output_dir, "../sans/models/"+self.pythonClass+'.py') 
     420        file = open(file_path, 'w') 
     421        template = open(os.path.join(os.path.dirname(__file__), "modelTemplate.txt"), 'r') 
    419422         
    420423        tmp_buf = template.read() 
  • sansmodels/src/python_wrapper/wrapping.py

    r67424cd r2d1b700  
    44from WrapperGenerator import WrapperGenerator 
    55 
     6def generate_wrappers(header_dir, output_dir='.'): 
     7    nModels=0 
     8    for item in os.listdir(header_dir): 
     9        toks = os.path.splitext(os.path.basename(item)) 
     10        if toks[1]=='.h': 
     11            nModels += 1 
     12            name = toks[0] 
     13            app = WrapperGenerator(os.path.join(header_dir, name+".h"), output_dir=output_dir) 
     14            app.read() 
     15            app.write_c_wrapper() 
     16            app.write_python_wrapper() 
     17            #print app 
     18    print "Total number of model  wrappers created is %s" % nModels 
    619 
    7 header_dir = os.path.join('..', 'c_extensions') 
     20if __name__ == '__main__': 
     21    header_dir = os.path.join('..', 'c_extensions') 
     22    generate_wrappers(header_dir) 
    823 
    9 nModels=0 
    10 for item in os.listdir(header_dir): 
    11     toks = os.path.splitext(os.path.basename(item)) 
    12     if toks[1]=='.h': 
    13         nModels += 1 
    14         name = toks[0] 
    15         app = WrapperGenerator(os.path.join(header_dir, name+".h")) 
    16         app.read() 
    17         app.write_c_wrapper() 
    18         app.write_python_wrapper() 
    19         print app 
    20 print "Number total of models is %s" % nModels 
     24 
Note: See TracChangeset for help on using the changeset viewer.