diff --git a/README.md b/README.md index 4a1cd8ff..067a2ad2 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ generation, and currently supports the following codes: - [OCEAN](https://www.nist.gov/services-resources/software/ocean) - [EXCITING](https://exciting-code.org) - [Xspectra](https://gitlab.com/QEF/q-e/-/tree/master/XSpectra) +- [FDMNES](https://fdmnes.neel.cnrs.fr) with more on the way! The software is intended to be user-friendly, extensively documented and tested, and extendable for those users who diff --git a/lightshow/parameters/fdmnes.py b/lightshow/parameters/fdmnes.py index b3508097..283e8b58 100644 --- a/lightshow/parameters/fdmnes.py +++ b/lightshow/parameters/fdmnes.py @@ -1,4 +1,3 @@ -from pathlib import Path from warnings import warn from monty.json import MSONable @@ -17,7 +16,8 @@ "Screening": False, "Full_atom": False, "TDDFT": False, - "PBE96": False, + "Perdew": True, + "Green": False } @@ -72,23 +72,22 @@ class FDMNESParameters(MSONable, _BaseParameters): def __init__( self, cards=FDMNES_DEFAULT_CARDS, - e_range="-5. 0.5 60.", + e_range="-5. 0.2 60.", edge="K", - radius=7.0, - name=None, + radius=5.0, + name=None ): self._cards = cards self._radius = radius - self._range = e_range - - self._name = name if name is not None else "FDMNES" + self._e_range = e_range self._edge = edge - + + self._name = name if name is not None else "FDMNES" self.validate_edge() def validate_edge(self): """ - Validates and adjusts the edge attribute based on standard edge choices + # Validates and adjusts the edge attribute based on standard edge choices supported by FDMNES. Edge types recognized: @@ -160,29 +159,33 @@ def get_FDMNESinput(self, structure, Z_absorber): transition_metal_ranges = [range(21, 31), range(39, 49), range(57, 81)] - if self._edge == "K": - if "Nonrelat" not in cards.keys(): + if cards.get("Green", False): + return cards + + else: + if self._edge == "K": + if "Nonrelat" not in cards.keys(): + cards["Spinorbit"] = True + warn( + "Spin-orbit has been turned on for K-edge calculation " + "for accuracy. The simulation is typically 4 to 8 times " + "longer and need 2 times more memory space. To turn" + " it off, set 'Nonrelat' = True. " + ) + if any(Z_absorber in r for r in transition_metal_ranges): + cards["Quadrupole"] = True + + elif self._edge == "L23" and Z_absorber in range(21, 26): + cards["TDDFT"] = True + + if any(z > 36 for z in species_z_list): + cards["Relativism"] = True + + if any(z > 50 for z in species_z_list): cards["Spinorbit"] = True - warn( - "Spin-orbit has been turned on for K-edge calculation " - "for accuracy. The simulation is typically 4 to 8 times " - "longer and need 2 times more memory space. To turn" - " it off, set 'Nonrelat' = True. " - ) - if any(Z_absorber in r for r in transition_metal_ranges): - cards["Quadrupole"] = True - elif self._edge == "L23" and Z_absorber in range(21, 26): - cards["TDDFT"] = True - - if any(z > 36 for z in species_z_list): - cards["Relativism"] = True - - if any(z > 50 for z in species_z_list): - cards["Spinorbit"] = True - - if 8 in species_z_list: - cards["Full_atom"] = True + if 8 in species_z_list: + cards["Full_atom"] = True return cards @@ -211,11 +214,28 @@ def write(self, target_directory, **kwargs): ``{"pass": True, "errors": dict(), "path": ...}``. """ - structure = kwargs["structure"] - Z_absorber = kwargs["Z_absorber"] - - if structure is None: - raise ValueError("Structure must be provided.") + structure = kwargs.get("structure_uc", kwargs["structure"]) + + Z_absorber = kwargs.get("Z_absorber") + + sites = kwargs.get("sites") + if sites is None: + # Infer absorber sites from Z_absorber; if absent, default to the first site + if Z_absorber is None: + sites = [0] + else: + if isinstance(Z_absorber, (list, tuple, set)): + zset = {int(z) for z in Z_absorber} + else: + zset = {int(Z_absorber)} + + sites = [i for i, s in enumerate(structure) if int(s.specie.Z) in zset] + if not sites: + raise ValueError(f"No absorber sites found for Z_absorber={Z_absorber}.") + + all_species = [structure[site].specie.symbol for site in sites] + species = list(dict.fromkeys(all_species)) + Z_absorbers = [Element(specie).Z for specie in species] # prepare lattice parameters, atomic numbers and fractional coordinates a, b, c = structure.lattice.abc @@ -223,49 +243,44 @@ def write(self, target_directory, **kwargs): atomic_numbers = structure.atomic_numbers scaled_positions = structure.frac_coords - if Z_absorber is None: - Z_absorber = atomic_numbers[0] - warn( - "Z_absorber is not provided, apply the first atom specie" - f"to be the absorbing specie Z={atomic_numbers[0]} " - ) + for i in range(len(Z_absorbers)): + specie = species[i] + Z_absorber = Z_absorbers[i] - element_absorber = Element.from_Z(Z_absorber).symbol - target_directory = Path(target_directory) - target_directory.mkdir(exist_ok=True, parents=True) + target_directory.mkdir(exist_ok=True, parents=True) - fdmnesinput = self.get_FDMNESinput(structure, Z_absorber) - filepath = target_directory / f"{element_absorber}_in.txt" + fdmnesinput = self.get_FDMNESinput(structure, Z_absorber) + filepath = target_directory / f"{specie}_in.txt" - with open(filepath, "w") as f: - f.write("Filout\n") - f.write(f" {element_absorber}\n\n") + with open(filepath, "w") as f: + f.write("Filout\n") + f.write(f" {specie}\n\n") - f.write("Range\n") - f.write(f" {self._range}\n\n") + f.write("Range\n") + f.write(f" {self._e_range}\n\n") - f.write("Radius\n") - f.write(f" {self._radius}\n\n") + f.write("Radius\n") + f.write(f" {self._radius}\n\n") - for key, value in fdmnesinput.items(): - if value: - f.write(f"{key}\n\n") + for key, value in fdmnesinput.items(): + if value: + f.write(f"{key}\n\n") - f.write("Crystal \n") - f.write( - f"{a:.4f} {b:.4f} {c:.4f} {alpha:.1f} {beta:.1f} {gamma:.1f}\n" - ) - for atomic_number, pos in zip(atomic_numbers, scaled_positions): + f.write("Crystal \n") f.write( - f" {atomic_number} {pos[0]:.4f} {pos[1]:.4f} " - f"{pos[2]:.4f}\n" + f"{a:.4f} {b:.4f} {c:.4f} {alpha:.1f} {beta:.1f} {gamma:.1f}\n" ) - - f.write("\nZ_Absorber\n") - f.write(f" {Z_absorber}\n\n") - f.write("Edge \n") - f.write(f" {self._edge}\n\n") - f.write("Convolution \n\n") - f.write("End") + for atomic_number, pos in zip(atomic_numbers, scaled_positions): + f.write( + f" {atomic_number} {pos[0]:.4f} {pos[1]:.4f} " + f"{pos[2]:.4f}\n" + ) + + f.write("\nZ_Absorber\n") + f.write(f" {Z_absorber}\n\n") + f.write("Edge \n") + f.write(f" {self._edge}\n\n") + f.write("Convolution \n\n") + f.write("End") return {"pass": True, "errors": dict(), "path": str(filepath)} diff --git a/notebooks/00_basic_usage.ipynb b/notebooks/00_basic_usage.ipynb index 1e850830..5edf470d 100644 --- a/notebooks/00_basic_usage.ipynb +++ b/notebooks/00_basic_usage.ipynb @@ -164,7 +164,7 @@ { "cell_type": "code", "execution_count": null, - "id": "48a5bfa0-ae30-4a80-ba7f-ac094e404318", + "id": "99bb2f21-1a1a-4a34-b19a-deb9a8aa6b9a", "metadata": {}, "outputs": [], "source": [ @@ -175,10 +175,8 @@ { "cell_type": "code", "execution_count": null, - "id": "1e52ffc5-4209-47af-964b-e9d3401480f2", - "metadata": { - "tags": [] - }, + "id": "fac0a077-9a11-4a3c-92ad-04d837cc1bb5", + "metadata": {}, "outputs": [], "source": [ "import lightshow\n", @@ -193,7 +191,7 @@ "metadata": {}, "outputs": [], "source": [ - "database = Database.from_materials_project(material_ids=[\n", + "database = Database.from_materials_project(api_key=api_key, material_ids=[\n", " \"mp-390\",\n", " \"mp-1215\",\n", " \"mp-1840\",\n", @@ -249,7 +247,7 @@ "metadata": {}, "outputs": [], "source": [ - "from lightshow import FEFFParameters, VASPParameters, OCEANParameters, EXCITINGParameters, XSpectraParameters" + "from lightshow import FEFFParameters, VASPParameters, OCEANParameters, EXCITINGParameters, XSpectraParameters, FDMNESParameters" ] }, { @@ -599,6 +597,7 @@ "execution_count": null, "id": "bc6b6e25", "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false }, @@ -748,6 +747,84 @@ ")" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "af7b7b86-d078-4f33-91ca-31358f245c21", + "metadata": {}, + "outputs": [], + "source": [ + "database.write(\"test\", options=[xspectra_params], absorbing_atoms=[\"O\"])" + ] + }, + { + "cell_type": "markdown", + "id": "3a6ddf91-4f45-41f5-afe3-f3c7a7295ed4", + "metadata": {}, + "source": [ + "### FDMNES Parameters\n", + "Documentation can be found [here](https://cloud.neel.cnrs.fr/index.php/s/nL2c6kH2PLwcB5r)." + ] + }, + { + "cell_type": "markdown", + "id": "6736ee82-eae9-4851-bb09-4e30e68d1ce9", + "metadata": {}, + "source": [ + "Next let's construct the FDMNES inputs. FDMNESParamters class takes a few core arguments, including `cards`(simulation settings), `e_range`(the energy range and step size of the calculated spectrum, e.g., `\"-5. 0.2 60.\"` or `\"-5. 0.2 10. 0.5 30. 1. 60. 2. 100.\"`), `edge`(the type of absorption edge or edges, e.g., `\"K\"` or `\"L23\"`), and `radius`(the surrounding cluster size Angstroms of the absorbing atom). The default values are:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e48ba71c-55b1-4738-8d9d-d563f5205501", + "metadata": {}, + "outputs": [], + "source": [ + "fdmnes_params = FDMNESParameters(\n", + " cards={\n", + " \"Energpho\": True,\n", + " \"Memory_save\": True,\n", + " \"Quadrupole\": False,\n", + " \"Relativism\": False,\n", + " \"Spinorbit\": None,\n", + " \"SCF\": True,\n", + " \"SCFexc\": False,\n", + " \"Screening\": False,\n", + " \"Full_atom\": False,\n", + " \"TDDFT\": False,\n", + " \"Perdew\": True,\n", + " \"Green\": False,\n", + " },\n", + " e_range=\"-5. 0.2 60.\",\n", + " edge=\"K\",\n", + " radius=5.0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "337687b6-2512-43bd-a562-1402d982ca97", + "metadata": {}, + "source": [ + "FDMNES is a DFT program with a TDDFT extension. DFT is generally sufficient for the K-edges of all elements and the L23 edges of heavy elements. To improve the L23 edge split ratio of the first half of the 3d elements, `TDDFT` is turned on.\n", + "\n", + "If you are not satisfied with the calculation results from the default settings, try the following:\n", + "- Increase `radius`: Adjust the value up to convergence.\n", + "- Turn on `SCFexc`: By default, in FDMNES, self-consistency is performed without a core-hole at the K, L1, M1, and O1 edges, with the core-hole and its screening charge added only during the XANES step. When the agreement is not sufficiently good, particularly at the rising edge, this behavior can be modified using `SCFexc` (which includes the core-hole during the SCF step).\n", + "- Improve convolution: Experiment with `Gamma_max` and/or `Gamma_hole`. Refer to the documentation for more details.\n" + ] + }, + { + "cell_type": "markdown", + "id": "f265e6b4-10be-4e82-98b7-1e8f0b296779", + "metadata": {}, + "source": [ + "If you encounter memory issues, try turning off `Spinorbit`, downgrading to `Relativism`, or switching to a non-relativistic calculation by enabling `Nonrelat`.\n", + "\n", + "If you just want to perform a quick calculation, use the multiple scattering theory by turning on `Green`." + ] + }, { "cell_type": "markdown", "id": "9430320f-2838-44a8-bab0-e01a7e59c877", @@ -775,7 +852,7 @@ "metadata": {}, "outputs": [], "source": [ - "database.write(\"test\", options=[feff_params, vasp_params_corehole, ocean_params, exciting_params, xspectra_params], absorbing_atoms=[\"Ti\"])" + "database.write(\"test\", options=[feff_params, vasp_params_corehole, ocean_params, exciting_params, xspectra_params, fdmnes_params], absorbing_atoms=[\"Ti\"])" ] }, { @@ -871,7 +948,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.10.16" }, "toc-autonumbering": true }, diff --git a/notebooks/compare_spectra.ipynb b/notebooks/compare_spectra.ipynb index efd33d94..af1be6d7 100644 --- a/notebooks/compare_spectra.ipynb +++ b/notebooks/compare_spectra.ipynb @@ -12,18 +12,6 @@ "%config Completer.use_jedi = False" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "6084bd34-6e2c-49f4-bd2b-544906a3ee28", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np \n", - "import sys\n", - "import matplotlib.pyplot as plt" - ] - }, { "cell_type": "code", "execution_count": null, @@ -54,6 +42,7 @@ "spectrum_exciting = np.loadtxt('./spectra_files/anatase_exciting.txt')\n", "spectrum_ocean = np.loadtxt('./spectra_files/anatase_ocean.txt')\n", "spectrum_FEFF = np.loadtxt('./spectra_files/anatase_theory_FEFF.txt')\n", + "spectrum_fdmnes = np.loadtxt('./spectra_files/anatase_fdmnes.txt')\n", "spectrum_exp = np.loadtxt('./spectra_files/anatase_exp.txt')" ] }, @@ -128,7 +117,9 @@ "cell_type": "code", "execution_count": null, "id": "ae3e19a7-d3c3-4c98-8997-b3ccfedef9b7", - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "plt.plot(spectrum_exciting[:,0], spectrum_exciting[:,1]/max(spectrum_exciting[:,1]), label='exciting')\n", @@ -138,7 +129,7 @@ }, { "cell_type": "markdown", - "id": "e85c48a1-41ab-427e-a88b-bd24b09561e7", + "id": "ef56aa98-f84f-43ad-95ac-5653c05f7edd", "metadata": {}, "source": [ "#### exciting vs. experiment" @@ -147,7 +138,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e1dcc588-2b15-4923-9475-22d331575365", + "id": "33c3768a", "metadata": {}, "outputs": [], "source": [ @@ -160,7 +151,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8bc5897f-d2a2-4bac-856c-05eee2d293ae", + "id": "40087521", "metadata": {}, "outputs": [], "source": [ @@ -169,20 +160,45 @@ "plt.legend()" ] }, + { + "cell_type": "markdown", + "id": "e85c48a1-41ab-427e-a88b-bd24b09561e7", + "metadata": {}, + "source": [ + "#### fdmnes vs. experiment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e1dcc588-2b15-4923-9475-22d331575365", + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "pearson, spearman, coss_corr, shift = compare_utils.compare_between_spectra(spectrum_fdmnes, spectrum_exp, erange=35, accuracy=0.01)\n", + "print(\"Correlation coefficients: pearson=%f, spearman=%f, cossine=%f. Shift=%f\"%(pearson, spearman, coss_corr, shift))\n", + "print(\"log10(1-spearman)=%f\"%(np.log10(1-spearman)))" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "0f3623a0-0859-468d-9774-29aed59e375c", + "id": "8bc5897f-d2a2-4bac-856c-05eee2d293ae", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "plt.plot(spectrum_fdmnes[:,0], spectrum_fdmnes[:,1]/max(spectrum_fdmnes[:,1]), label='exciting')\n", + "plt.plot(spectrum_exp[:,0]+shift, spectrum_exp[:,1]/max(spectrum_exp[:,1]), label='experiment', marker='.', markersize=3)\n", + "plt.legend()" + ] } ], "metadata": { "kernelspec": { - "display_name": "kernel_chuntian", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "kernel_chuntian" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -194,7 +210,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.10.16" } }, "nbformat": 4, diff --git a/notebooks/spectra_files/anatase_fdmnes.txt b/notebooks/spectra_files/anatase_fdmnes.txt new file mode 100644 index 00000000..118e4dec --- /dev/null +++ b/notebooks/spectra_files/anatase_fdmnes.txt @@ -0,0 +1,326 @@ + 4961.00 1.0412044E-03 + 4961.20 1.0625348E-03 + 4961.40 1.0849655E-03 + 4961.60 1.1086073E-03 + 4961.80 1.1335880E-03 + 4962.00 1.1600569E-03 + 4962.20 1.1881890E-03 + 4962.40 1.2181916E-03 + 4962.60 1.2503125E-03 + 4962.80 1.2848509E-03 + 4963.00 1.3221730E-03 + 4963.20 1.3627327E-03 + 4963.40 1.4071024E-03 + 4963.60 1.4560185E-03 + 4963.80 1.5104513E-03 + 4964.00 1.5717173E-03 + 4964.20 1.6416686E-03 + 4964.40 1.7230240E-03 + 4964.60 1.8199532E-03 + 4964.80 1.9389882E-03 + 4965.00 2.0894571E-03 + 4965.20 2.2783804E-03 + 4965.40 2.4956165E-03 + 4965.60 2.7238909E-03 + 4965.80 2.9733650E-03 + 4966.00 3.2780144E-03 + 4966.20 3.6836041E-03 + 4966.40 4.2548089E-03 + 4966.60 5.0945892E-03 + 4966.80 6.3732891E-03 + 4967.00 8.3412887E-03 + 4967.20 1.1181360E-02 + 4967.40 1.4352762E-02 + 4967.60 1.5903533E-02 + 4967.80 1.4607207E-02 + 4968.00 1.2223704E-02 + 4968.20 1.0499598E-02 + 4968.40 9.7944426E-03 + 4968.60 9.9915305E-03 + 4968.80 1.0901286E-02 + 4969.00 1.2180992E-02 + 4969.20 1.3249397E-02 + 4969.40 1.3670643E-02 + 4969.60 1.3628756E-02 + 4969.80 1.3579446E-02 + 4970.00 1.3804911E-02 + 4970.20 1.4345497E-02 + 4970.40 1.5017250E-02 + 4970.60 1.5526954E-02 + 4970.80 1.5682853E-02 + 4971.00 1.5492004E-02 + 4971.20 1.5097734E-02 + 4971.40 1.4664437E-02 + 4971.60 1.4301637E-02 + 4971.80 1.4040068E-02 + 4972.00 1.3821195E-02 + 4972.20 1.3528586E-02 + 4972.40 1.3097684E-02 + 4972.60 1.2578279E-02 + 4972.80 1.2070056E-02 + 4973.00 1.1658604E-02 + 4973.20 1.1400677E-02 + 4973.40 1.1323515E-02 + 4973.60 1.1432247E-02 + 4973.80 1.1722750E-02 + 4974.00 1.2191443E-02 + 4974.20 1.2839561E-02 + 4974.40 1.3673646E-02 + 4974.60 1.4703782E-02 + 4974.80 1.5939943E-02 + 4975.00 1.7386185E-02 + 4975.20 1.9032661E-02 + 4975.40 2.0846876E-02 + 4975.60 2.2768173E-02 + 4975.80 2.4711433E-02 + 4976.00 2.6584197E-02 + 4976.20 2.8313912E-02 + 4976.40 2.9872909E-02 + 4976.60 3.1287042E-02 + 4976.80 3.2623525E-02 + 4977.00 3.3966885E-02 + 4977.20 3.5397284E-02 + 4977.40 3.6979297E-02 + 4977.60 3.8760192E-02 + 4977.80 4.0772927E-02 + 4978.00 4.3040126E-02 + 4978.20 4.5577339E-02 + 4978.40 4.8395205E-02 + 4978.60 5.1500646E-02 + 4978.80 5.4897277E-02 + 4979.00 5.8585215E-02 + 4979.20 6.2560335E-02 + 4979.40 6.6813006E-02 + 4979.60 7.1326248E-02 + 4979.80 7.6073307E-02 + 4980.00 8.1014638E-02 + 4980.20 8.6094494E-02 + 4980.40 9.1237595E-02 + 4980.60 9.6346897E-02 + 4980.80 1.0130404E-01 + 4981.00 1.0597443E-01 + 4981.20 1.1021847E-01 + 4981.40 1.1390864E-01 + 4981.60 1.1694951E-01 + 4981.80 1.1929487E-01 + 4982.00 1.2095594E-01 + 4982.20 1.2199720E-01 + 4982.40 1.2252111E-01 + 4982.60 1.2264727E-01 + 4982.80 1.2249256E-01 + 4983.00 1.2215718E-01 + 4983.20 1.2171796E-01 + 4983.40 1.2122810E-01 + 4983.60 1.2072099E-01 + 4983.80 1.2021557E-01 + 4984.00 1.1972163E-01 + 4984.20 1.1924405E-01 + 4984.40 1.1878557E-01 + 4984.60 1.1834820E-01 + 4984.80 1.1793378E-01 + 4985.00 1.1754381E-01 + 4985.20 1.1717918E-01 + 4985.40 1.1683980E-01 + 4985.60 1.1652440E-01 + 4985.80 1.1623049E-01 + 4986.00 1.1595446E-01 + 4986.20 1.1569176E-01 + 4986.40 1.1543721E-01 + 4986.60 1.1518528E-01 + 4986.80 1.1493044E-01 + 4987.00 1.1466743E-01 + 4987.20 1.1439153E-01 + 4987.40 1.1409881E-01 + 4987.60 1.1378626E-01 + 4987.80 1.1345191E-01 + 4988.00 1.1309487E-01 + 4988.20 1.1271528E-01 + 4988.40 1.1231431E-01 + 4988.60 1.1189399E-01 + 4988.80 1.1145718E-01 + 4989.00 1.1100736E-01 + 4989.20 1.1054854E-01 + 4989.40 1.1008509E-01 + 4989.60 1.0962158E-01 + 4989.80 1.0916264E-01 + 4990.00 1.0871279E-01 + 4990.20 1.0827636E-01 + 4990.40 1.0785732E-01 + 4990.60 1.0745920E-01 + 4990.80 1.0708506E-01 + 4991.00 1.0673737E-01 + 4991.20 1.0641810E-01 + 4991.40 1.0612860E-01 + 4991.60 1.0586974E-01 + 4991.80 1.0564184E-01 + 4992.00 1.0544482E-01 + 4992.20 1.0527816E-01 + 4992.40 1.0514101E-01 + 4992.60 1.0503225E-01 + 4992.80 1.0495051E-01 + 4993.00 1.0489422E-01 + 4993.20 1.0486168E-01 + 4993.40 1.0485106E-01 + 4993.60 1.0486042E-01 + 4993.80 1.0488775E-01 + 4994.00 1.0493096E-01 + 4994.20 1.0498785E-01 + 4994.40 1.0505617E-01 + 4994.60 1.0513356E-01 + 4994.80 1.0521753E-01 + 4995.00 1.0530550E-01 + 4995.20 1.0539477E-01 + 4995.40 1.0548249E-01 + 4995.60 1.0556569E-01 + 4995.80 1.0564128E-01 + 4996.00 1.0570607E-01 + 4996.20 1.0575676E-01 + 4996.40 1.0578998E-01 + 4996.60 1.0580237E-01 + 4996.80 1.0579053E-01 + 4997.00 1.0575114E-01 + 4997.20 1.0568096E-01 + 4997.40 1.0557692E-01 + 4997.60 1.0543615E-01 + 4997.80 1.0525602E-01 + 4998.00 1.0503423E-01 + 4998.20 1.0476882E-01 + 4998.40 1.0445824E-01 + 4998.60 1.0410136E-01 + 4998.80 1.0369754E-01 + 4999.00 1.0324660E-01 + 4999.20 1.0274886E-01 + 4999.40 1.0220516E-01 + 4999.60 1.0161680E-01 + 4999.80 1.0098557E-01 + 5000.00 1.0031370E-01 + 5000.20 9.9603833E-02 + 5000.40 9.8858973E-02 + 5000.60 9.8082449E-02 + 5000.80 9.7277849E-02 + 5001.00 9.6448968E-02 + 5001.20 9.5599747E-02 + 5001.40 9.4734207E-02 + 5001.60 9.3856394E-02 + 5001.80 9.2970315E-02 + 5002.00 9.2079889E-02 + 5002.20 9.1188891E-02 + 5002.40 9.0300912E-02 + 5002.60 8.9419322E-02 + 5002.80 8.8547235E-02 + 5003.00 8.7687493E-02 + 5003.20 8.6842647E-02 + 5003.40 8.6014952E-02 + 5003.60 8.5206362E-02 + 5003.80 8.4418540E-02 + 5004.00 8.3652864E-02 + 5004.20 8.2910444E-02 + 5004.40 8.2192139E-02 + 5004.60 8.1498578E-02 + 5004.80 8.0830180E-02 + 5005.00 8.0187180E-02 + 5005.20 7.9569651E-02 + 5005.40 7.8977524E-02 + 5005.60 7.8410615E-02 + 5005.80 7.7868641E-02 + 5006.00 7.7351238E-02 + 5006.20 7.6857983E-02 + 5006.40 7.6388404E-02 + 5006.60 7.5941996E-02 + 5006.80 7.5518230E-02 + 5007.00 7.5116562E-02 + 5007.20 7.4736439E-02 + 5007.40 7.4377307E-02 + 5007.60 7.4038614E-02 + 5007.80 7.3719808E-02 + 5008.00 7.3420345E-02 + 5008.20 7.3139683E-02 + 5008.40 7.2877287E-02 + 5008.60 7.2632626E-02 + 5008.80 7.2405171E-02 + 5009.00 7.2194396E-02 + 5009.20 7.1999778E-02 + 5009.40 7.1820794E-02 + 5009.60 7.1656925E-02 + 5009.80 7.1507652E-02 + 5010.00 7.1372463E-02 + 5010.20 7.1250848E-02 + 5010.40 7.1142304E-02 + 5010.60 7.1046341E-02 + 5010.80 7.0962475E-02 + 5011.00 7.0890240E-02 + 5011.20 7.0829185E-02 + 5011.40 7.0778878E-02 + 5011.60 7.0738907E-02 + 5011.80 7.0708885E-02 + 5012.00 7.0688446E-02 + 5012.20 7.0677252E-02 + 5012.40 7.0674991E-02 + 5012.60 7.0681377E-02 + 5012.80 7.0696153E-02 + 5013.00 7.0719086E-02 + 5013.20 7.0749971E-02 + 5013.40 7.0788630E-02 + 5013.60 7.0834907E-02 + 5013.80 7.0888671E-02 + 5014.00 7.0949810E-02 + 5014.20 7.1018233E-02 + 5014.40 7.1093866E-02 + 5014.60 7.1176648E-02 + 5014.80 7.1266532E-02 + 5015.00 7.1363478E-02 + 5015.20 7.1467449E-02 + 5015.40 7.1578414E-02 + 5015.60 7.1696337E-02 + 5015.80 7.1821178E-02 + 5016.00 7.1952886E-02 + 5016.20 7.2091402E-02 + 5016.40 7.2236647E-02 + 5016.60 7.2388527E-02 + 5016.80 7.2546926E-02 + 5017.00 7.2711708E-02 + 5017.20 7.2882710E-02 + 5017.40 7.3059746E-02 + 5017.60 7.3242606E-02 + 5017.80 7.3431054E-02 + 5018.00 7.3624832E-02 + 5018.20 7.3823660E-02 + 5018.40 7.4027237E-02 + 5018.60 7.4235244E-02 + 5018.80 7.4447349E-02 + 5019.00 7.4663207E-02 + 5019.20 7.4882463E-02 + 5019.40 7.5104759E-02 + 5019.60 7.5329732E-02 + 5019.80 7.5557023E-02 + 5020.00 7.5786273E-02 + 5020.20 7.6017132E-02 + 5020.40 7.6249255E-02 + 5020.60 7.6482310E-02 + 5020.80 7.6715975E-02 + 5021.00 7.6949941E-02 + 5021.20 7.7183913E-02 + 5021.40 7.7417606E-02 + 5021.60 7.7650751E-02 + 5021.80 7.7883093E-02 + 5022.00 7.8114385E-02 + 5022.20 7.8344395E-02 + 5022.40 7.8572899E-02 + 5022.60 7.8799684E-02 + 5022.80 7.9024545E-02 + 5023.00 7.9247284E-02 + 5023.20 7.9467712E-02 + 5023.40 7.9685644E-02 + 5023.60 7.9900903E-02 + 5023.80 8.0113316E-02 + 5024.00 8.0322719E-02 + 5024.20 8.0528951E-02 + 5024.40 8.0731860E-02 + 5024.60 8.0931300E-02 + 5024.80 8.1127136E-02 + 5025.00 8.1319238E-02 + 5025.20 8.1507488E-02 + 5025.40 8.1691781E-02 + 5025.60 8.1872020E-02 + 5025.80 8.2048123E-02 + 5026.00 8.2220020E-02