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

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

Adding a pile of new model functions. Some are from Boualem, some old code from Danilo, some from me.

As far as I can tell, these replicate the original references (not the empirical models).

Help file and XOPs have net been done yet.

File size: 8.4 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,0.}
36        make/o/t parameters_BCC_ParaCrystal = {"scale","Nearest Neighbor (A)","g","Sphere Radius (A)","Contrast (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,0.}
76        make/o/t smear_parameters_BCC_ParaCrystal = {"scale","Nearest Neighbor (A)","g","Sphere Radius (A)","Contrast (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
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        contrast = w[4] //SLD contrast
139        background = w[5]
140       
141        //Volume fraction calculated from lattice symmetry and sphere radius
142        latticeScale = 2*(4/3)*pi*(Rad^3)/((Dnn/((3/4)^0.5))^3)
143
144        NVAR/Z nord=root:gNordBCC
145        if(NVAR_Exists(nord)!=1)
146                nord=20
147        endif
148       
149
150        integral = IntegrateFn_N(Integrand_BCC_Outer,loLim,upLim,w,x,nord)
151       
152        integral *= SphereForm_BCC(Rad,contrast,x)*scale*latticeScale
153//      integral *= scale                       //testing, returns only Z(q)
154
155        integral += background 
156       
157        Return (integral)
158       
159End
160
161// the outer integral is also an integral
162Function Integrand_BCC_Outer(w,x,dum)
163        Wave w
164        Variable x,dum
165               
166        NVAR yy = root:gDumY           
167        yy = dum                                        // save the current dummy yy for use in the inner loop
168        Variable retVal,loLim,upLim
169        //
170        loLim = 0
171        upLim = Pi
172
173        NVAR/Z nord=root:gNordBCC
174        if(NVAR_Exists(nord)!=1)
175                nord=20
176        endif
177
178        retVal = IntegrateFn_N(Integrand_BCC_Inner,loLim,upLim,w,x,nord)
179       
180        return(retVal)
181End
182
183//returns the value of the integrand of the inner integral
184Function Integrand_BCC_Inner(w,qq,dum)
185        Wave w
186        Variable qq,dum
187       
188        NVAR yy = root:gDumY            //use the yy value from the outer loop
189        Variable xx,retVal
190        xx = dum
191
192        retVal = BCC_Integrand(w,qq,xx,yy)
193       
194        return(retVal)
195End
196
197Function BCC_Integrand(w,qq,xx,yy)
198        Wave w
199        Variable qq,xx,yy
200       
201        Variable retVal,temp1,temp2,temp3,temp4,temp5,aa,Da,Dnn,gg
202        Dnn = w[1] //Nearest neighbor distance A
203        gg = w[2] //Paracrystal distortion factor
204//      aa = Dnn*((4/3)^0.5)            //Danilo's version (the paper states |bi| = a)
205        aa = Dnn
206        Da = gg*aa
207       
208        temp1 = qq*qq*Da*Da
209        temp3 = qq*aa   
210       
211        retVal = BCCeval(xx,yy,temp1,temp3)
212        retVal /=4*Pi
213       
214        return(retVal)
215end
216
217Function BCCeval(Theta,Phi,temp1,temp3)
218        Variable Theta,Phi,temp1,temp3
219        Variable temp6,temp7,temp8,temp9,temp10
220        Variable result
221       
222        temp6 = sin(Theta)
223        temp7 = sin(Theta)*cos(Phi)+sin(Theta)*sin(Phi)+cos(Theta)
224        temp8 = -1*sin(Theta)*cos(Phi)-sin(Theta)*sin(Phi)+cos(Theta)
225        temp9 = -1*sin(Theta)*cos(Phi)+sin(Theta)*sin(Phi)-cos(Theta)
226        temp10 = exp((-1/8)*temp1*((temp7^2)+(temp8^2)+(temp9^2)))
227        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)))
228       
229        return (result)
230end
231
232
233Function SphereForm_BCC(radius,delrho,x)                                       
234        Variable radius,delrho,x
235       
236        // variables are:                                                       
237        //[2] radius ()
238        //[3] delrho (-2)
239        //[4] background (cm-1)
240       
241        // calculates scale * f^2/Vol where f=Vol*3*delrho*(sin(qr)-qrcos(qr))/qr^3
242        // and is rescaled to give [=] cm^-1
243       
244        Variable bes,f,vol,f2
245        //
246        //handle q==0 separately
247        If(x==0)
248                f = 4/3*pi*radius^3*delrho*delrho*1e8
249                return(f)
250        Endif
251       
252        bes = 3*(sin(x*radius)-x*radius*cos(x*radius))/x^3/radius^3
253        vol = 4*pi/3*radius^3
254        f = vol*bes*delrho              // [=] 
255        // normalize to single particle volume, convert to 1/cm
256        f2 = f * f / vol * 1.0e8                // [=] 1/cm
257       
258        return (f2)     
259       
260End
261
262
263
264
265///////////////////////////////////////////////////////////////
266// smeared model calculation
267//
268Function SmearedBCC_ParaCrystal(s) : FitFunc
269        Struct ResSmearAAOStruct &s
270
271//      the name of your unsmeared model (AAO) is the first argument
272        Smear_Model_76(BCC_ParaCrystal,s.coefW,s.xW,s.yW,s.resW)
273
274        return(0)
275End
276
277
278/////////////////////////////////////////////////////////////////
279//wrapper to calculate the smeared model as an AAO-Struct
280// fills the struct and calls the ususal function with the STRUCT parameter
281//
282// used only for the dependency, not for fitting
283//
284Function fSmearedBCC_ParaCrystal(coefW,yW,xW)
285        Wave coefW,yW,xW
286       
287        String str = getWavesDataFolder(yW,0)
288        String DF="root:"+str+":"
289       
290        WAVE resW = $(DF+str+"_res")
291       
292        STRUCT ResSmearAAOStruct fs
293        WAVE fs.coefW = coefW   
294        WAVE fs.yW = yW
295        WAVE fs.xW = xW
296        WAVE fs.resW = resW
297       
298        Variable err
299        err = SmearedBCC_ParaCrystal(fs)
300       
301        return (0)
302End
Note: See TracBrowser for help on using the repository browser.