source: sans/Dev/trunk/NCNR_User_Procedures/Analysis/Models/NewModels_2008/BCC_ParaCrystal_v40.ipf @ 451

Last change on this file since 451 was 451, checked in by srkline, 14 years ago

Bug fixes for some of the newly added (2008) Analysis model functions. All are tested now and should be correct.

Also included in these changes are a few bug fixes in the package loader and Correct

File size: 8.5 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma IgorVersion=6.0
3
4//
5//
6// BCC paracrystal, powder average
7//
8// VERY slow, since the function is so ill-behaved and needs LOTS of quadrature
9// points. Adaptive methods were even slower and troublesom to converge,
10// although in theory they should be a better choice than blindly increasing the number of points.
11//
12// 150 points seems to give reasonable reproduction of the peak heights in the paper.
13// peak locations are correct
14// 76 points of quadrature for the smearing is only a guess, it's not been tested yet.
15//
16// Original implementation - Danilo Pozzo
17//              modified and modernized for more efficient integration SRK Nov 2008
18//
19//REFERENCE
20//Hideki Matsuoka etal. Physical Review B, Vol 36 Num 3, p1754 1987   ORIGINAL PAPER
21//Hideki Matsuoka etal. Physical Review B, Vol 41 Num 6, p3854 1990   CORRECTIONS TO PAPER
22//
23////////////////////////////////////////////////////
24
25
26
27Proc PlotBCC_ParaCrystal(num,qmin,qmax)
28        Variable num=100, qmin=0.001, qmax=0.7
29        Prompt num "Enter number of data points for model: "
30        Prompt qmin "Enter minimum q-value (^-1) for model: "
31        Prompt qmax "Enter maximum q-value (^-1) for model: "
32//
33        Make/O/D/n=(num) xwave_BCC_ParaCrystal, ywave_BCC_ParaCrystal
34        xwave_BCC_ParaCrystal =  alog(log(qmin) + x*((log(qmax)-log(qmin))/num))
35        Make/O/D coef_BCC_ParaCrystal = {1,220,0.06,40,3e-6,6.3e-6,0.0}
36        make/o/t parameters_BCC_ParaCrystal = {"scale","Nearest Neighbor (A)","distortion, g","Sphere Radius (A)","SLD Sphere (A-2)","SLD Solvent (A-2)", "Background (cm-1)"} 
37        Edit parameters_BCC_ParaCrystal, coef_BCC_ParaCrystal
38       
39        Variable/G root:gNordBCC=150
40       
41        Variable/G root:g_BCC_ParaCrystal
42        g_BCC_ParaCrystal := BCC_ParaCrystal(coef_BCC_ParaCrystal, ywave_BCC_ParaCrystal, xwave_BCC_ParaCrystal)
43        Display ywave_BCC_ParaCrystal vs xwave_BCC_ParaCrystal
44        ModifyGraph marker=29, msize=2, mode=4
45        ModifyGraph grid=1,mirror=2
46        ModifyGraph log=0
47        Label bottom "q (\\S-1\\M) "
48        Label left "I(q) (cm\\S-1\\M)"
49        AutoPositionWindow/M=1/R=$(WinName(0,1)) $WinName(0,2)
50       
51        AddModelToStrings("BCC_ParaCrystal","coef_BCC_ParaCrystal","BCC_ParaCrystal")
52//
53End
54
55//
56//this macro sets up all the necessary parameters and waves that are
57//needed to calculate the  smeared model function.
58//
59//no input parameters are necessary, it MUST use the experimental q-values
60// from the experimental data read in from an AVE/QSIG data file
61////////////////////////////////////////////////////
62// - sets up a dependency to a wrapper, not the actual SmearedModelFunction
63Proc PlotSmearedBCC_ParaCrystal(str)                                                           
64        String str
65        Prompt str,"Pick the data folder containing the resolution you want",popup,getAList(4)
66       
67        // if any of the resolution waves are missing => abort
68        if(ResolutionWavesMissingDF(str))               //updated to NOT use global strings (in GaussUtils)
69                Abort
70        endif
71       
72        SetDataFolder $("root:"+str)
73       
74        // Setup parameter table for model function
75        Make/O/D smear_coef_BCC_ParaCrystal = {1,220,0.06,40,3e-6,6.3e-6,0.0}
76        make/o/t smear_parameters_BCC_ParaCrystal = {"scale","Nearest Neighbor (A)","distortion, g","Sphere Radius (A)","SLD Sphere (A-2)","SLD Solvent (A-2)", "Background (cm-1)"}
77        Edit smear_parameters_BCC_ParaCrystal,smear_coef_BCC_ParaCrystal                                        //display parameters in a table
78       
79        // output smeared intensity wave, dimensions are identical to experimental QSIG values
80        // make extra copy of experimental q-values for easy plotting
81        Duplicate/O $(str+"_q") smeared_BCC_ParaCrystal,smeared_qvals
82        SetScale d,0,0,"1/cm",smeared_BCC_ParaCrystal
83       
84        Variable/G gNordBCC = 150       
85        Variable/G gs_BCC_ParaCrystal=0
86        gs_BCC_ParaCrystal := fSmearedBCC_ParaCrystal(smear_coef_BCC_ParaCrystal,smeared_BCC_ParaCrystal,smeared_qvals) //this wrapper fills the STRUCT
87       
88        Display smeared_BCC_ParaCrystal vs smeared_qvals
89        ModifyGraph marker=29,msize=2,mode=4
90        ModifyGraph log=0
91        Label bottom "q (\\S-1\\M)"
92        Label left "I(q) (cm\\S-1\\M)"
93        AutoPositionWindow/M=1/R=$(WinName(0,1)) $WinName(0,2)
94       
95        SetDataFolder root:
96        AddModelToStrings("SmearedBCC_ParaCrystal","smear_coef_BCC_ParaCrystal","BCC_ParaCrystal")
97End
98
99
100// nothing to change here
101//
102//AAO version, uses XOP if available
103// simply calls the original single point calculation with
104// a wave assignment (this will behave nicely if given point ranges)
105Function BCC_ParaCrystal(cw,yw,xw) : FitFunc
106        Wave cw,yw,xw
107       
108#if exists("BCC_ParaCrystalX")
109        yw = BCC_ParaCrystalX(cw,xw)
110#else
111        yw = fBCC_ParaCrystal(cw,xw)
112#endif
113        return(0)
114End
115
116
117//
118// unsmeared model calculation
119//
120Function fBCC_ParaCrystal(w,x) : FitFunc
121        Wave w
122        Variable x
123       
124//       Input (fitting) variables are not used
125//      you would give them nice names
126        Variable integral,loLim,upLim
127        loLim = 0
128        upLim = 2*Pi
129       
130        Variable/G root:gDumY=0         //root:gDumX=0
131       
132
133        Variable scale,Dnn,gg,Rad,contrast,background,yy,latticeScale,sld,sldSolv
134        scale = w[0]
135        Dnn = w[1] //Nearest neighbor distance A
136        gg = w[2] //Paracrystal distortion factor
137        Rad = w[3] //Sphere radius
138        sld = w[4]
139        sldSolv = w[5]
140        background = w[6]
141       
142        contrast = sld - sldSolv
143       
144        //Volume fraction calculated from lattice symmetry and sphere radius
145        latticeScale = 2*(4/3)*pi*(Rad^3)/((Dnn/((3/4)^0.5))^3)
146
147        NVAR/Z nord=root:gNordBCC
148        if(NVAR_Exists(nord)!=1)
149                nord=20
150        endif
151       
152
153        integral = IntegrateFn_N(Integrand_BCC_Outer,loLim,upLim,w,x,nord)
154       
155        integral *= SphereForm_BCC(Rad,contrast,x)*scale*latticeScale
156//      integral *= scale                       //testing, returns only Z(q)
157
158        integral += background 
159       
160        Return (integral)
161       
162End
163
164// the outer integral is also an integral
165Function Integrand_BCC_Outer(w,x,dum)
166        Wave w
167        Variable x,dum
168               
169        NVAR yy = root:gDumY           
170        yy = dum                                        // save the current dummy yy for use in the inner loop
171        Variable retVal,loLim,upLim
172        //
173        loLim = 0
174        upLim = Pi
175
176        NVAR/Z nord=root:gNordBCC
177        if(NVAR_Exists(nord)!=1)
178                nord=20
179        endif
180
181        retVal = IntegrateFn_N(Integrand_BCC_Inner,loLim,upLim,w,x,nord)
182       
183        return(retVal)
184End
185
186//returns the value of the integrand of the inner integral
187Function Integrand_BCC_Inner(w,qq,dum)
188        Wave w
189        Variable qq,dum
190       
191        NVAR yy = root:gDumY            //use the yy value from the outer loop
192        Variable xx,retVal
193        xx = dum
194
195        retVal = BCC_Integrand(w,qq,xx,yy)
196       
197        return(retVal)
198End
199
200Function BCC_Integrand(w,qq,xx,yy)
201        Wave w
202        Variable qq,xx,yy
203       
204        Variable retVal,temp1,temp2,temp3,temp4,temp5,aa,Da,Dnn,gg
205        Dnn = w[1] //Nearest neighbor distance A
206        gg = w[2] //Paracrystal distortion factor
207//      aa = Dnn*((4/3)^0.5)            //Danilo's version (the paper states |bi| = a)
208        aa = Dnn
209        Da = gg*aa
210       
211        temp1 = qq*qq*Da*Da
212        temp3 = qq*aa   
213       
214        retVal = BCCeval(xx,yy,temp1,temp3)
215        retVal /=4*Pi
216       
217        return(retVal)
218end
219
220Function BCCeval(Theta,Phi,temp1,temp3)
221        Variable Theta,Phi,temp1,temp3
222        Variable temp6,temp7,temp8,temp9,temp10
223        Variable result
224       
225        temp6 = sin(Theta)
226        temp7 = sin(Theta)*cos(Phi)+sin(Theta)*sin(Phi)+cos(Theta)
227        temp8 = -1*sin(Theta)*cos(Phi)-sin(Theta)*sin(Phi)+cos(Theta)
228        temp9 = -1*sin(Theta)*cos(Phi)+sin(Theta)*sin(Phi)-cos(Theta)
229        temp10 = exp((-1/8)*temp1*((temp7^2)+(temp8^2)+(temp9^2)))
230        result = ((1-(temp10^2))^3)*temp6/((1-2*temp10*cos(0.5*temp3*(temp7))+(temp10^2))*(1-2*temp10*cos(0.5*temp3*(temp8))+(temp10^2))*(1-2*temp10*cos(0.5*temp3*(temp9))+(temp10^2)))
231       
232        return (result)
233end
234
235
236Function SphereForm_BCC(radius,delrho,x)                                       
237        Variable radius,delrho,x
238       
239        // variables are:                                                       
240        //[2] radius ()
241        //[3] delrho (-2)
242        //[4] background (cm-1)
243       
244        // calculates scale * f^2/Vol where f=Vol*3*delrho*(sin(qr)-qrcos(qr))/qr^3
245        // and is rescaled to give [=] cm^-1
246       
247        Variable bes,f,vol,f2
248        //
249        //handle q==0 separately
250        If(x==0)
251                f = 4/3*pi*radius^3*delrho*delrho*1e8
252                return(f)
253        Endif
254       
255        bes = 3*(sin(x*radius)-x*radius*cos(x*radius))/x^3/radius^3
256        vol = 4*pi/3*radius^3
257        f = vol*bes*delrho              // [=] 
258        // normalize to single particle volume, convert to 1/cm
259        f2 = f * f / vol * 1.0e8                // [=] 1/cm
260       
261        return (f2)     
262       
263End
264
265
266
267
268///////////////////////////////////////////////////////////////
269// smeared model calculation
270//
271Function SmearedBCC_ParaCrystal(s) : FitFunc
272        Struct ResSmearAAOStruct &s
273
274//      the name of your unsmeared model (AAO) is the first argument
275        Smear_Model_76(BCC_ParaCrystal,s.coefW,s.xW,s.yW,s.resW)
276
277        return(0)
278End
279
280
281/////////////////////////////////////////////////////////////////
282//wrapper to calculate the smeared model as an AAO-Struct
283// fills the struct and calls the ususal function with the STRUCT parameter
284//
285// used only for the dependency, not for fitting
286//
287Function fSmearedBCC_ParaCrystal(coefW,yW,xW)
288        Wave coefW,yW,xW
289       
290        String str = getWavesDataFolder(yW,0)
291        String DF="root:"+str+":"
292       
293        WAVE resW = $(DF+str+"_res")
294       
295        STRUCT ResSmearAAOStruct fs
296        WAVE fs.coefW = coefW   
297        WAVE fs.yW = yW
298        WAVE fs.xW = xW
299        WAVE fs.resW = resW
300       
301        Variable err
302        err = SmearedBCC_ParaCrystal(fs)
303       
304        return (0)
305End
Note: See TracBrowser for help on using the repository browser.