Changeset 9eb3632 in sasmodels for sasmodels/kerneldll.py


Ignore:
Timestamp:
Jul 23, 2016 12:54:17 AM (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:
7b7da6b
Parents:
6a0d6aa
Message:

restructure kernels using fixed PD loops

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/kerneldll.py

    rb966a96 r9eb3632  
    270270        # int, int, int, int*, double*, double*, double*, double*, double 
    271271        argtypes = [c_int32]*3 + [c_void_p]*4 + [fp] 
    272         self._Iq = self._dll[generate.kernel_name(self.info, "Iq")] 
    273         self._Iqxy = self._dll[generate.kernel_name(self.info, "Iqxy")] 
    274         self._Imagnetic = self._dll[generate.kernel_name(self.info, "Imagnetic")] 
    275         self._Iq.argtypes = argtypes 
    276         self._Iqxy.argtypes = argtypes 
    277         self._Imagnetic.argtypes = argtypes 
     272        names = [generate.kernel_name(self.info, variant) 
     273                 for variant in ("Iq", "Iqxy", "Imagnetic")] 
     274        self._kernels = [self._dll[name] for name in names] 
     275        for k in self._kernels: 
     276            k.argtypes = argtypes 
    278277 
    279278    def __getstate__(self): 
     
    286285        self._dll = None 
    287286 
    288     def make_kernel(self, q_vectors, magnetic=False): 
     287    def make_kernel(self, q_vectors): 
    289288        # type: (List[np.ndarray]) -> DllKernel 
    290289        q_input = PyInput(q_vectors, self.dtype) 
     
    292291        if self._dll is None: 
    293292            self._load_dll() 
    294         kernel = [self._Iqxy, self._Imagnetic] if q_input.is_2d else [self._Iq]*2 
     293        is_2d = len(q_vectors) == 2 
     294        kernel = self._kernels[1:3] if is_2d else [self._kernels[0]]*2 
    295295        return DllKernel(kernel, self.info, q_input) 
    296296 
     
    346346        # type: (CallDetails, np.ndarray, np.ndarray, float, bool) -> np.ndarray 
    347347 
    348         #print("in kerneldll") 
    349         #print("values", values) 
    350         start, stop = 0, call_details.pd_prod 
     348        kernel = self.kernel[1 if magnetic else 0] 
    351349        args = [ 
    352350            self.q_input.nq, # nq 
    353             start, # pd_start 
    354             stop, # pd_stop pd_stride[MAX_PD] 
     351            None, # pd_start 
     352            None, # pd_stop pd_stride[MAX_PD] 
    355353            call_details.buffer.ctypes.data, # problem 
    356354            values.ctypes.data,  #pars 
     
    358356            self.result.ctypes.data,   # results 
    359357            self.real(cutoff), # cutoff 
    360             ] 
    361         #print("calling DLL") 
    362         self.kernel[1 if magnetic else 0](*args) # type: ignore 
    363         return self.result[:-1] 
     358        ] 
     359        #print("kerneldll values", values) 
     360        step = 100 
     361        for start in range(0, call_details.pd_prod, step): 
     362            stop = min(start+step, call_details.pd_prod) 
     363            args[1:3] = [start, stop] 
     364            #print("calling DLL") 
     365            kernel(*args) # type: ignore 
     366 
     367        #print("returned",self.q_input.q, self.result) 
     368        scale = values[0]/self.result[self.q_input.nq] 
     369        background = values[1] 
     370        #print("scale",scale,background) 
     371        return scale*self.result[:self.q_input.nq] + background 
    364372 
    365373    def release(self): 
Note: See TracChangeset for help on using the changeset viewer.