Changeset 1726b21 in sasmodels for Models


Ignore:
Timestamp:
Aug 8, 2014 1:45:51 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:
ae7d639
Parents:
8cdb9f1
Message:

cylinder now MUCH faster!

Location:
Models
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • Models/code_capcyl.py

    ra42fec0 r1726b21  
    1212 
    1313class GpuCapCylinder(object): 
    14     PARS = {'scale':1, 'rad_cyl':1, 'rad_cap':1, 'length':1, 'sld_capcyl':1e-6, 'sld_solv':0, 'background':0, 
     14    PARS = {'scale':1, 'rad_cyl':1, 'rad_cap':1, 'len_cyl':1, 'sld_capcyl':1e-6, 'sld_solv':0, 'background':0, 
    1515             'theta':0, 'phi':0} 
    1616 
    17     PD_PARS = ['rad_cyl', 'length', 'rad_cap', 'theta', 'phi'] 
     17    PD_PARS = ['rad_cyl', 'len_cyl', 'rad_cap', 'theta', 'phi'] 
    1818 
    1919    def __init__(self, qx, qy, dtype='float32'): 
     
    3939        self.res[:] = 0 
    4040        cl.enqueue_copy(queue, self.res_b, self.res) 
    41         rad_cyl,length,rad_cap,theta,phi = \ 
     41 
     42        rad_cyl,len_cyl,rad_cap,theta,phi = \ 
    4243            [GaussianDispersion(int(pars[base+'_pd_n']), pars[base+'_pd'], pars[base+'_pd_nsigma']) 
    4344             for base in GpuCapCylinder.PD_PARS] 
     
    4546        rad_cyl.value, rad_cyl.weight = rad_cyl.get_weights(pars['rad_cyl'], 0, 10000, True) 
    4647        rad_cap.value, rad_cap.weight = rad_cap.get_weights(pars['rad_cap'], 0, 10000, True) 
    47         length.value, length.weight = length.get_weights(pars['length'], 0, 10000, True) 
     48        len_cyl.value, len_cyl.weight = len_cyl.get_weights(pars['len_cyl'], 0, 10000, True) 
    4849        theta.value, theta.weight = theta.get_weights(pars['theta'], -90, 180, False) 
    4950        phi.value, phi.weight = phi.get_weights(pars['phi'], -90, 180, False) 
     
    5657        for i in xrange(len(rad_cyl.weight)): 
    5758            for m in xrange(len(rad_cap.weight)): 
    58                 for j in xrange(len(length.weight)): 
     59                for j in xrange(len(len_cyl.weight)): 
     60 
     61                    hDist = -1.0*sqrt(fabs(rad_cap.value[m]*rad_cap.value[m]-rad_cyl.value[i]*rad_cyl.value[i])) 
     62                    vol_i = 4.0*atan(1.0)*rad_cyl.value[i]*rad_cyl.value[i]*len_cyl.value[j]+2.0*4.0*atan(1.0)/3.0\ 
     63                                    *((rad_cap.value[m]-hDist)*(rad_cap.value[m]-hDist)*(2*rad_cap.value[m]+hDist)) 
     64                    vol += rad_cyl.weight[i]*len_cyl.weight[j]*rad_cap.weight[m]*vol_i 
     65                    norm_vol += rad_cyl.weight[i]*len_cyl.weight[j]*rad_cap.weight[m] 
     66 
    5967                    for k in xrange(len(theta.weight)): 
    6068                        for l in xrange(len(phi.weight)): 
    61                             hDist = -1.0*sqrt(fabs(rad_cap.value[m]*rad_cap.value[m]-rad_cyl.value[i]*rad_cyl.value[i])) 
    62                             vol_i = 4.0*atan(1.0)*rad_cyl.value[i]*rad_cyl.value[i]*length.value[j]+2.0*4.0*atan(1.0)/3.0\ 
    63                                             *((rad_cap.value[m]-hDist)*(rad_cap.value[m]-hDist)*(2*rad_cap.value[m]+hDist)) 
     69 
    6470                            self.prg.CapCylinderKernel(queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, 
    65                                         real(vol_i), real(hDist), real(rad_cyl.value[i]), real(rad_cap.value[m]), real(length.value[j]), 
     71                                        real(vol_i), real(hDist), real(rad_cyl.value[i]), real(rad_cap.value[m]), real(len_cyl.value[j]), 
    6672                                        real(theta.value[k]), real(phi.value[l]), real(sub), real(pars['scale']), 
    6773                                        real(phi.weight[l]), real(theta.weight[k]), real(rad_cap.weight[m]), 
    68                                         real(rad_cyl.weight[i]), real(length.weight[j]), real(theta.weight[k]), np.uint32(self.qx.size), np.uint32(size)) 
     74                                        real(rad_cyl.weight[i]), real(len_cyl.weight[j]), real(theta.weight[k]), np.uint32(self.qx.size), np.uint32(size)) 
    6975 
    70                             vol += rad_cyl.weight[i]*length.weight[j]*rad_cap.weight[m]*vol_i 
    71                             norm_vol += rad_cyl.weight[i]*length.weight[j]*rad_cap.weight[m] 
    72                             norm += rad_cyl.weight[i]*length.weight[j]*rad_cap.weight[m]*theta.weight[k]*phi.weight[l] 
     76                            norm += rad_cyl.weight[i]*len_cyl.weight[j]*rad_cap.weight[m]*theta.weight[k]*phi.weight[l] 
     77 
     78 
    7379 
    7480        #if size > 1: 
  • Models/code_coreshellcyl.py

    ra42fec0 r1726b21  
    4848        for r in xrange(len(radius.weight)): 
    4949            for l in xrange(len(length.weight)): 
    50                 for at in xrange(len(axis_theta.weight)): 
    51                     for p in xrange(len(axis_phi.weight)): 
    52                         for th in xrange(len(thickness.weight)): 
     50                for th in xrange(len(thickness.weight)): 
     51 
     52                    vol += radius.weight[r]*length.weight[l]*thickness.weight[th]*pow(radius.value[r]+thickness.value[th],2)\ 
     53                                   *(length.value[l]+2.0*thickness.value[th]) 
     54                    norm_vol += radius.weight[r]*length.weight[l]*thickness.weight[th] 
     55 
     56                    for at in xrange(len(axis_theta.weight)): 
     57                        for p in xrange(len(axis_phi.weight)): 
    5358 
    5459                            self.prg.CoreShellCylinderKernel(queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, 
     
    5964                                    real(pars['shell_sld']), real(pars['solvent_sld']),np.uint32(size), 
    6065                                    np.uint32(self.qx.size)) 
    61                             vol += radius.weight[r]*length.weight[l]*thickness.weight[th]*pow(radius.value[r]+thickness.value[th],2)\ 
    62                                    *(length.value[l]+2.0*thickness.value[th]) 
    63                             norm_vol += radius.weight[r]*length.weight[l]*thickness.weight[th] 
     66 
    6467                            norm += radius.weight[r]*length.weight[l]*thickness.weight[th]*axis_theta.weight[at]\ 
    6568                                    *axis_phi.weight[p] 
  • Models/code_cylinder.py

    ra42fec0 r1726b21  
    66 
    77from weights import GaussianDispersion 
    8 from sasmodel import card, set_precision, set_precision_1d 
     8from sasmodel import card, set_precision, set_precision_1d, tic, toc 
    99 
    1010 
     
    3333    def eval(self, pars): 
    3434 
     35        tic() 
    3536        _ctx,queue = card() 
    3637        self.res[:] = 0 
     
    5556        for i in xrange(len(radius.weight)): 
    5657            for j in xrange(len(length.weight)): 
     58 
     59                vol += radius.weight[i]*length.weight[j]*pow(radius.value[i], 2)*length.value[j] 
     60                norm_vol += radius.weight[i]*length.weight[j] 
     61 
    5762                for k in xrange(len(cyl_theta.weight)): 
    5863                    for l in xrange(len(cyl_phi.weight)): 
     
    6368                                           np.uint32(self.qx.size), np.uint32(size)) 
    6469 
    65                         vol += radius.weight[i]*length.weight[j]*pow(radius.value[i], 2)*length.value[j] 
    66                         norm_vol += radius.weight[i]*length.weight[j] 
    6770                        norm += radius.weight[i]*length.weight[j]*cyl_theta.weight[k]*cyl_phi.weight[l] 
     71 
    6872 
    6973       # if size > 1: 
     
    7478            sum *= norm_vol/vol 
    7579 
     80        print toc()*1000, self.qx.shape[0] 
    7681        return sum/norm+pars['background'] 
    7782 
  • Models/code_ellipse.py

    ra42fec0 r1726b21  
    5353            for j in xrange(len(radius_b.weight)): 
    5454                #Average over theta distribution 
     55                vol += radius_a.weight[i]*radius_b.weight[j]*pow(radius_b.value[j], 2)*radius_a.value[i] 
     56                norm_vol += radius_a.weight[i]*radius_b.weight[j] 
     57 
    5558                for k in xrange(len(axis_theta.weight)): 
    5659                    #Average over phi distribution 
     
    6467                                        np.uint32(self.qx.size), np.uint32(len(axis_theta.weight))) 
    6568 
    66                         vol += radius_a.weight[i]*radius_b.weight[j]*pow(radius_b.value[j], 2)*radius_a.value[i] 
    67                         norm_vol += radius_a.weight[i]*radius_b.weight[j] 
    6869                        norm += radius_a.weight[i]*radius_b.weight[j]*axis_theta.weight[k]*axis_phi.weight[l] 
     70 
    6971        # Averaging in theta needs an extra normalization 
    7072        # factor to account for the sin(theta) term in the 
  • Models/code_triaxialellipse.py

    ra42fec0 r1726b21  
    99 
    1010class GpuTriEllipse: 
    11     PARS = {'scale':1, 'axisA':35, 'axisB':100, 'axisC':400, 'sldEll':1e-6, 'sldSolv':6.3e-6, 'background':0, 
    12             'theta':0, 'phi':0, 'psi':0} 
     11    PARS = {'scale':1, 'semi_axisA':35, 'semi_axisB':100, 'semi_axisC':400, 'sldEll':1e-6, 'sldSolv':6.3e-6, 'background':0, 
     12            'axis_theta':0, 'axis_phi':0, 'axis_psi':0} 
    1313 
    14     PD_PARS = ['axisA', 'axisB', 'axisC', 'theta', 'phi', 'psi'] 
     14    PD_PARS = ['semi_axisA', 'semi_axisB', 'semi_axisC', 'axis_theta', 'axis_phi', 'axis_psi'] 
    1515 
    1616    def __init__(self, qx, qy, dtype='float32'): 
     
    3232        self.res[:] = 0 
    3333        cl.enqueue_copy(queue, self.res_b, self.res) 
    34         axisA, axisB, axisC, theta, phi, psi = \ 
     34        semi_axisA, semi_axisB, semi_axisC, axis_theta, axis_phi, axis_psi = \ 
    3535            [GaussianDispersion(int(pars[base+'_pd_n']), pars[base+'_pd'], pars[base+'_pd_nsigma']) 
    3636             for base in GpuTriEllipse.PD_PARS] 
    3737 
    38         axisA.value, axisA.weight = axisA.get_weights(pars['axisA'], 0, 10000, True) 
    39         axisB.value, axisB.weight = axisB.get_weights(pars['axisB'], 0, 10000, True) 
    40         axisC.value, axisC.weight = axisC.get_weights(pars['axisC'], 0, 10000, True) 
    41         theta.value, theta.weight = theta.get_weights(pars['theta'], -90, 180, False) 
    42         phi.value, phi.weight = phi.get_weights(pars['phi'], -90, 180, False) 
    43         psi.value, psi.weight = psi.get_weights(pars['psi'], -90, 180, False) 
     38        semi_axisA.value, semi_axisA.weight = semi_axisA.get_weights(pars['semi_axisA'], 0, 10000, True) 
     39        semi_axisB.value, semi_axisB.weight = semi_axisB.get_weights(pars['semi_axisB'], 0, 10000, True) 
     40        semi_axisC.value, semi_axisC.weight = semi_axisC.get_weights(pars['semi_axisC'], 0, 10000, True) 
     41        axis_theta.value, axis_theta.weight = axis_theta.get_weights(pars['axis_theta'], -90, 180, False) 
     42        axis_phi.value, axis_phi.weight = axis_phi.get_weights(pars['axis_phi'], -90, 180, False) 
     43        axis_psi.value, axis_psi.weight = axis_psi.get_weights(pars['axis_psi'], -90, 180, False) 
    4444 
    4545        sum, norm, norm_vol, vol = 0.0, 0.0, 0.0, 0.0 
    46         size = len(theta.weight) 
     46        size = len(axis_theta.weight) 
    4747        sub = pars['sldEll'] - pars['sldSolv'] 
    4848 
    4949        real = np.float32 if self.qx.dtype == np.dtype('float32') else np.float64 
    50         for a in xrange(len(axisA.weight)): 
    51             for b in xrange(len(axisB.weight)): 
    52                 for c in xrange(len(axisC.weight)): 
    53                     for t in xrange(len(theta.weight)): 
    54                         for i in xrange(len(phi.weight)): 
    55                             for s in xrange(len(psi.weight)): 
     50        for a in xrange(len(semi_axisA.weight)): 
     51            for b in xrange(len(semi_axisB.weight)): 
     52                for c in xrange(len(semi_axisC.weight)): 
     53 
     54                    vol += semi_axisA.weight[a]*semi_axisB.weight[b]*semi_axisC.weight[c]*semi_axisA.value[a]*semi_axisB.value[b]*semi_axisC.value[c] 
     55                    norm_vol += semi_axisA.weight[a]*semi_axisB.weight[b]*semi_axisC.weight[c] 
     56 
     57                    for t in xrange(len(axis_theta.weight)): 
     58                        for i in xrange(len(axis_phi.weight)): 
     59                            for s in xrange(len(axis_psi.weight)): 
    5660                                self.prg.TriaxialEllipseKernel(queue, self.qx.shape, None, self.qx_b, self.qy_b, self.res_b, 
    57                                             real(sub), real(pars['scale']), real(axisA.value[a]), real(axisB.value[b]), 
    58                                             real(axisC.value[c]), real(phi.value[i]), real(theta.value[t]), real(psi.value[s]), 
    59                                             real(axisA.weight[a]), real(axisB.weight[b]), real(axisC.weight[c]), real(psi.weight[s]), 
    60                                             real(phi.weight[i]), real(theta.weight[t]), np.uint32(self.qx.size), np.uint32(size)) 
     61                                            real(sub), real(pars['scale']), real(semi_axisA.value[a]), real(semi_axisB.value[b]), 
     62                                            real(semi_axisC.value[c]), real(axis_phi.value[i]), real(axis_theta.value[t]), real(axis_psi.value[s]), 
     63                                            real(semi_axisA.weight[a]), real(semi_axisB.weight[b]), real(semi_axisC.weight[c]), real(axis_psi.weight[s]), 
     64                                            real(axis_phi.weight[i]), real(axis_theta.weight[t]), np.uint32(self.qx.size), np.uint32(size)) 
    6165 
    62                                 vol += axisA.weight[a]*axisB.weight[b]*axisC.weight[c]*axisA.value[a]*axisB.value[b]*axisC.value[c] 
    63                                 norm_vol += axisA.weight[a]*axisB.weight[b]*axisC.weight[c] 
    64                                 norm += axisA.weight[a]*axisB.weight[b]*axisC.weight[c]*theta.weight[t]*phi.weight[i]*psi.weight[s] 
     66                                norm += semi_axisA.weight[a]*semi_axisB.weight[b]*semi_axisC.weight[c]*axis_theta.weight[t]*axis_phi.weight[i]*axis_psi.weight[s] 
     67 
    6568 
    6669      #  if size > 1: 
Note: See TracChangeset for help on using the changeset viewer.