Changeset 750ffa5 in sasmodels for sasmodels/kernel_template.c


Ignore:
Timestamp:
Mar 9, 2015 4:04:55 PM (9 years ago)
Author:
Paul Kienzle <pkienzle@…>
Branches:
master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
Children:
3a45c2c
Parents:
48f0194
Message:

allow test of dll using single precision

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/kernel_template.c

    r95e861b r750ffa5  
    1212     #include <cstdio> 
    1313     #include <cmath> 
     14     using namespace std; 
    1415     #if defined(_MSC_VER) 
    15      #define kernel extern "C" __declspec( dllexport ) 
     16     #   define kernel extern "C" __declspec( dllexport ) 
     17         inline double trunc(double x) { return x>=0?floor(x):-floor(-x); } 
    1618     #else 
    17      #define kernel extern "C" 
     19     #   define kernel extern "C" 
    1820     #endif 
    19      using namespace std; 
    20      inline void SINCOS(double angle, double &svar, double &cvar) 
    21        { svar=sin(angle); cvar=cos(angle); } 
     21     inline void SINCOS(double angle, double &svar, double &cvar) { svar=sin(angle); cvar=cos(angle); } 
    2222#  else 
    2323     #include <stdio.h> 
    24      #include <math.h> 
    25      #if defined(_MSC_VER) 
    26      #define kernel __declspec( dllexport ) 
    27      #else 
     24     #include <tgmath.h> // C99 type-generic math, so sin(float) => sinf 
     25     // MSVC doesn't support C99, so no need for dllexport on C99 branch 
    2826     #define kernel 
    29      #endif 
    30      #define SINCOS(angle,svar,cvar) do {svar=sin(angle);cvar=cos(angle);} while (0) 
     27     #define SINCOS(angle,svar,cvar) do {const double _t_=angle; svar=sin(_t_);cvar=cos(_t_);} while (0) 
    3128#  endif 
    32      #if defined(_MSC_VER) 
    33      inline double trunc(double x) { return x>=0?floor(x):-floor(-x); } 
    34      #endif 
    3529#  define global 
    3630#  define local 
    3731#  define constant const 
     32// OpenCL powr(a,b) = C99 pow(a,b), b >= 0 
     33// OpenCL pown(a,b) = C99 pow(a,b), b integer 
    3834#  define powr(a,b) pow(a,b) 
    3935#  define pown(a,b) pow(a,b) 
     
    4238#    define SINCOS(angle,svar,cvar) svar=sincos(angle,&cvar) 
    4339#  else 
    44 #    define SINCOS(angle,svar,cvar) do {svar=sin(angle);cvar=cos(angle);} while (0) 
     40#    define SINCOS(angle,svar,cvar) do {const double _t_=angle; svar=sin(_t_);cvar=cos(_t_);} while (0) 
    4541#  endif 
    4642#endif 
     
    126122    const double weight = IQ_WEIGHT_PRODUCT; 
    127123    if (weight > cutoff) { 
    128       const double I = Iq(qi, IQ_PARAMETERS); 
    129       if (I>=0.0) { // scattering cannot be negative 
    130         ret += weight*I; 
     124      const double scattering = Iq(qi, IQ_PARAMETERS); 
     125      if (scattering >= 0.0) { // scattering cannot be negative 
     126        ret += weight*scattering; 
    131127        norm += weight; 
    132128      #ifdef VOLUME_PARAMETERS 
     
    136132      #endif 
    137133      } 
    138     //else { printf("exclude qx,qy,I:%%g,%%g,%%g\n",qi,I); } 
     134    //else { printf("exclude qx,qy,I:%%g,%%g,%%g\n",qi,scattering); } 
    139135    } 
    140136    IQ_CLOSE_LOOPS 
     
    199195    if (weight > cutoff) { 
    200196 
    201       const double I = Iqxy(qxi, qyi, IQXY_PARAMETERS); 
    202       if (I>=0.0) { // scattering cannot be negative 
     197      const double scattering = Iqxy(qxi, qyi, IQXY_PARAMETERS); 
     198      if (scattering >= 0.0) { // scattering cannot be negative 
    203199        // TODO: use correct angle for spherical correction 
    204200        // Definition of theta and phi are probably reversed relative to the 
     
    211207        const double spherical_correction 
    212208          = (Ntheta>1 ? fabs(cos(M_PI_180*theta))*M_PI_2:1.0); 
    213         ret += spherical_correction * weight * I; 
     209        ret += spherical_correction * weight * scattering; 
    214210      #else 
    215         ret += weight * I; 
     211        ret += weight * scattering; 
    216212      #endif 
    217213        norm += weight; 
     
    222218        norm_vol += vol_weight; 
    223219      } 
    224       //else { printf("exclude qx,qy,I:%%g,%%g,%%g\n",qi,I); } 
     220      //else { printf("exclude qx,qy,I:%%g,%%g,%%g\n",qi,scattering); } 
    225221    } 
    226222    IQXY_CLOSE_LOOPS 
Note: See TracChangeset for help on using the changeset viewer.