Changeset 5edfe12 in sasmodels for sasmodels/kerneldll.py


Ignore:
Timestamp:
Nov 24, 2015 4:13:15 PM (8 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:
7f7f99f
Parents:
92da231
Message:

support long double kernels for precision limited models

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/kerneldll.py

    r92da231 r5edfe12  
    4949import tempfile 
    5050import ctypes as ct 
    51 from ctypes import c_void_p, c_int, c_double, c_float 
     51from ctypes import c_void_p, c_int, c_longdouble, c_double, c_float 
    5252 
    5353import numpy as np 
     
    9696    if np.dtype(dtype) == generate.F32: 
    9797        basename += "32" 
     98    elif np.dtype(dtype) == generate.F64: 
     99        basename += "64" 
     100    else: 
     101        basename += "128" 
    98102    return joinpath(DLL_PATH, basename+'.so') 
    99103 
     
    118122    models are allowed as DLLs. 
    119123    """ 
    120     if not ALLOW_SINGLE_PRECISION_DLLS: dtype = "double"   # Force 64-bit dll 
    121124    dtype = np.dtype(dtype) 
     125    if dtype == generate.F32 and not ALLOW_SINGLE_PRECISION_DLLS: 
     126        dtype = generate.F64  # Force 64-bit dll 
    122127 
    123128    if callable(info.get('Iq',None)): 
     
    127132        source = generate.use_single(source) 
    128133        tempfile_prefix = 'sas_'+info['name']+'32_' 
     134    elif dtype == generate.F64: 
     135        tempfile_prefix = 'sas_'+info['name']+'64_' 
    129136    else: 
    130         tempfile_prefix = 'sas_'+info['name']+'_' 
     137        source = generate.use_long_double(source) 
     138        tempfile_prefix = 'sas_'+info['name']+'128_' 
    131139 
    132140    source_files = generate.sources(info) + [info['filename']] 
     
    196204            raise 
    197205 
    198         fp = c_float if self.dtype == generate.F32 else c_double 
     206        fp = (c_float if self.dtype == generate.F32 
     207              else c_double if self.dtype == generate.F64 
     208              else c_longdouble) 
    199209        pd_args_1d = [c_void_p, fp] + [c_int]*Npd1d if Npd1d else [] 
    200210        pd_args_2d= [c_void_p, fp] + [c_int]*Npd2d if Npd2d else [] 
     
    265275 
    266276    def __call__(self, fixed_pars, pd_pars, cutoff): 
    267         real = np.float32 if self.q_input.dtype == generate.F32 else np.float64 
     277        real = (np.float32 if self.q_input.dtype == generate.F32 
     278                else np.float64 if self.q_input.dtype == generate.F64 
     279                else np.float128) 
    268280 
    269281        nq = c_int(self.q_input.nq) 
Note: See TracChangeset for help on using the changeset viewer.