Warning: Trying to access array offset on value of type null in /home/site/wwwroot/lib/plugins/move/action/rename.php on line 42

Warning: Cannot modify header information - headers already sent by (output started at /home/site/wwwroot/lib/plugins/move/action/rename.php:42) in /home/site/wwwroot/inc/common.php on line 1955

Warning: Cannot modify header information - headers already sent by (output started at /home/site/wwwroot/lib/plugins/move/action/rename.php:42) in /home/site/wwwroot/inc/actions.php on line 38
anisotropic_crystallite_size [topas wiki]

User Tools

Site Tools


anisotropic_crystallite_size

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
anisotropic_crystallite_size [2015/10/30 12:16] hanslustiganisotropic_crystallite_size [2024/02/23 10:42] johnguest
Line 1: Line 1:
 +====== A generalized geometric approach to anisotropic peak broadening due to domain morphology ======
 +As published in J. Appl. Cryst. **48(1)** //(2015)//, 189-194, Ectors et al.
 +[[http://doi.org/10.1107/S1600576714026557]]
 +and J. Appl. Cryst. **48(6)** //(2015)//, 1998-2001, Ectors et al. [[http://doi.org/10.1107/S1600576715018488]]
 +
 +----
 +
 +Updated with an optional plotting macro PlotAnisoCS for the normals_plot window (Version 5+)
 +July 2016
 +
 +Fixed a bug concerning the automatic orientation tool (Abs(alr) instead of alr). Thank you Remo for the feedback.
 +January 2018
 +
 +For modifications to get error reporting see updated link [[https://topas.awh.durham.ac.uk/flarum/public/d/538-report-error-with-phase-out/]]. Thank you Adam for this.
 +Feb 2024
 +
 +Since my website is down heres a link to a quickstart guide. [[https://www.dropbox.com/scl/fi/ics0cza5smwv32c1he7g1/AnisoCS-Macro-collection-for-TOPAS.pdf?rlkey=fwmmw5u4x1lo351403zy3zndt&dl=0]]
 +----
 +
 +Application e.g. for a cylinder in a hexagonal/trigonal system:
 +     str 'or hkl_Is
 +     ...
 +     AnisoCS( 2, 0, 0, 1, 1, 0, 0, rx, 5, rx, 5, rz, 10, !pc, 0, !tc, 0, !nc, 0, 0)
 +     AnisoCSg( tau, 1)
 +     AnisoCSgout(result.txt)
 +     PlotAnisoCS 'V5+ only
 +     ...
 +
 +
 +----
 +
 +
 +     macro AnisoCS( mod, h11, k11, l11, h22, k22, l22, ac, av, bc, bv, cc, cv, pc, pv, tc, tv, nc, nv, sp)
 +     {
 + ' As published in Ectors et al. (2015) J. Appl. Cryst. 48, 189-194 
 + ' mod which model to use 1 for ellipsoid 2 for elliptic cylinder 3 for cuboid
 + ' h11 k11 l11 vector defining the z-axis
 + ' h22 k22 l22 vector defining the x-axis
 + ' av bv cv rx ry rz of the model
 + ' pv tv nv additional rotation parameters theta' theta' nu
 + ' sp activate special method for triclinic systems 1/0 on/off
 +        ' --------- Code starts here ------
 + peak_buffer_step 0
 + 'Initialize variables 
 +    #m_argu mod
 + #m_argu ac If_Prm_Eqn_Rpt(ac, av, min 0.0001 max 10000)
 + #m_argu bc If_Prm_Eqn_Rpt(bc, bv, min 0.0001 max 10000)
 + #m_argu cc If_Prm_Eqn_Rpt(cc, cv, min 0.0001 max 10000)
 + #m_argu pc If_Prm_Eqn_Rpt(pc, pv, min 0 max 180)
 + #m_argu tc If_Prm_Eqn_Rpt(tc, tv, min 0 max 180)
 + #m_argu nc If_Prm_Eqn_Rpt(nc, nv, min 0 max 360)
 + 'G-Metrictensor just for output
 + local !m11 = Get(a)^2; local !m12 = Get(a)*Get(b)*Cos(Get(ga)*Deg); local !m13 = Get(a)*Get(c)*Cos(Get(be)*Deg);
 + local !m21 = m12;      local !m22 = Get(b)^2;                       local !m23 = Get(b)*Get(c)*Cos(Get(al)*Deg); 
 + local !m31 = m13;      local !m32 = m23;                            local !m33 = Get(c)^2;                                    
 + 'G*-Reciprocal metrictensor and reciprocal lattice parameters
 + local !vol = Get(a)*Get(b)*Get(c)*Sqrt(1-((Cos(Get(al)*Deg))^2)-((Cos(Get(be)*Deg))^2)-((Cos(Get(ga)*Deg))^2)+2*(Cos(Get(al)*Deg)*Cos(Get(be)*Deg)*Cos(Get(ga)*Deg)));
 + local !ar = (Get(b)*Get(c)*Sin(Get(al)*Deg))/vol;
 + local !br = (Get(a)*Get(c)*Sin(Get(be)*Deg))/vol;
 + local !cr = (Get(b)*Get(a)*Sin(Get(ga)*Deg))/vol;
 + local !alr = (Cos(Get(be)*Deg)*Cos(Get(ga)*Deg)-Cos(Get(al)*Deg))/(Sin(Get(be)*Deg)*Sin(Get(ga)*Deg));
 + local !ber = (Cos(Get(al)*Deg)*Cos(Get(ga)*Deg)-Cos(Get(be)*Deg))/(Sin(Get(al)*Deg)*Sin(Get(ga)*Deg));
 + local !gar = (Cos(Get(be)*Deg)*Cos(Get(al)*Deg)-Cos(Get(ga)*Deg))/(Sin(Get(be)*Deg)*Sin(Get(al)*Deg));
 + local !r11 = ar^2; local !r12 = ar*br*gar;   local !r13 = ar*cr*ber;
 + local !r21 = r12;  local !r22 = br^2;        local !r23 = br*cr*alr;
 + local !r31 = r13;  local !r32 = r23;         local !r33 = cr^2; 
 + 'Test if special method triclinic is activated
 +     #m_ifarg sp 1
 + local !h1 = 0; local !h2 = If(Abs(alr) <= 0.00001, 0 , 1);
 + local !k1 = 0; local !k2 = If(Abs(alr) <= 0.00001, 1 , -(r31 / r32));
 + local !l1 = 1; local !l2 = 0;
 + #m_else
 + local !h1 = h11; local !h2 = h22;
 + local !k1 = k11; local !k2 = k22;
 + local !l1 = l11; local !l2 = l22;
 + #m_endif
 + '|hkl|Prim aka z-axis
 + local rowh1 = (h1 r11 + k1 r12 + l1 r13)*h1; 
 + local rowk1 = (h1 r21 + k1 r22 + l1 r23)*k1;
 + local rowl1 = (h1 r31 + k1 r32 + l1 r33)*l1; 
 + local dvec1 = Sqrt(rowh1+rowk1+rowl1);
 + '|hkl|Sec aka x-axis
 + local rowh2 = (h2 r11 + k2 r12 + l2 r13)*h2;
 + local rowk2 = (h2 r21 + k2 r22 + l2 r23)*k2;
 + local rowl2 = (h2 r31 + k2 r32 + l2 r33)*l2;
 + local dvec2 = Sqrt(rowh2+rowk2+rowl2); 
 + '|hkl|Current
 + local rowH = (H r11 + K r12 + L r13)*H; 
 + local rowK = (H r21 + K r22 + L r23)*K; 
 + local rowL = (H r31 + K r32 + L r33)*L; 
 + local dvec3 = Sqrt(rowH+rowK+rowL); 
 + 'Angle phi
 + local rowg1 = (H r11 + K r12 + L r13)*h1; 
 + local rowg2 = (H r21 + K r22 + L r23)*k1; 
 + local rowg3 = (H r31 + K r32 + L r33)*l1;
 + local sum1 = rowg1+rowg2+rowg3; 
 + local cosphi = (sum1/(dvec1*dvec3));
 + local sinphi = Sqrt(Abs(1-(cosphi^2)));  
 + 'Angle theta
 + local rowp1 = (H r11 + K r12 + L r13)*h2; 
 + local rowp2 = (H r21 + K r22 + L r23)*k2; 
 + local rowp3 = (H r31 + K r32 + L r33)*l2;
 + local sum2 = rowp1+rowp2+rowp3;
 + local coseta =(sum2/(dvec2*dvec3));
 + local costheta = If(sinphi <= 0.00001,  1, coseta/sinphi);
 + local sintheta = Sqrt(Abs(1-(costheta^2)));
 + 'Handedness
 + local p = h1*(k2*L - l2*K) + k1*(l2*H - h2*L) + l1*(h2*K - k2*H);
 + local pre = If (p <= 0 , -1 , 1); 
 + 'Rotation: Rotationmatrix and calculation of phirot and thetarot
 + local grot11 = (Cos(CeV(tc,tv) * Deg)*Cos(CeV(pc,pv) * Deg)*Cos(CeV(nc,nv) * Deg))-(Sin(CeV(tc,tv) * Deg)*Sin(CeV(nc,nv) * Deg));
 + local grot21 = -(Cos(CeV(tc,tv) * Deg)*Cos(CeV(pc,pv) * Deg)*Sin(CeV(nc,nv) * Deg))-(Sin(CeV(tc,tv) * Deg)*Cos(CeV(nc,nv) * Deg));
 + local grot31 = Cos(CeV(tc,tv) * Deg)*Sin(CeV(pc,pv) * Deg);
 + local grot12 = (Sin(CeV(tc,tv) * Deg)*Cos(CeV(pc,pv) * Deg)*Cos(CeV(nc,nv) * Deg))+(Cos(CeV(tc,tv) * Deg)*Sin(CeV(nc,nv) * Deg));
 + local grot22 = -(Sin(CeV(tc,tv) * Deg)*Cos(CeV(pc,pv) * Deg)*Sin(CeV(nc,nv) * Deg))+(Cos(CeV(tc,tv) * Deg)*Cos(CeV(nc,nv) * Deg));
 + local grot32 = Sin(CeV(tc,tv) * Deg)*Sin(CeV(pc,pv) * Deg);
 + local grot13 = -(Sin(CeV(pc,pv) * Deg)*Cos(CeV(nc,nv) * Deg));
 + local grot23 = Sin(CeV(pc,pv) * Deg)*Sin(CeV(nc,nv) * Deg);
 + local grot33 = Cos(CeV(pc,pv) * Deg);
 + local cosphirot = (costheta*sinphi*grot31)+(pre*sintheta*sinphi*grot32)+(cosphi*grot33);
 + local sinphirot = Sqrt(Abs(1-(cosphirot^2)));
 + local xfac = (costheta*sinphi*grot11)+(pre*sintheta*sinphi*grot12)+(cosphi*grot13);
 + local costhetarot = If(sinphirot <= 0.0001, 1, xfac / sinphirot);
 + local sinthetarot = Sqrt(Abs(1-(costhetarot^2)));
 + 'Models:
 + 'Ellipsoid
 + #m_ifarg mod 1
 + local volop  = ((4/3) 3.14159265358979 CeV(ac,av) CeV(bc,bv) CeV(cc,cv));
 + local areaop = 3.14159265358979 Sqrt(((CeV(cc,cv) sinphirot)^2)(((CeV(ac,av) sinthetarot)^2)+(CeV(bc,bv) costhetarot)^2)+((CeV(ac,av) CeV(bc,bv) cosphirot)^2));
 + local sizeL = volop / areaop;
 + #m_endif
 + 'Cylinder
 + #m_ifarg mod 2
 + local volop  = (3.14159265358979 CeV(ac,av) CeV(bc,bv) (2 * CeV(cc,cv)));
 + local areaop = (Sqrt( ((CeV(ac,av) sinthetarot)^2) + ((CeV(bc,bv) costhetarot)^2)) 4 * CeV(cc,cv) * Abs(sinphirot)) + (3.14159265358979 CeV(ac,av) CeV(bc,bv) Abs(cosphirot));
 + local sizeL = volop / areaop;
 + #m_endif
 + 'Cuboid
 + #m_ifarg mod 3
 + local volop  = (8 CeV(ac,av) CeV(bc,bv) CeV(cc,cv));
 + local areaop = 4 CeV(ac,av) CeV(bc,bv) Abs(cosphirot) + 4 CeV(ac,av) CeV(cc,cv) Abs(sinphirot) Abs(sinthetarot) + 4 CeV(bc,bv) CeV(cc,cv) Abs(costhetarot) Abs(sinphirot) ;
 + local sizeL = volop / areaop;
 + #m_endif
 + 'For Output purposes only
 + local ax = CeV(ac,av);
 + local bx = CeV(bc,bv);
 + local cx = CeV(cc,cv);
 + local px = CeV(pc,pv);
 + local tx = CeV(tc,tv);
 + local nx = CeV(nc,nv);
 + local modx = mod; 
 + local vole = volop;
 + local larea = volop^(1/3);
 + local kk = larea / sizeL ;
 + local areaoe = areaop;
 + local phi = If(cosphi < -1, 180, If (cosphi > 1, 0, ArcCos(cosphi)*Rad));
 + local the = If(costheta < -1, 180, If (costheta > 1, 0, ArcCos(costheta)*Rad));
 + local phirot = If(cosphirot < -1, 180, If (cosphirot > 1, 0, ArcCos(cosphirot)*Rad));
 + local therot = If(costhetarot < -1, 180, If (costhetarot > 1, 0, ArcCos(costhetarot)*Rad));
 + 'CS_Macro
 +         'lor_fwhm = 0.1 180/pi^2 * Lambda / Cos(Th) * sizeL ... 0.1 for nm->Angstroem
 + lor_fwhm = 0.1 18.2378130556208 Lam / (Cos(Th) sizeL); 
 +     }
 +     
 +     macro AnisoCSout(file) {
 +     ' As published in Ectors et al. (2015) J. Appl. Cryst. 48, 189-194 
 +     out file
 +     Out_String("Analysis Report: ")
 +     Out(Get(phase_name),"%s \n")
 +     Out(Get (r_wp), " Rwp: %8.3f \n")
 +     Out(Get (r_exp), " Rexp:%8.3f \n\n")
 +     
 +     Out_String("G-Metrictensor \n\n")
 +     Out(m11,"%8.3f") Out(m12,"%8.3f") Out(m13,"%8.3f\n")
 +     Out(m21,"%8.3f") Out(m22,"%8.3f") Out(m23,"%8.3f\n")
 +     Out(m31,"%8.3f") Out(m32,"%8.3f") Out(m33,"%8.3f\n\n")
 +     
 +     Out_String("G*-Metrictensor \n\n")
 +     Out(r11,"%8.3f") Out(r12,"%8.3f") Out(r13,"%8.3f\n")
 +     Out(r21,"%8.3f") Out(r22,"%8.3f") Out(r23,"%8.3f\n")
 +     Out(r31,"%8.3f") Out(r32,"%8.3f") Out(r33,"%8.3f\n\n")
 +     
 +     Out_String("Rotationmatrix \n\n")
 +     Out(grot11,"%8.3f") Out(grot12,"%8.3f") Out(grot13,"%8.3f\n")
 +     Out(grot21,"%8.3f") Out(grot22,"%8.3f") Out(grot23,"%8.3f\n")
 +     Out(grot31,"%8.3f") Out(grot32,"%8.3f") Out(grot33,"%8.3f\n\n")
 +     
 +     
 +     Out_String("Model parameters \n")
 +     Out_String(" (1) Ellipsoid / (2) Cylinder / (3) Cuboid \n")
 +     Out(modx, " Model: %1.0f \n\n")
 +     Out(h1," z-axis hkl: %8.3f") Out(k1," %8.3f") Out(l1," %8.3f \n")
 +     Out(px, " Rotation phi: %8.3f") Out(tx, "  theta: %8.3f \n\n")
 +     Out(h2," x-axis hkl: %8.3f") Out(k2," %8.3f") Out(l2," %8.3f \n")
 +     Out(nx, " Additional rotation nu: %8.3f \n\n")
 +     Out(ax," rx-radius: %8.3f nm \n")
 +     Out(bx," ry-radius: %8.3f nm \n")
 +     Out(cx," rz-radius: %8.3f nm \n")
 +     Out(vole," Volume: %8.3f nm^3 \n")
 +     Out(larea," <True CS>: %8.3f nm \n\n")
 +     
 +     
 +     
 +      Out_String("      L     2Th        D        phi     theta    phirot  thetarot  <L_surf>\n")
 +     phase_out file append load out_record out_fmt out_eqn 
 +     
 +     {
 +            "%4.0f" = H;
 +            "%4.0f" = K;
 +            "%4.0f" = L;
 +            "%4.0f" = M;
 +            "%8.3f" = 2 Th Rad;
 +            "%8.3f" =  D_spacing;
 +            "%8.3f" = phi;
 +            "%8.3f" = the;
 +            "%8.3f" = phirot;
 +            "%8.3f" = therot;
 +            "%8.3f\n" = sizeL;
 +     }
 +     
 +     }
 +     
 +     macro AnisoCSg( tauc, tauv)
 +     {
 + #m_argu tauc If_Prm_Eqn_Rpt(tauc, tauv, min 1 max 2)
 + 'Parameters Eq.(5-7)
 + local para = Abs((costhetarot*sinphirot)/ax);
 + local parb = Abs((sinthetarot*sinphirot)/bx);
 + local parc = Abs((cosphirot)/cx);
 + 'Parameters chapter 2.4
 + local pard = Sqrt(para^2+parb^2);
 + local pare = pard/parc;
 + local parf = Sqrt(1-pare^2);
 + 'Here comes the tricky part
 + 'Ellipsoid Eq.(4)
 + local ev = If(modx < 2,CeV(tauc,tauv) * (9/8) * sizeL,
 + 'Cylinder 
 + If(modx < 3,
 + 'Eq. (11)
 + If(pard <= 0.0001,CeV(tauc, tauv) * sizeL,
 + 'Eq. (12)
 + If(pard < parc, CeV(tauc, tauv) * ( (2/parc) - (8/(3.14159265358979*pard)) * (-(2/3)+(2/3)*parf+((pare*pare*parf)/3)+(pare*ArcSin(pare)))+
 + ((2*parc)/(3.14159265358979*pard*pard))*(((pare*parf)/2)-((1/2)*(ArcSin(pare)))+(pare*pare*pare*parf)+(2*pare*pare*ArcSin(pare)))),
 + 'Eq. (13)
 + CeV(tauc, tauv)*((16)/(3*3.14159265358979*pard))-((2*parc)/(4*pard*pard)))),
 + 'Cuboid
 + 'Eq. (8)
 + If(And(para>=parb, para>=parc),CeV(tauc, tauv)*(2/para)*(1-(parb/(3*para))-(parc/(3*para))+((parb*parc)/(6*para*para))),
 + 'Eq. (9)
 + If(And(parb>=para, parb>=parc),CeV(tauc, tauv)*(2/parb)*(1-(para/(3*parb))-(parc/(3*parb))+((para*parc)/(6*parb*parb))),
 + 'Eq. (10)
 + CeV(tauc, tauv)*(2/parc)*(1-(para/(3*parc))-(parb/(3*parc))+((para*parb)/(6*parc*parc))))))
 + );
 + 'IB calculations Eq. (1-3)
 + local ibV = 1/ev;
 + local ibL = 1/(2*sizeL);
 + 'ibG is 0 if ibV < ibL 
 + local ibG = If (ibV > ibL, ((Sqrt((4*ibV^2)-(4.27679864*ibV*ibL)+(0.27679864*ibL^2)))/2), 0);
 + 'CS_G macro
 + local sizeG = ibG/(Sqrt(3.14159265358979/(4*Ln(2))));
 + gauss_fwhm = 0.1 Rad Lam sizeG / Cos(Th);
 + 'For Output purposes only
 + local taux =  CeV(tauc, tauv);
 +     }
 +     
 +     macro AnisoCSgout(file) {
 +     out file
 +     Out_String("Analysis Report: ")
 +     Out(Get(phase_name),"%s \n")
 +     Out(Get (r_wp), " Rwp: %8.3f \n")
 +     Out(Get (r_exp), " Rexp:%8.3f \n\n")
 +     
 +     Out_String("G-Metrictensor \n\n")
 +     Out(m11,"%8.3f") Out(m12,"%8.3f") Out(m13,"%8.3f\n")
 +     Out(m21,"%8.3f") Out(m22,"%8.3f") Out(m23,"%8.3f\n")
 +     Out(m31,"%8.3f") Out(m32,"%8.3f") Out(m33,"%8.3f\n\n")
 +     
 +     Out_String("G*-Metrictensor \n\n")
 +     Out(r11,"%8.3f") Out(r12,"%8.3f") Out(r13,"%8.3f\n")
 +     Out(r21,"%8.3f") Out(r22,"%8.3f") Out(r23,"%8.3f\n")
 +     Out(r31,"%8.3f") Out(r32,"%8.3f") Out(r33,"%8.3f\n\n")
 +     
 +     Out_String("Rotationmatrix \n\n")
 +     Out(grot11,"%8.3f") Out(grot12,"%8.3f") Out(grot13,"%8.3f\n")
 +     Out(grot21,"%8.3f") Out(grot22,"%8.3f") Out(grot23,"%8.3f\n")
 +     Out(grot31,"%8.3f") Out(grot32,"%8.3f") Out(grot33,"%8.3f\n\n")
 +     
 +     
 +     Out_String("Model parameters \n")
 +     Out_String(" (1) Ellipsoid / (2) Cylinder / (3) Cuboid \n")
 +     Out(modx, " Model: %1.0f \n\n")
 +     Out(h1," z-axis hkl: %8.3f") Out(k1," %8.3f") Out(l1," %8.3f \n")
 +     Out(px, " Rotation phi: %8.3f") Out(tx, "  theta: %8.3f \n\n")
 +     Out(h2," x-axis hkl: %8.3f") Out(k2," %8.3f") Out(l2," %8.3f \n")
 +     Out(nx, " Additional rotation nu: %8.3f \n\n")
 +     Out(ax," rx-radius_surf: %8.3f nm ")
 +     Out(ax*taux,"/ rx-radius_vol: %8.3f nm \n")
 +     Out(bx," ry-radius_surf: %8.3f nm ")
 +     Out(bx*taux,"/ ry-radius_vol: %8.3f nm \n")
 +     Out(cx," rz-radius_surf: %8.3f nm ")
 +     Out(cx*taux,"/ rz-radius_vol: %8.3f nm \n")
 +     Out(vole," Volume_surf: %8.3f nm^3 ")
 +     Out(vole*taux*taux*taux,"/ Volume_vol: %8.3f nm^3 \n")
 +     Out(larea," <True CS>_surf: %8.3f nm ")
 +     Out(larea*taux,"/ <True CS>_vol: %8.3f nm \n\n")
 +     Out_String("Distribution parameters \n")
 +     Out(taux," Tau: %8.4f  \n")
 +     Out_String(" If Lognormal of <True CS>\n")
 +     Out(Ln(larea*taux)-(3.5*Ln(taux))," Logn. mean:%8.4f  \n")
 +     Out(Sqrt(Ln(taux))," Logn. var.: %8.4f  \n\n")
 +     
 +      Out_String("      L     2Th        D    <L_surf><L_vol>  <L_vol>/<L_surf> \n")
 +     phase_out file append load out_record out_fmt out_eqn 
 +     
 +     {
 +            "%4.0f" = H;
 +            "%4.0f" = K;
 +            "%4.0f" = L;
 +            "%4.0f" = M;
 +            "%8.3f" = 2 Th Rad;
 +            "%8.3f" =  D_spacing;
 +            "%8.3f" = sizeL;
 +            "%8.3f" = ev;
 +            "%8.3f\n" = ev/sizeL;
 +     }
 +     
 +     }
 +     
 +     macro PlotAnisoCS
 +     {
 +     'ellipsoid
 +     normals_plot = If(modx < 2, sizeL*(3/4),
 +     'cylinder
 +     If(modx < 3,
 +     1/( ( ((Abs((1/cx)*cosphirot))^(10))+((Abs((sinphirot))^(10))*( ((Abs((1/bx)*sinthetarot))^(2)) + ((Abs((1/ax)*costhetarot))^(2)) )^(5) ) )^(1/10) ),
 +     'cuboid
 +     1/( ( ((Abs((1/cx)*cosphirot))^(10))+((Abs((sinphirot))^(10))*( ((Abs((1/bx)*sinthetarot))^(10)) + ((Abs((1/ax)*costhetarot))^(10)) ) ) )^(1/10) )
 +     )
 +     );
 +     }
  
anisotropic_crystallite_size.txt · Last modified: 2024/02/23 10:58 by dectors