Changeset 8a20be5 in sasmodels for lamellarcode.py


Ignore:
Timestamp:
Jul 10, 2014 3:05:08 PM (10 years ago)
Author:
HMP1 <helen.park@…>
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
Message:

Added a fit2 (fits two different models at different angles)
(preliminary) Added CoreshellCyl? and CapCyl? Kernels
(preliminary) Updated kernels to include functions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lamellarcode.py

    r5378e40 r8a20be5  
    33 
    44import numpy as np 
    5 import math 
    65import pyopencl as cl 
    76from weights import GaussianDispersion 
     7 
     8def 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 
    819 
    920 
     
    1223        'scale':1, 'bi_thick':1, 'sld_bi':1e-6, 'sld_sol':0, 'background':0, 
    1324    } 
    14     PD_PARS = ['bi_thick'] 
    1525 
    16     def __init__(self, qx, qy): 
     26    def __init__(self, qx, qy, dtype='float'): 
    1727 
    18         self.qx = np.asarray(qx, np.float32) 
    19         self.qy = np.asarray(qy, np.float32) 
    2028        #create context, queue, and build program 
    2129        self.ctx = cl.create_some_context() 
    2230        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 
    2434 
    2535        #buffers 
     
    3848        sub = pars['sld_bi'] - pars['sld_sol'] 
    3949 
     50        real = np.float32 if self.qx.dtype == np.dtype('float32') else np.float64 
    4051        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)) 
    4354            cl.enqueue_copy(self.queue, self.res, self.res_b) 
    4455 
     
    4758 
    4859        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.0 
    56  
    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.res 
    64             norm += bi_thick.weight[i] 
    65  
    66         return sum/norm + pars.background 
    67  
    6860 
    6961def demo(): 
Note: See TracChangeset for help on using the changeset viewer.