diff --git a/Dans_Diffraction/__init__.py b/Dans_Diffraction/__init__.py index a36b238..f37ea62 100644 --- a/Dans_Diffraction/__init__.py +++ b/Dans_Diffraction/__init__.py @@ -31,8 +31,8 @@ Diamond 2017-2025 -Version 3.3.4 -Last updated: 12/04/2025 +Version 3.4.0 +Last updated: 05/08/2025 Version History: 02/03/18 1.0 Version History started. @@ -85,6 +85,7 @@ 20/11/24 3.3.2 Added alternate option for neutron scattering lengths 06/02/25 3.3.3 Added scattering options for polarised neutron and x-ray scattering. Thanks dragonyanglong! 12/04/25 3.3.4 Improved superstructure calculations by fixing scale parameter +05/08/25 3.4.0 Added custom atomic form factors and dispersion corrections Acknoledgements: 2018 Thanks to Hepesu for help with Python3 support and ideas about breaking up calculations @@ -112,6 +113,7 @@ Sep 2024 Thanks to thamnos for suggestion to add complex neutron scattering lengths Oct 2024 Thanks to Lee Richter for pointing out the error in triclinic basis definition Dec 2024 Thanks to dragonyanglong for pointing out the error with magnetic neutron scattering + May 2025 Thanks to vbhartiya for suggestions about magnetic neutron scattering ----------------------------------------------------------------------------- Copyright 2018-2025 Diamond Light Source Ltd. @@ -166,8 +168,8 @@ 'Structures', 'Fdmnes', 'FdmnesAnalysis'] -__version__ = '3.3.3' -__date__ = '2025/02/06' +__version__ = '3.4.0' +__date__ = '2025/08/05' # Build diff --git a/Dans_Diffraction/classes_crystal.py b/Dans_Diffraction/classes_crystal.py index fec624b..43b0b9f 100644 --- a/Dans_Diffraction/classes_crystal.py +++ b/Dans_Diffraction/classes_crystal.py @@ -51,6 +51,7 @@ 22/05/23 3.2.4 Added Symmetry.wyckoff_label(), Symmetry.spacegroup_dict 06/05/24 3.3.0 Symmetry.from_cif now loads operations from find_spacegroup if not already loaded 06/04/25 3.3.1 scale parameter of superlattice improved +15/09/25 3.3.2 Atoms.type changed to always be array type @author: DGPorter """ @@ -1088,6 +1089,7 @@ class Atoms: "_atom_site_fract_y", "_atom_site_fract_z", ] + _type_str_fmt = ' 1: for ax in axs.flat: ax.label_outer() @@ -1378,6 +1378,45 @@ def plot_ms_azimuth(self, hkl, energy_kev, azir=[0, 0, 1], pv=[1, 0], numsteps=3 fp.labels(ttl, r'$\psi$ (deg)', 'Intensity') #plt.subplots_adjust(bottom=0.2) + def plot_scattering_factors(self, q_max=4, energy_range=None, q_range=None): + """ + Plot atomic scattering factors across wavevector or energy + + if q_range has more values than energy_range, figures will plot scattering factor vs Q + for each energy. + if energy_range has more values than q_range, figures will plot scattering factor vs energy + for each value of Q. + + :param q_max: use a q_range of 0-q_max + :param energy_range: energy range in keV + :param q_range: range of wavecectors, or None to use q_max + :return: None + """ + + if q_range is None: + q_range = np.arange(0, q_max, 0.01) + atom_types, atom_idx = np.unique(self.xtl.Structure.type, return_index=True) + atom_scattering_factors = self.xtl.Scatter.scattering_factors(qmag=q_range, energy_kev=energy_range) + ttl = f"{self.xtl.Scatter._scattering_type}" + # plot multiple figures of lower dimension + if atom_scattering_factors.shape[2] > atom_scattering_factors.shape[0]: # energy_range > q_range + # different figures for different values of Q + for n in range(atom_scattering_factors.shape[0]): + plt.figure(figsize=self._figure_size, dpi=self._figure_dpi) + nttl = ttl + f" Q={q_range[n]:.2g}" + r" $\AA^{-1}$" + for atom, idx in zip(atom_types, atom_idx): + plt.plot(energy_range, atom_scattering_factors[n, idx, :], label=atom) + fp.labels(nttl, 'Energy [keV]', 'Atomic scattering factor', legend=True) + else: + # different figures for different values of E + for n in range(atom_scattering_factors.shape[2]): + plt.figure(figsize=self._figure_size, dpi=self._figure_dpi) + nttl = ttl + (f" E = {energy_range[n]} keV" if atom_scattering_factors.shape[2] > 1 else "") + for atom, idx in zip(atom_types, atom_idx): + plt.plot(q_range, np.abs(atom_scattering_factors[:, idx, n]), label=atom) + fp.labels(nttl, r'Q $\AA^{-1}$', 'Atomic scattering factor', legend=True) + + r''' Remove tensor_scattering 26/05/20 def tensor_scattering_azimuth(self, atom_label, hkl, energy_kev, azir=[0, 0, 1], process='E1E1', rank=2, time=+1, parity=+1, mk=None, lk=None, sk=None): diff --git a/Dans_Diffraction/classes_properties.py b/Dans_Diffraction/classes_properties.py index d9f3b80..512c8ed 100644 --- a/Dans_Diffraction/classes_properties.py +++ b/Dans_Diffraction/classes_properties.py @@ -31,6 +31,7 @@ from . import functions_general as fg from . import functions_crystallography as fc +from . import functions_scattering as fs from .classes_orbitals import CrystalOrbitals __version__ = '2.0' @@ -119,7 +120,30 @@ def magnetic_form_factor(self, hkl): :return: [nxm] array of scattering factors for each atom and reflection """ qmag = self.xtl.Cell.Qmag(hkl) - return fc.magnetic_form_factor(self.xtl.Structure.type, qmag) + return fc.magnetic_form_factor(*self.xtl.Structure.type, qmag=qmag) + + def scattering_factors(self, scattering_type, hkl, energy_kev=None, + use_sears=False, use_wasskirf=False): + """ + Return an array of scattering factors based on the radiation + :param scattering_type: str radiation, see "get_scattering_function()" + :param hkl: [mx1] or None, float array of wavevector magnitudes for reflections + :param energy_kev: [ox1] or None, float array of energies in keV + :param use_sears: if True, use neutron scattering lengths from ITC Vol. C, By V. F. Sears + :param use_wasskirf: if True, use x-ray scattering factors from Waasmaier and Kirfel + :return: [nxmxo] array of scattering factors + """ + qmag = self.xtl.Cell.Qmag(hkl) + # Scattering factors + ff = fs.scattering_factors( + scattering_type=scattering_type, + atom_type=self.xtl.Structure.type, + qmag=qmag, + enval=energy_kev, + use_sears=use_sears, + use_wasskirf=use_wasskirf, + ) + return np.squeeze(ff) def xray_edges(self): """ diff --git a/Dans_Diffraction/classes_scattering.py b/Dans_Diffraction/classes_scattering.py index b6c1464..fb8128c 100644 --- a/Dans_Diffraction/classes_scattering.py +++ b/Dans_Diffraction/classes_scattering.py @@ -41,6 +41,7 @@ 16/05/24 2.3.4 Added printed progress bar to generate_intensity_cut during convolusion 17/05/24 2.3.4 Changed generate_intensity_cut to make it much faster 23/12/24 2.3.5 Added polarised neutron options +15/09/25 2.4.0 Added custom scattering factors @author: DGPorter """ @@ -54,7 +55,7 @@ from . import multiple_scattering as ms # from . import tensor_scattering as ts # Removed V1.7 -__version__ = '2.3.5' +__version__ = '2.4.0' class Scattering: @@ -67,13 +68,13 @@ class Scattering: print(xtl.Scatter.print_all_refelctions()) # Returns formated string of all allowed reflections Allowed radiation types: - 'xray','neutron','xray magnetic','neutron magnetic','xray resonant' + 'xray','neutron','xray magnetic','neutron magnetic','xray resonant', 'custom' """ #------Options------- # Standard Options _hkl = None # added so recalculation not required - _scattering_type = 'xray' # 'xray','neutron','xray magnetic','neutron magnetic','xray resonant' + _scattering_type = 'xray' # 'xray','neutron','xray magnetic','neutron magnetic','xray resonant', 'custom' _scattering_specular_direction = [0, 0, 1] # reflection _scattering_parallel_direction = [0, 0, 1] # transmission _scattering_theta_offset = 0.0 @@ -182,7 +183,8 @@ def __str__(self): #out += ' use m1m1 approx.: %s\n' % self._resonant_approximation_m1m1 return out - def setup_scatter(self, scattering_type=None, energy_kev=None, wavelength_a=None, + def setup_scatter(self, scattering_type=None, energy_kev=None, energy_mev=None, wavelength_a=None, + use_sears=None, use_waaskirf=None, powder_units=None, powder_pixels=None, powder_lorentz=None, powder_overlap=None, int_hkl=None, specular=None, parallel=None, theta_offset=None, min_theta=None, max_theta=None, min_twotheta=None, max_twotheta=None, @@ -217,13 +219,27 @@ def setup_scatter(self, scattering_type=None, energy_kev=None, wavelength_a=None """ if scattering_type is not None: - self._scattering_type = scattering_type + self._scattering_type = fs.get_scattering_type(scattering_type) if energy_kev is not None: self._energy_kev = energy_kev + if energy_mev is not None: + self._energy_kev = energy_mev * 1e-6 + if wavelength_a is not None: - self._energy_kev = fc.wave2energy(wavelength_a) + if 'neutron' in self._scattering_type: + self._energy_kev = fc.neutron_energy(wavelength_a) * 1e-6 # meV + elif 'electron' in self._scattering_type: + self._energy_kev = fc.electron_energy(wavelength_a) * 1e-3 # eV + else: + self._energy_kev = fc.wave2energy(wavelength_a) + + if use_sears is not None: + self._use_sears_scattering_lengths = use_sears + + if use_waaskirf is not None: + self._use_waaskirf_scattering_factor = use_waaskirf if powder_units is not None: self._powder_units = powder_units @@ -506,7 +522,7 @@ def structure_factor(self, hkl=None, scattering_type=None, int_hkl=None, **kwarg # Get magnetic form factors if self._use_magnetic_form_factor: - mf = fc.magnetic_form_factor(atom_type, qmag) + mf = fc.magnetic_form_factor(*atom_type, qmag=qmag) else: mf = None @@ -527,9 +543,9 @@ def structure_factor(self, hkl=None, scattering_type=None, int_hkl=None, **kwarg if nenergy == 1 and npsi == 1: sf = sf[:, 0, 0] # shape(nref) elif nenergy == 1: - sf = sf[:, 0, :] # shape(nref, nenergy) + sf = sf[:, 0, :] # shape(nref, npsi) elif npsi == 1: - sf = sf[:, :, 0] # shape(nref, npsi) + sf = sf[:, :, 0] # shape(nref, nenergy) if 'save' in kwargs: np.save(kwargs['save'], sf, allow_pickle=True) print("Saved %d structure factors to '%s'" % (sf.size, kwargs['save'])) @@ -1061,7 +1077,7 @@ def magnetic_neutron(self, HKL): # Get magnetic form factors if self._use_magnetic_form_factor: - ff = fc.magnetic_form_factor(atom_type, Qmag) + ff = fc.magnetic_form_factor(*atom_type, qmag=Qmag) else: ff = np.ones([len(HKL), Nat]) @@ -1127,7 +1143,7 @@ def xray_magnetic(self, HKL): # Get magnetic form factors if self._use_magnetic_form_factor: - ff = fc.magnetic_form_factor(atom_type, Qmag) + ff = fc.magnetic_form_factor(*atom_type, qmag=Qmag) else: ff = np.ones([len(HKL), Nat]) @@ -1351,7 +1367,7 @@ def xray_nonresonant_magnetic(self, HKL, energy_kev=None, azim_zero=(1, 0, 0), p # Get magnetic form factors if self._use_magnetic_form_factor: - ff = fc.magnetic_form_factor(atom_type, Qmag) + ff = fc.magnetic_form_factor(*atom_type, qmag=Qmag) else: ff = np.ones([len(HKL), len(uvw)]) @@ -1620,6 +1636,25 @@ def scatteringbasis(self, hkl, azim_zero=(1, 0, 0), psi=0): Jhat_psi = fg.norm(np.cross(Qhat, Ihat_psi)) return np.vstack([Ihat_psi, Jhat_psi, Qhat]) + def scattering_factors(self, hkl=(0, 0, 0), energy_kev=None, qmag=None): + """Return the scattering factors[n, m] for each reflection, hkl[n,3] and each atom [m]""" + + if energy_kev is None: + energy_kev = self._energy_kev + + if qmag is None: + qmag = self.xtl.Cell.Qmag(hkl) + # Scattering factors + ff = fs.scattering_factors( + scattering_type=self._scattering_type, + atom_type=self.xtl.Structure.type, + qmag=qmag, + enval=energy_kev, + use_sears=self._use_sears_scattering_lengths, + use_wasskirf=self._use_waaskirf_scattering_factor, + ) + return ff + def print_scattering_coordinates(self, hkl, azim_zero=(1, 0, 0), psi=0): """ Transform magnetic vector into components within the scattering plane @@ -1667,7 +1702,58 @@ def print_intensity(self, HKL): vals=(HKL[n][0],HKL[n][1],HKL[n][2],IN[n],IX[n],INM[n],IXM[n],IXRss[n],IXRsp[n],IXRps[n],IXRpp[n]) outstr += fmt % vals return outstr - + + def print_atom_scattering_factors(self, hkl, energy_kev=None): + """show scattering factors for each atom for each reflection""" + qmag = self.xtl.Cell.Qmag(hkl) + ff = self.scattering_factors(hkl, energy_kev) + hkl = np.asarray(hkl, dtype=float).reshape([-1, 3]) + + out = f"{self._scattering_type}\n" + for n, (h, k, l) in enumerate(hkl): + out += f"({h:.3g}, {k:.3g}, {l:.3g}) |Q| = {qmag[n]:.4g} A-1\n" + for m, ele in enumerate(self.xtl.Structure.type): + out += f" {ele:5}: {ff[n, m]: 12.5f}\n" + return out + + def print_scattering_factor_coefficients(self): + """generate string of scattering factor coefficients for each atom""" + scattering_type = fs.get_scattering_type(self._scattering_type) + + if 'neutron' in scattering_type: + if self._use_sears_scattering_lengths: + table = 'sears' + else: + table = 'ndb' + elif 'electron' in scattering_type: + table = 'peng' + elif 'xray' in scattering_type: + if self._use_waaskirf_scattering_factor: + table = 'waaskirf' + else: + table = 'itc' + else: + raise Exception(f"Unknown scattering type: {scattering_type}") + + element_coefs = fc.scattering_factor_coefficients_custom(*self.xtl.Structure.type, default_table=table) + + + structrue = self.xtl.Structure + structure_list = zip(structrue.label, structrue.type, structrue.u, structrue.v, structrue.w) + out = f"{scattering_type}\n" + for n, (label, el, u, v, w) in enumerate(structure_list): + out += f"{n:3} {label:6} {el:5}: {u:8.3g}, {v:8.3g}, {w:8.3g} : " + + coefs = element_coefs[el] + if abs(coefs[-1]) < 1e-6: + coefs = coefs[:-1] # trim final column if all zeros + n_doubles = len(coefs) // 2 + n_singles = len(coefs) % 2 + out += ', '.join(f"a{d} = {coefs[2*d]:.3f}, A{d} = {coefs[2*d+1]:.3f}" for d in range(n_doubles)) + out += (', ' * int(n_doubles > 0)) + (f"b = {coefs[-1]:.3f}" * n_singles) + out += '\n' + return out + def old_intensity(self, HKL, scattering_type=None): """ Calculate the squared structure factor for the given HKL @@ -2295,48 +2381,50 @@ def print_atomic_contributions(self, HKL): """ Prints the atomic contributions to the structure factor """ - - HKL = np.asarray(np.rint(HKL),dtype=float).reshape([-1,3]) + + HKL = np.asarray(np.rint(HKL), dtype=float).reshape([-1, 3]) Nref = len(HKL) - + # Calculate the full intensity I = self.intensity(HKL) - + # Calculate the structure factors of the symmetric atomic sites base_label = self.xtl.Atoms.label - uvw,type,label,occ,uiso,mxmymz = self.xtl.Structure.get() - + uvw, atom_type, label, occ, uiso, mxmymz = self.xtl.Structure.get() + Qmag = self.xtl.Cell.Qmag(HKL) - + # Get atomic form factors - ff = fc.xray_scattering_factor(type,Qmag) - + # ff = fc.xray_scattering_factor(atom_type, Qmag) + ff = self.scattering_factors(HKL) + # Get Debye-Waller factor - dw = fc.debyewaller(uiso,Qmag) - + dw = fc.debyewaller(uiso, Qmag) + # Calculate dot product - dot_KR = np.dot(HKL,uvw.T) - + dot_KR = np.dot(HKL, uvw.T) + # Calculate structure factor - SF = ff*dw*occ*np.exp(1j*2*np.pi*dot_KR) - + SF = ff * dw * occ * np.exp(1j * 2 * np.pi * dot_KR) + # Sum structure factors of each base label in atoms - SFbase = np.zeros([len(HKL),len(base_label)],dtype=np.complex128) + SFbase = np.zeros([len(HKL), len(base_label) + 1], dtype=complex) for n in range(len(base_label)): label_idx = label == base_label[n] - SFbase[:,n] = np.sum(SF[:,label_idx],axis=1) - + SFbase[:, n] = np.sum(SF[:, label_idx], axis=1) + SFbase[:, -1] = SFbase.sum(axis=1) # add the sum + # Get the real part of the structure factor - #SFtot = np.sqrt(np.real(SF * np.conj(SF))) + # SFtot = np.sqrt(np.real(SF * np.conj(SF))) SFrel = np.real(SFbase) SFimg = np.imag(SFbase) - + # Generate the results outstr = '' - outstr+= '( h, k, l) Intensity' + ' '.join(['%12s '%x for x in base_label])+'\n' + outstr += '( h, k, l) Intensity ' + ' '.join(['%12s ' % x for x in base_label]) + ' Total SF\n' for n in range(Nref): - ss = ' '.join(['%6.1f + i%-6.1f' % (x,y) for x,y in zip(SFrel[n],SFimg[n])]) - outstr+= '(%2.0f,%2.0f,%2.0f) %9.2f %s\n' % (HKL[n,0],HKL[n,1],HKL[n,2],I[n],ss) + ss = ' '.join(['%6.1f + i%-6.1f' % (x, y) for x, y in zip(SFrel[n], SFimg[n])]) + outstr += '(%2.0f,%2.0f,%2.0f) %9.2f %s\n' % (HKL[n, 0], HKL[n, 1], HKL[n, 2], I[n], ss) return outstr def print_symmetry_contributions(self, HKL): @@ -2359,7 +2447,8 @@ def print_symmetry_contributions(self, HKL): # Calculate the structure factors uvw, type, label, occ, uiso, mxmymz = self.xtl.Structure.get() Qmag = self.xtl.Cell.Qmag(HKL) - ff = fc.xray_scattering_factor(type, Qmag) + # ff = fc.xray_scattering_factor(type, Qmag) + ff = self.scattering_factors(HKL) dw = fc.debyewaller(uiso, Qmag) dot_KR = np.dot(HKL, uvw.T) phase = np.exp(1j * 2 * np.pi * dot_KR) diff --git a/Dans_Diffraction/data/McPhase_Mag_FormFactors.txt b/Dans_Diffraction/data/McPhase_Mag_FormFactors.txt new file mode 100644 index 0000000..4338de2 --- /dev/null +++ b/Dans_Diffraction/data/McPhase_Mag_FormFactors.txt @@ -0,0 +1,562 @@ +# Magnetic Form Factor, Coefficients of the analytical approximation +# Downloaded from McPhase website, 10/5/2020 +# http://www.mcphase.de/manual/node130.html +# form factors for 3d transition elements and their ions +# +Sc0 j0 j0A= 0.2512 j0a=90.0296 j0B= 0.3290 j0b=39.4021 j0C= 0.4235 j0c=14.3222 j0D=-0.0043 +Sc1 j0 j0A= 0.4889 j0a=51.1603 j0B= 0.5203 j0b=14.0764 j0C=-0.0286 j0c= 0.1792 j0D= 0.0185 +Sc2 j0 j0A= 0.5048 j0a=31.4035 j0B= 0.5186 j0b=10.9897 j0C=-0.0241 j0c= 1.1831 j0D= 0.0000 +Ti0 j0 j0A= 0.4657 j0a=33.5898 j0B= 0.5490 j0b= 9.8791 j0C=-0.0291 j0c= 0.3232 j0D= 0.0123 +Ti1 j0 j0A= 0.5093 j0a=36.7033 j0B= 0.5032 j0b=10.3713 j0C=-0.0263 j0c= 0.3106 j0D= 0.0116 +Ti2 j0 j0A= 0.5091 j0a=24.9763 j0B= 0.5162 j0b= 8.7569 j0C=-0.0281 j0c= 0.9160 j0D= 0.0015 +Ti3 j0 j0A= 0.3571 j0a=22.8413 j0B= 0.6688 j0b= 8.9306 j0C=-0.0354 j0c= 0.4833 j0D= 0.0099 +V0 j0 j0A= 0.4086 j0a=28.8109 j0B= 0.6077 j0b= 8.5437 j0C=-0.0295 j0c= 0.2768 j0D= 0.0123 +V1 j0 j0A= 0.4444 j0a=32.6479 j0B= 0.5683 j0b= 9.0971 j0C=-0.2285 j0c= 0.0218 j0D= 0.2150 +V2 j0 j0A= 0.4085 j0a=23.8526 j0B= 0.6091 j0b= 8.2456 j0C=-0.1676 j0c= 0.0415 j0D= 0.1496 +V3 j0 j0A= 0.3598 j0a=19.3364 j0B= 0.6632 j0b= 7.6172 j0C=-0.3064 j0c= 0.0296 j0D= 0.2835 +V4 j0 j0A= 0.3106 j0a=16.8160 j0B= 0.7198 j0b= 7.0487 j0C=-0.0521 j0c= 0.3020 j0D= 0.0221 +Cr0 j0 j0A= 0.1135 j0a=45.1990 j0B= 0.3481 j0b=19.4931 j0C= 0.5477 j0c= 7.3542 j0D=-0.0092 +Cr1 j0 j0A=-0.0977 j0a= 0.0470 j0B= 0.4544 j0b=26.0054 j0C= 0.5579 j0c= 7.4892 j0D= 0.0831 +Cr2 j0 j0A= 1.2024 j0a=-0.0055 j0B= 0.4158 j0b=20.5475 j0C= 0.6032 j0c= 6.9560 j0D=-1.2218 +Cr3 j0 j0A=-0.3094 j0a= 0.0274 j0B= 0.3680 j0b=17.0355 j0C= 0.6559 j0c= 6.5236 j0D= 0.2856 +Cr4 j0 j0A=-0.2320 j0a= 0.0433 j0B= 0.3101 j0b=14.9518 j0C= 0.7182 j0c= 6.1726 j0D= 0.2042 +Mn0 j0 j0A= 0.2438 j0a=24.9629 j0B= 0.1472 j0b=15.6728 j0C= 0.6189 j0c= 6.5403 j0D=-0.0105 +Mn1 j0 j0A=-0.0138 j0a= 0.4213 j0B= 0.4231 j0b=24.6680 j0C= 0.5905 j0c= 6.6545 j0D=-0.0010 +Mn2 j0 j0A= 0.4220 j0a=17.6840 j0B= 0.5948 j0b= 6.0050 j0C= 0.0043 j0c=-0.6090 j0D=-0.0219 +Mn3 j0 j0A= 0.4198 j0a=14.2829 j0B= 0.6054 j0b= 5.4689 j0C= 0.9241 j0c=-0.0088 j0D=-0.9498 +Mn4 j0 j0A= 0.3760 j0a=12.5661 j0B= 0.6602 j0b= 5.1329 j0C=-0.0372 j0c= 0.5630 j0D= 0.0011 +Mn5 j0 j0A= 0.2924 j0a=11.6655 j0B= 0.7405 j0b= 5.0741 j0C=-1.7883 j0c= 0.0059 j0D= 1.7557 +Fe0 j0 j0A= 0.0706 j0a=35.0085 j0B= 0.3589 j0b=15.3583 j0C= 0.5819 j0c= 5.5606 j0D=-0.0114 +Fe1 j0 j0A= 0.1251 j0a=34.9633 j0B= 0.3629 j0b=15.5144 j0C= 0.5223 j0c= 5.5914 j0D=-0.0105 +Fe2 j0 j0A= 0.0263 j0a=34.9597 j0B= 0.3668 j0b=15.9435 j0C= 0.6188 j0c= 5.5935 j0D=-0.0119 +Fe3 j0 j0A= 0.3972 j0a=13.2442 j0B= 0.6295 j0b= 4.9034 j0C=-0.0314 j0c= 0.3496 j0D= 0.0044 +Fe4 j0 j0A= 0.3782 j0a=11.3800 j0B= 0.6556 j0b= 4.5920 j0C=-0.0346 j0c= 0.4833 j0D= 0.0005 +Co0 j0 j0A= 0.4139 j0a=16.1616 j0B= 0.6013 j0b= 4.7805 j0C=-0.1518 j0c= 0.0210 j0D= 0.1345 +Co1 j0 j0A= 0.0990 j0a=33.1252 j0B= 0.3645 j0b=15.1768 j0C= 0.5470 j0c= 5.0081 j0D=-0.0109 +Co2 j0 j0A= 0.4332 j0a=14.3553 j0B= 0.5857 j0b= 4.6077 j0C=-0.0382 j0c= 0.1338 j0D= 0.0179 +Co3 j0 j0A= 0.3902 j0a=12.5078 j0B= 0.6324 j0b= 4.4574 j0C=-0.1500 j0c= 0.0343 j0D= 0.1272 +Co4 j0 j0A= 0.3515 j0a=10.7785 j0B= 0.6778 j0b= 4.2343 j0C=-0.0389 j0c= 0.2409 j0D= 0.0098 +Ni0 j0 j0A=-0.0172 j0a=35.7392 j0B= 0.3174 j0b=14.2689 j0C= 0.7136 j0c= 4.5661 j0D=-0.0143 +Ni1 j0 j0A= 0.0705 j0a=35.8561 j0B= 0.3984 j0b=13.8042 j0C= 0.5427 j0c= 4.3965 j0D=-0.0118 +Ni2 j0 j0A= 0.0163 j0a=35.8826 j0B= 0.3916 j0b=13.2233 j0C= 0.6052 j0c= 4.3388 j0D=-0.0133 +Ni3 j0 j0A= 0.0012 j0a=34.9998 j0B= 0.3468 j0b=11.9874 j0C= 0.6667 j0c= 4.2518 j0D=-0.0148 +Ni4 j0 j0A=-0.0090 j0a=35.8614 j0B= 0.2776 j0b=11.7904 j0C= 0.7474 j0c= 4.2011 j0D=-0.0163 +Cu0 j0 j0A= 0.0909 j0a=34.9838 j0B= 0.4088 j0b=11.4432 j0C= 0.5128 j0c= 3.8248 j0D=-0.0124 +Cu1 j0 j0A= 0.0749 j0a=34.9656 j0B= 0.4147 j0b=11.7642 j0C= 0.5238 j0c= 3.8497 j0D=-0.0127 +Cu2 j0 j0A= 0.0232 j0a=34.9686 j0B= 0.4023 j0b=11.5640 j0C= 0.5882 j0c= 3.8428 j0D=-0.0137 +Cu3 j0 j0A= 0.0031 j0a=34.9074 j0B= 0.3582 j0b=10.9138 j0C= 0.6531 j0c= 3.8279 j0D=-0.0147 +Cu4 j0 j0A=-0.0132 j0a=30.6817 j0B= 0.2801 j0b=11.1626 j0C= 0.7490 j0c= 3.8172 j0D=-0.0165 +# +# form factors for 4d atoms and ions +# +Y0 j0 j0A= 0.5915 j0a=67.6081 j0B= 1.5123 j0b=17.9004 j0C=-1.1130 j0c=14.1359 j0D= 0.0080 +Zr0 j0 j0A= 0.4106 j0a=59.9961 j0B= 1.0543 j0b=18.6476 j0C=-0.4751 j0c=10.5400 j0D= 0.0106 +Zr1 j0 j0A= 0.4532 j0a=59.5948 j0B= 0.7834 j0b=21.4357 j0C=-0.2451 j0c= 9.0360 j0D= 0.0098 +Nb0 j0 j0A= 0.3946 j0a=49.2297 j0B= 1.3197 j0b=14.8216 j0C=-0.7269 j0c= 9.6156 j0D= 0.0129 +Nb1 j0 j0A= 0.4572 j0a=49.9182 j0B= 1.0274 j0b=15.7256 j0C=-0.4962 j0c= 9.1573 j0D= 0.0118 +Mo0 j0 j0A= 0.1806 j0a=49.0568 j0B= 1.2306 j0b=14.7859 j0C=-0.4268 j0c= 6.9866 j0D= 0.0171 +Mo1 j0 j0A= 0.3500 j0a=48.0354 j0B= 1.0305 j0b=15.0604 j0C=-0.3929 j0c= 7.4790 j0D= 0.0139 +Tc0 j0 j0A= 0.1298 j0a=49.6611 j0B= 1.1656 j0b=14.1307 j0C=-0.3134 j0c= 5.5129 j0D= 0.0195 +Tc1 j0 j0A= 0.2674 j0a=48.9566 j0B= 0.9569 j0b=15.1413 j0C=-0.2387 j0c= 5.4578 j0D= 0.0160 +Ru0 j0 j0A= 0.1069 j0a=49.4238 j0B= 1.1912 j0b=12.7417 j0C=-0.3176 j0c= 4.9125 j0D= 0.0213 +Ru1 j0 j0A= 0.4410 j0a=33.3086 j0B= 1.4775 j0b= 9.5531 j0C=-0.9361 j0c= 6.7220 j0D= 0.0176 +Rh0 j0 j0A= 0.0976 j0a=49.8825 j0B= 1.1601 j0b=11.8307 j0C=-0.2789 j0c= 4.1266 j0D= 0.0234 +Rh1 j0 j0A= 0.3342 j0a=29.7564 j0B= 1.2209 j0b= 9.4384 j0C=-0.5755 j0c= 5.3320 j0D= 0.0210 +Pd0 j0 j0A= 0.2003 j0a=29.3633 j0B= 1.1446 j0b= 9.5993 j0C=-0.3689 j0c= 4.0423 j0D= 0.0251 +Pd1 j0 j0A= 0.5033 j0a=24.5037 j0B= 1.9982 j0b= 6.9082 j0C=-1.5240 j0c= 5.5133 j0D= 0.0213 +# +# form factors for rare earth ions +# +Ce2 j0 j0A= 0.2953 j0a=17.6846 j0B= 0.2923 j0b= 6.7329 j0C= 0.4313 j0c= 5.3827 j0D=-0.0194 +Nd2 j0 j0A= 0.1645 j0a=25.0453 j0B= 0.2522 j0b=11.9782 j0C= 0.6012 j0c= 4.9461 j0D=-0.0180 +Nd3 j0 j0A= 0.0540 j0a=25.0293 j0B= 0.3101 j0b=12.1020 j0C= 0.6575 j0c= 4.7223 j0D=-0.0216 +Sm2 j0 j0A= 0.0909 j0a=25.2032 j0B= 0.3037 j0b=11.8562 j0C= 0.6250 j0c= 4.2366 j0D=-0.0200 +Sm3 j0 j0A= 0.0288 j0a=25.2068 j0B= 0.2973 j0b=11.8311 j0C= 0.6954 j0c= 4.2117 j0D=-0.0213 +Eu2 j0 j0A= 0.0755 j0a=25.2960 j0B= 0.3001 j0b=11.5993 j0C= 0.6438 j0c= 4.0252 j0D=-0.0196 +Eu3 j0 j0A= 0.0204 j0a=25.3078 j0B= 0.3010 j0b=11.4744 j0C= 0.7005 j0c= 3.9420 j0D=-0.0220 +Gd2 j0 j0A= 0.0636 j0a=25.3823 j0B= 0.3033 j0b=11.2125 j0C= 0.6528 j0c= 3.7877 j0D=-0.0199 +Gd3 j0 j0A= 0.0186 j0a=25.3867 j0B= 0.2895 j0b=11.1421 j0C= 0.7135 j0c= 3.7520 j0D=-0.0217 +Tb2 j0 j0A= 0.0547 j0a=25.5086 j0B= 0.3171 j0b=10.5911 j0C= 0.6490 j0c= 3.5171 j0D=-0.0212 +Tb3 j0 j0A= 0.0177 j0a=25.5095 j0B= 0.2921 j0b=10.5769 j0C= 0.7133 j0c= 3.5122 j0D=-0.0231 +Dy2 j0 j0A= 0.1308 j0a=18.3155 j0B= 0.3118 j0b= 7.6645 j0C= 0.5795 j0c= 3.1469 j0D=-0.0226 +Dy3 j0 j0A= 0.1157 j0a=15.0732 j0B= 0.3270 j0b= 6.7991 j0C= 0.5821 j0c= 3.0202 j0D=-0.0249 +Ho2 j0 j0A= 0.0995 j0a=18.1761 j0B= 0.3305 j0b= 7.8556 j0C= 0.5921 j0c= 2.9799 j0D=-0.0230 +Ho3 j0 j0A= 0.0566 j0a=18.3176 j0B= 0.3365 j0b= 7.6880 j0C= 0.6317 j0c= 2.9427 j0D=-0.0248 +Er2 j0 j0A= 0.1122 j0a=18.1223 j0B= 0.3462 j0b= 6.9106 j0C= 0.5649 j0c= 2.7614 j0D=-0.0235 +Er3 j0 j0A= 0.0586 j0a=17.9802 j0B= 0.3540 j0b= 7.0964 j0C= 0.6126 j0c= 2.7482 j0D=-0.0251 +Tm2 j0 j0A= 0.0983 j0a=18.3236 j0B= 0.3380 j0b= 6.9178 j0C= 0.5875 j0c= 2.6622 j0D=-0.0241 +Tm3 j0 j0A= 0.0581 j0a=15.0922 j0B= 0.2787 j0b= 7.8015 j0C= 0.6854 j0c= 2.7931 j0D=-0.0224 +Yb2 j0 j0A= 0.0855 j0a=18.5123 j0B= 0.2943 j0b= 7.3734 j0C= 0.6412 j0c= 2.6777 j0D=-0.0213 +Yb3 j0 j0A= 0.0416 j0a=16.0949 j0B= 0.2849 j0b= 7.8341 j0C= 0.6961 j0c= 2.6725 j0D=-0.0229 +Pr3 j0 j0A= 0.0504 j0a=24.9989 j0B= 0.2572 j0b=12.0377 j0C= 0.7142 j0c= 5.0039 j0D=-0.0219 +# +# Form factors for actinide ions +# +U3 j0 j0A= 0.5058 j0a=23.2882 j0B= 1.3464 j0b= 7.0028 j0C=-0.8724 j0c= 4.8683 j0D= 0.0192 +U4 j0 j0A= 0.3291 j0a=23.5475 j0B= 1.0836 j0b= 8.4540 j0C=-0.4340 j0c= 4.1196 j0D= 0.0214 +U5 j0 j0A= 0.3650 j0a=19.8038 j0B= 3.2199 j0b= 6.2818 j0C=-2.6077 j0c= 5.3010 j0D= 0.0233 +Np3 j0 j0A= 0.5157 j0a=20.8654 j0B= 2.2784 j0b= 5.8930 j0C=-1.8163 j0c= 4.8457 j0D= 0.0211 +Np4 j0 j0A= 0.4206 j0a=19.8046 j0B= 2.8004 j0b= 5.9783 j0C=-2.2436 j0c= 4.9848 j0D= 0.0228 +Np5 j0 j0A= 0.3692 j0a=18.1900 j0B= 3.1510 j0b= 5.8500 j0C=-2.5446 j0c= 4.9164 j0D= 0.0248 +Np6 j0 j0A= 0.2929 j0a=17.5611 j0B= 3.4866 j0b= 5.7847 j0C=-2.8066 j0c= 4.8707 j0D= 0.0267 +Pu3 j0 j0A= 0.3840 j0a=16.6793 j0B= 3.1049 j0b= 5.4210 j0C=-2.5148 j0c= 4.5512 j0D= 0.0263 +Pu4 j0 j0A= 0.4934 j0a=16.8355 j0B= 1.6394 j0b= 5.6384 j0C=-1.1581 j0c= 4.1399 j0D= 0.0248 +Pu5 j0 j0A= 0.3888 j0a=16.5592 j0B= 2.0362 j0b= 5.6567 j0C=-1.4515 j0c= 4.2552 j0D= 0.0267 +Pu6 j0 j0A= 0.3172 j0a=16.0507 j0B= 3.4654 j0b= 5.3507 j0C=-2.8102 j0c= 4.5133 j0D= 0.0281 +Am2 j0 j0A= 0.4743 j0a=21.7761 j0B= 1.5800 j0b= 5.6902 j0C=-1.0779 j0c= 4.1451 j0D= 0.0218 +Am3 j0 j0A= 0.4239 j0a=19.5739 j0B= 1.4573 j0b= 5.8722 j0C=-0.9052 j0c= 3.9682 j0D= 0.0238 +Am4 j0 j0A= 0.3737 j0a=17.8625 j0B= 1.3521 j0b= 6.0426 j0C=-0.7514 j0c= 3.7199 j0D= 0.0258 +Am5 j0 j0A= 0.2956 j0a=17.3725 j0B= 1.4525 j0b= 6.0734 j0C=-0.7755 j0c= 3.6619 j0D= 0.0277 +Am6 j0 j0A= 0.2302 j0a=16.9533 j0B= 1.4864 j0b= 6.1159 j0C=-0.7457 j0c= 3.5426 j0D= 0.0294 +Am7 j0 j0A= 0.3601 j0a=12.7299 j0B= 1.9640 j0b= 5.1203 j0C=-1.3560 j0c= 3.7142 j0D= 0.0316 +# +# form factors for 3d transition elements and their ions +# +Sc0 j2 j2A=10.8172 j2a=54.3270 j2B= 4.7353 j2b=14.8471 j2C= 0.6071 j2c= 4.2180 j2D= 0.0011 +Sc1 j2 j2A= 8.5021 j2a=34.2851 j2B= 3.2116 j2b=10.9940 j2C= 0.4244 j2c= 3.6055 j2D= 0.0009 +Sc2 j2 j2A= 4.3683 j2a=28.6544 j2B= 3.7231 j2b=10.8233 j2C= 0.6074 j2c= 3.6678 j2D= 0.0014 +Ti0 j2 j2A= 4.3583 j2a=36.0556 j2B= 3.8230 j2b=11.1328 j2C= 0.6855 j2c= 3.4692 j2D= 0.0020 +Ti1 j2 j2A= 6.1567 j2a=27.2754 j2B= 2.6833 j2b= 8.9827 j2C= 0.4070 j2c= 3.0524 j2D= 0.0011 +Ti2 j2 j2A= 4.3107 j2a=18.3484 j2B= 2.0960 j2b= 6.7970 j2C= 0.2984 j2c= 2.5476 j2D= 0.0007 +Ti3 j2 j2A= 3.3717 j2a=14.4441 j2B= 1.8258 j2b= 5.7126 j2C= 0.2470 j2c= 2.2654 j2D= 0.0005 +V0 j2 j2A= 3.7600 j2a=21.8313 j2B= 2.4026 j2b= 7.5458 j2C= 0.4464 j2c= 2.6628 j2D= 0.0017 +V1 j2 j2A= 4.7474 j2a=23.3226 j2B= 2.3609 j2b= 7.8082 j2C= 0.4105 j2c= 2.7063 j2D= 0.0014 +V2 j2 j2A= 3.4386 j2a=16.5303 j2B= 1.9638 j2b= 6.1415 j2C= 0.2997 j2c= 2.2669 j2D= 0.0009 +V3 j2 j2A= 2.3005 j2a=14.6821 j2B= 2.0364 j2b= 6.1304 j2C= 0.4099 j2c= 2.3815 j2D= 0.0014 +V4 j2 j2A= 1.8377 j2a=12.2668 j2B= 1.8247 j2b= 5.4578 j2C= 0.3979 j2c= 2.2483 j2D= 0.0012 +Cr0 j2 j2A= 3.4085 j2a=20.1267 j2B= 2.1006 j2b= 6.8020 j2C= 0.4266 j2c= 2.3941 j2D= 0.0019 +Cr1 j2 j2A= 3.7768 j2a=20.3456 j2B= 2.1028 j2b= 6.8926 j2C= 0.4010 j2c= 2.4114 j2D= 0.0017 +Cr2 j2 j2A= 2.6422 j2a=16.0598 j2B= 1.9198 j2b= 6.2531 j2C= 0.4446 j2c= 2.3715 j2D= 0.0020 +Cr3 j2 j2A= 1.6262 j2a=15.0656 j2B= 2.0618 j2b= 6.2842 j2C= 0.5281 j2c= 2.3680 j2D= 0.0023 +Cr4 j2 j2A= 1.0293 j2a=13.9498 j2B= 1.9933 j2b= 6.0593 j2C= 0.5974 j2c= 2.3457 j2D= 0.0027 +Mn0 j2 j2A= 2.6681 j2a=16.0601 j2B= 1.7561 j2b= 5.6396 j2C= 0.3675 j2c= 2.0488 j2D= 0.0017 +Mn1 j2 j2A= 3.2953 j2a=18.6950 j2B= 1.8792 j2b= 6.2403 j2C= 0.3927 j2c= 2.2006 j2D= 0.0022 +Mn2 j2 j2A= 2.0515 j2a=15.5561 j2B= 1.8841 j2b= 6.0625 j2C= 0.4787 j2c= 2.2323 j2D= 0.0027 +Mn3 j2 j2A= 1.2427 j2a=14.9966 j2B= 1.9567 j2b= 6.1181 j2C= 0.5732 j2c= 2.2577 j2D= 0.0031 +Mn4 j2 j2A= 0.7879 j2a=13.8857 j2B= 1.8717 j2b= 5.7433 j2C= 0.5981 j2c= 2.1818 j2D= 0.0034 +Mn5 j2 j2A=-0.2394 j2a=10.7309 j2B=-0.1190 j2b= 6.5989 j2C= 0.3505 j2c= 1.4912 j2D= 0.0078 +Fe0 j2 j2A= 1.9405 j2a=18.4733 j2B= 1.9566 j2b= 6.3234 j2C= 0.5166 j2c= 2.1607 j2D= 0.0036 +Fe1 j2 j2A= 2.6290 j2a=18.6598 j2B= 1.8704 j2b= 6.3313 j2C= 0.4690 j2c= 2.1628 j2D= 0.0031 +Fe2 j2 j2A= 1.6490 j2a=16.5593 j2B= 1.9064 j2b= 6.1325 j2C= 0.5206 j2c= 2.1370 j2D= 0.0035 +Fe3 j2 j2A= 1.3602 j2a=11.9976 j2B= 1.5188 j2b= 5.0025 j2C= 0.4705 j2c= 1.9914 j2D= 0.0038 +Fe4 j2 j2A= 1.5582 j2a= 8.2750 j2B= 1.1863 j2b= 3.2794 j2C= 0.1366 j2c= 1.1068 j2D=-0.0022 +Co0 j2 j2A= 1.9678 j2a=14.1699 j2B= 1.4911 j2b= 4.9475 j2C= 0.3844 j2c= 1.7973 j2D= 0.0027 +Co1 j2 j2A= 2.4097 j2a=16.1608 j2B= 1.5780 j2b= 5.4604 j2C= 0.4095 j2c= 1.9141 j2D= 0.0031 +Co2 j2 j2A= 1.9049 j2a=11.6444 j2B= 1.3159 j2b= 4.3574 j2C= 0.3146 j2c= 1.6453 j2D= 0.0017 +Co3 j2 j2A= 1.7058 j2a= 8.8595 j2B= 1.1409 j2b= 3.3086 j2C= 0.1474 j2c= 1.0899 j2D=-0.0025 +Co4 j2 j2A= 1.3110 j2a= 8.0252 j2B= 1.1551 j2b= 3.1792 j2C= 0.1608 j2c= 1.1301 j2D=-0.0011 +Ni0 j2 j2A= 1.0302 j2a=12.2521 j2B= 1.4669 j2b= 4.7453 j2C= 0.4521 j2c= 1.7437 j2D= 0.0036 +Ni1 j2 j2A= 2.1040 j2a=14.8655 j2B= 1.4302 j2b= 5.0714 j2C= 0.4031 j2c= 1.7784 j2D= 0.0034 +Ni2 j2 j2A= 1.7080 j2a=11.0160 j2B= 1.2147 j2b= 4.1031 j2C= 0.3150 j2c= 1.5334 j2D= 0.0018 +Ni3 j2 j2A= 1.4683 j2a= 8.6713 j2B= 1.1068 j2b= 3.2574 j2C= 0.1794 j2c= 1.1058 j2D=-0.0023 +Ni4 j2 j2A= 1.1612 j2a= 7.7000 j2B= 1.0027 j2b= 3.2628 j2C= 0.2719 j2c= 1.3780 j2D= 0.0025 +Cu0 j2 j2A= 1.9182 j2a=14.4904 j2B= 1.3329 j2b= 4.7301 j2C= 0.3842 j2c= 1.6394 j2D= 0.0035 +Cu1 j2 j2A= 1.8814 j2a=13.4333 j2B= 1.2809 j2b= 4.5446 j2C= 0.3646 j2c= 1.6022 j2D= 0.0033 +Cu2 j2 j2A= 1.5189 j2a=10.4779 j2B= 1.1512 j2b= 3.8132 j2C= 0.2918 j2c= 1.3979 j2D= 0.0017 +Cu3 j2 j2A= 1.2797 j2a= 8.4502 j2B= 1.0315 j2b= 3.2796 j2C= 0.2401 j2c= 1.2498 j2D= 0.0015 +Cu4 j2 j2A= 0.9568 j2a= 7.4481 j2B= 0.9099 j2b= 3.3964 j2C= 0.3729 j2c= 1.4936 j2D= 0.0049 +# +# form factors for 4d atoms and ions +# +Y0 j2 j2A=14.4084 j2a=44.6577 j2B= 5.1045 j2b=14.9043 j2C=-0.0535 j2c= 3.3189 j2D= 0.0028 +Zr0 j2 j2A=10.1378 j2a=35.3372 j2B= 4.7734 j2b=12.5453 j2C=-0.0489 j2c= 2.6721 j2D= 0.0036 +Zr1 j2 j2A=11.8722 j2a=34.9200 j2B= 4.0502 j2b=12.1266 j2C=-0.0632 j2c= 2.8278 j2D= 0.0034 +Nb0 j2 j2A= 7.4796 j2a=33.1789 j2B= 5.0884 j2b=11.5708 j2C=-0.0281 j2c= 1.5635 j2D= 0.0047 +Nb1 j2 j2A= 8.7735 j2a=33.2848 j2B= 4.6556 j2b=11.6046 j2C=-0.0268 j2c= 1.5389 j2D= 0.0044 +Mo0 j2 j2A= 5.1180 j2a=23.4217 j2B= 4.1809 j2b= 9.2080 j2C=-0.0505 j2c= 1.7434 j2D= 0.0053 +Mo1 j2 j2A= 7.2367 j2a=28.1282 j2B= 4.0705 j2b= 9.9228 j2C=-0.0317 j2c= 1.4552 j2D= 0.0049 +Tc0 j2 j2A= 4.2441 j2a=21.3974 j2B= 3.9439 j2b= 8.3753 j2C=-0.0371 j2c= 1.1870 j2D= 0.0066 +Tc1 j2 j2A= 6.4056 j2a=24.8243 j2B= 3.5400 j2b= 8.6112 j2C=-0.0366 j2c= 1.4846 j2D= 0.0044 +Ru0 j2 j2A= 3.7445 j2a=18.6128 j2B= 3.4749 j2b= 7.4201 j2C=-0.0363 j2c= 1.0068 j2D= 0.0073 +Ru1 j2 j2A= 5.2826 j2a=23.6832 j2B= 3.5813 j2b= 8.1521 j2C=-0.0257 j2c= 0.4255 j2D= 0.0131 +Rh0 j2 j2A= 3.3651 j2a=17.3444 j2B= 3.2121 j2b= 6.8041 j2C=-0.0350 j2c= 0.5031 j2D= 0.0146 +Rh1 j2 j2A= 4.0260 j2a=18.9497 j2B= 3.1663 j2b= 6.9998 j2C=-0.0296 j2c= 0.4862 j2D= 0.0127 +Pd0 j2 j2A= 3.3105 j2a=14.7265 j2B= 2.6332 j2b= 5.8618 j2C=-0.0437 j2c= 1.1303 j2D= 0.0053 +Pd1 j2 j2A= 4.2749 j2a=17.9002 j2B= 2.7021 j2b= 6.3541 j2C=-0.0258 j2c= 0.6999 j2D= 0.0071 +# +# form factors for rare earth ions +# +Ce2 j2 j2A= 0.9809 j2a=18.0630 j2B= 1.8413 j2b= 7.7688 j2C= 0.9905 j2c= 2.8452 j2D= 0.0120 +Nd2 j2 j2A= 1.4530 j2a=18.3398 j2B= 1.6196 j2b= 7.2854 j2C= 0.8752 j2c= 2.6224 j2D= 0.0126 +Nd3 j2 j2A= 0.6751 j2a=18.3421 j2B= 1.6272 j2b= 7.2600 j2C= 0.9644 j2c= 2.6016 j2D= 0.0150 +Sm2 j2 j2A= 1.0360 j2a=18.4249 j2B= 1.4769 j2b= 7.0321 j2C= 0.8810 j2c= 2.4367 j2D= 0.0152 +Sm3 j2 j2A= 0.4707 j2a=18.4301 j2B= 1.4261 j2b= 7.0336 j2C= 0.9574 j2c= 2.4387 j2D= 0.0182 +Eu2 j2 j2A= 0.8970 j2a=18.4429 j2B= 1.3769 j2b= 7.0054 j2C= 0.9060 j2c= 2.4213 j2D= 0.0190 +Eu3 j2 j2A= 0.3985 j2a=18.4514 j2B= 1.3307 j2b= 6.9556 j2C= 0.9603 j2c= 2.3780 j2D= 0.0197 +Gd2 j2 j2A= 0.7756 j2a=18.4695 j2B= 1.3124 j2b= 6.8990 j2C= 0.8956 j2c= 2.3383 j2D= 0.0199 +Gd3 j2 j2A= 0.3347 j2a=18.4758 j2B= 1.2465 j2b= 6.8767 j2C= 0.9537 j2c= 2.3184 j2D= 0.0217 +Tb2 j2 j2A= 0.6688 j2a=18.4909 j2B= 1.2487 j2b= 6.8219 j2C= 0.8888 j2c= 2.2751 j2D= 0.0215 +Tb3 j2 j2A= 0.2892 j2a=18.4973 j2B= 1.1678 j2b= 6.7972 j2C= 0.9437 j2c= 2.2573 j2D= 0.0232 +Dy2 j2 j2A= 0.5917 j2a=18.5114 j2B= 1.1828 j2b= 6.7465 j2C= 0.8801 j2c= 2.2141 j2D= 0.0229 +Dy3 j2 j2A= 0.2523 j2a=18.5172 j2B= 1.0914 j2b= 6.7362 j2C= 0.9345 j2c= 2.2082 j2D= 0.0250 +Ho2 j2 j2A= 0.5094 j2a=18.5155 j2B= 1.1234 j2b= 6.7060 j2C= 0.8727 j2c= 2.1589 j2D= 0.0242 +Ho3 j2 j2A= 0.2188 j2a=18.5157 j2B= 1.0240 j2b= 6.7070 j2C= 0.9251 j2c= 2.1614 j2D= 0.0268 +Er2 j2 j2A= 0.4693 j2a=18.5278 j2B= 1.0545 j2b= 6.6493 j2C= 0.8679 j2c= 2.1201 j2D= 0.0261 +Er3 j2 j2A= 0.1710 j2a=18.5337 j2B= 0.9879 j2b= 6.6246 j2C= 0.9044 j2c= 2.1004 j2D= 0.0278 +Tm2 j2 j2A= 0.4198 j2a=18.5417 j2B= 0.9959 j2b= 6.6002 j2C= 0.8593 j2c= 2.0818 j2D= 0.0284 +Tm3 j2 j2A= 0.1760 j2a=18.5417 j2B= 0.9105 j2b= 6.5787 j2C= 0.8970 j2c= 2.0622 j2D= 0.0294 +Yb2 j2 j2A= 0.3852 j2a=18.5497 j2B= 0.9415 j2b= 6.5507 j2C= 0.8492 j2c= 2.0425 j2D= 0.0301 +Yb3 j2 j2A= 0.1570 j2a=18.5553 j2B= 0.8484 j2b= 6.5403 j2C= 0.8880 j2c= 2.0367 j2D= 0.0318 +Pr3 j2 j2A= 0.8734 j2a=18.9876 j2B= 1.5594 j2b= 6.0872 j2C= 0.8142 j2c= 2.4150 j2D= 0.0111 +# +# Form factors for actinide ions +# +U3 j2 j2A= 4.1582 j2a=16.5336 j2B= 2.4675 j2b= 5.9516 j2C=-0.0252 j2c= 0.7646 j2D= 0.0057 +U4 j2 j2A= 3.7449 j2a=13.8944 j2B= 2.6453 j2b= 4.8634 j2C=-0.5218 j2c= 3.1919 j2D= 0.0009 +U5 j2 j2A= 3.0724 j2a=12.5460 j2B= 2.3076 j2b= 5.2314 j2C=-0.0644 j2c= 1.4738 j2D= 0.0035 +Np3 j2 j2A= 3.7170 j2a=15.1333 j2B= 2.3216 j2b= 5.5025 j2C=-0.0275 j2c= 0.7996 j2D= 0.0052 +Np4 j2 j2A= 2.9203 j2a=14.6463 j2B= 2.5979 j2b= 5.5592 j2C=-0.0301 j2c= 0.3669 j2D= 0.0141 +Np5 j2 j2A= 2.3308 j2a=13.6540 j2B= 2.7219 j2b= 5.4935 j2C=-0.1357 j2c= 0.0493 j2D= 0.1224 +Np6 j2 j2A= 1.8245 j2a=13.1803 j2B= 2.8508 j2b= 5.4068 j2C=-0.1579 j2c= 0.0444 j2D= 0.1438 +Pu3 j2 j2A= 2.0885 j2a=12.8712 j2B= 2.5961 j2b= 5.1896 j2C=-0.1465 j2c= 0.0393 j2D= 0.1343 +Pu4 j2 j2A= 2.7244 j2a=12.9262 j2B= 2.3387 j2b= 5.1633 j2C=-0.1300 j2c= 0.0457 j2D= 0.1177 +Pu5 j2 j2A= 2.1409 j2a=12.8319 j2B= 2.5664 j2b= 5.1522 j2C=-0.1338 j2c= 0.0457 j2D= 0.1210 +Pu6 j2 j2A= 1.7262 j2a=12.3240 j2B= 2.6652 j2b= 5.0662 j2C=-0.1695 j2c= 0.0406 j2D= 0.1550 +Am2 j2 j2A= 3.5237 j2a=15.9545 j2B= 2.2855 j2b= 5.1946 j2C=-0.0142 j2c= 0.5853 j2D= 0.0033 +Am3 j2 j2A= 2.8622 j2a=14.7328 j2B= 2.4099 j2b= 5.1439 j2C=-0.1326 j2c= 0.0309 j2D= 0.1233 +Am4 j2 j2A= 2.4141 j2a=12.9478 j2B= 2.3687 j2b= 4.9447 j2C=-0.2490 j2c= 0.0215 j2D= 0.2371 +Am5 j2 j2A= 2.0109 j2a=12.0534 j2B= 2.4155 j2b= 4.8358 j2C=-0.2264 j2c= 0.0275 j2D= 0.2128 +Am6 j2 j2A= 1.6778 j2a=11.3372 j2B= 2.4531 j2b= 4.7247 j2C=-0.2043 j2c= 0.0337 j2D= 0.1892 +Am7 j2 j2A= 1.8845 j2a= 9.1606 j2B= 2.0746 j2b= 4.0422 j2C=-0.1318 j2c= 1.7227 j2D= 0.0020 +# +# form factors for 3d atoms and ions +# +Sc0 j4 j4A= 1.3420 j4a=10.2000 j4B= 0.3837 j4b= 3.0786 j4C= 0.0468 j4c= 0.1178 j4D=-0.0328 +Sc1 j4 j4A= 7.1167 j4a=15.4872 j4B=-6.6671 j4b=18.2692 j4C= 0.4900 j4c= 2.9917 j4D= 0.0047 +Sc2 j4 j4A=-1.6684 j4a=15.6475 j4B= 1.7742 j4b= 9.0624 j4C= 0.4075 j4c= 2.4116 j4D= 0.0042 +Ti0 j4 j4A=-2.1515 j4a=11.2705 j4B= 2.5149 j4b= 8.8590 j4C= 0.3555 j4c= 2.1491 j4D= 0.0045 +Ti1 j4 j4A=-1.0383 j4a=16.1899 j4B= 1.4699 j4b= 8.9239 j4C= 0.3631 j4c= 2.2834 j4D= 0.0044 +Ti2 j4 j4A=-1.3242 j4a=15.3096 j4B= 1.2042 j4b= 7.8994 j4C= 0.3976 j4c= 2.1562 j4D= 0.0051 +Ti3 j4 j4A=-1.1117 j4a=14.6349 j4B= 0.7689 j4b= 6.9267 j4C= 0.4385 j4c= 2.0886 j4D= 0.0060 +V0 j4 j4A=-0.9633 j4a=15.2729 j4B= 0.9274 j4b= 7.7315 j4C= 0.3891 j4c= 2.0530 j4D= 0.0063 +V1 j4 j4A=-0.9606 j4a=15.5451 j4B= 1.1278 j4b= 8.1182 j4C= 0.3653 j4c= 2.0973 j4D= 0.0056 +V2 j4 j4A=-1.1729 j4a=14.9732 j4B= 0.9092 j4b= 7.6131 j4C= 0.4105 j4c= 2.0391 j4D= 0.0067 +V3 j4 j4A=-0.9417 j4a=14.2045 j4B= 0.5284 j4b= 6.6071 j4C= 0.4411 j4c= 1.9672 j4D= 0.0076 +V4 j4 j4A=-0.7654 j4a=13.0970 j4B= 0.3071 j4b= 5.6739 j4C= 0.4476 j4c= 1.8707 j4D= 0.0081 +Cr0 j4 j4A=-0.6670 j4a=19.6128 j4B= 0.5342 j4b= 6.4779 j4C= 0.3641 j4c= 1.9045 j4D= 0.0073 +Cr1 j4 j4A=-0.8309 j4a=18.0428 j4B= 0.7252 j4b= 7.5313 j4C= 0.3828 j4c= 2.0032 j4D= 0.0073 +Cr2 j4 j4A=-0.8930 j4a=15.6641 j4B= 0.5590 j4b= 7.0333 j4C= 0.4093 j4c= 1.9237 j4D= 0.0081 +Cr3 j4 j4A=-0.7327 j4a=14.0727 j4B= 0.3268 j4b= 5.6741 j4C= 0.4114 j4c= 1.8101 j4D= 0.0085 +Cr4 j4 j4A=-0.6748 j4a=12.9462 j4B= 0.1805 j4b= 6.7527 j4C= 0.4526 j4c= 1.7999 j4D= 0.0098 +Mn0 j4 j4A=-0.5452 j4a=15.4713 j4B= 0.4406 j4b= 4.9024 j4C= 0.2884 j4c= 1.5430 j4D= 0.0059 +Mn1 j4 j4A=-0.7947 j4a=17.8673 j4B= 0.6078 j4b= 7.7044 j4C= 0.3798 j4c= 1.9045 j4D= 0.0087 +Mn2 j4 j4A=-0.7416 j4a=15.2555 j4B= 0.3831 j4b= 6.4693 j4C= 0.3935 j4c= 1.7997 j4D= 0.0093 +Mn3 j4 j4A=-0.6603 j4a=13.6066 j4B= 0.2322 j4b= 6.2175 j4C= 0.4104 j4c= 1.7404 j4D= 0.0101 +Mn4 j4 j4A=-0.5127 j4a=13.4613 j4B= 0.0313 j4b= 7.7631 j4C= 0.4282 j4c= 1.7006 j4D= 0.0113 +Mn5 j4 j4A= 1.6706 j4a= 6.6566 j4B=-1.8204 j4b= 6.1942 j4C= 0.1925 j4c= 0.3249 j4D=-0.0433 +Fe0 j4 j4A=-0.5029 j4a=19.6768 j4B= 0.2999 j4b= 3.7762 j4C= 0.2576 j4c= 1.4241 j4D= 0.0071 +Fe1 j4 j4A=-0.5109 j4a=19.2501 j4B= 0.3896 j4b= 4.8913 j4C= 0.2810 j4c= 1.5265 j4D= 0.0069 +Fe2 j4 j4A=-0.5401 j4a=17.2268 j4B= 0.2865 j4b= 3.7422 j4C= 0.2658 j4c= 1.4238 j4D= 0.0076 +Fe3 j4 j4A=-0.5507 j4a=11.4929 j4B= 0.2153 j4b= 4.9063 j4C= 0.3468 j4c= 1.5230 j4D= 0.0095 +Fe4 j4 j4A=-0.5352 j4a= 9.5068 j4B= 0.1783 j4b= 5.1750 j4C= 0.3584 j4c= 1.4689 j4D= 0.0097 +Co0 j4 j4A=-0.4221 j4a=14.1952 j4B= 0.2900 j4b= 3.9786 j4C= 0.2469 j4c= 1.2859 j4D= 0.0063 +Co1 j4 j4A=-0.4115 j4a=14.5615 j4B= 0.3580 j4b= 4.7170 j4C= 0.2644 j4c= 1.4183 j4D= 0.0074 +Co2 j4 j4A=-0.4759 j4a=14.0462 j4B= 0.2747 j4b= 3.7306 j4C= 0.2458 j4c= 1.2504 j4D= 0.0057 +Co3 j4 j4A=-0.4466 j4a=13.3912 j4B= 0.1419 j4b= 3.0110 j4C= 0.2773 j4c= 1.3351 j4D= 0.0093 +Co4 j4 j4A=-0.4091 j4a=13.1937 j4B=-0.0194 j4b= 3.4169 j4C= 0.3534 j4c= 1.4214 j4D= 0.0112 +Ni0 j4 j4A=-0.4428 j4a=14.4850 j4B= 0.0870 j4b= 3.2345 j4C= 0.2932 j4c= 1.3305 j4D= 0.0096 +Ni1 j4 j4A=-0.3836 j4a=13.4246 j4B= 0.3116 j4b= 4.4619 j4C= 0.2471 j4c= 1.3088 j4D= 0.0079 +Ni2 j4 j4A=-0.3803 j4a=10.4033 j4B= 0.2838 j4b= 3.3780 j4C= 0.2108 j4c= 1.1036 j4D= 0.0050 +Ni3 j4 j4A=-0.4014 j4a= 9.0462 j4B= 0.2314 j4b= 3.0753 j4C= 0.2192 j4c= 1.0838 j4D= 0.0060 +Ni4 j4 j4A=-0.3509 j4a= 8.1572 j4B= 0.2220 j4b= 2.1063 j4C= 0.1567 j4c= 0.9253 j4D= 0.0065 +Cu0 j4 j4A=-0.3204 j4a=15.1324 j4B= 0.2335 j4b= 4.0205 j4C= 0.2312 j4c= 1.1957 j4D= 0.0068 +Cu1 j4 j4A=-0.3572 j4a=15.1251 j4B= 0.2336 j4b= 3.9662 j4C= 0.2315 j4c= 1.1967 j4D= 0.0070 +Cu2 j4 j4A=-0.3914 j4a=14.7400 j4B= 0.1275 j4b= 3.3840 j4C= 0.2548 j4c= 1.2552 j4D= 0.0103 +Cu3 j4 j4A=-0.3671 j4a=14.0816 j4B=-0.0078 j4b= 3.3149 j4C= 0.3154 j4c= 1.3767 j4D= 0.0132 +Cu4 j4 j4A=-0.2915 j4a=14.1243 j4B=-0.1065 j4b= 4.2008 j4C= 0.3247 j4c= 1.3516 j4D= 0.0148 +# +# form factors for 4d atoms and ions +# +Y0 j4 j4A=-8.0767 j4a=32.2014 j4B= 7.9197 j4b=25.1563 j4C= 1.4067 j4c= 6.8268 j4D=-0.0001 +Zr0 j4 j4A=-5.2697 j4a=32.8680 j4B= 4.1930 j4b=24.1833 j4C= 1.5202 j4c= 6.0481 j4D=-0.0002 +Zr1 j4 j4A=-5.6384 j4a=33.6071 j4B= 4.6729 j4b=22.3383 j4C= 1.3258 j4c= 5.9245 j4D=-0.0003 +Nb0 j4 j4A=-3.1377 j4a=25.5948 j4B= 2.3411 j4b=16.5686 j4C= 1.2304 j4c= 4.9903 j4D=-0.0005 +Nb1 j4 j4A=-3.3598 j4a=25.8202 j4B= 2.8297 j4b=16.4273 j4C= 1.1203 j4c= 4.9824 j4D=-0.0005 +Mo0 j4 j4A=-2.8860 j4a=20.5717 j4B= 1.8130 j4b=14.6281 j4C= 1.1899 j4c= 4.2638 j4D=-0.0008 +Mo1 j4 j4A=-3.2618 j4a=25.4862 j4B= 2.3596 j4b=16.4622 j4C= 1.1164 j4c= 4.4913 j4D=-0.0007 +Tc0 j4 j4A=-2.7975 j4a=20.1589 j4B= 1.6520 j4b=16.2609 j4C= 1.1726 j4c= 3.9427 j4D=-0.0008 +Tc1 j4 j4A=-2.0470 j4a=19.6830 j4B= 1.6306 j4b=11.5925 j4C= 0.8698 j4c= 3.7689 j4D=-0.0010 +Ru0 j4 j4A=-1.5042 j4a=17.9489 j4B= 0.6027 j4b= 9.9608 j4C= 0.9700 j4c= 3.3927 j4D=-0.0010 +Ru1 j4 j4A=-1.6278 j4a=18.5063 j4B= 1.1828 j4b=10.1886 j4C= 0.8138 j4c= 3.4180 j4D=-0.0009 +Rh0 j4 j4A=-1.3492 j4a=17.5766 j4B= 0.4527 j4b=10.5066 j4C= 0.9285 j4c= 3.1555 j4D=-0.0009 +Rh1 j4 j4A=-1.4673 j4a=17.9572 j4B= 0.7381 j4b= 9.9444 j4C= 0.8485 j4c= 3.1263 j4D=-0.0012 +Pd0 j4 j4A=-1.1955 j4a=17.6282 j4B= 0.3183 j4b=11.3094 j4C= 0.8696 j4c= 2.9089 j4D=-0.0006 +Pd1 j4 j4A=-1.4098 j4a=17.7650 j4B= 0.7927 j4b= 9.9991 j4C= 0.7710 j4c= 2.9297 j4D=-0.0006 +# +# form factors for rare earth ions +# +Ce2 j4 j4A=-0.6468 j4a=10.5331 j4B= 0.4052 j4b= 5.6243 j4C= 0.3412 j4c= 1.5346 j4D= 0.0080 +Nd2 j4 j4A=-0.5744 j4a=10.9304 j4B= 0.4210 j4b= 6.1052 j4C= 0.3124 j4c= 1.4654 j4D= 0.0081 +Nd2 j4 j4A=-0.5416 j4a=12.2043 j4B= 0.3571 j4b= 6.1695 j4C= 0.3154 j4c= 1.4847 j4D= 0.0098 +Nd3 j4 j4A=-0.4053 j4a=14.0141 j4B= 0.0329 j4b= 7.0046 j4C= 0.3759 j4c= 1.7074 j4D= 0.0209 +Sm2 j4 j4A=-0.4150 j4a=14.0570 j4B= 0.1368 j4b= 7.0317 j4C= 0.3272 j4c= 1.5825 j4D= 0.0192 +Sm3 j4 j4A=-0.4288 j4a=10.0525 j4B= 0.1782 j4b= 5.0191 j4C= 0.2833 j4c= 1.2364 j4D= 0.0088 +Eu2 j4 j4A=-0.4145 j4a=10.1930 j4B= 0.2447 j4b= 5.1644 j4C= 0.2661 j4c= 1.2054 j4D= 0.0065 +Eu3 j4 j4A=-0.4095 j4a=10.2113 j4B= 0.1485 j4b= 5.1755 j4C= 0.2720 j4c= 1.2374 j4D= 0.0131 +Gd2 j4 j4A=-0.3824 j4a=10.3436 j4B= 0.1955 j4b= 5.3057 j4C= 0.2622 j4c= 1.2032 j4D= 0.0097 +Gd3 j4 j4A=-0.3621 j4a=10.3531 j4B= 0.1016 j4b= 5.3104 j4C= 0.2649 j4c= 1.2185 j4D= 0.0147 +Tb2 j4 j4A=-0.3443 j4a=10.4686 j4B= 0.1481 j4b= 5.4156 j4C= 0.2575 j4c= 1.1824 j4D= 0.0104 +Tb3 j4 j4A=-0.3228 j4a=10.4763 j4B= 0.0638 j4b= 5.4189 j4C= 0.2566 j4c= 1.1962 j4D= 0.0159 +Dy2 j4 j4A=-0.3206 j4a=12.0714 j4B= 0.0904 j4b= 8.0264 j4C= 0.2616 j4c= 1.2296 j4D= 0.0143 +Dy3 j4 j4A=-0.2829 j4a= 9.5247 j4B= 0.0565 j4b= 4.4292 j4C= 0.2437 j4c= 1.0665 j4D= 0.0092 +Ho2 j4 j4A=-0.2976 j4a= 9.7190 j4B= 0.1224 j4b= 4.6345 j4C= 0.2279 j4c= 1.0052 j4D= 0.0063 +Ho3 j4 j4A=-0.2717 j4a= 9.7313 j4B= 0.0474 j4b= 4.6378 j4C= 0.2292 j4c= 1.0473 j4D= 0.0124 +Er2 j4 j4A=-0.2975 j4a= 9.8294 j4B= 0.1189 j4b= 4.7406 j4C= 0.2116 j4c= 1.0039 j4D= 0.0117 +Er3 j4 j4A=-0.2568 j4a= 9.8339 j4B= 0.0356 j4b= 4.7415 j4C= 0.2172 j4c= 1.0281 j4D= 0.0148 +Tm2 j4 j4A=-0.2677 j4a= 9.8883 j4B= 0.0925 j4b= 4.7838 j4C= 0.2056 j4c= 0.9896 j4D= 0.0124 +Tm3 j4 j4A=-0.2292 j4a= 9.8948 j4B= 0.0124 j4b= 4.7850 j4C= 0.2108 j4c= 1.0071 j4D= 0.0151 +Yb2 j4 j4A=-0.2393 j4a= 9.9469 j4B= 0.0663 j4b= 4.8231 j4C= 0.2009 j4c= 0.9651 j4D= 0.0122 +Yb3 j4 j4A=-0.2121 j4a= 8.1967 j4B= 0.0325 j4b= 3.1533 j4C= 0.1975 j4c= 0.8842 j4D= 0.0093 +Pr3 j4 j4A=-0.3970 j4a=10.9919 j4B= 0.0818 j4b= 5.9897 j4C= 0.3656 j4c= 1.5021 j4D= 0.0110 +# +# Form factors for actinide ions +# +U3 j4 j4A=-0.9859 j4a=16.6010 j4B= 0.6116 j4b= 6.5147 j4C= 0.6020 j4c= 2.5970 j4D=-0.0010 +U4 j4 j4A=-1.0540 j4a=16.6055 j4B= 0.4339 j4b= 6.5119 j4C= 0.6746 j4c= 2.5993 j4D=-0.0011 +U5 j4 j4A=-0.9588 j4a=16.4851 j4B= 0.1576 j4b= 6.4397 j4C= 0.7785 j4c= 2.6402 j4D=-0.0010 +Np3 j4 j4A=-0.9029 j4a=16.5858 j4B= 0.4006 j4b= 6.4699 j4C= 0.6545 j4c= 2.5631 j4D=-0.0004 +Np4 j4 j4A=-0.9887 j4a=12.4415 j4B= 0.5918 j4b= 5.2941 j4C= 0.5306 j4c= 2.2625 j4D=-0.0021 +Np5 j4 j4A=-0.8146 j4a=16.5809 j4B=-0.0055 j4b= 6.4751 j4C= 0.7956 j4c= 2.5623 j4D=-0.0004 +Np6 j4 j4A=-0.6738 j4a=16.5531 j4B=-0.2297 j4b= 6.5055 j4C= 0.8513 j4c= 2.5528 j4D=-0.0003 +Pu3 j4 j4A=-0.7014 j4a=16.3687 j4B=-0.1162 j4b= 6.6971 j4C= 0.7778 j4c= 2.4502 j4D= 0.0000 +Pu4 j4 j4A=-0.9160 j4a=12.2027 j4B= 0.4891 j4b= 5.1274 j4C= 0.5290 j4c= 2.1487 j4D=-0.0022 +Pu5 j4 j4A=-0.7035 j4a=16.3601 j4B=-0.0979 j4b= 6.7057 j4C= 0.7726 j4c= 2.4475 j4D= 0.0000 +Pu6 j4 j4A=-0.5560 j4a=16.3215 j4B=-0.3046 j4b= 6.7685 j4C= 0.8146 j4c= 2.4259 j4D= 0.0001 +Am2 j4 j4A=-0.7433 j4a=16.4163 j4B= 0.3481 j4b= 6.7884 j4C= 0.6014 j4c= 2.3465 j4D= 0.0000 +Am3 j4 j4A=-0.8092 j4a=12.8542 j4B= 0.4161 j4b= 5.4592 j4C= 0.5476 j4c= 2.1721 j4D=-0.0011 +Am4 j4 j4A=-0.8548 j4a=12.2257 j4B= 0.3037 j4b= 5.9087 j4C= 0.6173 j4c= 2.1881 j4D=-0.0016 +Am5 j4 j4A=-0.6538 j4a=15.4625 j4B=-0.0948 j4b= 5.9971 j4C= 0.7295 j4c= 2.2968 j4D= 0.0000 +Am6 j4 j4A=-0.5390 j4a=15.4491 j4B=-0.2689 j4b= 6.0169 j4C= 0.7711 j4c= 2.2970 j4D= 0.0002 +Am7 j4 j4A=-0.4688 j4a=12.0193 j4B=-0.2692 j4b= 7.0415 j4C= 0.7297 j4c= 2.1638 j4D=-0.0011 +# +# form factors for rare earth ions +# +Ce2 j6 j6A=-0.1212 j6a= 7.9940 j6B=-0.0639 j6b= 4.0244 j6C= 0.1519 j6c= 1.0957 j6D= 0.0078 +Nd2 j6 j6A=-0.1600 j6a= 8.0086 j6B= 0.0272 j6b= 4.0284 j6C= 0.1104 j6c= 1.0682 j6D= 0.0139 +Nd3 j6 j6A=-0.0416 j6a= 8.0136 j6B=-0.1261 j6b= 4.0399 j6C= 0.1400 j6c= 1.0873 j6D= 0.0102 +Sm2 j6 j6A=-0.1428 j6a= 6.0407 j6B= 0.0723 j6b= 2.0329 j6C= 0.0550 j6c= 0.5134 j6D= 0.0081 +Sm3 j6 j6A=-0.0944 j6a= 6.0299 j6B=-0.0498 j6b= 2.0743 j6C= 0.1372 j6c= 0.6451 j6D=-0.0132 +Eu2 j6 j6A=-0.1252 j6a= 6.0485 j6B= 0.0507 j6b= 2.0852 j6C= 0.0572 j6c= 0.6460 j6D= 0.0132 +Eu3 j6 j6A=-0.0817 j6a= 6.0389 j6B=-0.0596 j6b= 2.1198 j6C= 0.1243 j6c= 0.7639 j6D=-0.0001 +Gd2 j6 j6A=-0.1351 j6a= 5.0298 j6B= 0.0828 j6b= 2.0248 j6C= 0.0315 j6c= 0.5034 j6D= 0.0187 +Gd3 j6 j6A=-0.0662 j6a= 6.0308 j6B=-0.0850 j6b= 2.1542 j6C= 0.1323 j6c= 0.8910 j6D= 0.0048 +Tb2 j6 j6A=-0.0758 j6a= 6.0319 j6B=-0.0540 j6b= 2.1583 j6C= 0.1199 j6c= 0.8895 j6D= 0.0051 +Tb3 j6 j6A=-0.0559 j6a= 6.0311 j6B=-0.1020 j6b= 2.2365 j6C= 0.1264 j6c= 1.1066 j6D= 0.0167 +Dy2 j6 j6A=-0.0568 j6a= 6.0324 j6B=-0.1003 j6b= 2.2396 j6C= 0.1401 j6c= 1.1062 j6D= 0.0109 +Dy3 j6 j6A=-0.0423 j6a= 6.0376 j6B=-0.1248 j6b= 2.2437 j6C= 0.1359 j6c= 1.2002 j6D= 0.0188 +Ho2 j6 j6A=-0.0725 j6a= 6.0453 j6B=-0.0318 j6b= 2.2428 j6C= 0.0738 j6c= 1.2018 j6D= 0.0252 +Ho3 j6 j6A=-0.0289 j6a= 6.0504 j6B=-0.1545 j6b= 2.2305 j6C= 0.1550 j6c= 1.2605 j6D= 0.0177 +Er2 j6 j6A=-0.0648 j6a= 6.0559 j6B=-0.0515 j6b= 2.2303 j6C= 0.0825 j6c= 1.2638 j6D= 0.0250 +Er3 j6 j6A=-0.0110 j6a= 6.0609 j6B=-0.1954 j6b= 2.2242 j6C= 0.1818 j6c= 1.2958 j6D= 0.0149 +Tm2 j6 j6A=-0.0842 j6a= 4.0699 j6B= 0.0807 j6b= 0.8492 j6C=-0.2087 j6c= 0.0386 j6D= 0.2095 +Tm3 j6 j6A=-0.0727 j6a= 4.0730 j6B= 0.0243 j6b= 0.6888 j6C= 3.9459 j6c= 0.0023 j6D=-3.9076 +Yb2 j6 j6A=-0.0739 j6a= 5.0306 j6B= 0.0140 j6b= 2.0300 j6C= 0.0351 j6c= 0.5080 j6D= 0.0174 +Yb3 j6 j6A=-0.0345 j6a= 5.0073 j6B=-0.0677 j6b= 2.0198 j6C= 0.0985 j6c= 0.5485 j6D=-0.0076 +Pr3 j6 j6A=-0.0224 j6a= 7.9931 j6B=-0.1202 j6b= 3.9406 j6C= 0.1299 j6c= 0.8938 j6D= 0.0051 +# +# Form factors for actinide ions +# +U3 j6 j6A=-0.3797 j6a= 9.9525 j6B= 0.0459 j6b= 5.0379 j6C= 0.2748 j6c= 1.6072 j6D= 0.0016 +U4 j6 j6A=-0.1793 j6a=11.8961 j6B=-0.2269 j6b= 5.4280 j6C= 0.3291 j6c= 1.7008 j6D= 0.0030 +U5 j6 j6A=-0.0399 j6a=11.8909 j6B=-0.3458 j6b= 5.5803 j6C= 0.3340 j6c= 1.6448 j6D= 0.0029 +Np3 j6 j6A=-0.2427 j6a=11.8444 j6B=-0.1129 j6b= 5.3774 j6C= 0.2848 j6c= 1.5676 j6D= 0.0022 +Np4 j6 j6A=-0.2436 j6a= 9.5988 j6B=-0.1317 j6b= 4.1014 j6C= 0.3029 j6c= 1.5447 j6D= 0.0019 +Np5 j6 j6A=-0.1157 j6a= 9.5649 j6B=-0.2654 j6b= 4.2599 j6C= 0.3298 j6c= 1.5494 j6D= 0.0025 +Np6 j6 j6A=-0.0128 j6a= 9.5692 j6B=-0.3611 j6b= 4.3035 j6C= 0.3419 j6c= 1.5406 j6D= 0.0032 +Pu3 j6 j6A=-0.0364 j6a= 9.5721 j6B=-0.3181 j6b= 4.3424 j6C= 0.3210 j6c= 1.5233 j6D= 0.0041 +Pu4 j6 j6A=-0.2394 j6a= 7.8367 j6B=-0.0785 j6b= 4.0243 j6C= 0.2643 j6c= 1.3776 j6D= 0.0012 +Pu5 j6 j6A=-0.1090 j6a= 7.8188 j6B=-0.2243 j6b= 4.1000 j6C= 0.2947 j6c= 1.4040 j6D= 0.0015 +Pu6 j6 j6A=-0.0001 j6a= 7.8196 j6B=-0.3354 j6b= 4.1439 j6C= 0.3097 j6c= 1.4027 j6D= 0.0020 +Am2 j6 j6A=-0.3176 j6a= 7.8635 j6B= 0.0771 j6b= 4.1611 j6C= 0.2194 j6c= 1.3387 j6D= 0.0018 +Am3 j6 j6A=-0.3159 j6a= 6.9821 j6B= 0.0682 j6b= 3.9948 j6C= 0.2141 j6c= 1.1875 j6D=-0.0015 +Am4 j6 j6A=-0.1787 j6a= 7.8805 j6B=-0.1274 j6b= 4.0898 j6C= 0.2565 j6c= 1.3152 j6D= 0.0017 +Am5 j6 j6A=-0.0927 j6a= 6.0727 j6B=-0.2227 j6b= 3.7840 j6C= 0.2916 j6c= 1.3723 j6D= 0.0026 +Am6 j6 j6A= 0.0152 j6a= 6.0788 j6B=-0.3549 j6b= 3.8610 j6C= 0.3125 j6c= 1.4031 j6D= 0.0036 +Am7 j6 j6A= 0.1292 j6a= 6.0816 j6B=-0.4689 j6b= 3.8791 j6C= 0.3234 j6c= 1.3934 j6D= 0.0042 +# +# +# For 5d Elements another exponential is added, values are taken from Kobayashi et al. Acta Cryst (2011). A67 +# +# j0 form factors for the 5d electrons of transition atoms and ions +# +Hf2p_6s05d2 j0 j0A=0.4229 j0a=50.465 j0B=0.7333 j0b=23.865 j0C=0.3798 j0c=4.051 j0D=0.2252 j0d=2.497 j0E=0.0018 j0e=0.0080 +Hf3p_6s05d1 j0 j0A=0.3555 j0a=40.954 j0B=0.8483 j0b=21.726 j0C=0.4116 j0c=4.305 j0D=0.2101 j0d=2.349 j0E=0.0023 j0e=0.0051 +Ta2p_6s05d3 j0 j0A=0.3976 j0a=45.095 j0B=0.7746 j0b=21.028 j0C=0.6098 j0c=3.471 j0D=0.4395 j0d=2.570 j0E=0.0020 j0e=0.0077 +Ta3p_6s05d2 j0 j0A=0.3611 j0a=36.921 j0B=0.8579 j0b=19.195 j0C=0.4945 j0c=3.857 j0D=0.2781 j0d=2.303 j0E=0.0026 j0e=0.0057 +Ta4p_6s05d1 j0 j0A=0.3065 j0a=31.817 j0B=0.9611 j0b=17.749 j0C=0.5463 j0c=3.979 j0D=0.2816 j0d=2.232 j0E=0.0030 j0e=0.0050 +W_6s05d6 j0 j0A=0.3990 j0a=73.810 j0B=0.7138 j0b=22.815 j0C=2.0436 j0c=2.710 j0D=1.9319 j0d=2.559 j0E=0.0023 j0e=0.0524 +W_6s15d5 j0 j0A=0.3811 j0a=62.707 j0B=0.7523 j0b=21.434 j0C=12.5449 j0c=2.702 j0D=12.4130 j0d=2.674 j0E=0.0023 j0e=0.0365 +W_6s25d4 j0 j0A=0.3653 j0a=53.965 j0B=0.7926 j0b=20.078 j0C=0.8142 j0c=3.030 j0D=0.6581 j0d=2.476 j0E=0.0023 j0e=0.0247 +W1p_6s05d5 j0 j0A=0.4077 j0a=51.367 j0B=0.7436 j0b=20.256 j0C=9.8283 j0c=2.780 j0D=9.6788 j0d=2.740 j0E=0.0021 j0e=0.0198 +W1p_6s15d4 j0 j0A=0.3834 j0a=46.233 j0B=0.7890 j0b=19.278 j0C=1.4650 j0c=2.947 j0D=1.2945 j0d=2.628 j0E=0.0022 j0e=0.0138 +W2p_6s05d4 j0 j0A=0.3876 j0a=40.340 j0B=0.8008 j0b=18.621 j0C=1.3911 j0c=2.995 j0D=1.2048 j0d=2.627 j0E=0.0023 j0e=0.0081 +W3p_6s05d3 j0 j0A=0.3610 j0a=33.519 j0B=0.8717 j0b=17.176 j0C=0.6183 j0c=3.445 j0D=0.3883 j0d=2.276 j0E=0.0028 j0e=0.0041 +W4p_6s05d2 j0 j0A=0.3221 j0a=29.047 j0B=0.9574 j0b=15.979 j0C=0.6287 j0c=3.597 j0D=0.3525 j0d=2.174 j0E=0.0033 j0e=0.0034 +W5p_6s05d1 j0 j0A=0.2725 j0a=25.966 j0B=1.0558 j0b=14.954 j0C=0.6990 j0c=3.643 j0D=0.3745 j0d=2.145 j0E=0.0037 j0e=0.0045 +Re_6s05d7 j0 j0A=0.3807 j0a=63.042 j0B=0.7497 j0b=19.967 j0C=6.5300 j0c=2.501 j0D=6.4013 j0d=2.451 j0E=0.0028 j0e=0.0480 +Re_6s15d6 j0 j0A=0.3691 j0a=53.934 j0B=0.7837 j0b=18.790 j0C=9.1491 j0c=2.558 j0D=8.9983 j0d=2.517 j0E=0.0027 j0e=0.0333 +Re_6s25d5 j0 j0A=0.3548 j0a=47.108 j0B=0.8210 j0b=17.769 j0C=9.8674 j0c=2.599 j0D=9.6938 j0d=2.556 j0E=0.0027 j0e=0.0248 +Re1p_6s05d6 j0 j0A=0.3944 j0a=45.427 j0B=0.7742 j0b=17.948 j0C=3.1692 j0c=2.653 j0D=3.0028 j0d=2.521 j0E=0.0026 j0e=0.0192 +Re1p_6s15d5 j0 j0A=0.3736 j0a=41.151 j0B=0.8160 j0b=17.158 j0C=7.0396 j0c=2.642 j0D=6.8523 j0d=2.577 j0E=0.0026 j0e=0.0139 +Re2p_6s05d5 j0 j0A=0.3825 j0a=36.336 j0B=0.8218 j0b=16.636 j0C=8.7220 j0c=2.657 j0D=8.5201 j0d=2.601 j0E=0.0026 j0e=0.0083 +Re3p_6s05d4 j0 j0A=0.3585 j0a=30.671 j0B=0.8863 j0b=15.527 j0C=0.8682 j0c=3.047 j0D=0.6263 j0d=2.280 j0E=0.0030 j0e=0.0052 +Re4p_6s05d3 j0 j0A=0.2974 j0a=27.372 j0B=0.9826 j0b=14.807 j0C=1.8869 j0c=2.840 j0D=1.6100 j0d=2.476 j0E=0.0031 j0e=0.0036 +Re5p_6s05d2 j0 j0A=0.3143 j0a=23.522 j0B=1.0276 j0b=13.505 j0C=0.7438 j0c=3.393 j0D=0.4059 j0d=2.030 j0E=0.0041 j0e=0.0037 +Re6p_6s05d1 j0 j0A=0.2146 j0a=22.496 j0B=1.1616 j0b=13.064 j0C=1.0455 j0c=3.162 j0D=0.6734 j0d=2.196 j0E=0.0041 j0e=0.0035 +Os_6s05d8 j0 j0A=0.3676 j0a=54.835 j0B=0.7793 j0b=17.716 j0C=2.0669 j0c=2.418 j0D=1.9224 j0d=2.247 j0E=0.0034 j0e=0.0446 +Os_6s15d7 j0 j0A=0.3571 j0a=47.458 j0B=0.8123 j0b=16.770 j0C=1.2072 j0c=2.556 j0D=1.0404 j0d=2.211 j0E=0.0033 j0e=0.0314 +Os_6s25d6 j0 j0A=0.3467 j0a=41.778 j0B=0.8458 j0b=15.918 j0C=5.6370 j0c=2.459 j0D=5.4472 j0d=2.381 j0E=0.0032 j0e=0.0222 +Os1p_6s05d7 j0 j0A=0.3837 j0a=40.665 j0B=0.8006 j0b=16.096 j0C=3.5305 j0c=2.487 j0D=3.3488 j0d=2.366 j0E=0.0030 j0e=0.0190 +Os1p_6s15d6 j0 j0A=0.3666 j0a=36.997 j0B=0.8390 j0b=15.425 j0C=2.6944 j0c=2.537 j0D=2.4916 j0d=2.360 j0E=0.0031 j0e=0.0140 +Os2p_6s05d6 j0 j0A=0.3786 j0a=33.005 j0B=0.8412 j0b=14.990 j0C=7.0632 j0c=2.503 j0D=6.8462 j0d=2.433 j0E=0.0030 j0e=0.0098 +Os3p_6s05d5 j0 j0A=0.3557 j0a=28.222 j0B=0.9002 j0b=14.140 j0C=2.5972 j0c=2.601 j0D=2.3444 j0d=2.376 j0E=0.0032 j0e=0.0041 +Os4p_6s05d4 j0 j0A=0.3337 j0a=24.723 j0B=0.9655 j0b=13.288 j0C=0.9653 j0c=2.906 j0D=0.6698 j0d=2.117 j0E=0.0037 j0e=0.0050 +Os5p_6s05d3 j0 j0A=0.3055 j0a=22.152 j0B=1.0395 j0b=12.529 j0C=0.9158 j0c=3.016 j0D=0.5750 j0d=2.032 j0E=0.0042 j0e=0.0022 +Os6p_6s05d2 j0 j0A=0.2714 j0a=20.218 j0B=1.1211 j0b=11.851 j0C=0.9773 j0c=3.050 j0D=0.5894 j0d=2.005 j0E=0.0046 j0e=0.0021 +Os7p_6s05d1 j0 j0A=0.2101 j0a=19.108 j0B=1.2240 j0b=11.347 j0C=1.2543 j0c=2.933 j0D=0.8250 j0d=2.088 j0E=0.0048 j0e=0.0022 +Ir_6s05d9 j0 j0A=0.3564 j0a=48.464 j0B=0.8049 j0b=15.923 j0C=2.5258 j0c=2.265 j0D=2.3675 j0d=2.121 j0E=0.0040 j0e=0.0420 +Ir_6s15d8 j0 j0A=0.3492 j0a=42.195 j0B=0.8350 j0b=15.113 j0C=5.1496 j0c=2.279 j0D=4.9686 j0d=2.201 j0E=0.0038 j0e=0.0296 +Ir_6s25d7 j0 j0A=0.3400 j0a=37.499 j0B=0.8675 j0b=14.402 j0C=2.3703 j0c=2.370 j0D=2.1661 j0d=2.177 j0E=0.0037 j0e=0.0214 +Ir1p_6s05d8 j0 j0A=0.3744 j0a=36.764 j0B=0.8240 j0b=14.576 j0C=8.8616 j0c=2.303 j0D=8.6664 j0d=2.255 j0E=0.0035 j0e=0.0191 +Ir1p_6s15d7 j0 j0A=0.3604 j0a=33.570 j0B=0.8597 j0b=13.993 j0C=2.1686 j0c=2.412 j0D=1.9518 j0d=2.188 j0E=0.0036 j0e=0.0142 +Ir2p_6s05d7 j0 j0A=0.3802 j0a=30.032 j0B=0.8550 j0b=13.567 j0C=1.6185 j0c=2.488 j0D=1.3866 j0d=2.162 j0E=0.0035 j0e=0.0094 +Ir3p_6s05d6 j0 j0A=0.3678 j0a=25.828 j0B=0.9065 j0b=12.788 j0C=0.8587 j0c=2.745 j0D=0.5883 j0d=1.960 j0E=0.0040 j0e=0.0049 +Ir4p_6s05d5 j0 j0A=0.3969 j0a=22.050 j0B=0.9310 j0b=11.768 j0C=0.7090 j0c=3.017 j0D=0.3857 j0d=1.778 j0E=0.0047 j0e=0.0045 +Ir5p_6s05d4 j0 j0A=0.3059 j0a=20.759 j0B=1.0432 j0b=11.622 j0C=1.3457 j0c=2.655 j0D=1.0008 j0d=2.066 j0E=0.0043 j0e=0.0043 +Ir6p_6s05d3 j0 j0A=0.2854 j0a=18.867 j0B=1.1123 j0b=10.982 j0C=1.1403 j0c=2.782 j0D=0.7475 j0d=1.959 j0E=0.0049 j0e=0.0035 +Pt1p_6s05d9 j0 j0A=0.3664 j0a=33.503 j0B=0.8449 j0b=13.303 j0C=2.6192 j0c=2.227 j0D=2.4116 j0d=2.059 j0E=0.0041 j0e=0.0189 +Pt2p_6s05d8 j0 j0A=0.3701 j0a=27.799 j0B=0.8761 j0b=12.480 j0C=3.2959 j0c=2.258 j0D=3.0535 j0d=2.106 j0E=0.0040 j0e=0.0098 +Pt3p_6s05d7 j0 j0A=0.3606 j0a=24.052 j0B=0.9205 j0b=11.833 j0C=4.0612 j0c=2.271 j0D=3.7841 j0d=2.133 j0E=0.0041 j0e=0.0049 +Pt4p_6s05d6 j0 j0A=0.3429 j0a=21.358 j0B=0.9753 j0b=11.261 j0C=2.2859 j0c=2.357 j0D=1.9719 j0d=2.074 j0E=0.0043 j0e=0.0033 +Pt5p_6s05d5 j0 j0A=0.3649 j0a=18.762 j0B=1.0102 j0b=10.456 j0C=0.8785 j0c=2.765 j0D=0.5087 j0d=1.737 j0E=0.0053 j0e=0.0033 +Pt6p_6s05d4 j0 j0A=0.2877 j0a=17.780 j0B=1.1111 j0b=10.263 j0C=1.9416 j0c=2.432 j0D=1.5477 j0d=2.015 j0E=0.0049 j0e=0.0026 +Au1p_6s15d9 j0 j0A=0.3475 j0a=28.294 j0B=0.8964 j0b=11.794 j0C=4.5383 j0c=2.086 j0D=4.2988 j0d=1.983 j0E=0.0047 j0e=0.0143 +Au2p_6s05d9 j0 j0A=0.3664 j0a=25.714 j0B=0.8919 j0b=11.488 j0C=1.7302 j0c=2.207 j0D=1.4763 j0d=1.908 j0E=0.0046 j0e=0.0102 +Au3p_6s05d8 j0 j0A=0.3639 j0a=22.330 j0B=0.9313 j0b=10.883 j0C=1.1359 j0c=2.355 j0D=0.8455 j0d=1.809 j0E=0.0048 j0e=0.0068 +Au4p_6s05d7 j0 j0A=0.3472 j0a=19.944 j0B=0.9807 j0b=10.424 j0C=3.8228 j0c=2.169 j0D=3.4995 j0d=2.009 j0E=0.0047 j0e=0.0040 +Au5p_6s05d6 j0 j0A=0.3292 j0a=18.073 j0B=1.0376 j0b=9.957 j0C=2.2028 j0c=2.257 j0D=1.8410 j0d=1.938 j0E=0.0050 j0e=0.0035 +# +# +# j2 form factors for the 5d electrons of transition atoms and ions +# +# Atoms and ions +# electronic configuration A2 a2 B2 b2 C2 c2 D2 d2 E2 e +# +Hf2p_6s05d2 j2 j2A=9.6670 j2a=33.435 j2B=5.2429 j2b=13.529 j2C=0.5533 j2c=1.402 j2D=0.4934 j2d=1.254 j2E=0.0033 j2e=0.0448 +Hf3p_6s05d1 j2 j2A=7.5646 j2a=27.367 j2B=5.0743 j2b=12.402 j2C=0.4133 j2c=1.742 j2D=0.3163 j2d=1.437 j2E=0.0012 j2e=0.0251 +Ta2p_6s05d3 j2 j2A=8.1746 j2a=29.871 j2B=4.9405 j2b=12.188 j2C=1.1294 j2c=1.254 j2D=1.0658 j2d=1.181 j2E=0.0046 j2e=0.0411 +Ta3p_6s05d2 j2 j2A=6.5998 j2a=25.026 j2B=4.7913 j2b=11.303 j2C=0.7801 j2c=1.529 j2D=0.6820 j2d=1.382 j2E=0.0019 j2e=0.0239 +Ta4p_6s05d1 j2 j2A=5.5048 j2a=21.620 j2B=4.6734 j2b=10.556 j2C=0.2181 j2c=2.100 j2D=0.0810 j2d=1.049 j2E=0.0016 j2e=0.0154 +W_6s05d6 j2 j2A=8.4216 j2a=64.652 j2B=7.6983 j2b=23.124 j2C=2.3605 j2c=8.583 j2D=0.3876 j2d=4.620 j2E=0.0033 j2e=0.0424 +W_6s15d5 j2 j2A=6.9289 j2a=53.425 j2B=7.2157 j2b=20.016 j2C=5.7754 j2c=6.543 j2D=4.2114 j2d=5.854 j2E=0.0036 j2e=0.0398 +W_6s25d4 j2 j2A=5.4017 j2a=47.110 j2B=6.9113 j2b=18.760 j2C=7.0586 j2c=6.363 j2D=5.4525 j2d=5.802 j2E=0.0040 j2e=0.0400 +W1p_6s05d5 j2 j2A=5.6854 j2a=44.743 j2B=6.8903 j2b=18.753 j2C=7.8523 j2c=6.308 j2D=6.3447 j2d=5.842 j2E=0.0038 j2e=0.0383 +W1p_6s15d4 j2 j2A=4.5118 j2a=41.281 j2B=6.7136 j2b=17.964 j2C=7.6331 j2c=6.269 j2D=6.0365 j2d=5.758 j2E=0.0042 j2e=0.0405 +W2p_6s05d4 j2 j2A=7.0301 j2a=26.990 j2B=4.6604 j2b=11.083 j2C=0.8220 j2c=1.145 j2D=0.7581 j2d=1.042 j2E=0.0068 j2e=0.0381 +W3p_6s05d3 j2 j2A=5.8036 j2a=22.969 j2B=4.5243 j2b=10.361 j2C=0.7897 j2c=1.388 j2D=0.6927 j2d=1.248 j2E=0.0031 j2e=0.0229 +W4p_6s05d2 j2 j2A=4.9006 j2a=20.117 j2B=4.4360 j2b=9.765 j2C=2.0009 j2c=1.497 j2D=1.8714 j2d=1.431 j2E=0.0014 j2e=0.0145 +W5p_6s05d1 j2 j2A=4.1973 j2a=17.967 j2B=4.3791 j2b=9.255 j2C=1.8830 j2c=1.603 j2D=1.7205 j2d=1.518 j2E=0.0004 j2e=0.0088 +Re_6s05d7 j2 j2A=6.7574 j2a=55.529 j2B=6.7931 j2b=20.125 j2C=2.3113 j2c=7.529 j2D=0.5004 j2d=4.412 j2E=0.0037 j2e=0.0365 +Re_6s15d6 j2 j2A=5.5830 j2a=46.852 j2B=6.4516 j2b=17.855 j2C=5.0609 j2c=6.037 j2D=3.5427 j2d=5.312 j2E=0.0040 j2e=0.0334 +Re_6s25d5 j2 j2A=4.4322 j2a=41.798 j2B=6.2063 j2b=16.844 j2C=9.8763 j2c=5.751 j2D=8.3294 j2d=5.406 j2E=0.0043 j2e=0.0327 +Re1p_6s05d6 j2 j2A=4.7231 j2a=40.130 j2B=6.2139 j2b=16.902 j2C=8.8240 j2c=5.766 j2D=7.3608 j2d=5.396 j2E=0.0042 j2e=0.0316 +Re1p_6s15d5 j2 j2A=3.7875 j2a=37.254 j2B=6.0587 j2b=16.264 j2C=6.9896 j2c=5.786 j2D=5.4457 j2d=5.279 j2E=0.0045 j2e=0.0329 +Re2p_6s05d5 j2 j2A=3.0708 j2a=33.896 j2B=5.9941 j2b=15.817 j2C=6.7816 j2c=5.768 j2D=5.2056 j2d=5.231 j2E=0.0047 j2e=0.0343 +Re3p_6s05d4 j2 j2A=1.7870 j2a=31.248 j2B=5.9068 j2b=15.160 j2C=17.4262 j2c=5.551 j2D=15.6856 j2d=5.339 j2E=0.0053 j2e=0.0374 +Re4p_6s05d3 j2 j2A=4.4033 j2a=18.733 j2B=4.1971 j2b=9.047 j2C=2.3106 j2c=1.352 j2D=2.1866 j2d=1.299 j2E=0.0025 j2e=0.0158 +Re5p_6s05d2 j2 j2A=3.8162 j2a=16.843 j2B=4.1400 j2b=8.605 j2C=4.0882 j2c=1.443 j2D=3.9333 j2d=1.408 j2E=0.0012 j2e=0.0132 +Re6p_6s05d1 j2 j2A=3.3349 j2a=15.341 j2B=4.1015 j2b=8.213 j2C=2.3511 j2c=1.531 j2D=2.1651 j2d=1.459 j2E=0.0003 j2e=0.0067 +Os_6s05d8 j2 j2A=5.5418 j2a=48.893 j2B=6.0803 j2b=17.984 j2C=2.2542 j2c=6.853 j2D=0.5285 j2d=4.095 j2E=0.0040 j2e=0.0303 +Os_6s15d7 j2 j2A=4.6511 j2a=41.610 j2B=5.8194 j2b=16.062 j2C=6.7172 j2c=5.447 j2D=5.2689 j2d=4.986 j2E=0.0043 j2e=0.0274 +Os_6s25d6 j2 j2A=3.7421 j2a=37.491 j2B=5.6137 j2b=15.256 j2C=10.0488 j2c=5.293 j2D=8.5683 j2d=4.991 j2E=0.0046 j2e=0.0259 +Os1p_6s05d7 j2 j2A=4.0236 j2a=36.272 j2B=5.6349 j2b=15.338 j2C=8.6568 j2c=5.318 j2D=7.2505 j2d=4.980 j2E=0.0044 j2e=0.0253 +Os1p_6s15d6 j2 j2A=3.2611 j2a=33.818 j2B=5.4945 j2b=14.808 j2C=5.7610 j2c=5.391 j2D=4.2811 j2d=4.827 j2E=0.0048 j2e=0.0261 +Os2p_6s05d6 j2 j2A=2.7289 j2a=30.900 j2B=5.4357 j2b=14.396 j2C=18.6546 j2c=5.151 j2D=17.1708 j2d=4.993 j2E=0.0050 j2e=0.0268 +Os3p_6s05d5 j2 j2A=4.5913 j2a=19.692 j2B=4.0615 j2b=8.862 j2C=0.9950 j2c=1.086 j2D=0.9081 j2d=0.986 j2E=0.0077 j2e=0.0206 +Os4p_6s05d4 j2 j2A=3.9724 j2a=17.514 j2B=3.9817 j2b=8.421 j2C=0.7719 j2c=1.264 j2D=0.6552 j2d=1.107 j2E=0.0042 j2e=0.0131 +Os5p_6s05d3 j2 j2A=3.4764 j2a=15.826 j2B=3.9241 j2b=8.032 j2C=0.6854 j2c=1.397 j2D=0.5394 j2d=1.184 j2E=0.0024 j2e=0.0098 +Os6p_6s05d2 j2 j2A=3.0642 j2a=14.479 j2B=3.8847 j2b=7.686 j2C=4.7235 j2c=1.384 j2D=4.5485 j2d=1.352 j2E=0.0012 j2e=0.0063 +Os7p_6s05d1 j2 j2A=2.7164 j2a=13.366 j2B=3.8554 j2b=7.370 j2C=5.0211 j2c=1.439 j2D=4.8166 j2d=1.405 j2E=0.0004 j2e=0.0064 +Ir_6s05d9 j2 j2A=4.6102 j2a=43.878 j2B=5.4892 j2b=16.394 j2C=2.1707 j2c=6.423 j2D=0.4761 j2d=3.722 j2E=0.0043 j2e=0.0254 +Ir_6s15d8 j2 j2A=3.9372 j2a=37.508 j2B=5.2846 j2b=14.661 j2C=3.7267 j2c=5.263 j2D=2.3158 j2d=4.416 j2E=0.0045 j2e=0.0217 +Ir_6s25d7 j2 j2A=3.2263 j2a=33.922 j2B=5.1086 j2b=13.921 j2C=6.5993 j2c=4.978 j2D=5.1841 j2d=4.549 j2E=0.0048 j2e=0.0203 +Ir1p_6s05d8 j2 j2A=3.4956 j2a=32.991 j2B=5.1369 j2b=13.998 j2C=8.3991 j2c=4.924 j2D=7.0561 j2d=4.612 j2E=0.0047 j2e=0.0196 +Ir1p_6s15d7 j2 j2A=2.8732 j2a=30.809 j2B=5.0094 j2b=13.522 j2C=6.8656 j2c=4.933 j2D=5.4669 j2d=4.526 j2E=0.0050 j2e=0.0199 +Ir2p_6s05d7 j2 j2A=2.4419 j2a=28.356 j2B=4.9470 j2b=13.222 j2C=4.7478 j2c=5.029 j2D=3.3259 j2d=4.393 j2E=0.0052 j2e=0.0208 +Ir3p_6s05d6 j2 j2A=1.5883 j2a=25.969 j2B=4.8472 j2b=12.711 j2C=5.6507 j2c=4.949 j2D=4.1190 j2d=4.388 j2E=0.0056 j2e=0.0218 +Ir4p_6s05d5 j2 j2A=3.5964 j2a=16.439 j2B=3.7872 j2b=7.873 j2C=1.2303 j2c=1.092 j2D=1.1232 j2d=1.003 j2E=0.0068 j2e=0.0127 +Ir5p_6s05d4 j2 j2A=3.1710 j2a=14.923 j2B=3.7320 j2b=7.529 j2C=1.5400 j2c=1.200 j2D=1.4048 j2d=1.119 j2E=0.0040 j2e=0.0091 +Ir6p_6s05d3 j2 j2A=2.8163 j2a=13.697 j2B=3.6906 j2b=7.219 j2C=5.2957 j2c=1.254 j2D=5.1328 j2d=1.228 j2E=0.0024 j2e=0.0109 +Pt1p_6s05d9 j2 j2A=3.0783 j2a=30.198 j2B=4.7065 j2b=12.857 j2C=5.7270 j2c=4.650 j2D=4.4425 j2d=4.222 j2E=0.0048 j2e=0.0156 +Pt2p_6s05d8 j2 j2A=2.2407 j2a=26.003 j2B=4.5300 j2b=12.118 j2C=6.7189 j2c=4.557 j2D=5.3954 j2d=4.187 j2E=0.0053 j2e=0.0147 +Pt3p_6s05d7 j2 j2A=1.5391 j2a=23.689 j2B=4.4263 j2b=11.645 j2C=8.5673 j2c=4.482 j2D=7.1591 j2d=4.181 j2E=0.0057 j2e=0.0160 +Pt4p_6s05d6 j2 j2A=0.9477 j2a=22.775 j2B=4.3337 j2b=11.319 j2C=7.2374 j2c=4.500 j2D=5.7086 j2d=4.106 j2E=0.0062 j2e=0.0166 +Pt5p_6s05d5 j2 j2A=0.5132 j2a=23.124 j2B=4.1835 j2b=11.009 j2C=7.4312 j2c=4.478 j2D=5.7759 j2d=4.065 j2E=0.0066 j2e=0.0176 +Pt6p_6s05d4 j2 j2A=2.5907 j2a=12.991 j2B=3.5155 j2b=6.801 j2C=0.7511 j2c=1.206 j2D=0.6014 j2d=1.022 j2E=0.0043 j2e=0.0070 +Au1p_6s15d9 j2 j2A=2.3189 j2a=25.954 j2B=4.2267 j2b=11.444 j2C=9.0997 j2c=4.215 j2D=7.8523 j2d=3.981 j2E=0.0052 j2e=0.0120 +Au2p_6s05d9 j2 j2A=2.0676 j2a=23.960 j2B=4.1678 j2b=11.164 j2C=13.3827 j2c=4.151 j2D=12.1447 j2d=3.996 j2E=0.0054 j2e=0.0130 +Au3p_6s05d8 j2 j2A=1.4776 j2a=21.784 j2B=4.0585 j2b=10.746 j2C=5.9059 j2c=4.242 j2D=4.5905 j2d=3.842 j2E=0.0058 j2e=0.0116 +Au4p_6s05d7 j2 j2A=2.9775 j2a=14.632 j2B=3.4472 j2b=6.956 j2C=1.9784 j2c=0.794 j2D=1.8980 j2d=0.745 j2E=0.0182 j2e=0.0123 +Au5p_6s05d6 j2 j2A=0.5763 j2a=20.517 j2B=3.8572 j2b=10.171 j2C=6.0222 j2c=4.213 j2D=4.5020 j2d=3.760 j2E=0.0067 j2e=0.0129 +# +# j4 form factors for the 5d electrons of transition atoms and ions from Hf to Re. +# +# Atoms and ions +# electronic configuration A4 a4 B4 b4 C4 c4 D4 d4 E4 e +# +Hf2p_6s05d2 j4 j4A=2.5342 j4a=43.826 j4B=1.8466 j4b=10.393 j4C=0.7761 j4c=4.888 j4D=0.0327 j4d=1.589 j4E=0.0017 j4e=0.0046 +Hf3p_6s05d1 j4 j4A=2.3574 j4a=32.651 j4B=1.8717 j4b=8.476 j4C=0.6367 j4c=3.953 j4D=0.1133 j4d=2.169 j4E=0.0017 j4e=0.0048 +Ta2p_6s05d3 j4 j4A=2.1974 j4a=38.294 j4B=1.6220 j4b=8.838 j4C=0.6836 j4c=4.212 j4D=0.0539 j4d=1.746 j4E=0.0016 j4e=0.0069 +Ta3p_6s05d2 j4 j4A=2.0884 j4a=29.531 j4B=1.7145 j4b=7.385 j4C=1.1809 j4c=2.994 j4D=0.7705 j4d=2.577 j4E=0.0016 j4e=0.0066 +Ta4p_6s05d1 j4 j4A=2.0226 j4a=24.035 j4B=1.7084 j4b=6.594 j4C=1.1799 j4c=2.775 j4D=0.8384 j4d=2.430 j4E=0.0020 j4e=0.0053 +W_6s05d6 j4 j4A=2.1307 j4a=79.955 j4B=1.4055 j4b=11.876 j4C=0.8808 j4c=4.969 j4D=0.0120 j4d=0.419 j4E=0.0051 j4e=0.0085 +W_6s15d5 j4 j4A=1.9667 j4a=60.069 j4B=1.3446 j4b=9.992 j4C=0.7861 j4c=4.554 j4D=0.0197 j4d=1.087 j4E=0.0021 j4e=0.0083 +W_6s25d4 j4 j4A=1.8575 j4a=47.554 j4B=1.3868 j4b=8.437 j4C=0.6537 j4c=3.939 j4D=0.0570 j4d=1.722 j4E=0.0015 j4e=0.0092 +W1p_6s05d5 j4 j4A=2.0231 j4a=46.962 j4B=1.3937 j4b=9.263 j4C=0.7420 j4c=4.332 j4D=0.0288 j4d=1.327 j4E=0.0018 j4e=0.0062 +W1p_6s15d4 j4 j4A=1.9122 j4a=39.952 j4B=1.4385 j4b=8.019 j4C=0.6336 j4c=3.725 j4D=0.0819 j4d=1.868 j4E=0.0015 j4e=0.0073 +W2p_6s05d4 j4 j4A=1.9355 j4a=33.935 j4B=1.5020 j4b=7.541 j4C=0.6453 j4c=3.375 j4D=0.1601 j4d=2.110 j4E=0.0015 j4e=0.0063 +W3p_6s05d3 j4 j4A=1.8752 j4a=26.706 j4B=1.5440 j4b=6.585 j4C=5.9785 j4c=2.575 j4D=5.6111 j4d=2.516 j4E=0.0018 j4e=0.0061 +W4p_6s05d2 j4 j4A=1.8309 j4a=22.142 j4B=1.5605 j4b=5.935 j4C=1.4898 j4c=2.482 j4D=1.1930 j4d=2.266 j4E=0.0022 j4e=0.0066 +W5p_6s05d1 j4 j4A=1.7958 j4a=18.987 j4B=1.5913 j4b=5.419 j4C=2.0498 j4c=2.278 j4D=1.8262 j4d=2.156 j4E=0.0026 j4e=0.0050 +Re_6s05d7 j4 j4A=1.8013 j4a=63.944 j4B=1.1773 j4b=9.808 j4C=0.7912 j4c=4.380 j4D=0.0155 j4d=0.795 j4E=0.0027 j4e=0.0080 +Re_6s15d6 j4 j4A=1.7056 j4a=49.628 j4B=1.2209 j4b=8.231 j4C=0.6637 j4c=3.836 j4D=0.0443 j4d=1.514 j4E=0.0015 j4e=0.0088 +Re_6s25d5 j4 j4A=1.6402 j4a=40.319 j4B=1.3192 j4b=7.064 j4C=0.8659 j4c=2.901 j4D=0.4299 j4d=2.306 j4E=0.0013 j4e=0.0098 +Re1p_6s05d6 j4 j4A=1.7723 j4a=40.683 j4B=1.2795 j4b=7.798 j4C=0.6385 j4c=3.630 j4D=0.0656 j4d=1.686 j4E=0.0015 j4e=0.0084 +Re1p_6s15d5 j4 j4A=1.6968 j4a=34.939 j4B=1.3535 j4b=6.851 j4C=1.7292 j4c=2.681 j4D=1.3118 j4d=2.445 j4E=0.0014 j4e=0.0084 +Re2p_6s05d5 j4 j4A=1.7305 j4a=30.305 j4B=1.3808 j4b=6.606 j4C=1.5787 j4c=2.630 j4D=1.1785 j4d=2.378 j4E=0.0015 j4e=0.0079 +Re3p_6s05d4 j4 j4A=1.6969 j4a=24.325 j4B=1.4088 j4b=5.901 j4C=1.5067 j4c=2.424 j4D=1.1834 j4d=2.209 j4E=0.0019 j4e=0.0069 +Re4p_6s05d3 j4 j4A=1.6679 j4a=20.454 j4B=1.4439 j4b=5.357 j4C=0.8175 j4c=2.321 j4D=0.5685 j4d=1.976 j4E=0.0024 j4e=0.0056 +Re5p_6s05d2 j4 j4A=1.6427 j4a=17.722 j4B=1.4880 j4b=4.916 j4C=0.5419 j4c=2.189 j4D=0.3694 j4d=1.781 j4E=0.0029 j4e=0.0050 +Re6p_6s05d1 j4 j4A=1.6211 j4a=15.673 j4B=1.5419 j4b=4.548 j4C=1.9205 j4c=1.833 j4D=1.8287 j4d=1.766 j4E=0.0034 j4e=0.0055 +Os_6s05d8 j4 j4A=1.5677 j4a=53.075 j4B=1.0631 j4b=8.143 j4C=0.6808 j4c=3.771 j4D=0.0308 j4d=1.243 j4E=0.0017 j4e=0.0095 +Os_6s15d7 j4 j4A=1.5109 j4a=42.193 j4B=1.1910 j4b=6.850 j4C=2.4597 j4c=2.602 j4D=2.0163 j4d=2.444 j4E=0.0011 j4e=0.0100 +Os_6s25d6 j4 j4A=1.4734 j4a=34.814 j4B=1.2105 j4b=6.165 j4C=0.9468 j4c=2.534 j4D=0.5773 j4d=2.131 j4E=0.0015 j4e=0.0108 +Os1p_6s05d7 j4 j4A=1.5777 j4a=35.746 j4B=1.2222 j4b=6.650 j4C=1.7260 j4c=2.590 j4D=1.2942 j4d=2.360 j4E=0.0012 j4e=0.0081 +Os1p_6s15d6 j4 j4A=1.5274 j4a=30.891 j4B=1.2364 j4b=6.044 j4C=1.4100 j4c=2.431 j4D=1.0480 j4d=2.188 j4E=0.0016 j4e=0.0086 +Os2p_6s05d6 j4 j4A=1.5637 j4a=27.292 j4B=1.2627 j4b=5.880 j4C=1.3526 j4c=2.393 j4D=1.0026 j4d=2.146 j4E=0.0017 j4e=0.0071 +Os3p_6s05d5 j4 j4A=1.5453 j4a=22.300 j4B=1.3058 j4b=5.301 j4C=0.7208 j4c=2.294 j4D=0.4480 j4d=1.881 j4E=0.0022 j4e=0.0071 +Os4p_6s05d4 j4 j4A=1.5267 j4a=18.972 j4B=1.3619 j4b=4.834 j4C=3.0121 j4c=1.938 j4D=2.8240 j4d=1.877 j4E=0.0027 j4e=0.0091 +Os5p_6s05d3 j4 j4A=1.5094 j4a=16.573 j4B=1.4158 j4b=4.458 j4C=0.8448 j4c=1.797 j4D=0.7349 j4d=1.638 j4E=0.0033 j4e=0.0058 +Os6p_6s05d2 j4 j4A=1.4938 j4a=14.751 j4B=1.4678 j4b=4.149 j4C=0.8091 j4c=1.535 j4D=0.7720 j4d=1.442 j4E=0.0041 j4e=0.0048 +Os7p_6s05d1 j4 j4A=0.0341 j4a=37.994 j4B=1.4680 j4b=13.159 j4C=1.5216 j4c=3.898 j4D=0.0308 j4d=0.550 j4E=0.0083 j4e=0.0044 +Ir_6s05d9 j4 j4A=1.3913 j4a=45.243 j4B=1.0627 j4b=6.722 j4C=2.5141 j4c=2.534 j4D=2.0510 j4d=2.383 j4E=0.0009 j4e=0.0099 +Ir_6s15d8 j4 j4A=1.3605 j4a=36.399 j4B=1.0953 j4b=5.990 j4C=1.7223 j4c=2.353 j4D=1.3416 j4d=2.162 j4E=0.0014 j4e=0.0111 +Ir_6s25d7 j4 j4A=1.3382 j4a=30.628 j4B=1.1376 j4b=5.420 j4C=1.4261 j4c=2.160 j4D=1.1282 j4d=1.974 j4E=0.0019 j4e=0.0115 +Ir1p_6s05d8 j4 j4A=1.4233 j4a=31.680 j4B=1.1221 j4b=5.872 j4C=2.2721 j4c=2.301 j4D=1.8973 j4d=2.163 j4E=0.0015 j4e=0.0108 +Ir1p_6s15d7 j4 j4A=1.3875 j4a=27.660 j4B=1.1508 j4b=5.362 j4C=0.6586 j4c=2.302 j4D=0.3554 j4d=1.810 j4E=0.0020 j4e=0.0094 +Ir2p_6s05d7 j4 j4A=1.4233 j4a=24.796 j4B=1.1799 j4b=5.246 j4C=3.2548 j4c=2.072 j4D=2.9649 j4d=1.997 j4E=0.0020 j4e=0.0099 +Ir3p_6s05d6 j4 j4A=1.4149 j4a=20.563 j4B=1.2388 j4b=4.761 j4C=1.1780 j4c=1.928 j4D=0.9708 j4d=1.761 j4E=0.0026 j4e=0.0071 +Ir4p_6s05d5 j4 j4A=1.4039 j4a=17.664 j4B=1.2993 j4b=4.371 j4C=3.5599 j4c=1.661 j4D=3.4340 j4d=1.625 j4E=0.0033 j4e=0.0065 +Ir5p_6s05d4 j4 j4A=1.3927 j4a=15.539 j4B=1.3536 j4b=4.057 j4C=0.2946 j4c=1.554 j4D=0.2412 j4d=1.266 j4E=0.0043 j4e=0.0061 +Ir6p_6s05d3 j4 j4A=0.0364 j4a=41.929 j4B=1.3662 j4b=13.771 j4C=1.4130 j4c=3.784 j4D=0.0384 j4d=0.190 j4E=0.0241 j4e=0.0043 +Pt1p_6s05d9 j4 j4A=1.2955 j4a=28.407 j4B=1.0534 j4b=5.206 j4C=1.2452 j4c=2.096 j4D=0.9336 j4d=1.881 j4E=0.0018 j4e=0.0104 +Pt2p_6s05d8 j4 j4A=1.3038 j4a=22.692 j4B=1.1238 j4b=4.691 j4C=3.2444 j4c=1.814 j4D=3.0209 j4d=1.757 j4E=0.0025 j4e=0.0100 +Pt3p_6s05d7 j4 j4A=1.3019 j4a=19.052 j4B=1.1904 j4b=4.286 j4C=3.3886 j4c=1.592 j4D=3.2484 j4d=1.554 j4E=0.0034 j4e=0.0087 +Pt4p_6s05d6 j4 j4A=1.2964 j4a=16.503 j4B=1.2497 j4b=3.964 j4C=1.7648 j4c=1.350 j4D=1.6992 j4d=1.305 j4E=0.0046 j4e=0.0066 +Pt5p_6s05d5 j4 j4A=1.2902 j4a=14.600 j4B=1.2945 j4b=3.709 j4C=0.5190 j4c=1.033 j4D=0.5122 j4d=0.963 j4E=0.0067 j4e=0.0054 +Pt6p_6s05d4 j4 j4A=0.0482 j4a=33.010 j4B=1.2661 j4b=12.839 j4C=1.3254 j4c=3.545 j4D=0.0455 j4d=0.144 j4E=0.0315 j4e=0.0027 +Au1p_6s15d9 j4 j4A=1.1686 j4a=22.808 j4B=1.0729 j4b=4.243 j4C=0.9462 j4c=1.573 j4D=0.7943 j4d=1.428 j4E=0.0036 j4e=0.0104 +Au2p_6s05d9 j4 j4A=1.2005 j4a=20.888 j4B=1.0879 j4b=4.203 j4C=0.8896 j4c=1.584 j4D=0.7371 j4d=1.428 j4E=0.0036 j4e=0.0109 +Au3p_6s05d8 j4 j4A=1.2033 j4a=17.722 j4B=1.1507 j4b=3.874 j4C=0.2426 j4c=1.455 j4D=0.1649 j4d=1.049 j4E=0.0053 j4e=0.0080 +Au4p_6s05d7 j4 j4A=1.2021 j4a=15.459 j4B=1.2003 j4b=3.615 j4C=0.6189 j4c=0.952 j4D=0.6028 j4d=0.886 j4E=0.0081 j4e=0.0074 +Au5p_6s05d6 j4 j4A=1.2007 j4a=13.734 j4B=1.2262 j4b=3.424 j4C=0.5164 j4c=0.401 j4D=0.5461 j4d=0.379 j4E=0.0216 j4e=0.0060 \ No newline at end of file diff --git a/Dans_Diffraction/data/README.md b/Dans_Diffraction/data/README.md index 6d3e134..a602b82 100644 --- a/Dans_Diffraction/data/README.md +++ b/Dans_Diffraction/data/README.md @@ -31,7 +31,7 @@ The data is taken from a number of sources: * Element weights and radii: [Wikipedia](http://en.wikipedia.org/wiki/List_of_elements_by_atomic_properties) * X-ray Mass Attenuation Coefficients: [NIST](https://www.nist.gov/pml/x-ray-mass-attenuation-coefficients) * X-ray Atomic Scattering Factors: [CXRO](http://henke.lbl.gov/optical_constants/asf.html) -* X-ray edges: [x-ray database](http://xdb.lbl.gov/Section1/Table_1-1.pdf) +* X-ray edges: [x-ray database](https://xdb.lbl.gov/Section1/Sec_1-1.html) * Electron configurations: [Wikipedia](https://en.wikipedia.org/wiki/Electron_configurations_of_the_elements_(data_page)) * Space Group symmetry operations: [Bilbao Crystallographic Server](https://www.cryst.ehu.es/) diff --git a/Dans_Diffraction/functions_crystallography.py b/Dans_Diffraction/functions_crystallography.py index 07a9e52..2cf04c8 100644 --- a/Dans_Diffraction/functions_crystallography.py +++ b/Dans_Diffraction/functions_crystallography.py @@ -11,7 +11,7 @@ OR - from Dans_Diffraction import functions_crystallography as fc -Version 4.0.1 +Version 4.1.0 Version History: 09/07/15 0.1 Version History started. @@ -45,6 +45,7 @@ 26/09/24 3.9.0 Added complex neutron scattering lengths for isotopes from package periodictable 06/11/24 4.0.0 Fixed error with triclinic bases, added function_lattice. 20/11/24 4.0.1 Added alternative neutron scattering length table +28/06/25 4.1.0 Added new magnetic form factor calculation, plus new formulas Acknoledgements: April 2020 Thanks to ChunHai Wang for helpful suggestions in readcif! @@ -63,16 +64,19 @@ from . import functions_general as fg from . import functions_lattice as fl -__version__ = '4.0.1' +__version__ = '5.0.0' # File directory - location of "Dans Element Properties.txt" datadir = os.path.abspath(os.path.dirname(__file__)) # same directory as this file datadir = os.path.join(datadir, 'data') ATOMFILE = os.path.join(datadir, 'Dans Element Properties.txt') PENGFILE = os.path.join(datadir, 'peng.dat') +WAASKIRF_FILE = os.path.join(datadir, 'f0_WaasKirf.dat') NSLFILE = os.path.join(datadir, 'neutron_isotope_scattering_lengths.dat') NSLFILE_SEARS = os.path.join(datadir, 'neutron_isotope_scattering_lengths_sears.dat') ASFFILE = os.path.join(datadir, 'atomic_scattering_factors.npy') +XMAFILE = os.path.join(datadir, 'XRayMassAtten_mup.dat') +MAGFF_FILE = os.path.join(datadir, 'McPhase_Mag_FormFactors.txt') # List of Elements in order sorted by length of name ELEMENT_LIST = [ @@ -103,6 +107,9 @@ element_regex = re.compile('|'.join(ELEMENT_LIST)) regex_sub_element = re.compile('[^a-zA-Z]') # 'Li' = regex_sub_element.sub('', '7-Li2+') +# Custom atomic form factors +CUSTOM_FORM_FACTOR_COEFS = {} # {'el': (a1, b1, a2, b2, ...)} +CUSTOM_DISPERSION_TABLE = {} # {'el': np.array(en, f1, f2)} # Required CIF keys, must be available and not '?' CIF_REQUIRES = [ @@ -879,12 +886,12 @@ def atom_properties(elements=None, fields=None): if elements is not None: # elements must be a list e.g. ['Co','O'] - elements = np.char.lower(np.asarray(elements).reshape(-1)) - all_elements = [el.lower() for el in data['Element']] + elements = [str2element(el) for el in np.asarray(elements).reshape(-1)] + all_elements = data['Element'].tolist() # This will error if the required element doesn't exist try: # regex to remove additional characters - index = [all_elements.index(regex_sub_element.sub('', el)) for el in elements] + index = [all_elements.index(el) for el in elements] except ValueError as ve: raise Exception('Element not available: %s' % ve) data = data[index] @@ -918,6 +925,21 @@ def print_atom_properties(elements=None): return out +def read_waaskirf_scattering_factor_coefs(): + """ + Read X-ray scattering factor table + Uses the coefficients for analytical approximation to the scattering factors from: + "Waasmaier and Kirfel, Acta Cryst. (1995) A51, 416-431" + File from https://github.com/diffpy/libdiffpy/blob/master/src/runtime/f0_WaasKirf.dat + :return: {'element': array([a1, a2, a3, a4, a5, c, b1, b2, b3, b4, b5])} + """ + data = np.loadtxt(WAASKIRF_FILE) + with open(WAASKIRF_FILE) as f: + lines = re.findall(r'#S\s+\d+\s+[A-Z].*?\n', f.read()) + table_names = [line[7:].strip() for line in lines] + return {element: coefs for element, coefs in zip(table_names, data)} + + def read_neutron_scattering_lengths(table='neutron data booklet'): """ Read neutron scattering length of element or isotope @@ -974,8 +996,11 @@ def neutron_scattering_length(elements, table='neutron data booklet'): """ # b = atom_properties(element, ['Coh_b']) nsl = read_neutron_scattering_lengths(table) - b = np.array([nsl[element] for element in np.char.lower(np.asarray(elements).reshape(-1))]) - return b + b_lengths = np.array([ + nsl[element] if element in nsl else nsl.get(split_element_symbol(element)[0], 0) + for element in np.char.lower(np.asarray(elements).reshape(-1)) + ]) + return b_lengths def xray_scattering_factor(element, Qmag=0): @@ -1016,6 +1041,85 @@ def xray_scattering_factor(element, Qmag=0): return Qff +def xray_scattering_factor_WaasKirf(element, Qmag=0): + """ + Read X-ray scattering factor table, calculate f(|Q|) + Uses the coefficients for analytical approximation to the scattering factors from: + "Waasmaier and Kirfel, Acta Cryst. (1995) A51, 416-431" + File from https://github.com/diffpy/libdiffpy/blob/master/src/runtime/f0_WaasKirf.dat + Qff = xray_scattering_factor_WaasKirf(element, Qmag=[0]) + :param element: [n*str] list or array of elements + :param Qmag: [m] array of wavevector distance, in A^-1 + :return: [m*n] array of scattering factors + """ + + data = np.loadtxt(WAASKIRF_FILE) + # get names + with open(WAASKIRF_FILE) as f: + lines = re.findall(r'#S\s+\d+\s+[A-Z].*?\n', f.read()) + table_names = [line[7:].strip() for line in lines] + + # Qmag should be a 1D array + Qmag = np.asarray(Qmag).reshape(-1) + element = np.asarray(element, dtype=str).reshape(-1) + + # data table: a1 a2 a3 a4 a5 c b1 b2 b3 b4 b5 + idx = [table_names.index(el) for el in element] + coef = data[idx, :] + + Qff = np.zeros([len(Qmag), len(element)]) + + # Loop over elements + for n in range(len(element)): + a1, a2, a3, a4, a5, c, b1, b2, b3, b4, b5 = coef[n, :] + + # Array multiplication over Qmags + # f0[k] = c + [SUM a_i * EXP(-b_i * (k ^ 2))] i=1,5 + f = a1 * np.exp(-b1 * (Qmag / (4 * np.pi)) ** 2) + \ + a2 * np.exp(-b2 * (Qmag / (4 * np.pi)) ** 2) + \ + a3 * np.exp(-b3 * (Qmag / (4 * np.pi)) ** 2) + \ + a4 * np.exp(-b4 * (Qmag / (4 * np.pi)) ** 2) + \ + a5 * np.exp(-b5 * (Qmag / (4 * np.pi)) ** 2) + c + Qff[:, n] = f + return Qff + + +def xray_scattering_factor_resonant(elements, Qmag, energy_kev, use_waaskirf=False): + """ + Read X-ray scattering factor table, calculate f(|Q|) + Uses the coefficients for analytical approximation to the scattering factors - ITC, p578 + Qff = xray_scattering_factor_resonant(element, energy_kev, qmag) + + if resonant_energy = float(energy in keV), the total atomic scattering amplitude will be returned: + f(|Q|, E) = f0(|Q|) + f'(E) - if''(E) + See: + :param elements: [n*str] list or array of elements + :param Qmag: [m] array wavevector distance |Q|, in A^-1 + :param energy_kev: [o] array energy in keV + :param use_waaskirf: if True, use f0 scattering factor coefficients from the table of Waasmaier and Kirfel + :return: [m*n*o] complex array of scattering factors + """ + + # Qmag and energy_kev should be a 1D array + Qmag = np.asarray(Qmag).reshape(-1) + energy_kev = np.asarray(energy_kev).reshape(-1) + + f1, f2 = xray_dispersion_corrections(elements, energy_kev) # shape (len(energy), len(element)) + Qff = np.zeros([len(Qmag), len(elements), len(energy_kev)], dtype=complex) + # Broadcast dispersion corrections + Qff[:, :, :] = f1.T - 1j * f2.T # change from + to - on 2/July/2023 + + if use_waaskirf: + f = xray_scattering_factor_WaasKirf(elements, Qmag) + else: + f = xray_scattering_factor(elements, Qmag) + + for n in range(len(elements)): + for e in range(len(energy_kev)): + Qff[:, n, e] += f[:, n] + return Qff + + def electron_scattering_factor(element, Qmag=0): """ Read X-ray scattering factor table, calculate f(|Q|) @@ -1071,99 +1175,493 @@ def electron_scattering_factor(element, Qmag=0): return Qff -def xray_scattering_factor_WaasKirf(element, Qmag=0): +def scattering_factor_coefficients_neutron_ndb(*elements): """ - Read X-ray scattering factor table, calculate f(|Q|) + Load neutron scattering factor coefficents + + Values are extracted from Periodic Table https://github.com/pkienzle/periodictable + - Values originally from Neutron Data Booklet, by A-J Dianoux, G. Lander (2003), with additions and corrections upto v1.7.0 (2023) + + :param elements: str element symbol, must appear in the selected table, or zero is returned + :return: list[float, float, ...] - list of pairs of coefficients + """ + coefs = np.zeros([len(elements), 2]) + b_lengths = neutron_scattering_length(elements, 'neutron data booklet') + for n, (element, b_length) in enumerate(zip(elements, b_lengths)): + coefs[n, :] = [b_length, 0] + return coefs + + +def scattering_factor_coefficients_neutron_sears(*elements): + """ + Load neutron scattering factor coefficents + + Values are taken form the table: + - ITC Vol. C, Section 4.4.4., By V. F. Sears Table 4.4.4.1 (Jan 1995) + + :param elements: str element symbol, must appear in the selected table, or zero is returned + :return: array[n, c] - c is list of pairs of coefficients + """ + coefs = np.zeros([len(elements), 2], dtype=complex) + b_lengths = neutron_scattering_length(elements, 'sears') + for n, (element, b_length) in enumerate(zip(elements, b_lengths)): + coefs[n, :] = [b_length, 0] + return coefs + + +def scattering_factor_coefficients_xray_itc(*elements): + """ + Load x-ray scattering factor coefficents + + Uses the coefficients for analytical approximation to the scattering factors - ITC, p578 Table 6.1.1.4 + + :param elements: str element symbol, must appear in the selected table, or zero is returned + :return: array[n, c] - c is list of pairs of coefficients + """ + out = np.zeros([len(elements), 10]) + data = atom_properties(None, ['Element', 'a1', 'b1', 'a2', 'b2', 'a3', 'b3', 'a4', 'b4', 'c']) + all_elements = list(data['Element']) + for n, element in enumerate(elements): + symbol, occupancy, charge = split_element_symbol(element) + if element in all_elements: + symbol = element + if symbol in all_elements: + idx = all_elements.index(symbol) + el, a1, b1, a2, b2, a3, b3, a4, b4, c = data[idx] + out[n, :] = [a1, b1, a2, b2, a3, b3, a4, b4, c, 0] + return out + + +def scattering_factor_coefficients_xray_waaskirf(*elements): + """ + Load x-ray scattering factor coefficents + Uses the coefficients for analytical approximation to the scattering factors from: "Waasmaier and Kirfel, Acta Cryst. (1995) A51, 416-431" File from https://github.com/diffpy/libdiffpy/blob/master/src/runtime/f0_WaasKirf.dat - Qff = xray_scattering_factor_WaasKirf(element, Qmag=[0]) - :param element: [n*str] list or array of elements - :param Qmag: [m] array of wavevector distance, in A^-1 - :return: [m*n] array of scattering factors + + :param elements: str element symbol, must appear in the selected table, or zero is returned + :return: array[n, c] - c is list of pairs of coefficients """ + out = np.zeros([len(elements), 12]) - filename = os.path.join(datadir, 'f0_WaasKirf.dat') - data = np.loadtxt(filename) - # get names - with open(filename) as f: - lines = re.findall(r'#S\s+\d+\s+[A-Z].*?\n', f.read()) - table_names = [line[7:].strip() for line in lines] + data = read_waaskirf_scattering_factor_coefs() + for n, element in enumerate(elements): + symbol, occupancy, charge = split_element_symbol(element) + if element in data: + symbol = element + if symbol in data: + a1, a2, a3, a4, a5, c, b1, b2, b3, b4, b5 = data[symbol] + out[n, :] = [a1, b1, a2, b2, a3, b3, a4, b4, a5, b5, c, 0] + return out - # Qmag should be a 1D array - Qmag = np.asarray(Qmag).reshape(-1) - element = np.asarray(element, dtype=str).reshape(-1) - # data table: a1 a2 a3 a4 a5 c b1 b2 b3 b4 b5 - idx = [table_names.index(el) for el in element] - coef = data[idx, :] +def scattering_factor_coefficients_electron_peng(*elements): + """ + Load electron scattering factor coefficents - Qff = np.zeros([len(Qmag), len(element)]) + Uses the coefficients for analytical approximation to the scattering factors + Peng, L. M.; Acta Crystallogr A 1996, 52 (2), 257–276. + Peng, L.-M. Acta Cryst A 1998, 54 (4), 481–485. - # Loop over elements - for n in range(len(element)): - a1, a2, a3, a4, a5, c, b1, b2, b3, b4, b5 = coef[n, :] + :param elements: str element symbol, must appear in the selected table, or zero is returned + :return: array[n, c] - c is list of pairs of coefficients + """ + out = np.zeros([len(elements), 10]) + + try: + data = np.genfromtxt(PENGFILE, skip_header=0, dtype=None, names=True, encoding='ascii', delimiter=',') + except TypeError: + # Numpy version < 1.14 + data = np.genfromtxt(PENGFILE, skip_header=0, dtype=None, names=True, delimiter=',') + + all_elements = list(data['Element']) + for n, element in enumerate(elements): + symbol, occupancy, charge = split_element_symbol(element) + if element in all_elements: + symbol = element + if symbol in all_elements: + idx = all_elements.index(symbol) + a1, b1, a2, b2, a3, b3, a4, b4, a5, b5 = data[idx][['a1', 'b1', 'a2', 'b2', 'a3', 'b3', 'a4', 'b4', 'a5', 'b5']] + out[n, :] = [a1, b1, a2, b2, a3, b3, a4, b4, a5, b5] + return out - # Array multiplication over Qmags - # f0[k] = c + [SUM a_i * EXP(-b_i * (k ^ 2))] i=1,5 - f = a1 * np.exp(-b1 * (Qmag / (4 * np.pi)) ** 2) + \ - a2 * np.exp(-b2 * (Qmag / (4 * np.pi)) ** 2) + \ - a3 * np.exp(-b3 * (Qmag / (4 * np.pi)) ** 2) + \ - a4 * np.exp(-b4 * (Qmag / (4 * np.pi)) ** 2) + \ - a5 * np.exp(-b5 * (Qmag / (4 * np.pi)) ** 2) + c - Qff[:, n] = f - return Qff + +def scattering_factor_coefficients(*elements, table='itc'): + """ + Load scattering factor coefficents from differnt tables + + table options: + 'itc' -> x-ray scattering factors from international tabels Volume C (ITC, p578 Table 6.1.1.4) + 'waaskirf' -> x-ray scattering factors from Waasmaier and Kirfel, Acta Cryst. (1995) A51, 416-431 + 'peng' -> electron scattering factors from Peng, L.-M. Acta Cryst A 1998, 54 (4), 481–485. + 'ndb' -> neutron scattering lengths from Neutron data booklet + 'sears' -> neutron scattering lengths from the international tables + + Coefficients are used in the analytical approximation of the scattering factor: + f0[k] = c + [SUM a_i * EXP(-b_i * (k ^ 2))] i=1,j + where k is the wavevector, j varies depending on which table is used. + + coefficients are returned in pairs (a_i, b_i), where c is given as the final element (c, 0): + coef = [(a_0, b_0), (a_1, b_1), ..., (c, 0)] + :param elements: str element symbol, must appear in the selected table, or zero is returned + :param table: str table name + :return: array[n, c] - c is list of pairs of coefficients + """ + # scattering factor ables + tables = { + 'itc': scattering_factor_coefficients_xray_itc, + 'waaskirf': scattering_factor_coefficients_xray_waaskirf, + 'peng': scattering_factor_coefficients_electron_peng, + 'ndb': scattering_factor_coefficients_neutron_ndb, + 'sears': scattering_factor_coefficients_neutron_sears + } + table = table.lower() + if table not in tables: + raise ValueError(f'Unknown scattering factor table: {table}') + return tables[table](*elements) + + +def analytical_scattering_factor(q_mag, *coefs): + """ + Calculate the analytical scattering factor + + f0[|Q|] = c + [SUM a_i * EXP(-b_i * (|Q| ^ 2))] i=1,n + coefs = (a_1, b_1, a_2, b_2, ..., a_n, b_n) + f0 = analytical_scattering_factor(q_mag, *coefs) + + :param q_mag: [m] array of wavevector distance, in A^-1 + :param coefs: float values of coefficients + :return: [m] array of scattering factors + """ + q_mag = np.asarray(q_mag, dtype=float).reshape(-1) + q = (q_mag / (4 * np.pi)) ** 2 + # pad and reshape coefs into [n,2] + coefs = np.reshape(np.pad(coefs, [0, len(coefs) % 2]), [-1, 2]) + f = sum(a * np.exp(-b * q) for a, b in coefs) + return f + + +def add_custom_form_factor_coefs(element, *coefs, dispersion_table=None): + """ + Custom form factor coefficients + :param element: element name to add or replace + :param coefs: a1, b1, a2, b2, ... scattering factor coefficients + :param dispersion_table: None or array([energy_kev, f1, f2]) + :return: + """ + CUSTOM_FORM_FACTOR_COEFS.update({element: coefs}) + if dispersion_table is not None: + dispersion_table = np.asarray(dispersion_table, dtype=float) + if dispersion_table.ndim != 2 or dispersion_table.shape[0] != 3: + raise Exception(f"dispersion table wrong shape, should be (3, n): {dispersion_table.shape}") + CUSTOM_DISPERSION_TABLE.update({element: dispersion_table}) -def xray_scattering_factor_resonant(element, Qmag, energy_kev): +def scattering_factor_coefficients_custom(*elements, default_table='itc'): + """ + Load custom scattering factor coefficients from internal table + :param elements: str element symbol + :param default_table: scattering factor table to use if element not in custom list + :return: {'element': array([a1, b1, a2, b2, ...])} + """ + default_coefs = scattering_factor_coefficients(*elements, table=default_table) + coefs = { + el: CUSTOM_FORM_FACTOR_COEFS[el] if el in CUSTOM_FORM_FACTOR_COEFS else default_coefs[n] + for n, el in enumerate(elements) + } + return coefs + + +def dispersion_table_custom(*elements): + """ + Load custom table of x-ray dispersion corrections + energy, f1, f2 = xray_dispersion_table_custom('element') + :param elements: str element symbols + :return: {'element': np.array([energy_kev, f1, f2])} + """ + # Generate table + log_step = 0.001 # 0.007 in original tables + min_energy = 10.0 + max_energy = 30000 + energy_kev = 10 ** np.arange(np.log10(min_energy), np.log10(max_energy) + log_step, log_step) / 1000. + f1, f2 = xray_dispersion_corrections(elements, energy_kev) + + tables = { + el: CUSTOM_DISPERSION_TABLE[el] + if el in CUSTOM_DISPERSION_TABLE else np.array([energy_kev, f1[:, n], f2[:, n]]) + for n, el in enumerate(elements) + } + return tables + + +def custom_scattering_factor(elements, q_mag, energy_kev=None, default_table='itc'): """ Read X-ray scattering factor table, calculate f(|Q|) - Uses the coefficients for analytical approximation to the scattering factors - ITC, p578 - Qff = xray_scattering_factor_resonant(element, energy_kev, qmag) + Qff = custom_scattering_factor(element, q_mag, energy_kev=None) - if resonant_energy = float(energy in keV), the total atomic scattering amplitude will be returned: + if energy_kev = array(energy in keV), the total atomic scattering amplitude will be returned: f(|Q|, E) = f0(|Q|) + f'(E) - if''(E) - See: - :param element: [n*str] list or array of elements - :param Qmag: [m] array wavevector distance |Q|, in A^-1 + + where f0 is the custom scattering factor calculated from analytical coefficients, + f' and f'' are the energy dependent dispersion corrections interpolated from + tabulated data. + + if energy_kev is None, f' and f'' are not included. + + Analytical coefficients and dispersion correction tables are taken for each element + from the interntal custom table (see add_custom_form_factor_coefs()). + If the element symbol is not found in the internal table, instead they are taken + from the default_table. + + default_table options: + 'itc' -> x-ray scattering factors from international tabels Volume C (ITC, p578 Table 6.1.1.4) + 'waaskirf' -> x-ray scattering factors from Waasmaier and Kirfel, Acta Cryst. (1995) A51, 416-431 + 'peng' -> electron scattering factors from Peng, L.-M. Acta Cryst A 1998, 54 (4), 481–485. + 'ndb' -> neutron scattering lengths from Neutron data booklet + 'sears' -> neutron scattering lengths from the international tables + + :param elements: [n*str] list or array of elements + :param q_mag: [m] array wavevector distance |Q|, in A^-1 + :param energy_kev: [o] array energy in keV or None [o==1] + :param default_table: scattering factor table to use if element not in custom list + :return: [m*n*o] complex array of scattering factors + """ + + if energy_kev is not None: + return custom_scattering_factor_resonant(elements, q_mag, energy_kev, default_table) + + elements = np.asarray(elements, dtype=str).reshape(-1) + q_mag = np.asarray(q_mag).reshape(-1) + qff = np.zeros([len(q_mag), len(elements), 1], dtype=complex) + element_coefs = scattering_factor_coefficients_custom(*elements, default_table=default_table) + for n, el in enumerate(elements): + coefs = element_coefs[el] + f0 = analytical_scattering_factor(q_mag, *coefs) # (n_q, ) + qff[:, n, 0] = f0 + return qff + + +def custom_scattering_factor_resonant(elements, q_mag, energy_kev, default_table='itc'): + """ + Read X-ray scattering factor table, calculate f(|Q|) + Qff = custom_scattering_factor(element, q_mag, energy_kev) + + if energy_kev = array(energy in keV), the total atomic scattering amplitude will be returned: + f(|Q|, E) = f0(|Q|) + f'(E) - if''(E) + + where f0 is the custom scattering factor calculated from analytical coefficients, + f' and f'' are the energy dependent dispersion corrections interpolated from + tabulated data. + + Analytical coefficients and dispersion correction tables are taken for each element + from the interntal custom table (see add_custom_form_factor_coefs()). + If the element symbol is not found in the internal table, instead they are taken + from the default_table. + + default_table options: + 'itc' -> x-ray scattering factors from international tabels Volume C (ITC, p578 Table 6.1.1.4) + 'waaskirf' -> x-ray scattering factors from Waasmaier and Kirfel, Acta Cryst. (1995) A51, 416-431 + 'peng' -> electron scattering factors from Peng, L.-M. Acta Cryst A 1998, 54 (4), 481–485. + 'ndb' -> neutron scattering lengths from Neutron data booklet + 'sears' -> neutron scattering lengths from the international tables + + :param elements: [n*str] list or array of elements + :param q_mag: [m] array wavevector distance |Q|, in A^-1 :param energy_kev: [o] array energy in keV + :param default_table: scattering factor table to use if element not in custom list :return: [m*n*o] complex array of scattering factors """ # Qmag and energy_kev should be a 1D array - Qmag = np.asarray(Qmag).reshape(-1) + elements = np.asarray(elements, dtype=str).reshape(-1) + q_mag = np.asarray(q_mag).reshape(-1) energy_kev = np.asarray(energy_kev).reshape(-1) + qff = np.zeros([len(q_mag), len(elements), len(energy_kev)], dtype=complex) - coef = atom_properties(element, ['a1', 'b1', 'a2', 'b2', 'a3', 'b3', 'a4', 'b4', 'c']) - f1, f2 = xray_dispersion_corrections(element, energy_kev) # shape (len(energy), len(element)) + element_coefs = scattering_factor_coefficients_custom(*elements, default_table=default_table) + tables = dispersion_table_custom(*elements) + for n, el in enumerate(elements): + coefs = element_coefs[el] + tab_en, tab_f1, tab_f2 = tables[el] + f0 = analytical_scattering_factor(q_mag, *coefs) # (n_q, ) + f1 = np.interp(energy_kev, tab_en, tab_f1) # (n_en, ) + f2 = np.interp(energy_kev, tab_en, tab_f2) # (n_en, ) + qff[:, n, :] = np.array([ + [ + _f0 if np.isnan(_f1) or np.isnan(_f2) else _f0 + (_f1 - 1j * _f2) + for _f1, _f2 in zip(f1, f2) # loop over energy + ] for _f0 in f0 # loop over q values + ]) + return qff + + +def load_magnetic_ff_coefs(): + """ + Magnetic Form Factor, Coefficients of the analytical approximation + Downloaded from McPhase website, 10/5/2020 + http://www.mcphase.de/manual/node130.html + Some modifications were required after downloading to read the file. + :return: dict['element']['coefficient'] + """ + # Read McPhase data + with open(MAGFF_FILE) as f: + lines = f.readlines() + lines = [l.replace('= ', '=').split() for l in lines if l[0] != '#'] + + # Build dict + mff_mcphase = {} + for ln in lines: + if ln[0] not in mff_mcphase: + mff_mcphase[ln[0]] = {} + for ii in ln[2:]: + if '=' in ii: + k, val = ii.split('=') + else: + raise NameError('%s\nline: %s has the wrong format' % (ln, ii)) + mff_mcphase[ln[0]][k] = float(val) + el = str2element(ln[0]) + if el not in mff_mcphase: + # Create default atom from first mention + mff_mcphase[el] = mff_mcphase[ln[0]] + return mff_mcphase + + +def magnetic_ff_symbol(element): + """Convert element symbol into style used in magnetic form factor table""" + name, occ, charge = split_element_symbol(element) + charge = '' if int(charge) == 0 else f"{abs(charge):.0f}" + return f"{name.capitalize()}{charge}" + + +def magnetic_ff_coefs(*elements): + """Return the magnetic form factor coefficients for an element""" + mff = load_magnetic_ff_coefs() + value_keys = ( + 'j0A', 'j0a', 'j0B', 'j0b', 'j0C', 'j0c', 'j0D', + 'j2A', 'j2a', 'j2B', 'j2b', 'j2C', 'j2c', 'j2D', + 'j4A', 'j4a', 'j4B', 'j4b', 'j4C', 'j4c', 'j4D', + ) + coefs = np.zeros([len(elements), len(value_keys)]) + for n, ele in enumerate(elements): + key = magnetic_ff_symbol(ele) + if key in mff: + coefs[n, :] = [mff[key][val] for val in value_keys] + # else: + # print(f"Not in magnetic form factor table: {ele}") + return coefs + + +def print_magnetic_ff_coefs(element): + """ + Print analytical coefficients for the magnetic form factor of an element + :param element: element symbol + :return: str + """ + mff = load_magnetic_ff_coefs() + name, occ, charge = split_element_symbol(element) + name = name.capitalize() + symbol = magnetic_ff_symbol(element) + out = '' + for key, coefs in mff.items(): + if name in key: + star = '*' if symbol == key else '' + coef_str = ', '.join([f"{coef}={val:8}" for coef, val in coefs.items()]) + out += f"{star+key:5}: {coef_str}\n" + return out - Qff = np.zeros([len(Qmag), len(coef), len(energy_kev)], dtype=complex) - # Broadcast dispersion corrections - Qff[:, :, :] = f1.T - 1j * f2.T # change from + to - on 2/July/2023 - # Loop over elements - for n in range(len(coef)): - a1 = coef['a1'][n] - b1 = coef['b1'][n] - a2 = coef['a2'][n] - b2 = coef['b2'][n] - a3 = coef['a3'][n] - b3 = coef['b3'][n] - a4 = coef['a4'][n] - b4 = coef['b4'][n] - c = coef['c'][n] +def last_df_orbital(element): + """ + Return the orbital configuration of the last d or f orbital in element + """ + name, occ, charge = split_element_symbol(element) + return next(reversed([o for o in orbital_configuration(name, charge) if 'd' in o or 'f' in o]), '') - # Array multiplication over Qmags - f = a1 * np.exp(-b1 * (Qmag / (4 * np.pi)) ** 2) + \ - a2 * np.exp(-b2 * (Qmag / (4 * np.pi)) ** 2) + \ - a3 * np.exp(-b3 * (Qmag / (4 * np.pi)) ** 2) + \ - a4 * np.exp(-b4 * (Qmag / (4 * np.pi)) ** 2) + c - for e in range(len(energy_kev)): - Qff[:, n, e] += f - return Qff + +def magnetic_ff_g_factor(*elements): + """ + Return the lande g-factor of the given elements + """ + g_factors = [] + for ele in elements: + orbital = last_df_orbital(ele) + g_factors.append(glande(*hunds_rule(orbital)) if orbital else 0) + return np.squeeze(g_factors) + + +def magnetic_ff_j2j0_ratio(gfactor, ratio_type=1): + """ + Return the ratio of / based on the Lande g-factor + This comes from using the dipole approximation (small |Q|): + F(|Q|) = + (2-g)/g * , where g is the Lande g-factor + The ratio is / j<0> = (2 - g) / g + if ratio_type == 2: + The ratio is / j<0> = (1 - 2 / g) + """ + if abs(gfactor) < 0.0001: + return 0.0 + if ratio_type == 2: + return 1 - (2 / gfactor) # equ. 13 http://www.physics.mcgill.ca/~dominic/papers201x/CJP_88_2010_p771.pdf + return (2 - gfactor) / gfactor # equ. 155 http://www.mcphase.de/manual/node130.html#jls + + +def magnetic_form_factor(*elements, qmag=0., orbital_state=None, gfactor=None, j2j0_ratio=None): + """ + Calcualte the magnetic form factor of an element or list of elements at wavevector |Q| + Analytical approximation of the magnetic form factor: + = A*exp(-a*s^2) + B*exp(-b*s^2) + C*exp(-c*s^2) + D, where s = sin(theta)/lambda in A-1 + = A*Q^2*exp(-a*s^2) + B*Q^2*exp(-b*s^2) + C*Q^2*exp(-c*s^2) + D*Q^2 + Using the dipole approximation (small |Q|): + F(|Q|) = + (2-g)/g * , where g is the Lande g-factor + See more about the approximatio here: https://www.ill.eu/sites/ccsl/ffacts/ffactnode3.html + Coefficients for the analytical approximation are available in the International Tables of Crystallography, Vol C + Here they have been copied from the web, published by the program McPhase: http://www.mcphase.de/manual/node130.html + The Lande g-factor is determined from the spin and orbital quantum numbers of the element in it's given state + If the orbital state and g-factor is not given, the neutral d/f state is used (see atom_valence_state()) + E.G. + mff = magnetic_form_factor('Co2+', qmag=np.arange(0,4,0.1), orbital_state='3d5') + + :param elements: str element symbols + :param qmag: magntude of the wavevector transfer, |Q|, in A^-1 + :param orbital_state: str, valence orbital to use to calculate the g-factor (must be same length as element) + :param gfactor: float, g-factor to use to calculate orbital component (must be same length as element) + :param j2j0_ratio: float, value of /, rather than using g-factor + :return: array([len(qmag), len(element)]) + """ + # s = sin(th)/lambda = |Q|/4pi + s2 = (np.asarray(qmag).reshape(-1) / (4 * np.pi)) ** 2 + + if j2j0_ratio is not None: + j2j0_ratio = np.asarray(j2j0_ratio).reshape(-1) + else: + if orbital_state is not None: + orbital_state = np.asarray(orbital_state, dtype=str).reshape(-1) + gfactor = np.array([glande(*hunds_rule(o)) for o in orbital_state]) + elif gfactor is None: + gfactor = magnetic_ff_g_factor(*elements) + j2j0_ratio = np.array([magnetic_ff_j2j0_ratio(g) for g in np.reshape(gfactor, -1)]) + + # replicate last element if array is shorter than elements + j2j0_ratio = j2j0_ratio[list(range(j2j0_ratio.size)) + [-1] * (len(elements) - j2j0_ratio.size)] + + coefs = magnetic_ff_coefs(*elements) # (len(ele) * 21) + qff = np.zeros([len(s2), len(elements)]) + + # Loop over elements + for n, ((A0, a0, B0, b0, C0, c0, D0, A2, a2, B2, b2, C2, c2, D2), rat) in enumerate(zip(coefs[:, :14], j2j0_ratio)): + j0 = A0 * np.exp(-a0 * s2) + \ + B0 * np.exp(-b0 * s2) + \ + C0 * np.exp(-c0 * s2) + D0 + j2 = (A2 * np.exp(-a2 * s2) + + B2 * np.exp(-b2 * s2) + + C2 * np.exp(-c2 * s2) + D2) * s2 + # Dipole approximation for small q + qff[:, n] = j0 + (rat * j2) + return qff -def magnetic_form_factor(element, Qmag=0.): +def magnetic_form_factor_old(element, Qmag=0.): """ Read Magnetic form factor table, calculate Analytical approximation of the magnetic form factor: @@ -1215,8 +1713,7 @@ def attenuation(element_z, energy_kev): element_z = np.asarray(element_z).reshape(-1) energy_kev = np.asarray(energy_kev).reshape(-1) - xma_file = os.path.join(datadir, 'XRayMassAtten_mup.dat') - xma_data = np.loadtxt(xma_file) + xma_data = np.loadtxt(XMAFILE) energies = xma_data[:, 0] / 1000. out = np.zeros([len(energy_kev), len(element_z)]) @@ -1298,20 +1795,30 @@ def xray_dispersion_corrections(elements, energy_kev=None): asf = np.load(ASFFILE, allow_pickle=True) asf = asf.item() - energy_kev = np.asarray(energy_kev, dtype=float).reshape(-1) elements = np.asarray(elements, dtype=str).reshape(-1) + if energy_kev is None: + if len(elements) == 1: + energy_kev = np.array(asf[elements[0]]['energy']) / 1000. + else: + log_step = 0.003 # 0.007 in tables + min_energy = 10.0 + max_energy = 30000 + energy_kev = 10**np.arange(np.log10(min_energy), np.log10(max_energy) + log_step, log_step) / 1000. + else: + energy_kev = np.asarray(energy_kev, dtype=float).reshape(-1) if1 = np.zeros([len(energy_kev), len(elements)]) if2 = np.zeros([len(energy_kev), len(elements)]) for n, el in enumerate(elements): - z = asf[el]['Z'] - energy = np.array(asf[el]['energy']) / 1000. # eV -> keV - f1 = np.array(asf[el]['f1']) - f2 = np.array(asf[el]['f2']) - f1[f1 < -1000] = np.nan - f2[f2 < -1000] = np.nan - # interpolate and subtract f0==Z - if1[:, n] = np.interp(energy_kev, energy, f1) - z - if2[:, n] = -np.interp(energy_kev, energy, f2) + if el in asf: + z = asf[el]['Z'] + energy = np.array(asf[el]['energy']) / 1000. # eV -> keV + f1 = np.array(asf[el]['f1']) + f2 = np.array(asf[el]['f2']) + f1[f1 < -1000] = np.nan + f2[f2 < -1000] = np.nan + # interpolate and subtract f0==Z (where does this come from???) + if1[:, n] = np.interp(energy_kev, energy, f1) - z + if2[:, n] = -np.interp(energy_kev, energy, f2) return if1, if2 @@ -1568,6 +2075,8 @@ def find_spacegroup(sg_symbol): """ sg_symbol = sg_symbol.replace(' ', '').replace('\"', '') sg_dict = spacegroups() + if str(sg_symbol) in sg_dict: + return sg_dict[str(sg_symbol)] sg_keys = list(sg_dict.keys()) sg_names = [sg['space group name'] for sg in sg_dict.values()] if sg_symbol in sg_names: @@ -1575,12 +2084,21 @@ def find_spacegroup(sg_symbol): return sg_dict[key] sg_dict_mag = spacegroups_magnetic() - sg_keys = list(sg_dict_mag.keys()) - sg_names = [sg['space group name'] for sg in sg_dict_mag.values()] - if sg_symbol in sg_names: - key = sg_keys[sg_names.index(sg_symbol)] + if str(sg_symbol) in sg_dict_mag: + return sg_dict_mag[str(sg_symbol)] + sg_keys_mag = list(sg_dict_mag.keys()) + sg_names_mag = [sg['space group name'] for sg in sg_dict_mag.values()] + if sg_symbol in sg_names_mag: + key = sg_keys_mag[sg_names_mag.index(sg_symbol)] return sg_dict_mag[key] - # TODO: add closest matching spacegroup + # Find first matching spacegroup + sg_symbol = sg_symbol.lower() + for stored_symbol in sg_names: + if sg_symbol in stored_symbol.lower(): + return sg_dict[sg_keys[sg_names.index(stored_symbol)]] + for stored_symbol in sg_names_mag: + if sg_symbol in stored_symbol.lower(): + return sg_dict_mag[sg_keys_mag[sg_names_mag.index(stored_symbol)]] return None @@ -1896,6 +2414,83 @@ def count_charges(list_of_elements, occupancy=None, divideby=1, latex=False): return outstr +def hunds_rule(state): + """ + Determine S,L,J numbers using Hunds Rules + S, L, J = Hunds('3d3') + :param state: str orbital state nl + :returns S, L, J ints + """ + n = int(state[0]) + if 's' in state: + l = 0 + elif 'p' in state: + l = 1 + elif 'd' in state: + l = 2 + elif 'f' in state: + l = 3 + else: + raise ValueError('%s is not a known state' % state) + + nelec = int(state[2:]) + norbits = 2 * l + 1 + orbits = 2 * list(range(l, -l - 1, -1)) + orb_spin = np.zeros(2 * norbits) + + for op in range(nelec): + if op >= norbits: + orb_spin[op] = -1 + else: + orb_spin[op] = 1 + + S = 0.5 * np.sum(orb_spin) + L = np.sum(np.abs(orb_spin) * (orbits)) + + if nelec > norbits: + # More than half-filled + J = np.abs(L + S) + else: + # Less than half filled + J = np.abs(L - S) + + return S, L, J + + +def glande(S, L, J): + """ + Calculate the Lande g-value + https://en.wikipedia.org/wiki/Land%C3%A9_g-factor + :param S: int Spin value + :param L: int orbital + :param J: int L + S value + :return: float G + """ + + S = np.asarray(S, dtype=float) + L = np.asarray(L, dtype=float) + J = np.asarray(J, dtype=float) + J[abs(J) < 0.01] = 0.01 + gj = 1.5 + (S * (S + 1) - L * (L + 1)) / (2 * J * (J + 1)) + if np.isnan(gj): + gj = 0.0 + return gj + + +def atom_valence_state(element, charge=0): + """ + Very simple way of determining the default neutral valence state of a transition metal + :param element: str element symbole + :param charge: float charge state (assumes this is a nominal charge state) + :return: str e.g. '3d7' + """ + orbitals = orbital_configuration(element, charge) + dstates = [o for o in orbitals if 'd' in o or 'f' in o] + if len(dstates) > 0: + return dstates[-1] + return orbitals[-1] + + def molecular_weight(compound_name): """ Calculate the molecular weight of given compound diff --git a/Dans_Diffraction/functions_general.py b/Dans_Diffraction/functions_general.py index c6bb364..c901423 100644 --- a/Dans_Diffraction/functions_general.py +++ b/Dans_Diffraction/functions_general.py @@ -1270,6 +1270,15 @@ def peak_function(func_name, *args, **kwargs): raise ValueError('%s not available as peak function.' % func_name) +def liststr(string): + """ + Convert str or list of str to list of str + :param string: str, byteString, list, array + :return: list of str + """ + return list(np.asarray(string, dtype=str).reshape(-1)) + + def frange(start, stop=None, step=1): """ Returns a list of floats from start to stop in step increments diff --git a/Dans_Diffraction/functions_lattice.py b/Dans_Diffraction/functions_lattice.py index 02efa9e..d988c20 100644 --- a/Dans_Diffraction/functions_lattice.py +++ b/Dans_Diffraction/functions_lattice.py @@ -318,30 +318,31 @@ def random_lattice(symmetry='triclinic'): :param symmetry: string 'cubic', 'tetragona', 'rhobohedral', 'monoclinic-a/b/c', 'triclinic' :return: (a, b, c, alpha, beta, gamma) lattice parameters in Angstroms/ degrees """ - def rlen(): + def r_len(): return np.random.normal(5., 2.0) - def rang(): + def r_ang(): return np.random.normal(90., 20.) if symmetry == 'cubic': - latt = 3 * [rlen()] + [90, 90, 90] + latt = 3 * [r_len()] + [90, 90, 90] elif symmetry == 'tetragonal': - latt = 2 * [rlen()] + [rlen()] + [90, 90, 90] + latt = 2 * [r_len()] + [r_len()] + [90, 90, 90] elif symmetry == 'hexagonal': - latt = 2 * [rlen()] + [rlen()] + [90, 90, 120] + latt = 2 * [r_len()] + [r_len()] + [90, 90, 120] elif symmetry == 'rhobohedral': - latt = 3 * [rlen()] + 3 * [rang()] + latt = 3 * [r_len()] + 3 * [r_ang()] elif symmetry == 'monoclinic-a': - latt = [rlen(), rlen(), rlen(), rang(), 90, 90] + latt = [r_len(), r_len(), r_len(), r_ang(), 90, 90] elif symmetry == 'monoclinic-b': - latt = [rlen(), rlen(), rlen(), 90, rang(), 90] + latt = [r_len(), r_len(), r_len(), 90, r_ang(), 90] elif symmetry == 'monoclinic-c': - latt = [rlen(), rlen(), rlen(), 90, 90, rang()] + latt = [r_len(), r_len(), r_len(), 90, 90, r_ang()] else: - while not angles_allowed(*(triclinic_angles := [rang(), rang(), rang()])): - pass - latt = [rlen(), rlen(), rlen()] + triclinic_angles + triclinic_angles = [r_ang(), r_ang(), r_ang()] + while not angles_allowed(*triclinic_angles): + triclinic_angles = [r_ang(), r_ang(), r_ang()] + latt = [r_len(), r_len(), r_len()] + triclinic_angles return tuple(latt) diff --git a/Dans_Diffraction/functions_plotting.py b/Dans_Diffraction/functions_plotting.py index b1702a0..d53634b 100644 --- a/Dans_Diffraction/functions_plotting.py +++ b/Dans_Diffraction/functions_plotting.py @@ -841,7 +841,7 @@ def plot_magnetic_form_factor(elements, maxq=10): """ q = np.linspace(0, maxq, 200) - mff = fc.magnetic_form_factor(elements, q) + mff = fc.magnetic_form_factor(*elements, qmag=q) newplot(q, mff) plt.legend(np.asarray(elements).reshape(-1), loc=0, frameon=False, fontsize=18) diff --git a/Dans_Diffraction/functions_scattering.py b/Dans_Diffraction/functions_scattering.py index 64dfdc1..08a7c4e 100644 --- a/Dans_Diffraction/functions_scattering.py +++ b/Dans_Diffraction/functions_scattering.py @@ -39,13 +39,14 @@ Diamond 2018 -Version 1.0 -Last updated: 06/02/25 +Version 1.1 +Last updated: 05/08/25 Version History: 11/11/18 0.1 Version History started. 13/07/21 0.9 Functions re-written and tested 06/02/25 1.0 Removed refrences to unpolarised magnetic scattering due to incorrect averaging +05/08/25 1.1 Added custom scattering option @author: DGPorter """ @@ -56,7 +57,7 @@ from . import functions_general as fg from . import functions_crystallography as fc -__version__ = '1.0' +__version__ = '1.1' MAX_QR_ARRAY = 1.0e7 TIME_REPORT = True @@ -72,6 +73,7 @@ 'xray resonant': ['xray resonant', 'resonant', 'resonant xray', 'rxs'], 'xray dispersion': ['dispersion', 'xray dispersion'], 'electron': ['electron', 'ele', 'e'], + 'custom': ['custom'], } @@ -192,6 +194,34 @@ def sf_xray_dispersion(q, r, scattering_factor, occ=None, debyewaller=None, **kw return sf +def sf_custom(q, r, scattering_factor, occ=None, debyewaller=None, **kwargs): + """ + Calculate the structure factor using customised atomic scattering factors + :param q: [n,3] array of hkl reflections + :param r: [m,3] array of atomic positions in r.l.u. + :param scattering_factor: array [n,m,e]: energy dependent complex atomic form factor + :param occ: [m,1] array of atomic occupancies + :param debyewaller: [n,m] array of thermal factors for each atom and reflection + :param kwargs: additional options[*unused] + :return sf: [n, e] complex array of structure factors + """ + phase = phase_factor_qr(q, r) + scattering_factor = np.asarray(scattering_factor, dtype=complex).reshape(*phase.shape, -1) + if occ is None: + occ = np.ones(phase.shape[1]) + if debyewaller is None: + debyewaller = np.ones(phase.shape) + + neng = scattering_factor.shape[2] + _debug('sf_custom(phase.shape=%s, energies=%s)' % (phase.shape, neng)) + sf = np.zeros([len(q), neng], dtype=complex) + for engval in range(neng): + sf[:, engval] = structure_factor(scattering_factor[:, :, engval], occ, debyewaller, phase) + if neng == 1: + return sf[:, 0] + return sf + + ######################################################################################################################## # ----------------------------------- MAGNETIC STRUCTURE FACTORS --------------------------------------------------- # ######################################################################################################################## @@ -234,7 +264,7 @@ def sf_magnetic_neutron(q, r, moment, magnetic_formfactor=None, occ=None, debye sfm = np.array([0., 0., 0.]) for m, mom in enumerate(moment): # Calculate Magnetic part - qm = mom - np.dot(qh, mom) * qh + qm = mom - np.dot(qh, mom) * qh # [mx, my, mz] # Calculate structure factor sfm = sfm + (magnetic_formfactor[n, m] * debyewaller[n, m] * occ[m] * phase[n, m] * qm) @@ -243,7 +273,9 @@ def sf_magnetic_neutron(q, r, moment, magnetic_formfactor=None, occ=None, debye # sf[n] = np.dot(sfm, incident_polarisation_vector) # sf[n] = np.dot(sfm, sfm) # maximum possible # average polarisation # 6/2/25: this method is incorrect for averaging polarisations, should combine intensity - sf[n] = (np.dot(sfm, [1, 0, 0]) + np.dot(sfm, [0, 1, 0]) + np.dot(sfm, [0, 0, 1])) / 3 + # sf[n] = (np.dot(sfm, [1, 0, 0]) + np.dot(sfm, [0, 1, 0]) + np.dot(sfm, [0, 0, 1])) / 3 + # magnitude of moment structure factor + sf[n] = np.sqrt(np.dot(sfm, sfm)) return sf @@ -338,8 +370,10 @@ def sf_magnetic_xray(q, r, moment, magnetic_formfactor=None, occ=None, debyewall for m, mom in enumerate(moment): sfm = sfm + magnetic_formfactor[n, m] * debyewaller[n, m] * occ[m] * phase[n, m] * mom - # average polarisation - sf[n] = (np.dot(sfm, [1, 0, 0]) + np.dot(sfm, [0, 1, 0]) + np.dot(sfm, [0, 0, 1])) / 3 + # average polarisation # 6/2/25: this method is incorrect for averaging polarisations, should combine intensity + # sf[n] = (np.dot(sfm, [1, 0, 0]) + np.dot(sfm, [0, 1, 0]) + np.dot(sfm, [0, 0, 1])) / 3 + # magnitude of moment structure factor + sf[n] = np.sqrt(np.dot(sfm, sfm)) return sf @@ -809,6 +843,15 @@ def scatteringvectors(q, energy_kev, azi_ref_q=(1, 0, 0), psi=0, polarisation='s ######################################################################################################################## +def get_scattering_type(scattering_type): + """Return correct label for scattering type""" + scattering_type = scattering_type.lower() + for name, alt_names in SCATTERING_TYPES.items(): + if scattering_type in alt_names: + return name + raise Exception(f"Scattering type {scattering_type} not recognized") + + def get_scattering_function(scattering_type): """ Return function for given scattering type @@ -828,15 +871,17 @@ def get_scattering_function(scattering_type): if scattering_type in SCATTERING_TYPES['electron']: return sf_atom if scattering_type in SCATTERING_TYPES['xray magnetic']: - return sf_magnetic_xray_polarised + return sf_magnetic_xray if scattering_type in SCATTERING_TYPES['neutron magnetic']: - return sf_magnetic_neutron_polarised + return sf_magnetic_neutron if scattering_type in SCATTERING_TYPES['neutron polarised']: return sf_magnetic_neutron_polarised if scattering_type in SCATTERING_TYPES['xray polarised']: return sf_magnetic_xray_polarised if scattering_type in SCATTERING_TYPES['xray resonant']: return sf_magnetic_xray_resonant + if scattering_type in SCATTERING_TYPES['custom']: + return sf_custom # sf_xray_dispersion is the most general as it allows energy raise Exception('Scattering name %s not recognised' % scattering_type) @@ -885,7 +930,9 @@ def scattering_factors(scattering_type, atom_type, qmag, enval, elif scattering_type in SCATTERING_TYPES['xray fast']: return fc.atom_properties(atom_type, 'Z') elif scattering_type in SCATTERING_TYPES['xray dispersion']: - return fc.xray_scattering_factor_resonant(atom_type, qmag, enval) + return fc.xray_scattering_factor_resonant(atom_type, qmag, enval, use_waaskirf=use_wasskirf) + elif scattering_type in SCATTERING_TYPES['custom']: + return fc.custom_scattering_factor(atom_type, qmag, enval) elif use_wasskirf: return fc.xray_scattering_factor_WaasKirf(atom_type, qmag) else: diff --git a/Examples/example_custom_scattering_factors.py b/Examples/example_custom_scattering_factors.py new file mode 100644 index 0000000..1770df4 --- /dev/null +++ b/Examples/example_custom_scattering_factors.py @@ -0,0 +1,54 @@ +""" +Dans_Diffraction Examples +Example use of custom scattering factors +""" + +import sys, os +import numpy as np +import matplotlib.pyplot as plt +cf = os.path.dirname(__file__) +sys.path.insert(0, os.path.join(cf, '..')) +import Dans_Diffraction as dif + +f = cf+'/../Dans_Diffraction/Structures/LiCoO2.cif' +xtl = dif.Crystal(f) + +# add custom element +coefs = (12.2841, 4.5791, 7.4409, 0.6784, 4.2034, 12.5359, 2.2488, 72.1692, 1.1118, 0.) +table = np.array([ + [7.7, 7.71, 7.72, 7.73, 7.74, 7.75, 7.76, 7.77, 7.78, 7.79], # keV + [-9.6866, -11.0362, -10.1969, -9.3576, -8.5184, -7.6791, -6.8398, -6.0005, -5.1613, -4.322], # f1 + [-0.4833, -3.7933, -3.7862, -3.7791, -3.772, -3.765, -3.7579, -3.7508, -3.7437, -3.7367] # f2 +]) +dif.fc.add_custom_form_factor_coefs('Co3+', *coefs, dispersion_table=table) +xtl.Atoms.changeatom(1, type='Co3+') +xtl.generate_structure() +xtl.Structure.type[3] = 'Co' + + +# Display scattering factors +print(xtl.Scatter.print_scattering_factor_coefficients()) + +xtl.Scatter.setup_scatter(scattering_type='custom', output=False) +xtl.Plot.plot_scattering_factors(q_max=6) + +# Calculate structure factors +en = np.arange(7.7, 7.8, 0.01) +ref = [0, 0, 3] +inten1 = xtl.Scatter.xray_dispersion(ref, en) +inten2 = xtl.Scatter.intensity(ref, 'custom', energy_kev=en) + +plt.figure() +plt.plot(en, inten1, '-', label='original') +plt.plot(en, inten2[0], '-', label='custom') +plt.xlabel('Energy [keV]') +plt.ylabel('intensity') +plt.legend() +plt.show() + +energy_kev = np.arange(7, 8, 0.2) +q_mag = np.arange(3, 4, 0.1) +elements = ['Co', 'O'] +print(f"Shape should be: ({len(q_mag)}, {len(elements)}, {len(energy_kev)})") +qff = dif.fc.custom_scattering_factor(elements, q_mag, energy_kev) +print(qff.shape) diff --git a/Examples/example_magnetic_neutron_scattering.py b/Examples/example_magnetic_neutron_scattering.py new file mode 100644 index 0000000..84f0ba8 --- /dev/null +++ b/Examples/example_magnetic_neutron_scattering.py @@ -0,0 +1,126 @@ +""" +Dans_Diffraction Examples +Calculate magnetic neutron structure factors with magnetic form factor +""" + +import sys,os +import numpy as np +import matplotlib.pyplot as plt +import Dans_Diffraction as dif + + +#f = '../Dans_Diffraction/Structures/MnO.mcif' +# f = dif.structure_list.LaMnO3.filename +# f = r"C:\Users\grp66007\PycharmProjects\Dans_Diffraction\Test\compare_mag_neutron_intensity_Aug25\LaMnO3_300K.cif" +f = r"C:\Users\grp66007\PycharmProjects\Dans_Diffraction\Test\compare_mag_neutron_intensity_Aug25\LaMnO3.cif" + +# Magnetic form factor +# mag_ff = dif.fc.load_magnetic_ff_coefs() +q = np.arange(0, 20, 0.05) +ion = 'Mn3+' +j2j0_ratio = dif.fc.magnetic_ff_j2j0_ratio(dif.fc.magnetic_ff_g_factor(ion), ratio_type=1) +mag_ff = dif.fc.magnetic_form_factor(ion, qmag=q, j2j0_ratio=j2j0_ratio) +print(f"Magnetic Form Facors for {ion} with f(Q) = + {j2j0_ratio:.4g}") +print(dif.fc.print_magnetic_ff_coefs(ion)) + +# plt.figure() +# plt.plot(q, mag_ff) +# plt.xlabel('|Q|') +# plt.ylabel(f" + {j2j0_ratio:.3g}") +# plt.title(ion) +# plt.grid() +# plt.show() + + +xtl = dif.Crystal(f) +xtl.Atoms.changeatom(1, type='Mn3+') +# xtl.Atoms.removeatom(3) +# xtl.Atoms.removeatom(2) +# xtl.Atoms.removeatom(0) +xtl.generate_structure() +ub = 3.87 +xtl.Structure.changeatom(4, mxmymz=[ub, 0, 0]) +xtl.Structure.changeatom(5, mxmymz=[-ub, 0, 0]) +xtl.Structure.changeatom(6, mxmymz=[-ub, 0, 0]) +xtl.Structure.changeatom(7, mxmymz=[ub, 0, 0]) +print(xtl) + +xtl.Scatter.setup_scatter( + scattering_type='neutron', + magnetic_formfactor=True, + use_sears=True, +) + +# print(xtl.Scatter.print_scattering_factor_coefficients()) + + +# print(xtl.Scatter.print_atomic_contributions([0,0,2])) + +# print(xtl.Scatter.print_symmetry_contributions([0, 0, 2])) + +# print("Neutron Magnetic Reflections") +# print(xtl.Scatter.print_all_reflections(print_symmetric=True, min_intensity=0.1)) + +# 40.602 +pols = [ + [1, 0, 0], + [0, 1, 0], + [0, 0, 1] +] +ii = 0 +for pol in pols: + xtl.Scatter._polarisation_vector_incident = pol + f = np.sqrt(xtl.Scatter.intensity([0, 0, 1], scattering_type='neutron magnetic')) + print(f"pol = {pol}, |SF| = {f[0]:8.5g}") + ii += f[0] +print(f"Total |SF| = {ii:8.5g}") +""" +pol = [1, 0, 0], |SF| = 15.355 +pol = [0, 1, 0], |SF| = 15.355 +pol = [0, 0, 1], |SF| = 15.355 +Total |SF| = 46.065 +""" + +# sf_file = r"C:\Users\grp66007\PycharmProjects\Dans_Diffraction\Test\compare_mag_neutron_intensity_Aug25\Fcal_Mag_CM.txt" +sf_file = r"C:\Users\grp66007\PycharmProjects\Dans_Diffraction\Test\compare_mag_neutron_intensity_Aug25\Fcal_Mag_CM_LMO.txt" +data = np.loadtxt(sf_file) + +hkl = data[:, :3].astype(int) +nuclear = np.sqrt(xtl.Scatter.intensity(hkl, scattering_type='neutron')) # |Fcal| = sqrt(I) = sqrt(|Fcal|^2) +magnetic = np.sqrt(xtl.Scatter.intensity(hkl, scattering_type='neutron magnetic')) + +for n, (h, k, l) in enumerate(hkl): + if (abs(h)+abs(k)+abs(l)) <= 4 and data[n, 5] > 0.1 and h >= 0 and k >= 0 and l >= 0: + print(f"{h:2} {k:2} {l:2} {data[n, 4]:8.3f}={nuclear[n]:8.3f} {data[n, 5]:8.3f}={magnetic[n]:8.3f}") + +# +""" + 0 0 1 0.000= 0.000 40.602= 15.355 + 0 0 3 0.000= 0.000 32.648= 14.270 + 0 2 1 8.136= 8.136 33.371= 14.390 + 1 1 1 10.026= 10.026 28.146= 11.436 + 2 0 1 0.000= 0.000 11.136= 4.845 +""" +hkl_inten = [ + ([0, 0, 1], 40.602), + ([0, 0, 3], 32.648), + ([0, 2, 1], 33.371), + ([1, 1, 1], 28.146), + ([2, 0, 1], 11.136), +] + +# LaMnO3.cif, ...LMO.txt +""" + 0 1 0 0.000= 0.000 41.456= 15.354 + 0 1 2 0.000= 0.000 38.630= 14.308 + 0 3 0 0.000= 0.000 38.502= 14.260 + 1 1 1 10.489= 10.489 31.652= 11.723 + 2 1 0 7.534= 7.534 13.637= 5.051 + """ +hkl_inten = [ + ([0, 1, 0], 41.456), + ([0, 1, 2], 38.630), + ([0, 3, 0], 38.502), + ([1, 1, 1], 31.652), + ([2, 1, 0], 13.637), +] \ No newline at end of file diff --git a/Examples/example_magnetic_structure.py b/Examples/example_magnetic_structure.py index 824965d..c095039 100644 --- a/Examples/example_magnetic_structure.py +++ b/Examples/example_magnetic_structure.py @@ -25,7 +25,7 @@ #xtl._scattering_type = 'xray magnetic' # neutron magnetic xtl.Scatter.setup_scatter( - type='xray magnetic', + scattering_type='xray magnetic', energy_kev=2.838, specular=[1,0,0], min_theta=-20, diff --git a/Test/unit_tests.py b/Test/unit_tests.py index b761492..0f4b503 100644 --- a/Test/unit_tests.py +++ b/Test/unit_tests.py @@ -91,7 +91,7 @@ print('\nCobalt Weight = %6.2f g' % weight[0]) xsf = dif.fc.xray_scattering_factor('Co', 3) print('Cobalt x-ray scattering factor @ 3A = %6.2f' % xsf[0, 0]) -mff = dif.fc.magnetic_form_factor('Co', 0.5) +mff = dif.fc.magnetic_form_factor('Co', qmag=0.5) print('Cobalt magnetic form factor @ 0.5A = %6.2f' % mff[0, 0]) att = dif.fc.attenuation(27, 8) print('Cobalt attenuation @ 8.00keV = %6.2f cm^2/g' % att) diff --git a/requirements.txt b/requirements.txt index 4541205..6cdf7cd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ numpy matplotlib -setuptools \ No newline at end of file +pytest \ No newline at end of file diff --git a/tests/test_data_tables.py b/tests/test_data_tables.py new file mode 100644 index 0000000..522be39 --- /dev/null +++ b/tests/test_data_tables.py @@ -0,0 +1,122 @@ +""" +Dans_Diffraction test of data loading from tables +""" + +import pytest +import numpy as np +import Dans_Diffraction as dif + + +def test_xray_scattering_factor_resonant(): + elements = ['Co', 'O', 'Ru'] + q_mag = [2, 3, 4, 5] + energy_kev = np.arange(7.5, 7.8, 0.05) + data = dif.fc.xray_scattering_factor_resonant(elements, q_mag, energy_kev) + assert data.shape == (len(q_mag), len(elements), len(energy_kev)) + assert abs(data.sum() - complex(1178.5990511, 111.8445339)) < 0.0001 + data = dif.fc.xray_scattering_factor_resonant(elements, q_mag, energy_kev, use_waaskirf=True) + assert data.shape == (len(q_mag), len(elements), len(energy_kev)) + assert abs(data.sum() - complex(1178.6375568, 111.8445333)) < 0.0001 + + +def test_old_new_functions(): + """tests old form factor functions and new ones are consistent""" + + elements = ['Co', 'O'] + q_mag = [0, 1, 2, 3] + energy_kev = np.arange(7.5, 7.8, 0.05) + + # Neutron + tables = ['ndb', 'sears'] + for table in tables: + old_ff = dif.fc.neutron_scattering_length(elements, table) + new_ff = dif.fc.custom_scattering_factor(elements, 0, None, default_table=table) + new_ff = new_ff.squeeze() + diff = np.sum(abs(old_ff - new_ff)) + print(table, old_ff.shape, new_ff.shape, diff) + # TODO: check why this isn't smaller + assert diff < 0.02, f"{table} is incorrect" + + # x-ray + tables = { + 'itc': dif.fc.xray_scattering_factor, + 'waaskirf': dif.fc.xray_scattering_factor_WaasKirf, + 'peng': dif.fc.electron_scattering_factor, + } + for table, fun in tables.items(): + old_ff = fun(elements, q_mag) + new_ff = dif.fc.custom_scattering_factor(elements, q_mag, None, default_table=table) + new_ff = new_ff.squeeze() + diff = np.sum(abs(old_ff - new_ff)) + print(table, old_ff.shape, new_ff.shape, diff) + assert diff < 0.01, f"{table} is incorrect" + + # resonant x-ray + old_ff = dif.fc.xray_scattering_factor_resonant(elements, q_mag, energy_kev) + new_ff = dif.fc.custom_scattering_factor(elements, q_mag, energy_kev, default_table='itc') + diff = np.sum(abs(old_ff - new_ff)) + print('resonant', old_ff.shape, new_ff.shape, diff) # diff~6.5, due to interpolation difference in f2 + assert diff < 10, f"resonant scattering factors are incorrect" + + +def test_magnetic_form_factor(): + mff = dif.fc.load_magnetic_ff_coefs() + elements = [ + # mmf label, element + ('Co0', 'Co'), + ('Co1', 'Co1+'), + ('Co3', 'Co3+'), + ('O', 'O'), + ('Ru1', 'Ru1+'), + ('U4', 'U4+') + ] + coefs = dif.fc.magnetic_ff_coefs(*(el for lab, el in elements)) + for n, (label, element) in enumerate(elements): + if label in mff: + assert all(abs(coefs[n] - list(mff[label].values())[:21]) < 0.001), f"form factor coefficients for {element} wrong" + + glande = dif.fc.magnetic_ff_g_factor(*(el for lab, el in elements)) + check = [1.3333, 1.5, 2, 0, 2, 1.5] + assert all(abs(glande - check) < 0.01), 'incrorrect Lande g-factor' + + ratio = [dif.fc.magnetic_ff_j2j0_ratio(g) for g in glande] + check = [0.5, 0.333, 0, 0, 0, 0.333] + assert all(abs(r - c) < 0.01 for r, c in zip(ratio, check)), 'incorrect j2j0 ratio' + + qmag = [0, 4, 12] + ff = dif.fc.magnetic_form_factor(*(el for lab, el in elements), qmag=qmag) + check = [ + [ 0.9979, 0.9996, 0.9998, 0. , 1. , 1.0001], + [ 0.5198, 0.4582, 0.4902, 0. , 0.1202, 0.2987], + [ 0.036 , 0.0208, -0.0073, 0. , 0.0158, 0.0129] + ] + assert (abs(ff - check) < 0.001).all(), "incorrect form factors" + + +def test_custom_scattering_factor(): + coefs = (12.2841, 4.5791, 7.4409, 0.6784, 4.2034, 12.5359, 2.2488, 72.1692, 1.1118, 0.) + table = np.array([ + [7.7, 7.71, 7.72, 7.73, 7.74, 7.75, 7.76, 7.77, 7.78, 7.79], # keV + [-9.6866, -11.0362, -10.1969, -9.3576, -8.5184, -7.6791, -6.8398, -6.0005, -5.1613, -4.322], # f1 + [-0.4833, -3.7933, -3.7862, -3.7791, -3.772, -3.765, -3.7579, -3.7508, -3.7437, -3.7367] # f2 + ]) + dif.fc.add_custom_form_factor_coefs('Co3+', *coefs, dispersion_table=table) + + elements = ['Co', 'Co3+'] + q_mag = [0, 1, 2, 3] + energy_kev = np.arange(7.7, 7.8, 0.05) + ff = dif.fc.custom_scattering_factor(elements, q_mag, energy_kev) + diff = np.sum(np.diff(ff, axis=1)) + print(f"Difference between {elements[0]} and {elements[1]} = {diff}") + assert abs(diff) > 6 + + +def test_spacegroup_find(): + spg = dif.fc.find_spacegroup('P63/mmc') + assert spg['space group number'] == 194 + spg = dif.fc.find_spacegroup('m-3m') # Pm-3m + assert len(spg['general positions']) == 48 + spg = dif.fc.find_spacegroup('m\'') + assert spg['space group name'] == "P2/m'" + spg = dif.fc.find_spacegroup('218.83') # P-4'3n' + assert len(spg['operators magnetic']) == 24 diff --git a/tests/test_functionality.py b/tests/test_functionality.py index 311f1b8..35186fb 100644 --- a/tests/test_functionality.py +++ b/tests/test_functionality.py @@ -36,7 +36,7 @@ def test_properties(): print('\nCobalt Weight = %6.2f g' % weight[0]) xsf = dif.fc.xray_scattering_factor('Co', 3) print('Cobalt x-ray scattering factor @ 3A = %6.2f' % xsf[0, 0]) - mff = dif.fc.magnetic_form_factor('Co', 0.5) + mff = dif.fc.magnetic_form_factor('Co', qmag=0.5) print('Cobalt magnetic form factor @ 0.5A = %6.2f' % mff[0, 0]) att = dif.fc.attenuation(27, 8) print('Cobalt attenuation @ 8.00keV = %6.2f cm^2/g' % att) diff --git a/tests/test_structure_factors.py b/tests/test_structure_factors.py index d2f811b..f2cb2e8 100644 --- a/tests/test_structure_factors.py +++ b/tests/test_structure_factors.py @@ -95,3 +95,37 @@ def test_magnetic_mno(): polarisation_vector=[1, 0, 0] ) assert abs(xtl.Scatter.intensity([1, 1, 1]) - 4332.39) < 0.01, 'incorrect polarised neutron intensity' + + assert abs( + xtl.Scatter.intensity([1, 1, 1], scattering_type='xray magnetic')[0] - 25994.32 + ) < 0.01, 'incorrect magnetic xray intensity' + assert abs( + xtl.Scatter.intensity([1, 1, 1], scattering_type='neutron magnetic')[0] - 25994.32 + ) < 0.01, 'incorrect magnetic neutron intensity' + + +def test_magnetic_lmo(): + xtl = dif.structure_list.LaMnO3() + hkl = [[0,0,1], [1, 0, 0], [0, 1, 0], [1, 1, 0], [1, 1, 1]] + exp = [0, 0, 215.507397, 0, 148.85200365] + cal = xtl.Scatter.intensity(hkl, scattering_type='xray magnetic') + assert all(abs(cal - exp) < 0.001), 'incorrect magnetic x-ray intensity' + exp = [0, 0, 215.507397, 0, 92.48078345] + cal = xtl.Scatter.intensity(hkl, scattering_type='neutron magnetic') + assert all(abs(cal - exp) < 0.001), 'incorrect magnetic neutron intensity' + + # Comparison with https://taro-nakajima.github.io/fcal-n/#m-form_symbols + # LaMnO3.cif with Mn3 /=2 + hkl_inten = [ + ([0, 0, 2], 0), + ([0, 1, 0], 41.456), + ([0, 1, 2], 38.630), + ([0, 3, 0], 38.502), + ([1, 1, 1], 31.652), + ([2, 1, 0], 13.637), + ] + hkl = [h for h, ii in hkl_inten] + cal = xtl.Scatter.intensity(hkl, scattering_type='neutron magnetic') + # TODO: work out why this doesn't work + # assert all(abs(cal - [ii**2 for h, ii in hkl_inten]) < 0.1), "neutron magnetic intensity doesnt match fcal-n" +