Changeset 8a20be5 in sasmodels for lamellarcode.py
- Timestamp:
- Jul 10, 2014 3:05:08 PM (10 years ago)
- 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:
- 8faffcd
- Parents:
- 5378e40
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lamellarcode.py
r5378e40 r8a20be5 3 3 4 4 import numpy as np 5 import math6 5 import pyopencl as cl 7 6 from weights import GaussianDispersion 7 8 def set_precision(src, qx, qy, dtype): 9 qx = np.ascontiguousarray(qx, dtype=dtype) 10 qy = np.ascontiguousarray(qy, dtype=dtype) 11 if dtype == 'double': 12 header = """\ 13 #pragma OPENCL EXTENSION cl_khr_fp64: enable 14 #define real double 15 """ 16 return header+src,qx,qy 17 else: 18 return src,qx,qy 8 19 9 20 … … 12 23 'scale':1, 'bi_thick':1, 'sld_bi':1e-6, 'sld_sol':0, 'background':0, 13 24 } 14 PD_PARS = ['bi_thick']15 25 16 def __init__(self, qx, qy ):26 def __init__(self, qx, qy, dtype='float'): 17 27 18 self.qx = np.asarray(qx, np.float32)19 self.qy = np.asarray(qy, np.float32)20 28 #create context, queue, and build program 21 29 self.ctx = cl.create_some_context() 22 30 self.queue = cl.CommandQueue(self.ctx) 23 self.prg = cl.Program(self.ctx, open('Kernel-Lamellar.cpp').read()).build() 31 src,qx,qy = set_precision(open('Kernel-Lamellar.cpp').read(), qx, qy, dtype=dtype) 32 self.prg = cl.Program(self.ctx, src).build() 33 self.qx, self.qy = qx, qy 24 34 25 35 #buffers … … 38 48 sub = pars['sld_bi'] - pars['sld_sol'] 39 49 50 real = np.float32 if self.qx.dtype == np.dtype('float32') else np.float64 40 51 for i in xrange(len(bi_thick.weight)): 41 self.prg.LamellarKernel(self.queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, np.float32(bi_thick.value[i]),42 np.float32(pars['scale']), np.float32(sub), np.float32(pars['background']), np.uint32(self.qx.size))52 self.prg.LamellarKernel(self.queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, real(bi_thick.value[i]), 53 real(pars['scale']), real(sub), real(pars['background']), np.uint32(self.qx.size)) 43 54 cl.enqueue_copy(self.queue, self.res, self.res_b) 44 55 … … 47 58 48 59 return sum/norm + pars['background'] 49 50 def lamellar_fit(self, pars, b_n=10, b_w=.1, sigma=3):51 52 bi_thick = GaussianDispersion(b_n, b_w, sigma)53 bi_thick.value, bi_thick.weight = bi_thick.get_weights(pars.bi_thick, 0, 1000, True)54 55 sum, norm = 0.0, 0.056 57 for i in xrange(len(bi_thick.weight)):58 self.prg.LamellarKernel(self.queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, np.float32(bi_thick.value[i]),59 np.float32(pars.scale), np.float32(pars.sld_bi), np.float32(pars.sld_sol),60 np.float32(pars.background), np.uint32(self.qx.size))61 cl.enqueue_copy(self.queue, self.res, self.res_b)62 63 sum += bi_thick.weight[i]*self.res64 norm += bi_thick.weight[i]65 66 return sum/norm + pars.background67 68 60 69 61 def demo():
Note: See TracChangeset
for help on using the changeset viewer.