1 | # -*- coding: utf-8 -*- |
---|
2 | ''' |
---|
3 | *GSASIIstrMath - structure math routines* |
---|
4 | ----------------------------------------- |
---|
5 | ''' |
---|
6 | ########### SVN repository information ################### |
---|
7 | # $Date: 2018-05-13 00:30:39 +0000 (Sun, 13 May 2018) $ |
---|
8 | # $Author: vondreele $ |
---|
9 | # $Revision: 3383 $ |
---|
10 | # $URL: trunk/GSASIIstrMath.py $ |
---|
11 | # $Id: GSASIIstrMath.py 3383 2018-05-13 00:30:39Z vondreele $ |
---|
12 | ########### SVN repository information ################### |
---|
13 | from __future__ import division, print_function |
---|
14 | import time |
---|
15 | import copy |
---|
16 | import numpy as np |
---|
17 | import numpy.ma as ma |
---|
18 | import numpy.linalg as nl |
---|
19 | import scipy.stats as st |
---|
20 | import multiprocessing as mp |
---|
21 | import GSASIIpath |
---|
22 | GSASIIpath.SetVersionNumber("$Revision: 3383 $") |
---|
23 | import GSASIIElem as G2el |
---|
24 | import GSASIIlattice as G2lat |
---|
25 | import GSASIIspc as G2spc |
---|
26 | import GSASIIpwd as G2pwd |
---|
27 | import GSASIImapvars as G2mv |
---|
28 | import GSASIImath as G2mth |
---|
29 | import GSASIIobj as G2obj |
---|
30 | import GSASIImpsubs as G2mp |
---|
31 | #G2mp.InitMP(False)Â # This disables multiprocessing |
---|
32 | |
---|
33 | sind = lambda x: np.sin(x*np.pi/180.) |
---|
34 | cosd = lambda x: np.cos(x*np.pi/180.) |
---|
35 | tand = lambda x: np.tan(x*np.pi/180.) |
---|
36 | asind = lambda x: 180.*np.arcsin(x)/np.pi |
---|
37 | acosd = lambda x: 180.*np.arccos(x)/np.pi |
---|
38 | atan2d = lambda y,x: 180.*np.arctan2(y,x)/np.pi |
---|
39 | Â Â |
---|
40 | ateln2 =Â 8.0*np.log(2.0) |
---|
41 | twopi =Â 2.0*np.pi |
---|
42 | twopisq =Â 2.0*np.pi**2 |
---|
43 | nxs =Â np.newaxis |
---|
44 | |
---|
45 | ################################################################################ |
---|
46 | ##### Rigid Body Models |
---|
47 | ################################################################################ |
---|
48 | Â Â Â Â |
---|
49 | def ApplyRBModels(parmDict,Phases,rigidbodyDict,Update=False): |
---|
50 | Â Â ''' Takes RB info from RBModels in Phase and RB data in rigidbodyDict along with |
---|
51 | Â Â current RB values in parmDict & modifies atom contents (xyz & Uij) of parmDict |
---|
52 | Â Â ''' |
---|
53 | Â Â atxIds =Â ['Ax:','Ay:','Az:'] |
---|
54 | Â Â atuIds =Â ['AU11:','AU22:','AU33:','AU12:','AU13:','AU23:'] |
---|
55 | Â Â RBIds =Â rigidbodyDict.get('RBIds',{'Vector':[],'Residue':[]})Â #these are lists of rbIds |
---|
56 |   if not RBIds['Vector'] and not RBIds['Residue']: |
---|
57 | Â Â Â Â return |
---|
58 | Â Â VRBIds =Â RBIds['Vector'] |
---|
59 | Â Â RRBIds =Â RBIds['Residue'] |
---|
60 |   if Update: |
---|
61 | Â Â Â Â RBData =Â rigidbodyDict |
---|
62 | Â Â else: |
---|
63 | Â Â Â Â RBData =Â copy.deepcopy(rigidbodyDict)Â Â Â # don't mess with original! |
---|
64 |   if RBIds['Vector']:            # first update the vector magnitudes |
---|
65 | Â Â Â Â VRBData =Â RBData['Vector'] |
---|
66 |     for i,rbId in enumerate(VRBIds): |
---|
67 |       if VRBData[rbId]['useCount']: |
---|
68 |         for j in range(len(VRBData[rbId]['VectMag'])): |
---|
69 | Â Â Â Â Â Â Â Â Â Â name =Â '::RBV;'+str(j)+':'+str(i) |
---|
70 | Â Â Â Â Â Â Â Â Â Â VRBData[rbId]['VectMag'][j]Â =Â parmDict[name] |
---|
71 |   for phase in Phases: |
---|
72 | Â Â Â Â Phase =Â Phases[phase] |
---|
73 | Â Â Â Â General =Â Phase['General'] |
---|
74 | Â Â Â Â cx,ct,cs,cia =Â General['AtomPtrs'] |
---|
75 | Â Â Â Â cell =Â General['Cell'][1:7] |
---|
76 | Â Â Â Â Amat,Bmat =Â G2lat.cell2AB(cell) |
---|
77 | Â Â Â Â AtLookup =Â G2mth.FillAtomLookUp(Phase['Atoms'],cia+8) |
---|
78 | Â Â Â Â pfx =Â str(Phase['pId'])+'::' |
---|
79 |     if Update: |
---|
80 | Â Â Â Â Â Â RBModels =Â Phase['RBModels'] |
---|
81 | Â Â Â Â else: |
---|
82 | Â Â Â Â Â Â RBModels =Â copy.deepcopy(Phase['RBModels'])Â # again don't mess with original! |
---|
83 |     for irb,RBObj in enumerate(RBModels.get('Vector',[])): |
---|
84 | Â Â Â Â Â Â jrb =Â VRBIds.index(RBObj['RBId']) |
---|
85 | Â Â Â Â Â Â rbsx =Â str(irb)+':'+str(jrb) |
---|
86 |       for i,px in enumerate(['RBVPx:','RBVPy:','RBVPz:']): |
---|
87 | Â Â Â Â Â Â Â Â RBObj['Orig'][0][i]Â =Â parmDict[pfx+px+rbsx] |
---|
88 |       for i,po in enumerate(['RBVOa:','RBVOi:','RBVOj:','RBVOk:']): |
---|
89 | Â Â Â Â Â Â Â Â RBObj['Orient'][0][i]Â =Â parmDict[pfx+po+rbsx] |
---|
90 | Â Â Â Â Â Â RBObj['Orient'][0]Â =Â G2mth.normQ(RBObj['Orient'][0]) |
---|
91 | Â Â Â Â Â Â TLS =Â RBObj['ThermalMotion'] |
---|
92 |       if 'T' in TLS[0]: |
---|
93 |         for i,pt in enumerate(['RBVT11:','RBVT22:','RBVT33:','RBVT12:','RBVT13:','RBVT23:']): |
---|
94 | Â Â Â Â Â Â Â Â Â Â TLS[1][i]Â =Â parmDict[pfx+pt+rbsx] |
---|
95 |       if 'L' in TLS[0]: |
---|
96 |         for i,pt in enumerate(['RBVL11:','RBVL22:','RBVL33:','RBVL12:','RBVL13:','RBVL23:']): |
---|
97 | Â Â Â Â Â Â Â Â Â Â TLS[1][i+6]Â =Â parmDict[pfx+pt+rbsx] |
---|
98 |       if 'S' in TLS[0]: |
---|
99 |         for i,pt in enumerate(['RBVS12:','RBVS13:','RBVS21:','RBVS23:','RBVS31:','RBVS32:','RBVSAA:','RBVSBB:']): |
---|
100 | Â Â Â Â Â Â Â Â Â Â TLS[1][i+12]Â =Â parmDict[pfx+pt+rbsx] |
---|
101 |       if 'U' in TLS[0]: |
---|
102 | Â Â Â Â Â Â Â Â TLS[1][0]Â =Â parmDict[pfx+'RBVU:'+rbsx] |
---|
103 | Â Â Â Â Â Â XYZ,Cart =Â G2mth.UpdateRBXYZ(Bmat,RBObj,RBData,'Vector') |
---|
104 | Â Â Â Â Â Â UIJ =Â G2mth.UpdateRBUIJ(Bmat,Cart,RBObj) |
---|
105 |       for i,x in enumerate(XYZ): |
---|
106 | Â Â Â Â Â Â Â Â atId =Â RBObj['Ids'][i] |
---|
107 |         for j in [0,1,2]: |
---|
108 | Â Â Â Â Â Â Â Â Â Â parmDict[pfx+atxIds[j]+str(AtLookup[atId])]Â =Â x[j] |
---|
109 |         if UIJ[i][0] == 'A': |
---|
110 |           for j in range(6): |
---|
111 | Â Â Â Â Â Â Â Â Â Â Â Â parmDict[pfx+atuIds[j]+str(AtLookup[atId])]Â =Â UIJ[i][j+2] |
---|
112 |         elif UIJ[i][0] == 'I': |
---|
113 | Â Â Â Â Â Â Â Â Â Â parmDict[pfx+'AUiso:'+str(AtLookup[atId])]Â =Â UIJ[i][1] |
---|
114 | Â Â Â Â Â Â |
---|
115 |     for irb,RBObj in enumerate(RBModels.get('Residue',[])): |
---|
116 | Â Â Â Â Â Â jrb =Â RRBIds.index(RBObj['RBId']) |
---|
117 | Â Â Â Â Â Â rbsx =Â str(irb)+':'+str(jrb) |
---|
118 |       for i,px in enumerate(['RBRPx:','RBRPy:','RBRPz:']): |
---|
119 | Â Â Â Â Â Â Â Â RBObj['Orig'][0][i]Â =Â parmDict[pfx+px+rbsx] |
---|
120 |       for i,po in enumerate(['RBROa:','RBROi:','RBROj:','RBROk:']): |
---|
121 | Â Â Â Â Â Â Â Â RBObj['Orient'][0][i]Â =Â parmDict[pfx+po+rbsx]Â Â Â Â Â Â Â Â |
---|
122 | Â Â Â Â Â Â RBObj['Orient'][0]Â =Â G2mth.normQ(RBObj['Orient'][0]) |
---|
123 | Â Â Â Â Â Â TLS =Â RBObj['ThermalMotion'] |
---|
124 |       if 'T' in TLS[0]: |
---|
125 |         for i,pt in enumerate(['RBRT11:','RBRT22:','RBRT33:','RBRT12:','RBRT13:','RBRT23:']): |
---|
126 | Â Â Â Â Â Â Â Â Â Â RBObj['ThermalMotion'][1][i]Â =Â parmDict[pfx+pt+rbsx] |
---|
127 |       if 'L' in TLS[0]: |
---|
128 |         for i,pt in enumerate(['RBRL11:','RBRL22:','RBRL33:','RBRL12:','RBRL13:','RBRL23:']): |
---|
129 | Â Â Â Â Â Â Â Â Â Â RBObj['ThermalMotion'][1][i+6]Â =Â parmDict[pfx+pt+rbsx] |
---|
130 |       if 'S' in TLS[0]: |
---|
131 |         for i,pt in enumerate(['RBRS12:','RBRS13:','RBRS21:','RBRS23:','RBRS31:','RBRS32:','RBRSAA:','RBRSBB:']): |
---|
132 | Â Â Â Â Â Â Â Â Â Â RBObj['ThermalMotion'][1][i+12]Â =Â parmDict[pfx+pt+rbsx] |
---|
133 |       if 'U' in TLS[0]: |
---|
134 | Â Â Â Â Â Â Â Â RBObj['ThermalMotion'][1][0]Â =Â parmDict[pfx+'RBRU:'+rbsx] |
---|
135 |       for itors,tors in enumerate(RBObj['Torsions']): |
---|
136 | Â Â Â Â Â Â Â Â tors[0]Â =Â parmDict[pfx+'RBRTr;'+str(itors)+':'+rbsx] |
---|
137 | Â Â Â Â Â Â XYZ,Cart =Â G2mth.UpdateRBXYZ(Bmat,RBObj,RBData,'Residue') |
---|
138 | Â Â Â Â Â Â UIJ =Â G2mth.UpdateRBUIJ(Bmat,Cart,RBObj) |
---|
139 |       for i,x in enumerate(XYZ): |
---|
140 | Â Â Â Â Â Â Â Â atId =Â RBObj['Ids'][i] |
---|
141 |         for j in [0,1,2]: |
---|
142 | Â Â Â Â Â Â Â Â Â Â parmDict[pfx+atxIds[j]+str(AtLookup[atId])]Â =Â x[j] |
---|
143 |         if UIJ[i][0] == 'A': |
---|
144 |           for j in range(6): |
---|
145 | Â Â Â Â Â Â Â Â Â Â Â Â parmDict[pfx+atuIds[j]+str(AtLookup[atId])]Â =Â UIJ[i][j+2] |
---|
146 |         elif UIJ[i][0] == 'I': |
---|
147 | Â Â Â Â Â Â Â Â Â Â parmDict[pfx+'AUiso:'+str(AtLookup[atId])]Â =Â UIJ[i][1] |
---|
148 | Â Â Â Â Â Â Â Â Â Â |
---|
149 | def ApplyRBModelDervs(dFdvDict,parmDict,rigidbodyDict,Phase): |
---|
150 | Â Â 'Needs a doc string' |
---|
151 | Â Â atxIds =Â ['dAx:','dAy:','dAz:'] |
---|
152 | Â Â atuIds =Â ['AU11:','AU22:','AU33:','AU12:','AU13:','AU23:'] |
---|
153 | Â Â OIds =Â ['Oa:','Oi:','Oj:','Ok:'] |
---|
154 | Â Â RBIds =Â rigidbodyDict.get('RBIds',{'Vector':[],'Residue':[]})Â #these are lists of rbIds |
---|
155 |   if not RBIds['Vector'] and not RBIds['Residue']: |
---|
156 | Â Â Â Â return |
---|
157 | Â Â VRBIds =Â RBIds['Vector'] |
---|
158 | Â Â RRBIds =Â RBIds['Residue'] |
---|
159 | Â Â RBData =Â rigidbodyDict |
---|
160 |   for item in parmDict: |
---|
161 |     if 'RB' in item: |
---|
162 |       dFdvDict[item] = 0.    #NB: this is a vector which is no. refl. long & must be filled! |
---|
163 | Â Â General =Â Phase['General'] |
---|
164 | Â Â cx,ct,cs,cia =Â General['AtomPtrs'] |
---|
165 | Â Â cell =Â General['Cell'][1:7] |
---|
166 | Â Â Amat,Bmat =Â G2lat.cell2AB(cell) |
---|
167 | Â Â rpd =Â np.pi/180. |
---|
168 | Â Â rpd2 =Â rpd**2 |
---|
169 | Â Â g =Â nl.inv(np.inner(Bmat,Bmat)) |
---|
170 | Â Â gvec =Â np.sqrt(np.array([g[0][0]**2,g[1][1]**2,g[2][2]**2, |
---|
171 | Â Â Â Â g[0][0]*g[1][1],g[0][0]*g[2][2],g[1][1]*g[2][2]])) |
---|
172 | Â Â AtLookup =Â G2mth.FillAtomLookUp(Phase['Atoms'],cia+8) |
---|
173 | Â Â pfx =Â str(Phase['pId'])+'::' |
---|
174 | Â Â RBModels =Â Phase['RBModels'] |
---|
175 |   for irb,RBObj in enumerate(RBModels.get('Vector',[])): |
---|
176 | Â Â Â Â VModel =Â RBData['Vector'][RBObj['RBId']] |
---|
177 | Â Â Â Â Q =Â RBObj['Orient'][0] |
---|
178 | Â Â Â Â jrb =Â VRBIds.index(RBObj['RBId']) |
---|
179 | Â Â Â Â rbsx =Â str(irb)+':'+str(jrb) |
---|
180 | Â Â Â Â dXdv =Â [] |
---|
181 |     for iv in range(len(VModel['VectMag'])): |
---|
182 | Â Â Â Â Â Â dCdv =Â [] |
---|
183 |       for vec in VModel['rbVect'][iv]: |
---|
184 | Â Â Â Â Â Â Â Â dCdv.append(G2mth.prodQVQ(Q,vec)) |
---|
185 | Â Â Â Â Â Â dXdv.append(np.inner(Bmat,np.array(dCdv)).T) |
---|
186 | Â Â Â Â XYZ,Cart =Â G2mth.UpdateRBXYZ(Bmat,RBObj,RBData,'Vector') |
---|
187 |     for ia,atId in enumerate(RBObj['Ids']): |
---|
188 | Â Â Â Â Â Â atNum =Â AtLookup[atId] |
---|
189 | Â Â Â Â Â Â dx =Â 0.00001 |
---|
190 |       for iv in range(len(VModel['VectMag'])): |
---|
191 |         for ix in [0,1,2]: |
---|
192 | Â Â Â Â Â Â Â Â Â Â dFdvDict['::RBV;'+str(iv)+':'+str(jrb)]Â +=Â dXdv[iv][ia][ix]*dFdvDict[pfx+atxIds[ix]+str(atNum)] |
---|
193 |       for i,name in enumerate(['RBVPx:','RBVPy:','RBVPz:']): |
---|
194 | Â Â Â Â Â Â Â Â dFdvDict[pfx+name+rbsx]Â +=Â dFdvDict[pfx+atxIds[i]+str(atNum)] |
---|
195 |       for iv in range(4): |
---|
196 | Â Â Â Â Â Â Â Â Q[iv]Â -=Â dx |
---|
197 | Â Â Â Â Â Â Â Â XYZ1 =Â G2mth.RotateRBXYZ(Bmat,Cart,G2mth.normQ(Q)) |
---|
198 | Â Â Â Â Â Â Â Â Q[iv]Â +=Â 2.*dx |
---|
199 | Â Â Â Â Â Â Â Â XYZ2 =Â G2mth.RotateRBXYZ(Bmat,Cart,G2mth.normQ(Q)) |
---|
200 | Â Â Â Â Â Â Â Â Q[iv]Â -=Â dx |
---|
201 | Â Â Â Â Â Â Â Â dXdO =Â (XYZ2[ia]-XYZ1[ia])/(2.*dx) |
---|
202 |         for ix in [0,1,2]: |
---|
203 | Â Â Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBV'+OIds[iv]+rbsx]Â +=Â dXdO[ix]*dFdvDict[pfx+atxIds[ix]+str(atNum)] |
---|
204 | Â Â Â Â Â Â X =Â G2mth.prodQVQ(Q,Cart[ia]) |
---|
205 |       dFdu = np.array([dFdvDict[pfx+Uid+str(AtLookup[atId])] for Uid in atuIds]).T/gvec |
---|
206 | Â Â Â Â Â Â dFdu =Â G2lat.U6toUij(dFdu.T) |
---|
207 | Â Â Â Â Â Â dFdu =Â np.tensordot(Amat,np.tensordot(Amat,dFdu,([1,0])),([0,1]))Â Â Â Â Â Â |
---|
208 | Â Â Â Â Â Â dFdu =Â G2lat.UijtoU6(dFdu) |
---|
209 | Â Â Â Â Â Â atNum =Â AtLookup[atId] |
---|
210 |       if 'T' in RBObj['ThermalMotion'][0]: |
---|
211 |         for i,name in enumerate(['RBVT11:','RBVT22:','RBVT33:','RBVT12:','RBVT13:','RBVT23:']): |
---|
212 | Â Â Â Â Â Â Â Â Â Â dFdvDict[pfx+name+rbsx]Â +=Â dFdu[i] |
---|
213 |       if 'L' in RBObj['ThermalMotion'][0]: |
---|
214 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVL11:'+rbsx]Â +=Â rpd2*(dFdu[1]*X[2]**2+dFdu[2]*X[1]**2-dFdu[5]*X[1]*X[2]) |
---|
215 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVL22:'+rbsx]Â +=Â rpd2*(dFdu[0]*X[2]**2+dFdu[2]*X[0]**2-dFdu[4]*X[0]*X[2]) |
---|
216 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVL33:'+rbsx]Â +=Â rpd2*(dFdu[0]*X[1]**2+dFdu[1]*X[0]**2-dFdu[3]*X[0]*X[1]) |
---|
217 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVL12:'+rbsx]Â +=Â rpd2*(-dFdu[3]*X[2]**2-2.*dFdu[2]*X[0]*X[1]+ |
---|
218 | Â Â Â Â Â Â Â Â Â Â dFdu[4]*X[1]*X[2]+dFdu[5]*X[0]*X[2]) |
---|
219 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVL13:'+rbsx]Â +=Â rpd2*(-dFdu[4]*X[1]**2-2.*dFdu[1]*X[0]*X[2]+ |
---|
220 | Â Â Â Â Â Â Â Â Â Â dFdu[3]*X[1]*X[2]+dFdu[5]*X[0]*X[1]) |
---|
221 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVL23:'+rbsx]Â +=Â rpd2*(-dFdu[5]*X[0]**2-2.*dFdu[0]*X[1]*X[2]+ |
---|
222 | Â Â Â Â Â Â Â Â Â Â dFdu[3]*X[0]*X[2]+dFdu[4]*X[0]*X[1]) |
---|
223 |       if 'S' in RBObj['ThermalMotion'][0]: |
---|
224 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVS12:'+rbsx]Â +=Â rpd*(dFdu[5]*X[1]-2.*dFdu[1]*X[2]) |
---|
225 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVS13:'+rbsx]Â +=Â rpd*(-dFdu[5]*X[2]+2.*dFdu[2]*X[1]) |
---|
226 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVS21:'+rbsx]Â +=Â rpd*(-dFdu[4]*X[0]+2.*dFdu[0]*X[2]) |
---|
227 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVS23:'+rbsx]Â +=Â rpd*(dFdu[4]*X[2]-2.*dFdu[2]*X[0]) |
---|
228 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVS31:'+rbsx]Â +=Â rpd*(dFdu[3]*X[0]-2.*dFdu[0]*X[1]) |
---|
229 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVS32:'+rbsx]Â +=Â rpd*(-dFdu[3]*X[1]+2.*dFdu[1]*X[0]) |
---|
230 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVSAA:'+rbsx]Â +=Â rpd*(dFdu[4]*X[1]-dFdu[3]*X[2]) |
---|
231 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVSBB:'+rbsx]Â +=Â rpd*(dFdu[5]*X[0]-dFdu[3]*X[2]) |
---|
232 |       if 'U' in RBObj['ThermalMotion'][0]: |
---|
233 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBVU:'+rbsx]Â +=Â dFdvDict[pfx+'AUiso:'+str(AtLookup[atId])] |
---|
234 | |
---|
235 | |
---|
236 |   for irb,RBObj in enumerate(RBModels.get('Residue',[])): |
---|
237 | Â Â Â Â Q =Â RBObj['Orient'][0] |
---|
238 | Â Â Â Â jrb =Â RRBIds.index(RBObj['RBId']) |
---|
239 | Â Â Â Â torData =Â RBData['Residue'][RBObj['RBId']]['rbSeq'] |
---|
240 | Â Â Â Â rbsx =Â str(irb)+':'+str(jrb) |
---|
241 | Â Â Â Â XYZ,Cart =Â G2mth.UpdateRBXYZ(Bmat,RBObj,RBData,'Residue') |
---|
242 |     for itors,tors in enumerate(RBObj['Torsions']):   #derivative error? |
---|
243 |       tname = pfx+'RBRTr;'+str(itors)+':'+rbsx      |
---|
244 | Â Â Â Â Â Â orId,pvId =Â torData[itors][:2] |
---|
245 | Â Â Â Â Â Â pivotVec =Â Cart[orId]-Cart[pvId] |
---|
246 | Â Â Â Â Â Â QA =Â G2mth.AVdeg2Q(-0.001,pivotVec) |
---|
247 | Â Â Â Â Â Â QB =Â G2mth.AVdeg2Q(0.001,pivotVec) |
---|
248 |       for ir in torData[itors][3]: |
---|
249 | Â Â Â Â Â Â Â Â atNum =Â AtLookup[RBObj['Ids'][ir]] |
---|
250 | Â Â Â Â Â Â Â Â rVec =Â Cart[ir]-Cart[pvId] |
---|
251 | Â Â Â Â Â Â Â Â dR =Â G2mth.prodQVQ(QB,rVec)-G2mth.prodQVQ(QA,rVec) |
---|
252 | Â Â Â Â Â Â Â Â dRdT =Â np.inner(Bmat,G2mth.prodQVQ(Q,dR))/.002 |
---|
253 |         for ix in [0,1,2]: |
---|
254 | Â Â Â Â Â Â Â Â Â Â dFdvDict[tname]Â +=Â dRdT[ix]*dFdvDict[pfx+atxIds[ix]+str(atNum)] |
---|
255 |     for ia,atId in enumerate(RBObj['Ids']): |
---|
256 | Â Â Â Â Â Â atNum =Â AtLookup[atId] |
---|
257 | Â Â Â Â Â Â dx =Â 0.00001 |
---|
258 |       for i,name in enumerate(['RBRPx:','RBRPy:','RBRPz:']): |
---|
259 | Â Â Â Â Â Â Â Â dFdvDict[pfx+name+rbsx]Â +=Â dFdvDict[pfx+atxIds[i]+str(atNum)] |
---|
260 |       for iv in range(4): |
---|
261 | Â Â Â Â Â Â Â Â Q[iv]Â -=Â dx |
---|
262 | Â Â Â Â Â Â Â Â XYZ1 =Â G2mth.RotateRBXYZ(Bmat,Cart,G2mth.normQ(Q)) |
---|
263 | Â Â Â Â Â Â Â Â Q[iv]Â +=Â 2.*dx |
---|
264 | Â Â Â Â Â Â Â Â XYZ2 =Â G2mth.RotateRBXYZ(Bmat,Cart,G2mth.normQ(Q)) |
---|
265 | Â Â Â Â Â Â Â Â Q[iv]Â -=Â dx |
---|
266 | Â Â Â Â Â Â Â Â dXdO =Â (XYZ2[ia]-XYZ1[ia])/(2.*dx) |
---|
267 |         for ix in [0,1,2]: |
---|
268 | Â Â Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBR'+OIds[iv]+rbsx]Â +=Â dXdO[ix]*dFdvDict[pfx+atxIds[ix]+str(atNum)] |
---|
269 | Â Â Â Â Â Â X =Â G2mth.prodQVQ(Q,Cart[ia]) |
---|
270 |       dFdu = np.array([dFdvDict[pfx+Uid+str(AtLookup[atId])] for Uid in atuIds]).T/gvec |
---|
271 | Â Â Â Â Â Â dFdu =Â G2lat.U6toUij(dFdu.T) |
---|
272 | Â Â Â Â Â Â dFdu =Â np.tensordot(Amat.T,np.tensordot(Amat,dFdu,([1,0])),([0,1])) |
---|
273 | Â Â Â Â Â Â dFdu =Â G2lat.UijtoU6(dFdu) |
---|
274 | Â Â Â Â Â Â atNum =Â AtLookup[atId] |
---|
275 |       if 'T' in RBObj['ThermalMotion'][0]: |
---|
276 |         for i,name in enumerate(['RBRT11:','RBRT22:','RBRT33:','RBRT12:','RBRT13:','RBRT23:']): |
---|
277 | Â Â Â Â Â Â Â Â Â Â dFdvDict[pfx+name+rbsx]Â +=Â dFdu[i] |
---|
278 |       if 'L' in RBObj['ThermalMotion'][0]: |
---|
279 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRL11:'+rbsx]Â +=Â rpd2*(dFdu[1]*X[2]**2+dFdu[2]*X[1]**2-dFdu[5]*X[1]*X[2]) |
---|
280 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRL22:'+rbsx]Â +=Â rpd2*(dFdu[0]*X[2]**2+dFdu[2]*X[0]**2-dFdu[4]*X[0]*X[2]) |
---|
281 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRL33:'+rbsx]Â +=Â rpd2*(dFdu[0]*X[1]**2+dFdu[1]*X[0]**2-dFdu[3]*X[0]*X[1]) |
---|
282 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRL12:'+rbsx]Â +=Â rpd2*(-dFdu[3]*X[2]**2-2.*dFdu[2]*X[0]*X[1]+ |
---|
283 | Â Â Â Â Â Â Â Â Â Â dFdu[4]*X[1]*X[2]+dFdu[5]*X[0]*X[2]) |
---|
284 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRL13:'+rbsx]Â +=Â rpd2*(dFdu[4]*X[1]**2-2.*dFdu[1]*X[0]*X[2]+ |
---|
285 | Â Â Â Â Â Â Â Â Â Â dFdu[3]*X[1]*X[2]+dFdu[5]*X[0]*X[1]) |
---|
286 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRL23:'+rbsx]Â +=Â rpd2*(dFdu[5]*X[0]**2-2.*dFdu[0]*X[1]*X[2]+ |
---|
287 | Â Â Â Â Â Â Â Â Â Â dFdu[3]*X[0]*X[2]+dFdu[4]*X[0]*X[1]) |
---|
288 |       if 'S' in RBObj['ThermalMotion'][0]: |
---|
289 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRS12:'+rbsx]Â +=Â rpd*(dFdu[5]*X[1]-2.*dFdu[1]*X[2]) |
---|
290 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRS13:'+rbsx]Â +=Â rpd*(-dFdu[5]*X[2]+2.*dFdu[2]*X[1]) |
---|
291 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRS21:'+rbsx]Â +=Â rpd*(-dFdu[4]*X[0]+2.*dFdu[0]*X[2]) |
---|
292 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRS23:'+rbsx]Â +=Â rpd*(dFdu[4]*X[2]-2.*dFdu[2]*X[0]) |
---|
293 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRS31:'+rbsx]Â +=Â rpd*(dFdu[3]*X[0]-2.*dFdu[0]*X[1]) |
---|
294 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRS32:'+rbsx]Â +=Â rpd*(-dFdu[3]*X[1]+2.*dFdu[1]*X[0]) |
---|
295 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRSAA:'+rbsx]Â +=Â rpd*(dFdu[4]*X[1]-dFdu[3]*X[2]) |
---|
296 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRSBB:'+rbsx]Â +=Â rpd*(dFdu[5]*X[0]-dFdu[3]*X[2]) |
---|
297 |       if 'U' in RBObj['ThermalMotion'][0]: |
---|
298 | Â Â Â Â Â Â Â Â dFdvDict[pfx+'RBRU:'+rbsx]Â +=Â dFdvDict[pfx+'AUiso:'+str(AtLookup[atId])] |
---|
299 | Â Â |
---|
300 | ################################################################################ |
---|
301 | ##### Penalty & restraint functions |
---|
302 | ################################################################################ |
---|
303 | |
---|
304 | def penaltyFxn(HistoPhases,calcControls,parmDict,varyList): |
---|
305 | Â Â 'Needs a doc string' |
---|
306 | Â Â Histograms,Phases,restraintDict,rigidbodyDict =Â HistoPhases |
---|
307 | Â Â pNames =Â [] |
---|
308 | Â Â pVals =Â [] |
---|
309 | Â Â pWt =Â [] |
---|
310 | Â Â negWt =Â {} |
---|
311 | Â Â pWsum =Â {} |
---|
312 | Â Â pWnum =Â {} |
---|
313 |   for phase in Phases: |
---|
314 | Â Â Â Â pId =Â Phases[phase]['pId'] |
---|
315 | Â Â Â Â negWt[pId]Â =Â Phases[phase]['General']['Pawley neg wt'] |
---|
316 | Â Â Â Â General =Â Phases[phase]['General'] |
---|
317 | Â Â Â Â cx,ct,cs,cia =Â General['AtomPtrs'] |
---|
318 | Â Â Â Â textureData =Â General['SH Texture'] |
---|
319 | Â Â Â Â SGData =Â General['SGData'] |
---|
320 | Â Â Â Â Atoms =Â Phases[phase]['Atoms'] |
---|
321 | Â Â Â Â AtLookup =Â G2mth.FillAtomLookUp(Phases[phase]['Atoms'],cia+8) |
---|
322 | Â Â Â Â cell =Â General['Cell'][1:7] |
---|
323 | Â Â Â Â Amat,Bmat =Â G2lat.cell2AB(cell) |
---|
324 |     if phase not in restraintDict: |
---|
325 | Â Â Â Â Â Â continue |
---|
326 | Â Â Â Â phaseRest =Â restraintDict[phase] |
---|
327 | Â Â Â Â names =Â [['Bond','Bonds'],['Angle','Angles'],['Plane','Planes'], |
---|
328 | Â Â Â Â Â Â ['Chiral','Volumes'],['Torsion','Torsions'],['Rama','Ramas'], |
---|
329 | Â Â Â Â Â Â ['ChemComp','Sites'],['Texture','HKLs'],] |
---|
330 |     for name,rest in names: |
---|
331 | Â Â Â Â Â Â pWsum[name]Â =Â 0. |
---|
332 | Â Â Â Â Â Â pWnum[name]Â =Â 0 |
---|
333 |       if name not in phaseRest: |
---|
334 | Â Â Â Â Â Â Â Â continue |
---|
335 | Â Â Â Â Â Â itemRest =Â phaseRest[name] |
---|
336 |       if itemRest[rest] and itemRest['Use']: |
---|
337 | Â Â Â Â Â Â Â Â wt =Â itemRest['wtFactor'] |
---|
338 |         if name in ['Bond','Angle','Plane','Chiral']: |
---|
339 |           for i,[indx,ops,obs,esd] in enumerate(itemRest[rest]): |
---|
340 | Â Â Â Â Â Â Â Â Â Â Â Â pNames.append(str(pId)+':'+name+':'+str(i)) |
---|
341 | Â Â Â Â Â Â Â Â Â Â Â Â XYZ =Â np.array(G2mth.GetAtomCoordsByID(pId,parmDict,AtLookup,indx)) |
---|
342 | Â Â Â Â Â Â Â Â Â Â Â Â XYZ =Â G2mth.getSyXYZ(XYZ,ops,SGData) |
---|
343 |             if name == 'Bond': |
---|
344 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â calc =Â G2mth.getRestDist(XYZ,Amat) |
---|
345 |             elif name == 'Angle': |
---|
346 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â calc =Â G2mth.getRestAngle(XYZ,Amat) |
---|
347 |             elif name == 'Plane': |
---|
348 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â calc =Â G2mth.getRestPlane(XYZ,Amat) |
---|
349 |             elif name == 'Chiral': |
---|
350 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â calc =Â G2mth.getRestChiral(XYZ,Amat) |
---|
351 | Â Â Â Â Â Â Â Â Â Â Â Â pVals.append(obs-calc) |
---|
352 | Â Â Â Â Â Â Â Â Â Â Â Â pWt.append(wt/esd**2) |
---|
353 | Â Â Â Â Â Â Â Â Â Â Â Â pWsum[name]Â +=Â wt*((obs-calc)/esd)**2 |
---|
354 | Â Â Â Â Â Â Â Â Â Â Â Â pWnum[name]Â +=Â 1 |
---|
355 |         elif name in ['Torsion','Rama']: |
---|
356 | Â Â Â Â Â Â Â Â Â Â coeffDict =Â itemRest['Coeff'] |
---|
357 |           for i,[indx,ops,cofName,esd] in enumerate(itemRest[rest]): |
---|
358 | Â Â Â Â Â Â Â Â Â Â Â Â pNames.append(str(pId)+':'+name+':'+str(i)) |
---|
359 | Â Â Â Â Â Â Â Â Â Â Â Â XYZ =Â np.array(G2mth.GetAtomCoordsByID(pId,parmDict,AtLookup,indx)) |
---|
360 | Â Â Â Â Â Â Â Â Â Â Â Â XYZ =Â G2mth.getSyXYZ(XYZ,ops,SGData) |
---|
361 |             if name == 'Torsion': |
---|
362 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â tor =Â G2mth.getRestTorsion(XYZ,Amat) |
---|
363 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â restr,calc =Â G2mth.calcTorsionEnergy(tor,coeffDict[cofName]) |
---|
364 | Â Â Â Â Â Â Â Â Â Â Â Â else: |
---|
365 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â phi,psi =Â G2mth.getRestRama(XYZ,Amat) |
---|
366 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â restr,calc =Â G2mth.calcRamaEnergy(phi,psi,coeffDict[cofName])Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â |
---|
367 | Â Â Â Â Â Â Â Â Â Â Â Â pVals.append(restr) |
---|
368 | Â Â Â Â Â Â Â Â Â Â Â Â pWt.append(wt/esd**2) |
---|
369 | Â Â Â Â Â Â Â Â Â Â Â Â pWsum[name]Â +=Â wt*(restr/esd)**2 |
---|
370 | Â Â Â Â Â Â Â Â Â Â Â Â pWnum[name]Â +=Â 1 |
---|
371 |         elif name == 'ChemComp': |
---|
372 |           for i,[indx,factors,obs,esd] in enumerate(itemRest[rest]): |
---|
373 | Â Â Â Â Â Â Â Â Â Â Â Â pNames.append(str(pId)+':'+name+':'+str(i)) |
---|
374 | Â Â Â Â Â Â Â Â Â Â Â Â mul =Â np.array(G2mth.GetAtomItemsById(Atoms,AtLookup,indx,cs+1)) |
---|
375 | Â Â Â Â Â Â Â Â Â Â Â Â frac =Â np.array(G2mth.GetAtomItemsById(Atoms,AtLookup,indx,cs-1)) |
---|
376 | Â Â Â Â Â Â Â Â Â Â Â Â calc =Â np.sum(mul*frac*factors) |
---|
377 | Â Â Â Â Â Â Â Â Â Â Â Â pVals.append(obs-calc) |
---|
378 | Â Â Â Â Â Â Â Â Â Â Â Â pWt.append(wt/esd**2)Â Â Â Â Â Â Â Â Â Â |
---|
379 | Â Â Â Â Â Â Â Â Â Â Â Â pWsum[name]Â +=Â wt*((obs-calc)/esd)**2 |
---|
380 | Â Â Â Â Â Â Â Â Â Â Â Â pWnum[name]Â +=Â 1 |
---|
381 |         elif name == 'Texture': |
---|
382 | Â Â Â Â Â Â Â Â Â Â SHkeys =Â list(textureData['SH Coeff'][1].keys()) |
---|
383 | Â Â Â Â Â Â Â Â Â Â SHCoef =Â G2mth.GetSHCoeff(pId,parmDict,SHkeys) |
---|
384 | Â Â Â Â Â Â Â Â Â Â shModels =Â ['cylindrical','none','shear - 2/m','rolling - mmm'] |
---|
385 | Â Â Â Â Â Â Â Â Â Â SamSym =Â dict(zip(shModels,['0','-1','2/m','mmm'])) |
---|
386 |           for i,[hkl,grid,esd1,ifesd2,esd2] in enumerate(itemRest[rest]): |
---|
387 | Â Â Â Â Â Â Â Â Â Â Â Â PH =Â np.array(hkl) |
---|
388 | Â Â Â Â Â Â Â Â Â Â Â Â phi,beta =Â G2lat.CrsAng(np.array(hkl),cell,SGData) |
---|
389 | Â Â Â Â Â Â Â Â Â Â Â Â ODFln =Â G2lat.Flnh(False,SHCoef,phi,beta,SGData) |
---|
390 | Â Â Â Â Â Â Â Â Â Â Â Â R,P,Z =Â G2mth.getRestPolefig(ODFln,SamSym[textureData['Model']],grid) |
---|
391 | Â Â Â Â Â Â Â Â Â Â Â Â Z1 =Â ma.masked_greater(Z,0.0)Â Â Â Â Â Â #is this + or -? |
---|
392 | Â Â Â Â Â Â Â Â Â Â Â Â IndZ1 =Â np.array(ma.nonzero(Z1)) |
---|
393 |             for ind in IndZ1.T: |
---|
394 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â pNames.append('%d:%s:%d:%.2f:%.2f'%(pId,name,i,R[ind[0],ind[1]],P[ind[0],ind[1]])) |
---|
395 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â pVals.append(Z1[ind[0]][ind[1]]) |
---|
396 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â pWt.append(wt/esd1**2) |
---|
397 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â pWsum[name]Â +=Â wt*(-Z1[ind[0]][ind[1]]/esd1)**2 |
---|
398 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â pWnum[name]Â +=Â 1 |
---|
399 |             if ifesd2: |
---|
400 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Z2 =Â 1.-Z |
---|
401 |               for ind in np.ndindex(grid,grid): |
---|
402 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pNames.append('%d:%s:%d:%.2f:%.2f'%(pId,name+'-unit',i,R[ind[0],ind[1]],P[ind[0],ind[1]])) |
---|
403 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pVals.append(Z2[ind[0]][ind[1]]) |
---|
404 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pWt.append(wt/esd2**2) |
---|
405 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pWsum[name]Â +=Â wt*(Z2/esd2)**2 |
---|
406 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pWnum[name]Â +=Â 1 |
---|
407 | Â Â Â Â |
---|
408 |   for phase in Phases: |
---|
409 | Â Â Â Â name =Â 'SH-Pref.Ori.' |
---|
410 | Â Â Â Â pId =Â Phases[phase]['pId'] |
---|
411 | Â Â Â Â General =Â Phases[phase]['General'] |
---|
412 | Â Â Â Â SGData =Â General['SGData'] |
---|
413 | Â Â Â Â cell =Â General['Cell'][1:7] |
---|
414 | Â Â Â Â pWsum[name]Â =Â 0.0 |
---|
415 | Â Â Â Â pWnum[name]Â =Â 0 |
---|
416 |     for hist in Phases[phase]['Histograms']: |
---|
417 |       if not Phases[phase]['Histograms'][hist]['Use']: |
---|
418 | Â Â Â Â Â Â Â Â continue |
---|
419 |       if hist in Histograms and 'PWDR' in hist: |
---|
420 | Â Â Â Â Â Â Â Â hId =Â Histograms[hist]['hId'] |
---|
421 | Â Â Â Â Â Â Â Â phfx =Â '%d:%d:'%(pId,hId) |
---|
422 |         if calcControls[phfx+'poType'] == 'SH': |
---|
423 | Â Â Â Â Â Â Â Â Â Â toler =Â calcControls[phfx+'SHtoler'] |
---|
424 | Â Â Â Â Â Â Â Â Â Â wt =Â 1./toler**2 |
---|
425 | Â Â Â Â Â Â Â Â Â Â HKLs =Â np.array(calcControls[phfx+'SHhkl']) |
---|
426 | Â Â Â Â Â Â Â Â Â Â SHnames =Â calcControls[phfx+'SHnames'] |
---|
427 |           SHcof = dict(zip(SHnames,[parmDict[phfx+cof] for cof in SHnames])) |
---|
428 |           for i,PH in enumerate(HKLs): |
---|
429 | Â Â Â Â Â Â Â Â Â Â Â Â phi,beta =Â G2lat.CrsAng(PH,cell,SGData) |
---|
430 | Â Â Â Â Â Â Â Â Â Â Â Â SH3Coef =Â {} |
---|
431 |             for item in SHcof: |
---|
432 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â L,N =Â eval(item.strip('C')) |
---|
433 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â SH3Coef['C%d,0,%d'%(L,N)]Â =Â SHcof[item]Â Â Â Â Â Â Â Â Â Â Â Â |
---|
434 | Â Â Â Â Â Â Â Â Â Â Â Â ODFln =Â G2lat.Flnh(False,SH3Coef,phi,beta,SGData) |
---|
435 | Â Â Â Â Â Â Â Â Â Â Â Â X =Â np.linspace(0,90.0,26) |
---|
436 | Â Â Â Â Â Â Â Â Â Â Â Â Y =Â ma.masked_greater(G2lat.polfcal(ODFln,'0',X,0.0),0.0)Â Â Â Â #+ or -? |
---|
437 | Â Â Â Â Â Â Â Â Â Â Â Â IndY =Â ma.nonzero(Y) |
---|
438 |             for ind in IndY[0]: |
---|
439 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â pNames.append('%d:%d:%s:%d:%.2f'%(pId,hId,name,i,X[ind])) |
---|
440 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â pVals.append(Y[ind]) |
---|
441 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â pWt.append(wt) |
---|
442 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â pWsum[name]Â +=Â wt*(Y[ind])**2 |
---|
443 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â pWnum[name]Â +=Â 1 |
---|
444 | Â Â pWsum['PWLref']Â =Â 0. |
---|
445 | Â Â pWnum['PWLref']Â =Â 0 |
---|
446 |   for item in varyList: |
---|
447 |     if 'PWLref' in item and parmDict[item] < 0.: |
---|
448 | Â Â Â Â Â Â pId =Â int(item.split(':')[0]) |
---|
449 |       if negWt[pId]: |
---|
450 | Â Â Â Â Â Â Â Â pNames.append(item) |
---|
451 | Â Â Â Â Â Â Â Â pVals.append(parmDict[item]) |
---|
452 | Â Â Â Â Â Â Â Â pWt.append(negWt[pId]) |
---|
453 | Â Â Â Â Â Â Â Â pWsum['PWLref']Â +=Â negWt[pId]*(parmDict[item])**2 |
---|
454 | Â Â Â Â Â Â Â Â pWnum['PWLref']Â +=Â 1 |
---|
455 | Â Â pVals =Â np.array(pVals) |
---|
456 | Â Â pWt =Â np.array(pWt)Â Â Â Â Â #should this be np.sqrt? |
---|
457 |   return pNames,pVals,pWt,pWsum,pWnum |
---|
458 | Â Â |
---|
459 | def penaltyDeriv(pNames,pVal,HistoPhases,calcControls,parmDict,varyList): |
---|
460 | Â Â 'Needs a doc string' |
---|
461 | Â Â Histograms,Phases,restraintDict,rigidbodyDict =Â HistoPhases |
---|
462 | Â Â pDerv =Â np.zeros((len(varyList),len(pVal))) |
---|
463 |   for phase in Phases: |
---|
464 | #Â Â Â Â if phase not in restraintDict: |
---|
465 | #Â Â Â Â Â Â continue |
---|
466 | Â Â Â Â pId =Â Phases[phase]['pId'] |
---|
467 | Â Â Â Â General =Â Phases[phase]['General'] |
---|
468 | Â Â Â Â cx,ct,cs,cia =Â General['AtomPtrs'] |
---|
469 | Â Â Â Â SGData =Â General['SGData'] |
---|
470 | Â Â Â Â Atoms =Â Phases[phase]['Atoms'] |
---|
471 | Â Â Â Â AtLookup =Â G2mth.FillAtomLookUp(Phases[phase]['Atoms'],cia+8) |
---|
472 | Â Â Â Â cell =Â General['Cell'][1:7] |
---|
473 | Â Â Â Â Amat,Bmat =Â G2lat.cell2AB(cell) |
---|
474 | Â Â Â Â textureData =Â General['SH Texture'] |
---|
475 | |
---|
476 | Â Â Â Â SHkeys =Â list(textureData['SH Coeff'][1].keys()) |
---|
477 | Â Â Â Â SHCoef =Â G2mth.GetSHCoeff(pId,parmDict,SHkeys) |
---|
478 | Â Â Â Â shModels =Â ['cylindrical','none','shear - 2/m','rolling - mmm'] |
---|
479 | Â Â Â Â SamSym =Â dict(zip(shModels,['0','-1','2/m','mmm'])) |
---|
480 | Â Â Â Â sam =Â SamSym[textureData['Model']] |
---|
481 | Â Â Â Â phaseRest =Â restraintDict.get(phase,{}) |
---|
482 | Â Â Â Â names =Â {'Bond':'Bonds','Angle':'Angles','Plane':'Planes', |
---|
483 | Â Â Â Â Â Â 'Chiral':'Volumes','Torsion':'Torsions','Rama':'Ramas', |
---|
484 | Â Â Â Â Â Â 'ChemComp':'Sites','Texture':'HKLs'} |
---|
485 | Â Â Â Â lasthkl =Â np.array([0,0,0]) |
---|
486 |     for ip,pName in enumerate(pNames): |
---|
487 | Â Â Â Â Â Â pnames =Â pName.split(':') |
---|
488 |       if pId == int(pnames[0]): |
---|
489 | Â Â Â Â Â Â Â Â name =Â pnames[1] |
---|
490 |         if 'PWL' in pName: |
---|
491 | Â Â Â Â Â Â Â Â Â Â pDerv[varyList.index(pName)][ip]Â +=Â 1. |
---|
492 | Â Â Â Â Â Â Â Â Â Â continue |
---|
493 |         elif 'SH-' in pName: |
---|
494 | Â Â Â Â Â Â Â Â Â Â continue |
---|
495 |         id = int(pnames[2]) |
---|
496 | Â Â Â Â Â Â Â Â itemRest =Â phaseRest[name] |
---|
497 |         if name in ['Bond','Angle','Plane','Chiral']: |
---|
498 | Â Â Â Â Â Â Â Â Â Â indx,ops,obs,esd =Â itemRest[names[name]][id] |
---|
499 | Â Â Â Â Â Â Â Â Â Â dNames =Â [] |
---|
500 |           for ind in indx: |
---|
501 |             dNames += [str(pId)+'::dA'+Xname+':'+str(AtLookup[ind]) for Xname in ['x','y','z']] |
---|
502 | Â Â Â Â Â Â Â Â Â Â XYZ =Â np.array(G2mth.GetAtomCoordsByID(pId,parmDict,AtLookup,indx)) |
---|
503 |           if name == 'Bond': |
---|
504 | Â Â Â Â Â Â Â Â Â Â Â Â deriv =Â G2mth.getRestDeriv(G2mth.getRestDist,XYZ,Amat,ops,SGData) |
---|
505 |           elif name == 'Angle': |
---|
506 | Â Â Â Â Â Â Â Â Â Â Â Â deriv =Â G2mth.getRestDeriv(G2mth.getRestAngle,XYZ,Amat,ops,SGData) |
---|
507 |           elif name == 'Plane': |
---|
508 | Â Â Â Â Â Â Â Â Â Â Â Â deriv =Â G2mth.getRestDeriv(G2mth.getRestPlane,XYZ,Amat,ops,SGData) |
---|
509 |           elif name == 'Chiral': |
---|
510 | Â Â Â Â Â Â Â Â Â Â Â Â deriv =Â G2mth.getRestDeriv(G2mth.getRestChiral,XYZ,Amat,ops,SGData) |
---|
511 |         elif name in ['Torsion','Rama']: |
---|
512 | Â Â Â Â Â Â Â Â Â Â coffDict =Â itemRest['Coeff'] |
---|
513 | Â Â Â Â Â Â Â Â Â Â indx,ops,cofName,esd =Â itemRest[names[name]][id] |
---|
514 | Â Â Â Â Â Â Â Â Â Â dNames =Â [] |
---|
515 |           for ind in indx: |
---|
516 |             dNames += [str(pId)+'::dA'+Xname+':'+str(AtLookup[ind]) for Xname in ['x','y','z']] |
---|
517 | Â Â Â Â Â Â Â Â Â Â XYZ =Â np.array(G2mth.GetAtomCoordsByID(pId,parmDict,AtLookup,indx)) |
---|
518 |           if name == 'Torsion': |
---|
519 | Â Â Â Â Â Â Â Â Â Â Â Â deriv =Â G2mth.getTorsionDeriv(XYZ,Amat,coffDict[cofName]) |
---|
520 | Â Â Â Â Â Â Â Â Â Â else: |
---|
521 | Â Â Â Â Â Â Â Â Â Â Â Â deriv =Â G2mth.getRamaDeriv(XYZ,Amat,coffDict[cofName]) |
---|
522 |         elif name == 'ChemComp': |
---|
523 | Â Â Â Â Â Â Â Â Â Â indx,factors,obs,esd =Â itemRest[names[name]][id] |
---|
524 | Â Â Â Â Â Â Â Â Â Â dNames =Â [] |
---|
525 |           for ind in indx: |
---|
526 | Â Â Â Â Â Â Â Â Â Â Â Â dNames +=Â [str(pId)+'::Afrac:'+str(AtLookup[ind])] |
---|
527 | Â Â Â Â Â Â Â Â Â Â Â Â mul =Â np.array(G2mth.GetAtomItemsById(Atoms,AtLookup,indx,cs+1)) |
---|
528 | Â Â Â Â Â Â Â Â Â Â Â Â deriv =Â mul*factors |
---|
529 |         elif 'Texture' in name: |
---|
530 | Â Â Â Â Â Â Â Â Â Â deriv =Â [] |
---|
531 | Â Â Â Â Â Â Â Â Â Â dNames =Â [] |
---|
532 | Â Â Â Â Â Â Â Â Â Â hkl,grid,esd1,ifesd2,esd2 =Â itemRest[names[name]][id] |
---|
533 | Â Â Â Â Â Â Â Â Â Â hkl =Â np.array(hkl) |
---|
534 |           if np.any(lasthkl-hkl): |
---|
535 | Â Â Â Â Â Â Â Â Â Â Â Â phi,beta =Â G2lat.CrsAng(np.array(hkl),cell,SGData) |
---|
536 | Â Â Â Â Â Â Â Â Â Â Â Â ODFln =Â G2lat.Flnh(False,SHCoef,phi,beta,SGData) |
---|
537 | Â Â Â Â Â Â Â Â Â Â Â Â lasthkl =Â copy.copy(hkl)Â Â Â Â Â Â Â Â Â Â Â Â |
---|
538 |           if 'unit' in name: |
---|
539 | Â Â Â Â Â Â Â Â Â Â Â Â pass |
---|
540 | Â Â Â Â Â Â Â Â Â Â else: |
---|
541 | Â Â Â Â Â Â Â Â Â Â Â Â gam =Â float(pnames[3]) |
---|
542 | Â Â Â Â Â Â Â Â Â Â Â Â psi =Â float(pnames[4]) |
---|
543 |             for SHname in ODFln: |
---|
544 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â l,m,n =Â eval(SHname[1:]) |
---|
545 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Ksl =Â G2lat.GetKsl(l,m,sam,psi,gam)[0] |
---|
546 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â dNames +=Â [str(pId)+'::'+SHname] |
---|
547 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â deriv.append(-ODFln[SHname][0]*Ksl/SHCoef[SHname]) |
---|
548 |         for dName,drv in zip(dNames,deriv): |
---|
549 | Â Â Â Â Â Â Â Â Â Â try: |
---|
550 | Â Â Â Â Â Â Â Â Â Â Â Â ind =Â varyList.index(dName) |
---|
551 | Â Â Â Â Â Â Â Â Â Â Â Â pDerv[ind][ip]Â +=Â drv |
---|
552 |           except ValueError: |
---|
553 | Â Â Â Â Â Â Â Â Â Â Â Â pass |
---|
554 | Â Â Â Â |
---|
555 | Â Â Â Â lasthkl =Â np.array([0,0,0]) |
---|
556 |     for ip,pName in enumerate(pNames): |
---|
557 | Â Â Â Â Â Â deriv =Â [] |
---|
558 | Â Â Â Â Â Â dNames =Â [] |
---|
559 | Â Â Â Â Â Â pnames =Â pName.split(':') |
---|
560 |       if 'SH-' in pName and pId == int(pnames[0]): |
---|
561 | Â Â Â Â Â Â Â Â hId =Â int(pnames[1]) |
---|
562 | Â Â Â Â Â Â Â Â phfx =Â '%d:%d:'%(pId,hId) |
---|
563 | Â Â Â Â Â Â Â Â psi =Â float(pnames[4]) |
---|
564 | Â Â Â Â Â Â Â Â HKLs =Â calcControls[phfx+'SHhkl'] |
---|
565 | Â Â Â Â Â Â Â Â SHnames =Â calcControls[phfx+'SHnames'] |
---|
566 |         SHcof = dict(zip(SHnames,[parmDict[phfx+cof] for cof in SHnames])) |
---|
567 | Â Â Â Â Â Â Â Â hkl =Â np.array(HKLs[int(pnames[3])])Â Â Â |
---|
568 |         if np.any(lasthkl-hkl): |
---|
569 | Â Â Â Â Â Â Â Â Â Â phi,beta =Â G2lat.CrsAng(np.array(hkl),cell,SGData) |
---|
570 | Â Â Â Â Â Â Â Â Â Â SH3Coef =Â {} |
---|
571 |           for item in SHcof: |
---|
572 | Â Â Â Â Â Â Â Â Â Â Â Â L,N =Â eval(item.strip('C')) |
---|
573 | Â Â Â Â Â Â Â Â Â Â Â Â SH3Coef['C%d,0,%d'%(L,N)]Â =Â SHcof[item]Â Â Â Â Â Â Â Â Â Â Â Â |
---|
574 | Â Â Â Â Â Â Â Â Â Â ODFln =Â G2lat.Flnh(False,SH3Coef,phi,beta,SGData) |
---|
575 | Â Â Â Â Â Â Â Â Â Â lasthkl =Â copy.copy(hkl)Â Â Â Â Â Â Â Â Â Â Â Â |
---|
576 |         for SHname in SHnames: |
---|
577 | Â Â Â Â Â Â Â Â Â Â l,n =Â eval(SHname[1:]) |
---|
578 | Â Â Â Â Â Â Â Â Â Â SH3name =Â 'C%d,0,%d'%(l,n) |
---|
579 | Â Â Â Â Â Â Â Â Â Â Ksl =Â G2lat.GetKsl(l,0,'0',psi,0.0)[0] |
---|
580 | Â Â Â Â Â Â Â Â Â Â dNames +=Â [phfx+SHname] |
---|
581 | Â Â Â Â Â Â Â Â Â Â deriv.append(ODFln[SH3name][0]*Ksl/SHcof[SHname]) |
---|
582 |       for dName,drv in zip(dNames,deriv): |
---|
583 | Â Â Â Â Â Â Â Â try: |
---|
584 | Â Â Â Â Â Â Â Â Â Â ind =Â varyList.index(dName) |
---|
585 | Â Â Â Â Â Â Â Â Â Â pDerv[ind][ip]Â +=Â drv |
---|
586 |         except ValueError: |
---|
587 | Â Â Â Â Â Â Â Â Â Â pass |
---|
588 |   return pDerv |
---|
589 | |
---|
590 | ################################################################################ |
---|
591 | ##### Function & derivative calculations |
---|
592 | ################################################################################Â Â Â Â |
---|
593 | Â Â Â Â Â Â Â Â Â Â |
---|
594 | def GetAtomFXU(pfx,calcControls,parmDict): |
---|
595 | Â Â 'Needs a doc string' |
---|
596 | Â Â Natoms =Â calcControls['Natoms'][pfx] |
---|
597 | Â Â Tdata =Â Natoms*[' ',] |
---|
598 | Â Â Mdata =Â np.zeros(Natoms) |
---|
599 | Â Â IAdata =Â Natoms*[' ',] |
---|
600 | Â Â Fdata =Â np.zeros(Natoms) |
---|
601 | Â Â Xdata =Â np.zeros((3,Natoms)) |
---|
602 | Â Â dXdata =Â np.zeros((3,Natoms)) |
---|
603 | Â Â Uisodata =Â np.zeros(Natoms) |
---|
604 | Â Â Uijdata =Â np.zeros((6,Natoms)) |
---|
605 | Â Â Gdata =Â np.zeros((3,Natoms)) |
---|
606 | Â Â keys =Â {'Atype:':Tdata,'Amul:':Mdata,'Afrac:':Fdata,'AI/A:':IAdata, |
---|
607 | Â Â Â Â 'dAx:':dXdata[0],'dAy:':dXdata[1],'dAz:':dXdata[2], |
---|
608 | Â Â Â Â 'Ax:':Xdata[0],'Ay:':Xdata[1],'Az:':Xdata[2],'AUiso:':Uisodata, |
---|
609 | Â Â Â Â 'AU11:':Uijdata[0],'AU22:':Uijdata[1],'AU33:':Uijdata[2], |
---|
610 | Â Â Â Â 'AU12:':Uijdata[3],'AU13:':Uijdata[4],'AU23:':Uijdata[5], |
---|
611 | Â Â Â Â 'AMx:':Gdata[0],'AMy:':Gdata[1],'AMz:':Gdata[2],} |
---|
612 |   for iatm in range(Natoms): |
---|
613 |     for key in keys: |
---|
614 | Â Â Â Â Â Â parm =Â pfx+key+str(iatm) |
---|
615 |       if parm in parmDict: |
---|
616 | Â Â Â Â Â Â Â Â keys[key][iatm]Â =Â parmDict[parm] |
---|
617 | Â Â Fdata =Â np.where(Fdata,Fdata,1.e-8)Â Â Â Â Â #avoid divide by zero in derivative calc. |
---|
618 |   return Tdata,Mdata,Fdata,Xdata,dXdata,IAdata,Uisodata,Uijdata,Gdata |
---|
619 | Â Â |
---|
620 | def GetAtomSSFXU(pfx,calcControls,parmDict): |
---|
621 | Â Â 'Needs a doc string' |
---|
622 | Â Â Natoms =Â calcControls['Natoms'][pfx] |
---|
623 | Â Â maxSSwave =Â calcControls['maxSSwave'][pfx] |
---|
624 | Â Â Nwave =Â {'F':maxSSwave['Sfrac'],'X':maxSSwave['Spos'],'Y':maxSSwave['Spos'],'Z':maxSSwave['Spos'], |
---|
625 | Â Â Â Â 'U':maxSSwave['Sadp'],'M':maxSSwave['Smag'],'T':maxSSwave['Spos']} |
---|
626 | Â Â XSSdata =Â np.zeros((6,maxSSwave['Spos'],Natoms)) |
---|
627 | Â Â FSSdata =Â np.zeros((2,maxSSwave['Sfrac'],Natoms)) |
---|
628 | Â Â USSdata =Â np.zeros((12,maxSSwave['Sadp'],Natoms)) |
---|
629 | Â Â MSSdata =Â np.zeros((6,maxSSwave['Smag'],Natoms)) |
---|
630 | Â Â waveTypes =Â [] |
---|
631 | Â Â keys =Â {'Fsin:':FSSdata[0],'Fcos:':FSSdata[1],'Fzero:':FSSdata[0],'Fwid:':FSSdata[1], |
---|
632 | Â Â Â Â 'Tmin:':XSSdata[0],'Tmax:':XSSdata[1],'Xmax:':XSSdata[2],'Ymax:':XSSdata[3],'Zmax:':XSSdata[4], |
---|
633 | Â Â Â Â 'Xsin:':XSSdata[0],'Ysin:':XSSdata[1],'Zsin:':XSSdata[2],'Xcos:':XSSdata[3],'Ycos:':XSSdata[4],'Zcos:':XSSdata[5], |
---|
634 | Â Â Â Â 'U11sin:':USSdata[0],'U22sin:':USSdata[1],'U33sin:':USSdata[2],'U12sin:':USSdata[3],'U13sin:':USSdata[4],'U23sin:':USSdata[5], |
---|
635 | Â Â Â Â 'U11cos:':USSdata[6],'U22cos:':USSdata[7],'U33cos:':USSdata[8],'U12cos:':USSdata[9],'U13cos:':USSdata[10],'U23cos:':USSdata[11], |
---|
636 | Â Â Â Â 'MXsin:':MSSdata[0],'MYsin:':MSSdata[1],'MZsin:':MSSdata[2],'MXcos:':MSSdata[3],'MYcos:':MSSdata[4],'MZcos:':MSSdata[5]} |
---|
637 |   for iatm in range(Natoms): |
---|
638 |     for kind in ['F','P','A','M']: |
---|
639 | Â Â Â Â Â Â wavetype =Â [] |
---|
640 | Â Â Â Â Â Â wavetype +=Â [parmDict.get(pfx+kind+'waveType:'+str(iatm),''),] |
---|
641 | Â Â Â Â Â Â waveTypes.append(wavetype) |
---|
642 |     for key in keys: |
---|
643 |       for m in range(Nwave[key[0]]): |
---|
644 | Â Â Â Â Â Â Â Â parm =Â pfx+key+str(iatm)+':%d'%(m) |
---|
645 |         if parm in parmDict: |
---|
646 | Â Â Â Â Â Â Â Â Â Â keys[key][m][iatm]Â =Â parmDict[parm] |
---|
647 |   return np.array(waveTypes),FSSdata,XSSdata,USSdata,MSSdata |
---|
648 | Â Â |
---|
649 | def StructureFactor2(refDict,G,hfx,pfx,SGData,calcControls,parmDict): |
---|
650 | Â Â ''' Compute structure factors for all h,k,l for phase |
---|
651 | Â Â puts the result, F^2, in each ref[8] in refList |
---|
652 | Â Â operates on blocks of 100 reflections for speed |
---|
653 | Â Â input: |
---|
654 | Â Â |
---|
655 | Â Â :param dict refDict: where |
---|
656 | Â Â Â Â 'RefList' list where each ref = h,k,l,it,d,... |
---|
657 | Â Â Â Â 'FF' dict of form factors - filed in below |
---|
658 | Â Â :param np.array G:Â Â Â reciprocal metric tensor |
---|
659 | Â Â :param str pfx:Â Â phase id string |
---|
660 | Â Â :param dict SGData: space group info. dictionary output from SpcGroup |
---|
661 | Â Â :param dict calcControls: |
---|
662 | Â Â :param dict ParmDict: |
---|
663 | |
---|
664 | Â Â '''Â Â Â Â |
---|
665 | Â Â phfx =Â pfx.split(':')[0]+hfx |
---|
666 | Â Â ast =Â np.sqrt(np.diag(G)) |
---|
667 | Â Â Mast =Â twopisq*np.multiply.outer(ast,ast) |
---|
668 |   SGMT = np.array([ops[0].T for ops in SGData['SGOps']]) |
---|
669 |   SGT = np.array([ops[1] for ops in SGData['SGOps']]) |
---|
670 | Â Â FFtables =Â calcControls['FFtables'] |
---|
671 | Â Â BLtables =Â calcControls['BLtables'] |
---|
672 | Â Â Amat,Bmat =Â G2lat.Gmat2AB(G) |
---|
673 | Â Â Flack =Â 1.0 |
---|
674 |   if not SGData['SGInv'] and 'S' in calcControls[hfx+'histType'] and phfx+'Flack' in parmDict: |
---|
675 | Â Â Â Â Flack =Â 1.-2.*parmDict[phfx+'Flack'] |
---|
676 | Â Â TwinLaw =Â np.array([[[1,0,0],[0,1,0],[0,0,1]],]) |
---|
677 | Â Â TwDict =Â refDict.get('TwDict',{})Â Â Â Â Â Â |
---|
678 |   if 'S' in calcControls[hfx+'histType']: |
---|
679 | Â Â Â Â NTL =Â calcControls[phfx+'NTL'] |
---|
680 | Â Â Â Â NM =Â calcControls[phfx+'TwinNMN']+1 |
---|
681 | Â Â Â Â TwinLaw =Â calcControls[phfx+'TwinLaw'] |
---|
682 |     TwinFr = np.array([parmDict[phfx+'TwinFr:'+str(i)] for i in range(len(TwinLaw))]) |
---|
683 | Â Â Â Â TwinInv =Â list(np.where(calcControls[phfx+'TwinInv'],-1,1)) |
---|
684 | Â Â Tdata,Mdata,Fdata,Xdata,dXdata,IAdata,Uisodata,Uijdata,Gdata =Â \ |
---|
685 | Â Â Â Â GetAtomFXU(pfx,calcControls,parmDict) |
---|
686 |   if not Xdata.size:     #no atoms in phase! |
---|
687 | Â Â Â Â return |
---|
688 |   if 'NC' in calcControls[hfx+'histType']: |
---|
689 | Â Â Â Â FP,FPP =Â G2el.BlenResCW(Tdata,BLtables,parmDict[hfx+'Lam']) |
---|
690 |   elif 'X' in calcControls[hfx+'histType']: |
---|
691 |     FP = np.array([FFtables[El][hfx+'FP'] for El in Tdata]) |
---|
692 |     FPP = np.array([FFtables[El][hfx+'FPP'] for El in Tdata]) |
---|
693 | Â Â Uij =Â np.array(G2lat.U6toUij(Uijdata)) |
---|
694 | Â Â bij =Â Mast*Uij.T |
---|
695 | Â Â blkSize =Â 100Â Â Â Â #no. of reflections in a block - size seems optimal |
---|
696 | Â Â nRef =Â refDict['RefList'].shape[0] |
---|
697 | Â Â SQ =Â 1./(2.*refDict['RefList'].T[4])**2 |
---|
698 |   if 'N' in calcControls[hfx+'histType']: |
---|
699 | Â Â Â Â dat =Â G2el.getBLvalues(BLtables) |
---|
700 | Â Â Â Â refDict['FF']['El']Â =Â list(dat.keys()) |
---|
701 | Â Â Â Â refDict['FF']['FF']Â =Â np.ones((nRef,len(dat)))*list(dat.values()) |
---|
702 | Â Â else:Â Â Â Â #'X' |
---|
703 | Â Â Â Â dat =Â G2el.getFFvalues(FFtables,0.) |
---|
704 | Â Â Â Â refDict['FF']['El']Â =Â list(dat.keys()) |
---|
705 | Â Â Â Â refDict['FF']['FF']Â =Â np.zeros((nRef,len(dat))) |
---|
706 |     for iel,El in enumerate(refDict['FF']['El']): |
---|
707 | Â Â Â Â Â Â refDict['FF']['FF'].T[iel]Â =Â G2el.ScatFac(FFtables[El],SQ) |
---|
708 | #reflection processing begins here - big arrays! |
---|
709 | Â Â iBeg =Â 0 |
---|
710 |   while iBeg < nRef: |
---|
711 | Â Â Â Â iFin =Â min(iBeg+blkSize,nRef) |
---|
712 | Â Â Â Â refl =Â refDict['RefList'][iBeg:iFin]Â Â #array(blkSize,nItems) |
---|
713 | Â Â Â Â H =Â refl.T[:3]Â Â Â Â Â Â Â Â Â Â Â Â Â #array(blkSize,3) |
---|
714 | Â Â Â Â H =Â np.squeeze(np.inner(H.T,TwinLaw))Â Â #maybe array(blkSize,nTwins,3) or (blkSize,3) |
---|
715 | Â Â Â Â TwMask =Â np.any(H,axis=-1) |
---|
716 |     if TwinLaw.shape[0] > 1 and TwDict: #need np.inner(TwinLaw[?],TwDict[iref][i])*TwinInv[i] |
---|
717 |       for ir in range(blkSize): |
---|
718 | Â Â Â Â Â Â Â Â iref =Â ir+iBeg |
---|
719 |         if iref in TwDict: |
---|
720 |           for i in TwDict[iref]: |
---|
721 |             for n in range(NTL): |
---|
722 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â H[ir][i+n*NM]Â =Â np.inner(TwinLaw[n*NM],np.array(TwDict[iref][i])*TwinInv[i+n*NM]) |
---|
723 | Â Â Â Â Â Â TwMask =Â np.any(H,axis=-1) |
---|
724 | Â Â Â Â SQ =Â 1./(2.*refl.T[4])**2Â Â Â Â Â Â Â Â #array(blkSize) |
---|
725 |     SQfactor = 4.0*SQ*twopisq        #ditto prev. |
---|
726 |     if 'T' in calcControls[hfx+'histType']: |
---|
727 |       if 'P' in calcControls[hfx+'histType']: |
---|
728 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[14]) |
---|
729 | Â Â Â Â Â Â else: |
---|
730 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[12]) |
---|
731 | Â Â Â Â Â Â FP =Â np.repeat(FP.T,len(SGT)*len(TwinLaw),axis=0) |
---|
732 | Â Â Â Â Â Â FPP =Â np.repeat(FPP.T,len(SGT)*len(TwinLaw),axis=0) |
---|
733 | Â Â Â Â Uniq =Â np.inner(H,SGMT) |
---|
734 | Â Â Â Â Phi =Â np.inner(H,SGT) |
---|
735 | Â Â Â Â phase =Â twopi*(np.inner(Uniq,(dXdata+Xdata).T).T+Phi.T).T |
---|
736 | Â Â Â Â sinp =Â np.sin(phase) |
---|
737 | Â Â Â Â cosp =Â np.cos(phase) |
---|
738 | Â Â Â Â biso =Â -SQfactor*Uisodata[:,nxs] |
---|
739 | Â Â Â Â Tiso =Â np.repeat(np.where(biso<1.,np.exp(biso),1.0),len(SGT)*len(TwinLaw),axis=1).T |
---|
740 | Â Â Â Â HbH =Â -np.sum(Uniq.T*np.swapaxes(np.inner(bij,Uniq),2,-1),axis=1) |
---|
741 | Â Â Â Â Tuij =Â np.where(HbH<1.,np.exp(HbH),1.0).T |
---|
742 | Â Â Â Â Tcorr =Â np.reshape(Tiso,Tuij.shape)*Tuij*Mdata*Fdata/len(SGMT) |
---|
743 |     Tindx = np.array([refDict['FF']['El'].index(El) for El in Tdata]) |
---|
744 | Â Â Â Â FF =Â np.repeat(refDict['FF']['FF'][iBeg:iFin].T[Tindx].T,len(SGT)*len(TwinLaw),axis=0) |
---|
745 | Â Â Â Â Bab =Â np.repeat(parmDict[phfx+'BabA']*np.exp(-parmDict[phfx+'BabU']*SQfactor),len(SGT)*len(TwinLaw)) |
---|
746 |     if 'T' in calcControls[hfx+'histType']: #fa,fb are 2 X blkSize X nTwin X nOps x nAtoms |
---|
747 | Â Â Â Â Â Â fa =Â np.array([np.reshape(((FF+FP).T-Bab).T,cosp.shape)*cosp*Tcorr,-np.reshape(Flack*FPP,sinp.shape)*sinp*Tcorr]) |
---|
748 | Â Â Â Â Â Â fb =Â np.array([np.reshape(((FF+FP).T-Bab).T,sinp.shape)*sinp*Tcorr,np.reshape(Flack*FPP,cosp.shape)*cosp*Tcorr]) |
---|
749 | Â Â Â Â else: |
---|
750 | Â Â Â Â Â Â fa =Â np.array([np.reshape(((FF+FP).T-Bab).T,cosp.shape)*cosp*Tcorr,-Flack*FPP*sinp*Tcorr]) |
---|
751 | Â Â Â Â Â Â fb =Â np.array([np.reshape(((FF+FP).T-Bab).T,sinp.shape)*sinp*Tcorr,Flack*FPP*cosp*Tcorr]) |
---|
752 | Â Â Â Â fas =Â np.sum(np.sum(fa,axis=-1),axis=-1)Â #real 2 x blkSize x nTwin; sum over atoms & uniq hkl |
---|
753 | Â Â Â Â fbs =Â np.sum(np.sum(fb,axis=-1),axis=-1)Â #imag |
---|
754 |     if SGData['SGInv']: #centrosymmetric; B=0 |
---|
755 | Â Â Â Â Â Â fbs[0]Â *=Â 0. |
---|
756 | Â Â Â Â Â Â fas[1]Â *=Â 0. |
---|
757 |     if 'P' in calcControls[hfx+'histType']:   #PXC, PNC & PNT: F^2 = A[0]^2 + A[1]^2 + B[0]^2 + B[1]^2 |
---|
758 |       refl.T[9] = np.sum(fas**2,axis=0)+np.sum(fbs**2,axis=0) #add fam**2 & fbm**2 here  |
---|
759 | Â Â Â Â Â Â refl.T[10]Â =Â atan2d(fbs[0],fas[0])Â #ignore f' & f" |
---|
760 | Â Â Â Â else:Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #HKLF: F^2 = (A[0]+A[1])^2 + (B[0]+B[1])^2 |
---|
761 |       if len(TwinLaw) > 1: |
---|
762 | Â Â Â Â Â Â Â Â refl.T[9]Â =Â np.sum(fas[:,:,0],axis=0)**2+np.sum(fbs[:,:,0],axis=0)**2Â Â #FcT from primary twin element |
---|
763 | Â Â Â Â Â Â Â Â refl.T[7]Â =Â np.sum(TwinFr*TwMask*np.sum(fas,axis=0)**2,axis=-1)+Â Â \ |
---|
764 | Â Â Â Â Â Â Â Â Â Â np.sum(TwinFr*TwMask*np.sum(fbs,axis=0)**2,axis=-1)Â Â Â Â Â Â Â Â Â Â Â Â #Fc sum over twins |
---|
765 | Â Â Â Â Â Â Â Â refl.T[10]Â =Â atan2d(fbs[0].T[0],fas[0].T[0])Â #ignore f' & f" & use primary twin |
---|
766 | Â Â Â Â Â Â else:Â Â # checked correct!! |
---|
767 | Â Â Â Â Â Â Â Â refl.T[9]Â =Â np.sum(fas,axis=0)**2+np.sum(fbs,axis=0)**2 |
---|
768 | Â Â Â Â Â Â Â Â refl.T[7]Â =Â np.copy(refl.T[9])Â Â Â Â Â Â Â Â |
---|
769 | Â Â Â Â Â Â Â Â refl.T[10]Â =Â atan2d(fbs[0],fas[0])Â #ignore f' & f" |
---|
770 | #Â Â Â Â Â Â Â Â refl.T[10] = atan2d(np.sum(fbs,axis=0),np.sum(fas,axis=0)) #include f' & f" |
---|
771 | Â Â Â Â iBeg +=Â blkSize |
---|
772 | #Â Â print 'sf time %.4f, nref %d, blkSize %d'%(time.time()-time0,nRef,blkSize) |
---|
773 | Â Â |
---|
774 | def StructureFactorDerv2(refDict,G,hfx,pfx,SGData,calcControls,parmDict): |
---|
775 | Â Â '''Compute structure factor derivatives on blocks of reflections - for powders/nontwins only |
---|
776 | Â Â faster than StructureFactorDerv - correct for powders/nontwins!! |
---|
777 | Â Â input: |
---|
778 | Â Â |
---|
779 | Â Â :param dict refDict: where |
---|
780 | Â Â Â Â 'RefList' list where each ref = h,k,l,it,d,... |
---|
781 | Â Â Â Â 'FF' dict of form factors - filled in below |
---|
782 | Â Â :param np.array G:Â Â Â reciprocal metric tensor |
---|
783 | Â Â :param str hfx:Â Â histogram id string |
---|
784 | Â Â :param str pfx:Â Â phase id string |
---|
785 | Â Â :param dict SGData: space group info. dictionary output from SpcGroup |
---|
786 | Â Â :param dict calcControls: |
---|
787 | Â Â :param dict parmDict: |
---|
788 | Â Â |
---|
789 | Â Â :returns: dict dFdvDict: dictionary of derivatives |
---|
790 | Â Â ''' |
---|
791 | Â Â phfx =Â pfx.split(':')[0]+hfx |
---|
792 | Â Â ast =Â np.sqrt(np.diag(G)) |
---|
793 | Â Â Mast =Â twopisq*np.multiply.outer(ast,ast) |
---|
794 |   SGMT = np.array([ops[0].T for ops in SGData['SGOps']]) |
---|
795 |   SGT = np.array([ops[1] for ops in SGData['SGOps']]) |
---|
796 | Â Â FFtables =Â calcControls['FFtables'] |
---|
797 | Â Â BLtables =Â calcControls['BLtables'] |
---|
798 | Â Â Amat,Bmat =Â G2lat.Gmat2AB(G) |
---|
799 | Â Â nRef =Â len(refDict['RefList']) |
---|
800 | Â Â Tdata,Mdata,Fdata,Xdata,dXdata,IAdata,Uisodata,Uijdata,Gdata =Â \ |
---|
801 | Â Â Â Â GetAtomFXU(pfx,calcControls,parmDict) |
---|
802 |   if not Xdata.size:     #no atoms in phase! |
---|
803 |     return {} |
---|
804 | Â Â mSize =Â len(Mdata) |
---|
805 | Â Â FF =Â np.zeros(len(Tdata)) |
---|
806 |   if 'NC' in calcControls[hfx+'histType']: |
---|
807 | Â Â Â Â FP,FPP =Â G2el.BlenResCW(Tdata,BLtables,parmDict[hfx+'Lam']) |
---|
808 |   elif 'X' in calcControls[hfx+'histType']: |
---|
809 |     FP = np.array([FFtables[El][hfx+'FP'] for El in Tdata]) |
---|
810 |     FPP = np.array([FFtables[El][hfx+'FPP'] for El in Tdata]) |
---|
811 | Â Â Uij =Â np.array(G2lat.U6toUij(Uijdata)) |
---|
812 | Â Â bij =Â Mast*Uij.T |
---|
813 | Â Â dFdvDict =Â {} |
---|
814 | Â Â dFdfr =Â np.zeros((nRef,mSize)) |
---|
815 | Â Â dFdx =Â np.zeros((nRef,mSize,3)) |
---|
816 | Â Â dFdui =Â np.zeros((nRef,mSize)) |
---|
817 | Â Â dFdua =Â np.zeros((nRef,mSize,6)) |
---|
818 | Â Â dFdbab =Â np.zeros((nRef,2)) |
---|
819 | Â Â dFdfl =Â np.zeros((nRef)) |
---|
820 | Â Â Flack =Â 1.0 |
---|
821 |   if not SGData['SGInv'] and 'S' in calcControls[hfx+'histType'] and phfx+'Flack' in parmDict: |
---|
822 | Â Â Â Â Flack =Â 1.-2.*parmDict[phfx+'Flack'] |
---|
823 | Â Â time0 =Â time.time() |
---|
824 | #reflection processing begins here - big arrays! |
---|
825 | Â Â iBeg =Â 0 |
---|
826 | Â Â blkSize =Â 32Â Â Â Â #no. of reflections in a block - optimized for speed |
---|
827 |   while iBeg < nRef: |
---|
828 | Â Â Â Â iFin =Â min(iBeg+blkSize,nRef) |
---|
829 | Â Â Â Â refl =Â refDict['RefList'][iBeg:iFin]Â Â #array(blkSize,nItems) |
---|
830 | Â Â Â Â H =Â refl.T[:3].T |
---|
831 | Â Â Â Â SQ =Â 1./(2.*refl.T[4])**2Â Â Â Â Â Â Â # or (sin(theta)/lambda)**2 |
---|
832 | Â Â Â Â SQfactor =Â 8.0*SQ*np.pi**2 |
---|
833 |     if 'T' in calcControls[hfx+'histType']: |
---|
834 |       if 'P' in calcControls[hfx+'histType']: |
---|
835 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[14]) |
---|
836 | Â Â Â Â Â Â else: |
---|
837 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[12]) |
---|
838 | Â Â Â Â Â Â FP =Â np.repeat(FP.T,len(SGT),axis=0) |
---|
839 | Â Â Â Â Â Â FPP =Â np.repeat(FPP.T,len(SGT),axis=0) |
---|
840 | Â Â Â Â dBabdA =Â np.exp(-parmDict[phfx+'BabU']*SQfactor) |
---|
841 | Â Â Â Â Bab =Â np.repeat(parmDict[phfx+'BabA']*np.exp(-parmDict[phfx+'BabU']*SQfactor),len(SGT)) |
---|
842 |     Tindx = np.array([refDict['FF']['El'].index(El) for El in Tdata]) |
---|
843 | Â Â Â Â FF =Â np.repeat(refDict['FF']['FF'][iBeg:iFin].T[Tindx].T,len(SGT),axis=0) |
---|
844 | Â Â Â Â Uniq =Â np.inner(H,SGMT)Â Â Â Â Â Â Â # array(nSGOp,3) |
---|
845 | Â Â Â Â Phi =Â np.inner(H,SGT) |
---|
846 | Â Â Â Â phase =Â twopi*(np.inner(Uniq,(dXdata+Xdata).T).T+Phi.T).T |
---|
847 | Â Â Â Â sinp =Â np.sin(phase)Â Â Â Â #refBlk x nOps x nAtoms |
---|
848 | Â Â Â Â cosp =Â np.cos(phase) |
---|
849 | Â Â Â Â occ =Â Mdata*Fdata/len(SGT) |
---|
850 | Â Â Â Â biso =Â -SQfactor*Uisodata[:,nxs] |
---|
851 | Â Â Â Â Tiso =Â np.repeat(np.where(biso<1.,np.exp(biso),1.0),len(SGT),axis=1).T |
---|
852 | Â Â Â Â HbH =Â np.sum(Uniq.T*np.swapaxes(np.inner(bij,Uniq),2,-1),axis=1) |
---|
853 | Â Â Â Â Tuij =Â np.where(HbH<1.,np.exp(-HbH),1.0).T |
---|
854 | Â Â Â Â Tcorr =Â np.reshape(Tiso,Tuij.shape)*Tuij*Mdata*Fdata/len(SGMT) |
---|
855 |     Hij = np.array([Mast*np.multiply.outer(U,U) for U in np.reshape(Uniq,(-1,3))])   #Nref*Nops,3,3 |
---|
856 |     Hij = np.reshape(np.array([G2lat.UijtoU6(uij) for uij in Hij]),(-1,len(SGT),6))   #Nref,Nops,6 |
---|
857 | Â Â Â Â fot =Â np.reshape(((FF+FP).T-Bab).T,cosp.shape)*Tcorr |
---|
858 |     if len(FPP.shape) > 1: |
---|
859 | Â Â Â Â Â Â fotp =Â np.reshape(FPP,cosp.shape)*Tcorr |
---|
860 | Â Â Â Â else: |
---|
861 |       fotp = FPP*Tcorr   |
---|
862 | #Â Â Â Â Â Â GSASIIpath.IPyBreak() |
---|
863 |     if 'T' in calcControls[hfx+'histType']: |
---|
864 | Â Â Â Â Â Â fa =Â np.array([fot*cosp,-np.reshape(Flack*FPP,sinp.shape)*sinp*Tcorr]) |
---|
865 | Â Â Â Â Â Â fb =Â np.array([fot*sinp,np.reshape(Flack*FPP,cosp.shape)*cosp*Tcorr]) |
---|
866 | Â Â Â Â else: |
---|
867 | Â Â Â Â Â Â fa =Â np.array([fot*cosp,-Flack*FPP*sinp*Tcorr]) |
---|
868 | Â Â Â Â Â Â fb =Â np.array([fot*sinp,Flack*FPP*cosp*Tcorr]) |
---|
869 | Â Â Â Â fas =Â np.sum(np.sum(fa,axis=-1),axis=-1)Â Â Â #real sum over atoms & unique hkl array(2,refBlk,nTwins) |
---|
870 | Â Â Â Â fbs =Â np.sum(np.sum(fb,axis=-1),axis=-1)Â Â Â #imag sum over atoms & uniq hkl |
---|
871 | Â Â Â Â fax =Â np.array([-fot*sinp,-fotp*cosp])Â Â #positions array(2,refBlk,nEqv,nAtoms) |
---|
872 | Â Â Â Â fbx =Â np.array([fot*cosp,-fotp*sinp]) |
---|
873 | Â Â Â Â #sum below is over Uniq |
---|
874 | Â Â Â Â dfadfr =Â np.sum(fa/occ,axis=-2)Â Â Â Â #array(2,refBlk,nAtom) Fdata != 0 avoids /0. problem |
---|
875 | Â Â Â Â dfadba =Â np.sum(-cosp*Tcorr,axis=-2)Â #array(refBlk,nAtom) |
---|
876 | Â Â Â Â dfadx =Â np.sum(twopi*Uniq[nxs,:,nxs,:,:]*np.swapaxes(fax,-2,-1)[:,:,:,:,nxs],axis=-2) |
---|
877 | Â Â Â Â dfadui =Â np.sum(-SQfactor[nxs,:,nxs,nxs]*fa,axis=-2)Â #array(Ops,refBlk,nAtoms) |
---|
878 | Â Â Â Â dfadua =Â np.sum(-Hij[nxs,:,nxs,:,:]*np.swapaxes(fa,-2,-1)[:,:,:,:,nxs],axis=-2) |
---|
879 | Â Â Â Â # array(2,refBlk,nAtom,3) & array(2,refBlk,nAtom,6) |
---|
880 |     if not SGData['SGInv']: |
---|
881 | Â Â Â Â Â Â dfbdfr =Â np.sum(fb/occ,axis=-2)Â Â Â Â #Fdata != 0 avoids /0. problem |
---|
882 | Â Â Â Â Â Â dfbdba =Â np.sum(-sinp*Tcorr,axis=-2) |
---|
883 | Â Â Â Â Â Â dfadfl =Â np.sum(np.sum(-fotp*sinp,axis=-1),axis=-1) |
---|
884 | Â Â Â Â Â Â dfbdfl =Â np.sum(np.sum(fotp*cosp,axis=-1),axis=-1) |
---|
885 | Â Â Â Â Â Â dfbdx =Â np.sum(twopi*Uniq[nxs,:,nxs,:,:]*np.swapaxes(fbx,-2,-1)[:,:,:,:,nxs],axis=-2)Â Â Â Â Â Â |
---|
886 | Â Â Â Â Â Â dfbdui =Â np.sum(-SQfactor[nxs,:,nxs,nxs]*fb,axis=-2) |
---|
887 | Â Â Â Â Â Â dfbdua =Â np.sum(-Hij[nxs,:,nxs,:,:]*np.swapaxes(fb,-2,-1)[:,:,:,:,nxs],axis=-2) |
---|
888 | Â Â Â Â else: |
---|
889 | Â Â Â Â Â Â dfbdfr =Â np.zeros_like(dfadfr) |
---|
890 | Â Â Â Â Â Â dfbdx =Â np.zeros_like(dfadx) |
---|
891 | Â Â Â Â Â Â dfbdui =Â np.zeros_like(dfadui) |
---|
892 | Â Â Â Â Â Â dfbdua =Â np.zeros_like(dfadua) |
---|
893 | Â Â Â Â Â Â dfbdba =Â np.zeros_like(dfadba) |
---|
894 | Â Â Â Â Â Â dfadfl =Â 0.0 |
---|
895 | Â Â Â Â Â Â dfbdfl =Â 0.0 |
---|
896 |     #NB: the above have been checked against PA(1:10,1:2) in strfctr.for for Al2O3!  |
---|
897 | Â Â Â Â SA =Â fas[0]+fas[1] |
---|
898 | Â Â Â Â SB =Â fbs[0]+fbs[1] |
---|
899 |     if 'P' in calcControls[hfx+'histType']: #checked perfect for centro & noncentro |
---|
900 | Â Â Â Â Â Â dFdfr[iBeg:iFin]Â =Â 2.*np.sum(fas[:,:,nxs]*dfadfr+fbs[:,:,nxs]*dfbdfr,axis=0)*Mdata/len(SGMT) |
---|
901 | Â Â Â Â Â Â dFdx[iBeg:iFin]Â =Â 2.*np.sum(fas[:,:,nxs,nxs]*dfadx+fbs[:,:,nxs,nxs]*dfbdx,axis=0) |
---|
902 | Â Â Â Â Â Â dFdui[iBeg:iFin]Â =Â 2.*np.sum(fas[:,:,nxs]*dfadui+fbs[:,:,nxs]*dfbdui,axis=0) |
---|
903 | Â Â Â Â Â Â dFdua[iBeg:iFin]Â =Â 2.*np.sum(fas[:,:,nxs,nxs]*dfadua+fbs[:,:,nxs,nxs]*dfbdua,axis=0) |
---|
904 | Â Â Â Â else: |
---|
905 | Â Â Â Â Â Â dFdfr[iBeg:iFin]Â =Â (2.*SA[:,nxs]*(dfadfr[0]+dfadfr[1])+2.*SB[:,nxs]*(dfbdfr[0]+dfbdfr[1]))*Mdata/len(SGMT) |
---|
906 | Â Â Â Â Â Â dFdx[iBeg:iFin]Â =Â 2.*SA[:,nxs,nxs]*(dfadx[0]+dfadx[1])+2.*SB[:,nxs,nxs]*(dfbdx[0]+dfbdx[1]) |
---|
907 | Â Â Â Â Â Â dFdui[iBeg:iFin]Â =Â 2.*SA[:,nxs]*(dfadui[0]+dfadui[1])+2.*SB[:,nxs]*(dfbdui[0]+dfbdui[1]) |
---|
908 | Â Â Â Â Â Â dFdua[iBeg:iFin]Â =Â 2.*SA[:,nxs,nxs]*(dfadua[0]+dfadua[1])+2.*SB[:,nxs,nxs]*(dfbdua[0]+dfbdua[1]) |
---|
909 |       dFdfl[iBeg:iFin] = -SA*dfadfl-SB*dfbdfl #array(nRef,) |
---|
910 | Â Â Â Â dFdbab[iBeg:iFin]Â =Â 2.*(fas[0,nxs]*np.array([np.sum(dfadba.T*dBabdA,axis=0),np.sum(-dfadba.T*parmDict[phfx+'BabA']*SQfactor*dBabdA,axis=0)])+Â \ |
---|
911 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â fbs[0,nxs]*np.array([np.sum(dfbdba.T*dBabdA,axis=0),np.sum(-dfbdba.T*parmDict[phfx+'BabA']*SQfactor*dBabdA,axis=0)])).T |
---|
912 | #Â Â Â Â GSASIIpath.IPyBreak() |
---|
913 | Â Â Â Â iBeg +=Â blkSize |
---|
914 | #Â Â print 'derv time %.4f, nref %d, blkSize %d'%(time.time()-time0,nRef,blkSize) |
---|
915 | Â Â Â Â #loop over atoms - each dict entry is list of derivatives for all the reflections |
---|
916 |   for i in range(len(Mdata)): |
---|
917 | Â Â Â Â dFdvDict[pfx+'Afrac:'+str(i)]Â =Â dFdfr.T[i] |
---|
918 | Â Â Â Â dFdvDict[pfx+'dAx:'+str(i)]Â =Â dFdx.T[0][i] |
---|
919 | Â Â Â Â dFdvDict[pfx+'dAy:'+str(i)]Â =Â dFdx.T[1][i] |
---|
920 | Â Â Â Â dFdvDict[pfx+'dAz:'+str(i)]Â =Â dFdx.T[2][i] |
---|
921 | Â Â Â Â dFdvDict[pfx+'AUiso:'+str(i)]Â =Â dFdui.T[i] |
---|
922 | Â Â Â Â dFdvDict[pfx+'AU11:'+str(i)]Â =Â dFdua.T[0][i] |
---|
923 | Â Â Â Â dFdvDict[pfx+'AU22:'+str(i)]Â =Â dFdua.T[1][i] |
---|
924 | Â Â Â Â dFdvDict[pfx+'AU33:'+str(i)]Â =Â dFdua.T[2][i] |
---|
925 | Â Â Â Â dFdvDict[pfx+'AU12:'+str(i)]Â =Â dFdua.T[3][i] |
---|
926 | Â Â Â Â dFdvDict[pfx+'AU13:'+str(i)]Â =Â dFdua.T[4][i] |
---|
927 | Â Â Â Â dFdvDict[pfx+'AU23:'+str(i)]Â =Â dFdua.T[5][i] |
---|
928 | Â Â dFdvDict[phfx+'Flack']Â =Â 4.*dFdfl.T |
---|
929 | Â Â dFdvDict[phfx+'BabA']Â =Â dFdbab.T[0] |
---|
930 | Â Â dFdvDict[phfx+'BabU']Â =Â dFdbab.T[1] |
---|
931 |   return dFdvDict |
---|
932 | Â Â |
---|
933 | def MagStructureFactor2(refDict,G,hfx,pfx,SGData,calcControls,parmDict): |
---|
934 | Â Â ''' Compute neutron magnetic structure factors for all h,k,l for phase |
---|
935 | Â Â puts the result, F^2, in each ref[8] in refList |
---|
936 | Â Â operates on blocks of 100 reflections for speed |
---|
937 | Â Â input: |
---|
938 | Â Â |
---|
939 | Â Â :param dict refDict: where |
---|
940 | Â Â Â Â 'RefList' list where each ref = h,k,l,it,d,... |
---|
941 | Â Â Â Â 'FF' dict of form factors - filed in below |
---|
942 | Â Â :param np.array G:Â Â Â reciprocal metric tensor |
---|
943 | Â Â :param str pfx:Â Â phase id string |
---|
944 | Â Â :param dict SGData: space group info. dictionary output from SpcGroup |
---|
945 | Â Â :param dict calcControls: |
---|
946 | Â Â :param dict ParmDict: |
---|
947 | |
---|
948 | Â Â '''Â Â Â Â |
---|
949 | Â Â g =Â nl.inv(G) |
---|
950 | Â Â ast =Â np.sqrt(np.diag(G)) |
---|
951 | Â Â ainv =Â np.sqrt(np.diag(g)) |
---|
952 | Â Â GS =Â G/np.outer(ast,ast) |
---|
953 | Â Â Ginv =Â g/np.outer(ainv,ainv) |
---|
954 | Â Â uAmat =Â G2lat.Gmat2AB(GS)[0] |
---|
955 | Â Â Mast =Â twopisq*np.multiply.outer(ast,ast) |
---|
956 |   SGMT = np.array([ops[0].T for ops in SGData['SGOps']]) |
---|
957 |   SGT = np.array([ops[1] for ops in SGData['SGOps']]) |
---|
958 | Â Â Ncen =Â len(SGData['SGCen']) |
---|
959 | Â Â Nops =Â len(SGMT)*Ncen |
---|
960 |   if not SGData['SGFixed']: |
---|
961 | Â Â Â Â Nops *=Â (1+SGData['SGInv']) |
---|
962 | Â Â MFtables =Â calcControls['MFtables'] |
---|
963 | Â Â Bmat =Â G2lat.Gmat2AB(G)[1] |
---|
964 | Â Â TwinLaw =Â np.ones(1) |
---|
965 | #Â Â TwinLaw = np.array([[[1,0,0],[0,1,0],[0,0,1]],]) |
---|
966 | #Â Â TwDict = refDict.get('TwDict',{})Â Â Â Â Â Â |
---|
967 | #Â Â if 'S' in calcControls[hfx+'histType']: |
---|
968 | #Â Â Â Â NTL = calcControls[phfx+'NTL'] |
---|
969 | #Â Â Â Â NM = calcControls[phfx+'TwinNMN']+1 |
---|
970 | #Â Â Â Â TwinLaw = calcControls[phfx+'TwinLaw'] |
---|
971 | #Â Â Â Â TwinFr = np.array([parmDict[phfx+'TwinFr:'+str(i)] for i in range(len(TwinLaw))]) |
---|
972 | #Â Â Â Â TwinInv = list(np.where(calcControls[phfx+'TwinInv'],-1,1)) |
---|
973 | Â Â Tdata,Mdata,Fdata,Xdata,dXdata,IAdata,Uisodata,Uijdata,Gdata =Â \ |
---|
974 | Â Â Â Â GetAtomFXU(pfx,calcControls,parmDict) |
---|
975 |   if not Xdata.size:     #no atoms in phase! |
---|
976 | Â Â Â Â return |
---|
977 |   Mag = np.array([np.sqrt(np.inner(mag,np.inner(mag,Ginv))) for mag in Gdata.T]) |
---|
978 | Â Â Gdata =Â np.inner(Gdata.T,SGMT).TÂ Â Â Â Â Â #apply sym. ops. |
---|
979 |   if SGData['SGInv'] and not SGData['SGFixed']: |
---|
980 | Â Â Â Â Gdata =Â np.hstack((Gdata,-Gdata))Â Â Â Â #inversion if any |
---|
981 |   Gdata = np.hstack([Gdata for icen in range(Ncen)])    #dup over cell centering--> [Mxyz,nops,natms] |
---|
982 |   Gdata = SGData['MagMom'][nxs,:,nxs]*Gdata  #flip vectors according to spin flip * det(opM) |
---|
983 | Â Â Mag =Â np.tile(Mag[:,nxs],Nops).TÂ #make Mag same length as Gdata |
---|
984 |   Kdata = np.inner(Gdata.T,uAmat).T*np.sqrt(nl.det(Ginv))/Mag   #Cartesian unit vectors |
---|
985 | Â Â Uij =Â np.array(G2lat.U6toUij(Uijdata)) |
---|
986 | Â Â bij =Â Mast*Uij.T |
---|
987 | Â Â blkSize =Â 100Â Â Â Â #no. of reflections in a block - size seems optimal |
---|
988 | Â Â nRef =Â refDict['RefList'].shape[0] |
---|
989 | Â Â SQ =Â 1./(2.*refDict['RefList'].T[4])**2 |
---|
990 | Â Â refDict['FF']['El']Â =Â list(MFtables.keys()) |
---|
991 | Â Â refDict['FF']['MF']Â =Â np.zeros((nRef,len(MFtables))) |
---|
992 |   for iel,El in enumerate(refDict['FF']['El']): |
---|
993 | Â Â Â Â refDict['FF']['MF'].T[iel]Â =Â G2el.MagScatFac(MFtables[El],SQ) |
---|
994 | #reflection processing begins here - big arrays! |
---|
995 | Â Â iBeg =Â 0 |
---|
996 |   while iBeg < nRef: |
---|
997 | Â Â Â Â iFin =Â min(iBeg+blkSize,nRef) |
---|
998 | Â Â Â Â refl =Â refDict['RefList'][iBeg:iFin]Â Â #array(blkSize,nItems) |
---|
999 | Â Â Â Â H =Â refl.T[:3].TÂ Â Â Â Â Â Â Â Â Â Â Â Â #array(blkSize,3) |
---|
1000 | #Â Â Â Â H = np.squeeze(np.inner(H.T,TwinLaw))Â Â #maybe array(blkSize,nTwins,3) or (blkSize,3) |
---|
1001 | #Â Â Â Â TwMask = np.any(H,axis=-1) |
---|
1002 | #Â Â Â Â if TwinLaw.shape[0] > 1 and TwDict: #need np.inner(TwinLaw[?],TwDict[iref][i])*TwinInv[i] |
---|
1003 | #Â Â Â Â Â Â for ir in range(blkSize): |
---|
1004 | #Â Â Â Â Â Â Â Â iref = ir+iBeg |
---|
1005 | #Â Â Â Â Â Â Â Â if iref in TwDict: |
---|
1006 | #Â Â Â Â Â Â Â Â Â Â for i in TwDict[iref]: |
---|
1007 | #Â Â Â Â Â Â Â Â Â Â Â Â for n in range(NTL): |
---|
1008 | #Â Â Â Â Â Â Â Â Â Â Â Â Â Â H[ir][i+n*NM] = np.inner(TwinLaw[n*NM],np.array(TwDict[iref][i])*TwinInv[i+n*NM]) |
---|
1009 | #Â Â Â Â Â Â TwMask = np.any(H,axis=-1) |
---|
1010 | Â Â Â Â SQ =Â 1./(2.*refl.T[4])**2Â Â Â Â Â Â Â Â #array(blkSize) |
---|
1011 |     SQfactor = 4.0*SQ*twopisq        #ditto prev. |
---|
1012 | Â Â Â Â Uniq =Â np.inner(H,SGMT) |
---|
1013 | Â Â Â Â Phi =Â np.inner(H,SGT) |
---|
1014 | Â Â Â Â phase =Â twopi*(np.inner(Uniq,(dXdata+Xdata).T).T+Phi.T).T |
---|
1015 | Â Â Â Â biso =Â -SQfactor*Uisodata[:,nxs] |
---|
1016 | Â Â Â Â Tiso =Â np.repeat(np.where(biso<1.,np.exp(biso),1.0),len(SGT)*len(TwinLaw),axis=1).T |
---|
1017 | Â Â Â Â HbH =Â -np.sum(Uniq.T*np.swapaxes(np.inner(bij,Uniq),2,-1),axis=1) |
---|
1018 | Â Â Â Â Tuij =Â np.where(HbH<1.,np.exp(HbH),1.0).T |
---|
1019 |     Tindx = np.array([refDict['FF']['El'].index(El) for El in Tdata]) |
---|
1020 | Â Â Â Â MF =Â refDict['FF']['MF'][iBeg:iFin].T[Tindx].TÂ Â #Nref,Natm |
---|
1021 | Â Â Â Â TMcorr =Â 0.539*(np.reshape(Tiso,Tuij.shape)*Tuij)[:,0,:]*Fdata*Mdata*MF/(2*Nops)Â Â Â #Nref,Natm |
---|
1022 |     if SGData['SGInv']: |
---|
1023 |       if not SGData['SGFixed']: |
---|
1024 | Â Â Â Â Â Â Â Â mphase =Â np.hstack((phase,-phase))Â #OK |
---|
1025 | Â Â Â Â Â Â else: |
---|
1026 | Â Â Â Â Â Â Â Â mphase =Â phase |
---|
1027 | Â Â Â Â else: |
---|
1028 |       mphase = phase          # |
---|
1029 |     mphase = np.array([mphase+twopi*np.inner(cen,H)[:,nxs,nxs] for cen in SGData['SGCen']]) |
---|
1030 | Â Â Â Â mphase =Â np.concatenate(mphase,axis=1)Â Â Â Â Â Â Â #Nref,full Nop,Natm |
---|
1031 | Â Â Â Â sinm =Â np.sin(mphase)Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #ditto - match magstrfc.for |
---|
1032 | Â Â Â Â cosm =Â np.cos(mphase)Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #ditto |
---|
1033 | Â Â Â Â HM =Â np.inner(Bmat.T,H)Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #put into cartesian space |
---|
1034 | Â Â Â Â HM =Â HM/np.sqrt(np.sum(HM**2,axis=0))Â Â Â Â Â Â Â Â #Kdata = MAGS & HM = UVEC in magstrfc.for both OK |
---|
1035 | Â Â Â Â eDotK =Â np.sum(HM[:,:,nxs,nxs]*Kdata[:,nxs,:,:],axis=0) |
---|
1036 | Â Â Â Â Q =Â HM[:,:,nxs,nxs]*eDotK[nxs,:,:,:]-Kdata[:,nxs,:,:]Â #xyz,Nref,Nop,Natm = BPM in magstrfc.for OK |
---|
1037 | Â Â Â Â fam =Â Q*TMcorr[nxs,:,nxs,:]*cosm[nxs,:,:,:]*Mag[nxs,nxs,:,:]Â Â #ditto |
---|
1038 | Â Â Â Â fbm =Â Q*TMcorr[nxs,:,nxs,:]*sinm[nxs,:,:,:]*Mag[nxs,nxs,:,:]Â Â #ditto |
---|
1039 | Â Â Â Â fams =Â np.sum(np.sum(fam,axis=-1),axis=-1)Â Â Â Â Â Â Â Â Â Â Â Â Â #xyz,Nref |
---|
1040 | Â Â Â Â fbms =Â np.sum(np.sum(fbm,axis=-1),axis=-1)Â Â Â Â Â Â Â Â Â Â Â Â Â #ditto |
---|
1041 | Â Â Â Â refl.T[9]Â =Â np.sum(fams**2,axis=0)+np.sum(fbms**2,axis=0) |
---|
1042 | Â Â Â Â refl.T[7]Â =Â np.copy(refl.T[9])Â Â Â Â Â Â Â Â |
---|
1043 | Â Â Â Â refl.T[10]Â =Â 0.0Â Â #atan2d(fbs[0],fas[0]) - what is phase for mag refl? |
---|
1044 | #Â Â Â Â if 'P' in calcControls[hfx+'histType']:Â Â Â #PXC, PNC & PNT: F^2 = A[0]^2 + A[1]^2 + B[0]^2 + B[1]^2 |
---|
1045 | #      refl.T[9] = np.sum(fas**2,axis=0)+np.sum(fbs**2,axis=0) #add fam**2 & fbm**2 here  |
---|
1046 | #Â Â Â Â Â Â refl.T[10] = atan2d(fbs[0],fas[0])Â #ignore f' & f" |
---|
1047 | #Â Â Â Â else:Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #HKLF: F^2 = (A[0]+A[1])^2 + (B[0]+B[1])^2 |
---|
1048 | #Â Â Â Â Â Â if len(TwinLaw) > 1: |
---|
1049 | #Â Â Â Â Â Â Â Â refl.T[9] = np.sum(fas[:,:,0],axis=0)**2+np.sum(fbs[:,:,0],axis=0)**2Â Â #FcT from primary twin element |
---|
1050 | #Â Â Â Â Â Â Â Â refl.T[7] = np.sum(TwinFr*TwMask*np.sum(fas,axis=0)**2,axis=-1)+Â Â \ |
---|
1051 | #Â Â Â Â Â Â Â Â Â Â np.sum(TwinFr*TwMask*np.sum(fbs,axis=0)**2,axis=-1)Â Â Â Â Â Â Â Â Â Â Â Â #Fc sum over twins |
---|
1052 | #Â Â Â Â Â Â Â Â refl.T[10] = atan2d(fbs[0].T[0],fas[0].T[0])Â #ignore f' & f" & use primary twin |
---|
1053 | #Â Â Â Â Â Â else:Â Â # checked correct!! |
---|
1054 | #Â Â Â Â Â Â Â Â refl.T[9] = np.sum(fas,axis=0)**2+np.sum(fbs,axis=0)**2 |
---|
1055 | #Â Â Â Â Â Â Â Â refl.T[7] = np.copy(refl.T[9])Â Â Â Â Â Â Â Â |
---|
1056 | #Â Â Â Â Â Â Â Â refl.T[10] = atan2d(fbs[0],fas[0])Â #ignore f' & f" |
---|
1057 | ##Â Â Â Â Â Â Â Â refl.T[10] = atan2d(np.sum(fbs,axis=0),np.sum(fas,axis=0)) #include f' & f" |
---|
1058 | Â Â Â Â iBeg +=Â blkSize |
---|
1059 | #Â Â print 'sf time %.4f, nref %d, blkSize %d'%(time.time()-time0,nRef,blkSize) |
---|
1060 | |
---|
1061 | def MagStructureFactorDerv(refDict,G,hfx,pfx,SGData,calcControls,parmDict): |
---|
1062 | Â Â '''Compute magnetic structure factor derivatives on blocks of reflections - for powders/nontwins only |
---|
1063 | Â Â input: |
---|
1064 | Â Â |
---|
1065 | Â Â :param dict refDict: where |
---|
1066 | Â Â Â Â 'RefList' list where each ref = h,k,l,it,d,... |
---|
1067 | Â Â Â Â 'FF' dict of form factors - filled in below |
---|
1068 | Â Â :param np.array G:Â Â Â reciprocal metric tensor |
---|
1069 | Â Â :param str hfx:Â Â histogram id string |
---|
1070 | Â Â :param str pfx:Â Â phase id string |
---|
1071 | Â Â :param dict SGData: space group info. dictionary output from SpcGroup |
---|
1072 | Â Â :param dict calcControls: |
---|
1073 | Â Â :param dict parmDict: |
---|
1074 | Â Â |
---|
1075 | Â Â :returns: dict dFdvDict: dictionary of derivatives |
---|
1076 | Â Â ''' |
---|
1077 | Â Â #TODO: fix mag math - moments parallel to crystal axes |
---|
1078 | Â Â g =Â nl.inv(G) |
---|
1079 | Â Â ast =Â np.sqrt(np.diag(G)) |
---|
1080 | Â Â ainv =Â np.sqrt(np.diag(g)) |
---|
1081 | Â Â GS =Â G/np.outer(ast,ast) |
---|
1082 | Â Â Ginv =Â g/np.outer(ainv,ainv) |
---|
1083 | Â Â uAmat =Â G2lat.Gmat2AB(GS)[0] |
---|
1084 | Â Â Mast =Â twopisq*np.multiply.outer(ast,ast) |
---|
1085 |   SGMT = np.array([ops[0].T for ops in SGData['SGOps']]) |
---|
1086 |   SGT = np.array([ops[1] for ops in SGData['SGOps']]) |
---|
1087 | Â Â Ncen =Â len(SGData['SGCen']) |
---|
1088 | Â Â Nops =Â len(SGMT)*Ncen |
---|
1089 |   if not SGData['SGFixed']: |
---|
1090 | Â Â Â Â Nops *=Â (1+SGData['SGInv']) |
---|
1091 | Â Â Bmat =Â G2lat.Gmat2AB(G)[1] |
---|
1092 | Â Â nRef =Â len(refDict['RefList']) |
---|
1093 | Â Â Tdata,Mdata,Fdata,Xdata,dXdata,IAdata,Uisodata,Uijdata,Gdata =Â \ |
---|
1094 | Â Â Â Â GetAtomFXU(pfx,calcControls,parmDict) |
---|
1095 |   if not Xdata.size:     #no atoms in phase! |
---|
1096 |     return {} |
---|
1097 | Â Â mSize =Â len(Mdata) |
---|
1098 |   Mag = np.array([np.sqrt(np.inner(mag,np.inner(mag,Ginv))) for mag in Gdata.T]) |
---|
1099 | Â Â dMdm =Â np.inner(Gdata.T,Ginv).T/Mag |
---|
1100 | Â Â Gdata =Â np.inner(Gdata.T,SGMT).TÂ Â Â Â Â Â #apply sym. ops. |
---|
1101 | Â Â dG =Â np.inner(np.eye(3),SGMT).T |
---|
1102 |   if SGData['SGInv'] and not SGData['SGFixed']: |
---|
1103 | Â Â Â Â Gdata =Â np.hstack((Gdata,-Gdata))Â Â Â Â #inversion if any |
---|
1104 | Â Â Â Â dG =Â np.hstack((dG,-dG)) |
---|
1105 |   Gdata = np.hstack([Gdata for icen in range(Ncen)])    #dup over cell centering |
---|
1106 |   dG = np.hstack([dG for icen in range(Ncen)]) |
---|
1107 |   Gdata = SGData['MagMom'][nxs,:,nxs]*Gdata  #flip vectors according to spin flip |
---|
1108 | Â Â Mag =Â np.tile(Mag[:,nxs],Nops).TÂ #make Mag same length as Gdata |
---|
1109 | Â Â VGi =Â np.sqrt(nl.det(Ginv)) |
---|
1110 |   Kdata = np.inner(Gdata.T,uAmat).T*VGi/Mag    #make unit vectors in Cartesian space |
---|
1111 | Â Â dG =Â np.inner(dG.T,uAmat).T*VGi |
---|
1112 | Â Â dkdG =Â (np.inner(np.ones(3),uAmat)*VGi)[:,nxs,nxs]/Mag[nxs,:,:] |
---|
1113 | Â Â dkdm =Â dkdG-Kdata*dMdm[:,nxs,:]/Mag[nxs,:,:] |
---|
1114 | Â Â dFdMx =Â np.zeros((nRef,mSize,3)) |
---|
1115 | Â Â Uij =Â np.array(G2lat.U6toUij(Uijdata)) |
---|
1116 | Â Â bij =Â Mast*Uij.T |
---|
1117 | Â Â dFdvDict =Â {} |
---|
1118 | Â Â dFdfr =Â np.zeros((nRef,mSize)) |
---|
1119 | Â Â dFdx =Â np.zeros((nRef,mSize,3)) |
---|
1120 | Â Â dFdMx =Â np.zeros((3,nRef,mSize)) |
---|
1121 | Â Â dFdui =Â np.zeros((nRef,mSize)) |
---|
1122 | Â Â dFdua =Â np.zeros((nRef,mSize,6)) |
---|
1123 | Â Â time0 =Â time.time() |
---|
1124 | #reflection processing begins here - big arrays! |
---|
1125 | Â Â iBeg =Â 0 |
---|
1126 | Â Â blkSize =Â 40Â Â Â Â #no. of reflections in a block - optimized for speed |
---|
1127 |   while iBeg < nRef: |
---|
1128 | Â Â Â Â iFin =Â min(iBeg+blkSize,nRef) |
---|
1129 | Â Â Â Â refl =Â refDict['RefList'][iBeg:iFin]Â Â #array(blkSize,nItems) |
---|
1130 | Â Â Â Â H =Â refl.T[:3].T |
---|
1131 | Â Â Â Â SQ =Â 1./(2.*refl.T[4])**2Â Â Â Â Â Â Â # or (sin(theta)/lambda)**2 |
---|
1132 | Â Â Â Â SQfactor =Â 8.0*SQ*np.pi**2 |
---|
1133 | Â Â Â Â Uniq =Â np.inner(H,SGMT)Â Â Â Â Â Â Â # array(nSGOp,3) |
---|
1134 | Â Â Â Â Phi =Â np.inner(H,SGT) |
---|
1135 | Â Â Â Â phase =Â twopi*(np.inner(Uniq,(dXdata+Xdata).T).T+Phi.T).T |
---|
1136 | Â Â Â Â occ =Â Mdata*Fdata/Nops |
---|
1137 | Â Â Â Â biso =Â -SQfactor*Uisodata[:,nxs] |
---|
1138 | Â Â Â Â Tiso =Â np.repeat(np.where(biso<1.,np.exp(biso),1.0),len(SGT),axis=1).T |
---|
1139 | Â Â Â Â HbH =Â -np.sum(Uniq.T*np.swapaxes(np.inner(bij,Uniq),2,-1),axis=1) |
---|
1140 | Â Â Â Â Tuij =Â np.where(HbH<1.,np.exp(HbH),1.0).T |
---|
1141 |     Hij = np.array([Mast*np.multiply.outer(U,U) for U in np.reshape(Uniq,(-1,3))]) |
---|
1142 |     Hij = np.reshape(np.array([G2lat.UijtoU6(uij) for uij in Hij]),(-1,len(SGT),6)) |
---|
1143 |     Tindx = np.array([refDict['FF']['El'].index(El) for El in Tdata]) |
---|
1144 | Â Â Â Â MF =Â refDict['FF']['MF'][iBeg:iFin].T[Tindx].TÂ Â #Nref,Natm |
---|
1145 | Â Â Â Â TMcorr =Â 0.539*(np.reshape(Tiso,Tuij.shape)*Tuij)[:,0,:]*Fdata*Mdata*MF/(2*Nops)Â Â Â #Nref,Natm |
---|
1146 |     if SGData['SGInv']: |
---|
1147 |       if not SGData['SGFixed']: |
---|
1148 | Â Â Â Â Â Â Â Â mphase =Â np.hstack((phase,-phase))Â #OK |
---|
1149 | Â Â Â Â Â Â Â Â Uniq =Â np.hstack((Uniq,-Uniq))Â Â Â #Nref,Nops,hkl |
---|
1150 | Â Â Â Â Â Â Â Â Hij =Â np.hstack((Hij,Hij)) |
---|
1151 | Â Â Â Â Â Â else: |
---|
1152 | Â Â Â Â Â Â Â Â mphase =Â phase |
---|
1153 | Â Â Â Â else: |
---|
1154 |       mphase = phase          # |
---|
1155 |     Hij = np.concatenate(np.array([Hij for cen in SGData['SGCen']]),axis=1) |
---|
1156 |     Uniq = np.hstack([Uniq for cen in SGData['SGCen']]) |
---|
1157 |     mphase = np.array([mphase+twopi*np.inner(cen,H)[:,nxs,nxs] for cen in SGData['SGCen']]) |
---|
1158 | Â Â Â Â mphase =Â np.concatenate(mphase,axis=1)Â Â Â Â Â Â Â #Nref,Nop,Natm |
---|
1159 | Â Â Â Â sinm =Â np.sin(mphase)Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #ditto - match magstrfc.for |
---|
1160 | Â Â Â Â cosm =Â np.cos(mphase)Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #ditto |
---|
1161 | Â Â Â Â HM =Â np.inner(Bmat.T,H)Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #put into cartesian space |
---|
1162 | Â Â Â Â HM =Â HM/np.sqrt(np.sum(HM**2,axis=0))Â Â Â Â Â Â Â Â #unit cartesian vector for H |
---|
1163 | Â Â Â Â eDotK =Â np.sum(HM[:,:,nxs,nxs]*Kdata[:,nxs,:,:],axis=0) |
---|
1164 | Â Â Â Â deDotK =Â HM.T[nxs,:,nxs,:]*dG.T[:,nxs,:,:]Â Â #Mxyz,Nref,Nops |
---|
1165 | Â Â Â Â Q =Â HM[:,:,nxs,nxs]*eDotK[nxs,:,:,:]-Kdata[:,nxs,:,:]Â #Mxyz,Nref,Nop,Natm = BPM in magstrfc.for OK |
---|
1166 | Â Â Â Â dqdk =Â np.sum(HM[:,:,nxs,nxs]*deDotK-dG.T[:,nxs,:,:],axis=3)Â Â Â #Nref,Nops,Mxyyz |
---|
1167 | Â Â Â Â NQ =Â np.where(np.abs(Q)>0.,1./np.abs(Q),0.)Â Â Â #this sort of works esp for 1 axis moments |
---|
1168 | Â Â Â Â dqdm =Â dqdk[:,:,:,nxs]*dkdm[:,nxs,:,:] |
---|
1169 | Â Â Â Â dmx =Â NQ*Q*dMdm[:,nxs,nxs,:] |
---|
1170 | Â Â Â Â dmx +=Â NQ*dqdm*Mag[nxs,nxs,:,:] |
---|
1171 | Â Â Â Â |
---|
1172 | Â Â Â Â fam =Â Q*TMcorr[nxs,:,nxs,:]*cosm[nxs,:,:,:]*Mag[nxs,nxs,:,:]Â Â #Mxyz,Nref,Nop,Natm |
---|
1173 | Â Â Â Â fbm =Â Q*TMcorr[nxs,:,nxs,:]*sinm[nxs,:,:,:]*Mag[nxs,nxs,:,:] |
---|
1174 | Â Â Â Â fams =Â np.sum(np.sum(fam,axis=-1),axis=-1)Â Â Â Â Â Â Â Â Â Â Â #Mxyz,Nref |
---|
1175 | Â Â Â Â fbms =Â np.sum(np.sum(fbm,axis=-1),axis=-1) |
---|
1176 | Â Â Â Â famx =Â -Q*TMcorr[nxs,:,nxs,:]*Mag[nxs,nxs,:,:]*sinm[nxs,:,:,:]Â Â #Mxyz,Nref,Nops,Natom |
---|
1177 | Â Â Â Â fbmx =Â Q*TMcorr[nxs,:,nxs,:]*Mag[nxs,nxs,:,:]*cosm[nxs,:,:,:] |
---|
1178 | Â Â Â Â #sums below are over Nops - real part |
---|
1179 | Â Â Â Â dfadfr =Â np.sum(fam/occ,axis=2)Â Â Â Â #array(Mxyz,refBlk,nAtom) Fdata != 0 avoids /0. problem deriv OK |
---|
1180 | Â Â Â Â dfadx =Â np.sum(twopi*Uniq[nxs,:,:,nxs,:]*famx[:,:,:,:,nxs],axis=2)Â Â Â Â Â #deriv OK |
---|
1181 | Â Â Â Â dfadmx =Â np.sum(dmx*TMcorr[nxs,:,nxs,:]*cosm[nxs,:,:,:],axis=2) |
---|
1182 | Â Â Â Â dfadui =Â np.sum(-SQfactor[:,nxs,nxs]*fam,axis=2)Â #array(Ops,refBlk,nAtoms)Â deriv OK |
---|
1183 | Â Â Â Â dfadua =Â np.sum(-Hij[nxs,:,:,nxs,:]*fam[:,:,:,:,nxs],axis=2)Â Â #deriv OK? not U12 & U23 in sarc |
---|
1184 | Â Â Â Â # imaginary part; array(3,refBlk,nAtom,3) & array(3,refBlk,nAtom,6) |
---|
1185 | Â Â Â Â dfbdfr =Â np.sum(fbm/occ,axis=2)Â Â Â Â #array(mxyz,refBlk,nAtom) Fdata != 0 avoids /0. problem |
---|
1186 | Â Â Â Â dfbdx =Â np.sum(twopi*Uniq[nxs,:,:,nxs,:]*fbmx[:,:,:,:,nxs],axis=2) |
---|
1187 | Â Â Â Â dfbdmx =Â np.sum(dmx*TMcorr[nxs,:,nxs,:]*sinm[nxs,:,:,:],axis=2) |
---|
1188 | Â Â Â Â dfbdui =Â np.sum(-SQfactor[:,nxs,nxs]*fbm,axis=2)Â #array(Ops,refBlk,nAtoms) |
---|
1189 | Â Â Â Â dfbdua =Â np.sum(-Hij[nxs,:,:,nxs,:]*fbm[:,:,:,:,nxs],axis=2) |
---|
1190 |     #accumulate derivatives  |
---|
1191 | Â Â Â Â dFdfr[iBeg:iFin]Â =Â 2.*np.sum((fams[:,:,nxs]*dfadfr+fbms[:,:,nxs]*dfbdfr)*Mdata/Nops,axis=0)Â #ok |
---|
1192 | Â Â Â Â dFdx[iBeg:iFin]Â =Â 2.*np.sum(fams[:,:,nxs,nxs]*dfadx+fbms[:,:,nxs,nxs]*dfbdx,axis=0)Â Â Â Â Â #ok |
---|
1193 | Â Â Â Â dFdMx[:,iBeg:iFin,:]Â =Â 2.*(fams[:,:,nxs]*dfadmx+fbms[:,:,nxs]*dfbdmx)Â Â Â Â Â Â Â Â Â Â Â Â #problems |
---|
1194 | Â Â Â Â dFdui[iBeg:iFin]Â =Â 2.*np.sum(fams[:,:,nxs]*dfadui+fbms[:,:,nxs]*dfbdui,axis=0)Â Â Â Â Â Â Â #ok |
---|
1195 | Â Â Â Â dFdua[iBeg:iFin]Â =Â 2.*np.sum(fams[:,:,nxs,nxs]*dfadua+fbms[:,:,nxs,nxs]*dfbdua,axis=0)Â Â Â #problems U12 & U23 in sarc |
---|
1196 | Â Â Â Â iBeg +=Â blkSize |
---|
1197 |   print (' %d derivative time %.4f\r'%(nRef,time.time()-time0)) |
---|
1198 | Â Â Â Â #loop over atoms - each dict entry is list of derivatives for all the reflections |
---|
1199 |   for i in range(len(Mdata)): |
---|
1200 | Â Â Â Â dFdvDict[pfx+'Afrac:'+str(i)]Â =Â dFdfr.T[i] |
---|
1201 | Â Â Â Â dFdvDict[pfx+'dAx:'+str(i)]Â =Â dFdx.T[0][i] |
---|
1202 | Â Â Â Â dFdvDict[pfx+'dAy:'+str(i)]Â =Â dFdx.T[1][i] |
---|
1203 | Â Â Â Â dFdvDict[pfx+'dAz:'+str(i)]Â =Â dFdx.T[2][i] |
---|
1204 | Â Â Â Â dFdvDict[pfx+'AMx:'+str(i)]Â =Â dFdMx[0,:,i] |
---|
1205 | Â Â Â Â dFdvDict[pfx+'AMy:'+str(i)]Â =Â dFdMx[1,:,i] |
---|
1206 | Â Â Â Â dFdvDict[pfx+'AMz:'+str(i)]Â =Â dFdMx[2,:,i] |
---|
1207 | Â Â Â Â dFdvDict[pfx+'AUiso:'+str(i)]Â =Â dFdui.T[i] |
---|
1208 | Â Â Â Â dFdvDict[pfx+'AU11:'+str(i)]Â =Â dFdua.T[0][i] |
---|
1209 | Â Â Â Â dFdvDict[pfx+'AU22:'+str(i)]Â =Â dFdua.T[1][i] |
---|
1210 | Â Â Â Â dFdvDict[pfx+'AU33:'+str(i)]Â =Â dFdua.T[2][i] |
---|
1211 | Â Â Â Â dFdvDict[pfx+'AU12:'+str(i)]Â =Â dFdua.T[3][i] |
---|
1212 | Â Â Â Â dFdvDict[pfx+'AU13:'+str(i)]Â =Â dFdua.T[4][i] |
---|
1213 | Â Â Â Â dFdvDict[pfx+'AU23:'+str(i)]Â =Â dFdua.T[5][i] |
---|
1214 |   return dFdvDict |
---|
1215 | Â Â Â Â |
---|
1216 | def StructureFactorDervTw2(refDict,G,hfx,pfx,SGData,calcControls,parmDict): |
---|
1217 | Â Â '''Compute structure factor derivatives on blocks of reflections - for twins only |
---|
1218 | Â Â faster than StructureFactorDervTw |
---|
1219 | Â Â input: |
---|
1220 | Â Â |
---|
1221 | Â Â :param dict refDict: where |
---|
1222 | Â Â Â Â 'RefList' list where each ref = h,k,l,it,d,... |
---|
1223 | Â Â Â Â 'FF' dict of form factors - filled in below |
---|
1224 | Â Â :param np.array G:Â Â Â reciprocal metric tensor |
---|
1225 | Â Â :param str hfx:Â Â histogram id string |
---|
1226 | Â Â :param str pfx:Â Â phase id string |
---|
1227 | Â Â :param dict SGData: space group info. dictionary output from SpcGroup |
---|
1228 | Â Â :param dict calcControls: |
---|
1229 | Â Â :param dict parmDict: |
---|
1230 | Â Â |
---|
1231 | Â Â :returns: dict dFdvDict: dictionary of derivatives |
---|
1232 | Â Â ''' |
---|
1233 | Â Â phfx =Â pfx.split(':')[0]+hfx |
---|
1234 | Â Â ast =Â np.sqrt(np.diag(G)) |
---|
1235 | Â Â Mast =Â twopisq*np.multiply.outer(ast,ast) |
---|
1236 |   SGMT = np.array([ops[0].T for ops in SGData['SGOps']]) |
---|
1237 |   SGT = np.array([ops[1] for ops in SGData['SGOps']]) |
---|
1238 | Â Â FFtables =Â calcControls['FFtables'] |
---|
1239 | Â Â BLtables =Â calcControls['BLtables'] |
---|
1240 | Â Â TwDict =Â refDict.get('TwDict',{})Â Â Â Â Â Â |
---|
1241 | Â Â NTL =Â calcControls[phfx+'NTL'] |
---|
1242 | Â Â NM =Â calcControls[phfx+'TwinNMN']+1 |
---|
1243 | Â Â TwinLaw =Â calcControls[phfx+'TwinLaw'] |
---|
1244 |   TwinFr = np.array([parmDict[phfx+'TwinFr:'+str(i)] for i in range(len(TwinLaw))]) |
---|
1245 | Â Â TwinInv =Â list(np.where(calcControls[phfx+'TwinInv'],-1,1)) |
---|
1246 | Â Â nTwin =Â len(TwinLaw)Â Â Â Â |
---|
1247 | Â Â nRef =Â len(refDict['RefList']) |
---|
1248 | Â Â Tdata,Mdata,Fdata,Xdata,dXdata,IAdata,Uisodata,Uijdata,Gdata =Â \ |
---|
1249 | Â Â Â Â GetAtomFXU(pfx,calcControls,parmDict) |
---|
1250 |   if not Xdata.size:     #no atoms in phase! |
---|
1251 |     return {} |
---|
1252 | Â Â mSize =Â len(Mdata) |
---|
1253 | Â Â FF =Â np.zeros(len(Tdata)) |
---|
1254 |   if 'NC' in calcControls[hfx+'histType']: |
---|
1255 | Â Â Â Â FP,FPP =Â G2el.BlenResCW(Tdata,BLtables,parmDict[hfx+'Lam']) |
---|
1256 |   elif 'X' in calcControls[hfx+'histType']: |
---|
1257 |     FP = np.array([FFtables[El][hfx+'FP'] for El in Tdata]) |
---|
1258 |     FPP = np.array([FFtables[El][hfx+'FPP'] for El in Tdata]) |
---|
1259 | Â Â Uij =Â np.array(G2lat.U6toUij(Uijdata)) |
---|
1260 | Â Â bij =Â Mast*Uij.T |
---|
1261 | Â Â dFdvDict =Â {} |
---|
1262 | Â Â dFdfr =Â np.zeros((nRef,nTwin,mSize)) |
---|
1263 | Â Â dFdx =Â np.zeros((nRef,nTwin,mSize,3)) |
---|
1264 | Â Â dFdui =Â np.zeros((nRef,nTwin,mSize)) |
---|
1265 | Â Â dFdua =Â np.zeros((nRef,nTwin,mSize,6)) |
---|
1266 | Â Â dFdbab =Â np.zeros((nRef,nTwin,2)) |
---|
1267 | Â Â dFdtw =Â np.zeros((nRef,nTwin)) |
---|
1268 | Â Â time0 =Â time.time() |
---|
1269 | #reflection processing begins here - big arrays! |
---|
1270 | Â Â iBeg =Â 0 |
---|
1271 | Â Â blkSize =Â 16Â Â Â Â #no. of reflections in a block - optimized for speed |
---|
1272 |   while iBeg < nRef: |
---|
1273 | Â Â Â Â iFin =Â min(iBeg+blkSize,nRef) |
---|
1274 | Â Â Â Â refl =Â refDict['RefList'][iBeg:iFin]Â Â #array(blkSize,nItems) |
---|
1275 | Â Â Â Â H =Â refl.T[:3] |
---|
1276 | Â Â Â Â H =Â np.inner(H.T,TwinLaw)Â Â #array(3,nTwins) |
---|
1277 | Â Â Â Â TwMask =Â np.any(H,axis=-1) |
---|
1278 |     for ir in range(blkSize): |
---|
1279 | Â Â Â Â Â Â iref =Â ir+iBeg |
---|
1280 |       if iref in TwDict: |
---|
1281 |         for i in TwDict[iref]: |
---|
1282 |           for n in range(NTL): |
---|
1283 | Â Â Â Â Â Â Â Â Â Â Â Â H[ir][i+n*NM]Â =Â np.inner(TwinLaw[n*NM],np.array(TwDict[iref][i])*TwinInv[i+n*NM]) |
---|
1284 | Â Â Â Â TwMask =Â np.any(H,axis=-1) |
---|
1285 | Â Â Â Â SQ =Â 1./(2.*refl.T[4])**2Â Â Â Â Â Â Â # or (sin(theta)/lambda)**2 |
---|
1286 | Â Â Â Â SQfactor =Â 8.0*SQ*np.pi**2 |
---|
1287 |     if 'T' in calcControls[hfx+'histType']: |
---|
1288 |       if 'P' in calcControls[hfx+'histType']: |
---|
1289 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[14]) |
---|
1290 | Â Â Â Â Â Â else: |
---|
1291 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[12]) |
---|
1292 | Â Â Â Â Â Â FP =Â np.repeat(FP.T,len(SGT)*len(TwinLaw),axis=0) |
---|
1293 | Â Â Â Â Â Â FPP =Â np.repeat(FPP.T,len(SGT)*len(TwinLaw),axis=0) |
---|
1294 | Â Â Â Â dBabdA =Â np.exp(-parmDict[phfx+'BabU']*SQfactor) |
---|
1295 | Â Â Â Â Bab =Â np.repeat(parmDict[phfx+'BabA']*dBabdA,len(SGT)*nTwin) |
---|
1296 |     Tindx = np.array([refDict['FF']['El'].index(El) for El in Tdata]) |
---|
1297 | Â Â Â Â FF =Â np.repeat(refDict['FF']['FF'][iBeg:iFin].T[Tindx].T,len(SGT)*len(TwinLaw),axis=0) |
---|
1298 | Â Â Â Â Uniq =Â np.inner(H,SGMT)Â Â Â Â Â Â Â # (nTwin,nSGOp,3) |
---|
1299 | Â Â Â Â Phi =Â np.inner(H,SGT) |
---|
1300 | Â Â Â Â phase =Â twopi*(np.inner(Uniq,(dXdata+Xdata).T).T+Phi.T).T |
---|
1301 | Â Â Â Â sinp =Â np.sin(phase) |
---|
1302 | Â Â Â Â cosp =Â np.cos(phase) |
---|
1303 | Â Â Â Â occ =Â Mdata*Fdata/len(SGT) |
---|
1304 | Â Â Â Â biso =Â -SQfactor*Uisodata[:,nxs] |
---|
1305 | Â Â Â Â Tiso =Â np.repeat(np.where(biso<1.,np.exp(biso),1.0),len(SGT)*nTwin,axis=1) |
---|
1306 | Â Â Â Â HbH =Â -np.sum(Uniq.T*np.swapaxes(np.inner(bij,Uniq),2,-1),axis=1) |
---|
1307 |     Hij = np.array([Mast*np.multiply.outer(U,U) for U in np.reshape(Uniq,(-1,3))]) |
---|
1308 |     Hij = np.reshape(np.array([G2lat.UijtoU6(uij) for uij in Hij]),(-1,nTwin,len(SGT),6)) |
---|
1309 | Â Â Â Â Tuij =Â np.where(HbH<1.,np.exp(HbH),1.0) |
---|
1310 | Â Â Â Â Tcorr =Â (np.reshape(Tiso,Tuij.shape)*Tuij).T*Mdata*Fdata/len(SGMT) |
---|
1311 | Â Â Â Â fot =Â np.reshape(((FF+FP).T-Bab).T,cosp.shape)*Tcorr |
---|
1312 |     fotp = FPP*Tcorr    |
---|
1313 |     if 'T' in calcControls[hfx+'histType']: #fa,fb are 2 X blkSize X nTwin X nOps x nAtoms |
---|
1314 | Â Â Â Â Â Â fa =Â np.array([np.reshape(((FF+FP).T-Bab).T,cosp.shape)*cosp*Tcorr,-np.reshape(FPP,sinp.shape)*sinp*Tcorr]) |
---|
1315 | Â Â Â Â Â Â fb =Â np.array([np.reshape(((FF+FP).T-Bab).T,sinp.shape)*sinp*Tcorr,np.reshape(FPP,cosp.shape)*cosp*Tcorr]) |
---|
1316 | Â Â Â Â else: |
---|
1317 | Â Â Â Â Â Â fa =Â np.array([np.reshape(((FF+FP).T-Bab).T,cosp.shape)*cosp*Tcorr,-FPP*sinp*Tcorr]) |
---|
1318 | Â Â Â Â Â Â fb =Â np.array([np.reshape(((FF+FP).T-Bab).T,sinp.shape)*sinp*Tcorr,FPP*cosp*Tcorr]) |
---|
1319 | Â Â Â Â fas =Â np.sum(np.sum(fa,axis=-1),axis=-1)Â Â Â #real sum over atoms & unique hkl array(2,nTwins) |
---|
1320 | Â Â Â Â fbs =Â np.sum(np.sum(fb,axis=-1),axis=-1)Â Â Â #imag sum over atoms & uniq hkl |
---|
1321 |     if SGData['SGInv']: #centrosymmetric; B=0 |
---|
1322 | Â Â Â Â Â Â fbs[0]Â *=Â 0. |
---|
1323 | Â Â Â Â Â Â fas[1]Â *=Â 0. |
---|
1324 | Â Â Â Â fax =Â np.array([-fot*sinp,-fotp*cosp])Â Â #positions array(2,nRef,ntwi,nEqv,nAtoms) |
---|
1325 | Â Â Â Â fbx =Â np.array([fot*cosp,-fotp*sinp]) |
---|
1326 | Â Â Â Â #sum below is over Uniq |
---|
1327 | Â Â Â Â dfadfr =Â np.sum(np.sum(fa/occ,axis=-2),axis=0)Â Â Â Â #array(2,nRef,ntwin,nAtom) Fdata != 0 avoids /0. problem |
---|
1328 | Â Â Â Â dfadba =Â np.sum(-cosp*Tcorr[:,nxs],axis=1) |
---|
1329 | Â Â Â Â dfadui =Â np.sum(np.sum(-SQfactor[nxs,:,nxs,nxs,nxs]*fa,axis=-2),axis=0)Â Â Â Â Â Â |
---|
1330 | Â Â Â Â dfadx =Â np.sum(np.sum(twopi*Uniq[nxs,:,:,:,nxs,:]*fax[:,:,:,:,:,nxs],axis=-3),axis=0)Â # nRef x nTwin x nAtoms x xyz; sum on ops & A,A' |
---|
1331 | Â Â Â Â dfadua =Â np.sum(np.sum(-Hij[nxs,:,:,:,nxs,:]*fa[:,:,:,:,:,nxs],axis=-3),axis=0)Â |
---|
1332 |     if not SGData['SGInv']: |
---|
1333 | Â Â Â Â Â Â dfbdfr =Â np.sum(np.sum(fb/occ,axis=-2),axis=0)Â Â Â Â #Fdata != 0 avoids /0. problem |
---|
1334 | Â Â Â Â Â Â dfadba /=Â 2. |
---|
1335 | #Â Â Â Â Â Â dfbdba = np.sum(-sinp*Tcorr[:,nxs],axis=1)/2. |
---|
1336 | Â Â Â Â Â Â dfbdui =Â np.sum(np.sum(-SQfactor[nxs,:,nxs,nxs,nxs]*fb,axis=-2),axis=0) |
---|
1337 | Â Â Â Â Â Â dfbdx =Â np.sum(np.sum(twopi*Uniq[nxs,:,:,:,nxs,:]*fbx[:,:,:,:,:,nxs],axis=-3),axis=0) |
---|
1338 | Â Â Â Â Â Â dfbdua =Â np.sum(np.sum(-Hij[nxs,:,:,:,nxs,:]*fb[:,:,:,:,:,nxs],axis=-3),axis=0) |
---|
1339 | Â Â Â Â else: |
---|
1340 | Â Â Â Â Â Â dfbdfr =Â np.zeros_like(dfadfr) |
---|
1341 | Â Â Â Â Â Â dfbdx =Â np.zeros_like(dfadx) |
---|
1342 | Â Â Â Â Â Â dfbdui =Â np.zeros_like(dfadui) |
---|
1343 | Â Â Â Â Â Â dfbdua =Â np.zeros_like(dfadua) |
---|
1344 | #Â Â Â Â Â Â dfbdba = np.zeros_like(dfadba) |
---|
1345 | Â Â Â Â SA =Â fas[0]+fas[1] |
---|
1346 | Â Â Â Â SB =Â fbs[0]+fbs[1] |
---|
1347 | #Â Â Â Â GSASIIpath.IPyBreak() |
---|
1348 | Â Â Â Â dFdfr[iBeg:iFin]Â =Â ((2.*TwMask*SA)[:,:,nxs]*dfadfr+(2.*TwMask*SB)[:,:,nxs]*dfbdfr)*Mdata[nxs,nxs,:]/len(SGMT) |
---|
1349 | Â Â Â Â dFdx[iBeg:iFin]Â =Â (2.*TwMask*SA)[:,:,nxs,nxs]*dfadx+(2.*TwMask*SB)[:,:,nxs,nxs]*dfbdx |
---|
1350 | Â Â Â Â dFdui[iBeg:iFin]Â =Â (2.*TwMask*SA)[:,:,nxs]*dfadui+(2.*TwMask*SB)[:,:,nxs]*dfbdui |
---|
1351 | Â Â Â Â dFdua[iBeg:iFin]Â =Â (2.*TwMask*SA)[:,:,nxs,nxs]*dfadua+(2.*TwMask*SB)[:,:,nxs,nxs]*dfbdua |
---|
1352 |     if SGData['SGInv']: #centrosymmetric; B=0 |
---|
1353 | Â Â Â Â Â Â dFdtw[iBeg:iFin]Â =Â np.sum(TwMask[nxs,:]*fas,axis=0)**2 |
---|
1354 | Â Â Â Â else:Â Â Â Â Â Â Â Â |
---|
1355 | Â Â Â Â Â Â dFdtw[iBeg:iFin]Â =Â np.sum(TwMask[nxs,:]*fas,axis=0)**2+np.sum(TwMask[nxs,:]*fbs,axis=0)**2 |
---|
1356 | #Â Â Â Â dFdbab[iBeg:iFin] = fas[0,:,nxs]*np.array([np.sum(dfadba*dBabdA),np.sum(-dfadba*parmDict[phfx+'BabA']*SQfactor*dBabdA)]).T+ \ |
---|
1357 | #Â Â Â Â Â Â fbs[0,:,nxs]*np.array([np.sum(dfbdba*dBabdA),np.sum(-dfbdba*parmDict[phfx+'BabA']*SQfactor*dBabdA)]).T |
---|
1358 | Â Â Â Â iBeg +=Â blkSize |
---|
1359 | #Â Â Â Â GSASIIpath.IPyBreak() |
---|
1360 |   print (' %d derivative time %.4f\r'%(len(refDict['RefList']),time.time()-time0)) |
---|
1361 | Â Â #loop over atoms - each dict entry is list of derivatives for all the reflections |
---|
1362 |   for i in range(len(Mdata)):   #these all OK |
---|
1363 | Â Â Â Â dFdvDict[pfx+'Afrac:'+str(i)]Â =Â np.sum(dFdfr.T[i]*TwinFr[:,nxs],axis=0) |
---|
1364 | Â Â Â Â dFdvDict[pfx+'dAx:'+str(i)]Â =Â np.sum(dFdx.T[0][i]*TwinFr[:,nxs],axis=0) |
---|
1365 | Â Â Â Â dFdvDict[pfx+'dAy:'+str(i)]Â =Â np.sum(dFdx.T[1][i]*TwinFr[:,nxs],axis=0) |
---|
1366 | Â Â Â Â dFdvDict[pfx+'dAz:'+str(i)]Â =Â np.sum(dFdx.T[2][i]*TwinFr[:,nxs],axis=0) |
---|
1367 | Â Â Â Â dFdvDict[pfx+'AUiso:'+str(i)]Â =Â np.sum(dFdui.T[i]*TwinFr[:,nxs],axis=0) |
---|
1368 | Â Â Â Â dFdvDict[pfx+'AU11:'+str(i)]Â =Â np.sum(dFdua.T[0][i]*TwinFr[:,nxs],axis=0) |
---|
1369 | Â Â Â Â dFdvDict[pfx+'AU22:'+str(i)]Â =Â np.sum(dFdua.T[1][i]*TwinFr[:,nxs],axis=0) |
---|
1370 | Â Â Â Â dFdvDict[pfx+'AU33:'+str(i)]Â =Â np.sum(dFdua.T[2][i]*TwinFr[:,nxs],axis=0) |
---|
1371 | Â Â Â Â dFdvDict[pfx+'AU12:'+str(i)]Â =Â np.sum(dFdua.T[3][i]*TwinFr[:,nxs],axis=0) |
---|
1372 | Â Â Â Â dFdvDict[pfx+'AU13:'+str(i)]Â =Â np.sum(dFdua.T[4][i]*TwinFr[:,nxs],axis=0) |
---|
1373 | Â Â Â Â dFdvDict[pfx+'AU23:'+str(i)]Â =Â np.sum(dFdua.T[5][i]*TwinFr[:,nxs],axis=0) |
---|
1374 | Â Â dFdvDict[phfx+'BabA']Â =Â dFdbab.T[0] |
---|
1375 | Â Â dFdvDict[phfx+'BabU']Â =Â dFdbab.T[1] |
---|
1376 |   for i in range(nTwin): |
---|
1377 | Â Â Â Â dFdvDict[phfx+'TwinFr:'+str(i)]Â =Â dFdtw.T[i] |
---|
1378 |   return dFdvDict |
---|
1379 | Â Â |
---|
1380 | def SStructureFactor(refDict,G,hfx,pfx,SGData,SSGData,calcControls,parmDict): |
---|
1381 | Â Â ''' |
---|
1382 | Â Â Compute super structure factors for all h,k,l,m for phase - no twins |
---|
1383 | Â Â puts the result, F^2, in each ref[9] in refList |
---|
1384 | Â Â works on blocks of 32 reflections for speed |
---|
1385 | Â Â input: |
---|
1386 | Â Â |
---|
1387 | Â Â :param dict refDict: where |
---|
1388 | Â Â Â Â 'RefList' list where each ref = h,k,l,m,it,d,... |
---|
1389 | Â Â Â Â 'FF' dict of form factors - filed in below |
---|
1390 | Â Â :param np.array G:Â Â Â reciprocal metric tensor |
---|
1391 | Â Â :param str pfx:Â Â phase id string |
---|
1392 | Â Â :param dict SGData: space group info. dictionary output from SpcGroup |
---|
1393 | Â Â :param dict calcControls: |
---|
1394 | Â Â :param dict ParmDict: |
---|
1395 | |
---|
1396 | Â Â ''' |
---|
1397 | Â Â phfx =Â pfx.split(':')[0]+hfx |
---|
1398 | Â Â ast =Â np.sqrt(np.diag(G)) |
---|
1399 | Â Â Mast =Â twopisq*np.multiply.outer(ast,ast)Â Â |
---|
1400 | Â Â SGInv =Â SGData['SGInv'] |
---|
1401 |   SGMT = np.array([ops[0].T for ops in SGData['SGOps']]) |
---|
1402 | Â Â Ncen =Â len(SGData['SGCen']) |
---|
1403 | Â Â Nops =Â len(SGMT)*Ncen*(1+SGData['SGInv']) |
---|
1404 |   SSGMT = np.array([ops[0].T for ops in SSGData['SSGOps']]) |
---|
1405 |   SSGT = np.array([ops[1] for ops in SSGData['SSGOps']]) |
---|
1406 | Â Â FFtables =Â calcControls['FFtables'] |
---|
1407 | Â Â BLtables =Â calcControls['BLtables'] |
---|
1408 | Â Â MFtables =Â calcControls['MFtables'] |
---|
1409 | Â Â Amat,Bmat =Â G2lat.Gmat2AB(G) |
---|
1410 | Â Â Flack =Â 1.0 |
---|
1411 |   if not SGData['SGInv'] and 'S' in calcControls[hfx+'histType'] and phfx+'Flack' in parmDict: |
---|
1412 | Â Â Â Â Flack =Â 1.-2.*parmDict[phfx+'Flack'] |
---|
1413 | Â Â Tdata,Mdata,Fdata,Xdata,dXdata,IAdata,Uisodata,Uijdata,Gdata =Â \ |
---|
1414 | Â Â Â Â GetAtomFXU(pfx,calcControls,parmDict) |
---|
1415 |   if not Xdata.size:     #no atoms in phase! |
---|
1416 | Â Â Â Â return |
---|
1417 | |
---|
1418 |   if parmDict[pfx+'isMag']:    #TODO: fix the math - mag moments now along crystal axes |
---|
1419 | Â Â Â Â Mag =Â np.sqrt(np.sum(Gdata**2,axis=0))Â Â Â #magnitude of moments for uniq atoms |
---|
1420 | Â Â Â Â Gdata =Â np.where(Mag>0.,Gdata/Mag,0.)Â Â Â Â #normalze mag. moments |
---|
1421 | Â Â Â Â Gdata =Â np.inner(Gdata.T,SGMT).TÂ Â Â Â Â Â #apply sym. ops. |
---|
1422 |     if SGData['SGInv'] and not SGData['SGFixed']: |
---|
1423 | Â Â Â Â Â Â Gdata =Â np.hstack((Gdata,-Gdata))Â Â Â Â #inversion if any |
---|
1424 |     Gdata = np.hstack([Gdata for icen in range(Ncen)])    #dup over cell centering |
---|
1425 |     Gdata = SGData['MagMom'][nxs,:,nxs]*Gdata  #flip vectors according to spin flip * det(opM) |
---|
1426 | Â Â Â Â Mag =Â np.tile(Mag[:,nxs],len(SGMT)*Ncen).T |
---|
1427 |     if SGData['SGInv'] and not SGData['SGFixed']: |
---|
1428 | Â Â Â Â Â Â Mag =Â np.repeat(Mag,2,axis=0)Â Â Â Â Â Â Â Â Â #Mag same shape as Gdata |
---|
1429 | |
---|
1430 | |
---|
1431 | Â Â waveTypes,FSSdata,XSSdata,USSdata,MSSdata =Â GetAtomSSFXU(pfx,calcControls,parmDict) |
---|
1432 | Â Â ngl,nWaves,Fmod,Xmod,Umod,Mmod,glTau,glWt =Â G2mth.makeWaves(waveTypes,FSSdata,XSSdata,USSdata,MSSdata,Mast) |
---|
1433 | Â Â modQ =Â np.array([parmDict[pfx+'mV0'],parmDict[pfx+'mV1'],parmDict[pfx+'mV2']]) |
---|
1434 | Â Â FF =Â np.zeros(len(Tdata)) |
---|
1435 |   if 'NC' in calcControls[hfx+'histType']: |
---|
1436 | Â Â Â Â FP,FPP =Â G2el.BlenResCW(Tdata,BLtables,parmDict[hfx+'Lam']) |
---|
1437 |   elif 'X' in calcControls[hfx+'histType']: |
---|
1438 |     FP = np.array([FFtables[El][hfx+'FP'] for El in Tdata]) |
---|
1439 |     FPP = np.array([FFtables[El][hfx+'FPP'] for El in Tdata]) |
---|
1440 | Â Â Uij =Â np.array(G2lat.U6toUij(Uijdata)).T |
---|
1441 | Â Â bij =Â Mast*Uij |
---|
1442 | Â Â blkSize =Â 32Â Â Â Â #no. of reflections in a block |
---|
1443 | Â Â nRef =Â refDict['RefList'].shape[0] |
---|
1444 | Â Â SQ =Â 1./(2.*refDict['RefList'].T[5])**2 |
---|
1445 |   if 'N' in calcControls[hfx+'histType']: |
---|
1446 | Â Â Â Â dat =Â G2el.getBLvalues(BLtables) |
---|
1447 | Â Â Â Â refDict['FF']['El']Â =Â list(dat.keys()) |
---|
1448 | Â Â Â Â refDict['FF']['FF']Â =Â np.ones((nRef,len(dat)))*list(dat.values()) |
---|
1449 | Â Â Â Â refDict['FF']['MF']Â =Â np.zeros((nRef,len(dat))) |
---|
1450 |     for iel,El in enumerate(refDict['FF']['El']): |
---|
1451 |       if El in MFtables: |
---|
1452 | Â Â Â Â Â Â Â Â refDict['FF']['MF'].T[iel]Â =Â G2el.MagScatFac(MFtables[El],SQ) |
---|
1453 | Â Â else: |
---|
1454 | Â Â Â Â dat =Â G2el.getFFvalues(FFtables,0.) |
---|
1455 | Â Â Â Â refDict['FF']['El']Â =Â list(dat.keys()) |
---|
1456 | Â Â Â Â refDict['FF']['FF']Â =Â np.zeros((nRef,len(dat))) |
---|
1457 |     for iel,El in enumerate(refDict['FF']['El']): |
---|
1458 | Â Â Â Â Â Â refDict['FF']['FF'].T[iel]Â =Â G2el.ScatFac(FFtables[El],SQ) |
---|
1459 | Â Â time0 =Â time.time() |
---|
1460 | #reflection processing begins here - big arrays! |
---|
1461 | Â Â iBeg =Â 0 |
---|
1462 |   while iBeg < nRef: |
---|
1463 | Â Â Â Â iFin =Â min(iBeg+blkSize,nRef) |
---|
1464 | Â Â Â Â refl =Â refDict['RefList'][iBeg:iFin]Â Â #array(blkSize,nItems) |
---|
1465 | Â Â Â Â H =Â refl.T[:4]Â Â Â Â Â Â Â Â Â Â Â Â Â #array(blkSize,4) |
---|
1466 | Â Â Â Â HP =Â H[:3]+modQ[:,nxs]*H[3:]Â Â Â Â Â Â #projected hklm to hkl |
---|
1467 | Â Â Â Â SQ =Â 1./(2.*refl.T[5])**2Â Â Â Â Â Â Â Â #array(blkSize) |
---|
1468 |     SQfactor = 4.0*SQ*twopisq        #ditto prev. |
---|
1469 | Â Â Â Â Uniq =Â np.inner(H.T,SSGMT) |
---|
1470 | Â Â Â Â UniqP =Â np.inner(HP.T,SGMT) |
---|
1471 | Â Â Â Â Phi =Â np.inner(H.T,SSGT) |
---|
1472 |     if SGInv:  #if centro - expand HKL sets |
---|
1473 | Â Â Â Â Â Â Uniq =Â np.hstack((Uniq,-Uniq)) |
---|
1474 | Â Â Â Â Â Â Phi =Â np.hstack((Phi,-Phi)) |
---|
1475 | Â Â Â Â Â Â UniqP =Â np.hstack((UniqP,-UniqP)) |
---|
1476 |     if 'T' in calcControls[hfx+'histType']: |
---|
1477 |       if 'P' in calcControls[hfx+'histType']: |
---|
1478 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[14]) |
---|
1479 | Â Â Â Â Â Â else: |
---|
1480 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[12]) |
---|
1481 | Â Â Â Â Â Â FP =Â np.repeat(FP.T,Uniq.shape[1],axis=0) |
---|
1482 | Â Â Â Â Â Â FPP =Â np.repeat(FPP.T,Uniq.shape[1],axis=0) |
---|
1483 | Â Â Â Â Bab =Â np.repeat(parmDict[phfx+'BabA']*np.exp(-parmDict[phfx+'BabU']*SQfactor),Uniq.shape[1]) |
---|
1484 |     Tindx = np.array([refDict['FF']['El'].index(El) for El in Tdata]) |
---|
1485 | Â Â Â Â FF =Â np.repeat(refDict['FF']['FF'][iBeg:iFin].T[Tindx].T,Uniq.shape[1],axis=0) |
---|
1486 | Â Â Â Â phase =Â twopi*(np.inner(Uniq[:,:,:3],(dXdata.T+Xdata.T))-Phi[:,:,nxs]) |
---|
1487 | Â Â Â Â sinp =Â np.sin(phase) |
---|
1488 | Â Â Â Â cosp =Â np.cos(phase) |
---|
1489 | Â Â Â Â biso =Â -SQfactor*Uisodata[:,nxs] |
---|
1490 | Â Â Â Â Tiso =Â np.repeat(np.where(biso<1.,np.exp(biso),1.0),Uniq.shape[1],axis=1).T |
---|
1491 | Â Â Â Â HbH =Â -np.sum(UniqP[:,:,nxs,:]*np.inner(UniqP[:,:,:],bij),axis=-1)Â #use hklt proj to hkl |
---|
1492 | Â Â Â Â Tuij =Â np.where(HbH<1.,np.exp(HbH),1.0) |
---|
1493 | Â Â Â Â Tcorr =Â np.reshape(Tiso,Tuij.shape)*Tuij*Mdata*Fdata/Uniq.shape[1]Â #refBlk x ops x atoms |
---|
1494 | |
---|
1495 |     if 'N' in calcControls[hfx+'histType'] and parmDict[pfx+'isMag']:    #TODO: math here?? |
---|
1496 | Â Â Â Â Â Â MF =Â refDict['FF']['MF'][iBeg:iFin].T[Tindx].TÂ Â #Nref,Natm |
---|
1497 | Â Â Â Â Â Â TMcorr =Â 0.539*(np.reshape(Tiso,Tuij.shape)*Tuij)[:,0,:]*Fdata*Mdata*MF/(2*Nops)Â Â Â #Nref,Natm |
---|
1498 |       if SGData['SGInv'] and not SGData['SGFixed']: |
---|
1499 | Â Â Â Â Â Â Â Â mphase =Â np.hstack((phase,-phase)) |
---|
1500 | Â Â Â Â Â Â else: |
---|
1501 | Â Â Â Â Â Â Â Â mphase =Â phase |
---|
1502 |       mphase = np.array([mphase+twopi*np.inner(cen,H)[:,nxs,nxs] for cen in SGData['SGCen']]) |
---|
1503 | Â Â Â Â Â Â mphase =Â np.concatenate(mphase,axis=1)Â Â Â Â Â Â Â #Nref,full Nop,Natm |
---|
1504 | Â Â Â Â Â Â sinm =Â np.sin(mphase)Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #ditto - match magstrfc.for |
---|
1505 | Â Â Â Â Â Â cosm =Â np.cos(mphase)Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #ditto |
---|
1506 | Â Â Â Â Â Â HM =Â np.inner(Bmat,H)Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #put into cartesian space |
---|
1507 | Â Â Â Â Â Â HM =Â HM/np.sqrt(np.sum(HM**2,axis=0))Â Â Â Â Â Â Â Â #Gdata = MAGS & HM = UVEC in magstrfc.for both OK |
---|
1508 | Â Â Â Â Â Â eDotK =Â np.sum(HM[:,:,nxs,nxs]*Gdata[:,nxs,:,:],axis=0) |
---|
1509 | Â Â Â Â Â Â Q =Â HM[:,:,nxs,nxs]*eDotK[nxs,:,:,:]-Gdata[:,nxs,:,:]Â #xyz,Nref,Nop,Natm = BPM in magstrfc.for OK |
---|
1510 | Â Â Â Â Â Â fam =Â Q*TMcorr[nxs,:,nxs,:]*cosm[nxs,:,:,:]*Mag[nxs,nxs,:,:]Â Â #ditto |
---|
1511 | Â Â Â Â Â Â fbm =Â Q*TMcorr[nxs,:,nxs,:]*sinm[nxs,:,:,:]*Mag[nxs,nxs,:,:]Â Â #ditto |
---|
1512 | Â Â Â Â Â Â fams =Â np.sum(np.sum(fam,axis=-1),axis=-1)Â Â Â Â Â Â Â Â Â Â Â Â Â #xyz,Nref |
---|
1513 | Â Â Â Â Â Â fbms =Â np.sum(np.sum(fbm,axis=-1),axis=-1)Â Â Â Â Â Â Â Â Â Â Â Â Â #ditto |
---|
1514 | Â Â Â Â Â Â refl.T[9]Â =Â np.sum(fams**2,axis=0)+np.sum(fbms**2,axis=0) |
---|
1515 | Â Â Â Â Â Â refl.T[7]Â =Â np.copy(refl.T[9])Â Â Â Â Â Â Â Â |
---|
1516 | Â Â Â Â Â Â refl.T[10]Â =Â 0.0Â Â #atan2d(fbs[0],fas[0]) - what is phase for mag refl? |
---|
1517 | |
---|
1518 | |
---|
1519 | Â Â Â Â else: |
---|
1520 |       if 'T' in calcControls[hfx+'histType']: |
---|
1521 | Â Â Â Â Â Â Â Â fa =Â np.array([np.reshape(((FF+FP).T-Bab).T,cosp.shape)*cosp*Tcorr,-np.reshape(Flack*FPP,sinp.shape)*sinp*Tcorr]) |
---|
1522 | Â Â Â Â Â Â Â Â fb =Â np.array([np.reshape(Flack*FPP,cosp.shape)*cosp*Tcorr,np.reshape(((FF+FP).T-Bab).T,sinp.shape)*sinp*Tcorr]) |
---|
1523 | Â Â Â Â Â Â else: |
---|
1524 | Â Â Â Â Â Â Â Â fa =Â np.array([np.reshape(((FF+FP).T-Bab).T,cosp.shape)*cosp*Tcorr,-Flack*FPP*sinp*Tcorr]) |
---|
1525 | Â Â Â Â Â Â Â Â fb =Â np.array([Flack*FPP*cosp*Tcorr,np.reshape(((FF+FP).T-Bab).T,sinp.shape)*sinp*Tcorr]) |
---|
1526 | Â Â Â Â Â Â GfpuA =Â G2mth.Modulation(Uniq,UniqP,nWaves,Fmod,Xmod,Umod,glTau,glWt)Â #2 x refBlk x sym X atoms |
---|
1527 | Â Â Â Â Â Â fag =Â fa*GfpuA[0]-fb*GfpuA[1]Â Â #real; 2 x refBlk x sym x atoms |
---|
1528 | Â Â Â Â Â Â fbg =Â fb*GfpuA[0]+fa*GfpuA[1] |
---|
1529 | Â Â Â Â Â Â fas =Â np.sum(np.sum(fag,axis=-1),axis=-1)Â Â #2 x refBlk; sum sym & atoms |
---|
1530 | Â Â Â Â Â Â fbs =Â np.sum(np.sum(fbg,axis=-1),axis=-1) |
---|
1531 |       if 'P' in calcControls[hfx+'histType']: |
---|
1532 | Â Â Â Â Â Â Â Â refl.T[10]Â =Â np.sum(fas,axis=0)**2+np.sum(fbs,axis=0)**2Â Â #square of sums |
---|
1533 | Â Â Â Â Â Â Â Â refl.T[11]Â =Â atan2d(fbs[0],fas[0])Â #ignore f' & f" |
---|
1534 | Â Â Â Â Â Â else: |
---|
1535 | Â Â Â Â Â Â Â Â refl.T[10]Â =Â np.sum(fas,axis=0)**2+np.sum(fbs,axis=0)**2Â Â #square of sums |
---|
1536 | Â Â Â Â Â Â Â Â refl.T[8]Â =Â np.copy(refl.T[10])Â Â Â Â Â Â Â Â |
---|
1537 | Â Â Â Â Â Â Â Â refl.T[11]Â =Â atan2d(fbs[0],fas[0])Â #ignore f' & f" |
---|
1538 | Â Â Â Â iBeg +=Â blkSize |
---|
1539 |   print ('nRef %d time %.4f\r'%(nRef,time.time()-time0)) |
---|
1540 | |
---|
1541 | def SStructureFactorTw(refDict,G,hfx,pfx,SGData,SSGData,calcControls,parmDict): |
---|
1542 | Â Â ''' |
---|
1543 | Â Â Compute super structure factors for all h,k,l,m for phase - twins only |
---|
1544 | Â Â puts the result, F^2, in each ref[8+im] in refList |
---|
1545 | Â Â works on blocks of 32 reflections for speed |
---|
1546 | Â Â input: |
---|
1547 | Â Â |
---|
1548 | Â Â :param dict refDict: where |
---|
1549 | Â Â Â Â 'RefList' list where each ref = h,k,l,m,it,d,... |
---|
1550 | Â Â Â Â 'FF' dict of form factors - filed in below |
---|
1551 | Â Â :param np.array G:Â Â Â reciprocal metric tensor |
---|
1552 | Â Â :param str pfx:Â Â phase id string |
---|
1553 | Â Â :param dict SGData: space group info. dictionary output from SpcGroup |
---|
1554 | Â Â :param dict calcControls: |
---|
1555 | Â Â :param dict ParmDict: |
---|
1556 | |
---|
1557 | Â Â ''' |
---|
1558 | Â Â phfx =Â pfx.split(':')[0]+hfx |
---|
1559 | Â Â ast =Â np.sqrt(np.diag(G)) |
---|
1560 | Â Â Mast =Â twopisq*np.multiply.outer(ast,ast)Â Â |
---|
1561 | Â Â SGInv =Â SGData['SGInv'] |
---|
1562 |   SGMT = np.array([ops[0].T for ops in SGData['SGOps']]) |
---|
1563 |   SSGMT = np.array([ops[0].T for ops in SSGData['SSGOps']]) |
---|
1564 |   SSGT = np.array([ops[1] for ops in SSGData['SSGOps']]) |
---|
1565 | Â Â FFtables =Â calcControls['FFtables'] |
---|
1566 | Â Â BLtables =Â calcControls['BLtables'] |
---|
1567 | Â Â MFtables =Â calcControls['MFtables'] |
---|
1568 | Â Â Flack =Â 1.0 |
---|
1569 |   if not SGData['SGInv'] and 'S' in calcControls[hfx+'histType'] and phfx+'Flack' in parmDict: |
---|
1570 | Â Â Â Â Flack =Â 1.-2.*parmDict[phfx+'Flack'] |
---|
1571 | Â Â TwinLaw =Â np.array([[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],])Â Â #4D? |
---|
1572 | Â Â TwDict =Â refDict.get('TwDict',{})Â Â Â Â Â Â |
---|
1573 |   if 'S' in calcControls[hfx+'histType']: |
---|
1574 | Â Â Â Â NTL =Â calcControls[phfx+'NTL'] |
---|
1575 | Â Â Â Â NM =Â calcControls[phfx+'TwinNMN']+1 |
---|
1576 | Â Â Â Â TwinLaw =Â calcControls[phfx+'TwinLaw']Â #this'll have to be 4D also... |
---|
1577 |     TwinFr = np.array([parmDict[phfx+'TwinFr:'+str(i)] for i in range(len(TwinLaw))]) |
---|
1578 | Â Â Â Â TwinInv =Â list(np.where(calcControls[phfx+'TwinInv'],-1,1)) |
---|
1579 | Â Â Tdata,Mdata,Fdata,Xdata,dXdata,IAdata,Uisodata,Uijdata,Gdata =Â \ |
---|
1580 | Â Â Â Â GetAtomFXU(pfx,calcControls,parmDict) |
---|
1581 |   if not Xdata.size:     #no atoms in phase! |
---|
1582 | Â Â Â Â return |
---|
1583 | Â Â waveTypes,FSSdata,XSSdata,USSdata,MSSdata =Â GetAtomSSFXU(pfx,calcControls,parmDict) |
---|
1584 | Â Â ngl,nWaves,Fmod,Xmod,Umod,Mmod,glTau,glWt =Â G2mth.makeWaves(waveTypes,FSSdata,XSSdata,USSdata,Mast) |
---|
1585 | Â Â modQ =Â np.array([parmDict[pfx+'mV0'],parmDict[pfx+'mV1'],parmDict[pfx+'mV2']]) |
---|
1586 | Â Â FF =Â np.zeros(len(Tdata)) |
---|
1587 |   if 'NC' in calcControls[hfx+'histType']: |
---|
1588 | Â Â Â Â FP,FPP =Â G2el.BlenResCW(Tdata,BLtables,parmDict[hfx+'Lam']) |
---|
1589 |   elif 'X' in calcControls[hfx+'histType']: |
---|
1590 |     FP = np.array([FFtables[El][hfx+'FP'] for El in Tdata]) |
---|
1591 |     FPP = np.array([FFtables[El][hfx+'FPP'] for El in Tdata]) |
---|
1592 | Â Â Uij =Â np.array(G2lat.U6toUij(Uijdata)).T |
---|
1593 | Â Â bij =Â Mast*Uij |
---|
1594 | Â Â blkSize =Â 32Â Â Â Â #no. of reflections in a block |
---|
1595 | Â Â nRef =Â refDict['RefList'].shape[0] |
---|
1596 |   if not len(refDict['FF']):        #no form factors - 1st time thru StructureFactor |
---|
1597 | Â Â Â Â SQ =Â 1./(2.*refDict['RefList'].T[5])**2 |
---|
1598 |     if 'N' in calcControls[hfx+'histType']: |
---|
1599 | Â Â Â Â Â Â dat =Â G2el.getBLvalues(BLtables) |
---|
1600 | Â Â Â Â Â Â refDict['FF']['El']Â =Â list(dat.keys()) |
---|
1601 | Â Â Â Â Â Â refDict['FF']['FF']Â =Â np.ones((nRef,len(dat)))*list(dat.values()) |
---|
1602 | Â Â Â Â Â Â refDict['FF']['MF']Â =Â np.zeros((nRef,len(dat))) |
---|
1603 |       for iel,El in enumerate(refDict['FF']['El']): |
---|
1604 |         if El in MFtables: |
---|
1605 | Â Â Â Â Â Â Â Â Â Â refDict['FF']['MF'].T[iel]Â =Â G2el.MagScatFac(MFtables[El],SQ) |
---|
1606 | Â Â Â Â else: |
---|
1607 | Â Â Â Â Â Â dat =Â G2el.getFFvalues(FFtables,0.) |
---|
1608 | Â Â Â Â Â Â refDict['FF']['El']Â =Â list(dat.keys()) |
---|
1609 | Â Â Â Â Â Â refDict['FF']['FF']Â =Â np.zeros((nRef,len(dat))) |
---|
1610 |       for iel,El in enumerate(refDict['FF']['El']): |
---|
1611 | Â Â Â Â Â Â Â Â refDict['FF']['FF'].T[iel]Â =Â G2el.ScatFac(FFtables[El],SQ) |
---|
1612 | Â Â time0 =Â time.time() |
---|
1613 | #reflection processing begins here - big arrays! |
---|
1614 | Â Â iBeg =Â 0 |
---|
1615 |   while iBeg < nRef: |
---|
1616 | Â Â Â Â iFin =Â min(iBeg+blkSize,nRef) |
---|
1617 | Â Â Â Â refl =Â refDict['RefList'][iBeg:iFin]Â Â #array(blkSize,nItems) |
---|
1618 | Â Â Â Â H =Â refl[:,:4]Â Â Â Â Â Â Â Â Â Â Â Â Â #array(blkSize,4) |
---|
1619 | Â Â Â Â H3 =Â refl[:,:3] |
---|
1620 | Â Â Â Â HP =Â H[:,:3]+modQ[nxs,:]*H[:,3:]Â Â Â Â #projected hklm to hkl |
---|
1621 | Â Â Â Â HP =Â np.inner(HP,TwinLaw)Â Â Â Â Â Â Â #array(blkSize,nTwins,4) |
---|
1622 | Â Â Â Â H3 =Â np.inner(H3,TwinLaw)Â Â Â Â |
---|
1623 | Â Â Â Â TwMask =Â np.any(HP,axis=-1) |
---|
1624 |     if TwinLaw.shape[0] > 1 and TwDict: #need np.inner(TwinLaw[?],TwDict[iref][i])*TwinInv[i] |
---|
1625 |       for ir in range(blkSize): |
---|
1626 | Â Â Â Â Â Â Â Â iref =Â ir+iBeg |
---|
1627 |         if iref in TwDict: |
---|
1628 |           for i in TwDict[iref]: |
---|
1629 |             for n in range(NTL): |
---|
1630 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â HP[ir][i+n*NM]Â =Â np.inner(TwinLaw[n*NM],np.array(TwDict[iref][i])*TwinInv[i+n*NM]) |
---|
1631 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â H3[ir][i+n*NM]Â =Â np.inner(TwinLaw[n*NM],np.array(TwDict[iref][i])*TwinInv[i+n*NM]) |
---|
1632 | Â Â Â Â Â Â TwMask =Â np.any(HP,axis=-1) |
---|
1633 | Â Â Â Â SQ =Â 1./(2.*refl.T[5])**2Â Â Â Â Â Â Â Â #array(blkSize) |
---|
1634 |     SQfactor = 4.0*SQ*twopisq        #ditto prev. |
---|
1635 | Â Â Â Â Uniq =Â np.inner(H,SSGMT) |
---|
1636 | Â Â Â Â Uniq3 =Â np.inner(H3,SGMT) |
---|
1637 | Â Â Â Â UniqP =Â np.inner(HP,SGMT) |
---|
1638 | Â Â Â Â Phi =Â np.inner(H,SSGT) |
---|
1639 |     if SGInv:  #if centro - expand HKL sets |
---|
1640 | Â Â Â Â Â Â Uniq =Â np.hstack((Uniq,-Uniq)) |
---|
1641 | Â Â Â Â Â Â Uniq3 =Â np.hstack((Uniq3,-Uniq3)) |
---|
1642 | Â Â Â Â Â Â Phi =Â np.hstack((Phi,-Phi)) |
---|
1643 | Â Â Â Â Â Â UniqP =Â np.hstack((UniqP,-UniqP)) |
---|
1644 |     if 'T' in calcControls[hfx+'histType']: |
---|
1645 |       if 'P' in calcControls[hfx+'histType']: |
---|
1646 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[14]) |
---|
1647 | Â Â Â Â Â Â else: |
---|
1648 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[12]) |
---|
1649 | Â Â Â Â Â Â FP =Â np.repeat(FP.T,Uniq.shape[1]*len(TwinLaw),axis=0) |
---|
1650 | Â Â Â Â Â Â FPP =Â np.repeat(FPP.T,Uniq.shape[1]*len(TwinLaw),axis=0) |
---|
1651 | Â Â Â Â Bab =Â np.repeat(parmDict[phfx+'BabA']*np.exp(-parmDict[phfx+'BabU']*SQfactor),Uniq.shape[1]*len(TwinLaw)) |
---|
1652 |     Tindx = np.array([refDict['FF']['El'].index(El) for El in Tdata]) |
---|
1653 | Â Â Â Â FF =Â np.repeat(refDict['FF']['FF'][iBeg:iFin].T[Tindx].T,Uniq.shape[1]*len(TwinLaw),axis=0) |
---|
1654 | Â Â Â Â phase =Â twopi*(np.inner(Uniq3,(dXdata.T+Xdata.T))-Phi[:,nxs,:,nxs]) |
---|
1655 | Â Â Â Â sinp =Â np.sin(phase) |
---|
1656 | Â Â Â Â cosp =Â np.cos(phase) |
---|
1657 | Â Â Â Â biso =Â -SQfactor*Uisodata[:,nxs] |
---|
1658 | Â Â Â Â Tiso =Â np.repeat(np.where(biso<1.,np.exp(biso),1.0),Uniq.shape[1]*len(TwinLaw),axis=1).T |
---|
1659 | Â Â Â Â HbH =Â -np.sum(UniqP[:,:,:,nxs]*np.inner(UniqP[:,:,:],bij),axis=-1)Â #use hklt proj to hkl |
---|
1660 | Â Â Â Â Tuij =Â np.where(HbH<1.,np.exp(HbH),1.0) |
---|
1661 | Â Â Â Â Tcorr =Â np.reshape(Tiso,Tuij.shape)*Tuij*Mdata*Fdata/Uniq.shape[1]Â #refBlk x ops x atoms |
---|
1662 | #Â Â Â Â GSASIIpath.IPyBreak() |
---|
1663 |     if 'T' in calcControls[hfx+'histType']: |
---|
1664 | Â Â Â Â Â Â fa =Â np.array([np.reshape(((FF+FP).T-Bab).T,cosp.shape)*cosp*Tcorr,-np.reshape(Flack*FPP,sinp.shape)*sinp*Tcorr]) |
---|
1665 | Â Â Â Â Â Â fb =Â np.array([np.reshape(Flack*FPP,cosp.shape)*cosp*Tcorr,np.reshape(((FF+FP).T-Bab).T,sinp.shape)*sinp*Tcorr]) |
---|
1666 | Â Â Â Â else: |
---|
1667 | Â Â Â Â Â Â fa =Â np.array([np.reshape(((FF+FP).T-Bab).T,cosp.shape)*cosp*Tcorr,-Flack*FPP*sinp*Tcorr]) |
---|
1668 | Â Â Â Â Â Â fb =Â np.array([Flack*FPP*cosp*Tcorr,np.reshape(((FF+FP).T-Bab).T,sinp.shape)*sinp*Tcorr]) |
---|
1669 | Â Â Â Â GfpuA =Â G2mth.ModulationTw(Uniq,UniqP,nWaves,Fmod,Xmod,Umod,glTau,glWt)Â #2 x refBlk x sym X atoms |
---|
1670 | Â Â Â Â fag =Â fa*GfpuA[0]-fb*GfpuA[1]Â Â #real; 2 x refBlk x sym x atoms |
---|
1671 | Â Â Â Â fbg =Â fb*GfpuA[0]+fa*GfpuA[1] |
---|
1672 | Â Â Â Â fas =Â np.sum(np.sum(fag,axis=-1),axis=-1)Â Â #2 x refBlk; sum sym & atoms |
---|
1673 | Â Â Â Â fbs =Â np.sum(np.sum(fbg,axis=-1),axis=-1) |
---|
1674 | Â Â Â Â refl.T[10]Â =Â np.sum(fas[:,:,0],axis=0)**2+np.sum(fbs[:,:,0],axis=0)**2Â Â Â Â Â Â Â Â Â #FcT from primary twin element |
---|
1675 | Â Â Â Â refl.T[8]Â =Â np.sum(TwinFr*np.sum(TwMask[nxs,:,:]*fas,axis=0)**2,axis=-1)+Â Â \ |
---|
1676 | Â Â Â Â Â Â np.sum(TwinFr*np.sum(TwMask[nxs,:,:]*fbs,axis=0)**2,axis=-1)Â Â Â Â Â Â Â Â Â #Fc sum over twins |
---|
1677 | Â Â Â Â refl.T[11]Â =Â atan2d(fbs[0].T[0],fas[0].T[0])Â #ignore f' & f" |
---|
1678 | Â Â Â Â iBeg +=Â blkSize |
---|
1679 |   print ('nRef %d time %.4f\r'%(nRef,time.time()-time0)) |
---|
1680 | |
---|
1681 | def SStructureFactorDerv(refDict,im,G,hfx,pfx,SGData,SSGData,calcControls,parmDict): |
---|
1682 | Â Â ''' |
---|
1683 | Â Â Compute super structure factor derivatives for all h,k,l,m for phase - no twins |
---|
1684 | Â Â input: |
---|
1685 | Â Â |
---|
1686 | Â Â :param dict refDict: where |
---|
1687 | Â Â Â Â 'RefList' list where each ref = h,k,l,m,it,d,... |
---|
1688 | Â Â Â Â 'FF' dict of form factors - filled in below |
---|
1689 | Â Â :param int im: = 1 (could be eliminated) |
---|
1690 | Â Â :param np.array G:Â Â Â reciprocal metric tensor |
---|
1691 | Â Â :param str hfx:Â Â histogram id string |
---|
1692 | Â Â :param str pfx:Â Â phase id string |
---|
1693 | Â Â :param dict SGData: space group info. dictionary output from SpcGroup |
---|
1694 | Â Â :param dict SSGData: super space group info. |
---|
1695 | Â Â :param dict calcControls: |
---|
1696 | Â Â :param dict ParmDict: |
---|
1697 | Â Â |
---|
1698 | Â Â :returns: dict dFdvDict: dictionary of derivatives |
---|
1699 | Â Â ''' |
---|
1700 | Â Â phfx =Â pfx.split(':')[0]+hfx |
---|
1701 | Â Â ast =Â np.sqrt(np.diag(G)) |
---|
1702 | Â Â Mast =Â twopisq*np.multiply.outer(ast,ast) |
---|
1703 | Â Â SGInv =Â SGData['SGInv'] |
---|
1704 |   SGMT = np.array([ops[0].T for ops in SGData['SGOps']]) |
---|
1705 |   SSGMT = np.array([ops[0].T for ops in SSGData['SSGOps']]) |
---|
1706 |   SSGT = np.array([ops[1] for ops in SSGData['SSGOps']]) |
---|
1707 | Â Â FFtables =Â calcControls['FFtables'] |
---|
1708 | Â Â BLtables =Â calcControls['BLtables'] |
---|
1709 | Â Â nRef =Â len(refDict['RefList']) |
---|
1710 | Â Â Tdata,Mdata,Fdata,Xdata,dXdata,IAdata,Uisodata,Uijdata,Gdata =Â \ |
---|
1711 | Â Â Â Â GetAtomFXU(pfx,calcControls,parmDict) |
---|
1712 |   if not Xdata.size:     #no atoms in phase! |
---|
1713 |     return {} |
---|
1714 | Â Â mSize =Â len(Mdata)Â #no. atoms |
---|
1715 | Â Â waveTypes,FSSdata,XSSdata,USSdata,MSSdata =Â GetAtomSSFXU(pfx,calcControls,parmDict) |
---|
1716 | Â Â ngl,nWaves,Fmod,Xmod,Umod,Mmod,glTau,glWt =Â G2mth.makeWaves(waveTypes,FSSdata,XSSdata,USSdata,MSSdata,Mast) |
---|
1717 | Â Â waveShapes,SCtauF,SCtauX,SCtauU,UmodAB =Â G2mth.makeWavesDerv(ngl,waveTypes,FSSdata,XSSdata,USSdata,MSSdata,Mast) |
---|
1718 | Â Â modQ =Â np.array([parmDict[pfx+'mV0'],parmDict[pfx+'mV1'],parmDict[pfx+'mV2']]) |
---|
1719 | Â Â FF =Â np.zeros(len(Tdata)) |
---|
1720 |   if 'NC' in calcControls[hfx+'histType']: |
---|
1721 | Â Â Â Â FP,FPP =Â G2el.BlenResCW(Tdata,BLtables,parmDict[hfx+'Lam']) |
---|
1722 |   elif 'X' in calcControls[hfx+'histType']: |
---|
1723 |     FP = np.array([FFtables[El][hfx+'FP'] for El in Tdata]) |
---|
1724 |     FPP = np.array([FFtables[El][hfx+'FPP'] for El in Tdata]) |
---|
1725 | Â Â Uij =Â np.array(G2lat.U6toUij(Uijdata)).T |
---|
1726 | Â Â bij =Â Mast*Uij |
---|
1727 |   if not len(refDict['FF']): |
---|
1728 |     if 'N' in calcControls[hfx+'histType']: |
---|
1729 | Â Â Â Â Â Â dat =Â G2el.getBLvalues(BLtables)Â Â Â Â #will need wave here for anom. neutron b's |
---|
1730 | Â Â Â Â else: |
---|
1731 | Â Â Â Â Â Â dat =Â G2el.getFFvalues(FFtables,0.)Â Â Â Â |
---|
1732 | Â Â Â Â refDict['FF']['El']Â =Â list(dat.keys()) |
---|
1733 | Â Â Â Â refDict['FF']['FF']Â =Â np.zeros((len(refDict['RefList']),len(dat))) |
---|
1734 | Â Â dFdvDict =Â {} |
---|
1735 | Â Â dFdfr =Â np.zeros((nRef,mSize)) |
---|
1736 | Â Â dFdx =Â np.zeros((nRef,mSize,3)) |
---|
1737 | Â Â dFdui =Â np.zeros((nRef,mSize)) |
---|
1738 | Â Â dFdua =Â np.zeros((nRef,mSize,6)) |
---|
1739 | Â Â dFdbab =Â np.zeros((nRef,2)) |
---|
1740 | Â Â dFdfl =Â np.zeros((nRef)) |
---|
1741 | Â Â dFdGf =Â np.zeros((nRef,mSize,FSSdata.shape[1],2)) |
---|
1742 | Â Â dFdGx =Â np.zeros((nRef,mSize,XSSdata.shape[1],6)) |
---|
1743 | Â Â dFdGz =Â np.zeros((nRef,mSize,5)) |
---|
1744 | Â Â dFdGu =Â np.zeros((nRef,mSize,USSdata.shape[1],12)) |
---|
1745 | Â Â Flack =Â 1.0 |
---|
1746 |   if not SGData['SGInv'] and 'S' in calcControls[hfx+'histType'] and phfx+'Flack' in parmDict: |
---|
1747 | Â Â Â Â Flack =Â 1.-2.*parmDict[phfx+'Flack'] |
---|
1748 | Â Â time0 =Â time.time() |
---|
1749 | Â Â nRef =Â len(refDict['RefList'])/100 |
---|
1750 |   for iref,refl in enumerate(refDict['RefList']): |
---|
1751 |     if 'T' in calcControls[hfx+'histType']: |
---|
1752 | Â Â Â Â Â Â FP,FPP =Â G2el.BlenResCW(Tdata,BLtables,refl.T[12+im]) |
---|
1753 | Â Â Â Â H =Â np.array(refl[:4]) |
---|
1754 | Â Â Â Â HP =Â H[:3]+modQ*H[3:]Â Â Â Â Â Â #projected hklm to hkl |
---|
1755 | Â Â Â Â SQ =Â 1./(2.*refl[4+im])**2Â Â Â Â Â Â Â # or (sin(theta)/lambda)**2 |
---|
1756 | Â Â Â Â SQfactor =Â 8.0*SQ*np.pi**2 |
---|
1757 | Â Â Â Â dBabdA =Â np.exp(-parmDict[phfx+'BabU']*SQfactor) |
---|
1758 | Â Â Â Â Bab =Â parmDict[phfx+'BabA']*dBabdA |
---|
1759 |     Tindx = np.array([refDict['FF']['El'].index(El) for El in Tdata]) |
---|
1760 | Â Â Â Â FF =Â refDict['FF']['FF'][iref].T[Tindx] |
---|
1761 | Â Â Â Â Uniq =Â np.inner(H,SSGMT) |
---|
1762 | Â Â Â Â Phi =Â np.inner(H,SSGT) |
---|
1763 | Â Â Â Â UniqP =Â np.inner(HP,SGMT) |
---|
1764 |     if SGInv:  #if centro - expand HKL sets |
---|
1765 | Â Â Â Â Â Â Uniq =Â np.vstack((Uniq,-Uniq)) |
---|
1766 | Â Â Â Â Â Â Phi =Â np.hstack((Phi,-Phi)) |
---|
1767 | Â Â Â Â Â Â UniqP =Â np.vstack((UniqP,-UniqP)) |
---|
1768 | Â Â Â Â phase =Â twopi*(np.inner(Uniq[:,:3],(dXdata+Xdata).T)+Phi[:,nxs]) |
---|
1769 | Â Â Â Â sinp =Â np.sin(phase) |
---|
1770 | Â Â Â Â cosp =Â np.cos(phase) |
---|
1771 | Â Â Â Â occ =Â Mdata*Fdata/Uniq.shape[0] |
---|
1772 | Â Â Â Â biso =Â -SQfactor*Uisodata[:,nxs] |
---|
1773 | Â Â Â Â Tiso =Â np.repeat(np.where(biso<1.,np.exp(biso),1.0),Uniq.shape[0],axis=1).TÂ Â #ops x atoms |
---|
1774 | Â Â Â Â HbH =Â -np.sum(UniqP[:,nxs,:3]*np.inner(UniqP[:,:3],bij),axis=-1)Â #ops x atoms |
---|
1775 |     Hij = np.array([Mast*np.multiply.outer(U[:3],U[:3]) for U in UniqP]) #atoms x 3x3 |
---|
1776 |     Hij = np.array([G2lat.UijtoU6(uij) for uij in Hij])           #atoms x 6 |
---|
1777 | Â Â Â Â Tuij =Â np.where(HbH<1.,np.exp(HbH),1.0)Â Â Â #ops x atoms |
---|
1778 | Â Â Â Â Tcorr =Â np.reshape(Tiso,Tuij.shape)*Tuij*Mdata*Fdata/Uniq.shape[0]Â #ops x atoms |
---|
1779 |     fot = (FF+FP-Bab)*Tcorr   #ops x atoms |
---|
1780 |     fotp = FPP*Tcorr      #ops x atoms |
---|
1781 | Â Â Â Â GfpuA =Â G2mth.Modulation(Uniq,UniqP,nWaves,Fmod,Xmod,Umod,glTau,glWt)Â #2 x sym X atoms |
---|
1782 | Â Â Â Â dGdf,dGdx,dGdu,dGdz =Â G2mth.ModulationDerv(Uniq,UniqP,Hij,nWaves,waveShapes,Fmod,Xmod,UmodAB,SCtauF,SCtauX,SCtauU,glTau,glWt) |
---|
1783 | Â Â Â Â # GfpuA is 2 x ops x atoms |
---|
1784 | Â Â Â Â # derivs are: ops x atoms x waves x 2,6,12, or 5 parms as [real,imag] parts |
---|
1785 | Â Â Â Â fa =Â np.array([((FF+FP).T-Bab).T*cosp*Tcorr,-Flack*FPP*sinp*Tcorr])Â # array(2,nEqv,nAtoms) |
---|
1786 | Â Â Â Â fb =Â np.array([((FF+FP).T-Bab).T*sinp*Tcorr,Flack*FPP*cosp*Tcorr])Â #or array(2,nEqv,nAtoms) |
---|
1787 | Â Â Â Â fag =Â fa*GfpuA[0]-fb*GfpuA[1] |
---|
1788 | Â Â Â Â fbg =Â fb*GfpuA[0]+fa*GfpuA[1] |
---|
1789 | Â Â Â Â |
---|
1790 | Â Â Â Â fas =Â np.sum(np.sum(fag,axis=1),axis=1)Â Â Â # 2 x twin |
---|
1791 | Â Â Â Â fbs =Â np.sum(np.sum(fbg,axis=1),axis=1) |
---|
1792 | Â Â Â Â fax =Â np.array([-fot*sinp,-fotp*cosp])Â Â #positions; 2 x ops x atoms |
---|
1793 | Â Â Â Â fbx =Â np.array([fot*cosp,-fotp*sinp]) |
---|
1794 | Â Â Â Â fax =Â fax*GfpuA[0]-fbx*GfpuA[1] |
---|
1795 | Â Â Â Â fbx =Â fbx*GfpuA[0]+fax*GfpuA[1] |
---|
1796 | Â Â Â Â #sum below is over Uniq |
---|
1797 | Â Â Â Â dfadfr =Â np.sum(fag/occ,axis=1)Â Â Â Â #Fdata != 0 ever avoids /0. problem |
---|
1798 | Â Â Â Â dfbdfr =Â np.sum(fbg/occ,axis=1)Â Â Â Â #Fdata != 0 avoids /0. problem |
---|
1799 | Â Â Â Â dfadba =Â np.sum(-cosp*Tcorr[:,nxs],axis=1) |
---|
1800 | Â Â Â Â dfbdba =Â np.sum(-sinp*Tcorr[:,nxs],axis=1) |
---|
1801 | Â Â Â Â dfadui =Â np.sum(-SQfactor*fag,axis=1) |
---|
1802 | Â Â Â Â dfbdui =Â np.sum(-SQfactor*fbg,axis=1) |
---|
1803 | Â Â Â Â dfadx =Â np.sum(twopi*Uniq[:,:3]*np.swapaxes(fax,-2,-1)[:,:,:,nxs],axis=-2)Â #2 x nAtom x 3xyz; sum nOps |
---|
1804 | Â Â Â Â dfbdx =Â np.sum(twopi*Uniq[:,:3]*np.swapaxes(fbx,-2,-1)[:,:,:,nxs],axis=-2)Â Â Â Â Â Â |
---|
1805 | Â Â Â Â dfadua =Â np.sum(-Hij*np.swapaxes(fag,-2,-1)[:,:,:,nxs],axis=-2)Â Â Â Â Â Â Â #2 x nAtom x 6Uij; sum nOps |
---|
1806 | Â Â Â Â dfbdua =Â np.sum(-Hij*np.swapaxes(fbg,-2,-1)[:,:,:,nxs],axis=-2)Â Â Â Â Â #these are correct also for twins above |
---|
1807 | Â Â Â Â # array(2,nAtom,nWave,2) & array(2,nAtom,nWave,6) & array(2,nAtom,nWave,12); sum on nOps |
---|
1808 | Â Â Â Â dfadGf =Â np.sum(fa[:,:,:,nxs,nxs]*dGdf[0][nxs,:,:,:,:]-fb[:,:,:,nxs,nxs]*dGdf[1][nxs,:,:,:,:],axis=1) |
---|
1809 | Â Â Â Â dfbdGf =Â np.sum(fb[:,:,:,nxs,nxs]*dGdf[0][nxs,:,:,:,:]+fa[:,:,:,nxs,nxs]*dGdf[1][nxs,:,:,:,:],axis=1) |
---|
1810 | Â Â Â Â dfadGx =Â np.sum(fa[:,:,:,nxs,nxs]*dGdx[0][nxs,:,:,:,:]-fb[:,:,:,nxs,nxs]*dGdx[1][nxs,:,:,:,:],axis=1) |
---|
1811 | Â Â Â Â dfbdGx =Â np.sum(fb[:,:,:,nxs,nxs]*dGdx[0][nxs,:,:,:,:]+fa[:,:,:,nxs,nxs]*dGdx[1][nxs,:,:,:,:],axis=1) |
---|
1812 | Â Â Â Â dfadGz =Â np.sum(fa[:,:,0,nxs,nxs]*dGdz[0][nxs,:,:,:]-fb[:,:,0,nxs,nxs]*dGdz[1][nxs,:,:,:],axis=1) |
---|
1813 | Â Â Â Â dfbdGz =Â np.sum(fb[:,:,0,nxs,nxs]*dGdz[0][nxs,:,:,:]+fa[:,:,0,nxs,nxs]*dGdz[1][nxs,:,:,:],axis=1) |
---|
1814 | Â Â Â Â dfadGu =Â np.sum(fa[:,:,:,nxs,nxs]*dGdu[0][nxs,:,:,:,:]-fb[:,:,:,nxs,nxs]*dGdu[1][nxs,:,:,:,:],axis=1) |
---|
1815 | Â Â Â Â dfbdGu =Â np.sum(fb[:,:,:,nxs,nxs]*dGdu[0][nxs,:,:,:,:]+fa[:,:,:,nxs,nxs]*dGdu[1][nxs,:,:,:,:],axis=1)Â Â |
---|
1816 |     if not SGData['SGInv']:  #Flack derivative |
---|
1817 | Â Â Â Â Â Â dfadfl =Â np.sum(-FPP*Tcorr*sinp) |
---|
1818 | Â Â Â Â Â Â dfbdfl =Â np.sum(FPP*Tcorr*cosp) |
---|
1819 | Â Â Â Â else: |
---|
1820 | Â Â Â Â Â Â dfadfl =Â 1.0 |
---|
1821 | Â Â Â Â Â Â dfbdfl =Â 1.0 |
---|
1822 | #Â Â Â Â GSASIIpath.IPyBreak() |
---|
1823 |     #NB: the above have been checked against PA(1:10,1:2) in strfctr.for for Al2O3!  |
---|
1824 | Â Â Â Â SA =Â fas[0]+fas[1]Â Â Â #float = A+A' |
---|
1825 | Â Â Â Â SB =Â fbs[0]+fbs[1]Â Â Â #float = B+B' |
---|
1826 |     if 'P' in calcControls[hfx+'histType']: #checked perfect for centro & noncentro? |
---|
1827 |       dFdfl[iref] = -SA*dfadfl-SB*dfbdfl         #array(nRef,) |
---|
1828 | Â Â Â Â Â Â dFdfr[iref]Â =Â 2.*(fas[0]*dfadfr[0]+fas[1]*dfadfr[1])*Mdata/len(Uniq)+Â Â \ |
---|
1829 | Â Â Â Â Â Â Â Â 2.*(fbs[0]*dfbdfr[0]-fbs[1]*dfbdfr[1])*Mdata/len(Uniq) |
---|
1830 | Â Â Â Â Â Â dFdx[iref]Â =Â 2.*(fas[0]*dfadx[0]+fas[1]*dfadx[1])+Â \ |
---|
1831 | Â Â Â Â Â Â Â Â 2.*(fbs[0]*dfbdx[0]+fbs[1]*dfbdx[1]) |
---|
1832 | Â Â Â Â Â Â dFdui[iref]Â =Â 2.*(fas[0]*dfadui[0]+fas[1]*dfadui[1])+Â Â \ |
---|
1833 | Â Â Â Â Â Â Â Â 2.*(fbs[0]*dfbdui[0]-fbs[1]*dfbdui[1]) |
---|
1834 | Â Â Â Â Â Â dFdua[iref]Â =Â 2.*(fas[0]*dfadua[0]+fas[1]*dfadua[1])+Â Â \ |
---|
1835 | Â Â Â Â Â Â Â Â 2.*(fbs[0]*dfbdua[0]+fbs[1]*dfbdua[1]) |
---|
1836 | Â Â Â Â Â Â dFdGf[iref]Â =Â 2.*(fas[0]*dfadGf[0]+fas[1]*dfadGf[1])+Â \ |
---|
1837 | Â Â Â Â Â Â Â Â 2.*(fbs[0]*dfbdGf[0]+fbs[1]*dfbdGf[1]) |
---|
1838 | Â Â Â Â Â Â dFdGx[iref]Â =Â 2.*(fas[0]*dfadGx[0]+fas[1]*dfadGx[1])+Â \ |
---|
1839 | Â Â Â Â Â Â Â Â 2.*(fbs[0]*dfbdGx[0]-fbs[1]*dfbdGx[1]) |
---|
1840 | Â Â Â Â Â Â dFdGz[iref]Â =Â 2.*(fas[0]*dfadGz[0]+fas[1]*dfadGz[1])+Â \ |
---|
1841 | Â Â Â Â Â Â Â Â 2.*(fbs[0]*dfbdGz[0]+fbs[1]*dfbdGz[1]) |
---|
1842 | Â Â Â Â Â Â dFdGu[iref]Â =Â 2.*(fas[0]*dfadGu[0]+fas[1]*dfadGu[1])+Â \ |
---|
1843 | Â Â Â Â Â Â Â Â 2.*(fbs[0]*dfbdGu[0]+fbs[1]*dfbdGu[1]) |
---|
1844 | Â Â Â Â else:Â Â Â Â Â Â Â Â Â Â Â Â #OK, I think |
---|
1845 | Â Â Â Â Â Â dFdfr[iref]Â =Â 2.*(SA*dfadfr[0]+SA*dfadfr[1]+SB*dfbdfr[0]+SB*dfbdfr[1])*Mdata/len(Uniq)Â #array(nRef,nAtom) |
---|
1846 | Â Â Â Â Â Â dFdx[iref]Â =Â 2.*(SA*dfadx[0]+SA*dfadx[1]+SB*dfbdx[0]+SB*dfbdx[1])Â Â #array(nRef,nAtom,3) |
---|
1847 | Â Â Â Â Â Â dFdui[iref]Â =Â 2.*(SA*dfadui[0]+SA*dfadui[1]+SB*dfbdui[0]+SB*dfbdui[1])Â Â #array(nRef,nAtom) |
---|
1848 | Â Â Â Â Â Â dFdua[iref]Â =Â 2.*(SA*dfadua[0]+SA*dfadua[1]+SB*dfbdua[0]+SB*dfbdua[1])Â Â #array(nRef,nAtom,6) |
---|
1849 |       dFdfl[iref] = -SA*dfadfl-SB*dfbdfl         #array(nRef,) |
---|
1850 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â |
---|
1851 | Â Â Â Â Â Â dFdGf[iref]Â =Â 2.*(SA*dfadGf[0]+SB*dfbdGf[1])Â Â Â #array(nRef,natom,nwave,2) |
---|
1852 | Â Â Â Â Â Â dFdGx[iref]Â =Â 2.*(SA*dfadGx[0]+SB*dfbdGx[1])Â Â Â #array(nRef,natom,nwave,6) |
---|
1853 | Â Â Â Â Â Â dFdGz[iref]Â =Â 2.*(SA*dfadGz[0]+SB*dfbdGz[1])Â Â Â #array(nRef,natom,5) |
---|
1854 | Â Â Â Â Â Â dFdGu[iref]Â =Â 2.*(SA*dfadGu[0]+SB*dfbdGu[1])Â Â Â #array(nRef,natom,nwave,12) |
---|
1855 | #Â Â Â Â Â Â GSASIIpath.IPyBreak() |
---|
1856 | Â Â Â Â dFdbab[iref]Â =Â 2.*fas[0]*np.array([np.sum(dfadba*dBabdA),np.sum(-dfadba*parmDict[phfx+'BabA']*SQfactor*dBabdA)]).T+Â \ |
---|
1857 | Â Â Â Â Â Â 2.*fbs[0]*np.array([np.sum(dfbdba*dBabdA),np.sum(-dfbdba*parmDict[phfx+'BabA']*SQfactor*dBabdA)]).T |
---|
1858 | Â Â Â Â #loop over atoms - each dict entry is list of derivatives for all the reflections |
---|
1859 |     if not iref%100 : |
---|
1860 |       print (' %d derivative time %.4f\r'%(iref,time.time()-time0),end='') |
---|
1861 |   for i in range(len(Mdata)):   #loop over atoms |
---|
1862 | Â Â Â Â dFdvDict[pfx+'Afrac:'+str(i)]Â =Â dFdfr.T[i] |
---|
1863 | Â Â Â Â dFdvDict[pfx+'dAx:'+str(i)]Â =Â dFdx.T[0][i] |
---|
1864 | Â Â Â Â dFdvDict[pfx+'dAy:'+str(i)]Â =Â dFdx.T[1][i] |
---|
1865 | Â Â Â Â dFdvDict[pfx+'dAz:'+str(i)]Â =Â dFdx.T[2][i] |
---|
1866 | Â Â Â Â dFdvDict[pfx+'AUiso:'+str(i)]Â =Â dFdui.T[i] |
---|
1867 | Â Â Â Â dFdvDict[pfx+'AU11:'+str(i)]Â =Â dFdua.T[0][i] |
---|
1868 | Â Â Â Â dFdvDict[pfx+'AU22:'+str(i)]Â =Â dFdua.T[1][i] |
---|
1869 | Â Â Â Â dFdvDict[pfx+'AU33:'+str(i)]Â =Â dFdua.T[2][i] |
---|
1870 | Â Â Â Â dFdvDict[pfx+'AU12:'+str(i)]Â =Â dFdua.T[3][i] |
---|
1871 | Â Â Â Â dFdvDict[pfx+'AU13:'+str(i)]Â =Â dFdua.T[4][i] |
---|
1872 | Â Â Â Â dFdvDict[pfx+'AU23:'+str(i)]Â =Â dFdua.T[5][i] |
---|
1873 |     for j in range(FSSdata.shape[1]):    #loop over waves Fzero & Fwid? |
---|
1874 | Â Â Â Â Â Â dFdvDict[pfx+'Fsin:'+str(i)+':'+str(j)]Â =Â dFdGf.T[0][j][i] |
---|
1875 | Â Â Â Â Â Â dFdvDict[pfx+'Fcos:'+str(i)+':'+str(j)]Â =Â dFdGf.T[1][j][i] |
---|
1876 | Â Â Â Â nx =Â 0 |
---|
1877 |     if waveTypes[i] in ['Block','ZigZag']: |
---|
1878 | Â Â Â Â Â Â nx =Â 1Â |
---|
1879 | Â Â Â Â Â Â dFdvDict[pfx+'Tmin:'+str(i)+':0']Â =Â dFdGz.T[0][i]Â Â #ZigZag/Block waves (if any) |
---|
1880 | Â Â Â Â Â Â dFdvDict[pfx+'Tmax:'+str(i)+':0']Â =Â dFdGz.T[1][i] |
---|
1881 | Â Â Â Â Â Â dFdvDict[pfx+'Xmax:'+str(i)+':0']Â =Â dFdGz.T[2][i] |
---|
1882 | Â Â Â Â Â Â dFdvDict[pfx+'Ymax:'+str(i)+':0']Â =Â dFdGz.T[3][i] |
---|
1883 | Â Â Â Â Â Â dFdvDict[pfx+'Zmax:'+str(i)+':0']Â =Â dFdGz.T[4][i] |
---|
1884 |     for j in range(XSSdata.shape[1]-nx):    #loop over waves |
---|
1885 | Â Â Â Â Â Â dFdvDict[pfx+'Xsin:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[0][j][i] |
---|
1886 | Â Â Â Â Â Â dFdvDict[pfx+'Ysin:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[1][j][i] |
---|
1887 | Â Â Â Â Â Â dFdvDict[pfx+'Zsin:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[2][j][i] |
---|
1888 | Â Â Â Â Â Â dFdvDict[pfx+'Xcos:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[3][j][i] |
---|
1889 | Â Â Â Â Â Â dFdvDict[pfx+'Ycos:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[4][j][i] |
---|
1890 | Â Â Â Â Â Â dFdvDict[pfx+'Zcos:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[5][j][i] |
---|
1891 |     for j in range(USSdata.shape[1]):    #loop over waves |
---|
1892 | Â Â Â Â Â Â dFdvDict[pfx+'U11sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[0][j][i] |
---|
1893 | Â Â Â Â Â Â dFdvDict[pfx+'U22sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[1][j][i] |
---|
1894 | Â Â Â Â Â Â dFdvDict[pfx+'U33sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[2][j][i] |
---|
1895 | Â Â Â Â Â Â dFdvDict[pfx+'U12sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[3][j][i] |
---|
1896 | Â Â Â Â Â Â dFdvDict[pfx+'U13sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[4][j][i] |
---|
1897 | Â Â Â Â Â Â dFdvDict[pfx+'U23sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[5][j][i] |
---|
1898 | Â Â Â Â Â Â dFdvDict[pfx+'U11cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[6][j][i] |
---|
1899 | Â Â Â Â Â Â dFdvDict[pfx+'U22cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[7][j][i] |
---|
1900 | Â Â Â Â Â Â dFdvDict[pfx+'U33cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[8][j][i] |
---|
1901 | Â Â Â Â Â Â dFdvDict[pfx+'U12cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[9][j][i] |
---|
1902 | Â Â Â Â Â Â dFdvDict[pfx+'U13cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[10][j][i] |
---|
1903 | Â Â Â Â Â Â dFdvDict[pfx+'U23cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[11][j][i] |
---|
1904 | Â Â Â Â Â Â |
---|
1905 | #Â Â Â Â GSASIIpath.IPyBreak() |
---|
1906 | Â Â dFdvDict[phfx+'Flack']Â =Â 4.*dFdfl.T |
---|
1907 | Â Â dFdvDict[phfx+'BabA']Â =Â dFdbab.T[0] |
---|
1908 | Â Â dFdvDict[phfx+'BabU']Â =Â dFdbab.T[1] |
---|
1909 |   return dFdvDict |
---|
1910 | |
---|
1911 | def SStructureFactorDerv2(refDict,im,G,hfx,pfx,SGData,SSGData,calcControls,parmDict): |
---|
1912 | Â Â 'Needs a doc string - no twins' |
---|
1913 | Â Â phfx =Â pfx.split(':')[0]+hfx |
---|
1914 | Â Â ast =Â np.sqrt(np.diag(G)) |
---|
1915 | Â Â Mast =Â twopisq*np.multiply.outer(ast,ast) |
---|
1916 | Â Â SGInv =Â SGData['SGInv'] |
---|
1917 |   SGMT = np.array([ops[0].T for ops in SGData['SGOps']]) |
---|
1918 |   SGT = np.array([ops[1] for ops in SGData['SGOps']]) |
---|
1919 |   SSGMT = np.array([ops[0].T for ops in SSGData['SSGOps']]) |
---|
1920 |   SSGT = np.array([ops[1] for ops in SSGData['SSGOps']]) |
---|
1921 | Â Â FFtables =Â calcControls['FFtables'] |
---|
1922 | Â Â BLtables =Â calcControls['BLtables'] |
---|
1923 | Â Â nRef =Â len(refDict['RefList']) |
---|
1924 | Â Â Tdata,Mdata,Fdata,Xdata,dXdata,IAdata,Uisodata,Uijdata,Gdata =Â \ |
---|
1925 | Â Â Â Â GetAtomFXU(pfx,calcControls,parmDict) |
---|
1926 |   if not Xdata.size:     #no atoms in phase! |
---|
1927 |     return {} |
---|
1928 | Â Â mSize =Â len(Mdata)Â #no. atoms |
---|
1929 | Â Â waveTypes,FSSdata,XSSdata,USSdata,MSSdata =Â GetAtomSSFXU(pfx,calcControls,parmDict) |
---|
1930 | Â Â ngl,nWaves,Fmod,Xmod,Umod,Mmod,glTau,glWt =Â G2mth.makeWaves(waveTypes,FSSdata,XSSdata,USSdata,MSSdata,Mast) |
---|
1931 | Â Â waveShapes,SCtauF,SCtauX,SCtauU,UmodAB =Â G2mth.makeWavesDerv(ngl,waveTypes,FSSdata,XSSdata,USSdata,MSSdata,Mast) |
---|
1932 | Â Â modQ =Â np.array([parmDict[pfx+'mV0'],parmDict[pfx+'mV1'],parmDict[pfx+'mV2']]) |
---|
1933 | Â Â FF =Â np.zeros(len(Tdata)) |
---|
1934 |   if 'NC' in calcControls[hfx+'histType']: |
---|
1935 | Â Â Â Â FP,FPP =Â G2el.BlenResCW(Tdata,BLtables,parmDict[hfx+'Lam']) |
---|
1936 |   elif 'X' in calcControls[hfx+'histType']: |
---|
1937 |     FP = np.array([FFtables[El][hfx+'FP'] for El in Tdata]) |
---|
1938 |     FPP = np.array([FFtables[El][hfx+'FPP'] for El in Tdata]) |
---|
1939 | Â Â Uij =Â np.array(G2lat.U6toUij(Uijdata)).T |
---|
1940 | Â Â bij =Â Mast*Uij |
---|
1941 |   if not len(refDict['FF']): |
---|
1942 |     if 'N' in calcControls[hfx+'histType']: |
---|
1943 | Â Â Â Â Â Â dat =Â G2el.getBLvalues(BLtables)Â Â Â Â #will need wave here for anom. neutron b's |
---|
1944 | Â Â Â Â else: |
---|
1945 | Â Â Â Â Â Â dat =Â G2el.getFFvalues(FFtables,0.)Â Â Â Â |
---|
1946 | Â Â Â Â refDict['FF']['El']Â =Â list(dat.keys()) |
---|
1947 | Â Â Â Â refDict['FF']['FF']Â =Â np.zeros((len(refDict['RefList']),len(dat))) |
---|
1948 | Â Â dFdvDict =Â {} |
---|
1949 | Â Â dFdfr =Â np.zeros((nRef,mSize)) |
---|
1950 | Â Â dFdx =Â np.zeros((nRef,mSize,3)) |
---|
1951 | Â Â dFdui =Â np.zeros((nRef,mSize)) |
---|
1952 | Â Â dFdua =Â np.zeros((nRef,mSize,6)) |
---|
1953 | Â Â dFdbab =Â np.zeros((nRef,2)) |
---|
1954 | Â Â dFdfl =Â np.zeros((nRef)) |
---|
1955 | Â Â dFdGf =Â np.zeros((nRef,mSize,FSSdata.shape[1],2)) |
---|
1956 | Â Â dFdGx =Â np.zeros((nRef,mSize,XSSdata.shape[1],6)) |
---|
1957 | Â Â dFdGz =Â np.zeros((nRef,mSize,5)) |
---|
1958 | Â Â dFdGu =Â np.zeros((nRef,mSize,USSdata.shape[1],12)) |
---|
1959 | Â Â Flack =Â 1.0 |
---|
1960 |   if not SGData['SGInv'] and 'S' in calcControls[hfx+'histType'] and phfx+'Flack' in parmDict: |
---|
1961 | Â Â Â Â Flack =Â 1.-2.*parmDict[phfx+'Flack'] |
---|
1962 | Â Â time0 =Â time.time() |
---|
1963 | Â Â iBeg =Â 0 |
---|
1964 | Â Â blkSize =Â 4Â Â Â Â #no. of reflections in a block - optimized for speed |
---|
1965 |   while iBeg < nRef: |
---|
1966 | Â Â Â Â iFin =Â min(iBeg+blkSize,nRef) |
---|
1967 | Â Â Â Â refl =Â refDict['RefList'][iBeg:iFin]Â Â #array(blkSize,nItems) |
---|
1968 | Â Â Â Â H =Â refl.T[:4] |
---|
1969 | Â Â Â Â HP =Â H[:3].T+modQ*H.T[:,3:]Â Â Â Â Â Â #projected hklm to hkl |
---|
1970 | Â Â Â Â SQ =Â 1./(2.*refl.T[4+im])**2Â Â Â Â Â Â Â # or (sin(theta)/lambda)**2 |
---|
1971 | Â Â Â Â SQfactor =Â 8.0*SQ*np.pi**2 |
---|
1972 |     if 'T' in calcControls[hfx+'histType']: |
---|
1973 |       if 'P' in calcControls[hfx+'histType']: |
---|
1974 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[15]) |
---|
1975 | Â Â Â Â Â Â else: |
---|
1976 | Â Â Â Â Â Â Â Â FP,FPP =Â G2el.BlenResTOF(Tdata,BLtables,refl.T[13]) |
---|
1977 | Â Â Â Â Â Â FP =Â np.repeat(FP.T,len(SGT),axis=0) |
---|
1978 | Â Â Â Â Â Â FPP =Â np.repeat(FPP.T,len(SGT),axis=0) |
---|
1979 | #Â Â Â Â dBabdA = np.exp(-parmDict[phfx+'BabU']*SQfactor) |
---|
1980 | Â Â Â Â Bab =Â np.repeat(parmDict[phfx+'BabA']*np.exp(-parmDict[phfx+'BabU']*SQfactor),len(SGT)) |
---|
1981 |     Tindx = np.array([refDict['FF']['El'].index(El) for El in Tdata]) |
---|
1982 | Â Â Â Â FF =Â np.repeat(refDict['FF']['FF'][iBeg:iFin].T[Tindx].T,len(SGT),axis=0) |
---|
1983 | Â Â Â Â Uniq =Â np.inner(H.T,SSGMT) |
---|
1984 | Â Â Â Â Phi =Â np.inner(H.T,SSGT) |
---|
1985 | Â Â Â Â UniqP =Â np.inner(HP,SGMT) |
---|
1986 |     if SGInv:  #if centro - expand HKL sets |
---|
1987 | Â Â Â Â Â Â Uniq =Â np.hstack((Uniq,-Uniq)) |
---|
1988 | Â Â Â Â Â Â Phi =Â np.hstack((Phi,-Phi)) |
---|
1989 | Â Â Â Â Â Â UniqP =Â np.hstack((UniqP,-UniqP)) |
---|
1990 | Â Â Â Â Â Â FF =Â np.vstack((FF,FF)) |
---|
1991 | Â Â Â Â Â Â Bab =Â np.concatenate((Bab,Bab)) |
---|
1992 | Â Â Â Â phase =Â twopi*(np.inner(Uniq[:,:,:3],(dXdata+Xdata).T)+Phi[:,:,nxs]) |
---|
1993 | Â Â Â Â sinp =Â np.sin(phase) |
---|
1994 | Â Â Â Â cosp =Â np.cos(phase) |
---|
1995 | Â Â Â Â occ =Â Mdata*Fdata/Uniq.shape[1] |
---|
1996 | Â Â Â Â biso =Â -SQfactor*Uisodata[:,nxs] |
---|
1997 | Â Â Â Â Tiso =Â np.repeat(np.where(biso<1.,np.exp(biso),1.0),Uniq.shape[1],axis=1).TÂ Â #ops x atoms |
---|
1998 | Â Â Â Â HbH =Â -np.sum(UniqP[:,:,nxs,:3]*np.inner(UniqP[:,:,:3],bij),axis=-1)Â #ops x atoms |
---|
1999 |     Hij = np.array([Mast*np.multiply.outer(U[:3],U[:3]) for U in np.reshape(UniqP,(-1,3))]) #atoms x 3x3 |
---|
2000 |     Hij = np.reshape(np.array([G2lat.UijtoU6(uij) for uij in Hij]),(iFin-iBeg,-1,6))           #atoms x 6 |
---|
2001 | Â Â Â Â Tuij =Â np.where(HbH<1.,np.exp(HbH),1.0)Â Â Â #ops x atoms |
---|
2002 | #Â Â Â Â GSASIIpath.IPyBreak() |
---|
2003 | Â Â Â Â Tcorr =Â np.reshape(Tiso,Tuij.shape)*Tuij*Mdata*Fdata/Uniq.shape[0]Â #ops x atoms |
---|
2004 |     fot = np.reshape(FF+FP[nxs,:]-Bab[:,nxs],cosp.shape)*Tcorr   #ops x atoms |
---|
2005 |     fotp = FPP*Tcorr      #ops x atoms |
---|
2006 | Â Â Â Â GfpuA =Â G2mth.Modulation(Uniq,UniqP,nWaves,Fmod,Xmod,Umod,glTau,glWt)Â #2 x sym X atoms |
---|
2007 | Â Â Â Â dGdf,dGdx,dGdu,dGdz =Â G2mth.ModulationDerv2(Uniq,UniqP,Hij,nWaves,waveShapes,Fmod,Xmod,UmodAB,SCtauF,SCtauX,SCtauU,glTau,glWt) |
---|
2008 | Â Â Â Â # GfpuA is 2 x ops x atoms |
---|
2009 | Â Â Â Â # derivs are: ops x atoms x waves x 2,6,12, or 5 parms as [real,imag] parts |
---|
2010 | Â Â Â Â fa =Â np.array([fot*cosp,-Flack*FPP*sinp*Tcorr])Â # array(2,nEqv,nAtoms) |
---|
2011 | Â Â Â Â fb =Â np.array([fot*sinp,Flack*FPP*cosp*Tcorr])Â #or array(2,nEqv,nAtoms) |
---|
2012 | Â Â Â Â fag =Â fa*GfpuA[0]-fb*GfpuA[1] |
---|
2013 | Â Â Â Â fbg =Â fb*GfpuA[0]+fa*GfpuA[1] |
---|
2014 | Â Â Â Â |
---|
2015 | Â Â Â Â fas =Â np.sum(np.sum(fag,axis=-1),axis=-1)Â Â Â # 2 x refBlk |
---|
2016 | Â Â Â Â fbs =Â np.sum(np.sum(fbg,axis=-1),axis=-1) |
---|
2017 | Â Â Â Â fax =Â np.array([-fot*sinp,-fotp*cosp])Â Â #positions; 2 x ops x atoms |
---|
2018 | Â Â Â Â fbx =Â np.array([fot*cosp,-fotp*sinp]) |
---|
2019 | Â Â Â Â fax =Â fax*GfpuA[0]-fbx*GfpuA[1] |
---|
2020 | Â Â Â Â fbx =Â fbx*GfpuA[0]+fax*GfpuA[1] |
---|
2021 | Â Â Â Â #sum below is over Uniq |
---|
2022 | Â Â Â Â dfadfr =Â np.sum(fag/occ,axis=-2)Â Â Â Â #Fdata != 0 ever avoids /0. problem |
---|
2023 | Â Â Â Â dfbdfr =Â np.sum(fbg/occ,axis=-2)Â Â Â Â #Fdata != 0 avoids /0. problem |
---|
2024 | #Â Â Â Â dfadba = np.sum(-cosp*Tcorr,axis=-2) |
---|
2025 | #Â Â Â Â dfbdba = np.sum(-sinp*Tcorr,axis=-2) |
---|
2026 | Â Â Â Â dfadui =Â np.sum(-SQfactor[nxs,:,nxs,nxs]*fag,axis=-2) |
---|
2027 | Â Â Â Â dfbdui =Â np.sum(-SQfactor[nxs,:,nxs,nxs]*fbg,axis=-2) |
---|
2028 | Â Â Â Â dfadx =Â np.sum(twopi*Uniq[nxs,:,:,nxs,:3]*fax[:,:,:,:,nxs],axis=-3)Â #2 refBlk x x nAtom x 3xyz; sum nOps |
---|
2029 | Â Â Â Â dfbdx =Â np.sum(twopi*Uniq[nxs,:,:,nxs,:3]*fbx[:,:,:,:,nxs],axis=-3)Â #2 refBlk x x nAtom x 3xyz; sum nOps |
---|
2030 | Â Â Â Â dfadua =Â np.sum(-Hij[nxs,:,:,nxs,:]*fag[:,:,:,:,nxs],axis=-3)Â Â Â Â Â Â Â #2 x nAtom x 6Uij; sum nOps |
---|
2031 | Â Â Â Â dfbdua =Â np.sum(-Hij[nxs,:,:,nxs,:]*fbg[:,:,:,:,nxs],axis=-3)Â Â Â Â Â Â Â #2 x nAtom x 6Uij; sum nOps |
---|
2032 | Â Â Â Â # array(2,nAtom,nWave,2) & array(2,nAtom,nWave,6) & array(2,nAtom,nWave,12); sum on nOps |
---|
2033 | Â Â Â Â dfadGf =Â np.sum(fa[:,:,:,:,nxs,nxs]*dGdf[0][nxs,:,nxs,:,:,:]-fb[:,:,:,:,nxs,nxs]*dGdf[1][nxs,:,nxs,:,:,:],axis=2) |
---|
2034 | Â Â Â Â dfbdGf =Â np.sum(fb[:,:,:,:,nxs,nxs]*dGdf[0][nxs,:,nxs,:,:,:]+fa[:,:,:,:,nxs,nxs]*dGdf[1][nxs,:,nxs,:,:,:],axis=2) |
---|
2035 | Â Â Â Â dfadGx =Â np.sum(fa[:,:,:,:,nxs,nxs]*dGdx[0][nxs,:,:,:,:,:]-fb[:,:,:,:,nxs,nxs]*dGdx[1][nxs,:,:,:,:,:],axis=2) |
---|
2036 | Â Â Â Â dfbdGx =Â np.sum(fb[:,:,:,:,nxs,nxs]*dGdx[0][nxs,:,:,:,:,:]+fa[:,:,:,:,nxs,nxs]*dGdx[1][nxs,:,:,:,:,:],axis=2) |
---|
2037 | Â Â Â Â dfadGz =Â np.sum(fa[:,:,:,:,nxs]*dGdz[0][nxs,:,:,:,:]-fb[:,:,:,:,nxs]*dGdz[1][nxs,:,:,:,:],axis=2) |
---|
2038 | Â Â Â Â dfbdGz =Â np.sum(fb[:,:,:,:,nxs]*dGdz[0][nxs,:,:,:,:]+fa[:,:,:,:,nxs]*dGdz[1][nxs,:,:,:,:],axis=2) |
---|
2039 | Â Â Â Â dfadGu =Â np.sum(fa[:,:,:,:,nxs,nxs]*dGdu[0][nxs,:,:,:,:]-fb[:,:,:,:,nxs,nxs]*dGdu[1][nxs,:,:,:,:],axis=2) |
---|
2040 | Â Â Â Â dfbdGu =Â np.sum(fb[:,:,:,:,nxs,nxs]*dGdu[0][nxs,:,:,:,:]+fa[:,:,:,:,nxs,nxs]*dGdu[1][nxs,:,:,:,:],axis=2)Â Â |
---|
2041 |     if not SGData['SGInv']:  #Flack derivative |
---|
2042 | Â Â Â Â Â Â dfadfl =Â np.sum(np.sum(-FPP*Tcorr*sinp,axis=-1),axis=-1) |
---|
2043 | Â Â Â Â Â Â dfbdfl =Â np.sum(np.sum(FPP*Tcorr*cosp,axis=-1),axis=-1) |
---|
2044 | Â Â Â Â else: |
---|
2045 | Â Â Â Â Â Â dfadfl =Â 1.0 |
---|
2046 | Â Â Â Â Â Â dfbdfl =Â 1.0 |
---|
2047 |     #NB: the above have been checked against PA(1:10,1:2) in strfctr.for for Al2O3!  |
---|
2048 | Â Â Â Â SA =Â fas[0]+fas[1]Â Â Â #float = A+A' (might be array[nTwin]) |
---|
2049 | Â Â Â Â SB =Â fbs[0]+fbs[1]Â Â Â #float = B+B' (might be array[nTwin]) |
---|
2050 |     if 'P' in calcControls[hfx+'histType']: #checked perfect for centro & noncentro? |
---|
2051 |       dFdfl[iBeg:iFin] = -SA*dfadfl-SB*dfbdfl         #array(nRef,) |
---|
2052 | Â Â Â Â Â Â dFdfr[iBeg:iFin]Â =Â 2.*(fas[0,:,nxs]*dfadfr[0]+fas[1,:,nxs]*dfadfr[1])*Mdata/len(Uniq)+Â Â \ |
---|
2053 | Â Â Â Â Â Â Â Â 2.*(fbs[0,:,nxs]*dfbdfr[0]-fbs[1,:,nxs]*dfbdfr[1])*Mdata/len(Uniq) |
---|
2054 | Â Â Â Â Â Â dFdx[iBeg:iFin]Â =Â 2.*(fas[0,:,nxs,nxs]*dfadx[0]+fas[1,:,nxs,nxs]*dfadx[1])+Â \ |
---|
2055 | Â Â Â Â Â Â Â Â 2.*(fbs[0,:,nxs,nxs]*dfbdx[0]+fbs[1,:,nxs,nxs]*dfbdx[1]) |
---|
2056 | Â Â Â Â Â Â dFdui[iBeg:iFin]Â =Â 2.*(fas[0,:,nxs]*dfadui[0]+fas[1,:,nxs]*dfadui[1])+Â Â \ |
---|
2057 | Â Â Â Â Â Â Â Â 2.*(fbs[0,:,nxs]*dfbdui[0]-fbs[1,:,nxs]*dfbdui[1]) |
---|
2058 | Â Â Â Â Â Â dFdua[iBeg:iFin]Â =Â 2.*(fas[0,:,nxs,nxs]*dfadua[0]+fas[1,:,nxs,nxs]*dfadua[1])+Â Â \ |
---|
2059 | Â Â Â Â Â Â Â Â 2.*(fbs[0,:,nxs,nxs]*dfbdua[0]+fbs[1,:,nxs,nxs]*dfbdua[1]) |
---|
2060 | Â Â Â Â Â Â dFdGf[iBeg:iFin]Â =Â 2.*(fas[0,:,nxs,nxs,nxs]*dfadGf[0]+fas[1,:,nxs,nxs,nxs]*dfadGf[1])+Â \ |
---|
2061 | Â Â Â Â Â Â Â Â 2.*(fbs[0,:,nxs,nxs,nxs]*dfbdGf[0]+fbs[1,:,nxs,nxs,nxs]*dfbdGf[1]) |
---|
2062 | Â Â Â Â Â Â dFdGx[iBeg:iFin]Â =Â 2.*(fas[0,:,nxs,nxs,nxs]*dfadGx[0]+fas[1,:,nxs,nxs,nxs]*dfadGx[1])+Â \ |
---|
2063 | Â Â Â Â Â Â Â Â 2.*(fbs[0,:,nxs,nxs,nxs]*dfbdGx[0]-fbs[1,:,nxs,nxs,nxs]*dfbdGx[1]) |
---|
2064 | Â Â Â Â Â Â dFdGz[iBeg:iFin]Â =Â 2.*(fas[0,:,nxs,nxs]*dfadGz[0]+fas[1,:,nxs,nxs]*dfadGz[1])+Â \ |
---|
2065 | Â Â Â Â Â Â Â Â 2.*(fbs[0,:,nxs,nxs]*dfbdGz[0]+fbs[1,:,nxs,nxs]*dfbdGz[1]) |
---|
2066 | Â Â Â Â Â Â dFdGu[iBeg:iFin]Â =Â 2.*(fas[0,:,nxs,nxs,nxs]*dfadGu[0]+fas[1,:,nxs,nxs,nxs]*dfadGu[1])+Â \ |
---|
2067 | Â Â Â Â Â Â Â Â 2.*(fbs[0,:,nxs,nxs,nxs]*dfbdGu[0]+fbs[1,:,nxs,nxs,nxs]*dfbdGu[1]) |
---|
2068 | Â Â Â Â else:Â Â Â Â Â Â Â Â Â Â Â Â #OK, I think |
---|
2069 | Â Â Â Â Â Â dFdfr[iBeg:iFin]Â =Â 2.*(SA[:,nxs]*(dfadfr[0]+dfadfr[1])+SB[:,nxs]*(dfbdfr[0]+dfbdfr[1]))*Mdata/len(Uniq)Â #array(nRef,nAtom) |
---|
2070 | Â Â Â Â Â Â dFdx[iBeg:iFin]Â =Â 2.*(SA[:,nxs,nxs]*(dfadx[0]+dfadx[1])+SB[:,nxs,nxs]*(dfbdx[0]+dfbdx[1]))Â Â #array(nRef,nAtom,3) |
---|
2071 | Â Â Â Â Â Â dFdui[iBeg:iFin]Â =Â 2.*(SA[:,nxs]*(dfadui[0]+dfadui[1])+SB[:,nxs]*(dfbdui[0]+dfbdui[1]))Â Â #array(nRef,nAtom) |
---|
2072 | Â Â Â Â Â Â dFdua[iBeg:iFin]Â =Â 2.*(SA[:,nxs,nxs]*(dfadua[0]+dfadua[1])+SB[:,nxs,nxs]*(dfbdua[0]+dfbdua[1]))Â Â #array(nRef,nAtom,6) |
---|
2073 |       dFdfl[iBeg:iFin] = -SA*dfadfl-SB*dfbdfl         #array(nRef,) |
---|
2074 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â |
---|
2075 | Â Â Â Â Â Â dFdGf[iBeg:iFin]Â =Â 2.*(SA[:,nxs,nxs,nxs]*dfadGf[0]+SB[:,nxs,nxs,nxs]*dfbdGf[1])Â Â Â #array(nRef,natom,nwave,2) |
---|
2076 | Â Â Â Â Â Â dFdGx[iBeg:iFin]Â =Â 2.*(SA[:,nxs,nxs,nxs]*dfadGx[0]+SB[:,nxs,nxs,nxs]*dfbdGx[1])Â Â Â #array(nRef,natom,nwave,6) |
---|
2077 | Â Â Â Â Â Â dFdGz[iBeg:iFin]Â =Â 2.*(SA[:,nxs,nxs]*dfadGz[0]+SB[:,nxs,nxs]*dfbdGz[1])Â Â Â #array(nRef,natom,5) |
---|
2078 | Â Â Â Â Â Â dFdGu[iBeg:iFin]Â =Â 2.*(SA[:,nxs,nxs,nxs]*dfadGu[0]+SB[:,nxs,nxs,nxs]*dfbdGu[1])Â Â Â #array(nRef,natom,nwave,12) |
---|
2079 | #Â Â Â Â Â Â GSASIIpath.IPyBreak() |
---|
2080 | #Â Â Â Â dFdbab[iBeg:iFin] = 2.*fas[0,:,nxs]*np.array([np.sum(dfadba*dBabdA),np.sum(-dfadba*parmDict[phfx+'BabA']*SQfactor*dBabdA)]).T+ \ |
---|
2081 | #Â Â Â Â Â Â 2.*fbs[0,:,nxs]*np.array([np.sum(dfbdba*dBabdA),np.sum(-dfbdba*parmDict[phfx+'BabA']*SQfactor*dBabdA)]).T |
---|
2082 | Â Â Â Â #loop over atoms - each dict entry is list of derivatives for all the reflections |
---|
2083 |     print (' %d derivative time %.4f\r'%(iBeg,time.time()-time0),end='') |
---|
2084 | Â Â Â Â iBeg +=Â blkSize |
---|
2085 |   for i in range(len(Mdata)):   #loop over atoms |
---|
2086 | Â Â Â Â dFdvDict[pfx+'Afrac:'+str(i)]Â =Â dFdfr.T[i] |
---|
2087 | Â Â Â Â dFdvDict[pfx+'dAx:'+str(i)]Â =Â dFdx.T[0][i] |
---|
2088 | Â Â Â Â dFdvDict[pfx+'dAy:'+str(i)]Â =Â dFdx.T[1][i] |
---|
2089 | Â Â Â Â dFdvDict[pfx+'dAz:'+str(i)]Â =Â dFdx.T[2][i] |
---|
2090 | Â Â Â Â dFdvDict[pfx+'AUiso:'+str(i)]Â =Â dFdui.T[i] |
---|
2091 | Â Â Â Â dFdvDict[pfx+'AU11:'+str(i)]Â =Â dFdua.T[0][i] |
---|
2092 | Â Â Â Â dFdvDict[pfx+'AU22:'+str(i)]Â =Â dFdua.T[1][i] |
---|
2093 | Â Â Â Â dFdvDict[pfx+'AU33:'+str(i)]Â =Â dFdua.T[2][i] |
---|
2094 | Â Â Â Â dFdvDict[pfx+'AU12:'+str(i)]Â =Â dFdua.T[3][i] |
---|
2095 | Â Â Â Â dFdvDict[pfx+'AU13:'+str(i)]Â =Â dFdua.T[4][i] |
---|
2096 | Â Â Â Â dFdvDict[pfx+'AU23:'+str(i)]Â =Â dFdua.T[5][i] |
---|
2097 |     for j in range(FSSdata.shape[1]):    #loop over waves Fzero & Fwid? |
---|
2098 | Â Â Â Â Â Â dFdvDict[pfx+'Fsin:'+str(i)+':'+str(j)]Â =Â dFdGf.T[0][j][i] |
---|
2099 | Â Â Â Â Â Â dFdvDict[pfx+'Fcos:'+str(i)+':'+str(j)]Â =Â dFdGf.T[1][j][i] |
---|
2100 | Â Â Â Â nx =Â 0 |
---|
2101 |     if waveTypes[i] in ['Block','ZigZag']: |
---|
2102 | Â Â Â Â Â Â nx =Â 1Â |
---|
2103 | Â Â Â Â Â Â dFdvDict[pfx+'Tmin:'+str(i)+':0']Â =Â dFdGz.T[0][i]Â Â #ZigZag/Block waves (if any) |
---|
2104 | Â Â Â Â Â Â dFdvDict[pfx+'Tmax:'+str(i)+':0']Â =Â dFdGz.T[1][i] |
---|
2105 | Â Â Â Â Â Â dFdvDict[pfx+'Xmax:'+str(i)+':0']Â =Â dFdGz.T[2][i] |
---|
2106 | Â Â Â Â Â Â dFdvDict[pfx+'Ymax:'+str(i)+':0']Â =Â dFdGz.T[3][i] |
---|
2107 | Â Â Â Â Â Â dFdvDict[pfx+'Zmax:'+str(i)+':0']Â =Â dFdGz.T[4][i] |
---|
2108 |     for j in range(XSSdata.shape[1]-nx):    #loop over waves |
---|
2109 | Â Â Â Â Â Â dFdvDict[pfx+'Xsin:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[0][j][i] |
---|
2110 | Â Â Â Â Â Â dFdvDict[pfx+'Ysin:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[1][j][i] |
---|
2111 | Â Â Â Â Â Â dFdvDict[pfx+'Zsin:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[2][j][i] |
---|
2112 | Â Â Â Â Â Â dFdvDict[pfx+'Xcos:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[3][j][i] |
---|
2113 | Â Â Â Â Â Â dFdvDict[pfx+'Ycos:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[4][j][i] |
---|
2114 | Â Â Â Â Â Â dFdvDict[pfx+'Zcos:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[5][j][i] |
---|
2115 |     for j in range(USSdata.shape[1]):    #loop over waves |
---|
2116 | Â Â Â Â Â Â dFdvDict[pfx+'U11sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[0][j][i] |
---|
2117 | Â Â Â Â Â Â dFdvDict[pfx+'U22sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[1][j][i] |
---|
2118 | Â Â Â Â Â Â dFdvDict[pfx+'U33sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[2][j][i] |
---|
2119 | Â Â Â Â Â Â dFdvDict[pfx+'U12sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[3][j][i] |
---|
2120 | Â Â Â Â Â Â dFdvDict[pfx+'U13sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[4][j][i] |
---|
2121 | Â Â Â Â Â Â dFdvDict[pfx+'U23sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[5][j][i] |
---|
2122 | Â Â Â Â Â Â dFdvDict[pfx+'U11cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[6][j][i] |
---|
2123 | Â Â Â Â Â Â dFdvDict[pfx+'U22cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[7][j][i] |
---|
2124 | Â Â Â Â Â Â dFdvDict[pfx+'U33cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[8][j][i] |
---|
2125 | Â Â Â Â Â Â dFdvDict[pfx+'U12cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[9][j][i] |
---|
2126 | Â Â Â Â Â Â dFdvDict[pfx+'U13cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[10][j][i] |
---|
2127 | Â Â Â Â Â Â dFdvDict[pfx+'U23cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[11][j][i] |
---|
2128 | Â Â Â Â Â Â |
---|
2129 | #Â Â Â Â GSASIIpath.IPyBreak() |
---|
2130 | Â Â dFdvDict[phfx+'BabA']Â =Â dFdbab.T[0] |
---|
2131 | Â Â dFdvDict[phfx+'BabU']Â =Â dFdbab.T[1] |
---|
2132 |   return dFdvDict |
---|
2133 | Â Â |
---|
2134 | def SStructureFactorDervTw(refDict,im,G,hfx,pfx,SGData,SSGData,calcControls,parmDict): |
---|
2135 | Â Â 'Needs a doc string' |
---|
2136 | Â Â phfx =Â pfx.split(':')[0]+hfx |
---|
2137 | Â Â ast =Â np.sqrt(np.diag(G)) |
---|
2138 | Â Â Mast =Â twopisq*np.multiply.outer(ast,ast) |
---|
2139 | Â Â SGInv =Â SGData['SGInv'] |
---|
2140 |   SGMT = np.array([ops[0].T for ops in SGData['SGOps']]) |
---|
2141 |   SSGMT = np.array([ops[0].T for ops in SSGData['SSGOps']]) |
---|
2142 |   SSGT = np.array([ops[1] for ops in SSGData['SSGOps']]) |
---|
2143 | Â Â FFtables =Â calcControls['FFtables'] |
---|
2144 | Â Â BLtables =Â calcControls['BLtables'] |
---|
2145 | Â Â TwinLaw =Â np.array([[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],]) |
---|
2146 | Â Â TwDict =Â refDict.get('TwDict',{})Â Â Â Â Â Â |
---|
2147 |   if 'S' in calcControls[hfx+'histType']: |
---|
2148 | Â Â Â Â NTL =Â calcControls[phfx+'NTL'] |
---|
2149 | Â Â Â Â NM =Â calcControls[phfx+'TwinNMN']+1 |
---|
2150 | Â Â Â Â TwinLaw =Â calcControls[phfx+'TwinLaw'] |
---|
2151 | Â Â Â Â TwinInv =Â list(np.where(calcControls[phfx+'TwinInv'],-1,1)) |
---|
2152 | Â Â nTwin =Â len(TwinLaw)Â Â Â Â |
---|
2153 | Â Â nRef =Â len(refDict['RefList']) |
---|
2154 | Â Â Tdata,Mdata,Fdata,Xdata,dXdata,IAdata,Uisodata,Uijdata,Gdata =Â \ |
---|
2155 | Â Â Â Â GetAtomFXU(pfx,calcControls,parmDict) |
---|
2156 |   if not Xdata.size:     #no atoms in phase! |
---|
2157 |     return {} |
---|
2158 | Â Â mSize =Â len(Mdata)Â #no. atoms |
---|
2159 | Â Â waveTypes,FSSdata,XSSdata,USSdata,MSSdata =Â GetAtomSSFXU(pfx,calcControls,parmDict) |
---|
2160 | Â Â ngl,nWaves,Fmod,Xmod,Umod,Mmod,glTau,glWt =Â G2mth.makeWaves(waveTypes,FSSdata,XSSdata,USSdata,MSSdata,Mast) |
---|
2161 | Â Â waveShapes,SCtauF,SCtauX,SCtauU,UmodAB =Â G2mth.makeWavesDerv(ngl,waveTypes,FSSdata,XSSdata,USSdata,MSSdata,Mast) |
---|
2162 | Â Â modQ =Â np.array([parmDict[pfx+'mV0'],parmDict[pfx+'mV1'],parmDict[pfx+'mV2']]) |
---|
2163 | Â Â FF =Â np.zeros(len(Tdata)) |
---|
2164 |   if 'NC' in calcControls[hfx+'histType']: |
---|
2165 | Â Â Â Â FP,FPP =Â G2el.BlenResCW(Tdata,BLtables,parmDict[hfx+'Lam']) |
---|
2166 |   elif 'X' in calcControls[hfx+'histType']: |
---|
2167 |     FP = np.array([FFtables[El][hfx+'FP'] for El in Tdata]) |
---|
2168 |     FPP = np.array([FFtables[El][hfx+'FPP'] for El in Tdata]) |
---|
2169 | Â Â Uij =Â np.array(G2lat.U6toUij(Uijdata)).T |
---|
2170 | Â Â bij =Â Mast*Uij |
---|
2171 |   if not len(refDict['FF']): |
---|
2172 |     if 'N' in calcControls[hfx+'histType']: |
---|
2173 | Â Â Â Â Â Â dat =Â G2el.getBLvalues(BLtables)Â Â Â Â #will need wave here for anom. neutron b's |
---|
2174 | Â Â Â Â else: |
---|
2175 | Â Â Â Â Â Â dat =Â G2el.getFFvalues(FFtables,0.)Â Â Â Â |
---|
2176 | Â Â Â Â refDict['FF']['El']Â =Â list(dat.keys()) |
---|
2177 | Â Â Â Â refDict['FF']['FF']Â =Â np.zeros((len(refDict['RefList']),len(dat))) |
---|
2178 | Â Â dFdvDict =Â {} |
---|
2179 | Â Â dFdfr =Â np.zeros((nRef,nTwin,mSize)) |
---|
2180 | Â Â dFdx =Â np.zeros((nRef,nTwin,mSize,3)) |
---|
2181 | Â Â dFdui =Â np.zeros((nRef,nTwin,mSize)) |
---|
2182 | Â Â dFdua =Â np.zeros((nRef,nTwin,mSize,6)) |
---|
2183 | Â Â dFdbab =Â np.zeros((nRef,nTwin,2)) |
---|
2184 | Â Â dFdtw =Â np.zeros((nRef,nTwin)) |
---|
2185 | Â Â dFdGf =Â np.zeros((nRef,nTwin,mSize,FSSdata.shape[1])) |
---|
2186 | Â Â dFdGx =Â np.zeros((nRef,nTwin,mSize,XSSdata.shape[1],3)) |
---|
2187 | Â Â dFdGz =Â np.zeros((nRef,nTwin,mSize,5)) |
---|
2188 | Â Â dFdGu =Â np.zeros((nRef,nTwin,mSize,USSdata.shape[1],6)) |
---|
2189 | Â Â Flack =Â 1.0 |
---|
2190 |   if not SGData['SGInv'] and 'S' in calcControls[hfx+'histType'] and phfx+'Flack' in parmDict: |
---|
2191 | Â Â Â Â Flack =Â 1.-2.*parmDict[phfx+'Flack'] |
---|
2192 | Â Â time0 =Â time.time() |
---|
2193 | Â Â nRef =Â len(refDict['RefList'])/100 |
---|
2194 |   for iref,refl in enumerate(refDict['RefList']): |
---|
2195 |     if 'T' in calcControls[hfx+'histType']: |
---|
2196 | Â Â Â Â Â Â FP,FPP =Â G2el.BlenResCW(Tdata,BLtables,refl.T[12+im]) |
---|
2197 | Â Â Â Â H =Â np.array(refl[:4]) |
---|
2198 | Â Â Â Â HP =Â H[:3]+modQ*H[3:]Â Â Â Â Â Â #projected hklm to hkl |
---|
2199 | Â Â Â Â H =Â np.inner(H.T,TwinLaw)Â Â #maybe array(4,nTwins) or (4) |
---|
2200 | Â Â Â Â TwMask =Â np.any(H,axis=-1) |
---|
2201 |     if TwinLaw.shape[0] > 1 and TwDict: |
---|
2202 |       if iref in TwDict: |
---|
2203 |         for i in TwDict[iref]: |
---|
2204 |           for n in range(NTL): |
---|
2205 | Â Â Â Â Â Â Â Â Â Â Â Â H[i+n*NM]Â =Â np.inner(TwinLaw[n*NM],np.array(TwDict[iref][i])*TwinInv[i+n*NM]) |
---|
2206 | Â Â Â Â Â Â TwMask =Â np.any(H,axis=-1) |
---|
2207 | Â Â Â Â SQ =Â 1./(2.*refl[4+im])**2Â Â Â Â Â Â Â # or (sin(theta)/lambda)**2 |
---|
2208 | Â Â Â Â SQfactor =Â 8.0*SQ*np.pi**2 |
---|
2209 | Â Â Â Â dBabdA =Â np.exp(-parmDict[phfx+'BabU']*SQfactor) |
---|
2210 | Â Â Â Â Bab =Â parmDict[phfx+'BabA']*dBabdA |
---|
2211 |     Tindx = np.array([refDict['FF']['El'].index(El) for El in Tdata]) |
---|
2212 | Â Â Â Â FF =Â refDict['FF']['FF'][iref].T[Tindx] |
---|
2213 | Â Â Â Â Uniq =Â np.inner(H,SSGMT) |
---|
2214 | Â Â Â Â Phi =Â np.inner(H,SSGT) |
---|
2215 | Â Â Â Â UniqP =Â np.inner(HP,SGMT) |
---|
2216 |     if SGInv:  #if centro - expand HKL sets |
---|
2217 | Â Â Â Â Â Â Uniq =Â np.vstack((Uniq,-Uniq)) |
---|
2218 | Â Â Â Â Â Â Phi =Â np.hstack((Phi,-Phi)) |
---|
2219 | Â Â Â Â Â Â UniqP =Â np.vstack((UniqP,-UniqP)) |
---|
2220 | Â Â Â Â phase =Â twopi*(np.inner(Uniq[:,:3],(dXdata+Xdata).T)+Phi[:,nxs]) |
---|
2221 | Â Â Â Â sinp =Â np.sin(phase) |
---|
2222 | Â Â Â Â cosp =Â np.cos(phase) |
---|
2223 | Â Â Â Â occ =Â Mdata*Fdata/Uniq.shape[0] |
---|
2224 | Â Â Â Â biso =Â -SQfactor*Uisodata[:,nxs] |
---|
2225 | Â Â Â Â Tiso =Â np.repeat(np.where(biso<1.,np.exp(biso),1.0),Uniq.shape[0]*len(TwinLaw),axis=1).TÂ Â #ops x atoms |
---|
2226 | Â Â Â Â HbH =Â -np.sum(UniqP[:,nxs,:3]*np.inner(UniqP[:,:3],bij),axis=-1)Â #ops x atoms |
---|
2227 |     Hij = np.array([Mast*np.multiply.outer(U[:3],U[:3]) for U in UniqP]) #atoms x 3x3 |
---|
2228 |     Hij = np.squeeze(np.reshape(np.array([G2lat.UijtoU6(uij) for uij in Hij]),(nTwin,-1,6))) |
---|
2229 | Â Â Â Â Tuij =Â np.where(HbH<1.,np.exp(HbH),1.0)Â Â Â #ops x atoms |
---|
2230 | Â Â Â Â Tcorr =Â np.reshape(Tiso,Tuij.shape)*Tuij*Mdata*Fdata/Uniq.shape[0]Â #ops x atoms |
---|
2231 |     fot = (FF+FP-Bab)*Tcorr   #ops x atoms |
---|
2232 |     fotp = FPP*Tcorr      #ops x atoms |
---|
2233 | Â Â Â Â GfpuA =Â G2mth.Modulation(Uniq,UniqP,nWaves,Fmod,Xmod,Umod,glTau,glWt)Â #2 x sym X atoms |
---|
2234 | Â Â Â Â dGdf,dGdx,dGdu,dGdz =Â G2mth.ModulationDerv(Uniq,UniqP,Hij,nWaves,waveShapes,Fmod,Xmod,UmodAB,SCtauF,SCtauX,SCtauU,glTau,glWt) |
---|
2235 | Â Â Â Â # GfpuA is 2 x ops x atoms |
---|
2236 | Â Â Â Â # derivs are: ops x atoms x waves x 2,6,12, or 5 parms as [real,imag] parts |
---|
2237 | Â Â Â Â fa =Â np.array([((FF+FP).T-Bab).T*cosp*Tcorr,-Flack*FPP*sinp*Tcorr])Â # array(2,nTwin,nEqv,nAtoms) |
---|
2238 | Â Â Â Â fb =Â np.array([((FF+FP).T-Bab).T*sinp*Tcorr,Flack*FPP*cosp*Tcorr])Â #or array(2,nEqv,nAtoms) |
---|
2239 | Â Â Â Â fag =Â fa*GfpuA[0]-fb*GfpuA[1] |
---|
2240 | Â Â Â Â fbg =Â fb*GfpuA[0]+fa*GfpuA[1] |
---|
2241 | Â Â Â Â |
---|
2242 | Â Â Â Â fas =Â np.sum(np.sum(fag,axis=1),axis=1)Â Â Â # 2 x twin |
---|
2243 | Â Â Â Â fbs =Â np.sum(np.sum(fbg,axis=1),axis=1) |
---|
2244 | Â Â Â Â fax =Â np.array([-fot*sinp,-fotp*cosp])Â Â #positions; 2 x twin x ops x atoms |
---|
2245 | Â Â Â Â fbx =Â np.array([fot*cosp,-fotp*sinp]) |
---|
2246 | Â Â Â Â fax =Â fax*GfpuA[0]-fbx*GfpuA[1] |
---|
2247 | Â Â Â Â fbx =Â fbx*GfpuA[0]+fax*GfpuA[1] |
---|
2248 | Â Â Â Â #sum below is over Uniq |
---|
2249 | Â Â Â Â dfadfr =Â np.sum(fag/occ,axis=1)Â Â Â Â #Fdata != 0 ever avoids /0. problem |
---|
2250 | Â Â Â Â dfbdfr =Â np.sum(fbg/occ,axis=1)Â Â Â Â #Fdata != 0 avoids /0. problem |
---|
2251 | Â Â Â Â dfadba =Â np.sum(-cosp*Tcorr[:,nxs],axis=1) |
---|
2252 | Â Â Â Â dfbdba =Â np.sum(-sinp*Tcorr[:,nxs],axis=1) |
---|
2253 | Â Â Â Â dfadui =Â np.sum(-SQfactor*fag,axis=1) |
---|
2254 | Â Â Â Â dfbdui =Â np.sum(-SQfactor*fbg,axis=1) |
---|
2255 |     dfadx = np.array([np.sum(twopi*Uniq[it,:,:3]*np.swapaxes(fax,-2,-1)[:,it,:,:,nxs],axis=-2) for it in range(nTwin)]) |
---|
2256 |     dfbdx = np.array([np.sum(twopi*Uniq[it,:,:3]*np.swapaxes(fbx,-2,-1)[:,it,:,:,nxs],axis=-2) for it in range(nTwin)])      |
---|
2257 |     dfadua = np.array([np.sum(-Hij[it]*np.swapaxes(fag,-2,-1)[:,it,:,:,nxs],axis=-2) for it in range(nTwin)]) |
---|
2258 |     dfbdua = np.array([np.sum(-Hij[it]*np.swapaxes(fbg,-2,-1)[:,it,:,:,nxs],axis=-2) for it in range(nTwin)]) |
---|
2259 | Â Â Â Â # array(2,nTwin,nAtom,3) & array(2,nTwin,nAtom,6) & array(2,nTwin,nAtom,12) |
---|
2260 | Â Â Â Â dfadGf =Â np.sum(fa[:,it,:,:,nxs,nxs]*dGdf[0][nxs,nxs,:,:,:,:]-fb[:,it,:,:,nxs,nxs]*dGdf[1][nxs,nxs,:,:,:,:],axis=1) |
---|
2261 | Â Â Â Â dfbdGf =Â np.sum(fb[:,it,:,:,nxs,nxs]*dGdf[0][nxs,nxs,:,:,:,:]+fa[:,it,:,:,nxs,nxs]*dGdf[1][nxs,nxs,:,:,:,:],axis=1) |
---|
2262 | Â Â Â Â dfadGx =Â np.sum(fa[:,it,:,:,nxs,nxs]*dGdx[0][nxs,nxs,:,:,:,:]-fb[:,it,:,:,nxs,nxs]*dGdx[1][nxs,nxs,:,:,:,:],axis=1) |
---|
2263 | Â Â Â Â dfbdGx =Â np.sum(fb[:,it,:,:,nxs,nxs]*dGdx[0][nxs,nxs,:,:,:,:]+fa[:,it,:,:,nxs,nxs]*dGdx[1][nxs,nxs,:,:,:,:],axis=1) |
---|
2264 | Â Â Â Â dfadGz =Â np.sum(fa[:,it,:,0,nxs,nxs]*dGdz[0][nxs,nxs,:,:,:]-fb[:,it,:,0,nxs,nxs]*dGdz[1][nxs,nxs,:,:,:],axis=1) |
---|
2265 | Â Â Â Â dfbdGz =Â np.sum(fb[:,it,:,0,nxs,nxs]*dGdz[0][nxs,nxs,:,:,:]+fa[:,it,:,0,nxs,nxs]*dGdz[1][nxs,nxs,:,:,:],axis=1) |
---|
2266 | Â Â Â Â dfadGu =Â np.sum(fa[:,it,:,:,nxs,nxs]*dGdu[0][nxs,nxs,:,:,:,:]-fb[:,it,:,:,nxs,nxs]*dGdu[1][nxs,nxs,:,:,:,:],axis=1) |
---|
2267 | Â Â Â Â dfbdGu =Â np.sum(fb[:,it,:,:,nxs,nxs]*dGdu[0][nxs,nxs,:,:,:,:]+fa[:,it,:,:,nxs,nxs]*dGdu[1][nxs,nxs,:,:,:,:],axis=1) |
---|
2268 | #Â Â Â Â GSASIIpath.IPyBreak() |
---|
2269 |     #NB: the above have been checked against PA(1:10,1:2) in strfctr.for for Al2O3!  |
---|
2270 | Â Â Â Â SA =Â fas[0]+fas[1]Â Â Â #float = A+A' (might be array[nTwin]) |
---|
2271 | Â Â Â Â SB =Â fbs[0]+fbs[1]Â Â Â #float = B+B' (might be array[nTwin]) |
---|
2272 |     dFdfr[iref] = [2.*TwMask[it]*(SA[it]*dfadfr[0][it]+SA[it]*dfadfr[1][it]+SB[it]*dfbdfr[0][it]+SB[it]*dfbdfr[1][it])*Mdata/len(Uniq[it]) for it in range(nTwin)] |
---|
2273 |     dFdx[iref] = [2.*TwMask[it]*(SA[it]*dfadx[it][0]+SA[it]*dfadx[it][1]+SB[it]*dfbdx[it][0]+SB[it]*dfbdx[it][1]) for it in range(nTwin)] |
---|
2274 |     dFdui[iref] = [2.*TwMask[it]*(SA[it]*dfadui[it][0]+SA[it]*dfadui[it][1]+SB[it]*dfbdui[it][0]+SB[it]*dfbdui[it][1]) for it in range(nTwin)] |
---|
2275 |     dFdua[iref] = [2.*TwMask[it]*(SA[it]*dfadua[it][0]+SA[it]*dfadua[it][1]+SB[it]*dfbdua[it][0]+SB[it]*dfbdua[it][1]) for it in range(nTwin)] |
---|
2276 | Â Â Â Â dFdtw[iref]Â =Â np.sum(TwMask*fas,axis=0)**2+np.sum(TwMask*fbs,axis=0)**2 |
---|
2277 | |
---|
2278 |     dFdGf[iref] = [2.*TwMask[it]*(SA[it]*dfadGf[1]+SB[it]*dfbdGf[1]) for it in range(nTwin)] |
---|
2279 |     dFdGx[iref] = [2.*TwMask[it]*(SA[it]*dfadGx[1]+SB[it]*dfbdGx[1]) for it in range(nTwin)] |
---|
2280 |     dFdGz[iref] = [2.*TwMask[it]*(SA[it]*dfadGz[1]+SB[it]*dfbdGz[1]) for it in range(nTwin)] |
---|
2281 |     dFdGu[iref] = [2.*TwMask[it]*(SA[it]*dfadGu[1]+SB[it]*dfbdGu[1]) for it in range(nTwin)]        |
---|
2282 | #Â Â Â Â Â Â GSASIIpath.IPyBreak() |
---|
2283 | Â Â Â Â dFdbab[iref]Â =Â 2.*fas[0]*np.array([np.sum(dfadba*dBabdA),np.sum(-dfadba*parmDict[phfx+'BabA']*SQfactor*dBabdA)]).T+Â \ |
---|
2284 | Â Â Â Â Â Â 2.*fbs[0]*np.array([np.sum(dfbdba*dBabdA),np.sum(-dfbdba*parmDict[phfx+'BabA']*SQfactor*dBabdA)]).T |
---|
2285 | Â Â Â Â #loop over atoms - each dict entry is list of derivatives for all the reflections |
---|
2286 |     if not iref%100 : |
---|
2287 |       print (' %d derivative time %.4f\r'%(iref,time.time()-time0),end='') |
---|
2288 |   for i in range(len(Mdata)):   #loop over atoms |
---|
2289 | Â Â Â Â dFdvDict[pfx+'Afrac:'+str(i)]Â =Â dFdfr.T[i] |
---|
2290 | Â Â Â Â dFdvDict[pfx+'dAx:'+str(i)]Â =Â dFdx.T[0][i] |
---|
2291 | Â Â Â Â dFdvDict[pfx+'dAy:'+str(i)]Â =Â dFdx.T[1][i] |
---|
2292 | Â Â Â Â dFdvDict[pfx+'dAz:'+str(i)]Â =Â dFdx.T[2][i] |
---|
2293 | Â Â Â Â dFdvDict[pfx+'AUiso:'+str(i)]Â =Â dFdui.T[i] |
---|
2294 | Â Â Â Â dFdvDict[pfx+'AU11:'+str(i)]Â =Â dFdua.T[0][i] |
---|
2295 | Â Â Â Â dFdvDict[pfx+'AU22:'+str(i)]Â =Â dFdua.T[1][i] |
---|
2296 | Â Â Â Â dFdvDict[pfx+'AU33:'+str(i)]Â =Â dFdua.T[2][i] |
---|
2297 | Â Â Â Â dFdvDict[pfx+'AU12:'+str(i)]Â =Â dFdua.T[3][i] |
---|
2298 | Â Â Â Â dFdvDict[pfx+'AU13:'+str(i)]Â =Â dFdua.T[4][i] |
---|
2299 | Â Â Â Â dFdvDict[pfx+'AU23:'+str(i)]Â =Â dFdua.T[5][i] |
---|
2300 |     for j in range(FSSdata.shape[1]):    #loop over waves Fzero & Fwid? |
---|
2301 | Â Â Â Â Â Â dFdvDict[pfx+'Fsin:'+str(i)+':'+str(j)]Â =Â dFdGf.T[0][j][i] |
---|
2302 | Â Â Â Â Â Â dFdvDict[pfx+'Fcos:'+str(i)+':'+str(j)]Â =Â dFdGf.T[1][j][i] |
---|
2303 | Â Â Â Â nx =Â 0 |
---|
2304 |     if waveTypes[i] in ['Block','ZigZag']: |
---|
2305 | Â Â Â Â Â Â nx =Â 1Â |
---|
2306 | Â Â Â Â Â Â dFdvDict[pfx+'Tmin:'+str(i)+':0']Â =Â dFdGz.T[0][i]Â Â #ZigZag/Block waves (if any) |
---|
2307 | Â Â Â Â Â Â dFdvDict[pfx+'Tmax:'+str(i)+':0']Â =Â dFdGz.T[1][i] |
---|
2308 | Â Â Â Â Â Â dFdvDict[pfx+'Xmax:'+str(i)+':0']Â =Â dFdGz.T[2][i] |
---|
2309 | Â Â Â Â Â Â dFdvDict[pfx+'Ymax:'+str(i)+':0']Â =Â dFdGz.T[3][i] |
---|
2310 | Â Â Â Â Â Â dFdvDict[pfx+'Zmax:'+str(i)+':0']Â =Â dFdGz.T[4][i] |
---|
2311 |     for j in range(XSSdata.shape[1]-nx):    #loop over waves |
---|
2312 | Â Â Â Â Â Â dFdvDict[pfx+'Xsin:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[0][j][i] |
---|
2313 | Â Â Â Â Â Â dFdvDict[pfx+'Ysin:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[1][j][i] |
---|
2314 | Â Â Â Â Â Â dFdvDict[pfx+'Zsin:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[2][j][i] |
---|
2315 | Â Â Â Â Â Â dFdvDict[pfx+'Xcos:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[3][j][i] |
---|
2316 | Â Â Â Â Â Â dFdvDict[pfx+'Ycos:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[4][j][i] |
---|
2317 | Â Â Â Â Â Â dFdvDict[pfx+'Zcos:'+str(i)+':'+str(j+nx)]Â =Â dFdGx.T[5][j][i] |
---|
2318 |     for j in range(USSdata.shape[1]):    #loop over waves |
---|
2319 | Â Â Â Â Â Â dFdvDict[pfx+'U11sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[0][j][i] |
---|
2320 | Â Â Â Â Â Â dFdvDict[pfx+'U22sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[1][j][i] |
---|
2321 | Â Â Â Â Â Â dFdvDict[pfx+'U33sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[2][j][i] |
---|
2322 | Â Â Â Â Â Â dFdvDict[pfx+'U12sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[3][j][i] |
---|
2323 | Â Â Â Â Â Â dFdvDict[pfx+'U13sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[4][j][i] |
---|
2324 | Â Â Â Â Â Â dFdvDict[pfx+'U23sin:'+str(i)+':'+str(j)]Â =Â dFdGu.T[5][j][i] |
---|
2325 | Â Â Â Â Â Â dFdvDict[pfx+'U11cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[6][j][i] |
---|
2326 | Â Â Â Â Â Â dFdvDict[pfx+'U22cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[7][j][i] |
---|
2327 | Â Â Â Â Â Â dFdvDict[pfx+'U33cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[8][j][i] |
---|
2328 | Â Â Â Â Â Â dFdvDict[pfx+'U12cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[9][j][i] |
---|
2329 | Â Â Â Â Â Â dFdvDict[pfx+'U13cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[10][j][i] |
---|
2330 | Â Â Â Â Â Â dFdvDict[pfx+'U23cos:'+str(i)+':'+str(j)]Â =Â dFdGu.T[11][j][i] |
---|
2331 | Â Â Â Â Â Â |
---|
2332 | #Â Â Â Â GSASIIpath.IPyBreak() |
---|
2333 | Â Â dFdvDict[phfx+'BabA']Â =Â dFdbab.T[0] |
---|
2334 | Â Â dFdvDict[phfx+'BabU']Â =Â dFdbab.T[1] |
---|
2335 |   return dFdvDict |
---|
2336 | Â Â |
---|
2337 | def SCExtinction(ref,im,phfx,hfx,pfx,calcControls,parmDict,varyList): |
---|
2338 | Â Â ''' Single crystal extinction function; returns extinction & derivative |
---|
2339 | Â Â ''' |
---|
2340 | Â Â extCor =Â 1.0 |
---|
2341 | Â Â dervDict =Â {} |
---|
2342 | Â Â dervCor =Â 1.0 |
---|
2343 |   if calcControls[phfx+'EType'] != 'None': |
---|
2344 | Â Â Â Â SQ =Â 1/(4.*ref[4+im]**2) |
---|
2345 |     if 'C' in parmDict[hfx+'Type']:      |
---|
2346 | Â Â Â Â Â Â cos2T =Â 1.0-2.*SQ*parmDict[hfx+'Lam']**2Â Â Â Â Â Â #cos(2theta) |
---|
2347 | Â Â Â Â else:Â Â #'T' |
---|
2348 | Â Â Â Â Â Â cos2T =Â 1.0-2.*SQ*ref[12+im]**2Â Â Â Â Â Â Â Â Â Â Â Â #cos(2theta)Â Â Â Â Â Â |
---|
2349 |     if 'SXC' in parmDict[hfx+'Type']: |
---|
2350 | Â Â Â Â Â Â AV =Â 7.9406e5/parmDict[pfx+'Vol']**2 |
---|
2351 | Â Â Â Â Â Â PL =Â np.sqrt(1.0-cos2T**2)/parmDict[hfx+'Lam'] |
---|
2352 | Â Â Â Â Â Â P12 =Â (calcControls[phfx+'Cos2TM']+cos2T**4)/(calcControls[phfx+'Cos2TM']+cos2T**2) |
---|
2353 | Â Â Â Â Â Â PLZ =Â AV*P12*ref[9+im]*parmDict[hfx+'Lam']**2 |
---|
2354 |     elif 'SNT' in parmDict[hfx+'Type']: |
---|
2355 | Â Â Â Â Â Â AV =Â 1.e7/parmDict[pfx+'Vol']**2 |
---|
2356 | Â Â Â Â Â Â PL =Â SQ |
---|
2357 | Â Â Â Â Â Â PLZ =Â AV*ref[9+im]*ref[12+im]**2 |
---|
2358 |     elif 'SNC' in parmDict[hfx+'Type']: |
---|
2359 | Â Â Â Â Â Â AV =Â 1.e7/parmDict[pfx+'Vol']**2 |
---|
2360 | Â Â Â Â Â Â PL =Â np.sqrt(1.0-cos2T**2)/parmDict[hfx+'Lam'] |
---|
2361 | Â Â Â Â Â Â PLZ =Â AV*ref[9+im]*parmDict[hfx+'Lam']**2 |
---|
2362 | Â Â Â Â Â Â |
---|
2363 |     if 'Primary' in calcControls[phfx+'EType']: |
---|
2364 | Â Â Â Â Â Â PLZ *=Â 1.5 |
---|
2365 | Â Â Â Â else: |
---|
2366 |       if 'C' in parmDict[hfx+'Type']: |
---|
2367 | Â Â Â Â Â Â Â Â PLZ *=Â calcControls[phfx+'Tbar'] |
---|
2368 | Â Â Â Â Â Â else:Â #'T' |
---|
2369 | Â Â Â Â Â Â Â Â PLZ *=Â ref[13+im]Â Â Â #t-bar |
---|
2370 |     if 'Primary' in calcControls[phfx+'EType']: |
---|
2371 | Â Â Â Â Â Â PLZ *=Â 1.5 |
---|
2372 | Â Â Â Â Â Â PSIG =Â parmDict[phfx+'Ep'] |
---|
2373 |     elif 'I & II' in calcControls[phfx+'EType']: |
---|
2374 | Â Â Â Â Â Â PSIG =Â parmDict[phfx+'Eg']/np.sqrt(1.+(parmDict[phfx+'Es']*PL/parmDict[phfx+'Eg'])**2) |
---|
2375 |     elif 'Type II' in calcControls[phfx+'EType']: |
---|
2376 | Â Â Â Â Â Â PSIG =Â parmDict[phfx+'Es'] |
---|
2377 | Â Â Â Â else:Â Â Â Â # 'Secondary Type I' |
---|
2378 | Â Â Â Â Â Â PSIG =Â parmDict[phfx+'Eg']/PL |
---|
2379 | Â Â Â Â Â Â |
---|
2380 | Â Â Â Â AG =Â 0.58+0.48*cos2T+0.24*cos2T**2 |
---|
2381 | Â Â Â Â AL =Â 0.025+0.285*cos2T |
---|
2382 | Â Â Â Â BG =Â 0.02-0.025*cos2T |
---|
2383 | Â Â Â Â BL =Â 0.15-0.2*(0.75-cos2T)**2 |
---|
2384 |     if cos2T < 0.: |
---|
2385 | Â Â Â Â Â Â BL =Â -0.45*cos2T |
---|
2386 | Â Â Â Â CG =Â 2. |
---|
2387 | Â Â Â Â CL =Â 2. |
---|
2388 | Â Â Â Â PF =Â PLZ*PSIG |
---|
2389 | Â Â Â Â |
---|
2390 |     if 'Gaussian' in calcControls[phfx+'EApprox']: |
---|
2391 | Â Â Â Â Â Â PF4 =Â 1.+CG*PF+AG*PF**2/(1.+BG*PF) |
---|
2392 | Â Â Â Â Â Â extCor =Â np.sqrt(PF4) |
---|
2393 | Â Â Â Â Â Â PF3 =Â 0.5*(CG+2.*AG*PF/(1.+BG*PF)-AG*PF**2*BG/(1.+BG*PF)**2)/(PF4*extCor) |
---|
2394 | Â Â Â Â else: |
---|
2395 | Â Â Â Â Â Â PF4 =Â 1.+CL*PF+AL*PF**2/(1.+BL*PF) |
---|
2396 | Â Â Â Â Â Â extCor =Â np.sqrt(PF4) |
---|
2397 | Â Â Â Â Â Â PF3 =Â 0.5*(CL+2.*AL*PF/(1.+BL*PF)-AL*PF**2*BL/(1.+BL*PF)**2)/(PF4*extCor) |
---|
2398 | |
---|
2399 | Â Â Â Â dervCor =Â (1.+PF)*PF3Â Â #extinction corr for other derivatives |
---|
2400 |     if 'Primary' in calcControls[phfx+'EType'] and phfx+'Ep' in varyList: |
---|
2401 | Â Â Â Â Â Â dervDict[phfx+'Ep']Â =Â -ref[7+im]*PLZ*PF3 |
---|
2402 |     if 'II' in calcControls[phfx+'EType'] and phfx+'Es' in varyList: |
---|
2403 | Â Â Â Â Â Â dervDict[phfx+'Es']Â =Â -ref[7+im]*PLZ*PF3*(PSIG/parmDict[phfx+'Es'])**3 |
---|
2404 |     if 'I' in calcControls[phfx+'EType'] and phfx+'Eg' in varyList: |
---|
2405 | Â Â Â Â Â Â dervDict[phfx+'Eg']Â =Â -ref[7+im]*PLZ*PF3*(PSIG/parmDict[phfx+'Eg'])**3*PL**2 |
---|
2406 | Â Â Â Â Â Â Â Â |
---|
2407 |   return 1./extCor,dervDict,dervCor |
---|
2408 | Â Â |
---|
2409 | def Dict2Values(parmdict, varylist): |
---|
2410 | Â Â '''Use before call to leastsq to setup list of values for the parameters |
---|
2411 | Â Â in parmdict, as selected by key in varylist''' |
---|
2412 |   return [parmdict[key] for key in varylist] |
---|
2413 | Â Â |
---|
2414 | def Values2Dict(parmdict, varylist, values): |
---|
2415 | Â Â ''' Use after call to leastsq to update the parameter dictionary with |
---|
2416 | Â Â values corresponding to keys in varylist''' |
---|
2417 | Â Â parmdict.update(zip(varylist,values)) |
---|
2418 | Â Â |
---|
2419 | def GetNewCellParms(parmDict,varyList): |
---|
2420 | Â Â 'Needs a doc string' |
---|
2421 | Â Â newCellDict =Â {} |
---|
2422 |   Anames = ['A'+str(i) for i in range(6)] |
---|
2423 | Â Â Ddict =Â dict(zip(['D11','D22','D33','D12','D13','D23'],Anames)) |
---|
2424 |   for item in varyList: |
---|
2425 | Â Â Â Â keys =Â item.split(':') |
---|
2426 |     if keys[2] in Ddict: |
---|
2427 | Â Â Â Â Â Â key =Â keys[0]+'::'+Ddict[keys[2]]Â Â Â Â #key is e.g. '0::A0' |
---|
2428 | Â Â Â Â Â Â parm =Â keys[0]+'::'+keys[2]Â Â Â Â Â Â Â #parm is e.g. '0::D11' |
---|
2429 | Â Â Â Â Â Â newCellDict[parm]Â =Â [key,parmDict[key]+parmDict[item]] |
---|
2430 |   return newCellDict     # is e.g. {'0::D11':A0-D11} |
---|
2431 | Â Â |
---|
2432 | def ApplyXYZshifts(parmDict,varyList): |
---|
2433 | Â Â ''' |
---|
2434 | Â Â takes atom x,y,z shift and applies it to corresponding atom x,y,z value |
---|
2435 | Â Â |
---|
2436 | Â Â :param dict parmDict: parameter dictionary |
---|
2437 | Â Â :param list varyList: list of variables (not used!) |
---|
2438 | Â Â :returns: newAtomDict - dictionary of new atomic coordinate names & values; key is parameter shift name |
---|
2439 | |
---|
2440 | Â Â ''' |
---|
2441 | Â Â newAtomDict =Â {} |
---|
2442 |   for item in parmDict: |
---|
2443 |     if 'dA' in item: |
---|
2444 | Â Â Â Â Â Â parm =Â ''.join(item.split('d')) |
---|
2445 | Â Â Â Â Â Â parmDict[parm]Â +=Â parmDict[item] |
---|
2446 | Â Â Â Â Â Â newAtomDict[item]Â =Â [parm,parmDict[parm]] |
---|
2447 |   return newAtomDict |
---|
2448 | Â Â |
---|
2449 | def SHTXcal(refl,im,g,pfx,hfx,SGData,calcControls,parmDict): |
---|
2450 | Â Â 'Spherical harmonics texture' |
---|
2451 |   IFCoup = 'Bragg' in calcControls[hfx+'instType'] |
---|
2452 |   if 'T' in calcControls[hfx+'histType']: |
---|
2453 | Â Â Â Â tth =Â parmDict[hfx+'2-theta'] |
---|
2454 | Â Â else: |
---|
2455 | Â Â Â Â tth =Â refl[5+im] |
---|
2456 | Â Â odfCor =Â 1.0 |
---|
2457 | Â Â H =Â refl[:3] |
---|
2458 | Â Â cell =Â G2lat.Gmat2cell(g) |
---|
2459 | Â Â Sangls =Â [parmDict[pfx+'SH omega'],parmDict[pfx+'SH chi'],parmDict[pfx+'SH phi']] |
---|
2460 | Â Â Gangls =Â [parmDict[hfx+'Phi'],parmDict[hfx+'Chi'],parmDict[hfx+'Omega'],parmDict[hfx+'Azimuth']] |
---|
2461 | Â Â phi,beta =Â G2lat.CrsAng(H,cell,SGData) |
---|
2462 | Â Â psi,gam,x,x =Â G2lat.SamAng(tth/2.,Gangls,Sangls,IFCoup)Â #ignore 2 sets of angle derivs. |
---|
2463 | Â Â SHnames =Â G2lat.GenSHCoeff(SGData['SGLaue'],parmDict[pfx+'SHmodel'],parmDict[pfx+'SHorder']) |
---|
2464 |   for item in SHnames: |
---|
2465 | Â Â Â Â L,M,N =Â eval(item.strip('C')) |
---|
2466 | Â Â Â Â Kcl =Â G2lat.GetKcl(L,N,SGData['SGLaue'],phi,beta) |
---|
2467 | Â Â Â Â Ksl,x,x =Â G2lat.GetKsl(L,M,parmDict[pfx+'SHmodel'],psi,gam) |
---|
2468 | Â Â Â Â Lnorm =Â G2lat.Lnorm(L) |
---|
2469 | Â Â Â Â odfCor +=Â parmDict[pfx+item]*Lnorm*Kcl*Ksl |
---|
2470 |   return odfCor |
---|
2471 | Â Â |
---|
2472 | def SHTXcalDerv(refl,im,g,pfx,hfx,SGData,calcControls,parmDict): |
---|
2473 | Â Â 'Spherical harmonics texture derivatives' |
---|
2474 |   if 'T' in calcControls[hfx+'histType']: |
---|
2475 | Â Â Â Â tth =Â parmDict[hfx+'2-theta'] |
---|
2476 | Â Â else: |
---|
2477 | Â Â Â Â tth =Â refl[5+im] |
---|
2478 |   IFCoup = 'Bragg' in calcControls[hfx+'instType'] |
---|
2479 | Â Â odfCor =Â 1.0 |
---|
2480 | Â Â dFdODF =Â {} |
---|
2481 | Â Â dFdSA =Â [0,0,0] |
---|
2482 | Â Â H =Â refl[:3] |
---|
2483 | Â Â cell =Â G2lat.Gmat2cell(g) |
---|
2484 | Â Â Sangls =Â [parmDict[pfx+'SH omega'],parmDict[pfx+'SH chi'],parmDict[pfx+'SH phi']] |
---|
2485 | Â Â Gangls =Â [parmDict[hfx+'Phi'],parmDict[hfx+'Chi'],parmDict[hfx+'Omega'],parmDict[hfx+'Azimuth']] |
---|
2486 | Â Â phi,beta =Â G2lat.CrsAng(H,cell,SGData) |
---|
2487 | Â Â psi,gam,dPSdA,dGMdA =Â G2lat.SamAng(tth/2.,Gangls,Sangls,IFCoup) |
---|
2488 | Â Â SHnames =Â G2lat.GenSHCoeff(SGData['SGLaue'],parmDict[pfx+'SHmodel'],parmDict[pfx+'SHorder']) |
---|
2489 |   for item in SHnames: |
---|
2490 | Â Â Â Â L,M,N =Â eval(item.strip('C')) |
---|
2491 | Â Â Â Â Kcl =Â G2lat.GetKcl(L,N,SGData['SGLaue'],phi,beta) |
---|
2492 | Â Â Â Â Ksl,dKsdp,dKsdg =Â G2lat.GetKsl(L,M,parmDict[pfx+'SHmodel'],psi,gam) |
---|
2493 | Â Â Â Â Lnorm =Â G2lat.Lnorm(L) |
---|
2494 | Â Â Â Â odfCor +=Â parmDict[pfx+item]*Lnorm*Kcl*Ksl |
---|
2495 | Â Â Â Â dFdODF[pfx+item]Â =Â Lnorm*Kcl*Ksl |
---|
2496 |     for i in range(3): |
---|
2497 | Â Â Â Â Â Â dFdSA[i]Â +=Â parmDict[pfx+item]*Lnorm*Kcl*(dKsdp*dPSdA[i]+dKsdg*dGMdA[i]) |
---|
2498 |   return odfCor,dFdODF,dFdSA |
---|
2499 | Â Â |
---|
2500 | def SHPOcal(refl,im,g,phfx,hfx,SGData,calcControls,parmDict): |
---|
2501 | Â Â 'spherical harmonics preferred orientation (cylindrical symmetry only)' |
---|
2502 |   if 'T' in calcControls[hfx+'histType']: |
---|
2503 | Â Â Â Â tth =Â parmDict[hfx+'2-theta'] |
---|
2504 | Â Â else: |
---|
2505 | Â Â Â Â tth =Â refl[5+im] |
---|
2506 | Â Â odfCor =Â 1.0 |
---|
2507 | Â Â H =Â refl[:3] |
---|
2508 | Â Â cell =Â G2lat.Gmat2cell(g) |
---|
2509 | Â Â Sangls =Â [0.,0.,0.] |
---|
2510 |   if 'Bragg' in calcControls[hfx+'instType']: |
---|
2511 | Â Â Â Â Gangls =Â [0.,90.,0.,parmDict[hfx+'Azimuth']] |
---|
2512 | Â Â Â Â IFCoup =Â True |
---|
2513 | Â Â else: |
---|
2514 | Â Â Â Â Gangls =Â [parmDict[hfx+'Phi'],parmDict[hfx+'Chi'],parmDict[hfx+'Omega'],parmDict[hfx+'Azimuth']] |
---|
2515 | Â Â Â Â IFCoup =Â False |
---|
2516 | Â Â phi,beta =Â G2lat.CrsAng(H,cell,SGData) |
---|
2517 | Â Â psi,gam,x,x =Â G2lat.SamAng(tth/2.,Gangls,Sangls,IFCoup)Â #ignore 2 sets of angle derivs. |
---|
2518 | Â Â SHnames =Â calcControls[phfx+'SHnames'] |
---|
2519 |   for item in SHnames: |
---|
2520 | Â Â Â Â L,N =Â eval(item.strip('C')) |
---|
2521 | Â Â Â Â Kcl =Â G2lat.GetKcl(L,N,SGData['SGLaue'],phi,beta) |
---|
2522 | Â Â Â Â Ksl,x,x =Â G2lat.GetKsl(L,0,'0',psi,gam) |
---|
2523 | Â Â Â Â Lnorm =Â G2lat.Lnorm(L) |
---|
2524 | Â Â Â Â odfCor +=Â parmDict[phfx+item]*Lnorm*Kcl*Ksl |
---|
2525 |   return np.squeeze(odfCor) |
---|
2526 | Â Â |
---|
2527 | def SHPOcalDerv(refl,im,g,phfx,hfx,SGData,calcControls,parmDict): |
---|
2528 | Â Â 'spherical harmonics preferred orientation derivatives (cylindrical symmetry only)' |
---|
2529 |   if 'T' in calcControls[hfx+'histType']: |
---|
2530 | Â Â Â Â tth =Â parmDict[hfx+'2-theta'] |
---|
2531 | Â Â else: |
---|
2532 | Â Â Â Â tth =Â refl[5+im] |
---|
2533 | Â Â odfCor =Â 1.0 |
---|
2534 | Â Â dFdODF =Â {} |
---|
2535 | Â Â H =Â refl[:3] |
---|
2536 | Â Â cell =Â G2lat.Gmat2cell(g) |
---|
2537 | Â Â Sangls =Â [0.,0.,0.] |
---|
2538 |   if 'Bragg' in calcControls[hfx+'instType']: |
---|
2539 | Â Â Â Â Gangls =Â [0.,90.,0.,parmDict[hfx+'Azimuth']] |
---|
2540 | Â Â Â Â IFCoup =Â True |
---|
2541 | Â Â else: |
---|
2542 | Â Â Â Â Gangls =Â [parmDict[hfx+'Phi'],parmDict[hfx+'Chi'],parmDict[hfx+'Omega'],parmDict[hfx+'Azimuth']] |
---|
2543 | Â Â Â Â IFCoup =Â False |
---|
2544 | Â Â phi,beta =Â G2lat.CrsAng(H,cell,SGData) |
---|
2545 | Â Â psi,gam,x,x =Â G2lat.SamAng(tth/2.,Gangls,Sangls,IFCoup)Â #ignore 2 sets of angle derivs. |
---|
2546 | Â Â SHnames =Â calcControls[phfx+'SHnames'] |
---|
2547 |   for item in SHnames: |
---|
2548 | Â Â Â Â L,N =Â eval(item.strip('C')) |
---|
2549 | Â Â Â Â Kcl =Â G2lat.GetKcl(L,N,SGData['SGLaue'],phi,beta) |
---|
2550 | Â Â Â Â Ksl,x,x =Â G2lat.GetKsl(L,0,'0',psi,gam) |
---|
2551 | Â Â Â Â Lnorm =Â G2lat.Lnorm(L) |
---|
2552 | Â Â Â Â odfCor +=Â parmDict[phfx+item]*Lnorm*Kcl*Ksl |
---|
2553 | Â Â Â Â dFdODF[phfx+item]Â =Â Kcl*Ksl*Lnorm |
---|
2554 |   return odfCor,dFdODF |
---|
2555 | Â Â |
---|
2556 | def GetPrefOri(uniq,G,g,phfx,hfx,SGData,calcControls,parmDict): |
---|
2557 | Â Â 'March-Dollase preferred orientation correction' |
---|
2558 | Â Â POcorr =Â 1.0 |
---|
2559 | Â Â MD =Â parmDict[phfx+'MD'] |
---|
2560 |   if MD != 1.0: |
---|
2561 | Â Â Â Â MDAxis =Â calcControls[phfx+'MDAxis'] |
---|
2562 | Â Â Â Â sumMD =Â 0 |
---|
2563 |     for H in uniq:      |
---|
2564 | Â Â Â Â Â Â cosP,sinP =Â G2lat.CosSinAngle(H,MDAxis,G) |
---|
2565 | Â Â Â Â Â Â A =Â 1.0/np.sqrt((MD*cosP)**2+sinP**2/MD) |
---|
2566 | Â Â Â Â Â Â sumMD +=Â A**3 |
---|
2567 | Â Â Â Â POcorr =Â sumMD/len(uniq) |
---|
2568 |   return POcorr |
---|
2569 | Â Â |
---|
2570 | def GetPrefOriDerv(refl,im,uniq,G,g,phfx,hfx,SGData,calcControls,parmDict): |
---|
2571 | Â Â 'Needs a doc string' |
---|
2572 | Â Â POcorr =Â 1.0 |
---|
2573 | Â Â POderv =Â {} |
---|
2574 |   if calcControls[phfx+'poType'] == 'MD': |
---|
2575 | Â Â Â Â MD =Â parmDict[phfx+'MD'] |
---|
2576 | Â Â Â Â MDAxis =Â calcControls[phfx+'MDAxis'] |
---|
2577 | Â Â Â Â sumMD =Â 0 |
---|
2578 | Â Â Â Â sumdMD =Â 0 |
---|
2579 |     for H in uniq:      |
---|
2580 | Â Â Â Â Â Â cosP,sinP =Â G2lat.CosSinAngle(H,MDAxis,G) |
---|
2581 | Â Â Â Â Â Â A =Â 1.0/np.sqrt((MD*cosP)**2+sinP**2/MD) |
---|
2582 | Â Â Â Â Â Â sumMD +=Â A**3 |
---|
2583 | Â Â Â Â Â Â sumdMD -=Â (1.5*A**5)*(2.0*MD*cosP**2-(sinP/MD)**2) |
---|
2584 | Â Â Â Â POcorr =Â sumMD/len(uniq) |
---|
2585 | Â Â Â Â POderv[phfx+'MD']Â =Â sumdMD/len(uniq) |
---|
2586 | Â Â else:Â Â #spherical harmonics |
---|
2587 |     if calcControls[phfx+'SHord']: |
---|
2588 | Â Â Â Â Â Â POcorr,POderv =Â SHPOcalDerv(refl,im,g,phfx,hfx,SGData,calcControls,parmDict) |
---|
2589 |   return POcorr,POderv |
---|
2590 | Â Â |
---|
2591 | def GetAbsorb(refl,im,hfx,calcControls,parmDict): |
---|
2592 | Â Â 'Needs a doc string' |
---|
2593 |   if 'Debye' in calcControls[hfx+'instType']: |
---|
2594 |     if 'T' in calcControls[hfx+'histType']: |
---|
2595 |       return G2pwd.Absorb('Cylinder',parmDict[hfx+'Absorption']*refl[14+im],abs(parmDict[hfx+'2-theta']),0,0) |
---|
2596 | Â Â Â Â else: |
---|
2597 |       return G2pwd.Absorb('Cylinder',parmDict[hfx+'Absorption'],refl[5+im],0,0) |
---|
2598 | Â Â else: |
---|
2599 |     return G2pwd.SurfaceRough(parmDict[hfx+'SurfRoughA'],parmDict[hfx+'SurfRoughB'],refl[5+im]) |
---|
2600 | Â Â |
---|
2601 | def GetAbsorbDerv(refl,im,hfx,calcControls,parmDict): |
---|
2602 | Â Â 'Needs a doc string' |
---|
2603 |   if 'Debye' in calcControls[hfx+'instType']: |
---|
2604 |     if 'T' in calcControls[hfx+'histType']: |
---|
2605 |       return G2pwd.AbsorbDerv('Cylinder',parmDict[hfx+'Absorption']*refl[14+im],abs(parmDict[hfx+'2-theta']),0,0) |
---|
2606 | Â Â Â Â else: |
---|
2607 |       return G2pwd.AbsorbDerv('Cylinder',parmDict[hfx+'Absorption'],refl[5+im],0,0) |
---|
2608 | Â Â else: |
---|
2609 |     return np.array(G2pwd.SurfaceRoughDerv(parmDict[hfx+'SurfRoughA'],parmDict[hfx+'SurfRoughB'],refl[5+im])) |
---|
2610 | Â Â Â Â |
---|
2611 | def GetPwdrExt(refl,im,pfx,phfx,hfx,calcControls,parmDict): |
---|
2612 | Â Â 'Needs a doc string' |
---|
2613 | Â Â coef =Â np.array([-0.5,0.25,-0.10416667,0.036458333,-0.0109375,2.8497409E-3]) |
---|
2614 | Â Â pi2 =Â np.sqrt(2./np.pi) |
---|
2615 |   if 'T' in calcControls[hfx+'histType']: |
---|
2616 | Â Â Â Â sth2 =Â sind(abs(parmDict[hfx+'2-theta'])/2.)**2 |
---|
2617 | Â Â Â Â wave =Â refl[14+im] |
---|
2618 | Â Â else:Â Â #'C'W |
---|
2619 | Â Â Â Â sth2 =Â sind(refl[5+im]/2.)**2 |
---|
2620 | Â Â Â Â wave =Â parmDict.get(hfx+'Lam',parmDict.get(hfx+'Lam1',1.0)) |
---|
2621 | Â Â c2th =Â 1.-2.0*sth2 |
---|
2622 | Â Â flv2 =Â refl[9+im]*(wave/parmDict[pfx+'Vol'])**2 |
---|
2623 |   if 'X' in calcControls[hfx+'histType']: |
---|
2624 | Â Â Â Â flv2 *=Â 0.079411*(1.0+c2th**2)/2.0 |
---|
2625 | Â Â xfac =Â flv2*parmDict[phfx+'Extinction'] |
---|
2626 | Â Â exb =Â 1.0 |
---|
2627 |   if xfac > -1.: |
---|
2628 | Â Â Â Â exb =Â 1./np.sqrt(1.+xfac) |
---|
2629 | Â Â exl =Â 1.0 |
---|
2630 |   if 0 < xfac <= 1.: |
---|
2631 |     xn = np.array([xfac**(i+1) for i in range(6)]) |
---|
2632 | Â Â Â Â exl +=Â np.sum(xn*coef) |
---|
2633 |   elif xfac > 1.: |
---|
2634 | Â Â Â Â xfac2 =Â 1./np.sqrt(xfac) |
---|
2635 | Â Â Â Â exl =Â pi2*(1.-0.125/xfac)*xfac2 |
---|
2636 |   return exb*sth2+exl*(1.-sth2) |
---|
2637 | Â Â |
---|
2638 | def GetPwdrExtDerv(refl,im,pfx,phfx,hfx,calcControls,parmDict): |
---|
2639 | Â Â 'Needs a doc string' |
---|
2640 | Â Â coef =Â np.array([-0.5,0.25,-0.10416667,0.036458333,-0.0109375,2.8497409E-3]) |
---|
2641 | Â Â pi2 =Â np.sqrt(2./np.pi) |
---|
2642 |   if 'T' in calcControls[hfx+'histType']: |
---|
2643 | Â Â Â Â sth2 =Â sind(abs(parmDict[hfx+'2-theta'])/2.)**2 |
---|
2644 | Â Â Â Â wave =Â refl[14+im] |
---|
2645 | Â Â else:Â Â #'C'W |
---|
2646 | Â Â Â Â sth2 =Â sind(refl[5+im]/2.)**2 |
---|
2647 | Â Â Â Â wave =Â parmDict.get(hfx+'Lam',parmDict.get(hfx+'Lam1',1.0)) |
---|
2648 | Â Â c2th =Â 1.-2.0*sth2 |
---|
2649 | Â Â flv2 =Â refl[9+im]*(wave/parmDict[pfx+'Vol'])**2 |
---|
2650 |   if 'X' in calcControls[hfx+'histType']: |
---|
2651 | Â Â Â Â flv2 *=Â 0.079411*(1.0+c2th**2)/2.0 |
---|
2652 | Â Â xfac =Â flv2*parmDict[phfx+'Extinction'] |
---|
2653 | Â Â dbde =Â -500.*flv2 |
---|
2654 |   if xfac > -1.: |
---|
2655 | Â Â Â Â dbde =Â -0.5*flv2/np.sqrt(1.+xfac)**3 |
---|
2656 | Â Â dlde =Â 0. |
---|
2657 |   if 0 < xfac <= 1.: |
---|
2658 |     xn = np.array([i*flv2*xfac**i for i in [1,2,3,4,5,6]]) |
---|
2659 | Â Â Â Â dlde =Â np.sum(xn*coef) |
---|
2660 |   elif xfac > 1.: |
---|
2661 | Â Â Â Â xfac2 =Â 1./np.sqrt(xfac) |
---|
2662 | Â Â Â Â dlde =Â flv2*pi2*xfac2*(-1./xfac+0.375/xfac**2) |
---|
2663 | Â Â Â Â |
---|
2664 |   return dbde*sth2+dlde*(1.-sth2) |
---|
2665 | Â Â |
---|
2666 | def GetIntensityCorr(refl,im,uniq,G,g,pfx,phfx,hfx,SGData,calcControls,parmDict): |
---|
2667 | Â Â 'Needs a doc string'Â Â #need powder extinction! |
---|
2668 | Â Â Icorr =Â parmDict[phfx+'Scale']*parmDict[hfx+'Scale']*refl[3+im]Â Â Â Â Â Â Â Â #scale*multiplicity |
---|
2669 |   if 'X' in parmDict[hfx+'Type']: |
---|
2670 | Â Â Â Â Icorr *=Â G2pwd.Polarization(parmDict[hfx+'Polariz.'],refl[5+im],parmDict[hfx+'Azimuth'])[0] |
---|
2671 | Â Â POcorr =Â 1.0 |
---|
2672 |   if pfx+'SHorder' in parmDict:         #generalized spherical harmonics texture - takes precidence |
---|
2673 | Â Â Â Â POcorr =Â SHTXcal(refl,im,g,pfx,hfx,SGData,calcControls,parmDict) |
---|
2674 |   elif calcControls[phfx+'poType'] == 'MD':     #March-Dollase |
---|
2675 | Â Â Â Â POcorr =Â GetPrefOri(uniq,G,g,phfx,hfx,SGData,calcControls,parmDict) |
---|
2676 |   elif calcControls[phfx+'SHord']:        #cylindrical spherical harmonics |
---|
2677 | Â Â Â Â POcorr =Â SHPOcal(refl,im,g,phfx,hfx,SGData,calcControls,parmDict) |
---|
2678 | Â Â Icorr *=Â POcorr |
---|
2679 | Â Â AbsCorr =Â 1.0 |
---|
2680 | Â Â AbsCorr =Â GetAbsorb(refl,im,hfx,calcControls,parmDict) |
---|
2681 | Â Â Icorr *=Â AbsCorr |
---|
2682 | Â Â ExtCorr =Â GetPwdrExt(refl,im,pfx,phfx,hfx,calcControls,parmDict) |
---|
2683 | Â Â Icorr *=Â ExtCorr |
---|
2684 |   return Icorr,POcorr,AbsCorr,ExtCorr |
---|
2685 | Â Â |
---|
2686 | def GetIntensityDerv(refl,im,wave,uniq,G,g,pfx,phfx,hfx,SGData,calcControls,parmDict): |
---|
2687 | Â Â 'Needs a doc string'Â Â #need powder extinction derivs! |
---|
2688 | Â Â dIdsh =Â 1./parmDict[hfx+'Scale'] |
---|
2689 | Â Â dIdsp =Â 1./parmDict[phfx+'Scale'] |
---|
2690 |   if 'X' in parmDict[hfx+'Type']: |
---|
2691 | Â Â Â Â pola,dIdPola =Â G2pwd.Polarization(parmDict[hfx+'Polariz.'],refl[5+im],parmDict[hfx+'Azimuth']) |
---|
2692 | Â Â Â Â dIdPola /=Â pola |
---|
2693 | Â Â else:Â Â Â Â #'N' |
---|
2694 | Â Â Â Â dIdPola =Â 0.0 |
---|
2695 | Â Â dFdODF =Â {} |
---|
2696 | Â Â dFdSA =Â [0,0,0] |
---|
2697 | Â Â dIdPO =Â {} |
---|
2698 |   if pfx+'SHorder' in parmDict: |
---|
2699 | Â Â Â Â odfCor,dFdODF,dFdSA =Â SHTXcalDerv(refl,im,g,pfx,hfx,SGData,calcControls,parmDict) |
---|
2700 |     for iSH in dFdODF: |
---|
2701 | Â Â Â Â Â Â dFdODF[iSH]Â /=Â odfCor |
---|
2702 |     for i in range(3): |
---|
2703 | Â Â Â Â Â Â dFdSA[i]Â /=Â odfCor |
---|
2704 |   elif calcControls[phfx+'poType'] == 'MD' or calcControls[phfx+'SHord']: |
---|
2705 | Â Â Â Â POcorr,dIdPO =Â GetPrefOriDerv(refl,im,uniq,G,g,phfx,hfx,SGData,calcControls,parmDict)Â Â Â Â |
---|
2706 |     for iPO in dIdPO: |
---|
2707 | Â Â Â Â Â Â dIdPO[iPO]Â /=Â POcorr |
---|
2708 |   if 'T' in parmDict[hfx+'Type']: |
---|
2709 | Â Â Â Â dFdAb =Â GetAbsorbDerv(refl,im,hfx,calcControls,parmDict)*wave/refl[16+im]Â #wave/abs corr |
---|
2710 | Â Â Â Â dFdEx =Â GetPwdrExtDerv(refl,im,pfx,phfx,hfx,calcControls,parmDict)/refl[17+im]Â Â #/ext corr |
---|
2711 | Â Â else: |
---|
2712 | Â Â Â Â dFdAb =Â GetAbsorbDerv(refl,im,hfx,calcControls,parmDict)*wave/refl[13+im]Â #wave/abs corr |
---|
2713 |     dFdEx = GetPwdrExtDerv(refl,im,pfx,phfx,hfx,calcControls,parmDict)/refl[14+im]  #/ext corr    |
---|
2714 |   return dIdsh,dIdsp,dIdPola,dIdPO,dFdODF,dFdSA,dFdAb,dFdEx |
---|
2715 | Â Â Â Â |
---|
2716 | def GetSampleSigGam(refl,im,wave,G,GB,SGData,hfx,phfx,calcControls,parmDict): |
---|
2717 | Â Â 'Needs a doc string' |
---|
2718 |   if 'C' in calcControls[hfx+'histType']:   #All checked & OK |
---|
2719 | Â Â Â Â costh =Â cosd(refl[5+im]/2.) |
---|
2720 | Â Â Â Â #crystallite size |
---|
2721 |     if calcControls[phfx+'SizeType'] == 'isotropic': |
---|
2722 | Â Â Â Â Â Â Sgam =Â 1.8*wave/(np.pi*parmDict[phfx+'Size;i']*costh) |
---|
2723 |     elif calcControls[phfx+'SizeType'] == 'uniaxial': |
---|
2724 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2725 | Â Â Â Â Â Â P =Â np.array(calcControls[phfx+'SizeAxis']) |
---|
2726 | Â Â Â Â Â Â cosP,sinP =Â G2lat.CosSinAngle(H,P,G) |
---|
2727 | Â Â Â Â Â Â Sgam =Â (1.8*wave/np.pi)/(parmDict[phfx+'Size;i']*parmDict[phfx+'Size;a']*costh) |
---|
2728 | Â Â Â Â Â Â Sgam *=Â np.sqrt((sinP*parmDict[phfx+'Size;a'])**2+(cosP*parmDict[phfx+'Size;i'])**2) |
---|
2729 | Â Â Â Â else:Â Â Â Â Â Â #ellipsoidal crystallites |
---|
2730 |       Sij =[parmDict[phfx+'Size;%d'%(i)] for i in range(6)] |
---|
2731 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2732 | Â Â Â Â Â Â lenR =Â G2pwd.ellipseSize(H,Sij,GB) |
---|
2733 | Â Â Â Â Â Â Sgam =Â 1.8*wave/(np.pi*costh*lenR) |
---|
2734 |     #microstrain        |
---|
2735 |     if calcControls[phfx+'MustrainType'] == 'isotropic': |
---|
2736 | Â Â Â Â Â Â Mgam =Â 0.018*parmDict[phfx+'Mustrain;i']*tand(refl[5+im]/2.)/np.pi |
---|
2737 |     elif calcControls[phfx+'MustrainType'] == 'uniaxial': |
---|
2738 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2739 | Â Â Â Â Â Â P =Â np.array(calcControls[phfx+'MustrainAxis']) |
---|
2740 | Â Â Â Â Â Â cosP,sinP =Â G2lat.CosSinAngle(H,P,G) |
---|
2741 | Â Â Â Â Â Â Si =Â parmDict[phfx+'Mustrain;i'] |
---|
2742 | Â Â Â Â Â Â Sa =Â parmDict[phfx+'Mustrain;a'] |
---|
2743 | Â Â Â Â Â Â Mgam =Â 0.018*Si*Sa*tand(refl[5+im]/2.)/(np.pi*np.sqrt((Si*cosP)**2+(Sa*sinP)**2)) |
---|
2744 | Â Â Â Â else:Â Â Â Â #generalized - P.W. Stephens model |
---|
2745 | Â Â Â Â Â Â Strms =Â G2spc.MustrainCoeff(refl[:3],SGData) |
---|
2746 | Â Â Â Â Â Â Sum =Â 0 |
---|
2747 |       for i,strm in enumerate(Strms): |
---|
2748 | Â Â Â Â Â Â Â Â Sum +=Â parmDict[phfx+'Mustrain;'+str(i)]*strm |
---|
2749 | Â Â Â Â Â Â Mgam =Â 0.018*refl[4+im]**2*tand(refl[5+im]/2.)*np.sqrt(Sum)/np.pi |
---|
2750 |   elif 'T' in calcControls[hfx+'histType']:    #All checked & OK |
---|
2751 | Â Â Â Â #crystallite size |
---|
2752 |     if calcControls[phfx+'SizeType'] == 'isotropic':  #OK |
---|
2753 | Â Â Â Â Â Â Sgam =Â 1.e-4*parmDict[hfx+'difC']*refl[4+im]**2/parmDict[phfx+'Size;i'] |
---|
2754 |     elif calcControls[phfx+'SizeType'] == 'uniaxial':  #OK |
---|
2755 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2756 | Â Â Â Â Â Â P =Â np.array(calcControls[phfx+'SizeAxis']) |
---|
2757 | Â Â Â Â Â Â cosP,sinP =Â G2lat.CosSinAngle(H,P,G) |
---|
2758 | Â Â Â Â Â Â Sgam =Â 1.e-4*parmDict[hfx+'difC']*refl[4+im]**2/(parmDict[phfx+'Size;i']*parmDict[phfx+'Size;a']) |
---|
2759 | Â Â Â Â Â Â Sgam *=Â np.sqrt((sinP*parmDict[phfx+'Size;a'])**2+(cosP*parmDict[phfx+'Size;i'])**2) |
---|
2760 |     else:      #ellipsoidal crystallites  #OK |
---|
2761 |       Sij =[parmDict[phfx+'Size;%d'%(i)] for i in range(6)] |
---|
2762 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2763 | Â Â Â Â Â Â lenR =Â G2pwd.ellipseSize(H,Sij,GB) |
---|
2764 | Â Â Â Â Â Â Sgam =Â 1.e-4*parmDict[hfx+'difC']*refl[4+im]**2/lenR |
---|
2765 |     #microstrain        |
---|
2766 |     if calcControls[phfx+'MustrainType'] == 'isotropic':  #OK |
---|
2767 | Â Â Â Â Â Â Mgam =Â 1.e-6*parmDict[hfx+'difC']*refl[4+im]*parmDict[phfx+'Mustrain;i'] |
---|
2768 |     elif calcControls[phfx+'MustrainType'] == 'uniaxial':  #OK |
---|
2769 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2770 | Â Â Â Â Â Â P =Â np.array(calcControls[phfx+'MustrainAxis']) |
---|
2771 | Â Â Â Â Â Â cosP,sinP =Â G2lat.CosSinAngle(H,P,G) |
---|
2772 | Â Â Â Â Â Â Si =Â parmDict[phfx+'Mustrain;i'] |
---|
2773 | Â Â Â Â Â Â Sa =Â parmDict[phfx+'Mustrain;a'] |
---|
2774 | Â Â Â Â Â Â Mgam =Â 1.e-6*parmDict[hfx+'difC']*refl[4+im]*Si*Sa/np.sqrt((Si*cosP)**2+(Sa*sinP)**2) |
---|
2775 |     else:    #generalized - P.W. Stephens model OK |
---|
2776 | Â Â Â Â Â Â Strms =Â G2spc.MustrainCoeff(refl[:3],SGData) |
---|
2777 | Â Â Â Â Â Â Sum =Â 0 |
---|
2778 |       for i,strm in enumerate(Strms): |
---|
2779 | Â Â Â Â Â Â Â Â Sum +=Â parmDict[phfx+'Mustrain;'+str(i)]*strm |
---|
2780 | Â Â Â Â Â Â Mgam =Â 1.e-6*parmDict[hfx+'difC']*np.sqrt(Sum)*refl[4+im]**3 |
---|
2781 | Â Â Â Â Â Â |
---|
2782 | Â Â gam =Â Sgam*parmDict[phfx+'Size;mx']+Mgam*parmDict[phfx+'Mustrain;mx'] |
---|
2783 | Â Â sig =Â (Sgam*(1.-parmDict[phfx+'Size;mx']))**2+(Mgam*(1.-parmDict[phfx+'Mustrain;mx']))**2 |
---|
2784 | Â Â sig /=Â ateln2 |
---|
2785 |   return sig,gam |
---|
2786 | Â Â Â Â |
---|
2787 | def GetSampleSigGamDerv(refl,im,wave,G,GB,SGData,hfx,phfx,calcControls,parmDict): |
---|
2788 | Â Â 'Needs a doc string' |
---|
2789 | Â Â gamDict =Â {} |
---|
2790 | Â Â sigDict =Â {} |
---|
2791 |   if 'C' in calcControls[hfx+'histType']:     #All checked & OK |
---|
2792 | Â Â Â Â costh =Â cosd(refl[5+im]/2.) |
---|
2793 | Â Â Â Â tanth =Â tand(refl[5+im]/2.) |
---|
2794 | Â Â Â Â #crystallite size derivatives |
---|
2795 |     if calcControls[phfx+'SizeType'] == 'isotropic': |
---|
2796 | Â Â Â Â Â Â Sgam =Â 1.8*wave/(np.pi*costh*parmDict[phfx+'Size;i']) |
---|
2797 | Â Â Â Â Â Â gamDict[phfx+'Size;i']Â =Â -1.8*wave*parmDict[phfx+'Size;mx']/(np.pi*costh*parmDict[phfx+'Size;i']**2) |
---|
2798 | Â Â Â Â Â Â sigDict[phfx+'Size;i']Â =Â -3.6*Sgam*wave*(1.-parmDict[phfx+'Size;mx'])**2/(np.pi*costh*ateln2) |
---|
2799 |     elif calcControls[phfx+'SizeType'] == 'uniaxial': |
---|
2800 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2801 | Â Â Â Â Â Â P =Â np.array(calcControls[phfx+'SizeAxis']) |
---|
2802 | Â Â Â Â Â Â cosP,sinP =Â G2lat.CosSinAngle(H,P,G) |
---|
2803 | Â Â Â Â Â Â Si =Â parmDict[phfx+'Size;i'] |
---|
2804 | Â Â Â Â Â Â Sa =Â parmDict[phfx+'Size;a'] |
---|
2805 | Â Â Â Â Â Â gami =Â 1.8*wave/(costh*np.pi*Si*Sa) |
---|
2806 | Â Â Â Â Â Â sqtrm =Â np.sqrt((sinP*Sa)**2+(cosP*Si)**2) |
---|
2807 | Â Â Â Â Â Â Sgam =Â gami*sqtrm |
---|
2808 | Â Â Â Â Â Â dsi =Â gami*Si*cosP**2/sqtrm-Sgam/Si |
---|
2809 | Â Â Â Â Â Â dsa =Â gami*Sa*sinP**2/sqtrm-Sgam/Sa |
---|
2810 | Â Â Â Â Â Â gamDict[phfx+'Size;i']Â =Â dsi*parmDict[phfx+'Size;mx'] |
---|
2811 | Â Â Â Â Â Â gamDict[phfx+'Size;a']Â =Â dsa*parmDict[phfx+'Size;mx'] |
---|
2812 | Â Â Â Â Â Â sigDict[phfx+'Size;i']Â =Â 2.*dsi*Sgam*(1.-parmDict[phfx+'Size;mx'])**2/ateln2 |
---|
2813 | Â Â Â Â Â Â sigDict[phfx+'Size;a']Â =Â 2.*dsa*Sgam*(1.-parmDict[phfx+'Size;mx'])**2/ateln2 |
---|
2814 | Â Â Â Â else:Â Â Â Â Â Â #ellipsoidal crystallites |
---|
2815 | Â Â Â Â Â Â const =Â 1.8*wave/(np.pi*costh) |
---|
2816 |       Sij =[parmDict[phfx+'Size;%d'%(i)] for i in range(6)] |
---|
2817 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2818 | Â Â Â Â Â Â lenR,dRdS =Â G2pwd.ellipseSizeDerv(H,Sij,GB) |
---|
2819 | Â Â Â Â Â Â Sgam =Â const/lenR |
---|
2820 |       for i,item in enumerate([phfx+'Size;%d'%(j) for j in range(6)]): |
---|
2821 | Â Â Â Â Â Â Â Â gamDict[item]Â =Â -(const/lenR**2)*dRdS[i]*parmDict[phfx+'Size;mx'] |
---|
2822 | Â Â Â Â Â Â Â Â sigDict[item]Â =Â -2.*Sgam*(const/lenR**2)*dRdS[i]*(1.-parmDict[phfx+'Size;mx'])**2/ateln2 |
---|
2823 | Â Â Â Â gamDict[phfx+'Size;mx']Â =Â Sgam |
---|
2824 | Â Â Â Â sigDict[phfx+'Size;mx']Â =Â -2.*Sgam**2*(1.-parmDict[phfx+'Size;mx'])/ateln2 |
---|
2825 | Â Â Â Â Â Â Â Â |
---|
2826 |     #microstrain derivatives        |
---|
2827 |     if calcControls[phfx+'MustrainType'] == 'isotropic': |
---|
2828 | Â Â Â Â Â Â Mgam =Â 0.018*parmDict[phfx+'Mustrain;i']*tand(refl[5+im]/2.)/np.pi |
---|
2829 | Â Â Â Â Â Â gamDict[phfx+'Mustrain;i']Â =Â 0.018*tanth*parmDict[phfx+'Mustrain;mx']/np.pi |
---|
2830 | Â Â Â Â Â Â sigDict[phfx+'Mustrain;i']Â =Â 0.036*Mgam*tanth*(1.-parmDict[phfx+'Mustrain;mx'])**2/(np.pi*ateln2)Â Â Â Â |
---|
2831 |     elif calcControls[phfx+'MustrainType'] == 'uniaxial': |
---|
2832 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2833 | Â Â Â Â Â Â P =Â np.array(calcControls[phfx+'MustrainAxis']) |
---|
2834 | Â Â Â Â Â Â cosP,sinP =Â G2lat.CosSinAngle(H,P,G) |
---|
2835 | Â Â Â Â Â Â Si =Â parmDict[phfx+'Mustrain;i'] |
---|
2836 | Â Â Â Â Â Â Sa =Â parmDict[phfx+'Mustrain;a'] |
---|
2837 | Â Â Â Â Â Â gami =Â 0.018*Si*Sa*tanth/np.pi |
---|
2838 | Â Â Â Â Â Â sqtrm =Â np.sqrt((Si*cosP)**2+(Sa*sinP)**2) |
---|
2839 | Â Â Â Â Â Â Mgam =Â gami/sqtrm |
---|
2840 | Â Â Â Â Â Â dsi =Â -gami*Si*cosP**2/sqtrm**3 |
---|
2841 | Â Â Â Â Â Â dsa =Â -gami*Sa*sinP**2/sqtrm**3 |
---|
2842 | Â Â Â Â Â Â gamDict[phfx+'Mustrain;i']Â =Â (Mgam/Si+dsi)*parmDict[phfx+'Mustrain;mx'] |
---|
2843 | Â Â Â Â Â Â gamDict[phfx+'Mustrain;a']Â =Â (Mgam/Sa+dsa)*parmDict[phfx+'Mustrain;mx'] |
---|
2844 | Â Â Â Â Â Â sigDict[phfx+'Mustrain;i']Â =Â 2*(Mgam/Si+dsi)*Mgam*(1.-parmDict[phfx+'Mustrain;mx'])**2/ateln2 |
---|
2845 | Â Â Â Â Â Â sigDict[phfx+'Mustrain;a']Â =Â 2*(Mgam/Sa+dsa)*Mgam*(1.-parmDict[phfx+'Mustrain;mx'])**2/ateln2Â Â Â Â |
---|
2846 | Â Â Â Â else:Â Â Â Â #generalized - P.W. Stephens model |
---|
2847 | Â Â Â Â Â Â const =Â 0.018*refl[4+im]**2*tanth/np.pi |
---|
2848 | Â Â Â Â Â Â Strms =Â G2spc.MustrainCoeff(refl[:3],SGData) |
---|
2849 | Â Â Â Â Â Â Sum =Â 0 |
---|
2850 |       for i,strm in enumerate(Strms): |
---|
2851 | Â Â Â Â Â Â Â Â Sum +=Â parmDict[phfx+'Mustrain;'+str(i)]*strm |
---|
2852 | Â Â Â Â Â Â Â Â gamDict[phfx+'Mustrain;'+str(i)]Â =Â strm*parmDict[phfx+'Mustrain;mx']/2. |
---|
2853 | Â Â Â Â Â Â Â Â sigDict[phfx+'Mustrain;'+str(i)]Â =Â strm*(1.-parmDict[phfx+'Mustrain;mx'])**2 |
---|
2854 | Â Â Â Â Â Â Mgam =Â const*np.sqrt(Sum) |
---|
2855 |       for i in range(len(Strms)): |
---|
2856 | Â Â Â Â Â Â Â Â gamDict[phfx+'Mustrain;'+str(i)]Â *=Â Mgam/Sum |
---|
2857 | Â Â Â Â Â Â Â Â sigDict[phfx+'Mustrain;'+str(i)]Â *=Â const**2/ateln2 |
---|
2858 | Â Â Â Â gamDict[phfx+'Mustrain;mx']Â =Â Mgam |
---|
2859 | Â Â Â Â sigDict[phfx+'Mustrain;mx']Â =Â -2.*Mgam**2*(1.-parmDict[phfx+'Mustrain;mx'])/ateln2 |
---|
2860 | Â Â else:Â Â #'T'OF - All checked & OK |
---|
2861 |     if calcControls[phfx+'SizeType'] == 'isotropic':  #OK |
---|
2862 | Â Â Â Â Â Â Sgam =Â 1.e-4*parmDict[hfx+'difC']*refl[4+im]**2/parmDict[phfx+'Size;i'] |
---|
2863 | Â Â Â Â Â Â gamDict[phfx+'Size;i']Â =Â -Sgam*parmDict[phfx+'Size;mx']/parmDict[phfx+'Size;i'] |
---|
2864 | Â Â Â Â Â Â sigDict[phfx+'Size;i']Â =Â -2.*Sgam**2*(1.-parmDict[phfx+'Size;mx'])**2/(ateln2*parmDict[phfx+'Size;i']) |
---|
2865 |     elif calcControls[phfx+'SizeType'] == 'uniaxial':  #OK |
---|
2866 | Â Â Â Â Â Â const =Â 1.e-4*parmDict[hfx+'difC']*refl[4+im]**2 |
---|
2867 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2868 | Â Â Â Â Â Â P =Â np.array(calcControls[phfx+'SizeAxis']) |
---|
2869 | Â Â Â Â Â Â cosP,sinP =Â G2lat.CosSinAngle(H,P,G) |
---|
2870 | Â Â Â Â Â Â Si =Â parmDict[phfx+'Size;i'] |
---|
2871 | Â Â Â Â Â Â Sa =Â parmDict[phfx+'Size;a'] |
---|
2872 | Â Â Â Â Â Â gami =Â const/(Si*Sa) |
---|
2873 | Â Â Â Â Â Â sqtrm =Â np.sqrt((sinP*Sa)**2+(cosP*Si)**2) |
---|
2874 | Â Â Â Â Â Â Sgam =Â gami*sqtrm |
---|
2875 | Â Â Â Â Â Â dsi =Â gami*Si*cosP**2/sqtrm-Sgam/Si |
---|
2876 | Â Â Â Â Â Â dsa =Â gami*Sa*sinP**2/sqtrm-Sgam/Sa |
---|
2877 | Â Â Â Â Â Â gamDict[phfx+'Size;i']Â =Â dsi*parmDict[phfx+'Size;mx'] |
---|
2878 | Â Â Â Â Â Â gamDict[phfx+'Size;a']Â =Â dsa*parmDict[phfx+'Size;mx'] |
---|
2879 | Â Â Â Â Â Â sigDict[phfx+'Size;i']Â =Â 2.*dsi*Sgam*(1.-parmDict[phfx+'Size;mx'])**2/ateln2 |
---|
2880 | Â Â Â Â Â Â sigDict[phfx+'Size;a']Â =Â 2.*dsa*Sgam*(1.-parmDict[phfx+'Size;mx'])**2/ateln2 |
---|
2881 | Â Â Â Â else:Â Â Â Â Â Â #OKÂ ellipsoidal crystallites |
---|
2882 | Â Â Â Â Â Â const =Â 1.e-4*parmDict[hfx+'difC']*refl[4+im]**2 |
---|
2883 |       Sij =[parmDict[phfx+'Size;%d'%(i)] for i in range(6)] |
---|
2884 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2885 | Â Â Â Â Â Â lenR,dRdS =Â G2pwd.ellipseSizeDerv(H,Sij,GB) |
---|
2886 | Â Â Â Â Â Â Sgam =Â const/lenR |
---|
2887 |       for i,item in enumerate([phfx+'Size;%d'%(j) for j in range(6)]): |
---|
2888 | Â Â Â Â Â Â Â Â gamDict[item]Â =Â -(const/lenR**2)*dRdS[i]*parmDict[phfx+'Size;mx'] |
---|
2889 | Â Â Â Â Â Â Â Â sigDict[item]Â =Â -2.*Sgam*(const/lenR**2)*dRdS[i]*(1.-parmDict[phfx+'Size;mx'])**2/ateln2 |
---|
2890 |     gamDict[phfx+'Size;mx'] = Sgam #OK |
---|
2891 | Â Â Â Â sigDict[phfx+'Size;mx']Â =Â -2.*Sgam**2*(1.-parmDict[phfx+'Size;mx'])/ateln2Â #OK |
---|
2892 | Â Â Â Â Â Â Â Â |
---|
2893 |     #microstrain derivatives        |
---|
2894 |     if calcControls[phfx+'MustrainType'] == 'isotropic': |
---|
2895 | Â Â Â Â Â Â Mgam =Â 1.e-6*parmDict[hfx+'difC']*refl[4+im]*parmDict[phfx+'Mustrain;i'] |
---|
2896 | Â Â Â Â Â Â gamDict[phfx+'Mustrain;i']Â =Â 1.e-6*refl[4+im]*parmDict[hfx+'difC']*parmDict[phfx+'Mustrain;mx']Â Â #OK |
---|
2897 | Â Â Â Â Â Â sigDict[phfx+'Mustrain;i']Â =Â 2.*Mgam**2*(1.-parmDict[phfx+'Mustrain;mx'])**2/(ateln2*parmDict[phfx+'Mustrain;i'])Â Â Â Â |
---|
2898 |     elif calcControls[phfx+'MustrainType'] == 'uniaxial': |
---|
2899 | Â Â Â Â Â Â H =Â np.array(refl[:3]) |
---|
2900 | Â Â Â Â Â Â P =Â np.array(calcControls[phfx+'MustrainAxis']) |
---|
2901 | Â Â Â Â Â Â cosP,sinP =Â G2lat.CosSinAngle(H,P,G) |
---|
2902 | Â Â Â Â Â Â Si =Â parmDict[phfx+'Mustrain;i'] |
---|
2903 | Â Â Â Â Â Â Sa =Â parmDict[phfx+'Mustrain;a'] |
---|
2904 | Â Â Â Â Â Â gami =Â 1.e-6*parmDict[hfx+'difC']*refl[4+im]*Si*Sa |
---|
2905 | Â Â Â Â Â Â sqtrm =Â np.sqrt((Si*cosP)**2+(Sa*sinP)**2) |
---|
2906 | Â Â Â Â Â Â Mgam =Â gami/sqtrm |
---|
2907 | Â Â Â Â Â Â dsi =Â -gami*Si*cosP**2/sqtrm**3 |
---|
2908 | Â Â Â Â Â Â dsa =Â -gami*Sa*sinP**2/sqtrm**3 |
---|
2909 | Â Â Â Â Â Â gamDict[phfx+'Mustrain;i']Â =Â (Mgam/Si+dsi)*parmDict[phfx+'Mustrain;mx'] |
---|
2910 | Â Â Â Â Â Â gamDict[phfx+'Mustrain;a']Â =Â (Mgam/Sa+dsa)*parmDict[phfx+'Mustrain;mx'] |
---|
2911 | Â Â Â Â Â Â sigDict[phfx+'Mustrain;i']Â =Â 2*(Mgam/Si+dsi)*Mgam*(1.-parmDict[phfx+'Mustrain;mx'])**2/ateln2 |
---|
2912 | Â Â Â Â Â Â sigDict[phfx+'Mustrain;a']Â =Â 2*(Mgam/Sa+dsa)*Mgam*(1.-parmDict[phfx+'Mustrain;mx'])**2/ateln2Â Â Â Â |
---|
2913 | Â Â Â Â else:Â Â Â Â #generalized - P.W. Stephens model OK |
---|
2914 | Â Â Â Â Â Â Strms =Â G2spc.MustrainCoeff(refl[:3],SGData) |
---|
2915 | Â Â Â Â Â Â const =Â 1.e-6*parmDict[hfx+'difC']*refl[4+im]**3 |
---|
2916 | Â Â Â Â Â Â Sum =Â 0 |
---|
2917 |       for i,strm in enumerate(Strms): |
---|
2918 | Â Â Â Â Â Â Â Â Sum +=Â parmDict[phfx+'Mustrain;'+str(i)]*strm |
---|
2919 | Â Â Â Â Â Â Â Â gamDict[phfx+'Mustrain;'+str(i)]Â =Â strm*parmDict[phfx+'Mustrain;mx']/2. |
---|
2920 | Â Â Â Â Â Â Â Â sigDict[phfx+'Mustrain;'+str(i)]Â =Â strm*(1.-parmDict[phfx+'Mustrain;mx'])**2 |
---|
2921 | Â Â Â Â Â Â Mgam =Â const*np.sqrt(Sum) |
---|
2922 |       for i in range(len(Strms)): |
---|
2923 | Â Â Â Â Â Â Â Â gamDict[phfx+'Mustrain;'+str(i)]Â *=Â Mgam/Sum |
---|
2924 | Â Â Â Â Â Â Â Â sigDict[phfx+'Mustrain;'+str(i)]Â *=Â const**2/ateln2Â Â Â Â |
---|
2925 | Â Â Â Â gamDict[phfx+'Mustrain;mx']Â =Â Mgam |
---|
2926 | Â Â Â Â sigDict[phfx+'Mustrain;mx']Â =Â -2.*Mgam**2*(1.-parmDict[phfx+'Mustrain;mx'])/ateln2 |
---|
2927 | Â Â Â Â |
---|
2928 |   return sigDict,gamDict |
---|
2929 | Â Â Â Â |
---|
2930 | def GetReflPos(refl,im,wave,A,pfx,hfx,calcControls,parmDict): |
---|
2931 | Â Â 'Needs a doc string' |
---|
2932 |   if im: |
---|
2933 | Â Â Â Â h,k,l,m =Â refl[:4] |
---|
2934 | Â Â Â Â vec =Â np.array([parmDict[pfx+'mV0'],parmDict[pfx+'mV1'],parmDict[pfx+'mV2']]) |
---|
2935 | Â Â Â Â d =Â 1./np.sqrt(G2lat.calc_rDsqSS(np.array([h,k,l,m]),A,vec)) |
---|
2936 | Â Â else: |
---|
2937 | Â Â Â Â h,k,l =Â refl[:3] |
---|
2938 | Â Â Â Â d =Â 1./np.sqrt(G2lat.calc_rDsq(np.array([h,k,l]),A)) |
---|
2939 | Â Â refl[4+im]Â =Â d |
---|
2940 |   if 'C' in calcControls[hfx+'histType']: |
---|
2941 | Â Â Â Â pos =Â 2.0*asind(wave/(2.0*d))+parmDict[hfx+'Zero'] |
---|
2942 | Â Â Â Â const =Â 9.e-2/(np.pi*parmDict[hfx+'Gonio. radius'])Â Â Â Â Â Â Â Â Â #shifts in microns |
---|
2943 |     if 'Bragg' in calcControls[hfx+'instType']: |
---|
2944 | Â Â Â Â Â Â pos -=Â const*(4.*parmDict[hfx+'Shift']*cosd(pos/2.0)+Â \ |
---|
2945 | Â Â Â Â Â Â Â Â parmDict[hfx+'Transparency']*sind(pos)*100.0)Â Â Â Â Â Â #trans(=1/mueff) in cm |
---|
2946 | Â Â Â Â else:Â Â Â Â Â Â Â Â #Debye-Scherrer - simple but maybe not right |
---|
2947 | Â Â Â Â Â Â pos -=Â const*(parmDict[hfx+'DisplaceX']*cosd(pos)+parmDict[hfx+'DisplaceY']*sind(pos)) |
---|
2948 |   elif 'T' in calcControls[hfx+'histType']: |
---|
2949 | Â Â Â Â pos =Â parmDict[hfx+'difC']*d+parmDict[hfx+'difA']*d**2+parmDict[hfx+'difB']/d+parmDict[hfx+'Zero'] |
---|
2950 | Â Â Â Â #do I need sample position effects - maybe? |
---|
2951 |   return pos |
---|
2952 | |
---|
2953 | def GetReflPosDerv(refl,im,wave,A,pfx,hfx,calcControls,parmDict): |
---|
2954 | Â Â 'Needs a doc string' |
---|
2955 | Â Â dpr =Â 180./np.pi |
---|
2956 |   if im: |
---|
2957 | Â Â Â Â h,k,l,m =Â refl[:4] |
---|
2958 | Â Â Â Â vec =Â np.array([parmDict[pfx+'mV0'],parmDict[pfx+'mV1'],parmDict[pfx+'mV2']]) |
---|
2959 | Â Â Â Â dstsq =Â G2lat.calc_rDsqSS(np.array([h,k,l,m]),A,vec) |
---|
2960 | Â Â Â Â h,k,l =Â [h+m*vec[0],k+m*vec[1],l+m*vec[2]]Â Â Â Â Â #do proj of hklm to hkl so dPdA & dPdV come out right |
---|
2961 | Â Â else: |
---|
2962 | Â Â Â Â m =Â 0 |
---|
2963 | Â Â Â Â h,k,l =Â refl[:3]Â Â Â Â |
---|
2964 | Â Â Â Â dstsq =Â G2lat.calc_rDsq(np.array([h,k,l]),A) |
---|
2965 | Â Â dst =Â np.sqrt(dstsq) |
---|
2966 | Â Â dsp =Â 1./dst |
---|
2967 |   if 'C' in calcControls[hfx+'histType']: |
---|
2968 | Â Â Â Â pos =Â refl[5+im]-parmDict[hfx+'Zero'] |
---|
2969 | Â Â Â Â const =Â dpr/np.sqrt(1.0-wave**2*dstsq/4.0) |
---|
2970 | Â Â Â Â dpdw =Â const*dst |
---|
2971 | Â Â Â Â dpdA =Â np.array([h**2,k**2,l**2,h*k,h*l,k*l])*const*wave/(2.0*dst) |
---|
2972 | Â Â Â Â dpdZ =Â 1.0 |
---|
2973 | Â Â Â Â dpdV =Â np.array([2.*h*A[0]+k*A[3]+l*A[4],2*k*A[1]+h*A[3]+l*A[5], |
---|
2974 | Â Â Â Â Â Â 2*l*A[2]+h*A[4]+k*A[5]])*m*const*wave/(2.0*dst) |
---|
2975 | Â Â Â Â shft =Â 9.e-2/(np.pi*parmDict[hfx+'Gonio. radius'])Â Â Â Â Â Â Â Â Â #shifts in microns |
---|
2976 |     if 'Bragg' in calcControls[hfx+'instType']: |
---|
2977 | Â Â Â Â Â Â dpdSh =Â -4.*shft*cosd(pos/2.0) |
---|
2978 | Â Â Â Â Â Â dpdTr =Â -shft*sind(pos)*100.0 |
---|
2979 |       return dpdA,dpdw,dpdZ,dpdSh,dpdTr,0.,0.,dpdV |
---|
2980 | Â Â Â Â else:Â Â Â Â Â Â Â Â #Debye-Scherrer - simple but maybe not right |
---|
2981 | Â Â Â Â Â Â dpdXd =Â -shft*cosd(pos) |
---|
2982 | Â Â Â Â Â Â dpdYd =Â -shft*sind(pos) |
---|
2983 |       return dpdA,dpdw,dpdZ,0.,0.,dpdXd,dpdYd,dpdV |
---|
2984 |   elif 'T' in calcControls[hfx+'histType']: |
---|
2985 | Â Â Â Â dpdA =Â -np.array([h**2,k**2,l**2,h*k,h*l,k*l])*parmDict[hfx+'difC']*dsp**3/2. |
---|
2986 | Â Â Â Â dpdZ =Â 1.0 |
---|
2987 | Â Â Â Â dpdDC =Â dsp |
---|
2988 | Â Â Â Â dpdDA =Â dsp**2 |
---|
2989 | Â Â Â Â dpdDB =Â 1./dsp |
---|
2990 | Â Â Â Â dpdV =Â np.array([2.*h*A[0]+k*A[3]+l*A[4],2*k*A[1]+h*A[3]+l*A[5], |
---|
2991 | Â Â Â Â Â Â 2*l*A[2]+h*A[4]+k*A[5]])*m*parmDict[hfx+'difC']*dsp**3/2. |
---|
2992 |     return dpdA,dpdZ,dpdDC,dpdDA,dpdDB,dpdV |
---|
2993 | Â Â Â Â Â Â |
---|
2994 | def GetHStrainShift(refl,im,SGData,phfx,hfx,calcControls,parmDict): |
---|
2995 | Â Â 'Needs a doc string' |
---|
2996 | Â Â laue =Â SGData['SGLaue'] |
---|
2997 | Â Â uniq =Â SGData['SGUniq'] |
---|
2998 | Â Â h,k,l =Â refl[:3] |
---|
2999 |   if laue in ['m3','m3m']: |
---|
3000 | Â Â Â Â Dij =Â parmDict[phfx+'D11']*(h**2+k**2+l**2)+Â \ |
---|
3001 | Â Â Â Â Â Â refl[4+im]**2*parmDict[phfx+'eA']*((h*k)**2+(h*l)**2+(k*l)**2)/(h**2+k**2+l**2)**2 |
---|
3002 |   elif laue in ['6/m','6/mmm','3m1','31m','3']: |
---|
3003 | Â Â Â Â Dij =Â parmDict[phfx+'D11']*(h**2+k**2+h*k)+parmDict[phfx+'D33']*l**2 |
---|
3004 |   elif laue in ['3R','3mR']: |
---|
3005 | Â Â Â Â Dij =Â parmDict[phfx+'D11']*(h**2+k**2+l**2)+parmDict[phfx+'D12']*(h*k+h*l+k*l) |
---|
3006 |   elif laue in ['4/m','4/mmm']: |
---|
3007 | Â Â Â Â Dij =Â parmDict[phfx+'D11']*(h**2+k**2)+parmDict[phfx+'D33']*l**2 |
---|
3008 |   elif laue in ['mmm']: |
---|
3009 | Â Â Â Â Dij =Â parmDict[phfx+'D11']*h**2+parmDict[phfx+'D22']*k**2+parmDict[phfx+'D33']*l**2 |
---|
3010 |   elif laue in ['2/m']: |
---|
3011 | Â Â Â Â Dij =Â parmDict[phfx+'D11']*h**2+parmDict[phfx+'D22']*k**2+parmDict[phfx+'D33']*l**2 |
---|
3012 |     if uniq == 'a': |
---|
3013 | Â Â Â Â Â Â Dij +=Â parmDict[phfx+'D23']*k*l |
---|
3014 |     elif uniq == 'b': |
---|
3015 | Â Â Â Â Â Â Dij +=Â parmDict[phfx+'D13']*h*l |
---|
3016 |     elif uniq == 'c': |
---|
3017 | Â Â Â Â Â Â Dij +=Â parmDict[phfx+'D12']*h*k |
---|
3018 | Â Â else: |
---|
3019 | Â Â Â Â Dij =Â parmDict[phfx+'D11']*h**2+parmDict[phfx+'D22']*k**2+parmDict[phfx+'D33']*l**2+Â \ |
---|
3020 | Â Â Â Â Â Â parmDict[phfx+'D12']*h*k+parmDict[phfx+'D13']*h*l+parmDict[phfx+'D23']*k*l |
---|
3021 |   if 'C' in calcControls[hfx+'histType']: |
---|
3022 |     return -180.*Dij*refl[4+im]**2*tand(refl[5+im]/2.0)/np.pi |
---|
3023 | Â Â else: |
---|
3024 |     return -Dij*parmDict[hfx+'difC']*refl[4+im]**2/2. |
---|
3025 | Â Â Â Â Â Â |
---|
3026 | def GetHStrainShiftDerv(refl,im,SGData,phfx,hfx,calcControls,parmDict): |
---|
3027 | Â Â 'Needs a doc string' |
---|
3028 | Â Â laue =Â SGData['SGLaue'] |
---|
3029 | Â Â uniq =Â SGData['SGUniq'] |
---|
3030 | Â Â h,k,l =Â refl[:3] |
---|
3031 |   if laue in ['m3','m3m']: |
---|
3032 | Â Â Â Â dDijDict =Â {phfx+'D11':h**2+k**2+l**2, |
---|
3033 | Â Â Â Â Â Â phfx+'eA':refl[4+im]**2*((h*k)**2+(h*l)**2+(k*l)**2)/(h**2+k**2+l**2)**2} |
---|
3034 |   elif laue in ['6/m','6/mmm','3m1','31m','3']: |
---|
3035 | Â Â Â Â dDijDict =Â {phfx+'D11':h**2+k**2+h*k,phfx+'D33':l**2} |
---|
3036 |   elif laue in ['3R','3mR']: |
---|
3037 | Â Â Â Â dDijDict =Â {phfx+'D11':h**2+k**2+l**2,phfx+'D12':h*k+h*l+k*l} |
---|
3038 |   elif laue in ['4/m','4/mmm']: |
---|
3039 | Â Â Â Â dDijDict =Â {phfx+'D11':h**2+k**2,phfx+'D33':l**2} |
---|
3040 |   elif laue in ['mmm']: |
---|
3041 | Â Â Â Â dDijDict =Â {phfx+'D11':h**2,phfx+'D22':k**2,phfx+'D33':l**2} |
---|
3042 |   elif laue in ['2/m']: |
---|
3043 | Â Â Â Â dDijDict =Â {phfx+'D11':h**2,phfx+'D22':k**2,phfx+'D33':l**2} |
---|
3044 |     if uniq == 'a': |
---|
3045 | Â Â Â Â Â Â dDijDict[phfx+'D23']Â =Â k*l |
---|
3046 |     elif uniq == 'b': |
---|
3047 | Â Â Â Â Â Â dDijDict[phfx+'D13']Â =Â h*l |
---|
3048 |     elif uniq == 'c': |
---|
3049 | Â Â Â Â Â Â dDijDict[phfx+'D12']Â =Â h*k |
---|
3050 | Â Â else: |
---|
3051 | Â Â Â Â dDijDict =Â {phfx+'D11':h**2,phfx+'D22':k**2,phfx+'D33':l**2, |
---|
3052 | Â Â Â Â Â Â phfx+'D12':h*k,phfx+'D13':h*l,phfx+'D23':k*l} |
---|
3053 |   if 'C' in calcControls[hfx+'histType']: |
---|
3054 |     for item in dDijDict: |
---|
3055 | Â Â Â Â Â Â dDijDict[item]Â *=Â 180.0*refl[4+im]**2*tand(refl[5+im]/2.0)/np.pi |
---|
3056 | Â Â else: |
---|
3057 |     for item in dDijDict: |
---|
3058 | Â Â Â Â Â Â dDijDict[item]Â *=Â -parmDict[hfx+'difC']*refl[4+im]**3/2. |
---|
3059 |   return dDijDict |
---|
3060 | Â Â |
---|
3061 | def GetDij(phfx,SGData,parmDict): |
---|
3062 |   HSvals = [parmDict[phfx+name] for name in G2spc.HStrainNames(SGData)] |
---|
3063 |   return G2spc.HStrainVals(HSvals,SGData) |
---|
3064 | Â Â Â Â Â Â Â Â |
---|
3065 | def GetFobsSq(Histograms,Phases,parmDict,calcControls): |
---|
3066 | Â Â '''Compute the observed structure factors for Powder histograms and store in reflection array |
---|
3067 | Â Â Multiprocessing support added |
---|
3068 | Â Â ''' |
---|
3069 |   if GSASIIpath.GetConfigValue('Show_timing',False): |
---|
3070 | Â Â Â Â starttime =Â time.time()Â #; print 'start GetFobsSq' |
---|
3071 | Â Â histoList =Â list(Histograms.keys()) |
---|
3072 | Â Â histoList.sort() |
---|
3073 | Â Â Ka2 =Â shl =Â lamRatio =Â kRatio =Â None |
---|
3074 |   for histogram in histoList: |
---|
3075 |     if 'PWDR' in histogram[:4]: |
---|
3076 | Â Â Â Â Â Â Histogram =Â Histograms[histogram] |
---|
3077 | Â Â Â Â Â Â hId =Â Histogram['hId'] |
---|
3078 | Â Â Â Â Â Â hfx =Â ':%d:'%(hId) |
---|
3079 | Â Â Â Â Â Â Limits =Â calcControls[hfx+'Limits'] |
---|
3080 |       if 'C' in calcControls[hfx+'histType']: |
---|
3081 | Â Â Â Â Â Â Â Â shl =Â max(parmDict[hfx+'SH/L'],0.0005) |
---|
3082 | Â Â Â Â Â Â Â Â Ka2 =Â False |
---|
3083 | Â Â Â Â Â Â Â Â kRatio =Â 0.0 |
---|
3084 |         if hfx+'Lam1' in list(parmDict.keys()): |
---|
3085 | Â Â Â Â Â Â Â Â Â Â Ka2 =Â True |
---|
3086 | Â Â Â Â Â Â Â Â Â Â lamRatio =Â 360*(parmDict[hfx+'Lam2']-parmDict[hfx+'Lam1'])/(np.pi*parmDict[hfx+'Lam1']) |
---|
3087 | Â Â Â Â Â Â Â Â Â Â kRatio =Â parmDict[hfx+'I(L2)/I(L1)'] |
---|
3088 | Â Â Â Â Â Â x,y,w,yc,yb,yd =Â Histogram['Data'] |
---|
3089 | Â Â Â Â Â Â xMask =Â ma.getmaskarray(x) |
---|
3090 | Â Â Â Â Â Â xB =Â np.searchsorted(x,Limits[0]) |
---|
3091 | Â Â Â Â Â Â xF =Â np.searchsorted(x,Limits[1]) |
---|
3092 | Â Â Â Â Â Â ymb =Â np.array(y-yb) |
---|
3093 | Â Â Â Â Â Â ymb =Â np.where(ymb,ymb,1.0) |
---|
3094 | Â Â Â Â Â Â ycmb =Â np.array(yc-yb) |
---|
3095 | Â Â Â Â Â Â ratio =Â 1./np.where(ycmb,ycmb/ymb,1.e10)Â Â Â Â Â |
---|
3096 | Â Â Â Â Â Â refLists =Â Histogram['Reflection Lists'] |
---|
3097 |       for phase in refLists: |
---|
3098 |         if phase not in Phases:   #skips deleted or renamed phases silently! |
---|
3099 | Â Â Â Â Â Â Â Â Â Â continue |
---|
3100 | Â Â Â Â Â Â Â Â Phase =Â Phases[phase] |
---|
3101 | Â Â Â Â Â Â Â Â im =Â 0 |
---|
3102 |         if Phase['General'].get('Modulated',False): |
---|
3103 | Â Â Â Â Â Â Â Â Â Â im =Â 1 |
---|
3104 | Â Â Â Â Â Â Â Â pId =Â Phase['pId'] |
---|
3105 | Â Â Â Â Â Â Â Â phfx =Â '%d:%d:'%(pId,hId) |
---|
3106 | Â Â Â Â Â Â Â Â refDict =Â refLists[phase] |
---|
3107 | Â Â Â Â Â Â Â Â sumFo =Â 0.0 |
---|
3108 | Â Â Â Â Â Â Â Â sumdF =Â 0.0 |
---|
3109 | Â Â Â Â Â Â Â Â sumFosq =Â 0.0 |
---|
3110 | Â Â Â Â Â Â Â Â sumdFsq =Â 0.0 |
---|
3111 | Â Â Â Â Â Â Â Â sumInt =Â 0.0 |
---|
3112 | Â Â Â Â Â Â Â Â nExcl =Â 0 |
---|
3113 | Â Â Â Â Â Â Â Â # test to see if we are using multiprocessing below |
---|
3114 | Â Â Â Â Â Â Â Â useMP,ncores =Â G2mp.InitMP() |
---|
3115 |         if len(refDict['RefList']) < 100: useMP = False    |
---|
3116 |         if useMP: # multiprocessing: create a set of initialized Python processes |
---|
3117 | Â Â Â Â Â Â Â Â Â Â MPpool =Â mp.Pool(G2mp.ncores,G2mp.InitFobsSqGlobals, |
---|
3118 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â [x,ratio,shl,xB,xF,im,lamRatio,kRatio,xMask,Ka2]) |
---|
3119 |           profArgs = [[] for i in range(G2mp.ncores)] |
---|
3120 | Â Â Â Â Â Â Â Â else: |
---|
3121 | Â Â Â Â Â Â Â Â Â Â G2mp.InitFobsSqGlobals(x,ratio,shl,xB,xF,im,lamRatio,kRatio,xMask,Ka2) |
---|
3122 |         if 'C' in calcControls[hfx+'histType']: |
---|
3123 | Â Â Â Â Â Â Â Â Â Â # are we multiprocessing? |
---|
3124 |           for iref,refl in enumerate(refDict['RefList']): |
---|
3125 |             if useMP: |
---|
3126 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â profArgs[iref%G2mp.ncores].append((refl,iref)) |
---|
3127 | Â Â Â Â Â Â Â Â Â Â Â Â else: |
---|
3128 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â icod=Â G2mp.ComputeFobsSqCW(refl,iref) |
---|
3129 |               if type(icod) is tuple: |
---|
3130 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â refl[8+im]Â =Â icod[0] |
---|
3131 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sumInt +=Â icod[1] |
---|
3132 |                 if parmDict[phfx+'LeBail']: refl[9+im] = refl[8+im] |
---|
3133 |               elif icod == -1: |
---|
3134 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â refl[3+im]Â *=Â -1 |
---|
3135 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â nExcl +=Â 1 |
---|
3136 |               elif icod == -2: |
---|
3137 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â break |
---|
3138 |           if useMP: |
---|
3139 |             for sInt,resList in MPpool.imap_unordered(G2mp.ComputeFobsSqCWbatch,profArgs): |
---|
3140 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â sumInt +=Â sInt |
---|
3141 |               for refl8im,irefl in resList: |
---|
3142 |                 if refl8im is None: |
---|
3143 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â refDict['RefList'][irefl][3+im]Â *=Â -1 |
---|
3144 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â nExcl +=Â 1 |
---|
3145 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â else: |
---|
3146 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â refDict['RefList'][irefl][8+im]Â =Â refl8im |
---|
3147 |                   if parmDict[phfx+'LeBail']: |
---|
3148 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â refDict['RefList'][irefl][9+im]Â =Â refDict['RefList'][irefl][8+im] |
---|
3149 |         elif 'T' in calcControls[hfx+'histType']: |
---|
3150 |           for iref,refl in enumerate(refDict['RefList']): |
---|
3151 |             if useMP: |
---|
3152 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â profArgs[iref%G2mp.ncores].append((refl,iref)) |
---|
3153 | Â Â Â Â Â Â Â Â Â Â Â Â else: |
---|
3154 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â icod=Â G2mp.ComputeFobsSqTOF(refl,iref) |
---|
3155 |               if type(icod) is tuple: |
---|
3156 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â refl[8+im]Â =Â icod[0] |
---|
3157 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sumInt +=Â icod[1] |
---|
3158 |                 if parmDict[phfx+'LeBail']: refl[9+im] = refl[8+im] |
---|
3159 |               elif icod == -1: |
---|
3160 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â refl[3+im]Â *=Â -1 |
---|
3161 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â nExcl +=Â 1 |
---|
3162 |               elif icod == -2: |
---|
3163 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â break |
---|
3164 |           if useMP: |
---|
3165 |             for sInt,resList in MPpool.imap_unordered(G2mp.ComputeFobsSqTOFbatch,profArgs): |
---|
3166 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â sumInt +=Â sInt |
---|
3167 |               for refl8im,irefl in resList: |
---|
3168 |                 if refl8im is None: |
---|
3169 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â refDict['RefList'][irefl][3+im]Â *=Â -1 |
---|
3170 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â nExcl +=Â 1 |
---|
3171 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â else: |
---|
3172 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â refDict['RefList'][irefl][8+im]Â =Â refl8im |
---|
3173 |                   if parmDict[phfx+'LeBail']: |
---|
3174 | Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â refDict['RefList'][irefl][9+im]Â =Â refDict['RefList'][irefl][8+im] |
---|
3175 |         if useMP: MPpool.terminate() |
---|
3176 | Â Â Â Â Â Â Â Â sumFo =Â 0.0 |
---|
3177 | Â Â Â Â Â Â Â Â sumdF =Â 0.0 |
---|
3178 | Â Â Â Â Â Â Â Â sumFosq =Â 0.0 |
---|
3179 | Â Â Â Â Â Â Â Â sumdFsq =Â 0.0 |
---|
3180 |         for iref,refl in enumerate(refDict['RefList']): |
---|
3181 | Â Â Â Â Â Â Â Â Â Â Fo =Â np.sqrt(np.abs(refl[8+im])) |
---|
3182 | Â Â Â Â Â Â Â Â Â Â Fc =Â np.sqrt(np.abs(refl[9]+im)) |
---|
3183 | Â Â Â Â Â Â Â Â Â Â sumFo +=Â Fo |
---|
3184 | Â Â Â Â Â Â Â Â Â Â sumFosq +=Â refl[8+im]**2 |
---|
3185 | Â Â Â Â Â Â Â Â Â Â sumdF +=Â np.abs(Fo-Fc) |
---|
3186 | Â Â Â Â Â Â Â Â Â Â sumdFsq +=Â (refl[8+im]-refl[9+im])**2 |
---|
3187 |         if sumFo: |
---|
3188 | Â Â Â Â Â Â Â Â Â Â Histogram['Residuals'][phfx+'Rf']Â =Â min(100.,(sumdF/sumFo)*100.) |
---|
3189 | Â Â Â Â Â Â Â Â Â Â Histogram['Residuals'][phfx+'Rf^2']Â |
---|