source: sasmodels/compare.py @ 1726b21

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 1726b21 was 1726b21, checked in by HMP1 <helen.park@…>, 10 years ago

cylinder now MUCH faster!

  • Property mode set to 100644
File size: 6.0 KB
RevLine 
[8a20be5]1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
[1726b21]4from sasmodel import SasModel, load_data, set_beam_stop, plot_data, tic, toc
5import numpy as np
[473183c]6
[8a20be5]7
8def sasview_model(modelname, **pars):
[9a9f5b5]9    modelname = modelname+"Model"
[8a20be5]10    sans = __import__('sans.models.'+modelname)
11    ModelClass = getattr(getattr(sans.models,modelname,None),modelname,None)
12    if ModelClass is None:
13        raise ValueError("could not find model %r in sans.models"%modelname)
14    model = ModelClass()
15
16    for k,v in pars.items():
17        if k.endswith("_pd"):
18            model.dispersion[k[:-3]]['width'] = v
19        elif k.endswith("_pd_n"):
20            model.dispersion[k[:-5]]['npts'] = v
21        elif k.endswith("_pd_nsigma"):
22            model.dispersion[k[:-10]]['nsigmas'] = v
23        else:
24            model.setParam(k, v)
25    return model
26
27
28def sasview_eval(model, data):
29    theory = model.evalDistribution([data.qx_data, data.qy_data])
30    return theory
31
[1726b21]32def plot(data, cpumodel, gpumodel, N, pars):
[8a20be5]33
[1726b21]34    model = SasModel(data, gpumodel, dtype='f', **pars)
[8a20be5]35    tic()
36    for i in range(N):
[1726b21]37        #pars['scale'] = np.random.rand()
38        model.update()
[8a20be5]39        gpu = model.theory()
40    gpu_time = toc()*1000./N
[1726b21]41    print "ocl t=%.1f ms"%gpu_time
42    tic()
43    for i in range(N):
44        cpu = sasview_eval(cpumodel, data)
45    cpu_time = toc()*1000./N
46    print "omp t=%.1f ms"%cpu_time
47
48    import matplotlib.pyplot as plt
[8a20be5]49
[a42fec0]50    print "gpu/cpu", max(gpu/cpu)
51    cpu *= max(gpu/cpu)
[8a20be5]52    relerr = (gpu - cpu)/cpu
53    print "max(|(ocl-omp)/ocl|)", max(abs(relerr))
[1726b21]54
[8a20be5]55
56    plt.subplot(131); plot_data(data, cpu); plt.title("omp t=%.1f ms"%cpu_time)
57    plt.subplot(132); plot_data(data, gpu); plt.title("ocl t=%.1f ms"%gpu_time)
[a42fec0]58    plt.subplot(133); plot_data(data, relerr); plt.title("relerr x 10^8"); plt.colorbar()
[8a20be5]59    plt.show()
60
[1726b21]61def newlen(N):
[8a21ba3]62    import sys
63
64    if len(sys.argv) > 1:
65        N = int(sys.argv[1])
[1726b21]66    data = load_data('December/DEC07098.DAT')
[8a21ba3]67    set_beam_stop(data, 0.004)
68
[1726b21]69    return data, N
[8a21ba3]70
[1726b21]71def cyl(N=1):
[8a21ba3]72
[1726b21]73    dtype = "float"
74    pars = dict(
75        scale=.003, radius=64.1, length=66.96, sldCyl=.291e-6, sldSolv=5.77e-6, background=.1,
76        cyl_theta=90, cyl_phi=0,
77        radius_pd=0.1, radius_pd_n=10, radius_pd_nsigma=3,
78        length_pd=0.1,length_pd_n=5, length_pd_nsigma=3,
79        cyl_theta_pd=0.1, cyl_theta_pd_n=5, cyl_theta_pd_nsigma=3,
80        cyl_phi_pd=0.1, cyl_phi_pd_n=10, cyl_phi_pd_nsigma=3)
[8a21ba3]81
[1726b21]82    from Models.code_cylinder_f import GpuCylinder as gpumodel
83    model = sasview_model('Cylinder', **pars)
84    data, N = newlen(N)
[8a21ba3]85
[1726b21]86    plot(data, model, gpumodel, N, pars)
87
88
89def ellipse(N=1):
90
91    pars = dict(scale=.027, radius_a=60, radius_b=180, sldEll=.297e-6, sldSolv=5.773e-6, background=4.9,
92                axis_theta=0, axis_phi=90,
93                radius_a_pd=0.1, radius_a_pd_n=10, radius_a_pd_nsigma=3,
94                radius_b_pd=0.1, radius_b_pd_n=10, radius_b_pd_nsigma=3,
95                axis_theta_pd=0.1, axis_theta_pd_n=6, axis_theta_pd_nsigma=3,
96                axis_phi_pd=0.1, axis_phi_pd_n=6, axis_phi_pd_nsigma=3,)
97
98    from Models.code_ellipse import GpuEllipse as gpumodel
99    model = sasview_model('Ellipsoid', **pars)
100
101    data, N = newlen(N)
102    plot(data, model, gpumodel, N, pars)
[8a21ba3]103
[a42fec0]104def coreshell(N=1):
[09e15be]105
[1726b21]106    data, N = newlen(N)
[09e15be]107
108    pars = dict(scale= 1.77881e-06, radius=325, thickness=25, length=34.2709,
109                 core_sld=1e-6, shell_sld=.291e-6, solvent_sld=7.105e-6,
110                 background=223.827, axis_theta=90, axis_phi=0,
111                 axis_theta_pd=15.8,
[1726b21]112                 radius_pd=0.1, radius_pd_n=10, radius_pd_nsigma=3,
113                 length_pd=0.1, length_pd_n=10, length_pd_nsigma=3,
114                 thickness_pd=0.1, thickness_pd_n=5, thickness_pd_nsigma=3,
115                 axis_theta_pd_n=20, axis_theta_pd_nsigma=5,
116                 axis_phi_pd=0.0008748, axis_phi_pd_n=5, axis_phi_pd_nsigma=3,)
[09e15be]117
118    model = sasview_model('CoreShellCylinder', **pars)
[1726b21]119    from Models.code_coreshellcyl import GpuCoreShellCylinder as gpumodel
[09e15be]120
[1726b21]121    plot(data, model, gpumodel, N, pars)
[09e15be]122
[1726b21]123def trellipse(N=1):
124
125    data, N = newlen(N)
126
127    pars = dict(scale=0.08, semi_axisA=15, semi_axisB=20, semi_axisC=500,
128                sldEll=7.105e-6, sldSolv=.291e-6,
129                background=5, axis_theta=0, axis_phi=0, axis_psi=0,
130                axis_theta_pd=20, axis_theta_pd_n=10, axis_theta_pd_nsigma=3,
131                axis_phi_pd=.1, axis_phi_pd_n=10, axis_phi_pd_nsigma=3,
132                axis_psi_pd=30, axis_psi_pd_n=5, axis_psi_pd_nsigma=3,
133                semi_axisA_pd=.1, semi_axisA_pd_n=5, semi_axisA_pd_nsigma=3,
134                semi_axisB_pd=.1, semi_axisB_pd_n=5, semi_axisB_pd_nsigma=3,
135                semi_axisC_pd=.1, semi_axisC_pd_n=5, semi_axisC_pd_nsigma=3,)
136
137    model = sasview_model('TriaxialEllipsoid', **pars)
138    from Models.code_triaxialellipse import GpuTriEllipse as gpumodel
139
140    plot(data, model, gpumodel, N, pars)
141
142def lamellar(N=1):
143
144    data, N = newlen(N)
145
146    pars = dict(scale=0.08,
147                bi_thick=19.2946,
148                sld_bi=5.38e-6,sld_sol=7.105e-6,
149                background=0.003,
150                bi_thick_pd= 0.37765, bi_thick_pd_n=40, bi_thick_pd_nsigma=3)
151
152    model = sasview_model('Lamellar', **pars)
153    from Models.code_lamellar import GpuLamellar as gpumodel
154
155    plot(data, model, gpumodel, N, pars)
156
157def cap(N=1):
158
159    data, N = newlen(N)
160
161    pars = dict(scale=.08, rad_cyl=20, rad_cap=40, len_cyl=400,
162                sld_capcyl=1e-6, sld_solv=6.3e-6,
163                background=0, theta=0, phi=0,
164                rad_cyl_pd=.1, rad_cyl_pd_n=10, rad_cyl_pd_nsigma=3,
165                rad_cap_pd=.1, rad_cap_pd_n=10, rad_cap_pd_nsigma=3,
166                len_cyl_pd=.1, len_cyl_pd_n=3, len_cyl_pd_nsigma=3,
167                theta_pd=.1, theta_pd_n=3, theta_pd_nsigma=3,
168                phi_pd=.1, phi_pd_n=3, phi_pd_nsigma=3)
169
170
171    model = sasview_model('CappedCylinder', **pars)
172    from Models.code_capcyl import GpuCapCylinder as gpumodel
173
174    plot(data, model, gpumodel, N, pars)
[09e15be]175
[8a20be5]176
177if __name__ == "__main__":
[1726b21]178    cyl(2)
[8a20be5]179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
Note: See TracBrowser for help on using the repository browser.