def eval_cross_section(interactionfile, spinfile, lattice, arg, tau_list, h_list, k_list, l_list, w_vect_list, direction, temperature, kmin, kmax, steps, eief, efixed=14.7): """ Calculates the cross_section given the following parameters: interactionfile, spinfile - files to get atom data lattice - Lattice object from tripleaxisproject arg - reduced list of operator combinations tau_list - list of tau position w_list - list of w's probed direction - direction of scan temp - temperature kmin - minimum value of k to scan kmax - maximum value of k to scan steps - number of steps between kmin, kmax eief - True if the energy scheme is Ei - Ef, False if it is Ef - Ei efixed - value of the fixed energy, either Ei or Ef """ # Read files, get atom_list and such atom_list, jnums, jmats, N_atoms_uc = readFiles(interactionfile, spinfile) N_atoms = len(atom_list) N = N_atoms # TEMPORARY TO OVERRIDE ATOM_LIST ABOVE # atom1 = atom(pos = [0.00,0,0], neighbors = [1], interactions = [0], int_cell = [0], # atomicNum = 26, valence = 3, spinRmatrix=spm.Matrix([[1, 0, 0],[0, 1, 0],[0, 0, 1]])) # atom2 = atom(pos = [0.25,0,0], neighbors = [0,2], interactions = [0], int_cell = [0], # atomicNum = 26, valence = 3, spinRmatrix=spm.Matrix([[1, 0, 0],[0, 1, 0],[0, 0, 1]])) # atom3 = atom(pos = [0.50,0,0], neighbors = [1,3], interactions = [0], int_cell = [0], # atomicNum = 26, valence = 3, spinRmatrix=spm.Matrix([[1, 0, 0],[0, 1, 0],[0, 0, 1]])) # atom4 = atom(pos = [0.75,0,0], neighbors = [2], interactions = [0], int_cell = [0], # atomicNum = 26, valence = 3, spinRmatrix=spm.Matrix([[1, 0, 0],[0, 1, 0],[0, 0, 1]])) # atom_list,N_atoms_uc = ([atom1, atom2, atom3, atom4],1) N_atoms = len(atom_list) # Get Hsave to calculate its eigenvalues (Hsave, charpoly, eigs) = calculate_dispersion(atom_list, N_atoms_uc, N_atoms, jmats, showEigs=True) print "Calculated: Dispersion Relation" # Generate kappa's from (h,k,l) kaprange = [] kapvect = [] if len(h_list) == len(k_list) == len(l_list): for i in range(len(h_list)): kappa = lattice.modvec(h_list[i], k_list[i], l_list[i], 'latticestar') kaprange.append(kappa[0]) kapvect.append(np.array([h_list[i], k_list[i], l_list[i]])) # kapvect.append(np.array([h_list[i]/kappa,k_list[i]/kappa,l_list[i]/kappa])) else: raise Exception('h,k,l not same lengths') # Generate q's from kappa and tau pqrange = [] mqrange = [] for tau in tau_list: ptemp = [] mtemp = [] for kap in kapvect: #tau = lattice.modvec(tau[0],tau[1],tau[2], 'latticestar') ptemp.append(kap - tau) mtemp.append(tau - kap) pqrange.append(ptemp) mqrange.append(mtemp) # Calculate w_q's using q qrange = [] # krange = [] wrange = [] if 1: # Change this later for set in pqrange: temp = [] temp1 = [] for q in set: eigs = calc_eigs(Hsave, q[0] * direction['kx'], q[1] * direction['ky'], q[2] * direction['kz']) # Take only one set of eigs. Should probably have a flag here. temp.append(eigs[0]) # krange.append(np.array([q*direction['kx'], q*direction['ky'], q*direction['kz']])) temp1.append(q) wrange.append(temp) qrange.append(temp1) print "Calculated: Eigenvalues" wrange = np.array(np.real(wrange)) qrange = np.array(np.real(qrange)) kaprange = np.array(np.real(kaprange)) print qrange.shape print wrange.shape print kaprange.shape # Calculate w (not _q) as well as kp/k w_calc = [] kpk = [] if eief == True: for tau in tau_list: temp = [] temp1 = [] for om in w_vect_list: temp.append(om - efixed) temp1.append(np.sqrt(om / efixed)) w_calc.append(temp) kpk.append(temp1) else: for tau in tau_list: temp = [] temp1 = [] for om in w_vect_list: temp.append(-(om - efixed)) temp1.append(np.sqrt(efixed / om)) w_calc.append(temp) kpk.append(temp1) w_calc = np.array(np.real(w_calc)) # Grab Form Factors ff_list = [] s = sp.Symbol('s') for i in range(N_atoms): el = elements[atom_list[i].atomicNum] val = atom_list[i].valence if val != None: Mq = el.magnetic_ff[val].M_Q(kaprange) else: Mq = el.magnetic_ff[0].M_Q(kaprange) ff_list.append(Mq) print "Calculated: Form Factors" # Other Constants gamr0 = 2 * 0.2695 * 10**(-12) #sp.Symbol('gamma', commutative = True) hbar = 1.0 # 1.05457148*10**(-34) #sp.Symbol('hbar', commutative = True) g = 2. #sp.Symbol('g', commutative = True) # Kappa vector kap = sp.Symbol( 'kappa', real=True ) #spm.Matrix([sp.Symbol('kapx',real = True),sp.Symbol('kapy',real = True),sp.Symbol('kapz',real = True)]) t = sp.Symbol('t', real=True) w = sp.Symbol('w', real=True) W = sp.Symbol('W', real=True) tau = sp.Symbol('tau', real=True) q = sp.Symbol('q', real=True) L = sp.Symbol('L', real=True) boltz = 1. #1.3806503*10**(-23) # Wilds for sub_in method A = sp.Wild('A', exclude=[0, t]) B = sp.Wild('B', exclude=[0, t]) C = sp.Wild('C') D = sp.Wild('D') K = sp.Wild('K') # First the exponentials are turned into delta functions: for i in range(len(arg)): for j in range(N): print '1', arg[i][j] arg[i][j] = sp.powsimp( arg[i] [j]) #sp.powsimp(arg[i][j], deep = True, combine = 'all') arg[i][j] = ( arg[i][j] * exp(-I * w * t) * exp(I * kap * L)).expand( ) # * exp(I*inner_prod(spm.Matrix(atom_list[j].pos).T,kap)) arg[i][j] = sp.powsimp( arg[i] [j]) #sp.powsimp(arg[i][j], deep = True, combine = 'all') # print '2', arg[i][j] arg[i][j] = sub_in( arg[i][j], exp(I * t * A + I * t * B + I * C + I * D + I * K), sp.DiracDelta(A * t + B * t + C + D + K)) #*sp.DiracDelta(C)) # print '3', arg[i][j] arg[i][j] = sub_in( arg[i][j], sp.DiracDelta(A * t + B * t + C * L + D * L + K * L), sp.DiracDelta(A * hbar + B * hbar) * sp.simplify(sp.DiracDelta(C + D + K + tau))) # print '4', arg[i][j] arg[i][j] = sub_in(arg[i][j], sp.DiracDelta(-A - B) * sp.DiracDelta(C), sp.DiracDelta(A + B) * sp.DiracDelta(C)) print '5', arg[i][j] print "Applied: Delta Function Conversion" # Grabs the unit vectors from the back of the lists. unit_vect = [] kapxhat = sp.Symbol('kapxhat', commutative=False) kapyhat = sp.Symbol('kapyhat', commutative=False) kapzhat = sp.Symbol('kapzhat', commutative=False) for i in range(len(arg)): unit_vect.append(arg[i].pop()) # Subs the actual values for kx,ky,kz, omega_q and n_q into the operator combos # The result is basically a nested list: # # csdata = [ op combos ] # op combos = [ one combo per atom ] # 1 per atom = [ evaluated exp ] # csdata = [] for i in range(len(arg)): temp1 = [] for j in range(len(arg[i])): temp2 = [] for k in range(len(tau_list)): temp3 = [] print i, j, k for g in range(len(qrange[k])): pvalue = tau_list[k] + kapvect[g] + qrange[k][g] mvalue = tau_list[k] + kapvect[g] - qrange[k][g] if pvalue[0] == 0 and pvalue[1] == 0 and pvalue[2] == 0: arg[i][j] = arg[i][j].subs( sp.DiracDelta(kap + tau + q), sp.DiracDelta(0)) else: arg[i][j] = arg[i][j].subs( sp.DiracDelta(kap + tau + q), 0) if mvalue[0] == 0 and mvalue[1] == 0 and mvalue[2] == 0: arg[i][j] = arg[i][j].subs( sp.DiracDelta(kap + tau - q), sp.DiracDelta(0)) else: arg[i][j] = arg[i][j].subs( sp.DiracDelta(kap + tau - q), 0) wq = sp.Symbol('wq', real=True) nq = sp.Symbol('n%i' % (k, ), commutative=False) arg[i][j] = arg[i][j].subs(wq, wrange[k][g]) arg[i][j] = arg[i][j].subs(w, w_calc[k][g]) n = sp.Pow( sp.exp(hbar * wrange[k][g] / boltz * temperature) - 1, -1) arg[i][j] = arg[i][j].subs(nq, n) temp3.append(arg[i][j]) temp2.append(temp3) temp1.append(temp2) csdata.append(temp1) ## print arg[i][j] # for g in range(len(kaprange)): # arg[i][j] = arg[i][j].subs(kap, kaprange[g]) # for g in range(len(krange)): ## print 'calculating' # temp3 = [] # wg = sp.Symbol('w%i'%(g,), real = True) # ng = sp.Symbol('n%i'%(g,), commutative = False) ## kx = sp.Symbol('kx', real = True, commutative = True) ## ky = sp.Symbol('ky', real = True, commutative = True) ## kz = sp.Symbol('kz', real = True, commutative = True) ## arg[i][j] = arg[i][j].subs(kx,krange[g][0]) ## arg[i][j] = arg[i][j].subs(ky,krange[g][1]) ## arg[i][j] = arg[i][j].subs(kz,krange[g][2]) # arg[i][j] = arg[i][j].subs(wg,wrange[g]) # arg[i][j] = arg[i][j].subs(w,w_calc[g]) # nq = sp.Pow( sp.exp(hbar*wrange[g]/boltz*temp) - 1 ,-1) # arg[i][j] = arg[i][j].subs(ng,nq) ## arg[i][j] = arg[i][j].subs(tau,tau_list[0]) # # temp3.append(arg[i][j]) ## print arg[i][j] # temp2.append(temp3) ## print arg[i][j] # csdata.append(temp2) print csdata # Front constants and stuff for the cross-section front_constant = 1.0 # (gamr0)**2/(2*pi*hbar) front_func = (1. / 2.) * g #*F(k) vanderwaals = 1. #exp(-2*W) csrange = [] if 1: temp1 = [] temp2 = [] for q in range(len(qrange)): print 'calculating' for ii in range(len(csdata)): for jj in range(len(csdata[ii])): temp1.append(csdata[ii][jj]) # Put on gamr0, 2pi hbar, form factor, kp/k, vanderwaals first dif = front_func**2 * front_constant # * kpk[q][0] * vanderwaals * ff_list[0][q] # for vect in unit_vect: # vect.subs(kapxhat,kapvect[q][0][0]) # vect.subs(kapyhat,kapvect[q][1][0]) # vect.subs(kapzhat,kapvect[q][2][0]) print 'diff', dif print 'temp1', temp1 print sum(temp1) dif = (dif * sum(temp1)) # * sum(unit_vect))#.expand() csrange.append(dif) print "Calculated: Cross-section" csrange = np.real(csrange) csrange = np.array(csrange) xi = qrange yi = wrange zi = csrange Z = np.zeros((xi.shape[0], yi.shape[0])) Z[range(len(xi)), range(len(yi))] = zi pylab.contourf(xi, yi, Z) pylab.colorbar() pylab.show()
def eval_cross_section(interactionfile, spinfile, lattice, arg, tau_list, h_list, k_list, l_list, w_vect_list, direction, temperature, kmin, kmax, steps, eief, efixed = 14.7): """ Calculates the cross_section given the following parameters: interactionfile, spinfile - files to get atom data lattice - Lattice object from tripleaxisproject arg - reduced list of operator combinations tau_list - list of tau position w_list - list of w's probed direction - direction of scan temp - temperature kmin - minimum value of k to scan kmax - maximum value of k to scan steps - number of steps between kmin, kmax eief - True if the energy scheme is Ei - Ef, False if it is Ef - Ei efixed - value of the fixed energy, either Ei or Ef """ # Read files, get atom_list and such atom_list, jnums, jmats,N_atoms_uc=readFiles(interactionfile,spinfile) N_atoms = len(atom_list) N = N_atoms # TEMPORARY TO OVERRIDE ATOM_LIST ABOVE # atom1 = atom(pos = [0.00,0,0], neighbors = [1], interactions = [0], int_cell = [0], # atomicNum = 26, valence = 3, spinRmatrix=spm.Matrix([[1, 0, 0],[0, 1, 0],[0, 0, 1]])) # atom2 = atom(pos = [0.25,0,0], neighbors = [0,2], interactions = [0], int_cell = [0], # atomicNum = 26, valence = 3, spinRmatrix=spm.Matrix([[1, 0, 0],[0, 1, 0],[0, 0, 1]])) # atom3 = atom(pos = [0.50,0,0], neighbors = [1,3], interactions = [0], int_cell = [0], # atomicNum = 26, valence = 3, spinRmatrix=spm.Matrix([[1, 0, 0],[0, 1, 0],[0, 0, 1]])) # atom4 = atom(pos = [0.75,0,0], neighbors = [2], interactions = [0], int_cell = [0], # atomicNum = 26, valence = 3, spinRmatrix=spm.Matrix([[1, 0, 0],[0, 1, 0],[0, 0, 1]])) # atom_list,N_atoms_uc = ([atom1, atom2, atom3, atom4],1) N_atoms = len(atom_list) # Get Hsave to calculate its eigenvalues (Hsave, charpoly, eigs) = calculate_dispersion(atom_list,N_atoms_uc,N_atoms,jmats,showEigs=True) print "Calculated: Dispersion Relation" # Generate kappa's from (h,k,l) kaprange = [] kapvect = [] if len(h_list) == len(k_list) == len(l_list): for i in range(len(h_list)): kappa = lattice.modvec(h_list[i],k_list[i],l_list[i], 'latticestar') kaprange.append(kappa[0]) kapvect.append(np.array([h_list[i],k_list[i],l_list[i]])) # kapvect.append(np.array([h_list[i]/kappa,k_list[i]/kappa,l_list[i]/kappa])) else: raise Exception('h,k,l not same lengths') # Generate q's from kappa and tau pqrange = [] mqrange = [] for tau in tau_list: ptemp = [] mtemp = [] for kap in kapvect: #tau = lattice.modvec(tau[0],tau[1],tau[2], 'latticestar') ptemp.append(kap - tau) mtemp.append(tau - kap) pqrange.append(ptemp) mqrange.append(mtemp) # Calculate w_q's using q qrange = [] # krange = [] wrange = [] if 1: # Change this later for set in pqrange: temp = [] temp1 = [] for q in set: eigs = calc_eigs(Hsave,q[0]*direction['kx'], q[1]*direction['ky'], q[2]*direction['kz']) # Take only one set of eigs. Should probably have a flag here. temp.append(eigs[0]) # krange.append(np.array([q*direction['kx'], q*direction['ky'], q*direction['kz']])) temp1.append(q) wrange.append(temp) qrange.append(temp1) print "Calculated: Eigenvalues" wrange=np.array(np.real(wrange)) qrange=np.array(np.real(qrange)) kaprange=np.array(np.real(kaprange)) print qrange.shape print wrange.shape print kaprange.shape # Calculate w (not _q) as well as kp/k w_calc = [] kpk = [] if eief == True: for tau in tau_list: temp = [] temp1 = [] for om in w_vect_list: temp.append(om - efixed) temp1.append(np.sqrt(om/efixed)) w_calc.append(temp) kpk.append(temp1) else: for tau in tau_list: temp = [] temp1 = [] for om in w_vect_list: temp.append(-(om - efixed)) temp1.append(np.sqrt(efixed/om)) w_calc.append(temp) kpk.append(temp1) w_calc = np.array(np.real(w_calc)) # Grab Form Factors ff_list = [] s = sp.Symbol('s') for i in range(N_atoms): el = elements[atom_list[i].atomicNum] val = atom_list[i].valence if val != None: Mq = el.magnetic_ff[val].M_Q(kaprange) else: Mq = el.magnetic_ff[0].M_Q(kaprange) ff_list.append(Mq) print "Calculated: Form Factors" # Other Constants gamr0 = 2*0.2695*10**(-12) #sp.Symbol('gamma', commutative = True) hbar = 1.0 # 1.05457148*10**(-34) #sp.Symbol('hbar', commutative = True) g = 2.#sp.Symbol('g', commutative = True) # Kappa vector kap = sp.Symbol('kappa', real = True)#spm.Matrix([sp.Symbol('kapx',real = True),sp.Symbol('kapy',real = True),sp.Symbol('kapz',real = True)]) t = sp.Symbol('t', real = True) w = sp.Symbol('w', real = True) W = sp.Symbol('W', real = True) tau = sp.Symbol('tau', real = True) q = sp.Symbol('q', real = True) L = sp.Symbol('L', real = True) boltz = 1.#1.3806503*10**(-23) # Wilds for sub_in method A = sp.Wild('A',exclude = [0,t]) B = sp.Wild('B',exclude = [0,t]) C = sp.Wild('C') D = sp.Wild('D') K = sp.Wild('K') # First the exponentials are turned into delta functions: for i in range(len(arg)): for j in range(N): print '1', arg[i][j] arg[i][j] = sp.powsimp(arg[i][j])#sp.powsimp(arg[i][j], deep = True, combine = 'all') arg[i][j] = (arg[i][j] * exp(-I*w*t) * exp(I*kap*L)).expand()# * exp(I*inner_prod(spm.Matrix(atom_list[j].pos).T,kap)) arg[i][j] = sp.powsimp(arg[i][j])#sp.powsimp(arg[i][j], deep = True, combine = 'all') # print '2', arg[i][j] arg[i][j] = sub_in(arg[i][j],exp(I*t*A + I*t*B + I*C + I*D + I*K),sp.DiracDelta(A*t + B*t + C + D + K))#*sp.DiracDelta(C)) # print '3', arg[i][j] arg[i][j] = sub_in(arg[i][j],sp.DiracDelta(A*t + B*t + C*L + D*L + K*L),sp.DiracDelta(A*hbar + B*hbar)*sp.simplify(sp.DiracDelta(C + D + K + tau))) # print '4', arg[i][j] arg[i][j] = sub_in(arg[i][j],sp.DiracDelta(-A - B)*sp.DiracDelta(C),sp.DiracDelta(A + B)*sp.DiracDelta(C)) print '5', arg[i][j] print "Applied: Delta Function Conversion" # Grabs the unit vectors from the back of the lists. unit_vect = [] kapxhat = sp.Symbol('kapxhat',commutative = False) kapyhat = sp.Symbol('kapyhat',commutative = False) kapzhat = sp.Symbol('kapzhat',commutative = False) for i in range(len(arg)): unit_vect.append(arg[i].pop()) # Subs the actual values for kx,ky,kz, omega_q and n_q into the operator combos # The result is basically a nested list: # # csdata = [ op combos ] # op combos = [ one combo per atom ] # 1 per atom = [ evaluated exp ] # csdata = [] for i in range(len(arg)): temp1 = [] for j in range(len(arg[i])): temp2 = [] for k in range(len(tau_list)): temp3 = [] print i,j,k for g in range(len(qrange[k])): pvalue = tau_list[k] + kapvect[g] + qrange[k][g] mvalue = tau_list[k] + kapvect[g] - qrange[k][g] if pvalue[0] == 0 and pvalue[1] == 0 and pvalue[2] == 0: arg[i][j] = arg[i][j].subs(sp.DiracDelta(kap+tau+q),sp.DiracDelta(0)) else: arg[i][j] = arg[i][j].subs(sp.DiracDelta(kap+tau+q),0) if mvalue[0] == 0 and mvalue[1] == 0 and mvalue[2] == 0: arg[i][j] = arg[i][j].subs(sp.DiracDelta(kap+tau-q),sp.DiracDelta(0)) else: arg[i][j] = arg[i][j].subs(sp.DiracDelta(kap+tau-q),0) wq = sp.Symbol('wq', real = True) nq = sp.Symbol('n%i'%(k,), commutative = False) arg[i][j] = arg[i][j].subs(wq,wrange[k][g]) arg[i][j] = arg[i][j].subs(w,w_calc[k][g]) n = sp.Pow( sp.exp(hbar*wrange[k][g]/boltz*temperature) - 1 ,-1) arg[i][j] = arg[i][j].subs(nq,n) temp3.append(arg[i][j]) temp2.append(temp3) temp1.append(temp2) csdata.append(temp1) ## print arg[i][j] # for g in range(len(kaprange)): # arg[i][j] = arg[i][j].subs(kap, kaprange[g]) # for g in range(len(krange)): ## print 'calculating' # temp3 = [] # wg = sp.Symbol('w%i'%(g,), real = True) # ng = sp.Symbol('n%i'%(g,), commutative = False) ## kx = sp.Symbol('kx', real = True, commutative = True) ## ky = sp.Symbol('ky', real = True, commutative = True) ## kz = sp.Symbol('kz', real = True, commutative = True) ## arg[i][j] = arg[i][j].subs(kx,krange[g][0]) ## arg[i][j] = arg[i][j].subs(ky,krange[g][1]) ## arg[i][j] = arg[i][j].subs(kz,krange[g][2]) # arg[i][j] = arg[i][j].subs(wg,wrange[g]) # arg[i][j] = arg[i][j].subs(w,w_calc[g]) # nq = sp.Pow( sp.exp(hbar*wrange[g]/boltz*temp) - 1 ,-1) # arg[i][j] = arg[i][j].subs(ng,nq) ## arg[i][j] = arg[i][j].subs(tau,tau_list[0]) # # temp3.append(arg[i][j]) ## print arg[i][j] # temp2.append(temp3) ## print arg[i][j] # csdata.append(temp2) print csdata # Front constants and stuff for the cross-section front_constant = 1.0 # (gamr0)**2/(2*pi*hbar) front_func = (1./2.)*g#*F(k) vanderwaals = 1. #exp(-2*W) csrange = [] if 1: temp1 = [] temp2 = [] for q in range(len(qrange)): print 'calculating' for ii in range(len(csdata)): for jj in range(len(csdata[ii])): temp1.append(csdata[ii][jj]) # Put on gamr0, 2pi hbar, form factor, kp/k, vanderwaals first dif = front_func**2 * front_constant# * kpk[q][0] * vanderwaals * ff_list[0][q] # for vect in unit_vect: # vect.subs(kapxhat,kapvect[q][0][0]) # vect.subs(kapyhat,kapvect[q][1][0]) # vect.subs(kapzhat,kapvect[q][2][0]) print 'diff',dif print 'temp1',temp1 print sum(temp1) dif = (dif * sum(temp1))# * sum(unit_vect))#.expand() csrange.append(dif) print "Calculated: Cross-section" csrange=np.real(csrange) csrange=np.array(csrange) xi=qrange yi=wrange zi=csrange Z=np.zeros((xi.shape[0],yi.shape[0])) Z[range(len(xi)),range(len(yi))]=zi pylab.contourf(xi,yi,Z) pylab.colorbar() pylab.show()
def generate_cross_section(atom_list, arg, q, real_list, recip_list): """Generates the Cross-Section Formula for the one magnon case""" N = len(atom_list) gam = 1.913 #sp.Symbol('gamma', commutative = True) r = sp.Symbol('r0', commutative=True) h = 1. # 1.05457148*10**(-34) #sp.Symbol('hbar', commutative = True) k = sp.Symbol('k', commutative=True) kp = sp.Symbol('kp', commutative=True) g = sp.Symbol('g', commutative=True) F = sp.Function('F') def FF(arg): F = sp.Function('F') if arg.shape == (3, 1) or arg.shape == (1, 3): return sp.Symbol("%r" % (F(arg.tolist()), ), commutative=False) kap = spm.Matrix([ sp.Symbol('kapx', commutative=False), sp.Symbol('kapy', commutative=False), sp.Symbol('kapz', commutative=False) ]) t = sp.Symbol('t', commutative=True) w = sp.Symbol('w', commutative=True) W = sp.Symbol('W', commutative=False) kappa = sp.Symbol('kappa', commutative=False) tau = sp.Symbol('tau', commutative=False) # Wilds for sub_in method A = sp.Wild('A', exclude=[0]) B = sp.Wild('B', exclude=[0]) C = sp.Wild('C') D = sp.Wild('D') front_constant = (gam * r)**2 / (2 * pi * h) * (kp / k) * N front_func = (1. / 2.) * g #*F(k) vanderwaals = exp(-2 * W) temp2 = [] temp3 = [] temp4 = [] # Grabs the unit vectors from the back of the lists. unit_vect = [] kapx = sp.Symbol('kapxhat', ) kapy = sp.Symbol('kapyhat', commutative=False) kapz = sp.Symbol('kapzhat', commutative=False) for i in range(len(arg)): unit_vect.append(arg[i].pop()) # for ele in unit_vect: # ele = ele.subs(kapx,spm.Matrix([1,0,0])) # ele = ele.subs(kapy,spm.Matrix([0,1,0])) # ele = ele.subs(kapz,spm.Matrix([0,0,1])) # This is were the heart of the calculation comes in. # First the exponentials are turned into delta functions: for i in range(len(arg)): for j in range(N): arg[i][j] = sp.powsimp(arg[i][j], deep=True, combine='all') arg[i][j] = arg[i][j] * exp(-I * w * t) * exp( I * inner_prod(spm.Matrix(atom_list[j].pos).T, kap)) arg[i][j] = sp.powsimp(arg[i][j], deep=True, combine='all') arg[i][j] = sub_in(arg[i][j], exp(I * t * A + I * t * B + C), sp.DiracDelta(A * t + B * t + C / I)) #*sp.DiracDelta(C)) arg[i][j] = sub_in( arg[i][j], sp.DiracDelta(A * t + B * t + C), sp.DiracDelta(A * h + B * h) * sp.DiracDelta(C + tau)) arg[i][j] = sub_in(arg[i][j], sp.DiracDelta(-A - B), sp.DiracDelta(A + B)) print arg[i][j] print "Applied: Delta Function Conversion" # for ele in arg: # for subele in ele: # temp2.append(subele) # temp3.append(sum(temp2)) # # for i in range(len(temp3)): # temp4.append(unit_vect[i] * temp3[i]) for k in range(len(arg)): temp4.append(arg[k][q]) dif = (front_func**2 * front_constant * vanderwaals * sum(temp4) ) #.expand()#sp.simplify(sum(temp4))).expand() print "Complete: Cross-section Calculation" return dif
def generate_cross_section(atom_list, arg, q, real_list, recip_list): """Generates the Cross-Section Formula for the one magnon case""" N = len(atom_list) gam = 1.913 #sp.Symbol('gamma', commutative = True) r = sp.Symbol('r0', commutative = True) h = 1. # 1.05457148*10**(-34) #sp.Symbol('hbar', commutative = True) k = sp.Symbol('k', commutative = True) kp = sp.Symbol('kp', commutative = True) g = sp.Symbol('g', commutative = True) F = sp.Function('F') def FF(arg): F = sp.Function('F') if arg.shape == (3,1) or arg.shape == (1,3): return sp.Symbol("%r"%(F(arg.tolist()),),commutative = False) kap = spm.Matrix([sp.Symbol('kapx',commutative = False),sp.Symbol('kapy',commutative = False),sp.Symbol('kapz',commutative = False)]) t = sp.Symbol('t', commutative = True) w = sp.Symbol('w', commutative = True) W = sp.Symbol('W', commutative = False) kappa = sp.Symbol('kappa', commutative = False) tau = sp.Symbol('tau', commutative = False) # Wilds for sub_in method A = sp.Wild('A',exclude = [0]); B = sp.Wild('B',exclude = [0]); C = sp.Wild('C'); D = sp.Wild('D'); front_constant = (gam*r)**2/(2*pi*h)*(kp/k)*N front_func = (1./2.)*g#*F(k) vanderwaals = exp(-2*W) temp2 = [] temp3 = [] temp4 = [] # Grabs the unit vectors from the back of the lists. unit_vect = [] kapx = sp.Symbol('kapxhat',) kapy = sp.Symbol('kapyhat',commutative = False) kapz = sp.Symbol('kapzhat',commutative = False) for i in range(len(arg)): unit_vect.append(arg[i].pop()) # for ele in unit_vect: # ele = ele.subs(kapx,spm.Matrix([1,0,0])) # ele = ele.subs(kapy,spm.Matrix([0,1,0])) # ele = ele.subs(kapz,spm.Matrix([0,0,1])) # This is were the heart of the calculation comes in. # First the exponentials are turned into delta functions: for i in range(len(arg)): for j in range(N): arg[i][j] = sp.powsimp(arg[i][j], deep = True, combine = 'all') arg[i][j] = arg[i][j] * exp(-I*w*t) * exp(I*inner_prod(spm.Matrix(atom_list[j].pos).T,kap)) arg[i][j] = sp.powsimp(arg[i][j], deep = True, combine = 'all') arg[i][j] = sub_in(arg[i][j],exp(I*t*A + I*t*B + C),sp.DiracDelta(A*t + B*t + C/I))#*sp.DiracDelta(C)) arg[i][j] = sub_in(arg[i][j],sp.DiracDelta(A*t + B*t + C),sp.DiracDelta(A*h + B*h)*sp.DiracDelta(C + tau)) arg[i][j] = sub_in(arg[i][j],sp.DiracDelta(-A - B),sp.DiracDelta(A + B)) print arg[i][j] print "Applied: Delta Function Conversion" # for ele in arg: # for subele in ele: # temp2.append(subele) # temp3.append(sum(temp2)) # # for i in range(len(temp3)): # temp4.append(unit_vect[i] * temp3[i]) for k in range(len(arg)): temp4.append(arg[k][q]) dif = (front_func**2 * front_constant * vanderwaals * sum(temp4))#.expand()#sp.simplify(sum(temp4))).expand() print "Complete: Cross-section Calculation" return dif