From fff04e14dc05bed1713c39623d2950738be79e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matheus=20M=C3=BCller?= Date: Wed, 28 Mar 2012 14:24:18 -0300 Subject: [PATCH] Calculo por metodo de camadas operacional --- numerical.py | 99 +- numerical.pyc | Bin 5140 -> 7465 bytes temp.sim | 2998 ++++++++++++++++++++++++------------------------- 3 files changed, 1597 insertions(+), 1500 deletions(-) diff --git a/numerical.py b/numerical.py index d996e2c..5eae573 100644 --- a/numerical.py +++ b/numerical.py @@ -7,6 +7,7 @@ from pylab import * from numpy import nan_to_num, zeros from scipy.special import i1 from Ewindow import Edict +from layers import Ldict PI=math.pi @@ -172,4 +173,100 @@ def spectro(p, modelo, ion, OFlabentries, LScontrol, CGausscontrol): #################################################################################################################################################### def spectrolayer(p, modelo, ion, OFlabentries, LScontrol, CGausscontrol): - return 0 + + EPasso = float(OFlabentries[16].get()) + passox = float(OFlabentries[17].get()) + e = arange(float(OFlabentries[14].get()), float(OFlabentries[15].get()), EPasso) + resol = float(OFlabentries[13].get()) + X = e*0. + dose = 12e34 + gshift=0. + antizerodiv=0. + + Theta_s = PI - (p['Theta_in'] + p['Theta_out'])*PI/180 + mi = ion['mass'] + + for camada in Ldict: + + ## Calcula o espectro de cada elemento da amostra + for componente in range(len(camada.Elements)): + + mt = camada.Elements[componente]['mass'] + c = float(camada.Spinboxes[componente].get()) + alpha_lineshape = camada.Elements[componente]['LineShape'] + dedx = float(camada.LandE[4].get()) + dW2dx = float(camada.LandE[5].get()) + + k = ((sqrt (mt**2+mi**2*(sin(Theta_s)**2)) + mi*cos(Theta_s) ) / (mi+mt) )**2 + dedxef=dedx*(k/cos(p['Theta_in']*PI/180.) + 1/cos(p['Theta_out']*PI/180.)) + dw2dxef=dW2dx*(k**2./cos(p['Theta_in']*PI/180.)+1./cos(p['Theta_out']*PI/180.)) + + sinalbessel = e*0 + sinalgaussiana = e*0 + + xinit = float(camada.LandE[6].get()) + xfinal = float(camada.LandE[7].get()) + if xinit == 0: + antizerodiv = passox + else: + antizerodiv = 0 + + # Calcula a contribuição de cada camada + for x in arange(xinit+antizerodiv, xfinal, passox): + + # Seção de choque - CSRf(Z1, Z2, Ein, M1, M2, Theta): + CS = c*k*CSRf(ion['Z'], camada.Elements[componente]['Z'], k*p['E0']-dedxef*x, mi, mt, Theta_s)*passox + # É multiplicada pelo passo para manter a escala do gráfico independente do mesmo. + + # Bessel: + # Ainda falta incluir a delta de Dirac na origem + # Existe um valor máximo em energia no qual a função de Bessel pode ser computada em função + # da precisão numérica. Uma possível solução pode ser trabalhar em outras unidades que não + # resultem em argumentos tão grandes para a função exponencial. + # Também temos um problema com a primeira camada, que tem profundidade zero. + # Perceba que os cálculos de Bessel correspondentes às camadas mais fundas estão truncados + # para uma perda de energia maior que 25 keV. (Observado com Theta_in=70, para x > 30) + if modelo == 'bessel': + alpha=dedxef*(2./dw2dxef) + m=alpha*dedxef + lbd=m*x*alpha + besselcamada = lbd*exp(-m*x-alpha*(k*p['E0']-e))*i1(2.*sqrt(lbd*(k*p['E0']-e)))/(sqrt(lbd*(k*p['E0']-e))) + sinalbessel = besselcamada*CS+sinalbessel + + # Gaussiana: + elif modelo == 'gaussiana': + Em=k*p['E0']-x*dedxef + sigma=x*dw2dxef + gaussianacamada = exp((-(e-Em)**2)/(2.*sigma))/sqrt(2.*PI*sigma) + sinalgaussiana = gaussianacamada*CS+sinalgaussiana + + if modelo == 'bessel': + besself = nan_to_num(sinalbessel) + if LScontrol == 1: + besself = convoluiF0(besself, alpha_lineshape, EPasso) + X = besself + X + linecolor='r' + + elif modelo == 'gaussiana': + if LScontrol == 1: + sinalgaussiana = convoluiF0(sinalgaussiana, alpha_lineshape, EPasso) + X = sinalgaussiana + X + linecolor='b' + + if CGausscontrol == 1: + X, gshift = convoluiGauss(X,resol/2.35482,EPasso) + plt.plot(e-gshift,X*dose, linecolor) + ylim([0,max(X*dose)*1.1]) + suptitle('Signal received', fontsize=12) + xlabel("Enegy (eV)") + ylabel("Yield") + + data2 = open('temp.sim', 'w') + for i in range(len(X)): + print>>data2, e[i]-gshift,X[i]*dose + data2.close() + + show() + +#################################################################################################################################################### +#################################################################################################################################################### diff --git a/numerical.pyc b/numerical.pyc index fdba739b919b388bcecbb6677cd776309973da51..b32c21004b6cc2924b94d8b8a20f880269c2db72 100644 GIT binary patch delta 2721 zcmaJ@+iw(A82`?+-R^F??OtYY-QIwDM%3kPk{=8xG>vgpxw6YD8{~3#Zda!o%g0%j+@jHXN*0@>Ncft{Iy5w?LmLhUGBB~q}w?|I*iW8F8MNY@W z={Ac#al&TNFHXcP;^IWjA|XzXStP~jmHA@q=B>j$MFksP7vS(`zpX13-*BwkO64|2 zJD*m^~JZV0GncF^XTE*%X*}E6XLFBP~xDXx#3~ zt3u<4u0^$bej8-#w zdWbO5SnJmzx~bC}-}cWbm2IRFOKPlfJ+Z3h8-FC;?3)CaG3>)#`?~RV_^omQep&yn!|RmUv)^Fk)|tM#PD=M2%#+jnUW6$cPseAC1*7 zDIcweAFoIJK0d{boy7tSueU|Cv)K9dq-4|N2U+pc;%ALOGYcmAxTNu5+DU9Oke7Bw z)(&#wXZWO(giWabkEc_2d%A81dGW*I*kT6*f3FH{VW!)|9BgA`+8IOQ4^qn|OID(y z{BA)-tKFhN!)pCC`q06am=5xbYEPJ0>~yN)IC&7n_{{r|2496jDG)2NUAsqPYUh6^uEU zT=*wH`$Tzhfj2km=>F~EcM2MerOSYW7Y8I;{19sdc2&VckfKlra|H>Cvi37*%^2|5 zUTp5vQE1aqXzBo|rDL$AqpqN6VeKnf@VhpB7=;fA5c$O0Hzet%A7?CqaU2%(#!HC{ z2a%Fq$x*Tg(H7~h^3rTW4{t=1jFdPic*WwIs64zTBjSvTvjuyl>K^)JYm=21XIpbM zAkLUL<8lKwcgXq_=L3(JDA~AX&rV3NQ~Vv$NgsBiMd61v*GZe)!5wSv(Au7^1<1Gs z95gUJDDIFr6I2lF5`ULqragxH4V-MYELu3Gwxinjv{)@p!f=A!;vr!0c8k*rbhza6jj27hyNIJjPuPHkapm1-Hoc#TlG?n>!5HCRu);cFA^m;NuvDiu(wA z2=@~nAUsHT2vGUy_Vh0w{b-;tVd~qzR9-Guy_y#h z9OCn!|BeCnKZA?PA16FPm?q2+o+La);Jnhag#CmAgr^Ay0maEW zmve+egl7nc3C|La5RMX#5uPJx!aU(P;RFEFLZnpn+*iw2Rvh;geUh97a#)lLrR9=S z($AB4ig23n0-e`{Dpt!@c*WF%xI zR9^AUTQh1(Jz+(`!%oHU8|uhH>Of;6xobRW#nh-Os9_a{o~YHYQW8>QW;LKPR$Lt^ zrW#|ZL(@#rQt4XxO3gG2z7Ir}OWs8c9ek6y+O(1Rb{PUePY{ZP6~fiVd#Q5+{IH6` T<2e7VNM|G*Nk@_qJ96ePa#XrC delta 678 zcmY+CO-~d-5Qe+f-C<@Hc4o-(<*uJ-n1hK4;e?5r5IzB2tMp|qn!O~cQ5KBZ4Thx67;(L(3P1-t~acw z$!^4Bh>ZgiSg-~CWM(VN+dY%lPp0`cR!EQirctBwGrJbB>h@dNst}t%JP2jQq;jx8ExnBJ9T12CII@qB}{VV7ZYk&CL z63#@%oQw=AG07W2bu|^J(7-4!iODTs8F&S(0Ivn+CZ8LA?L?dm`HEJ