diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..f8c8a682 --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# Python +__pycache__/ +*.py[cod] +*.pyo + +# Build artifacts +build/ +dist/ +*.egg-info/ +.eggs/ + +# Caches & coverage +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ +.coverage +htmlcov/ + +# Logs +*.log +dpdispatcher.log +.workflow.log + +# Tools & editors +.vscode/ +.idea/ +.DS_Store +AGENTS.md + +# User-generated workflow files +reference +relaxation +eos_* +elastic_* +template +potential +all_result.json + +# dflow debug folders generated by examples or local runs +**/dflow_debug/ diff --git a/CHANGELOG-1.3.0.md b/CHANGELOG-1.3.0.md new file mode 100644 index 00000000..2e32c76b --- /dev/null +++ b/CHANGELOG-1.3.0.md @@ -0,0 +1,129 @@ +# APEX 1.3.0 Changelog + +## Highlights + +APEX 1.3.0 introduces new structure-generation workflows, new property workflows, improved automatic supercell construction, stronger failure-handling behavior, and a substantially reworked GUI submission/retrieval workflow. + +Major additions include: + +- Composition-aware automatic lattice constant estimation +- Automatic supercell generation from composition tolerance +- Sublattice-aware RSS generation for B2, L1_2, and L1_0 systems +- RSS workflow support and example documentation +- GammaSurface workflow support and example documentation +- Grüneisen parameters and thermal expansion workflow support and example documentation +- Finite-temperature lattice workflow improvements +- Finite-temperature elasticity workflow support and example documentation +- Annealing workflow support for LAMMPS +- Shape-controlled automatic supercell generation +- `req_calc`-based relaxation/property selection for joint workflows +- GUI-side batched submission for large configuration sets +- Multi-workflow progress tracking and retrieval in `apex gui` +- Bohrium account defaults managed by `apex account` +- Improved failed-step output retrieval, diagnostics, retry behavior, and early-break handling + +--- + +## Core Features + +### Automatic Structure Construction + +- Added automatic lattice constant estimation based on composition-weighted atomic radii. +- Added automatic supercell generation from composition tolerance. +- Added optional maximum atom budget for automatic supercell construction. +- Added shape-control modes for automatic supercell generation: + - `near_cubic` + - `xy_equal_z_free`, mainly for gamma-surface and slab-like workflows. +- Added support for sublattice-aware random solid solution generation for: + - B2 + - L1_2 + - L1_0 + +### RSS Workflow + +- Added RSS workflow support. +- Added RSS example documentation. +- Added support for prototype-aware and sublattice-aware RSS systems. +- Added parent-lattice helpers, automatic parent-lattice resolution, and Warren-Cowley SRO-driven sampling utilities. + +### GammaSurface Workflow + +- Added GammaSurface workflow support. +- Added GammaSurface example documentation. +- Added shape-control support for slab-like gamma-surface supercells. +- Added `apex preview` support for generating GIF previews of GammaSurface motion. + +### Grüneisen Parameters and Thermal Expansion Workflow + +- Added `gruneisen` workflow support based on phonon calculations at multiple symmetric volume strains. +- Added both `sign_only` and `full` output modes; `full` can fit Birch-Murnaghan EOS data to estimate thermal expansion. +- Extended LAMMPS/phonoLAMMPS and VASP paths for Grüneisen post-processing, and added dedicated tests and examples. + +### Finite-Temperature Lattice Workflow + +- Add finite-temperature lattice calculations with updated thermo output, temperature-aware reporting, pressure handling, and `c/a` post-processing. + +### Finite-Temperature Elasticity Workflow + +- Added finite-temperature elasticity workflow support. +- Added finite-temperature elasticity example documentation. +- Added finite-temperature elastic tensor fitting, stress post-processing, and derived elastic modulus output. + +### Annealing Workflow + +- Added LAMMPS annealing workflow support. +- Improved generated annealing input scripts for heating, cooling, RDF output, and holding stages. + +### Workflow Selection and Submission + +- Added `req_calc`-based workflow selection for relaxation and property calculations. +- Added support for skipping relaxation in joint workflows with `"relaxation": {"req_calc": false}` when property setup can use the structure-directory `POSCAR` directly. +- Added explicit disabling of individual properties with `"req_calc": false`. +- Added clearer submit-time path validation and workflow labeling support. +- Added skip-completed behavior for already successful relaxation and property tasks when rerun is not requested. + +### Failure Handling and Retrieval + +- Added automatic break behavior when the relaxation step fails in joint workflows. +- Added detailed failed-step diagnostics with last-step failure reasons, workflow IDs, and workflow UIDs. +- Added failed-output retrieval support using debug artifacts and main logs from the latest failed steps. +- Added archive-workflow retrieval support in `apex retrieve`, including UID-based fallback lookup when workflow-name lookup is insufficient. +- Added retry-aware artifact download behavior for transient failures while avoiding retries for permanent missing-artifact cases. +- Added per-task LAMMPS status records and debug artifacts, including: + - `apex_task_status.json` + - `.debug.log` + - `.debug.stdout` + - `.debug.stderr` + +### Reporting + +- Added richer report support for new and updated workflows, including finite-temperature lattice, finite-temperature elasticity, GammaSurface, and annealing outputs. +- Added static-report support for finite-temperature lattice tables/plots and annealing artifact summaries. +- Added report CLI controls for browser launch, host, and port. +- Improved Dash report startup behavior and reduced duplicate report-page launches. + +--- + +## User Experience + +- Added `apex gui`, a web-based interface for common APEX operations. +- Added GUI-side batched submission for large configuration sets. +- Added aggregated multi-workflow progress tracking and retrieval in `apex gui`. +- Added GUI support for structure upload, POSCAR-driven interaction auto-detection, VASP/ABACUS interaction-table editing, and profile-specific default templates. +- Added GUI-side account management and report/retrieve orchestration. +- Added `apex account` for saving Bohrium identity and cloud defaults for easier repeated submission. +- Added automatic Bohrium default injection while preserving user-provided config overrides. +- Added `apex preview` for visualizing GammaSurface movement before submission. +- Added automatic interaction-type detection from POSCAR content. +- Improved failed-step messages by printing the reason from the latest failed step. +- Added default configuration templates for LAMMPS, VASP, ABACUS, and GUI submit groups. + +--- + +## Compatibility and Documentation + +- Updated README coverage for RSS, GUI usage, Bohrium account defaults, Gamma line/surface, `req_calc`, and finite-temperature elasticity. +- Added runnable examples for RSS, GammaSurface, and finite-temperature elasticity. +- Added GUI developer documentation. +- Added `monty` to the package dependencies and constrained supported Python versions to `<3.13`. +- Added support for Phonopy v4 in terms of phonon calculation. \ No newline at end of file diff --git a/README.md b/README.md index b3780cbb..3dcdb5d4 100644 --- a/README.md +++ b/README.md @@ -3,72 +3,17 @@ # APEX: Alloy Property EXplorer -[![](https://img.shields.io/badge/release-1.2.0-blue.svg)](https://github.com/deepmodeling/APEX) +[![](https://img.shields.io/badge/release-1.2.1-blue.svg)](https://github.com/deepmodeling/APEX) -[APEX](https://github.com/deepmodeling/APEX): Alloy Property EXplorer is a component of the [AI Square](https://aissquare.com/) project that involves the restructuring of the [DP-GEN](https://github.com/deepmodeling/dpgen) `auto_test` module to develop a versatile and extensible Python package for general alloy property calculations. This package enables users to conveniently establish a wide range of cloud-native property-test workflows by utilizing various computational approaches, including LAMMPS, VASP, ABACUS, and others. +[1.3.0 Changelog](./CHANGELOG-1.3.0.md) -![gif](./docs/images/apex_demo_high_0001.gif) +[APEX](https://github.com/deepmodeling/APEX) helps materials scientists build reliable alloy property workflows that run on local machines, on-premises clusters, or the Bohrium cloud. It refactors the [DP-GEN](https://github.com/deepmodeling/dpgen) `auto_test` module into a flexible, dflow-powered Python package that prepares tasks, dispatches calculations, monitors progress, and collects results for calculators such as **LAMMPS**, **VASP**, and **ABACUS**. -## v1.2 Main Features Update -* Add a `retrieve` sub-command to allow results to be retrieved independently and manually for multiple properties (Remove `Distributor` and `Collector` OP) -* Support common **dflow operations** with terminal commands -* Incorporate results `archive` function to both local paths and NoSQL database ([MongoDB](https://www.mongodb.com/) and [DynamoDB](https://aws.amazon.com/cn/dynamodb/)) -* Add a `report` sub-command for quick results visualization and cross-comparison via a front-end APP based on [Dash](https://dash.plotly.com) -* Support [SeeK-path](https://seekpath.readthedocs.io/en/latest/index.html) for automatic band path search in `phonon` calculations -* Support eight conventional HCP interstitial configurations for `interstitial` calculations -* Add four additional **ML** pair styles (`snap`, `gap`, `rann` and `mace`) and an extra `meam-spline` in LAMMPS interation type support -* Modify the single-step run command from `test` to `do` for improved clarity and consistencey -## APEX Bohrium App -[![](https://img.shields.io/badge/APP-BohriumApp-orange.svg)](https://bohrium.dp.tech/apps/apex) +
+ Fig1 -APEX also provides a web-based [Bohrium App](https://bohrium.dp.tech/apps/apex) for rapid and easy alloy property calculations without intensive JSON configuration (Note: one will need a Bohrium account to access this service). - -## How to cite APEX -[![](https://img.shields.io/badge/DOI-10.1038/s41524_025_01580_y-red.svg)](https://doi.org/10.1038/s41524-025-01580-y) - -If you use APEX in your research, please cite the following paper for general purpose: - -> Li, Z., Wen, T., Zhang, Y. et al. APEX: an automated cloud-native material property explorer. npj Comput Mater 11, 88 (2025). https://doi.org/10.1038/s41524-025-01580-y - -## Table of Contents - -- [APEX: Alloy Property EXplorer](#apex-alloy-property-explorer) - - [v1.2 Main Features Update](#v12-main-features-update) - - [APEX Bohrium App](#apex-bohrium-app) - - [How to cite APEX](#how-to-cite-apex) - - [Table of Contents](#table-of-contents) - - [1. Overview](#1-overview) - - [2. Quick Start](#2-quick-start) - - [2.1. Install APEX](#21-install-apex) - - [2.2. Install Local Argo (Optional)](#22-install-local-argo-optional) - - [2.3. Submission Examples](#23-submission-examples) - - [2.3.1. Submit to Local Argo Service](#231-submit-to-local-argo-service) - - [2.3.2. Submit Without Argo Service](#232-submit-without-argo-service) - - [2.3.3. Submit to the Bohrium](#233-submit-to-the-bohrium) - - [3. Documents \& User Guide](#3-documents--user-guide) - - [3.1. Before Submission](#31-before-submission) - - [3.1.1. Global Setting](#311-global-setting) - - [3.1.2. Calculation Parameters](#312-calculation-parameters) - - [3.1.2.1. EOS](#3121-eos) - - [3.1.2.2. Elastic](#3122-elastic) - - [3.1.2.3. Surface](#3123-surface) - - [3.1.2.4. Vacancy](#3124-vacancy) - - [3.1.2.5. Interstitial](#3125-interstitial) - - [3.1.2.6. Gamma Line](#3126-gamma-line) - - [3.1.2.7. Phonon Spectra](#3127-phonon-spectra) - - [3.2. Submission](#32-submission) - - [3.2.1. Workflow Submission](#321-workflow-submission) - - [3.2.2. Workflow Inquiry \& Operations](#322-workflow-inquiry--operations) - - [3.2.3. Run Individual Step](#323-run-individual-step) - - [3.3. After Submission](#33-after-submission) - - [3.3.1. Retrieve Results Manually](#331-retrieve-results-manually) - - [3.3.2. Archive Test Results](#332-archive-test-results) - - [3.3.3. Results Visualization Report](#333-results-visualization-report) - -## 1. Overview - -APEX adopts the functionality of the second-generation `auto_test` for alloy properties calculations and is developed utilizing the [dflow](https://github.com/deepmodeling/dflow) framework. By integrating the benefits of cloud-native workflows, APEX streamlines the intricate procedure of automatically testing various configurations and properties. Owing to its cloud-native characteristic, APEX provides users with a more intuitive and user-friendly interaction, enhancing the overall user experience by eliminating concerns related to process control, task scheduling, observability, and disaster tolerance. +
The comprehensive architecture of APEX is demonstrated below: @@ -77,610 +22,911 @@ The comprehensive architecture of APEX is demonstrated below:

Figure 1. Schematic diagram of APEX

-APEX consists of three types of pre-defined **workflow** that users can submit: `relaxation`, `property`, and `joint`. The `relaxation` and `property` sub-workflow comprise three sequential **steps**: `Make`, `Run`, and `Post`, while the `joint` workflow essentially combines the `relaxation` and `property` workflows into a comprehensive workflow. - -The `relaxation` process begins with the initial `POSCAR` supplied by the user, which is used to generate critical data such as the final relaxed structure and its corresponding energy, forces, and virial tensor. This equilibrium state information is essential for input into the `property` workflow, enabling further calculations of alloy properties. Upon completion, the final results are automatically retrieved and downloaded to the original working directory. - -In both the `relaxation` and `property` workflows, the `Make` step prepares the corresponding computational tasks. These tasks are then transferred to the `Run` step that is responsible for task dispatch, calculation monitoring, and retrieval of completed tasks (implemented through the [DPDispatcher](https://github.com/deepmodeling/dpdispatcher/tree/master) plugin). Upon completion of all tasks, the `Post` step is initiated to collect data and obtain the desired property results. APEX currently offers calculation methods for the following alloy properties: * Equation of State (EOS) -* Elastic constants +* Cohesive energy vs. lattice scaling (cohesive energy line) * Surface energy -* Interstitial formation energy +* Decohesive energy vs. separation (decohesive energy line) +* Elastic constants * Vacancy formation energy -* Generalized stacking fault energy (Gamma line) +* Interstitial formation energy +* Generalized stacking fault energy (Gamma line/Gamma Surface) * Phonon spectra +* Grüneisen parameters and thermal expansion +* Finite-temperature lattice parameters (FiniteTlatt) +* Finite-temperature Elastic Constant (FiniteTelastic) + +## What's Inside +- [1. Installation](#1installation) + - [1.1 Install APEX](#11-install-apex) +- [2. Quick Start](#2-quick-start) + - [2.1 Work Directory Structure](#21-work-directory-structure) + - [2.2 Calculation Parameter Files](#22-calculation-parameter-files) + - [2.3 Global Configuration Files](#23-global-configuration-files) + - [2.4 Submit Your First Workflow](#24-submit-your-first-workflow) + - [2.5 Check Your Results](#25-check-your-results) +- [3. User Menu](#3-user-menu) + - [3.1 Execution Backends](#31-execution-backends) + - [3.2 Prepare Your Input Files](#32-prepare-your-input-files) + - [3.3 Calculation Parameter File Types](#33-calculation-parameter-file-types) + - [3.4 Submit and Monitor Workflows](#34-submit-and-monitor-workflows) + - [3.5 Run Individual Steps](#35-run-individual-steps) + - [3.6 After Submission](#36-after-submission) + - [3.7 Graphical Interface (GUI)](#37-graphical-interface-gui) + - [3.8 Bohrium Account Defaults](#38-bohrium-account-defaults) +- [4. Detailed Parameter Reference](#4-detailed-parameter-reference) + - [4.1 Global Configuration](#41-global-configuration-globaljson) + - [4.2 Calculation Parameters](#42-calculation-parameters-paramjson) + - [4.3 EOS](#43-eos) + - [4.4 Cohesive Energy Line](#44-cohesive-energy-line) + - [4.5 Decohesive Energy Line](#45-decohesive-energy-line) + - [4.6 Elastic](#46-elastic) + - [4.7 Surface](#47-surface) + - [4.8 Vacancy](#48-vacancy) + - [4.9 Interstitial](#49-interstitial) + - [4.10 Gamma Line/Surface](#410-gamma-line-generalized-stacking-fault) + - [4.11 Phonon Spectra](#411-phonon-spectra) + - [4.12 Grüneisen Parameters and Thermal Expansion](#412-grüneisen-parameters-and-thermal-expansion) + - [4.13 Finite-Temperature Lattice Parameters](#413-finite-temperature-lattice-parameters) + - [4.14 Finite-Temperature Elastic constant](#413-finite-temperature-elastic-constant) +- [More Resources](#more-resources) + +## 1.Installation +### 1.1. Install APEX + +There are two ways to install APEX: + +#### Option 1: Install from PyPI (recommended for most users) + + ```shell + pip install apex-flow + ``` +#### Option 2: Install from Source (latest features / development) + + ```shell + git clone https://github.com/deepmodeling/APEX.git + cd APEX + pip install . + ``` -Moreover, APEX supports three types of calculators: **LAMMPS** for molecular dynamics simulations, and **VASP** and **ABACUS** for first-principles calculations. + +--- ## 2. Quick Start -### 2.1. Install APEX -The latest version of APEX can be easily installed via `pypi` with following command: + +To submit an APEX workflow, you need to organize three essential components in your working directory: + +1. **A work directory** with initial structures and computational files +2. **Calculation parameter files** specifying what to compute +3. **Global configuration files** specifying where and how to compute + +We present a quick example using a [LAMMPS_example](./examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo) to compute the Equation of State (EOS) and elastic constants of molybdenum (Mo) metal in both Body-Centered Cubic (BCC) phase. + +### 2.1. Work Directory Structure + +Create your working directory with the following structure: + +``` +lammps_demo/ +├── confs/ +│ ├── std-bcc/ +│ └── POSCAR +├── frozen_model.pb +├── global_bohrium.json +└── param_joint.json +``` + +**Directory Organization:** + +- **`confs/` subdirectory**: Contains initial crystal structures in POSCAR format for different phases (BCC, FCC). These are the starting geometries for your calculations. To compute the properties of Mo in BCC/FCC phases, you can download the corresponding POSCAR files from [Materials Project](https://next-gen.materialsproject.org/materials/mp-129?formula=Mo). + +- **`frozen_model.pb`**: The machine learning potential model file (or other force field files). This is the pre-trained model used to perform the calculations. + +- **`param_*.json` files**: Specify the computational requirements: + - `param_joint.json` - Parameters for structure relaxation and property calculations + + +- **`global_bohrium.json`**: Provides computing resource information for Bohrium cloud platform execution. + +### 2.1.1 Random Solid Solution (RSS) Generation + +APEX provides a pseudo Monte Carlo sampler to generate random solid solutions +with user-defined Warren-Cowley short-range order (SRO) targets. + +Run RSS generation with: + +```bash +apex rss rss.json +``` + +#### Required input structure definition + +In `rss.json`, provide one of the following: + +- `parent_structure`: path to an existing structure file (typically POSCAR) +- `parent_lattice`: programmatic parent lattice definition + +Example `parent_lattice`: + +```json +{ + "parent_lattice": { + "type": "B2", + "a": "auto", + "supercell": "auto" + }, + "composition_tolerance": 0.001, + "supercell_shape": "near_cubic", + "maxmium_nums_atoms": 128 +} +``` + +Current supported `parent_lattice.type`: +`fcc`, `bcc`, `sc`, `hcp`, `diamond`, `B2`, `L12`, `L10`. + +#### Key RSS parameters + +- `supercell` (`array[int, int, int]`): expands the loaded/built parent structure. + If you also set `parent_lattice.supercell`, both expansions are applied. +- `output_structure` (`string`): output root directory for generated + configurations. Default is `RSS`. Each generated structure is written to a + separate `conf_###/POSCAR` directory, such as `conf_001/POSCAR`. +- `compositions` (`object`): species fractions per sublattice. + Fractions within each sublattice must sum to `1.0`. + +Commonly used controls: + +- `sro_targets`, `shell_cutoffs`, `shell_weights` +- `max_steps`, `temperature`, `tol`, `patience` +- `num_configs`, `interval`, `seed`, `metadata`, `show_progress` + +For a complete key-by-key reference and runnable examples, see +`examples/rss/README.md`. + + +### 2.2. Calculation Parameter Files + +Calculation parameter files define what properties to compute and with what parameters. + +#### Joint Parameter File + +This file contains parameters for geometry optimization, structure relaxation and property calculations: + +**Important:** The Json format does not support adding annotations. The annotations provided below are for reference only. +```json +{ + "structures": ["confs/std-*"], # Input structure paths + "interaction": { + "type": "deepmd", # Interaction type + "model": "frozen_model.pb", # Model file path + "type_map": {"Mo": 0} # Element type mapping + }, + "relaxation": { + "cal_setting": { + "etol": 0, # Energy tolerance + "ftol": 1e-10, # Force tolerance + "maxiter": 5000, # Maximum iterations + "maximal": 500000 # Maximum evaluation steps + } + }, + "properties": [ + { + "type": "eos", # Property type: Equation of State + "vol_start": 0.6, # Starting volume (relative) + "vol_end": 1.4, # End volume (relative) + "vol_step": 0.1, # Volume step + }, + { + "type": "elastic", # Property type: Elastic constants + } + ] +} +``` + +### 2.3. Global Configuration Files + +Global configuration files specify where and how your workflows should be executed. + +#### Configuration for Bohrium Cloud Platform + +Create `global_bohrium.json` to submit workflows to the Bohrium cloud platform: + +```json +{ + "lammps_image_name": "registry.dp.tech/dptech/prod-11045/deepmdkit-phonolammps:2.1.1", + "lammps_run_command":"lmp -in in.lammps", + "scass_type":"c8_m31_1 * NVIDIA T4" +} +``` + +APEX now injects Bohrium defaults automatically (`dflow_host`, `k8s_api_server`, `batch_type`, `context_type`, `apex_image_name`). + +Save your Bohrium account once in `~/.apex/account.json`: + ```shell -pip install apex-flow +apex account ``` -The second approach is to intall from the source code. Firstly clone the code from repository: + +Or set it directly: + ```shell -git clone https://github.com/deepmodeling/APEX.git +apex account --email YOUR_EMAIL --password YOUR_PASSWD --program-id 1234 ``` -then install APEX by: + +When running `apex submit -c global_bohrium.json`, values in your json file still have highest priority and override the saved defaults. + +### 2.4. Submit Your First Workflow + +Once you have prepared all necessary files and configuration, submit your workflow using the Bohrium platform (as shown in the Quick Start example): + ```shell -cd APEX -pip install . +apex submit param_joint.json -c global_bohrium.json ``` -### 2.2. Install Local Argo (Optional) -APEX workflow can be boosted and better orgnized by the [Argo](https://argoproj.github.io/workflows/) workflow engine, which provides intuitive process monitoring UI and multiple user-friendly workflow management functions. +Monitor the workflow progress at https://workflows.deepmodeling.com. + +### 2.5. Check Your Results +After the job is finished, you can check your results by: -To enable this feature on your local computer, you can setup the dflow service by executing [installation scripts](./docs/scripts/) prepared based on Unix-like system. For instance, to install on a Linux system without root access: ```shell -bash install-linux-cn.sh +apex report ``` -This process will automatically configure the required local tools, including Docker, Minikube, and Argo service, with the default port set to `127.0.0.1:2746`. To setup the service on Windows, please refer to the [dflow setup manual](https://github.com/deepmodeling/dflow/tree/master/tutorials) for more details. +**For other submission examples, please refer to [Lammps_tutorial](./examples/lammps/apex_lammps_tutorial.md).** + + + +## 3. User menu +### 3.1. Execution Backends -### 2.3. Submission Examples -We present several case studies as introductory illustrations of APEX, tailored to distinct user scenarios. For our demonstration, we will utilize a [LAMMPS_example](./examples/lammps_demo) to compute the Equation of State (EOS) and elastic constants of molybdenum in both Body-Centered Cubic (BCC) and Face-Centered Cubic (FCC) phases. To begin, we will examine the files prepared within the working directory for this specific case. +APEX builds on [dflow](https://github.com/deepmodeling/dflow) to orchestrate cloud-native workflows. Choose the backend that matches your infrastructure: + +- **Local debug (`apex submit -d`)**: Run everything on your workstation without Docker or Argo. Good for quick validation and debugging scripts. +- **Local Argo on Minikube**: Use `docs/scripts/install-linux-cn.sh` (Unix-like) to bootstrap Docker, Minikube, and Argo with the UI on `127.0.0.1:2746`. See the [dflow tutorials](https://github.com/deepmodeling/dflow/tree/master/tutorials) for Windows setup. +- **Remote HPC via DPDispatcher**: Define SSH credentials, scheduler options, and resource requirements inside your global config. APEX hands off the `run` step to DPDispatcher to submit jobs to Slurm or other supported schedulers. +- **Bohrium cloud**: Leverage the managed Argo service and curated container images on [Bohrium](https://bohrium.dp.tech). You only need valid account credentials and program ID. + +### 3.2 Prepare Your Input Files + +Every submission needs three pieces: + +- **Global configuration (`global*.json`)**: dflow, container, and dispatcher settings. +- **Calculation parameters (`param*.json`)**: structures, calculator inputs, and target properties. +- **Work directory**: structure files, potential files, and any resources referenced by the parameter JSON (paths are relative to this directory). + +Example layout (`examples/lammps_demo`): ``` lammps_demo ├── confs -│   ├── std-bcc -│   │   └── POSCAR -│   └── std-fcc -│   └── POSCAR +│ ├── std-bcc +│ │ └── POSCAR +│ └── std-fcc +│ └── POSCAR ├── frozen_model.pb ├── global_bohrium.json ├── global_hpc.json +├── machine_hpc.json ├── param_joint.json ├── param_props.json └── param_relax.json ``` -There are three types of parameter files and two types of global config files, as well as a Deep Potential file of molybdenum `frozen_model.pb`. Under the directory of `confs`, structure file `POSCAR` of both phases have been prepared respectively. -#### 2.3.1. Submit to Local Argo Service -Before this subsection, make sure you have setup a local Argo service environment. If not, please follow the instruction in [2.2. Install Local Argo (Optional)](#22-install-local-argo-optional) to do so. +### 3.3 Calculation parameter file types -To submit workflow to local Argo service, with the default port set to `127.0.0.1:2746`. Consequently, one can modify the `global_hpc.json` file to submit a workflow. Here is an example to submit job to local LAMMPS env: -```json -{ - "apex_image_name":"zhuoyli/apex_amd64", - "run_image_name": "zhuoyli/apex_amd64", - "run_command":"lmp -in in.lammps", - "batch_type": "Shell", - "context_type": "Local", - "local_root" : "./", - "remote_root": "/some/path/not/under/pwd/" -} -``` -Another example to submit job to a remote HPC. In this example, we attempt to distribute tasks to a remote node managed by [Slurm](https://slurm.schedmd.com). Users can replace the relevant parameters within the `machine` dictionary or specify `resources` and `tasks` according to [DPDispatcher](https://docs.deepmodeling.com/projects/dpdispatcher/en/latest/index.html) rules. Here is an example `global_hpc.json` file: -```json -{ - "apex_image_name":"zhuoyli/apex_amd64", - "run_image_name": "zhuoyli/apex_amd64", - "run_command":"lmp -in in.lammps", - "context_type": "SSHContext", - "mechine":{ - "batch_type": "Slurm", - "context_type": "SSHContext", - "local_root" : "./", - "remote_root": "/your/remote/tasks/path", - "clean_asynchronously": true, - "remote_profile": { - "hostname": "123.12.12.12", - "username": "USERNAME", - "password": "PASSWD", - "port": 22, - "timeout": 10 - } - }, - "resources":{ - "number_node": 1, - "cpu_per_node": 4, - "gpu_per_node": 0, - "queue_name": "apex_test", - "group_size": 1, - "module_list": ["deepmd-kit/2.1.0/cpu_binary_release"], - "custom_flags": [ - "#SBATCH --partition=xlong", - "#SBATCH --ntasks=4", - "#SBATCH --mem=10G", - "#SBATCH --nodes=1", - "#SBATCH --time=1-00:00:00" - ] - } -} -``` +| Type | File format | Required dictionaries | Typical use | +|------|-------------|-----------------------|-------------| +| Relaxation (`param_relax.json`) | JSON | `structures`, `interaction`, `relaxation` | Prepare equilibrium structures | +| Property (`param_props.json`) | JSON | `structures`, `interaction`, `properties` | Evaluate selected properties | +| Joint (`param_joint.json`) | JSON | `structures`, `interaction`, `relaxation`, `properties` | Run relaxation followed by properties | -Then, one can submit a relaxation workflow via: -```shell -apex submit param_relax.json -c global_hpc.json -``` +Paths in these files should be relative to the work directory. The examples above cover standard Deep Potential workflows; see `docs/Hands_on_auto-test.pdf` for a complete walk-through. + +### 3.4 Submit and Monitor Workflows + +APEX chooses the workflow type from the parameter files you provide: -Upon submission of the workflow, progress can be monitored at local https://127.0.0.1:2746. If the argo is setup on system without monitor UI, you may try to port forward the `127.0.0.1:2746` to another PC by running following command on that PC: ```shell -ssh -nNT -L 127.0.0.1:2746:127.0.0.1:2746 USERNAME@123.12.12.12 +apex submit [-h] [-c CONFIG] [-w WORK [WORK ...]] [-d] [-s] [-f {relax,props,joint}] parameter [parameter ...] ``` -Then, you can monitor the UI through https://127.0.0.1:2746 -#### 2.3.2. Submit Without Argo Service -If your local computer experiences difficulties connecting to the internet or installing cloud-native infrastructures like Docker and Argo, APEX offers a **workflow local debug mode** that allows the flow to operate in a basic `Python3` environment, independent of the Docker container. Users will **not** be able to monitor the workflow through the workflow UI. However, the workflows are still running automatically. +- `parameter`: one or more calculation JSON files (joint workflows accept both relax and property files). +- `-c`: path to the global config (`./global.json` by default). +- `-w`: override work directories (defaults to current directory). +- `-d`: run in local debug mode (no containers). +- `-s`: submit only, skip auto result retrieval. +- `-f`: force workflow type when inferring from parameters is not desired. + +Common management commands: + +| Command | Purpose | +|---------|---------| +| `apex list` | List workflows visible to the configured dflow service. | +| `apex get -i ` | Inspect workflow metadata. | +| `apex getsteps -i ` | Inspect step-by-step status. | +| `apex getkeys -i ` | List step keys. | +| `apex delete -i ` | Remove a workflow. | +| `apex resubmit -i ` | Resubmit a workflow with the same settings. | +| `apex retry -i ` | Retry failed steps. | +| `apex resume -i ` | Resume a suspended workflow. | +| `apex stop -i ` / `apex suspend -i ` / `apex terminate -i ` | Control workflow execution. | + +### 3.5 Run Individual Steps -To enable this function, users can add an additional optional argument `-d` to the origin submission command, as demonstrated below: +For fine-grained debugging you can execute single steps locally via `apex do`: + +1. Generate tasks: + ```shell + apex do param_relax.json make_relax + ``` +2. Dispatch tasks (specify machine settings in a separate JSON if needed): + ```shell + apex do param_relax.json run_relax -c machine_hpc.json + ``` +3. Post-process results: + ```shell + apex do param_relax.json post_relax + ``` + +The same pattern applies to property calculations (`make_props`, `run_props`, `post_props`). + +### 3.6 After Submission + +- **Manual retrieval** + ```shell + apex retrieve [-h] [-i ID] [-w WORK] [-c CONFIG] + ``` + Useful when automatic retrieval is disabled (`-s`) or fails. + +- **Archive results** + ```shell + apex archive [parameters ...] + ``` + Sync the latest property data into `all_result.json`, or push to MongoDB / DynamoDB by setting `database_type` in your global config. Use `apex archive -h` for details. + +- **Interactive reports** + ```shell + apex report -w WORKDIR [WORKDIR ...] + ``` + Launch a Dash app (http://127.0.0.1:8050/) to explore multiple result sets side-by-side. + +### 3.7 Graphical Interface (GUI) + +APEX also provides a web GUI for common CLI operations (submit, list/get/retry/resume, retrieve, etc.): ```shell -apex submit -d param_relax.json -c global_hpc.json +apex gui [-H HOST] [-p PORT] [--no-browser] ``` -In this approach, uses are not required to specify an image for executing APEX. Rather, APEX should be pre-installed in the default `Python3` environment to ensure proper functioning. +- Default URL: `http://127.0.0.1:8060/` +- The GUI has four tabs: + - **Submit**: simplified generator for `param.json` + `global.json`, then launch background submit + (internally driven by the GUI wrapper rather than a single raw `nohup apex submit ...` command) + (supports fixed element slots plus an extra-element input for larger `interaction.type_map`) + (the generated `param.json` is merged from profile-specific `param_structure.json` + `param_relax.json` + `param_props.json`, + and property checkboxes follow the selected profile) + (now also merges profile `param_interaction/param_interaction.json`; for VASP/ABACUS you can edit interaction rows in table form, + and default `INCAR`/`INPUT` files are auto-created from template when needed) + (interaction table now supports dynamic add/remove rows; ABACUS uses a third `orb_file` column) + (VASP/ABACUS also provide an `INCAR`/`INPUT` text editor in GUI; its content is written to the target file on submit) + (when dflow can run at most 100 calculations per workflow, the GUI now auto-counts matched confs, splits them into batches of at most 100 confs, + submits those workflows in parallel, and stores batch metadata in `.apex-submit-group.json`) + (the `Workflow ID(s)` field accepts multiple workflow ids separated by commas; the GUI can aggregate progress across the whole batch) + (you can also prefill multiple workflow ids manually by following the example template `apex/default_config/gui_submit_group.template.json`) + - **Manage**: tail and refresh `apex.log` for background submit status + - **Advanced**: run custom command tails (except `gui`/`report`, which are blocked to avoid nested Dash servers) + - **Account**: overwrite Bohrium account fields (`email`/`program_id`/`password`) backed by `apex account` storage; + password is never displayed in GUI (only "set/unset" status) + +For manually tracking an existing workflow group in the GUI, fill the `Workflow ID(s)` field with comma-separated ids, for example: + +```text +wf-aaaa1111, wf-bbbb2222, wf-cccc3333 +``` -#### 2.3.3. Submit to the Bohrium -The most efficient method for submitting an APEX workflow is through the pre-built execution environment of Argo on the [Bohrium cloud platform](https://bohrium.dp.tech). This is especially convenient and robust for massive task-intensive workflows running concurrently. It is necessary to create a **Bohrium account** before running. Below is an example of a global.json file for this approach. +The progress bar and the step/conf statistics panel will aggregate all listed workflows together. A reusable example payload is provided at [apex/default_config/gui_submit_group.template.json](/Users/yinziqi/Documents/Codex-Space/APEX/apex/default_config/gui_submit_group.template.json). -```json -{ - "dflow_host": "https://workflows.deepmodeling.com", - "k8s_api_server": "https://workflows.deepmodeling.com", - "batch_type": "Bohrium", - "context_type": "Bohrium", - "email": "YOUR_EMAIL", - "password": "YOUR_PASSWD", - "program_id": 1234, - "apex_image_name":"registry.dp.tech/dptech/prod-11045/apex-dependency:1.2.0", - "lammps_image_name": "registry.dp.tech/dptech/prod-11045/deepmdkit-phonolammps:2.1.1", - "lammps_run_command":"lmp -in in.lammps", - "scass_type":"c8_m31_1 * NVIDIA T4" -} +### 3.8 Bohrium Account Defaults + +Use `apex account` to store Bohrium credentials globally (default path: `~/.apex/account.json`): + +```shell +# interactive mode +apex account + +# non-interactive mode +apex account --email YOUR_EMAIL --password YOUR_PASSWD --program-id 1234 ``` -Then, one can submit a relaxation workflow via: + +Useful commands: + ```shell -apex submit param_relax.json -c global_bohrium.json +apex account --show +apex account --reset ``` -Remember to replace `email`, `password` and `program_id` of your own before submission. As for image, you can either build your own or use public images from Bohrium or pulling from the Docker Hub. Once the workflow is submitted, one can monitor it at https://workflows.deepmodeling.com. - -You may also checkout our online [hand-on Bohrium notebook tutorial](https://bohrium.dp.tech/notebooks/15413) for submisson to Bohrium. - -## 3. Documents & User Guide - -### 3.1. Before Submission -In APEX, there are **three essential components** required before submitting a workflow: -* **A global JSON file** containing parameters for configuring `dflow` and other global settings (default: "./global.json") -* **A calculation JSON file** containing parameters associated with calculations (relaxation and property test) -* **A work directory** consists of necessary files specified in the above JSON files, along with initial structures (default: "./") - - -#### 3.1.1. Global Setting -The instructions regarding global configuration, [dflow](https://github.com/deepmodeling/dflow), and [DPDispatcher](https://github.com/deepmodeling/dpdispatcher/tree/master) specific settings must be stored in a JSON format file. The table below describes some crucial keywords, classified into three categories: - -* **Basic config** - | Key words | Data structure | Default | Description | - | :------------ | ----- | ----- | ------------------- | - | apex_image_name | String | zhuoy/apex_amd64 | Image for step other than `run`. One can build this Docker image via prepared [Dockerfile](./docs/Dockerfile) | - | run_image_name | String | None | Image of calculator for `run` step. Use `{calculator}_image_name` to indicate corresponding image for higher priority | - | run_command | String | None | Shell command for `run` step. Use `{calculator}_run_command` to indicate corresponding command for higher priority | - | group_size | Int | 1 | Number of tasks per parallel run group | - | pool_size | Int | 1 | For multi tasks per parallel group, the pool size of multiprocessing pool to handle each task (1 for serial, -1 for infinity) | - | upload_python_package | Optional[List] | None | Additional python packages required in the container | - | debug_pool_workers | Int | 1 | Pool size of parallel tasks running in the debug mode | - | flow_name | String | None | Specify name of workflow to be submitted (default: work path name) | - | submit_only | Bool | False | Submit workflow only without automatic result retrieving | - -* **Dflow config** - | Key words | Data structure | Default | Description | - | :------------ | ----- | ----- | ------------------- | - | dflow_host | String | https://127.0.0.1:2746 | Url of dflow server | - | k8s_api_server | String | https://127.0.0.1:2746 | Url of kubernetes API server | - | dflow_config | Optional[Dict] | None | Specify more detailed dflow config in a nested dictionary with higher priority (See [dflow document](https://deepmodeling.com/dflow/dflow.html) for more detail) | - | dflow_s3_config | Optional[Dict] | None | Specify dflow s3 repository config in a nested dictionary with higher priority (See [dflow document](https://deepmodeling.com/dflow/dflow.html) for more detail) | - -* **Dispatcher config** (One may refer to [DPDispatcher’s documentation](https://docs.deepmodeling.com/projects/dpdispatcher/en/latest/index.html) for details of the following parameters) - | Key words | Data structure | Default | Description | - | :------------ | ----- | ----- | ------------------- | - | context_type | String | None | Context type to connect to the remote server | - | batch_type | String | None | System to dispatch tasks | - | local_root | String | "./" | Local root path | - | remote_root | String | None | Remote root path | - | remote_host | String | None | Remote root path | - | remote_username | String | None | Remote user name | - | remote_password | String | None | Remote user password | - | port | Int | 22 | Remote port | - | machine | Optional[Dict] | None | Complete **machine setting** dictionary defined in the [DPDispatcher](https://docs.deepmodeling.com/projects/dpdispatcher/en/latest/index.html) with higher priority | - | resources | Optional[Dict] | None | Complete **resources setting** dictionary defined in the [DPDispatcher](https://docs.deepmodeling.com/projects/dpdispatcher/en/latest/index.html) with higher priority | - | task | Optional[Dict] | None | Complete **task setting** dictionary defined in the [DPDispatcher](https://docs.deepmodeling.com/projects/dpdispatcher/en/latest/index.html) with higher priority | - -* **Bohrium** (additonal dispatcher config to be specified when you want to quickly adopt the pre-built dflow service or scientific computing resources on the [Bohrium platform](https://bohrium.dp.tech) ) - | Key words | Data structure | Default | Description | - | :------------ | ----- | ----- | ------------------- | - | email | String | None | Email of your Bohrium account | - | phone | String | None | Phone number of your Bohrium account | - | password | String | None | Password of your Bohrium account | - | program_id | Int | None | Program ID of your Bohrium account | - | scass_type | String | None | Node type provided by Bohrium | - -Please refer to the [Quick Start](#4-quick-start) section for various instances of global JSON examples in different situations. - -#### 3.1.2. Calculation Parameters -The method for indicating parameters in alloy property calculations is akin to the previous `dpgen.autotest` approach. There are **three** categories of JSON files that determine the parameters to be passed to APEX, based on their contents. - -Categories calculation parameter files: -| Type | File format | Dictionary contained | Usage | -| :------------ | ---- | ----- | ------------------- | -| Relaxation | json | `structures`; `interaction`; `Relaxation` | For `relaxation` worflow | -| Property | json | `structures`; `interaction`; `Properties` | For `property` worflow | -| Joint | json | `structures`; `interaction`; `Relaxation`; `Properties` | For `relaxation`, `property` and `joint` worflows | - -It should be noted that files such as POSCAR, located within the `structure` directory, or any other files specified within the JSON file should be defined as relative path to the **working directory** and prepared in advanced. - -Below are three examples (for detailed explanations of each parameter, please refer to the [Hands-on_auto-test](./docs/Hands_on_auto-test.pdf) documentation for further information): - -* **Relaxation parameter file** + +When you run `apex submit -c global_bohrium.json`, APEX auto-fills these defaults if missing: + +- `dflow_host`: `https://workflows.deepmodeling.com` +- `k8s_api_server`: `https://workflows.deepmodeling.com` +- `batch_type`: `Bohrium` +- `context_type`: `Bohrium` +- `apex_image_name`: `registry.dp.tech/dptech/prod-11045/apex-dependency:1.2.0` + +Priority rule: values in your `-c` json file override account defaults. + + + +## 4. Detailed Parameter Reference + +### 4.1 Global configuration (`global*.json`) + +#### Basic config + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `apex_image_name` | String | `zhuoyli/apex_amd64` | Image for steps other than `run`. Build from `docs/Dockerfile` if customising. | +| `run_image_name` | String | `None` | Calculator image for the `run` step. Overrides `{calculator}_image_name` if both present. | +| `run_command` | String | `None` | Command executed in the `run` step. Use `{calculator}_run_command` for calculator-specific overrides. | +| `group_size` | Integer | `1` | Number of tasks grouped per parallel run. | +| `pool_size` | Integer | `1` | Multiprocessing pool size when multiple tasks run locally (set `-1` for unlimited). | +| `upload_python_package` | List[String] | `None` | Extra Python packages to upload into the container. | +| `debug_pool_workers` | Integer | `1` | Pool size when executing in debug mode (`-d`). | +| `flow_name` | String | `None` | Custom workflow name (defaults to work directory name). | +| `submit_only` | Bool | `False` | Submit without auto retrieval. Combine with `apex retrieve` later. | + +#### dflow config + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `dflow_host` | String | `https://127.0.0.1:2746` | dflow service endpoint. | +| `k8s_api_server` | String | `https://127.0.0.1:2746` | Kubernetes API endpoint. | +| `dflow_config` | Dict | `None` | Advanced dflow settings (see [documentation](https://deepmodeling.com/dflow/dflow.html)). | +| `dflow_s3_config` | Dict | `None` | S3 storage configuration passed directly to dflow. | + +#### Dispatcher config (via [DPDispatcher](https://docs.deepmodeling.com/projects/dpdispatcher/en/latest/index.html)) + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `context_type` | String | `None` | Dispatcher context (e.g., `SSHContext`, `Bohrium`, `Local`). | +| `batch_type` | String | `None` | Scheduler / batch system (e.g., `Slurm`, `Shell`). | +| `local_root` | String | `./` | Local root directory. | +| `remote_root` | String | `None` | Remote working directory. | +| `remote_host` | String | `None` | Remote host (deprecated in favour of `machine.remote_profile`). | +| `remote_username` | String | `None` | Remote username. | +| `remote_password` | String | `None` | Remote password. | +| `port` | Integer | `22` | SSH port. | +| `machine` | Dict | `None` | Full machine specification (overrides top-level keys). | +| `resources` | Dict | `None` | Resource specification (nodes, queue, modules, etc.). | +| `task` | Dict | `None` | Task specification (command, working directory, environment variables). | + +#### Bohrium extras + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `email` | String | `None` | Bohrium account email. | +| `phone` | String | `None` | Bohrium account phone. | +| `password` | String | `None` | Bohrium password. | +| `program_id` | Integer | `None` | Bohrium program ID. | +| `scass_type` | String | `None` | Bohrium node type. | + +> Note: in Bohrium workflows, these fields can be stored in `~/.apex/account.json` via `apex account`. + +### 4.2. Calculation parameters (`param*.json`) + +The JSON schema inherits from `dpgen.autotest`. Below are example snippets for each workflow type: + +- **Relaxation** ```json { - "structures": ["confs/std-*"], + "structures": ["confs/std-*"], "interaction": { - "type": "deepmd", - "model": "frozen_model.pb", - "type_map": {"Mo": 0} - }, + "type": "deepmd", + "model": "frozen_model.pb", + "type_map": {"Mo": 0} + }, "relaxation": { - "cal_setting": {"etol": 0, - "ftol": 1e-10, - "maxiter": 5000, - "maximal": 500000} - } + "req_calc": true, + "cal_setting": { + "etol": 0, + "ftol": 1e-10, + "maxiter": 5000, + "maximal": 500000 + } + } } ``` -* **Property parameter file** + +- **Property** ```json { - "structures": ["confs/std-*"], + "structures": ["confs/std-*"], "interaction": { - "type": "deepmd", - "model": "frozen_model.pb", - "type_map": {"Mo": 0} + "type": "deepmd", + "model": "frozen_model.pb", + "type_map": {"Mo": 0} }, "properties": [ - { - "type": "eos", - "skip": false, - "vol_start": 0.6, - "vol_end": 1.4, - "vol_step": 0.1, - "cal_setting": {"etol": 0, - "ftol": 1e-10} - }, - { - "type": "elastic", - "skip": false, - "norm_deform": 1e-2, - "shear_deform": 1e-2, - "cal_setting": {"etol": 0, - "ftol": 1e-10} - } - ] + { + "type": "eos", + "req_calc": true, + "vol_start": 0.6, + "vol_end": 1.4, + "vol_step": 0.1, + "cal_setting": {"etol": 0, "ftol": 1e-10} + }, + { + "type": "elastic", + "req_calc": true, + "norm_deform": 1e-2, + "shear_deform": 1e-2, + "cal_setting": {"etol": 0, "ftol": 1e-10} + } + ] } ``` -* **Joint parameter file** + +- **Joint** ```json { - "structures": ["confs/std-*"], + "structures": ["confs/std-*"], "interaction": { - "type": "deepmd", - "model": "frozen_model.pb", - "type_map": {"Mo": 0} - }, + "type": "deepmd", + "model": "frozen_model.pb", + "type_map": {"Mo": 0} + }, "relaxation": { - "cal_setting": {"etol": 0, - "ftol": 1e-10, - "maxiter": 5000, - "maximal": 500000} - }, + "cal_setting": { + "etol": 0, + "ftol": 1e-10, + "maxiter": 5000, + "maximal": 500000 + } + }, "properties": [ { - "type": "eos", - "skip": false, - "vol_start": 0.6, - "vol_end": 1.4, - "vol_step": 0.1, - "cal_setting": {"etol": 0, - "ftol": 1e-10} + "type": "eos", + "req_calc": true, + "vol_start": 0.6, + "vol_end": 1.4, + "vol_step": 0.1, + "cal_setting": {"etol": 0, "ftol": 1e-10} }, { - "type": "elastic", - "skip": false, - "norm_deform": 1e-2, + "type": "elastic", + "req_calc": true, + "norm_deform": 1e-2, "shear_deform": 1e-2, - "cal_setting": {"etol": 0, - "ftol": 1e-10} + "cal_setting": {"etol": 0, "ftol": 1e-10} } - ] + ] } ``` -##### 3.1.2.1. EOS - | Key words | Data structure | Example | Description | - | :------------ | ----- |-----------------------------------------------------------| ------------------- | - | vol_start | Float | 0.9 | The starting volume related to the equilibrium structure | - | vol_end | Float | 1.1 | The maximum volume related to the equilibrium structure | - | vol_step | Float | 0.01 | The volume increment related to the equilibrium structure | - | vol_abs | Bool | False | Whether to treat vol_start and vol_end as absolute volume, default = False | - -##### 3.1.2.2. Elastic - | Key words | Data structure | Example | Description | - |:-------------|----------------|---------|-----------------------------------------------------------------------------------------------------------------------------------| - | norm_deform | Float | 0.01 | The deformation in xx, yy, zz, defaul = 1e-2 | - | shear_deform | Float | 0.01 | The deformation in other directions, default = 1e-2 | - | conventional | Bool | False | Whether adopt conventional cell for deformation | - | ieee | Bool | False | Whether rotate relaxed structure into IEEE-standard format before deformation ([ref](https://ieeexplore.ieee.org/document/26560)) | - | modulus_type | String | "voigt" | Bulk and shear modulus average type (default: "voigt"). Choose from "voigt", "reuss" and "vrh" | - -##### 3.1.2.3. Surface - | Key words | Data structure | Example | Description | - | :------------ | ----- |----------------------------------------------------------------------------------| ------------------- | - | min_slab_size | Int | 10 | Minimum size of slab thickness | - | min_vacuum_size | Int | 11 | Minimum size of vacuum width | - | pert_xz | Float | 0.01 | Perturbation through xz direction used to compute surface energy, default = 0.01 | - | max_miller | Int | 2 | The maximum miller index number of surface, default = 2 | - -##### 3.1.2.4. Vacancy - | Key words | Data structure | Example | Description | - | :------------ | ----- | ----- | ------------------- | - | supercell | List[Int] | [3, 3, 3] | The supercell to be constructed, default = [1,1,1] | - -##### 3.1.2.5. Interstitial - | Key words | Data structure | Example | Description | - | :------------ | ----- | ----- | ------------------- | - | insert_ele | List[String] | ["Al"] | The element to be inserted | - | supercell | List[Int] | [3, 3, 3] | The supercell to be constructed, default = [1,1,1] | - | conf_filters | Dict | "min_dist": 1.5 | Filter out the undesirable configuration | -
- Fig3 -

-
- -##### 3.1.2.6. Gamma Line -
- Fig2 -

Figure 2. Schematic diagram of Gamma line calculation

-
- -The Gamma line (generalized stacking fault energy) function of APEX calculates energy of a series slab structures of specific crystal plane, which displaced in the middle along a slip vector as illustrated in **Figure 2**. In APEX, the slab structrures are defined by a plane miller index and two orthogonal directions (primary and secondary) on the plane. The **slip vector is always along the primary directions** with slip length defined by users or default settings. Thus, by indicating `plane_miller` and the `slip_direction` (i.e., primary direction), a slip system can be defined. - -For most common slip systems in FCC, BCC and HCP crystal structures, slip direction, secondary direction and default fractional slip lengths are already documented and listed below (users are **strongly advised** to follow those pre-defined slip system, or may need to double-check the generated slab structure, as unexpected results may occur especially for system like HCP): -* FCC - | Plane miller index | Slip direction | Secondary direction | Default slip length | - | :-------- | ----- | ----- | ---- | - | $(001)$ | $[100]$ | $[010]$ | $a$ | - | $(110)$ | $[\bar{1}10]$ | $[001]$ | $\sqrt{2}a$ | - | $(111)$ | $[11\bar{2}]$ | $[\bar{1}10]$ | $\sqrt{6}a$ | - | $(111)$ | $[\bar{1}\bar{1}2]$ | $[1\bar{1}0]$ | $\sqrt{6}a$ | - | $(111)$ | $[\bar{1}10]$ | $[\bar{1}\bar{1}2]$ | $\sqrt{2}a$ | - | $(111)$ | $[1\bar{1}0]$ | $[11\bar{2}]$ | $\sqrt{2}a$ | - -* BCC - | Plane miller index | Slip direction | Secondary direction | Default slip length | - | :-------- | ----- | ----- | ---- | - | $(001)$ | $[100]$ | $[010]$ | $a$ | - | $(111)$ | $[\bar{1}10]$ | $[\bar{1}\bar{1}2]$ | $\frac{\sqrt{2}}{2}a$ | - | $(110)$ | $[\bar{1}11]$ | $[00\bar{1}]$ | $\frac{\sqrt{3}}{2}a$ | - | $(110)$ | $[1\bar{1}\bar{1}]$ | $[001]$ | $\frac{\sqrt{3}}{2}a$ | - | $(112)$ | $[11\bar{1}]$ | $[\bar{1}10]$ | $\frac{\sqrt{3}}{2}a$ | - | $(112)$ | $[\bar{1}\bar{1}1]$ | $[1\bar{1}0]$ | $\frac{\sqrt{3}}{2}a$ | - | $(123)$ | $[11\bar{1}]$ | $[\bar{2}10]$ | $\frac{\sqrt{3}}{2}a$ | - | $(123)$ | $[\bar{1}\bar{1}1]$ | $[2\bar{1}0]$ | $\frac{\sqrt{3}}{2}a$ | - -* HCP (Bravais lattice) - | Plane miller index | Slip direction | Secondary direction | Default slip length | - | :-------- | ----- | ----- | ---- | - | $(0001)$ | $[2\bar{1}\bar{1}0]$ | $[01\bar{1}0]$ | $a$ | - | $(0001)$ | $[1\bar{1}00]$ | $[01\bar{1}0]$ | $\sqrt{3}a$ | - | $(0001)$ | $[10\bar{1}0]$ | $[01\bar{1}0]$ | $\sqrt{3}a$ | - | $(01\bar{1}0)$ | $[\bar{2}110]$ | $[000\bar{1}]$ | $a$ | - | $(01\bar{1}0)$ | $[0001]$ | $[\bar{2}110]$ | $c$ | - | $(01\bar{1}0)$ | $[\bar{2}113]$ | $[000\bar{1}]$ | $\sqrt{a^2+c^2}$ | - | $(\bar{1}2\bar{1}0)$ | $[\bar{1}010]$ | $[000\bar{1}]$ | $\sqrt{3}a$ | - | $(\bar{1}2\bar{1}0)$ | $[0001]$ | $[\bar{1}010]$ | $c$ | - | $(01\bar{1}1)$ | $[\bar{2}110]$ | $[\bar{1}2\bar{1}\bar{3}]$ | $a$ | - | $(01\bar{1}1)$ | $[\bar{1}2\bar{1}\bar{3}]$ | $[2\bar{1}\bar{1}0]$ | $\sqrt{a^2+c^2}$ | - | $(01\bar{1}1)$ | $[0\bar{1}12]$ | $[\bar{1}2\bar{1}\bar{3}]$ | $\sqrt{3a^2+4c^2}$ | - | $(\bar{1}2\bar{1}2)$ | $[10\bar{1}0]$ | $[1\bar{2}13]$ | $\sqrt{3}a$ | - | $(\bar{1}2\bar{1}2)$ | $[1\bar{2}13]$ | $[\bar{1}010]$ | $\sqrt{a^2+c^2}$ | - -The parameters related to Gamma line calculation are listed below: - | Key words | Data structure | Default | Description | - | :------------ | ----- | ----- | ------------------- | - | plane_miller | Sequence[Int] | None | Miller index of the target slab | - | slip_direction | Sequence[Int] | None | Miller index of slip (primary) direction of the slab | - | slip_length | Int\|Float; Sequence[Int\|Float, Int\|Float, Int\|Float] | Refer to specific slip system as the table shows above, or 1 if not indicated | Slip length along the primary direction with default unit set by users or default setting. As for format of `[x, y, z]`, the length equals to $\sqrt{(xa)^2+(yb)^2+(zc)^2}$ | - | plane_shift | Int\|Float | 0 | Shift of displacement plane with unit of lattice parameter **$c$** (positive for upwards). This allows creating slip plane within narrowly-spaced planes (see [ref](https://doi.org/10.1016/j.actamat.2016.10.042)). | - | n_steps | Int | 10 | Number of steps to displace slab along the slip vector | - | vacuum_size | Int\|Float | 0 | Thickness of vacuum layer added around the slab with unit of Angstrom | - | supercell_size | Sequence[Int, Int, Int] | [1, 1, 5] | Size of generated supercell based on slab structure | - | add fix | Sequence[Str, Str, Str] | ["true","true","false"] | Whether to add fix position constraint along x, y and z direction during calculation | - - Here is an example: - ```json - { - "type": "gamma", - "skip": true, - "plane_miller": [0,0,1], - "slip_direction": [1,0,0], - "hcp": { - "plane_miller": [0,1,-1,1], - "slip_direction": [-2,1,1,0], - "slip_length": [1,0,1], - "plane_shift": 0.25 - }, - "supercell_size": [1,1,6], - "vacuum_size": 10, - "add_fix": ["true","true","false"], - "n_steps": 10 - } - ``` - It should be noted that for various crystal structures, **users can further define slip parameters within the respective nested dictionaries, which will be prioritized for adoption**. In the example above, the slip system configuration within the "hcp" dictionary will be utilized. -##### 3.1.2.7. Phonon Spectra -This function incorporates part of [dflow-phonon](https://github.com/Chengqian-Zhang/dflow-phonon) codes into APEX to make it more complete. This workflow is realized via [Phonopy](https://github.com/phonopy/phonopy), and [phonoLAMMPS](https://github.com/abelcarreras/phonolammps) for LAMMPS calculation. In APEX, this part includes the [SeeK-path](https://seekpath.readthedocs.io/en/latest/index.html) for automatically high-symmetry points searching for phonon calculation. - -**IMPORTANT!!**: it should be noted that the **phonoLAMMPS** package must be pre-installed in the user's `run_image` to ensure accurate `LAMMPS` calculations for the phonon spectra. - -Parameters related to `Phonon` calculations are listed below: - | Key words | Data structure | Default | Description | - | :------------ | ----- | ----- | ------------------- | - | primitive | Bool | False | Whether to find primitive lattice structure for phonon calculation | - | approach | String | "linear" | Specify phonon calculation method when using `VASP`; Two options: 1. "linear" for the *Linear Response Method*, and 2. "displacement" for the *Finite Displacement Method* | - | supercell_size | Sequence[Int] | [2, 2, 2] | Size of supercell created for calculation | - | MESH | Sequence[Int] | None | Specify the dimensions of the grid in reciprocal space for which the phonon frequencies and eigenvectors are to be calculated. For example: [8, 8, 8]; Refer to [Phonopy MESH](http://phonopy.github.io/phonopy/setting-tags.html#mesh-sampling-tags) | - | PRIMITIVE_AXES | String | None | To define the basis vectors of a primitive cell in terms of the basis vectors of a conventional cell for input cell transformation. For example: "0.0 0.5 0.5 0.5 0.0 0.5 0.5 0.5 0.0"; Refer to [Phonopy PRIMITIVE_AXES](http://phonopy.github.io/phonopy/setting-tags.html#primitive-axes-or-primitive-axis) | - | BAND | String | None | (Optional) Indicate band path in reciprocal space as format of [Phonopy BAND](http://phonopy.github.io/phonopy/setting-tags.html#band-and-band-points); For example: "0 0 0 1/2 0 1/2, 1/2 1/2 1 0 0 0 1/2 1/2 1/2". If not specified, the [seekpath](https://seekpath.readthedocs.io/en/latest/#) package will be adopted to automatically determine band path according to relaxed structure | - | BAND_LABELS | String | None | (Optional) Indication of band path labels for report plot | - | BAND_POINTS | Int | 51 | Number of sampling points including the path ends | - | BAND_CONNECTION | Bool | True | With this option, band connections are estimated from eigenvectors and band structure is drawn considering band crossings. In sensitive cases, to obtain better band connections, it requires to increase number of points calculated in band segments by the `BAND_POINTS` tag | - | seekpath_from_original | Bool | False | Whether to re-seek standard primitive cell for relaxed structure for band path via the seekpath package. If True: `seekpath.get_path_orig_cell` will be adopted, else: `seekpath.get_path`. Refer to [seekpath document](https://seekpath.readthedocs.io/en/latest/maindoc.html#k-point-path-for-non-standard-unit-cells) | - | seekpath_param | Dict | None | (Optional) Other parameters to be specified for `seekpath.get_path` and `seekpath.get_path`. Refer to [seekpath document](https://seekpath.readthedocs.io/en/latest/maindoc.html#k-point-path-for-non-standard-unit-cells) | +Relaxation selection behavior: +- If `relaxation.req_calc` is omitted, relaxation is calculated by default. +- In a joint workflow, set `"relaxation": {"req_calc": false}` to skip relaxation and submit properties from each structure directory's `POSCAR`. +- When relaxation is skipped, APEX exposes that `POSCAR` as the equilibrium structure consumed by property setup. +- elastic/vacancy/interstitial/surface/gammaline/gamma_surface require relaxation step + +Property selection behavior: +- If a property block is not present in `properties`, it is not calculated. +- If a property block is present and `req_calc` is omitted, it is calculated by default. +- Set `"req_calc": false` to explicitly disable that property. + +### 4.3 EOS + +| Key | Type | Example | Description | +|-----|------|---------|-------------| +| `vol_start` | Float | `0.9` | Starting volume relative to the relaxed structure. | +| `vol_end` | Float | `1.1` | Ending volume relative to the relaxed structure. | +| `vol_step` | Float | `0.01` | Increment between volume points. | +| `vol_abs` | Bool | `false` | Treat `vol_start` and `vol_end` as absolute volumes when `true`. | + +### 4.4 Cohesive energy line + +| Key | Type | Example | Description | +|-----|------|---------|-------------| +| `latt_start` | Float | `0.9` | Starting lattice size relative to the relaxed structure. | +| `latt_end` | Float | `1.1` | Ending lattice size relative to the relaxed structure. | +| `latt_step` | Float | `0.01` | Increment between lattice points. | +| `latt_abs` | Bool | `false` | Treat `latt_start` and `latt_end` as absolute lattice sizes when `true`. | + +### 4.5 Decohesive energy line + +| Key | Type | Example | Description | +|-----|------|---------|-------------| +| `min_slab_size` | Integer | `10` | Minimum slab thickness. | +| `max_vacuum_size` | Integer | `11` | Maximum vacuum width. | +| `pert_xz` | Float | `0.01` | Perturbation along xz plane for surface energy. | +| `miller_miller` | List[Int] | `[1, 1, 0]` | Miller indices of the target plane. | + +### 4.6 Elastic + +| Key | Type | Example | Description | +|-----|------|---------|-------------| +| `norm_deform` | Float | `0.01` | Normal strain applied in xx/yy/zz. | +| `shear_deform` | Float | `0.01` | Shear strain applied to off-diagonal components. | +| `conventional` | Bool | `false` | Use the conventional cell for deformation. | +| `ieee` | Bool | `false` | Rotate relaxed structure into IEEE standard orientation. | +| `modulus_type` | String | `"voigt"` | Bulk/shear modulus averaging method (`voigt`, `reuss`, `vrh`). | + +### 4.7 Surface + +| Key | Type | Example | Description | +|-----|------|---------|-------------| +| `min_slab_size` | Integer | `10` | Minimum slab thickness. | +| `min_vacuum_size` | Integer | `11` | Minimum vacuum width. | +| `pert_xz` | Float | `0.01` | Perturbation along xz plane for surface energy. | +| `max_miller` | Integer | `2` | Maximum Miller index considered. | + +### 4.8 Vacancy + +| Key | Type | Example | Description | +|-----|------|---------|-------------| +| `supercell` | List[Int] | `[3, 3, 3]` | Supercell size built around the defect. | + +### 4.9 Interstitial + +| Key | Type | Example | Description | +|-----|------|---------|-------------| +| `insert_ele` | List[String] | `["Al"]` | Elements to insert. | +| `supercell` | List[Int] | `[3, 3, 3]` | Supercell size. | +| `conf_filters` | Dict | `{"min_dist": 1.5}` | Filters to drop invalid configurations. | + +
+ Fig3 +
-When utilizing `VASP`, you have **two** primary calculation methods: the **Linear Response Method** and the **Finite Displacement Method**. +### 4.10 Gamma line/surface (generalized stacking fault) -The **Linear Response Method** has an edge over the Finite Displacement Method in that it eliminates the need for creating super-cells, thereby offering computational efficiency in certain cases. Additionally, this method is particularly well-suited for systems with anomalous phonon dispersion (like systems with Kohn anomalies), as it can precisely calculate the phonons at the specified points. +
+ Fig2 +

Schematic of the Gamma line calculation

+
-On the other hand, the advantage of **Finite Displacement Method** lies in its versatility; it functions as an add-on compatible with any code, including those beyond the scope of density functional theory. The only requirement is that the external code can compute forces. For instance, ABACUS may lack an implementation of the Linear Response Method, but can effectively utilize the Finite Displacement Method implemented in phonon calculations. +APEX generates displaced slab structures from the specified Miller plane and slip directions. The slip vector always follows the primary direction. Use predefined slip systems for FCC, BCC, and HCP crystals when possible to avoid invalid structures. + +| Crystal | Plane Miller | Slip direction | Secondary direction | Default slip length | +|---------|--------------|----------------|---------------------|---------------------| +| **FCC** | $(001)$ | $[100]$ | $[010]$ | $a$ | +| | $(110)$ | $[\bar{1}10]$ | $[001]$ | $\sqrt{2}a$ | +| | $(111)$ | $[11\bar{2}]$ | $[\bar{1}10]$ | $\sqrt{6}a$ | +| | $(111)$ | $[\bar{1}\bar{1}2]$ | $[1\bar{1}0]$ | $\sqrt{6}a$ | +| | $(111)$ | $[\bar{1}10]$ | $[\bar{1}\bar{1}2]$ | $\sqrt{2}a$ | +| | $(111)$ | $[1\bar{1}0]$ | $[11\bar{2}]$ | $\sqrt{2}a$ | +| **BCC** | $(001)$ | $[100]$ | $[010]$ | $a$ | +| | $(111)$ | $[\bar{1}10]$ | $[\bar{1}\bar{1}2]$ | $\frac{\sqrt{2}}{2}a$ | +| | $(110)$ | $[\bar{1}11]$ | $[00\bar{1}]$ | $\frac{\sqrt{3}}{2}a$ | +| | $(110)$ | $[1\bar{1}\bar{1}]$ | $[001]$ | $\frac{\sqrt{3}}{2}a$ | +| | $(112)$ | $[11\bar{1}]$ | $[\bar{1}10]$ | $\frac{\sqrt{3}}{2}a$ | +| | $(112)$ | $[\bar{1}\bar{1}1]$ | $[1\bar{1}0]$ | $\frac{\sqrt{3}}{2}a$ | +| | $(123)$ | $[11\bar{1}]$ | $[\bar{2}10]$ | $\frac{\sqrt{3}}{2}a$ | +| | $(123)$ | $[\bar{1}\bar{1}1]$ | $[2\bar{1}0]$ | $\frac{\sqrt{3}}{2}a$ | +| **HCP** | $(0001)$ | $[2\bar{1}\bar{1}0]$ | $[01\bar{1}0]$ | $a$ | +| | $(0001)$ | $[1\bar{1}00]$ | $[01\bar{1}0]$ | $\sqrt{3}a$ | +| | $(0001)$ | $[10\bar{1}0]$ | $[01\bar{1}0]$ | $\sqrt{3}a$ | +| | $(01\bar{1}0)$ | $[\bar{2}110]$ | $[000\bar{1}]$ | $a$ | +| | $(01\bar{1}0)$ | $[0001]$ | $[\bar{2}110]$ | $c$ | +| | $(01\bar{1}0)$ | $[\bar{2}113]$ | $[000\bar{1}]$ | $\sqrt{a^2+c^2}$ | +| | $(\bar{1}2\bar{1}0)$ | $[\bar{1}010]$ | $[000\bar{1}]$ | $\sqrt{3}a$ | +| | $(\bar{1}2\bar{1}0)$ | $[0001]$ | $[\bar{1}010]$ | $c$ | +| | $(01\bar{1}1)$ | $[\bar{2}110]$ | $[\bar{1}2\bar{1}\bar{3}]$ | $a$ | +| | $(01\bar{1}1)$ | $[\bar{1}2\bar{1}\bar{3}]$ | $[2\bar{1}\bar{1}0]$ | $\sqrt{a^2+c^2}$ | +| | $(01\bar{1}1)$ | $[0\bar{1}12]$ | $[\bar{1}2\bar{1}\bar{3}]$ | $\sqrt{3a^2+4c^2}$ | +| | $(\bar{1}2\bar{1}2)$ | $[10\bar{1}0]$ | $[1\bar{2}13]$ | $\sqrt{3}a$ | +| | $(\bar{1}2\bar{1}2)$ | $[1\bar{2}13]$ | $[\bar{1}010]$ | $\sqrt{a^2+c^2}$ | + +Key parameters: + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `plane_miller` | Sequence[Int] | `None` | Miller indices of the target plane. | +| `slip_direction` | Sequence[Int] | `None` | Primary slip direction. | +| `slip_length` | Float or Sequence | `1` | Slip magnitude (vector format `[x, y, z]` means $\sqrt{(xa)^2 + (yb)^2 + (zc)^2}$). | +| `plane_shift` | Float | `0` | Shift of the displacement plane in units of lattice parameter `c`. | +| `n_steps` | Integer | `10` | Number of sampling points along the slip. | +| `vacuum_size` | Float | `0` | Added vacuum layer thickness (Å). | +| `supercell_size` | Sequence[Int] | `[1, 1, 5]` | Slab supercell size. | +| `add_fix` | Sequence[String] | `["true","true","false"]` | Position constraints along x/y/z. | + +Example: +```json +{ + "type": "gamma", + "req_calc": false, + "plane_miller": [0, 0, 1], + "slip_direction": [1, 0, 0], + "hcp": { + "plane_miller": [0, 1, -1, 1], + "slip_direction": [-2, 1, 1, 0], + "slip_length": [1, 0, 1], + "plane_shift": 0.25 + }, + "supercell_size": [1, 1, 6], + "vacuum_size": 10, + "add_fix": ["true", "true", "false"], + "n_steps": 10 +} +``` +To preview structure behave as expected before brusting computational resource, you can use `preview` to generate a gif file to visulize it. -### 3.2. Submission -#### 3.2.1. Workflow Submission -APEX will execute a specific dflow workflow upon each invocation of the command in the format: `apex submit [-h] [-c [CONFIG]] [-w WORK [WORK ...]] [-d] [-s] [-f {relax,props,joint}] parameter [parameter ...]`. The type of workflow and calculation method will be automatically determined by APEX based on the parameter file provided by users. Additionally, users can specify the **workflow type**, **configuration JSON file**, and **work directory** through an optional argument (Run `apex submit -h` for further help). Here is an example to submit a `joint` workflow: ```shell -apex submit param_relax.json param_props.json -c ./global_bohrium.json -w 'dp_demo_0?' 'eam_demo' +apex preview gammaline.json ``` -if no config JSON (following `-c`) and work directory (following `-w`) is specified, `./global.json` and `./` will be passed as default values respectively. - -#### 3.2.2. Workflow Inquiry & Operations -APEX supports several commonly used `dflow` inquiry and operation commands as listed below: -- `list`: List all workflows information -- `get`: Get detailed information of a workflow -- `getsteps`: Get detailed steps information of a workflow -- `getkeys`: Get keys of steps from a workflow -- `delete`: Delete a workflow -- `resubmit`: Resubmit a workflow -- `retry`: Retry a workflow -- `resume`: Resume a workflow -- `stop`: Stop a workflow -- `suspend`: Suspend a workflow -- `terminate` Terminate a workflow - -Take `stop` as an example (usage: `apex stop [-h] [-i ID] [-w WORK] [-c [CONFIG]]`) user can refer to following three options: -1. `apex stop`, as running at the target `work_dir`, and apex will inquiry workflow `ID` from `.workflow.log` file under the current path (`config.json` is the default config file) -2. `apex stop -w ./EAM_Ti -c ./EAM_Ti/config.json` to indicate target `work_dir` to stop -3. `apex stop -i relax-fe03j4 -c ./config_bohrium.json` to indicate specific workflow `ID` to stop - - -#### 3.2.3. Run Individual Step -APEX also provides a **single-step test mode**, which can run `Make` `run` and `Post` step individually under local enviornment. **Please note that one needs to run commands under the work directory in this mode.** User can invoke them by format of `apex run [-h] [-c [CONFIG]] parameter {make_relax,run_relax,post_relax,make_props,run_props,post_props}` (Run `apex run -h` for help). Here is a example to do relaxation in this mode: -1. Firstly, generate relaxation tasks by - ```shell - apex do param_relax.json make_relax - ``` -2. Then dispatch tasks by - ```shell - apex do param_relax.json run_relax -c machine.json - ``` - where `machine.json` is a JSON file to define dispatch method, containing `machine`, `resources`, `task` dictionaries and `run_command` as listed in [DPDispatcher’s documentation](https://docs.deepmodeling.com/projects/dpdispatcher/en/latest/index.html). Here is an example to submit tasks to a remote HPC managed by [Slurm](https://slurm.schedmd.com): - ```json - { - "run_command": "lmp -i in.lammps -v restart 0", - "machine": { - "batch_type": "Slurm", - "context_type": "SSHContext", - "local_root" : "./", - "remote_root": "/hpc/home/hku/zyl/Downloads/remote_tasks", - "remote_profile":{ - "hostname": "***.**.**.**", - "username": "USERNAME", - "password": "PASSWD", - "port": 22, - "timeout": 10 - } - }, - "resources":{ - "number_node": 1, - "cpu_per_node": 4, - "gpu_per_node": 0, - "queue_name": "apex_test", - "group_size": 1, - "module_list": ["deepmd-kit/2.1.0/cpu_binary_release"], - "custom_flags": [ - "#SBATCH --partition=xlong", - "#SBATCH --ntasks=1", - "#SBATCH --mem=10G", - "#SBATCH --nodes=1", - "#SBATCH --time=1-00:00:00" - ] - } - } - ``` -3. Finally, when all tasks are finished, post-process by - ```shell - apex do param_relax.json post_relax - ``` -The property test can follow a similar approach. -### 3.3. After Submission -#### 3.3.1. Retrieve Results Manually - -Sometimes when results auto-retrieving fails after workflows finish, you may try to retrieve completed test results manually by the `retrieve` command with a specific workflow `ID` (or target `work_dir`) provided: -```shell -apex retrieve [-h] [-i ID] [-w WORK] [-c [CONFIG]] -``` -where the `WORK` defaults to be `./`, and the `CONFIG` JSON (default: `config.json`) is used to connect to the remote storage. The command usage to similar to [3.2.2. Workflow Inquiry \& Operations](#322-workflow-inquiry--operations) +Nested dictionaries (`fcc`, `bcc`, `hcp`, etc.) override the top-level parameters for the corresponding lattice type. -#### 3.3.2. Archive Test Results -After completion of each workflow, the results and test parameters of corresponding property will be stored as `json` format automatically under respective work directory named as `all_result.json`. You can also do this manually to update this file based on the latest run by: +Similarly, to investigate Gamma Surface, change the type to `gamma_surface`, and adjust steps accordingly. +`gamma_surface` keeps the same crystallographic interface: `plane_miller` and +`slip_direction` define the in-plane fault basis, `vacuum_size = 0` gives a +bulk-like periodic generalized stacking-fault calculation, and `vacuum_size > 0` +adds vacuum along the selected fault normal for slab/free-surface calculations. -```shell -apex archive [parameter …] +```json +"properties": [ + { + "type": "gamma_surface", + "req_calc": true, + "plane_miller": [1, 1, 0], + "slip_direction": [1, -1, -1], + "supercell_size": [1, 1, 20], + "vacuum_size": 15, + "add_fix": ["true", "true", "false"], + "n_steps_x": 20, + "n_steps_y": 20 + } + ] ``` -Argument format of this sub-command is similar to that of `submit` command. Please use `apex archive -h` for complete usage introduction. It should be noticed that each `archive` command will only update property information of those identified as **active** according to the parameter files and indication provided similar to the `submit` mode. - -This mode can also archive results to **NoSQL** database. We currently support two types of database client: [MongoDB](https://www.mongodb.com/) and [DynamoDB](https://aws.amazon.com/cn/dynamodb/). Below shows global configuration parameters for two database archive: - - | Key words | Data structure | Default | Description | - | :------------ | ----- | ----- | ------------------- | - | database_type | String | local | Database type, three choices available: `local` (only archive to local `all_result.json`), `mongodb` and `dynamodb`. One can also indicate this by `-d` within `archive` command | - | archive_method | String | sync | Choose from `sync` and `record`. `sync` synchronizes and updates results into same item based on work directory id; `record` records each archived result into a new item with unique timestamp. One can also indicate this by `-m` within `archive` command | - - For `MongoDB`: - | Key words | Data structure | Default | Description | - | :------------ | ----- | ----- | ------------------- | - | mongodb_host | String | localhost | `Mongodb` host | - | mongodb_port | Int | 27017 | `Mongodb` port | - | mongodb_database | String | apex_results | `Mongodb` database name | - | mongodb_collection | String | apex_results | `Mongodb` collection name | - | mongodb_config | Dict | None | Complete parameter dictionary for [MongoClient](https://www.mongodb.com/blog/post/introducing-mongoclient) | - - For `DynamoDB`: - | Key words | Data structure | Default | Description | - | :------------ | ----- | ----- | ------------------- | - | dynamodb_table_name | String | apex_results | `Dynamodb` table name | - | dynamodb_config | Dict | None | Complete parameter dictionary for [boto3 session](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/core/session.html#boto3.session.Session.resource) | - -#### 3.3.3. Results Visualization Report -Note that this mode **only** runs on computer with **interactive UI** frontend. -In this mode, APEX will create a comprehensive and interactive results visualization report according to `all_result.json` within indicated work directories. This is achieved through [Dash](https://dash.plotly.com) App. You can invoke the report app simply under target work directory by: -```shell -apex report +### 4.11 Phonon spectra + +APEX integrates parts of [dflow-phonon](https://github.com/Chengqian-Zhang/dflow-phonon) and wraps [Phonopy](https://github.com/phonopy/phonopy) / [phonoLAMMPS](https://github.com/abelcarreras/phonolammps). [SeeK-path](https://seekpath.readthedocs.io/en/latest/index.html) automatically generates high-symmetry k-paths. + +> **Important:** Ensure the `run_image` (or local environment in debug mode) contains `phonoLAMMPS` when running LAMMPS-based phonon workflows. + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `primitive` | Bool | `false` | Reduce to primitive cell before phonon calculation. | +| `approach` | String | `"linear"` | VASP phonon method: `"linear"` or `"displacement"`. | +| `supercell_size` | Sequence[Int] | `[2, 2, 2]` | Supercell dimensions. | +| `MESH` | Sequence[Int] | `None` | Reciprocal-space mesh (e.g., `[8, 8, 8]`). | +| `PRIMITIVE_AXES` | String | `None` | Custom primitive axes definition (`"0.0 0.5 0.5 0.5 0.0 0.5 0.5 0.5 0.0"`). | +| `BAND` | String | `None` | Band path definition (falls back to SeeK-path when omitted). | +| `BAND_LABELS` | String | `None` | Labels for band segments. | +| `BAND_POINTS` | Integer | `51` | Number of sampling points per segment. | +| `BAND_CONNECTION` | Bool | `true` | Enable band connection estimation. | +| `seekpath_from_original` | Bool | `false` | Use `seekpath.get_path_orig_cell` instead of `seekpath.get_path`. | +| `seekpath_param` | Dict | `None` | Extra arguments passed to SeeK-path. | + +The linear-response method accelerates calculations for metallic systems, while the finite-displacement approach works with any calculator that can provide forces (e.g., ABACUS). + +### 4.12 Grüneisen parameters and thermal expansion + +APEX supports Grüneisen workflows based on phonon calculations at multiple strained volumes. The `sign_only` mode evaluates the heat-capacity-weighted Grüneisen sum and its sign, while the `full` mode additionally fits the bulk modulus from the volume-energy points and reports the volumetric thermal expansion coefficient. + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `volume_strains` | Sequence[Float] | Required | Symmetric volume strains around `0.0`, e.g. `[-0.01, 0.0, 0.01]`. | +| `temperatures` | Sequence[Float] | Required | Temperatures for heat-capacity weighting and thermal expansion output. | +| `alpha_mode` | String | `"sign_only"` | Output mode: `"sign_only"` or `"full"`. | +| `bulk_modulus_source` | String | `"eos_fit"` | Bulk modulus source for `full` mode. | +| `eos_model` | String | `"birch_murnaghan"` | EOS model used for the bulk-modulus fit. | +| `primitive` | Bool | `false` | Reduce to primitive cell before phonon calculation. | +| `approach` | String | `"linear"` | Phonon workflow approach; VASP Grüneisen currently uses linear response. | +| `supercell_size` | Sequence[Int] | `[2, 2, 2]` | Phonon supercell dimensions. | +| `MESH` | Sequence[Int] | `None` | Reciprocal-space mesh for mode summation. | +| `PRIMITIVE_AXES` | String | `None` | Custom primitive axes definition. | +| `BAND` | String | `None` | Band path definition (falls back to SeeK-path when omitted). | +| `BAND_LABELS` | String | `None` | Labels for band segments. | +| `BAND_POINTS` | Integer | `51` | Number of sampling points per segment. | +| `BAND_CONNECTION` | Bool | `true` | Enable band connection estimation. | + +For `full` mode, use fixed-volume internal relaxation in `cal_setting` (`relax_pos = true`, `relax_shape = false`, `relax_vol = false`) so the phonon and energy points share the intended volume grid. + +### 4.13 Finite-temperature lattice parameters + +APEX supports lattice parameter calculations at finite temperatures using molecular dynamics in LAMMPS. +This workflow performs NVT equilibration at target temperatures and averages lattice parameters over the equilibrated trajectory. + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `supercell_size` | Sequence[Int] | `[2, 2, 2]` | Supercell dimensions for the simulation. | + +LAMMPS-specific calculation settings in `cal_setting`: + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `temperature` | Sequence[Float] | Required | Target temperatures (K) for lattice parameter calculation, e.g., `[200, 400, 600, 800]`. | +| `equi_step` | Integer | `80000` | Number of equilibration steps before averaging. | +| `ave_step` | Integer | `40000` | Number of steps for averaging lattice parameters. | +| `timestep` | Float | `0.001` | MD timestep (ps). | +| `tdamp` | Float | `0.1` | Thermostat damping parameter. | +| `pdamp` | Float | `1.0` | Barostat damping parameter. | +| `N_every` | Integer | `100` | Interval for computing averages. | +| `N_repeat` | Integer | `10` | Number of average samples. | +| `N_freq` | Integer | `2000` | Sample output frequency. | + +Example: + +```json +{ + "type": "finite_t_latt", + "supercell_size": [2, 2, 2], + "cal_setting": { + "temperature": [200, 400, 600, 800], + "equi_step": 80000, + "ave_step": 40000, + "timestep": 0.001, + "tdamp": 0.1, + "pdamp": 1.0, + "N_every": 100, + "N_repeat": 10, + "N_freq": 2000 + } +} ``` -Or indicate multiple work directories or path of result file in `json` format by `-w` for cross-comparison. Here is an example: -```shell -apex report -w DP/all_result.json ./MEAM_00* + +### 4.14 Finite-temperature elastic constant + +APEX supports elastic constant calculations at finite temperatures using molecular dynamics in LAMMPS. +This implementation uses the noise-cancellation method (see [DOI: 10.1103/sd49-wqd6](https://doi.org/10.1103/sd49-wqd6)) to compute temperature-dependent elastic constants from stress fluctuations. + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `supercell_size` | Sequence[Int] | `[2, 2, 2]` | Supercell dimensions for the simulation. | + +LAMMPS-specific calculation settings in `cal_setting`: + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `temperature` | Sequence[Float] | Required | Target temperatures (K) for elastic calculation, e.g., `[300]`. | +| `strain` | Float | Required | Small strain magnitude for fluctuation analysis. | +| `strain_components` | Sequence[String] | Required | Strain components to compute: `"xx"`, `"yy"`, `"zz"`, `"yz"`, `"xz"`, `"xy"`. | +| `equi_step` | Integer | `16000` | Number of equilibration steps before measurement. | +| `response_step` | Integer | `16000` | Number of steps for collecting stress-strain data. | +| `stress_output_every` | Integer | `100` | Stress output frequency (steps). | +| `timestep` | Float | `0.001` | MD timestep (ps). | +| `tdamp` | Float | `0.1` | Thermostat damping parameter. | +| `pdamp` | Float | `1.0` | Barostat damping parameter. | +| `seed` | Integer | Required | Random seed for reproducibility. | +| `n_blocks` | Integer | `10` | Number of blocks for statistical analysis. | +| `method` | String | `"paired_langevin"` | Thermostat method (now only support `"paired_langevin"`). | + +Example: + +```json +{ + "type": "finite_t_elastic", + "supercell_size": [2, 2, 2], + "cal_setting": { + "temperature": [300], + "strain": 0.001, + "strain_components": ["xx", "yy", "zz", "yz", "xz", "xy"], + "equi_step": 16000, + "response_step": 16000, + "stress_output_every": 100, + "timestep": 0.001, + "tdamp": 0.1, + "pdamp": 1.0, + "seed": 12345, + "n_blocks": 10, + "method": "paired_langevin" + } +} ``` -Once the report app is opened (or manully via http://127.0.0.1:8050/), users can select configurations and property types. Then the corresponding result plot and data table will be shown accordingly. -**NOTE**: -- If two Dash pages are automatically opened in your browser, you can close the first one. -- If the clipboard buttons do not function well, try to reload the page once. -- Do not over-refresh the page as duplicate errors may occur. Should this occur, stop the server and re-execute the apex report command. -
- Fig3 -

Figure 3. Demonstration of APEX Results Visualization Report

-
+ +## More Resources + +[![](https://img.shields.io/badge/APP-BohriumApp-orange.svg)](https://bohrium.dp.tech/apps/apex) + +- **APEX Bohrium App** – Launch workflows from your browser with minimal configuration (Bohrium account required). +- **Documentation & tutorials** – Explore `docs/Hands_on_auto-test.pdf`, `docs/scripts/`, and the [dflow tutorials](https://github.com/deepmodeling/dflow/tree/master/tutorials) for environment setup. +- **Hands-on Bohrium notebook** – [Interactive tutorial](https://bohrium.dp.tech/notebooks/15413) covering Bohrium submissions. +- **How to cite APEX** – + [![](https://img.shields.io/badge/DOI-10.1038/s41524_025_01580_y-red.svg)](https://doi.org/10.1038/s41524-025-01580-y) + + > Li, Z., Wen, T., Zhang, Y. et al. *APEX: an automated cloud-native material property explorer*. npj Comput Mater 11, 88 (2025). https://doi.org/10.1038/s41524-025-01580-y diff --git a/apex/__init__.py b/apex/__init__.py index 30d27d6b..6f22c926 100644 --- a/apex/__init__.py +++ b/apex/__init__.py @@ -1,5 +1,5 @@ import os -__version__ = '1.2.17' +__version__ = '1.3.0' LOCAL_PATH = os.getcwd() diff --git a/apex/account.py b/apex/account.py new file mode 100644 index 00000000..eb675738 --- /dev/null +++ b/apex/account.py @@ -0,0 +1,241 @@ +import copy +import json +import logging +import os +from getpass import getpass +from pathlib import Path +from typing import Dict, Optional + + +BOHRIUM_WORKFLOWS_HOST = "https://workflows.deepmodeling.com" +DEFAULT_BOHRIUM_CONFIG = { + "dflow_host": BOHRIUM_WORKFLOWS_HOST, + "k8s_api_server": BOHRIUM_WORKFLOWS_HOST, + "batch_type": "Bohrium", + "context_type": "Bohrium", + "apex_image_name": "registry.dp.tech/dptech/prod-11045/apex-dependency:1.2.0", +} +SENSITIVE_KEYS = {"password"} +ACCOUNT_FILE_ENV = "APEX_ACCOUNT_FILE" + + +def _deep_update(base: dict, updates: Optional[dict]) -> None: + if not updates: + return + for key, value in updates.items(): + if isinstance(value, dict) and isinstance(base.get(key), dict): + _deep_update(base[key], value) + else: + base[key] = value + + +def get_account_config_path(path: Optional[os.PathLike] = None) -> Path: + if path is not None: + return Path(path).expanduser() + env_path = os.environ.get(ACCOUNT_FILE_ENV) + if env_path: + return Path(env_path).expanduser() + return Path.home() / ".apex" / "account.json" + + +def load_account_config(path: Optional[os.PathLike] = None) -> dict: + account_path = get_account_config_path(path) + if not account_path.is_file(): + return {} + try: + with account_path.open("r", encoding="utf-8") as fp: + return json.load(fp) + except json.JSONDecodeError: + logging.warning( + "Failed to parse account config file %s, ignoring it.", + account_path + ) + return {} + + +def save_account_config(config: dict, path: Optional[os.PathLike] = None) -> Path: + account_path = get_account_config_path(path) + account_path.parent.mkdir(parents=True, exist_ok=True) + with account_path.open("w", encoding="utf-8") as fp: + json.dump(config, fp, indent=2) + fp.write("\n") + if os.name != "nt": + try: + os.chmod(account_path.parent, 0o700) + os.chmod(account_path, 0o600) + except PermissionError: + pass + return account_path + + +def remove_account_config(path: Optional[os.PathLike] = None) -> bool: + account_path = get_account_config_path(path) + if account_path.exists(): + account_path.unlink() + return True + return False + + +def mask_sensitive_config(config: dict) -> dict: + masked = copy.deepcopy(config) + for key in SENSITIVE_KEYS: + if masked.get(key): + masked[key] = "******" + return masked + + +def _is_bohrium_context(config_dict: dict) -> bool: + for key in ("context_type", "batch_type"): + value = config_dict.get(key) + if isinstance(value, str) and "bohrium" in value.lower(): + return True + machine = config_dict.get("machine", {}) + if isinstance(machine, dict): + for key in ("context_type", "batch_type"): + value = machine.get(key) + if isinstance(value, str) and "bohrium" in value.lower(): + return True + remote_profile = machine.get("remote_profile", {}) + if isinstance(remote_profile, dict) and any( + key in remote_profile for key in ("email", "password", "program_id")): + return True + dflow_config = config_dict.get("dflow_config", {}) + if isinstance(dflow_config, dict): + if dflow_config.get("host") == BOHRIUM_WORKFLOWS_HOST: + return True + return any( + key in config_dict for key in ("email", "password", "program_id", "phone", "bohrium_config") + ) or config_dict.get("dflow_host") == BOHRIUM_WORKFLOWS_HOST + + +def _is_explicit_non_bohrium_context(config_dict: dict) -> bool: + context_values = [] + for key in ("context_type", "batch_type"): + value = config_dict.get(key) + if isinstance(value, str) and value.strip(): + context_values.append(value.lower()) + machine = config_dict.get("machine", {}) + if isinstance(machine, dict): + for key in ("context_type", "batch_type"): + value = machine.get(key) + if isinstance(value, str) and value.strip(): + context_values.append(value.lower()) + if not context_values: + return False + return all("bohrium" not in value for value in context_values) + + +def should_apply_bohrium_defaults( + config_dict: dict, + config_file: Optional[os.PathLike], + account_config: dict +) -> bool: + if _is_explicit_non_bohrium_context(config_dict): + return False + if _is_bohrium_context(config_dict): + return True + config_name = str(config_file).lower() if config_file else "" + if "bohrium" in config_name: + return True + return bool(account_config) + + +def merge_bohrium_defaults( + config_dict: Optional[dict], + config_file: Optional[os.PathLike] = None +) -> dict: + user_config = copy.deepcopy(config_dict or {}) + account_config = load_account_config() + if not should_apply_bohrium_defaults(user_config, config_file, account_config): + return user_config + + merged = copy.deepcopy(DEFAULT_BOHRIUM_CONFIG) + _deep_update(merged, account_config) + _deep_update(merged, user_config) + missing_required = [ + key for key in ("email", "password", "program_id") + if merged.get(key) in (None, "") + ] + if missing_required: + logging.warning( + "Missing Bohrium account fields: %s. Run `apex account` or provide them in %s.", + ", ".join(missing_required), + config_file or "the config file" + ) + return merged + + +def _prompt_value(prompt: str, default: Optional[str]) -> Optional[str]: + default_text = f" [{default}]" if default not in (None, "") else "" + value = input(f"{prompt}{default_text}: ").strip() + if value: + return value + return default + + +def _prompt_program_id(default: Optional[int]) -> Optional[int]: + while True: + raw = _prompt_value("Bohrium program_id", str(default) if default is not None else None) + if raw in (None, ""): + return None + try: + return int(raw) + except ValueError: + print("program_id must be an integer.") + + +def prompt_for_account_fields(current_config: dict) -> dict: + updated = {} + email = _prompt_value("Bohrium email", current_config.get("email")) + if email is not None: + updated["email"] = email + password = getpass("Bohrium password [leave empty to keep current]: ").strip() + if password: + updated["password"] = password + elif current_config.get("password"): + updated["password"] = current_config["password"] + program_id = _prompt_program_id(current_config.get("program_id")) + if program_id is not None: + updated["program_id"] = program_id + return updated + + +def account_from_args(args) -> None: + account_path = get_account_config_path(args.file) + if args.reset: + if remove_account_config(account_path): + print(f"Removed account config: {account_path}") + else: + print(f"No account config found: {account_path}") + return + + current_raw = load_account_config(account_path) + current = copy.deepcopy(DEFAULT_BOHRIUM_CONFIG) + _deep_update(current, current_raw) + + cli_updates = {} + for key in ( + "dflow_host", + "k8s_api_server", + "batch_type", + "context_type", + "email", + "password", + "program_id", + "apex_image_name", + ): + value = getattr(args, key) + if value is not None: + cli_updates[key] = value + + if not cli_updates and not args.show and not args.non_interactive: + cli_updates = prompt_for_account_fields(current) + + if cli_updates: + _deep_update(current, cli_updates) + saved_path = save_account_config(current, account_path) + print(f"Saved account config to {saved_path}") + + if args.show or not cli_updates: + print(json.dumps(mask_sensitive_config(current), indent=2)) + print(f"Config path: {account_path}") diff --git a/apex/config.py b/apex/config.py index 8fad8cef..28e7e457 100644 --- a/apex/config.py +++ b/apex/config.py @@ -62,6 +62,7 @@ class Config: exclude_upload_files: list = field(default_factory=list) lammps_image_name: str = None lammps_run_command: str = None + phonolammps_run_command: str = None vasp_image_name: str = None vasp_run_command: str = None abacus_image_name: str = None @@ -251,6 +252,7 @@ def basic_config_dict(self): "upload_python_packages": self.upload_python_packages, "lammps_image_name": self.lammps_image_name, "lammps_run_command": self.lammps_run_command, + "phonolammps_run_command": self.phonolammps_run_command, "vasp_image_name": self.vasp_image_name, "vasp_run_command": self.vasp_run_command, "abacus_image_name": self.abacus_image_name, diff --git a/apex/core/calculator/Lammps.py b/apex/core/calculator/Lammps.py index 4bbdc1c8..224a9050 100644 --- a/apex/core/calculator/Lammps.py +++ b/apex/core/calculator/Lammps.py @@ -25,6 +25,111 @@ # LAMMPS_INTER_TYPE = ['deepmd', 'eam_alloy', 'meam', 'eam_fs', 'meam_spline', 'snap', 'gap', 'rann', 'mace'] MULTI_MODELS_INTER_TYPE = ["meam", "snap", "gap"] +def _render_finitetlatt_input(conf, type_map, interaction, model_param, task_param=None): + from apex.core.property.FiniteTlatt.lammps.input import ( + render_finitetlatt_lammps_input, + ) + + return render_finitetlatt_lammps_input( + conf, type_map, interaction, model_param, task_param + ) + + +def _render_gamma_input(conf, type_map, interaction, model_param, task_param=None): + from apex.core.property.Gamma.lammps.input import render_gamma_lammps_input + + return render_gamma_lammps_input( + conf, type_map, interaction, model_param, task_param + ) + + +def _render_elastic_input(conf, type_map, interaction, model_param, task_param=None): + from apex.core.property.Elastic.lammps.input import render_elastic_lammps_input + + return render_elastic_lammps_input( + conf, type_map, interaction, model_param, task_param + ) + + +def _render_phonon_input(conf, type_map, interaction, model_param, task_param=None): + from apex.core.property.Phonon.lammps.input import render_phonon_lammps_input + + return render_phonon_lammps_input( + conf, type_map, interaction, model_param, task_param + ) + + +def _finitetlatt_file_manifest(model_files, default_manifest): + from apex.core.property.FiniteTlatt.lammps import get_lammps_file_manifest + + return get_lammps_file_manifest(model_files, default_manifest) + + +def _eos_file_manifest(model_files, default_manifest): + from apex.core.property.EOS.lammps import get_lammps_file_manifest + + return get_lammps_file_manifest(model_files, default_manifest) + + +def _phonon_file_manifest(model_files, default_manifest): + from apex.core.property.Phonon.lammps import get_lammps_file_manifest + + return get_lammps_file_manifest(model_files, default_manifest) + + +def _eos_runtime_policy(default_policy): + from apex.core.property.EOS.lammps import get_lammps_runtime_policy + + return get_lammps_runtime_policy(default_policy) + + +PROPERTY_LAMMPS_INPUT_RENDERERS = { + "elastic": _render_elastic_input, + "finite_t_latt": _render_finitetlatt_input, + "gamma": _render_gamma_input, + "gamma_surface": _render_gamma_input, + "phonon": _render_phonon_input, +} + +PROPERTY_LAMMPS_FILE_MANIFESTS = { + "eos": _eos_file_manifest, + "finite_t_latt": _finitetlatt_file_manifest, + "phonon": _phonon_file_manifest, +} + +PROPERTY_LAMMPS_RUNTIME_POLICIES = { + "eos": _eos_runtime_policy, +} + + +def _apply_gamma_fix_to_lammps_input(contents, add_fix): + fix_dict = {"true": "0", "false": "NULL"} + add_fix_str = ( + "fix 1 all setforce" + + " " + + fix_dict[add_fix[0]] + + " " + + fix_dict[add_fix[1]] + + " " + + fix_dict[add_fix[2]] + + "\n" + ) + lines = contents.splitlines(keepends=True) + lower_id = None + upper_id = None + for idx, line in enumerate(lines): + if "min_style cg" in line: + lower_id = idx + elif line.split()[:4] == ["variable", "N", "equal", "count(all)"]: + upper_id = idx + break + if lower_id is None or upper_id is None: + return contents + del lines[lower_id + 1 : upper_id - 1] + lines.insert(lower_id + 1, add_fix_str) + return "".join(lines) + + class Lammps(Task): def __init__(self, inter_parameter, path_to_poscar): self.inter = inter_parameter @@ -281,17 +386,50 @@ def make_input_file(self, output_dir, task_type, task_param): else: raise RuntimeError("not supported calculation setting for LAMMPS") + elif task_type in ["annealing", "Annealing"]: + # MD annealing schedule: equilibrate -> ramp -> hold -> cool + fc = lammps_utils.make_lammps_annealing( + "conf.lmp", + self.type_map, + self.inter_func, + self.model_param, + cal_setting, + ) + elif cal_type == "static": fc = lammps_utils.make_lammps_eval( "conf.lmp", self.type_map, self.inter_func, self.model_param ) + elif cal_type == "npt+ave/time": + fc = lammps_utils.make_lammps_FiniteTlatt( + "conf.lmp", + self.type_map, + self.inter_func, + self.model_param, + cal_setting, + ) + elif cal_type == "finite_t_elastic": + fc = lammps_utils.make_lammps_FiniteTelastic( + "conf.lmp", + self.type_map, + self.inter_func, + self.model_param, + output_dir, + ) else: raise RuntimeError("not supported calculation type for LAMMPS") + if ( + prop_type in {"gamma", "gamma_surface"} + and cal_type == "relaxation" + and "add_fix" in task_param + ): + fc = _apply_gamma_fix_to_lammps_input(fc, task_param["add_fix"]) + dumpfn(task_param, os.path.join(output_dir, "task.json"), indent=4) - in_lammps_not_link_list = ["eos"] + in_lammps_not_link_list = ["eos", "finite_t_elastic"] if task_type not in in_lammps_not_link_list: with open(os.path.join(output_dir, "../in.lammps"), "w") as fp: fp.write(fc) @@ -529,32 +667,78 @@ def _prepare_result_dict(self, atom_numbs, type_map_list, type_list, box, coord, return result_dict def forward_files(self, property_type="relaxation"): - if self.inter_type in MULTI_MODELS_INTER_TYPE: - return ["conf.lmp", "in.lammps"] + list(map(os.path.basename, self.model)) - elif property_type == "Lat_param_T": - return ["in.lammps", "variable_Lat_param_T.in", os.path.basename(self.model)] + model_files = list(map(os.path.basename, self.model)) if self.inter_type in MULTI_MODELS_INTER_TYPE else [os.path.basename(self.model)] + if property_type == "finite_t_latt": + return ["in.lammps", "variable_FiniteTlatt.in"] + model_files + elif property_type in ["annealing", "Annealing"]: + return ["in.lammps", "variable_Annealing.in"] + model_files + elif property_type == "finite_t_elastic": + return [ + "conf.lmp", + "in.lammps", + "variable_FiniteTelastic.in", + "deform_FiniteTelastic.in", + "output_FiniteTelastic.in", + "FiniteTelastic.json", + ] + model_files + elif self.inter_type in MULTI_MODELS_INTER_TYPE: + return ["conf.lmp", "in.lammps"] + model_files else: - return ["conf.lmp", "in.lammps", os.path.basename(self.model)] + return ["conf.lmp", "in.lammps"] + model_files def forward_common_files(self, property_type="relaxation"): + model_files = list(map(os.path.basename, self.model)) if self.inter_type in MULTI_MODELS_INTER_TYPE else [os.path.basename(self.model)] if property_type not in ["eos"]: - if self.inter_type in MULTI_MODELS_INTER_TYPE: - return ["in.lammps"] + list(map(os.path.basename, self.model)) - elif property_type == "Lat_param_T": - return ["in.lammps", "variable_Lat_param_T.in", os.path.basename(self.model)] + if property_type == "finite_t_latt": + return ["in.lammps", "variable_FiniteTlatt.in"] + model_files + elif property_type in ["annealing", "Annealing"]: + return ["in.lammps", "variable_Annealing.in"] + model_files + elif property_type == "finite_t_elastic": + return model_files + elif self.inter_type in MULTI_MODELS_INTER_TYPE: + return ["in.lammps"] + model_files else: - return ["in.lammps", os.path.basename(self.model)] + return ["in.lammps"] + model_files else: - if self.inter_type in MULTI_MODELS_INTER_TYPE: - return list(map(os.path.basename, self.model)) - else: - return [os.path.basename(self.model)] + return model_files def backward_files(self, property_type="relaxation"): + debug_files = ["apex_task_status.json", ".debug.log", ".debug.stdout", ".debug.stderr"] if property_type == "phonon": - return ["outlog", "FORCE_CONSTANTS"] - elif property_type == "Lat_param_T": - return ["log.lammps", "outlog", "dump.relax", "average_box.txt"] + return ["outlog"] + debug_files + ["FORCE_CONSTANTS"] + elif property_type == "gruneisen": + return [ + "log.lammps", + "outlog", + *debug_files, + "dump.relax", + "FORCE_CONSTANTS", + "mesh.yaml", + "band.yaml", + "phonopy.yaml", + ] + elif property_type == "finite_t_latt": + return ["log.lammps", "outlog"] + debug_files + ["dump.relax", "average_box.txt"] + elif property_type in ["annealing", "Annealing"]: + return [ + "log.lammps", + "outlog", + *debug_files, + "dump.anneal_ramp", + "dump.anneal_cool", + "heating_interval.dat", + "cooling_interval.dat", + "rdf_ramp.dat", + "rdf_cool.dat", + "restart.*", + ] + elif property_type == "finite_t_elastic": + return [ + "log.lammps", + "outlog", + *debug_files, + "dump.relax", + "stress_timeseries.txt", + ] else: - return ["log.lammps", "outlog", "dump.relax"] - + return ["log.lammps", "outlog"] + debug_files + ["dump.relax"] diff --git a/apex/core/calculator/VASP.py b/apex/core/calculator/VASP.py index a19d1900..8242e863 100644 --- a/apex/core/calculator/VASP.py +++ b/apex/core/calculator/VASP.py @@ -79,7 +79,7 @@ def make_input_file(self, output_dir, task_type, task_param): # revise INCAR based on the INCAR provided in the "interaction" else: approach = None - if prop_type == "phonon": + if prop_type in {"phonon", "gruneisen"}: approach = task_param.get("approach") logging.info(f"No specification of INCAR for {prop_type} calculation, will auto-generate") if approach == "linear": @@ -245,8 +245,7 @@ def forward_common_files(self, property_type="relaxation"): return ["INCAR", "POTCAR"] def backward_files(self, property_type="relaxation"): - if property_type == "phonon": + if property_type in {"phonon", "gruneisen"}: return ["OUTCAR", "outlog", "CONTCAR", "OSZICAR", "XDATCAR", "vasprun.xml"] else: return ["OUTCAR", "outlog", "CONTCAR", "OSZICAR", "XDATCAR"] - diff --git a/apex/core/calculator/lib/abacus_utils.py b/apex/core/calculator/lib/abacus_utils.py index e97c899e..4453a9f5 100644 --- a/apex/core/calculator/lib/abacus_utils.py +++ b/apex/core/calculator/lib/abacus_utils.py @@ -253,6 +253,7 @@ def poscar2stru(poscar, inter_param, stru): - deepks_desc: a string of deepks descriptor file - stru: output filename, usally is 'STRU' """ + stru_path = os.path.abspath(stru) stru = dpdata.System(poscar, fmt="vasp/poscar") stru_data = stru.data atom_mass = [] @@ -292,9 +293,10 @@ def poscar2stru(poscar, inter_param, stru): if "deepks_desc" in inter_param: deepks_desc = "./pp_orb/%s\n" % inter_param["deepks_desc"] + os.makedirs(os.path.dirname(stru_path) or ".", exist_ok=True) stru.to( "stru", - "STRU", + stru_path, mass=atom_mass, pp_file=pseudo, numerical_orbital=orb, @@ -535,4 +537,3 @@ def append_orb_file_to_stru(stru, orb: dict = None, prefix: str = ""): with open(stru, 'w') as fout: fout.write(all_string_new) - diff --git a/apex/core/calculator/lib/lammps_utils.py b/apex/core/calculator/lib/lammps_utils.py index 0e640ca1..ca3e12d2 100644 --- a/apex/core/calculator/lib/lammps_utils.py +++ b/apex/core/calculator/lib/lammps_utils.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 +import json import os import re @@ -436,14 +437,25 @@ def make_lammps_elastic( ret += 'print "Final Stress (xx yy zz xy xz yz) = ${Pxx} ${Pyy} ${Pzz} ${Pxy} ${Pxz} ${Pyz}"\n' return ret -def make_lammps_Lat_param_T(conf, type_map, interaction, param): +def make_lammps_FiniteTlatt(conf, type_map, interaction, param, cal_setting=None): type_map_list = element_list(type_map) deepmd_version = param.get("deepmd_version", None) dump_step = 100 - # detour sychronizing problem of dumping in new version of deepmd-kit >=2.1.5 - tdamp = 100 + tdamp = "${tdamp}" + pdamp = "${pdamp}" + thermostat = "nose_hoover" + ensemble = "isothermal" + velocity_seed = 12345 + if cal_setting is not None: + dump_step = int(cal_setting.get("dump_step", dump_step)) + tdamp = cal_setting.get("tdamp", tdamp) + pdamp = cal_setting.get("pdamp", pdamp) + thermostat = cal_setting.get("thermostat", thermostat) + ensemble = cal_setting.get("ensemble", ensemble) + velocity_seed = cal_setting.get("velocity_seed", velocity_seed) + ret = "" - ret += "include variable_Lat_param_T.in\n" + ret += "include variable_FiniteTlatt.in\n" ret += "clear\n" ret += "units metal\n" ret += "dimension 3\n" @@ -458,22 +470,36 @@ def make_lammps_Lat_param_T(conf, type_map, interaction, param): ret += interaction(param) ret += "compute mype all pe\n" ret += "thermo 100\n" - ret += ( - "thermo_style custom step pe pxx pyy pzz pxy pxz pyz lx ly lz vol c_mype\n" - ) - ret += "velocity all create ${temperature} 12345 mom yes rot yes dist gaussian\n" - ret += f"fix 1 all npt temp ${{temperature}} ${{temperature}} {tdamp} x 1.0 1.0 1000 y 1.0 1.0 1000 xy 1.0 1.0 1000\n" + ret += ("thermo_style custom step pe pxx pyy pzz pxy pxz pyz lx ly lz vol c_mype\n") + + ret += f"velocity all create ${{temperature}} {int(velocity_seed)} mom yes rot yes dist gaussian\n" + + if ensemble == "adiabatic": + ret += f"fix 1 all nph aniso 1.0 1.0 {pdamp} drag 1.0\n" + elif thermostat == "langevin": + ret += f"fix 1 all nph aniso 1.0 1.0 {pdamp} drag 1.0\n" + ret += f"fix 5 all langevin ${{temperature}} ${{temperature}} {tdamp} {int(velocity_seed)}\n" + else: + ret += ( + f"fix 1 all npt temp ${{temperature}} ${{temperature}} {tdamp} " + f"aniso 0.0 0.0 {pdamp}\n" + ) + ret += "run ${equi_step}\n" ret += "reset_timestep 0 \n" + + # Sampling stage ret += f"dump 1 all custom {dump_step} dump.relax id type xs ys zs fx fy fz\n" ret += "variable lx equal lx \n" ret += "variable ly equal ly \n" ret += "variable lz equal lz \n" ret += "fix 2 all ave/time ${N_every} ${N_repeat} ${N_freq} v_lx v_ly v_lz ave running file average_box.txt\n" ret += "run ${ave_step} \n" + + # Final log summaries ret += "variable N equal count(all)\n" ret += "variable V equal vol\n" - ret += "variable E equal \"c_mype\"\n" + ret += 'variable E equal "c_mype"\n' ret += "variable tmplx equal lx\n" ret += "variable tmply equal ly\n" ret += "variable Pxx equal pxx\n" @@ -485,13 +511,109 @@ def make_lammps_Lat_param_T(conf, type_map, interaction, param): ret += "variable Epa equal ${E}/${N}\n" ret += "variable Vpa equal ${V}/${N}\n" ret += "variable AA equal (${tmplx}*${tmply})\n" + ret += 'print "All done"\n' + ret += 'print "Total number of atoms = ${N}"\n' + ret += 'print "Final energy per atoms = ${Epa}"\n' + ret += 'print "Final volume per atoms = ${Vpa}"\n' + ret += 'print "Final Base area = ${AA}"\n' + ret += 'print "Final Stress (xx yy zz xy xz yz) = ${Pxx} ${Pyy} ${Pzz} ${Pxy} ${Pxz} ${Pyz}"\n' + ret += 'print "Final Length (box_x box_y box_z) = ${lx} ${ly} ${lz}"\n' + return ret + +def make_lammps_FiniteTelastic(conf, type_map, interaction, param, task_dir="."): + type_map_list = element_list(type_map) + metadata_path = os.path.join(task_dir, "FiniteTelastic.json") + with open(metadata_path, "r") as fp: + metadata = json.load(fp) + + role = metadata["role"] + if role not in ["equi", "reference", "strained"]: + raise RuntimeError(f"unsupported FiniteTelastic role {role}") + + def setup_from_data(): + text = "" + text += "clear\n" + text += "include variable_FiniteTelastic.in\n" + text += "units metal\n" + text += "dimension 3\n" + text += "boundary p p p\n" + text += "atom_style atomic\n" + if param["type"] == "mace": + text += "atom_modify map yes\n" + text += "newton on\n" + text += "box tilt large\n" + text += "read_data %s\n" % conf + text += "replicate ${nx} ${ny} ${nz}\n" + return text + + def setup_from_restart(): + text = "" + text += "clear\n" + text += "include variable_FiniteTelastic.in\n" + text += "units metal\n" + text += "dimension 3\n" + text += "boundary p p p\n" + text += "atom_style atomic\n" + if param["type"] == "mace": + text += "atom_modify map yes\n" + text += "newton on\n" + text += "box tilt large\n" + text += "read_restart ${restart_source}\n" + return text + + def force_field_setup(): + text = "" + for ii in range(len(type_map)): + text += "mass %d %.3f\n" % (ii + 1, Element(type_map_list[ii]).mass) + text += "neigh_modify every 1 delay 0 check no\n" + text += interaction(param) + text += "compute mype all pe\n" + text += "thermo ${stress_output_every}\n" + text += ( + "thermo_style custom step pe pxx pyy pzz pxy pxz pyz lx ly lz vol c_mype\n" + ) + text += "timestep ${timestep}\n" + return text + + ret = setup_from_data() + ret += force_field_setup() + ret += "velocity all create ${temperature} ${seed} mom yes rot yes dist gaussian\n" + ret += "dump 1 all custom ${stress_output_every} dump.relax id type xs ys zs fx fy fz\n" + if role == "equi": + ret += "include output_FiniteTelastic.in\n" + ret += "fix 1 all npt temp ${temperature} ${temperature} ${tdamp} aniso 0.0 0.0 ${pdamp}\n" + ret += "run ${equi_step}\n" + ret += "write_restart ${equi_restart}\n" + + if role in ["reference", "strained"]: + ret += setup_from_restart() + ret += force_field_setup() + ret += "change_box all triclinic\n" + ret += "velocity all create ${temperature} ${seed} mom yes rot yes dist gaussian\n" + ret += "include deform_FiniteTelastic.in\n" + ret += "reset_timestep 0\n" + ret += "dump 1 all custom ${stress_output_every} dump.relax id type xs ys zs fx fy fz\n" + ret += "include output_FiniteTelastic.in\n" + ret += "fix 1 all nve\n" + ret += "fix 2 all langevin ${temperature} ${temperature} ${tdamp} ${seed} zero yes\n" + ret += "run ${response_step}\n" + + ret += "variable N equal count(all)\n" + ret += "variable V equal vol\n" + ret += "variable E equal \"c_mype\"\n" + ret += "variable Pxx equal pxx\n" + ret += "variable Pyy equal pyy\n" + ret += "variable Pzz equal pzz\n" + ret += "variable Pxy equal pxy\n" + ret += "variable Pxz equal pxz\n" + ret += "variable Pyz equal pyz\n" + ret += "variable Epa equal ${E}/${N}\n" + ret += "variable Vpa equal ${V}/${N}\n" ret += "print \"All done\"\n" ret += "print \"Total number of atoms = ${N}\"\n" ret += "print \"Final energy per atoms = ${Epa}\"\n" ret += "print \"Final volume per atoms = ${Vpa}\"\n" - ret += "print \"Final Base area = ${AA}\"\n" ret += "print \"Final Stress (xx yy zz xy xz yz) = ${Pxx} ${Pyy} ${Pzz} ${Pxy} ${Pxz} ${Pyz}\"\n" - ret += "print \"Final Length (box_x box_y box_z) = ${lx} ${ly} ${lz}\"\n" return ret def make_lammps_press_relax( @@ -567,6 +689,124 @@ def make_lammps_press_relax( ret += 'print "Final Stress (xx yy zz xy xz yz) = ${Pxx} ${Pyy} ${Pzz} ${Pxy} ${Pxz} ${Pyz}"\n' return ret +def make_lammps_annealing(conf, type_map, interaction, param, cal_setting): + """LAMMPS input for annealing: equilibrate -> heat (ramp) -> optional hold -> cool. + + Uses variables provided by `variable_Annealing.in` in the task directory. + - thermostat: nose_hoover | langevin + - ensemble: for nose_hoover: npt|nvt; for langevin: nph|nve (barostat on/off) + """ + + type_map_list = element_list(type_map) + dump_step = int(cal_setting.get("dump_step", 1000)) + tdamp = cal_setting.get("tdamp", 100) + pdamp = cal_setting.get("pdamp", 1000) + thermostat = cal_setting.get("thermostat", "nose_hoover") + ensemble = cal_setting.get("ensemble", "npt") + vseed = int(cal_setting.get("velocity_seed", 12345)) + + ret = "" + ret += "include variable_Annealing.in\n" + ret += "clear\n" + ret += "units \tmetal\n" + ret += "dimension\t3\n" + ret += "boundary\tp p p\n" + ret += "atom_style\tatomic\n" + ret += "box tilt large\n" + ret += "read_data %s\n" % conf + ret += "replicate ${nx} ${ny} ${nz}\n" + for ii in range(len(type_map)): + ret += "mass %d %.3f\n" % (ii + 1, Element(type_map_list[ii]).mass) + ret += "neigh_modify every 1 delay 0 check no\n" + ret += interaction(param) + ret += "compute mype all pe\n" + ret += "thermo 100\n" + ret += ("thermo_style custom step temp pe pxx pyy pzz pxy pxz pyz lx ly lz vol c_mype\n") + ret += "timestep ${timestep}\n" + ret += "variable N equal count(all)\n" + ret += "variable V equal vol\n" + ret += "variable Vatom equal v_V/count(all)\n" + ret += "variable Temp equal temp\n" + ret += "variable pote equal c_mype\n" + ret += "variable Etotal equal etotal\n" + ret += "variable Press equal press\n" + ret += "variable stepVal equal step\n" + ret += "compute myRDF all rdf ${rdf_bins} cutoff ${rdf_cutoff}\n" + + # Initialize velocities and equilibrate at start_temp + ret += f"velocity all create ${{start_temp}} {vseed} mom yes rot yes dist gaussian\n" + + if thermostat == "langevin": + # Langevin + barostat (nph) or without (nve) + if ensemble == "nve": + ret += "fix 1 all nve\n" + else: + ret += f"fix 1 all nph aniso 0.0 0.0 {pdamp} drag 1.0\n" + ret += f"fix tg all langevin ${{start_temp}} ${{start_temp}} {tdamp} {vseed}\n" + else: + # Nose-Hoover NPT or NVT + if ensemble == "nvt": + ret += f"fix 1 all nvt temp ${{start_temp}} ${{start_temp}} {tdamp}\n" + else: + ret += f"fix 1 all npt temp ${{start_temp}} ${{start_temp}} {tdamp} x 0.0 0.0 {pdamp} y 0.0 0.0 {pdamp} z 0.0 0.0 {pdamp}\n" + + ret += "run ${equi_step}\n" + ret += "unfix 1\n" + if thermostat == "langevin": + ret += "unfix tg\n" + + # Temperature ramp to target_temp + if thermostat == "langevin": + if ensemble == "nve": + ret += "fix 1 all nve\n" + else: + ret += f"fix 1 all nph aniso 0.0 0.0 {pdamp} drag 1.0\n" + ret += f"fix tg all langevin ${{start_temp}} ${{target_temp}} {tdamp} {vseed}\n" + else: + if ensemble == "nvt": + ret += f"fix 1 all nvt temp ${{start_temp}} ${{target_temp}} {tdamp}\n" + else: + ret += f"fix 1 all npt temp ${{start_temp}} ${{target_temp}} {tdamp} x 0.0 0.0 {pdamp} y 0.0 0.0 {pdamp} z 0.0 0.0 {pdamp}\n" + ret += f"dump 1 all custom {dump_step} dump.anneal_ramp id type xs ys zs fx fy fz\n" + ret += "fix rdf_ramp all ave/time ${rdf_interval} 1 ${rdf_interval} c_myRDF[*] file rdf_ramp.dat mode vector\n" + ret += "fix heat_log all ave/time ${rdf_interval} 1 ${rdf_interval} v_stepVal v_N v_Temp v_Vatom v_pote v_Etotal v_Press file heating_interval.dat\n" + ret += "run ${ramp_step}\n" + ret += "unfix heat_log\n" + ret += "unfix rdf_ramp\n" + ret += "undump 1\n" + ret += "unfix 1\n" + if thermostat == "langevin": + ret += "unfix tg\n" + + # Optional hold at target_temp + ret += f'if "${{hold_step}} > 0" then "fix 1 all nvt temp ${{target_temp}} ${{target_temp}} {tdamp}" "run ${{hold_step}}" "unfix 1"\n' + + # Cool to end_temp + if thermostat == "langevin": + if ensemble == "nve": + ret += "fix 1 all nve\n" + else: + ret += f"fix 1 all nph aniso 0.0 0.0 {pdamp} drag 1.0\n" + ret += f"fix tg all langevin ${{target_temp}} ${{end_temp}} {tdamp} {vseed}\n" + else: + if ensemble == "nvt": + ret += f"fix 1 all nvt temp ${{target_temp}} ${{end_temp}} {tdamp}\n" + else: + ret += f"fix 1 all npt temp ${{target_temp}} ${{end_temp}} {tdamp} x 0.0 0.0 {pdamp} y 0.0 0.0 {pdamp} z 0.0 0.0 {pdamp}\n" + ret += f"dump 2 all custom {dump_step} dump.anneal_cool id type xs ys zs fx fy fz\n" + ret += "fix rdf_cool all ave/time ${rdf_interval} 1 ${rdf_interval} c_myRDF[*] file rdf_cool.dat mode vector\n" + ret += "fix cool_log all ave/time ${rdf_interval} 1 ${rdf_interval} v_stepVal v_N v_Temp v_Vatom v_pote v_Etotal v_Press file cooling_interval.dat\n" + ret += "run ${cool_step}\n" + ret += "unfix cool_log\n" + ret += "unfix rdf_cool\n" + ret += "undump 2\n" + ret += "unfix 1\n" + if thermostat == "langevin": + ret += "unfix tg\n" + + ret += 'print "All done"\n' + return ret + """ def make_lammps_phonon( conf, masses, interaction, param, etol=0, ftol=1e-10, maxiter=5000, maxeval=500000 @@ -687,4 +927,3 @@ def check_finished_new(fname, keyword): def check_finished(fname): with open(fname, "r") as fp: return "Total wall time:" in fp.read() - diff --git a/apex/core/common_equi.py b/apex/core/common_equi.py index 472ab3ee..b8f5473c 100644 --- a/apex/core/common_equi.py +++ b/apex/core/common_equi.py @@ -13,6 +13,7 @@ from apex.core.lib.dispatcher import make_submission from apex.core.mpdb import get_structure from apex.core.structure import StructureInfo +from apex.utils import apex_task_succeeded from dflow.python import upload_packages upload_packages.append(__file__) lammps_task_type = ['deepmd', 'eam_alloy', 'meam', 'eam_fs', 'meam_spline', 'snap', 'gap', 'rann', 'mace', 'nep'] @@ -61,11 +62,18 @@ def make_equi(confs, inter_param, relax_param): task_dirs = [] # make task directories like mp-xxx/relaxation/relax_task # if mp-xxx/exists then print a warning and exit. + rerun_finished = inter_param.get("rerun_finished", True) for ii in conf_dirs: crys_type = ii.split("/")[-1] logging.debug(f"crys_type: {crys_type}") - if "mp-" in crys_type and not os.path.exists(os.path.join(ii, "POSCAR")): + task_status_dir = os.path.join(ii, "relaxation", "relax_task") + if (not rerun_finished) and apex_task_succeeded(task_status_dir): + print(f"Skip generating relaxation tasks for {ii} (apex_task_status.json state=succeeded, rerun_finished=False)") + continue + + has_abacus_stru = inter_param["type"] == "abacus" and os.path.exists(os.path.join(ii, "STRU")) + if "mp-" in crys_type and not os.path.exists(os.path.join(ii, "POSCAR")) and not has_abacus_stru: get_structure(crys_type).to("POSCAR", os.path.join(ii, "POSCAR")) if inter_param["type"] == "abacus" and not os.path.exists("STRU"): abacus_utils.poscar2stru( @@ -144,8 +152,13 @@ def run_equi(confs, inter_param, mdata): for ii in conf_dirs: work_path_list.append(os.path.join(ii, "relaxation")) all_task = [] + rerun_finished = inter_param.get("rerun_finished", True) for ii in work_path_list: - all_task.append(os.path.join(ii, "relax_task")) + task_dir = os.path.join(ii, "relax_task") + if (not rerun_finished) and apex_task_succeeded(task_dir): + print(f"Skip running relaxation for {task_dir} (apex_task_status.json state=succeeded, rerun_finished=False)") + continue + all_task.append(task_dir) run_tasks = all_task # dispatch the tasks @@ -195,6 +208,11 @@ def post_equi(confs, inter_param): for ii in task_dirs: poscar = os.path.join(ii, "POSCAR") inter = make_calculator(inter_param, poscar) + rerun_finished = inter_param.get("rerun_finished", True) + result_json_path = os.path.join(ii, "result.json") + if (not rerun_finished) and os.path.isfile(result_json_path) and apex_task_succeeded(ii): + print(f"Skip post-processing {ii} (result exists and apex_task_status.json state=succeeded, rerun_finished=False)") + continue res = inter.compute(ii) contcar = os.path.join(ii, "CONTCAR") try: @@ -223,6 +241,3 @@ def post_equi(confs, inter_param): dumpfn(struct_info_dict, os.path.join(ii, "structure.json"), indent=4) dumpfn(res, os.path.join(ii, "result.json"), indent=4) - - - diff --git a/apex/core/common_prop.py b/apex/core/common_prop.py index 62e346e0..f0d281c7 100644 --- a/apex/core/common_prop.py +++ b/apex/core/common_prop.py @@ -6,17 +6,28 @@ from apex.core.calculator.calculator import make_calculator from apex.core.property.Elastic import Elastic from apex.core.property.EOS import EOS +from apex.core.property.Cohesive import Cohesive from apex.core.property.Gamma import Gamma from apex.core.property.Interstitial import Interstitial from apex.core.property.Surface import Surface from apex.core.property.Vacancy import Vacancy from apex.core.property.Phonon import Phonon -from apex.core.property.DecohesionEnergy import DecohesionEnergy -from apex.core.property.Lat_param_T import Lat_param_T +from apex.core.property.Decohesive import Decohesive +from apex.core.property.FiniteTelastic import FiniteTelastic +from apex.core.property.FiniteTlatt import FiniteTlatt +from apex.core.property.GammaSurface import GammaSurface +from apex.core.property.Gruneisen import Gruneisen +from apex.core.property.Annealing import Annealing from apex.core.lib.utils import create_path from apex.core.lib.util import collect_task from apex.core.lib.dispatcher import make_submission -from apex.utils import sepline, get_task_type, handle_prop_suffix +from apex.utils import ( + sepline, + get_task_type, + handle_prop_suffix, + apex_task_succeeded, + all_apex_task_status_succeeded, +) from dflow.python import upload_packages upload_packages.append(__file__) @@ -29,6 +40,8 @@ def make_property_instance(parameters, inter_param): prop_type = parameters["type"] if prop_type == "eos": return EOS(parameters, inter_param) + elif prop_type == "cohesive": + return Cohesive(parameters, inter_param) elif prop_type == "elastic": return Elastic(parameters, inter_param) elif prop_type == "vacancy": @@ -39,12 +52,23 @@ def make_property_instance(parameters, inter_param): return Surface(parameters, inter_param) elif prop_type == "gamma": return Gamma(parameters, inter_param) + elif prop_type == "gamma_surface": + return GammaSurface(parameters, inter_param) elif prop_type == "phonon": return Phonon(parameters, inter_param) - elif prop_type == "DecohesionEnergy": - return DecohesionEnergy(parameters, inter_param) - elif prop_type == "Lat_param_T": - return Lat_param_T(parameters, inter_param) + elif prop_type == "decohesive": + return Decohesive(parameters, inter_param) + elif prop_type in ["finite_t_latt", "finitetlatt", "Lat_param_T"]: + if prop_type in ["finitetlatt", "Lat_param_T"]: + parameters = dict(parameters) + parameters["type"] = "finite_t_latt" + return FiniteTlatt(parameters, inter_param) + elif prop_type == "finite_t_elastic": + return FiniteTelastic(parameters, inter_param) + elif prop_type == "gruneisen": + return Gruneisen(parameters, inter_param) + elif prop_type in ["annealing", "Annealing"]: + return Annealing(parameters, inter_param) else: raise RuntimeError(f"unknown APEX type {prop_type}") @@ -71,7 +95,7 @@ def make_property(confs, inter_param, property_list): if not suffix: continue # generate working directory like mp-xxx/eos_00 if jj['type'] == 'eos' - # handel the exception that the working directory exists + # handle the exception that the working directory exists # determine the suffix: from scratch or refine property_type = jj["type"] @@ -81,6 +105,12 @@ def make_property(confs, inter_param, property_list): print("Skip mismatched structure") continue + rerun_finished = jj.get("rerun_finished", True) + if (not rerun_finished + and all_apex_task_status_succeeded(path_to_work)): + print(f"Skip generating property tasks for {path_to_work} (all apex_task_status.json state=succeeded)") + continue + create_path(path_to_work) inter_param_prop = jj.get("cal_setting", {}).get("overwrite_interaction", inter_param) @@ -156,6 +186,12 @@ def run_property(confs, inter_param, property_list, mdata): os.path.join(ii, property_type + "_" + suffix) ) + rerun_finished = jj.get("rerun_finished", True) + if (not rerun_finished + and all_apex_task_status_succeeded(path_to_work)): + print(f"Skip running property tasks for {path_to_work} (all apex_task_status.json state=succeeded)") + continue + work_path_list.append(path_to_work) tmp_task_list = glob.glob(os.path.join(path_to_work, "task.[0-9]*[0-9]")) tmp_task_list.sort() @@ -176,7 +212,12 @@ def run_property(confs, inter_param, property_list, mdata): task_type = get_task_type({"interaction": inter_param}) inter_type = inter_param_prop["type"] work_path = path_to_work - all_task = tmp_task_list + if rerun_finished: + all_task = tmp_task_list + else: + all_task = [task for task in tmp_task_list if not apex_task_succeeded(task)] + for task in sorted(set(tmp_task_list) - set(all_task)): + print(f"Skip completed property task {task} (apex_task_status.json state=succeeded, rerun_finished=False)") run_tasks = collect_task(all_task, inter_type) if len(run_tasks) == 0: continue @@ -238,8 +279,16 @@ def post_property(confs, inter_param, property_list): except KeyError: pass dumpfn(param_dict, param_json) - prop.compute( - os.path.join(path_to_work, "result.json"), - os.path.join(path_to_work, "result.out"), - path_to_work - ) + rerun_finished = jj.get("rerun_finished", True) + result_json = os.path.join(path_to_work, "result.json") + result_out = os.path.join(path_to_work, "result.out") + result_exists = os.path.isfile(result_json) and os.path.isfile(result_out) + tasks_succeeded = all_apex_task_status_succeeded(path_to_work) + if rerun_finished or not (result_exists and tasks_succeeded): + prop.compute( + result_json, + result_out, + path_to_work + ) + else: + print(f"Skip post processing property results at {path_to_work} (results exist and all apex_task_status.json state=succeeded)") diff --git a/apex/core/constants.py b/apex/core/constants.py index 98abf14e..cc39aa04 100644 --- a/apex/core/constants.py +++ b/apex/core/constants.py @@ -12,3 +12,45 @@ "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og" ] + +METALLIC_RADII_ANGSTROM = { + "Al": 1.43, + "Co": 1.25, + "Cr": 1.28, + "Fe": 1.26, + "Mn": 1.27, + "Ni": 1.24, + "Ti": 1.47, + "V": 1.34, + "Cu": 1.28, + "Zn": 1.33, + "Mo": 1.39, + "Nb": 1.46, + "W": 1.39, + "Ta": 1.46, + "Zr": 1.60, + "Hf": 1.58, + "Ga": 1.35, + "Ge": 1.25, + "Pd": 1.37, + "Pt": 1.39, + "Ag": 1.44, + "Au": 1.44, + "Mg": 1.60, + "Ca": 1.97, + "Si": 1.11, + "B": 0.85, + "C": 0.70, + "N": 0.65, + "O": 0.60, +} + +DEFAULT_HCP_C_OVER_A = 1.633 +DEFAULT_L10_C_OVER_A = 1.0 + + +def get_metallic_radius(symbol: str) -> float: + """Return a metallic-radius-like heuristic in angstrom for lattice initialization.""" + if symbol not in METALLIC_RADII_ANGSTROM: + raise KeyError(f"No metallic radius available for element: {symbol}") + return METALLIC_RADII_ANGSTROM[symbol] diff --git a/apex/core/lib/crys.py b/apex/core/lib/crys.py index 95028e0f..5807e4fa 100644 --- a/apex/core/lib/crys.py +++ b/apex/core/lib/crys.py @@ -1,55 +1,260 @@ +import math + import numpy as np +from apex.core.constants import ( + DEFAULT_HCP_C_OVER_A, + DEFAULT_L10_C_OVER_A, + get_metallic_radius, +) from pymatgen.core.lattice import Lattice from pymatgen.core.structure import Structure from dflow.python import upload_packages upload_packages.append(__file__) -def fcc(ele_name="ele", a=4.05): +PROTOTYPES = { + "bcc": { + "family": "cubic", + "coords": [[0, 0, 0], [0.5, 0.5, 0.5]], + "sublattice": ["all", "all"], + "default_species": ["ele", "ele"], + }, + "B2": { + "family": "cubic", + "coords": [[0, 0, 0], [0.5, 0.5, 0.5]], + "sublattice": ["corner", "body"], + "default_species": ["A", "B"], + }, + "fcc": { + "family": "cubic", + "coords": [[0, 0, 0], [0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]], + "sublattice": ["all", "all", "all", "all"], + "default_species": ["ele", "ele", "ele", "ele"], + }, + "L12": { + "family": "cubic", + "coords": [[0, 0, 0], [0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]], + "sublattice": ["corner", "face", "face", "face"], + "default_species": ["A", "B", "B", "B"], + }, + "hcp": { + "family": "hcp", + "coords": [[0, 0, 0], [1.0 / 3.0, 1.0 / 3.0, 0.5]], + "sublattice": ["all", "all"], + "default_species": ["ele", "ele"], + }, + "tetragonal": { + "family": "tetragonal", + "coords": [[0, 0, 0]], + "sublattice": ["all"], + "default_species": ["ele"], + }, + "L10": { + "family": "tetragonal", + "coords": [[0, 0, 0], [0.5, 0.5, 0.5]], + "sublattice": ["layer_A", "layer_B"], + "default_species": ["A", "B"], + }, +} + + +def _make_lattice(family, a, c=None): + if family == "cubic": + return Lattice.cubic(a) + if family == "tetragonal": + if c is None: + raise ValueError("c must be provided for tetragonal lattices") + return Lattice.tetragonal(a, c) + if family == "hcp": + if c is None: + raise ValueError("c must be provided for hcp lattices") + return Lattice.hexagonal(a, c) + raise ValueError(f"Unknown lattice family: {family}") + + +def _make_structure_from_prototype( + prototype, + a, + c=None, + species=None, + supercell=None, +): + if prototype not in PROTOTYPES: + raise ValueError(f"Unknown crystal prototype: {prototype}") + + proto = PROTOTYPES[prototype] + coords = proto["coords"] + sublattice = proto["sublattice"] + if species is None: + species = proto["default_species"] + species = list(species) + if len(species) != len(coords): + raise ValueError( + f"Prototype '{prototype}' requires {len(coords)} species, " + f"got {len(species)}" + ) + + lattice = _make_lattice(proto["family"], a, c=c) + site_properties = { + "sublattice": list(sublattice), + "prototype": [prototype] * len(coords), + "basis_index": list(range(len(coords))), + } + structure = Structure( + lattice, + species, + coords, + site_properties=site_properties, + ) + if supercell is not None: + structure.make_supercell(supercell) + return structure + + +def _resolve_ele_a(ele_name, a): + if ele_name is None: + return "ele", a + if isinstance(ele_name, (int, float, np.integer, np.floating)): + return "ele", float(ele_name) + return ele_name, a + + +def _resolve_ele_a_c(ele_name, a, c, default_a, default_c): + if ele_name is None: + return "ele", a, c + if isinstance(ele_name, (int, float, np.integer, np.floating)): + if a != default_a and c == default_c: + return "ele", float(ele_name), a + return "ele", float(ele_name), c + return ele_name, a, c + + +def _make_legacy_fcc(ele_name, a, supercell=None): box = np.array([[0.0, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0]]) box *= a - return Structure(box, [ele_name], [[0, 0, 0]]) + structure = Structure( + box, + [ele_name], + [[0, 0, 0]], + site_properties={ + "sublattice": ["all"], + "prototype": ["fcc"], + "basis_index": [0], + }, + ) + if supercell is not None: + structure.make_supercell(supercell) + return structure + + +def fcc(ele_name=None, a=3.6, supercell=None): + """Return a conventional fcc Structure with single-sublattice labels.""" + if isinstance(ele_name, str): + return _make_legacy_fcc(ele_name, a, supercell=supercell) + if ele_name is None: + ele_name = "ele" + else: + ele_name, a = _resolve_ele_a(ele_name, a) + return _make_structure_from_prototype( + "fcc", + a, + species=[ele_name] * len(PROTOTYPES["fcc"]["coords"]), + supercell=supercell, + ) def fcc1(ele_name="ele", a=4.05): - latt = Lattice.cubic(a) - return Structure( - latt, - [ele_name] * 4, - [[0, 0, 0], [0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]] + """Return a conventional fcc Structure.""" + return _make_structure_from_prototype( + "fcc", + a, + species=[ele_name] * len(PROTOTYPES["fcc"]["coords"]), ) def sc(ele_name="ele", a=2.551340126037118): + if ele_name is None: + ele_name = "ele" latt = Lattice.cubic(a) return Structure(latt, [ele_name], [[0, 0, 0]]) -def bcc(ele_name="ele", a=3.2144871302356037): - latt = Lattice.cubic(a) - return Structure( - latt, - [ele_name] * 2, - [[0, 0, 0], [0.5, 0.5, 0.5]] +def bcc(ele_name="ele", a=3.0, supercell=None): + """Return a bcc Structure with single-sublattice labels.""" + ele_name, a = _resolve_ele_a(ele_name, a) + return _make_structure_from_prototype( + "bcc", + a, + species=[ele_name] * len(PROTOTYPES["bcc"]["coords"]), + supercell=supercell, ) def hcp( - ele_name="ele", a=4.05 / np.sqrt(2), c=4.05 / np.sqrt(2) * 2.0 * np.sqrt(2.0 / 3.0) + ele_name="ele", + a=3.0, + c=4.9, + supercell=None, ): - box = np.array([[1, 0, 0], [0.5, 0.5 * np.sqrt(3), 0], [0, 0, 1]]) - box[0] *= a - box[1] *= a - box[2] *= c - latt = Lattice(box) - return Structure( - latt, [ele_name] * 2, [[0, 0, 0], [1.0 / 3, 1.0 / 3, 1.0 / 2]] + """Return an hcp Structure with single-sublattice labels.""" + ele_name, a, c = _resolve_ele_a_c(ele_name, a, c, 3.0, 4.9) + return _make_structure_from_prototype( + "hcp", + a, + c=c, + species=[ele_name] * len(PROTOTYPES["hcp"]["coords"]), + supercell=supercell, + ) + + +def tetragonal(ele_name="ele", a=3.0, c=3.0, supercell=None): + """Return a simple tetragonal Structure with single-sublattice labels.""" + ele_name, a, c = _resolve_ele_a_c(ele_name, a, c, 3.0, 3.0) + return _make_structure_from_prototype( + "tetragonal", + a, + c=c, + species=[ele_name] * len(PROTOTYPES["tetragonal"]["coords"]), + supercell=supercell, + ) + + +def B2(a=3.0, species=("A", "B"), supercell=None): + """Return a B2 ordered-alloy Structure with corner/body sublattices.""" + return _make_structure_from_prototype( + "B2", + a, + species=species, + supercell=supercell, + ) + + +def L12(a=3.6, species=("A", "B", "B", "B"), supercell=None): + """Return an L12 ordered-alloy Structure with corner/face sublattices.""" + return _make_structure_from_prototype( + "L12", + a, + species=species, + supercell=supercell, + ) + + +def L10(a=3.8, c=3.6, species=("A", "B"), supercell=None): + """Return an L10 ordered-alloy Structure with alternating layer sublattices.""" + return _make_structure_from_prototype( + "L10", + a, + c=c, + species=species, + supercell=supercell, ) def dhcp( ele_name="ele", a=4.05 / np.sqrt(2), c=4.05 / np.sqrt(2) * 4.0 * np.sqrt(2.0 / 3.0) ): + if ele_name is None: + ele_name = "ele" box = np.array([[1, 0, 0], [0.5, 0.5 * np.sqrt(3), 0], [0, 0, 1]]) box[0] *= a box[1] *= a @@ -68,6 +273,8 @@ def dhcp( def diamond(ele_name="ele", a=2.551340126037118): + if ele_name is None: + ele_name = "ele" box = np.array([[0.0, 1.0, 1.0], [1.0, 0.0, 1.0], [1.0, 1.0, 0.0]]) box *= a latt = Lattice(box) @@ -79,3 +286,235 @@ def diamond(ele_name="ele", a=2.551340126037118): [0.87500000000000, 0.87500000000000, 0.87500000000000] ] ) + + +def _weighted_average_radius(composition): + total = 0.0 + for element, fraction in composition.items(): + total += float(fraction) * get_metallic_radius(element) + return total + + +def estimate_lattice_constant(parent_type, compositions, c_over_a=None): + """Estimate lattice parameters from sublattice-weighted metallic radii. + + Returns: + dict: For cubic-like lattices: {"a": value} + For tetragonal / hcp: {"a": value, "c": value} + """ + ptype = str(parent_type) + + if ptype in {"bcc", "fcc", "hcp"}: + if "all" not in compositions: + raise ValueError(f"{ptype} requires an 'all' composition block") + r_all = _weighted_average_radius(compositions["all"]) + if ptype == "bcc": + a_value = 4.0 * r_all / math.sqrt(3.0) + return {"a": a_value} + if ptype == "fcc": + a_value = 2.0 * math.sqrt(2.0) * r_all + return {"a": a_value} + a_value = 2.0 * r_all + ratio = DEFAULT_HCP_C_OVER_A if c_over_a is None else float(c_over_a) + return {"a": a_value, "c": ratio * a_value} + + if ptype == "B2": + if "corner" not in compositions or "body" not in compositions: + raise ValueError("B2 requires 'corner' and 'body' composition blocks") + r_corner = _weighted_average_radius(compositions["corner"]) + r_body = _weighted_average_radius(compositions["body"]) + a_value = 2.0 * (r_corner + r_body) / math.sqrt(3.0) + return {"a": a_value} + + if ptype == "L12": + if "corner" not in compositions or "face" not in compositions: + raise ValueError("L12 requires 'corner' and 'face' composition blocks") + r_corner = _weighted_average_radius(compositions["corner"]) + r_face = _weighted_average_radius(compositions["face"]) + a_value = math.sqrt(2.0) * (r_corner + r_face) + return {"a": a_value} + + if ptype == "L10": + if "layer_A" not in compositions or "layer_B" not in compositions: + raise ValueError("L10 requires 'layer_A' and 'layer_B' composition blocks") + r_a = _weighted_average_radius(compositions["layer_A"]) + r_b = _weighted_average_radius(compositions["layer_B"]) + a_value = math.sqrt(2.0) * (r_a + r_b) + ratio = DEFAULT_L10_C_OVER_A if c_over_a is None else float(c_over_a) + return {"a": a_value, "c": ratio * a_value} + + if ptype == "tetragonal": + if "all" not in compositions: + raise ValueError("tetragonal requires an 'all' composition block") + r_all = _weighted_average_radius(compositions["all"]) + a_value = 2.0 * r_all + ratio = DEFAULT_L10_C_OVER_A if c_over_a is None else float(c_over_a) + return {"a": a_value, "c": ratio * a_value} + + raise ValueError( + "Unsupported parent lattice type for automatic lattice estimation: " + f"{ptype}" + ) + + +def _composition_rounding_error(total_sites, composition, normalizer=None): + if normalizer is None: + normalizer = total_sites + max_error = 0.0 + for fraction in composition.values(): + target = float(fraction) * total_sites + error = abs(target - round(target)) / normalizer + if error > max_error: + max_error = error + return max_error + + +def _iter_near_cubic_triplets(max_edge): + for nx in range(1, max_edge + 1): + for ny in range(nx, max_edge + 1): + for nz in range(ny, max_edge + 1): + yield nx, ny, nz + + +def _auto_supercell_atoms_per_cell(parent_type): + return { + "bcc": 2, + "fcc": 1, + "hcp": 2, + "tetragonal": 1, + "B2": 2, + "L12": 4, + "L10": 2, + }[parent_type] + + +def suggest_supercell( + parent_type, + compositions, + composition_tolerance=0.005, + shape_mode="near_cubic", + maximum_num_atoms=None, + maxmium_nums_atoms=None, + max_edge=24, +): + """Suggest a supercell from composition tolerance and shape preference.""" + ptype = str(parent_type) + if maximum_num_atoms is None and maxmium_nums_atoms is not None: + maximum_num_atoms = maxmium_nums_atoms + composition_tolerance = float(composition_tolerance) + max_edge = int(max_edge) + if maximum_num_atoms is not None: + maximum_num_atoms = int(maximum_num_atoms) + if maximum_num_atoms <= 0: + raise ValueError("maximum_num_atoms must be positive") + if composition_tolerance <= 0: + raise ValueError("composition_tolerance must be positive") + if max_edge <= 0: + raise ValueError("max_edge must be positive") + if shape_mode not in {"near_cubic", "xy_equal_z_free"}: + raise ValueError( + "shape_mode must be one of: 'near_cubic', 'xy_equal_z_free'" + ) + + if ptype in {"bcc", "fcc", "hcp", "tetragonal"}: + if "all" not in compositions: + raise ValueError(f"{ptype} requires an 'all' composition block") + blocks = {"all": compositions["all"]} + elif ptype == "B2": + if "corner" not in compositions or "body" not in compositions: + raise ValueError("B2 requires 'corner' and 'body' composition blocks") + blocks = { + "corner": compositions["corner"], + "body": compositions["body"], + } + elif ptype == "L12": + if "corner" not in compositions or "face" not in compositions: + raise ValueError("L12 requires 'corner' and 'face' composition blocks") + blocks = { + "corner": compositions["corner"], + "face": compositions["face"], + } + elif ptype == "L10": + if "layer_A" not in compositions or "layer_B" not in compositions: + raise ValueError("L10 requires 'layer_A' and 'layer_B' composition blocks") + blocks = { + "layer_A": compositions["layer_A"], + "layer_B": compositions["layer_B"], + } + else: + raise ValueError( + "Unsupported parent lattice type for automatic supercell suggestion: " + f"{ptype}" + ) + + c_min_values = [] + for block_composition in blocks.values(): + positive_fractions = [ + float(fraction) + for fraction in block_composition.values() + if float(fraction) > 0 + ] + if not positive_fractions: + raise ValueError("composition blocks must contain a positive fraction") + c_min_values.append(min(positive_fractions)) + n_min = max(math.ceil(1.0 / c_min) for c_min in c_min_values) + n_target = int(n_min * max(1.0, 0.5 / composition_tolerance)) + atoms_per_cell = _auto_supercell_atoms_per_cell(ptype) + + best_triplet = None + best_rank = None + fallback_triplet = None + fallback_rank = None + + for nx, ny, nz in _iter_near_cubic_triplets(max_edge): + n_cells = nx * ny * nz + if ( + maximum_num_atoms is not None + and n_cells * atoms_per_cell > maximum_num_atoms + ): + continue + + per_block_errors = [] + for block_name, block_composition in blocks.items(): + if ptype == "L12" and block_name == "face": + total_sites = 3 * n_cells + elif ptype in {"bcc", "hcp"} and block_name == "all": + total_sites = 2 * n_cells + else: + total_sites = n_cells + per_block_errors.append( + _composition_rounding_error( + total_sites, + block_composition, + normalizer=n_cells, + ) + ) + + composition_error = max(per_block_errors) + if shape_mode == "near_cubic": + shape_penalty = nz - nx + else: + shape_penalty = abs(nx - ny) + rank = (composition_error, shape_penalty, n_cells) + + fallback = rank + (nz, ny, nx) + if fallback_rank is None or fallback < fallback_rank: + fallback_rank = fallback + fallback_triplet = [nx, ny, nz] + + if n_cells < n_target: + continue + + if best_rank is None or rank < best_rank: + best_rank = rank + best_triplet = [nx, ny, nz] + + if composition_error < composition_tolerance and shape_penalty == 0: + return best_triplet + + if fallback_triplet is None: + raise ValueError( + "No automatic supercell candidate fits maximum_num_atoms=" + f"{maximum_num_atoms}" + ) + return best_triplet if best_triplet is not None else fallback_triplet diff --git a/apex/core/lib/mfp_eosfit.py b/apex/core/lib/mfp_eosfit.py index cf32fb66..eb7ba523 100644 --- a/apex/core/lib/mfp_eosfit.py +++ b/apex/core/lib/mfp_eosfit.py @@ -10,7 +10,6 @@ import numpy as np import scipy.integrate as INT from scipy.interpolate import * -from scipy.misc import derivative from scipy.optimize import curve_fit, fsolve, leastsq, minimize, root from dflow.python import upload_packages upload_packages.append(__file__) @@ -1319,6 +1318,14 @@ def read_velp(fin, fstart, fend): def init_guess(fin): v, e = read_ve(fin) + return init_guess_from_data(v, e) + + +def init_guess_from_data(volumes, energies): + v = np.asarray(volumes, dtype=float) + e = np.asarray(energies, dtype=float) + if len(v) < 3: + raise ValueError("at least 3 volume-energy points are required for EOS fitting") a, b, c = np.polyfit(v, e, 2) # this comes from pylab # initial guesses. v0 = np.abs(-b / (2 * a)) @@ -1330,6 +1337,75 @@ def init_guess(fin): return x0 +def fit_birch_murnaghan(volumes, energies, fixed_bp=None): + """Fit Birch-Murnaghan E(V) data without writing plot or data files.""" + vol = np.asarray(volumes, dtype=float) + en = np.asarray(energies, dtype=float) + if vol.shape != en.shape: + raise ValueError("volumes and energies must have the same shape") + if len(vol) < 3: + raise ValueError("at least 3 volume-energy points are required for EOS fitting") + if fixed_bp is None and len(vol) < 4: + raise ValueError("free-B0-prime Birch-Murnaghan fitting requires at least 4 points") + if np.any(vol <= 0.0): + raise ValueError("EOS volumes must be positive") + + order = np.argsort(vol) + vol = vol[order] + en = en[order] + p0 = init_guess_from_data(vol, en) + + if fixed_bp is None: + fit_func = "birch" + initial = p0[:4] + + def residual(pars, y, x): + return y - birch(x, pars) + + fit_variant = "free_bp" + else: + fit_func = "birch_fixed_bp" + initial = [p0[0], p0[1], p0[3]] + bp = float(fixed_bp) + + def residual(pars, y, x): + full_pars = [pars[0], pars[1], bp, pars[2]] + return y - birch(x, full_pars) + + fit_variant = "fixed_bp" + + popt, pcov, infodict, mesg, ier = leastsq( + residual, + initial, + args=(en, vol), + full_output=1, + maxfev=(len(initial) + 1) * 400, + ) + if ier not in [1, 2, 3, 4]: + raise RuntimeError("Optimal parameters not found: " + mesg) + + if fixed_bp is None: + e0, b0, bp, v0 = [float(value) for value in popt] + else: + e0, b0, v0 = [float(value) for value in popt] + bp = float(fixed_bp) + + residuals = residual(popt, en, vol) + return { + "model": "birch_murnaghan", + "fit_function": fit_func, + "fit_variant": fit_variant, + "E0_eV": e0, + "B0_eV_per_A3": b0, + "K_T_eV_per_A3": b0, + "K_T_GPa": b0 * eV2GPa, + "B0_prime": bp, + "V0_A3": v0, + "residual_sum_squares": float(np.sum(residuals**2)), + "used_point_count": int(len(vol)), + } + + def repro_ve(func, vol_i, p): ndata = len(vol_i) eni = np.zeros(ndata) diff --git a/apex/core/lib/rss.py b/apex/core/lib/rss.py new file mode 100644 index 00000000..686c96ae --- /dev/null +++ b/apex/core/lib/rss.py @@ -0,0 +1,864 @@ +"""Random Solid Solution (RSS) generator for occupational disorder. + +Intended use: +- HEA/HEO/high-entropy intermetallic occupational disorder generation +- Decorating a parent lattice with target sublattice compositions +- Tuning short-range order with Warren-Cowley SRO targets +""" + +from __future__ import annotations + +import math +import random +import warnings +from collections import Counter +from itertools import combinations_with_replacement +from typing import Dict, List, Optional, Sequence, Tuple + +from pymatgen.core import Structure + +try: + from tqdm.auto import tqdm +except Exception: # pragma: no cover + tqdm = None + + +class RSSInputError(ValueError): + """Raised when RSS generator inputs are invalid.""" + + +def resolve_parent_lattice_auto( + parent_lattice: dict, + compositions: dict, + composition_tolerance: float = 0.005, + shape_mode: str = "near_cubic", + maximum_num_atoms=None, +) -> None: + """Resolve optional auto lattice parameters and supercell in-place.""" + from apex.core.lib.crys import estimate_lattice_constant, suggest_supercell + + if not parent_lattice: + return + + parent_type = parent_lattice["type"] + supported_auto_types = {"bcc", "fcc", "hcp", "tetragonal", "B2", "L12", "L10"} + if "species" not in parent_lattice: + if parent_type == "B2": + parent_lattice["species"] = [ + next(iter(compositions["corner"])), + next(iter(compositions["body"])), + ] + elif parent_type == "L12": + face_species = next(iter(compositions["face"])) + parent_lattice["species"] = [ + next(iter(compositions["corner"])), + face_species, + face_species, + face_species, + ] + elif parent_type == "L10": + parent_lattice["species"] = [ + next(iter(compositions["layer_A"])), + next(iter(compositions["layer_B"])), + ] + + should_resolve_a = ( + parent_lattice.get("a") == "auto" + or ("a" not in parent_lattice and parent_type in supported_auto_types) + or (parent_lattice.get("a") is None and parent_type in supported_auto_types) + ) + if should_resolve_a: + resolved_lattice = estimate_lattice_constant( + parent_type, + compositions, + c_over_a=parent_lattice.get("c_over_a"), + ) + parent_lattice["a"] = resolved_lattice["a"] + if ( + "c" in resolved_lattice + and ("c" not in parent_lattice or parent_lattice.get("c") == "auto") + ): + parent_lattice["c"] = resolved_lattice["c"] + + should_suggest_supercell = ( + parent_lattice.get("supercell") == "auto" + or ( + "supercell" not in parent_lattice + and parent_type in supported_auto_types + ) + or ( + parent_lattice.get("supercell") is None + and parent_type in supported_auto_types + ) + ) + if should_suggest_supercell: + parent_lattice["supercell"] = suggest_supercell( + parent_type, + compositions, + composition_tolerance=composition_tolerance, + shape_mode=shape_mode, + maximum_num_atoms=maximum_num_atoms, + ) + + +def _canonical_pair(a: str, b: str) -> Tuple[str, str]: + return (a, b) if a <= b else (b, a) + + +def _parse_pair_key(pair_key) -> Tuple[str, str]: + if isinstance(pair_key, (tuple, list)) and len(pair_key) == 2: + return _canonical_pair(str(pair_key[0]), str(pair_key[1])) + if isinstance(pair_key, str): + if "-" in pair_key: + left, right = pair_key.split("-", 1) + return _canonical_pair(left.strip(), right.strip()) + if ":" in pair_key: + left, right = pair_key.split(":", 1) + return _canonical_pair(left.strip(), right.strip()) + raise RSSInputError(f"Invalid species pair key: {pair_key}") + + +def _normalize_validate_compositions( + compositions: dict, + tol: float, + allow_vacancies: bool, +) -> Dict[str, Dict[str, float]]: + if not isinstance(compositions, dict) or not compositions: + raise RSSInputError("compositions must be a non-empty dict") + + normalized = {} + vacancy_aliases = {"vac", "vacancy", "x", "none"} + for sub_name, comp in compositions.items(): + if not isinstance(comp, dict) or not comp: + raise RSSInputError( + f"Composition for sublattice '{sub_name}' must be a non-empty dict" + ) + norm_comp = {} + total = 0.0 + for species, frac in comp.items(): + sp = str(species) + sp_lower = sp.lower() + try: + value = float(frac) + except (TypeError, ValueError): + raise RSSInputError( + f"Composition fraction for species '{sp}' must be numeric" + ) from None + if value < -tol: + raise RSSInputError( + f"Composition fraction for species '{sp}' must be non-negative" + ) + if abs(value) <= tol: + continue + if sp_lower in vacancy_aliases: + if not allow_vacancies: + raise RSSInputError( + "Vacancy-like species found but allow_vacancies is False" + ) + sp = "X" + norm_comp[sp] = value + total += value + if not norm_comp: + raise RSSInputError( + f"Composition for sublattice '{sub_name}' has no positive entries" + ) + if abs(total - 1.0) > tol: + raise RSSInputError( + f"Composition fractions for sublattice '{sub_name}' must sum to 1.0" + ) + normalized[str(sub_name)] = {k: v / total for k, v in norm_comp.items()} + return normalized + + +def _build_sublattice_indices( + structure: Structure, + compositions: Dict[str, Dict[str, float]], + sublattices: Optional[List[dict]], +) -> Dict[str, List[int]]: + nsites = len(structure) + if sublattices is None: + if set(compositions.keys()) != {"all"}: + raise RSSInputError( + "When sublattices is None, compositions must use single key 'all'" + ) + return {"all": list(range(nsites))} + + if not isinstance(sublattices, list) or not sublattices: + raise RSSInputError("sublattices must be a non-empty list when provided") + + sub_map = {} + seen = set() + for item in sublattices: + if not isinstance(item, dict): + raise RSSInputError("Each sublattice entry must be a dict") + if "name" not in item or "site_indices" not in item: + raise RSSInputError("Each sublattice requires 'name' and 'site_indices'") + name = str(item["name"]) + if name in sub_map: + raise RSSInputError(f"Duplicate sublattice name: {name}") + indices = item["site_indices"] + if not isinstance(indices, list) or not indices: + raise RSSInputError(f"sublattice '{name}' has empty site_indices") + clean_indices = [] + for idx in indices: + if not isinstance(idx, int): + raise RSSInputError(f"sublattice '{name}' has non-integer site index") + if idx < 0 or idx >= nsites: + raise RSSInputError(f"sublattice '{name}' has out-of-range index {idx}") + if idx in seen: + raise RSSInputError(f"Site index {idx} appears in multiple sublattices") + seen.add(idx) + clean_indices.append(idx) + sub_map[name] = clean_indices + + if set(sub_map.keys()) != set(compositions.keys()): + raise RSSInputError( + "Sublattice names must match composition keys in multi-sublattice mode" + ) + return sub_map + + +def _integerize_composition_counts( + nsites: int, + composition: Dict[str, float], + tol: float, +) -> Dict[str, int]: + if nsites <= 0: + raise RSSInputError("nsites must be positive") + + targets = [] + expected_total = 0.0 + for species, frac in composition.items(): + value = float(frac) * nsites + targets.append((species, value)) + expected_total += value + + if abs(expected_total - nsites) > max(tol, 1e-12) * max(1, nsites): + warnings.warn( + "Given supercell/site count cannot realize requested composition " + f"(target total {expected_total} on {nsites} sites)", + UserWarning, + ) + raise RSSInputError( + f"Composition {composition} incompatible with {nsites} sites" + ) + + counts = {} + residuals = [] + running_total = 0 + for species, value in targets: + base = int(math.floor(value + 1e-12)) + counts[species] = base + running_total += base + residuals.append((value - base, species)) + + remaining = nsites - running_total + if remaining > 0: + residuals.sort(key=lambda item: (-item[0], str(item[1]))) + for _, species in residuals[:remaining]: + counts[species] += 1 + + max_error = max( + (abs(value - counts[species]) for species, value in targets), + default=0.0, + ) + if max_error > tol: + warnings.warn( + "Given supercell/site count cannot realize requested composition exactly; " + "using nearest integer counts", + UserWarning, + ) + + return counts + + +def _assign_initial_species( + state_species: List[str], + site_indices: List[int], + counts: Dict[str, int], + rng: random.Random, +) -> None: + assigned = [] + for species, count in counts.items(): + assigned.extend([species] * count) + if len(assigned) != len(site_indices): + raise RSSInputError("Assigned species count does not match sublattice size") + rng.shuffle(assigned) + for idx, sp in zip(site_indices, assigned): + state_species[idx] = sp + + +def _default_shell_cutoffs(structure: Structure) -> List[float]: + dmat = structure.distance_matrix + min_dist = None + for i in range(len(structure)): + for j in range(i + 1, len(structure)): + d = float(dmat[i][j]) + if d <= 1e-12: + continue + if min_dist is None or d < min_dist: + min_dist = d + if min_dist is None: + raise RSSInputError("Could not infer default shell cutoff from structure") + return [1.05 * min_dist] + + +def _build_neighbor_shells( + structure: Structure, + shell_cutoffs: Sequence[float], +) -> Dict[int, List[Tuple[int, int]]]: + cutoffs = [float(v) for v in shell_cutoffs] + if any(v <= 0 for v in cutoffs): + raise RSSInputError("shell_cutoffs must be positive") + if sorted(cutoffs) != list(cutoffs): + raise RSSInputError("shell_cutoffs must be sorted ascending") + + shell_pairs = {sid: [] for sid in range(len(cutoffs))} + dmat = structure.distance_matrix + nsites = len(structure) + + max_cutoff = cutoffs[-1] + for i in range(nsites): + for j in range(i + 1, nsites): + dist = float(dmat[i][j]) + if dist <= 1e-12 or dist > max_cutoff: + continue + for shell_id, cutoff in enumerate(cutoffs): + if dist <= cutoff: + shell_pairs[shell_id].append((i, j)) + break + return shell_pairs + + +def _normalize_shell_weights( + shell_cutoffs: Sequence[float], + shell_weights: Optional[Sequence[float]], +) -> Dict[int, float]: + nshells = len(shell_cutoffs) + if shell_weights is None: + return {sid: 1.0 for sid in range(nshells)} + if len(shell_weights) != nshells: + raise RSSInputError("shell_weights length must match shell_cutoffs length") + weights = {} + for sid, weight in enumerate(shell_weights): + w = float(weight) + if w < 0: + raise RSSInputError("shell_weights must be non-negative") + weights[sid] = w + return weights + + +def _normalize_sro_targets( + sro_targets: Optional[dict], + nshells: int, + pair_keys: Sequence[Tuple[str, str]], +) -> Dict[int, Dict[Tuple[str, str], float]]: + pair_set = set(pair_keys) + if sro_targets is None: + return { + sid: {pair: 0.0 for pair in pair_keys} + for sid in range(nshells) + } + + normalized = {sid: {} for sid in range(nshells)} + for shell_key, shell_target in sro_targets.items(): + try: + if isinstance(shell_key, str): + if shell_key.startswith("shell"): + shell_id = int(shell_key[5:]) + else: + shell_id = int(shell_key) + else: + shell_id = int(shell_key) + except (TypeError, ValueError) as exc: + raise RSSInputError( + "Invalid sro_targets shell key " + f"{shell_key!r}; expected shell0, shell1, ... or 0, 1, ..." + ) from exc + if shell_id < 0 or shell_id >= nshells: + if nshells == 0: + valid_shells = "none" + else: + valid_shells = ", ".join(f"shell{sid}" for sid in range(nshells)) + raise RSSInputError( + "Invalid shell index in sro_targets: " + f"{shell_key}. Configured shell_cutoffs define {nshells} shell(s), " + f"so valid keys are: {valid_shells}" + ) + if not isinstance(shell_target, dict): + raise RSSInputError(f"SRO target for shell {shell_key} must be dict") + for pair_key, val in shell_target.items(): + pair = _parse_pair_key(pair_key) + if pair not in pair_set: + pair_set.add(pair) + normalized[shell_id][pair] = float(val) + + for sid in range(nshells): + for pair in pair_set: + normalized[sid].setdefault(pair, 0.0) + return normalized + + +def _composition_fractions_from_state(species_state: Sequence[str]) -> Dict[str, float]: + total = float(len(species_state)) + counts = Counter(species_state) + return {sp: counts[sp] / total for sp in counts} + + +def _compute_warren_cowley_sro( + species_state: Sequence[str], + shell_pairs: Dict[int, List[Tuple[int, int]]], + pair_keys: Sequence[Tuple[str, str]], + composition_fractions: Dict[str, float], +) -> Dict[int, Dict[Tuple[str, str], float]]: + achieved = {} + for shell_id, pairs in shell_pairs.items(): + n_a = Counter() + n_ab = Counter() + for i, j in pairs: + ai = species_state[i] + aj = species_state[j] + n_a[ai] += 1 + n_ab[(ai, aj)] += 1 + n_a[aj] += 1 + n_ab[(aj, ai)] += 1 + + shell_alpha = {} + for a, b in pair_keys: + c_a = composition_fractions.get(a, 0.0) + c_b = composition_fractions.get(b, 0.0) + if a == b: + if n_a[a] == 0 or c_b <= 1e-16: + alpha = 0.0 + else: + p_ab = n_ab[(a, b)] / float(n_a[a]) + alpha = 1.0 - p_ab / c_b + else: + terms = [] + if n_a[a] > 0 and c_b > 1e-16: + p_ab = n_ab[(a, b)] / float(n_a[a]) + terms.append(1.0 - p_ab / c_b) + if n_a[b] > 0 and c_a > 1e-16: + p_ba = n_ab[(b, a)] / float(n_a[b]) + terms.append(1.0 - p_ba / c_a) + alpha = sum(terms) / float(len(terms)) if terms else 0.0 + shell_alpha[(a, b)] = float(alpha) + achieved[shell_id] = shell_alpha + return achieved + + +def _objective_function( + achieved_sro: Dict[int, Dict[Tuple[str, str], float]], + target_sro: Dict[int, Dict[Tuple[str, str], float]], + shell_weights: Dict[int, float], +) -> float: + value = 0.0 + for shell_id, targets in target_sro.items(): + weight = shell_weights.get(shell_id, 1.0) + for pair, target in targets.items(): + now = achieved_sro.get(shell_id, {}).get(pair, 0.0) + diff = now - target + value += weight * diff * diff + return float(value) + + +def _sro_gap_metrics( + achieved_sro: Dict[int, Dict[Tuple[str, str], float]], + target_sro: Dict[int, Dict[Tuple[str, str], float]], + shell_weights: Dict[int, float], +) -> Dict[str, float]: + weighted_sum = 0.0 + weight_total = 0.0 + max_abs_gap = 0.0 + for shell_id, targets in target_sro.items(): + weight = shell_weights.get(shell_id, 1.0) + for pair, target in targets.items(): + now = achieved_sro.get(shell_id, {}).get(pair, 0.0) + gap = abs(now - target) + weighted_sum += weight * gap * gap + weight_total += weight + if gap > max_abs_gap: + max_abs_gap = gap + rmse_gap = math.sqrt(weighted_sum / weight_total) if weight_total > 0 else 0.0 + return { + "rmse": float(rmse_gap), + "max_abs": float(max_abs_gap), + } + + +def _pick_swap( + species_state: Sequence[str], + sublattice_indices: Dict[str, List[int]], + rng: random.Random, + max_tries: int = 30, +) -> Optional[Tuple[int, int]]: + valid_names = [ + name + for name, indices in sublattice_indices.items() + if len(indices) >= 2 + ] + if not valid_names: + return None + + for _ in range(max_tries): + sub_name = rng.choice(valid_names) + indices = sublattice_indices[sub_name] + i, j = rng.sample(indices, 2) + if species_state[i] != species_state[j]: + return i, j + return None + + +def _reconstruct_structure(parent: Structure, species_state: Sequence[str]) -> Structure: + site_props = dict(parent.site_properties) if parent.site_properties else None + return Structure( + lattice=parent.lattice, + species=list(species_state), + coords=parent.frac_coords, + site_properties=site_props, + coords_are_cartesian=False, + ) + + +def generate_rss( + structure, + compositions, + sublattices=None, + sro_targets=None, + shell_cutoffs=None, + shell_weights=None, + max_steps=20000, + temperature=0.05, + seed=None, + tol=1e-3, + allow_vacancies=False, + num_configs=1, + interval=100, + show_progress=False, + patience=None, + ratio_precision=None, + return_metadata=False, +): + """Generate a random solid solution structure with optional SRO targeting. + + Parameters follow the APEX RSS contract: composition control by sublattice, + shell-based Warren-Cowley targets, and swap-based Metropolis optimization. + """ + if not isinstance(structure, Structure): + raise RSSInputError("structure must be a pymatgen.core.Structure") + + tol = float(tol) + max_steps = int(max_steps) + if max_steps < 0: + raise RSSInputError("max_steps must be non-negative") + temperature = float(temperature) + if temperature < 0: + raise RSSInputError("temperature must be non-negative") + num_configs = int(num_configs) + if num_configs <= 0: + raise RSSInputError("num_configs must be a positive integer") + interval = int(interval) + if interval <= 0: + raise RSSInputError("interval must be a positive integer") + if patience is not None: + patience = int(patience) + if patience <= 0: + raise RSSInputError("patience must be a positive integer or None") + if ratio_precision is not None: + ratio_precision = int(ratio_precision) + if ratio_precision < 0: + raise RSSInputError("ratio_precision must be a non-negative integer or None") + + rng = random.Random(seed) + parent = structure.copy() + + normalized_compositions = _normalize_validate_compositions( + compositions=compositions, + tol=tol, + allow_vacancies=allow_vacancies, + ) + sub_map = _build_sublattice_indices(parent, normalized_compositions, sublattices) + + state_species = [str(site.specie) for site in parent.sites] + composition_counts = {} + for sub_name, indices in sub_map.items(): + counts = _integerize_composition_counts( + nsites=len(indices), + composition=normalized_compositions[sub_name], + tol=tol, + ) + composition_counts[sub_name] = counts + _assign_initial_species(state_species, indices, counts, rng) + + composition_ratios = {} + for sub_name, counts in composition_counts.items(): + total_sites = len(sub_map[sub_name]) + sub_ratios = { + species: count / total_sites for species, count in counts.items() + } + if ratio_precision is not None: + sub_ratios = { + species: round(value, ratio_precision) + for species, value in sub_ratios.items() + } + composition_ratios[sub_name] = sub_ratios + + if shell_cutoffs is None: + cutoffs = _default_shell_cutoffs(parent) + else: + cutoffs = [float(v) for v in shell_cutoffs] + if not cutoffs: + raise RSSInputError("shell_cutoffs must be non-empty when provided") + + shell_pairs = _build_neighbor_shells(parent, cutoffs) + if all(len(pairs) == 0 for pairs in shell_pairs.values()): + raise RSSInputError("No neighbor pairs found within shell_cutoffs") + + all_species = sorted( + { + sp + for comp in normalized_compositions.values() + for sp in comp.keys() + } + ) + pair_keys = list(combinations_with_replacement(all_species, 2)) + + target_sro = _normalize_sro_targets(sro_targets, len(cutoffs), pair_keys) + target_pair_keys = sorted( + { + pair + for shell_data in target_sro.values() + for pair in shell_data.keys() + } + ) + + weights = _normalize_shell_weights(cutoffs, shell_weights) + + def _evaluate_species(species_snapshot): + composition_fractions = _composition_fractions_from_state(species_snapshot) + sro = _compute_warren_cowley_sro( + species_snapshot, + shell_pairs, + target_pair_keys, + composition_fractions, + ) + objective = _objective_function(sro, target_sro, weights) + gap_metrics = _sro_gap_metrics(sro, target_sro, weights) + return sro, objective, gap_metrics + + current_sro, current_objective, current_gap_metrics = _evaluate_species( + state_species + ) + initial_objective = float(current_objective) + initial_gap_metrics = dict(current_gap_metrics) + + best_species = list(state_species) + best_sro = current_sro + best_objective = current_objective + best_gap_metrics = dict(current_gap_metrics) + + accepted_moves = 0 + attempted_moves = 0 + last_improve_step = 0 + sampled_cache = [] + sampled_cache_index = {} + near_target_threshold = max(5.0 * tol, 1e-2) + + def _store_sample(species_snapshot, step_value, rmse_value): + key = tuple(species_snapshot) + existing_index = sampled_cache_index.get(key) + entry = { + "species": list(species_snapshot), + "step": int(step_value), + "rmse": float(rmse_value), + } + + if existing_index is not None: + existing_entry = sampled_cache[existing_index] + if ( + entry["rmse"] < existing_entry["rmse"] - 1e-12 + or ( + abs(entry["rmse"] - existing_entry["rmse"]) <= 1e-12 + and entry["step"] < existing_entry["step"] + ) + ): + sampled_cache[existing_index] = entry + else: + return + else: + sampled_cache.append(entry) + + sampled_cache.sort(key=lambda item: (item["rmse"], item["step"])) + if len(sampled_cache) > num_configs: + removed_entry = sampled_cache.pop() + sampled_cache_index.pop(tuple(removed_entry["species"]), None) + sampled_cache_index.clear() + for index, cached_entry in enumerate(sampled_cache): + sampled_cache_index[tuple(cached_entry["species"])] = index + + if num_configs > 1 and max_steps == 0: + _store_sample(state_species, 0, float(current_gap_metrics["rmse"])) + for _ in range(num_configs - 1): + candidate_species = [str(site.specie) for site in parent.sites] + for sub_name, indices in sub_map.items(): + _assign_initial_species( + candidate_species, + indices, + composition_counts[sub_name], + rng, + ) + candidate_sro, candidate_objective, candidate_gap_metrics = ( + _evaluate_species(candidate_species) + ) + _store_sample(candidate_species, 0, float(candidate_gap_metrics["rmse"])) + if candidate_objective + tol < best_objective: + best_objective = candidate_objective + best_sro = candidate_sro + best_species = list(candidate_species) + best_gap_metrics = dict(candidate_gap_metrics) + + progress_bar = None + if show_progress: + if tqdm is None: + warnings.warn( + "show_progress=True but tqdm is not available; proceeding without progress bar", + UserWarning, + ) + else: + progress_bar = tqdm( + total=max_steps, + desc="RSS sampling", + unit="step", + dynamic_ncols=True, + ) + progress_bar.set_postfix( + { + "gap_rmse": f"{current_gap_metrics['rmse']:.4f}", + "best_rmse": f"{best_gap_metrics['rmse']:.4f}", + } + ) + + for step in range(1, max_steps + 1): + proposal = _pick_swap(state_species, sub_map, rng) + if proposal is None: + break + + i, j = proposal + attempted_moves += 1 + state_species[i], state_species[j] = state_species[j], state_species[i] + + trial_sro, trial_objective, trial_gap_metrics = _evaluate_species( + state_species + ) + delta = trial_objective - current_objective + + accept = False + if delta <= 0: + accept = True + elif temperature > 0: + threshold = math.exp(-delta / max(temperature, 1e-12)) + accept = rng.random() < threshold + + if accept: + accepted_moves += 1 + current_sro = trial_sro + current_objective = trial_objective + current_gap_metrics = trial_gap_metrics + if trial_objective + tol < best_objective: + best_objective = trial_objective + best_sro = trial_sro + best_species = list(state_species) + best_gap_metrics = dict(current_gap_metrics) + last_improve_step = step + else: + state_species[i], state_species[j] = state_species[j], state_species[i] + + if step % interval == 0: + _store_sample( + state_species, + step, + float(current_gap_metrics["rmse"]), + ) + + if progress_bar is not None: + progress_bar.update(1) + progress_bar.set_postfix( + { + "gap_rmse": f"{current_gap_metrics['rmse']:.4f}", + "best_rmse": f"{best_gap_metrics['rmse']:.4f}", + }, + refresh=False, + ) + + if patience is not None and step - last_improve_step >= patience and step >= patience: + break + + if progress_bar is not None: + progress_bar.close() + + if num_configs == 1: + decorated = _reconstruct_structure(parent, best_species) + else: + sampled_species = [entry["species"] for entry in sampled_cache] + sampled_steps = [entry["step"] for entry in sampled_cache] + sampled_rmses = [entry["rmse"] for entry in sampled_cache] + if not sampled_species: + sampled_species.append(list(best_species)) + sampled_steps.append(-1) + sampled_rmses.append(float(best_gap_metrics["rmse"])) + while len(sampled_species) < num_configs: + sampled_species.append(list(best_species)) + sampled_steps.append(-1) + sampled_rmses.append(float(best_gap_metrics["rmse"])) + decorated = [ + _reconstruct_structure(parent, sp) + for sp in sampled_species[:num_configs] + ] + if num_configs == 1: + sampled_steps = [] + sampled_rmses = [] + + if best_gap_metrics["rmse"] > max(10.0 * tol, 0.1): + warnings.warn( + "SRO gap remains large after optimization: " + f"best_rmse={best_gap_metrics['rmse']:.4f}, " + f"best_max_abs={best_gap_metrics['max_abs']:.4f}. " + "Consider increasing max_steps or temperature.", + UserWarning, + ) + + metadata = { + "seed": seed, + "composition_counts": composition_counts, + "composition_ratios": composition_ratios, + "ratio_precision": ratio_precision, + "shell_cutoffs": list(cutoffs), + "target_sro": target_sro, + "achieved_sro": best_sro, + "initial_objective": initial_objective, + "final_objective": float(current_objective), + "best_objective": float(best_objective), + "accepted_moves": int(accepted_moves), + "attempted_moves": int(attempted_moves), + "acceptance_ratio": float(accepted_moves / attempted_moves) if attempted_moves else 0.0, + "sro_gap": { + "initial_rmse": initial_gap_metrics["rmse"], + "initial_max_abs": initial_gap_metrics["max_abs"], + "final_rmse": current_gap_metrics["rmse"], + "final_max_abs": current_gap_metrics["max_abs"], + "best_rmse": best_gap_metrics["rmse"], + "best_max_abs": best_gap_metrics["max_abs"], + }, + "sampling": { + "num_configs": num_configs, + "interval": interval, + "sampled_steps": sampled_steps, + "sampled_rmses": sampled_rmses, + "near_target_threshold": near_target_threshold, + "patience": patience, + }, + } + + if return_metadata: + return decorated, metadata + return decorated diff --git a/apex/core/property/Annealing.py b/apex/core/property/Annealing.py new file mode 100644 index 00000000..2082f33b --- /dev/null +++ b/apex/core/property/Annealing.py @@ -0,0 +1,197 @@ +import os +import logging +from typing import List, Dict, Any + +from monty.serialization import dumpfn +from pymatgen.core.structure import Structure + +from apex.core.property.Property import Property +from apex.core.calculator.lib import vasp_utils + + +class Annealing(Property): + + def __init__(self, parameter: Dict[str, Any], inter_param=None): + parameter["cal_type"] = "annealing" + self.parameter = parameter + self.inter_param = inter_param if inter_param is not None else {"type": "lammps"} + + # geometry + self.supercell_size = parameter.get("supercell_size", [2, 2, 2]) + self.supercell_length = parameter.get("supercell_length", None) + + # MD controls (independent knobs only) + cal = parameter.setdefault("cal_setting", {}) + # required temps + self.start_temp = float(cal.get("start_temp", 300)) + _tgt = cal.get("target_temp", 800) + self.target_temp = float(_tgt if not isinstance(_tgt, list) else _tgt[0]) + self.end_temp = float(cal.get("end_temp", 300)) + # required steps + self.equi_step = int(cal.get("equi_step", 10000)) + # Allow specifying ramp/cool by rate (K/step); derive steps per task if provided + self.ramp_rate = cal.pop("ramp_rate", None) + self.cool_rate = cal.pop("cool_rate", None) + self.ramp_step = int(cal.get("ramp_step", 20000)) + self.hold_step = int(cal.get("hold_step", 0)) + self.cool_step = int(cal.get("cool_step", 20000)) + # options + self.thermostat = cal.get("thermostat", "nose_hoover") + self.ensemble = cal.get("ensemble", "npt") + self.tdamp = cal.get("tdamp", 100) + self.pdamp = cal.get("pdamp", 1000) + self.velocity_seed = cal.get("velocity_seed", 12345) + self.dump_step = int(cal.get("dump_step", 1000)) + # timestep (ps, units metal); default 0.002 ps (2 fs) + self.timestep = float(cal.get("timestep", 0.002)) + # RDF settings + self.rdf_bins = int(cal.get("rdf_bins", 200)) + self.rdf_cutoff = float(cal.get("rdf_cutoff", 10.0)) + self.rdf_interval = int(cal.get("rdf_interval", 100)) + + def task_type(self): + return self.parameter["type"] + + def task_param(self): + # make cal_setting explicit and in-sync + cal = self.parameter.setdefault("cal_setting", {}) + cal.update( + { + "start_temp": self.start_temp, + "target_temp": self.target_temp, + "end_temp": self.end_temp, + "equi_step": self.equi_step, + "ramp_step": self.ramp_step, + "hold_step": self.hold_step, + "cool_step": self.cool_step, + "thermostat": self.thermostat, + "ensemble": self.ensemble, + "tdamp": self.tdamp, + "pdamp": self.pdamp, + "velocity_seed": self.velocity_seed, + "dump_step": self.dump_step, + "timestep": self.timestep, + "rdf_bins": self.rdf_bins, + "rdf_cutoff": self.rdf_cutoff, + "rdf_interval": self.rdf_interval, + } + ) + self.parameter["supercell_size"] = self.supercell_size + if self.supercell_length is not None: + self.parameter["supercell_length"] = self.supercell_length + return self.parameter + + def make_confs(self, path_to_work: str, path_to_equi: str, refine=False) -> List[str]: + path_to_work = os.path.abspath(path_to_work) + if not os.path.exists(path_to_work): + os.makedirs(path_to_work) + else: + logging.warning("%s already exists" % path_to_work) + + # Calculator selection happens downstream via make_calculator; do not hard-code here. + # Annealing is implemented for LAMMPS; other calculators should provide their own impls. + if not os.path.isdir(path_to_equi) or not os.path.isfile(os.path.join(path_to_equi, "CONTCAR")): + raise RuntimeError("please finish relaxation before annealing") + + task_list: List[str] = [] + # One task per target_temp (allow list), else single + targets = self.parameter.get("cal_setting", {}).get("target_temp", self.target_temp) + if not isinstance(targets, list): + targets = [targets] + + for idx, tgt in enumerate(targets): + task_dir = os.path.join(path_to_work, f"task.{idx:06d}") + os.makedirs(task_dir, exist_ok=True) + + # Build POSCAR from relaxation + import shutil + equi_contcar = os.path.join(path_to_equi, "CONTCAR") + shutil.copy(equi_contcar, os.path.join(task_dir, "POSCAR")) + # Load back to fetch lattice metrics if needed later + s_sorted = Structure.from_file(os.path.join(task_dir, "POSCAR")) + + # Derive integer replication from physical length if requested + if self.supercell_length is not None: + try: + a, b, c = s_sorted.lattice.abc + import math + sx, sy, sz = self.supercell_length + nx = max(1, int(math.ceil(sx / a))) + ny = max(1, int(math.ceil(sy / b))) + nz = max(1, int(math.ceil(sz / c))) + self.supercell_size = [nx, ny, nz] + except Exception as e: + logging.warning(f"Failed to derive supercell_size from supercell_length: {e}") + + # Persist params per task + anneal_task = { + "start_temp": self.start_temp, + "target_temp": float(tgt), + "end_temp": self.end_temp, + "supercell_size": self.supercell_size, + } + dumpfn(anneal_task, os.path.join(task_dir, "Annealing.json"), indent=4) + + # variable_Annealing.in for LAMMPS + var = [] + var.append("# variable_Annealing.in") + var.append(f"variable nx equal {self.supercell_size[0]}") + var.append(f"variable ny equal {self.supercell_size[1]}") + var.append(f"variable nz equal {self.supercell_size[2]}") + var.append(f"variable start_temp equal {self.start_temp:.2f}") + var.append(f"variable target_temp equal {float(tgt):.2f}") + var.append(f"variable end_temp equal {self.end_temp:.2f}") + var.append(f"variable equi_step equal {self.equi_step}") + # derive ramp/cool steps if rates are provided (K/step); else use defaults + import math + if self.ramp_rate is not None: + try: + # convert K/ns -> steps using timestep (ps): dt_ns = dt_ps/1000 + rstep = max(1, int(math.ceil(abs(float(tgt) - self.start_temp) * 1000.0 / (float(self.ramp_rate) * self.timestep)))) + except Exception: + rstep = self.ramp_step + else: + rstep = self.ramp_step + if self.cool_rate is not None: + try: + cr = self.cool_rate[idx] if isinstance(self.cool_rate, (list, tuple)) else float(self.cool_rate) + cstep = max(1, int(math.ceil(abs(float(tgt) - self.end_temp) * 1000.0 / (float(cr) * self.timestep)))) + except Exception: + cstep = self.cool_step + else: + cstep = self.cool_step + var.append(f"variable ramp_step equal {rstep}") + var.append(f"variable hold_step equal {self.hold_step}") + var.append(f"variable cool_step equal {cstep}") + var.append(f"variable timestep equal {self.timestep}") + var.append(f"variable rdf_bins equal {self.rdf_bins}") + var.append(f"variable rdf_cutoff equal {self.rdf_cutoff}") + var.append(f"variable rdf_interval equal {self.rdf_interval}") + var.append(f"variable tdamp equal {self.tdamp}") + var.append(f"variable pdamp equal {self.pdamp}") + var.append(f"variable velocity_seed equal {int(self.velocity_seed)}") + var.append(f"variable dump_step equal {self.dump_step}") + var.append(f"variable thermostat string {self.thermostat}") + var.append(f"variable ensemble string {self.ensemble}") + with open(os.path.join(task_dir, "variable_Annealing.in"), "w") as fp: + fp.write("\n".join(var) + "\n") + + task_list.append(task_dir) + + return task_list + + def post_process(self, task_list: List[str]): + # No post aggregation for annealing in this minimal port + pass + + def _compute_lower(self, output_file, all_tasks, all_res): + # Minimal aggregator: return basic info per task; users inspect dumps/logs + res_data = {} + ptr_data = os.path.dirname(output_file) + "\n" + for t in all_tasks: + name = os.path.basename(t) + res_data[name] = { + "task": name, + "note": "annealing run; inspect log.lammps and dump files", + } + return res_data, ptr_data diff --git a/apex/core/property/Cohesive.py b/apex/core/property/Cohesive.py new file mode 100644 index 00000000..4ad93220 --- /dev/null +++ b/apex/core/property/Cohesive.py @@ -0,0 +1,252 @@ +"""Cohesive energy property generation and post-processing.""" + +import glob +import json +import logging +import os +from contextlib import contextmanager +from typing import Dict, List, Optional, Tuple + +import numpy as np +from monty.serialization import dumpfn, loadfn + +from apex.core.calculator.lib import abacus_scf +from apex.core.calculator.lib import abacus_utils +from apex.core.calculator.lib import vasp_utils +from apex.core.property.Property import Property +from apex.core.reproduce import make_repro, post_repro +from dflow.python import upload_packages + +upload_packages.append(__file__) + + +@contextmanager +def _chdir(path: str): + """Temporarily change working directory.""" + prev = os.getcwd() + os.makedirs(path, exist_ok=True) + os.chdir(path) + try: + yield + finally: + os.chdir(prev) + + +class Cohesive(Property): + """Generate scaled-lattice tasks and compute cohesive energy.""" + + def __init__(self, parameter: Dict, inter_param: Optional[Dict] = None): + # Normalize commonly used flags/sections. + parameter["reproduce"] = parameter.get("reproduce", False) + self.reprod = parameter["reproduce"] + + if not self.reprod: + # Lattice scan settings (may be absolute or relative to a0). + if not ("init_from_suffix" in parameter and "output_suffix" in parameter): + self.latt_start = parameter["latt_start"] + self.latt_end = parameter["latt_end"] + self.latt_step = parameter["latt_step"] + parameter["latt_abs"] = parameter.get("latt_abs", False) + self.latt_abs = parameter["latt_abs"] + + parameter["cal_type"] = parameter.get("cal_type", "static") + self.cal_type = parameter["cal_type"] + parameter.setdefault("cal_setting", {}) + self.cal_setting = parameter["cal_setting"] + else: + # Reproduction mode always uses static calcs. + parameter["cal_type"] = "static" + self.cal_type = parameter["cal_type"] + parameter.setdefault("cal_setting", {}) + self.cal_setting = parameter["cal_setting"] + parameter["init_from_suffix"] = parameter.get("init_from_suffix", "00") + self.init_from_suffix = parameter["init_from_suffix"] + + self.parameter = parameter + self.inter_param = inter_param if inter_param is not None else {"type": "vasp"} + + def make_confs(self, path_to_work: str, path_to_equi: str, refine: bool = False) -> List[str]: + """Create task directories with scaled structures. + + When reproduce-mode is on, delegate to the reproduction utilities. + Otherwise, generate a lattice scan by scaling the relaxed structure. + + Returns a list of created task directories. + """ + path_to_work = os.path.abspath(path_to_work) + if os.path.exists(path_to_work): + logging.debug("%s already exists", path_to_work) + else: + os.makedirs(path_to_work, exist_ok=True) + path_to_equi = os.path.abspath(path_to_equi) + + # Optionally override equilibrium path from a provided pool of starts. + if "start_confs_path" in self.parameter and os.path.exists(self.parameter["start_confs_path"]): + init_path_list = glob.glob(os.path.join(self.parameter["start_confs_path"], "*")) + struct_init_name_list = [os.path.basename(ii) for ii in init_path_list] + struct_output_name = os.path.basename(os.path.dirname(path_to_work)) + if struct_output_name not in struct_init_name_list: + raise RuntimeError(f"{struct_output_name} not found in start_confs_path.") + path_to_equi = os.path.abspath( + os.path.join(self.parameter["start_confs_path"], struct_output_name, "relaxation", "relax_task") + ) + + task_list: List[str] = [] + + if self.reprod: + print("cohesive energy reproduce starts") + if "init_data_path" not in self.parameter: + raise RuntimeError("please provide the initial data path to reproduce") + init_data_path = os.path.abspath(self.parameter["init_data_path"]) + task_list = make_repro( + self.inter_param, + init_data_path, + self.init_from_suffix, + path_to_work, + self.parameter.get("reprod_last_frame", True), + ) + return task_list + + # Normal generation mode + print( + "gen cohesive energy from " + + str(self.latt_start) + + " to " + + str(self.latt_end) + + " by every " + + str(self.latt_step) + ) + if self.latt_abs: + print("treat latt_start and latt_end as absolute lattice constant") + else: + print("treat latt_start and latt_end as relative lattice constant") + + # Determine equilibrium structure file and a0 (|a| of the first lattice vector). + if self.inter_param["type"] == "abacus": + equi_stru = os.path.join(path_to_equi, abacus_utils.final_stru(path_to_equi)) + else: + equi_stru = os.path.join(path_to_equi, "CONTCAR") + + if not os.path.isfile(equi_stru): + raise RuntimeError(f"Can not find {equi_stru}, please do relaxation first") + + if self.inter_param["type"] == "abacus": + stru_data = abacus_scf.get_abacus_STRU(equi_stru) + a0 = np.linalg.norm(stru_data["cells"], axis=1)[0] + else: + with open(equi_stru, "r") as f: + lines = f.readlines() + scale = float(lines[1].strip()) + cell = np.array([[float(x) for x in line.split()] for line in lines[2:5]]) + cell *= scale + a0 = np.linalg.norm(cell, axis=1)[0] + + self.parameter["scale2equi"] = [] + + # Build tasks along the scan. + task_num = 0 + while self.latt_start + self.latt_step * task_num <= self.latt_end + 1e-12: + latt = self.latt_start + task_num * self.latt_step + output_task = os.path.join(path_to_work, f"task.{task_num:06d}") + task_list.append(output_task) + + # Decide file names and scaling function based on calculator type. + if self.inter_param["type"] == "abacus": + poscar_name = "STRU" + poscar_orig = "STRU.orig" + scale_func = abacus_utils.stru_scale + else: + poscar_name = "POSCAR" + poscar_orig = "POSCAR.orig" + scale_func = vasp_utils.poscar_scale + + with _chdir(output_task): + # Clean any leftovers from previous runs. + for fname in ("INCAR", "POTCAR", poscar_orig, poscar_name, "conf.lmp", "in.lammps"): + if os.path.exists(fname): + os.remove(fname) + + # Symlink to the equilibrium structure as the "orig". + rel_src = os.path.relpath(equi_stru, output_task) + os.symlink(rel_src, poscar_orig) + + # Determine scale and lattice value to record. + if self.latt_abs: + scale_val = latt / a0 + lattice_val = latt + else: + scale_val = latt + lattice_val = latt * a0 + + dumpfn({"lattice": lattice_val, "scale": scale_val}, "cohesive.json", indent=4) + self.parameter["scale2equi"].append(scale_val) + + # Create scaled structure. + scale_func(poscar_orig, poscar_name, scale_val) + + task_num += 1 + + return task_list + + def post_process(self, task_list: List[str]) -> None: + """Placeholder for future post-processing hooks.""" + pass + + def task_type(self) -> str: + return self.parameter["type"] + + def task_param(self) -> Dict: + return self.parameter + + def _compute_lower( + self, output_file: str, all_tasks: List[str], all_res: List[str] + ) -> Tuple[Dict, str]: + """Compute cohesive energies from finished tasks and write a JSON result.""" + output_file = os.path.abspath(output_file) + res_data: Dict = {} + ptr_data = "conf_dir: " + os.path.dirname(output_file) + "\n" + + if not self.reprod: + if getattr(self, "latt_abs", False): + ptr_data += " Latt(A) Etot(eV) Ecoh(eV/atom)\n" + else: + ptr_data += " ScaledLatt Etot(eV) Ecoh(eV/atom)\n" + + # Use the last result as the single-atom reference. + last_res = loadfn(all_res[-1]) + single_atom_energy = last_res["energies"][-1] / sum(last_res["atom_numbs"]) + + for ii, task_path in enumerate(all_tasks): + conf = loadfn(os.path.join(task_path, "cohesive.json")) + latt = conf["lattice"] + scale = conf["scale"] + task_result = loadfn(all_res[ii]) + + total_energy = task_result["energies"][-1] + total_atoms = sum(task_result["atom_numbs"]) + + e_per_atom = total_energy / total_atoms + cohesive_energy = e_per_atom - single_atom_energy + + if getattr(self, "latt_abs", False): + ptr_data += "%7.3f %8.4f %8.4f\n" % (latt, e_per_atom, cohesive_energy) + res_data[latt] = {"total_energy": e_per_atom, "cohesive_energy": cohesive_energy} + else: + ptr_data += "%7.3f %8.4f %8.4f\n" % (scale, e_per_atom, cohesive_energy) + res_data[scale] = {"total_energy": e_per_atom, "cohesive_energy": cohesive_energy} + else: + if "init_data_path" not in self.parameter: + raise RuntimeError("please provide the initial data path to reproduce") + init_data_path = os.path.abspath(self.parameter["init_data_path"]) + res_data, ptr_data = post_repro( + init_data_path, + self.parameter["init_from_suffix"], + all_tasks, + ptr_data, + self.parameter.get("reprod_last_frame", True), + ) + + with open(output_file, "w") as fp: + json.dump(res_data, fp, indent=4) + + return res_data, ptr_data diff --git a/apex/core/property/DecohesionEnergy.py b/apex/core/property/DecohesionEnergy.py deleted file mode 100644 index 83305e02..00000000 --- a/apex/core/property/DecohesionEnergy.py +++ /dev/null @@ -1,287 +0,0 @@ -import glob -import json -import logging -import os -import re -import dpdata -import numpy as np -from monty.serialization import dumpfn, loadfn -from pymatgen.core.structure import Structure -from pymatgen.core.surface import SlabGenerator - -from apex.core.calculator.lib import abacus_utils -from apex.core.calculator.lib import vasp_utils -from apex.core.property.Property import Property -from apex.core.refine import make_refine -from apex.core.reproduce import make_repro, post_repro -from dflow.python import upload_packages -upload_packages.append(__file__) - -class DecohesionEnergy(Property): - def __init__(self, parameter, inter_param=None): - ''' - core parameter for make_confs[POSCAR]: - min_slab_size max_vacuum_size vacuum_size_step - miller_index - ''' - parameter["reproduce"] = parameter.get("reproduce", False) - self.reprod = parameter["reproduce"] - if not self.reprod: - if not ("init_from_suffix" in parameter and "output_suffix" in parameter): - self.min_slab_size = parameter["min_slab_size"] - parameter["pert_xz"] = parameter.get("pert_xz", 0.01) - self.pert_xz = parameter["pert_xz"] - parameter["max_vacuum_size"] = parameter.get("max_vacuum_size", 15) - self.max_vacuum_size = parameter["max_vacuum_size"] - parameter["vacuum_size_step"]=parameter.get("vacuum_size_step", 1) - self.vacuum_size_step = parameter["vacuum_size_step"] - self.miller_index = tuple(parameter["miller_index"]) - parameter["cal_type"] = parameter.get("cal_type", "relaxation") - default_cal_setting = { - "relax_pos": False, - "relax_shape": False, - "relax_vol": False, - } - else: - parameter["cal_type"] = "static" - self.cal_type = parameter["cal_type"] - default_cal_setting = { - "relax_pos": False, - "relax_shape": False, - "relax_vol": False, - } - parameter["init_from_suffix"] = parameter.get("init_from_suffix", "00") - self.init_from_suffix = parameter["init_from_suffix"] - self.cal_type = parameter["cal_type"] - parameter["cal_setting"] = parameter.get("cal_setting", default_cal_setting) - for key in default_cal_setting: - parameter["cal_setting"].setdefault(key, default_cal_setting[key]) - self.cal_setting = parameter["cal_setting"] - self.parameter = parameter - self.inter_param = inter_param if inter_param != None else {"type": "vasp"} - - def make_confs(self, path_to_work, path_to_equi, refine=False): - path_to_work = os.path.abspath(path_to_work) - if os.path.exists(path_to_work): - logging.warning("%s already exists" % path_to_work) - else: - os.makedirs(path_to_work) - path_to_equi = os.path.abspath(path_to_equi) - - task_list = [] - cwd = os.getcwd() - - if self.reprod: - print("surface reproduce starts") - if "init_data_path" not in self.parameter: - raise RuntimeError("please provide the initial data path to reproduce") - init_data_path = os.path.abspath(self.parameter["init_data_path"]) - task_list = make_repro( - self.inter_param, - init_data_path, - self.init_from_suffix, - path_to_work, - self.parameter.get("reprod_last_frame", True), - ) - - else: - if refine: - logging.info("surface refine starts") - task_list = make_refine( - self.parameter["init_from_suffix"], - self.parameter["output_suffix"], - path_to_work, - ) - # record miller - init_from_path = re.sub( - self.parameter["output_suffix"][::-1], - self.parameter["init_from_suffix"][::-1], - path_to_work[::-1], - count=1, - )[::-1] - task_list_basename = list(map(os.path.basename, task_list)) - - for ii in task_list_basename: - init_from_task = os.path.join(init_from_path, ii) - output_task = os.path.join(path_to_work, ii) - os.chdir(output_task) - if os.path.isfile("decohesion_energy.json"): - os.remove("decohesion_energy.json") - if os.path.islink("decohesion_energy.json"): - os.remove("decohesion_energy.json") - os.symlink( - os.path.relpath(os.path.join(init_from_task, "decohesion_energy.json")), - "decohesion_energy.json",) - else: - if self.inter_param["type"] == "abacus": - CONTCAR = abacus_utils.final_stru(path_to_equi) - POSCAR = "STRU" - else: - # refine = false && reproduce = false && self.inter_param["type"]== "vasp" - CONTCAR = "CONTCAR" - POSCAR = "POSCAR" - equi_contcar = os.path.join(path_to_equi, CONTCAR) - if not os.path.exists(equi_contcar): - raise RuntimeError("please do relaxation first") - - if self.inter_param["type"] == "abacus": - stru = dpdata.System(equi_contcar, fmt="stru") - stru.to("contcar", "CONTCAR.tmp") - ptypes = vasp_utils.get_poscar_types("CONTCAR.tmp") - ss = Structure.from_file("CONTCAR.tmp") - os.remove("CONTCAR.tmp") - else: - ptypes = vasp_utils.get_poscar_types(equi_contcar) - # element type read vasp fifth line - ss = Structure.from_file(equi_contcar) - - # gen POSCAR of Slab - all_slabs = [] - vacuum = [] - num = 0 - while self.vacuum_size_step * num <= self.max_vacuum_size: - vacuum_size = self.vacuum_size_step * num - slabs = self.__gen_slab_pmg(ss, self.miller_index, self.min_slab_size, vacuum_size) - num = num + 1 - all_slabs.append(slabs) - vacuum.append(vacuum_size) - - os.chdir(path_to_work) - if os.path.exists(POSCAR): - os.remove( - POSCAR) - os.symlink(os.path.relpath(equi_contcar), POSCAR) - for ii in range(len(all_slabs)): - output_task = os.path.join(path_to_work, "task.%06d" % ii) - os.makedirs(output_task, exist_ok=True) - os.chdir(output_task) - for jj in [ - "INCAR", - "POTCAR", - "POSCAR", - "conf.lmp", - "in.lammps", - "STRU", - ]: - if os.path.exists(jj): - os.remove(jj) - task_list.append(output_task) - - logging.info( - "# %03d generate " % ii, - output_task, - " \t %d atoms" % len(all_slabs[ii].sites), - ) - - all_slabs[ii].to("POSCAR.tmp", "POSCAR") - vasp_utils.regulate_poscar("POSCAR.tmp", "POSCAR") - vasp_utils.sort_poscar("POSCAR", "POSCAR", ptypes) - vasp_utils.perturb_xz("POSCAR", "POSCAR", self.pert_xz) - if self.inter_param["type"] == "abacus": - abacus_utils.poscar2stru("POSCAR", self.inter_param, "STRU") - os.remove("POSCAR") - decohesion_energy = {"miller_index": self.miller_index, "vacuum_size":vacuum[ii]} - dumpfn(decohesion_energy, "decohesion_energy.json", indent=4) - os.chdir(cwd) - return task_list - - def post_process(self, task_list): - pass - - def task_type(self): - return self.parameter["type"] - - def task_param(self): - return self.parameter - - def _compute_lower(self, output_file, all_tasks, all_res) -> [dict, str]: - output_file = os.path.abspath(output_file) - res_data = {} - ptr_data = os.path.dirname(output_file) + "\n" - if not self.reprod: - vacuum_size_step = loadfn(os.path.join(os.path.dirname(output_file), "param.json"))["vacuum_size_step"] - ptr_data += ("Miller Index: " + str(loadfn(os.path.join(os.path.dirname(output_file), "param.json"))["miller_index"]) + "\n") - ptr_data += "Vacuum_size(e-10 m):\tDecohesion_E(J/m^2) Decohesion_S(Pa)\n" - pre_task_result = loadfn(os.path.join(all_tasks[0],"result_task.json")) - pre_evac = 0 - equi_evac = pre_task_result["energies"][-1] - for ii in all_tasks: - task_result = loadfn(os.path.join(ii, "result_task.json")) - AA = np.linalg.norm( - np.cross(task_result["cells"][0][0], task_result["cells"][0][1]) - ) - structure_dir = os.path.basename(ii) - Cf = 1.60217657e-16 / 1e-20 * 0.001 - evac = (task_result["energies"][-1] - equi_evac) / AA * Cf - vacuum_size = loadfn(os.path.join(ii, "decohesion_energy.json"))["vacuum_size"] - stress = (evac - pre_evac) / vacuum_size_step * 1e10 - - ptr_data += "%-30s % 7.3f %10.3e \n" % ( - str(vacuum_size) + "-" + structure_dir + ":", - evac, - stress, - ) - res_data[str(vacuum_size) + "_" + structure_dir] = [ - evac, - stress, - vacuum_size, - ] - pre_evac = evac - - else: - if "init_data_path" not in self.parameter: - raise RuntimeError("please provide the initial data path to reproduce") - init_data_path = os.path.abspath(self.parameter["init_data_path"]) - res_data, ptr_data = post_repro( - init_data_path, - self.parameter["init_from_suffix"], - all_tasks, - ptr_data, - self.parameter.get("reprod_last_frame", True), - ) - - with open(output_file, "w") as fp: - json.dump(res_data, fp, indent=4) - - return res_data, ptr_data - - def __gen_slab_pmg(self, structure: Structure, - plane_miller, slab_size, vacuum_size) -> Structure: - - # Generate slab via Pymatgen - slabGen = SlabGenerator(structure, miller_index=plane_miller, - min_slab_size=slab_size, min_vacuum_size=0, - center_slab=True, in_unit_planes=False, - lll_reduce=True, reorient_lattice=False, - primitive=False) - slabs_pmg = slabGen.get_slabs(ftol=0.001) - slab = [s for s in slabs_pmg if s.miller_index == plane_miller][0] - # If a transform matrix is passed, reorient the slab - order = zip(slab.frac_coords, slab.species) - c_order = sorted(order, key=lambda x: x[0][2]) - sorted_frac_coords = [] - sorted_species = [] - for (frac_coord, species) in c_order: - sorted_frac_coords.append(frac_coord) - sorted_species.append(species) - # add vacuum layer to the slab with height unit of angstrom - a, b, c = slab.lattice.matrix - slab_height = slab.lattice.matrix[2][2] - if slab_height >= 0: - self.is_flip = False - elong_scale = 1 + (vacuum_size / slab_height) - else: - self.is_flip = True - elong_scale = 1 + (-vacuum_size / slab_height) - new_lattice = [a, b, elong_scale * c] - new_frac_coords = [] - for ii in range(len(sorted_frac_coords)): - coord = sorted_frac_coords[ii].copy() - coord[2] = coord[2] / elong_scale - new_frac_coords.append(coord) - slab_new = Structure(lattice=np.array(new_lattice), - coords=new_frac_coords, species=sorted_species) - - return slab_new - - diff --git a/apex/core/property/Decohesive.py b/apex/core/property/Decohesive.py new file mode 100644 index 00000000..4235450c --- /dev/null +++ b/apex/core/property/Decohesive.py @@ -0,0 +1,274 @@ +"""Utilities to build and post-process decohesive surface calculations.""" + +import glob +import json +import os +from typing import Dict, List + +import dpdata +import numpy as np +from monty.serialization import dumpfn, loadfn +from pymatgen.core.structure import Structure +from pymatgen.core.surface import SlabGenerator + +from apex.core.calculator.lib import abacus_utils +from apex.core.calculator.lib import vasp_utils +from apex.core.property.Property import Property +from apex.core.reproduce import make_repro, post_repro +from dflow.python import upload_packages + +upload_packages.append(__file__) + +CAL_SETTING_DEFAULT: Dict[str, bool] = { + "relax_pos": False, + "relax_shape": False, + "relax_vol": False, +} + +class Decohesive(Property): + def __init__(self, parameter: Dict, inter_param: Dict | None = None): + parameter["reproduce"] = parameter.get("reproduce", False) + self.reprod = parameter["reproduce"] + + if not self.reprod and not ( + "init_from_suffix" in parameter and "output_suffix" in parameter + ): + self.min_slab_size = parameter["min_slab_size"] + self.pert_xz = parameter.get("pert_xz", 0.01) + self.max_vacuum_size = parameter.get("max_vacuum_size", 15) + self.vacuum_size_step = parameter.get("vacuum_size_step", 1) + self.miller_index = tuple(parameter["miller_index"]) + + parameter["cal_type"] = "static" if self.reprod else parameter.get( + "cal_type", "static" + ) + parameter["cal_setting"] = parameter.get("cal_setting", {}).copy() + for key, val in CAL_SETTING_DEFAULT.items(): + parameter["cal_setting"].setdefault(key, val) + + if self.reprod: + parameter["init_from_suffix"] = parameter.get("init_from_suffix", "00") + self.init_from_suffix = parameter["init_from_suffix"] + + self.cal_type = parameter["cal_type"] + self.cal_setting = parameter["cal_setting"] + self.parameter = parameter + self.inter_param = inter_param or {"type": "vasp"} + + def make_confs(self, path_to_work: str, path_to_equi: str, refine: bool = False): + """Generate slab tasks with different vacuum sizes or reproduce prior runs.""" + path_to_work = os.path.abspath(path_to_work) + path_to_equi = os.path.abspath(path_to_equi) + os.makedirs(path_to_work, exist_ok=True) + + path_to_equi = self._maybe_override_equi(path_to_work, path_to_equi) + + if self.reprod: + return self._make_repro_tasks(path_to_work) + + ptypes, ss, equi_contcar, poscar_name = self._load_equilibrium(path_to_equi) + slabs, vacuums = self._build_slab_series(ss) + + cwd = os.getcwd() + try: + os.chdir(path_to_work) + if os.path.exists(poscar_name): + os.remove(poscar_name) + os.symlink(os.path.relpath(equi_contcar), poscar_name) + task_list: List[str] = [] + for idx, slab in enumerate(slabs): + task_dir = os.path.join(path_to_work, f"task.{idx:06d}") + self._write_task(task_dir, slab, ptypes, vacuums[idx]) + task_list.append(task_dir) + return task_list + finally: + os.chdir(cwd) + + def _maybe_override_equi(self, path_to_work: str, path_to_equi: str) -> str: + """Use provided start_confs_path if present; otherwise keep original path.""" + start_confs = self.parameter.get("start_confs_path") + if start_confs and os.path.exists(start_confs): + init_path_list = glob.glob(os.path.join(start_confs, "*")) + struct_init_name_list = [os.path.basename(ii) for ii in init_path_list] + struct_output_name = os.path.basename(os.path.dirname(path_to_work)) + assert ( + struct_output_name in struct_init_name_list + ), f"{struct_output_name} not in initial configuration names" + return os.path.abspath( + os.path.join(start_confs, struct_output_name, "relaxation", "relax_task") + ) + return path_to_equi + + def _make_repro_tasks(self, path_to_work: str) -> List[str]: + """Create reproduce tasks.""" + print("surface reproduce starts") + if "init_data_path" not in self.parameter: + raise RuntimeError("please provide the initial data path to reproduce") + init_data_path = os.path.abspath(self.parameter["init_data_path"]) + return make_repro( + self.inter_param, + init_data_path, + self.init_from_suffix, + path_to_work, + self.parameter.get("reprod_last_frame", True), + ) + + def _load_equilibrium(self, path_to_equi: str): + """Load equilibrium structure and POSCAR types.""" + if self.inter_param["type"] == "abacus": + contcar_name = abacus_utils.final_stru(path_to_equi) + poscar_name = "STRU" + else: + contcar_name = "CONTCAR" + poscar_name = "POSCAR" + + equi_contcar = os.path.join(path_to_equi, contcar_name) + if not os.path.exists(equi_contcar): + raise RuntimeError("please do relaxation first") + + if self.inter_param["type"] == "abacus": + stru = dpdata.System(equi_contcar, fmt="stru") + stru.to("contcar", "CONTCAR.tmp") + ptypes = vasp_utils.get_poscar_types("CONTCAR.tmp") + ss = Structure.from_file("CONTCAR.tmp") + os.remove("CONTCAR.tmp") + else: + ptypes = vasp_utils.get_poscar_types(equi_contcar) + ss = Structure.from_file(equi_contcar) + + return ptypes, ss, equi_contcar, poscar_name + + def _build_slab_series(self, ss: Structure): + """Generate slabs with incremental vacuum sizes.""" + all_slabs: List[Structure] = [] + vacuums: List[float] = [] + num = 0 + while self.vacuum_size_step * num <= self.max_vacuum_size: + vacuum_size = self.vacuum_size_step * num + slab = self.__gen_slab_pmg(ss, self.miller_index, self.min_slab_size, vacuum_size) + all_slabs.append(slab) + vacuums.append(vacuum_size) + num += 1 + return all_slabs, vacuums + + def _write_task(self, task_dir: str, slab: Structure, ptypes, vacuum_size: float): + """Write one task directory.""" + os.makedirs(task_dir, exist_ok=True) + cwd = os.getcwd() + try: + os.chdir(task_dir) + for fname in ["INCAR", "POTCAR", "POSCAR", "conf.lmp", "in.lammps", "STRU"]: + if os.path.exists(fname): + os.remove(fname) + + slab.to("POSCAR.tmp", "POSCAR") + vasp_utils.regulate_poscar("POSCAR.tmp", "POSCAR") + vasp_utils.sort_poscar("POSCAR", "POSCAR", ptypes) + vasp_utils.perturb_xz("POSCAR", "POSCAR", self.pert_xz) + + if self.inter_param["type"] == "abacus": + abacus_utils.poscar2stru("POSCAR", self.inter_param, "STRU") + os.remove("POSCAR") + + decohesive = {"miller_index": self.miller_index, "vacuum_size": vacuum_size} + dumpfn(decohesive, "decohesive.json", indent=4) + finally: + os.chdir(cwd) + + def post_process(self, task_list): + pass + + def task_type(self): + return self.parameter["type"] + + def task_param(self): + return self.parameter + + def _compute_lower(self, output_file, all_tasks, all_res): + output_file = os.path.abspath(output_file) + res_data: Dict[str, list] = {} + ptr_data = os.path.dirname(output_file) + "\n" + + if self.reprod: + if "init_data_path" not in self.parameter: + raise RuntimeError("please provide the initial data path to reproduce") + init_data_path = os.path.abspath(self.parameter["init_data_path"]) + res_data, ptr_data = post_repro( + init_data_path, + self.parameter["init_from_suffix"], + all_tasks, + ptr_data, + self.parameter.get("reprod_last_frame", True), + ) + else: + param_path = os.path.join(os.path.dirname(output_file), "param.json") + param_content = loadfn(param_path) + vacuum_size_step = param_content["vacuum_size_step"] + ptr_data += f"Miller Index: {param_content['miller_index']}\n" + ptr_data += "Vacuum_size(A) \tDecohesion_E(J/m^2) \tDecohesion_S(Pa)\n" + + first_result = loadfn(os.path.join(all_tasks[0], "result_task.json")) + equi_evac = first_result["energies"][-1] + pre_evac = 0.0 + CF_EV_TO_J_PER_M2 = 1.60217657e-16 / 1e-20 * 0.001 + + for task_dir in all_tasks: + task_result = loadfn(os.path.join(task_dir, "result_task.json")) + area = np.linalg.norm( + np.cross(task_result["cells"][0][0], task_result["cells"][0][1]) + ) + evac = (task_result["energies"][-1] - equi_evac) / area * CF_EV_TO_J_PER_M2 + vacuum_size = loadfn(os.path.join(task_dir, "decohesive.json"))["vacuum_size"] + stress = (evac - pre_evac) / vacuum_size_step * 1e10 + + ptr_data += f"{vacuum_size:7.3f} {evac:7.3f} {stress:10.3e} \n" + res_data[f"{vacuum_size}_{os.path.basename(task_dir)}"] = [ + vacuum_size, + evac, + stress, + ] + pre_evac = evac + + with open(output_file, "w") as fp: + json.dump(res_data, fp, indent=4) + + return res_data, ptr_data + + def __gen_slab_pmg( + self, structure: Structure, plane_miller, slab_size, vacuum_size + ) -> Structure: + """Create a slab and stretch c-axis to add vacuum.""" + slab_generator = SlabGenerator( + structure, + miller_index=plane_miller, + min_slab_size=slab_size, + min_vacuum_size=0, + center_slab=True, + in_unit_planes=False, + lll_reduce=True, + reorient_lattice=False, + primitive=False, + ) + slabs_pmg = slab_generator.get_slabs(ftol=0.001) + slab = next((s for s in slabs_pmg if s.miller_index == plane_miller), None) + if slab is None: + raise RuntimeError(f"No slab found for Miller index {plane_miller}") + + ordered = sorted(zip(slab.frac_coords, slab.species), key=lambda x: x[0][2]) + sorted_frac_coords, sorted_species = zip(*ordered) + + a_vec, b_vec, c_vec = slab.lattice.matrix + slab_height = abs(c_vec[2]) + self.is_flip = c_vec[2] < 0 + elong_scale = 1 + (abs(vacuum_size) / slab_height) + + new_lattice = [a_vec, b_vec, elong_scale * c_vec] + new_frac_coords = [] + for frac in sorted_frac_coords: + coord = frac.copy() + coord[2] = coord[2] / elong_scale + new_frac_coords.append(coord) + + return Structure( + lattice=np.array(new_lattice), coords=new_frac_coords, species=sorted_species + ) diff --git a/apex/core/property/EOS.py b/apex/core/property/EOS.py index 090b8c5e..9ba72236 100644 --- a/apex/core/property/EOS.py +++ b/apex/core/property/EOS.py @@ -165,7 +165,7 @@ def make_confs(self, path_to_work, path_to_equi, refine=False): self.parameter["scale2equi"] = [] task_num = 0 - while self.vol_start + self.vol_step * task_num < self.vol_end: + while self.vol_start + self.vol_step * task_num <= self.vol_end: vol = self.vol_start + task_num * self.vol_step output_task = os.path.join(path_to_work, "task.%06d" % task_num) os.makedirs(output_task, exist_ok=True) diff --git a/apex/core/property/FiniteTelastic.py b/apex/core/property/FiniteTelastic.py new file mode 100644 index 00000000..f6fa8733 --- /dev/null +++ b/apex/core/property/FiniteTelastic.py @@ -0,0 +1,667 @@ +"""Finite-temperature elastic constants from paired Langevin stress response. + +This property implements noise-reduced finite-temperature elastic constants via +paired Langevin stress-strain response. DOI: 10.1103/sd49-wqd6 +""" + +import logging +import math +import os +import re +from shutil import copyfile +from typing import Dict, List, Tuple + +import numpy as np +from monty.serialization import dumpfn, loadfn +from pymatgen.analysis.elasticity.elastic import ElasticTensor + +from apex.core.property.Property import Property +from apex.core.refine import make_refine +from dflow.python import upload_packages + +upload_packages.append(__file__) + +PROPERTY_TYPE = "finite_t_elastic" +METADATA_FILE = "FiniteTelastic.json" +STRESS_FILE = "stress_timeseries.txt" +EQUI_RESTART = "finite_t_elastic.equi.restart" + +DEFAULT_SUPERCELL = [2, 2, 2] +DEFAULT_CAL_SETTING = { + "temperature": [300], + "strain": 0.001, + "strain_components": [0, 1, 2, 3, 4, 5], + "equi_step": 16000, + "response_step": 16000, + "stress_output_every": 100, + "timestep": 0.001, + "tdamp": 0.1, + "pdamp": 1.0, + "seed": 12345, + "n_blocks": 10, + "method": "paired_langevin", +} + +COMPONENT_LABELS = { + 0: "xx", + 1: "yy", + 2: "zz", + 3: "yz", + 4: "xz", + 5: "xy", +} + +COMPONENT_ALIASES = { + "0": 0, + "xx": 0, + "11": 0, + "e11": 0, + "1": 1, + "yy": 1, + "22": 1, + "e22": 1, + "2": 2, + "zz": 2, + "33": 2, + "e33": 2, + "3": 3, + "yz": 3, + "zy": 3, + "23": 3, + "32": 3, + "e23": 3, + "e32": 3, + "4": 4, + "xz": 4, + "zx": 4, + "13": 4, + "31": 4, + "e13": 4, + "e31": 4, + "5": 5, + "xy": 5, + "yx": 5, + "12": 5, + "21": 5, + "e12": 5, + "e21": 5, +} + + +class FiniteTelastic(Property): + """ + LAMMPS-only finite-temperature elastic constants from paired stress response. + + Each strained production trajectory is paired with an unstrained reference + trajectory using the same equilibrated restart, velocity seed, Langevin seed, + timestep, tdamp, run length, and stress output cadence. This reduces noise in + stress differences but is not described as mathematically exact cancellation. + """ + + def __init__(self, parameter: Dict, inter_param: Dict | None = None): + if inter_param is not None and inter_param.get("type") in ["vasp", "abacus"]: + raise TypeError("FiniteTelastic supports only LAMMPS interactions.") + + parameter.setdefault("type", PROPERTY_TYPE) + parameter.setdefault("cal_setting", {}) + for key, val in DEFAULT_CAL_SETTING.items(): + parameter["cal_setting"].setdefault(key, val) + + if parameter["cal_setting"].get("method") != "paired_langevin": + raise ValueError("FiniteTelastic currently supports only method='paired_langevin'.") + + parameter["cal_setting"]["strain_components"] = normalize_strain_components( + parameter["cal_setting"]["strain_components"] + ) + parameter.setdefault("supercell_size", DEFAULT_SUPERCELL) + parameter["cal_type"] = "finite_t_elastic" + + self.parameter = parameter + self.cal_setting = parameter["cal_setting"] + self.supercell_size = parameter["supercell_size"] + self.inter_param = inter_param or {"type": "lammps"} + + def make_confs(self, path_to_work: str, path_to_equi: str, refine: bool = False): + path_to_work = os.path.abspath(path_to_work) + path_to_equi = os.path.abspath(path_to_equi) + os.makedirs(path_to_work, exist_ok=True) + + if self.inter_param["type"] in ["vasp", "abacus"]: + raise TypeError("FiniteTelastic only supports LAMMPS calculation.") + + if refine: + return self._make_refine(path_to_work) + + equi_contcar = os.path.join(path_to_equi, "CONTCAR") + if not os.path.exists(equi_contcar): + raise RuntimeError(f"missing CONTCAR in equilibrium path: {path_to_equi}") + + task_list: List[str] = [] + task_index = 0 + for temperature in self._temperatures(): + equi_task = os.path.join(path_to_work, f"task.{task_index:06d}") + os.makedirs(equi_task, exist_ok=True) + self._write_task( + equi_task, + equi_contcar, + temperature=temperature, + role="equi", + pair_id=None, + strain_component=None, + strain_value=0.0, + restart_source=None, + ) + task_list.append(equi_task) + task_index += 1 + + for component in self.cal_setting["strain_components"]: + for sign in [-1, 1]: + signed_strain = sign * float(self.cal_setting["strain"]) + sign_label = "m" if sign < 0 else "p" + pair_id = f"T{_format_temperature(temperature)}_c{component}_{sign_label}" + for role, value in [("reference", 0.0), ("strained", signed_strain)]: + task_dir = os.path.join(path_to_work, f"task.{task_index:06d}") + os.makedirs(task_dir, exist_ok=True) + self._write_task( + task_dir, + equi_contcar, + temperature=temperature, + role=role, + pair_id=pair_id, + strain_component=component, + strain_value=value, + restart_source=EQUI_RESTART, + ) + task_list.append(task_dir) + task_index += 1 + return task_list + + def post_process(self, task_list): + pass + + def task_type(self): + return self.parameter["type"] + + def task_param(self): + return self.parameter + + def _compute_lower(self, output_file, all_tasks, all_res): + output_file = os.path.abspath(output_file) + records = self._load_task_records(all_tasks) + warnings: List[str] = [] + res_data = { + "property": PROPERTY_TYPE, + "description": "noise-reduced finite-temperature elastic constants via paired Langevin stress-strain response", + "units": {"elastic_tensor": "GPa", "stress_timeseries": "bar"}, + "temperatures": {}, + } + ptr_data = os.path.dirname(output_file) + "\n" + ptr_data += "Finite-temperature elastic constants from paired Langevin stress-strain response\n" + ptr_data += "Method: noise-reduced paired Langevin\n" + ptr_data += "Stress convention: LAMMPS pressure sign-flipped to Cauchy stress\n" + ptr_data += "Units: elastic tensor in GPa\n" + + by_temperature: Dict[float, List[Dict]] = {} + for record in records: + by_temperature.setdefault(float(record["metadata"]["temperature"]), []).append(record) + + for temperature in sorted(by_temperature): + temp_records = by_temperature[temperature] + pairs = self._paired_records(temp_records) + temp_warnings: List[str] = [] + pair_results = [] + strain_rows = [] + stress_rows = [] + + for pair_id, pair in sorted(pairs.items()): + ref = pair["reference"] + strained = pair["strained"] + mean_delta, stderr_delta, block_means, n_samples, pair_warnings = _compute_pair_delta( + ref["task_dir"], + strained["task_dir"], + int(strained["metadata"]["n_blocks"]), + ) + temp_warnings.extend([f"{pair_id}: {msg}" for msg in pair_warnings]) + component = int(strained["metadata"]["strain_component"]) + strain_value = float(strained["metadata"]["strain_value"]) + strain_voigt = _voigt_strain(component, strain_value) + strain_rows.append(strain_voigt) + stress_rows.append(_stress_tensor_to_voigt(mean_delta)) + pair_results.append( + { + "pair_id": pair_id, + "strain_component": component, + "strain_label": COMPONENT_LABELS[component], + "strain_value": strain_value, + "mean_delta_stress_bar": mean_delta.tolist(), + "stderr_delta_stress_bar": stderr_delta.tolist(), + "block_mean_delta_stress_bar": block_means.tolist(), + "n_samples": n_samples, + "n_blocks": len(block_means), + } + ) + + c_raw_bar, c_sym_bar, rank = _fit_elastic_tensor_bar( + np.asarray(strain_rows, dtype=float), + np.asarray(stress_rows, dtype=float), + ) + c_gpa = _bar_to_gpa(c_sym_bar) + bulk, shear, young, poisson = _derive_moduli_from_voigt_gpa(c_gpa) + + temp_key = _format_temperature(temperature) + res_data["temperatures"][temp_key] = { + "method": "noise-reduced paired Langevin", + "strain_magnitude": float(self.cal_setting["strain"]), + "number_of_paired_responses": len(pair_results), + "rank": rank, + "elastic_tensor_raw_bar": c_raw_bar.tolist(), + "elastic_tensor": c_gpa.tolist(), + "elastic_tensor_GPa": c_gpa.tolist(), + "equilibrium_stress_bar": None, + "B": bulk, + "G": shear, + "E": young, + "u": poisson, + "poisson_ratio": poisson, + "pairs": pair_results, + "warnings": temp_warnings, + } + warnings.extend(temp_warnings) + + ptr_data += f"\nT = {temperature:g} K\n" + ptr_data += f"paired responses = {len(pair_results)}\n" + for row in c_gpa: + ptr_data += " ".join(f"{val:10.4f}" for val in row) + "\n" + ptr_data += f"# Bulk Modulus B = {bulk:.4f} GPa\n" + ptr_data += f"# Shear Modulus G = {shear:.4f} GPa\n" + ptr_data += f"# Youngs Modulus E = {young:.4f} GPa\n" + ptr_data += f"# Poisson Ratio u = {poisson:.6f}\n" + + if warnings: + res_data["warnings"] = warnings + ptr_data += "\nWarnings:\n" + for warning in warnings: + ptr_data += f"- {warning}\n" + + dumpfn(res_data, output_file, indent=4) + return res_data, ptr_data + + def _temperatures(self) -> List[float]: + temperatures = self.cal_setting["temperature"] + if isinstance(temperatures, (int, float)): + temperatures = [temperatures] + return [float(temp) for temp in temperatures] + + def _make_refine(self, path_to_work: str) -> List[str]: + if "init_from_suffix" not in self.parameter or "output_suffix" not in self.parameter: + raise NotImplementedError( + "FiniteTelastic refine requires init_from_suffix and output_suffix." + ) + logging.info("FiniteTelastic refine starts") + task_list = make_refine( + self.parameter["init_from_suffix"], + self.parameter["output_suffix"], + path_to_work, + ) + init_from_path = re.sub( + self.parameter["output_suffix"][::-1], + self.parameter["init_from_suffix"][::-1], + path_to_work[::-1], + count=1, + )[::-1] + for task_name in map(os.path.basename, task_list): + init_task = os.path.join(init_from_path, task_name) + out_task = os.path.join(path_to_work, task_name) + for fname in [ + METADATA_FILE, + "variable_FiniteTelastic.in", + "deform_FiniteTelastic.in", + "output_FiniteTelastic.in", + ]: + src = os.path.join(init_task, fname) + dst = os.path.join(out_task, fname) + if os.path.exists(dst) or os.path.islink(dst): + os.remove(dst) + if os.path.exists(src): + os.symlink(os.path.relpath(src, out_task), dst) + else: + raise RuntimeError(f"missing refine source file: {src}") + return task_list + + def _write_task( + self, + task_dir: str, + equi_contcar: str, + temperature: float, + role: str, + pair_id: str | None, + strain_component: int | None, + strain_value: float, + restart_source: str | None, + ): + for fname in [ + "INCAR", + "POTCAR", + "POSCAR", + "POSCAR.tmp", + "conf.lmp", + "in.lammps", + "STRU", + METADATA_FILE, + "variable_FiniteTelastic.in", + "deform_FiniteTelastic.in", + "output_FiniteTelastic.in", + ]: + path = os.path.join(task_dir, fname) + if os.path.exists(path) or os.path.islink(path): + os.remove(path) + + copyfile(equi_contcar, os.path.join(task_dir, "POSCAR")) + + metadata = self._metadata( + temperature=temperature, + role=role, + pair_id=pair_id, + strain_component=strain_component, + strain_value=strain_value, + restart_source=restart_source, + ) + dumpfn(metadata, os.path.join(task_dir, METADATA_FILE), indent=4) + with open(os.path.join(task_dir, "variable_FiniteTelastic.in"), "w") as fp: + fp.write(self._variable(metadata)) + with open(os.path.join(task_dir, "deform_FiniteTelastic.in"), "w") as fp: + fp.write(_deform_include(strain_component, strain_value)) + with open(os.path.join(task_dir, "output_FiniteTelastic.in"), "w") as fp: + fp.write(_output_include()) + + def _metadata( + self, + temperature: float, + role: str, + pair_id: str | None, + strain_component: int | None, + strain_value: float, + restart_source: str | None, + ) -> Dict: + component = None if strain_component is None else int(strain_component) + return { + "property": PROPERTY_TYPE, + "method": "paired_langevin", + "temperature": float(temperature), + "supercell_size": list(self.supercell_size), + "role": role, + "pair_id": pair_id, + "strain_component": component, + "strain_label": "none" if component is None else COMPONENT_LABELS[component], + "strain_value": float(strain_value), + "is_reference": role == "reference", + "restart_source": restart_source, + "langevin_seed": int(self.cal_setting["seed"]), + "timestep": float(self.cal_setting["timestep"]), + "tdamp": float(self.cal_setting["tdamp"]), + "pdamp": float(self.cal_setting["pdamp"]), + "equi_step": int(self.cal_setting["equi_step"]), + "response_step": int(self.cal_setting["response_step"]), + "stress_output_every": int(self.cal_setting["stress_output_every"]), + "n_blocks": int(self.cal_setting["n_blocks"]), + } + + def _variable(self, metadata: Dict) -> str: + restart_source = metadata["restart_source"] or EQUI_RESTART + return ( + "# variable_FiniteTelastic.in\n" + f"variable role string {metadata['role']}\n" + f"variable temperature equal {metadata['temperature']:.8g}\n" + f"variable nx equal {self.supercell_size[0]}\n" + f"variable ny equal {self.supercell_size[1]}\n" + f"variable nz equal {self.supercell_size[2]}\n" + f"variable timestep equal {metadata['timestep']:.8g}\n" + f"variable tdamp equal {metadata['tdamp']:.8g}\n" + f"variable pdamp equal {metadata['pdamp']:.8g}\n" + f"variable seed equal {metadata['langevin_seed']}\n" + f"variable equi_step equal {metadata['equi_step']}\n" + f"variable response_step equal {metadata['response_step']}\n" + f"variable stress_output_every equal {metadata['stress_output_every']}\n" + f"variable strain equal {metadata['strain_value']:.16g}\n" + f"variable restart_source string {restart_source}\n" + f"variable equi_restart string {EQUI_RESTART}\n" + ) + + def _load_task_records(self, all_tasks) -> List[Dict]: + records = [] + for task_dir in all_tasks: + metadata_path = os.path.join(task_dir, METADATA_FILE) + if not os.path.exists(metadata_path): + raise RuntimeError(f"missing {METADATA_FILE} in {task_dir}") + metadata = loadfn(metadata_path) + if metadata.get("property") != PROPERTY_TYPE: + raise RuntimeError(f"unexpected property metadata in {metadata_path}") + records.append({"task_dir": task_dir, "metadata": metadata}) + return records + + def _paired_records(self, records: List[Dict]) -> Dict[str, Dict[str, Dict]]: + pairs: Dict[str, Dict[str, Dict]] = {} + for record in records: + role = record["metadata"]["role"] + if role == "equi": + continue + pair_id = record["metadata"].get("pair_id") + if not pair_id: + raise RuntimeError(f"missing pair_id in {record['task_dir']}") + pairs.setdefault(pair_id, {}) + if role not in ["reference", "strained"]: + raise RuntimeError(f"invalid FiniteTelastic role '{role}' in {record['task_dir']}") + if role in pairs[pair_id]: + raise RuntimeError(f"duplicate {role} task for pair_id {pair_id}") + pairs[pair_id][role] = record + + for pair_id, pair in pairs.items(): + if "reference" not in pair: + raise RuntimeError(f"missing reference task for pair_id {pair_id}") + if "strained" not in pair: + raise RuntimeError(f"missing strained task for pair_id {pair_id}") + return pairs + + +def normalize_strain_components(components) -> List[int]: + normalized = [] + for component in components: + key = str(component).strip().lower() + if key not in COMPONENT_ALIASES: + raise ValueError(f"unsupported strain component '{component}'") + normalized.append(COMPONENT_ALIASES[key]) + return normalized + + +def _pressure_bar_to_stress_bar(pressure_tensor): + return -np.asarray(pressure_tensor, dtype=float) + + +def _bar_to_gpa(value): + return np.asarray(value, dtype=float) / 10000.0 + + +def _read_stress_timeseries(task_dir: str) -> Dict[int, np.ndarray]: + path = os.path.join(task_dir, STRESS_FILE) + if not os.path.exists(path): + raise RuntimeError(f"missing {STRESS_FILE} in {task_dir}") + + data: Dict[int, np.ndarray] = {} + with open(path, "r") as fp: + for line in fp: + stripped = line.strip() + if not stripped or stripped.startswith("#"): + continue + parts = stripped.split() + if len(parts) != 7: + continue + try: + step = int(float(parts[0])) + pxx, pyy, pzz, pxy, pxz, pyz = [float(val) for val in parts[1:]] + except ValueError: + continue + pressure = np.array( + [ + [pxx, pxy, pxz], + [pxy, pyy, pyz], + [pxz, pyz, pzz], + ], + dtype=float, + ) + data[step] = pressure + if not data: + raise RuntimeError(f"empty or unparsable {STRESS_FILE} in {task_dir}") + return data + + +def _compute_pair_delta(ref_task: str, strained_task: str, n_blocks: int): + ref_pressure = _read_stress_timeseries(ref_task) + strained_pressure = _read_stress_timeseries(strained_task) + common_steps = sorted(set(ref_pressure).intersection(strained_pressure)) + if not common_steps: + raise RuntimeError(f"no common time steps between {ref_task} and {strained_task}") + + warnings = [] + dropped = len(ref_pressure) + len(strained_pressure) - 2 * len(common_steps) + if dropped: + warnings.append(f"dropped {dropped} unpaired stress samples during step alignment") + + deltas = [] + for step in common_steps: + ref_stress = _pressure_bar_to_stress_bar(ref_pressure[step]) + strained_stress = _pressure_bar_to_stress_bar(strained_pressure[step]) + deltas.append(strained_stress - ref_stress) + deltas = np.asarray(deltas, dtype=float) + mean = np.mean(deltas, axis=0) + block_means, stderr = _block_average(deltas, n_blocks) + return mean, stderr, block_means, len(common_steps), warnings + + +def _block_average(values, n_blocks: int): + arr = np.asarray(values, dtype=float) + if arr.shape[0] == 0: + raise RuntimeError("cannot block-average an empty array") + n_blocks = max(1, min(int(n_blocks), arr.shape[0])) + chunks = np.array_split(arr, n_blocks, axis=0) + block_means = np.asarray([np.mean(chunk, axis=0) for chunk in chunks]) + if len(block_means) == 1: + stderr = np.zeros_like(block_means[0], dtype=float) + else: + stderr = np.std(block_means, axis=0, ddof=1) / math.sqrt(len(block_means)) + return block_means, stderr + + +def _voigt_strain_tensor(component: int, strain_value: float): + tensor = np.zeros((3, 3), dtype=float) + if component in [0, 1, 2]: + tensor[component, component] = strain_value + elif component == 3: + tensor[1, 2] = tensor[2, 1] = strain_value / 2.0 + elif component == 4: + tensor[0, 2] = tensor[2, 0] = strain_value / 2.0 + elif component == 5: + tensor[0, 1] = tensor[1, 0] = strain_value / 2.0 + else: + raise ValueError(f"unsupported strain component {component}") + return tensor + + +def _voigt_strain(component: int, strain_value: float): + """Return engineering Voigt strain used by the 6x6 elastic matrix fit. + + LAMMPS tilt changes use engineering shear gamma. The tensor strain has + epsilon_ij = gamma / 2, while the Voigt strain vector for C44/C55/C66 uses + gamma so stress_ij = C_ij * gamma. + """ + voigt = np.zeros(6, dtype=float) + voigt[component] = strain_value + return voigt + + +def _stress_tensor_to_voigt(stress_tensor): + stress = np.asarray(stress_tensor, dtype=float) + return np.array( + [stress[0, 0], stress[1, 1], stress[2, 2], stress[1, 2], stress[0, 2], stress[0, 1]], + dtype=float, + ) + + +def _fit_elastic_tensor_bar(strain_rows, stress_rows): + strain = np.asarray(strain_rows, dtype=float) + stress = np.asarray(stress_rows, dtype=float) + if strain.ndim != 2 or strain.shape[1] != 6: + raise RuntimeError("strain matrix must have shape (n_pairs, 6)") + if stress.ndim != 2 or stress.shape != (strain.shape[0], 6): + raise RuntimeError("stress matrix must have shape (n_pairs, 6)") + + rank = int(np.linalg.matrix_rank(strain)) + if rank < 6: + raise RuntimeError( + f"insufficient independent strain responses to fit full elastic tensor: rank {rank} < 6" + ) + solution, _, _, _ = np.linalg.lstsq(strain, stress, rcond=None) + c_raw = solution.T + c_sym = 0.5 * (c_raw + c_raw.T) + return c_raw, c_sym, rank + + +def _derive_moduli_from_voigt_gpa(c_voigt_gpa): + c_voigt_gpa = np.asarray(c_voigt_gpa, dtype=float) + if c_voigt_gpa.shape != (6, 6): + raise RuntimeError("elastic Voigt matrix must have shape (6, 6)") + et = ElasticTensor.from_voigt(c_voigt_gpa) + bulk = float(et.k_voigt) + shear = float(et.g_voigt) + young = float(9.0 * bulk * shear / (3.0 * bulk + shear)) + poisson = float(0.5 * (3.0 * bulk - 2.0 * shear) / (3.0 * bulk + shear)) + return bulk, shear, young, poisson + + +def _deform_include(strain_component: int | None, strain_value: float) -> str: + ret = "# deform_FiniteTelastic.in\n" + ret += "# Shear tilt uses engineering shear gamma; fitting uses Voigt shear gamma.\n" + if strain_component is None or abs(float(strain_value)) == 0.0: + ret += "# reference/equilibration task: no strain deformation\n" + return ret + if strain_component == 0: + ret += "variable scale_x equal 1.0+${strain}\n" + ret += "change_box all x scale ${scale_x} remap units box\n" + elif strain_component == 1: + ret += "variable scale_y equal 1.0+${strain}\n" + ret += "change_box all y scale ${scale_y} remap units box\n" + elif strain_component == 2: + ret += "variable scale_z equal 1.0+${strain}\n" + ret += "change_box all z scale ${scale_z} remap units box\n" + elif strain_component == 3: + ret += "variable d_yz equal ${strain}*lz\n" + ret += "change_box all yz delta ${d_yz} remap units box\n" + elif strain_component == 4: + ret += "variable d_xz equal ${strain}*lz\n" + ret += "change_box all xz delta ${d_xz} remap units box\n" + elif strain_component == 5: + ret += "variable d_xy equal ${strain}*ly\n" + ret += "change_box all xy delta ${d_xy} remap units box\n" + else: + raise ValueError(f"unsupported strain component {strain_component}") + return ret + + +def _output_include() -> str: + return ( + "# output_FiniteTelastic.in\n" + "variable out_pxx equal pxx\n" + "variable out_pyy equal pyy\n" + "variable out_pzz equal pzz\n" + "variable out_pxy equal pxy\n" + "variable out_pxz equal pxz\n" + "variable out_pyz equal pyz\n" + "fix stress_out all ave/time ${stress_output_every} 1 ${stress_output_every} " + "v_out_pxx v_out_pyy v_out_pzz v_out_pxy v_out_pxz v_out_pyz " + "file stress_timeseries.txt title1 '# step pxx pyy pzz pxy pxz pyz'\n" + ) + + +def _format_temperature(temperature: float) -> str: + if float(temperature).is_integer(): + return str(int(temperature)) + return ("%g" % temperature).replace(".", "p") diff --git a/apex/core/property/FiniteTlatt.py b/apex/core/property/FiniteTlatt.py new file mode 100644 index 00000000..04f2fc48 --- /dev/null +++ b/apex/core/property/FiniteTlatt.py @@ -0,0 +1,226 @@ +"""Lattice parameter vs temperature (LAMMPS npt + averaging). Only LAMMPS supported.""" + +import json +import logging +import os +import re +from shutil import copyfile +from typing import Dict, List, Tuple + +from monty.serialization import dumpfn + +from apex.core.property.Property import Property +from apex.core.refine import make_refine +from apex.core.reproduce import make_repro, post_repro +from dflow.python import upload_packages + +upload_packages.append(__file__) + +DEFAULT_SUPERCELL = [2, 2, 2] +DEFAULT_CAL_SETTING: Dict[str, int | List[int]] = { + "temperature": [200, 400, 600, 800], + "equi_step": 80000, + "N_every": 100, + "N_repeat": 10, + "N_freq": 2000, + "ave_step": 40000, + "timestep": 0.001, + "tdamp": 0.1, + "pdamp": 1.0} + + +class FiniteTlatt(Property): + """ + Generate LAMMPS tasks to measure lattice parameters at finite temperatures + using NPT runs plus time-averaging. + """ + + def __init__(self, parameter: Dict, inter_param: Dict | None = None): + parameter["reproduce"] = parameter.get("reproduce", False) + self.reprod = parameter["reproduce"] + + # Enforce LAMMPS-only workflow + if inter_param is not None and inter_param.get("type") in ["vasp", "abacus"]: + raise TypeError("FiniteTlatt supports only LAMMPS calculations.") + + parameter.setdefault("cal_setting", {}) + for key, val in DEFAULT_CAL_SETTING.items(): + parameter["cal_setting"].setdefault(key, val) + + if not self.reprod and not ( + "init_from_suffix" in parameter and "output_suffix" in parameter + ): + parameter["supercell_size"] = parameter.get("supercell_size", DEFAULT_SUPERCELL) + self.supercell_size = parameter["supercell_size"] + else: + parameter["init_from_suffix"] = parameter.get("init_from_suffix", "00") + self.init_from_suffix = parameter["init_from_suffix"] + self.supercell_size = parameter.get("supercell_size", DEFAULT_SUPERCELL) + + parameter["cal_type"] = "npt+ave/time" + self.cal_setting = parameter["cal_setting"] + self.parameter = parameter + # only supports LAMMPS now + self.inter_param = inter_param or {"type": "lammps"} + + def make_confs(self, path_to_work: str, path_to_equi: str, refine: bool = False): + path_to_work = os.path.abspath(path_to_work) + os.makedirs(path_to_work, exist_ok=True) + path_to_equi = os.path.abspath(path_to_equi) + + cwd = os.getcwd() + if self.reprod: + task_list = self._make_repro(path_to_work) + elif refine: + task_list = self._make_refine(path_to_work) + else: + task_list = self._make_fresh_tasks(path_to_work, path_to_equi) + os.chdir(cwd) + return task_list + + def post_process(self, task_list): + pass + + def task_type(self): + return self.parameter["type"] + + def task_param(self): + return self.parameter + + def _compute_lower(self, output_file, all_tasks, all_res): + output_file = os.path.abspath(output_file) + res_data: Dict[str, List[float]] = {} + ptr_data = os.path.dirname(output_file) + "\n" + + if self.reprod: + if "init_data_path" not in self.parameter: + raise RuntimeError("please provide the initial data path to reproduce") + init_data_path = os.path.abspath(self.parameter["init_data_path"]) + res_data, ptr_data = post_repro( + init_data_path, + self.parameter["init_from_suffix"], + all_tasks, + ptr_data, + self.parameter.get("reprod_last_frame", True), + ) + else: + ptr_data += " Temperature(K) a(A) b(A) c(A)\n" + for idx, task_dir in enumerate(all_tasks): + temp = self.cal_setting["temperature"][idx] + a, b, c = self._average_box(task_dir, self.supercell_size) + ptr_data += f"{temp:>10}: {a:7.6f} {b:7.6f} {c:7.6f}\n" + res_data[str(temp)] = [a, b, c, temp] + + with open(output_file, "w") as fp: + json.dump(res_data, fp, indent=4) + + return res_data, ptr_data + + # ---- helpers ----------------------------------------------------- + def _make_repro(self, path_to_work: str) -> List[str]: + if "init_data_path" not in self.parameter: + raise RuntimeError("please provide the initial data path to reproduce") + init_data_path = os.path.abspath(self.parameter["init_data_path"]) + return make_repro( + self.inter_param, + init_data_path, + self.init_from_suffix, + path_to_work, + self.parameter.get("reprod_last_frame", True), + ) + + def _make_refine(self, path_to_work: str) -> List[str]: + logging.info("FiniteTlatt refine starts") + task_list = make_refine( + self.parameter["init_from_suffix"], + self.parameter["output_suffix"], + path_to_work, + ) + init_from_path = re.sub( + self.parameter["output_suffix"][::-1], + self.parameter["init_from_suffix"][::-1], + path_to_work[::-1], + count=1, + )[::-1] + for task_name in map(os.path.basename, task_list): + init_task = os.path.join(init_from_path, task_name) + out_task = os.path.join(path_to_work, task_name) + self._symlink_variable(init_task, out_task) + return task_list + + def _make_fresh_tasks(self, path_to_work: str, path_to_equi: str) -> List[str]: + if self.inter_param["type"] in ["vasp", "abacus"]: + raise TypeError("FiniteTlatt only supports LAMMPS calculation") + + equi_contcar = os.path.join(path_to_equi, "CONTCAR") + if not os.path.exists(equi_contcar): + raise RuntimeError("please do relaxation first") + + task_list: List[str] = [] + for idx, temp in enumerate(self.cal_setting["temperature"]): + task_dir = os.path.join(path_to_work, f"task.{idx:06d}") + os.makedirs(task_dir, exist_ok=True) + self._write_task(task_dir, equi_contcar, temp) + task_list.append(task_dir) + return task_list + + def _symlink_variable(self, init_task: str, out_task: str): + os.makedirs(out_task, exist_ok=True) + dst = os.path.join(out_task, "variable_FiniteTlatt.json") + if os.path.exists(dst): + os.remove(dst) + os.symlink( + os.path.relpath(os.path.join(init_task, "variable_FiniteTlatt.json"), out_task), + dst, + ) + + def _write_task(self, task_dir: str, equi_contcar: str, temp: float): + os.chdir(task_dir) + for fname in ["INCAR", "POTCAR", "POSCAR", "conf.lmp", "in.lammps", "STRU"]: + if os.path.exists(fname): + os.remove(fname) + copyfile(equi_contcar, "POSCAR") + + FiniteTlatt_task = {"temperature": temp, "supercell_size": self.supercell_size} + dumpfn(FiniteTlatt_task, "FiniteTlatt.json", indent=4) + + with open("variable_FiniteTlatt.in", "w") as fp: + fp.write(self._variable(temp)) + + def _average_box(self, task_dir: str, supercell_size: List[int]) -> Tuple[float, float, float]: + a_sum = b_sum = c_sum = count = 0 + box_file = os.path.join(task_dir, "average_box.txt") + with open(box_file, "r") as fh: + for line in fh: + if line.startswith("#") or not line.strip(): + continue + parts = line.split() + if len(parts) == 4: + _, v_lx, v_ly, v_lz = parts + a_sum += float(v_lx) + b_sum += float(v_ly) + c_sum += float(v_lz) + count += 1 + if count == 0: + return 0.0, 0.0, 0.0 + a = a_sum / count / supercell_size[0] + b = b_sum / count / supercell_size[1] + c = c_sum / count / supercell_size[2] + return a, b, c + + def _variable(self, temp: float) -> str: + return ( + " # variable_FiniteTlatt.in \n" + f"variable temperature equal {temp:.2f}\n" + f"variable nx equal {self.supercell_size[0]}\n" + f"variable ny equal {self.supercell_size[1]}\n" + f"variable nz equal {self.supercell_size[2]}\n" + f"variable equi_step equal {self.cal_setting['equi_step']}\n" + f"variable N_every equal {self.cal_setting['N_every']}\n" + f"variable N_repeat equal {self.cal_setting['N_repeat']}\n" + f"variable N_freq equal {self.cal_setting['N_freq']}\n" + f"variable ave_step equal {self.cal_setting['ave_step']}\n" + f"variable timestep equal {self.cal_setting['timestep']}\n" + f"variable tdamp equal {self.cal_setting['tdamp']}\n" + f"variable pdamp equal {self.cal_setting['pdamp']}\n" + ) diff --git a/apex/core/property/Gamma.py b/apex/core/property/Gamma.py index 223743c6..faed243c 100644 --- a/apex/core/property/Gamma.py +++ b/apex/core/property/Gamma.py @@ -452,7 +452,7 @@ def __inLammpes_fix(self, inLammps) -> None: with open(inLammps, "r") as fin1: contents = fin1.readlines() for ii in range(len(contents)): - upper = re.search("variable N equal count\(all\)", contents[ii]) + upper = contents[ii].split()[:3] == ["variable", "N", "equal"] lower = re.search("min_style cg", contents[ii]) if lower: lower_id = ii diff --git a/apex/core/property/GammaSurface.py b/apex/core/property/GammaSurface.py new file mode 100644 index 00000000..7835fd1b --- /dev/null +++ b/apex/core/property/GammaSurface.py @@ -0,0 +1,591 @@ +import glob +import json +import logging +import os +import re + +import dpdata +import numpy as np +from monty.serialization import dumpfn, loadfn +from pymatgen.analysis.diffraction.tem import TEMCalculator +from pymatgen.core.structure import Structure +from pymatgen.core.surface import SlabGenerator + +from apex.core.calculator.lib import abacus_utils +from apex.core.calculator.lib import vasp_utils +from apex.core.lib.slab_orientation import SlabSlipSystem +from apex.core.lib.trans_tools import direction_miller_bravais_to_miller +from apex.core.lib.trans_tools import plane_miller_bravais_to_miller +from apex.core.lib.trans_tools import trans_mat_basis +from apex.core.property.Property import Property +from apex.core.refine import make_refine +from apex.core.reproduce import make_repro +from apex.core.reproduce import post_repro +from apex.core.structure import StructureInfo +from dflow.python import upload_packages + +upload_packages.append(__file__) + + +class GammaSurface(Property): + """Calculation of generalized stacking fault energy surface.""" + + def __init__(self, parameter, inter_param=None): + parameter["reproduce"] = parameter.get("reproduce", False) + self.reprod = parameter["reproduce"] + if not self.reprod: + if not ("init_from_suffix" in parameter and "output_suffix" in parameter): + parameter["plane_miller"] = parameter.get("plane_miller", None) + self.plane_miller = parameter["plane_miller"] + parameter["slip_direction"] = parameter.get("slip_direction", None) + self.slip_direction = parameter["slip_direction"] + parameter["slip_length"] = parameter.get("slip_length", None) + self.slip_length = parameter["slip_length"] + parameter["slip_length_y"] = parameter.get("slip_length_y", None) + self.slip_length_y = parameter["slip_length_y"] + parameter["plane_shift"] = parameter.get("plane_shift", 0) + self.plane_shift = parameter["plane_shift"] + parameter["supercell_size"] = parameter.get("supercell_size", (1, 1, 5)) + self.supercell_size = parameter["supercell_size"] + parameter["vacuum_size"] = parameter.get("vacuum_size", 0) + self.vacuum_size = parameter["vacuum_size"] + parameter["add_fix"] = parameter.get( + "add_fix", ["true", "true", "false"] + ) + self.add_fix = parameter["add_fix"] + parameter["n_steps_x"] = parameter.get( + "n_steps_x", parameter.get("n_steps", 10) + ) + parameter["n_steps"] = parameter["n_steps_x"] + self.n_steps_x = parameter["n_steps_x"] + self.n_steps = self.n_steps_x + parameter["n_steps_y"] = parameter.get("n_steps_y", self.n_steps_x) + self.n_steps_y = parameter["n_steps_y"] + self.atom_num = None + parameter["cal_type"] = parameter.get("cal_type", "relaxation") + default_cal_setting = { + "relax_pos": True, + "relax_shape": False, + "relax_vol": False, + } + else: + parameter["cal_type"] = "static" + self.cal_type = parameter["cal_type"] + default_cal_setting = { + "relax_pos": False, + "relax_shape": False, + "relax_vol": False, + } + parameter["init_from_suffix"] = parameter.get("init_from_suffix", "00") + self.init_from_suffix = parameter["init_from_suffix"] + self.cal_type = parameter["cal_type"] + parameter["cal_setting"] = parameter.get("cal_setting", default_cal_setting) + for key in default_cal_setting: + parameter["cal_setting"].setdefault(key, default_cal_setting[key]) + self.cal_setting = parameter["cal_setting"] + self.parameter = parameter + self.inter_param = inter_param if inter_param is not None else {"type": "vasp"} + + def _resolve_equilibrium_structure(self, path_to_equi): + if self.inter_param["type"] == "abacus": + return os.path.join(path_to_equi, abacus_utils.final_stru(path_to_equi)), "STRU" + return os.path.join(path_to_equi, "CONTCAR"), "POSCAR" + + def _load_equilibrium_structure(self, equi_contcar): + if self.inter_param["type"] == "abacus": + stru = dpdata.System(equi_contcar, fmt="stru") + stru.to("contcar", "CONTCAR.tmp") + try: + ptypes = vasp_utils.get_poscar_types("CONTCAR.tmp") + ss = Structure.from_file("CONTCAR.tmp") + finally: + os.remove("CONTCAR.tmp") + return ptypes, ss + ptypes = vasp_utils.get_poscar_types(equi_contcar) + ss = Structure.from_file(equi_contcar) + return ptypes, ss + + def _finalize_task_structure(self): + if self.inter_param["type"] == "abacus": + abacus_utils.poscar2stru("POSCAR", self.inter_param, "STRU") + + def _fix_task_output(self, task_dir, first_task): + if self.inter_param["type"] == "abacus": + self.__stru_fix(os.path.join(task_dir, "STRU")) + return + self.__poscar_fix(os.path.join(task_dir, "POSCAR")) + + def make_confs(self, path_to_work, path_to_equi, refine=False): + path_to_work = os.path.abspath(path_to_work) + if os.path.exists(path_to_work): + logging.debug("%s already exists" % path_to_work) + else: + os.makedirs(path_to_work) + path_to_equi = os.path.abspath(path_to_equi) + + if "start_confs_path" in self.parameter and os.path.exists( + self.parameter["start_confs_path"] + ): + init_path_list = glob.glob(os.path.join(self.parameter["start_confs_path"], "*")) + struct_init_name_list = [os.path.basename(ii) for ii in init_path_list] + struct_output_name = os.path.basename(os.path.dirname(path_to_work)) + assert ( + struct_output_name in struct_init_name_list + ), f"{struct_output_name} not in initial configuration names" + path_to_equi = os.path.abspath( + os.path.join( + self.parameter["start_confs_path"], + struct_output_name, + "relaxation", + "relax_task", + ) + ) + + task_list = [] + cwd = os.getcwd() + + if self.reprod: + print("gamma surface reproduce starts") + if "init_data_path" not in self.parameter: + raise RuntimeError("please provide the initial data path to reproduce") + init_data_path = os.path.abspath(self.parameter["init_data_path"]) + task_list = make_repro( + self.inter_param, + init_data_path, + self.init_from_suffix, + path_to_work, + self.parameter.get("reprod_last_frame", True), + ) + + else: + if refine: + print("gamma surface refine starts") + task_list = make_refine( + self.parameter["init_from_suffix"], + self.parameter["output_suffix"], + path_to_work, + ) + init_from_path = re.sub( + self.parameter["output_suffix"][::-1], + self.parameter["init_from_suffix"][::-1], + path_to_work[::-1], + count=1, + )[::-1] + task_list_basename = list(map(os.path.basename, task_list)) + + for ii in task_list_basename: + init_from_task = os.path.join(init_from_path, ii) + output_task = os.path.join(path_to_work, ii) + os.chdir(output_task) + if os.path.exists("miller.json"): + os.remove("miller.json") + os.symlink( + os.path.relpath(os.path.join(init_from_task, "miller.json")), + "miller.json", + ) + + else: + equi_contcar, POSCAR = self._resolve_equilibrium_structure(path_to_equi) + if not os.path.exists(equi_contcar): + raise RuntimeError("please do relaxation first") + + ptypes, ss = self._load_equilibrium_structure(equi_contcar) + + os.chdir(path_to_equi) + ss.to("CONTCAR.direct", "POSCAR") + ss = Structure.from_file("CONTCAR.direct") + st = StructureInfo(ss) + self.structure_type = st.lattice_structure + self.conv_std_structure = st.conventional_structure + relax_a = self.conv_std_structure.lattice.a + relax_b = self.conv_std_structure.lattice.b + relax_c = self.conv_std_structure.lattice.c + + type_param = self.parameter.get(self.structure_type, None) + if type_param: + self.plane_miller = type_param.get("plane_miller", self.plane_miller) + self.slip_direction = type_param.get("slip_direction", self.slip_direction) + self.slip_length = type_param.get("slip_length", self.slip_length) + self.slip_length_y = type_param.get("slip_length_y", self.slip_length_y) + self.plane_shift = type_param.get("plane_shift", self.plane_shift) + self.supercell_size = type_param.get("supercell_size", self.supercell_size) + self.vacuum_size = type_param.get("vacuum_size", self.vacuum_size) + self.add_fix = type_param.get("add_fix", self.add_fix) + self.n_steps_x = type_param.get( + "n_steps_x", type_param.get("n_steps", self.n_steps_x) + ) + self.n_steps = self.n_steps_x + self.n_steps_y = type_param.get("n_steps_y", self.n_steps_y) + + if not (self.plane_miller and self.slip_direction): + raise RuntimeError( + "fail to obtain both slip plane and slip direction info from input json file!" + ) + + if self.structure_type not in ["bcc", "fcc", "hcp"]: + logging.warning( + "Gamma surface function for %s is not fully supported so far. " + "Please double check generated slab structures.", + self.structure_type, + ) + + plane_miller, _, slip_length_x, Q = self.__convert_input_miller( + self.conv_std_structure + ) + slab = self.__gen_slab_pmg( + self.conv_std_structure, plane_miller, trans_matrix=Q + ) + self.atom_num = len(slab.sites) + + os.chdir(path_to_work) + if os.path.exists(POSCAR): + os.remove(POSCAR) + os.symlink(os.path.relpath(equi_contcar), POSCAR) + + slip_length_x = self.__resolve_slip_length( + slip_length_x, relax_a, relax_b, relax_c + ) + if self.slip_length_y is None: + self.slip_length_y = slip_length_x + slip_length_y = self.__resolve_slip_length( + self.slip_length_y, relax_a, relax_b, relax_c + ) + self.slip_length = slip_length_x + self.slip_length_y = slip_length_y + + top_atoms = np.where(slab.frac_coords[:, 2] > 0.5)[0] + n_steps_x = int(self.n_steps_x) + n_steps_y = int(self.n_steps_y) + n_steps_x_denom = max(n_steps_x, 1) + n_steps_y_denom = max(n_steps_y, 1) + + count = 0 + for idx_x in range(n_steps_x + 1): + frac_x = idx_x / n_steps_x_denom + for idx_y in range(n_steps_y + 1): + frac_y = idx_y / n_steps_y_denom + output_task = os.path.join(path_to_work, "task.%06d" % count) + os.makedirs(output_task, exist_ok=True) + os.chdir(output_task) + for jj in ["INCAR", "POTCAR", POSCAR, "conf.lmp", "in.lammps"]: + if os.path.exists(jj): + os.remove(jj) + task_list.append(output_task) + + disp_cart = np.array( + [slip_length_x * frac_x, slip_length_y * frac_y, 0.0] + ) + slab_task = slab.copy() + if np.linalg.norm(disp_cart) > 0: + slab_task.translate_sites( + indices=top_atoms, + vector=disp_cart, + frac_coords=False, + to_unit_cell=True, + ) + + slab_task.to("POSCAR.tmp", "POSCAR") + vasp_utils.regulate_poscar("POSCAR.tmp", "POSCAR") + vasp_utils.sort_poscar("POSCAR", "POSCAR", ptypes) + self._finalize_task_structure() + dumpfn(self.plane_miller, "miller.json") + dumpfn(slip_length_x, "slip_length_x.json") + dumpfn(slip_length_y, "slip_length_y.json") + dumpfn( + { + "frac_x": frac_x, + "frac_y": frac_y, + "idx_x": idx_x, + "idx_y": idx_y, + }, + "displacement.json", + ) + count += 1 + + os.chdir(cwd) + return task_list + + def __resolve_slip_length(self, slip_length, relax_a, relax_b, relax_c): + if isinstance(slip_length, (int, float)): + return float(slip_length) * relax_a + try: + slip_vector_cartesian = np.multiply( + np.array(slip_length), np.array([relax_a, relax_b, relax_c]) + ) + return float(np.linalg.norm(slip_vector_cartesian, 2)) + except Exception: + raise RuntimeError( + "Only int | float or Sequence[int | float, int | float, int | float] " + "is allowed for slip_length/slip_length_y" + ) + + def __convert_input_miller(self, structure: Structure): + plane_miller = tuple(self.plane_miller) + slip_direction = tuple(self.slip_direction) + slip_length = self.slip_length + + plane_str = "".join([str(i) for i in plane_miller]) + slip_str = "".join([str(i) for i in slip_direction]) + combined_key = "x".join([plane_str, slip_str]) + l2_normalize_1d = lambda v: v / np.linalg.norm(v, 2) + + dir_dict = SlabSlipSystem.atomic_system_dict() + try: + system = dir_dict[self.structure_type] + plane_miller, x_miller, xy_miller, stored_slip_length = system[combined_key].values() + except KeyError: + logging.warning( + "Input slip system is not pre-defined in GammaSurface. " + "Please double check generated slab structure." + ) + x_miller = slip_direction + if not slip_length: + slip_length = 1 + if self.structure_type == "hcp" and ( + len(self.plane_miller) == 4 or len(self.slip_direction) == 4 + ): + if len(plane_miller) == 4: + plane_miller = plane_miller_bravais_to_miller(self.plane_miller) + if len(x_miller) == 4: + x_miller = direction_miller_bravais_to_miller(self.slip_direction) + dir_dot = np.array(plane_miller).dot(np.array(x_miller)) + if dir_dot != 0: + raise RuntimeError( + f"slip direction {self.slip_direction} is not on plane given {self.plane_miller}" + ) + x_cartesian = np.dot(np.array(x_miller), structure.lattice.matrix) + z_cartesian = np.dot(np.array(plane_miller), structure.lattice.matrix) + x_cartesian_unit_vector = l2_normalize_1d(x_cartesian) + y_cartesian_unit_vector = l2_normalize_1d(np.cross(z_cartesian, x_cartesian)) + z_cartesian_unit_vector = l2_normalize_1d( + np.cross(x_cartesian_unit_vector, y_cartesian_unit_vector) + ) + else: + if not slip_length: + slip_length = stored_slip_length + x_cartesian = np.dot(np.array(x_miller), structure.lattice.matrix) + xy_cartesian = np.dot(np.array(xy_miller), structure.lattice.matrix) + x_cartesian_unit_vector = l2_normalize_1d(x_cartesian) + z_cartesian_unit_vector = l2_normalize_1d(np.cross(x_cartesian, xy_cartesian)) + y_cartesian_unit_vector = l2_normalize_1d( + np.cross(z_cartesian_unit_vector, x_cartesian_unit_vector) + ) + finally: + reoriented_basis = np.array( + [x_cartesian_unit_vector, y_cartesian_unit_vector, z_cartesian_unit_vector] + ) + Q = trans_mat_basis(reoriented_basis) + + return plane_miller, x_miller, slip_length, Q + + def __gen_slab_pmg(self, structure: Structure, plane_miller, trans_matrix=None) -> Structure: + tem_calc_obj = TEMCalculator() + spacing_dict = tem_calc_obj.get_interplanar_spacings(self.conv_std_structure, [plane_miller]) + slab_size = spacing_dict[plane_miller] * self.supercell_size[2] + slab_gen = SlabGenerator( + structure, + miller_index=plane_miller, + min_slab_size=slab_size, + min_vacuum_size=0, + center_slab=True, + in_unit_planes=False, + lll_reduce=True, + reorient_lattice=False, + primitive=False, + ) + slabs_pmg = slab_gen.get_slabs(ftol=0.001) + slab = [s for s in slabs_pmg if s.miller_index == plane_miller][0] + if trans_matrix.any(): + reoriented_lattice_vectors = [trans_matrix.dot(v) for v in slab.lattice.matrix] + slab = Structure( + lattice=np.matrix(reoriented_lattice_vectors), + coords=slab.frac_coords, + species=slab.species, + ) + + order = zip(slab.frac_coords, slab.species) + c_order = sorted(order, key=lambda x: x[0][2]) + sorted_frac_coords = [] + sorted_species = [] + for frac_coord, species in c_order: + sorted_frac_coords.append(frac_coord) + sorted_species.append(species) + + a, b, c = slab.lattice.matrix + slab_height = slab.lattice.matrix[2][2] + if slab_height >= 0: + self.is_flip = False + elong_scale = 1 + (self.vacuum_size / slab_height) + else: + self.is_flip = True + elong_scale = 1 + (-self.vacuum_size / slab_height) + new_lattice = [a, b, elong_scale * c] + new_frac_coords = [] + for ii in range(len(sorted_frac_coords)): + coord = sorted_frac_coords[ii].copy() + coord[2] = coord[2] / elong_scale + new_frac_coords.append(coord) + slab = Structure( + lattice=np.matrix(new_lattice), coords=new_frac_coords, species=sorted_species + ) + + plane_shift_frac = self.plane_shift * structure.lattice.c / slab.lattice.matrix[2][2] + avg_c = np.average([coord[2] for coord in slab.frac_coords]) + slab.translate_sites(list(range(len(slab))), [0, 0, 0.5 - avg_c - plane_shift_frac]) + slab.make_supercell( + scaling_matrix=[self.supercell_size[0], self.supercell_size[1], 1] + ) + return slab + + def __poscar_fix(self, poscar) -> None: + insert_pos = -self.atom_num + fix_dict = {"true": "F", "false": "T"} + add_fix_str = ( + " " + fix_dict[self.add_fix[0]] + " " + fix_dict[self.add_fix[1]] + " " + fix_dict[self.add_fix[2]] + "\n" + ) + with open(poscar, "r") as fin1: + contents = fin1.readlines() + contents.insert(insert_pos - 1, "Selective dynamics\n") + for ii in range(insert_pos, 0, 1): + contents[ii] = contents[ii].replace("\n", "") + content_split = contents[ii].split(" ") + if len(content_split[-1]) < 3: + content_split.pop() + contents[ii] = " ".join(content_split) + contents[ii] += add_fix_str + with open(poscar, "w") as fin2: + for ii in range(len(contents)): + fin2.write(contents[ii]) + + def __stru_fix(self, stru) -> None: + fix_dict = {"true": True, "false": False} + fix_xyz = [fix_dict[i] for i in self.add_fix] + abacus_utils.stru_fix_atom(stru, fix_atom=fix_xyz) + + def __inLammpes_fix(self, inLammps) -> None: + fix_dict = {"true": "0", "false": "NULL"} + add_fix_str = ( + "fix 1 all setforce" + + " " + + fix_dict[self.add_fix[0]] + + " " + + fix_dict[self.add_fix[1]] + + " " + + fix_dict[self.add_fix[2]] + + "\n" + ) + with open(inLammps, "r") as fin1: + contents = fin1.readlines() + for ii in range(len(contents)): + upper = contents[ii].split()[:3] == ["variable", "N", "equal"] + lower = re.search("min_style cg", contents[ii]) + if lower: + lower_id = ii + elif upper: + upper_id = ii + del contents[lower_id + 1 : upper_id - 1] + contents.insert(lower_id + 1, add_fix_str) + with open(inLammps, "w") as fin2: + for ii in range(len(contents)): + fin2.write(contents[ii]) + + def post_process(self, task_list): + try: + add_fix = self.add_fix + except AttributeError: + add_fix = None + + if add_fix: + count = 0 + for ii in task_list: + count += 1 + if self.inter_param["type"] in {"vasp", "abacus"}: + self._fix_task_output(ii, count == 1) + elif count == 1: + self.__inLammpes_fix(os.path.join(ii, "in.lammps")) + + def task_type(self): + return self.parameter["type"] + + def task_param(self): + return self.parameter + + def _compute_lower(self, output_file, all_tasks, all_res): + output_file = os.path.abspath(output_file) + res_data = {} + ptr_data = os.path.dirname(output_file) + "\n" + + if not self.reprod: + ptr_data += ( + "No_task: \tFrac_X\tFrac_Y\tDisp_X(\\AA)\tDisp_Y(\\AA)\t" + "Stacking_Fault_E(J/m^2)\tEpA(eV)\tslab_equi_EpA(eV)\n" + ) + all_tasks.sort() + task_result_slab_equi = loadfn(os.path.join(all_tasks[0], "result_task.json")) + slip_length_x = loadfn(os.path.join(all_tasks[0], "slip_length_x.json")) + slip_length_y = loadfn(os.path.join(all_tasks[0], "slip_length_y.json")) + equi_path = os.path.abspath( + os.path.join(os.path.dirname(output_file), "../relaxation/relax_task") + ) + equi_result = loadfn(os.path.join(equi_path, "result.json")) + equi_epa = equi_result["energies"][-1] / np.sum(equi_result["atom_numbs"]) + + for ii in all_tasks: + task_result = loadfn(os.path.join(ii, "result_task.json")) + natoms = np.sum(task_result["atom_numbs"]) + epa = task_result["energies"][-1] / natoms + equi_epa_slab = task_result_slab_equi["energies"][-1] / natoms + area = np.linalg.norm( + np.cross(task_result["cells"][0][0], task_result["cells"][0][1]) + ) + + structure_dir = os.path.basename(ii) + disp_info = loadfn(os.path.join(ii, "displacement.json")) + frac_x = float(disp_info["frac_x"]) + frac_y = float(disp_info["frac_y"]) + cf = 1.60217657e-16 / 1e-20 * 0.001 + sfe = ( + (task_result["energies"][-1] - task_result_slab_equi["energies"][-1]) + / area + * cf + ) + miller_index = loadfn(os.path.join(ii, "miller.json")) + disp_x = slip_length_x * frac_x + disp_y = slip_length_y * frac_y + ptr_data += ( + "%-25s %7.3f %7.3f %7.3f %7.3f %7.3f %8.3f %8.3f\n" + % ( + str(miller_index) + "-" + structure_dir + ":", + frac_x, + frac_y, + disp_x, + disp_y, + sfe, + epa, + equi_epa_slab, + ) + ) + res_data[f"{frac_x:.6f},{frac_y:.6f}"] = [ + disp_x, + disp_y, + sfe, + epa, + equi_epa, + ] + + else: + if "init_data_path" not in self.parameter: + raise RuntimeError("please provide the initial data path to reproduce") + init_data_path = os.path.abspath(self.parameter["init_data_path"]) + res_data, ptr_data = post_repro( + init_data_path, + self.parameter["init_from_suffix"], + all_tasks, + ptr_data, + self.parameter.get("reprod_last_frame", True), + ) + + with open(output_file, "w") as fp: + json.dump(res_data, fp, indent=4) + + return res_data, ptr_data diff --git a/apex/core/property/Gruneisen.py b/apex/core/property/Gruneisen.py new file mode 100644 index 00000000..4ccedaa7 --- /dev/null +++ b/apex/core/property/Gruneisen.py @@ -0,0 +1,1297 @@ +import glob +import json +import logging +import math +import os +import shutil +import subprocess +from typing import Dict, List + +import dpdata +from monty.serialization import dumpfn, loadfn +from pymatgen.core.structure import Structure +import seekpath +import yaml + +from apex.core.calculator.Lammps import Lammps +from apex.core.calculator.lib import abacus_utils +from apex.core.calculator.lib import lammps_utils +from apex.core.calculator.lib import vasp_utils +from apex.core.calculator.calculator import LAMMPS_INTER_TYPE +from apex.core.property.Property import Property +from apex.core.property.Phonon import Phonon +from dflow.python import upload_packages + +upload_packages.append(__file__) + + +DEFAULT_CAL_SETTING = { + "relax_pos": True, + "relax_shape": False, + "relax_vol": False, +} + +DEFAULT_SUPERCELL = [2, 2, 2] +THZ_TO_K = 47.99243073366221 +KB_EV_PER_K = 8.617333262145e-5 + + +class Gruneisen(Property): + def __init__(self, parameter, inter_param=None): + parameter["reproduce"] = parameter.get("reproduce", False) + self.reprod = parameter["reproduce"] + + parameter["primitive"] = parameter.get("primitive", False) + self.primitive = parameter["primitive"] + parameter["supercell_size"] = parameter.get("supercell_size", DEFAULT_SUPERCELL) + self.supercell_size = parameter["supercell_size"] + parameter["seekpath_from_original"] = parameter.get("seekpath_from_original", False) + self.seekpath_from_original = parameter["seekpath_from_original"] + parameter["seekpath_param"] = parameter.get("seekpath_param", {}) + self.seekpath_param = parameter["seekpath_param"] + parameter["MESH"] = parameter.get("MESH", None) + self.MESH = parameter["MESH"] + parameter["PRIMITIVE_AXES"] = parameter.get("PRIMITIVE_AXES", "P") + self.PRIMITIVE_AXES = parameter["PRIMITIVE_AXES"] + parameter["BAND"] = parameter.get("BAND", None) + self.BAND = parameter["BAND"] + parameter["BAND_LABELS"] = parameter.get("BAND_LABELS", None) + self.BAND_LABELS = parameter["BAND_LABELS"] + parameter["BAND_POINTS"] = parameter.get("BAND_POINTS", 51) + self.BAND_POINTS = parameter["BAND_POINTS"] + parameter["BAND_CONNECTION"] = parameter.get("BAND_CONNECTION", True) + self.BAND_CONNECTION = parameter["BAND_CONNECTION"] + parameter["alpha_mode"] = parameter.get("alpha_mode", "sign_only") + self.alpha_mode = parameter["alpha_mode"] + parameter["bulk_modulus_source"] = parameter.get("bulk_modulus_source", "eos_fit") + self.bulk_modulus_source = parameter["bulk_modulus_source"] + parameter["eos_model"] = parameter.get("eos_model", "birch_murnaghan") + self.eos_model = parameter["eos_model"] + parameter["phonolammps_run_command"] = parameter.get("phonolammps_run_command", None) + self.phonolammps_run_command = parameter["phonolammps_run_command"] + parameter["lammps_run_command"] = parameter.get("lammps_run_command", None) + self.lammps_run_command = parameter["lammps_run_command"] + parameter["approach"] = parameter.get("approach", "linear") + self.approach = parameter["approach"] + parameter["cal_type"] = parameter.get("cal_type", "static") + self.cal_type = parameter["cal_type"] + parameter["cal_setting"] = parameter.get("cal_setting", {}) + for key, value in DEFAULT_CAL_SETTING.items(): + parameter["cal_setting"].setdefault(key, value) + self.cal_setting = parameter["cal_setting"] + + self.volume_strains = parameter["volume_strains"] + self.temperatures = parameter["temperatures"] + self.parameter = parameter + self.inter_param = inter_param if inter_param is not None else {"type": "vasp"} + + self._validate() + + def _validate(self): + if len(self.volume_strains) < 3: + raise ValueError("volume_strains must contain at least 3 points") + if len(self.temperatures) < 1: + raise ValueError("temperatures must contain at least 1 point") + if not any(math.isclose(float(value), 0.0, abs_tol=1e-10) for value in self.volume_strains): + raise ValueError("volume_strains must include 0.0") + if self.alpha_mode not in {"sign_only", "full"}: + raise ValueError("alpha_mode must be either 'sign_only' or 'full'") + if self.bulk_modulus_source != "eos_fit": + raise ValueError("first-version gruneisen only supports bulk_modulus_source='eos_fit'") + if self.eos_model != "birch_murnaghan": + raise ValueError("first-version gruneisen only supports eos_model='birch_murnaghan'") + if self.approach not in {"linear", "displacement"}: + raise ValueError("gruneisen approach must be either 'linear' or 'displacement'") + if self.cal_setting["relax_pos"] is not True: + raise ValueError("gruneisen requires cal_setting.relax_pos = true") + if self.cal_setting["relax_shape"] is not False: + raise ValueError("gruneisen requires cal_setting.relax_shape = false") + if self.cal_setting["relax_vol"] is not False: + raise ValueError("gruneisen requires cal_setting.relax_vol = false") + + volume_strains = [float(value) for value in self.volume_strains] + if volume_strains != sorted(volume_strains): + raise ValueError("volume_strains must be strictly increasing") + if len(set(volume_strains)) != len(volume_strains): + raise ValueError("volume_strains must not contain duplicates") + if any(float(value) <= 0.0 for value in self.temperatures): + raise ValueError("temperatures must be positive") + temperatures = [float(value) for value in self.temperatures] + if temperatures != sorted(temperatures): + raise ValueError("temperatures must be strictly increasing") + + strain_set = {round(value, 10) for value in volume_strains} + for value in volume_strains: + if not math.isclose(value, 0.0, abs_tol=1e-10): + if round(-value, 10) not in strain_set: + raise ValueError("volume_strains must be symmetric around 0.0") + + def make_confs(self, path_to_work, path_to_equi, refine=False): + if refine: + raise NotImplementedError("gruneisen refine mode is not implemented yet") + if self.reprod: + raise NotImplementedError("gruneisen reproduce mode is not implemented yet") + + if self.inter_param["type"] == "abacus": + return self._make_abacus_confs(path_to_work, path_to_equi) + + path_to_work = os.path.abspath(path_to_work) + if os.path.exists(path_to_work): + logging.debug("%s already exists" % path_to_work) + else: + os.makedirs(path_to_work) + path_to_equi = os.path.abspath(path_to_equi) + + equi_contcar = os.path.join(path_to_equi, "CONTCAR") + if not os.path.isfile(equi_contcar): + raise RuntimeError("please do relaxation first") + + task_list = [] + volume_path = os.path.join(path_to_work, "volume_points.json") + volume_points = [] + natoms = vasp_utils.poscar_natoms(equi_contcar) + base_volume = vasp_utils.poscar_vol(equi_contcar) + cwd = os.getcwd() + band_payload = self._build_band_payload(equi_contcar) + + try: + dumpfn(band_payload["band_path"], os.path.join(path_to_work, "band_path.json"), indent=4) + if self.inter_param["type"] == "vasp" and self.approach == "displacement": + manifest = {"volume_points": []} + task_counter = 0 + for volume_index, strain in enumerate(self.volume_strains): + helper_dir = os.path.join(path_to_work, f"volume.{volume_index:06d}") + os.makedirs(helper_dir, exist_ok=True) + os.chdir(helper_dir) + for file_name in [ + "POSCAR.orig", + "POSCAR", + "POSCAR-unitcell", + "SPOSCAR", + "phonopy_disp.yaml", + "volume.json", + "band.conf", + ]: + if os.path.exists(file_name): + os.remove(file_name) + + os.symlink(os.path.relpath(equi_contcar, helper_dir), "POSCAR.orig") + scale = (1.0 + float(strain)) ** (1.0 / 3.0) + vasp_utils.poscar_scale("POSCAR.orig", "POSCAR", scale) + scaled_volume = vasp_utils.poscar_vol("POSCAR") + volume_data = { + "strain": float(strain), + "scale": scale, + "volume": scaled_volume, + "volume_per_atom": scaled_volume / natoms, + "reference_volume": base_volume, + "reference_volume_per_atom": base_volume / natoms, + } + dumpfn(volume_data, "volume.json", indent=4) + with open("band.conf", "w") as fp: + fp.write(band_payload["band_conf"]) + self._prepare_vasp_phonon_task() + + reference_task = os.path.join(path_to_work, f"task.{task_counter:06d}") + os.makedirs(reference_task, exist_ok=True) + self._create_vasp_displacement_reference_task(reference_task, helper_dir, volume_data) + task_list.append(reference_task) + task_counter += 1 + + displacement_tasks = [] + for displacement_index, poscar_name in enumerate( + sorted( + path + for path in glob.glob(os.path.join(helper_dir, "POSCAR-*")) + if os.path.basename(path)[7:].isdigit() + ) + ): + displacement_task = os.path.join(path_to_work, f"task.{task_counter:06d}") + os.makedirs(displacement_task, exist_ok=True) + self._create_vasp_displacement_task( + displacement_task, helper_dir, poscar_name, volume_data, displacement_index + ) + task_list.append(displacement_task) + displacement_tasks.append(os.path.basename(displacement_task)) + task_counter += 1 + + volume_points.append(volume_data) + manifest["volume_points"].append( + { + "volume_index": volume_index, + "helper_dir": os.path.basename(helper_dir), + "reference_task": os.path.basename(reference_task), + "displacement_tasks": displacement_tasks, + "strain": float(strain), + } + ) + else: + for task_id, strain in enumerate(self.volume_strains): + output_task = os.path.join(path_to_work, f"task.{task_id:06d}") + os.makedirs(output_task, exist_ok=True) + os.chdir(output_task) + for file_name in [ + "POSCAR.orig", + "POSCAR", + "POSCAR-unitcell", + "SPOSCAR", + "phonopy_disp.yaml", + "volume.json", + "band.conf", + ]: + if os.path.exists(file_name): + os.remove(file_name) + + os.symlink(os.path.relpath(equi_contcar), "POSCAR.orig") + scale = (1.0 + float(strain)) ** (1.0 / 3.0) + vasp_utils.poscar_scale("POSCAR.orig", "POSCAR", scale) + scaled_volume = vasp_utils.poscar_vol("POSCAR") + volume_data = { + "strain": float(strain), + "scale": scale, + "volume": scaled_volume, + "volume_per_atom": scaled_volume / natoms, + "reference_volume": base_volume, + "reference_volume_per_atom": base_volume / natoms, + } + dumpfn(volume_data, "volume.json", indent=4) + with open("band.conf", "w") as fp: + fp.write(band_payload["band_conf"]) + if self.inter_param["type"] == "vasp": + self._prepare_vasp_phonon_task() + volume_points.append(volume_data) + task_list.append(output_task) + + os.chdir(path_to_work) + dumpfn(volume_points, volume_path, indent=4) + if self.inter_param["type"] == "vasp" and self.approach == "displacement": + dumpfn(manifest, os.path.join(path_to_work, "vasp_gruneisen_tasks.json"), indent=4) + finally: + os.chdir(cwd) + return task_list + + def _make_abacus_confs(self, path_to_work: str, path_to_equi: str) -> List[str]: + path_to_work = os.path.abspath(path_to_work) + os.makedirs(path_to_work, exist_ok=True) + path_to_equi = os.path.abspath(path_to_equi) + + equi_stru_rel = abacus_utils.final_stru(path_to_equi) + equi_stru = os.path.join(path_to_equi, equi_stru_rel) + if not os.path.isfile(equi_stru): + raise RuntimeError("please do relaxation first") + + task_list: List[str] = [] + volume_points: List[dict] = [] + manifest = {"volume_points": []} + cwd = os.getcwd() + equi_poscar = os.path.join(path_to_work, "_equi_poscar.tmp") + task_counter = 0 + + try: + dpdata.System(equi_stru, fmt="stru").to("vasp/poscar", equi_poscar) + natoms = vasp_utils.poscar_natoms(equi_poscar) + base_volume = vasp_utils.poscar_vol(equi_poscar) + band_payload = self._build_band_payload(equi_poscar) + dumpfn(band_payload["band_path"], os.path.join(path_to_work, "band_path.json"), indent=4) + + for volume_index, strain in enumerate(self.volume_strains): + helper_dir = os.path.join(path_to_work, f"volume.{volume_index:06d}") + os.makedirs(helper_dir, exist_ok=True) + os.chdir(helper_dir) + + scale = (1.0 + float(strain)) ** (1.0 / 3.0) + abacus_utils.stru_scale(equi_stru, "STRU", scale) + abacus_utils.append_orb_file_to_stru( + "STRU", self.inter_param.get("orb_files"), prefix="pp_orb" + ) + dpdata.System("STRU", fmt="stru").to("vasp/poscar", "POSCAR") + scaled_volume = vasp_utils.poscar_vol("POSCAR") + volume_data = { + "strain": float(strain), + "scale": scale, + "volume": scaled_volume, + "volume_per_atom": scaled_volume / natoms, + "reference_volume": base_volume, + "reference_volume_per_atom": base_volume / natoms, + } + dumpfn(volume_data, "volume.json", indent=4) + with open("band.conf", "w") as fp: + fp.write(band_payload["band_conf"]) + with open("setting.conf", "w") as fp: + fp.write( + "DIM = %s %s %s\n" + % (self.supercell_size[0], self.supercell_size[1], self.supercell_size[2]) + ) + fp.write( + "ATOM_NAME =%s\n" + % "".join(f" {name}" for name in vasp_utils.get_poscar_types("POSCAR")) + ) + if self.PRIMITIVE_AXES: + fp.write(f"PRIMITIVE_AXES = {self.PRIMITIVE_AXES}\n") + subprocess.check_call( + Phonon.phonopy_setup_command("setting.conf --abacus -d"), + shell=True, + ) + + displaced_stru_files = sorted( + os.path.basename(path) + for path in glob.glob(os.path.join(helper_dir, "STRU-*")) + ) + if not displaced_stru_files: + raise FileNotFoundError(f"no displaced STRU files created in {helper_dir}") + + reference_task = os.path.join(path_to_work, f"task.{task_counter:06d}") + self._create_abacus_gruneisen_task( + reference_task, + os.path.join(helper_dir, "STRU"), + volume_data, + volume_index, + role="reference", + ) + task_list.append(reference_task) + task_counter += 1 + + displacement_tasks = [] + for displacement_index, stru_name in enumerate(displaced_stru_files): + displacement_task = os.path.join(path_to_work, f"task.{task_counter:06d}") + self._create_abacus_gruneisen_task( + displacement_task, + os.path.join(helper_dir, stru_name), + volume_data, + volume_index, + role="displacement", + displacement_index=displacement_index, + ) + task_list.append(displacement_task) + displacement_tasks.append(os.path.basename(displacement_task)) + task_counter += 1 + + volume_points.append(volume_data) + manifest["volume_points"].append( + { + "volume_index": volume_index, + "helper_dir": os.path.basename(helper_dir), + "reference_task": os.path.basename(reference_task), + "displacement_tasks": displacement_tasks, + "strain": float(strain), + } + ) + + os.chdir(path_to_work) + dumpfn(volume_points, os.path.join(path_to_work, "volume_points.json"), indent=4) + dumpfn( + manifest, + os.path.join(path_to_work, "abacus_gruneisen_tasks.json"), + indent=4, + ) + finally: + os.chdir(cwd) + if os.path.exists(equi_poscar): + os.remove(equi_poscar) + + return task_list + + def _create_abacus_gruneisen_task( + self, + task_path: str, + stru_source: str, + volume_data: dict, + volume_index: int, + role: str, + displacement_index: int | None = None, + ) -> None: + os.makedirs(task_path, exist_ok=True) + stru_target = os.path.join(task_path, "STRU") + if os.path.lexists(stru_target): + os.remove(stru_target) + os.symlink(os.path.relpath(stru_source, task_path), stru_target) + dpdata.System(os.path.realpath(stru_target), fmt="stru").to( + "vasp/poscar", os.path.join(task_path, "POSCAR") + ) + dumpfn( + { + "role": role, + "volume_index": volume_index, + "displacement_index": displacement_index, + "strain": float(volume_data["strain"]), + }, + os.path.join(task_path, "gruneisen_task.json"), + indent=4, + ) + + def _create_vasp_displacement_reference_task( + self, task_path: str, helper_dir: str, volume_data: dict + ) -> None: + for file_name in ["POSCAR", "POSCAR-unitcell", "volume.json", "gruneisen_task.json"]: + target = os.path.join(task_path, file_name) + if os.path.lexists(target): + os.remove(target) + os.symlink(os.path.relpath(os.path.join(helper_dir, "POSCAR"), task_path), os.path.join(task_path, "POSCAR")) + os.symlink( + os.path.relpath(os.path.join(helper_dir, "POSCAR-unitcell"), task_path), + os.path.join(task_path, "POSCAR-unitcell"), + ) + dumpfn( + {"role": "reference", "strain": float(volume_data["strain"])}, + os.path.join(task_path, "gruneisen_task.json"), + indent=4, + ) + + def _create_vasp_displacement_task( + self, task_path: str, helper_dir: str, poscar_source: str, volume_data: dict, displacement_index: int + ) -> None: + for file_name in ["POSCAR", "POSCAR-unitcell", "gruneisen_task.json"]: + target = os.path.join(task_path, file_name) + if os.path.lexists(target): + os.remove(target) + os.symlink(os.path.relpath(poscar_source, task_path), os.path.join(task_path, "POSCAR")) + os.symlink( + os.path.relpath(os.path.join(helper_dir, "POSCAR-unitcell"), task_path), + os.path.join(task_path, "POSCAR-unitcell"), + ) + dumpfn( + { + "role": "displacement", + "displacement_index": displacement_index, + "strain": float(volume_data["strain"]), + }, + os.path.join(task_path, "gruneisen_task.json"), + indent=4, + ) + + def post_process(self, task_list): + cwd = os.getcwd() + if self.inter_param["type"] in LAMMPS_INTER_TYPE: + helper = Phonon(dict(self.parameter), inter_param=self.inter_param) + for task_dir in task_list: + os.chdir(task_dir) + if os.path.isfile("in.lammps"): + with open("in.lammps", "r") as f1: + contents = f1.readlines() + pair_line_id = None + for idx, line in enumerate(contents): + if "pair_coeff" in line: + pair_line_id = idx + break + if pair_line_id is not None: + contents = contents[: pair_line_id + 1] + with open("in.lammps", "w") as f2: + f2.write(helper._ensure_deepmd_plugin_loaded("".join(contents))) + self._write_fixed_volume_relax_inputs(task_dir) + with open("run_command", "w") as f3: + f3.write("bash run_gruneisen_task.sh") + os.chdir(cwd) + + def _prepare_vasp_phonon_task(self) -> None: + if self.primitive: + subprocess.check_call(Phonon.phonopy_setup_command("--symmetry"), shell=True) + if not os.path.isfile("PPOSCAR"): + raise FileNotFoundError("PPOSCAR was not created by phonopy --symmetry") + shutil.copyfile("PPOSCAR", "POSCAR-unitcell") + shutil.copyfile("PPOSCAR", "POSCAR") + else: + shutil.copyfile("POSCAR", "POSCAR-unitcell") + + subprocess.check_call( + Phonon.phonopy_setup_command( + '-d --dim="%s %s %s" -c POSCAR' + % (self.supercell_size[0], self.supercell_size[1], self.supercell_size[2]) + ), + shell=True, + ) + if self.approach == "linear": + if not os.path.isfile("SPOSCAR"): + raise FileNotFoundError("SPOSCAR was not created by phonopy") + os.remove("POSCAR") + os.symlink("SPOSCAR", "POSCAR") + elif self.approach == "displacement": + displaced_poscars = sorted(glob.glob("POSCAR-*")) + if not displaced_poscars: + raise FileNotFoundError("POSCAR-* displacement files were not created by phonopy") + else: + raise NotImplementedError( + f"VASP gruneisen currently does not support approach={self.approach!r}" + ) + + def task_type(self): + return self.parameter["type"] + + def task_param(self): + return self.parameter + + def _compute_lower(self, output_file, all_tasks, all_res): + output_file = os.path.abspath(output_file) + work_path = os.path.dirname(output_file) + ptr_lines = [work_path] + cwd = os.getcwd() + + try: + if self.inter_param["type"] == "abacus": + task_infos = self._build_abacus_task_infos(work_path, all_res) + elif self.inter_param["type"] == "vasp" and self.approach == "displacement": + task_infos = self._build_vasp_displacement_task_infos(work_path, all_res) + else: + for task_dir in all_tasks: + self._ensure_mesh_yaml(task_dir) + + task_infos = [self._load_task_info(task_dir) for task_dir in all_tasks] + if self.alpha_mode == "full": + self._attach_task_energies(task_infos, all_res) + ref_info, minus_info, plus_info = self._select_reference_triplet(task_infos) + sign_only = self._compute_sign_only(ref_info, minus_info, plus_info) + bulk_modulus = None + thermal_expansion = { + "alpha_mode": self.alpha_mode, + "temperatures": self.temperatures, + "sum_gamma_cv": sign_only["sum_gamma_cv"], + "sign": sign_only["sign"], + } + if self.alpha_mode == "full": + bulk_modulus = self._fit_bulk_modulus(task_infos) + thermal_expansion.update( + self._compute_full_thermal_expansion(ref_info, sign_only, bulk_modulus) + ) + + result = { + "volume_points": [ + { + "strain": info["strain"], + "volume": info["volume"], + "volume_per_atom": info["volume_per_atom"], + "phonon_cell_volume": info["phonon_cell_volume"], + "fit_volume_per_atom": info["fit_volume_per_atom"], + **( + {"energy_per_atom": info["energy_per_atom"]} + if "energy_per_atom" in info + else {} + ), + } + for info in task_infos + ], + "gruneisen": { + "reference_volume": ref_info["volume"], + "reference_volume_per_atom": ref_info["volume_per_atom"], + "qpoint_count": sign_only["qpoint_count"], + "mode_count": sign_only["mode_count"], + "skipped_mode_count": sign_only["skipped_mode_count"], + "difference_pair": { + "minus_strain": minus_info["strain"], + "reference_strain": ref_info["strain"], + "plus_strain": plus_info["strain"], + }, + }, + "thermal_expansion": thermal_expansion, + "mode_gruneisen": sign_only["mode_gruneisen"], + "mode_heat_capacity": sign_only["mode_heat_capacity"], + "mode_contributions": sign_only["mode_contributions"], + "contribution_summary": sign_only["contribution_summary"], + "bulk_modulus": bulk_modulus, + } + + if bulk_modulus is not None: + ptr_lines.append("VolumePoint Strain FitVolumePerAtom(A^3) EnergyPerAtom(eV)") + for idx, info in enumerate(task_infos): + ptr_lines.append( + f"{idx:6d} {info['strain']: .8f} " + f"{info['fit_volume_per_atom']: .10e} {info['energy_per_atom']: .10e}" + ) + ptr_lines.append( + "# bulk modulus: " + f"K_T={bulk_modulus['K_T_GPa']:.10e} GPa, " + f"K_T={bulk_modulus['K_T_eV_per_A3']:.10e} eV/A^3, " + f"fit_variant={bulk_modulus['fit_variant']}" + ) + + header = "Temperature(K) SumGammaCv Sign" + if self.alpha_mode == "full": + header = "Temperature(K) SumGammaCvRaw SumGammaCvPerCell Alpha(K^-1) Sign" + ptr_lines.append(header) + for temp_idx, (temperature, sum_gamma_cv, sign) in enumerate(zip( + self.temperatures, + sign_only["sum_gamma_cv"], + sign_only["sign"], + )): + if self.alpha_mode == "full": + ptr_lines.append( + f"{float(temperature):10.4f} {sum_gamma_cv: .10e} " + f"{thermal_expansion['sum_gamma_cv_per_cell'][temp_idx]: .10e} " + f"{thermal_expansion['alpha'][temp_idx]: .10e} {sign}" + ) + else: + ptr_lines.append(f"{float(temperature):10.4f} {sum_gamma_cv: .10e} {sign}") + ptr_lines.append("# contribution summary") + for summary in sign_only["contribution_summary"]: + ptr_lines.append( + f"# T={summary['temperature']:.4f} " + f"positive={summary['positive_sum']:.10e} " + f"negative={summary['negative_sum']:.10e} " + f"net={summary['net_sum']:.10e}" + ) + ptr_lines.append( + f"# difference pair: {minus_info['strain']} / {ref_info['strain']} / {plus_info['strain']}" + ) + ptr_lines.append(f"# skipped modes: {sign_only['skipped_mode_count']}") + + with open(output_file, "w") as fp: + json.dump(result, fp, indent=4) + + return result, "\n".join(ptr_lines) + "\n" + finally: + os.chdir(cwd) + + def _build_band_payload(self, poscar_path: str) -> dict: + try: + structure = Structure.from_file(poscar_path) + except ValueError: + with open(poscar_path, "r") as fp: + structure = Structure.from_str(fp.read(), fmt="poscar") + if self.BAND: + band_path = Phonon.phonopy_band_string_2_band_list(self.BAND, self.BAND_LABELS) + band_string = self.BAND + band_labels = self.BAND_LABELS + else: + if self.seekpath_from_original: + sp = seekpath.get_path_orig_cell( + Phonon.get_seekpath_structure(structure), + **self.seekpath_param, + ) + else: + sp = seekpath.get_path( + Phonon.get_seekpath_structure(structure), + **self.seekpath_param, + ) + band_path = Phonon.extract_seekpath_band(sp) + band_string, band_labels = Phonon.band_list_2_phonopy_band_string(band_path) + + lines = ["ATOM_NAME =" + "".join(f" {name}" for name in vasp_utils.get_poscar_types(poscar_path))] + lines.append( + "DIM = %s %s %s" % ( + self.supercell_size[0], + self.supercell_size[1], + self.supercell_size[2], + ) + ) + if self.MESH: + lines.append("MESH = %s %s %s" % (self.MESH[0], self.MESH[1], self.MESH[2])) + if self.PRIMITIVE_AXES: + lines.append(f"PRIMITIVE_AXES = {self.PRIMITIVE_AXES}") + lines.append(f"BAND = {band_string}") + if band_labels: + lines.append(f"BAND_LABELS = {band_labels}") + if self.BAND_POINTS: + lines.append(f"BAND_POINTS = {self.BAND_POINTS}") + if self.BAND_CONNECTION: + lines.append(f"BAND_CONNECTION = {self.BAND_CONNECTION}") + lines.append("FORCE_CONSTANTS=READ") + return {"band_path": band_path, "band_conf": "\n".join(lines) + "\n"} + + def _write_fixed_volume_relax_inputs(self, task_dir: str) -> None: + lammps_task = Lammps(self.inter_param, os.path.join(task_dir, "POSCAR")) + lammps_task.set_model_param() + relax_input = lammps_utils.make_lammps_equi( + "conf.lmp", + lammps_task.type_map, + lammps_task.inter_func, + lammps_task.model_param, + self.cal_setting.get("etol", 0), + self.cal_setting.get("ftol", 1e-10), + self.cal_setting.get("maxiter", 5000), + self.cal_setting.get("maxeval", 500000), + False, + prop_type="relaxation", + ) + with open("in.relax.lammps", "w") as fp: + fp.write(relax_input) + type_map = lammps_utils.element_list(lammps_task.type_map) + with open("type_map.json", "w") as fp: + json.dump(type_map, fp, indent=4) + with open("convert_relax_dump_to_poscar.py", "w") as fp: + fp.write(self._relax_dump_converter_script()) + with open("run_gruneisen_task.sh", "w") as fp: + fp.write(self._build_two_stage_run_script()) + + def _build_lammps_run_command(self, input_file: str) -> str: + command_template = self.lammps_run_command + if not command_template: + return f"lmp -in {input_file}" + if "{input_file}" in command_template: + return command_template.format(input_file=input_file) + if "in.lammps" in command_template: + return command_template.replace("in.lammps", input_file, 1) + return f"{command_template} -in {input_file}" + + def _build_two_stage_run_script(self) -> str: + relax_cmd = self._build_lammps_run_command("in.relax.lammps") + phonon_cmd = Phonon(dict(self.parameter), inter_param=self.inter_param)._build_phonolammps_run_command() + return ( + "#!/usr/bin/env bash\n" + "set -euo pipefail\n\n" + "cp POSCAR POSCAR.pre_relax\n" + f"{relax_cmd}\n" + "python3 convert_relax_dump_to_poscar.py dump.relax POSCAR.relaxed type_map.json\n" + "cp POSCAR.relaxed POSCAR\n" + f"{phonon_cmd}\n" + ) + + @staticmethod + def _relax_dump_converter_script() -> str: + return """#!/usr/bin/env python3 +import json +import sys + +import dpdata + + +def main(): + if len(sys.argv) != 4: + raise SystemExit("usage: convert_relax_dump_to_poscar.py DUMP POSCAR_OUT TYPE_MAP_JSON") + dump_path, poscar_out, type_map_json = sys.argv[1:] + with open(type_map_json, "r") as fp: + type_map = json.load(fp) + system = dpdata.System(dump_path, fmt="lammps/dump", type_map=type_map) + system.to_vasp_poscar(poscar_out, frame_idx=-1) + with open(poscar_out, "r") as fp: + lines = fp.read().splitlines() + labels = [] + for token in lines[5].split(): + if "_" in token: + labels.append(type_map[int(token.split("_")[1])]) + else: + labels.append(token) + lines[5] = " ".join(labels) + with open(poscar_out, "w") as fp: + fp.write("\\n".join(lines) + "\\n") + + +if __name__ == "__main__": + main() +""" + + def _ensure_mesh_yaml(self, task_dir: str) -> None: + mesh_path = os.path.join(task_dir, "mesh.yaml") + if os.path.isfile(mesh_path): + return + force_constants = os.path.join(task_dir, "FORCE_CONSTANTS") + band_conf = os.path.join(task_dir, "band.conf") + if self.inter_param["type"] == "vasp": + vasprun = os.path.join(task_dir, "vasprun.xml") + if not os.path.isfile(force_constants): + if not os.path.isfile(vasprun): + raise FileNotFoundError(f"vasprun.xml not found in {task_dir}") + os.chdir(task_dir) + subprocess.check_call( + Phonon.phonopy_setup_command("--fc vasprun.xml"), + shell=True, + ) + poscar = os.path.join(task_dir, "POSCAR-unitcell") + else: + poscar = os.path.join(task_dir, "POSCAR") + if not os.path.isfile(force_constants): + raise FileNotFoundError(f"FORCE_CONSTANTS not found in {task_dir}") + if not os.path.isfile(band_conf): + raise FileNotFoundError(f"band.conf not found in {task_dir}") + if not os.path.isfile(poscar): + raise FileNotFoundError(f"POSCAR not found in {task_dir}") + os.chdir(task_dir) + cell_file = "POSCAR-unitcell" if self.inter_param["type"] == "vasp" else "POSCAR" + command = ( + 'phonopy --nomeshsym --dim="%s %s %s" -c %s band.conf' + % (self.supercell_size[0], self.supercell_size[1], self.supercell_size[2], cell_file) + ) + subprocess.check_call(command, shell=True) + if not os.path.isfile(mesh_path): + raise FileNotFoundError(f"mesh.yaml was not created in {task_dir}") + + def _build_vasp_displacement_task_infos(self, work_path: str, all_res: List[str]) -> List[dict]: + manifest_path = os.path.join(work_path, "vasp_gruneisen_tasks.json") + if not os.path.isfile(manifest_path): + raise FileNotFoundError(f"vasp gruneisen manifest not found at {manifest_path}") + manifest = loadfn(manifest_path) + task_result_map = { + os.path.basename(os.path.dirname(result_path)): result_path for result_path in all_res + } + task_infos = [] + for entry in manifest["volume_points"]: + helper_dir = os.path.join(work_path, entry["helper_dir"]) + self._ensure_vasp_volume_outputs(work_path, helper_dir, entry["displacement_tasks"]) + info = self._load_task_info(helper_dir) + info["reference_task_name"] = entry["reference_task"] + task_infos.append(info) + if self.alpha_mode == "full": + for info in task_infos: + reference_task = info["reference_task_name"] + result_path = task_result_map.get(reference_task) + if not result_path: + raise ValueError( + f"full gruneisen requires result_task.json for reference task {reference_task}" + ) + task_result = loadfn(result_path) + energy = self._last_result_value(task_result, "energies") + atom_count = self._result_atom_count(task_result) + if atom_count <= 0: + raise ValueError(f"invalid atom count in {result_path}") + info["energy"] = energy + info["atom_count"] = atom_count + info["energy_per_atom"] = energy / atom_count + if info["phonon_cell_natoms"]: + info["fit_volume_per_atom"] = info["phonon_cell_volume"] / info["phonon_cell_natoms"] + return task_infos + + def _ensure_vasp_volume_outputs( + self, work_path: str, helper_dir: str, displacement_tasks: List[str] + ) -> None: + force_sets = os.path.join(helper_dir, "FORCE_SETS") + if not os.path.isfile(force_sets): + vaspruns = [ + os.path.join(work_path, task_name, "vasprun.xml") + for task_name in displacement_tasks + ] + missing = [path for path in vaspruns if not os.path.isfile(path)] + if missing: + raise FileNotFoundError( + f"VASP displacement vasprun.xml files not found for {helper_dir}: {missing}" + ) + cwd = os.getcwd() + try: + os.chdir(helper_dir) + vasprun_args = " ".join(os.path.relpath(path, helper_dir) for path in vaspruns) + subprocess.check_call( + Phonon.phonopy_setup_command(f"-f {vasprun_args}"), + shell=True, + ) + finally: + os.chdir(cwd) + if not os.path.isfile(force_sets): + raise FileNotFoundError(f"FORCE_SETS was not created in {helper_dir}") + force_constants = os.path.join(helper_dir, "FORCE_CONSTANTS") + if not os.path.isfile(force_constants): + cwd = os.getcwd() + try: + os.chdir(helper_dir) + subprocess.check_call( + Phonon.phonopy_setup_command( + '--dim="%s %s %s" -c POSCAR-unitcell --writefc' + % ( + self.supercell_size[0], + self.supercell_size[1], + self.supercell_size[2], + ) + ), + shell=True, + ) + finally: + os.chdir(cwd) + if not os.path.isfile(force_constants): + raise FileNotFoundError(f"FORCE_CONSTANTS was not created in {helper_dir}") + if not os.path.isfile(os.path.join(helper_dir, "mesh.yaml")): + cwd = os.getcwd() + try: + os.chdir(helper_dir) + subprocess.check_call( + 'phonopy --dim="%s %s %s" -c POSCAR-unitcell band.conf' + % (self.supercell_size[0], self.supercell_size[1], self.supercell_size[2]), + shell=True, + ) + self._write_band_dat() + finally: + os.chdir(cwd) + if not os.path.isfile(os.path.join(helper_dir, "mesh.yaml")): + raise FileNotFoundError(f"mesh.yaml was not created in {helper_dir}") + + def _build_abacus_task_infos(self, work_path: str, all_res: List[str]) -> List[dict]: + manifest_path = os.path.join(work_path, "abacus_gruneisen_tasks.json") + if not os.path.isfile(manifest_path): + raise FileNotFoundError(f"abacus gruneisen manifest not found at {manifest_path}") + manifest = loadfn(manifest_path) + task_result_map = { + os.path.basename(os.path.dirname(result_path)): result_path for result_path in all_res + } + task_infos = [] + for entry in manifest["volume_points"]: + helper_dir = os.path.join(work_path, entry["helper_dir"]) + self._ensure_abacus_volume_outputs(work_path, helper_dir, entry["displacement_tasks"]) + info = self._load_task_info(helper_dir) + info["reference_task_name"] = entry["reference_task"] + task_infos.append(info) + if self.alpha_mode == "full": + self._attach_abacus_reference_energies(task_infos, task_result_map) + return task_infos + + def _ensure_abacus_volume_outputs( + self, work_path: str, helper_dir: str, displacement_tasks: List[str] + ) -> None: + force_sets = os.path.join(helper_dir, "FORCE_SETS") + if not os.path.isfile(force_sets): + logs = [ + os.path.join(work_path, task_name, "OUT.ABACUS", "running_scf.log") + for task_name in displacement_tasks + ] + missing_logs = [path for path in logs if not os.path.isfile(path)] + if missing_logs: + raise FileNotFoundError( + f"ABACUS displacement logs not found for {helper_dir}: {missing_logs}" + ) + cwd = os.getcwd() + try: + os.chdir(helper_dir) + log_args = " ".join(os.path.relpath(path, helper_dir) for path in logs) + subprocess.check_call( + Phonon.phonopy_setup_command(f"-f {log_args}"), + shell=True, + ) + finally: + os.chdir(cwd) + if not os.path.isfile(force_sets): + raise FileNotFoundError(f"FORCE_SETS was not created in {helper_dir}") + force_constants = os.path.join(helper_dir, "FORCE_CONSTANTS") + if not os.path.isfile(force_constants) or not os.path.isfile( + os.path.join(helper_dir, "mesh.yaml") + ): + cwd = os.getcwd() + try: + os.chdir(helper_dir) + # band.conf contains FORCE_CONSTANTS=READ; create it from FORCE_SETS first. + # Pass phonopy_disp.yaml explicitly so phonopy reads the supercell from the yaml + # rather than falling into old-style POSCAR mode (which has no DIM). + if not os.path.isfile("FORCE_CONSTANTS"): + subprocess.check_call( + Phonon.phonopy_setup_command("phonopy_disp.yaml --writefc"), + shell=True, + ) + if not os.path.isfile("FORCE_CONSTANTS"): + raise FileNotFoundError(f"FORCE_CONSTANTS was not created in {helper_dir}") + if not os.path.isfile("mesh.yaml"): + subprocess.check_call("phonopy band.conf", shell=True) + self._write_band_dat() + finally: + os.chdir(cwd) + if not os.path.isfile(os.path.join(helper_dir, "mesh.yaml")): + raise FileNotFoundError(f"mesh.yaml was not created in {helper_dir}") + + @staticmethod + def _write_band_dat() -> None: + if not os.path.isfile("band.yaml"): + logging.warning("band.yaml was not created; skipping band.dat export") + return + with open("band.dat", "w") as fp: + result = subprocess.run( + ["phonopy-bandplot", "--gnuplot", "band.yaml"], + stdout=fp, + stderr=subprocess.PIPE, + text=True, + ) + if result.returncode == 0: + return + if os.path.isfile("band.dat") and os.path.getsize("band.dat") > 0: + logging.warning( + "phonopy-bandplot exited with code %s after writing band.dat; continuing. stderr: %s", + result.returncode, + result.stderr.strip(), + ) + return + raise subprocess.CalledProcessError( + result.returncode, + ["phonopy-bandplot", "--gnuplot", "band.yaml"], + output=None, + stderr=result.stderr, + ) + + def _attach_abacus_reference_energies( + self, task_infos: List[dict], task_result_map: Dict[str, str] + ) -> None: + for info in task_infos: + reference_task = info["reference_task_name"] + result_path = task_result_map.get(reference_task) + if not result_path: + raise ValueError( + f"full gruneisen requires result_task.json for reference task {reference_task}" + ) + task_result = loadfn(result_path) + energy = self._last_result_value(task_result, "energies") + atom_count = self._result_atom_count(task_result) + if atom_count <= 0: + raise ValueError(f"invalid atom count in {result_path}") + info["energy"] = energy + info["atom_count"] = atom_count + info["energy_per_atom"] = energy / atom_count + if info["phonon_cell_natoms"]: + info["fit_volume_per_atom"] = info["phonon_cell_volume"] / info["phonon_cell_natoms"] + + def _load_task_info(self, task_dir: str) -> dict: + with open(os.path.join(task_dir, "volume.json"), "r") as fp: + volume_data = json.load(fp) + with open(os.path.join(task_dir, "mesh.yaml"), "r") as fp: + mesh_data = yaml.safe_load(fp) + phonon = mesh_data["phonon"] + weights = [int(point["weight"]) for point in phonon] + frequencies = [ + [float(band["frequency"]) for band in point["band"]] + for point in phonon + ] + phonon_cell_path = ( + os.path.join(task_dir, "POSCAR-unitcell") + if self.inter_param["type"] == "vasp" + else os.path.join(task_dir, "POSCAR") + ) + phonon_cell_volume = float(volume_data["volume"]) + phonon_cell_natoms = None + if os.path.isfile(phonon_cell_path): + phonon_cell_volume = float(vasp_utils.poscar_vol(phonon_cell_path)) + phonon_cell_natoms = int(vasp_utils.poscar_natoms(phonon_cell_path)) + elif self.primitive: + raise FileNotFoundError( + "POSCAR-unitcell is required for primitive gruneisen alpha calculation " + f"but was not found at {phonon_cell_path}" + ) + return { + "task_dir": task_dir, + "strain": float(volume_data["strain"]), + "volume": float(volume_data["volume"]), + "volume_per_atom": float(volume_data["volume_per_atom"]), + "phonon_cell_volume": phonon_cell_volume, + "phonon_cell_natoms": phonon_cell_natoms, + "fit_volume_per_atom": float(volume_data["volume_per_atom"]), + "weights": weights, + "frequencies": frequencies, + } + + def _attach_task_energies(self, task_infos: List[dict], all_res: List[str]) -> None: + if len(all_res) != len(task_infos): + raise ValueError("full gruneisen requires one result_task.json for each volume task") + for info, result_path in zip(task_infos, all_res): + if not os.path.isfile(result_path): + raise FileNotFoundError(f"result_task.json not found for {info['task_dir']}") + task_result = loadfn(result_path) + energy = self._last_result_value(task_result, "energies") + atom_count = self._result_atom_count(task_result) + if atom_count <= 0: + raise ValueError(f"invalid atom count in {result_path}") + info["energy"] = energy + info["atom_count"] = atom_count + info["energy_per_atom"] = energy / atom_count + if info["phonon_cell_natoms"]: + info["fit_volume_per_atom"] = info["phonon_cell_volume"] / info["phonon_cell_natoms"] + + @staticmethod + def _last_result_value(task_result, key: str) -> float: + try: + values = task_result[key] + except (KeyError, TypeError): + values = task_result["data"][key] + if isinstance(values, dict) and "data" in values: + values = values["data"] + if len(values) == 0: + raise ValueError(f"result field {key} is empty") + return float(values[-1]) + + @staticmethod + def _result_atom_count(task_result) -> int: + try: + atom_numbs = task_result["atom_numbs"] + except (KeyError, TypeError): + atom_numbs = task_result["data"]["atom_numbs"] + if isinstance(atom_numbs, dict) and "data" in atom_numbs: + atom_numbs = atom_numbs["data"] + return int(sum(atom_numbs)) + + def _fit_bulk_modulus(self, task_infos: List[dict]) -> dict: + from apex.core.lib.mfp_eosfit import fit_birch_murnaghan + + volumes = [info["fit_volume_per_atom"] for info in task_infos] + energies = [info["energy_per_atom"] for info in task_infos] + fixed_bp = 4.0 if len(task_infos) == 3 else None + fit = fit_birch_murnaghan(volumes, energies, fixed_bp=fixed_bp) + if not math.isfinite(fit["K_T_eV_per_A3"]) or fit["K_T_eV_per_A3"] <= 0.0: + raise ValueError("full gruneisen requires a positive fitted bulk modulus") + if not math.isfinite(fit["K_T_GPa"]) or fit["K_T_GPa"] <= 0.0: + raise ValueError("full gruneisen requires a positive fitted bulk modulus") + return { + "source": self.bulk_modulus_source, + "model": self.eos_model, + "K_T_GPa": fit["K_T_GPa"], + "K_T_eV_per_A3": fit["K_T_eV_per_A3"], + "B0_prime": fit["B0_prime"], + "V0_per_atom_A3": fit["V0_A3"], + "E0_per_atom_eV": fit["E0_eV"], + "fit_variant": fit["fit_variant"], + "used_point_count": fit["used_point_count"], + "residual_sum_squares": fit["residual_sum_squares"], + } + + def _compute_full_thermal_expansion( + self, + ref_info: dict, + sign_only: dict, + bulk_modulus: dict, + ) -> dict: + qpoint_weight_sum = sum(ref_info["weights"]) + if qpoint_weight_sum <= 0: + raise ValueError("full gruneisen requires a positive q-point weight sum") + reference_volume = ref_info["phonon_cell_volume"] + if not math.isfinite(reference_volume) or reference_volume <= 0.0: + raise ValueError("full gruneisen requires a positive reference volume") + k_t = bulk_modulus["K_T_eV_per_A3"] + sum_gamma_cv_per_cell = [ + value / qpoint_weight_sum for value in sign_only["sum_gamma_cv"] + ] + alpha = [ + value / (reference_volume * k_t) + for value in sum_gamma_cv_per_cell + ] + return { + "sum_gamma_cv_per_cell": sum_gamma_cv_per_cell, + "alpha": alpha, + "alpha_unit": "K^-1", + "qpoint_weight_sum": qpoint_weight_sum, + "reference_volume_for_alpha": reference_volume, + } + + def _select_reference_triplet(self, task_infos: List[dict]) -> tuple[dict, dict, dict]: + ref_candidates = [info for info in task_infos if math.isclose(info["strain"], 0.0, abs_tol=1e-10)] + if len(ref_candidates) != 1: + raise ValueError("gruneisen sign_only requires exactly one reference task with strain 0.0") + ref_info = ref_candidates[0] + + negative_infos = sorted( + [info for info in task_infos if info["strain"] < 0.0], + key=lambda info: abs(info["strain"]), + ) + positive_infos = sorted( + [info for info in task_infos if info["strain"] > 0.0], + key=lambda info: abs(info["strain"]), + ) + if not negative_infos or not positive_infos: + raise ValueError("gruneisen sign_only requires symmetric negative and positive strain tasks") + + minus_info = negative_infos[0] + plus_info = positive_infos[0] + if not math.isclose(abs(minus_info["strain"]), abs(plus_info["strain"]), rel_tol=1e-10, abs_tol=1e-10): + raise ValueError("nearest positive and negative strains must be symmetric for sign_only mode") + return ref_info, minus_info, plus_info + + def _compute_sign_only(self, ref_info: dict, minus_info: dict, plus_info: dict) -> dict: + if ref_info["weights"] != minus_info["weights"] or ref_info["weights"] != plus_info["weights"]: + raise ValueError("mesh q-point weights must be identical across volume points") + if len(ref_info["frequencies"]) != len(minus_info["frequencies"]) or len(ref_info["frequencies"]) != len(plus_info["frequencies"]): + raise ValueError("mesh q-point count must be identical across volume points") + + sum_gamma_cv = [0.0 for _ in self.temperatures] + positive_sum = [0.0 for _ in self.temperatures] + negative_sum = [0.0 for _ in self.temperatures] + skipped_mode_count = 0 + + log_v_minus = math.log(minus_info["volume"]) + log_v_plus = math.log(plus_info["volume"]) + denom = log_v_plus - log_v_minus + if math.isclose(denom, 0.0, abs_tol=1e-20): + raise ValueError("volume difference for gruneisen central difference is zero") + + qpoint_count = len(ref_info["frequencies"]) + mode_count = len(ref_info["frequencies"][0]) if qpoint_count else 0 + mode_gruneisen = [] + mode_heat_capacity = [] + mode_contributions = [] + + for q_idx in range(qpoint_count): + ref_modes = ref_info["frequencies"][q_idx] + minus_modes = minus_info["frequencies"][q_idx] + plus_modes = plus_info["frequencies"][q_idx] + if len(ref_modes) != len(minus_modes) or len(ref_modes) != len(plus_modes): + raise ValueError("mesh band count must be identical across volume points") + weight = ref_info["weights"][q_idx] + gamma_row = [] + cv_row = {self._temperature_key(temp): [] for temp in self.temperatures} + contribution_row = {self._temperature_key(temp): [] for temp in self.temperatures} + for mode_idx in range(len(ref_modes)): + omega_ref = ref_modes[mode_idx] + omega_minus = minus_modes[mode_idx] + omega_plus = plus_modes[mode_idx] + if omega_ref <= 0.0 or omega_minus <= 0.0 or omega_plus <= 0.0: + skipped_mode_count += 1 + gamma_row.append(None) + for temp_idx, temperature in enumerate(self.temperatures): + temp_key = self._temperature_key(temperature) + cv_row[temp_key].append(0.0) + contribution_row[temp_key].append(0.0) + continue + gamma = -(math.log(omega_plus) - math.log(omega_minus)) / denom + gamma_row.append(gamma) + for temp_idx, temperature in enumerate(self.temperatures): + cv = self._mode_heat_capacity(omega_ref, float(temperature)) + contribution = weight * gamma * cv + sum_gamma_cv[temp_idx] += contribution + if contribution > 0.0: + positive_sum[temp_idx] += contribution + elif contribution < 0.0: + negative_sum[temp_idx] += contribution + temp_key = self._temperature_key(temperature) + cv_row[temp_key].append(cv) + contribution_row[temp_key].append(contribution) + + mode_gruneisen.append( + { + "q_index": q_idx, + "weight": weight, + "omega_ref": ref_modes, + "gamma": gamma_row, + } + ) + mode_heat_capacity.append( + { + "q_index": q_idx, + "weight": weight, + "cv": cv_row, + } + ) + mode_contributions.append( + { + "q_index": q_idx, + "weight": weight, + "gamma_cv": contribution_row, + } + ) + + contribution_summary = [] + for temp_idx, temperature in enumerate(self.temperatures): + contribution_summary.append( + { + "temperature": float(temperature), + "positive_sum": positive_sum[temp_idx], + "negative_sum": negative_sum[temp_idx], + "net_sum": sum_gamma_cv[temp_idx], + } + ) + + return { + "qpoint_count": qpoint_count, + "mode_count": mode_count, + "skipped_mode_count": skipped_mode_count, + "sum_gamma_cv": sum_gamma_cv, + "sign": [self._classify_sign(value) for value in sum_gamma_cv], + "mode_gruneisen": mode_gruneisen, + "mode_heat_capacity": mode_heat_capacity, + "mode_contributions": mode_contributions, + "contribution_summary": contribution_summary, + } + + @staticmethod + def _mode_heat_capacity(frequency_thz: float, temperature: float) -> float: + if frequency_thz <= 0.0 or temperature <= 0.0: + return 0.0 + x = THZ_TO_K * frequency_thz / temperature + exp_neg_x = math.exp(-x) + if exp_neg_x == 0.0: + return 0.0 + return KB_EV_PER_K * (x * x * exp_neg_x / ((1.0 - exp_neg_x) ** 2)) + + @staticmethod + def _classify_sign(value: float, tol: float = 1e-14) -> str: + if value > tol: + return "positive" + if value < -tol: + return "negative" + return "zero" + + @staticmethod + def _temperature_key(temperature: float) -> str: + return str(float(temperature)) diff --git a/apex/core/property/Lat_param_T.py b/apex/core/property/Lat_param_T.py deleted file mode 100644 index 1d05515c..00000000 --- a/apex/core/property/Lat_param_T.py +++ /dev/null @@ -1,250 +0,0 @@ -import glob -import json -import logging -import os -import re -import dpdata -import numpy as np -from monty.serialization import dumpfn, loadfn -from pymatgen.core.structure import Structure -from pymatgen.core.surface import SlabGenerator -from apex.core.calculator.lib import abacus_utils -from apex.core.calculator.lib import vasp_utils -from apex.core.property.Property import Property -from apex.core.refine import make_refine -from apex.core.reproduce import make_repro, post_repro -from dflow.python import upload_packages -from monty.serialization import loadfn, dumpfn -upload_packages.append(__file__) - -class Lat_param_T(Property): - def __init__(self, parameter, inter_param=None): - ''' - Lammps - supercell_size = [2,2,2] - temperature = [700, 800, 900, 1000] - equi_step = 80000 - N_every = 100 - N_repeat = 10 - N_freq = 2000 - ave_step = 40000 - "cal_type" = "npt+ave/time" - ''' - parameter["reproduce"] = parameter.get("reproduce", False) - self.reprod = parameter["reproduce"] - # default_cal_setting_input_prop = {"input_prop": "lammps_input/lat_param_T/in.lammps"} - if "cal_setting" not in parameter: - parameter["cal_setting"] = {} - # parameter["cal_setting"]["input_prop"] = "lammps_input/lat_param_T/in.lammps" - if not self.reprod: - if not ("init_from_suffix" in parameter and "output_suffix" in parameter): - parameter["supercell_size"] = parameter.get("supercell_size",[2,2,2]) - self.supercell_size = parameter["supercell_size"] - parameter["cal_setting"]["temperature"] = parameter["cal_setting"].get("temperature", [200,400,600,800]) - parameter["cal_setting"]["equi_step"] = parameter["cal_setting"].get("equi_step", 80000) - parameter["cal_setting"]["N_every"] = parameter["cal_setting"].get("N_every", 100) - parameter["cal_setting"]["N_repeat"] = parameter["cal_setting"].get("N_repeat", 10) - parameter["cal_setting"]["N_freq"] = parameter["cal_setting"].get("N_freq", 2000) - parameter["cal_setting"]["ave_step"] = parameter["cal_setting"].get("ave_step", 40000) - else: - parameter["init_from_suffix"] = parameter.get("init_from_suffix", "00") - self.init_from_suffix = parameter["init_from_suffix"] - self.cal_setting = parameter["cal_setting"] - parameter["cal_type"] = "npt+ave/time" - self.parameter = parameter - self.inter_param = inter_param if inter_param != None else {"type": "lammps"} - - def make_confs(self,path_to_work, path_to_equi, refine=False): - path_to_work = os.path.abspath(path_to_work) - if os.path.exists(path_to_work): - logging.warning('%s already exists' % path_to_work) - else: - os.makedirs(path_to_work) - path_to_equi = os.path.abspath(path_to_equi) - - task_list = [] - cwd = os.getcwd() - - if self.reprod: - print("surface reproduce starts") - if "init_data_path" not in self.parameter: - raise RuntimeError("please provide the initial data path to reproduce") - init_data_path = os.path.abspath(self.parameter["init_data_path"]) - task_list = make_repro( - self.inter_param, - init_data_path, - self.init_from_suffix, - path_to_work, - self.parameter.get("reprod_last_frame", True), - ) - else: - if refine: - logging.info("Lat_param_T refine starts") - task_list = make_refine( - self.parameter["init_from_suffix"], - self.parameter["output_suffix"], - path_to_work, - ) - init_from_path = re.sub( - self.parameter["output_suffix"][::-1], - self.parameter["init_from_suffix"][::-1], - path_to_work[::-1], - count=1, - )[::-1] - task_list_basename = list(map(os.path.basename, task_list)) - - for ii in task_list_basename: - init_from_task = os.path.join(init_from_path, ii) - output_task = os.path.join(path_to_work, ii) - os.chdir(output_task) - if os.path.isfile("variable_Lat_param_T.json"): - os.remove("variable_Lat_param_T.json") - if os.path.islink("variable_Lat_param_T.json"): - os.remove("variable_Lat_param_T.json") - os.symlink( - os.path.relpath(os.path.join(init_from_task, "variable_Lat_param_T.json")), - "variable_Lat_param_T.json",) - else: - if self.inter_param["type"] == "abacus": - raise TypeError("Lat_param_T only support lammps calculation") - else: - # refine = false && reproduce = false && self.inter_param["type"]== "vasp" - CONTCAR = "CONTCAR" - POSCAR = "POSCAR" - equi_contcar = os.path.join(path_to_equi, CONTCAR) - if not os.path.exists(equi_contcar): - raise RuntimeError("please do relaxation first") - # get structure - if self.inter_param["type"] == "abacus": - raise TypeError("Lat_param_T only support lammps calculation") - else: - ptypes = vasp_utils.get_poscar_types(equi_contcar) - ss = Structure.from_file(equi_contcar) - ''' - based on temperature build the dir - copy the contcar in equi to each dir - build variable_Lat_param_T.json - ''' - for ii in range(len(self.parameter["cal_setting"]["temperature"])): - output_task = os.path.join(path_to_work, "task.%06d" % ii) - os.makedirs(output_task, exist_ok=True) - os.chdir(output_task) - for jj in [ - "INCAR", - "POTCAR", - "POSCAR", - "conf.lmp", - "in.lammps", - "STRU", - ]: - if os.path.exists(jj): - os.remove(jj) - task_list.append(output_task) - # build the structure for every task - # initially I want to directly copy CONTCAR from relaxation as shutil package is not included, another - # method is used here - ss.to("POSCAR.tmp", "POSCAR") - vasp_utils.regulate_poscar("POSCAR.tmp", "POSCAR") - vasp_utils.sort_poscar("POSCAR", "POSCAR", ptypes) - # Lat_param_T.json - temp = self.parameter["cal_setting"]["temperature"][ii] - Lat_param_T_task = {"temperature":temp, "supercell_size":self.supercell_size} - dumpfn(Lat_param_T_task, "Lat_param_T.json", indent=4) - # variable_Lat_param_T.txt - ret = self._variable(temp) - with open("variable_Lat_param_T.in", "w") as fp: - fp.write(ret) - os.chdir(cwd) - return task_list - - def post_process(self, task_list): - pass - - def task_type(self): - return self.parameter['type'] - - def task_param(self): - return self.parameter - - def _compute_lower(self, - output_file, - all_tasks, - all_res): - output_file = os.path.abspath(output_file) - res_data = {} - ptr_data = os.path.dirname(output_file) + "\n" - - if not self.reprod: - ptr_data += ' Temperature(K) a(A) b(A) c(A) c/a\n' - num = 0 - for ii in all_tasks: - a_sum = 0 - b_sum = 0 - c_sum = 0 - count = 0 - temp = self.parameter["cal_setting"]["temperature"][num] - supercell_size = self.supercell_size - num += 1 - with open(os.path.join(ii, "average_box.txt"), 'r') as file: - for line in file: - if line.startswith("#") or line.strip() == "": - continue - parts = line.split() - if len(parts) == 4: - timestep, v_lx, v_ly, v_lz = parts - a_sum += float(v_lx) - b_sum += float(v_ly) - c_sum += float(v_lz) - count += 1 - a = a_sum / count if count != 0 else 0 - b = b_sum / count if count != 0 else 0 - c = c_sum / count if count != 0 else 0 - - a = a / supercell_size[0] - b = b / supercell_size[1] - c = c / supercell_size[2] - - structure_dir = os.path.basename(ii) - - ptr_data += "%-25s %7.6f %7.6f %7.6f \n" %( - str(temp) + ":", - a, b, c - ) - - res_data[str(temp)] = [ - a, b, c, temp - ] - - with open(output_file, 'w') as fp: - json.dump(res_data, fp, indent=4) - else: - if "init_data_path" not in self.parameter: - raise RuntimeError("please provide the initial data path to reproduce") - init_data_path = os.path.abspath(self.parameter["init_data_path"]) - res_data, ptr_data = post_repro( - init_data_path, - self.parameter["init_from_suffix"], - all_tasks, - ptr_data, - self.parameter.get("reprod_last_frame", True), - ) - - with open(output_file, "w") as fp: - json.dump(res_data, fp, indent=4) - - return res_data, ptr_data - - def _variable(self, temp): - ret = "" - ret += " # variable_Lat_param_T.in \n" - ret += "variable temperature equal %.2f\n" %temp - ret += "variable nx equal %d\n" % self.supercell_size[0] - ret += "variable ny equal %d\n" % self.supercell_size[1] - ret += "variable nz equal %d\n" % self.supercell_size[2] - ret += "variable equi_step equal %d\n" % self.parameter["cal_setting"]["equi_step"] - ret += "variable N_every equal %d\n" % self.parameter["cal_setting"]["N_every"] - ret += "variable N_repeat equal %d\n" % self.parameter["cal_setting"]["N_repeat"] - ret += "variable N_freq equal %d\n" % self.parameter["cal_setting"]["N_freq"] - ret += "variable ave_step equal %d\n" % self.parameter["cal_setting"]["ave_step"] - return ret - diff --git a/apex/core/property/Phonon.py b/apex/core/property/Phonon.py index 923d70f3..d8fa15cc 100644 --- a/apex/core/property/Phonon.py +++ b/apex/core/property/Phonon.py @@ -25,6 +25,11 @@ class Phonon(Property): + @staticmethod + def phonopy_setup_command(arguments: str) -> str: + executable = "phonopy-init" if shutil.which("phonopy-init") else "phonopy" + return f"{executable} {arguments}" + def __init__(self, parameter, inter_param=None): parameter["reproduce"] = parameter.get("reproduce", False) self.reprod = parameter["reproduce"] @@ -42,7 +47,7 @@ def __init__(self, parameter, inter_param=None): self.seekpath_param = parameter["seekpath_param"] parameter["MESH"] = parameter.get('MESH', None) self.MESH = parameter["MESH"] - parameter["PRIMITIVE_AXES"] = parameter.get('PRIMITIVE_AXES', None) + parameter["PRIMITIVE_AXES"] = parameter.get('PRIMITIVE_AXES', "P") self.PRIMITIVE_AXES = parameter["PRIMITIVE_AXES"] parameter["BAND"] = parameter.get('BAND', None) self.BAND = parameter["BAND"] @@ -51,7 +56,7 @@ def __init__(self, parameter, inter_param=None): self.BAND_LABELS = parameter["BAND_LABELS"] else: self.BAND_LABELS = None - parameter["BAND_POINTS"] = parameter.get('BAND_POINTS', None) + parameter["BAND_POINTS"] = parameter.get('BAND_POINTS', 51) self.BAND_POINTS = parameter["BAND_POINTS"] parameter["BAND_CONNECTION"] = parameter.get('BAND_CONNECTION', True) self.BAND_CONNECTION = parameter["BAND_CONNECTION"] @@ -72,6 +77,8 @@ def __init__(self, parameter, inter_param=None): parameter["init_from_suffix"] = parameter.get("init_from_suffix", "00") self.init_from_suffix = parameter["init_from_suffix"] self.cal_type = parameter["cal_type"] + parameter["phonolammps_run_command"] = parameter.get("phonolammps_run_command", None) + self.phonolammps_run_command = parameter["phonolammps_run_command"] parameter["cal_setting"] = parameter.get("cal_setting", default_cal_setting) for key in default_cal_setting: parameter["cal_setting"].setdefault(key, default_cal_setting[key]) @@ -79,6 +86,31 @@ def __init__(self, parameter, inter_param=None): self.parameter = parameter self.inter_param = inter_param if inter_param is not None else {"type": "vasp"} + def _ensure_deepmd_plugin_loaded(self, input_text: str) -> str: + if self.inter_param.get("type") != "deepmd": + return input_text + if "plugin load" in input_text or "pair_style deepmd" not in input_text: + return input_text + return input_text.replace( + "pair_style deepmd", + "plugin load libdeepmd_lmp.so\npair_style deepmd", + 1, + ) + + def _build_phonolammps_run_command(self) -> str: + dim_x, dim_y, dim_z = self.supercell_size + command_template = self.phonolammps_run_command + if not command_template: + return f"phonolammps in.lammps -c POSCAR --dim {dim_x} {dim_y} {dim_z} " + return command_template.format( + input_file="in.lammps", + poscar="POSCAR", + dim=f"{dim_x} {dim_y} {dim_z}", + dim_x=dim_x, + dim_y=dim_y, + dim_z=dim_z, + ) + def make_confs(self, path_to_work, path_to_equi, refine=False): path_to_work = os.path.abspath(path_to_work) if os.path.exists(path_to_work): @@ -163,9 +195,19 @@ def make_confs(self, path_to_work, path_to_equi, refine=False): self.primitive = type_param.get("primitive", self.primitive) self.approach = type_param.get("approach", self.approach) self.supercell_size = type_param.get("supercell_size", self.supercell_size) + self.seekpath_from_original = type_param.get( + "seekpath_from_original", self.seekpath_from_original + ) + self.seekpath_param = type_param.get( + "seekpath_param", self.seekpath_param + ) self.MESH = type_param.get("MESH", self.MESH) self.PRIMITIVE_AXES = type_param.get("PRIMITIVE_AXES", self.PRIMITIVE_AXES) self.BAND = type_param.get("BAND", self.BAND) + if self.BAND: + self.BAND_LABELS = type_param.get("BAND_LABELS", self.BAND_LABELS) + else: + self.BAND_LABELS = None self.BAND_POINTS = type_param.get("BAND_POINTS", self.BAND_POINTS) self.BAND_CONNECTION = type_param.get("BAND_CONNECTION", self.BAND_CONNECTION) @@ -245,7 +287,7 @@ def make_confs(self, path_to_work, path_to_equi, refine=False): orb_file = self.inter_param.get("orb_files", None) abacus_utils.append_orb_file_to_stru("STRU", orb_file, prefix='pp_orb') ## generate STRU-00x - cmd = "phonopy setting.conf --abacus -d" + cmd = self.phonopy_setup_command("setting.conf --abacus -d") subprocess.call(cmd, shell=True) with open("band.conf", "a") as fp: @@ -270,7 +312,7 @@ def make_confs(self, path_to_work, path_to_equi, refine=False): # ------------make for vasp and lammps------------ if self.primitive: - subprocess.call('phonopy --symmetry', shell=True) + subprocess.call(self.phonopy_setup_command("--symmetry"), shell=True) subprocess.call('cp PPOSCAR POSCAR', shell=True) shutil.copyfile("PPOSCAR", "POSCAR-unitcell") else: @@ -278,10 +320,13 @@ def make_confs(self, path_to_work, path_to_equi, refine=False): # make tasks if self.inter_param["type"] == 'vasp': - cmd = "phonopy -d --dim='%d %d %d' -c POSCAR" % ( - int(self.supercell_size[0]), - int(self.supercell_size[1]), - int(self.supercell_size[2]) + cmd = self.phonopy_setup_command( + "-d --dim='%d %d %d' -c POSCAR" + % ( + int(self.supercell_size[0]), + int(self.supercell_size[1]), + int(self.supercell_size[2]), + ) ) subprocess.call(cmd, shell=True) # linear response method @@ -354,12 +399,9 @@ def post_process(self, task_list): del contents[pair_line_id + 1:] with open("in.lammps", 'w') as f2: - for jj in range(len(contents)): - f2.write(contents[jj]) + f2.write(self._ensure_deepmd_plugin_loaded("".join(contents))) # dump phonolammps command - phonolammps_cmd = "phonolammps in.lammps -c POSCAR --dim %s %s %s " %( - self.supercell_size[0], self.supercell_size[1], self.supercell_size[2] - ) + phonolammps_cmd = self._build_phonolammps_run_command() with open("run_command", 'w') as f3: f3.write(phonolammps_cmd) elif inter_type == "vasp": @@ -506,7 +548,7 @@ def _compute_lower(self, output_file, all_tasks, all_res): self.check_same_copy("task.000000/band.conf", "band.conf") self.check_same_copy("task.000000/STRU.ori", "STRU") self.check_same_copy("task.000000/phonopy_disp.yaml", "phonopy_disp.yaml") - os.system('phonopy -f task.0*/OUT.ABACUS/running_scf.log') + os.system(self.phonopy_setup_command("-f task.0*/OUT.ABACUS/running_scf.log")) if os.path.exists("FORCE_SETS"): print('FORCE_SETS is created') else: @@ -521,7 +563,7 @@ def _compute_lower(self, output_file, all_tasks, all_res): if self.approach == "linear": os.chdir(all_tasks[0]) assert os.path.isfile('vasprun.xml'), "vasprun.xml not found" - os.system('phonopy --fc vasprun.xml') + os.system(self.phonopy_setup_command("--fc vasprun.xml")) assert os.path.isfile('FORCE_CONSTANTS'), "FORCE_CONSTANTS not created" os.system('phonopy --dim="%s %s %s" -c POSCAR-unitcell band.conf' % ( self.supercell_size[0], @@ -534,7 +576,7 @@ def _compute_lower(self, output_file, all_tasks, all_res): elif self.approach == "displacement": self.check_same_copy("task.000000/band.conf", "band.conf") self.check_same_copy("task.000000/phonopy_disp.yaml", "phonopy_disp.yaml") - os.system('phonopy -f task.0*/vasprun.xml') + os.system(self.phonopy_setup_command("-f task.0*/vasprun.xml")) if os.path.exists("FORCE_SETS"): print('FORCE_SETS is created') else: diff --git a/apex/core/property/Surface.py b/apex/core/property/Surface.py index 31420e9d..b12dc7dd 100644 --- a/apex/core/property/Surface.py +++ b/apex/core/property/Surface.py @@ -37,7 +37,7 @@ def __init__(self, parameter, inter_param=None): default_cal_setting = { "relax_pos": True, "relax_shape": True, - "relax_vol": False, + "relax_vol": False } else: parameter["cal_type"] = "static" @@ -45,7 +45,7 @@ def __init__(self, parameter, inter_param=None): default_cal_setting = { "relax_pos": False, "relax_shape": False, - "relax_vol": False, + "relax_vol": False } parameter["init_from_suffix"] = parameter.get("init_from_suffix", "00") self.init_from_suffix = parameter["init_from_suffix"] @@ -79,7 +79,7 @@ def make_confs(self, path_to_work, path_to_equi, refine=False): self.parameter["start_confs_path"], struct_output_name, "relaxation", - "relax_task", + "relax_task" ) ) @@ -105,14 +105,14 @@ def make_confs(self, path_to_work, path_to_equi, refine=False): task_list = make_refine( self.parameter["init_from_suffix"], self.parameter["output_suffix"], - path_to_work, + path_to_work ) # record miller init_from_path = re.sub( self.parameter["output_suffix"][::-1], self.parameter["init_from_suffix"][::-1], path_to_work[::-1], - count=1, + count=1 )[::-1] task_list_basename = list(map(os.path.basename, task_list)) @@ -124,7 +124,7 @@ def make_confs(self, path_to_work, path_to_equi, refine=False): os.remove("miller.json") os.symlink( os.path.relpath(os.path.join(init_from_task, "miller.json")), - "miller.json", + "miller.json" ) else: @@ -169,7 +169,7 @@ def make_confs(self, path_to_work, path_to_equi, refine=False): "POSCAR", "conf.lmp", "in.lammps", - "STRU", + "STRU" ]: if os.path.exists(jj): os.remove(jj) @@ -235,12 +235,12 @@ def _compute_lower(self, output_file, all_tasks, all_res): str(miller_index) + "-" + structure_dir + ":", evac, epa, - equi_epa, + equi_epa ) res_data[str(miller_index) + "_" + structure_dir] = [ evac, epa, - equi_epa, + equi_epa ] else: @@ -252,7 +252,7 @@ def _compute_lower(self, output_file, all_tasks, all_res): self.parameter["init_from_suffix"], all_tasks, ptr_data, - self.parameter.get("reprod_last_frame", True), + self.parameter.get("reprod_last_frame", True) ) with open(output_file, "w") as fp: diff --git a/apex/core/property/__init__.py b/apex/core/property/__init__.py index e69de29b..f3f2827d 100644 --- a/apex/core/property/__init__.py +++ b/apex/core/property/__init__.py @@ -0,0 +1 @@ +from apex.core.property.FiniteTelastic import FiniteTelastic diff --git a/examples/abacus_demo/abacus_input/INPUT b/apex/default_config/abacus/param_interaction/abacus_input/INPUT similarity index 100% rename from examples/abacus_demo/abacus_input/INPUT rename to apex/default_config/abacus/param_interaction/abacus_input/INPUT diff --git a/apex/default_config/abacus/param_interaction/param_interaction.json b/apex/default_config/abacus/param_interaction/param_interaction.json new file mode 100644 index 00000000..62226e71 --- /dev/null +++ b/apex/default_config/abacus/param_interaction/param_interaction.json @@ -0,0 +1,13 @@ +{ + "interaction": { + "type": "abacus", + "incar": "abacus_input/INPUT", + "potcar_prefix": "abacus_input", + "potcars": { + "Al": "Al_ONCV_PBE-1.0.upf" + }, + "orb_files": { + "Al": "Al_gga_9au_100Ry_4s4p1d.orb" + } + } +} diff --git a/apex/default_config/abacus/param_props.json b/apex/default_config/abacus/param_props.json new file mode 100755 index 00000000..15376086 --- /dev/null +++ b/apex/default_config/abacus/param_props.json @@ -0,0 +1,71 @@ +{ + "properties": [ + { + "type": "eos", + "req_calc": true, + "vol_start": 0.6, + "vol_end": 1.4, + "vol_step": 0.05 + }, + { + "type": "elastic", + "req_calc": false, + "norm_deform": 1e-2, + "shear_deform": 1e-2 + }, + { + "type": "surface", + "req_calc": false, + "min_slab_size": 10, + "min_vacuum_size":11, + "max_miller": 2, + "cal_type": "static" + }, + { + "type": "interstitial", + "req_calc": false, + "supercell": [1, 1, 1], + "insert_ele": ["Mo"] + }, + { + "type": "gamma", + "req_calc": false, + "plane_miller": [1,2,3], + "slip_direction": [1,1,-1], + "hcp": { + "plane_miller": [0,0,0,1], + "slip_direction": [2,-1,-1,0], + "slip_length": 1 + }, + "supercell_size": [1,1,20], + "vacuum_size": 15, + "add_fix": ["true","true","false"], + "n_steps": 20 + }, + { + "type": "gamma_surface", + "req_calc": false, + "plane_miller": [1,1,0], + "slip_direction": [1,-1,-1], + "supercell_size": [1,1,20], + "vacuum_size": 15, + "add_fix": ["true","true","false"], + "n_steps_x": 20, + "n_steps_y": 20 + }, + { + "type": "phonon", + "req_calc": false, + "BAND": "0.5000 0.5000 0.5000 0.0000 0.0000 0.0000 0.5000 0.0000 0.5000 0.5000 0.2500 0.7500", + "supercell_size":[1,1,1], + "MESH":[8,8,8], + "PRIMITIVE_AXES": "0 1/2 1/2 1/2 0 1/2 1/2 1/2 0", + "BAND_POINTS":21, + "BAND_CONNECTION" :true, + "cal_setting": { + "K_POINTS": [6,6,6,0,0,0], + "input_prop": "abacus_input/INPUT_phonon" + } + } + ] +} diff --git a/apex/default_config/abacus/param_structure.json b/apex/default_config/abacus/param_structure.json new file mode 100755 index 00000000..8e3b3314 --- /dev/null +++ b/apex/default_config/abacus/param_structure.json @@ -0,0 +1,3 @@ +{ + "structures": ["confs"] +} diff --git a/apex/default_config/gui_submit_group.template.json b/apex/default_config/gui_submit_group.template.json new file mode 100644 index 00000000..763ffccb --- /dev/null +++ b/apex/default_config/gui_submit_group.template.json @@ -0,0 +1,69 @@ +{ + "description": "Example payload for tracking one GUI submit group or manually filling multiple workflow ids into apex gui.", + "usage": { + "gui_field": "Workflow ID(s)", + "format": "Paste workflow_ids as a comma-separated string, or copy the listed ids manually.", + "example_text": "wf-aaaa1111, wf-bbbb2222, wf-cccc3333" + }, + "group_id": "apex-gui-YYYYMMDDHHMMSS-xxxxxxxx", + "created_at": "2026-04-27T00:00:00", + "workdir": "/absolute/path/to/workdir", + "global_file": "global.json", + "param_file": "param.json", + "batch_size": 100, + "total_confs": 300, + "expected_batches": 3, + "workflow_log_line_start": 0, + "workflow_ids": [ + "wf-aaaa1111", + "wf-bbbb2222", + "wf-cccc3333" + ], + "submit_jobs": [ + { + "batch_index": 1, + "batch_total": 3, + "param_file": "param.batch-001-of-003.json", + "global_file": "global.json", + "workflow_name": "apex-gui-example-xxxxxxxx-batch-001", + "labels": [ + "apex_gui_group=apex-gui-YYYYMMDDHHMMSS-xxxxxxxx", + "apex_gui_workdir=example-workdir", + "apex_gui_batch=001-of-003", + "apex_gui_source=gui" + ], + "workdir": "/absolute/path/to/workdir", + "conf_count": 100 + }, + { + "batch_index": 2, + "batch_total": 3, + "param_file": "param.batch-002-of-003.json", + "global_file": "global.json", + "workflow_name": "apex-gui-example-xxxxxxxx-batch-002", + "labels": [ + "apex_gui_group=apex-gui-YYYYMMDDHHMMSS-xxxxxxxx", + "apex_gui_workdir=example-workdir", + "apex_gui_batch=002-of-003", + "apex_gui_source=gui" + ], + "workdir": "/absolute/path/to/workdir", + "conf_count": 100 + }, + { + "batch_index": 3, + "batch_total": 3, + "param_file": "param.batch-003-of-003.json", + "global_file": "global.json", + "workflow_name": "apex-gui-example-xxxxxxxx-batch-003", + "labels": [ + "apex_gui_group=apex-gui-YYYYMMDDHHMMSS-xxxxxxxx", + "apex_gui_workdir=example-workdir", + "apex_gui_batch=003-of-003", + "apex_gui_source=gui" + ], + "workdir": "/absolute/path/to/workdir", + "conf_count": 100 + } + ] +} diff --git a/apex/default_config/lammps/param_props.json b/apex/default_config/lammps/param_props.json new file mode 100755 index 00000000..e6319f03 --- /dev/null +++ b/apex/default_config/lammps/param_props.json @@ -0,0 +1,111 @@ +{ + "properties": [ + { + "type": "eos", + "req_calc": false, + "vol_start": 0.6, + "vol_end": 1.4, + "vol_step": 0.4, + "cal_setting": {"etol": 0, + "ftol": 1e-10} + }, + { + "type": "cohesive", + "req_calc":false, + "latt_start": 0.6, + "latt_end": 1.4, + "latt_step": 0.1 + }, + { + "type": "decohesive", + "req_calc": false, + "min_slab_size": 15, + "max_vacuum_size": 10, + "vacuum_size_step": 2, + "miller_index": [0, 0, 1] + + }, + { + "type": "finite_t_latt", + "req_calc": false, + "supercell_size": [2, 2, 2], + "cal_setting": { + "temperature": [200, 400, 600, 800], + "equi_step": 20000, + "N_every": 100, + "N_repeat": 10, + "N_freq": 2000, + "ave_step": 20000, + "timestep": 0.001, + "tdamp": 0.1, + "pdamp": 1.0} + }, + { + "type": "elastic", + "req_calc": false, + "norm_deform": 1e-2, + "shear_deform": 1e-2, + "cal_setting": {"etol": 0, + "ftol": 1e-10} + }, + { + "type": "finite_t_elastic", + "req_calc": false, + "supercell_size": [2, 2, 2], + "cal_setting": { + "temperature": [300], + "strain": 0.001, + "strain_components": [0, 1, 2, 3, 4, 5], + "equi_step": 16000, + "response_step": 16000, + "stress_output_every": 100, + "timestep": 0.001, + "tdamp": 0.1, + "pdamp": 1.0, + "seed": 12345, + "n_blocks": 10, + "method": "paired_langevin" + } + }, + { + "type": "surface", + "req_calc": false, + "min_slab_size": 10, + "min_vacuum_size":11, + "max_miller": 2, + "cal_type": "static" + }, + { + "type": "interstitial", + "req_calc": false, + "supercell": [2, 2, 2], + "insert_ele": ["Al"] + }, + { + "type": "vacancy", + "req_calc": false, + "supercell": [2, 2, 2] + }, + { + "type": "gamma", + "req_calc": false, + "plane_miller": [1,1,1], + "slip_direction": [1,1,-2], + "supercell_size": [2,2,100], + "vacuum_size": 15, + "add_fix": ["true","true","false"], + "n_steps": 10 + }, + { + "type": "gamma_surface", + "req_calc": false, + "plane_miller": [1,1,0], + "slip_direction": [1,-1,-1], + "supercell_size": [1,1,20], + "vacuum_size": 15, + "add_fix": ["true","true","false"], + "n_steps_x": 20, + "n_steps_y": 20 + } + ] +} diff --git a/apex/default_config/lammps/param_structure.json b/apex/default_config/lammps/param_structure.json new file mode 100755 index 00000000..8e3b3314 --- /dev/null +++ b/apex/default_config/lammps/param_structure.json @@ -0,0 +1,3 @@ +{ + "structures": ["confs"] +} diff --git a/apex/default_config/vasp/param_interaction/param_interaction.json b/apex/default_config/vasp/param_interaction/param_interaction.json new file mode 100644 index 00000000..0ba46253 --- /dev/null +++ b/apex/default_config/vasp/param_interaction/param_interaction.json @@ -0,0 +1,10 @@ +{ + "interaction": { + "type": "vasp", + "incar": "vasp_input/INCAR", + "potcar_prefix": "vasp_input", + "potcars": { + "Mo": "POTCAR.Mo" + } + } +} diff --git a/examples/vasp_demo/vasp_input/INCAR b/apex/default_config/vasp/param_interaction/vasp_input/INCAR old mode 100644 new mode 100755 similarity index 100% rename from examples/vasp_demo/vasp_input/INCAR rename to apex/default_config/vasp/param_interaction/vasp_input/INCAR diff --git a/apex/default_config/vasp/param_props.json b/apex/default_config/vasp/param_props.json new file mode 100755 index 00000000..fb99e52d --- /dev/null +++ b/apex/default_config/vasp/param_props.json @@ -0,0 +1,77 @@ +{ + "properties": [ + { + "type": "eos", + "req_calc": false, + "vol_start": 0.6, + "vol_end": 1.4, + "vol_step": 0.4 + }, + { + "type": "eos", + "req_calc": false, + "suffix": "4_step", + "vol_start": 0.6, + "vol_end": 1.4, + "vol_step": 0.2 + }, + { + "type": "elastic", + "req_calc": false, + "norm_deform": 1e-2, + "shear_deform": 1e-2 + }, + { + "type": "surface", + "req_calc": false, + "min_slab_size": 10, + "min_vacuum_size":11, + "max_miller": 2, + "cal_type": "static" + }, + { + "type": "vacancy", + "req_calc": false, + "supercell": [2, 2, 2] + }, + { + "type": "interstitial", + "req_calc": false, + "supercell": [1, 1, 1], + "insert_ele": ["Mo"] + }, + { + "type": "gamma", + "req_calc": false, + "plane_miller": [1,2,3], + "slip_direction": [1,1,-1], + "hcp": { + "plane_miller": [0,0,0,1], + "slip_direction": [2,-1,-1,0], + "slip_length": 1 + }, + "supercell_size": [1,1,20], + "vacuum_size": 15, + "add_fix": ["true","true","false"], + "n_steps": 20 + }, + { + "type": "gamma_surface", + "req_calc": false, + "plane_miller": [1,1,0], + "slip_direction": [1,-1,-1], + "supercell_size": [1,1,20], + "vacuum_size": 15, + "add_fix": ["true","true","false"], + "n_steps_x": 20, + "n_steps_y": 20 + }, + { + "type": "phonon", + "req_calc": false, + "suffix": "linear", + "BAND": "0.0000 0.0000 0.5000 0.0000 0.0000 0.0000 0.5000 -0.5000 0.5000 0.25000 0.2500 0.2500 0 0 0", + "supercell_size":[2,2,2] + } + ] +} diff --git a/apex/default_config/vasp/param_structure.json b/apex/default_config/vasp/param_structure.json new file mode 100755 index 00000000..d7be2523 --- /dev/null +++ b/apex/default_config/vasp/param_structure.json @@ -0,0 +1,9 @@ +{ + "structures": ["confs"], + "interaction": { + "type": "vasp", + "incar": "vasp_input/INCAR", + "potcar_prefix": "vasp_input", + "potcars": {"Mo": "POTCAR.Mo"} + } +} diff --git a/apex/flow.py b/apex/flow.py index 9f122a7d..d34f23e8 100644 --- a/apex/flow.py +++ b/apex/flow.py @@ -3,7 +3,9 @@ import time import shutil import re +import copy import datetime +import json from typing import ( Optional, Type, @@ -13,6 +15,7 @@ import dflow from dflow import ( Step, + Task, upload_artifact, download_artifact, Workflow @@ -47,6 +50,7 @@ def __init__( pool_size: Optional[int] = None, executor: Optional[DispatcherExecutor] = None, upload_python_packages: Optional[List[os.PathLike]] = None, + debug_mode: bool = False, ): self.download_path = None self.upload_path = None @@ -68,6 +72,7 @@ def __init__( self.pool_size = pool_size self.executor = executor self.upload_python_packages = upload_python_packages + self.debug_mode = debug_mode @staticmethod def regulate_name(name): @@ -86,13 +91,331 @@ def regulate_name(name): return name + @staticmethod + def _is_missing_artifact_error(exc: Exception) -> bool: + return "the artifact does not exist in the storage" in str(exc).lower() + + @staticmethod + def _is_transient_download_error(exc: Exception) -> bool: + message = str(exc).lower() + markers = ( + "connection", + "connect", + "timeout", + "timed out", + "temporarily unavailable", + "network", + "name resolution", + "dns", + "reset by peer", + "remote disconnected", + "broken pipe", + "ssl", + "proxy", + ) + return any(marker in message for marker in markers) + + @staticmethod + def _download_artifact_with_retry(artifact, path, retries: int = 3, delay: int = 10): + last_exc = None + for attempt in range(1, retries + 1): + try: + return download_artifact(artifact=artifact, path=path) + except Exception as exc: + last_exc = exc + if ( + FlowGenerator._is_missing_artifact_error(exc) + or not FlowGenerator._is_transient_download_error(exc) + ): + raise RuntimeError(f"Artifact download failed without retry: {exc}") from exc + if attempt >= retries: + break + print( + f"Artifact download failed ({attempt}/{retries}): {exc}. " + f"Retrying in {delay}s..." + ) + time.sleep(delay) + raise RuntimeError( + f"Artifact download failed after {retries} attempt(s): {last_exc}" + ) from last_exc + + @staticmethod + def _format_step_failure( + step, + fallback_label: str, + main_log_path: Optional[Union[str, List[str]]] = None, + main_log_error: Optional[str] = None, + diagnostic_artifacts: Optional[List[Union[str, List[str]]]] = None, + ) -> str: + if step is None: + return f"{fallback_label}: no step details available" + + detail_keys = [ + "phase", + "message", + "reason", + "podName", + "pod_name", + "displayName", + "name", + "finishedAt", + "startedAt", + ] + lines = [fallback_label] + for key in detail_keys: + value = None + if isinstance(step, dict): + value = step.get(key) + else: + value = getattr(step, key, None) + if value not in (None, ""): + lines.append(f" {key}: {value}") + + if main_log_path: + if isinstance(main_log_path, list): + main_log_path = ", ".join(str(item) for item in main_log_path) + lines.append(f" main_logs: {main_log_path}") + elif main_log_error: + lines.append(f" main_logs: unavailable ({main_log_error})") + + if diagnostic_artifacts: + artifact_text = ", ".join(str(item) for item in diagnostic_artifacts) + lines.append(f" failed_artifacts: {artifact_text}") + + if isinstance(step, dict): + try: + lines.append(" raw_step: " + json.dumps(step, default=str, sort_keys=True)) + except TypeError: + lines.append(f" raw_step: {step!r}") + else: + lines.append(f" raw_step: {step!r}") + return "\n".join(lines) + + @staticmethod + def _safe_get(obj, key, default=None): + if isinstance(obj, dict): + return obj.get(key, default) + return getattr(obj, key, default) + + @classmethod + def _step_artifacts(cls, step): + outputs = cls._safe_get(step, "outputs") + if outputs is None: + return {} + artifacts = cls._safe_get(outputs, "artifacts", {}) + return artifacts or {} + + @staticmethod + def _sanitize_log_name(name: str) -> str: + name = re.sub(r'[^a-zA-Z0-9_.-]', '-', str(name)).strip("-") + return name or "failed-step" + + @staticmethod + def _artifact_by_name(artifacts, *names): + for name in names: + try: + artifact = artifacts.get(name) + except AttributeError: + try: + artifact = artifacts[name] + except (KeyError, TypeError): + artifact = None + if artifact is not None: + return artifact + return None + + def _main_logs_artifact(self, step): + artifacts = self._step_artifacts(step) + return self._artifact_by_name(artifacts, "main-logs", "main_logs") + + @classmethod + def _step_id(cls, step): + return cls._safe_get(step, "id") + + @classmethod + def _steps_by_id(cls, step_info, step_ids): + if step_info is None: + return [] + found = [] + for step_id in step_ids: + if not step_id: + continue + try: + found.extend(step_info.get_step(id=step_id)) + except Exception: + continue + return found + + @classmethod + def _failed_child_ids_from_step(cls, step): + child_ids = [] + message = cls._safe_get(step, "message", "") + if message: + child_ids.extend(re.findall(r"child '([^']+)' failed", str(message))) + outbound_nodes = cls._safe_get(step, "outboundNodes", []) + if isinstance(outbound_nodes, list): + child_ids.extend(outbound_nodes) + elif outbound_nodes: + child_ids.append(outbound_nodes) + return child_ids + + def _child_steps_with_main_logs(self, step_info, parent_step): + if step_info is None or parent_step is None: + return [] + parent_id = self._safe_get(parent_step, "id") + if not parent_id: + return [] + + related_steps = self._related_child_steps(step_info, parent_step) + candidates = [] + for child in related_steps: + if self._main_logs_artifact(child) is None: + continue + phase = self._safe_get(child, "phase", "") + display_name = self._safe_get(child, "displayName", "") + candidates.append((phase, display_name, child)) + + def candidate_key(item): + phase, display_name, _ = item + failed_rank = 0 if phase in {"Failed", "Error"} else 1 + display_name = str(display_name).lower() + op_rank = 0 if display_name in {"relaxmake", "propsmake", "propspost"} else 1 + return failed_rank, op_rank, display_name + + return [child for _, _, child in sorted(candidates, key=candidate_key)] + + def _related_child_steps(self, step_info, parent_step): + related_steps = [] + try: + related_steps.extend( + step_info.get_step( + parent_id=self._safe_get(parent_step, "id"), + sort_by_generation=True, + ) + ) + except Exception: + pass + + related_steps.extend( + self._steps_by_id(step_info, self._failed_child_ids_from_step(parent_step)) + ) + + seen = set() + queue = list(related_steps) + while queue: + current = queue.pop(0) + current_id = self._step_id(current) + if not current_id or current_id in seen: + continue + seen.add(current_id) + try: + nested_steps = step_info.get_step( + parent_id=current_id, + sort_by_generation=True, + ) + except Exception: + nested_steps = [] + related_steps.extend(nested_steps) + queue.extend(nested_steps) + + return related_steps + + def _download_step_main_logs(self, step, step_label: str, step_info=None): + artifact = self._main_logs_artifact(step) + log_label = step_label + if artifact is None: + child_steps = self._child_steps_with_main_logs(step_info, step) + if child_steps: + child_step = child_steps[0] + artifact = self._main_logs_artifact(child_step) + child_name = self._safe_get(child_step, "displayName", "child-step") + log_label = os.path.join(step_label, str(child_name)) + + if artifact is None: + return None, "main-logs artifact not found on failed step or its child steps" + + log_dir = os.path.join( + self.download_path or os.getcwd(), + "main-logs", + *[self._sanitize_log_name(item) for item in log_label.split(os.sep)], + ) + os.makedirs(log_dir, exist_ok=True) + try: + return self._download_artifact_with_retry(artifact=artifact, path=log_dir), None + except Exception as exc: + return None, str(exc) + + def _download_step_diagnostic_artifacts(self, step, step_label: str, step_info=None): + if not (self.debug_mode or dflow.config.get("mode") == "debug"): + return [] + diagnostic_names = { + "backward_dir", + "retrieve_path", + "output_all", + "output_work_path", + "task_paths", + } + steps = [step] + steps.extend(self._related_child_steps(step_info, step)) + downloaded = [] + seen = set() + for item in steps: + display_name = self._safe_get(item, "displayName", "step") + artifacts = self._step_artifacts(item) + for name, artifact in artifacts.items(): + if name.startswith("dflow_") or name == "main-logs": + continue + if name not in diagnostic_names: + continue + key = (self._step_id(item), name) + if key in seen: + continue + seen.add(key) + out_dir = os.path.join( + self.download_path or os.getcwd(), + "failed-artifacts", + self._sanitize_log_name(step_label), + self._sanitize_log_name(display_name), + self._sanitize_log_name(name), + ) + os.makedirs(out_dir, exist_ok=True) + try: + path = self._download_artifact_with_retry(artifact=artifact, path=out_dir) + downloaded.append(path) + except Exception as exc: + downloaded.append(f"{display_name}/{name}: unavailable ({exc})") + return downloaded + + def _terminate_workflow_after_relax_failure(self): + try: + self.workflow.terminate() + return "workflow terminated to stop pending/running property calculations" + except Exception as exc: + message = str(exc) + if "cannot shutdown a completed workflow" in message: + return "workflow already completed before automatic termination; root cause is the failed relaxation step above" + return f"failed to terminate workflow automatically: {exc}" + + def _raise_if_failed(self, failed_entries, workflow_kind: str): + if failed_entries: + details = "\n\n".join(failed_entries) + raise RuntimeError( + f"{workflow_kind} failed with {len(failed_entries)} failed step(s):\n{details}" + ) + def _monitor_relax(self): print('Waiting for relaxation result...') + failed_detail = None while True: time.sleep(4) step_info = self.workflow.query() wf_status = self.workflow.query_status() if wf_status == 'Failed': + if failed_detail is not None: + raise RuntimeError( + f"Workflow failed (ID: {self.workflow.id}, UID: {self.workflow.uid})\n" + f"{failed_detail}" + ) raise RuntimeError(f'Workflow failed (ID: {self.workflow.id}, UID: {self.workflow.uid})') try: relax_post = step_info.get_step(name='relaxation-cal')[0] @@ -101,11 +424,24 @@ def _monitor_relax(self): if relax_post['phase'] == 'Succeeded': print(f'Relaxation finished (ID: {self.workflow.id}, UID: {self.workflow.uid})') print('Retrieving completed tasks to local...') - download_artifact( + self._download_artifact_with_retry( artifact=relax_post.outputs.artifacts['retrieve_path'], path=self.download_path ) break + if relax_post['phase'] == 'Failed': + main_log_path, main_log_error = self._download_step_main_logs( + relax_post, + "relaxation-cal", + step_info=step_info, + ) + failed_detail = self._format_step_failure( + relax_post, + f"Relaxation step failed (ID: {self.workflow.id}, UID: {self.workflow.uid})", + main_log_path=main_log_path, + main_log_error=main_log_error, + ) + raise RuntimeError(failed_detail) def _monitor_props( self, @@ -113,6 +449,7 @@ def _monitor_props( ): subprops_left = subprops_key_list.copy() subprops_failed_list = [] + failed_details = [] print(f'Waiting for sub-property results ({len(subprops_left)} left)...') while True: time.sleep(4) @@ -125,7 +462,7 @@ def _monitor_props( if step['phase'] == 'Succeeded': print(f'Sub-workflow {kk} finished (ID: {self.workflow.id}, UID: {self.workflow.uid})') print('Retrieving completed tasks to local...') - download_artifact( + self._download_artifact_with_retry( artifact=step.outputs.artifacts['retrieve_path'], path=self.download_path ) @@ -135,19 +472,320 @@ def _monitor_props( elif step['phase'] == 'Failed': print(f'Sub-workflow {kk} failed (ID: {self.workflow.id}, UID: {self.workflow.uid})') subprops_failed_list.append(kk) + main_log_path, main_log_error = self._download_step_main_logs( + step, + kk, + step_info=step_info, + ) + diagnostic_artifacts = self._download_step_diagnostic_artifacts( + step, + kk, + step_info=step_info, + ) + failed_details.append( + self._format_step_failure( + step, + f"Sub-property {kk} failed (ID: {self.workflow.id}, UID: {self.workflow.uid})", + main_log_path=main_log_path, + main_log_error=main_log_error, + diagnostic_artifacts=diagnostic_artifacts, + ) + ) subprops_left.remove(kk) if subprops_left: print(f'Waiting for sub-property results ({len(subprops_left)} left)...') if not subprops_left: print(f'Workflow finished with {len(subprops_failed_list)} sub-property failed ' f'(ID: {self.workflow.id}, UID: {self.workflow.uid})') + self._raise_if_failed(failed_details, "Property workflow") + break + + def _set_relax_flows( + self, + input_work_dir: dflow.common.S3Artifact, + relax_parameter: dict + ) -> [List[Step], List[str]]: + """ + Build per-structure relaxation subflows so finished structures + can be posted and retrieved without waiting for others. + """ + confs = relax_parameter["structures"] + conf_dirs = [] + for conf in confs: + conf_dirs.extend(glob.glob(conf)) + conf_dirs = list(set(conf_dirs)) + conf_dirs.sort() + + # reuse a single RelaxationFlow template to keep manifest size small + relaxation_template = RelaxationFlow( + name='relaxation-flow', + make_op=self.relax_make_op, + run_op=self.run_op, + post_op=self.relax_post_op, + make_image=self.make_image, + run_image=self.run_image, + post_image=self.post_image, + run_command=self.run_command, + calculator=self.calculator, + group_size=self.group_size, + pool_size=self.pool_size, + executor=self.executor, + upload_python_packages=self.upload_python_packages + ) + + relax_list = [] + relax_key_list = [] + for ii in conf_dirs: + sub_relax_param = copy.deepcopy(relax_parameter) + sub_relax_param["structures"] = [ii] + clean_subflow_id = re.sub(r'[^a-zA-Z0-9-]', '-', ii).lower() + subflow_key = f'relaxcal-{clean_subflow_id}' + relax_key_list.append(subflow_key) + relax_list.append( + Step( + name=f'Relaxation-cal-{clean_subflow_id}', + template=relaxation_template, + artifacts={ + "input_work_path": input_work_dir + }, + parameters={ + "flow_id": ii, + "parameter": sub_relax_param + }, + key=subflow_key + ) + ) + return relax_list, relax_key_list + + def _set_relax_tasks( + self, + input_work_dir: dflow.common.S3Artifact, + relax_parameter: dict + ) -> [List[Task], List[str]]: + """ + Task-based version for DAG entry so that Argo schedules per-structure + relaxations independently and exposes their artifacts to downstream + property tasks without a global barrier. + """ + if relax_parameter.get("relaxation", {}).get("req_calc", True) is False: + return [], [] + + confs = relax_parameter["structures"] + conf_dirs = [] + for conf in confs: + conf_dirs.extend(glob.glob(conf)) + conf_dirs = list(set(conf_dirs)) + conf_dirs.sort() + + relaxation_template = RelaxationFlow( + name='relaxation-flow', + make_op=self.relax_make_op, + run_op=self.run_op, + post_op=self.relax_post_op, + make_image=self.make_image, + run_image=self.run_image, + post_image=self.post_image, + run_command=self.run_command, + calculator=self.calculator, + group_size=self.group_size, + pool_size=self.pool_size, + executor=self.executor, + upload_python_packages=self.upload_python_packages + ) + + task_list = [] + task_key_list = [] + skip_finished = set(relax_parameter.get("skip_finished_structures", [])) + for ii in conf_dirs: + sub_relax_param = copy.deepcopy(relax_parameter) + sub_relax_param["structures"] = [ii] + clean_subflow_id = re.sub(r'[^a-zA-Z0-9-]', '-', ii).lower() + subflow_key = f'relaxcal-{clean_subflow_id}' + if ii in skip_finished: + print(f"Skip relaxation for {ii} (marked finished; rerun_finished=False)") + continue + task_key_list.append(subflow_key) + task_list.append( + Task( + name=f'Relaxation-cal-{clean_subflow_id}', + template=relaxation_template, + artifacts={ + "input_work_path": input_work_dir + }, + parameters={ + "flow_id": ii, + "parameter": sub_relax_param + }, + key=subflow_key + ) + ) + return task_list, task_key_list + + def _monitor_relax_flows(self, relax_key_list: List[str]): + relax_left = relax_key_list.copy() + relax_failed_list = [] + failed_details = [] + print(f'Waiting for relaxation results ({len(relax_left)} left)...') + last_count = len(relax_left) + last_log_ts = time.time() + while True: + time.sleep(4) + step_info = self.workflow.query() + wf_status = self.workflow.query_status() + if wf_status == 'Failed' and not relax_left: + break + for kk in relax_left.copy(): + try: + step = step_info.get_step(key=kk)[0] + except IndexError: + continue + if step['phase'] == 'Succeeded': + print(f'Sub relaxation {kk} finished (ID: {self.workflow.id}, UID: {self.workflow.uid})') + print('Retrieving completed tasks to local...') + self._download_artifact_with_retry( + artifact=step.outputs.artifacts['retrieve_path'], + path=self.download_path + ) + relax_left.remove(kk) + if relax_left: + print(f'Waiting for relaxation results ({len(relax_left)} left)...') + elif step['phase'] == 'Failed': + print(f'Sub relaxation {kk} failed (ID: {self.workflow.id}, UID: {self.workflow.uid})') + relax_failed_list.append(kk) + main_log_path, main_log_error = self._download_step_main_logs( + step, + kk, + step_info=step_info, + ) + failed_details.append( + self._format_step_failure( + step, + f"Sub relaxation {kk} failed (ID: {self.workflow.id}, UID: {self.workflow.uid})", + main_log_path=main_log_path, + main_log_error=main_log_error, + ) + ) + relax_left.remove(kk) + if not relax_left: + print(f'Workflow finished with {len(relax_failed_list)} sub-relaxation failed ' + f'(ID: {self.workflow.id}, UID: {self.workflow.uid})') + self._raise_if_failed(failed_details, "Relaxation workflow") break + # throttled waiting log + if len(relax_left) != last_count or time.time() - last_log_ts > 30: + print(f'Waiting for relaxation results ({len(relax_left)} left)...') + last_count = len(relax_left) + last_log_ts = time.time() + + def _monitor_joint_flows(self, + relax_key_list: List[str], + subprops_key_list: List[str]): + """ + Monitor relaxation and property subflows together, downloading each + structure's results as soon as its property step finishes. This avoids + waiting for all relaxations before observing property completion. + """ + relax_left = relax_key_list.copy() + relax_failed = [] + relax_failed_details = [] + props_left = subprops_key_list.copy() + props_failed = [] + props_failed_details = [] + print(f'Waiting for relax/prop results (relax {len(relax_left)}, props {len(props_left)})...') + last_counts = (len(relax_left), len(props_left)) + last_log_ts = time.time() + while relax_left or props_left: + time.sleep(4) + step_info = self.workflow.query() + + # relax steps + for kk in relax_left.copy(): + try: + step = step_info.get_step(key=kk)[0] + except IndexError: + continue + if step['phase'] == 'Succeeded': + print(f'Sub relaxation {kk} finished') + print('Retrieving completed tasks to local...') + retrieve = step.get('outputs', {}).get('artifacts', {}).get('retrieve_path', None) + if retrieve: + self._download_artifact_with_retry(artifact=retrieve, path=self.download_path) + relax_left.remove(kk) + elif step['phase'] == 'Failed': + print(f'Sub relaxation {kk} failed') + relax_failed.append(kk) + main_log_path, main_log_error = self._download_step_main_logs( + step, + kk, + step_info=step_info, + ) + terminate_message = self._terminate_workflow_after_relax_failure() + failure_detail = self._format_step_failure( + step, + f"Sub relaxation {kk} failed (ID: {self.workflow.id}, UID: {self.workflow.uid})", + main_log_path=main_log_path, + main_log_error=main_log_error, + ) + relax_failed_details.append(f"{failure_detail}\n action: {terminate_message}") + relax_left.remove(kk) + self._raise_if_failed(relax_failed_details, "Joint workflow") + + # property steps + for kk in props_left.copy(): + try: + step = step_info.get_step(key=kk)[0] + except IndexError: + continue + if step['phase'] == 'Succeeded': + print(f'Sub property {kk} finished') + print('Retrieving completed tasks to local...') + retrieve = step.get('outputs', {}).get('artifacts', {}).get('retrieve_path', None) + if retrieve: + self._download_artifact_with_retry(artifact=retrieve, path=self.download_path) + props_left.remove(kk) + elif step['phase'] == 'Failed': + print(f'Sub property {kk} failed') + props_failed.append(kk) + main_log_path, main_log_error = self._download_step_main_logs( + step, + kk, + step_info=step_info, + ) + diagnostic_artifacts = self._download_step_diagnostic_artifacts( + step, + kk, + step_info=step_info, + ) + props_failed_details.append( + self._format_step_failure( + step, + f"Sub property {kk} failed (ID: {self.workflow.id}, UID: {self.workflow.uid})", + main_log_path=main_log_path, + main_log_error=main_log_error, + diagnostic_artifacts=diagnostic_artifacts, + ) + ) + props_left.remove(kk) + + if relax_left or props_left: + counts = (len(relax_left), len(props_left)) + if counts != last_counts or time.time() - last_log_ts > 30: + print(f'Waiting... (relax {counts[0]}, props {counts[1]})') + last_counts = counts + last_log_ts = time.time() + + print(f'Joint monitoring done: {len(relax_failed)} relax failed, {len(props_failed)} property failed ' + f'(ID: {self.workflow.id}, UID: {self.workflow.uid})') + self._raise_if_failed(relax_failed_details + props_failed_details, "Joint workflow") def dump_flow_id(self): log_file = os.path.join(self.download_path, '.workflow.log') with open(log_file, 'a') as f: timestamp = datetime.datetime.now().isoformat() - f.write(f'{self.workflow.id}\tsubmit\t{timestamp}\t{self.download_path}\n') + workflow_uid = getattr(self.workflow, "uid", "") or "" + f.write( + f'{self.workflow.id}\tsubmit\t{timestamp}\t{self.download_path}\t{workflow_uid}\n' + ) def _set_relax_flow( self, @@ -189,21 +827,7 @@ def _set_props_flow( props_parameter: dict ) -> [List[Step], List[str]]: - simplePropertySteps = SimplePropertySteps( - name='property-flow', - make_op=self.props_make_op, - run_op=self.run_op, - post_op=self.props_post_op, - make_image=self.make_image, - run_image=self.run_image, - post_image=self.post_image, - run_command=self.run_command, - calculator=self.calculator, - group_size=self.group_size, - pool_size=self.pool_size, - executor=self.executor, - upload_python_packages=self.upload_python_packages - ) + simplePropertySteps = None confs = props_parameter["structures"] interaction = props_parameter["interaction"] @@ -214,6 +838,10 @@ def _set_props_flow( path_to_prop_list = [] prop_param_list = [] do_refine_list = [] + skip_props = set() + for item in props_parameter.get("skip_finished_properties", []): + if isinstance(item, (list, tuple)) and len(item) == 2: + skip_props.add((item[0], item[1])) for conf in confs: conf_dirs.extend(glob.glob(conf)) conf_dirs = list(set(conf_dirs)) @@ -225,6 +853,10 @@ def _set_props_flow( continue property_type = jj["type"] path_to_prop = os.path.join(ii, property_type + "_" + suffix) + prop_dir_name = property_type + "_" + suffix + if (ii, prop_dir_name) in skip_props: + print(f"Skip property {prop_dir_name} for {ii} (marked finished; rerun_finished=False)") + continue path_to_prop_list.append(path_to_prop) if os.path.exists(path_to_prop): shutil.rmtree(path_to_prop) @@ -240,6 +872,22 @@ def _set_props_flow( clean_subflow_id = re.sub(r'[^a-zA-Z0-9-]', '-', flow_id_list[ii]).lower() subflow_key = f'propertycal-{clean_subflow_id}' subprops_key_list.append(subflow_key) + if simplePropertySteps is None: + simplePropertySteps = SimplePropertySteps( + name='property-flow', + make_op=self.props_make_op, + run_op=self.run_op, + post_op=self.props_post_op, + make_image=self.make_image, + run_image=self.run_image, + post_image=self.post_image, + run_command=self.run_command, + calculator=self.calculator, + group_size=self.group_size, + pool_size=self.pool_size, + executor=self.executor, + upload_python_packages=self.upload_python_packages + ) subprops_list.append( Step( name=f'Subprop-cal-{clean_subflow_id}', @@ -260,6 +908,127 @@ def _set_props_flow( return subprops_list, subprops_key_list + def _set_props_tasks( + self, + relax_tasks: List[Task], + props_parameter: dict, + base_work_artifact, + pre_relaxed: List[str] + ) -> [List[Task], List[str]]: + """ + Task-based property subflows keyed to corresponding relax tasks for DAG scheduling. + """ + simplePropertySteps = None + + confs = props_parameter["structures"] + interaction = props_parameter["interaction"] + properties = props_parameter["properties"] + + conf_dirs = [] + flow_id_list = [] + path_to_prop_list = [] + prop_param_list = [] + do_refine_list = [] + conf_for_prop = [] + for conf in confs: + conf_dirs.extend(glob.glob(conf)) + conf_dirs = list(set(conf_dirs)) + conf_dirs.sort() + + # map conf to relax task + relax_map = {} + for task in relax_tasks: + flow_id = task.inputs.parameters.get("flow_id", None) + if flow_id is not None: + flow_id = getattr(flow_id, "value", flow_id) + else: + flow_id = task.name + relax_map[flow_id] = task + + for ii in conf_dirs: + for jj in properties: + do_refine, suffix = handle_prop_suffix(jj) + if not suffix: + continue + property_type = jj["type"] + path_to_prop = os.path.join(ii, property_type + "_" + suffix) + path_to_prop_list.append(path_to_prop) + if os.path.exists(path_to_prop): + shutil.rmtree(path_to_prop) + prop_param_list.append(jj) + do_refine_list.append(do_refine) + flow_id_list.append(ii + '-' + property_type + '-' + suffix) + conf_for_prop.append(ii) + + subprops_list = [] + subprops_key_list = [] + pre_relaxed_set = set(pre_relaxed or []) + skip_props = set() + for item in props_parameter.get("skip_finished_properties", []): + if isinstance(item, (list, tuple)) and len(item) == 2: + skip_props.add((item[0], item[1])) + + for ii, path_to_prop, prop_param, do_refine, flow_id in zip( + conf_for_prop, path_to_prop_list, prop_param_list, do_refine_list, flow_id_list): + clean_subflow_id = re.sub(r'[^a-zA-Z0-9-]', '-', flow_id).lower() + subflow_key = f'propertycal-{clean_subflow_id}' + + # choose artifact source: from corresponding relax task if exists; otherwise from base upload (pre-relaxed) + if ii in relax_map: + input_artifact = relax_map[ii].outputs.artifacts["output_all"] + elif ii in pre_relaxed_set: + # pre-relaxed data exists in uploaded workspace + input_artifact = base_work_artifact + else: + raise RuntimeError( + f"No relaxation task or pre-relaxed result is available for {ii}; " + "cannot create joint property task." + ) + + # skip property if already finished and rerun_finished=False + prop_dir_name = os.path.basename(path_to_prop) + if (ii, prop_dir_name) in skip_props: + # don't create task; also remove from monitor list by not adding key + print(f"Skip property {prop_dir_name} for {ii} (marked finished; rerun_finished=False)") + continue + + subprops_key_list.append(subflow_key) + if simplePropertySteps is None: + simplePropertySteps = SimplePropertySteps( + name='property-flow', + make_op=self.props_make_op, + run_op=self.run_op, + post_op=self.props_post_op, + make_image=self.make_image, + run_image=self.run_image, + post_image=self.post_image, + run_command=self.run_command, + calculator=self.calculator, + group_size=self.group_size, + pool_size=self.pool_size, + executor=self.executor, + upload_python_packages=self.upload_python_packages + ) + subprops_list.append( + Task( + name=f'Subprop-cal-{clean_subflow_id}', + template=simplePropertySteps, + artifacts={ + "input_work_path": input_artifact + }, + parameters={ + "flow_id": flow_id, + "path_to_prop": path_to_prop, + "prop_param": prop_param, + "inter_param": interaction, + "do_refine": do_refine + }, + key=subflow_key + ) + ) + + return subprops_list, subprops_key_list + @json2dict def submit_relax( self, @@ -276,16 +1045,16 @@ def submit_relax( flow_name = name if name else self.regulate_name(os.path.basename(download_path)) flow_name += '-relax' self.workflow = Workflow(name=flow_name, labels=labels) - relaxation = self._set_relax_flow( + relaxation_list, relax_key_list = self._set_relax_flows( input_work_dir=upload_artifact(upload_path), relax_parameter=relax_parameter ) - self.workflow.add(relaxation) + self.workflow.add(relaxation_list) self.workflow.submit() self.dump_flow_id() if not submit_only: - # Wait for and retrieve relaxation - self._monitor_relax() + # Wait for and retrieve relaxation subflows + self._monitor_relax_flows(relax_key_list) return self.workflow.id @@ -336,22 +1105,36 @@ def submit_joint( flow_name = name if name else self.regulate_name(os.path.basename(download_path)) flow_name += '-joint' self.workflow = Workflow(name=flow_name, labels=labels) - relaxation = self._set_relax_flow( - input_work_dir=upload_artifact(upload_path), + base_artifact = upload_artifact(upload_path) + + # per-structure relaxation subflows as DAG tasks + relaxation_tasks, relax_key_list = self._set_relax_tasks( + input_work_dir=base_artifact, relax_parameter=self.relax_param ) - subprops_list, subprops_key_list = self._set_props_flow( - input_work_dir=relaxation.outputs.artifacts["output_all"], - props_parameter=self.props_param + + # per-structure property tasks depending on corresponding relaxation task + subprops_list, subprops_key_list = self._set_props_tasks( + relax_tasks=relaxation_tasks, + props_parameter=self.props_param, + base_work_artifact=base_artifact, + pre_relaxed=self.props_param.get("pre_relaxed_structures", []) ) - self.workflow.add(relaxation) - self.workflow.add(subprops_list) + + if not relaxation_tasks and not subprops_list: + raise RuntimeError( + "No joint workflow tasks to submit. All requested relaxations and " + "properties appear to be finished, or no structures matched the " + "submitted patterns." + ) + if relaxation_tasks: + self.workflow.add(relaxation_tasks) + if subprops_list: + self.workflow.add(subprops_list) self.workflow.submit() self.dump_flow_id() if not submit_only: - # Wait for and retrieve relaxation - self._monitor_relax() - # Wait for and retrieve sub-property flows - self._monitor_props(subprops_key_list) + # Wait for and retrieve relaxation subflows + self._monitor_joint_flows(relax_key_list, subprops_key_list) return self.workflow.id diff --git a/apex/gui.py b/apex/gui.py new file mode 100644 index 00000000..47cb3a71 --- /dev/null +++ b/apex/gui.py @@ -0,0 +1,3797 @@ +import base64 +import binascii +import copy +import glob +import io +import json +import os +import re +import shlex +import shutil +import subprocess +import sys +import tarfile +import time +import uuid +import webbrowser +import zipfile +from datetime import datetime +from threading import Timer +from typing import Any, Dict, List, Optional, Tuple + +import dash +import dash_bootstrap_components as dbc +from dash import Input, Output, State, dash_table, dcc, html + +from apex.account import DEFAULT_BOHRIUM_CONFIG, get_account_config_path, load_account_config, save_account_config + + +DEFAULT_HOST = "127.0.0.1" +DEFAULT_PORT = 8060 +DEFAULT_REPORT_PORT = 8070 +RETRIEVE_RUNNING_MESSAGE = "正在提取文件中..." +BLOCKED_INLINE_COMMANDS = {"gui"} +DEFAULT_SUBMIT_COMMAND = "nohup apex submit param.json -c global.json > apex.log 2>&1 &" +SUBMIT_STATUS_FILE = ".apex-submit.status" +SUBMIT_GROUP_META_FILE = ".apex-submit-group.json" +SUBMIT_RUNNING_NOTICE = "任务已提交,正在运行,详情请转到Log页面查看" +SUBMIT_BATCH_SIZE = 100 +PARAM_FALLBACK_PATTERN = "*param*.json" +WORKFLOW_PROGRESS_QUERY_TIMEOUT_SECONDS = 8 +WORKFLOW_QUICK_QUERY_TIMEOUT_SECONDS = 5 +WORKFLOW_DETAIL_REFRESH_SECONDS = 30 +WORKFLOW_DETAIL_QUERY_TIMEOUT_SECONDS = 25 +WORKFLOW_QUERY_RESULT_PREFIX = "__APEX_GUI_WORKFLOW_QUERY__" +_WORKFLOW_DETAIL_CACHE: Dict[Tuple[str, str], Dict[str, Any]] = {} + +THIS_DIR = os.path.dirname(os.path.abspath(__file__)) +DEFAULT_CONFIG_DIR = os.path.join(THIS_DIR, "default_config") +PROFILE_NAMES = ("lammps", "vasp", "abacus") +DEFAULT_PROFILE = "lammps" + +LMP_INTERACTION_TYPE_OPTIONS = ["eam_alloy", "deepmd", "meam", "tersoff", "sw", "reaxff"] +MISSING_POTCAR_HINT = "请提交对应元素的POTCAR" +MISSING_ORB_HINT = "请提交对应元素的ORB" + + +def _load_json_file(path: str) -> Dict[str, Any]: + try: + with open(path, "r", encoding="utf-8") as f: + payload = json.load(f) + except (FileNotFoundError, json.JSONDecodeError): + return {} + return payload if isinstance(payload, dict) else {} + + +def _json_dump_text(payload: Dict[str, Any]) -> str: + return json.dumps(payload, indent=4, ensure_ascii=False) + + +def _profile_dir(profile: str) -> str: + profile_name = profile if profile in PROFILE_NAMES else DEFAULT_PROFILE + return os.path.join(DEFAULT_CONFIG_DIR, profile_name) + + +def _load_profile_global(profile: str) -> Dict[str, Any]: + return _load_json_file(os.path.join(_profile_dir(profile), "global.json")) + + +def _load_profile_param_template(profile: str) -> Dict[str, Any]: + payload: Dict[str, Any] = {} + for filename in ( + "param_structure.json", + os.path.join("param_interaction", "param_interaction.json"), + "param_relax.json", + "param_props.json", + ): + part = _load_json_file(os.path.join(_profile_dir(profile), filename)) + if isinstance(part, dict): + payload.update(copy.deepcopy(part)) + return payload + + +def _extract_property_types(param_template: Dict[str, Any]) -> List[str]: + ordered: List[str] = [] + for item in param_template.get("properties", []): + if not isinstance(item, dict): + continue + ptype = item.get("type") + if ptype and ptype not in ordered: + ordered.append(ptype) + return ordered + + +def _extract_selected_properties(param_template: Dict[str, Any]) -> List[str]: + selected: List[str] = [] + for item in param_template.get("properties", []): + if not isinstance(item, dict): + continue + ptype = item.get("type") + if ptype and item.get("req_calc") and ptype not in selected: + selected.append(ptype) + return selected + + +def _extract_requested_properties(param_payload: Dict[str, Any]) -> List[str]: + selected: List[str] = [] + for item in param_payload.get("properties", []): + if not isinstance(item, dict): + continue + ptype = item.get("type") + if ptype and item.get("req_calc", True) is not False and ptype not in selected: + selected.append(ptype) + return selected + + +def _extract_structure_defaults(param_template: Dict[str, Any]) -> List[str]: + structures = param_template.get("structures", []) + if not isinstance(structures, list): + return [] + return [str(item).strip() for item in structures if str(item).strip()] + + +def _extract_interaction_defaults(param_template: Dict[str, Any]) -> Tuple[str, str, List[str]]: + interaction = param_template.get("interaction") + if not isinstance(interaction, dict): + return "eam_alloy", "", [] + interaction_type = interaction.get("type") or "eam_alloy" + interaction_model_obj = interaction.get("model") + if isinstance(interaction_model_obj, list): + interaction_model = ", ".join(str(item) for item in interaction_model_obj) + else: + interaction_model = interaction_model_obj or "" + type_map = interaction.get("type_map") + if isinstance(type_map, dict): + elements = list(type_map.keys()) + else: + elements = [] + return interaction_type, interaction_model, elements + + +def _interaction_path_key(profile: str) -> str: + return "input" if profile == "abacus" else "incar" + + +def _extract_interaction_incar(param_template: Dict[str, Any], profile: str = DEFAULT_PROFILE) -> str: + interaction = param_template.get("interaction") + if not isinstance(interaction, dict): + return "" + key = _interaction_path_key(profile) + if key == "input": + return interaction.get("input") or interaction.get("incar") or "" + return interaction.get("incar") or "" + + +def _extract_potcar_rows(param_template: Dict[str, Any]) -> List[Tuple[str, str]]: + interaction = param_template.get("interaction") + if not isinstance(interaction, dict): + return [] + potcars = interaction.get("potcars") + if not isinstance(potcars, dict): + return [] + return [(str(ele), _strip_parenthetical_suffix(str(path))) for ele, path in potcars.items()] + + +def _extract_orb_rows(param_template: Dict[str, Any]) -> List[Tuple[str, str]]: + interaction = param_template.get("interaction") + if not isinstance(interaction, dict): + return [] + orb_files = interaction.get("orb_files") + if not isinstance(orb_files, dict): + return [] + return [(str(ele), _strip_parenthetical_suffix(str(path))) for ele, path in orb_files.items()] + + +def _strip_parenthetical_suffix(text: str) -> str: + return re.sub(r"\s*\([^)]*\)\s*$", "", (text or "").strip()) + + +def _interaction_type_options_for_profile(profile: str, default_type: str) -> List[Dict[str, str]]: + if profile == "lammps": + options = list(LMP_INTERACTION_TYPE_OPTIONS) + if default_type and default_type not in options: + options.insert(0, default_type) + elif profile in {"vasp", "abacus"}: + options = [profile] + if default_type and default_type not in options: + options.insert(0, default_type) + else: + options = list(LMP_INTERACTION_TYPE_OPTIONS) + return [{"label": item, "value": item} for item in options] + + +def _rows_to_mapping(keys: List[str], values: List[str]) -> Dict[str, str]: + mapping: Dict[str, str] = {} + for key, value in zip(keys, values): + k = (key or "").strip() + v = _strip_parenthetical_suffix(value or "") + if v.startswith(MISSING_POTCAR_HINT) or v.startswith(MISSING_ORB_HINT): + continue + if k and v and k not in mapping: + mapping[k] = v + return mapping + + +def _interaction_table_columns_for_profile(profile: str) -> List[Dict[str, str]]: + base = [ + {"id": "element", "name": "Element"}, + {"id": "potcar", "name": "POTCAR"}, + ] + if profile == "abacus": + base.append({"id": "orb_file", "name": "ORB file"}) + return base + + +def _interaction_table_rows_from_template(profile: str, param_template: Dict[str, Any]) -> List[Dict[str, str]]: + potcar_map = dict(_extract_potcar_rows(param_template)) + orb_map = dict(_extract_orb_rows(param_template)) + ordered_elements = list(potcar_map.keys()) + for ele in orb_map.keys(): + if ele not in ordered_elements: + ordered_elements.append(ele) + + rows: List[Dict[str, str]] = [] + for ele in ordered_elements: + row = { + "element": ele, + "potcar": potcar_map.get(ele, ""), + } + if profile == "abacus": + row["orb_file"] = orb_map.get(ele, "") + rows.append(row) + + if not rows: + rows.append({"element": "", "potcar": "", **({"orb_file": ""} if profile == "abacus" else {})}) + return rows + + +def _resolve_first_structure_file_for_gui(workdir: str, structures: List[str]) -> str: + abs_workdir = _normalize_workdir(workdir) + for pattern in structures or []: + clean_pattern = (pattern or "").strip() + if not clean_pattern: + continue + search_pattern = clean_pattern if os.path.isabs(clean_pattern) else os.path.join(abs_workdir, clean_pattern) + for match in sorted(set(glob.glob(search_pattern))): + if os.path.isfile(match): + if os.path.basename(match) == "POSCAR": + return match + continue + if os.path.isdir(match): + for candidate in ("POSCAR", "CONTCAR", "STRU"): + candidate_path = os.path.join(match, candidate) + if os.path.isfile(candidate_path): + return candidate_path + nested = sorted(glob.glob(os.path.join(match, "**", "POSCAR"), recursive=True)) + if nested: + return nested[0] + return "" + + +def _extract_elements_from_selected_structure(workdir: str, structures: List[str]) -> List[str]: + structure_file = _resolve_first_structure_file_for_gui(workdir, structures) + if not structure_file or os.path.basename(structure_file) != "POSCAR": + return [] + try: + from pymatgen.io.vasp import Poscar + + return [str(symbol) for symbol in Poscar.from_file(structure_file).site_symbols] + except Exception: + return [] + + +def _workdir_files(workdir: str, preferred_subdir: str = "") -> List[str]: + abs_workdir = _normalize_workdir(workdir) + candidates: List[str] = [] + for root, dirnames, filenames in os.walk(abs_workdir): + dirnames[:] = sorted(name for name in dirnames if not name.startswith(".")) + rel_root = os.path.relpath(root, abs_workdir) + for filename in sorted(filenames): + if filename.startswith("."): + continue + rel_path = filename if rel_root == "." else os.path.join(rel_root, filename) + rel_path = rel_path.replace(os.path.sep, "/") + candidates.append(rel_path) + if preferred_subdir: + preferred_prefix = preferred_subdir.strip("/").replace(os.path.sep, "/") + "/" + candidates.sort(key=lambda item: (0 if item.startswith(preferred_prefix) else 1, len(item), item.lower())) + else: + candidates.sort(key=lambda item: (len(item), item.lower())) + return candidates + + +def _suffix_token_match(path: str, element: str) -> bool: + basename = os.path.basename(path) + tokens = [tok for tok in re.split(r"[._-]+", basename) if tok] + return bool(tokens) and tokens[-1].lower() == element.lower() + + +def _prefix_token_match(path: str, element: str) -> bool: + basename = os.path.basename(path) + tokens = [tok for tok in re.split(r"[._-]+", basename) if tok] + return bool(tokens) and tokens[0].lower() == element.lower() + + +def _autodetect_interaction_rows(profile: str, workdir: str, structures: List[str], param_template: Dict[str, Any]) -> List[Dict[str, str]]: + if profile not in {"vasp", "abacus"}: + return _interaction_table_rows_from_template(profile, param_template) + + elements = _extract_elements_from_selected_structure(workdir, structures) + if not elements: + return _interaction_table_rows_from_template(profile, param_template) + + preferred_dir = "vasp_input" if profile == "vasp" else "abacus_input" + files = _workdir_files(workdir, preferred_subdir=preferred_dir) + rows: List[Dict[str, str]] = [] + for element in elements: + if profile == "vasp": + potcar = next((os.path.basename(path) for path in files if _suffix_token_match(path, element)), "") + rows.append({"element": element, "potcar": potcar or MISSING_POTCAR_HINT}) + else: + potcar = next( + ( + os.path.basename(path) + for path in files + if _prefix_token_match(path, element) and not os.path.basename(path).lower().endswith(".orb") + ), + "", + ) + orb_file = next( + ( + os.path.basename(path) + for path in files + if _prefix_token_match(path, element) and os.path.basename(path).lower().endswith(".orb") + ), + "", + ) + rows.append( + { + "element": element, + "potcar": potcar or MISSING_POTCAR_HINT, + "orb_file": orb_file or MISSING_ORB_HINT, + } + ) + return rows + + +def _interaction_editor_label(profile: str) -> str: + if profile == "vasp": + return "INCAR 编辑区" + if profile == "abacus": + return "INPUT 编辑区" + return "INCAR/INPUT 编辑区" + + +def _interaction_path_label(profile: str) -> str: + return "interaction.input" if profile == "abacus" else "interaction.incar (会自动去掉括号备注)" + + +def _interaction_path_placeholder(profile: str) -> str: + return "abacus_input/INPUT" if profile == "abacus" else "vasp_input/INCAR" + + +def _load_profile_incar_content(profile: str, param_template: Dict[str, Any]) -> str: + incar_rel = _strip_parenthetical_suffix(_extract_interaction_incar(param_template, profile)) + if not incar_rel: + return "" + source_path = os.path.join(_profile_dir(profile), "param_interaction", incar_rel) + try: + with open(source_path, "r", encoding="utf-8") as f: + return f.read() + except OSError: + return "" + + +def _build_feedback(message: str, ok: bool = False) -> Dict[str, Any]: + return { + "ok": ok, + "message": message, + "command": "", + "returncode": "", + "stdout": "", + "stderr": "", + "finished_at": datetime.now().isoformat(timespec="seconds"), + } + + +def _is_retrieve_feedback(payload: Any) -> bool: + return isinstance(payload, dict) and payload.get("operation") == "retrieve" and bool(payload.get("status_file")) + + +def _retrieve_state_is_active(state_payload: Any) -> bool: + if not isinstance(state_payload, dict) or state_payload.get("status") != "running": + return False + status_file = state_payload.get("status_file") or "" + if not status_file: + return True + if not os.path.isfile(status_file): + return True + try: + with open(status_file, "r", encoding="utf-8") as f: + return not f.read().strip() + except OSError: + return True + + +def _resolve_triggered_id(): + if hasattr(dash, "ctx") and dash.ctx.triggered_id is not None: + return dash.ctx.triggered_id + triggered = dash.callback_context.triggered + if not triggered: + return None + return triggered[0]["prop_id"].split(".")[0] + + +def _run_apex_command(arguments: List[str], cwd: Optional[str] = None) -> Dict[str, Any]: + command = [sys.executable, "-m", "apex", *arguments] + try: + completed = subprocess.run( + command, + cwd=cwd or os.getcwd(), + capture_output=True, + text=True, + check=False, + ) + except Exception as exc: + return { + "ok": False, + "message": f"Failed to launch command: {exc}", + "command": " ".join(shlex.quote(token) for token in command), + "returncode": "", + "stdout": "", + "stderr": str(exc), + "finished_at": datetime.now().isoformat(timespec="seconds"), + } + + return { + "ok": completed.returncode == 0, + "message": "Command finished successfully." if completed.returncode == 0 else "Command finished with errors.", + "command": " ".join(shlex.quote(token) for token in command), + "returncode": str(completed.returncode), + "stdout": completed.stdout.strip(), + "stderr": completed.stderr.strip(), + "finished_at": datetime.now().isoformat(timespec="seconds"), + } + + +def _run_apex_command_in_background( + arguments: List[str], + cwd: Optional[str] = None, + log_file: str = "apex-advanced.log", +) -> Dict[str, Any]: + command = [sys.executable, "-m", "apex", *arguments] + display_cmd = " ".join(shlex.quote(token) for token in command) + shell_cmd = f"nohup {display_cmd} > {shlex.quote(log_file)} 2>&1 & echo $!" + try: + completed = subprocess.run( + ["bash", "-lc", shell_cmd], + cwd=cwd or os.getcwd(), + capture_output=True, + text=True, + check=False, + ) + except Exception as exc: + return { + "ok": False, + "message": f"Failed to launch background command: {exc}", + "command": shell_cmd, + "returncode": "", + "stdout": "", + "stderr": str(exc), + "finished_at": datetime.now().isoformat(timespec="seconds"), + } + + pid = completed.stdout.strip().splitlines()[-1] if completed.stdout.strip() else "" + message = f"Background command started. Log file: {log_file}." + if pid: + message += f" PID: {pid}." + return { + "ok": completed.returncode == 0, + "message": message if completed.returncode == 0 else "Background command failed to start.", + "command": shell_cmd, + "returncode": str(completed.returncode), + "stdout": completed.stdout.strip(), + "stderr": completed.stderr.strip(), + "finished_at": datetime.now().isoformat(timespec="seconds"), + } + + +def _start_retrieve_in_background(workdir: str, workflow_id: str, global_file: str) -> Dict[str, Any]: + log_file = os.path.join(workdir, "apex-retrieve.log") + status_file = os.path.join(workdir, ".apex-retrieve.status") + workflow_ids = _parse_workflow_ids(workflow_id) + if not workflow_ids: + return { + "ok": False, + "message": "Workflow ID is required for retrieve.", + "command": "", + "returncode": "", + "stdout": "", + "stderr": "", + "finished_at": datetime.now().isoformat(timespec="seconds"), + } + command = [ + sys.executable, + "-m", + "apex.gui_background", + "retrieve", + workdir, + global_file, + log_file, + status_file, + ] + workflow_ids + display_cmd = " ".join(shlex.quote(token) for token in command) + shell_cmd = ( + f"rm -f {shlex.quote(status_file)}; " + f"({display_cmd} > {shlex.quote(log_file)} 2>&1; " + f"code=$?; printf \"%s\" \"$code\" > {shlex.quote(status_file)}) & echo $!" + ) + try: + completed = subprocess.run( + ["bash", "-lc", shell_cmd], + cwd=workdir, + capture_output=True, + text=True, + check=False, + ) + except Exception as exc: + return { + "ok": False, + "message": f"Failed to launch retrieve: {exc}", + "command": shell_cmd, + "returncode": "", + "stdout": "", + "stderr": str(exc), + "finished_at": datetime.now().isoformat(timespec="seconds"), + } + + pid = completed.stdout.strip().splitlines()[-1] if completed.stdout.strip() else "" + return { + "ok": completed.returncode == 0, + "message": RETRIEVE_RUNNING_MESSAGE if completed.returncode == 0 else "Retrieve failed to start.", + "operation": "retrieve", + "command": shell_cmd, + "returncode": str(completed.returncode), + "stdout": completed.stdout.strip(), + "stderr": completed.stderr.strip(), + "finished_at": datetime.now().isoformat(timespec="seconds"), + "pid": pid, + "workdir": workdir, + "workflow_id": _format_workflow_ids(workflow_ids), + "workflow_ids": workflow_ids, + "global_file": global_file, + "log_file": log_file, + "status_file": status_file, + } + + +def _advanced_report_args(arguments: List[str], report_port: int = DEFAULT_REPORT_PORT) -> List[str]: + normalized = list(arguments) + if not normalized or normalized[0] != "report": + return normalized + + if "--no-browser" not in normalized: + normalized.append("--no-browser") + has_port = any( + arg == "-p" + or arg == "--port" + or arg.startswith("--port=") + for arg in normalized + ) + if not has_port: + normalized.extend(["--port", str(report_port)]) + return normalized + + +def _format_feedback(payload: Dict[str, Any]) -> str: + if not payload: + return "Click any action button to run an APEX command." + + lines = [f"[{payload.get('finished_at', '')}] {'SUCCESS' if payload.get('ok') else 'FAILED'}"] + + message = payload.get("message") + if message: + lines.append(message) + report_url = str(payload.get("report_url") or "").strip() + if report_url: + lines.append(f"Report URL: {report_url}") + command = payload.get("command") + if command: + lines.extend(["", f"$ {command}"]) + returncode = payload.get("returncode") + if returncode != "": + lines.append(f"Return code: {returncode}") + + stdout = payload.get("stdout") + stderr = payload.get("stderr") + if stdout: + lines.extend(["", "[stdout]", stdout]) + if stderr: + lines.extend(["", "[stderr]", stderr]) + if not stdout and not stderr: + lines.extend(["", "(No command output)"]) + + return "\n".join(lines) + + +def _report_started_children(report_url: str) -> List[Any]: + clean_url = str(report_url or "").strip() + if not clean_url: + return ["Retrieve finished; report started."] + return [ + "Retrieve finished; report started. ", + html.A(clean_url, href=clean_url, target="_blank", rel="noreferrer"), + ] + + +def _completed_retrieve_state( + workdir: str, + workflow_id: str, + workflow_ids: Optional[List[str]], + global_file: str, + param_file: str, + text: Any, + log_file: str = "", + status_file: str = "", + report_url: str = "", +) -> Dict[str, Any]: + return { + "status": "done", + "workdir": workdir, + "workflow_id": workflow_id, + "workflow_ids": workflow_ids or _parse_workflow_ids(workflow_id), + "global_file": global_file, + "param_file": param_file, + "log_file": log_file, + "status_file": status_file, + "completed_text": text, + "report_url": report_url, + "pending_report": False, + } + + +def _has_local_reportable_results(workdir: str) -> bool: + target_workdir = _normalize_workdir(workdir) + if os.path.isfile(os.path.join(target_workdir, "all_result.json")): + return True + for root, _dirs, files in os.walk(target_workdir): + if "result.json" in files: + return True + return False + + +def _read_log_tail(log_path: str = "apex.log", max_lines: int = 400, workdir: Optional[str] = None) -> str: + if not os.path.isabs(log_path): + log_path = os.path.join(_normalize_workdir(workdir or os.getcwd()), log_path) + if not os.path.isfile(log_path): + return f"{log_path} not found yet. Run submit first." + try: + with open(log_path, "r", encoding="utf-8", errors="replace") as f: + lines = f.readlines() + except OSError as exc: + return f"Failed to read {log_path}: {exc}" + return "".join(lines[-max_lines:]) if lines else f"{log_path} is empty." + + +def _parse_retrieve_progress_from_log(log_text: str) -> Optional[Tuple[int, str, str]]: + total = None + current = 0 + current_key = "" + for line in log_text.splitlines(): + total_match = re.search(r"Retrieving\s+(\d+)\s+workflow results", line) + if total_match: + total = int(total_match.group(1)) + progress_match = re.search(r"Retrieving result\s+(\d+)/(\d+):\s*(.+)", line) + if progress_match: + current = int(progress_match.group(1)) + total = int(progress_match.group(2)) + current_key = progress_match.group(3).strip() + + if not total: + return None + + percent = int(round((current / total) * 100)) if total > 0 else 100 + percent = max(0, min(percent, 99 if current < total else 100)) + label = f"{percent}%" + if current_key: + text = f"{RETRIEVE_RUNNING_MESSAGE} {current}/{total}: {current_key}" + else: + text = f"{RETRIEVE_RUNNING_MESSAGE} 0/{total}" + return percent, label, text + + +def _retrieve_log_matches_workflow(log_file: str, workflow_id: str) -> bool: + workflow_id = (workflow_id or "").strip() + if not workflow_id: + return True + try: + with open(log_file, "r", encoding="utf-8", errors="replace") as f: + for _ in range(80): + line = f.readline() + if not line: + break + match = re.search(r"Retrieving\s+\d+\s+workflow results\s+(\S+)\s+to\b", line) + if match: + return match.group(1) == workflow_id + except OSError: + return False + return False + + +def _parse_extra_elements(raw_text: str) -> List[str]: + if not raw_text: + return [] + normalized = raw_text.replace(",", " ").replace(";", " ").replace("\n", " ") + return [token.strip() for token in normalized.split() if token.strip()] + + +def _merge_dict_values(base: Dict[str, Any], updates: Optional[Dict[str, Any]]) -> None: + if not updates: + return + for key, value in updates.items(): + if isinstance(value, dict) and isinstance(base.get(key), dict): + _merge_dict_values(base[key], value) + else: + base[key] = value + + +def _load_account_state(account_path: Optional[str] = None) -> Dict[str, Any]: + path_obj = get_account_config_path(account_path) + raw_config = load_account_config(path_obj) + merged = copy.deepcopy(DEFAULT_BOHRIUM_CONFIG) + if isinstance(raw_config, dict): + _merge_dict_values(merged, raw_config) + program_id = merged.get("program_id") + return { + "path": str(path_obj), + "email": str(merged.get("email") or ""), + "program_id": str(program_id) if program_id not in (None, "") else "", + "password_set": bool(merged.get("password")), + } + + +def _render_account_summary(account_state: Dict[str, Any]) -> str: + email = account_state.get("email") or "(未设置)" + program_id = account_state.get("program_id") or "(未设置)" + password_status = "已设置 (隐藏)" if account_state.get("password_set") else "未设置" + config_path = account_state.get("path") or "(unknown)" + return "\n".join( + [ + f"Config path: {config_path}", + f"Email: {email}", + f"Program ID: {program_id}", + f"Password: {password_status}", + ] + ) + + +def _brief_feedback(payload: Dict[str, Any]) -> str: + if not payload: + return "" + status = "SUCCESS" if payload.get("ok") else "FAILED" + message = payload.get("message") or "" + ts = payload.get("finished_at") or datetime.now().isoformat(timespec="seconds") + return f"[{ts}] {status} {message}" + + +def _save_account_overwrite( + email: str, + password: str, + program_id_text: str, + account_path: Optional[str] = None, +) -> Tuple[Dict[str, Any], Dict[str, Any]]: + path_obj = get_account_config_path(account_path) + raw_config = load_account_config(path_obj) + merged = copy.deepcopy(DEFAULT_BOHRIUM_CONFIG) + if isinstance(raw_config, dict): + _merge_dict_values(merged, raw_config) + + updates_applied: List[str] = [] + clean_email = (email or "").strip() + clean_password = (password or "").strip() + clean_program_id = (program_id_text or "").strip() + + if clean_email: + merged["email"] = clean_email + updates_applied.append("email") + if clean_password: + merged["password"] = clean_password + updates_applied.append("password") + if clean_program_id: + try: + merged["program_id"] = int(clean_program_id) + except ValueError: + current_state = _load_account_state(account_path) + return _build_feedback("program_id 必须是整数"), current_state + updates_applied.append("program_id") + + save_account_config(merged, path_obj) + new_state = _load_account_state(account_path) + updated_fields = ", ".join(updates_applied) if updates_applied else "none (kept existing values)" + message = f"Account saved to {new_state.get('path')}. Updated: {updated_fields}." + return _build_feedback(message, ok=True), new_state + + +DEFAULT_PARAM_TEMPLATE = _load_profile_param_template(DEFAULT_PROFILE) +DEFAULT_STRUCTURE_PATHS = _extract_structure_defaults(DEFAULT_PARAM_TEMPLATE) +DEFAULT_PROPERTY_TYPES = _extract_property_types(DEFAULT_PARAM_TEMPLATE) +DEFAULT_SELECTED_PROPERTIES = _extract_selected_properties(DEFAULT_PARAM_TEMPLATE) +DEFAULT_INTERACTION_TYPE, DEFAULT_INTERACTION_MODEL, _DEFAULT_INTERACTION_ELEMENTS = _extract_interaction_defaults( + DEFAULT_PARAM_TEMPLATE +) +DEFAULT_ACCOUNT_STATE = _load_account_state() +DEFAULT_SUBMIT_STATE = { + "workdir": os.getcwd(), + "workflow_id": "", + "workflow_ids": [], + "workflow_group_id": "", + "workflow_group_size": 0, + "workflow_group_total_confs": 0, + "global_file": "global.json", + "param_file": "param.json", +} + + +def _build_param_payload( + profile: str, + with_relax: bool, + selected_properties: List[str], + interaction_type: str, + interaction_model: str, + selected_structures: List[str] = None, + element_slots: List[str] = None, + interaction_incar: str = "", + interaction_rows: List[Dict[str, str]] = None, + base_template: Dict[str, Any] = None, +) -> Dict[str, Any]: + template = base_template if isinstance(base_template, dict) and base_template else DEFAULT_PARAM_TEMPLATE + payload = copy.deepcopy(template) + payload["structures"] = [item.strip() for item in (selected_structures or []) if isinstance(item, str) and item.strip()] + + if with_relax: + payload["relaxation"] = copy.deepcopy(template.get("relaxation", {})) + else: + payload.pop("relaxation", None) + + selected_set = set(selected_properties or []) + kept_properties = [] + for item in payload.get("properties", []): + if not isinstance(item, dict): + continue + ptype = item.get("type") + if ptype in selected_set: + item["req_calc"] = True + kept_properties.append(item) + payload["properties"] = kept_properties + + interaction_rows = interaction_rows or [] + potcar_map = _rows_to_mapping( + [row.get("element", "") if isinstance(row, dict) else "" for row in interaction_rows], + [row.get("potcar", "") if isinstance(row, dict) else "" for row in interaction_rows], + ) + orb_map = _rows_to_mapping( + [row.get("element", "") if isinstance(row, dict) else "" for row in interaction_rows], + [row.get("orb_file", "") if isinstance(row, dict) else "" for row in interaction_rows], + ) + interaction_from_template = payload.get("interaction") + interaction_payload = copy.deepcopy(interaction_from_template) if isinstance(interaction_from_template, dict) else {} + template_type = interaction_payload.get("type") if isinstance(interaction_payload, dict) else None + effective_type = (interaction_type or "").strip() or interaction_payload.get("type") or ( + profile if profile in {"vasp", "abacus"} else "eam_alloy" + ) + interaction_payload["type"] = effective_type + + if profile == "lammps": + model_text = (interaction_model or "").strip() + if model_text: + if "," in model_text: + interaction_payload["model"] = [item.strip() for item in model_text.split(",") if item.strip()] + else: + interaction_payload["model"] = model_text + elif "model" in interaction_payload and interaction_payload.get("model") and effective_type == template_type: + pass + elif effective_type == "eam_alloy": + interaction_payload["model"] = "Al.eam.alloy" + else: + interaction_payload.pop("model", None) + + interaction_payload["type_map"] = "auto" + interaction_payload.pop("incar", None) + interaction_payload.pop("potcars", None) + interaction_payload.pop("potcar_prefix", None) + else: + interaction_payload.pop("model", None) + interaction_payload.pop("type_map", None) + path_key = _interaction_path_key(profile) + if interaction_incar.strip(): + interaction_payload[path_key] = interaction_incar.strip() + interaction_payload.pop("incar" if path_key == "input" else "input", None) + if potcar_map: + interaction_payload["potcars"] = potcar_map + elif "potcars" in interaction_payload and isinstance(interaction_payload.get("potcars"), dict): + pass + else: + interaction_payload.pop("potcars", None) + if profile == "abacus": + if orb_map: + interaction_payload["orb_files"] = orb_map + elif "orb_files" in interaction_payload and isinstance(interaction_payload.get("orb_files"), dict): + pass + else: + interaction_payload.pop("orb_files", None) + + payload["interaction"] = interaction_payload + + return payload + + +def _parse_param_editor_payload(raw_text: str, fallback_template: Dict[str, Any]) -> Dict[str, Any]: + try: + parsed = json.loads(raw_text or "") + except json.JSONDecodeError: + return copy.deepcopy(fallback_template) + return copy.deepcopy(parsed) if isinstance(parsed, dict) else copy.deepcopy(fallback_template) + + +def _property_items_by_type(items: List[Any]) -> Dict[str, List[Dict[str, Any]]]: + grouped: Dict[str, List[Dict[str, Any]]] = {} + for item in items or []: + if not isinstance(item, dict): + continue + ptype = item.get("type") + if ptype: + grouped.setdefault(str(ptype), []).append(item) + return grouped + + +def _patch_properties( + payload: Dict[str, Any], + template: Dict[str, Any], + selected_properties: List[str], +) -> None: + existing_by_type = _property_items_by_type(payload.get("properties", [])) + template_by_type = _property_items_by_type(template.get("properties", [])) + next_properties = [] + used_counts: Dict[str, int] = {} + for ptype in selected_properties or []: + ptype = str(ptype) + idx = used_counts.get(ptype, 0) + candidates = existing_by_type.get(ptype) or template_by_type.get(ptype) or [] + if idx < len(candidates): + item = copy.deepcopy(candidates[idx]) + elif candidates: + item = copy.deepcopy(candidates[-1]) + else: + item = {"type": ptype} + item["type"] = ptype + item["req_calc"] = True + next_properties.append(item) + used_counts[ptype] = idx + 1 + payload["properties"] = next_properties + + +def _patch_interaction( + payload: Dict[str, Any], + profile: str, + interaction_type: str, + interaction_model: str, + interaction_incar: str, + interaction_rows: List[Dict[str, str]], +) -> None: + interaction_rows = interaction_rows or [] + potcar_map = _rows_to_mapping( + [row.get("element", "") if isinstance(row, dict) else "" for row in interaction_rows], + [row.get("potcar", "") if isinstance(row, dict) else "" for row in interaction_rows], + ) + orb_map = _rows_to_mapping( + [row.get("element", "") if isinstance(row, dict) else "" for row in interaction_rows], + [row.get("orb_file", "") if isinstance(row, dict) else "" for row in interaction_rows], + ) + current = payload.get("interaction") + interaction_payload = copy.deepcopy(current) if isinstance(current, dict) else {} + effective_type = (interaction_type or "").strip() or interaction_payload.get("type") or ( + profile if profile in {"vasp", "abacus"} else "eam_alloy" + ) + interaction_payload["type"] = effective_type + + if profile == "lammps": + model_text = (interaction_model or "").strip() + if model_text: + if "," in model_text: + interaction_payload["model"] = [item.strip() for item in model_text.split(",") if item.strip()] + else: + interaction_payload["model"] = model_text + elif effective_type != "eam_alloy": + interaction_payload.pop("model", None) + interaction_payload["type_map"] = "auto" + for key in ("input", "incar", "potcars", "potcar_prefix", "orb_files"): + interaction_payload.pop(key, None) + else: + interaction_payload.pop("model", None) + interaction_payload.pop("type_map", None) + path_key = _interaction_path_key(profile) + if (interaction_incar or "").strip(): + interaction_payload[path_key] = interaction_incar.strip() + interaction_payload.pop("incar" if path_key == "input" else "input", None) + if potcar_map: + interaction_payload["potcars"] = potcar_map + if profile == "abacus" and orb_map: + interaction_payload["orb_files"] = orb_map + + payload["interaction"] = interaction_payload + + +def _patch_param_payload( + current_text: str, + triggered_id: str, + profile: str, + template: Dict[str, Any], + relax_check: List[str], + properties_check: List[str], + structures_value: List[str], + interaction_type: str, + interaction_model: str, + interaction_incar: str, + interaction_rows: List[Dict[str, str]], +) -> Dict[str, Any]: + payload = _parse_param_editor_payload(current_text, template) + if triggered_id == "submit-structures": + payload["structures"] = [item.strip() for item in (structures_value or []) if isinstance(item, str) and item.strip()] + elif triggered_id == "submit-properties-check": + _patch_properties(payload, template, properties_check or []) + elif triggered_id == "submit-relax-check": + if "relax" in (relax_check or []): + payload.setdefault("relaxation", copy.deepcopy(template.get("relaxation", {}))) + else: + payload.pop("relaxation", None) + elif triggered_id in { + "submit-interaction-type", + "submit-interaction-model", + "submit-interaction-incar", + "submit-interaction-table", + }: + _patch_interaction( + payload=payload, + profile=profile, + interaction_type=interaction_type, + interaction_model=interaction_model, + interaction_incar=interaction_incar, + interaction_rows=interaction_rows or [], + ) + return payload + + +def _normalize_workdir(workdir: str) -> str: + clean = (workdir or "").strip() + return os.path.abspath(clean or os.getcwd()) + + +def _resolve_file_path(workdir: str, filename: str) -> str: + clean = (filename or "").strip() + if not clean: + return "" + if os.path.isabs(clean): + return clean + return os.path.join(workdir, clean) + + +def _list_workdir_file_options(workdir: str, current_value: str = "") -> List[Dict[str, str]]: + target_dir = _normalize_workdir(workdir) + options: List[Dict[str, str]] = [] + seen = set() + + if os.path.isdir(target_dir): + for root, dirnames, filenames in os.walk(target_dir): + dirnames[:] = sorted(name for name in dirnames if not name.startswith(".")) + rel_root = os.path.relpath(root, target_dir) + for filename in sorted(filenames): + if filename.startswith("."): + continue + rel_path = filename if rel_root == "." else os.path.join(rel_root, filename) + rel_path = rel_path.replace(os.path.sep, "/") + options.append({"label": rel_path, "value": rel_path}) + seen.add(rel_path) + + clean_current = (current_value or "").strip() + if clean_current and clean_current not in seen: + options.insert(0, {"label": f"{clean_current} (current)", "value": clean_current}) + return options + + +def _is_param_fallback_filename(path: str) -> bool: + name = os.path.basename(path or "") + return "param" in name and name.endswith(".json") + + +def _read_text_file(path: str) -> str: + with open(path, "r", encoding="utf-8") as f: + return f.read() + + +def _find_param_fallback_file(workdir: str, preferred_files: Optional[List[str]] = None) -> Tuple[str, str]: + target_dir = _normalize_workdir(workdir) + candidates: List[str] = [] + + for rel_path in preferred_files or []: + clean_rel = str(rel_path or "").replace("\\", "/").strip("/") + if not _is_param_fallback_filename(clean_rel): + continue + abs_path = _resolve_file_path(target_dir, clean_rel) + if os.path.isfile(abs_path): + candidates.append(clean_rel) + + if not candidates and os.path.isdir(target_dir): + for abs_path in glob.glob(os.path.join(target_dir, PARAM_FALLBACK_PATTERN)): + if os.path.isfile(abs_path): + candidates.append(os.path.basename(abs_path)) + + if not candidates: + return "", "" + + unique_candidates = sorted(set(candidates), key=lambda rel: (-os.path.getmtime(_resolve_file_path(target_dir, rel)), rel)) + selected = unique_candidates[0] + return selected, _read_text_file(_resolve_file_path(target_dir, selected)) + + +def _param_controls_from_text(param_text: str, profile: str, workdir: str) -> Optional[Dict[str, Any]]: + try: + payload = json.loads(param_text or "{}") + except json.JSONDecodeError: + return None + if not isinstance(payload, dict): + return None + + profile = profile if profile in PROFILE_NAMES else DEFAULT_PROFILE + structures = _extract_structure_defaults(payload) + property_types = _extract_property_types(payload) + property_values = _extract_requested_properties(payload) + interaction_type, interaction_model, _interaction_elements = _extract_interaction_defaults(payload) + interaction_incar = _extract_interaction_incar(payload, profile) + interaction_rows = _interaction_table_rows_from_template(profile, payload) + + return { + "structures_options": _list_structure_path_options(workdir, structures), + "structures_value": structures, + "relax_value": ["relax"] if "relaxation" in payload else [], + "property_options": [{"label": name, "value": name} for name in property_types], + "property_value": property_values, + "interaction_type_options": _interaction_type_options_for_profile(profile, interaction_type), + "interaction_type": interaction_type, + "interaction_model_options": _list_workdir_file_options(workdir, interaction_model), + "interaction_model": interaction_model, + "interaction_incar": interaction_incar, + "interaction_rows": interaction_rows, + } + + +def _param_control_output_values(workdir: str, param_text: str, profile: str) -> Tuple[Any, ...]: + controls = _param_controls_from_text(param_text, profile, workdir) + if not controls: + return (dash.no_update,) * 11 + return ( + controls["structures_options"], + controls["structures_value"], + controls["relax_value"], + controls["property_options"], + controls["property_value"], + controls["interaction_type_options"], + controls["interaction_type"], + controls["interaction_model_options"], + controls["interaction_model"], + controls["interaction_incar"], + controls["interaction_rows"], + ) + + +def _is_structure_candidate_dir(abs_dir: str) -> bool: + for marker in ("POSCAR", "CONTCAR", "STRU"): + if os.path.isfile(os.path.join(abs_dir, marker)): + return True + for marker in ("POSCAR", "CONTCAR", "STRU"): + if glob.glob(os.path.join(abs_dir, "conf_*", marker)): + return True + return False + + +def _structure_wildcard_options(structure_paths: List[str]) -> List[Dict[str, str]]: + groups: Dict[Tuple[str, str], List[str]] = {} + for rel_path in structure_paths: + parent, name = os.path.split(rel_path) + match = re.match(r"^(.*?)(\d+)$", name) + if not match: + continue + prefix = match.group(1) + if not prefix: + continue + groups.setdefault((parent, prefix), []).append(rel_path) + + options = [] + for (parent, prefix), members in sorted(groups.items()): + if len(members) < 2: + continue + wildcard = f"{prefix}*" + rel_wildcard = f"{parent}/{wildcard}" if parent else wildcard + options.append({"label": rel_wildcard, "value": rel_wildcard}) + return options + + +def _list_structure_path_options(workdir: str, current_values: Optional[List[str]] = None) -> List[Dict[str, str]]: + target_dir = _normalize_workdir(workdir) + options: List[Dict[str, str]] = [] + seen = set() + structure_paths: List[str] = [] + + if os.path.isdir(target_dir): + for root, dirnames, _filenames in os.walk(target_dir): + dirnames[:] = sorted(name for name in dirnames if not name.startswith(".")) + rel_root = os.path.relpath(root, target_dir) + if rel_root == ".": + continue + rel_path = rel_root.replace(os.path.sep, "/") + if "." in rel_path: + continue + if _is_structure_candidate_dir(root): + structure_paths.append(rel_path) + + for wildcard_option in _structure_wildcard_options(structure_paths): + if wildcard_option["value"] not in seen: + options.append(wildcard_option) + seen.add(wildcard_option["value"]) + + for rel_path in structure_paths: + if rel_path not in seen: + options.append({"label": rel_path, "value": rel_path}) + seen.add(rel_path) + + for current in current_values or []: + clean_current = (current or "").strip() + if clean_current and clean_current not in seen: + options.insert(0, {"label": f"{clean_current} (current)", "value": clean_current}) + seen.add(clean_current) + return options + + +def _save_uploaded_files(contents: Any, filenames: Any, workdir: str, target_subdir: str = "confs") -> List[str]: + if not contents: + return [] + + if isinstance(contents, str): + content_items = [contents] + else: + content_items = list(contents) + + if isinstance(filenames, str): + filename_items = [filenames] + else: + filename_items = list(filenames or []) + + if len(filename_items) != len(content_items): + raise ValueError("Uploaded file metadata is incomplete.") + + target_dir = _normalize_workdir(workdir) + if not os.path.isdir(target_dir): + raise FileNotFoundError(f"Workdir does not exist: {target_dir}") + upload_root = os.path.join(target_dir, target_subdir) + os.makedirs(upload_root, exist_ok=True) + + saved_files: List[str] = [] + + def _safe_join_under(root_path: str, rel_unix_path: str) -> str: + normalized = rel_unix_path.replace("\\", "/") + path_parts = [part for part in normalized.split("/") if part and part != "."] + if not path_parts or any(part == ".." for part in path_parts): + raise ValueError(f"Unsafe path in uploaded archive: {rel_unix_path}") + candidate = os.path.join(root_path, *path_parts) + root_real = os.path.realpath(root_path) + candidate_real = os.path.realpath(candidate) + if os.path.commonpath([root_real, candidate_real]) != root_real: + raise ValueError(f"Unsafe path in uploaded archive: {rel_unix_path}") + return candidate + + def _extract_archive(payload: bytes, raw_filename: str, upload_root_path: str) -> List[str]: + extracted_rel_paths: List[str] = [] + lowered = raw_filename.lower() + if lowered.endswith(".zip"): + with zipfile.ZipFile(io.BytesIO(payload)) as zf: + for info in zf.infolist(): + rel_name = info.filename.replace("\\", "/") + if info.is_dir() or not rel_name.strip(): + continue + target_path = _safe_join_under(upload_root_path, rel_name) + os.makedirs(os.path.dirname(target_path), exist_ok=True) + with zf.open(info, "r") as src, open(target_path, "wb") as dst: + shutil.copyfileobj(src, dst) + extracted_rel_paths.append( + os.path.relpath(target_path, target_dir).replace(os.path.sep, "/") + ) + return extracted_rel_paths + + if lowered.endswith(".tar") or lowered.endswith(".tar.gz") or lowered.endswith(".tgz"): + with tarfile.open(fileobj=io.BytesIO(payload), mode="r:*") as tf: + for member in tf.getmembers(): + rel_name = member.name.replace("\\", "/") + if not member.isfile() or not rel_name.strip(): + continue + target_path = _safe_join_under(upload_root_path, rel_name) + os.makedirs(os.path.dirname(target_path), exist_ok=True) + src = tf.extractfile(member) + if src is None: + continue + with src, open(target_path, "wb") as dst: + shutil.copyfileobj(src, dst) + extracted_rel_paths.append( + os.path.relpath(target_path, target_dir).replace(os.path.sep, "/") + ) + return extracted_rel_paths + + return [] + + for raw_content, raw_name in zip(content_items, filename_items): + raw_filename = (raw_name or "").strip().replace("\\", "/") + path_parts = [part for part in raw_filename.split("/") if part] + if not path_parts: + raise ValueError("Uploaded filename is empty.") + if any(part in {".", ".."} for part in path_parts): + raise ValueError(f"Unsafe uploaded filename: {raw_name}") + rel_path = os.path.join(*path_parts) + filename = path_parts[-1] + if "," not in raw_content: + raise ValueError(f"Invalid upload payload for {filename}.") + + _header, encoded = raw_content.split(",", 1) + try: + payload = base64.b64decode(encoded, validate=True) + except (binascii.Error, ValueError) as exc: + raise ValueError(f"Invalid base64 payload for {filename}: {exc}") from exc + + extracted = _extract_archive(payload, filename, upload_root) + if extracted: + saved_files.extend(extracted) + continue + + target_path = os.path.join(upload_root, rel_path) + os.makedirs(os.path.dirname(target_path), exist_ok=True) + with open(target_path, "wb") as f: + f.write(payload) + saved_files.append(os.path.join(target_subdir, rel_path).replace(os.path.sep, "/")) + + return saved_files + + +def _read_latest_workflow_id(workdir: str) -> str: + log_path = os.path.join(workdir, ".workflow.log") + if not os.path.isfile(log_path): + return "" + try: + with open(log_path, "r", encoding="utf-8", errors="replace") as f: + lines = f.readlines() + except OSError: + return "" + if not lines: + return "" + record = lines[-1].strip() + if not record: + return "" + return record.split("\t")[0].strip() + + +def _parse_workflow_ids(value: Any) -> List[str]: + if isinstance(value, list): + raw_items = value + else: + raw_items = re.split(r"[\s,]+", str(value or "")) + workflow_ids: List[str] = [] + for item in raw_items: + clean = str(item or "").strip() + if clean and clean not in workflow_ids: + workflow_ids.append(clean) + return workflow_ids + + +def _format_workflow_ids(workflow_ids: List[str]) -> str: + return ", ".join([item for item in workflow_ids if item]) + + +def _workflow_log_records(workdir: str) -> List[Dict[str, str]]: + log_path = os.path.join(workdir, ".workflow.log") + if not os.path.isfile(log_path): + return [] + records: List[Dict[str, str]] = [] + try: + with open(log_path, "r", encoding="utf-8", errors="replace") as f: + for line in f: + parts = line.rstrip("\n").split("\t") + if len(parts) < 4: + continue + records.append( + { + "workflow_id": parts[0].strip(), + "operation": parts[1].strip(), + "timestamp": parts[2].strip(), + "workdir": parts[3].strip(), + "workflow_uid": parts[4].strip() if len(parts) > 4 else "", + } + ) + except OSError: + return [] + return records + + +def _count_workflow_log_records(workdir: str) -> int: + return len(_workflow_log_records(workdir)) + + +def _submit_meta_path(workdir: str) -> str: + return os.path.join(_normalize_workdir(workdir), SUBMIT_GROUP_META_FILE) + + +def _load_submit_group_metadata(workdir: str) -> Dict[str, Any]: + meta_path = _submit_meta_path(workdir) + if not os.path.isfile(meta_path): + return {} + try: + with open(meta_path, "r", encoding="utf-8") as f: + payload = json.load(f) + except (OSError, json.JSONDecodeError): + return {} + return payload if isinstance(payload, dict) else {} + + +def _save_submit_group_metadata(workdir: str, payload: Dict[str, Any]) -> None: + meta_path = _submit_meta_path(workdir) + with open(meta_path, "w", encoding="utf-8") as f: + json.dump(payload, f, indent=4, ensure_ascii=False) + f.write("\n") + + +def _sanitize_workflow_label_value(value: str, fallback: str = "apex-gui") -> str: + clean = re.sub(r"[^a-z0-9.-]+", "-", str(value or "").strip().lower()).strip("-.") + return clean[:63] or fallback + + +def _build_submit_group_id() -> str: + timestamp = datetime.now().strftime("%Y%m%d%H%M%S") + suffix = uuid.uuid4().hex[:8] + return f"apex-gui-{timestamp}-{suffix}" + + +def _derive_batch_param_filename(param_file: str, index: int, total: int) -> str: + base, ext = os.path.splitext(param_file) + suffix = f".batch-{index:03d}-of-{total:03d}" + if ext: + return f"{base}{suffix}{ext}" + return f"{param_file}{suffix}.json" + + +def _resolve_structures_for_submit(workdir: str, structures: List[str]) -> List[str]: + try: + from apex.submit import _glob_structures_in_work_dir + except Exception as exc: + raise RuntimeError(f"Failed to load submit structure resolver: {exc}") from exc + + resolved: List[str] = [] + for pattern in structures or []: + matches = _glob_structures_in_work_dir(workdir, pattern) + for match in matches: + if match not in resolved: + resolved.append(match) + return resolved + + +def _build_submit_batches( + workdir: str, + param_payload: Dict[str, Any], + param_file: str, + batch_size: int = SUBMIT_BATCH_SIZE, +) -> Tuple[List[Dict[str, Any]], List[str]]: + resolved_structures = _resolve_structures_for_submit(workdir, param_payload.get("structures", [])) + if not resolved_structures: + raise RuntimeError( + f"No structures matched the submitted patterns under {workdir}: " + f"{param_payload.get('structures', [])}" + ) + + batches: List[Dict[str, Any]] = [] + total_batches = max(1, (len(resolved_structures) + batch_size - 1) // batch_size) + for batch_index in range(total_batches): + batch_structures = resolved_structures[batch_index * batch_size:(batch_index + 1) * batch_size] + batch_payload = copy.deepcopy(param_payload) + batch_payload["structures"] = batch_structures + batch_file = param_file if total_batches == 1 else _derive_batch_param_filename(param_file, batch_index + 1, total_batches) + batches.append( + { + "index": batch_index + 1, + "param_file": batch_file, + "structures": batch_structures, + "payload": batch_payload, + } + ) + return batches, resolved_structures + + +def _merge_workflow_ids(*groups: Any) -> List[str]: + merged: List[str] = [] + for group in groups: + for workflow_id in _parse_workflow_ids(group): + if workflow_id not in merged: + merged.append(workflow_id) + return merged + + +def _discover_group_workflow_ids(workdir: str, meta: Dict[str, Any]) -> List[str]: + if not meta: + return [] + records = _workflow_log_records(workdir) + start_index = int(meta.get("workflow_log_line_start", 0) or 0) + expected = int(meta.get("expected_batches", 0) or 0) + normalized_workdir = _normalize_workdir(workdir) + discovered: List[str] = [] + for record in records[start_index:]: + if _normalize_workdir(record.get("workdir", "")) != normalized_workdir: + continue + workflow_id = record.get("workflow_id", "").strip() + if workflow_id and workflow_id not in discovered: + discovered.append(workflow_id) + if expected and len(discovered) >= expected: + break + return discovered + + +def _sync_submit_group_metadata_ids(workdir: str, meta: Dict[str, Any]) -> Dict[str, Any]: + if not meta: + return {} + discovered = _discover_group_workflow_ids(workdir, meta) + stored = _parse_workflow_ids(meta.get("workflow_ids", [])) + merged = _merge_workflow_ids(stored, discovered) + if merged != stored: + meta = copy.deepcopy(meta) + meta["workflow_ids"] = merged + _save_submit_group_metadata(workdir, meta) + return meta + + +def _tail_text_file(path: str, max_chars: int = 1600) -> str: + if not path or not os.path.isfile(path): + return "" + try: + with open(path, "r", encoding="utf-8", errors="replace") as f: + content = f.read() + except OSError: + return "" + return content[-max_chars:].strip() + + +def _summarize_step_progress(steps: List[Any]) -> Dict[str, int]: + total = 0 + running = 0 + finished = 0 + for step in steps or []: + if isinstance(step, dict): + step_type = step.get("type") + phase = str(step.get("phase", "")) + else: + step_type = getattr(step, "type", "") + phase = str(getattr(step, "phase", "")) + if step_type == "StepGroup": + continue + total += 1 + phase_norm = phase.lower() + if phase_norm in {"succeeded", "skipped", "omitted"}: + finished += 1 + elif phase_norm in {"running", "pending"}: + running += 1 + return {"total": total, "running": running, "finished": finished} + + +def _step_key(step: Any) -> str: + if isinstance(step, dict): + return str(step.get("key") or "") + return str(getattr(step, "key", "") or "") + + +def _step_phase(step: Any) -> str: + if isinstance(step, dict): + return str(step.get("phase") or "") + return str(getattr(step, "phase", "") or "") + + +def _step_parameter(step: Any, name: str) -> str: + inputs = step.get("inputs", {}) if isinstance(step, dict) else getattr(step, "inputs", None) + parameters = inputs.get("parameters", {}) if isinstance(inputs, dict) else getattr(inputs, "parameters", {}) + if isinstance(parameters, dict): + item = parameters.get(name) + if isinstance(item, dict): + return str(item.get("value") or "") + return str(getattr(item, "value", item) or "") + for item in parameters or []: + if isinstance(item, dict) and item.get("name") == name: + return str(item.get("value") or "") + if getattr(item, "name", None) == name: + return str(getattr(item, "value", "") or "") + return "" + + +def _conf_id_from_step(step: Any) -> str: + key = _step_key(step) + if key.startswith("relaxcal-"): + return _step_parameter(step, "flow_id") or key[len("relaxcal-"):] + if key.startswith("propertycal-"): + path_to_prop = _step_parameter(step, "path_to_prop") + if path_to_prop: + return os.path.dirname(path_to_prop).replace(os.path.sep, "/") + flow_id = _step_parameter(step, "flow_id") + if flow_id and "-" in flow_id: + return "-".join(flow_id.split("-")[:-2]) or flow_id + return key[len("propertycal-"):] + return "" + + +def _summarize_conf_progress(steps: List[Any]) -> Dict[str, int]: + conf_phases: Dict[str, List[str]] = {} + for step in steps or []: + conf_id = _conf_id_from_step(step) + if not conf_id: + continue + conf_phases.setdefault(conf_id, []).append(_step_phase(step).lower()) + + finished = 0 + running = 0 + failed = 0 + for phases in conf_phases.values(): + if any(phase in {"failed", "error"} for phase in phases): + failed += 1 + elif all(phase in {"succeeded", "skipped", "omitted"} for phase in phases): + finished += 1 + else: + running += 1 + return { + "conf_total": len(conf_phases), + "conf_running": running, + "conf_finished": finished, + "conf_failed": failed, + } + + +def _query_workflow_progress(workflow_id: str, config_file: str) -> Tuple[Dict[str, int], str, str]: + try: + from dflow import Workflow + except Exception as exc: + raise RuntimeError(f"dflow is unavailable: {exc}") from exc + + _configure_dflow_from_config(config_file) + + wf = Workflow(id=workflow_id) + info = wf.query() + steps = info.get_step() + counts = _summarize_step_progress(steps) + counts.update(_summarize_conf_progress(steps)) + workflow_phase = str(getattr(getattr(info, "status", None), "phase", "Unknown")) + progress_text = str(getattr(getattr(info, "status", None), "progress", "")) + return counts, workflow_phase, progress_text + + +def _configure_dflow_from_config(config_file: str) -> None: + from apex.config import Config + from apex.utils import load_config_file + + config_dict = load_config_file(config_file) + wf_config = Config(**config_dict) + Config.config_dflow(wf_config.dflow_config_dict) + Config.config_bohrium(wf_config.bohrium_config_dict) + Config.config_s3(wf_config.dflow_s3_config_dict) + + +def _query_workflow_phase_progress(workflow_id: str, config_file: str) -> Tuple[str, str]: + try: + from dflow import Workflow + except Exception as exc: + raise RuntimeError(f"dflow is unavailable: {exc}") from exc + + _configure_dflow_from_config(config_file) + wf = Workflow(id=workflow_id) + info = wf.query(fields=["status.phase", "status.progress"]) + status = getattr(info, "status", None) + workflow_phase = str(getattr(status, "phase", "Unknown")) + progress_text = str(getattr(status, "progress", "") or "") + return workflow_phase, progress_text + + +def _workflow_query_subprocess_code() -> str: + return ( + "import json, sys\n" + "from apex.gui import (\n" + " WORKFLOW_QUERY_RESULT_PREFIX,\n" + " _query_workflow_phase_progress,\n" + " _query_workflow_progress,\n" + ")\n" + "kind, workflow_id, config_file = sys.argv[1:4]\n" + "try:\n" + " if kind == 'phase':\n" + " payload = _query_workflow_phase_progress(workflow_id, config_file)\n" + " elif kind == 'detail':\n" + " payload = _query_workflow_progress(workflow_id, config_file)\n" + " else:\n" + " raise ValueError(f'unknown workflow query kind: {kind}')\n" + " result = {'ok': True, 'payload': payload}\n" + "except BaseException as exc:\n" + " result = {'ok': False, 'error': f'{type(exc).__name__}: {exc}'}\n" + "print(WORKFLOW_QUERY_RESULT_PREFIX + json.dumps(result))\n" + ) + + +def _parse_workflow_query_subprocess_output(stdout: str, stderr: str, returncode: int): + for line in reversed((stdout or "").splitlines()): + if line.startswith(WORKFLOW_QUERY_RESULT_PREFIX): + payload = json.loads(line[len(WORKFLOW_QUERY_RESULT_PREFIX):]) + if payload.get("ok"): + return payload.get("payload") + raise RuntimeError(payload.get("error") or "workflow query failed") + tail = (stderr or stdout or "").strip() + if len(tail) > 1000: + tail = tail[-1000:] + raise RuntimeError(f"workflow query exited without a result (code {returncode}): {tail}") + + +def _workflow_query_command(kind: str, workflow_id: str, config_file: str) -> List[str]: + return [ + sys.executable, + "-c", + _workflow_query_subprocess_code(), + kind, + workflow_id, + config_file, + ] + + +def _run_query_subprocess_with_timeout(kind: str, workflow_id: str, config_file: str, timeout: int): + try: + completed = subprocess.run( + _workflow_query_command(kind, workflow_id, config_file), + cwd=os.getcwd(), + capture_output=True, + text=True, + check=False, + timeout=timeout, + ) + except subprocess.TimeoutExpired as exc: + raise TimeoutError(f"workflow progress query timed out after {timeout}s") from exc + return _parse_workflow_query_subprocess_output( + completed.stdout, + completed.stderr, + completed.returncode, + ) + + +def _query_workflow_phase_progress_with_timeout( + workflow_id: str, + config_file: str, + timeout: int = WORKFLOW_QUICK_QUERY_TIMEOUT_SECONDS, +) -> Tuple[str, str]: + return tuple(_run_query_subprocess_with_timeout( + "phase", + workflow_id, + config_file, + timeout, + )) + + +def _query_workflow_progress_with_timeout( + workflow_id: str, + config_file: str, + timeout: int = WORKFLOW_PROGRESS_QUERY_TIMEOUT_SECONDS, +) -> Tuple[Dict[str, int], str, str]: + payload = _run_query_subprocess_with_timeout( + "detail", + workflow_id, + config_file, + timeout, + ) + counts, workflow_phase, progress_text = payload + return counts, workflow_phase, progress_text + + +def _query_many_workflow_phase_progress(workflow_ids: List[str], config_file: str) -> Dict[str, Tuple[str, str]]: + results: Dict[str, Tuple[str, str]] = {} + for workflow_id in workflow_ids: + results[workflow_id] = _query_workflow_phase_progress(workflow_id, config_file) + return results + + +def _query_many_workflow_phase_progress_with_timeout( + workflow_ids: List[str], + config_file: str, + timeout: Optional[int] = None, +) -> Dict[str, Tuple[str, str]]: + safe_ids = _parse_workflow_ids(workflow_ids) + if not safe_ids: + return {} + payload = ( + "import json, sys\n" + "from apex.gui import WORKFLOW_QUERY_RESULT_PREFIX, _query_many_workflow_phase_progress\n" + "workflow_ids = json.loads(sys.argv[1])\n" + "config_file = sys.argv[2]\n" + "try:\n" + " result = {'ok': True, 'payload': _query_many_workflow_phase_progress(workflow_ids, config_file)}\n" + "except BaseException as exc:\n" + " result = {'ok': False, 'error': f'{type(exc).__name__}: {exc}'}\n" + "print(WORKFLOW_QUERY_RESULT_PREFIX + json.dumps(result))\n" + ) + try: + completed = subprocess.run( + [sys.executable, "-c", payload, json.dumps(safe_ids), config_file], + cwd=os.getcwd(), + capture_output=True, + text=True, + check=False, + timeout=timeout or max(WORKFLOW_QUICK_QUERY_TIMEOUT_SECONDS, min(20, len(safe_ids) * 3)), + ) + except subprocess.TimeoutExpired as exc: + raise TimeoutError(f"workflow progress query timed out after {timeout or max(WORKFLOW_QUICK_QUERY_TIMEOUT_SECONDS, min(20, len(safe_ids) * 3))}s") from exc + raw_payload = _parse_workflow_query_subprocess_output( + completed.stdout, + completed.stderr, + completed.returncode, + ) + if not isinstance(raw_payload, dict): + return {} + return { + workflow_id: tuple(value) + for workflow_id, value in raw_payload.items() + if workflow_id in safe_ids and isinstance(value, (list, tuple)) and len(value) == 2 + } + + +def _workflow_progress_percent(progress_text: str) -> int: + match = re.search(r"(\d+)\s*/\s*(\d+)", progress_text or "") + if not match: + return 0 + current = int(match.group(1)) + total = int(match.group(2)) + if total <= 0: + return 0 + return max(0, min(100, int(round((current / total) * 100)))) + + +def _workflow_progress_fraction(progress_text: str) -> Tuple[int, int]: + match = re.search(r"(\d+)\s*/\s*(\d+)", progress_text or "") + if not match: + return 0, 0 + current = int(match.group(1)) + total = int(match.group(2)) + if total <= 0: + return 0, 0 + return current, total + + +def _aggregate_progress_fraction(progress_texts: List[str]) -> Tuple[int, int, int]: + current_total = 0 + grand_total = 0 + for progress_text in progress_texts or []: + current, total = _workflow_progress_fraction(progress_text) + current_total += current + grand_total += total + if grand_total <= 0: + return 0, 0, 0 + percent = max(0, min(100, int(round((current_total / grand_total) * 100)))) + return current_total, grand_total, percent + + +def _workflow_detail_cache_key(workflow_id: str, config_file: str) -> Tuple[str, str]: + return workflow_id, os.path.abspath(config_file) + + +def _start_workflow_detail_query(entry: Dict[str, Any], workflow_id: str, config_file: str, now: float) -> None: + process = subprocess.Popen( + _workflow_query_command("detail", workflow_id, config_file), + cwd=os.getcwd(), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + ) + entry["process"] = process + entry["started_at"] = now + entry["last_start_at"] = now + entry["running"] = True + + +def _poll_workflow_detail_cache(entry: Dict[str, Any], now: float) -> None: + process = entry.get("process") + if process is None: + return + if process.poll() is None: + started_at = entry.get("started_at", now) + if now - started_at > WORKFLOW_DETAIL_QUERY_TIMEOUT_SECONDS: + process.terminate() + try: + process.wait(timeout=2) + except subprocess.TimeoutExpired: + process.kill() + process.wait(timeout=2) + entry["error"] = f"detail query timed out after {WORKFLOW_DETAIL_QUERY_TIMEOUT_SECONDS}s" + entry["running"] = False + entry.pop("process", None) + return + try: + stdout, stderr = process.communicate(timeout=1) + payload = _parse_workflow_query_subprocess_output(stdout, stderr, process.returncode) + counts, workflow_phase, raw_progress = payload + entry["counts"] = counts + entry["workflow_phase"] = workflow_phase + entry["raw_progress"] = raw_progress + entry["updated_at"] = now + entry.pop("error", None) + except Exception as exc: + entry["error"] = str(exc) + entry["running"] = False + entry.pop("process", None) + + +def _get_workflow_detail_cache(workflow_id: str, config_file: str, now: Optional[float] = None) -> Dict[str, Any]: + timestamp = time.time() if now is None else now + key = _workflow_detail_cache_key(workflow_id, config_file) + entry = _WORKFLOW_DETAIL_CACHE.setdefault(key, {}) + _poll_workflow_detail_cache(entry, timestamp) + last_start_at = entry.get("last_start_at", 0.0) + if not entry.get("running") and timestamp - last_start_at >= WORKFLOW_DETAIL_REFRESH_SECONDS: + _start_workflow_detail_query(entry, workflow_id, config_file, timestamp) + return entry + + +def _build_submit_shell_command(meta_path: str, cwd: str) -> Tuple[str, str]: + log_file = os.path.join(cwd, "apex.log") + status_file = os.path.join(cwd, SUBMIT_STATUS_FILE) + submit_inner = ( + f"{shlex.quote(sys.executable)} -m apex.gui_background submit-group " + f"{shlex.quote(meta_path)} {shlex.quote(log_file)} {shlex.quote(status_file)}" + ) + display_cmd = f"nohup {submit_inner} > /dev/null 2>&1 &" + shell_cmd = ( + f"rm -f {shlex.quote(status_file)}; " + f"nohup bash -lc {shlex.quote(submit_inner)} >/dev/null 2>&1 & echo $!" + ) + return shell_cmd, display_cmd + + +def _run_submit_in_background(meta_path: str, cwd: Optional[str] = None) -> Dict[str, Any]: + target_cwd = cwd or os.getcwd() + shell_cmd, display_cmd = _build_submit_shell_command(meta_path, target_cwd) + try: + completed = subprocess.run( + ["bash", "-lc", shell_cmd], + cwd=target_cwd, + capture_output=True, + text=True, + check=False, + ) + except Exception as exc: + return { + "ok": False, + "message": f"Failed to start background submit: {exc}", + "command": display_cmd, + "returncode": "", + "stdout": "", + "stderr": str(exc), + "finished_at": datetime.now().isoformat(timespec="seconds"), + } + + pid = completed.stdout.strip().splitlines()[-1] if completed.stdout.strip() else "" + message = "Submit started in background." + if pid: + message += f" PID: {pid}." + message += f" Submit metadata: {os.path.basename(meta_path)}. Log file: apex.log" + + return { + "ok": completed.returncode == 0, + "message": message if completed.returncode == 0 else "Background submit failed to start.", + "operation": "submit", + "command": display_cmd, + "returncode": str(completed.returncode), + "stdout": completed.stdout.strip(), + "stderr": completed.stderr.strip(), + "finished_at": datetime.now().isoformat(timespec="seconds"), + "status_file": os.path.join(target_cwd, SUBMIT_STATUS_FILE), + } + + +def _ensure_default_interaction_files( + profile: str, + param_payload: Dict[str, Any], + incar_content: str = None, + workdir: Optional[str] = None, +) -> List[str]: + created_paths: List[str] = [] + interaction = param_payload.get("interaction") + if not isinstance(interaction, dict): + return created_paths + + interaction_key = _interaction_path_key(profile) + incar_value = interaction.get(interaction_key) or interaction.get("incar") + if isinstance(incar_value, str) and incar_value.strip(): + clean_incar = _strip_parenthetical_suffix(incar_value) + interaction[interaction_key] = clean_incar + if interaction_key == "input": + interaction.pop("incar", None) + target_path = os.path.join(_normalize_workdir(workdir or os.getcwd()), clean_incar) + parent_dir = os.path.dirname(target_path) + if parent_dir: + os.makedirs(parent_dir, exist_ok=True) + + if incar_content is not None: + with open(target_path, "w", encoding="utf-8") as f: + if incar_content and not incar_content.endswith("\n"): + f.write(f"{incar_content}\n") + else: + f.write(incar_content or "") + created_paths.append(clean_incar) + else: + source_path = os.path.join(_profile_dir(profile), "param_interaction", clean_incar) + if os.path.isfile(source_path) and not os.path.exists(target_path): + shutil.copyfile(source_path, target_path) + created_paths.append(clean_incar) + + for map_key in ("potcars", "orb_files"): + value_map = interaction.get(map_key) + if not isinstance(value_map, dict): + continue + interaction[map_key] = { + str(k): _strip_parenthetical_suffix(str(v)) for k, v in value_map.items() + } + + return created_paths + + +def _parse_submit_payloads(submit_global_editor: str, submit_param_editor: str) -> Tuple[Dict[str, Any], Dict[str, Any], Dict[str, Any]]: + try: + global_payload = json.loads(submit_global_editor or "{}") + except json.JSONDecodeError as exc: + return {}, {}, _build_feedback(f"global.json JSON 格式错误: {exc}") + + try: + param_payload = json.loads(submit_param_editor or "{}") + except json.JSONDecodeError as exc: + return {}, {}, _build_feedback(f"param.json JSON 格式错误: {exc}") + + if not isinstance(global_payload, dict): + return {}, {}, _build_feedback("global.json 必须是 JSON object") + if not isinstance(param_payload, dict): + return {}, {}, _build_feedback("param.json 必须是 JSON object") + + try: + from apex.submit import validate_submit_paths + + validate_submit_paths([param_payload]) + except Exception as exc: + return {}, {}, _build_feedback(str(exc)) + + return global_payload, param_payload, {} + + +def _write_submit_json_files( + global_payload: Dict[str, Any], + param_payload: Dict[str, Any], + workdir: str, + global_filename: str, + param_filename: str, +) -> Tuple[str, str]: + global_path = _resolve_file_path(workdir, global_filename) + param_path = _resolve_file_path(workdir, param_filename) + if not global_path or not param_path: + raise RuntimeError("global/param filename cannot be empty") + + global_parent = os.path.dirname(global_path) + param_parent = os.path.dirname(param_path) + if global_parent: + os.makedirs(global_parent, exist_ok=True) + if param_parent: + os.makedirs(param_parent, exist_ok=True) + + with open(global_path, "w", encoding="utf-8") as f: + json.dump(global_payload, f, indent=4, ensure_ascii=False) + f.write("\n") + with open(param_path, "w", encoding="utf-8") as f: + json.dump(param_payload, f, indent=4, ensure_ascii=False) + f.write("\n") + return global_path, param_path + + +def _cleanup_reset_logs(workdir: str, filenames: Optional[List[str]] = None) -> List[str]: + target_dir = _normalize_workdir(workdir) + removed: List[str] = [] + meta = _load_submit_group_metadata(target_dir) + base_param_file = str(meta.get("param_file", "") or "") + batch_param_files = [ + item.get("param_file", "") + for item in meta.get("submit_jobs", []) + if isinstance(item, dict) and item.get("param_file") and item.get("param_file") != base_param_file + ] + for name in filenames or ["dpdispatcher.log", ".workflow.log", "apex.log", "apex-report.log", ".apex-submit.status",".apex-retrieve.status","apex-retrieve.log"]: + target_path = os.path.join(target_dir, name) + if os.path.isfile(target_path): + os.remove(target_path) + removed.append(name) + meta_path = _submit_meta_path(target_dir) + if os.path.isfile(meta_path): + os.remove(meta_path) + removed.append(os.path.basename(meta_path)) + for rel_path in batch_param_files: + target_path = _resolve_file_path(target_dir, rel_path) + if target_path and os.path.isfile(target_path): + os.remove(target_path) + removed.append(rel_path) + return removed + + +def _run_report_in_background( + config_file: str, + report_target: str, + cwd: str, + port: int = DEFAULT_REPORT_PORT, +) -> Dict[str, Any]: + apex_bin = shutil.which("apex") + if apex_bin: + report_inner = ( + f"{shlex.quote(apex_bin)} report --no-browser -c {shlex.quote(config_file)} " + f"-w {shlex.quote(report_target)} --port {port}" + ) + display_cmd = ( + f"nohup apex report --no-browser -c {shlex.quote(config_file)} " + f"-w {shlex.quote(report_target)} --port {port} > apex-report.log 2>&1 &" + ) + else: + report_inner = ( + f"{shlex.quote(sys.executable)} -m apex report --no-browser -c {shlex.quote(config_file)} " + f"-w {shlex.quote(report_target)} --port {port}" + ) + display_cmd = f"nohup {report_inner} > apex-report.log 2>&1 &" + shell_cmd = f"nohup {report_inner} > apex-report.log 2>&1 & echo $!" + + try: + completed = subprocess.run( + ["bash", "-lc", shell_cmd], + cwd=cwd, + capture_output=True, + text=True, + check=False, + ) + except Exception as exc: + return { + "ok": False, + "message": f"Failed to start background report: {exc}", + "command": display_cmd, + "returncode": "", + "stdout": "", + "stderr": str(exc), + "finished_at": datetime.now().isoformat(timespec="seconds"), + } + + pid = completed.stdout.strip().splitlines()[-1] if completed.stdout.strip() else "" + message = f"Report app started in background on port {port}." + if pid: + message += f" PID: {pid}." + message += " Log file: apex-report.log" + report_url = f"http://{DEFAULT_HOST}:{port}" + return { + "ok": completed.returncode == 0, + "message": message if completed.returncode == 0 else "Background report failed to start.", + "command": display_cmd, + "returncode": str(completed.returncode), + "stdout": completed.stdout.strip(), + "stderr": completed.stderr.strip(), + "finished_at": datetime.now().isoformat(timespec="seconds"), + "report_url": report_url, + } + + +def _run_local_archive(workdir: str, global_file: str, param_file: str) -> Tuple[bool, str]: + target_workdir = _normalize_workdir(workdir) + all_result_path = os.path.join(target_workdir, "all_result.json") + + resolved_global = _resolve_file_path(target_workdir, global_file or "global.json") + resolved_param = _resolve_file_path(target_workdir, param_file or "param.json") + if not resolved_param or not os.path.isfile(resolved_param): + return False, f"param file not found: {resolved_param or param_file or 'param.json'}" + if not resolved_global or not os.path.isfile(resolved_global): + return False, f"global file not found: {resolved_global or global_file or 'global.json'}" + + try: + from apex.archive import archive_workdir + from apex.config import Config + from apex.utils import judge_flow, load_config_file + from monty.serialization import loadfn + except Exception as exc: + return False, f"failed to load local archive helpers: {exc}" + + try: + param_dict = loadfn(resolved_param) + config_dict = load_config_file(resolved_global) + cfg = Config(**config_dict) + cfg.database_type = "local" + _run_op, _calculator, flow_type, relax_param, props_param = judge_flow([param_dict], None) + archive_workdir( + relax_param=relax_param, + props_param=props_param, + config=cfg, + work_dir=target_workdir, + flow_type=flow_type, + ) + except Exception as exc: + return False, str(exc) + + if not os.path.isfile(all_result_path): + return False, "archive_workdir completed but all_result.json is still missing" + return True, all_result_path + + +def _ensure_local_all_result(workdir: str, global_file: str, param_file: str) -> Tuple[bool, str]: + target_workdir = _normalize_workdir(workdir) + all_result_path = os.path.join(target_workdir, "all_result.json") + if os.path.isfile(all_result_path): + return True, all_result_path + return _run_local_archive(target_workdir, global_file, param_file) + + +def _run_archive_and_report_pipeline(workdir: str, global_file: str, param_file: str) -> Dict[str, Any]: + ok, payload = _run_local_archive(workdir, global_file, param_file) + if not ok: + return _build_feedback(f"Local archive failed: {payload}") + all_result_path = payload + + report_feedback = _run_report_in_background(global_file, workdir, cwd=workdir) + if not report_feedback.get("ok"): + report_feedback["message"] = f"Report failed. {report_feedback.get('message', '')}".strip() + return report_feedback + + report_feedback["message"] = ( + f"Local archive + report completed. all_result.json: {all_result_path}. " + f"{report_feedback.get('message', '')}" + ) + return report_feedback + + +def _run_finalize_pipeline(workdir: str, workflow_id: str, global_file: str) -> Dict[str, Any]: + retrieve_feedback = _run_apex_command( + ["retrieve", "-i", workflow_id, "-w", workdir, "-c", global_file], + cwd=workdir, + ) + if not retrieve_feedback.get("ok"): + retrieve_feedback["message"] = f"Retrieve failed. {retrieve_feedback.get('message', '')}".strip() + return retrieve_feedback + + report_feedback = _run_archive_and_report_pipeline(workdir, global_file, "param.json") + if report_feedback.get("ok"): + report_feedback["message"] = report_feedback["message"].replace( + "Local archive + report completed.", + "Retrieve + local archive + report completed.", + 1, + ) + return report_feedback + + +def _finalize_retrieve_status(state_payload: Dict[str, Any]) -> Tuple[int, str, bool, Any, Dict[str, Any], Dict[str, Any]]: + retrieve_state = None + if isinstance(state_payload, dict): + if state_payload.get("status") == "running": + retrieve_state = state_payload + elif state_payload.get("status") == "done": + return ( + 100, + "100%", + False, + state_payload.get("completed_text") or "Retrieve finished.", + state_payload, + dash.no_update, + ) + else: + retrieve_state = state_payload.get("retrieve") + if not isinstance(retrieve_state, dict) or retrieve_state.get("status") != "running": + workdir = state_payload.get("workdir") if isinstance(state_payload, dict) else "" + workflow_id = state_payload.get("workflow_id") if isinstance(state_payload, dict) else "" + log_file = os.path.join(_normalize_workdir(workdir or os.getcwd()), "apex-retrieve.log") + if os.path.isfile(log_file): + log_text = _read_log_tail(log_file, max_lines=200, workdir=None) + if _retrieve_log_matches_workflow(log_file, workflow_id): + progress = _parse_retrieve_progress_from_log(log_text) + if progress: + value, label, text = progress + return value, label, True, text, state_payload, dash.no_update + return 0, "0%", False, "Retrieve 未运行", {}, dash.no_update + + status_file = retrieve_state.get("status_file") or "" + log_file = retrieve_state.get("log_file") or "" + workdir = retrieve_state.get("workdir") or state_payload.get("workdir") or os.getcwd() + global_file = retrieve_state.get("global_file") or state_payload.get("global_file") or "global.json" + param_file = retrieve_state.get("param_file") or state_payload.get("param_file") or "param.json" + pending_report = bool(retrieve_state.get("pending_report")) + if not status_file or not os.path.isfile(status_file): + log_text = _read_log_tail(log_file, max_lines=200, workdir=None) if log_file else "" + progress = _parse_retrieve_progress_from_log(log_text) + if progress: + value, label, text = progress + return value, label, True, text, retrieve_state, dash.no_update + return 5, "Retrieving", True, RETRIEVE_RUNNING_MESSAGE, retrieve_state, dash.no_update + + try: + with open(status_file, "r", encoding="utf-8") as f: + return_code = f.read().strip() + except OSError as exc: + feedback = _build_feedback(f"Retrieve status read failed: {exc}") + return 0, "Failed", False, "Retrieve 状态读取失败", {}, feedback + + if return_code != "0": + log_tail = _read_log_tail(log_file, max_lines=120, workdir=None) if log_file else "" + feedback = _build_feedback("Retrieve failed.") + feedback["command"] = retrieve_state.get("command", "") + feedback["returncode"] = return_code + feedback["stderr"] = log_tail + return 100, "Failed", False, "Retrieve failed. See apex-retrieve.log.", {}, feedback + + if not pending_report: + completed_state = _completed_retrieve_state( + workdir=workdir, + workflow_id=retrieve_state.get("workflow_id", ""), + workflow_ids=retrieve_state.get("workflow_ids", []), + global_file=global_file, + param_file=param_file, + text="Retrieve finished.", + log_file=log_file, + status_file=status_file, + ) + return 100, "Done", False, "Retrieve finished.", completed_state, dash.no_update + + report_feedback = _run_archive_and_report_pipeline(workdir, global_file, param_file) + if not report_feedback.get("ok"): + completed_state = _completed_retrieve_state( + workdir=workdir, + workflow_id=retrieve_state.get("workflow_id", ""), + workflow_ids=retrieve_state.get("workflow_ids", []), + global_file=global_file, + param_file=param_file, + text="Retrieve finished; report failed.", + log_file=log_file, + status_file=status_file, + ) + return 100, "Done", False, "Retrieve finished; report failed.", completed_state, report_feedback + + report_feedback["message"] = report_feedback["message"].replace( + "Local archive + report completed.", + "Retrieve + local archive + report completed.", + 1, + ) + completed_text = _report_started_children(report_feedback.get("report_url", "")) + completed_state = _completed_retrieve_state( + workdir=workdir, + workflow_id=retrieve_state.get("workflow_id", ""), + workflow_ids=retrieve_state.get("workflow_ids", []), + global_file=global_file, + param_file=param_file, + text=completed_text, + log_file=log_file, + status_file=status_file, + report_url=report_feedback.get("report_url", ""), + ) + return 100, "100%", False, completed_text, completed_state, report_feedback + + +DEFAULT_GLOBAL_EDITOR_TEXT = _json_dump_text(_load_profile_global(DEFAULT_PROFILE)) +DEFAULT_INTERACTION_ROWS = _interaction_table_rows_from_template(DEFAULT_PROFILE, DEFAULT_PARAM_TEMPLATE) +DEFAULT_INTERACTION_INCAR_CONTENT = _load_profile_incar_content(DEFAULT_PROFILE, DEFAULT_PARAM_TEMPLATE) +DEFAULT_PARAM_EDITOR_TEXT = _json_dump_text( + _build_param_payload( + profile=DEFAULT_PROFILE, + selected_structures=DEFAULT_STRUCTURE_PATHS, + with_relax="relaxation" in DEFAULT_PARAM_TEMPLATE, + selected_properties=DEFAULT_SELECTED_PROPERTIES, + interaction_type=DEFAULT_INTERACTION_TYPE, + interaction_model=DEFAULT_INTERACTION_MODEL, + interaction_incar=_extract_interaction_incar(DEFAULT_PARAM_TEMPLATE), + interaction_rows=DEFAULT_INTERACTION_ROWS, + base_template=DEFAULT_PARAM_TEMPLATE, + ) +) + + +class ApexGuiApp: + def __init__(self, host: str = DEFAULT_HOST, port: int = DEFAULT_PORT, open_browser: bool = True): + self.host = host + self.port = port + self.open_browser = open_browser + dbc_css = "https://cdn.jsdelivr.net/gh/AnnMarieW/dash-bootstrap-templates/dbc.min.css" + self.app = dash.Dash( + __name__, + external_stylesheets=[dbc.themes.MATERIA, dbc_css], + suppress_callback_exceptions=True, + ) + self.app.title = "APEX GUI" + self.app.layout = self._build_layout() + self._register_callbacks() + + @staticmethod + def _build_submit_tab() -> dbc.Tab: + initial_workdir = os.getcwd() + initial_param_file, initial_param_text = _find_param_fallback_file(initial_workdir) + if not initial_param_file: + initial_param_file = "param.json" + initial_param_text = DEFAULT_PARAM_EDITOR_TEXT + initial_controls = _param_controls_from_text(initial_param_text, DEFAULT_PROFILE, initial_workdir) or {} + initial_property_options = initial_controls.get( + "property_options", + [{"label": name, "value": name} for name in DEFAULT_PROPERTY_TYPES], + ) + initial_property_values = initial_controls.get("property_value", DEFAULT_SELECTED_PROPERTIES) + initial_structures = initial_controls.get("structures_value", DEFAULT_STRUCTURE_PATHS) + initial_structure_options = initial_controls.get( + "structures_options", + _list_structure_path_options(initial_workdir, DEFAULT_STRUCTURE_PATHS), + ) + initial_relax_value = initial_controls.get("relax_value", ["relax"]) + initial_interaction_type = initial_controls.get("interaction_type", DEFAULT_INTERACTION_TYPE) + initial_interaction_options = initial_controls.get( + "interaction_type_options", + _interaction_type_options_for_profile(DEFAULT_PROFILE, DEFAULT_INTERACTION_TYPE), + ) + initial_interaction_model = initial_controls.get("interaction_model", DEFAULT_INTERACTION_MODEL) + initial_interaction_model_options = initial_controls.get( + "interaction_model_options", + _list_workdir_file_options(initial_workdir, DEFAULT_INTERACTION_MODEL), + ) + initial_interaction_incar = initial_controls.get( + "interaction_incar", + _extract_interaction_incar(DEFAULT_PARAM_TEMPLATE, DEFAULT_PROFILE), + ) + initial_interaction_rows = initial_controls.get("interaction_rows", DEFAULT_INTERACTION_ROWS) + + return dbc.Tab( + label="Submit", + children=[ + dbc.Row( + [ + dbc.Col( + [ + html.H5("基础设置"), + dbc.Label("计算软件"), + dcc.Dropdown( + id="submit-profile", + clearable=False, + value=DEFAULT_PROFILE, + options=[ + {"label": "LAMMPS", "value": "lammps"}, + {"label": "VASP", "value": "vasp"}, + {"label": "ABACUS", "value": "abacus"}, + ], + ), + html.Br(), + dbc.Label("是否计算 Relax"), + dcc.Checklist( + id="submit-relax-check", + options=[{"label": "启用 relaxation", "value": "relax"}], + value=initial_relax_value, + inputStyle={"marginRight": "6px", "marginLeft": "10px"}, + labelStyle={"display": "inline-block"}, + ), + html.Br(), + dbc.Label("Properties 勾选"), + dcc.Checklist( + id="submit-properties-check", + options=initial_property_options, + value=initial_property_values, + inputStyle={"marginRight": "6px", "marginLeft": "10px"}, + labelStyle={"display": "inline-block", "marginRight": "12px"}, + ), + html.Br(), + html.Div( + id="submit-interaction-type-block", + children=[ + dbc.Label("interaction.type"), + dcc.Dropdown( + id="submit-interaction-type", + clearable=False, + value=initial_interaction_type, + options=initial_interaction_options, + ), + ], + ), + html.Br(), + html.Div( + id="submit-lammps-interaction-block", + style={"display": "block"}, + children=[ + dbc.Label("interaction.model"), + dcc.Dropdown( + id="submit-interaction-model", + options=initial_interaction_model_options, + value=initial_interaction_model, + placeholder="选择当前 Workdir 中的模型文件", + clearable=True, + searchable=True, + ), + html.Small("从当前 Workdir 选择模型文件。上传后列表会自动刷新。", className="text-muted"), + ], + ), + html.Div( + id="submit-electronic-interaction-block", + style={"display": "none"}, + children=[ + dbc.Label("interaction 列表(动态增删行)"), + dbc.Row( + [ + dbc.Col( + dbc.Button("加一行", id="submit-row-add", color="secondary", className="me-2"), + width="auto", + ), + dbc.Col( + dbc.Button("删一行", id="submit-row-del", color="secondary"), + width="auto", + ), + ], + className="g-2 mb-2", + ), + html.Small( + "VASP: Element + POTCAR;ABACUS: Element + POTCAR + ORB", + className="text-muted", + ), + dash_table.DataTable( + id="submit-interaction-table", + columns=_interaction_table_columns_for_profile(DEFAULT_PROFILE), + data=initial_interaction_rows, + editable=True, + row_deletable=True, + style_data_conditional=[ + { + "if": {"filter_query": f'{{potcar}} = "{MISSING_POTCAR_HINT}"', "column_id": "potcar"}, + "color": "#7a7a7a", + }, + { + "if": {"filter_query": f'{{orb_file}} = "{MISSING_ORB_HINT}"', "column_id": "orb_file"}, + "color": "#7a7a7a", + }, + ], + style_table={"overflowX": "auto"}, + style_cell={"textAlign": "left", "padding": "6px"}, + ), + ], + ), + html.Br(), + dbc.Label("工作目录 (Workdir)"), + dbc.Input( + id="submit-workdir", + value=os.getcwd(), + placeholder="/path/to/workdir", + ), + html.Br(), + dbc.Label("structures"), + dcc.Dropdown( + id="submit-structures", + options=initial_structure_options, + value=initial_structures, + placeholder="选择结构目录", + multi=True, + searchable=True, + ), + html.Small("从当前 Workdir 选择结构目录, 请注意不要选择文件", className="text-muted"), + html.Br(), + dbc.Label("上传结构"), + dcc.Upload( + id="submit-structure-upload", + multiple=True, + children=html.Div( + [ + "拖拽结构文件/文件夹到这里,或 ", + html.A("点击选择文件"), + ] + ), + style={ + "width": "100%", + "minHeight": "72px", + "lineHeight": "72px", + "borderWidth": "1px", + "borderStyle": "dashed", + "borderRadius": "6px", + "textAlign": "center", + "backgroundColor": "#fafafa", + }, + ), + html.Small( + "结构文件会上传到当前 Workdir 下的 confs/;支持目录拖拽,或上传 zip/tar(.gz/.tgz) 自动解压。", + className="text-muted", + ), + html.Br(), + dbc.Label("上传文件"), + dcc.Upload( + id="submit-file-upload", + multiple=True, + children=html.Div( + [ + "拖拽文件/文件夹到这里,或 ", + html.A("点击选择文件"), + ] + ), + style={ + "width": "100%", + "minHeight": "72px", + "lineHeight": "72px", + "borderWidth": "1px", + "borderStyle": "dashed", + "borderRadius": "6px", + "textAlign": "center", + "backgroundColor": "#fafafa", + }, + ), + html.Small( + "普通文件会上传到当前 Working Directory;支持目录拖拽,或上传 zip/tar(.gz/.tgz) 自动解压。", + className="text-muted", + ), + html.Br(), + dbc.Label("提交参数文件名"), + dbc.Input( + id="submit-param-file", + value=initial_param_file, + placeholder="param.json", + ), + html.Br(), + dbc.Label("全局配置文件名"), + dbc.Input( + id="submit-global-file", + value="global.json", + placeholder="global.json", + ), + html.Br(), + dbc.Label("Workflow ID(s) (留空时自动从 .workflow.log 读取,可填多个,逗号分隔)"), + dbc.Input( + id="submit-workflow-id", + value="", + placeholder="例如: wf-xxxx, wf-yyyy", + ), + html.Br(), + dbc.Button("Reset", id="submit-reset", color="secondary", className="me-2"), + dbc.Button("Submit", id="submit-run", color="primary", className="me-2"), + dbc.Button("Report", id="submit-finalize", color="success"), + ], + md=5, + ), + dbc.Col( + [ + html.H5("Advanced Setting"), + dbc.Label("global.json 编辑区"), + dcc.Textarea( + id="submit-global-editor", + value=DEFAULT_GLOBAL_EDITOR_TEXT, + style={"width": "100%", "height": "220px", "fontFamily": "monospace"}, + ), + html.Div( + id="submit-incar-right-block", + style={"display": "none"}, + children=[ + html.Br(), + dbc.Label(id="submit-interaction-path-label", children=_interaction_path_label(DEFAULT_PROFILE)), + dbc.Input( + id="submit-interaction-incar", + value=initial_interaction_incar, + placeholder=_interaction_path_placeholder(DEFAULT_PROFILE), + ), + html.Br(), + dbc.Label(id="submit-incar-editor-title", children=_interaction_editor_label(DEFAULT_PROFILE)), + dcc.Textarea( + id="submit-incar-content", + value=DEFAULT_INTERACTION_INCAR_CONTENT, + style={"width": "100%", "height": "180px", "fontFamily": "monospace"}, + ), + ], + ), + html.Br(), + dbc.Label("param.json 编辑区"), + dcc.Textarea( + id="submit-param-editor", + value=initial_param_text, + style={"width": "100%", "height": "300px", "fontFamily": "monospace"}, + ), + ], + md=7, + ), + ], + className="g-3", + ), + html.Br(), + dbc.Row( + [ + dbc.Col( + [ + html.H6("Workflow 进度"), + dbc.Progress(id="submit-progress-bar", value=0, max=100, striped=True, animated=True), + html.Div(id="submit-progress-text", className="mt-2 text-muted"), + html.Div(id="submit-progress-stats", className="text-muted"), + html.H6("Retrieve 进度", className="mt-3"), + dbc.Progress(id="retrieve-progress-bar", value=0, max=100, striped=True, animated=False), + html.Div(id="retrieve-progress-text", className="mt-2 text-muted"), + dcc.Interval(id="submit-progress-interval", interval=5000, n_intervals=0), + ], + md=12, + ) + ] + ), + html.Br(), + dbc.Label("运行命令"), + html.Pre( + id="submit-command-preview", + children=DEFAULT_SUBMIT_COMMAND, + style={"backgroundColor": "#f5f5f5", "padding": "10px", "borderRadius": "4px"}, + ), + ], + ) + + @staticmethod + def _build_manage_tab() -> dbc.Tab: + return dbc.Tab( + label="Log", + children=[ + dbc.Row( + [ + dbc.Col( + [ + dbc.Button("刷新日志", id="manage-log-refresh", color="primary", className="me-2"), + dcc.Interval(id="manage-log-interval", interval=3000, n_intervals=0), + html.Small("每 3 秒自动刷新一次", className="text-muted"), + ], + md=12, + ), + ] + ), + html.Br(), + html.Pre( + id="manage-log-content", + style={ + "whiteSpace": "pre-wrap", + "backgroundColor": "#0b0b0b", + "color": "#cfe6cf", + "padding": "12px", + "borderRadius": "6px", + "maxHeight": "560px", + "overflowY": "auto", + }, + children=_read_log_tail(), + ), + ], + ) + + @staticmethod + def _build_advanced_tab() -> dbc.Tab: + return dbc.Tab( + label="Advanced", + children=[ + html.P( + "Run any APEX command tail. Available options :'submit', 'do', 'retrieve', 'list', 'get', 'getsteps', 'getkeys', 'delete', 'resubmit', 'retry', 'resume', 'stop', 'suspend', 'terminate', 'archive', 'report', 'rss', 'preview', 'gui', 'account'; Example: submit param_joint.json -c global_bohrium.json", + className="text-muted", + ), + dbc.Textarea( + id="advanced-command", + placeholder="submit param_joint.json -c global.json", + style={"height": "120px"}, + ), + html.Br(), + dbc.Button("Run advanced command", id="advanced-run", color="warning"), + html.Div( + "Safety note: `gui` are blocked here to avoid nested Dash servers.", + className="text-muted mt-2", + ), + ], + ) + + @staticmethod + def _build_account_tab() -> dbc.Tab: + return dbc.Tab( + label="Account", + children=[ + html.P("底层对应 `apex account`,密码仅支持覆盖保存,不会在界面显示。", className="text-muted"), + dbc.Row( + [ + dbc.Col( + [ + dbc.Label("Bohrium Email / 用户名"), + dbc.Input( + id="account-email", + value=DEFAULT_ACCOUNT_STATE.get("email", ""), + placeholder="you@example.com", + ), + html.Br(), + dbc.Label("Program ID"), + dbc.Input( + id="account-program-id", + value=DEFAULT_ACCOUNT_STATE.get("program_id", ""), + placeholder="例如 1234", + ), + html.Br(), + dbc.Label("Password (留空表示保持当前密码不变)"), + dbc.Input( + id="account-password", + type="password", + value="", + placeholder="输入新密码以覆盖", + ), + html.Br(), + dbc.Button("刷新", id="account-refresh", color="secondary", className="me-2"), + dbc.Button("覆盖保存", id="account-save", color="primary"), + ], + md=6, + ), + dbc.Col( + [ + dbc.Label("当前账号信息"), + html.Pre( + id="account-summary", + children=_render_account_summary(DEFAULT_ACCOUNT_STATE), + style={"backgroundColor": "#f5f5f5", "padding": "10px", "borderRadius": "4px"}, + ), + dbc.Label("操作结果"), + html.Pre( + id="account-feedback", + children="", + style={ + "whiteSpace": "pre-wrap", + "backgroundColor": "#111", + "color": "#f5f5f5", + "padding": "10px", + "borderRadius": "4px", + "minHeight": "80px", + }, + ), + ], + md=6, + ), + ], + className="g-3", + ), + ], + ) + + def _build_layout(self) -> dbc.Container: + return dbc.Container( + [ + html.H2("APEX Graphical Interface", className="mt-3"), + dcc.Store(id="command-result"), + dcc.Store(id="submit-state", data=DEFAULT_SUBMIT_STATE), + dcc.Store(id="retrieve-state", data={}), + dcc.ConfirmDialog(id="submit-confirm-dialog"), + dbc.Tabs( + [ + self._build_submit_tab(), + self._build_manage_tab(), + self._build_advanced_tab(), + self._build_account_tab(), + ], + className="mb-3", + ), + html.Hr(), + html.H4("Command Output"), + html.Pre( + id="command-output", + style={ + "whiteSpace": "pre-wrap", + "backgroundColor": "#111", + "color": "#f5f5f5", + "padding": "14px", + "borderRadius": "6px", + "maxHeight": "480px", + "overflowY": "auto", + }, + children="Click any action button to run an APEX command.", + ), + ], + fluid=True, + ) + + def _register_callbacks(self) -> None: + @self.app.callback( + Output("submit-global-editor", "value"), + Output("submit-relax-check", "value"), + Output("submit-properties-check", "options"), + Output("submit-properties-check", "value"), + Output("submit-interaction-type-block", "style"), + Output("submit-interaction-type", "options"), + Output("submit-interaction-type", "value"), + Output("submit-lammps-interaction-block", "style"), + Output("submit-electronic-interaction-block", "style"), + Output("submit-incar-right-block", "style"), + Output("submit-interaction-path-label", "children"), + Output("submit-interaction-incar", "placeholder"), + Output("submit-interaction-incar", "value"), + Output("submit-incar-editor-title", "children"), + Output("submit-incar-content", "value"), + Output("submit-interaction-table", "columns"), + Input("submit-profile", "value"), + ) + def _sync_profile_defaults(profile): + param_template = _load_profile_param_template(profile) + prop_types = _extract_property_types(param_template) + prop_selected = _extract_selected_properties(param_template) + interaction_type, _interaction_model, _interaction_elements = _extract_interaction_defaults(param_template) + interaction_incar = _extract_interaction_incar(param_template) + interaction_incar_content = _load_profile_incar_content(profile, param_template) + global_payload = _load_profile_global(profile) + prop_options = [{"label": name, "value": name} for name in prop_types] + interaction_options = _interaction_type_options_for_profile(profile, interaction_type) + relax_value = ["relax"] if "relaxation" in param_template else [] + interaction_type_style = {"display": "block"} if profile == "lammps" else {"display": "none"} + lammps_style = {"display": "block"} if profile == "lammps" else {"display": "none"} + electronic_style = {"display": "none"} if profile == "lammps" else {"display": "block"} + table_columns = _interaction_table_columns_for_profile(profile) + + return ( + _json_dump_text(global_payload), + relax_value, + prop_options, + prop_selected, + interaction_type_style, + interaction_options, + interaction_type, + lammps_style, + electronic_style, + electronic_style, + _interaction_path_label(profile), + _interaction_path_placeholder(profile), + _extract_interaction_incar(param_template, profile), + _interaction_editor_label(profile), + interaction_incar_content, + table_columns, + ) + + @self.app.callback( + Output("submit-interaction-table", "data"), + Input("submit-profile", "value"), + Input("submit-workdir", "value"), + Input("submit-structures", "value"), + Input("command-result", "data"), + Input("submit-row-add", "n_clicks"), + Input("submit-row-del", "n_clicks"), + State("submit-interaction-table", "data"), + State("submit-interaction-table", "columns"), + prevent_initial_call=True, + ) + def _update_interaction_table(profile, submit_workdir, structures_value, _command_result, _add_clicks, _del_clicks, current_data, columns): + triggered_id = _resolve_triggered_id() + profile = profile if profile in PROFILE_NAMES else DEFAULT_PROFILE + + if triggered_id == "command-result": + return current_data or [] + + if triggered_id in {"submit-profile", "submit-workdir", "submit-structures"}: + template = _load_profile_param_template(profile) + if profile in {"vasp", "abacus"}: + return _autodetect_interaction_rows( + profile, + submit_workdir or os.getcwd(), + structures_value or _extract_structure_defaults(template), + template, + ) + return _interaction_table_rows_from_template(profile, template) + + rows = copy.deepcopy(current_data or []) + columns = columns or _interaction_table_columns_for_profile(profile) + column_ids = [col.get("id") for col in columns if isinstance(col, dict)] + blank_row = {key: "" for key in column_ids} + + if triggered_id == "submit-row-add": + rows.append(blank_row) + elif triggered_id == "submit-row-del": + if rows: + rows.pop() + + if not rows: + rows = [blank_row] + return rows + + @self.app.callback( + Output("submit-structures", "options"), + Output("submit-structures", "value"), + Input("submit-workdir", "value"), + Input("command-result", "data"), + Input("submit-profile", "value"), + State("submit-structures", "value"), + prevent_initial_call=False, + ) + def _refresh_structure_options(submit_workdir, _command_result, submit_profile, current_structures): + triggered_id = _resolve_triggered_id() + workdir = _normalize_workdir(submit_workdir) + template = _load_profile_param_template(submit_profile if submit_profile in PROFILE_NAMES else DEFAULT_PROFILE) + template_structures = _extract_structure_defaults(template) + current_value = template_structures if triggered_id == "submit-profile" else (current_structures or template_structures) + options = _list_structure_path_options(workdir, current_value) + if triggered_id == "command-result": + return options, dash.no_update + return options, current_value + + @self.app.callback( + Output("submit-interaction-model", "options"), + Output("submit-interaction-model", "value"), + Input("submit-workdir", "value"), + Input("command-result", "data"), + Input("submit-profile", "value"), + State("submit-interaction-model", "value"), + prevent_initial_call=False, + ) + def _refresh_interaction_model_options(submit_workdir, _command_result, submit_profile, current_model): + triggered_id = _resolve_triggered_id() + workdir = _normalize_workdir(submit_workdir) + template = _load_profile_param_template(submit_profile if submit_profile in PROFILE_NAMES else DEFAULT_PROFILE) + _interaction_type, template_model, _interaction_elements = _extract_interaction_defaults(template) + current_value = template_model if triggered_id == "submit-profile" else (current_model or template_model) + options = _list_workdir_file_options(workdir, current_value) + return options, current_value + + @self.app.callback( + Output("submit-param-file", "value", allow_duplicate=True), + Output("submit-param-editor", "value", allow_duplicate=True), + Output("submit-structures", "options", allow_duplicate=True), + Output("submit-structures", "value", allow_duplicate=True), + Output("submit-relax-check", "value", allow_duplicate=True), + Output("submit-properties-check", "options", allow_duplicate=True), + Output("submit-properties-check", "value", allow_duplicate=True), + Output("submit-interaction-type", "options", allow_duplicate=True), + Output("submit-interaction-type", "value", allow_duplicate=True), + Output("submit-interaction-model", "options", allow_duplicate=True), + Output("submit-interaction-model", "value", allow_duplicate=True), + Output("submit-interaction-incar", "value", allow_duplicate=True), + Output("submit-interaction-table", "data", allow_duplicate=True), + Input("submit-workdir", "value"), + State("submit-profile", "value"), + prevent_initial_call=True, + ) + def _load_param_fallback_from_workdir(submit_workdir, submit_profile): + workdir = _normalize_workdir(submit_workdir) + param_file, param_text = _find_param_fallback_file(workdir) + if not param_file: + return (dash.no_update,) * 13 + return ( + param_file, + param_text, + *_param_control_output_values(workdir, param_text, submit_profile), + ) + + @self.app.callback( + Output("submit-param-editor", "value"), + Input("submit-profile", "value"), + Input("submit-reset", "n_clicks"), + Input("submit-relax-check", "value"), + Input("submit-properties-check", "value"), + Input("submit-structures", "value"), + Input("submit-interaction-type", "value"), + Input("submit-interaction-model", "value"), + Input("submit-interaction-incar", "value"), + Input("submit-interaction-table", "data"), + State("submit-profile", "value"), + State("submit-param-editor", "value"), + prevent_initial_call=True, + ) + def _generate_param_editor( + profile_input, + _reset_clicks, + relax_check, + properties_check, + structures_value, + interaction_type, + interaction_model, + interaction_incar, + interaction_table_rows, + profile_state, + current_param_text, + ): + triggered_id = _resolve_triggered_id() + profile = profile_state or profile_input or DEFAULT_PROFILE + param_template = _load_profile_param_template(profile) + + if triggered_id in {"submit-profile", "submit-reset"}: + init_interaction_type, init_interaction_model, _init_elements = _extract_interaction_defaults(param_template) + init_structures = _extract_structure_defaults(param_template) + payload = _build_param_payload( + profile=profile, + selected_structures=init_structures, + with_relax="relaxation" in param_template, + selected_properties=_extract_selected_properties(param_template), + interaction_type=init_interaction_type, + interaction_model=init_interaction_model, + interaction_incar=_extract_interaction_incar(param_template), + interaction_rows=_interaction_table_rows_from_template(profile, param_template), + base_template=param_template, + ) + return _json_dump_text(payload) + + payload = _patch_param_payload( + current_text=current_param_text or "", + triggered_id=triggered_id, + profile=profile, + template=param_template, + relax_check=relax_check or [], + properties_check=properties_check or [], + structures_value=structures_value or [], + interaction_type=interaction_type or "", + interaction_model=interaction_model or "", + interaction_incar=interaction_incar or "", + interaction_rows=interaction_table_rows or [], + ) + return _json_dump_text(payload) + + @self.app.callback( + Output("command-result", "data"), + Output("submit-confirm-dialog", "displayed"), + Output("submit-confirm-dialog", "message"), + Output("submit-state", "data"), + Output("submit-workflow-id", "value"), + Input("submit-reset", "n_clicks"), + Input("submit-run", "n_clicks"), + Input("submit-finalize", "n_clicks"), + Input("submit-confirm-dialog", "submit_n_clicks"), + Input("advanced-run", "n_clicks"), + State("submit-profile", "value"), + State("submit-global-editor", "value"), + State("submit-param-editor", "value"), + State("submit-incar-content", "value"), + State("submit-workdir", "value"), + State("submit-global-file", "value"), + State("submit-param-file", "value"), + State("submit-workflow-id", "value"), + State("submit-state", "data"), + State("retrieve-state", "data"), + State("advanced-command", "value"), + prevent_initial_call=True, + ) + def _handle_command( + _reset_clicks, + _submit_clicks, + _finalize_clicks, + _submit_confirm_clicks, + _advanced_clicks, + submit_profile, + submit_global_editor, + submit_param_editor, + submit_incar_content, + submit_workdir, + submit_global_file, + submit_param_file, + submit_workflow_id, + submit_state, + retrieve_state, + advanced_command, + ): + triggered_id = _resolve_triggered_id() + default_confirm_message = "检测到已存在 apex.log,是否确认重新提交?" + profile = submit_profile if submit_profile in PROFILE_NAMES else DEFAULT_PROFILE + workdir = _normalize_workdir(submit_workdir) + global_file = (submit_global_file or "global.json").strip() + param_file = (submit_param_file or "param.json").strip() + current_workflow_id = (submit_workflow_id or "").strip() + + state_payload = copy.deepcopy(submit_state) if isinstance(submit_state, dict) else copy.deepcopy(DEFAULT_SUBMIT_STATE) + state_payload.update( + { + "workdir": workdir, + "global_file": global_file, + "param_file": param_file, + } + ) + + if not os.path.isdir(workdir): + feedback = _build_feedback(f"Workdir does not exist: {workdir}") + return feedback, False, default_confirm_message, state_payload, current_workflow_id + + if not global_file or not param_file: + feedback = _build_feedback("global/param 文件名不能为空") + return feedback, False, default_confirm_message, state_payload, current_workflow_id + + if triggered_id == "submit-reset": + removed_logs = _cleanup_reset_logs(workdir) + state_payload["workflow_id"] = "" + state_payload["workflow_ids"] = [] + state_payload["workflow_group_id"] = "" + state_payload["workflow_group_size"] = 0 + state_payload["workflow_group_total_confs"] = 0 + if removed_logs: + message = f"Reset completed. Removed files in {workdir}: " + ", ".join(removed_logs) + else: + message = f"Reset completed. No log files removed in {workdir}." + return _build_feedback(message=message, ok=True), False, default_confirm_message, state_payload, "" + + if triggered_id in {"submit-run", "submit-confirm-dialog"}: + global_payload, param_payload, parse_feedback = _parse_submit_payloads( + submit_global_editor, + submit_param_editor, + ) + if parse_feedback: + return parse_feedback, False, default_confirm_message, state_payload, current_workflow_id + + created_files = _ensure_default_interaction_files( + profile, + param_payload, + incar_content=submit_incar_content, + workdir=workdir, + ) + try: + batch_specs, resolved_structures = _build_submit_batches(workdir, param_payload, param_file) + except Exception as exc: + return _build_feedback(f"Submit preparation failed: {exc}"), False, default_confirm_message, state_payload, current_workflow_id + _write_submit_json_files(global_payload, param_payload, workdir, global_file, param_file) + batch_param_files: List[str] = [] + for batch_spec in batch_specs: + batch_file = batch_spec["param_file"] + if batch_file == param_file: + continue + _write_submit_json_files(global_payload, batch_spec["payload"], workdir, global_file, batch_file) + batch_param_files.append(batch_file) + workflow_log_line_start = _count_workflow_log_records(workdir) + group_id = _build_submit_group_id() + workdir_label = _sanitize_workflow_label_value(os.path.basename(workdir) or "workdir") + total_batches = len(batch_specs) + group_meta = { + "group_id": group_id, + "created_at": datetime.now().isoformat(timespec="seconds"), + "workdir": workdir, + "global_file": global_file, + "param_file": param_file, + "batch_size": SUBMIT_BATCH_SIZE, + "total_confs": len(resolved_structures), + "expected_batches": total_batches, + "workflow_log_line_start": workflow_log_line_start, + "workflow_ids": [], + "submit_jobs": [], + } + base_workflow_name = f"apex-gui-{workdir_label}-{group_id[-8:]}" + for batch_spec in batch_specs: + batch_index = batch_spec["index"] + batch_tag = f"{batch_index:03d}-of-{total_batches:03d}" + labels = [ + f"apex_gui_group={group_id}", + f"apex_gui_workdir={workdir_label}", + f"apex_gui_batch={batch_tag}", + "apex_gui_source=gui", + ] + workflow_name = f"{base_workflow_name}-batch-{batch_index:03d}" + group_meta["submit_jobs"].append( + { + "batch_index": batch_index, + "batch_total": total_batches, + "param_file": batch_spec["param_file"], + "global_file": global_file, + "workflow_name": workflow_name, + "labels": labels, + "workdir": workdir, + "conf_count": len(batch_spec["structures"]), + } + ) + _save_submit_group_metadata(workdir, group_meta) + state_payload["workflow_id"] = "" + state_payload["workflow_ids"] = [] + state_payload["workflow_group_id"] = group_id + state_payload["workflow_group_size"] = total_batches + state_payload["workflow_group_total_confs"] = len(resolved_structures) + + if triggered_id == "submit-run": + if os.path.exists(os.path.join(workdir, "apex.log")): + warning = _build_feedback( + "Detected existing apex.log. Please confirm resubmission.", + ok=False, + ) + return warning, True, default_confirm_message, state_payload, current_workflow_id + + run_feedback = _run_submit_in_background(_submit_meta_path(workdir), cwd=workdir) + if run_feedback.get("ok"): + batch_count = state_payload.get("workflow_group_size", 0) + conf_count = state_payload.get("workflow_group_total_confs", 0) + run_feedback["message"] = ( + f"{run_feedback.get('message', '').rstrip()}\n" + f"{SUBMIT_RUNNING_NOTICE}\n" + f"Detected {conf_count} confs; split into {batch_count} workflow batch(es) with at most {SUBMIT_BATCH_SIZE} confs each." + ) + if created_files: + extra_line = "Auto-created default files: " + ", ".join(created_files) + run_feedback["message"] = f"{run_feedback.get('message', '').rstrip()}\n{extra_line}" + if batch_param_files: + run_feedback["message"] = ( + f"{run_feedback.get('message', '').rstrip()}\n" + f"Batch param files: {', '.join(batch_param_files)}" + ) + return run_feedback, False, default_confirm_message, state_payload, "" + + if triggered_id == "submit-confirm-dialog": + run_feedback = _run_submit_in_background(_submit_meta_path(workdir), cwd=workdir) + if run_feedback.get("ok"): + batch_count = state_payload.get("workflow_group_size", 0) + conf_count = state_payload.get("workflow_group_total_confs", 0) + run_feedback["message"] = ( + f"{run_feedback.get('message', '').rstrip()}\n" + f"{SUBMIT_RUNNING_NOTICE}\n" + f"Detected {conf_count} confs; split into {batch_count} workflow batch(es) with at most {SUBMIT_BATCH_SIZE} confs each." + ) + if created_files: + extra_line = "Auto-created default files: " + ", ".join(created_files) + run_feedback["message"] = f"{run_feedback.get('message', '').rstrip()}\n{extra_line}" + if batch_param_files: + run_feedback["message"] = ( + f"{run_feedback.get('message', '').rstrip()}\n" + f"Batch param files: {', '.join(batch_param_files)}" + ) + return run_feedback, False, default_confirm_message, state_payload, "" + + if triggered_id == "submit-finalize": + workflow_ids = _merge_workflow_ids( + current_workflow_id, + state_payload.get("workflow_ids", []), + state_payload.get("workflow_id", ""), + ) + if not workflow_ids: + meta = _sync_submit_group_metadata_ids(workdir, _load_submit_group_metadata(workdir)) + workflow_ids = _merge_workflow_ids(workflow_ids, meta.get("workflow_ids", [])) + if not workflow_ids: + workflow_ids = _merge_workflow_ids(_read_latest_workflow_id(workdir)) + workflow_id_text = _format_workflow_ids(workflow_ids) + if not workflow_ids: + if ( + isinstance(retrieve_state, dict) + and retrieve_state.get("status") == "done" + and _normalize_workdir(retrieve_state.get("workdir") or workdir) == workdir + ) or _has_local_reportable_results(workdir): + report_feedback = _run_archive_and_report_pipeline(workdir, global_file, param_file) + return report_feedback, False, default_confirm_message, state_payload, current_workflow_id + feedback = _build_feedback("Workflow ID is required for report. Fill it or submit first.") + return feedback, False, default_confirm_message, state_payload, "" + if _retrieve_state_is_active(retrieve_state): + active_workflow_id = "" + if isinstance(retrieve_state, dict): + active_workflow_id = retrieve_state.get("workflow_id", "") or workflow_id_text + feedback = _build_feedback( + f"Retrieve is already running for workflow {active_workflow_id}. " + "Report will start automatically after retrieve finishes.", + ok=True, + ) + feedback["operation"] = "report-request" + feedback["workdir"] = workdir + feedback["workflow_id"] = active_workflow_id or workflow_id_text + feedback["workflow_ids"] = workflow_ids + feedback["global_file"] = global_file + feedback["param_file"] = param_file + feedback["pending_report"] = True + state_payload["workflow_id"] = active_workflow_id or workflow_id_text + state_payload["workflow_ids"] = workflow_ids + return feedback, False, default_confirm_message, state_payload, active_workflow_id or workflow_id_text + + if ( + isinstance(retrieve_state, dict) + and retrieve_state.get("status") == "done" + and _normalize_workdir(retrieve_state.get("workdir") or workdir) == workdir + ) or _has_local_reportable_results(workdir): + report_feedback = _run_archive_and_report_pipeline(workdir, global_file, param_file) + state_payload["workflow_id"] = workflow_id_text + state_payload["workflow_ids"] = workflow_ids + return report_feedback, False, default_confirm_message, state_payload, workflow_id_text + + final_feedback = _start_retrieve_in_background( + workdir=workdir, + workflow_id=workflow_id_text, + global_file=global_file, + ) + final_feedback["param_file"] = param_file + final_feedback["pending_report"] = True + state_payload["workflow_id"] = workflow_id_text + state_payload["workflow_ids"] = workflow_ids + return final_feedback, False, default_confirm_message, state_payload, workflow_id_text + + if triggered_id == "advanced-run": + if not advanced_command or not advanced_command.strip(): + return _build_feedback("Please provide a command tail."), False, default_confirm_message, state_payload, current_workflow_id + try: + advanced_args = shlex.split(advanced_command.strip()) + except ValueError as exc: + return _build_feedback(f"Command parse error: {exc}"), False, default_confirm_message, state_payload, current_workflow_id + if advanced_args and advanced_args[0] == "apex": + advanced_args = advanced_args[1:] + if not advanced_args: + return _build_feedback("Please provide arguments after `apex`."), False, default_confirm_message, state_payload, current_workflow_id + if advanced_args[0] in BLOCKED_INLINE_COMMANDS: + return ( + _build_feedback( + f"`apex {advanced_args[0]}` is blocked in Advanced mode to avoid nested Dash apps." + ), + False, + default_confirm_message, + state_payload, + current_workflow_id, + ) + if advanced_args[0] == "report": + report_args = _advanced_report_args(advanced_args) + return ( + _run_apex_command_in_background( + report_args, + cwd=workdir, + log_file="apex-report.log", + ), + False, + default_confirm_message, + state_payload, + current_workflow_id, + ) + return _run_apex_command(advanced_args, cwd=workdir), False, default_confirm_message, state_payload, current_workflow_id + + return _build_feedback("No action detected."), False, default_confirm_message, state_payload, current_workflow_id + + @self.app.callback( + Output("submit-progress-bar", "value"), + Output("submit-progress-bar", "label"), + Output("submit-progress-text", "children"), + Output("submit-progress-stats", "children"), + Output("submit-state", "data", allow_duplicate=True), + Output("submit-workflow-id", "value", allow_duplicate=True), + Input("submit-progress-interval", "n_intervals"), + Input("command-result", "data"), + Input("submit-workflow-id", "value"), + Input("submit-workdir", "value"), + Input("submit-global-file", "value"), + State("submit-state", "data"), + prevent_initial_call=True, + ) + def _refresh_submit_progress( + _n_intervals, + _command_result, + submit_workflow_id, + submit_workdir, + submit_global_file, + submit_state, + ): + state_payload = copy.deepcopy(submit_state) if isinstance(submit_state, dict) else copy.deepcopy(DEFAULT_SUBMIT_STATE) + workdir = _normalize_workdir(submit_workdir or state_payload.get("workdir") or os.getcwd()) + state_payload["workdir"] = workdir + global_file = (submit_global_file or state_payload.get("global_file") or "global.json").strip() + state_payload["global_file"] = global_file + meta = _sync_submit_group_metadata_ids(workdir, _load_submit_group_metadata(workdir)) + if meta: + state_payload["workflow_group_id"] = meta.get("group_id", "") + state_payload["workflow_group_size"] = int(meta.get("expected_batches", 0) or 0) + state_payload["workflow_group_total_confs"] = int(meta.get("total_confs", 0) or 0) + + workflow_ids = _merge_workflow_ids( + submit_workflow_id, + state_payload.get("workflow_ids", []), + state_payload.get("workflow_id", ""), + meta.get("workflow_ids", []) if meta else [], + ) + if not workflow_ids: + workflow_ids = _merge_workflow_ids(_read_latest_workflow_id(workdir)) + workflow_id_text = _format_workflow_ids(workflow_ids) + if workflow_ids: + state_payload["workflow_ids"] = workflow_ids + state_payload["workflow_id"] = workflow_id_text + + if not workflow_ids: + updated_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + status_path = os.path.join(workdir, SUBMIT_STATUS_FILE) + status_code = _tail_text_file(status_path, max_chars=32) + if status_code and status_code != "0": + log_tail = _tail_text_file(os.path.join(workdir, "apex.log")) + stats = "Submit failed before writing .workflow.log." + if log_tail: + stats += f"\n\napex.log tail:\n{log_tail}" + return ( + 0, + "0%", + f"提交失败,未生成 workflow id | Last updated: {updated_at}", + stats, + state_payload, + "", + ) + if os.path.isfile(os.path.join(workdir, "apex.log")) and not status_code: + return ( + 0, + "0%", + f"正在提交,等待 workflow id 生成 | Last updated: {updated_at}", + "Submit process is still running or uploading inputs. Check apex.log for live output.", + state_payload, + "", + ) + if meta: + pending = int(meta.get("expected_batches", 0) or 0) + total_confs = int(meta.get("total_confs", 0) or 0) + return ( + 0, + "0%", + f"批量提交已准备完成,等待 workflow id 注册 | Group: {meta.get('group_id', '')} | Last updated: {updated_at}", + f"Confs: {total_confs} | Expected workflows: {pending} | Registered: 0", + state_payload, + "", + ) + return ( + 0, + "0%", + f"暂无 workflow id(提交后会自动识别) | Last updated: {updated_at}", + "Total: 0 | Running: 0 | Finished: 0", + state_payload, + "", + ) + + config_path = _resolve_file_path(workdir, global_file) + updated_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + if not os.path.isfile(config_path): + return ( + 0, + "0%", + f"缺少配置文件: {config_path} | Last updated: {updated_at}", + "Total: 0 | Running: 0 | Finished: 0", + state_payload, + workflow_id_text, + ) + + try: + phase_results = _query_many_workflow_phase_progress_with_timeout(workflow_ids, config_path) + except TimeoutError as exc: + return ( + 0, + "0%", + f"远端进度查询超时: {exc} | Last updated: {updated_at}", + "Total: 0 | Running: 0 | Finished: 0", + state_payload, + workflow_id_text, + ) + except Exception as exc: + return ( + 0, + "0%", + f"无法查询 workflow 进度: {exc} | Last updated: {updated_at}", + "Total: 0 | Running: 0 | Finished: 0", + state_payload, + workflow_id_text, + ) + workflow_phases: Dict[str, int] = {} + progress_texts: List[str] = [] + for workflow_id in workflow_ids: + workflow_phase, raw_progress = phase_results.get(workflow_id, ("Unknown", "")) + workflow_phases[workflow_phase] = workflow_phases.get(workflow_phase, 0) + 1 + if raw_progress: + progress_texts.append(raw_progress) + + current_total, grand_total, percent = _aggregate_progress_fraction(progress_texts) + group_id = state_payload.get("workflow_group_id", "") + registered = len(workflow_ids) + expected = int(state_payload.get("workflow_group_size", 0) or 0) + total_confs = int(state_payload.get("workflow_group_total_confs", 0) or 0) + phase_bits = [f"{phase} {count}" for phase, count in sorted(workflow_phases.items())] + scope_text = f"Workflows {registered}" + if expected: + scope_text += f"/{expected}" + phase_text = f"{scope_text}" + if group_id: + phase_text = f"Group {group_id} | {phase_text}" + phase_text += f" | Last updated: {updated_at}" + if phase_bits: + phase_text += " | " + ", ".join(phase_bits) + if grand_total: + phase_text += f" | Progress: {current_total}/{grand_total}" + + stats_totals = { + "total": 0, + "running": 0, + "finished": 0, + "conf_total": 0, + "conf_running": 0, + "conf_finished": 0, + "conf_failed": 0, + } + detail_refreshing = 0 + detail_errors: List[str] = [] + detail_update_times: List[float] = [] + for workflow_id in workflow_ids: + detail_cache = _get_workflow_detail_cache(workflow_id, config_path) + counts = detail_cache.get("counts") + if isinstance(counts, dict): + for key in stats_totals: + stats_totals[key] += int(counts.get(key, 0) or 0) + updated_stamp = detail_cache.get("updated_at") + if isinstance(updated_stamp, (int, float)): + detail_update_times.append(float(updated_stamp)) + elif detail_cache.get("error"): + detail_errors.append(f"{workflow_id}: {detail_cache['error']}") + if detail_cache.get("running"): + detail_refreshing += 1 + + if stats_totals["total"] or stats_totals["conf_total"]: + stats = ( + f"Steps: Total {stats_totals['total']} | Running {stats_totals['running']} | Finished {stats_totals['finished']}" + f" | Confs: Total {stats_totals['conf_total']} | Running {stats_totals['conf_running']} | " + f"Finished {stats_totals['conf_finished']} | Failed {stats_totals['conf_failed']}" + ) + if total_confs: + stats += f" | Planned confs {total_confs}" + if detail_update_times: + stats += " | Details updated: " + datetime.fromtimestamp(max(detail_update_times)).strftime("%H:%M:%S") + if detail_refreshing: + stats += f" | Refreshing details for {detail_refreshing} workflow(s)..." + elif detail_errors: + stats = "Steps/Confs: detail query failed: " + "; ".join(detail_errors[:3]) + elif detail_refreshing: + stats = f"Steps/Confs: querying details in background for {detail_refreshing} workflow(s)..." + else: + stats = "Steps/Confs: detail query pending." + stats += f"\nWorkflow IDs: {workflow_id_text}" + return percent, f"{percent}%", phase_text, stats, state_payload, workflow_id_text + + @self.app.callback( + Output("retrieve-progress-bar", "value"), + Output("retrieve-progress-bar", "label"), + Output("retrieve-progress-bar", "animated"), + Output("retrieve-progress-text", "children"), + Output("retrieve-state", "data", allow_duplicate=True), + Output("command-result", "data", allow_duplicate=True), + Input("submit-progress-interval", "n_intervals"), + State("retrieve-state", "data"), + State("submit-workdir", "value"), + State("submit-workflow-id", "value"), + prevent_initial_call=True, + ) + def _refresh_retrieve_progress(_n_intervals, retrieve_state, submit_workdir, submit_workflow_id): + state_payload = copy.deepcopy(retrieve_state) if isinstance(retrieve_state, dict) else {} + if submit_workdir and not state_payload.get("workdir"): + state_payload["workdir"] = _normalize_workdir(submit_workdir) + if submit_workflow_id and not state_payload.get("workflow_id"): + state_payload["workflow_id"] = submit_workflow_id.strip() + if submit_workflow_id and not state_payload.get("workflow_ids"): + state_payload["workflow_ids"] = _parse_workflow_ids(submit_workflow_id) + value, label, animated, text, next_state, feedback = _finalize_retrieve_status(state_payload) + return value, label, animated, text, next_state, feedback + + @self.app.callback( + Output("account-email", "value"), + Output("account-program-id", "value"), + Output("account-password", "value"), + Output("account-summary", "children"), + Output("account-feedback", "children"), + Input("account-refresh", "n_clicks"), + Input("account-save", "n_clicks"), + State("account-email", "value"), + State("account-program-id", "value"), + State("account-password", "value"), + prevent_initial_call=True, + ) + def _handle_account(_refresh_clicks, _save_clicks, email_value, program_id_value, password_value): + triggered_id = _resolve_triggered_id() + if triggered_id == "account-save": + feedback, account_state = _save_account_overwrite( + email=email_value or "", + password=password_value or "", + program_id_text=program_id_value or "", + ) + else: + account_state = _load_account_state() + feedback = _build_feedback("Account info refreshed.", ok=True) + return ( + account_state.get("email", ""), + account_state.get("program_id", ""), + "", + _render_account_summary(account_state), + _brief_feedback(feedback), + ) + + @self.app.callback(Output("command-output", "children"), Input("command-result", "data")) + def _render_output(payload): + return _format_feedback(payload) + + @self.app.callback( + Output("retrieve-state", "data", allow_duplicate=True), + Input("command-result", "data"), + State("submit-state", "data"), + State("retrieve-state", "data"), + prevent_initial_call=True, + ) + def _sync_retrieve_state(payload, submit_state, retrieve_state): + if not isinstance(payload, dict): + return dash.no_update + if payload.get("operation") == "report-request": + current_state = copy.deepcopy(retrieve_state) if isinstance(retrieve_state, dict) else {} + submit_payload = submit_state if isinstance(submit_state, dict) else {} + current_state["workdir"] = payload.get("workdir") or current_state.get("workdir") or submit_payload.get("workdir") or os.getcwd() + current_state["workflow_id"] = payload.get("workflow_id") or current_state.get("workflow_id") or submit_payload.get("workflow_id") or "" + current_state["workflow_ids"] = payload.get("workflow_ids") or current_state.get("workflow_ids") or submit_payload.get("workflow_ids") or [] + current_state["global_file"] = payload.get("global_file") or current_state.get("global_file") or submit_payload.get("global_file") or "global.json" + current_state["param_file"] = payload.get("param_file") or current_state.get("param_file") or submit_payload.get("param_file") or "param.json" + current_state["pending_report"] = True + return current_state + if not _is_retrieve_feedback(payload): + return dash.no_update + state_payload = submit_state if isinstance(submit_state, dict) else {} + return { + "status": "running", + "workdir": payload.get("workdir") or state_payload.get("workdir") or os.getcwd(), + "workflow_id": payload.get("workflow_id") or state_payload.get("workflow_id") or "", + "workflow_ids": payload.get("workflow_ids") or state_payload.get("workflow_ids") or [], + "global_file": payload.get("global_file") or state_payload.get("global_file") or "global.json", + "param_file": payload.get("param_file") or state_payload.get("param_file") or "param.json", + "log_file": payload.get("log_file", ""), + "status_file": payload.get("status_file", ""), + "command": payload.get("command", ""), + "pending_report": bool(payload.get("pending_report")), + } + + @self.app.callback( + Output("command-result", "data", allow_duplicate=True), + Input("submit-structure-upload", "contents"), + State("submit-structure-upload", "filename"), + State("submit-workdir", "value"), + prevent_initial_call=True, + ) + def _handle_structure_upload(upload_contents, upload_filenames, submit_workdir): + workdir = _normalize_workdir(submit_workdir) + try: + saved_files = _save_uploaded_files(upload_contents, upload_filenames, workdir, target_subdir="confs") + except Exception as exc: + return _build_feedback(f"Structure upload failed: {exc}") + + if not saved_files: + return _build_feedback("No uploaded structure files received.") + + return _build_feedback( + f"Uploaded {len(saved_files)} structure file(s) to {os.path.join(workdir, 'confs')}: " + ", ".join(saved_files), + ok=True, + ) + + @self.app.callback( + Output("command-result", "data", allow_duplicate=True), + Output("submit-param-file", "value", allow_duplicate=True), + Output("submit-param-editor", "value", allow_duplicate=True), + Output("submit-structures", "options", allow_duplicate=True), + Output("submit-structures", "value", allow_duplicate=True), + Output("submit-relax-check", "value", allow_duplicate=True), + Output("submit-properties-check", "options", allow_duplicate=True), + Output("submit-properties-check", "value", allow_duplicate=True), + Output("submit-interaction-type", "options", allow_duplicate=True), + Output("submit-interaction-type", "value", allow_duplicate=True), + Output("submit-interaction-model", "options", allow_duplicate=True), + Output("submit-interaction-model", "value", allow_duplicate=True), + Output("submit-interaction-incar", "value", allow_duplicate=True), + Output("submit-interaction-table", "data", allow_duplicate=True), + Input("submit-file-upload", "contents"), + State("submit-file-upload", "filename"), + State("submit-workdir", "value"), + State("submit-profile", "value"), + prevent_initial_call=True, + ) + def _handle_file_upload(upload_contents, upload_filenames, submit_workdir, submit_profile): + workdir = _normalize_workdir(submit_workdir) + try: + saved_files = _save_uploaded_files(upload_contents, upload_filenames, workdir, target_subdir="") + except Exception as exc: + return (_build_feedback(f"File upload failed: {exc}"),) + (dash.no_update,) * 13 + + if not saved_files: + return (_build_feedback("No uploaded files received."),) + (dash.no_update,) * 13 + + param_file, param_text = _find_param_fallback_file(workdir, preferred_files=saved_files) + param_message = "" + if param_file: + param_message = f" Using {param_file} as submit parameter file." + + feedback = _build_feedback( + f"Uploaded {len(saved_files)} file(s) to {workdir}: " + ", ".join(saved_files) + param_message, + ok=True, + ) + if not param_file: + return (feedback,) + (dash.no_update,) * 13 + return ( + feedback, + param_file, + param_text, + *_param_control_output_values(workdir, param_text, submit_profile), + ) + + @self.app.callback( + Output("manage-log-content", "children"), + Input("manage-log-refresh", "n_clicks"), + Input("manage-log-interval", "n_intervals"), + State("submit-workdir", "value"), + ) + def _update_manage_log(_clicks, _n_intervals, submit_workdir): + return _read_log_tail(workdir=submit_workdir) + + def run(self) -> None: + host_for_browser = "127.0.0.1" if self.host in {"0.0.0.0", "::"} else self.host + url = f"http://{host_for_browser}:{self.port}/" + if self.open_browser: + Timer(1.0, lambda: webbrowser.open(url)).start() + print(f"APEX GUI server running at {url}") + self.app.run(host=self.host, port=self.port, debug=False, use_reloader=False) + + +def gui_from_args(host: str = DEFAULT_HOST, port: int = DEFAULT_PORT, open_browser: bool = True) -> None: + print("-------APEX GUI Mode-------") + ApexGuiApp(host=host, port=port, open_browser=open_browser).run() diff --git a/apex/gui_background.py b/apex/gui_background.py new file mode 100644 index 00000000..9db8e5ff --- /dev/null +++ b/apex/gui_background.py @@ -0,0 +1,151 @@ +import argparse +import json +import os +import subprocess +import sys +import traceback +from typing import List, Sequence + + +def _append_log(log_file: str, message: str) -> None: + os.makedirs(os.path.dirname(log_file) or ".", exist_ok=True) + with open(log_file, "a", encoding="utf-8") as log_fp: + log_fp.write(message) + log_fp.flush() + + +def _write_status(status_file: str, code: int) -> None: + os.makedirs(os.path.dirname(status_file) or ".", exist_ok=True) + with open(status_file, "w", encoding="utf-8") as fp: + fp.write(str(code)) + + +def run_submit_group(meta_path: str, log_file: str, status_file: str) -> int: + exit_codes: List[int] = [] + try: + with open(meta_path, "r", encoding="utf-8") as fp: + meta = json.load(fp) + jobs = meta.get("submit_jobs", []) + _append_log(log_file, f"[apex-gui] submit group {meta.get('group_id', '')} start\n") + procs = [] + with open(log_file, "a", encoding="utf-8") as log_fp: + for job in jobs: + args = [ + sys.executable, + "-m", + "apex", + "submit", + job["param_file"], + "-c", + job["global_file"], + "-s", + "-n", + job["workflow_name"], + ] + for label in job.get("labels", []): + args.extend(["-l", label]) + log_fp.write( + f"[apex-gui] launch batch {job.get('batch_index')}/{job.get('batch_total')}: {' '.join(args)}\n" + ) + log_fp.flush() + procs.append( + ( + job, + subprocess.Popen( + args, + stdout=log_fp, + stderr=subprocess.STDOUT, + cwd=job["workdir"], + text=True, + ), + ) + ) + for job, proc in procs: + code = proc.wait() + exit_codes.append(code) + log_fp.write( + f"[apex-gui] batch {job.get('batch_index')}/{job.get('batch_total')} exited with code {code}\n" + ) + log_fp.flush() + final_code = 0 if all(code == 0 for code in exit_codes) else 1 + _append_log(log_file, f"[apex-gui] submit group done with code {final_code}\n") + except Exception: + final_code = 1 + _append_log(log_file, traceback.format_exc()) + _write_status(status_file, final_code) + return final_code + + +def run_retrieve_group( + workdir: str, + global_file: str, + log_file: str, + status_file: str, + workflow_ids: Sequence[str], +) -> int: + codes: List[int] = [] + try: + os.makedirs(os.path.dirname(log_file) or ".", exist_ok=True) + with open(log_file, "a", encoding="utf-8") as log_fp: + for idx, workflow_id in enumerate(workflow_ids, start=1): + log_fp.write(f"[apex-gui] retrieve workflow {idx}/{len(workflow_ids)}: {workflow_id}\n") + log_fp.flush() + args = [ + sys.executable, + "-m", + "apex", + "retrieve", + "-i", + workflow_id, + "-w", + workdir, + "-c", + global_file, + ] + codes.append( + subprocess.call( + args, + stdout=log_fp, + stderr=subprocess.STDOUT, + cwd=workdir, + text=True, + ) + ) + final_code = 0 if all(code == 0 for code in codes) else 1 + except Exception: + final_code = 1 + _append_log(log_file, traceback.format_exc()) + _write_status(status_file, final_code) + return final_code + + +def main(argv: Sequence[str] = None) -> int: + parser = argparse.ArgumentParser(description="Background helpers for apex gui.") + subparsers = parser.add_subparsers(dest="command", required=True) + + submit_parser = subparsers.add_parser("submit-group") + submit_parser.add_argument("meta_path") + submit_parser.add_argument("log_file") + submit_parser.add_argument("status_file") + + retrieve_parser = subparsers.add_parser("retrieve") + retrieve_parser.add_argument("workdir") + retrieve_parser.add_argument("global_file") + retrieve_parser.add_argument("log_file") + retrieve_parser.add_argument("status_file") + retrieve_parser.add_argument("workflow_ids", nargs="+") + + args = parser.parse_args(list(argv) if argv is not None else None) + if args.command == "submit-group": + return run_submit_group(args.meta_path, args.log_file, args.status_file) + return run_retrieve_group( + args.workdir, + args.global_file, + args.log_file, + args.status_file, + args.workflow_ids, + ) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/apex/main.py b/apex/main.py index 8009127d..c4f5e9d5 100644 --- a/apex/main.py +++ b/apex/main.py @@ -1,13 +1,16 @@ import argparse +import re import logging import os import datetime +import time from typing import List from dflow import ( Workflow, query_workflows, - download_artifact + download_artifact, + config, ) from apex import ( @@ -81,6 +84,12 @@ def parse_args(): type=str, default=None, help="(Optional) Specify name of the workflow", ) + parser_submit.add_argument( + "-l", "--label", + action="append", + default=None, + help="(Optional) Workflow label in key=value form; may be provided multiple times.", + ) ########################################## # Do single step locally @@ -132,6 +141,11 @@ def parse_args(): default='./global.json', help="The json file to config workflow", ) + parser_retrieve.add_argument( + "-d", "--debug", + action="store_true", + help="Retrieve failed-step diagnostic artifacts in dflow debug mode", + ) ########################################## ### dflow operations @@ -307,6 +321,12 @@ def parse_args(): default=None, help="retry a step in a running workflow with step ID (experimental)", ) + parser_retry.add_argument( + "-c", "--config", + type=str, nargs='?', + default='./global.json', + help="The json file to config workflow", + ) # resume workflow parser_resume = subparsers.add_parser( "resume", @@ -457,6 +477,141 @@ def parse_args(): default='.', help="(Optional) Working directory or json file path to be reported", ) + parser_report.add_argument( + "--no-browser", + action="store_true", + help="Do not automatically open the report in a browser", + ) + parser_report.add_argument( + "-H", "--host", + type=str, + default="127.0.0.1", + help="Host for the report Dash server", + ) + parser_report.add_argument( + "-p", "--port", + type=int, + default=8070, + help="Port for the report Dash server", + ) + + ########################################## + # RSS + parser_rss = subparsers.add_parser( + "rss", + help="Generate RSS structures from an rss.json config", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + parser_rss.add_argument( + "rss_json", type=str, + help="Path to rss json config file", + ) + + ########################################## + # Preview GIFs + parser_preview = subparsers.add_parser( + "preview", + help="Generate preview GIFs from param_props JSON files", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + parser_preview.add_argument( + "parameters", + type=str, + nargs='+', + help="param_props JSON files, e.g. param_props_gamma*.json", + ) + parser_preview.add_argument( + "--gif-fps", + type=int, + default=8, + help="GIF frames per second", + ) + parser_preview.add_argument( + "--gif-dpi", + type=int, + default=140, + help="GIF rendering DPI", + ) + parser_preview.add_argument( + "--gif-padding", + type=float, + default=0.30, + help="Relative x/y padding ratio around the global bounds", + ) + parser_preview.add_argument( + "--gif-xshift", + type=float, + default=0.0, + help="Shift the rendered viewport horizontally by a fraction of the data span", + ) + parser_preview.add_argument( + "--gif-yshift", + type=float, + default=0.0, + help="Shift the rendered viewport vertically by a fraction of the data span; positive values move the structure downward", + ) + + ########################################## + # GUI + parser_gui = subparsers.add_parser( + "gui", + help="Launch a web-based graphical interface for common APEX commands", + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + parser_gui.add_argument( + "-H", "--host", + type=str, + default="127.0.0.1", + help="Host address used by the Dash GUI server", + ) + parser_gui.add_argument( + "-p", "--port", + type=int, + default=8060, + help="Port used by the Dash GUI server", + ) + parser_gui.add_argument( + "--no-browser", + action="store_true", + help="Do not automatically open a browser window", + ) + + ########################################## + # Account + parser_account = subparsers.add_parser( + "account", + help="Manage default Bohrium account and cloud config", + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + parser_account.add_argument( + "--show", + action="store_true", + help="Show saved default account config", + ) + parser_account.add_argument( + "--reset", + action="store_true", + help="Remove saved default account config", + ) + parser_account.add_argument( + "--non-interactive", + action="store_true", + help="Do not ask for input when no account fields are passed", + ) + parser_account.add_argument( + "--file", + type=str, + default=None, + help="Custom path for account config file", + ) + parser_account.add_argument("--dflow-host", dest="dflow_host", type=str, default=None) + parser_account.add_argument("--k8s-api-server", dest="k8s_api_server", type=str, default=None) + parser_account.add_argument("--batch-type", dest="batch_type", type=str, default=None) + parser_account.add_argument("--context-type", dest="context_type", type=str, default=None) + parser_account.add_argument("--email", type=str, default=None) + parser_account.add_argument("--password", type=str, default=None) + parser_account.add_argument("--program-id", dest="program_id", type=int, default=None) + parser_account.add_argument("--apex-image-name", dest="apex_image_name", type=str, default=None) parsed_args = parser.parse_args() # print help if no parser @@ -497,28 +652,441 @@ def format_time_delta(td: datetime.timedelta) -> str: return "%ds" % td.seconds -def get_id_from_record(work_dir: os.PathLike, operation_name: str = None) -> str: - logging.info(msg='No workflow_id is provided, will employ the latest workflow') +def _parse_workflow_log_record(line: str) -> dict | None: + parts = line.rstrip("\n").split("\t") + if len(parts) < 4: + return None + return { + "workflow_id": parts[0].strip(), + "operation": parts[1].strip(), + "timestamp": parts[2].strip(), + "workdir": parts[3].strip(), + "workflow_uid": parts[4].strip() if len(parts) > 4 else "", + } + + +def _format_workflow_log_record(record: dict) -> str: + return "\t".join( + [ + str(record.get("workflow_id", "")).strip(), + str(record.get("operation", "")).strip(), + str(record.get("timestamp", "")).strip(), + str(record.get("workdir", "")).strip(), + str(record.get("workflow_uid", "")).strip(), + ] + ).rstrip("\t") + "\n" + + +def _looks_like_workflow_uid(value: str) -> bool: + return bool( + re.fullmatch( + r"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}", + str(value or "").strip(), + ) + ) + + +def _load_workflow_log_records(work_dir: os.PathLike) -> list[dict]: workflow_log = os.path.join(work_dir, '.workflow.log') assert os.path.isfile(workflow_log), \ 'No workflow_id is provided and no .workflow.log file found in work_dir' - with open(workflow_log, 'r') as f: - try: - last_record = f.readlines()[-1] - except IndexError: - raise RuntimeError('No workflow_id is provided and .workflow.log file is empty!') - workflow_id = last_record.split('\t')[0] - assert workflow_id, 'No workflow ID for operation!' - logging.info(msg=f'Operating on workflow ID: {workflow_id}') + with open(workflow_log, 'r', encoding='utf-8', errors='replace') as f: + records = [_parse_workflow_log_record(line) for line in f if line.strip()] + records = [record for record in records if record] + if not records: + raise RuntimeError('No workflow_id is provided and .workflow.log file is empty!') + return records + + +def _resolve_workflow_reference( + work_dir: os.PathLike, + workflow_id: str | None = None, + operation_name: str | None = None, +) -> tuple[str, str]: + records = _load_workflow_log_records(work_dir) + selected_record = None + clean_workflow_id = str(workflow_id or "").strip() + if clean_workflow_id: + for record in reversed(records): + if clean_workflow_id in { + record.get("workflow_id", ""), + record.get("workflow_uid", ""), + }: + selected_record = record + break + if selected_record is None: + if _looks_like_workflow_uid(clean_workflow_id): + return "", clean_workflow_id + return clean_workflow_id, "" + if ( + _looks_like_workflow_uid(clean_workflow_id) + and clean_workflow_id == selected_record.get("workflow_uid", "").strip() + ): + resolved_uid = selected_record.get("workflow_uid", "").strip() + logging.info(msg=f'Operating on workflow UID: {resolved_uid}') + if operation_name: + updated_record = dict(selected_record) + updated_record["operation"] = operation_name + updated_record["timestamp"] = datetime.datetime.now().isoformat() + workflow_log = os.path.join(work_dir, '.workflow.log') + with open(workflow_log, 'a', encoding='utf-8') as f: + f.write(_format_workflow_log_record(updated_record)) + return "", resolved_uid + else: + logging.info(msg='No workflow_id is provided, will employ the latest workflow') + selected_record = records[-1] + + resolved_id = selected_record.get("workflow_id", "").strip() + resolved_uid = selected_record.get("workflow_uid", "").strip() + assert resolved_id, 'No workflow ID for operation!' + logging.info( + msg=( + f'Operating on workflow ID: {resolved_id}' + + (f' (UID: {resolved_uid})' if resolved_uid else '') + ) + ) if operation_name: - modified_record = last_record.split('\t') - modified_record[1] = operation_name - modified_record[2] = datetime.datetime.now().isoformat() - with open(workflow_log, 'a') as f: - f.write('\t'.join(modified_record)) + updated_record = dict(selected_record) + updated_record["operation"] = operation_name + updated_record["timestamp"] = datetime.datetime.now().isoformat() + workflow_log = os.path.join(work_dir, '.workflow.log') + with open(workflow_log, 'a', encoding='utf-8') as f: + f.write(_format_workflow_log_record(updated_record)) + return resolved_id, resolved_uid + + +def get_id_from_record(work_dir: os.PathLike, operation_name: str = None) -> str: + workflow_id, _ = _resolve_workflow_reference(work_dir, operation_name=operation_name) return workflow_id +def _format_workflow_query_error(wf_id: str, exc: Exception) -> str | None: + text = str(exc) + lower_text = text.lower() + status = getattr(exc, "status", None) + is_not_found = ( + status == 404 + or "(404)" in text + or "reason: not found" in lower_text + or '"not found"' in lower_text + ) + is_workflow_query = ( + "workflow" in lower_text + and ("not found" in lower_text or str(wf_id) in text) + ) + if not (is_not_found and is_workflow_query): + return None + + return ( + f"Workflow {wf_id!r} was not found by dflow/Argo.\n" + "The workflow may have been deleted, may not have been archived, or the " + "current config may point to a different dflow host/project/namespace.\n" + "Check the workflow ID in .workflow.log or pass the expected ID with -i. " + "If the ID is correct, verify the -c config file uses the same Bohrium/" + "dflow account and project that submitted the workflow." + ) + + +def _workflow_query_not_found_message(wf_ref: str, exc: Exception) -> str | None: + return _format_workflow_query_error(wf_ref, exc) + + +def _build_workflow_handle(workflow_id: str, workflow_uid: str = "", prefer_uid: bool = False) -> Workflow: + clean_uid = str(workflow_uid or "").strip() + clean_id = str(workflow_id or "").strip() + if (prefer_uid or not clean_id) and clean_uid: + return Workflow(uid=clean_uid) + return Workflow(id=clean_id) + + +def _run_with_workflow_fallback( + workflow_id: str, + workflow_uid: str, + action, +): + clean_id = str(workflow_id or "").strip() + clean_uid = str(workflow_uid or "").strip() + + if not clean_id and clean_uid: + wf_uid = _build_workflow_handle(clean_id, clean_uid, prefer_uid=True) + try: + return action(wf_uid, clean_uid, True) + except Exception as exc: + message = _workflow_query_not_found_message(clean_uid, exc) + if message: + raise SystemExit(message) from None + raise + + wf = _build_workflow_handle(clean_id, clean_uid, prefer_uid=False) + try: + return action(wf, clean_id, False) + except Exception as exc: + if not clean_uid: + message = _workflow_query_not_found_message(clean_id, exc) + if message: + raise SystemExit(message) from None + raise + if _workflow_query_not_found_message(clean_id, exc) is None: + raise + logging.warning( + "Workflow %r was not found by name; retrying by UID %s.", + clean_id, + clean_uid, + ) + + wf_uid = _build_workflow_handle(clean_id, clean_uid, prefer_uid=True) + try: + return action(wf_uid, clean_uid, True) + except Exception as exc: + message = _workflow_query_not_found_message(clean_uid, exc) + if message: + raise SystemExit( + message + + f"\nA fallback query by UID {clean_uid!r} was also attempted and failed." + ) from None + raise + + +def _query_keys_of_steps(wf: Workflow) -> List[str]: + return wf.query_keys_of_steps() + + +def _query_workflow(wf: Workflow): + return wf.query() + + +def _query_keys_of_steps_or_exit(wf: Workflow, wf_id: str) -> List[str]: + try: + return _query_keys_of_steps(wf) + except Exception as exc: + message = _format_workflow_query_error(wf_id, exc) + if message: + raise SystemExit(message) from None + raise + + +def _query_workflow_or_exit(wf: Workflow, wf_id: str): + try: + return _query_workflow(wf) + except Exception as exc: + message = _format_workflow_query_error(wf_id, exc) + if message: + raise SystemExit(message) from None + raise + + +_ARTIFACT_NOT_IN_STORAGE = "the artifact does not exist in the storage" +_TRANSIENT_DOWNLOAD_MARKERS = ( + "connection", + "connect", + "timeout", + "timed out", + "temporarily unavailable", + "network", + "name resolution", + "dns", + "reset by peer", + "remote disconnected", + "broken pipe", + "ssl", + "proxy", +) + + +def _is_missing_artifact_error(exc: Exception) -> bool: + return _ARTIFACT_NOT_IN_STORAGE in str(exc).lower() + + +def _is_transient_download_error(exc: Exception) -> bool: + message = str(exc).lower() + return any(marker in message for marker in _TRANSIENT_DOWNLOAD_MARKERS) + + +def _download_artifact_with_retry(artifact, path, retries: int = 3, delay: int = 10): + last_exc = None + for attempt in range(1, retries + 1): + try: + return download_artifact(artifact=artifact, path=path) + except Exception as exc: + last_exc = exc + if _is_missing_artifact_error(exc) or not _is_transient_download_error(exc): + raise RuntimeError(f"Artifact download failed without retry: {exc}") from exc + if attempt >= retries: + break + logging.warning( + "Artifact download failed (%s/%s): %s. Retrying in %ss...", + attempt, + retries, + exc, + delay, + ) + time.sleep(delay) + raise RuntimeError( + f"Artifact download failed after {retries} attempt(s): {last_exc}" + ) from last_exc + + +def _resolve_cli_workflow_reference( + work_dir: os.PathLike | None, + workflow_id: str | None, + operation_name: str | None = None, +) -> tuple[str, str]: + clean_workflow_id = str(workflow_id or "").strip() + if work_dir: + workflow_log = os.path.join(work_dir, '.workflow.log') + if clean_workflow_id and not os.path.isfile(workflow_log): + if _looks_like_workflow_uid(clean_workflow_id): + return "", clean_workflow_id + return clean_workflow_id, "" + return _resolve_workflow_reference( + work_dir=work_dir, + workflow_id=clean_workflow_id or None, + operation_name=operation_name, + ) + return clean_workflow_id, "" + + +def _safe_get(obj, key, default=None): + if isinstance(obj, dict): + return obj.get(key, default) + return getattr(obj, key, default) + + +def _safe_parameter_value(step, name): + inputs = _safe_get(step, "inputs", {}) or {} + parameters = _safe_get(inputs, "parameters", {}) or {} + parameter = _safe_get(parameters, name) + if parameter is None: + return None + value = _safe_get(parameter, "value", parameter) + return str(value) if value not in (None, "") else None + + +def _directory_has_entries(path: str) -> bool: + if not os.path.isdir(path): + return False + try: + with os.scandir(path) as entries: + return any(True for _ in entries) + except OSError: + return False + + +def _retrieve_existing_result_dir(step, key: str, work_dir: str): + if str(key).startswith("propertycal-"): + path_to_prop = _safe_parameter_value(step, "path_to_prop") + if path_to_prop: + target = os.path.join(work_dir, path_to_prop) + return target if _directory_has_entries(target) else None + return None + + if str(key).startswith("relaxcal-") or key == "relaxationcal": + flow_id = _safe_parameter_value(step, "flow_id") + if flow_id: + target = os.path.join(work_dir, flow_id, "relaxation") + return target if _directory_has_entries(target) else None + return None + + +def _get_step_artifacts(step): + outputs = _safe_get(step, "outputs") + if outputs is None: + return {} + return _safe_get(outputs, "artifacts", {}) or {} + + +def _sanitize_path_token(text: str) -> str: + cleaned = "".join(ch if (ch.isalnum() or ch in "._-") else "-" for ch in str(text)) + return cleaned.strip("-") or "unknown" + + +def _collect_step_with_children(wf_info, root_step): + all_steps = [root_step] + queue = [root_step] + seen = set() + while queue: + step = queue.pop(0) + step_id = _safe_get(step, "id") + if not step_id or step_id in seen: + continue + seen.add(step_id) + try: + children = wf_info.get_step(parent_id=step_id, sort_by_generation=True) + except Exception: + children = [] + all_steps.extend(children) + queue.extend(children) + return all_steps + + +def _is_retrievable_result_step_key(key: str) -> bool: + prefix = str(key).split("-")[0] + return prefix in {"propertycal", "relaxcal"} or key == "relaxationcal" + + +def _should_retrieve_failure_artifacts(debug_requested: bool = False) -> bool: + return bool(debug_requested or config.get("mode") == "debug") + + +def _download_failure_artifacts_for_step(wf_info, root_step, key, work_dir): + preferred_names = { + "main-logs", + "main_logs", + "backward_dir", + "retrieve_path", + "output_all", + "output_work_path", + "task_paths", + } + related_steps = _collect_step_with_children(wf_info, root_step) + downloaded = 0 + seen = set() + for step in related_steps: + step_id = _safe_get(step, "id", "step") + step_name = _safe_get(step, "displayName", _safe_get(step, "name", step_id)) + artifacts = _get_step_artifacts(step) + for art_name, artifact in artifacts.items(): + if art_name.startswith("dflow_"): + continue + if art_name not in preferred_names: + continue + key_tuple = (str(step_id), str(art_name)) + if key_tuple in seen: + continue + seen.add(key_tuple) + + target_dir = os.path.join( + work_dir, + ".failed-artifacts", + _sanitize_path_token(key), + _sanitize_path_token(step_name), + _sanitize_path_token(art_name), + ) + os.makedirs(target_dir, exist_ok=True) + if _directory_has_entries(target_dir): + logging.info( + "Skip retrieving failure artifact %s for step %s (%s) " + "because %s already contains files.", + art_name, + step_name, + key, + target_dir, + ) + continue + try: + _download_artifact_with_retry(artifact=artifact, path=target_dir) + downloaded += 1 + except Exception as exc: + logging.warning( + "Failed to download artifact %s for step %s (%s): %s", + art_name, + step_name, + key, + exc, + ) + return downloaded + + def main(): # logging logging.basicConfig(level=logging.INFO) @@ -533,7 +1101,8 @@ def main(): indicated_flow_type=args.flow, flow_name=args.name, submit_only=args.submit_only, - is_debug=args.debug + is_debug=args.debug, + labels=args.label, ) elif args.cmd == "list": config_dflow(args.config) @@ -555,13 +1124,16 @@ def main(): format_print_table(t) elif args.cmd == "get": config_dflow(args.config) - wf_id = args.id - if not wf_id: - wf_id = get_id_from_record(args.work, 'get') - wf = Workflow(id=wf_id) - info = wf.query() + wf_id, wf_uid = _resolve_cli_workflow_reference(args.work, args.id, 'get') + info = _run_with_workflow_fallback( + wf_id, + wf_uid, + lambda wf, _wf_ref, _used_uid: _query_workflow(wf), + ) t = [] t.append(["Name:", info.id]) + if getattr(info, "uid", None): + t.append(["UID:", info.uid]) t.append(["Status:", info.status.phase]) t.append(["Created:", info.metadata.creationTimestamp]) t.append(["Started:", info.status.startedAt]) @@ -599,10 +1171,16 @@ def main(): if type is not None: type = type.split(",") wf = Workflow(id=wf_id) - if key is not None: - steps = wf.query_step_by_key(key, name, phase, id, type) - else: - steps = wf.query_step(name, key, phase, id, type) + try: + if key is not None: + steps = wf.query_step_by_key(key, name, phase, id, type) + else: + steps = wf.query_step(name, key, phase, id, type) + except Exception as exc: + message = _format_workflow_query_error(wf_id, exc) + if message: + raise SystemExit(message) from None + raise for step in steps: if step.type in ["StepGroup"]: continue @@ -638,42 +1216,35 @@ def main(): print() elif args.cmd == "getkeys": config_dflow(args.config) - wf_id = args.id - if not wf_id: - wf_id = get_id_from_record(args.work, 'getkeys') - wf = Workflow(id=wf_id) - keys = wf.query_keys_of_steps() + wf_id, wf_uid = _resolve_cli_workflow_reference(args.work, args.id, 'getkeys') + keys = _run_with_workflow_fallback( + wf_id, + wf_uid, + lambda wf, _wf_ref, _used_uid: _query_keys_of_steps(wf), + ) print("\n".join(keys)) elif args.cmd == "delete": config_dflow(args.config) - wf_id = args.id - if not wf_id: - wf_id = get_id_from_record(args.work, 'delete') - wf = Workflow(id=wf_id) + wf_id, wf_uid = _resolve_cli_workflow_reference(args.work, args.id, 'delete') + wf = _build_workflow_handle(wf_id, wf_uid) wf.delete() print(f'Workflow deleted! (ID: {wf.id}, UID: {wf.uid})') elif args.cmd == "resubmit": config_dflow(args.config) - wf_id = args.id - if not wf_id: - wf_id = get_id_from_record(args.work, 'resubmit') - wf = Workflow(id=wf_id) + wf_id, wf_uid = _resolve_cli_workflow_reference(args.work, args.id, 'resubmit') + wf = _build_workflow_handle(wf_id, wf_uid) wf.resubmit() print(f'Workflow resubmitted... (ID: {wf.id}, UID: {wf.uid})') elif args.cmd == "resume": config_dflow(args.config) - wf_id = args.id - if not wf_id: - wf_id = get_id_from_record(args.work, 'resume') - wf = Workflow(id=wf_id) + wf_id, wf_uid = _resolve_cli_workflow_reference(args.work, args.id, 'resume') + wf = _build_workflow_handle(wf_id, wf_uid) wf.resume() print(f'Workflow resumed... (ID: {wf.id}, UID: {wf.uid})') elif args.cmd == "retry": config_dflow(args.config) - wf_id = args.id - if not wf_id: - wf_id = get_id_from_record(args.work, 'retry') - wf = Workflow(id=wf_id) + wf_id, wf_uid = _resolve_cli_workflow_reference(args.work, args.id, 'retry') + wf = _build_workflow_handle(wf_id, wf_uid) if args.step is not None: wf.retry_steps(args.step.split(",")) else: @@ -681,51 +1252,85 @@ def main(): print(f'Workflow retried... (ID: {wf.id}, UID: {wf.uid})') elif args.cmd == "stop": config_dflow(args.config) - wf_id = args.id - if not wf_id: - wf_id = get_id_from_record(args.work, 'stop') - wf = Workflow(id=wf_id) + wf_id, wf_uid = _resolve_cli_workflow_reference(args.work, args.id, 'stop') + wf = _build_workflow_handle(wf_id, wf_uid) wf.stop() print(f'Workflow stopped! (ID: {wf.id}, UID: {wf.uid})') elif args.cmd == "suspend": config_dflow(args.config) - wf_id = args.id - if not wf_id: - wf_id = get_id_from_record(args.work, 'suspend') - wf = Workflow(id=wf_id) + wf_id, wf_uid = _resolve_cli_workflow_reference(args.work, args.id, 'suspend') + wf = _build_workflow_handle(wf_id, wf_uid) wf.suspend() print(f'Workflow suspended... (ID: {wf.id}, UID: {wf.uid})') elif args.cmd == "terminate": config_dflow(args.config) - wf_id = args.id - if not wf_id: - wf_id = get_id_from_record(args.work, 'terminate') - wf = Workflow(id=wf_id) + wf_id, wf_uid = _resolve_cli_workflow_reference(args.work, args.id, 'terminate') + wf = _build_workflow_handle(wf_id, wf_uid) wf.terminate() elif args.cmd == 'retrieve': config_dflow(args.config) - wf_id = args.id - if not wf_id: - wf_id = get_id_from_record(args.work, 'retrieve') - wf = Workflow(id=wf_id) + wf_id, wf_uid = _resolve_cli_workflow_reference(args.work, args.id, 'retrieve') work_dir = args.work - all_keys = wf.query_keys_of_steps() - wf_info = wf.query() - download_keys = [key for key in all_keys if key.split('-')[0] == 'propertycal' or key == 'relaxationcal'] + all_keys, wf_info, query_ref = _run_with_workflow_fallback( + wf_id, + wf_uid, + lambda wf, _wf_ref, _used_uid: ( + _query_keys_of_steps(wf), + _query_workflow(wf), + _wf_ref, + ), + ) + download_keys = [key for key in all_keys if _is_retrievable_result_step_key(key)] task_left = len(download_keys) - print(f'Retrieving {task_left} workflow results {wf_id} to {work_dir}') + print(f'Retrieving {task_left} workflow results {query_ref} to {work_dir}') - for key in download_keys: + for index, key in enumerate(download_keys, start=1): step = wf_info.get_step(key=key)[0] task_left -= 1 - if step['phase'] == 'Succeeded': + phase = step['phase'] + print(f"Retrieving result {index}/{len(download_keys)}: {key}", flush=True) + if phase == 'Succeeded': + existing_result_dir = _retrieve_existing_result_dir(step, key, work_dir) + if existing_result_dir: + logging.info( + "Skip retrieving %s because %s already contains files.", + key, + existing_result_dir, + ) + continue logging.info(f"Retrieving {key}...({task_left} more left)") - download_artifact( - artifact=step.outputs.artifacts['retrieve_path'], - path=work_dir - ) + try: + _download_artifact_with_retry( + artifact=step.outputs.artifacts['retrieve_path'], + path=work_dir + ) + except Exception as exc: + logging.warning(f"Retrieve {key} failed: {exc}") else: - logging.warning(f"Step {key} with status: {step['phase']} will be skipping...({task_left} more left)") + if not _should_retrieve_failure_artifacts(args.debug): + logging.warning( + f"Step {key} with status: {phase} is not Succeeded; " + f"skip failed-artifact retrieval because debug mode is not enabled. " + f"({task_left} more left)" + ) + continue + logging.warning( + f"Step {key} with status: {phase} is not Succeeded; " + f"trying to retrieve failure artifacts in debug mode...({task_left} more left)" + ) + downloaded = _download_failure_artifacts_for_step( + wf_info=wf_info, + root_step=step, + key=key, + work_dir=work_dir, + ) + if downloaded == 0: + logging.warning(f"No retrievable failure artifacts found for {key}") + else: + logging.info( + f"Retrieved {downloaded} failure artifact groups for {key} " + f"under {os.path.join(work_dir, '.failed-artifacts')}" + ) elif args.cmd == 'do': header() do_step_from_args( @@ -749,7 +1354,31 @@ def main(): report_from_args( config_file=args.config, path_list=args.work, + open_browser=not args.no_browser, + host=args.host, + port=args.port, + ) + elif args.cmd == 'gui': + header() + from apex.gui import gui_from_args + + gui_from_args( + host=args.host, + port=args.port, + open_browser=not args.no_browser ) + elif args.cmd == 'account': + from apex.account import account_from_args + + account_from_args(args) + elif args.cmd == 'rss': + from apex.rss import rss_from_args + + rss_from_args(args.rss_json) + elif args.cmd == 'preview': + from apex.preview import preview_from_args + + preview_from_args(args) else: raise RuntimeError( f"unknown command {args.cmd}\n{parser.print_help()}" diff --git a/apex/op/RunLAMMPS.py b/apex/op/RunLAMMPS.py index fe6643ae..adbd4294 100644 --- a/apex/op/RunLAMMPS.py +++ b/apex/op/RunLAMMPS.py @@ -1,5 +1,7 @@ -import os, subprocess, logging +import datetime +import os, subprocess, logging, time from pathlib import Path +from monty.serialization import dumpfn, loadfn from dflow.python import ( OP, OPIO, @@ -31,22 +33,402 @@ def get_output_sign(cls): 'backward_dir': Artifact(Path, sub_path=False) }) + @classmethod + def _cleanup_model_links(cls, task_dir): + task_path = Path(task_dir) + inter_json = task_path / "inter.json" + if not inter_json.exists(): + return + + try: + inter_param = loadfn(inter_json) + except Exception as exc: + logging.warning(f"Failed to load inter.json for symlink cleanup: {exc}") + return + + model_spec = inter_param.get("model", []) + if isinstance(model_spec, str): + model_list = [model_spec] + elif isinstance(model_spec, list): + model_list = model_spec + else: + model_list = [] + + for model in model_list: + link_candidates = {task_path / model, task_path / Path(model).name} + for link_path in link_candidates: + if link_path.is_symlink() and not link_path.exists(): + link_path.unlink() + + @classmethod + def _utc_now(cls) -> str: + return datetime.datetime.now(datetime.timezone.utc).isoformat() + + @classmethod + def _classify_exit_code(cls, exit_code: int) -> dict: + if exit_code == 0: + return { + "state": "succeeded", + "reason": "command_exit_zero", + "message": "Command completed successfully.", + } + if exit_code == 124: + return { + "state": "failed", + "reason": "timeout", + "message": "Command exited with timeout code 124.", + } + if exit_code == 126: + return { + "state": "failed", + "reason": "command_not_executable", + "message": "Command was found but could not be executed.", + } + if exit_code == 127: + return { + "state": "failed", + "reason": "command_not_found", + "message": "Command executable was not found.", + } + if exit_code in (130, 143): + return { + "state": "failed", + "reason": "terminated", + "message": f"Command was terminated by signal-like exit code {exit_code}.", + } + if exit_code == 137: + return { + "state": "failed", + "reason": "killed_or_oom", + "message": "Command was killed with exit code 137, commonly SIGKILL/OOM/preemption.", + } + if exit_code > 128: + return { + "state": "failed", + "reason": "signal_exit", + "message": f"Command exited with code {exit_code}, likely signal {exit_code - 128}.", + } + return { + "state": "failed", + "reason": "nonzero_exit", + "message": f"Command exited with non-zero code {exit_code}.", + } + + @classmethod + def _write_task_status( + cls, + status_file: Path, + *, + exit_code: int, + cmd: str, + elapsed: float, + started_at: str, + finished_at: str, + debug_log: str = ".debug.log", + attempts: int = 1, + retry_reason: str | None = None, + ): + status = cls._classify_exit_code(exit_code) + payload = { + **status, + "exit_code": int(exit_code), + "run_command": cmd, + "started_at": started_at, + "finished_at": finished_at, + "elapsed_seconds": elapsed, + "debug_log": debug_log, + "attempts": int(attempts), + } + if retry_reason: + payload["retry_reason"] = retry_reason + dumpfn( + payload, + status_file, + indent=4, + ) + + @classmethod + def _append_debug(cls, debug_file: Path, text: str): + with open(debug_file, "a") as fp: + fp.write(text) + if not text.endswith("\n"): + fp.write("\n") + + @classmethod + def _safe_cmd(cls, cmd: str, timeout: int = 10) -> str: + try: + out = subprocess.check_output( + cmd, + shell=True, + stderr=subprocess.STDOUT, + timeout=timeout, + text=True, + ) + return out.rstrip() + except Exception as exc: + return f"" + + @classmethod + def _tail_file(cls, path: Path, n_lines: int = 80) -> str: + if not path.exists(): + return f"{path.name}: missing" + try: + with open(path, "r", errors="replace") as fp: + lines = fp.readlines() + return "".join(lines[-n_lines:]).rstrip() + except Exception as exc: + return f"{path.name}: unable to read: {exc}" + + @classmethod + def _directory_inventory(cls, task_dir: Path, max_entries: int = 300) -> str: + entries = [] + for path in sorted(task_dir.rglob("*")): + rel = path.relative_to(task_dir) + if len(rel.parts) > 3: + continue + if path.is_dir(): + continue + if path.is_symlink(): + entries.append(f"{rel}: symlink -> {os.readlink(path)} exists={path.exists()}") + else: + entries.append(f"{rel}: size={path.stat().st_size}") + if len(entries) >= max_entries: + entries.append(f"") + break + return "\n".join(entries) if entries else "" + + @classmethod + def _metadata_summary(cls, task_dir: Path) -> str: + lines = [] + for path in sorted(task_dir.glob("*.json")): + try: + data = loadfn(path) + except Exception as exc: + lines.append(f"{path.name}: unable to parse JSON: {exc}") + continue + if isinstance(data, dict): + keys = [ + "type", + "property", + "method", + "cal_type", + "role", + "pair_id", + "strain_component", + "strain_value", + "temperature", + "exit_code", + ] + summary = {key: data[key] for key in keys if key in data} + lines.append(f"{path.name}: {summary}") + else: + lines.append(f"{path.name}: {type(data).__name__}") + return "\n".join(lines) if lines else "" + + @classmethod + def _log_candidates(cls, task_dir: Path) -> list[Path]: + names = [ + ".debug.stderr", + ".debug.stdout", + "outlog", + "errlog", + "log.lammps", + "run.log", + "main.log", + "log", + "apex_task_status.json", + ] + candidates = [task_dir / name for name in names] + candidates.extend(sorted(task_dir.glob("*.log"))) + candidates.extend(sorted(task_dir.glob("log.*"))) + deduped = [] + seen = set() + for path in candidates: + if path in seen: + continue + seen.add(path) + deduped.append(path) + return deduped + + @classmethod + def _is_lammps_header_only_log(cls, path: Path) -> bool: + if not path.is_file(): + return False + try: + lines = [ + line.strip() + for line in path.read_text(errors="replace").splitlines() + if line.strip() + ] + except Exception: + return False + return len(lines) == 1 and lines[0].startswith("LAMMPS (") + + @classmethod + def _is_header_only_lammps_failure(cls, task_dir: Path, exit_code: int) -> bool: + if exit_code == 0: + return False + if any((task_dir / name).exists() for name in ["CONTCAR", "dump.relax", "stress_timeseries.txt"]): + return False + return ( + cls._is_lammps_header_only_log(task_dir / "log.lammps") + or cls._is_lammps_header_only_log(task_dir / "outlog") + ) + + @classmethod + def _archive_retry_file(cls, path: Path, attempt: int): + if not path.exists(): + return + target = path.with_name(f"{path.name}.attempt{attempt}") + try: + if target.exists(): + target.unlink() + path.rename(target) + except Exception as exc: + logging.warning(f"Could not archive retry file {path}: {exc}") + + @classmethod + def _prepare_retry(cls, task_dir: Path, attempt: int): + for name in ["log.lammps", "outlog", "errlog", "run.log", "dump.relax", "stress_timeseries.txt"]: + cls._archive_retry_file(task_dir / name, attempt) + + @classmethod + def _resource_snapshot(cls) -> str: + lines = [] + lines.append("$ date") + lines.append(cls._safe_cmd("date -Is")) + lines.append("$ pwd") + lines.append(os.getcwd()) + lines.append("$ df -h .") + lines.append(cls._safe_cmd("df -h .")) + lines.append("$ free -h || vm_stat") + lines.append(cls._safe_cmd("free -h || vm_stat")) + lines.append("$ nvidia-smi") + lines.append(cls._safe_cmd("nvidia-smi --query-gpu=index,name,memory.total,memory.used,utilization.gpu --format=csv,noheader,nounits || nvidia-smi", timeout=5)) + return "\n".join(lines) + + @classmethod + def _write_initial_debug(cls, debug_file: Path, task_dir: Path, cmd: str): + selected_env = [ + "PATH", + "LD_LIBRARY_PATH", + "OMP_NUM_THREADS", + "CUDA_VISIBLE_DEVICES", + "DP_INFER_BATCH_SIZE", + ] + cls._append_debug(debug_file, "# APEX LAMMPS debug log\n") + cls._append_debug(debug_file, "## Command\n") + cls._append_debug(debug_file, cmd) + cls._append_debug(debug_file, "\n## Environment\n") + for key in selected_env: + cls._append_debug(debug_file, f"{key}={os.environ.get(key, '')}") + cls._append_debug(debug_file, "\n## Limits\n") + cls._append_debug(debug_file, cls._safe_cmd("ulimit -a")) + cls._append_debug(debug_file, "\n## Initial resources\n") + cls._append_debug(debug_file, cls._resource_snapshot()) + cls._append_debug(debug_file, "\n## Metadata summary\n") + cls._append_debug(debug_file, cls._metadata_summary(task_dir)) + cls._append_debug(debug_file, "\n## Initial file inventory\n") + cls._append_debug(debug_file, cls._directory_inventory(task_dir)) + + @classmethod + def _write_final_debug(cls, debug_file: Path, task_dir: Path, exit_code: int, elapsed: float): + cls._append_debug(debug_file, "\n## Final status\n") + cls._append_debug(debug_file, f"exit_code={exit_code}") + cls._append_debug(debug_file, f"elapsed_seconds={elapsed:.3f}") + cls._append_debug(debug_file, "\n## Final resources\n") + cls._append_debug(debug_file, cls._resource_snapshot()) + cls._append_debug(debug_file, "\n## Final file inventory\n") + cls._append_debug(debug_file, cls._directory_inventory(task_dir)) + cls._append_debug(debug_file, "\n## Log tails\n") + for path in cls._log_candidates(task_dir): + cls._append_debug(debug_file, f"\n### {path.name}\n") + cls._append_debug(debug_file, cls._tail_file(path)) + + @classmethod + def _run_command(cls, cmd: str, task_dir: Path) -> int: + stdout_path = task_dir / ".debug.stdout" + stderr_path = task_dir / ".debug.stderr" + stdout_path.touch() + stderr_path.touch() + return int(subprocess.call(cmd, shell=True)) + @OP.exec_sign_check def execute(self, op_in: OPIO) -> OPIO: cwd = os.getcwd() - os.chdir(op_in["input_lammps"]) - if os.path.exists("run_command"): - with open("run_command", 'r') as f: - cmd = f.read() - else: - cmd = op_in["run_command"] - exit_code = subprocess.call(cmd, shell=True) - if exit_code == 0: - logging.info("Call Lammps command successfully!") - else: - logging.warning(f"Call Lammps command failed with exit code: {exit_code}") + task_dir = Path(op_in["input_lammps"]).resolve() + status_file = task_dir / "apex_task_status.json" + + try: + os.chdir(task_dir) + if os.path.exists("run_command"): + with open("run_command", 'r') as f: + cmd = f.read() + else: + cmd = op_in["run_command"] + cmd = str(cmd).strip() + + debug_file = task_dir / ".debug.log" + if not cmd: + now = self._utc_now() + self._append_debug(debug_file, "# APEX LAMMPS debug log\n") + self._append_debug(debug_file, "## Command\n") + self._write_task_status( + status_file, + exit_code=127, + cmd=cmd, + elapsed=0.0, + started_at=now, + finished_at=now, + ) + self._write_final_debug(debug_file, task_dir, 127, 0.0) + self._cleanup_model_links(task_dir) + return OPIO({"backward_dir": op_in["input_lammps"]}) + self._write_initial_debug(debug_file, task_dir, cmd) + started_at = self._utc_now() + start = time.time() + retry_reason = None + attempts = 1 + max_attempts = int(os.environ.get("APEX_LAMMPS_HEADER_RETRY", "2")) + max_attempts = max(1, max_attempts) + exit_code = self._run_command(cmd, task_dir) + while ( + attempts < max_attempts + and self._is_header_only_lammps_failure(task_dir, exit_code) + ): + retry_reason = "header_only_lammps_log_after_nonzero_exit" + self._append_debug( + debug_file, + f"\n## Retry {attempts + 1}\n" + f"Retrying LAMMPS because exit_code={exit_code} and log.lammps/outlog " + "contains only the LAMMPS header.", + ) + self._prepare_retry(task_dir, attempts) + time.sleep(float(os.environ.get("APEX_LAMMPS_HEADER_RETRY_DELAY", "5"))) + attempts += 1 + exit_code = self._run_command(cmd, task_dir) + elapsed = time.time() - start + finished_at = self._utc_now() + self._write_task_status( + status_file, + exit_code=exit_code, + cmd=cmd, + elapsed=elapsed, + started_at=started_at, + finished_at=finished_at, + attempts=attempts, + retry_reason=retry_reason, + ) + self._write_final_debug(debug_file, task_dir, exit_code, elapsed) + if exit_code == 0: + logging.info("Call Lammps command successfully!") + else: + logging.warning(f"Call Lammps command failed with exit code: {exit_code}") + + self._cleanup_model_links(task_dir) + finally: + os.chdir(cwd) - os.chdir(cwd) op_out = OPIO({ "backward_dir": op_in["input_lammps"] }) diff --git a/apex/op/property_ops.py b/apex/op/property_ops.py index ddc5056f..6d09fe01 100644 --- a/apex/op/property_ops.py +++ b/apex/op/property_ops.py @@ -10,13 +10,33 @@ upload_packages ) from monty.serialization import dumpfn -from apex.utils import recursive_search +from apex.utils import recursive_search, apex_task_succeeded from apex.core.lib.utils import create_path from apex.core.calculator import LAMMPS_INTER_TYPE upload_packages.append(__file__) +def _load_task_status(status_path: Path): + if not status_path.is_file(): + return None + try: + return loadfn(status_path) + except Exception as exc: + return { + "state": "failed", + "reason": "invalid_task_status", + "message": f"Could not parse apex_task_status.json: {exc}", + "exit_code": None, + } + + +def _is_failed_task_status(status) -> bool: + if status is None: + return False + return status.get("state") != "succeeded" or status.get("exit_code") != 0 + + class PropsMake(OP): """ OP class for making calculation tasks (make property) @@ -61,7 +81,8 @@ def execute( cwd = Path.cwd() os.chdir(input_work_path) abs_path_to_prop = input_work_path / path_to_prop - if os.path.exists(abs_path_to_prop): + rerun_finished = prop_param.get("rerun_finished", True) + if os.path.exists(abs_path_to_prop) and rerun_finished: shutil.rmtree(abs_path_to_prop) create_path(str(abs_path_to_prop)) conf_path = abs_path_to_prop.parent @@ -91,6 +112,9 @@ def execute( prop = make_property_instance(prop_param, inter_param_prop) task_list = prop.make_confs(abs_path_to_prop, path_to_equi, do_refine) for kk in task_list: + if (not rerun_finished) and apex_task_succeeded(kk): + print(f"Skip preparing completed property task {kk} (apex_task_status.json state=succeeded, rerun_finished=False)") + continue poscar = os.path.join(kk, "POSCAR") inter = make_calculator(inter_param_prop, poscar) inter.make_potential_files(kk) @@ -105,17 +129,21 @@ def execute( task_list_name = {'task_list': glob.glob('task.*').sort()} dumpfn(task_list_name, 'task_list.json') os.chdir(input_work_path) - task_list_str = glob.glob(path_to_prop + '/' + 'task.*') - task_list_str.sort() - all_jobs = task_list + if rerun_finished: + all_jobs = task_list + else: + all_jobs = [task for task in task_list if not apex_task_succeeded(task)] + for task in sorted(set(task_list) - set(all_jobs)): + print(f"Skip running completed property task {task} (apex_task_status.json state=succeeded, rerun_finished=False)") njobs = len(all_jobs) - jobs = [pathlib.Path(job) for job in task_list] + jobs = [pathlib.Path(job) for job in all_jobs] + run_task_names = [os.path.join(path_to_prop, os.path.basename(job)) for job in all_jobs] os.chdir(cwd) op_out = OPIO({ "output_work_path": input_work_path, - "task_names": task_list_str, + "task_names": run_task_names, "njobs": njobs, "task_paths": jobs }) @@ -196,11 +224,38 @@ def execute(self, op_in: OPIO) -> OPIO: inter_param = prop_param["cal_setting"]["overwrite_interaction"] abs_path_to_prop = Path.cwd() / path_to_prop + lammps_failures = [] + for status_path in sorted(abs_path_to_prop.glob("task.*/apex_task_status.json")): + status = _load_task_status(status_path) + if _is_failed_task_status(status): + lammps_failures.append( + { + "task": str(status_path.parent), + "state": status.get("state"), + "reason": status.get("reason"), + "exit_code": status.get("exit_code"), + "message": status.get("message"), + } + ) + if lammps_failures: + dumpfn( + {"failed_tasks": lammps_failures}, + abs_path_to_prop / "failed_lammps_tasks.json", + indent=4, + ) + raise RuntimeError( + "LAMMPS failed for property task(s): " + + ", ".join(item["task"] for item in lammps_failures) + + ". Retrieved task directories contain apex_task_status.json " + "with failed status records, .debug.log, log.lammps, outlog, " + "and any partial output files." + ) + prop = make_property_instance(prop_param, inter_param) param_json = os.path.join(abs_path_to_prop, "param.json") param_dict = prop.parameter - param_dict.setdefault("skip", False) # default of "skip" is False - param_dict.pop("skip") + param_dict.pop("skip", None) + param_dict.pop("req_calc", None) dumpfn(param_dict, param_json) prop.compute( os.path.join(abs_path_to_prop, "result.json"), diff --git a/apex/op/relaxation_ops.py b/apex/op/relaxation_ops.py index c3c4a4f5..26502892 100644 --- a/apex/op/relaxation_ops.py +++ b/apex/op/relaxation_ops.py @@ -1,6 +1,7 @@ import os, glob, pathlib, shutil, subprocess from pathlib import Path from typing import List +from monty.serialization import loadfn from dflow.python import ( OP, OPIO, @@ -9,11 +10,59 @@ upload_packages ) from apex.core.calculator import LAMMPS_INTER_TYPE -from apex.utils import recursive_search +from apex.utils import recursive_search, apex_task_succeeded upload_packages.append(__file__) +def _load_task_status(status_path: str): + if not os.path.isfile(status_path): + return None + try: + return loadfn(status_path) + except Exception as exc: + return { + "state": "failed", + "reason": "invalid_task_status", + "message": f"Could not parse apex_task_status.json: {exc}", + "exit_code": None, + } + + +def _is_failed_task_status(status) -> bool: + if status is None: + return False + return status.get("state") != "succeeded" or status.get("exit_code") != 0 + + +def _check_relaxation_outputs(conf_dirs: List[str]) -> None: + failed = [] + for conf_dir in conf_dirs: + task_dir = os.path.join(conf_dir, "relaxation", "relax_task") + status_path = os.path.join(task_dir, "apex_task_status.json") + contcar = os.path.join(task_dir, "CONTCAR") + result = os.path.join(task_dir, "result.json") + status = _load_task_status(status_path) + if _is_failed_task_status(status): + reason = status.get("reason", "unknown") + exit_code = status.get("exit_code") + failed.append( + f"{task_dir} (LAMMPS failed: state={status.get('state')}, " + f"reason={reason}, exit_code={exit_code}; see apex_task_status.json, " + ".debug.log, and log.lammps)" + ) + elif not os.path.isfile(contcar): + failed.append(f"{task_dir} (missing CONTCAR)") + elif not os.path.isfile(result): + failed.append(f"{task_dir} (missing result.json)") + if failed: + raise RuntimeError( + "Relaxation failed or did not produce required output for task(s): " + + "; ".join(failed) + + ". Property steps require relaxation/relax_task/CONTCAR." + ) + + class RelaxMake(OP): """ OP class for making calculation tasks @@ -63,9 +112,14 @@ def execute( task_list = [] task_list_str = [] + rerun_finished = inter_parameter.get("rerun_finished", True) for ii in conf_dirs: conf_dir_global = os.path.join(work_d, ii) - task_list.append(os.path.join(conf_dir_global, 'relaxation/relax_task')) + task_dir = os.path.join(conf_dir_global, 'relaxation/relax_task') + if (not rerun_finished) and apex_task_succeeded(task_dir): + print(f"Skip running completed relaxation task {task_dir} (apex_task_status.json state=succeeded, rerun_finished=False)") + continue + task_list.append(task_dir) task_list_str.append(os.path.join(ii, 'relaxation')) all_jobs = task_list @@ -140,6 +194,7 @@ def execute(self, op_in: OPIO) -> OPIO: conf_dirs.extend(glob.glob(conf)) conf_dirs = list(set(conf_dirs)) conf_dirs.sort() + _check_relaxation_outputs(conf_dirs) # remove potential files inter_files_name = [] diff --git a/apex/preview.py b/apex/preview.py new file mode 100644 index 00000000..9b7321cd --- /dev/null +++ b/apex/preview.py @@ -0,0 +1,478 @@ +#!/usr/bin/env python3 + +from __future__ import annotations + +import argparse +import glob +import os +import re +import shutil +import sys +import tempfile +from copy import deepcopy +from pathlib import Path +from typing import Iterable, List, Optional + +import numpy as np +from monty.serialization import loadfn + +from apex.core.common_prop import make_property_instance +from apex.utils import handle_prop_suffix + + +def _natural_key(path: str): + return [int(text) if text.isdigit() else text for text in re.split(r"(\d+)", path)] + + +def _resolve_path(base_dir: Path, path_text: str) -> str: + path = Path(path_text) + if path.is_absolute(): + return str(path) + return str((base_dir / path).resolve()) + + +def _resolve_interaction_paths(base_dir: Path, interaction: dict) -> dict: + resolved = deepcopy(interaction or {}) + for key in ("model", "incar", "potcar_prefix"): + value = resolved.get(key) + if isinstance(value, str) and value: + resolved[key] = _resolve_path(base_dir, value) + for key in ("potcars", "orb_files"): + mapping = resolved.get(key) + if isinstance(mapping, dict): + resolved[key] = { + item_key: _resolve_path(base_dir, item_value) + if isinstance(item_value, str) and item_value + else item_value + for item_key, item_value in mapping.items() + } + return resolved + + +def _resolve_structure_path(base_dir: Path, structure_glob: str) -> str: + matches = sorted(glob.glob(str((base_dir / structure_glob).resolve())), key=_natural_key) + if not matches: + raise FileNotFoundError(f"No structure matched: {structure_glob}") + return matches[0] + + +def _prepare_equilibrium_dir(structure_dir: str, temp_root: Path, label: str) -> str: + src_dir = Path(structure_dir) + equi_dir = temp_root / label / "relaxation" / "relax_task" + equi_dir.mkdir(parents=True, exist_ok=True) + + candidates = [src_dir / "CONTCAR", src_dir / "POSCAR", src_dir / "STRU"] + source_file = next((path for path in candidates if path.is_file()), None) + if source_file is None: + raise FileNotFoundError( + f"Cannot find CONTCAR/POSCAR/STRU under {structure_dir}" + ) + + target_file = equi_dir / "CONTCAR" + shutil.copy2(source_file, target_file) + return str(equi_dir) + + +def _parse_gif_size(size_text: str): + try: + width_text, height_text = size_text.lower().split("x", 1) + width_px = int(width_text) + height_px = int(height_text) + except Exception as exc: + raise ValueError("--gif-size must be like WIDTHxHEIGHT, e.g. 1100x1100") from exc + if width_px <= 0 or height_px <= 0: + raise ValueError("--gif-size dimensions must be positive") + return width_px, height_px + + +def _structure_bounds(atoms, radii_scale: float): + try: + from ase.data import covalent_radii + except Exception as exc: + raise RuntimeError("GIF export requires ASE covalent radii data") from exc + + xy = atoms.get_positions()[:, :2] + radii = covalent_radii[atoms.get_atomic_numbers()] * radii_scale + low = (xy - radii[:, None]).min(axis=0) + high = (xy + radii[:, None]).max(axis=0) + x_min, y_min = low + x_max, y_max = high + return x_min, x_max, y_min, y_max + + +def _view_size( + bounds_list, + *, + canvas_aspect: float, + padding: float, +): + max_dx = 1e-6 + max_dy = 1e-6 + for x_min, x_max, y_min, y_max in bounds_list: + max_dx = max(max_dx, x_max - x_min) + max_dy = max(max_dy, y_max - y_min) + + padded_dx = max_dx * (1.0 + 2.0 * max(padding, 0.0)) + padded_dy = max_dy * (1.0 + 2.0 * max(padding, 0.0)) + + if padded_dx / padded_dy < canvas_aspect: + view_dy = padded_dy + view_dx = view_dy * canvas_aspect + else: + view_dx = padded_dx + view_dy = view_dx / canvas_aspect + + return view_dx, view_dy + + +def _centered_bbox( + bounds, + *, + view_size, + xshift: float, + yshift: float, +): + x_min, x_max, y_min, y_max = bounds + dx = max(x_max - x_min, 1e-6) + dy = max(y_max - y_min, 1e-6) + view_dx, view_dy = view_size + center_x = 0.5 * (x_min + x_max) + xshift * dx + center_y = 0.5 * (y_min + y_max) + yshift * dy + return ( + center_x - 0.5 * view_dx, + center_x + 0.5 * view_dx, + center_y - 0.5 * view_dy, + center_y + 0.5 * view_dy, + ) + + +class _ProgressBar: + def __init__(self, label: str, total: int, *, width: int = 30): + self.label = label + self.total = max(int(total), 0) + self.width = max(int(width), 1) + self.current = 0 + self._stream = sys.stderr + self._enabled = self.total > 0 + + def __enter__(self): + self.update(0) + return self + + def __exit__(self, exc_type, exc, tb): + if self._enabled: + if exc_type is None and self.current < self.total: + self.current = self.total + self._write() + self._stream.write("\n") + self._stream.flush() + + def update(self, step: int = 1): + if not self._enabled: + return + self.current = min(self.total, self.current + step) + self._write() + + def _write(self): + fraction = self.current / self.total if self.total else 1.0 + filled = int(round(self.width * fraction)) + bar = "#" * filled + "-" * (self.width - filled) + percent = int(round(100 * fraction)) + self._stream.write( + f"\r{self.label} [{bar}] {self.current}/{self.total} ({percent:3d}%)" + ) + self._stream.flush() + + +def _write_gif( + frames, + output_gif: str, + fps: int = 8, + size_text: str = "1100x1100", + dpi: int = 140, + padding: float = 0.30, + xshift: float = 0.0, + yshift: float = 0.0, + progress_label: Optional[str] = None, +): + try: + import imageio.v2 as imageio + import matplotlib + + matplotlib.use("Agg") + import matplotlib.pyplot as plt + from ase.visualize.plot import plot_atoms + except Exception as exc: + raise RuntimeError( + "GIF export requires imageio and matplotlib in the current environment" + ) from exc + + os.makedirs(os.path.dirname(os.path.abspath(output_gif)), exist_ok=True) + + width_px, height_px = _parse_gif_size(size_text) + figsize = (width_px / max(dpi, 1), height_px / max(dpi, 1)) + radii_scale = 0.35 + frame_bounds = [_structure_bounds(atoms, radii_scale) for atoms in frames] + view_size = _view_size( + frame_bounds, + canvas_aspect=width_px / height_px, + padding=padding, + ) + + images = [] + progress = _ProgressBar(progress_label, len(frames)) if progress_label else None + progress_context = progress if progress is not None else _nullcontext() + with progress_context as progress_bar: + for i, (atoms, bounds) in enumerate(zip(frames, frame_bounds)): + x_min, x_max, y_min, y_max = _centered_bbox( + bounds, + view_size=view_size, + xshift=xshift, + yshift=yshift, + ) + fig = plt.figure(figsize=figsize, dpi=dpi) + ax = fig.add_axes([0.0, 0.0, 1.0, 1.0]) + plot_atoms( + atoms, + ax, + radii=radii_scale, + rotation="0x,0y,0z", + show_unit_cell=1, + bbox=(x_min, y_min, x_max, y_max), + ) + ax.set_aspect("equal", adjustable="box") + ax.set_xticks([]) + ax.set_yticks([]) + ax.set_axis_off() + fig.text(0.02, 0.02, f"Frame {i:03d}", color="0.25", fontsize=10) + fig.canvas.draw() + rgba = np.asarray(fig.canvas.buffer_rgba()) + images.append(rgba[:, :, :3].copy()) + plt.close(fig) + if progress_bar is not None: + progress_bar.update() + + duration = 1.0 / max(fps, 1) + imageio.mimsave(output_gif, images, duration=duration) + + +class _nullcontext: + def __enter__(self): + return None + + def __exit__(self, exc_type, exc, tb): + return False + + +def _load_frames(poscar_files: Iterable[str]): + from ase.io import read + + frames = [] + for path in poscar_files: + frames.append(read(path, format="vasp")) + return frames + + +def _arrange_gamma_surface_tasks(task_list: List[str]) -> List[str]: + indexed_tasks = [] + for fallback_index, task_dir in enumerate(task_list): + displacement_path = os.path.join(task_dir, "displacement.json") + if not os.path.isfile(displacement_path): + return task_list + displacement = loadfn(displacement_path) + try: + idx_x = int(displacement["idx_x"]) + idx_y = int(displacement["idx_y"]) + except (KeyError, TypeError, ValueError): + return task_list + indexed_tasks.append((idx_x, idx_y, fallback_index, task_dir)) + + def surface_slide_key(item): + idx_x, idx_y, fallback_index, _ = item + x_order = idx_x if idx_y % 2 == 0 else -idx_x + return idx_y, x_order, fallback_index + + return [task_dir for _, _, _, task_dir in sorted(indexed_tasks, key=surface_slide_key)] + + +def _derive_output_gif_path(parameter_path: Path, structures_count: int, prop_label: str) -> Path: + if structures_count == 1 and prop_label == "": + return parameter_path.with_suffix(".gif") + suffix_parts = [parameter_path.stem] + if prop_label: + suffix_parts.append(prop_label) + return parameter_path.with_name("_".join(suffix_parts) + ".gif") + + +def _expand_parameter_inputs(parameter_inputs: Iterable[str]) -> List[str]: + expanded: List[str] = [] + for raw_input in parameter_inputs: + candidate = Path(raw_input) + if candidate.is_file(): + expanded.append(str(candidate.resolve())) + continue + + matches = sorted(glob.glob(raw_input, recursive=True), key=_natural_key) + if not matches: + matches = sorted(glob.glob(f"**/{raw_input}", recursive=True), key=_natural_key) + if not matches: + raise FileNotFoundError(f"No parameter file matched: {raw_input}") + expanded.extend(str(Path(match).resolve()) for match in matches) + + return expanded + + +def preview_parameter_file( + parameter_file: str, + *, + gif_fps: int = 8, + gif_dpi: int = 140, + gif_padding: float = 0.30, + gif_xshift: float = 0.0, + gif_yshift: float = 0.0, +) -> List[str]: + parameter_path = Path(parameter_file).resolve() + payload = loadfn(str(parameter_path)) + if not isinstance(payload, dict): + raise RuntimeError(f"{parameter_file} is not a JSON object") + + structures = payload.get("structures", []) + if not isinstance(structures, list) or not structures: + raise RuntimeError(f"{parameter_file} does not define any structures") + + properties = payload.get("properties", []) + if not isinstance(properties, list) or not properties: + raise RuntimeError(f"{parameter_file} does not define any properties") + + interaction = payload.get("interaction", {}) + if not isinstance(interaction, dict): + raise RuntimeError(f"{parameter_file} has an invalid interaction block") + + resolved_interaction = _resolve_interaction_paths(parameter_path.parent, interaction) + output_paths: List[str] = [] + + with tempfile.TemporaryDirectory(prefix="apex_preview_") as temp_root_text: + temp_root = Path(temp_root_text) + + runnable_properties = [] + for prop in properties: + if not isinstance(prop, dict): + continue + do_refine, suffix = handle_prop_suffix(prop) + if not suffix and not prop.get("reproduce", False): + continue + runnable_properties.append((prop, suffix or "", do_refine)) + + if not runnable_properties: + raise RuntimeError(f"{parameter_file} has no runnable properties") + + for structure_index, structure_glob in enumerate(structures): + structure_dir = _resolve_structure_path(parameter_path.parent, structure_glob) + + for prop_index, (prop, suffix, do_refine) in enumerate(runnable_properties): + prop_obj = make_property_instance( + {**deepcopy(prop), "type": prop["type"]}, + resolved_interaction, + ) + prop_label = "" + if len(runnable_properties) > 1 or len(structures) > 1: + prop_label = prop["type"] + if suffix: + prop_label = f"{prop_label}_{suffix}" + if len(structures) > 1: + prop_label = f"{Path(structure_dir).name}_{prop_label}" + + output_gif = _derive_output_gif_path( + parameter_path, + len(structures), + prop_label, + ) + + work_dir = temp_root / f"work_{structure_index}_{prop_index}" + work_dir.mkdir(parents=True, exist_ok=True) + equi_dir = _prepare_equilibrium_dir( + structure_dir, + temp_root, + f"structure_{structure_index}_{prop_index}", + ) + task_list = prop_obj.make_confs(str(work_dir), equi_dir, refine=do_refine) + prop_obj.post_process(task_list) + if prop.get("type") == "gamma_surface": + task_list = _arrange_gamma_surface_tasks(task_list) + + poscar_files = [os.path.join(task_dir, "POSCAR") for task_dir in task_list] + frames = _load_frames(poscar_files) + _write_gif( + frames, + str(output_gif), + fps=gif_fps, + dpi=gif_dpi, + padding=gif_padding, + xshift=gif_xshift, + yshift=gif_yshift, + progress_label="Loading...", + ) + output_paths.append(str(output_gif)) + + return output_paths + + +def preview_from_args(args: argparse.Namespace) -> List[str]: + outputs: List[str] = [] + for parameter_file in _expand_parameter_inputs(args.parameters): + outputs.extend( + preview_parameter_file( + parameter_file, + gif_fps=args.gif_fps, + gif_dpi=args.gif_dpi, + gif_padding=args.gif_padding, + gif_xshift=args.gif_xshift, + gif_yshift=args.gif_yshift, + ) + ) + return outputs + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description="Generate preview GIFs from APEX param_props JSON files." + ) + parser.add_argument( + "parameters", + nargs="+", + help="param_props JSON files, e.g. param_props_gamma*.json", + ) + parser.add_argument("--gif-fps", type=int, default=8, help="GIF frames per second") + parser.add_argument("--gif-dpi", type=int, default=140, help="GIF rendering DPI") + parser.add_argument( + "--gif-padding", + type=float, + default=0.30, + help="Relative padding ratio around the detected atom bounds", + ) + parser.add_argument( + "--gif-xshift", + type=float, + default=0.0, + help="Shift the rendered viewport horizontally by a fraction of the data span", + ) + parser.add_argument( + "--gif-yshift", + type=float, + default=0.0, + help="Shift the rendered viewport vertically by a fraction of the data span; positive values move the structure downward", + ) + return parser + + +def main(argv: List[str] | None = None) -> int: + parser = build_parser() + args = parser.parse_args(argv) + outputs = preview_from_args(args) + for path in outputs: + print(path) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/apex/report.py b/apex/report.py index f4b18828..aa8f7a8a 100644 --- a/apex/report.py +++ b/apex/report.py @@ -25,7 +25,7 @@ def tag_dataset(orig_dataset: dict) -> dict: return tagged_dataset -def report_local(input_path_list): +def report_local(input_path_list, open_browser: bool = False, host: str = "127.0.0.1", port: int = 8070): path_list = [] for ii in input_path_list: glob_list = glob.glob(os.path.abspath(ii)) @@ -62,18 +62,32 @@ def report_local(input_path_list): # simplify the work path key for all datasets simplified_dataset = tag_dataset(all_data_dict) - DashReportApp(datasets=simplified_dataset).run(debug=True, use_reloader=True) + DashReportApp( + datasets=simplified_dataset, + open_browser=open_browser, + host=host, + port=port, + ).run(debug=False, use_reloader=False) -def report_result(config_dict: dict, path_list: List[os.PathLike]): +def report_result( + config_dict: dict, + path_list: List[os.PathLike], + open_browser: bool = False, + host: str = "127.0.0.1", + port: int = 8070, +): config = Config(**config_dict) - report_local(path_list) + report_local(path_list, open_browser=open_browser, host=host, port=port) -def report_from_args(config_file, path_list): +def report_from_args(config_file, path_list, open_browser: bool = False, host: str = "127.0.0.1", port: int = 8070): print('-------Report Visualization Mode-------') report_result( config_dict=load_config_file(config_file), - path_list=path_list + path_list=path_list, + open_browser=open_browser, + host=host, + port=port, ) print('Complete!') diff --git a/apex/reporter/DashReportApp.py b/apex/reporter/DashReportApp.py index be515f6e..65f64800 100644 --- a/apex/reporter/DashReportApp.py +++ b/apex/reporter/DashReportApp.py @@ -1,6 +1,7 @@ import dash from dash import dcc, html, State -from dash.dependencies import Input, Output +from dash.dependencies import Input, Output, MATCH +from dash.exceptions import PreventUpdate import dash_bootstrap_components as dbc import plotly.graph_objects as go import webbrowser @@ -21,6 +22,8 @@ def return_prop_class(prop_type: str): if prop_type == 'eos': return EOSReport + elif prop_type == 'cohesive': + return CohesiveReport elif prop_type == 'elastic': return ElasticReport elif prop_type == 'surface': @@ -31,16 +34,26 @@ def return_prop_class(prop_type: str): return VacancyReport elif prop_type == 'gamma': return GammaReport + elif prop_type == 'gamma_surface': + return GammaSurfaceReport elif prop_type == 'phonon': return PhononReport - elif prop_type == 'DecohesionEnergy': - return DecohesionEnergyReport - elif prop_type == 'Lat':# Lat represent Lat_param_T - return Lat_param_T_Report + elif prop_type == 'decohesive': + return DecohesiveReport + elif prop_type == 'finite_t_latt': + return FiniteTlattReport + elif prop_type == 'finite_t_elastic': + return FiniteTelasticReport def return_prop_type(prop: str): try: + if prop.startswith('gamma_surface'): + return 'gamma_surface' + if prop.startswith('finite_t_latt'): + return 'finite_t_latt' + if prop.startswith('finite_t_elastic'): + return 'finite_t_elastic' prop_type = prop.split('_')[0] except AttributeError: return None @@ -68,9 +81,12 @@ def generate_test_datasets(): class DashReportApp: - def __init__(self, datasets): + def __init__(self, datasets, open_browser: bool = False, host: str = "127.0.0.1", port: int = 8070): dbc_css = "https://cdn.jsdelivr.net/gh/AnnMarieW/dash-bootstrap-templates/dbc.min.css" self.datasets = datasets + self.open_browser = open_browser + self.host = host + self.port = port self.all_confs = set() self.all_props = set() self.app = dash.Dash( @@ -105,6 +121,12 @@ def __init__(self, datasets): [Input('confs-radio', 'value')] )(self.update_dropdown_options) + self.app.callback( + Output({'type': 'clip', 'index': MATCH}, 'content'), + [Input({'type': 'clip', 'index': MATCH}, 'n_clicks'), + State({'type': 'table', 'index': MATCH}, 'data')] + )(self.csv_copy) + @staticmethod def plotly_color_cycle(): # https://plotly.com/python/discrete-color/ @@ -210,6 +232,8 @@ def update_graph(self, selected_prop, selected_confs): pass else: propCls = return_prop_class(prop_type) + if propCls is None: + continue # trace_name = f"{w_conf} - {selected_confs} - {selected_prop}" trace_name = w_conf traces, layout = propCls.plotly_graph( @@ -219,6 +243,9 @@ def update_graph(self, selected_prop, selected_confs): # set color and width of reference lines if prop_type != 'vacancy': for trace in iter(traces): + trace_type = getattr(trace, 'type', '') + if trace_type == 'heatmap': + continue if trace_name.split('/')[-1] in ['DFT', 'REF']: trace.update({'line': {'color': 'black', 'width': REF_LINE_SIZE}, 'marker': {'color': 'black', 'size': REF_MARKER_SIZE}}) @@ -292,10 +319,10 @@ def update_table(self, selected_prop, selected_confs): if prop_type == 'relaxation': for w_conf, dataset in self.datasets.items(): table_title = html.H3(f"{w_conf} - {selected_prop}") - clip_id = f"clip-{table_index}" + clip_id = {'type': 'clip', 'index': table_index} clipboard = dcc.Clipboard(id=clip_id, style={"fontSize": UI_FRONTSIZE}) table = RelaxationReport.dash_table(dataset) - table.id = f"table-{table_index}" + table.id = {'type': 'table', 'index': table_index} tables.append(html.Div([table_title, clipboard, table], style={'width': '100%', 'display': 'inline-block'})) table_index += 1 @@ -307,19 +334,27 @@ def update_table(self, selected_prop, selected_confs): pass else: propCls = return_prop_class(prop_type) + if propCls is None: + tables.append( + html.Div( + f"Unsupported report property type: {prop_type}", + style={"fontSize": UI_FRONTSIZE}, + ) + ) + continue table_title = html.H3( f"{w_conf} - {selected_confs} - {selected_prop}", style={"fontSize": UI_FRONTSIZE} ) table, df = propCls.dash_table(data) - table.id = f"table-{table_index}" + table.id = {'type': 'table', 'index': table_index} # add strips to table table.style_data_conditional = [ {'if': {'row_index': 'odd'}, 'backgroundColor': 'rgb(248, 248, 248)'} ] # add clipboards - clip_id = f"clip-{table_index}" + clip_id = {'type': 'clip', 'index': table_index} clipboard = dcc.Clipboard(id=clip_id, style={"fontSize": UI_FRONTSIZE}) tables.append( html.Div([table_title, clipboard, table], @@ -327,35 +362,28 @@ def update_table(self, selected_prop, selected_confs): ) table_index += 1 - self._generate_dynamic_callbacks(table_index) - return html.Div( tables, style={'display': 'flex', 'flex-wrap': 'wrap'} ) @staticmethod - def csv_copy(_, data): + def csv_copy(n_clicks, data): + if not n_clicks: + raise PreventUpdate dff = pd.DataFrame(data) return dff.to_csv(index=False) # do not include row names - def _generate_dynamic_callbacks(self, count): - for index in range(count): - self.app.callback(Output(f'clip-{index}', 'content'), - [Input(f'clip-{index}', 'n_clicks'), - State(f'table-{index}', 'data')])(self.csv_copy) - def run(self, **kwargs): - Timer(1.2, self.open_webpage).start() - print('Dash server running... (See the report at http://127.0.0.1:8050/)') - print('NOTE: If two Dash pages are automatically opened in your browser, you can close the first one.') + if self.open_browser: + Timer(1.2, self.open_webpage).start() + print(f'Dash server running... (See the report at http://{self.host}:{self.port}/)') print('NOTE: If the clipboard buttons do not function well, try to reload the page one time.') print('NOTE: Do not over-refresh the page as duplicate errors may occur. ' 'If did, stop the server and re-execute the apex report command.') - self.app.run(**kwargs) + self.app.run(host=self.host, port=self.port, **kwargs) - @staticmethod - def open_webpage(): - webbrowser.open('http://127.0.0.1:8050/') + def open_webpage(self): + webbrowser.open(f'http://{self.host}:{self.port}/') if __name__ == "__main__": diff --git a/apex/reporter/property_report.py b/apex/reporter/property_report.py index 499096f1..2e8b8f4c 100644 --- a/apex/reporter/property_report.py +++ b/apex/reporter/property_report.py @@ -1,20 +1,35 @@ -import numpy as np from abc import ABC, abstractmethod +from typing import Dict, Tuple + +import numpy as np +import pandas as pd import plotly.graph_objs as go from dash import dash_table -import pandas as pd from apex.core.lib.utils import round_format, round_2d_format -TABLE_WIDTH = '50%' -TABLE_MIN_WIDTH = '95%' +TABLE_WIDTH = "50%" +TABLE_MIN_WIDTH = "95%" +TABLE_STYLE = {"width": TABLE_WIDTH, "minWidth": TABLE_MIN_WIDTH, "overflowX": "auto"} +TABLE_CELL_STYLE = {"textAlign": "left"} def random_color(): r = np.random.randint(50, 200) g = np.random.randint(50, 200) b = np.random.randint(50, 200) - return f'rgb({r}, {g}, {b})' + return f"rgb({r}, {g}, {b})" + + +def build_table(df: pd.DataFrame, cell_style: Dict = None) -> dash_table.DataTable: + """Create a dash DataTable with consistent styling.""" + style_cell = TABLE_CELL_STYLE if cell_style is None else {**TABLE_CELL_STYLE, **cell_style} + return dash_table.DataTable( + data=df.to_dict("records"), + columns=[{"name": i, "id": i} for i in df.columns], + style_table=TABLE_STYLE, + style_cell=style_cell, + ) class PropertyReport(ABC): @@ -39,7 +54,7 @@ def plotly_graph(res_data: dict, name: str): @staticmethod @abstractmethod - def dash_table(res_data: dict, decimal: int) -> [dash_table.DataTable, pd.DataFrame]: + def dash_table(res_data: dict, decimal: int) -> Tuple[dash_table.DataTable, pd.DataFrame]: """ Make Dash table. @@ -101,72 +116,143 @@ def dash_table(res_data: dict, decimal: int = 3, **kwargs) -> dash_table.DataTab for k, v in res_data.items(): vpa.append(float(k)) epa.append(float(v)) + df = pd.DataFrame( + { + "VpA(A^3)": round_format(vpa, decimal), + "EpA(eV)": round_format(epa, decimal), + } + ) + + return build_table(df), df + + +class CohesiveReport(PropertyReport): + @staticmethod + def plotly_graph(res_data: dict, name: str, **kwargs): + lattice = [] + epa = [] + cohesive_energy = [] + for k, m in res_data.items(): + lattice.append(float(k)) + epa.append(float(m["total_energy"])) + cohesive_energy.append(float(m["cohesive_energy"])) + df = pd.DataFrame({ - "VpA(A^3)": round_format(vpa, decimal), - "EpA(eV)": round_format(epa, decimal) + "ScaledLattice": lattice, + "TotalEnergy(eV/atom)": epa, + "CohesiveEnergy(eV/atom)": cohesive_energy }) + + trace = go.Scatter( + name=name, + x=df['ScaledLattice'], + y=df['CohesiveEnergy(eV/atom)'], + mode='lines+markers' + ) + + zero_line = go.Scatter( + x=[min(lattice), max(lattice)], + y=[0, 0], + mode='lines', + line=dict(color='blue', width=1, dash='dot'), + showlegend=False + ) - table = dash_table.DataTable( - data=df.to_dict('records'), - columns=[{'name': i, 'id': i} for i in df.columns], - style_table={'width': TABLE_WIDTH, - 'minWidth': TABLE_MIN_WIDTH, - 'overflowX': 'auto'}, - style_cell={'textAlign': 'left'} + layout = go.Layout( + title='Cohesive Energy', + xaxis=dict( + title_text="Scaled Lattice Parameter a/a0", + title_font=dict( + size=18, + color="#7f7f7f" + ), + ), + yaxis=dict( + title_text="Cohesive Energy Ecoh (eV/atom)", + title_font=dict( + size=18, + color="#7f7f7f" + ), + ) ) + + return [trace, zero_line], layout - return table, df + @staticmethod + def dash_table(res_data: dict, decimal: int = 3, **kwargs) -> dash_table.DataTable: + lattice = [] + epa = [] + cohesive_energy = [] + for k, m in res_data.items(): + lattice.append(float(k)) + epa.append(float(m["total_energy"])) + cohesive_energy.append(float(m["cohesive_energy"])) + + df = pd.DataFrame( + { + "Scaled Lattice Parameter (a/a0)": round_format(lattice, decimal), + "Total Energy (eV/atom)": round_format(epa, decimal), + "Cohesive Energy (eV/atom)": round_format(cohesive_energy, decimal), + } + ) -class DecohesionEnergyReport(PropertyReport): + return build_table(df), df + + +class DecohesiveReport(PropertyReport): @staticmethod def plotly_graph(res_data: dict, name: str, **kwargs): - decohesion_e = [values[0] for values in res_data.values()] - stress = [values[1] for values in res_data.values()] - vacuum_size = [values[2] for values in res_data.values()] - vacuum_size = [str(item) for item in vacuum_size] - df = pd.DataFrame({ - "separation distance (A)": vacuum_size, - "Decohesion energy (J/m^2)": decohesion_e, - "Decohesion stress (GPa)": [s / 1e9 for s in stress], - }) + # Sort by separation distance to keep curves monotonic. + sorted_vals = sorted(res_data.values(), key=lambda x: float(x[0])) + vacuum_size = [float(vals[0]) for vals in sorted_vals] + decohesion_e = [float(vals[1]) for vals in sorted_vals] + stress = [float(vals[2]) for vals in sorted_vals] + + df = pd.DataFrame( + { + "Separation Distance (A)": vacuum_size, + "Decohesion Energy (J/m^2)": decohesion_e, + "Decohesion Stress (GPa)": [s / 1e9 for s in stress], + } + ) trace_E = go.Scatter( name=f"{name} Decohesion Energy", - x=df['separation distance (A)'], - y=df['Decohesion energy (J/m^2)'], + x=df['Separation Distance (A)'], + y=df['Decohesion Energy (J/m^2)'], mode='lines+markers', yaxis='y1' ) trace_S = go.Scatter( name=f"{name} Decohesion Stress", - x=df['separation distance (A)'], - y=df['Decohesion stress (GPa)'], + x=df['Separation Distance (A)'], + y=df['Decohesion Stress (GPa)'], mode='lines+markers', yaxis='y2' ) layout = go.Layout( title=dict( text='Decohesion Energy and Stress', - x=0.5, # 标题居中 + x=0.5, xanchor='center' ), xaxis=dict( - title_text="separation distance (A)", + title_text="Separation Distance (A)", title_font=dict( size=18, color="#7f7f7f" ) ), yaxis=dict( - title="Decohesion energy (J/m^2)", - titlefont=dict( + title="Decohesion Energy (J/m^2)", + title_font=dict( size=18, color="#7f7f7f" ) ), yaxis2=dict( - title="Decohesion stress (GPa)", - titlefont=dict( + title="Decohesion Stress (GPa)", + title_font=dict( size=18, color="#7f7f7f" ), @@ -179,72 +265,173 @@ def plotly_graph(res_data: dict, name: str, **kwargs): @staticmethod def dash_table(res_data: dict, decimal: int = 3, **kwargs) -> dash_table.DataTable: - decohesion_e = [values[0] for values in res_data.values()] - stress = [values[1] for values in res_data.values()] - vacuum_size = [values[2] for values in res_data.values()] - vacuum_size = [str(item) for item in vacuum_size] - df = pd.DataFrame({ - "separation distance (A)": vacuum_size, - "Decohesion energy (J/m^2)": round_format(decohesion_e, decimal), - "Decohesion stress (GPa)": round_format([s / 1e9 for s in stress], decimal), - }) - table = dash_table.DataTable( - data=df.to_dict('records'), - columns=[{'name': i, 'id': i} for i in df.columns], - style_table={'width': TABLE_WIDTH, - 'minWidth': TABLE_MIN_WIDTH, - 'overflowX': 'auto'}, - style_cell={'textAlign': 'left'} + sorted_vals = sorted(res_data.values(), key=lambda x: float(x[0])) + vacuum_size = [float(vals[0]) for vals in sorted_vals] + decohesion_e = [float(vals[1]) for vals in sorted_vals] + stress = [float(vals[2]) for vals in sorted_vals] + + df = pd.DataFrame( + { + "Separation Distance (A)": round_format(vacuum_size, decimal), + "Decohesion Energy (J/m^2)": round_format(decohesion_e, decimal), + "Decohesion Stress (GPa)": round_format([s / 1e9 for s in stress], decimal), + } ) - return table, df + return build_table(df), df -class Lat_param_T_Report(PropertyReport): - @staticmethod - def plotly_graph(res_data: dict, name: str, **kwargs): - lx = [values[0] for values in res_data.values()] - ly = [values[1] for values in res_data.values()] - lz = [values[2] for values in res_data.values()] - temp = [values[3] for values in res_data.values()] - temp = [str(item) for item in temp] +class FiniteTlattReport(PropertyReport): + """Report lattice parameters as a function of temperature.""" - trace_a = go.Scatter(x=temp, y=lx, mode='lines+markers', name='lx', line=dict(color='blue')) - trace_b = go.Scatter(x=temp, y=ly, mode='lines+markers', name='ly', line=dict(color='green')) - trace_c = go.Scatter(x=temp, y=lz , mode='lines+markers', name='lz', line=dict(color='red')) + @staticmethod + def _normalized_data(res_data, relax_abc=None): + data = {} + for value in res_data.values(): + if isinstance(value, (list, tuple)) and len(value) >= 4: + a, b, c, temp = ( + float(value[0]), + float(value[1]), + float(value[2]), + float(value[3]), + ) + elif isinstance(value, dict): + a = float(value.get("a", 0.0)) + b = float(value.get("b", 0.0)) + c = float(value.get("c", 0.0)) + temp = float(value.get("temperature", 0.0)) + else: + continue + data[temp] = {"a": a, "b": b, "c": c} + if relax_abc and 0.0 not in data: + a0, b0, c0 = relax_abc + data[0.0] = {"a": float(a0), "b": float(b0), "c": float(c0)} + return data - trace = [trace_a, trace_b, trace_c] + @staticmethod + def plotly_graph(res_data: dict, name: str, **kwargs): + data = FiniteTlattReport._normalized_data( + res_data, relax_abc=kwargs.get("relax_abc") + ) + temps = sorted(data.keys()) + x_values = [ + str(int(temp)) if abs(temp - round(temp)) < 1e-6 else str(temp) + for temp in temps + ] + a_values = [data[temp]["a"] for temp in temps] + b_values = [data[temp]["b"] for temp in temps] + c_values = [data[temp]["c"] for temp in temps] + + trace_a = go.Scatter(x=x_values, y=a_values, mode='lines+markers', name='a', line=dict(color='blue')) + trace_b = go.Scatter(x=x_values, y=b_values, mode='lines+markers', name='b', line=dict(color='green')) + trace_c = go.Scatter(x=x_values, y=c_values, mode='lines+markers', name='c', line=dict(color='red')) layout = go.Layout( - title='Lat_param_T', - xaxis=dict(title='temperature (K)', tickvals=temp), - yaxis=dict(title='lattice length (Å)'), + title='Finite Temperature Lattice Parameters', + xaxis=dict(title='Temperature (K)'), + yaxis=dict(title='Lattice length (Å)'), showlegend=True ) - return trace, layout + return [trace_a, trace_b, trace_c], layout @staticmethod def dash_table(res_data: dict, decimal: int = 6, **kwargs) -> dash_table.DataTable: - lx = [values[0] for values in res_data.values()] - ly = [values[1] for values in res_data.values()] - lz = [values[2] for values in res_data.values()] - temp = [values[3] for values in res_data.values()] - temp = [str(item) for item in temp] - df = pd.DataFrame({ - "temperature (K)": temp, - "lx (A)": round_format(lx, decimal), - "ly (A)": round_format(ly, decimal), - "lz (A)": round_format(lz, decimal), - }) - table = dash_table.DataTable( - data=df.to_dict('records'), - columns=[{'name': i, 'id': i} for i in df.columns], - style_table={'width': TABLE_WIDTH, - 'minWidth': TABLE_MIN_WIDTH, - 'overflowX': 'auto'}, - style_cell={'textAlign': 'left'} + data = FiniteTlattReport._normalized_data( + res_data, relax_abc=kwargs.get("relax_abc") ) - return table, df + temps = sorted(data.keys()) + rows = [] + for temp in temps: + a = data[temp]["a"] + b = data[temp]["b"] + c = data[temp]["c"] + c_over_a = (c / a) if a else 0.0 + rows.append({ + "Temperature (K)": int(temp) if abs(temp - round(temp)) < 1e-6 else temp, + "a (Å)": round(a, decimal), + "b (Å)": round(b, decimal), + "c (Å)": round(c, decimal), + "c/a": round(c_over_a, decimal), + }) + df = pd.DataFrame(rows) + return build_table(df), df + + +class FiniteTelasticReport(PropertyReport): + """Report finite-temperature elastic constants as a function of temperature.""" + + @staticmethod + def _temperature_rows(res_data: dict): + temperatures = res_data.get("temperatures", {}) + rows = [] + for temp_key, temp_data in sorted( + temperatures.items(), key=lambda item: float(item[0]) + ): + temp = float(temp_key) + row = { + "Temperature (K)": int(temp) if abs(temp - round(temp)) < 1e-6 else temp, + "B (GPa)": temp_data.get("B"), + "G (GPa)": temp_data.get("G"), + "E (GPa)": temp_data.get("E"), + "u": temp_data.get("u", temp_data.get("poisson_ratio")), + "rank": temp_data.get("rank"), + "paired responses": temp_data.get("number_of_paired_responses"), + } + tensor = temp_data.get("elastic_tensor_GPa", temp_data.get("elastic_tensor")) + if tensor is not None: + for ii in range(6): + for jj in range(6): + row[f"C{ii + 1}{jj + 1} (GPa)"] = tensor[ii][jj] + rows.append(row) + return rows + + @staticmethod + def plotly_graph(res_data: dict, name: str, **kwargs): + rows = FiniteTelasticReport._temperature_rows(res_data) + temps = [row["Temperature (K)"] for row in rows] + traces = [] + for label in ["B (GPa)", "G (GPa)", "E (GPa)", "u"]: + values = [row.get(label) for row in rows] + if not any(value is not None for value in values): + continue + traces.append( + go.Scatter( + name=f"{name} {label}", + x=temps, + y=values, + mode="lines+markers", + ) + ) + + layout = go.Layout( + title="Finite-Temperature Elastic Constants", + xaxis=dict(title="Temperature (K)"), + yaxis=dict(title="Modulus (GPa) / Poisson ratio"), + showlegend=True, + ) + return traces, layout + + @staticmethod + def dash_table(res_data: dict, decimal: int = 3, **kwargs) -> dash_table.DataTable: + rows = FiniteTelasticReport._temperature_rows(res_data) + numeric_columns = { + key + for row in rows + for key, value in row.items() + if isinstance(value, (int, float)) and key != "Temperature (K)" + } + rounded_rows = [] + for row in rows: + rounded = {} + for key, value in row.items(): + if key in numeric_columns and value is not None: + rounded[key] = round(float(value), decimal) + else: + rounded[key] = value + rounded_rows.append(rounded) + df = pd.DataFrame(rounded_rows) + return build_table(df, cell_style={"width": "120px"}), df + class ElasticReport(PropertyReport): @staticmethod @@ -303,18 +490,7 @@ def dash_table(res_data: dict, decimal: int = 3, **kwargs) -> dash_table.DataTab rounded_tensor, columns=['Col 1', 'Col 2', 'Col 3', 'Col 4', 'Col 5', 'Col 6'], ) - - table = dash_table.DataTable( - data=df.to_dict('records'), - columns=[{'name': i, 'id': i} for i in df.columns], - style_table={'width': TABLE_WIDTH, - 'minWidth': TABLE_MIN_WIDTH, - 'overflowX': 'auto'}, - style_cell={'textAlign': 'left', 'width': '150px'} - ) - - return table, df - + return build_table(df, cell_style={'width': '150px'}), df class SurfaceReport(PropertyReport): @staticmethod @@ -370,16 +546,7 @@ def dash_table(res_data: dict, decimal: int = 3, **kwargs) -> dash_table.DataTab "EpA_equi (eV)": round_format(epa_equi, decimal), }) - table = dash_table.DataTable( - data=df.to_dict('records'), - columns=[{'name': i, 'id': i} for i in df.columns], - style_table={'width': TABLE_WIDTH, - 'minWidth': TABLE_MIN_WIDTH, - 'overflowX': 'auto'}, - style_cell={'textAlign': 'left'} - ) - - return table, df + return build_table(df), df class InterstitialReport(PropertyReport): @@ -437,16 +604,7 @@ def dash_table(res_data: dict, decimal: int = 3, **kwargs) -> dash_table.DataTab "E_equi (eV)": round_format(equi_e, decimal), }) - table = dash_table.DataTable( - data=df.to_dict('records'), - columns=[{'name': i, 'id': i} for i in df.columns], - style_table={'width': TABLE_WIDTH, - 'minWidth': TABLE_MIN_WIDTH, - 'overflowX': 'auto'}, - style_cell={'textAlign': 'left'} - ) - - return table, df + return build_table(df), df class VacancyReport(PropertyReport): @@ -454,8 +612,6 @@ class VacancyReport(PropertyReport): def plotly_graph(res_data: dict, name: str, **kwargs): v = list(res_data.values())[0] vac_form_e = float(v[0]) - struct_e = float(v[1]) - equi_e = float(v[2]) bar = go.Bar( name=name, @@ -502,16 +658,7 @@ def dash_table(res_data: dict, decimal: int = 3, **kwargs) -> dash_table.DataTab "E_equi (eV)": round_format(equi_e, decimal), }) - table = dash_table.DataTable( - data=df.to_dict('records'), - columns=[{'name': i, 'id': i} for i in df.columns], - style_table={'width': TABLE_WIDTH, - 'minWidth': TABLE_MIN_WIDTH, - 'overflowX': 'auto'}, - style_cell={'textAlign': 'left'} - ) - - return table, df + return build_table(df), df class GammaReport(PropertyReport): @@ -520,14 +667,10 @@ def plotly_graph(res_data: dict, name: str, **kwargs): displ = [] displ_length = [] fault_en = [] - struct_en = [] - equi_en = [] for k, v in res_data.items(): displ.append(k) displ_length.append(v[0]) fault_en.append(v[1]) - struct_en.append((v[2])) - equi_en.append(v[3]) df = pd.DataFrame({ "displacement": displ, "displace_length": displ_length, @@ -582,16 +725,77 @@ def dash_table(res_data: dict, decimal: int = 3, **kwargs) -> dash_table.DataTab "E_Equilib (eV)": round_format(equi_en, decimal) }) - table = dash_table.DataTable( - data=df.to_dict('records'), - columns=[{'name': i, 'id': i} for i in df.columns], - style_table={'width': TABLE_WIDTH, - 'minWidth': TABLE_MIN_WIDTH, - 'overflowX': 'auto'}, - style_cell={'textAlign': 'left'} + return build_table(df), df + + +class GammaSurfaceReport(PropertyReport): + @staticmethod + def plotly_graph(res_data: dict, name: str, **kwargs): + rows = [] + for k, v in res_data.items(): + frac_x_str, frac_y_str = str(k).split(",") + rows.append( + { + "frac_x": float(frac_x_str), + "frac_y": float(frac_y_str), + "fault_en": float(v[2]), + } + ) + + df = pd.DataFrame(rows) + pivot = df.pivot_table(index="frac_y", columns="frac_x", values="fault_en") + heatmap = go.Heatmap( + name=name, + x=list(pivot.columns), + y=list(pivot.index), + z=pivot.values, + colorbar={"title": "Fault Energy (J/m^2)"}, + ) + layout = go.Layout( + title="Stacking Fault Energy (Gamma Surface)", + xaxis=dict( + title_text="Slip Fraction X", + title_font=dict(size=18, color="#7f7f7f"), + ), + yaxis=dict( + title_text="Slip Fraction Y", + title_font=dict(size=18, color="#7f7f7f"), + ), + ) + + return [heatmap], layout + + @staticmethod + def dash_table(res_data: dict, decimal: int = 3, **kwargs) -> dash_table.DataTable: + frac_x = [] + frac_y = [] + disp_x = [] + disp_y = [] + fault_en = [] + struct_en = [] + equi_en = [] + for k, v in res_data.items(): + frac_x_str, frac_y_str = str(k).split(",") + frac_x.append(float(frac_x_str)) + frac_y.append(float(frac_y_str)) + disp_x.append(v[0]) + disp_y.append(v[1]) + fault_en.append(v[2]) + struct_en.append(v[3]) + equi_en.append(v[4]) + df = pd.DataFrame( + { + "Slip_frac_x": round_format(frac_x, decimal), + "Slip_frac_y": round_format(frac_y, decimal), + "Slip_x (A)": round_format(disp_x, decimal), + "Slip_y (A)": round_format(disp_y, decimal), + "E_Fault (J/m^2)": round_format(fault_en, decimal), + "E_Slab (eV)": round_format(struct_en, decimal), + "E_Equilib (eV)": round_format(equi_en, decimal), + } ) - return table, df + return build_table(df), df class PhononReport(PropertyReport): @@ -736,14 +940,4 @@ def dash_table(res_data: dict, decimal: int = 3, **kwargs) -> dash_table.DataTab df = pd.DataFrame(pd_dict) - table = dash_table.DataTable( - data=df.to_dict('records'), - columns=[{'name': i, 'id': i} for i in df.columns], - style_table={'width': TABLE_WIDTH, - 'minWidth': TABLE_MIN_WIDTH, - 'overflowX': 'auto'}, - style_cell={'textAlign': 'left'} - ) - - return table, df - + return build_table(df), df diff --git a/apex/rss.py b/apex/rss.py new file mode 100644 index 00000000..b2c9cc89 --- /dev/null +++ b/apex/rss.py @@ -0,0 +1,252 @@ +import json +from pathlib import Path + +from pymatgen.core import Structure +from pymatgen.io.vasp import Poscar + +from apex.core.lib.crys import ( + B2, + L10, + L12, + bcc, + diamond, + fcc, + hcp, + sc, + tetragonal, +) +from apex.core.lib.rss import generate_rss, resolve_parent_lattice_auto + + +def _jsonable(value): + if isinstance(value, dict): + result = {} + for key, item in value.items(): + if isinstance(key, tuple) and len(key) == 2: + key = f"{key[0]}-{key[1]}" + else: + key = str(key) + result[key] = _jsonable(item) + return result + if isinstance(value, list): + return [_jsonable(item) for item in value] + return value + + +def _build_parent_lattice(config: dict) -> Structure: + lattice = config.get("type") + element = config.get("element", "Ni") + a = float(config.get("a", 3.6)) + c = config.get("c") + if c is not None: + c = float(c) + builder_map = { + "fcc": fcc, + "bcc": bcc, + "sc": sc, + "hcp": hcp, + "tetragonal": tetragonal, + "diamond": diamond, + "B2": B2, + "L12": L12, + "L10": L10, + } + if lattice not in builder_map: + raise ValueError(f"Unsupported parent_lattice type: {lattice}") + + builder = builder_map[lattice] + if lattice in {"B2", "L12", "L10"}: + kwargs = {"a": a} + if lattice == "L10" and c is not None: + kwargs["c"] = c + if "species" in config: + kwargs["species"] = config["species"] + parent = builder(**kwargs) + elif lattice in {"hcp", "tetragonal"} and c is not None: + parent = builder(element, a=a, c=c) + else: + parent = builder(element, a=a) + supercell = config.get("supercell") + if supercell is not None: + parent.make_supercell(supercell) + return parent + + +def _load_or_build_parent(root: Path, config: dict) -> Structure: + parent_structure_path = config.get("parent_structure") + if parent_structure_path: + candidate = (root / parent_structure_path).resolve() + if candidate.exists(): + return Structure.from_file(candidate) + + parent_cfg = config.get("parent_lattice") + if not parent_cfg: + raise ValueError( + "rss.json must provide either parent_structure or parent_lattice" + ) + return _build_parent_lattice(parent_cfg) + + +def _auto_assign_sublattices( + compositions: dict, + base_parent: Structure, + expanded_parent: Structure, +): + if not isinstance(compositions, dict) or not compositions: + raise ValueError("compositions must be a non-empty dict") + if set(compositions.keys()) == {"all"}: + return None + + labels = expanded_parent.site_properties.get("sublattice") + if labels is not None and set(compositions.keys()) == set(labels): + sublattices = [] + for name in compositions.keys(): + site_indices = [ + idx for idx, label in enumerate(labels) if str(label) == str(name) + ] + sublattices.append({"name": name, "site_indices": site_indices}) + return sublattices + + n_base = len(base_parent) + n_expanded = len(expanded_parent) + if n_base <= 0 or n_expanded % n_base != 0: + raise ValueError( + "Cannot auto-assign sublattices from supercell: invalid parent size" + ) + if len(compositions) != n_base: + raise ValueError( + "Auto-assignment requires number of composition groups to match " + f"base parent sites ({n_base}); got {len(compositions)}. " + "Please provide explicit sublattices.site_indices." + ) + + replica = n_expanded // n_base + names = list(compositions.keys()) + sublattices = [] + for i, name in enumerate(names): + start = i * replica + end = (i + 1) * replica + sublattices.append( + { + "name": name, + "site_indices": list(range(start, end)), + } + ) + return sublattices + + +def _write_poscar_with_order(structure: Structure, target: Path) -> None: + # Keep POSCAR element blocks stable and grouped by species label. + sorted_structure = structure.get_sorted_structure( + key=lambda site: str(site.specie) + ) + Poscar(sorted_structure).write_file(str(target)) + + +def _resolve_output_root(output_structure: str, root: Path) -> Path: + output_path = (root / output_structure).resolve() + if output_path.suffix or output_path.name.upper().startswith("POSCAR"): + return output_path.parent + return output_path + + +def _write_outputs(output_root: Path, decorated, metadata: dict) -> None: + output_root.mkdir(parents=True, exist_ok=True) + + output_files = [] + if isinstance(decorated, list): + for i, structure in enumerate(decorated): + conf_dir = output_root / f"conf_{i + 1:03d}" + conf_dir.mkdir(parents=True, exist_ok=True) + target = conf_dir / "POSCAR" + _write_poscar_with_order(structure, target) + output_files.append(str(target)) + print(f"Wrote {target}") + else: + conf_dir = output_root / "conf_001" + conf_dir.mkdir(parents=True, exist_ok=True) + target = conf_dir / "POSCAR" + _write_poscar_with_order(decorated, target) + output_files.append(str(target)) + print(f"Wrote {target}") + + if metadata is not None: + metadata["output_structures"] = output_files + metadata_path = output_root / "rss_metadata.json" + metadata_path.write_text(json.dumps(_jsonable(metadata), indent=4, sort_keys=True)) + print(f"Wrote {metadata_path}") + + +def run_rss_config(config_file: str) -> None: + config_path = Path(config_file).expanduser().resolve() + if not config_path.exists(): + raise FileNotFoundError(f"rss config file not found: {config_path}") + + root = config_path.parent + config = json.loads(config_path.read_text()) + composition_tol = config.get("composition_tolerance", 0.005) + shape_mode = config.get("supercell_shape", "near_cubic") + maximum_num_atoms = config.get( + "maximum_num_atoms", + config.get("maximum_nums_atoms", config.get("maxmium_nums_atoms")), + ) + parent_lattice = config.get("parent_lattice") + if parent_lattice is not None: + resolve_parent_lattice_auto( + parent_lattice, + config["compositions"], + composition_tolerance=composition_tol, + shape_mode=shape_mode, + maximum_num_atoms=maximum_num_atoms, + ) + + parent = _load_or_build_parent(root, config) + base_parent = parent.copy() + + supercell = config.get("supercell") + if supercell is not None: + parent.make_supercell(supercell) + + sublattices = config.get("sublattices") + if sublattices is None and ( + supercell is not None or "sublattice" in parent.site_properties + ): + sublattices = _auto_assign_sublattices( + compositions=config["compositions"], + base_parent=base_parent, + expanded_parent=parent, + ) + if sublattices is not None: + print("Auto-assigned sublattices from supercell and composition order") + output_root = _resolve_output_root(config.get("output_structure", "RSS"), root) + + write_metadata = bool(config.get("metadata", True)) + + rss_kwargs = { + "compositions": config["compositions"], + "sublattices": sublattices, + "sro_targets": config.get("sro_targets"), + "shell_cutoffs": config.get("shell_cutoffs"), + "shell_weights": config.get("shell_weights"), + "max_steps": config.get("max_steps", 20000), + "temperature": config.get("temperature", 0.05), + "seed": config.get("seed"), + "tol": config.get("tol", 1e-3), + "allow_vacancies": config.get("allow_vacancies", False), + "num_configs": config.get("num_configs", 1), + "interval": config.get("interval", 100), + "show_progress": config.get("show_progress", True), + "patience": config.get("patience"), + "return_metadata": write_metadata, + } + result = generate_rss(parent, **rss_kwargs) + if write_metadata: + decorated, metadata = result + else: + decorated = result + metadata = None + _write_outputs(output_root, decorated, metadata) + + +def rss_from_args(config_file: str) -> None: + run_rss_config(config_file) diff --git a/apex/step.py b/apex/step.py index cf89c0c0..6dce843d 100644 --- a/apex/step.py +++ b/apex/step.py @@ -4,6 +4,8 @@ from apex.core.common_equi import (make_equi, run_equi, post_equi) from apex.core.common_prop import (make_property, run_property, post_property) from apex.utils import get_flow_type, load_config_file +from apex.archive import archive_workdir +from apex.config import Config def do_step(param_dict: dict, step: str, machine_dict: dict = None): @@ -36,6 +38,18 @@ def do_step(param_dict: dict, step: str, machine_dict: dict = None): else: print('Posting relaxation results locally...') post_equi(structures, inter_parameter) + # Auto-archive to generate/update all_result.json locally (parity with `apex submit`) + try: + cfg = Config(**(machine_dict or {})) + archive_workdir( + relax_param=param_dict, + props_param=None, + config=cfg, + work_dir=os.getcwd(), + flow_type='relax' + ) + except Exception as e: # non-fatal; keep local post succeeding + print(f"[archive] skipped: {e}") elif step in ['make_props', 'run_props', 'post_props']: param = param_dict["properties"] @@ -56,13 +70,87 @@ def do_step(param_dict: dict, step: str, machine_dict: dict = None): else: print('Posting property results locally...') post_property(structures, inter_parameter, param) + # Auto-archive to generate/update all_result.json locally (parity with `apex submit`) + try: + cfg = Config(**(machine_dict or {})) + archive_workdir( + relax_param=None, + props_param=param_dict, + config=cfg, + work_dir=os.getcwd(), + flow_type='props' + ) + except Exception as e: # non-fatal; keep local post succeeding + print(f"[archive] skipped: {e}") def do_step_from_args(parameter: str, step: str, machine_file: os.PathLike = None): print('-------Singel Step Local Debug Mode--------') - do_step( - param_dict=loadfn(parameter), - step=step, - machine_dict=load_config_file(machine_file) - ) + param_dict = loadfn(parameter) + mcfg = load_config_file(machine_file) + if step in ['make', 'run', 'post']: + _do_step_combined(param_dict, step, mcfg) + else: + do_step( + param_dict=param_dict, + step=step, + machine_dict=mcfg + ) print('Completed!') + + +def _do_step_combined(param_dict: dict, step: str, machine_dict: dict = None): + """ + Combined local steps that auto-detect json type and sequence: + - make: relax -> props (for joint), otherwise corresponding only + - run: relax -> props (for joint), otherwise corresponding only + - post: relax -> props (for joint), otherwise corresponding only, then archive once + """ + flow = get_flow_type(param_dict) # 'relax' | 'props' | 'joint' + structures = param_dict.get('structures') + inter_parameter = param_dict.get('interaction') + + # Helper to get mdata or warn + def _mdata_or_warn(): + if not machine_dict: + raise RuntimeWarning( + 'Miss configuration file for dpdispatcher (indicate by optional args -c). ' + 'Jobs will be running on the local shell.' + ) + return machine_dict + + # make + if step == 'make': + if flow in ['relax', 'joint']: + make_equi(structures, inter_parameter, param_dict['relaxation']) + if flow in ['props', 'joint']: + make_property(structures, inter_parameter, param_dict['properties']) + return + + # run + if step == 'run': + mdata = _mdata_or_warn() + if flow in ['relax', 'joint']: + run_equi(structures, inter_parameter, mdata) + if flow in ['props', 'joint']: + run_property(structures, inter_parameter, param_dict['properties'], mdata) + return + + # post + if step == 'post': + if flow in ['relax', 'joint']: + post_equi(structures, inter_parameter) + if flow in ['props', 'joint']: + post_property(structures, inter_parameter, param_dict['properties']) + # archive once for combined post + try: + cfg = Config(**(machine_dict or {})) + archive_workdir( + relax_param=param_dict if flow in ['relax', 'joint'] else None, + props_param=param_dict if flow in ['props', 'joint'] else None, + config=cfg, + work_dir=os.getcwd(), + flow_type=flow, + ) + except Exception as e: + print(f"[archive] skipped: {e}") diff --git a/apex/submit.py b/apex/submit.py index 3e2f9353..26e1df46 100644 --- a/apex/submit.py +++ b/apex/submit.py @@ -4,6 +4,8 @@ import shutil import tempfile import logging +import copy +import json from typing import List from multiprocessing import Pool from monty.serialization import loadfn @@ -23,10 +25,159 @@ copy_all_other_files, sepline, handle_prop_suffix, - backup_path + backup_path, + apex_task_succeeded, + all_apex_task_status_succeeded, ) +def validate_submit_paths(parameter_dicts: List[dict]) -> None: + """ + dflow rejects structure path patterns containing '.'. + Validate before submit and fail fast with actionable hints. + """ + violations = [] + for idx, param in enumerate(parameter_dicts): + structures = param.get("structures", []) + for s_idx, structure in enumerate(structures): + if isinstance(structure, str) and "." in structure: + violations.append( + f"parameter[{idx}].structures[{s_idx}] = {structure}" + ) + + if violations: + raise RuntimeError( + "Invalid `apex submit` paths: dflow does not allow '.' in " + "`structures`. " + "Please rename the path/file and update param.json.\n" + "Offending entries:\n- " + "\n- ".join(violations) + ) + + +def _infer_type_map_from_structure_file(structure_file: str) -> dict: + structure_name = os.path.basename(structure_file) + symbols = [] + if structure_name in {"POSCAR", "CONTCAR"}: + from pymatgen.io.vasp import Poscar + + poscar = Poscar.from_file(structure_file) + symbols = [str(item) for item in poscar.site_symbols] + else: + from pymatgen.core import Structure + + structure = Structure.from_file(structure_file) + seen = set() + for site in structure.sites: + symbol = str(site.specie) + if symbol not in seen: + seen.add(symbol) + symbols.append(symbol) + + if not symbols: + raise RuntimeError(f"Cannot infer type_map from structure file: {structure_file}") + return {symbol: idx for idx, symbol in enumerate(symbols)} + + +def _resolve_first_structure_file(param_path: str, structures: List[str]) -> str: + base_dir = os.path.dirname(os.path.abspath(param_path)) + for pattern in structures: + if os.path.isabs(pattern): + search_patterns = [pattern] + else: + search_patterns = [os.path.join(base_dir, pattern), pattern] + + matches = [] + for search_pattern in search_patterns: + matches.extend(glob.glob(search_pattern)) + matches = sorted(set(matches)) + for match in matches: + if os.path.isdir(match): + for candidate in ("POSCAR", "CONTCAR", "STRU"): + candidate_path = os.path.join(match, candidate) + if os.path.isfile(candidate_path): + return candidate_path + nested_poscars = sorted(glob.glob(os.path.join(match, "conf_*", "POSCAR"))) + if nested_poscars: + return nested_poscars[0] + elif os.path.isfile(match): + return match + raise RuntimeError( + "Cannot infer interaction.type_map automatically: no structure file found " + f"for patterns {structures} from {param_path}" + ) + + +def auto_fill_type_map_from_poscar(parameter_dict: dict, param_path: str) -> bool: + interaction = parameter_dict.get("interaction") + if not isinstance(interaction, dict): + return False + if interaction.get("type") in {"vasp", "abacus"}: + return False + + current_type_map = interaction.get("type_map") + if isinstance(current_type_map, dict) and current_type_map: + return False + if current_type_map not in (None, "", "auto"): + return False + + structures = parameter_dict.get("structures", []) + if not isinstance(structures, list) or not structures: + raise RuntimeError( + "Cannot infer interaction.type_map automatically because `structures` is empty" + ) + + structure_file = _resolve_first_structure_file(param_path, structures) + interaction["type_map"] = _infer_type_map_from_structure_file(structure_file) + + with open(param_path, "w", encoding="utf-8") as fp: + json.dump(parameter_dict, fp, indent=4) + fp.write("\n") + return True + + +def _glob_structures_in_work_dir(work_dir: os.PathLike, pattern: str) -> List[str]: + """Resolve a structure glob the same way pack_upload_dir will use it. + + Submit can be launched from a parent directory while each workflow work_dir + contains its own confs/. Keep returned paths relative to work_dir whenever + possible because pack_upload_dir changes into work_dir before copying. + """ + abs_work_dir = os.path.abspath(work_dir) + search_pattern = pattern if os.path.isabs(pattern) else os.path.join(abs_work_dir, pattern) + matches = [] + for match in glob.glob(search_pattern): + abs_match = os.path.abspath(match) + try: + inside_work_dir = os.path.commonpath([abs_work_dir, abs_match]) == abs_work_dir + except ValueError: + inside_work_dir = False + if inside_work_dir: + matches.append(os.path.relpath(abs_match, abs_work_dir)) + else: + matches.append(abs_match) + return sorted(set(matches)) + + +def _relaxation_required(relax_param: dict | None) -> bool: + if not relax_param: + return True + relaxation = relax_param.get("relaxation", {}) + return relaxation.get("req_calc", True) is not False + + +def _stage_unrelaxed_structure_as_equilibrium(conf_dir: str, build_conf_path: str) -> None: + """Expose a POSCAR as the equilibrium structure expected by property code.""" + source_poscar = os.path.abspath(os.path.join(conf_dir, "POSCAR")) + if not os.path.isfile(source_poscar): + raise RuntimeError( + "relaxation.req_calc=false requires POSCAR in each structure directory: " + f"{source_poscar}" + ) + relax_task_dir = os.path.join(build_conf_path, "relaxation", "relax_task") + os.makedirs(relax_task_dir, exist_ok=True) + shutil.copy(source_poscar, os.path.join(relax_task_dir, "CONTCAR")) + + def pack_upload_dir( work_dir: os.PathLike, upload_dir: os.PathLike, @@ -58,6 +209,135 @@ def pack_upload_dir( conf_dirs.extend(glob.glob(conf)) conf_dirs = list(set(conf_dirs)) conf_dirs.sort() + if not conf_dirs: + os.chdir(cwd) + raise RuntimeError( + "No structures matched the submitted patterns under " + f"{os.path.abspath(work_dir)}: {confs}" + ) + + def relaxation_finished(conf_path: str) -> bool: + task_dir = os.path.join(conf_path, "relaxation", "relax_task") + return apex_task_succeeded(task_dir) + + def property_finished(conf_path: str, properties: list) -> bool: + # Finished only if every property that sets rerun_finished=False has + # calculator task statuses with state=succeeded. + all_done = True + for prop in properties: + rerun_finished = prop.get("rerun_finished", True) + if rerun_finished: + all_done = False + break + do_refine, suffix = handle_prop_suffix(prop) + if not suffix: + all_done = False + break + prop_dir = os.path.join(conf_path, prop["type"] + "_" + suffix) + if not all_apex_task_status_succeeded(prop_dir): + all_done = False + break + return all_done + + # Optional pruning to skip already-finished tasks before upload. + if flow_type == 'relax' and relax_param: + rerun_finished = relax_param.get("interaction", {}).get("rerun_finished", True) + if rerun_finished is False: + pruned = [] + skipped = [] + for c in conf_dirs: + if relaxation_finished(c): + logging.info(f"Skip uploading finished relaxation for {c} (rerun_finished=False).") + skipped.append(c) + else: + pruned.append(c) + conf_dirs = pruned + if not conf_dirs: + raise RuntimeError("All relaxations are already finished; nothing to submit.") + + if flow_type == 'props' and prop_param: + properties = prop_param.get("properties", []) + finished_props = {} + pruned = [] + for c in conf_dirs: + done_all = property_finished(c, properties) + if done_all: + logging.info(f"Skip uploading finished properties for {c} (all rerun_finished=False task states succeeded).") + else: + pruned.append(c) + # track per-structure finished properties + finished_list = [] + for prop in properties: + if not prop.get("rerun_finished", True): + do_refine, suffix = handle_prop_suffix(prop) + if not suffix: + continue + prop_dir = os.path.join(c, prop["type"] + "_" + suffix) + if all_apex_task_status_succeeded(prop_dir): + finished_list.append(prop_dir) + if finished_list: + finished_props[c] = finished_list + conf_dirs = pruned + if finished_props: + prop_param["skip_finished_properties"] = [ + [c, os.path.basename(p)] for c, lst in finished_props.items() for p in lst + ] + if not conf_dirs and not prop_param.get("skip_finished_properties", []): + raise RuntimeError("All properties are already finished; nothing to submit.") + + if flow_type == 'joint' and relax_param and prop_param: + # Split finished vs pending relaxations so we can skip reruns while still running properties + req_relax = _relaxation_required(relax_param) + rerun_finished = relax_param.get("interaction", {}).get("rerun_finished", True) + skip_finished_properties = [] + finished_relax = [] + pending_relax = conf_dirs + if not req_relax: + pending_relax = [] + finished_relax = conf_dirs + relax_param["skip_finished_structures"] = finished_relax + prop_param["pre_relaxed_structures"] = finished_relax + elif rerun_finished is False: + pending_relax = [] + for c in conf_dirs: + if relaxation_finished(c): + finished_relax.append(c) + else: + pending_relax.append(c) + if not pending_relax: + logging.info("All relaxations finished; joint flow will reuse existing results.") + # keep all structures for property stage; mark which relaxations to skip + relax_param["skip_finished_structures"] = finished_relax + prop_param["pre_relaxed_structures"] = finished_relax + # Detect per-structure finished properties when rerun_finished is False for that property + properties = prop_param.get("properties", []) + requested_property_tasks = [] + for c in conf_dirs: + for prop in properties: + do_refine, suffix = handle_prop_suffix(prop) + if not suffix: + continue + prop_dir_name = f"{prop['type']}_{suffix}" + requested_property_tasks.append((c, prop_dir_name)) + if prop.get("rerun_finished", True): + continue + prop_dir = os.path.join(c, prop_dir_name) + if all_apex_task_status_succeeded(prop_dir): + skip_finished_properties.append([c, prop_dir_name]) + if skip_finished_properties: + prop_param["skip_finished_properties"] = skip_finished_properties + skipped_property_tasks = { + (item[0], item[1]) + for item in skip_finished_properties + } + if not pending_relax and requested_property_tasks \ + and all(item in skipped_property_tasks for item in requested_property_tasks): + os.chdir(cwd) + raise RuntimeError( + "All requested joint relaxation and property tasks are already finished; " + "nothing to submit. Set rerun_finished=true for relaxation or at least " + "one property if you want to resubmit." + ) refine_init_name_list = [] # backup all existing property work directories if flow_type in ['props', 'joint']: @@ -73,6 +353,11 @@ def pack_upload_dir( refine_init_suffix = jj['init_from_suffix'] refine_init_name_list.append(property_type + "_" + refine_init_suffix) path_to_prop = os.path.join(ii, property_type + "_" + suffix) + # If rerun_finished is False and task states succeeded, skip backing up (keep as-is) + if (not jj.get("rerun_finished", True)): + if all_apex_task_status_succeeded(path_to_prop): + logging.info(f"Skip backing up finished property at {path_to_prop} (rerun_finished=False, task states succeeded)") + continue backup_path(path_to_prop) """copy necessary files and directories into temp upload directory""" @@ -93,10 +378,19 @@ def pack_upload_dir( if os.path.isfile(copy_stru_path): target_stru_path = os.path.join(build_conf_path, "STRU") shutil.copy(copy_stru_path, target_stru_path) - if flow_type == 'props': + if flow_type in ['props', 'joint']: copy_relaxation_path = os.path.abspath(os.path.join(ii, "relaxation")) target_relaxation_path = os.path.join(build_conf_path, "relaxation") - shutil.copytree(copy_relaxation_path, target_relaxation_path) + if flow_type == 'joint' and relax_param and not _relaxation_required(relax_param): + try: + _stage_unrelaxed_structure_as_equilibrium(ii, build_conf_path) + except Exception: + os.chdir(cwd) + raise + elif os.path.isdir(copy_relaxation_path): + shutil.copytree(copy_relaxation_path, target_relaxation_path) + else: + logging.warning(f"Skip copying relaxation for {ii}: {copy_relaxation_path} not found.") # copy refine from init path to upload dir if refine_init_name_list: for jj in refine_init_name_list: @@ -131,6 +425,29 @@ def submit( with tempfile.TemporaryDirectory() as tmp_dir: logging.debug(msg=f'Temporary upload directory:{tmp_dir}') + + # For property-only workflow, drop structures whose relaxation output is missing + if flow_type == 'props' and props_param: + filtered_structs = [] + missing_structs = [] + for pattern in props_param.get("structures", []): + matches = _glob_structures_in_work_dir(work_dir, pattern) + if not matches: + logging.warning( + f'No structure matched pattern "{pattern}" under "{work_dir}", skip.' + ) + continue + for m in matches: + relax_dir = os.path.join(work_dir, m, "relaxation") + if os.path.isdir(relax_dir): + filtered_structs.append(m) + else: + missing_structs.append(m) + logging.warning(f'Relaxation directory missing for {m}, skip property calculation on it.') + if not filtered_structs: + raise RuntimeError("No available relaxed structures for property workflow.") + props_param["structures"] = filtered_structs + pack_upload_dir( work_dir=work_dir, upload_dir=tmp_dir, @@ -139,7 +456,6 @@ def submit( flow_type=flow_type, exclude_upload_files=wf_config.exclude_upload_files ) - cwd = os.getcwd() os.chdir(tmp_dir) flow_id = None @@ -191,6 +507,8 @@ def submit_workflow( is_debug=False, labels=None ): + validate_submit_paths(parameter_dicts) + # config dflow_config and s3_config wf_config = Config(**config_dict) Config.config_dflow(wf_config.dflow_config_dict) @@ -201,10 +519,23 @@ def submit_workflow( wf_config.submit_only = True # set pre-defined dflow debug mode settings if is_debug: - tmp_work_dir = tempfile.TemporaryDirectory() + # Prefer an explicit debug_workdir from config; otherwise, try to place + # the debug work under the configured remote_root (if any) to mimic the + # user's desired filesystem layout; fall back to a temp dir. + debug_dir = config_dict.get("debug_workdir") + if not debug_dir: + base_dir = wf_config.remote_root or os.getcwd() + # Put artifacts in a hidden folder to avoid clutter + debug_dir = os.path.join(base_dir, "dflow_debug") + try: + os.makedirs(debug_dir, exist_ok=True) + except Exception: + # Final fallback: system temp + debug_dir = tempfile.mkdtemp(prefix="apex-debug-") config["mode"] = "debug" - config["debug_workdir"] = config_dict.get("debug_workdir", tmp_work_dir.name) + config["debug_workdir"] = debug_dir logging.info(f'Debug mode activated, debug work directory: {config["debug_workdir"]}') + # Use local filesystem instead of object storage in debug s3_config["storage_client"] = None if flow_name: @@ -222,6 +553,8 @@ def submit_workflow( run_command = wf_config.basic_config_dict[f"{calculator}_run_command"] if not run_command: run_command = wf_config.basic_config_dict["run_command"] + lammps_run_command = wf_config.basic_config_dict["lammps_run_command"] + phonolammps_run_command = wf_config.basic_config_dict["phonolammps_run_command"] post_image = make_image group_size = wf_config.basic_config_dict["group_size"] pool_size = wf_config.basic_config_dict["pool_size"] @@ -244,8 +577,19 @@ def submit_workflow( group_size=group_size, pool_size=pool_size, executor=executor, - upload_python_packages=upload_python_packages + upload_python_packages=upload_python_packages, + debug_mode=is_debug, ) + + if props_param and (phonolammps_run_command or lammps_run_command): + props_param = copy.deepcopy(props_param) + for prop in props_param.get("properties", []): + if prop.get("type") in {"phonon", "gruneisen"}: + if phonolammps_run_command: + prop["phonolammps_run_command"] = phonolammps_run_command + if prop.get("type") == "gruneisen" and lammps_run_command: + prop["lammps_run_command"] = lammps_run_command + # submit the workflows work_dir_list = [] for ii in work_dirs: @@ -294,15 +638,39 @@ def submit_from_args( flow_name: str = None, submit_only=False, is_debug=False, + labels=None, ): print('-------Submit Workflow Mode-------') + parameter_dicts = [] + for param_path in parameters: + param_dict = loadfn(param_path) + if auto_fill_type_map_from_poscar(param_dict, param_path): + print( + f"Auto-filled interaction.type_map from structure file and updated: {param_path}" + ) + parameter_dicts.append(param_dict) + + label_mapping = None + if labels: + label_mapping = {} + for item in labels: + if "=" not in item: + raise RuntimeError(f"Invalid submit label {item!r}; expected key=value") + key, value = item.split("=", 1) + clean_key = key.strip() + clean_value = value.strip() + if not clean_key or not clean_value: + raise RuntimeError(f"Invalid submit label {item!r}; empty key/value is not allowed") + label_mapping[clean_key] = clean_value + submit_workflow( - parameter_dicts=[loadfn(jj) for jj in parameters], + parameter_dicts=parameter_dicts, config_dict=load_config_file(config_file), work_dirs=work_dirs, indicated_flow_type=indicated_flow_type, flow_name=flow_name, submit_only=submit_only, is_debug=is_debug, + labels=label_mapping, ) print('Completed!') diff --git a/apex/utils.py b/apex/utils.py index 7cf495af..a59a6185 100644 --- a/apex/utils.py +++ b/apex/utils.py @@ -3,6 +3,7 @@ import os import shutil import json +import glob import string import random from typing import Type, List @@ -13,16 +14,49 @@ from fpop.vasp import RunVasp from fpop.abacus import RunAbacus from apex.op.RunLAMMPS import RunLAMMPS +from apex.account import merge_bohrium_defaults from apex.core.calculator import LAMMPS_INTER_TYPE upload_packages.append(__file__) MaxLength = 70 +APEX_TASK_STATUS = "apex_task_status.json" # LAMMPS_INTER_TYPE = ['deepmd', 'eam_alloy', 'meam', 'eam_fs', 'meam_spline', 'snap', 'gap', 'rann', 'mace'] # write a function to replace all '/' in the input string with '-' +def load_apex_task_status(task_dir_or_file): + status_path = task_dir_or_file + if os.path.isdir(status_path): + status_path = os.path.join(status_path, APEX_TASK_STATUS) + if not os.path.isfile(status_path): + return None + try: + return loadfn(status_path) + except Exception as exc: + logging.warning(f"Could not parse {status_path}: {exc}") + return None + + +def apex_task_state(task_dir_or_file): + status = load_apex_task_status(task_dir_or_file) + if not isinstance(status, dict): + return None + return status.get("state") + + +def apex_task_succeeded(task_dir_or_file) -> bool: + return apex_task_state(task_dir_or_file) == "succeeded" + + +def all_apex_task_status_succeeded(work_dir, task_glob="task.[0-9]*[0-9]") -> bool: + task_dirs = glob.glob(os.path.join(work_dir, task_glob)) + task_dirs.sort() + if not task_dirs: + return False + return all(apex_task_succeeded(task_dir) for task_dir in task_dirs) + def backup_path(path) -> None: path += "/" if os.path.isdir(path): @@ -113,6 +147,7 @@ def load_config_file(config_file: os.PathLike) -> dict: 'or use optional argument: -c to indicate a specific json file.' ) config_dict = {} + config_dict = merge_bohrium_defaults(config_dict, config_file) return config_dict @@ -137,7 +172,11 @@ def recursive_search(directories, path='.'): def handle_prop_suffix(parameter: dict): - if parameter.get('skip', False): + # Prefer req_calc as the explicit switch for running a property. + if "req_calc" in parameter: + if not parameter.get("req_calc"): + return None, None + elif parameter.get("skip", False): return None, None if 'init_from_suffix' and 'output_suffix' in parameter: do_refine = True diff --git a/docs/gui_dev.md b/docs/gui_dev.md new file mode 100644 index 00000000..4239b424 --- /dev/null +++ b/docs/gui_dev.md @@ -0,0 +1,205 @@ +# APEX GUI Dev Log + +This document serves as a development log for anyone maintaining the `apex gui` frontend (Dash). It records implementation locations, data flows, and conventions for future extensions. + +## 1. Code Locations + +- Main entry & frontend implementation: `apex/gui.py` +- Account config read/write: `apex/account.py` +- Submit template directories: `apex/default_config/{lammps,vasp,abacus}/` + +The current GUI is built with Dash. Both the frontend layout and backend callbacks live in a single Python file (the `ApexGuiApp` class). + +## 2. Tab Structure + +Four tabs are defined in `ApexGuiApp._build_layout()`: + +1. `Submit` +2. `Log` +3. `Advanced` +4. `Account` + +Corresponding builder functions: + +- `_build_submit_tab` +- `_build_manage_tab` +- `_build_advanced_tab` +- `_build_account_tab` + +## 3. Submit Page (Core) + +### 3.1 Templates & Data Sources + +The `Submit` page does not rely on hand-written JSON. Instead, it assembles parameters from profile templates: + +- `param_structure.json` +- `param_interaction/param_interaction.json` +- `param_relax.json` +- `param_props.json` + +Assembly function: `_load_profile_param_template(profile)`. + +`global.json` source: `_load_profile_global(profile)`. + +### 3.2 User Actions & Button Semantics + +Buttons at the bottom of the Submit page: + +- `Reset`: Regenerate the `param.json` editor content based on the current form state, and clear all generated logs. +- `Submit`: Writes the user's current edits to `global.json`/`param.json`, writes interaction-related files (e.g., `vasp_input/INCAR`), and executes in the background: + `nohup apex submit param.json -c global.json > apex.log 2>&1 &` + +The Submit page now distinguishes two types of uploads: + +- `Upload Structure`: Structure files are saved to the current `Workdir/confs/` by default. The `confs/` directory is created automatically if it does not exist. +- `Upload File`: Regular files are saved directly to the current `Working Directory`. + +Upload results are displayed in `Command Output`. + +The `structures` field is no longer edited manually in `param.json`. Instead, a dropdown lets users select structure directories/paths from the current `Workdir`, preventing accidental entries like `.`. + +### 3.3 Pre-Submit Log Conflict Check + +When `Submit` is clicked, the GUI checks whether `apex.log` already exists in the current directory. + +- If it exists: a `ConfirmDialog` pops up for secondary confirmation. +- The actual resubmission only proceeds after the user confirms. + +### 3.4 Interaction Editing Rules + +- `lammps`: Displays `interaction.type` and a file selector for `interaction.model`. +- `vasp`: `interaction.type` is no longer selected manually. The GUI automatically reads element order from `POSCAR` in the selected structure directory, then prioritizes searching for suffix-matching POTCAR files under `vasp_input/` in the `Workdir`. Missing elements are indicated with gray text: "Please submit the POTCAR for the corresponding element". +- `abacus`: `interaction.type` is no longer selected manually. The GUI automatically reads element order from `POSCAR` in the selected structure directory, then prioritizes searching for prefix-matching pseudopotential/orbital files under `abacus_input/` in the `Workdir`. Missing items are indicated with gray text. + +In the right-side Advanced Settings: + +- `vasp` uses `interaction.incar` +- `abacus` uses `interaction.input` + +If the corresponding files do not exist, they are automatically created from the profile default template during `Submit`: + +- `vasp_input/INCAR` +- `abacus_input/INPUT` + +### 3.5 Properties Checkbox Behavior + +In `param.json`, only checked properties are retained; unchecked items are not written to the output JSON. + +## 4. Log Page + +The `Log` page is used to view `apex.log`: + +- Manual refresh button +- Auto-refresh every 3 seconds +- Displays the tail of the log + +Log read function: `_read_log_tail()`. + +## 5. Advanced Page + +Supports executing command tail arguments (calls `python -m apex ...`). + +- Example input: `submit param_joint.json -c global.json` +- `gui` is blocked to prevent nested Dash launches. +- `report` is allowed but will open on a separate port (`8070`) to avoid conflict with the GUI. + +## 6. Account Page + +### 6.1 Goal + +Provides a visual overlay editor for `apex account` stored credentials within the GUI. + +### 6.2 Current Fields + +- `email` +- `program_id` +- `password` (overwrite only, no echo) + +### 6.3 Security Policy + +- The page never displays plaintext passwords; only shows "Set / Not Set". +- The password input field is cleared after saving. +- The underlying file is still written by `save_account_config()`. + +### 6.4 Related Functions + +In `apex/gui.py`: + +- `_load_account_state` +- `_render_account_summary` +- `_save_account_overwrite` +- Callback: `_handle_account` + +In `apex/account.py`: + +- `load_account_config` +- `save_account_config` +- `mask_sensitive_config` + +## 7. Key Callback Inventory (apex/gui.py) + +- `_sync_profile_defaults`: Syncs default values and control states when the profile is switched. +- `_update_interaction_table`: Dynamic row add/remove and reset on profile switch. +- `_generate_param_editor`: Generates `param.json` text from the current UI state. +- `_handle_command`: Handles `Apply/Submit/Confirm/Advanced` actions. +- `_handle_structure_upload`: Uploads structure files to the current `Workdir/confs/`. +- `_handle_file_upload`: Uploads regular files to the current `Workdir`. +- `_handle_account`: Handles Account refresh and overwrite save. +- `_update_manage_log`: Updates the `apex.log` display. + +## 8. APEX GUI Major Fix + +### 8.1 Critical Bug Fixes + +- **Fixed**: Submit no longer overwrites input parameters with templates. +- **Fixed**: Selecting properties no longer overwrites already-entered parameters with templates + +### 8.2 New Features + +- **Workdir, file upload, and structure upload** added. +- **Retrieve + Report**: Replaced blocking report with a new-port approach to open the report page (!). + - `apex report` now opens on port `8070` instead of blocking the GUI. +- **Auto-retry on network disconnect** during retrieve to prevent workflow interruption. +- **Workflow progress stats**: Shows how many confs completed and how many failed. +- **Workflow "Last updated: xx time"** to confirm whether the query has stalled. +- **Retrieve progress bar** added . +- **Auto-query workflow progress** after entering a Workflow ID . +- **Reset function improved**: Now resets all generated logs . +- **Renamed `maximal` to `maxeval`** to align with LAMMPS parameters (!!). + +### 8.3 UX Updates + +- Updated web page text; removed suspected prompt leakage. +- **Removed Apply button**: Its functionality was redundant with Submit (!). + +### 8.4 Unresolved Issues + +- When using `apex submit -s`, files cannot be passed from relaxation to properties calculation. +- Calculation failure reasons are not properly output or debugged. + +## 9. Extension Notes + +1. If the Submit page continues to grow, consider splitting `apex/gui.py` into: + - `apex/gui/layout.py` + - `apex/gui/callbacks_submit.py` + - `apex/gui/callbacks_account.py` +2. Add minimal unit tests for each callback, especially: + - `properties` filtering logic + - `apex.log` resubmission confirmation logic + - Account password non-echo logic +3. When adding a new profile, be sure to also add the four param sub-templates under `default_config//`. + +## 10. Quick Debug + +```bash +apex gui --no-browser +``` + +Default address: `http://127.0.0.1:8060/` + +If you modify the GUI, it is recommended to at least run: + +```bash +python -m py_compile apex/gui.py tests/test_gui_submit_builder.py +python -m unittest tests.test_gui_cli tests.test_gui_submit_builder -v +``` diff --git a/examples/abacus_demo/abacus_input/Al_ONCV_PBE-1.0.upf b/examples/abacus/abacus_input/Al_ONCV_PBE-1.0.upf similarity index 100% rename from examples/abacus_demo/abacus_input/Al_ONCV_PBE-1.0.upf rename to examples/abacus/abacus_input/Al_ONCV_PBE-1.0.upf diff --git a/examples/abacus_demo/abacus_input/Al_gga_9au_100Ry_4s4p1d.orb b/examples/abacus/abacus_input/Al_gga_9au_100Ry_4s4p1d.orb similarity index 100% rename from examples/abacus_demo/abacus_input/Al_gga_9au_100Ry_4s4p1d.orb rename to examples/abacus/abacus_input/Al_gga_9au_100Ry_4s4p1d.orb diff --git a/examples/abacus/abacus_input/INPUT b/examples/abacus/abacus_input/INPUT new file mode 100644 index 00000000..3fd16a24 --- /dev/null +++ b/examples/abacus/abacus_input/INPUT @@ -0,0 +1,21 @@ +INPUT_PARAMETERS +#Parameters (5.Mixing) +suffix ABACUS +calculation cell-relax +ntype 1 +symmetry 1 +#pseudo_type upf201 +ecutwfc 60 +scf_thr 1e-7 +scf_nmax 100 +basis_type pw +smearing_method gauss +smearing_sigma 0.002 +mixing_type pulay +mixing_beta 0.3 +ks_solver cg +cal_stress 1 +kspacing 0.2 +relax_nmax 100 +force_thr_ev 0.01 +stress_thr 0.1 diff --git a/examples/abacus_demo/confs/fcc-Al/STRU b/examples/abacus/confs/fcc-Al/STRU similarity index 100% rename from examples/abacus_demo/confs/fcc-Al/STRU rename to examples/abacus/confs/fcc-Al/STRU diff --git a/examples/abacus_demo/global_bohrium.json b/examples/abacus/global_bohrium.json similarity index 100% rename from examples/abacus_demo/global_bohrium.json rename to examples/abacus/global_bohrium.json diff --git a/examples/abacus_demo/param_joint.json b/examples/abacus/param_joint.json similarity index 100% rename from examples/abacus_demo/param_joint.json rename to examples/abacus/param_joint.json diff --git a/examples/abacus_demo/param_props.json b/examples/abacus/param_props.json similarity index 100% rename from examples/abacus_demo/param_props.json rename to examples/abacus/param_props.json diff --git a/examples/abacus_demo/param_relax.json b/examples/abacus/param_relax.json similarity index 100% rename from examples/abacus_demo/param_relax.json rename to examples/abacus/param_relax.json diff --git a/examples/finite_t_elastic_fcc_Al/confs/std-fcc/POSCAR b/examples/finite_t_elastic_fcc_Al/confs/std-fcc/POSCAR new file mode 100644 index 00000000..e67d4384 --- /dev/null +++ b/examples/finite_t_elastic_fcc_Al/confs/std-fcc/POSCAR @@ -0,0 +1,224 @@ +Al216 +1.0 +1.7117036944472709e+01 0.0000000000000000e+00 0.0000000000000000e+00 +8.5585294217279255e+00 1.4823807796464987e+01 0.0000000000000000e+00 +8.5585348288988587e+00 4.9412723872866708e+00 1.3976028851073826e+01 +Al +216 +Cartesian + 1.4264227524 2.4706266372 0.0000053373 + 4.2788245781 2.4706099273 0.0000000026 + 5.7052405561 4.9412347429 0.0000001876 + 2.8528632348 3.2941866190 2.3293428005 + 4.2792656443 5.7648113692 2.3293428005 + 5.7054070884 0.0000124454 0.0000012243 + 4.2793498748 2.4706361937 6.9880144255 + 5.7062179196 1.6470891572 4.6586716250 + 5.7057120609 3.2941866190 2.3293428005 + 7.1320945926 4.1177287227 4.6586716250 + 7.1321108085 5.7648113692 2.3293428005 + 8.5585144648 3.2942113253 2.3293288245 + 9.9849397891 4.1177287227 4.6586716250 + 8.5579146546 4.9412347848 0.0000003060 + 9.9849388879 5.7648113692 2.3293428005 + 11.4112765602 1.6470820081 4.6586436730 + 9.9845321963 2.4706099898 0.0000001794 + 11.4113596611 3.2941421476 2.3293428005 + 8.5585275743 6.5883534729 4.6586716250 + 8.5585541510 4.9412757677 6.9880144255 + 7.1316333877 2.4706362870 6.9880144255 + 12.8377678685 4.1177287227 4.6586716250 + 12.8377840843 5.7648113692 2.3293428005 + 12.8373002584 2.4705951039 0.0000000036 + 14.2642048576 3.2942113253 2.3293288245 + 15.6906130649 4.1177287227 4.6586716250 + 15.6906292807 5.7648113692 2.3293428005 + 17.1169498034 1.6470819517 4.6586436730 + 17.1170329370 3.2941421476 2.3293428005 + 14.2642008501 6.5883534729 4.6586716250 + 14.2642274269 4.9412757677 6.9880144255 + 12.8378714719 2.4706361938 6.9880144255 + 21.3962863407 4.1177287227 4.6586716250 + 18.5434411443 4.1177287227 4.6586716250 + 18.5434573601 5.7648113692 2.3293428005 + 19.9698741259 6.5883534729 4.6586716250 + 19.9699007027 4.9412757677 6.9880144255 + 21.3958566124 7.4118742506 0.0000000000 + 11.4113556537 6.5883534729 4.6586716250 + 7.1321099081 7.4119038987 0.0000000013 + 8.5585352316 8.2354509432 2.3293428005 + 9.9849519974 9.0589930469 4.6586716250 + 8.5585343728 9.8825434967 0.0000000693 + 9.9849596547 10.7060905172 2.3293428005 + 9.9849379947 7.4119039029 0.0000000131 + 11.4113633110 8.2354509432 2.3293428005 + 5.7056901059 8.2354509432 2.3293428005 + 7.1321070476 9.0589930469 4.6586716250 + 7.1321144603 10.7060905172 2.3293428005 + 8.5585312548 11.5296326209 4.6586716250 + 24.2484316107 12.3531237653 0.0000000404 + 7.1321081661 7.4119005179 6.9880144255 + 17.1170460465 6.5883534729 4.6586716250 + 11.4113764205 11.5296326209 4.6586716250 + 12.8377800768 9.0589930469 4.6586716250 + 12.8377877341 10.7060905172 2.3293428005 + 14.2642044999 11.5296326209 4.6586716250 + 12.8377782750 12.3531682228 0.0000000010 + 12.8373124646 7.4118594268 0.0000000000 + 14.2642085074 8.2354509432 2.3293428005 + 15.6906252732 9.0589930469 4.6586716250 + 14.2636684205 9.8824990014 0.0000000015 + 15.6906329306 10.7060905172 2.3293428005 + 15.6906240779 12.3531685730 0.0000009914 + 17.1170537039 8.2354509432 2.3293428005 + 17.1170496964 11.5296326209 4.6586716250 + 11.4113926364 13.1767152674 2.3293428005 + 14.2642378328 13.1767152674 2.3293428005 + 12.8377809780 7.4119005179 6.9880144255 + 14.2642054011 9.8825400919 6.9880144255 + 15.6906298243 12.3531796659 6.9880144255 + 15.6906261744 7.4119005179 6.9880144255 + 22.8227193223 6.5883534729 4.6586716250 + 18.5434704696 9.0589930469 4.6586716250 + 18.5434781270 10.7060905172 2.3293428005 + 19.9698948928 11.5296326209 4.6586716250 + 19.9698817832 8.2354509432 2.3293428005 + 21.3962985490 9.0589930469 4.6586716250 + 19.9698809240 9.8825434964 0.0000000685 + 21.3963062064 10.7060905172 2.3293428005 + 21.3958773797 12.3531533989 0.0000000008 + 22.8227229722 11.5296326209 4.6586716250 + 17.1170659122 13.1766856198 2.3293428005 + 18.5434750207 12.3531796659 6.9880144255 + 19.9698957940 9.8825400919 6.9880144255 + 21.3962994502 7.4119005179 6.9880144255 + 22.8227391880 13.1766856198 2.3293428005 + 25.6755690698 9.8825400919 6.9880144255 + 9.9853804964 15.6473548414 2.3293428005 + 17.1169677610 16.4709117690 4.6587135531 + 12.8372864314 15.6473548414 2.3293428005 + 12.8377751681 14.0002573711 4.6586716250 + 15.6907307241 15.6473548414 2.3293428005 + 15.6906118060 14.0002623124 4.6586856010 + 14.2642347265 14.8238044161 6.9880144255 + 18.5439867294 15.6473548414 2.3293428005 + 22.8226410369 16.4709117690 4.6587135531 + 19.9698961075 14.8238194209 0.0000328789 + 18.5434484439 14.0002573711 4.6586716250 + 21.3959589569 15.6473548414 2.3293428005 + 19.9698939916 13.1767547976 2.3293288245 + 21.3962765233 14.0002573711 4.6586716250 + 17.1170628059 14.8238044161 6.9880144255 + 24.2489410897 15.6473548414 2.3293428005 + 28.5277237748 16.4708969451 4.6586716250 + 25.6755686242 14.8238189827 0.0000316394 + 25.6755843845 13.1767547976 2.3293288245 + 27.1019754747 14.0002721949 4.6586716250 + 24.2491388368 14.0002573711 4.6586716250 + 22.8227531987 14.8238044161 6.9880144255 + 24.2492289730 17.2944439901 6.9880144255 + 8.5584352429 3.2941832558 9.3173572261 + 9.9849205211 4.1177254362 11.6466860506 + 9.9849281243 5.7648228126 9.3173572261 + 11.4107326926 3.2941832530 9.3173572261 + 5.7057063283 4.9412757677 6.9880144255 + 9.9850262941 2.4706362259 6.9880144255 + 11.4113977697 4.9412734739 13.9760288511 + 11.4113822304 4.9412757677 6.9880144255 + 12.8377656637 4.1177253429 11.6466860506 + 12.8377733207 5.7648228126 9.3173572261 + 15.6906185171 5.7648228126 9.3173572261 + 17.1170795317 4.9412782899 13.9760008990 + 17.1170726233 4.9412757677 6.9880144255 + 22.8222675316 3.2941832530 9.3173572261 + 18.5434465965 5.7648228126 9.3173572261 + 21.3962841359 4.1177253429 11.6466860506 + 21.3962917929 5.7648228126 9.3173572261 + 22.8227699572 4.9412783465 13.9760008990 + 24.2491293509 4.1177253751 11.6466860506 + 24.2491369893 5.7648228126 9.3173572261 + 9.9849528986 7.4119005179 6.9880144255 + 8.5585360096 6.5883649163 11.6466860506 + 9.9849575607 10.7060871368 9.3173572261 + 9.9849566374 12.3531796659 6.9880144255 + 11.4113991156 9.8825515353 13.9760288511 + 15.6906582034 7.4119267851 13.9760288511 + 11.4113791241 6.5883649163 11.6466860506 + 11.4113782229 8.2354475628 9.3173572261 + 11.4113773217 9.8825400919 6.9880144255 + 14.2642072035 6.5883649163 11.6466860506 + 12.8377949887 9.0589896665 11.6466860506 + 12.8378026461 10.7060871368 9.3173572261 + 14.2642194119 11.5296292405 11.6466860506 + 12.8378017449 12.3531796659 6.9880144255 + 14.2642063023 8.2354475628 9.3173572261 + 15.6906230681 9.0589896665 11.6466860506 + 15.6906307255 10.7060871368 9.3173572261 + 17.1170505975 9.8825400919 6.9880144255 + 19.9703643074 9.8825811829 13.9760288511 + 17.1170523999 6.5883649163 11.6466860506 + 17.1170474912 11.5296292405 11.6466860506 + 17.1170514987 8.2354475628 9.3173572261 + 19.9698975964 6.5883649163 11.6466860506 + 22.8227256758 6.5883649163 11.6466860506 + 18.5434682645 9.0589896665 11.6466860506 + 18.5434759219 10.7060871368 9.3173572261 + 19.9698926877 11.5296292405 11.6466860506 + 18.5434713708 7.4119005179 6.9880144255 + 19.9698966952 8.2354475628 9.3173572261 + 21.3963134610 9.0589896665 11.6466860506 + 21.3963211183 10.7060871368 9.3173572261 + 21.3963202171 12.3531796659 6.9880144255 + 22.8227247746 8.2354475628 9.3173572261 + 22.8227238734 9.8825400919 6.9880144255 + 17.1170551486 13.1767267109 9.3173572261 + 22.8227455414 13.1767267109 9.3173572261 + 22.8227644609 9.8825515353 13.9760288511 + 24.2499041497 7.4119712565 13.9760288511 + 25.6762001951 9.8825960067 13.9760288511 + 24.2491888840 12.3531911093 13.9760288511 + 27.1027016449 12.3532207569 13.9760288511 + 22.8227378841 11.5296292405 11.6466860506 + 25.6755699710 8.2354475628 9.3173572261 + 27.1019867368 9.0589896665 11.6466860506 + 28.5284111599 11.5296292405 11.6466860506 + 24.2491415404 9.0589896665 11.6466860506 + 24.2491491977 10.7060871368 9.3173572261 + 25.6755659635 11.5296292405 11.6466860506 + 24.2491482965 12.3531796659 6.9880144255 + 28.5284188172 13.1767267109 9.3173572261 + 14.2642480398 14.8238306833 13.9760288511 + 14.2642270692 13.1767267109 9.3173572261 + 15.6906438350 14.0002688146 11.6466860506 + 15.6906258168 15.6473514611 9.3173572261 + 17.1170425826 16.4708935648 11.6466860506 + 11.4113867976 14.8238044161 6.9880144255 + 18.5439471840 17.2944999050 13.9760288511 + 19.9698886802 14.8238010357 13.9760288511 + 22.8226379305 18.1179910351 9.3173572261 + 18.5434719144 14.0002688146 11.6466860506 + 18.5434710132 15.6473514611 9.3173572261 + 19.9698877790 16.4708935648 11.6466860506 + 19.9699003450 13.1767267109 9.3173572261 + 21.3963171108 14.0002688146 11.6466860506 + 19.9699080023 14.8238044161 6.9880144255 + 21.3962990926 15.6473514611 9.3173572261 + 22.8227158584 16.4708935648 11.6466860506 + 25.6756133071 14.8238306833 13.9760288511 + 27.1024143051 17.2944702574 13.9760288511 + 24.2491402815 18.9415331388 11.6466860506 + 25.6758939358 18.1179910351 9.3173572261 + 27.1013863816 18.9415331388 11.6466860506 + 28.5283112063 18.1179910351 9.3173572261 + 24.2491623072 14.0002688146 11.6466860506 + 24.2491442890 15.6473514611 9.3173572261 + 25.6755610548 16.4708935648 11.6466860506 + 27.1020741694 17.2944439901 6.9880144255 + 25.6755736208 13.1767267109 9.3173572261 + 27.1019903866 14.0002688146 11.6466860506 + 25.6755812781 14.8238044161 6.9880144255 + 27.1019894854 15.6473514611 9.3173572261 + 28.5284062512 16.4708935648 11.6466860506 + 29.9548355830 14.0002688146 11.6466860506 + 29.9548175648 15.6473514611 9.3173572261 + 31.3812343306 16.4708935648 11.6466860506 diff --git a/examples/finite_t_elastic_fcc_Al/frozen_model.pb b/examples/finite_t_elastic_fcc_Al/frozen_model.pb new file mode 100644 index 00000000..fba8946f Binary files /dev/null and b/examples/finite_t_elastic_fcc_Al/frozen_model.pb differ diff --git a/examples/finite_t_elastic_fcc_Al/global.json b/examples/finite_t_elastic_fcc_Al/global.json new file mode 100644 index 00000000..704aa2fa --- /dev/null +++ b/examples/finite_t_elastic_fcc_Al/global.json @@ -0,0 +1,7 @@ +{ + "lammps_image_name": "registry.dp.tech/dptech/deepmd-kit:3.1.1", + "lammps_run_command": "lmp -in in.lammps -log log.lammps -screen outlog", + "group_size": 1, + "pool_size": 1, + "scass_type": "c8_m31_1 * NVIDIA T4" +} diff --git a/examples/finite_t_elastic_fcc_Al/param_joint.json b/examples/finite_t_elastic_fcc_Al/param_joint.json new file mode 100644 index 00000000..7b6aa488 --- /dev/null +++ b/examples/finite_t_elastic_fcc_Al/param_joint.json @@ -0,0 +1,40 @@ +{ + "structures": ["confs/std-fcc"], + "interaction": { + "type": "deepmd", + "model": "./frozen_model.pb", + "type_map": { + "Al": 0 + } + }, + "relaxation": { + "cal_setting": { + "etol": 0, + "ftol": 1e-10, + "maxiter": 5000, + "maxeval": 500000 + } + }, + "properties": [ + { + "type": "finite_t_elastic", + "supercell_size": [2, 2, 2], + "rerun_finished": false, + "cal_setting": { + "temperature": [300], + "strain": 0.001, + "strain_components": ["xx", "yy", "zz", "yz", "xz", "xy"], + "equi_step": 16000, + "response_step": 16000, + "stress_output_every": 100, + "timestep": 0.001, + "tdamp": 0.1, + "pdamp": 1.0, + "seed": 12345, + "n_blocks": 10, + "method": "paired_langevin" + } + } + ] +} + diff --git a/examples/lammps_demo/frozen_model.pb b/examples/gamma/frozen_model.pb old mode 100644 new mode 100755 similarity index 100% rename from examples/lammps_demo/frozen_model.pb rename to examples/gamma/frozen_model.pb diff --git a/examples/lammps_demo/confs/std-bcc/POSCAR b/examples/gamma/gammaLine/POSCAR similarity index 100% rename from examples/lammps_demo/confs/std-bcc/POSCAR rename to examples/gamma/gammaLine/POSCAR diff --git a/examples/vasp_demo/confs/std-bcc/POSCAR b/examples/gamma/gammaSurface/POSCAR similarity index 100% rename from examples/vasp_demo/confs/std-bcc/POSCAR rename to examples/gamma/gammaSurface/POSCAR diff --git a/examples/gamma/global_bohrium.json b/examples/gamma/global_bohrium.json new file mode 100644 index 00000000..35e6b47c --- /dev/null +++ b/examples/gamma/global_bohrium.json @@ -0,0 +1,5 @@ +{ + "lammps_image_name": "registry.dp.tech/dptech/deepmd-kit:3.1.1", + "lammps_run_command":"lmp -in in.lammps -log log.lammps -screen outlog", + "scass_type":"c8_m31_1 * NVIDIA T4" +} diff --git a/examples/gamma/param_props_gammaline.gif b/examples/gamma/param_props_gammaline.gif new file mode 100644 index 00000000..2f30dca3 Binary files /dev/null and b/examples/gamma/param_props_gammaline.gif differ diff --git a/examples/gamma/param_props_gammaline.json b/examples/gamma/param_props_gammaline.json new file mode 100644 index 00000000..62592c38 --- /dev/null +++ b/examples/gamma/param_props_gammaline.json @@ -0,0 +1,28 @@ +{ + "structures": ["gammaLine"], + "interaction": { + "type": "deepmd", + "model": "frozen_model.pb", + "type_map": { + "Mo": 0 + } + }, + "relaxation": { + "cal_setting": {"etol": 0, + "ftol": 1e-10, + "maxiter": 5000, + "maximal": 500000} + }, + "properties": [ + { + "type": "gamma", + "req_calc": true, + "plane_miller": [1, 1, 0], + "slip_direction": [1, -1, -1], + "supercell_size": [1, 1, 20], + "vacuum_size": 15, + "add_fix": ["true", "true", "false"], + "n_steps": 20 + } + ] +} diff --git a/examples/gamma/param_props_gammasurface.gif b/examples/gamma/param_props_gammasurface.gif new file mode 100644 index 00000000..a0373735 Binary files /dev/null and b/examples/gamma/param_props_gammasurface.gif differ diff --git a/examples/gamma/param_props_gammasurface.json b/examples/gamma/param_props_gammasurface.json new file mode 100644 index 00000000..e268aa47 --- /dev/null +++ b/examples/gamma/param_props_gammasurface.json @@ -0,0 +1,29 @@ +{ + "structures": ["gammaSurface"], + "interaction": { + "type": "deepmd", + "model": "frozen_model.pb", + "type_map": { + "Mo": 0 + } + }, + "relaxation": { + "cal_setting": {"etol": 0, + "ftol": 1e-10, + "maxiter": 5000, + "maximal": 500000} + }, + "properties": [ + { + "type": "gamma_surface", + "req_calc": true, + "plane_miller": [1, 1, 0], + "slip_direction": [1, -1, -1], + "supercell_size": [1, 1, 20], + "vacuum_size": 15, + "add_fix": ["true", "true", "false"], + "n_steps_x": 20, + "n_steps_y": 20 + } + ] +} diff --git a/examples/lammps/apex_lammps_tutorial.md b/examples/lammps/apex_lammps_tutorial.md new file mode 100755 index 00000000..7d33e232 --- /dev/null +++ b/examples/lammps/apex_lammps_tutorial.md @@ -0,0 +1,463 @@ +# APEX LAMMPS Tutorial - Streamlined Examples Guide + +This guide demonstrates how to use APEX for alloy property calculations using LAMMPS, organized into three progressive tutorial levels. + +## Table of Contents + +- [Prerequisites](#prerequisites) +- [Tutorial 1: Quick Start Guide](#tutorial-1-quick-start-guide) + - [Example 1.1: Mo - Joint Calculation](#example-11-mo---joint-calculation) +- [Tutorial 2: Submission Methods](#tutorial-2-submission-methods) + - [Example 2.1: Bohrium Cloud Submission](#example-21-bohrium-cloud-submission) + - [Example 2.2: Local Debug Mode](#example-22-local-debug-mode) + - [Example 2.3: SLURM HPC Submission](#example-23-slurm-hpc-submission) +- [Tutorial 3: Potentials & Properties](#tutorial-3-potentials--properties) + - [Example 3.1: Different Potentials and Various Properties](#example-31-different-potentials-and-various-properties) +- [Reference Resources](#reference-resources) + +--- + +## Prerequisites + +- APEX installed (`pip install apex-flow` or `git clone https://github.com/deepmodeling/APEX.git && cd APEX && pip install .`) +- LAMMPS installed (for local debug mode) +- Bohrium account (for cloud submission) +- Basic knowledge of computational materials science + +--- + +## Tutorial 1: Quick Start Guide + +### Overview + +This section introduces APEX workflows through a practical quick-start example demonstrating a **joint calculation workflow** that combines structure relaxation and property calculations in a single submission. + +--- + +### Example 1.1: Mo - Joint Calculation + +**Path**: `lammps_tutorial1_quick_start/lammps_example1.1_Mo/` + +#### Purpose + +Demonstrates a **joint calculation workflow** for molybdenum (Mo), combining structure relaxation and property calculations in a single submission for rapid property exploration. + +#### Directory Structure + +``` +lammps_example1.1_Mo/ +├── confs/ +│ └── std-bcc/ +│ └── POSCAR # Mo structure (BCC phase) +├── param_joint.json # Joint calculation parameters +├── global_bohrium.json # Bohrium cloud configuration +└── frozen_model.pb # Deep Potential model +``` + +#### Configuration Files + +**`param_joint.json`**: Defines both relaxation and property parameters +- `structures`: Path to initial structures +- `interaction`: Deep Potential model specification +- `relaxation`: Structure optimization settings (tolerance, iterations) +- `properties`: Property calculations to perform (EOS, elastic, etc.) + +**`global_bohrium.json`**: Cloud platform configuration +- Server URL and authentication +- Computational resources (GPU/CPU) +- Software images for execution + +#### Submission + +```bash +apex submit param_joint.json -c global_bohrium.json +``` + +**To run in background**: +```bash +nohup apex submit param_joint.json -c global_bohrium.json > apex.log 2>&1 & +``` + +#### Result + +Results automatically saved to `all_result.json` containing both relaxation and property data. + +#### Visualization +In the directory contanting the `all_result.json` file, run the following command to generate the visualization report: +```bash +apex report +``` + +--- + +## Tutorial 2: Submission Methods + +APEX supports multiple submission methods for different computational environments. + +--- + +### Example 2.1: Bohrium Cloud Submission + +**Path**: `lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/` + +#### Introduction + +Bohrium platform provides pre-configured environments, automated scheduling, and visual monitoring. + +#### Configuration: `global_bohrium.json` + +```json +{ + "dflow_host": "https://workflows.deepmodeling.com", + "k8s_api_server": "https://workflows.deepmodeling.com", + "batch_type": "Bohrium", + "context_type": "Bohrium", + "email": "your_email@example.com", + "password": "your_password", + "program_id": 12345, + "apex_image_name": "registry.dp.tech/dptech/prod-11045/apex-dependency:1.2.0", + "lammps_image_name": "registry.dp.tech/dptech/prod-11045/deepmdkit-phonolammps:3.1.1", + "lammps_run_command": "lmp -in in.lammps", + "scass_type": "c8_m31_1 * NVIDIA T4" +} +``` + +#### Key Parameters + +- **Authentication**: Email, password, and Bohrium program ID +- **Images**: APEX and LAMMPS Docker images (check [Bohrium Registry](https://www.bohrium.com/web-images/public)) +- **Resources**: `scass_type` specifies CPU cores, memory, and GPU (check [Bohrium Profiler](https://www.bohrium.com/profiler)) + +#### Submission + +```bash +apex submit param_relax.json -c global_bohrium.json +``` + +#### Monitoring + +- Dashboard: check [Web Argo](https://workflows.deepmodeling.com) + + +--- + +### Example 2.2: Local Debug Mode + +**Path**: `lammps_tutorial2_submission_methods/lammps_example2.2_local/` + +#### Introduction + +Run LAMMPS directly on your local machine without requiring a cluster or cloud account. Ideal for quick testing and small-scale calculations. + +#### Prerequisites + +- LAMMPS executable installed and in PATH +- APEX installed in local Python + +#### Configuration: `global_local_debug.json` + +```json +{ + "run_command": "lmp -in in.lammps", + "context_type": "Local", + "batch_type": "Shell" +} +``` + +#### Directory Structure + +``` +lammps_example2.2_local/ +├── confs/ +│ └── std-fcc/ +│ └── POSCAR +├── param_joint.json # or separate relax/props files +├── param_props.json # property calculation parameters +├── param_relax.json # relaxation parameters +├── global_local_debug.json # Local configuration +└── Al.eam.alloy # EAM potential file +``` + +#### Submission with Debug Flag + +```bash +apex submit -d param_joint.json -c global_local_debug.json +``` + +**Key points**: +- `-d` flag enables debug mode (no containerization) +- Output streams directly to terminal in real-time +- Suitable for parameter verification and algorithm testing + +--- + +### Example 2.3: SLURM HPC Submission + +**Path**: `lammps_tutorial2_submission_methods/lammps_example2.3_slurm/` + +#### Introduction + +Submit jobs to remote HPC clusters managed by SLURM scheduler. + +#### Configuration: `global_hpc.json` + +```json +{ + "run_command":"mpirun -np 4 lmp -in in.lammps", + "context_type": "Local", + "machine":{ + "batch_type": "Slurm", + "context_type": "Local", + "local_root" : "./", + "remote_root": "./", + "clean_asynchronously": true + }, + "resources":{ + "number_node": 1, + "cpu_per_node": 4, + "gpu_per_node": 0, + "group_size": 1, + "module_list": ["deepmd-kit/3.1.0/cpu_binary_release"], + "custom_flags": [ + "#SBATCH --partition=xlong", + "#SBATCH --ntasks=4", + "#SBATCH --ntasks-per-core=1", + "#SBATCH --cpus-per-task=1", + "#SBATCH --mem=10G", + "#SBATCH --nodes=1", + "#SBATCH --time=1-00:00:00" + ] + } +} +``` + +#### Submission + +```bash +apex submit -d param_joint.json -c global_hpc.json +``` +**To run in background**: +```bash +nohup apex submit -d param_joint.json -c global_hpc.json > apex.log 2>&1 & +``` + +#### Monitoring + +Monitor on the remote HPC system: +```bash +squeue -u your_username +``` + +--- + +## Tutorial 3: Potentials & Properties + +### Example 3.1: Different Potentials and Various Properties + +**Path**: `lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/` + +#### Purpose + +Demonstrates calculations using different interatomic potentials (Deep Potential, EAM, MEAM) and various property types. + +#### Directory Structure + +``` +lammps_example3.1_potentials_and_properties/ +├── confs/ +│ └── std-fcc/ +│ └── POSCAR +├── Al.eam.alloy # EAM potential +├── Al.meam # MEAM potential +├── library.meam # MEAM library +├── param_relax_eam.json # EAM relaxation parameters +├── param_relax_meam.json # MEAM relaxation parameters +├── param_props_meam.json # MEAM property parameters +├── global_local_debug.json # Local debug configuration +└── support_potentials.txt # List of supported potentials +``` + +#### Supported Potentials + +APEX supports: +``` +['deepmd', 'eam_alloy', 'meam', 'eam_fs', 'meam_spline', 'snap', 'gap', 'rann', 'mace'] +``` + +#### EAM Potential Configuration + +**`param_relax_eam.json`**: + +```json +{ + "structures": ["confs/std-*"], + "interaction": { + "type": "eam_alloy", + "model": "Al.eam.alloy", + "type_map": {"Al": 0} + }, + "relaxation": { + "cal_setting": { + "etol": 0, + "ftol": 1e-10 + } + } +} +``` + +#### MEAM Potential Configuration + +**`param_relax_meam.json`**: + +```json +{ + "structures": ["confs/std-*"], + "interaction": { + "type": "meam", + "model": ["library.meam", "Al.meam"], + "type_map": {"Al": 0} + }, + "relaxation": { + "cal_setting": { + "etol": 0, + "ftol": 1e-10 + } + } +} +``` + +**Key Difference**: MEAM requires two files, library file and element-specific file. + +#### Property Calculations Configuration + +**`param_props_meam.json`**: + +```json +{ + "structures": ["confs/std-*"], + "interaction": { + "type": "meam", + "model": ["library.meam", "Al.meam"], + "type_map": {"Al": 0} + }, + "properties": [ + { + "type": "eos", + "skip": false, + "vol_start": 0.6, + "vol_end": 1.4, + "vol_step": 0.1 + }, + { + "type": "cohesive", + "latt_start": 0.6, + "latt_end": 1.4, + "latt_step": 0.1 + }, + { + "type": "decohesive", + "min_slab_size": 15, + "max_vacuum_size": 10, + "vacuum_size_step": 2, + "miller_index": [0, 0, 1] + }, + { + "type": "finite_t_latt", + "supercell_size": [2, 2, 2], + "cal_setting": { + "temperature": [200, 400, 600, 800], + "equi_step": 20000, + "N_every": 100, + "N_repeat": 10, + "N_freq": 2000, + "ave_step": 20000, + "timestep": 0.001, + "tdamp": 0.1, + "pdamp": 1.0} + }, + { + "type": "elastic", + "skip": false + }, + { + "type": "surface", + "skip": true + }, + { + "type": "vacancy", + "skip": true, + "supercell": [2, 2, 2] + }, + { + "type": "interstitial", + "skip": true, + "insert_ele": ["Al"] + }, + { + "type": "gamma", + "skip": true, + "plane_miller": [1, 1, 1], + "slip_direction": [1, 1, -2] + } + ] +} +``` + +#### Supported Property Types + +| Property | Description | Key Parameters | +|----------|-------------|-----------------| +| **eos** | Equation of State | vol_start, vol_end, vol_step | +| **cohesive** | Cohesive energy line | latt_start, latt_end, latt_step | +| **decohesive** | Decohesive energy line | min_slab_size, miller_index, max_vacuum_size, vacuum_size_step | +| **elastic** | Elastic Constants | norm_deform, shear_deform | +| **surface** | Surface Energy | min_slab_size, max_miller | +| **vacancy** | Vacancy Formation | supercell | +| **interstitial** | Interstitial Formation | insert_ele, supercell | +| **gamma** | Stacking Fault Energy | plane_miller, slip_direction | +| **finite_t_latt** | Lattice parameters at finite temperatures | supercell_size | +| **phonon** | Phonon Spectra | supercell_size, MESH | + +#### Workflow Execution + + +**Step 1: Relaxation with MEAM** + +Run MEAM relaxation: +```bash +apex submit -d param_relax_meam.json -c global_local_debug.json +``` + +**Step 2: Property Calculation with MEAM** + +Then compute properties: +```bash +apex submit -d param_props_meam.json -c global_local_debug.json +``` + +#### Controlling Calculations + +Use `"skip": true/false` to enable/disable properties: +- `"skip": false`: Calculate property +- `"skip": true`: Skip property + +Simply delete unused property blocks to simplify the configuration. + +--- + +## Reference Resources + +- [APEX GitHub Repository](https://github.com/deepmodeling/APEX) +- [APEX Publication](https://doi.org/10.1038/s41524-025-01580-y) +- [Bohrium Platform](https://bohrium.dp.tech/) +- [Bohrium Workflow Dashboard](https://workflows.deepmodeling.com) +- [Bohrium Public Image Registry](https://bohrium.dp.tech/apps/web-images) +- [DPDispatcher Documentation](https://docs.deepmodeling.com/projects/dpdispatcher) +- [Dflow Framework](https://github.com/deepmodeling/dflow) +- [Materials Project](https://materialsproject.org/) + +--- + +**Last Updated**: December 2025 +**APEX Version**: 1.3+ +**Document Status**: Streamlined Tutorial Series diff --git a/examples/lammps_demo/confs/std-fcc/POSCAR b/examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo/confs/std-bcc/POSCAR old mode 100644 new mode 100755 similarity index 100% rename from examples/lammps_demo/confs/std-fcc/POSCAR rename to examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo/confs/std-bcc/POSCAR diff --git a/examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo/frozen_model.pb b/examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo/frozen_model.pb new file mode 100755 index 00000000..2adc962a Binary files /dev/null and b/examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo/frozen_model.pb differ diff --git a/examples/lammps_demo/global_bohrium.json b/examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo/global_bohrium.json old mode 100644 new mode 100755 similarity index 51% rename from examples/lammps_demo/global_bohrium.json rename to examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo/global_bohrium.json index 2f48a6a3..ef92c756 --- a/examples/lammps_demo/global_bohrium.json +++ b/examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo/global_bohrium.json @@ -1,15 +1,13 @@ { "dflow_host": "https://workflows.deepmodeling.com", "k8s_api_server": "https://workflows.deepmodeling.com", - "email": "YOUR_EMAIL", - "password": "YOUR_PASSWD", - "program_id": 1234, - "apex_image_name":"registry.dp.tech/dptech/prod-11045/apex-dependency:1.2.0", - "lammps_image_name": "registry.dp.tech/dptech/prod-11045/deepmdkit-phonolammps:2.1.1", - "group_size": 4, - "pool_size": 1, - "run_command":"lmp -in in.lammps", "batch_type": "Bohrium", "context_type": "Bohrium", - "scass_type":"1 * NVIDIA P100_16g" + "email": "YOUREMAIL@abc.com", + "password": "password", + "program_id": 1234, + "apex_image_name":"registry.dp.tech/dptech/prod-11045/apex-dependency:1.2.0", + "lammps_image_name": "registry.dp.tech/dptech/deepmd-kit:3.1.1", + "lammps_run_command":"lmp -in in.lammps", + "scass_type":"c8_m31_1 * NVIDIA T4" } diff --git a/examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo/param_joint.json b/examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo/param_joint.json new file mode 100755 index 00000000..9a32cf6c --- /dev/null +++ b/examples/lammps/lammps_tutorial1_quick_start/lammps_example1.1_Mo/param_joint.json @@ -0,0 +1,31 @@ +{ + "structures": ["confs/std-bcc"], + "interaction": { + "type": "deepmd", + "model": "frozen_model.pb", + "type_map": {"Mo": 0} + }, + "relaxation": { + "cal_setting": {"etol": 0, + "ftol": 1e-10, + "maxiter": 5000, + "maximal": 500000} + }, + "properties": [ + { + "type": "eos", + "vol_start": 0.6, + "vol_end": 1.4, + "vol_step": 0.05, + "cal_setting": {"etol": 0, + "ftol": 1e-10} + }, + { + "type": "elastic", + "norm_deform": 1e-2, + "shear_deform": 1e-2, + "cal_setting": {"etol": 0, + "ftol": 1e-10} + } + ] +} diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/Al.eam.alloy b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/Al.eam.alloy new file mode 100755 index 00000000..b05f1803 --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/Al.eam.alloy @@ -0,0 +1,4923 @@ +! EAM potential for Al from the original analytical potential in file Al-EAM-Zhak1 of 2 October 2007. +! Vasily V. Zhakhovsky: 6asi1z@gmail.com. The potential is fitted by stress-matching method upto compression V/V0=0.3 +! bulk modulus B=81.57 GPa at (P=0,T=0). See details in Appl. Surf. Sci., vol.255, pp. 9592-9596 (2009) + 1 Al + 8193 6.7138671875E-04 8193 8.392333984375E-04 6.875 +13 26.9815384 4.032 fcc + 0.0000000000000000E+00 -6.3980610815881616E-03 -1.2780087746439362E-02 -1.9146131609598164E-02 -2.5496244064162111E-02 +-3.1830476282473409E-02 -3.8148879217302950E-02 -4.4451503603026750E-02 -5.0738399956794779E-02 -5.7009618579692320E-02 +-6.3265209557893928E-02 -6.9505222763809896E-02 -7.5729707857225548E-02 -8.1938714286432998E-02 -8.8132291289356054E-02 +-9.4310487894667575E-02 -1.0047335292289995E-01 -1.0662093498754849E-01 -1.1275328249616762E-01 -1.1887044365146048E-01 +-1.2497246645236110E-01 -1.3105939869511032E-01 -1.3713128797432445E-01 -1.4318818168405720E-01 -1.4923012701885524E-01 +-1.5525717097480685E-01 -1.6126936035058384E-01 -1.6726674174847725E-01 -1.7324936157542620E-01 -1.7921726604404065E-01 +-1.8517050117361730E-01 -1.9110911279114950E-01 -1.9703314653233064E-01 -2.0294264784255128E-01 -2.0883766197789014E-01 +-2.1471823400609871E-01 -2.2058440880758026E-01 -2.2643623107636177E-01 -2.3227374532106085E-01 -2.3809699586584576E-01 +-2.4390602685139035E-01 -2.4970088223582243E-01 -2.5548160579566631E-01 -2.6124824112677997E-01 -2.6700083164528560E-01 +-2.7273942058849571E-01 -2.7846405101583172E-01 -2.8417476580973894E-01 -2.8987160767659403E-01 -2.9555461914760800E-01 +-3.0122384257972362E-01 -3.0687932015650665E-01 -3.1252109388903221E-01 -3.1814920561676563E-01 -3.2376369700843777E-01 +-3.2936460956291469E-01 -3.3495198461006304E-01 -3.4052586331160889E-01 -3.4608628666199176E-01 -3.5163329548921457E-01 +-3.5716693045568659E-01 -3.6268723205906173E-01 -3.6819424063307360E-01 -3.7368799634836286E-01 -3.7916853921330085E-01 +-3.8463590907480871E-01 -3.9009014561916999E-01 -3.9553128837284085E-01 -4.0095937670325221E-01 -4.0637444981960918E-01 +-4.1177654677368586E-01 -4.1716570646061457E-01 -4.2254196761966917E-01 -4.2790536883504643E-01 -4.3325594853664073E-01 +-4.3859374500081461E-01 -4.4391879635116449E-01 -4.4923114055928232E-01 -4.5453081544551249E-01 -4.5981785867970415E-01 +-4.6509230778195859E-01 -4.7035420012337292E-01 -4.7560357292677935E-01 -4.8084046326747909E-01 -4.8606490807397301E-01 +-4.9127694412868728E-01 -4.9647660806869481E-01 -5.0166393638643314E-01 -5.0683896543041651E-01 -5.1200173140594563E-01 +-5.1715227037581157E-01 -5.2229061826099710E-01 -5.2741681084137171E-01 -5.3253088375638546E-01 -5.3763287250575564E-01 +-5.4272281245015264E-01 -5.4780073881187807E-01 -5.5286668667554240E-01 -5.5792069098873676E-01 -5.6296278656270082E-01 +-5.6799300807298725E-01 -5.7301139006012269E-01 -5.7801796693026386E-01 -5.8301277295584997E-01 -5.8799584227625301E-01 +-5.9296720889842125E-01 -5.9792690669752191E-01 -6.0287496941757857E-01 -6.0781143067210541E-01 -6.1273632394473598E-01 +-6.1764968258985264E-01 -6.2255153983320777E-01 -6.2744192877254312E-01 -6.3232088237820683E-01 -6.3718843349376453E-01 +-6.4204461483660968E-01 -6.4688945899856709E-01 -6.5172299844649595E-01 -6.5654526552288817E-01 -6.6135629244646288E-01 +-6.6615611131275820E-01 -6.7094475409471876E-01 -6.7572225264328145E-01 -6.8048863868795639E-01 -6.8524394383740483E-01 +-6.8998819958001401E-01 -6.9472143728446933E-01 -6.9944368820032166E-01 -7.0415498345855265E-01 -7.0885535407213718E-01 +-7.1354483093660126E-01 -7.1822344483057787E-01 -7.2289122641635906E-01 -7.2754820624044525E-01 -7.3219441473409097E-01 +-7.3682988221384871E-01 -7.4145463888210783E-01 -7.4606871482763215E-01 -7.5067214002609273E-01 -7.5526494434060099E-01 +-7.5984715752223342E-01 -7.6441880921055916E-01 -7.6897992893416089E-01 -7.7353054611115368E-01 -7.7807069004970031E-01 +-7.8260038994852643E-01 -7.8711967489743007E-01 -7.9162857387778784E-01 -7.9612711576306161E-01 -8.0061532931929869E-01 +-8.0509324320563203E-01 -8.0956088597477571E-01 -8.1401828607351900E-01 -8.1846547184321594E-01 -8.2290247152027596E-01 +-8.2732931323664538E-01 -8.3174602502029404E-01 -8.3615263479569168E-01 -8.4054917038428800E-01 -8.4493565950498584E-01 +-8.4931212977461368E-01 -8.5367860870839474E-01 -8.5803512372041402E-01 -8.6238170212408294E-01 -8.6671837113260020E-01 +-8.7104515785941183E-01 -8.7536208931866744E-01 -8.7966919242567443E-01 -8.8396649399734928E-01 -8.8825402075266757E-01 +-8.9253179931310944E-01 -8.9679985620310476E-01 -9.0105821785047624E-01 -9.0530691058687529E-01 -9.0954596064822291E-01 +-9.1377539417514164E-01 -9.1799523721338971E-01 -9.2220551571428966E-01 -9.2640625553515699E-01 -9.3059748243972407E-01 +-9.3477922209856457E-01 -9.3895150008951367E-01 -9.4311434189808574E-01 -9.4726777291789188E-01 -9.5141181845105205E-01 +-9.5554650370860938E-01 -9.5967185381093600E-01 -9.6378789378814333E-01 -9.6789464858048602E-01 -9.7199214303876480E-01 +-9.7608040192472667E-01 -9.8015944991146475E-01 -9.8422931158381322E-01 -9.8829001143874307E-01 -9.9234157388575273E-01 +-9.9638402324725928E-01 -1.0004173837589863E+00 -1.0044416795703488E+00 -1.0084569347448391E+00 -1.0124631732604059E+00 +-1.0164604190098367E+00 -1.0204486958011341E+00 -1.0244280273578910E+00 -1.0283984373196664E+00 -1.0323599492423556E+00 +-1.0363125865985594E+00 -1.0402563727779541E+00 -1.0441913310876558E+00 -1.0481174847525840E+00 -1.0520348569158255E+00 +-1.0559434706389921E+00 -1.0598433489025807E+00 -1.0637345146063288E+00 -1.0676169905695700E+00 -1.0714907995315843E+00 +-1.0753559641519510E+00 -1.0792125070108969E+00 -1.0830604506096431E+00 -1.0868998173707503E+00 -1.0907306296384620E+00 +-1.0945529096790474E+00 -1.0983666796811400E+00 -1.1021719617560755E+00 -1.1059687779382292E+00 -1.1097571501853492E+00 +-1.1135371003788910E+00 -1.1173086503243468E+00 -1.1210718217515754E+00 -1.1248266363151305E+00 -1.1285731155945860E+00 +-1.1323112810948601E+00 -1.1360411542465385E+00 -1.1397627564061943E+00 -1.1434761088567096E+00 -1.1471812328075883E+00 +-1.1508781493952780E+00 -1.1545668796834805E+00 -1.1582474446634645E+00 -1.1619198652543787E+00 -1.1655841623035592E+00 +-1.1692403565868390E+00 -1.1728884688088537E+00 -1.1765285196033450E+00 -1.1801605295334661E+00 -1.1837845190920824E+00 +-1.1874005087020700E+00 -1.1910085187166175E+00 -1.1946085694195188E+00 -1.1982006810254731E+00 -1.2017848736803753E+00 +-1.2053611674616100E+00 -1.2089295823783435E+00 -1.2124901383718101E+00 -1.2160428553156031E+00 -1.2195877530159611E+00 +-1.2231248512120514E+00 -1.2266541695762552E+00 -1.2301757277144487E+00 -1.2336895451662855E+00 -1.2371956414054741E+00 +-1.2406940358400571E+00 -1.2441847478126871E+00 -1.2476677966009024E+00 -1.2511432014174004E+00 -1.2546109814103106E+00 +-1.2580711556634638E+00 -1.2615237431966646E+00 -1.2649687629659565E+00 -1.2684062338638924E+00 -1.2718361747197968E+00 +-1.2752586043000327E+00 -1.2786735413082617E+00 -1.2820810043857103E+00 -1.2854810121114240E+00 -1.2888735830025326E+00 +-1.2922587355145030E+00 -1.2956364880413977E+00 -1.2990068589161314E+00 -1.3023698664107217E+00 -1.3057255287365441E+00 +-1.3090738640445827E+00 -1.3124148904256809E+00 -1.3157486259107882E+00 -1.3190750884712106E+00 -1.3223942960188553E+00 +-1.3257062664064765E+00 -1.3290110174279195E+00 -1.3323085668183621E+00 -1.3355989322545585E+00 -1.3388821313550789E+00 +-1.3421581816805463E+00 -1.3454271007338781E+00 -1.3486889059605212E+00 -1.3519436147486870E+00 -1.3551912444295884E+00 +-1.3584318122776695E+00 -1.3616653355108419E+00 -1.3648918312907121E+00 -1.3681113167228138E+00 -1.3713238088568367E+00 +-1.3745293246868528E+00 -1.3777278811515432E+00 -1.3809194951344248E+00 -1.3841041834640759E+00 -1.3872819629143534E+00 +-1.3904528502046229E+00 -1.3936168619999747E+00 -1.3967740149114454E+00 -1.3999243254962372E+00 -1.4030678102579346E+00 +-1.4062044856467231E+00 -1.4093343680596031E+00 -1.4124574738406064E+00 -1.4155738192810079E+00 -1.4186834206195398E+00 +-1.4217862940426038E+00 -1.4248824556844806E+00 -1.4279719216275382E+00 -1.4310547079024438E+00 -1.4341308304883693E+00 +-1.4372003053131976E+00 -1.4402631482537294E+00 -1.4433193751358879E+00 -1.4463690017349198E+00 -1.4494120437756022E+00 +-1.4524485169324410E+00 -1.4554784368298734E+00 -1.4585018190424661E+00 -1.4615186790951151E+00 -1.4645290324632450E+00 +-1.4675328945730011E+00 -1.4705302808014526E+00 -1.4735212064767806E+00 -1.4765056868784767E+00 -1.4794837372375345E+00 +-1.4824553727366423E+00 -1.4854206085103727E+00 -1.4883794596453768E+00 -1.4913319411805712E+00 -1.4942780681073256E+00 +-1.4972178553696529E+00 -1.5001513178643955E+00 -1.5030784704414093E+00 -1.5059993279037525E+00 -1.5089139050078655E+00 +-1.5118222164637583E+00 -1.5147242769351901E+00 -1.5176201010398527E+00 -1.5205097033495485E+00 -1.5233930983903745E+00 +-1.5262703006428993E+00 -1.5291413245423402E+00 -1.5320061844787416E+00 -1.5348648947971535E+00 -1.5377174697978022E+00 +-1.5405639237362727E+00 -1.5434042708236753E+00 -1.5462385252268231E+00 -1.5490667010684036E+00 -1.5518888124271497E+00 +-1.5547048733380116E+00 -1.5575148977923274E+00 -1.5603188997379884E+00 -1.5631168930796138E+00 -1.5659088916787132E+00 +-1.5686949093538560E+00 -1.5714749598808369E+00 -1.5742490569928418E+00 -1.5770172143806125E+00 -1.5797794456926082E+00 +-1.5825357645351721E+00 -1.5852861844726918E+00 -1.5880307190277605E+00 -1.5907693816813393E+00 -1.5935021858729166E+00 +-1.5962291450006663E+00 -1.5989502724216085E+00 -1.6016655814517657E+00 -1.6043750853663226E+00 -1.6070787973997782E+00 +-1.6097767307461048E+00 -1.6124688985589024E+00 -1.6151553139515531E+00 -1.6178359899973733E+00 -1.6205109397297690E+00 +-1.6231801761423852E+00 -1.6258437121892602E+00 -1.6285015607849738E+00 -1.6311537348048000E+00 -1.6338002470848538E+00 +-1.6364411104222427E+00 -1.6390763375752118E+00 -1.6417059412632944E+00 -1.6443299341674549E+00 -1.6469483289302387E+00 +-1.6495611381559154E+00 -1.6521683744106244E+00 -1.6547700502225178E+00 -1.6573661780819053E+00 -1.6599567704413969E+00 +-1.6625418397160427E+00 -1.6651213982834776E+00 -1.6676954584840606E+00 -1.6702640326210150E+00 -1.6728271329605680E+00 +-1.6753847717320898E+00 -1.6779369611282320E+00 -1.6804837133050645E+00 -1.6830250403822149E+00 -1.6855609544430019E+00 +-1.6880914675345726E+00 -1.6906165916680389E+00 -1.6931363388186111E+00 -1.6956507209257297E+00 -1.6981597498932033E+00 +-1.7006634375893386E+00 -1.7031617958470726E+00 -1.7056548364641044E+00 -1.7081425712030294E+00 -1.7106250117914634E+00 +-1.7131021699221787E+00 -1.7155740572532303E+00 -1.7180406854080847E+00 -1.7205020659757493E+00 -1.7229582105108994E+00 +-1.7254091305340051E+00 -1.7278548375314577E+00 -1.7302953429556960E+00 -1.7327306582253312E+00 -1.7351607947252727E+00 +-1.7375857638068499E+00 -1.7400055767879401E+00 -1.7424202449530866E+00 -1.7448297795536261E+00 -1.7472341918078076E+00 +-1.7496334929009132E+00 -1.7520276939853840E+00 -1.7544168061809360E+00 -1.7568008405746804E+00 -1.7591798082212455E+00 +-1.7615537201428926E+00 -1.7639225873296371E+00 -1.7662864207393636E+00 -1.7686452312979479E+00 -1.7709990298993665E+00 +-1.7733478274058194E+00 -1.7756916346478431E+00 -1.7780304624244265E+00 -1.7803643215031246E+00 -1.7826932226201759E+00 +-1.7850171764806109E+00 -1.7873361937583703E+00 -1.7896502850964167E+00 -1.7919594611068432E+00 -1.7942637323709913E+00 +-1.7965631094395578E+00 -1.7988576028327066E+00 -1.8011472230401799E+00 -1.8034319805214065E+00 -1.8057118857056158E+00 +-1.8079869489919382E+00 -1.8102571807495222E+00 -1.8125225913176390E+00 -1.8147831910057870E+00 -1.8170389900938038E+00 +-1.8192899988319711E+00 -1.8215362274411189E+00 -1.8237776861127335E+00 -1.8260143850090631E+00 -1.8282463342632191E+00 +-1.8304735439792863E+00 -1.8326960242324193E+00 -1.8349137850689516E+00 -1.8371268365064994E+00 -1.8393351885340583E+00 +-1.8415388511121096E+00 -1.8437378341727222E+00 -1.8459321476196520E+00 -1.8481218013284446E+00 -1.8503068051465330E+00 +-1.8524871688933398E+00 -1.8546629023603771E+00 -1.8568340153113438E+00 -1.8590005174822248E+00 -1.8611624185813891E+00 +-1.8633197282896905E+00 -1.8654724562605598E+00 -1.8676206121201064E+00 -1.8697642054672130E+00 -1.8719032458736289E+00 +-1.8740377428840747E+00 -1.8761677060163267E+00 -1.8782931447613189E+00 -1.8804140685832358E+00 -1.8825304869196049E+00 +-1.8846424091813947E+00 -1.8867498447531026E+00 -1.8888528029928520E+00 -1.8909512932324843E+00 -1.8930453247776480E+00 +-1.8951349069078967E+00 -1.8972200488767721E+00 -1.8993007599119018E+00 -1.9013770492150892E+00 -1.9034489259624012E+00 +-1.9055163993042588E+00 -1.9075794783655264E+00 -1.9096381722456026E+00 -1.9116924900185115E+00 -1.9137424407329819E+00 +-1.9157880334125439E+00 -1.9178292770556147E+00 -1.9198661806355821E+00 -1.9218987531008989E+00 -1.9239270033751601E+00 +-1.9259509403571966E+00 -1.9279705729211583E+00 -1.9299859099165995E+00 -1.9319969601685629E+00 -1.9340037324776678E+00 +-1.9360062356201928E+00 -1.9380044783481563E+00 -1.9399984693894083E+00 -1.9419882174477048E+00 -1.9439737312027978E+00 +-1.9459550193105140E+00 -1.9479320904028399E+00 -1.9499049530879993E+00 -1.9518736159505428E+00 -1.9538380875514205E+00 +-1.9557983764280689E+00 -1.9577544910944886E+00 -1.9597064400413278E+00 -1.9616542317359580E+00 -1.9635978746225566E+00 +-1.9655373771221862E+00 -1.9674727476328737E+00 -1.9694039945296860E+00 -1.9713311261648119E+00 -1.9732541508676418E+00 +-1.9751730769448370E+00 -1.9770879126804188E+00 -1.9789986663358350E+00 -1.9809053461500448E+00 -1.9828079603395898E+00 +-1.9847065170986731E+00 -1.9866010245992327E+00 -1.9884914909910221E+00 -1.9903779244016797E+00 -1.9922603329368058E+00 +-1.9941387246800379E+00 -1.9960131076931265E+00 -1.9978834900160054E+00 -1.9997498796668682E+00 -2.0016122846422411E+00 +-2.0034707129170544E+00 -2.0053251724447203E+00 -2.0071756711571989E+00 -2.0090222169650747E+00 -2.0108648177576267E+00 +-2.0127034814029017E+00 -2.0145382157477854E+00 -2.0163690286180702E+00 -2.0181959278185317E+00 -2.0200189211329933E+00 +-2.0218380163244030E+00 -2.0236532211348970E+00 -2.0254645432858722E+00 -2.0272719904780558E+00 -2.0290755703915759E+00 +-2.0308752906860272E+00 -2.0326711590005391E+00 -2.0344631829538482E+00 -2.0362513701443636E+00 -2.0380357281502346E+00 +-2.0398162645294184E+00 -2.0415929868197478E+00 -2.0433659025389974E+00 -2.0451350191849507E+00 -2.0469003442354681E+00 +-2.0486618851485487E+00 -2.0504196493624010E+00 -2.0521736442955043E+00 -2.0539238773466804E+00 -2.0556703558951503E+00 +-2.0574130873006027E+00 -2.0591520789032627E+00 -2.0608873380239512E+00 -2.0626188719641489E+00 -2.0643466880060624E+00 +-2.0660707934126865E+00 -2.0677911954278700E+00 -2.0695079012763733E+00 -2.0712209181639367E+00 -2.0729302532773399E+00 +-2.0746359137844657E+00 -2.0763379068343619E+00 -2.0780362395573020E+00 -2.0797309190648470E+00 -2.0814219524499094E+00 +-2.0831093467868120E+00 -2.0847931091313465E+00 -2.0864732465208387E+00 -2.0881497659742063E+00 -2.0898226744920207E+00 +-2.0914919790565643E+00 -2.0931576866318915E+00 -2.0948198041638890E+00 -2.0964783385803343E+00 -2.0981332967909552E+00 +-2.0997846856874869E+00 -2.1014325121437323E+00 -2.1030767830156183E+00 -2.1047175051412577E+00 -2.1063546853410031E+00 +-2.1079883304175060E+00 -2.1096184471557731E+00 -2.1112450423232270E+00 -2.1128681226697594E+00 -2.1144876949277878E+00 +-2.1161037658123152E+00 -2.1177163420209832E+00 -2.1193254302341304E+00 -2.1209310371148460E+00 -2.1225331693090266E+00 +-2.1241318334454333E+00 -2.1257270361357432E+00 -2.1273187839746086E+00 -2.1289070835397075E+00 -2.1304919413918002E+00 +-2.1320733640747860E+00 -2.1336513581157530E+00 -2.1352259300250340E+00 -2.1367970862962622E+00 -2.1383648334064209E+00 +-2.1399291778158993E+00 -2.1414901259685459E+00 -2.1430476842917190E+00 -2.1446018591963427E+00 -2.1461526570769567E+00 +-2.1477000843117700E+00 -2.1492441472627117E+00 -2.1507848522754855E+00 -2.1523222056796176E+00 -2.1538562137885129E+00 +-2.1553868828995006E+00 -2.1569142192938902E+00 -2.1584382292370208E+00 -2.1599589189783113E+00 -2.1614762947513113E+00 +-2.1629903627737512E+00 -2.1645011292475944E+00 -2.1660086003590822E+00 -2.1675127822787883E+00 -2.1690136811616694E+00 +-2.1705113031471068E+00 -2.1720056543589661E+00 -2.1734967409056378E+00 -2.1749845688800917E+00 -2.1764691443599200E+00 +-2.1779504734073911E+00 -2.1794285620694964E+00 -2.1809034163779963E+00 -2.1823750423494701E+00 -2.1838434459853628E+00 +-2.1853086332720335E+00 -2.1867706101808015E+00 -2.1882293826679953E+00 -2.1896849566749985E+00 -2.1911373381282959E+00 +-2.1925865329395218E+00 -2.1940325470055053E+00 -2.1954753862083178E+00 -2.1969150564153157E+00 -2.1983515634791946E+00 +-2.1997849132380236E+00 -2.2012151115153000E+00 -2.2026421641199914E+00 -2.2040660768465803E+00 -2.2054868554751108E+00 +-2.2069045057712326E+00 -2.2083190334862461E+00 -2.2097304443571471E+00 -2.2111387441066706E+00 -2.2125439384433370E+00 +-2.2139460330614922E+00 -2.2153450336413569E+00 -2.2167409458490672E+00 -2.2181337753367165E+00 -2.2195235277424032E+00 +-2.2209102086902717E+00 -2.2222938237905550E+00 -2.2236743786396200E+00 -2.2250518788200053E+00 -2.2264263299004710E+00 +-2.2277977374360369E+00 -2.2291661069680249E+00 -2.2305314440240998E+00 -2.2318937541183166E+00 -2.2332530427511590E+00 +-2.2346093154095783E+00 -2.2359625775670402E+00 -2.2373128346835629E+00 -2.2386600922057607E+00 -2.2400043555668816E+00 +-2.2413456301868533E+00 -2.2426839214723193E+00 -2.2440192348166805E+00 -2.2453515756001381E+00 -2.2466809491897348E+00 +-2.2480073609393885E+00 -2.2493308161899384E+00 -2.2506513202691831E+00 -2.2519688784919216E+00 -2.2532834961599897E+00 +-2.2545951785623028E+00 -2.2559039309748927E+00 -2.2572097586609505E+00 -2.2585126668708604E+00 -2.2598126608422437E+00 +-2.2611097457999927E+00 -2.2624039269563152E+00 -2.2636952095107676E+00 -2.2649835986502969E+00 -2.2662690995492740E+00 +-2.2675517173695394E+00 -2.2688314572604344E+00 -2.2701083243588420E+00 -2.2713823237892243E+00 -2.2726534606636588E+00 +-2.2739217400818759E+00 -2.2751871671313006E+00 -2.2764497468870815E+00 -2.2777094844121351E+00 -2.2789663847571782E+00 +-2.2802204529607684E+00 -2.2814716940493347E+00 -2.2827201130372203E+00 -2.2839657149267150E+00 -2.2852085047080957E+00 +-2.2864484873596549E+00 -2.2876856678477449E+00 -2.2889200511268073E+00 -2.2901516421394126E+00 -2.2913804458162952E+00 +-2.2926064670763862E+00 -2.2938297108268513E+00 -2.2950501819631248E+00 -2.2962678853689464E+00 -2.2974828259163922E+00 +-2.2986950084659146E+00 -2.2999044378663722E+00 -2.3011111189550677E+00 -2.3023150565577808E+00 -2.3035162554888027E+00 +-2.3047147205509702E+00 -2.3059104565356994E+00 -2.3071034682230218E+00 -2.3082937603816154E+00 -2.3094813377688390E+00 +-2.3106662051307660E+00 -2.3118483672022192E+00 -2.3130278287068027E+00 -2.3142045943569336E+00 -2.3153786688538784E+00 +-2.3165500568877850E+00 -2.3177187631377132E+00 -2.3188847922716689E+00 -2.3200481489466398E+00 -2.3212088378086233E+00 +-2.3223668634926602E+00 -2.3235222306228684E+00 -2.3246749438124743E+00 -2.3258250076638425E+00 -2.3269724267685121E+00 +-2.3281172057072270E+00 -2.3292593490499653E+00 -2.3303988613559725E+00 -2.3315357471737941E+00 -2.3326700110413050E+00 +-2.3338016574857425E+00 -2.3349306910237364E+00 -2.3360571161613408E+00 -2.3371809373940629E+00 -2.3383021592068958E+00 +-2.3394207860743501E+00 -2.3405368224604830E+00 -2.3416502728189288E+00 -2.3427611415929301E+00 -2.3438694332153664E+00 +-2.3449751521087872E+00 -2.3460783026854366E+00 -2.3471788893472936E+00 -2.3482769164860895E+00 -2.3493723884833457E+00 +-2.3504653097104020E+00 -2.3515556845284449E+00 -2.3526435172885365E+00 -2.3537288123316458E+00 -2.3548115739886786E+00 +-2.3558918065805012E+00 -2.3569695144179788E+00 -2.3580447018019930E+00 -2.3591173730234818E+00 -2.3601875323634607E+00 +-2.3612551840930545E+00 -2.3623203324735247E+00 -2.3633829817562995E+00 -2.3644431361830005E+00 -2.3655007999854698E+00 +-2.3665559773858051E+00 -2.3676086725963779E+00 -2.3686588898198657E+00 -2.3697066332492840E+00 -2.3707519070680099E+00 +-2.3717947154498065E+00 -2.3728350625588588E+00 -2.3738729525497941E+00 -2.3749083895677123E+00 -2.3759413777482132E+00 +-2.3769719212174243E+00 -2.3780000240920240E+00 -2.3790256904792746E+00 -2.3800489244770469E+00 -2.3810697301738410E+00 +-2.3820881116488244E+00 -2.3831040729718498E+00 -2.3841176182034829E+00 -2.3851287513950359E+00 -2.3861374765885830E+00 +-2.3871437978169934E+00 -2.3881477191039577E+00 -2.3891492444640123E+00 -2.3901483779025621E+00 -2.3911451234159156E+00 +-2.3921394849913016E+00 -2.3931314666068988E+00 -2.3941210722318615E+00 -2.3951083058263443E+00 -2.3960931713415290E+00 +-2.3970756727196494E+00 -2.3980558138940147E+00 -2.3990335987890363E+00 -2.4000090313202551E+00 -2.4009821153943629E+00 +-2.4019528549092275E+00 -2.4029212537539228E+00 -2.4038873158087473E+00 -2.4048510449452505E+00 -2.4058124450262603E+00 +-2.4067715199059045E+00 -2.4077282734296372E+00 -2.4086827094342631E+00 -2.4096348317479572E+00 -2.4105846441902985E+00 +-2.4115321505722842E+00 -2.4124773546963594E+00 -2.4134202603564421E+00 -2.4143608713379403E+00 -2.4152991914177857E+00 +-2.4162352243644469E+00 -2.4171689739379620E+00 -2.4181004438899567E+00 -2.4190296379636695E+00 -2.4199565598939774E+00 +-2.4208812134074122E+00 -2.4218036022221940E+00 -2.4227237300482463E+00 -2.4236416005872208E+00 -2.4245572175325232E+00 +-2.4254705845693345E+00 -2.4263817053746322E+00 -2.4272905836172156E+00 -2.4281972229577282E+00 -2.4291016270486772E+00 +-2.4300037995344637E+00 -2.4309037440513941E+00 -2.4318014642277128E+00 -2.4326969636836178E+00 -2.4335902460312879E+00 +-2.4344813148749003E+00 -2.4353701738106550E+00 -2.4362568264267992E+00 -2.4371412763036444E+00 -2.4380235270135917E+00 +-2.4389035821211529E+00 -2.4397814451829709E+00 -2.4406571197478439E+00 -2.4415306093567466E+00 -2.4424019175428477E+00 +-2.4432710478315385E+00 -2.4441380037404459E+00 -2.4450027887794623E+00 -2.4458654064507597E+00 -2.4467258602488164E+00 +-2.4475841536604337E+00 -2.4484402901647604E+00 -2.4492942732333125E+00 -2.4501461063299912E+00 -2.4509957929111095E+00 +-2.4518433364254086E+00 -2.4526887403140827E+00 -2.4535320080107921E+00 -2.4543731429416913E+00 -2.4552121485254479E+00 +-2.4560490281732599E+00 -2.4568837852888796E+00 -2.4577164232686322E+00 -2.4585469455014368E+00 -2.4593753553688216E+00 +-2.4602016562449589E+00 -2.4610258514966628E+00 -2.4618479444834285E+00 -2.4626679385574435E+00 -2.4634858370636068E+00 +-2.4643016433395539E+00 -2.4651153607156702E+00 -2.4659269925151164E+00 -2.4667365420538427E+00 -2.4675440126406136E+00 +-2.4683494075770249E+00 -2.4691527301575200E+00 -2.4699539836694160E+00 -2.4707531713929183E+00 -2.4715502966011393E+00 +-2.4723453625601199E+00 -2.4731383725288478E+00 -2.4739293297592777E+00 -2.4747182374963472E+00 -2.4755050989779988E+00 +-2.4762899174351967E+00 -2.4770726960919474E+00 -2.4778534381653161E+00 -2.4786321468654462E+00 -2.4794088253955819E+00 +-2.4801834769520803E+00 -2.4809561047244326E+00 -2.4817267118952837E+00 -2.4824953016404510E+00 -2.4832618771289376E+00 +-2.4840264415229583E+00 -2.4847889979779505E+00 -2.4855495496425970E+00 -2.4863080996588436E+00 -2.4870646511619148E+00 +-2.4878192072803325E+00 -2.4885717711359376E+00 -2.4893223458438998E+00 -2.4900709345127465E+00 -2.4908175402443686E+00 +-2.4915621661340475E+00 -2.4923048152704679E+00 -2.4930454907357369E+00 -2.4937841956054001E+00 -2.4945209329484630E+00 +-2.4952557058274025E+00 -2.4959885172981888E+00 -2.4967193704102999E+00 -2.4974482682067429E+00 -2.4981752137240654E+00 +-2.4989002099923763E+00 -2.4996232600353632E+00 -2.5003443668703071E+00 -2.5010635335081020E+00 -2.5017807629532696E+00 +-2.5024960582039752E+00 -2.5032094222520502E+00 -2.5039208580830006E+00 -2.5046303686760294E+00 -2.5053379570040550E+00 +-2.5060436260337200E+00 -2.5067473787254149E+00 -2.5074492180332908E+00 -2.5081491469052777E+00 -2.5088471682830993E+00 +-2.5095432851022910E+00 -2.5102375002922153E+00 -2.5109298167760770E+00 -2.5116202374709431E+00 -2.5123087652877518E+00 +-2.5129954031313373E+00 -2.5136801539004412E+00 -2.5143630204877248E+00 -2.5150440057797931E+00 -2.5157231126572048E+00 +-2.5164003439944898E+00 -2.5170757026601667E+00 -2.5177491915167534E+00 -2.5184208134207902E+00 -2.5190905712228484E+00 +-2.5197584677675513E+00 -2.5204245058935859E+00 -2.5210886884337191E+00 -2.5217510182148155E+00 -2.5224114980578505E+00 +-2.5230701307779255E+00 -2.5237269191842846E+00 -2.5243818660803292E+00 -2.5250349742636318E+00 -2.5256862465259555E+00 +-2.5263356856532622E+00 -2.5269832944257340E+00 -2.5276290756177846E+00 -2.5282730319980753E+00 -2.5289151663295302E+00 +-2.5295554813693522E+00 -2.5301939798690332E+00 -2.5308306645743746E+00 -2.5314655382254991E+00 -2.5320986035568644E+00 +-2.5327298632972810E+00 -2.5333593201699220E+00 -2.5339869768923435E+00 -2.5346128361764952E+00 -2.5352369007287359E+00 +-2.5358591732498472E+00 -2.5364796564350480E+00 -2.5370983529740121E+00 -2.5377152655508768E+00 -2.5383303968442599E+00 +-2.5389437495272751E+00 -2.5395553262675459E+00 -2.5401651297272156E+00 -2.5407731625629681E+00 -2.5413794274260355E+00 +-2.5419839269622182E+00 -2.5425866638118904E+00 -2.5431876406100247E+00 -2.5437868599861941E+00 -2.5443843245645987E+00 +-2.5449800369640694E+00 -2.5455739997980849E+00 -2.5461662156747846E+00 -2.5467566871969849E+00 -2.5473454169621901E+00 +-2.5479324075626075E+00 -2.5485176615851590E+00 -2.5491011816114955E+00 -2.5496829702180119E+00 -2.5502630299758580E+00 +-2.5508413634509557E+00 -2.5514179732040048E+00 -2.5519928617905050E+00 -2.5525660317607639E+00 -2.5531374856599101E+00 +-2.5537072260279099E+00 -2.5542752553995758E+00 -2.5548415763045829E+00 -2.5554061912674819E+00 -2.5559691028077096E+00 +-2.5565303134396040E+00 -2.5570898256724170E+00 -2.5576476420103260E+00 -2.5582037649524469E+00 -2.5587581969928483E+00 +-2.5593109406205632E+00 -2.5598619983196027E+00 -2.5604113725689666E+00 -2.5609590658426562E+00 -2.5615050806096926E+00 +-2.5620494193341190E+00 -2.5625920844750221E+00 -2.5631330784865414E+00 -2.5636724038178782E+00 -2.5642100629133160E+00 +-2.5647460582122261E+00 -2.5652803921490812E+00 -2.5658130671534680E+00 -2.5663440856501039E+00 -2.5668734500588410E+00 +-2.5674011627946829E+00 -2.5679272262678001E+00 -2.5684516428835327E+00 -2.5689744150424141E+00 -2.5694955451401746E+00 +-2.5700150355677533E+00 -2.5705328887113197E+00 -2.5710491069522710E+00 -2.5715636926672563E+00 -2.5720766482281818E+00 +-2.5725879760022266E+00 -2.5730976783518491E+00 -2.5736057576348048E+00 -2.5741122162041563E+00 -2.5746170564082806E+00 +-2.5751202805908862E+00 -2.5756218910910240E+00 -2.5761218902430927E+00 -2.5766202803768623E+00 -2.5771170638174721E+00 +-2.5776122428854515E+00 -2.5781058198967282E+00 -2.5785977971626393E+00 -2.5790881769899441E+00 -2.5795769616808331E+00 +-2.5800641535329434E+00 -2.5805497548393643E+00 -2.5810337678886532E+00 -2.5815161949648440E+00 -2.5819970383474611E+00 +-2.5824763003115287E+00 -2.5829539831275810E+00 -2.5834300890616735E+00 -2.5839046203753968E+00 -2.5843775793258859E+00 +-2.5848489681658284E+00 -2.5853187891434812E+00 -2.5857870445026738E+00 -2.5862537364828286E+00 -2.5867188673189632E+00 +-2.5871824392417051E+00 -2.5876444544773047E+00 -2.5881049152476399E+00 -2.5885638237702322E+00 -2.5890211822582545E+00 +-2.5894769929205443E+00 -2.5899312579616121E+00 -2.5903839795816506E+00 -2.5908351599765500E+00 -2.5912848013379057E+00 +-2.5917329058530267E+00 -2.5921794757049512E+00 -2.5926245130724501E+00 -2.5930680201300476E+00 -2.5935099990480186E+00 +-2.5939504519924106E+00 -2.5943893811250471E+00 -2.5948267886035410E+00 -2.5952626765813025E+00 -2.5956970472075520E+00 +-2.5961299026273301E+00 -2.5965612449815030E+00 -2.5969910764067801E+00 -2.5974193990357168E+00 -2.5978462149967299E+00 +-2.5982715264141083E+00 -2.5986953354080162E+00 -2.5991176440945103E+00 -2.5995384545855442E+00 -2.5999577689889848E+00 +-2.6003755894086136E+00 -2.6007919179441461E+00 -2.6012067566912331E+00 -2.6016201077414767E+00 -2.6020319731824362E+00 +-2.6024423550976410E+00 -2.6028512555665966E+00 -2.6032586766647996E+00 -2.6036646204637410E+00 -2.6040690890309190E+00 +-2.6044720844298506E+00 -2.6048736087200779E+00 -2.6052736639571799E+00 -2.6056722521927793E+00 -2.6060693754745561E+00 +-2.6064650358462540E+00 -2.6068592353476889E+00 -2.6072519760147630E+00 -2.6076432598794681E+00 -2.6080330889698997E+00 +-2.6084214653102662E+00 -2.6088083909208946E+00 -2.6091938678182425E+00 -2.6095778980149062E+00 -2.6099604835196324E+00 +-2.6103416263373251E+00 -2.6107213284690522E+00 -2.6110995919120623E+00 -2.6114764186597861E+00 -2.6118518107018480E+00 +-2.6122257700240805E+00 -2.6125982986085234E+00 -2.6129693984334410E+00 -2.6133390714733267E+00 -2.6137073196989138E+00 +-2.6140741450771832E+00 -2.6144395495713750E+00 -2.6148035351409940E+00 -2.6151661037418199E+00 -2.6155272573259176E+00 +-2.6158869978416437E+00 -2.6162453272336563E+00 -2.6166022474429265E+00 -2.6169577604067404E+00 -2.6173118680587146E+00 +-2.6176645723288003E+00 -2.6180158751432967E+00 -2.6183657784248533E+00 -2.6187142840924844E+00 -2.6190613940615766E+00 +-2.6194071102438916E+00 -2.6197514345475836E+00 -2.6200943688772016E+00 -2.6204359151336991E+00 -2.6207760752144456E+00 +-2.6211148510132301E+00 -2.6214522444202748E+00 -2.6217882573222386E+00 -2.6221228916022281E+00 -2.6224561491398068E+00 +-2.6227880318110031E+00 -2.6231185414883122E+00 -2.6234476800407180E+00 -2.6237754493336864E+00 -2.6241018512291845E+00 +-2.6244268875856820E+00 -2.6247505602581658E+00 -2.6250728710981419E+00 -2.6253938219536459E+00 -2.6257134146692538E+00 +-2.6260316510860835E+00 -2.6263485330418108E+00 -2.6266640623706730E+00 -2.6269782409034770E+00 -2.6272910704676078E+00 +-2.6276025528870370E+00 -2.6279126899823311E+00 -2.6282214835706590E+00 -2.6285289354657975E+00 -2.6288350474781432E+00 +-2.6291398214147192E+00 -2.6294432590791805E+00 -2.6297453622718243E+00 -2.6300461327895985E+00 -2.6303455724261067E+00 +-2.6306436829716175E+00 -2.6309404662130742E+00 -2.6312359239340966E+00 -2.6315300579149965E+00 -2.6318228699327801E+00 +-2.6321143617611571E+00 -2.6324045351705476E+00 -2.6326933919280915E+00 -2.6329809337976542E+00 -2.6332671625398354E+00 +-2.6335520799119778E+00 -2.6338356876681703E+00 -2.6341179875592600E+00 -2.6343989813328572E+00 -2.6346786707333449E+00 +-2.6349570575018832E+00 -2.6352341433764210E+00 -2.6355099300916991E+00 -2.6357844193792603E+00 -2.6360576129674560E+00 +-2.6363295125814523E+00 -2.6366001199432394E+00 -2.6368694367716383E+00 -2.6371374647823078E+00 -2.6374042056877518E+00 +-2.6376696611973252E+00 -2.6379338330172444E+00 -2.6381967228505911E+00 -2.6384583323973225E+00 -2.6387186633542759E+00 +-2.6389777174151758E+00 -2.6392354962706448E+00 -2.6394920016082062E+00 -2.6397472351122917E+00 -2.6400011984642537E+00 +-2.6402538933423636E+00 -2.6405053214218279E+00 -2.6407554843747878E+00 -2.6410043838703303E+00 -2.6412520215744926E+00 +-2.6414983991502745E+00 -2.6417435182576385E+00 -2.6419873805535201E+00 -2.6422299876918336E+00 -2.6424713413234828E+00 +-2.6427114430963594E+00 -2.6429502946553596E+00 -2.6431878976423850E+00 -2.6434242536963501E+00 -2.6436593644531907E+00 +-2.6438932315458707E+00 -2.6441258566043855E+00 -2.6443572412557730E+00 -2.6445873871241199E+00 -2.6448162958305637E+00 +-2.6450439689933050E+00 -2.6452704082276099E+00 -2.6454956151458209E+00 -2.6457195913573601E+00 -2.6459423384687364E+00 +-2.6461638580835531E+00 -2.6463841518025149E+00 -2.6466032212234327E+00 -2.6468210679412287E+00 -2.6470376935479503E+00 +-2.6472530996327661E+00 -2.6474672877819816E+00 -2.6476802595790399E+00 -2.6478920166045303E+00 -2.6481025604361950E+00 +-2.6483118926489344E+00 -2.6485200148148151E+00 -2.6487269285030739E+00 -2.6489326352801252E+00 -2.6491371367095691E+00 +-2.6493404343521969E+00 -2.6495425297659945E+00 -2.6497434245061524E+00 -2.6499431201250712E+00 -2.6501416181723640E+00 +-2.6503389201948706E+00 -2.6505350277366535E+00 -2.6507299423390163E+00 -2.6509236655404971E+00 -2.6511161988768821E+00 +-2.6513075438812126E+00 -2.6514977020837880E+00 -2.6516866750121721E+00 -2.6518744641912009E+00 -2.6520610711429864E+00 +-2.6522464973869253E+00 -2.6524307444397035E+00 -2.6526138138153015E+00 -2.6527957070250023E+00 -2.6529764255773971E+00 +-2.6531559709783883E+00 -2.6533343447312006E+00 -2.6535115483363834E+00 -2.6536875832918154E+00 -2.6538624510927153E+00 +-2.6540361532316443E+00 -2.6542086911985119E+00 -2.6543800664805834E+00 -2.6545502805624861E+00 -2.6547193349262113E+00 +-2.6548872310511258E+00 -2.6550539704139733E+00 -2.6552195544888817E+00 -2.6553839847473699E+00 -2.6555472626583514E+00 +-2.6557093896881403E+00 -2.6558703673004622E+00 -2.6560301969564519E+00 -2.6561888801146645E+00 -2.6563464182310788E+00 +-2.6565028127591037E+00 -2.6566580651495855E+00 -2.6568121768508091E+00 -2.6569651493085078E+00 -2.6571169839658695E+00 +-2.6572676822635382E+00 -2.6574172456396208E+00 -2.6575656755296970E+00 -2.6577129733668214E+00 -2.6578591405815239E+00 +-2.6580041786018263E+00 -2.6581480888532396E+00 -2.6582908727587720E+00 -2.6584325317389350E+00 -2.6585730672117482E+00 +-2.6587124805927442E+00 -2.6588507732949744E+00 -2.6589879467290154E+00 -2.6591240023029736E+00 -2.6592589414224896E+00 +-2.6593927654907472E+00 -2.6595254759084734E+00 -2.6596570740739494E+00 -2.6597875613830091E+00 -2.6599169392290531E+00 +-2.6600452090030466E+00 -2.6601723720935282E+00 -2.6602984298866144E+00 -2.6604233837660058E+00 -2.6605472351129902E+00 +-2.6606699853064488E+00 -2.6607916357228656E+00 -2.6609121877363240E+00 -2.6610316427185210E+00 -2.6611500020387657E+00 +-2.6612672670639861E+00 -2.6613834391587394E+00 -2.6614985196852086E+00 -2.6616125100032142E+00 -2.6617254114702171E+00 +-2.6618372254413236E+00 -2.6619479532692898E+00 -2.6620575963045288E+00 -2.6621661558951151E+00 -2.6622736333867865E+00 +-2.6623800301229545E+00 -2.6624853474447048E+00 -2.6625895866908040E+00 -2.6626927491977068E+00 -2.6627948362995557E+00 +-2.6628958493281925E+00 -2.6629957896131584E+00 -2.6630946584817017E+00 -2.6631924572587766E+00 -2.6632891872670603E+00 +-2.6633848498269477E+00 -2.6634794462565576E+00 -2.6635729778717407E+00 -2.6636654459860840E+00 -2.6637568519109145E+00 +-2.6638471969553033E+00 -2.6639364824260707E+00 -2.6640247096277956E+00 -2.6641118798628121E+00 -2.6641979944312215E+00 +-2.6642830546308942E+00 -2.6643670617574715E+00 -2.6644500171043788E+00 -2.6645319219628210E+00 -2.6646127776217932E+00 +-2.6646925853680821E+00 -2.6647713464862735E+00 -2.6648490622587544E+00 -2.6649257339657200E+00 -2.6650013628851767E+00 +-2.6650759502929477E+00 -2.6651494974626777E+00 -2.6652220056658367E+00 -2.6652934761717244E+00 -2.6653639102474784E+00 +-2.6654333091580735E+00 -2.6655016741663284E+00 -2.6655690065329121E+00 -2.6656353075163470E+00 -2.6657005783730137E+00 +-2.6657648203571545E+00 -2.6658280347208785E+00 -2.6658902227141681E+00 -2.6659513855848811E+00 -2.6660115245787548E+00 +-2.6660706409394139E+00 -2.6661287359083716E+00 -2.6661858107250347E+00 -2.6662418666267098E+00 -2.6662969048486054E+00 +-2.6663509266238394E+00 -2.6664039331834397E+00 -2.6664559257563507E+00 -2.6665069055694381E+00 -2.6665568738474930E+00 +-2.6666058318132362E+00 -2.6666537806873203E+00 -2.6667007216883407E+00 -2.6667466560328310E+00 -2.6667915849352744E+00 +-2.6668355096081027E+00 -2.6668784312617060E+00 -2.6669203511044333E+00 -2.6669612703425964E+00 -2.6670011901804793E+00 +-2.6670401118203357E+00 -2.6670780364623967E+00 -2.6671149653048754E+00 -2.6671508995439699E+00 -2.6671858403738700E+00 +-2.6672197889867557E+00 -2.6672527465728084E+00 -2.6672847143202101E+00 -2.6673156934151518E+00 -2.6673456850418318E+00 +-2.6673746903824664E+00 -2.6674027106172895E+00 -2.6674297469245585E+00 -2.6674558004805577E+00 -2.6674808724596040E+00 +-2.6675049640340478E+00 -2.6675280763742828E+00 -2.6675502106487441E+00 -2.6675713680239141E+00 -2.6675915496643285E+00 +-2.6676107567325795E+00 -2.6676289903893173E+00 -2.6676462517932591E+00 -2.6676625421011875E+00 -2.6676778624679578E+00 +-2.6676922140465043E+00 -2.6677055979878377E+00 -2.6677180154410562E+00 -2.6677294675533427E+00 -2.6677399554699779E+00 +-2.6677494803343316E+00 -2.6677580432878787E+00 -2.6677656454701966E+00 -2.6677722880189685E+00 -2.6677779720699943E+00 +-2.6677826987571858E+00 -2.6677864692125759E+00 -2.6677892845663207E+00 -2.6677911459467061E+00 -2.6677920544801430E+00 +-2.6677920112911870E+00 -2.6677910175025250E+00 -2.6677890742349892E+00 -2.6677861826075602E+00 -2.6677823437373678E+00 +-2.6677775587396950E+00 -2.6677718287279868E+00 -2.6677651548138459E+00 -2.6677575381070446E+00 -2.6677489797155216E+00 +-2.6677394807453894E+00 -2.6677290423009414E+00 -2.6677176654846475E+00 -2.6677053513971658E+00 -2.6676921011373387E+00 +-2.6676779158022041E+00 -2.6676627964869946E+00 -2.6676467442851428E+00 -2.6676297602882828E+00 -2.6676118455862570E+00 +-2.6675930012671185E+00 -2.6675732284171354E+00 -2.6675525281207904E+00 -2.6675309014607933E+00 -2.6675083495180760E+00 +-2.6674848733717966E+00 -2.6674604740993502E+00 -2.6674351527763651E+00 -2.6674089104767109E+00 -2.6673817482725006E+00 +-2.6673536672340927E+00 -2.6673246684300977E+00 -2.6672947529273787E+00 -2.6672639217910588E+00 -2.6672321760845175E+00 +-2.6671995168694069E+00 -2.6671659452056389E+00 -2.6671314621514020E+00 -2.6670960687631604E+00 -2.6670597660956537E+00 +-2.6670225552019073E+00 -2.6669844371332307E+00 -2.6669454129392229E+00 -2.6669054836677759E+00 -2.6668646503650781E+00 +-2.6668229140756168E+00 -2.6667802758421835E+00 -2.6667367367058756E+00 -2.6666922977061018E+00 -2.6666469598805826E+00 +-2.6666007242653569E+00 -2.6665535918947825E+00 -2.6665055638015422E+00 -2.6664566410166444E+00 -2.6664068245694299E+00 +-2.6663561154875719E+00 -2.6663045147970812E+00 -2.6662520235223095E+00 -2.6661986426859512E+00 -2.6661443733090522E+00 +-2.6660892164110037E+00 -2.6660331730095543E+00 -2.6659762441208072E+00 -2.6659184307592292E+00 -2.6658597339376491E+00 +-2.6658001546672629E+00 -2.6657396939576379E+00 -2.6656783528167152E+00 -2.6656161322508125E+00 -2.6655530332646267E+00 +-2.6654890568612410E+00 -2.6654242040421243E+00 -2.6653584758071331E+00 -2.6652918731545214E+00 -2.6652243970809364E+00 +-2.6651560485814270E+00 -2.6650868286494442E+00 -2.6650167382768446E+00 -2.6649457784538959E+00 -2.6648739501692766E+00 +-2.6648012544100808E+00 -2.6647276921618221E+00 -2.6646532644084386E+00 -2.6645779721322902E+00 -2.6645018163141665E+00 +-2.6644247979332878E+00 -2.6643469179673098E+00 -2.6642681773923269E+00 -2.6641885771828715E+00 -2.6641081183119222E+00 +-2.6640268017509054E+00 -2.6639446284696962E+00 -2.6638615994366224E+00 -2.6637777156184699E+00 -2.6636929779804839E+00 +-2.6636073874863704E+00 -2.6635209450983033E+00 -2.6634336517769226E+00 -2.6633455084813424E+00 -2.6632565161691497E+00 +-2.6631666757964099E+00 -2.6630759883176687E+00 -2.6629844546859571E+00 -2.6628920758527919E+00 -2.6627988527681783E+00 +-2.6627047863806159E+00 -2.6626098776371014E+00 -2.6625141274831274E+00 -2.6624175368626890E+00 -2.6623201067182878E+00 +-2.6622218379909310E+00 -2.6621227316201375E+00 -2.6620227885439380E+00 -2.6619220096988818E+00 -2.6618203960200382E+00 +-2.6617179484409963E+00 -2.6616146678938706E+00 -2.6615105553093064E+00 -2.6614056116164777E+00 -2.6612998377430954E+00 +-2.6611932346154035E+00 -2.6610858031581865E+00 -2.6609775442947745E+00 -2.6608684589470393E+00 -2.6607585480354037E+00 +-2.6606478124788411E+00 -2.6605362531948780E+00 -2.6604238710995989E+00 -2.6603106671076469E+00 -2.6601966421322287E+00 +-2.6600817970851165E+00 -2.6599661328766517E+00 -2.6598496504157421E+00 -2.6597323506098753E+00 -2.6596142343651121E+00 +-2.6594953025860919E+00 -2.6593755561760393E+00 -2.6592549960367631E+00 -2.6591336230686564E+00 -2.6590114381707073E+00 +-2.6588884422404946E+00 -2.6587646361741957E+00 -2.6586400208665819E+00 -2.6585145972110316E+00 -2.6583883660995231E+00 +-2.6582613284226442E+00 -2.6581334850695919E+00 -2.6580048369281744E+00 -2.6578753848848162E+00 -2.6577451298245585E+00 +-2.6576140726310649E+00 -2.6574822141866190E+00 -2.6573495553721327E+00 -2.6572160970671481E+00 -2.6570818401498335E+00 +-2.6569467854969959E+00 -2.6568109339840751E+00 -2.6566742864851531E+00 -2.6565368438729502E+00 -2.6563986070188350E+00 +-2.6562595767928205E+00 -2.6561197540635701E+00 -2.6559791396984003E+00 -2.6558377345632818E+00 -2.6556955395228412E+00 +-2.6555525554403689E+00 -2.6554087831778159E+00 -2.6552642235957982E+00 -2.6551188775535994E+00 -2.6549727459091756E+00 +-2.6548258295191536E+00 -2.6546781292388371E+00 -2.6545296459222074E+00 -2.6543803804219284E+00 -2.6542303335893447E+00 +-2.6540795062744857E+00 -2.6539278993260726E+00 -2.6537755135915173E+00 -2.6536223499169220E+00 -2.6534684091470884E+00 +-2.6533136921255132E+00 -2.6531581996943960E+00 -2.6530019326946390E+00 -2.6528448919658514E+00 -2.6526870783463501E+00 +-2.6525284926731620E+00 -2.6523691357820298E+00 -2.6522090085074095E+00 -2.6520481116824755E+00 -2.6518864461391258E+00 +-2.6517240127079802E+00 -2.6515608122183818E+00 -2.6513968454984052E+00 -2.6512321133748520E+00 -2.6510666166732602E+00 +-2.6509003562179023E+00 -2.6507333328317868E+00 -2.6505655473366643E+00 -2.6503970005530282E+00 -2.6502276933001157E+00 +-2.6500576263959119E+00 -2.6498868006571517E+00 -2.6497152168993230E+00 -2.6495428759366670E+00 -2.6493697785821837E+00 +-2.6491959256476272E+00 -2.6490213179435242E+00 -2.6488459562791551E+00 -2.6486698414625707E+00 -2.6484929743005905E+00 +-2.6483153555988039E+00 -2.6481369861615760E+00 -2.6479578667920465E+00 -2.6477779982921330E+00 -2.6475973814625338E+00 +-2.6474160171027288E+00 -2.6472339060109853E+00 -2.6470510489843573E+00 -2.6468674468186881E+00 -2.6466831003086115E+00 +-2.6464980102475573E+00 -2.6463121774277525E+00 -2.6461256026402218E+00 -2.6459382866747903E+00 -2.6457502303200884E+00 +-2.6455614343635521E+00 -2.6453718995914222E+00 -2.6451816267887538E+00 -2.6449906167394102E+00 -2.6447988702260727E+00 +-2.6446063880302413E+00 -2.6444131709322285E+00 -2.6442192197111742E+00 -2.6440245351450402E+00 -2.6438291180106108E+00 +-2.6436329690835043E+00 -2.6434360891381647E+00 -2.6432384789478691E+00 -2.6430401392847314E+00 -2.6428410709197001E+00 +-2.6426412746225636E+00 -2.6424407511619523E+00 -2.6422395013053381E+00 -2.6420375258190401E+00 -2.6418348254682247E+00 +-2.6416314010169080E+00 -2.6414272532279575E+00 -2.6412223828630967E+00 -2.6410167906829036E+00 -2.6408104774468164E+00 +-2.6406034439131325E+00 -2.6403956908390138E+00 -2.6401872189804845E+00 -2.6399780290924357E+00 -2.6397681219286340E+00 +-2.6395574982417100E+00 -2.6393461587831699E+00 -2.6391341043033973E+00 -2.6389213355516508E+00 -2.6387078532760690E+00 +-2.6384936582236755E+00 -2.6382787511403740E+00 -2.6380631327709567E+00 -2.6378468038590999E+00 -2.6376297651473757E+00 +-2.6374120173772444E+00 -2.6371935612890609E+00 -2.6369743976220796E+00 -2.6367545271144492E+00 -2.6365339505032210E+00 +-2.6363126685243481E+00 -2.6360906819126879E+00 -2.6358679914020047E+00 -2.6356445977249718E+00 -2.6354205016131744E+00 +-2.6351957037971063E+00 -2.6349702050061770E+00 -2.6347440059687193E+00 -2.6345171074119760E+00 -2.6342895100621151E+00 +-2.6340612146442246E+00 -2.6338322218823196E+00 -2.6336025324993408E+00 -2.6333721472171585E+00 -2.6331410667565729E+00 +-2.6329092918373171E+00 -2.6326768231780582E+00 -2.6324436614963997E+00 -2.6322098075088856E+00 -2.6319752619309980E+00 +-2.6317400254771623E+00 -2.6315040988607494E+00 -2.6312674827940752E+00 -2.6310301779884040E+00 -2.6307921851539522E+00 +-2.6305535049998849E+00 -2.6303141382343251E+00 -2.6300740855643490E+00 -2.6298333476959925E+00 -2.6295919253342510E+00 +-2.6293498191830778E+00 -2.6291070299453985E+00 -2.6288635583230984E+00 -2.6286194050170311E+00 -2.6283745707270181E+00 +-2.6281290561518547E+00 -2.6278828619893093E+00 -2.6276359889361247E+00 -2.6273884376880190E+00 -2.6271402089396925E+00 +-2.6268913033848253E+00 -2.6266417217160760E+00 -2.6263914646250948E+00 -2.6261405328025118E+00 -2.6258889269379497E+00 +-2.6256366477200173E+00 -2.6253836958363181E+00 -2.6251300719734494E+00 -2.6248757768170026E+00 -2.6246208110515670E+00 +-2.6243651753607309E+00 -2.6241088704270847E+00 -2.6238518969322207E+00 -2.6235942555567355E+00 -2.6233359469802311E+00 +-2.6230769718813240E+00 -2.6228173309376337E+00 -2.6225570248257948E+00 -2.6222960542214544E+00 -2.6220344197992778E+00 +-2.6217721222329429E+00 -2.6215091621951521E+00 -2.6212455403576240E+00 -2.6209812573911040E+00 -2.6207163139653575E+00 +-2.6204507107491799E+00 -2.6201844484103938E+00 -2.6199175276158493E+00 -2.6196499490314320E+00 -2.6193817133220567E+00 +-2.6191128211516763E+00 -2.6188432731832774E+00 -2.6185730700788885E+00 -2.6183022124995756E+00 -2.6180307011054493E+00 +-2.6177585365556615E+00 -2.6174857195084109E+00 -2.6172122506209425E+00 -2.6169381305495532E+00 -2.6166633599495870E+00 +-2.6163879394754397E+00 -2.6161118697805650E+00 -2.6158351515174698E+00 -2.6155577853377179E+00 -2.6152797718919354E+00 +-2.6150011118298062E+00 -2.6147218058000781E+00 -2.6144418544505621E+00 -2.6141612584281364E+00 -2.6138800183787474E+00 +-2.6135981349474089E+00 -2.6133156087782061E+00 -2.6130324405142988E+00 -2.6127486307979191E+00 -2.6124641802703752E+00 +-2.6121790895720540E+00 -2.6118933593424214E+00 -2.6116069902200238E+00 -2.6113199828424909E+00 -2.6110323378465354E+00 +-2.6107440558679569E+00 -2.6104551375416416E+00 -2.6101655835015687E+00 -2.6098753943808037E+00 -2.6095845708115051E+00 +-2.6092931134249273E+00 -2.6090010228514204E+00 -2.6087082997204294E+00 -2.6084149446605007E+00 -2.6081209582992795E+00 +-2.6078263412635150E+00 -2.6075310941790595E+00 -2.6072352176708682E+00 -2.6069387123630072E+00 -2.6066415788786488E+00 +-2.6063438178400768E+00 -2.6060454298686846E+00 -2.6057464155849801E+00 -2.6054467756085882E+00 -2.6051465105582459E+00 +-2.6048456210518118E+00 -2.6045441077062632E+00 -2.6042419711376974E+00 -2.6039392119613356E+00 -2.6036358307915237E+00 +-2.6033318282417306E+00 -2.6030272049245591E+00 -2.6027219614517341E+00 -2.6024160984341140E+00 -2.6021096164816884E+00 +-2.6018025162035818E+00 -2.6014947982080532E+00 -2.6011864631024975E+00 -2.6008775114934490E+00 -2.6005679439865803E+00 +-2.6002577611867075E+00 -2.5999469636977874E+00 -2.5996355521229213E+00 -2.5993235270643580E+00 -2.5990108891234920E+00 +-2.5986976389008660E+00 -2.5983837769961760E+00 -2.5980693040082681E+00 -2.5977542205351396E+00 -2.5974385271739457E+00 +-2.5971222245209971E+00 -2.5968053131717626E+00 -2.5964877937208697E+00 -2.5961696667621039E+00 -2.5958509328884203E+00 +-2.5955315926919322E+00 -2.5952116467639179E+00 -2.5948910956948250E+00 -2.5945699400742668E+00 -2.5942481804910291E+00 +-2.5939258175330657E+00 -2.5936028517875043E+00 -2.5932792838406473E+00 -2.5929551142779719E+00 -2.5926303436841320E+00 +-2.5923049726429603E+00 -2.5919790017374678E+00 -2.5916524315498504E+00 -2.5913252626614827E+00 -2.5909974956529243E+00 +-2.5906691311039221E+00 -2.5903401695934076E+00 -2.5900106116995039E+00 -2.5896804579995201E+00 -2.5893497090699586E+00 +-2.5890183654865151E+00 -2.5886864278240767E+00 -2.5883538966567277E+00 -2.5880207725577518E+00 -2.5876870560996266E+00 +-2.5873527478540317E+00 -2.5870178483918469E+00 -2.5866823582831548E+00 -2.5863462780972415E+00 -2.5860096084025992E+00 +-2.5856723497669258E+00 -2.5853345027571288E+00 -2.5849960679393229E+00 -2.5846570458788345E+00 -2.5843174371402027E+00 +-2.5839772422871796E+00 -2.5836364618827323E+00 -2.5832950964890449E+00 -2.5829531466675166E+00 -2.5826106129787689E+00 +-2.5822674959826410E+00 -2.5819237962381960E+00 -2.5815795143037183E+00 -2.5812346507367172E+00 -2.5808892060939277E+00 +-2.5805431809313109E+00 -2.5801965758040604E+00 -2.5798493912665954E+00 -2.5795016278725678E+00 -2.5791532861748596E+00 +-2.5788043667255915E+00 -2.5784548700761132E+00 -2.5781047967770165E+00 -2.5777541473781271E+00 -2.5774029224285111E+00 +-2.5770511224764752E+00 -2.5766987480695662E+00 -2.5763457997545780E+00 -2.5759922780775426E+00 -2.5756381835837434E+00 +-2.5752835168177071E+00 -2.5749282783232097E+00 -2.5745724686432778E+00 -2.5742160883201870E+00 -2.5738591378954658E+00 +-2.5735016179098964E+00 -2.5731435289035143E+00 -2.5727848714156125E+00 -2.5724256459847421E+00 -2.5720658531487071E+00 +-2.5717054934445813E+00 -2.5713445674086906E+00 -2.5709830755766259E+00 -2.5706210184832439E+00 -2.5702583966626631E+00 +-2.5698952106482698E+00 -2.5695314609727178E+00 -2.5691671481679275E+00 -2.5688022727650934E+00 -2.5684368352946758E+00 +-2.5680708362864122E+00 -2.5677042762693096E+00 -2.5673371557716540E+00 -2.5669694753210046E+00 -2.5666012354441978E+00 +-2.5662324366673519E+00 -2.5658630795158603E+00 -2.5654931645144026E+00 -2.5651226921869354E+00 -2.5647516630567035E+00 +-2.5643800776462333E+00 -2.5640079364773389E+00 -2.5636352400711213E+00 -2.5632619889479669E+00 -2.5628881836275585E+00 +-2.5625138246288643E+00 -2.5621389124701452E+00 -2.5617634476689561E+00 -2.5613874307421485E+00 -2.5610108622058632E+00 +-2.5606337425755461E+00 -2.5602560723659349E+00 -2.5598778520910694E+00 -2.5594990822642898E+00 -2.5591197633982357E+00 +-2.5587398960048526E+00 -2.5583594805953882E+00 -2.5579785176803957E+00 -2.5575970077697345E+00 -2.5572149513725728E+00 +-2.5568323489973852E+00 -2.5564492011519580E+00 -2.5560655083433876E+00 -2.5556812710780834E+00 -2.5552964898617687E+00 +-2.5549111651994787E+00 -2.5545252975955655E+00 -2.5541388875537021E+00 -2.5537519355768756E+00 -2.5533644421673909E+00 +-2.5529764078268755E+00 -2.5525878330562790E+00 -2.5521987183558723E+00 -2.5518090642252500E+00 -2.5514188711633330E+00 +-2.5510281396683667E+00 -2.5506368702379243E+00 -2.5502450633689073E+00 -2.5498527195575478E+00 -2.5494598392994061E+00 +-2.5490664230893767E+00 -2.5486724714216851E+00 -2.5482779847898924E+00 -2.5478829636868925E+00 -2.5474874086049186E+00 +-2.5470913200355390E+00 -2.5466946984696603E+00 -2.5462975443975293E+00 -2.5458998583087347E+00 -2.5455016406922057E+00 +-2.5451028920362124E+00 -2.5447036128283735E+00 -2.5443038035556507E+00 -2.5439034647043495E+00 -2.5435025967601255E+00 +-2.5431012002079822E+00 -2.5426992755322719E+00 -2.5422968232166978E+00 -2.5418938437443153E+00 -2.5414903375975313E+00 +-2.5410863052581063E+00 -2.5406817472071590E+00 -2.5402766639251597E+00 -2.5398710558919393E+00 -2.5394649235866837E+00 +-2.5390582674879409E+00 -2.5386510880736171E+00 -2.5382433858209814E+00 -2.5378351612066639E+00 -2.5374264147066583E+00 +-2.5370171467963245E+00 -2.5366073579503872E+00 -2.5361970486429359E+00 -2.5357862193474308E+00 -2.5353748705366961E+00 +-2.5349630026829337E+00 -2.5345506162577109E+00 -2.5341377117319657E+00 -2.5337242895760128E+00 -2.5333103502595389E+00 +-2.5328958942516060E+00 -2.5324809220206528E+00 -2.5320654340344930E+00 -2.5316494307603219E+00 -2.5312329126647115E+00 +-2.5308158802136154E+00 -2.5303983338723670E+00 -2.5299802741056823E+00 -2.5295617013776623E+00 -2.5291426161517903E+00 +-2.5287230188909353E+00 -2.5283029100573540E+00 -2.5278822901126898E+00 -2.5274611595179732E+00 -2.5270395187336252E+00 +-2.5266173682194579E+00 -2.5261947084346743E+00 -2.5257715398378666E+00 -2.5253478628870281E+00 -2.5249236780395399E+00 +-2.5244989857521802E+00 -2.5240737864811242E+00 -2.5236480806819448E+00 -2.5232218688096122E+00 -2.5227951513184972E+00 +-2.5223679286623697E+00 -2.5219402012944028E+00 -2.5215119696671704E+00 -2.5210832342326501E+00 -2.5206539954422253E+00 +-2.5202242537466817E+00 -2.5197940095962150E+00 -2.5193632634404257E+00 -2.5189320157283226E+00 -2.5185002669083247E+00 +-2.5180680174282615E+00 -2.5176352677353728E+00 -2.5172020182763100E+00 -2.5167682694971387E+00 -2.5163340218433397E+00 +-2.5158992757598067E+00 -2.5154640316908465E+00 -2.5150282900801924E+00 -2.5145920513709874E+00 -2.5141553160057954E+00 +-2.5137180844266007E+00 -2.5132803570748075E+00 -2.5128421343912426E+00 -2.5124034168161558E+00 -2.5119642047892188E+00 +-2.5115244987495302E+00 -2.5110842991356117E+00 -2.5106436063854121E+00 -2.5102024209363094E+00 -2.5097607432251081E+00 +-2.5093185736880419E+00 -2.5088759127607765E+00 -2.5084327608784052E+00 -2.5079891184754577E+00 -2.5075449859858923E+00 +-2.5071003638431058E+00 -2.5066552524799248E+00 -2.5062096523286161E+00 -2.5057635638208797E+00 -2.5053169873878574E+00 +-2.5048699234601206E+00 -2.5044223724676935E+00 -2.5039743348400298E+00 -2.5035258110060283E+00 -2.5030768013940303E+00 +-2.5026273064318190E+00 -2.5021773265466214E+00 -2.5017268621651101E+00 -2.5012759137134037E+00 -2.5008244816170668E+00 +-2.5003725663011118E+00 -2.4999201681899983E+00 -2.4994672877076383E+00 -2.4990139252773900E+00 -2.4985600813220672E+00 +-2.4981057562639313E+00 -2.4976509505246995E+00 -2.4971956645255418E+00 -2.4967398986870832E+00 -2.4962836534294031E+00 +-2.4958269291720385E+00 -2.4953697263339838E+00 -2.4949120453336913E+00 -2.4944538865890684E+00 -2.4939952505174934E+00 +-2.4935361375357941E+00 -2.4930765480602641E+00 -2.4926164825066603E+00 -2.4921559412902021E+00 -2.4916949248255738E+00 +-2.4912334335269231E+00 -2.4907714678078658E+00 -2.4903090280814841E+00 -2.4898461147603266E+00 -2.4893827282564112E+00 +-2.4889188689812269E+00 -2.4884545373457314E+00 -2.4879897337603527E+00 -2.4875244586349923E+00 -2.4870587123790222E+00 +-2.4865924954012932E+00 -2.4861258081101250E+00 -2.4856586509133143E+00 -2.4851910242181368E+00 -2.4847229284313426E+00 +-2.4842543639591597E+00 -2.4837853312072951E+00 -2.4833158305809335E+00 -2.4828458624847469E+00 -2.4823754273228822E+00 +-2.4819045254989680E+00 -2.4814331574161188E+00 -2.4809613234769325E+00 -2.4804890240834907E+00 -2.4800162596373587E+00 +-2.4795430305395905E+00 -2.4790693371907269E+00 -2.4785951799907973E+00 -2.4781205593393154E+00 -2.4776454756352888E+00 +-2.4771699292772151E+00 -2.4766939206630809E+00 -2.4762174501903655E+00 -2.4757405182560417E+00 -2.4752631252565749E+00 +-2.4747852715879248E+00 -2.4743069576455481E+00 -2.4738281838243945E+00 -2.4733489505189130E+00 -2.4728692581230489E+00 +-2.4723891070302457E+00 -2.4719084976334442E+00 -2.4714274303250918E+00 -2.4709459054971310E+00 -2.4704639235410055E+00 +-2.4699814848476644E+00 -2.4694985898075572E+00 -2.4690152388106390E+00 -2.4685314322463685E+00 -2.4680471705037133E+00 +-2.4675624539711403E+00 -2.4670772830366299E+00 -2.4665916580876681E+00 -2.4661055795112485E+00 -2.4656190476938762E+00 +-2.4651320630215650E+00 -2.4646446258798398E+00 -2.4641567366537371E+00 -2.4636683957278067E+00 -2.4631796034861098E+00 +-2.4626903603122248E+00 -2.4622006665892422E+00 -2.4617105226997698E+00 -2.4612199290259289E+00 -2.4607288859493601E+00 +-2.4602373938512248E+00 -2.4597454531121969E+00 -2.4592530641124744E+00 -2.4587602272317719E+00 -2.4582669428493285E+00 +-2.4577732113439006E+00 -2.4572790330937728E+00 -2.4567844084767470E+00 -2.4562893378701522E+00 -2.4557938216508424E+00 +-2.4552978601951958E+00 -2.4548014538791159E+00 -2.4543046030780351E+00 -2.4538073081669123E+00 -2.4533095695202354E+00 +-2.4528113875120212E+00 -2.4523127625158150E+00 -2.4518136949046956E+00 -2.4513141850512699E+00 -2.4508142333276810E+00 +-2.4503138401055993E+00 -2.4498130057562335E+00 -2.4493117306503236E+00 -2.4488100151581453E+00 -2.4483078596495131E+00 +-2.4478052644937747E+00 -2.4473022300598153E+00 -2.4467987567160576E+00 -2.4462948448304656E+00 -2.4457904947705389E+00 +-2.4452857069033196E+00 -2.4447804815953909E+00 -2.4442748192128763E+00 -2.4437687201214411E+00 -2.4432621846862954E+00 +-2.4427552132721915E+00 -2.4422478062434267E+00 -2.4417399639638431E+00 -2.4412316867968293E+00 -2.4407229751053188E+00 +-2.4402138292517939E+00 -2.4397042495982855E+00 -2.4391942365063697E+00 -2.4386837903371754E+00 -2.4381729114513786E+00 +-2.4376616002092106E+00 -2.4371498569704468E+00 -2.4366376820944233E+00 -2.4361250759400246E+00 -2.4356120388656866E+00 +-2.4350985712294033E+00 -2.4345846733887222E+00 -2.4340703457007447E+00 -2.4335555885221316E+00 -2.4330404022090990E+00 +-2.4325247871174205E+00 -2.4320087436024274E+00 -2.4314922720190126E+00 -2.4309753727216257E+00 -2.4304580460642788E+00 +-2.4299402924005449E+00 -2.4294221120835577E+00 -2.4289035054660135E+00 -2.4283844729001731E+00 -2.4278650147378587E+00 +-2.4273451313304593E+00 -2.4268248230289275E+00 -2.4263040901837836E+00 -2.4257829331451122E+00 -2.4252613522625652E+00 +-2.4247393478853629E+00 -2.4242169203622970E+00 -2.4236940700417242E+00 -2.4231707972715721E+00 -2.4226471023993392E+00 +-2.4221229857720954E+00 -2.4215984477364825E+00 -2.4210734886387133E+00 -2.4205481088245757E+00 -2.4200223086394299E+00 +-2.4194960884282124E+00 -2.4189694485354325E+00 -2.4184423893051759E+00 -2.4179149110811062E+00 -2.4173870142064620E+00 +-2.4168586990240621E+00 -2.4163299658763004E+00 -2.4158008151051531E+00 -2.4152712470521736E+00 -2.4147412620584978E+00 +-2.4142108604648396E+00 -2.4136800426114959E+00 -2.4131488088383479E+00 -2.4126171594848564E+00 -2.4120850948900663E+00 +-2.4115526153926110E+00 -2.4110197213307032E+00 -2.4104864130421420E+00 -2.4099526908643156E+00 -2.4094185551341956E+00 +-2.4088840061883423E+00 -2.4083490443629043E+00 -2.4078136699936179E+00 -2.4072778834158091E+00 -2.4067416849643939E+00 +-2.4062050749738786E+00 -2.4056680537783608E+00 -2.4051306217115287E+00 -2.4045927791066641E+00 -2.4040545262966417E+00 +-2.4035158636139289E+00 -2.4029767913905897E+00 -2.4024373099582794E+00 -2.4018974196482499E+00 -2.4013571207913516E+00 +-2.4008164137180281E+00 -2.4002752987583231E+00 -2.3997337762418733E+00 -2.3991918464979243E+00 -2.3986495098553098E+00 +-2.3981067666424685E+00 -2.3975636171874379E+00 -2.3970200618178588E+00 -2.3964761008609696E+00 -2.3959317346436149E+00 +-2.3953869634922391E+00 -2.3948417877328914E+00 -2.3942962076912244E+00 -2.3937502236924972E+00 -2.3932038360615708E+00 +-2.3926570451229141E+00 -2.3921098512006025E+00 -2.3915622546183166E+00 -2.3910142556993472E+00 -2.3904658547665907E+00 +-2.3899170521425539E+00 -2.3893678481493521E+00 -2.3888182431087119E+00 -2.3882682373419679E+00 -2.3877178311700678E+00 +-2.3871670249135710E+00 -2.3866158188926470E+00 -2.3860642134270824E+00 -2.3855122088362744E+00 -2.3849598054392329E+00 +-2.3844070035545855E+00 -2.3838538035005743E+00 -2.3833002055950541E+00 -2.3827462101555001E+00 -2.3821918174990020E+00 +-2.3816370279422698E+00 -2.3810818418016275E+00 -2.3805262593930205E+00 -2.3799702810320138E+00 -2.3794139070337907E+00 +-2.3788571377131555E+00 -2.3782999733845340E+00 -2.3777424143619714E+00 -2.3771844609591390E+00 -2.3766261134893285E+00 +-2.3760673722654522E+00 -2.3755082376000503E+00 -2.3749487098052864E+00 -2.3743887891929480E+00 -2.3738284760744484E+00 +-2.3732677707608256E+00 -2.3727066735627496E+00 -2.3721451847905120E+00 -2.3715833047540333E+00 -2.3710210337628643E+00 +-2.3704583721261820E+00 -2.3698953201527941E+00 -2.3693318781511401E+00 -2.3687680464292868E+00 -2.3682038252949340E+00 +-2.3676392150554113E+00 -2.3670742160176843E+00 -2.3665088284883473E+00 -2.3659430527736300E+00 -2.3653768891793940E+00 +-2.3648103380111394E+00 -2.3642433995739958E+00 -2.3636760741727323E+00 -2.3631083621117526E+00 -2.3625402636950965E+00 +-2.3619717792264425E+00 -2.3614029090091044E+00 -2.3608336533460363E+00 -2.3602640125398278E+00 -2.3596939868927147E+00 +-2.3591235767065655E+00 -2.3585527822828918E+00 -2.3579816039228452E+00 -2.3574100419272201E+00 -2.3568380965964515E+00 +-2.3562657682306183E+00 -2.3556930571294408E+00 -2.3551199635922839E+00 -2.3545464879181566E+00 -2.3539726304057100E+00 +-2.3533983913532452E+00 -2.3528237710587052E+00 -2.3522487698196795E+00 -2.3516733879334057E+00 -2.3510976256967675E+00 +-2.3505214834062973E+00 -2.3499449613581742E+00 -2.3493680598482278E+00 -2.3487907791719365E+00 -2.3482131196244267E+00 +-2.3476350815004787E+00 -2.3470566650945206E+00 -2.3464778707006313E+00 -2.3458986986125474E+00 -2.3453191491236516E+00 +-2.3447392225269819E+00 -2.3441589191152299E+00 -2.3435782391807396E+00 -2.3429971830155121E+00 -2.3424157509112007E+00 +-2.3418339431591164E+00 -2.3412517600502252E+00 -2.3406692018751500E+00 -2.3400862689241695E+00 -2.3395029614872218E+00 +-2.3389192798539016E+00 -2.3383352243134619E+00 -2.3377507951548160E+00 -2.3371659926665362E+00 -2.3365808171368556E+00 +-2.3359952688536647E+00 -2.3354093481045188E+00 -2.3348230551766336E+00 -2.3342363903568848E+00 -2.3336493539318144E+00 +-2.3330619461876236E+00 -2.3324741674101763E+00 -2.3318860178850085E+00 -2.3312974978973129E+00 -2.3307086077319483E+00 +-2.3301193476734410E+00 -2.3295297180059813E+00 -2.3289397190134284E+00 -2.3283493509793058E+00 -2.3277586141868056E+00 +-2.3271675089187891E+00 -2.3265760354577840E+00 -2.3259841940859882E+00 -2.3253919850852678E+00 -2.3247994087371602E+00 +-2.3242064653228720E+00 -2.3236131551232808E+00 -2.3230194784189364E+00 -2.3224254354900595E+00 -2.3218310266165436E+00 +-2.3212362520779548E+00 -2.3206411121535311E+00 -2.3200456071221867E+00 -2.3194497372625089E+00 -2.3188535028527575E+00 +-2.3182569041708718E+00 -2.3176599414944650E+00 -2.3170626151008236E+00 -2.3164649252669141E+00 -2.3158668722693778E+00 +-2.3152684563845356E+00 -2.3146696778883844E+00 -2.3140705370565988E+00 -2.3134710341645377E+00 -2.3128711694872321E+00 +-2.3122709432993980E+00 -2.3116703558754290E+00 -2.3110694074894012E+00 -2.3104680984150709E+00 -2.3098664289258770E+00 +-2.3092643992949391E+00 -2.3086620097950599E+00 -2.3080592606987267E+00 -2.3074561522781085E+00 -2.3068526848050595E+00 +-2.3062488585511174E+00 -2.3056446737875054E+00 -2.3050401307851325E+00 -2.3044352298145898E+00 -2.3038299711461625E+00 +-2.3032243550498159E+00 -2.3026183817952051E+00 -2.3020120516516718E+00 -2.3014053648882458E+00 -2.3007983217736467E+00 +-2.3001909225762827E+00 -2.2995831675642493E+00 -2.2989750570053347E+00 -2.2983665911670168E+00 -2.2977577703164642E+00 +-2.2971485947205350E+00 -2.2965390646457817E+00 -2.2959291803584478E+00 -2.2953189421244682E+00 -2.2947083502094721E+00 +-2.2940974048787828E+00 -2.2934861063974163E+00 -2.2928744550300832E+00 -2.2922624510411898E+00 -2.2916500946948348E+00 +-2.2910373862548163E+00 -2.2904243259846262E+00 -2.2898109141474525E+00 -2.2891971510061841E+00 -2.2885830368234026E+00 +-2.2879685718613900E+00 -2.2873537563821253E+00 -2.2867385906472872E+00 -2.2861230749182524E+00 -2.2855072094560986E+00 +-2.2848909945216023E+00 -2.2842744303752425E+00 -2.2836575172771960E+00 -2.2830402554873430E+00 -2.2824226452652652E+00 +-2.2818046868702466E+00 -2.2811863805612722E+00 -2.2805677265970310E+00 -2.2799487252359172E+00 -2.2793293767360265E+00 +-2.2787096813551599E+00 -2.2780896393508221E+00 -2.2774692509802255E+00 -2.2768485165002845E+00 -2.2762274361676225E+00 +-2.2756060102385653E+00 -2.2749842389691528E+00 -2.2743621226151252E+00 -2.2737396614319336E+00 -2.2731168556747354E+00 +-2.2724937055983983E+00 -2.2718702114574980E+00 -2.2712463735063193E+00 -2.2706221919988563E+00 -2.2699976671888162E+00 +-2.2693727993296120E+00 -2.2687475886743727E+00 -2.2681220354759346E+00 -2.2674961399868470E+00 -2.2668699024593737E+00 +-2.2662433231454879E+00 -2.2656164022968777E+00 -2.2649891401649440E+00 -2.2643615370008012E+00 -2.2637335930552798E+00 +-2.2631053085789223E+00 -2.2624766838219887E+00 -2.2618477190344524E+00 -2.2612184144660032E+00 -2.2605887703660468E+00 +-2.2599587869837108E+00 -2.2593284645678318E+00 -2.2586978033669682E+00 -2.2580668036293963E+00 -2.2574354656031086E+00 +-2.2568037895358199E+00 -2.2561717756749600E+00 -2.2555394242676807E+00 -2.2549067355608527E+00 -2.2542737098010686E+00 +-2.2536403472346387E+00 -2.2530066481075970E+00 -2.2523726126656984E+00 -2.2517382411544182E+00 -2.2511035338189562E+00 +-2.2504684909042334E+00 -2.2498331126548932E+00 -2.2491973993153045E+00 -2.2485613511295588E+00 -2.2479249683414704E+00 +-2.2472882511945818E+00 -2.2466511999321570E+00 -2.2460138147971849E+00 -2.2453760960323867E+00 -2.2447380438802020E+00 +-2.2440996585828010E+00 -2.2434609403820795E+00 -2.2428218895196603E+00 -2.2421825062368952E+00 -2.2415427907748628E+00 +-2.2409027433743711E+00 -2.2402623642759569E+00 -2.2396216537198850E+00 -2.2389806119461517E+00 -2.2383392391944805E+00 +-2.2376975357043296E+00 -2.2370555017148837E+00 -2.2364131374650595E+00 -2.2357704431935077E+00 -2.2351274191386086E+00 +-2.2344840655384757E+00 -2.2338403826309530E+00 -2.2331963706536211E+00 -2.2325520298437911E+00 -2.2319073604385089E+00 +-2.2312623626745554E+00 -2.2306170367884417E+00 -2.2299713830164212E+00 -2.2293254015944779E+00 -2.2286790927583300E+00 +-2.2280324567434362E+00 -2.2273854937849853E+00 -2.2267382041179102E+00 -2.2260905879768753E+00 -2.2254426455962855E+00 +-2.2247943772102805E+00 -2.2241457830527409E+00 -2.2234968633572860E+00 -2.2228476183572723E+00 -2.2221980482857950E+00 +-2.2215481533756916E+00 -2.2208979338595389E+00 -2.2202473899696522E+00 -2.2195965219380889E+00 -2.2189453299966480E+00 +-2.2182938143768691E+00 -2.2176419753100332E+00 -2.2169898130271650E+00 -2.2163373277590308E+00 -2.2156845197361381E+00 +-2.2150313891887392E+00 -2.2143779363468341E+00 -2.2137241614401608E+00 -2.2130700646982029E+00 -2.2124156463501903E+00 +-2.2117609066250963E+00 -2.2111058457516410E+00 -2.2104504639582894E+00 -2.2097947614732534E+00 -2.2091387385244894E+00 +-2.2084823953397033E+00 -2.2078257321463468E+00 -2.2071687491716179E+00 -2.2065114466424647E+00 -2.2058538247855823E+00 +-2.2051958838274150E+00 -2.2045376239941543E+00 -2.2038790455117434E+00 -2.2032201486058729E+00 -2.2025609335019856E+00 +-2.2019014004252715E+00 -2.2012415496006743E+00 -2.2005813812528876E+00 -2.1999208956063527E+00 -2.1992600928852712E+00 +-2.1985989733135898E+00 -2.1979375371150085E+00 -2.1972757845129816E+00 -2.1966137157307144E+00 -2.1959513309911669E+00 +-2.1952886305170543E+00 -2.1946256145308425E+00 -2.1939622832547538E+00 -2.1932986369107663E+00 -2.1926346757206105E+00 +-2.1919703999057747E+00 -2.1913058096875004E+00 -2.1906409052867879E+00 -2.1899756869243929E+00 -2.1893101548208271E+00 +-2.1886443091963601E+00 -2.1879781502710194E+00 -2.1873116782645874E+00 -2.1866448933966089E+00 -2.1859777958863855E+00 +-2.1853103859529743E+00 -2.1846426638151972E+00 -2.1839746296916283E+00 -2.1833062838006110E+00 -2.1826376263602412E+00 +-2.1819686575883770E+00 -2.1812993777026386E+00 -2.1806297869204068E+00 -2.1799598854588220E+00 -2.1792896735347882E+00 +-2.1786191513649724E+00 -2.1779483191658002E+00 -2.1772771771534640E+00 -2.1766057255439177E+00 -2.1759339645528768E+00 +-2.1752618943958235E+00 -2.1745895152880017E+00 -2.1739168274444207E+00 -2.1732438310798541E+00 -2.1725705264088417E+00 +-2.1718969136456860E+00 -2.1712229930044571E+00 -2.1705487646989905E+00 -2.1698742289428878E+00 -2.1691993859495176E+00 +-2.1685242359320149E+00 -2.1678487791032803E+00 -2.1671730156759876E+00 -2.1664969458625722E+00 -2.1658205698752422E+00 +-2.1651438879259692E+00 -2.1644669002264973E+00 -2.1637896069883391E+00 -2.1631120084227775E+00 -2.1624341047408615E+00 +-2.1617558961534149E+00 -2.1610773828710279E+00 -2.1603985651040638E+00 -2.1597194430626567E+00 -2.1590400169567103E+00 +-2.1583602869959018E+00 -2.1576802533896786E+00 -2.1569999163472633E+00 -2.1563192760776473E+00 -2.1556383327895969E+00 +-2.1549570866916508E+00 -2.1542755379921235E+00 -2.1535936868990997E+00 -2.1529115336204394E+00 -2.1522290783637761E+00 +-2.1515463213365242E+00 -2.1508632627458657E+00 -2.1501799027987594E+00 -2.1494962417019425E+00 -2.1488122796619242E+00 +-2.1481280168849950E+00 -2.1474434535772158E+00 -2.1467585899444290E+00 -2.1460734261922529E+00 -2.1453879625260823E+00 +-2.1447021991510908E+00 -2.1440161362722283E+00 -2.1433297740942265E+00 -2.1426431128215926E+00 -2.1419561526586128E+00 +-2.1412688938093543E+00 -2.1405813364776627E+00 -2.1398934808671632E+00 -2.1392053271812626E+00 -2.1385168756231447E+00 +-2.1378281263957795E+00 -2.1371390797019121E+00 -2.1364497357440739E+00 -2.1357600947245725E+00 -2.1350701568455044E+00 +-2.1343799223087427E+00 -2.1336893913159445E+00 -2.1329985640685507E+00 -2.1323074407677831E+00 -2.1316160216146489E+00 +-2.1309243068099377E+00 -2.1302322965542242E+00 -2.1295399910478663E+00 -2.1288473904910079E+00 -2.1281544950835749E+00 +-2.1274613050252809E+00 -2.1267678205156231E+00 -2.1260740417538870E+00 -2.1253799689391411E+00 -2.1246856022702412E+00 +-2.1239909419458307E+00 -2.1232959881643381E+00 -2.1226007411239793E+00 -2.1219052010227601E+00 -2.1212093680584703E+00 +-2.1205132424286899E+00 -2.1198168243307860E+00 -2.1191201139619134E+00 -2.1184231115190211E+00 -2.1177258171988411E+00 +-2.1170282311978972E+00 -2.1163303537125020E+00 -2.1156321849387592E+00 -2.1149337250725613E+00 -2.1142349743095932E+00 +-2.1135359328453283E+00 -2.1128366008750334E+00 -2.1121369785937651E+00 -2.1114370661963719E+00 -2.1107368638774946E+00 +-2.1100363718315651E+00 -2.1093355902528095E+00 -2.1086345193352454E+00 -2.1079331592726822E+00 -2.1072315102587269E+00 +-2.1065295724867745E+00 -2.1058273461500177E+00 -2.1051248314414428E+00 -2.1044220285538286E+00 -2.1037189376797509E+00 +-2.1030155590115762E+00 -2.1023118927414743E+00 -2.1016079390614029E+00 -2.1009036981631177E+00 -2.1001991702381724E+00 +-2.0994943554779137E+00 -2.0987892540734867E+00 -2.0980838662158332E+00 -2.0973781920956922E+00 -2.0966722319036002E+00 +-2.0959659858298907E+00 -2.0952594540646952E+00 -2.0945526367979439E+00 -2.0938455342193643E+00 -2.0931381465184851E+00 +-2.0924304738846304E+00 -2.0917225165069273E+00 -2.0910142745742997E+00 -2.0903057482754721E+00 -2.0895969377989689E+00 +-2.0888878433331151E+00 -2.0881784650660369E+00 -2.0874688031856596E+00 -2.0867588578797114E+00 -2.0860486293357181E+00 +-2.0853381177410149E+00 -2.0846273232827315E+00 -2.0839162461478029E+00 -2.0832048865229660E+00 -2.0824932445947590E+00 +-2.0817813205495250E+00 -2.0810691145734102E+00 -2.0803566268523626E+00 -2.0796438575721359E+00 -2.0789308069182861E+00 +-2.0782174750761739E+00 -2.0775038622309658E+00 -2.0767899685676317E+00 -2.0760757942709454E+00 -2.0753613395254891E+00 +-2.0746466045156482E+00 -2.0739315894256136E+00 -2.0732162944393835E+00 -2.0725007197407619E+00 -2.0717848655133597E+00 +-2.0710687319405938E+00 -2.0703523192056883E+00 -2.0696356274916750E+00 -2.0689186569813911E+00 -2.0682014078574880E+00 +-2.0674838803024178E+00 -2.0667660744984460E+00 -2.0660479906276419E+00 -2.0653296288718876E+00 -2.0646109894128730E+00 +-2.0638920724320964E+00 -2.0631728781108674E+00 -2.0624534066303037E+00 -2.0617336581713346E+00 -2.0610136329146980E+00 +-2.0602933310409437E+00 -2.0595727527304319E+00 -2.0588518981633346E+00 -2.0581307675196334E+00 -2.0574093609791224E+00 +-2.0566876787214077E+00 -2.0559657209259075E+00 -2.0552434877718513E+00 -2.0545209794382830E+00 -2.0537981961040574E+00 +-2.0530751379478427E+00 -2.0523518051481191E+00 -2.0516281978831863E+00 -2.0509043163311511E+00 -2.0501801606699366E+00 +-2.0494557310772805E+00 -2.0487310277307338E+00 -2.0480060508076630E+00 -2.0472808004852503E+00 -2.0465552769404920E+00 +-2.0458294803502008E+00 -2.0451034108910031E+00 -2.0443770687393439E+00 -2.0436504540714830E+00 -2.0429235670634962E+00 +-2.0421964078912769E+00 -2.0414689767305347E+00 -2.0407412737567969E+00 -2.0400132991454076E+00 -2.0392850530715290E+00 +-2.0385565357101401E+00 -2.0378277472360393E+00 -2.0370986878238444E+00 -2.0363693576479864E+00 -2.0356397568827220E+00 +-2.0349098857021195E+00 -2.0341797442800762E+00 -2.0334493327903016E+00 -2.0327186514063245E+00 -2.0319877003014977E+00 +-2.0312564796489920E+00 -2.0305249896217981E+00 -2.0297932303927282E+00 -2.0290612021344168E+00 -2.0283289050193161E+00 +-2.0275963392197029E+00 -2.0268635049076735E+00 -2.0261304022551476E+00 -2.0253970314338661E+00 -2.0246633926153916E+00 +-2.0239294859711099E+00 -2.0231953116722292E+00 -2.0224608698897812E+00 -2.0217261607946209E+00 -2.0209911845574258E+00 +-2.0202559413486978E+00 -2.0195204313387616E+00 -2.0187846546977677E+00 -2.0180486115956877E+00 -2.0173123022023240E+00 +-2.0165757266872983E+00 -2.0158388852200582E+00 -2.0151017779698783E+00 -2.0143644051058565E+00 -2.0136267667969174E+00 +-2.0128888632118125E+00 -2.0121506945191174E+00 -2.0114122608872362E+00 -2.0106735624843979E+00 -2.0099345994786586E+00 +-2.0091953720379019E+00 -2.0084558803298389E+00 -2.0077161245220081E+00 -2.0069761047817742E+00 -2.0062358212763316E+00 +-2.0054952741727017E+00 -2.0047544636377350E+00 -2.0040133898381107E+00 -2.0032720529403361E+00 -2.0025304531107482E+00 +-2.0017885905155119E+00 -2.0010464653206230E+00 -2.0003040776919043E+00 -1.9995614277950156E+00 -1.9988185157954386E+00 +-1.9980753418584896E+00 -1.9973319061493136E+00 -1.9965882088328879E+00 -1.9958442500740194E+00 -1.9951000300373476E+00 +-1.9943555488873419E+00 -1.9936108067883047E+00 -1.9928658039043685E+00 -1.9921205403995008E+00 -1.9913750164374981E+00 +-1.9906292321819921E+00 -1.9898831877964445E+00 -1.9891368834441521E+00 -1.9883903192882439E+00 -1.9876434954916826E+00 +-1.9868964122172648E+00 -1.9861490696276194E+00 -1.9854014678852112E+00 -1.9846536071523366E+00 -1.9839054875911295E+00 +-1.9831571093635560E+00 -1.9824084726314162E+00 -1.9816595775563512E+00 -1.9809104242998314E+00 -1.9801610130231637E+00 +-1.9794113438874910E+00 -1.9786614170537935E+00 -1.9779112326828852E+00 -1.9771607909354183E+00 -1.9764100919718806E+00 +-1.9756591359525963E+00 -1.9749079230377280E+00 -1.9741564533872735E+00 -1.9734047271610691E+00 -1.9726527445187885E+00 +-1.9719005056199428E+00 -1.9711480106238808E+00 -1.9703952596897902E+00 -1.9696422529766973E+00 -1.9688889906434661E+00 +-1.9681354728487990E+00 -1.9673816997512386E+00 -1.9666276715091660E+00 -1.9658733882808017E+00 -1.9651188502242034E+00 +-1.9643640574972765E+00 -1.9636090102577579E+00 -1.9628537086632278E+00 -1.9620981528711070E+00 -1.9613423430386561E+00 +-1.9605862793229780E+00 -1.9598299618810149E+00 -1.9590733908695508E+00 -1.9583165664452122E+00 -1.9575594887644647E+00 +-1.9568021579836179E+00 -1.9560445742588231E+00 -1.9552867377460734E+00 -1.9545286486012043E+00 -1.9537703069798931E+00 +-1.9530117130376612E+00 -1.9522528669298731E+00 -1.9514937688117355E+00 -1.9507344188382989E+00 -1.9499748171644575E+00 +-1.9492149639449488E+00 -1.9484548593343549E+00 -1.9476945034871025E+00 -1.9469338965574585E+00 -1.9461730386995433E+00 +-1.9454119300673149E+00 -1.9446505708145765E+00 -1.9438889610949790E+00 -1.9431271010620170E+00 -1.9423649908690330E+00 +-1.9416026306692111E+00 -1.9408400206155856E+00 -1.9400771608610339E+00 -1.9393140515582818E+00 -1.9385506928599003E+00 +-1.9377870849183076E+00 -1.9370232278857691E+00 -1.9362591219143963E+00 -1.9354947671561489E+00 -1.9347301637628342E+00 +-1.9339653118861062E+00 -1.9332002116774674E+00 -1.9324348632882693E+00 -1.9316692668697095E+00 -1.9309034225728348E+00 +-1.9301373305485419E+00 -1.9293709909475756E+00 -1.9286044039205263E+00 -1.9278375696178416E+00 -1.9270704881898117E+00 +-1.9263031597865783E+00 -1.9255355845581323E+00 -1.9247677626543156E+00 -1.9239996942248194E+00 -1.9232313794191860E+00 +-1.9224628183868080E+00 -1.9216940112769272E+00 -1.9209249582386392E+00 -1.9201556594208875E+00 -1.9193861149724694E+00 +-1.9186163250420323E+00 -1.9178462897780748E+00 -1.9170760093289489E+00 -1.9163054838428573E+00 -1.9155347134678555E+00 +-1.9147636983518508E+00 -1.9139924386426033E+00 -1.9132209344877265E+00 -1.9124491860346857E+00 -1.9116771934307997E+00 +-1.9109049568232388E+00 -1.9101324763590326E+00 -1.9093597521850592E+00 -1.9085867844480504E+00 -1.9078135732945942E+00 +-1.9070401188711317E+00 -1.9062664213239582E+00 -1.9054924807992246E+00 -1.9047182974429351E+00 -1.9039438714009498E+00 +-1.9031692028189835E+00 -1.9023942918426069E+00 -1.9016191386172456E+00 -1.9008437432881802E+00 -1.9000681060005480E+00 +-1.8992922268993424E+00 -1.8985161061294131E+00 -1.8977397438354651E+00 -1.8969631401620599E+00 -1.8961862952536173E+00 +-1.8954092092544126E+00 -1.8946318823085786E+00 -1.8938543145601052E+00 -1.8930765061528401E+00 -1.8922984572304860E+00 +-1.8915201679366096E+00 -1.8907416384146298E+00 -1.8899628688078247E+00 -1.8891838592593322E+00 -1.8884046099121479E+00 +-1.8876251209091250E+00 -1.8868453923929775E+00 -1.8860654245062765E+00 -1.8852852173914536E+00 -1.8845047711907994E+00 +-1.8837240860464635E+00 -1.8829431621004551E+00 -1.8821619994946455E+00 -1.8813805983707623E+00 -1.8805989588703964E+00 +-1.8798170811349970E+00 -1.8790349653058760E+00 -1.8782526115242038E+00 -1.8774700199310130E+00 -1.8766871906671962E+00 +-1.8759041238735095E+00 -1.8751208196905675E+00 -1.8743372782588483E+00 -1.8735534997186885E+00 -1.8727694842102942E+00 +-1.8719852318737256E+00 -1.8712007428489097E+00 -1.8704160172756334E+00 -1.8696310552935478E+00 -1.8688458570421647E+00 +-1.8680604226608619E+00 -1.8672747522888786E+00 -1.8664888460653168E+00 -1.8657027041291427E+00 -1.8649163266191862E+00 +-1.8641297136741404E+00 -1.8633428654325621E+00 -1.8625557820328731E+00 -1.8617684636133596E+00 -1.8609809103121711E+00 +-1.8601931222673220E+00 -1.8594050996166926E+00 -1.8586168424980267E+00 -1.8578283510489335E+00 -1.8570396254068893E+00 +-1.8562506657092321E+00 -1.8554614720931675E+00 -1.8546720446957701E+00 -1.8538823836539753E+00 -1.8530924891045868E+00 +-1.8523023611842748E+00 -1.8515120000295753E+00 -1.8507214057768910E+00 -1.8499305785624911E+00 -1.8491395185225119E+00 +-1.8483482257929567E+00 -1.8475567005096978E+00 -1.8467649428084711E+00 -1.8459729528248838E+00 -1.8451807306944081E+00 +-1.8443882765523856E+00 -1.8435955905340260E+00 -1.8428026727744065E+00 -1.8420095234084717E+00 -1.8412161425710383E+00 +-1.8404225303967867E+00 -1.8396286870202700E+00 -1.8388346125759094E+00 -1.8380403071979936E+00 -1.8372457710206826E+00 +-1.8364510041780029E+00 -1.8356560068038570E+00 -1.8348607790320106E+00 -1.8340653209961029E+00 -1.8332696328296409E+00 +-1.8324737146660039E+00 -1.8316775666384397E+00 -1.8308811888800682E+00 -1.8300845815238798E+00 -1.8292877447027358E+00 +-1.8284906785493675E+00 -1.8276933831963791E+00 -1.8268958587762445E+00 -1.8260981054213106E+00 -1.8253001232637944E+00 +-1.8245019124357864E+00 -1.8237034730692478E+00 -1.8229048052960131E+00 -1.8221059092477871E+00 -1.8213067850561493E+00 +-1.8205074328525503E+00 -1.8197078527683146E+00 -1.8189080449346393E+00 -1.8181080094825928E+00 -1.8173077465431171E+00 +-1.8165072562470326E+00 -1.8157065387250271E+00 -1.8149055941076655E+00 -1.8141044225253826E+00 -1.8133030241084931E+00 +-1.8125013989871799E+00 -1.8116995472915041E+00 -1.8108974691513999E+00 -1.8100951646966761E+00 -1.8092926340570168E+00 +-1.8084898773619800E+00 -1.8076868947409990E+00 -1.8068836863233830E+00 -1.8060802522383161E+00 -1.8052765926148584E+00 +-1.8044727075819436E+00 -1.8036685972683841E+00 -1.8028642618028667E+00 -1.8020597013139539E+00 -1.8012549159300855E+00 +-1.8004499057795766E+00 -1.7996446709906200E+00 -1.7988392116912821E+00 -1.7980335280095134E+00 -1.7972276200731339E+00 +-1.7964214880098441E+00 -1.7956151319472209E+00 -1.7948085520127184E+00 -1.7940017483336697E+00 -1.7931947210372834E+00 +-1.7923874702506479E+00 -1.7915799961007293E+00 -1.7907722987143706E+00 -1.7899643782182939E+00 -1.7891562347391012E+00 +-1.7883478684032705E+00 -1.7875392793371598E+00 -1.7867304676670073E+00 -1.7859214335189271E+00 -1.7851121770189156E+00 +-1.7843026982928458E+00 -1.7834929974664731E+00 -1.7826830746654305E+00 -1.7818729300152309E+00 -1.7810625636412674E+00 +-1.7802519756688133E+00 -1.7794411662230196E+00 -1.7786301354289249E+00 -1.7778188834114403E+00 -1.7770074102953619E+00 +-1.7761957162053634E+00 -1.7753838012660030E+00 -1.7745716656017170E+00 -1.7737593093368240E+00 -1.7729467325955250E+00 +-1.7721339355019003E+00 -1.7713209181799137E+00 -1.7705076807534093E+00 -1.7696942233461141E+00 -1.7688805460816379E+00 +-1.7680666490834698E+00 -1.7672525324749833E+00 -1.7664381963794362E+00 -1.7656236409199639E+00 -1.7648088662195889E+00 +-1.7639938724012145E+00 -1.7631786595876275E+00 -1.7623632279014985E+00 -1.7615475774653799E+00 -1.7607317084017069E+00 +-1.7599156208328042E+00 -1.7590993148808738E+00 -1.7582827906680023E+00 -1.7574660483161628E+00 -1.7566490879472105E+00 +-1.7558319096828865E+00 -1.7550145136448141E+00 -1.7541968999545037E+00 -1.7533790687333479E+00 -1.7525610201026263E+00 +-1.7517427541835018E+00 -1.7509242710970230E+00 -1.7501055709641242E+00 -1.7492866539056238E+00 -1.7484675200422271E+00 +-1.7476481694945236E+00 -1.7468286023829909E+00 -1.7460088188279890E+00 -1.7451888189497673E+00 -1.7443686028684589E+00 +-1.7435481707040850E+00 -1.7427275225765517E+00 -1.7419066586056529E+00 -1.7410855789110669E+00 -1.7402642836123641E+00 +-1.7394427728289965E+00 -1.7386210466803056E+00 -1.7377991052855193E+00 -1.7369769487637532E+00 -1.7361545772340097E+00 +-1.7353319908151805E+00 -1.7345091896260443E+00 -1.7336861737852669E+00 -1.7328629434114025E+00 -1.7320394986228942E+00 +-1.7312158395380723E+00 -1.7303919662751566E+00 -1.7295678789522548E+00 -1.7287435776873645E+00 -1.7279190625983689E+00 +-1.7270943338030440E+00 -1.7262693914190532E+00 -1.7254442355639481E+00 -1.7246188663551711E+00 -1.7237932839100543E+00 +-1.7229674883458179E+00 -1.7221414797795729E+00 -1.7213152583283176E+00 -1.7204888241089482E+00 -1.7196621772382410E+00 +-1.7188353178328686E+00 -1.7180082460093922E+00 -1.7171809618842631E+00 -1.7163534655738246E+00 -1.7155257571943094E+00 +-1.7146978368618413E+00 -1.7138697046924367E+00 -1.7130413608020005E+00 -1.7122128053063319E+00 -1.7113840383211185E+00 +-1.7105550599619419E+00 -1.7097258703442737E+00 -1.7088964695834774E+00 -1.7080668577948097E+00 -1.7072370350934185E+00 +-1.7064070015943436E+00 -1.7055767574125180E+00 -1.7047463026627652E+00 -1.7039156374598037E+00 -1.7030847619182428E+00 +-1.7022536761525839E+00 -1.7014223802772264E+00 -1.7005908744064573E+00 -1.6997591586544583E+00 -1.6989272331353049E+00 +-1.6980950979629650E+00 -1.6972627532513016E+00 -1.6964301991140707E+00 -1.6955974356649213E+00 -1.6947644630173975E+00 +-1.6939312812849365E+00 -1.6930978905808698E+00 -1.6922642910184242E+00 -1.6914304827107198E+00 -1.6905964657707713E+00 +-1.6897622403114887E+00 -1.6889278064456767E+00 -1.6880931642860344E+00 -1.6872583139451551E+00 -1.6864232555355296E+00 +-1.6855879891695424E+00 -1.6847525149594738E+00 -1.6839168330174987E+00 -1.6830809434556893E+00 -1.6822448463860094E+00 +-1.6814085419203273E+00 -1.6805720301703995E+00 -1.6797353112478806E+00 -1.6788983852643216E+00 -1.6780612523311713E+00 +-1.6772239125597732E+00 -1.6763863660613678E+00 -1.6755486129470922E+00 -1.6747106533279814E+00 -1.6738724873149662E+00 +-1.6730341150188750E+00 -1.6721955365504326E+00 -1.6713567520202635E+00 -1.6705177615388864E+00 -1.6696785652167192E+00 +-1.6688391631640784E+00 -1.6679995554911757E+00 -1.6671597423081237E+00 -1.6663197237249308E+00 -1.6654794998515048E+00 +-1.6646390707976511E+00 -1.6637984366730729E+00 -1.6629575975873740E+00 -1.6621165536500524E+00 -1.6612753049705125E+00 +-1.6604338516580508E+00 -1.6595921938218645E+00 -1.6587503315710512E+00 -1.6579082650146062E+00 -1.6570659942614248E+00 +-1.6562235194203019E+00 -1.6553808405999311E+00 -1.6545379579089072E+00 -1.6536948714557236E+00 -1.6528515813487732E+00 +-1.6520080876963499E+00 -1.6511643906066480E+00 -1.6503204901877608E+00 -1.6494763865476827E+00 -1.6486320797943079E+00 +-1.6477875700354330E+00 -1.6469428573787530E+00 -1.6460979419318653E+00 -1.6452528238022670E+00 -1.6444075030973579E+00 +-1.6435619799244372E+00 -1.6427162543907043E+00 -1.6418703266032659E+00 -1.6410241966691250E+00 -1.6401778646951859E+00 +-1.6393313307882569E+00 -1.6384845950550471E+00 -1.6376376576021681E+00 -1.6367905185361329E+00 -1.6359431779633571E+00 +-1.6350956359901585E+00 -1.6342478927227568E+00 -1.6333999482672750E+00 -1.6325518027297390E+00 -1.6317034562160764E+00 +-1.6308549088321176E+00 -1.6300061606835967E+00 -1.6291572118761508E+00 -1.6283080625153203E+00 -1.6274587127065481E+00 +-1.6266091625551811E+00 -1.6257594121664696E+00 -1.6249094616455675E+00 -1.6240593110975328E+00 -1.6232089606273263E+00 +-1.6223584103398119E+00 -1.6215076603397636E+00 -1.6206567107318521E+00 -1.6198055616206559E+00 -1.6189542131106571E+00 +-1.6181026653062427E+00 -1.6172509183117048E+00 -1.6163989722312384E+00 -1.6155468271689448E+00 -1.6146944832288306E+00 +-1.6138419405148063E+00 -1.6129891991306877E+00 -1.6121362591801973E+00 -1.6112831207669607E+00 -1.6104297839945105E+00 +-1.6095762489662846E+00 -1.6087225157856271E+00 -1.6078685845557863E+00 -1.6070144553799177E+00 -1.6061601283610834E+00 +-1.6053056036022497E+00 -1.6044508812062905E+00 -1.6035959612759860E+00 -1.6027408439140227E+00 -1.6018855292229901E+00 +-1.6010300173053933E+00 -1.6001743082636368E+00 -1.5993184022000324E+00 -1.5984622992168009E+00 -1.5976059994160701E+00 +-1.5967495028998737E+00 -1.5958928097701539E+00 -1.5950359201287592E+00 -1.5941788340774465E+00 -1.5933215517178805E+00 +-1.5924640731516322E+00 -1.5916063984801825E+00 -1.5907485278049176E+00 -1.5898904612271343E+00 -1.5890321988480358E+00 +-1.5881737407687344E+00 -1.5873150870902504E+00 -1.5864562379135125E+00 -1.5855971933393582E+00 -1.5847379534685329E+00 +-1.5838785184016926E+00 -1.5830188882393992E+00 -1.5821590630821247E+00 -1.5812990430302540E+00 -1.5804388281840760E+00 +-1.5795784186437904E+00 -1.5787178145095075E+00 -1.5778570158812453E+00 -1.5769960228589328E+00 -1.5761348355424074E+00 +-1.5752734540314177E+00 -1.5744118784256211E+00 -1.5735501088245853E+00 -1.5726881453277881E+00 -1.5718259880346181E+00 +-1.5709636370443725E+00 -1.5701010924562604E+00 -1.5692383543694020E+00 -1.5683754228828255E+00 -1.5675122980954728E+00 +-1.5666489801061931E+00 -1.5657854690137505E+00 -1.5649217649168172E+00 -1.5640578679139776E+00 -1.5631937781037271E+00 +-1.5623294955844720E+00 -1.5614650204545288E+00 -1.5606003528121311E+00 -1.5597354927554172E+00 -1.5588704403824409E+00 +-1.5580051957911671E+00 -1.5571397590794709E+00 -1.5562741303451415E+00 -1.5554083096858795E+00 -1.5545422971992982E+00 +-1.5536760929829219E+00 -1.5528096971341878E+00 -1.5519431097504464E+00 -1.5510763309289604E+00 -1.5502093607669043E+00 +-1.5493421993613661E+00 -1.5484748468093472E+00 -1.5476073032077609E+00 -1.5467395686534340E+00 -1.5458716432431061E+00 +-1.5450035270734315E+00 -1.5441352202409762E+00 -1.5432667228422201E+00 -1.5423980349735571E+00 -1.5415291567312943E+00 +-1.5406600882116506E+00 -1.5397908295107650E+00 -1.5389213807246847E+00 -1.5380517419493727E+00 -1.5371819132807047E+00 +-1.5363118948144734E+00 -1.5354416866463829E+00 -1.5345712888720544E+00 -1.5337007015870212E+00 -1.5328299248867336E+00 +-1.5319589588665545E+00 -1.5310878036217630E+00 -1.5302164592475518E+00 -1.5293449258390299E+00 -1.5284732034912207E+00 +-1.5276012922990636E+00 -1.5267291923574111E+00 -1.5258569037610341E+00 -1.5249844266046164E+00 -1.5241117609827590E+00 +-1.5232389069899774E+00 -1.5223658647207039E+00 -1.5214926342692858E+00 -1.5206192157299845E+00 -1.5197456091969845E+00 +-1.5188718147643787E+00 -1.5179978325261794E+00 -1.5171236625763147E+00 -1.5162493050086294E+00 -1.5153747599168841E+00 +-1.5145000273947566E+00 -1.5136251075358418E+00 -1.5127500004336509E+00 -1.5118747061816113E+00 -1.5109992248730686E+00 +-1.5101235566012845E+00 -1.5092477014594383E+00 -1.5083716595406267E+00 -1.5074954309378625E+00 -1.5066190157440777E+00 +-1.5057424140521209E+00 -1.5048656259547577E+00 -1.5039886515446734E+00 -1.5031114909144685E+00 -1.5022341441566627E+00 +-1.5013566113636945E+00 -1.5004788926279191E+00 -1.4996009880416070E+00 -1.4987228976969560E+00 -1.4978446216860739E+00 +-1.4969661601009896E+00 -1.4960875130336497E+00 -1.4952086805759208E+00 -1.4943296628195870E+00 -1.4934504598563514E+00 +-1.4925710717778369E+00 -1.4916914986755847E+00 -1.4908117406410539E+00 -1.4899317977656255E+00 -1.4890516701405967E+00 +-1.4881713578571860E+00 -1.4872908610065303E+00 -1.4864101796796871E+00 -1.4855293139676324E+00 -1.4846482639612624E+00 +-1.4837670297513923E+00 -1.4828856114287583E+00 -1.4820040090840159E+00 -1.4811222228077410E+00 -1.4802402526904284E+00 +-1.4793580988224928E+00 -1.4784757612942743E+00 -1.4775932401960277E+00 -1.4767105356179300E+00 -1.4758276476500782E+00 +-1.4749445763824913E+00 -1.4740613219051084E+00 -1.4731778843077881E+00 -1.4722942636803122E+00 -1.4714104601123823E+00 +-1.4705264736936208E+00 -1.4696423045135725E+00 -1.4687579526617014E+00 -1.4678734182273940E+00 -1.4669887012999594E+00 +-1.4661038019686266E+00 -1.4652187203225457E+00 -1.4643334564507908E+00 -1.4634480104423555E+00 -1.4625623823861562E+00 +-1.4616765723710312E+00 -1.4607905804857413E+00 -1.4599044068189686E+00 -1.4590180514593174E+00 -1.4581315144953131E+00 +-1.4572447960154089E+00 -1.4563578961079739E+00 -1.4554708148613036E+00 -1.4545835523636137E+00 -1.4536961087030440E+00 +-1.4528084839676574E+00 -1.4519206782454379E+00 -1.4510326916242953E+00 -1.4501445241920596E+00 -1.4492561760364859E+00 +-1.4483676472452514E+00 -1.4474789379059567E+00 -1.4465900481061269E+00 -1.4457009779332091E+00 -1.4448117274745746E+00 +-1.4439222968175183E+00 -1.4430326860492586E+00 -1.4421428952569386E+00 -1.4412529245276242E+00 -1.4403627739483056E+00 +-1.4394724436058965E+00 -1.4385819335872365E+00 -1.4376912439790874E+00 -1.4368003748681339E+00 -1.4359093263409926E+00 +-1.4350180984841958E+00 -1.4341266913842048E+00 -1.4332351051274039E+00 -1.4323433398001029E+00 -1.4314513954885368E+00 +-1.4305592722788643E+00 -1.4296669702571692E+00 -1.4287744895094614E+00 -1.4278818301216758E+00 -1.4269889921796708E+00 +-1.4260959757692320E+00 -1.4252027809760697E+00 -1.4243094078858192E+00 -1.4234158565840420E+00 -1.4225221271562245E+00 +-1.4216282196877799E+00 -1.4207341342640454E+00 -1.4198398709702860E+00 -1.4189454298916917E+00 -1.4180508111133772E+00 +-1.4171560147203861E+00 -1.4162610407976834E+00 -1.4153658894301695E+00 -1.4144705607026613E+00 -1.4135750546999073E+00 +-1.4126793715065806E+00 -1.4117835112072816E+00 -1.4108874738865373E+00 -1.4099912596288018E+00 -1.4090948685184550E+00 +-1.4081983006398042E+00 -1.4073015560770841E+00 -1.4064046349144561E+00 -1.4055075372360080E+00 -1.4046102631257562E+00 +-1.4037128126676435E+00 -1.4028151859455400E+00 -1.4019173830432441E+00 -1.4010194040444799E+00 -1.4001212490329009E+00 +-1.3992229180920877E+00 -1.3983244113055491E+00 -1.3974257287567202E+00 -1.3965268705289653E+00 -1.3956278367055768E+00 +-1.3947286273697721E+00 -1.3938292426047039E+00 -1.3929296824934470E+00 -1.3920299471190052E+00 -1.3911300365643120E+00 +-1.3902299509122289E+00 -1.3893296902455459E+00 -1.3884292546469814E+00 -1.3875286441991832E+00 -1.3866278589847276E+00 +-1.3857268990861189E+00 -1.3848257645857911E+00 -1.3839244555661068E+00 -1.3830229721093581E+00 -1.3821213142977664E+00 +-1.3812194822134813E+00 -1.3803174759385826E+00 -1.3794152955550789E+00 -1.3785129411449091E+00 -1.3776104127899402E+00 +-1.3767077105719705E+00 -1.3758048345727267E+00 -1.3749017848738656E+00 -1.3739985615569739E+00 -1.3730951647035661E+00 +-1.3721915943950924E+00 -1.3712878507129289E+00 -1.3703839337383807E+00 -1.3694798435526858E+00 -1.3685755802370105E+00 +-1.3676711438724529E+00 -1.3667665345400406E+00 -1.3658617523207324E+00 -1.3649567972954164E+00 -1.3640516695449134E+00 +-1.3631463691499737E+00 -1.3622408961912782E+00 -1.3613352507494383E+00 -1.3604294329049980E+00 -1.3595234427384308E+00 +-1.3586172803301415E+00 -1.3577109457604670E+00 -1.3568044391096743E+00 -1.3558977604579621E+00 -1.3549909098854618E+00 +-1.3540838874722341E+00 -1.3531766932982714E+00 -1.3522693274434971E+00 -1.3513617899877723E+00 -1.3504540810108827E+00 +-1.3495462005925483E+00 -1.3486381488124215E+00 -1.3477299257500852E+00 -1.3468215314850562E+00 -1.3459129660967826E+00 +-1.3450042296646434E+00 -1.3440953222679528E+00 -1.3431862439859541E+00 -1.3422769948978255E+00 -1.3413675750826766E+00 +-1.3404579846195490E+00 -1.3395482235874183E+00 -1.3386382920651920E+00 -1.3377281901317097E+00 -1.3368179178657451E+00 +-1.3359074753460045E+00 -1.3349968626511262E+00 -1.3340860798596830E+00 -1.3331751270501793E+00 -1.3322640043010543E+00 +-1.3313527116906791E+00 -1.3304412492973572E+00 -1.3295296171993300E+00 -1.3286178154747688E+00 -1.3277058442017780E+00 +-1.3267937034583965E+00 -1.3258813933225977E+00 -1.3249689138722875E+00 -1.3240562651853063E+00 -1.3231434473394290E+00 +-1.3222304604123625E+00 -1.3213173044817499E+00 -1.3204039796251670E+00 -1.3194904859201244E+00 -1.3185768234440669E+00 +-1.3176629922743734E+00 -1.3167489924883578E+00 -1.3158348241632674E+00 -1.3149204873762850E+00 -1.3140059822045271E+00 +-1.3130913087250458E+00 -1.3121764670148268E+00 -1.3112614571507926E+00 -1.3103462792097980E+00 -1.3094309332686349E+00 +-1.3085154194040258E+00 -1.3075997376926380E+00 -1.3066838882110645E+00 -1.3057678710358367E+00 -1.3048516862434216E+00 +-1.3039353339102211E+00 -1.3030188141125723E+00 -1.3021021269267494E+00 -1.3011852724289596E+00 -1.3002682506953480E+00 +-1.2993510618019943E+00 -1.2984337058249140E+00 -1.2975161828400583E+00 -1.2965984929233147E+00 -1.2956806361505069E+00 +-1.2947626125973934E+00 -1.2938444223396706E+00 -1.2929260654529693E+00 -1.2920075420128578E+00 -1.2910888520948405E+00 +-1.2901699957743569E+00 -1.2892509731267852E+00 -1.2883317842274375E+00 -1.2874124291515625E+00 -1.2864929079743512E+00 +-1.2855732207709243E+00 -1.2846533676163423E+00 -1.2837333485856022E+00 -1.2828131637536377E+00 -1.2818928131953196E+00 +-1.2809722969854553E+00 -1.2800516151987904E+00 -1.2791307679100066E+00 -1.2782097551937237E+00 -1.2772885771244982E+00 +-1.2763672337768237E+00 -1.2754457252251319E+00 -1.2745240515437914E+00 -1.2736022128071094E+00 -1.2726802090893294E+00 +-1.2717580404646336E+00 -1.2708357070071412E+00 -1.2699132087909097E+00 -1.2689905458899344E+00 -1.2680677183781490E+00 +-1.2671447263294238E+00 -1.2662215698175689E+00 -1.2652982489163287E+00 -1.2643747636993943E+00 -1.2634511142403870E+00 +-1.2625273006128690E+00 -1.2616033228903409E+00 -1.2606791811462428E+00 -1.2597548754539509E+00 -1.2588304058867827E+00 +-1.2579057725179932E+00 -1.2569809754207750E+00 -1.2560560146682613E+00 -1.2551308903335237E+00 -1.2542056024895720E+00 +-1.2532801512093557E+00 -1.2523545365657629E+00 -1.2514287586316213E+00 -1.2505028174796975E+00 -1.2495767131826965E+00 +-1.2486504458132646E+00 -1.2477240154439855E+00 -1.2467974221473832E+00 -1.2458706659959211E+00 -1.2449437470620026E+00 +-1.2440166654179698E+00 -1.2430894211361025E+00 -1.2421620142886283E+00 -1.2412344449477055E+00 -1.2403067131854362E+00 +-1.2393788190738624E+00 -1.2384507626849650E+00 -1.2375225440906659E+00 -1.2365941633628270E+00 -1.2356656205732504E+00 +-1.2347369157936781E+00 -1.2338080490957921E+00 -1.2328790205512163E+00 -1.2319498302315126E+00 -1.2310204782081862E+00 +-1.2300909645526807E+00 -1.2291612893363808E+00 -1.2282314526306126E+00 -1.2273014545066427E+00 -1.2263712950356778E+00 +-1.2254409742888652E+00 -1.2245104923372954E+00 -1.2235798492519974E+00 -1.2226490451039420E+00 -1.2217180799640395E+00 +-1.2207869539031475E+00 -1.2198556669920579E+00 -1.2189242193015071E+00 -1.2179926109021717E+00 -1.2170608418646705E+00 +-1.2161289122595631E+00 -1.2151968221573513E+00 -1.2142645716284783E+00 -1.2133321607433285E+00 -1.2123995895722288E+00 +-1.2114668581854469E+00 -1.2105339666531936E+00 -1.2096009150456206E+00 -1.2086677034328215E+00 -1.2077343318848324E+00 +-1.2068008004716315E+00 -1.2058671092631383E+00 -1.2049332583292163E+00 -1.2039992477396695E+00 -1.2030650775642442E+00 +-1.2021307478726311E+00 -1.2011962587344605E+00 -1.2002616102193076E+00 -1.1993268023966857E+00 -1.1983918353360601E+00 +-1.1974567091068298E+00 -1.1965214237783399E+00 -1.1955859794198775E+00 -1.1946503761006735E+00 -1.1937146138899009E+00 +-1.1927786928566759E+00 -1.1918426130700579E+00 -1.1909063745990496E+00 -1.1899699775125960E+00 -1.1890334218795857E+00 +-1.1880967077688513E+00 -1.1871598352491681E+00 -1.1862228043892540E+00 -1.1852856152577720E+00 -1.1843482679233266E+00 +-1.1834107624544679E+00 -1.1824730989196883E+00 -1.1815352773874239E+00 -1.1805972979260551E+00 -1.1796591606039062E+00 +-1.1787208654892440E+00 -1.1777824126502789E+00 -1.1768438021551706E+00 -1.1759050340720163E+00 -1.1749661084688594E+00 +-1.1740270254136884E+00 -1.1730877849744350E+00 -1.1721483872189751E+00 -1.1712088322151297E+00 -1.1702691200306632E+00 +-1.1693292507332855E+00 -1.1683892243906500E+00 -1.1674490410703546E+00 -1.1665087008399431E+00 -1.1655682037669022E+00 +-1.1646275499186642E+00 -1.1636867393626062E+00 -1.1627457721660501E+00 -1.1618046483962625E+00 -1.1608633681204550E+00 +-1.1599219314057838E+00 -1.1589803383193507E+00 -1.1580385889282023E+00 -1.1570966832993301E+00 -1.1561546214996719E+00 +-1.1552124035961069E+00 -1.1542700296554673E+00 -1.1533274997445246E+00 -1.1523848139299966E+00 -1.1514419722785467E+00 +-1.1504989748567851E+00 -1.1495558217312665E+00 -1.1486125129684912E+00 -1.1476690486349064E+00 -1.1467254287969029E+00 +-1.1457816535208201E+00 -1.1448377228729412E+00 -1.1438936369194952E+00 -1.1429493957266588E+00 -1.1420049993605534E+00 +-1.1410604478872468E+00 -1.1401157413727527E+00 -1.1391708798830318E+00 -1.1382258634839904E+00 -1.1372806922414809E+00 +-1.1363353662213032E+00 -1.1353898854892019E+00 -1.1344442501108698E+00 -1.1334984601519444E+00 -1.1325525156780094E+00 +-1.1316064167546012E+00 -1.1306601634471956E+00 -1.1297137558212176E+00 -1.1287671939420398E+00 -1.1278204778749814E+00 +-1.1268736076853063E+00 -1.1259265834382293E+00 -1.1249794051989090E+00 -1.1240320730324522E+00 -1.1230845870039132E+00 +-1.1221369471782934E+00 -1.1211891536205401E+00 -1.1202412063955505E+00 -1.1192931055681661E+00 -1.1183448512031779E+00 +-1.1173964433653236E+00 -1.1164478821192885E+00 -1.1154991675297052E+00 -1.1145502996611549E+00 -1.1136012785781648E+00 +-1.1126521043452116E+00 -1.1117027770267185E+00 -1.1107532966870541E+00 -1.1098036633905430E+00 -1.1088538772014493E+00 +-1.1079039381839895E+00 -1.1069538464023256E+00 -1.1060036019205692E+00 -1.1050532048027797E+00 -1.1041026551129649E+00 +-1.1031519529150806E+00 -1.1022010982730306E+00 -1.1012500912506678E+00 -1.1002989319117926E+00 -1.0993476203201544E+00 +-1.0983961565394516E+00 -1.0974445406333295E+00 -1.0964927726653839E+00 -1.0955408526991579E+00 -1.0945887807981445E+00 +-1.0936365570257840E+00 -1.0926841814454666E+00 -1.0917316541205311E+00 -1.0907789751142651E+00 -1.0898261444899053E+00 +-1.0888731623106369E+00 -1.0879200286395927E+00 -1.0869667435398611E+00 -1.0860133070744731E+00 -1.0850597193064100E+00 +-1.0841059802986037E+00 -1.0831520901139358E+00 -1.0821980488152354E+00 -1.0812438564652822E+00 -1.0802895131268058E+00 +-1.0793350188624844E+00 -1.0783803737349467E+00 -1.0774255778067696E+00 -1.0764706311404817E+00 -1.0755155337985591E+00 +-1.0745602858434296E+00 -1.0736048873374695E+00 -1.0726493383430058E+00 -1.0716936389223153E+00 -1.0707377891376237E+00 +-1.0697817890511092E+00 -1.0688256387248973E+00 -1.0678693382210649E+00 -1.0669128876016396E+00 -1.0659562869285983E+00 +-1.0649995362638662E+00 -1.0640426356693262E+00 -1.0630855852068037E+00 -1.0621283849380780E+00 -1.0611710349248777E+00 +-1.0602135352288828E+00 -1.0592558859117238E+00 -1.0582980870349812E+00 -1.0573401386601864E+00 -1.0563820408488225E+00 +-1.0554237936623216E+00 -1.0544653971620686E+00 -1.0535068514093977E+00 -1.0525481564655950E+00 -1.0515893123918967E+00 +-1.0506303192494908E+00 -1.0496711770995160E+00 -1.0487118860030624E+00 -1.0477524460211707E+00 -1.0467928572148337E+00 +-1.0458331196449946E+00 -1.0448732333725488E+00 -1.0439131984583416E+00 -1.0429530149631687E+00 -1.0419926829477846E+00 +-1.0410322024728864E+00 -1.0400715735991273E+00 -1.0391107963871105E+00 -1.0381498708973917E+00 -1.0371887971904779E+00 +-1.0362275753268284E+00 -1.0352662053668533E+00 -1.0343046873709154E+00 -1.0333430213993291E+00 -1.0323812075123606E+00 +-1.0314192457702291E+00 -1.0304571362331039E+00 -1.0294948789611078E+00 -1.0285324740143160E+00 -1.0275699214527552E+00 +-1.0266072213364037E+00 -1.0256443737251935E+00 -1.0246813786790079E+00 -1.0237182362576829E+00 -1.0227549465210073E+00 +-1.0217915095287220E+00 -1.0208279253405199E+00 -1.0198641940160449E+00 -1.0189003156149004E+00 -1.0179362901966347E+00 +-1.0169721178207529E+00 -1.0160077985467104E+00 -1.0150433324339174E+00 -1.0140787195417365E+00 -1.0131139599294818E+00 +-1.0121490536564226E+00 -1.0111840007817796E+00 -1.0102188013647266E+00 -1.0092534554643915E+00 -1.0082879631398540E+00 +-1.0073223244501479E+00 -1.0063565394542602E+00 -1.0053906082111306E+00 -1.0044245307796527E+00 -1.0034583072186725E+00 +-1.0024919375869912E+00 -1.0015254219433607E+00 -1.0005587603464894E+00 -9.9959195285503732E-01 -9.9862499952761863E-01 +-9.9765790042280089E-01 -9.9669065559910341E-01 -9.9572326511500620E-01 -9.9475572902893550E-01 -9.9378804739927429E-01 +-9.9282022028435868E-01 -9.9185224774247993E-01 -9.9088412983188168E-01 -9.8991586661076281E-01 -9.8894745813727603E-01 +-9.8797890446952752E-01 -9.8701020566557784E-01 -9.8604136178344248E-01 -9.8507237288108995E-01 -9.8410323901644381E-01 +-9.8313396024738187E-01 -9.8216453663173575E-01 -9.8119496822729257E-01 -9.8022525509179248E-01 -9.7925539728293143E-01 +-9.7828539485835897E-01 -9.7731524787568003E-01 -9.7634495639245322E-01 -9.7537452046619244E-01 -9.7440394015436382E-01 +-9.7343321551439566E-01 -9.7246234660366326E-01 -9.7149133347949979E-01 -9.7052017619919317E-01 -9.6954887481998608E-01 +-9.6857742939907598E-01 -9.6760583999361605E-01 -9.6663410666071370E-01 -9.6566222945743185E-01 -9.6469020844078912E-01 +-9.6371804366775837E-01 -9.6274573519526818E-01 -9.6177328308020282E-01 -9.6080068737940105E-01 -9.5982794814965744E-01 +-9.5885506544772181E-01 -9.5788203933030014E-01 -9.5690886985405310E-01 -9.5593555707559719E-01 -9.5496210105150436E-01 +-9.5398850183830286E-01 -9.5301475949247527E-01 -9.5204087407046178E-01 -9.5106684562865385E-01 -9.5009267422340771E-01 +-9.4911835991102744E-01 -9.4814390274777560E-01 -9.4716930278987044E-01 -9.4619456009348635E-01 -9.4521967471475410E-01 +-9.4424464670975994E-01 -9.4326947613454670E-01 -9.4229416304511304E-01 -9.4131870749741409E-01 -9.4034310954736089E-01 +-9.3936736925082132E-01 -9.3839148666361860E-01 -9.3741546184153379E-01 -9.3643929484030319E-01 -9.3546298571561970E-01 +-9.3448653452313335E-01 -9.3350994131845000E-01 -9.3253320615713242E-01 -9.3155632909470021E-01 -9.3057931018662865E-01 +-9.2960214948835140E-01 -9.2862484705525528E-01 -9.2764740294269132E-01 -9.2666981720596042E-01 -9.2569208990032248E-01 +-9.2471422108099421E-01 -9.2373621080314960E-01 -9.2275805912191977E-01 -9.2177976609239276E-01 -9.2080133176961310E-01 +-9.1982275620858367E-01 -9.1884403946426330E-01 -9.1786518159156893E-01 -9.1688618264537392E-01 -9.1590704268050993E-01 +-9.1492776175176505E-01 -9.1394833991388535E-01 -9.1296877722157388E-01 -9.1198907372949167E-01 -9.1100922949225649E-01 +-9.1002924456444456E-01 -9.0904911900058938E-01 -9.0806885285518169E-01 -9.0708844618266993E-01 -9.0610789903746070E-01 +-9.0512721147391606E-01 -9.0414638354636212E-01 -9.0316541530907690E-01 -9.0218430681629758E-01 -9.0120305812221990E-01 +-9.0022166928099756E-01 -8.9924014034674160E-01 -8.9825847137352199E-01 -8.9727666241536619E-01 -8.9629471352625989E-01 +-8.9531262476014728E-01 -8.9433039617093024E-01 -8.9334802781246891E-01 -8.9236551973858280E-01 -8.9138287200304767E-01 +-8.9040008465959986E-01 -8.8941715776193231E-01 -8.8843409136369778E-01 -8.8745088551850648E-01 -8.8646754027992825E-01 +-8.8548405570149014E-01 -8.8450043183667870E-01 -8.8351666873893908E-01 -8.8253276646167467E-01 -8.8154872505824577E-01 +-8.8056454458197808E-01 -8.7958022508614919E-01 -8.7859576662399830E-01 -8.7761116924872262E-01 -8.7662643301347887E-01 +-8.7564155797138288E-01 -8.7465654417550898E-01 -8.7367139167889074E-01 -8.7268610053452100E-01 -8.7170067079535118E-01 +-8.7071510251429296E-01 -8.6972939574421615E-01 -8.6874355053795038E-01 -8.6775756694828377E-01 -8.6677144502796466E-01 +-8.6578518482970057E-01 -8.6479878640615804E-01 -8.6381224980996352E-01 -8.6282557509370261E-01 -8.6183876230992007E-01 +-8.6085181151112100E-01 -8.5986472274976944E-01 -8.5887749607828745E-01 -8.5789013154906324E-01 -8.5690262921443761E-01 +-8.5591498912671360E-01 -8.5492721133815419E-01 -8.5393929590098183E-01 -8.5295124286737944E-01 -8.5196305228948921E-01 +-8.5097472421941323E-01 -8.4998625870921440E-01 -8.4899765581091491E-01 -8.4800891557649716E-01 -8.4702003805790360E-01 +-8.4603102330703683E-01 -8.4504187137575959E-01 -8.4405258231589508E-01 -8.4306315617922667E-01 -8.4207359301749785E-01 +-8.4108389288241225E-01 -8.4009405582563446E-01 -8.3910408189878860E-01 -8.3811397115345998E-01 -8.3712372364119436E-01 +-8.3613333941349732E-01 -8.3514281852183359E-01 -8.3415216101763479E-01 -8.3316136695228626E-01 -8.3217043637713672E-01 +-8.3117936934349546E-01 -8.3018816590263200E-01 -8.2919682610577705E-01 -8.2820535000412210E-01 -8.2721373764881967E-01 +-8.2622198909098266E-01 -8.2523010438168609E-01 -8.2423808357196393E-01 -8.2324592671281294E-01 -8.2225363385519024E-01 +-8.2126120505001354E-01 -8.2026864034816271E-01 -8.1927593980047819E-01 -8.1828310345776145E-01 -8.1729013137077533E-01 +-8.1629702359024403E-01 -8.1530378016685312E-01 -8.1431040115124909E-01 -8.1331688659404044E-01 -8.1232323654579663E-01 +-8.1132945105704590E-01 -8.1033553017828597E-01 -8.0934147395996781E-01 -8.0834728245250786E-01 -8.0735295570628240E-01 +-8.0635849377163060E-01 -8.0536389669885311E-01 -8.0436916453821161E-01 -8.0337429733992960E-01 -8.0237929515419393E-01 +-8.0138415803115060E-01 -8.0038888602090985E-01 -7.9939347917354264E-01 -7.9839793753908184E-01 -7.9740226116752266E-01 +-7.9640645010882216E-01 -7.9541050441289907E-01 -7.9441442412963470E-01 -7.9341820930887241E-01 -7.9242186000041737E-01 +-7.9142537625403708E-01 -7.9042875811946123E-01 -7.8943200564638194E-01 -7.8843511888445095E-01 -7.8743809788328956E-01 +-7.8644094269247411E-01 -7.8544365336154631E-01 -7.8444622994000934E-01 -7.8344867247732974E-01 -7.8245098102293620E-01 +-7.8145315562621975E-01 -7.8045519633653393E-01 -7.7945710320319550E-01 -7.7845887627548327E-01 -7.7746051560263840E-01 +-7.7646202123386587E-01 -7.7546339321833246E-01 -7.7446463160516832E-01 -7.7346573644346583E-01 -7.7246670778228066E-01 +-7.7146754567063103E-01 -7.7046825015749842E-01 -7.6946882129182692E-01 -7.6846925912252395E-01 -7.6746956369845964E-01 +-7.6646973506846761E-01 -7.6546977328134358E-01 -7.6446967838584545E-01 -7.6346945043070069E-01 -7.6246908946459224E-01 +-7.6146859553616952E-01 -7.6046796869404487E-01 -7.5946720898679410E-01 -7.5846631646295604E-01 -7.5746529117103334E-01 +-7.5646413315949157E-01 -7.5546284247675999E-01 -7.5446141917123155E-01 -7.5345986329126202E-01 -7.5245817488517130E-01 +-7.5145635400124300E-01 -7.5045440068772384E-01 -7.4945231499282416E-01 -7.4845009696471876E-01 -7.4744774665154501E-01 +-7.4644526410140521E-01 -7.4544264936236448E-01 -7.4443990248245229E-01 -7.4343702350966123E-01 -7.4243401249194940E-01 +-7.4143086947723691E-01 -7.4042759451340623E-01 -7.3942418764831186E-01 -7.3842064892976345E-01 -7.3741697840553855E-01 +-7.3641317612337787E-01 -7.3540924213098646E-01 -7.3440517647603420E-01 -7.3340097920615421E-01 -7.3239665036894408E-01 +-7.3139219001196587E-01 -7.3038759818274590E-01 -7.2938287492877485E-01 -7.2837802029750764E-01 -7.2737303433636380E-01 +-7.2636791709272674E-01 -7.2536266861394449E-01 -7.2435728894733009E-01 -7.2335177814016105E-01 -7.2234613623967836E-01 +-7.2134036329308904E-01 -7.2033445934756357E-01 -7.1932842445023804E-01 -7.1832225864821275E-01 -7.1731596198854986E-01 +-7.1630953451828439E-01 -7.1530297628440842E-01 -7.1429628733388129E-01 -7.1328946771362722E-01 -7.1228251747053561E-01 +-7.1127543665146020E-01 -7.1026822530322009E-01 -7.0926088347259963E-01 -7.0825341120634722E-01 -7.0724580855117714E-01 +-7.0623807555376883E-01 -7.0523021226076610E-01 -7.0422221871877855E-01 -7.0321409497438059E-01 -7.0220584107411232E-01 +-7.0119745706447889E-01 -7.0018894299195034E-01 -6.9918029890296196E-01 -6.9817152484391509E-01 -6.9716262086117597E-01 +-6.9615358700107666E-01 -6.9514442330991388E-01 -6.9413512983395043E-01 -6.9312570661941220E-01 -6.9211615371249757E-01 +-6.9110647115936352E-01 -6.9009665900613459E-01 -6.8908671729890136E-01 -6.8807664608372021E-01 -6.8706644540661288E-01 +-6.8605611531356714E-01 -6.8504565585053567E-01 -6.8403506706343831E-01 -6.8302434899815967E-01 -6.8201350170055042E-01 +-6.8100252521642746E-01 -6.7999141959157350E-01 -6.7898018487173695E-01 -6.7796882110263201E-01 -6.7695732832993982E-01 +-6.7594570659930664E-01 -6.7493395595634509E-01 -6.7392207644663404E-01 -6.7291006811571852E-01 -6.7189793100910933E-01 +-6.7088566517228410E-01 -6.6987327065068614E-01 -6.6886074748972257E-01 -6.6784809573477488E-01 -6.6683531543118268E-01 +-6.6582240662425485E-01 -6.6480936935926649E-01 -6.6379620368145886E-01 -6.6278290963604070E-01 -6.6176948726818607E-01 +-6.6075593662303600E-01 -6.5974225774569806E-01 -6.5872845068124641E-01 -6.5771451547472204E-01 -6.5670045217113215E-01 +-6.5568626081545056E-01 -6.5467194145261842E-01 -6.5365749412754282E-01 -6.5264291888509862E-01 -6.5162821577012620E-01 +-6.5061338482743369E-01 -6.4959842610179597E-01 -6.4858333963795423E-01 -6.4756812548061760E-01 -6.4655278367446090E-01 +-6.4553731426412453E-01 -6.4452171729422270E-01 -6.4350599280932930E-01 -6.4249014085398815E-01 -6.4147416147270986E-01 +-6.4045805470997186E-01 -6.3944182061021970E-01 -6.3842545921786464E-01 -6.3740897057728674E-01 -6.3639235473283229E-01 +-6.3537561172881529E-01 -6.3435874160951677E-01 -6.3334174441918534E-01 -6.3232462020203684E-01 -6.3130736900225459E-01 +-6.3028999086398918E-01 -6.2927248583135897E-01 -6.2825485394844960E-01 -6.2723709525931404E-01 -6.2621920980797341E-01 +-6.2520119763841553E-01 -6.2418305879459668E-01 -6.2316479332044017E-01 -6.2214640125983756E-01 -6.2112788265664520E-01 +-6.2010923755469449E-01 -6.1909046599777751E-01 -6.1807156802965646E-01 -6.1705254369406137E-01 -6.1603339303468996E-01 +-6.1501411609520817E-01 -6.1399471291924967E-01 -6.1297518355041569E-01 -6.1195552803227637E-01 -6.1093574640836867E-01 +-6.0991583872219857E-01 -6.0889580501723939E-01 -6.0787564533693317E-01 -6.0685535972468951E-01 -6.0583494822388617E-01 +-6.0481441087786969E-01 -6.0379374772995431E-01 -6.0277295882342208E-01 -6.0175204420152451E-01 -6.0073100390748024E-01 +-5.9970983798447686E-01 -5.9868854647567005E-01 -5.9766712942418154E-01 -5.9664558687310898E-01 -5.9562391886551047E-01 +-5.9460212544441560E-01 -5.9358020665282252E-01 -5.9255816253369731E-01 -5.9153599312997518E-01 -5.9051369848455948E-01 +-5.8949127864032280E-01 -5.8846873364010532E-01 -5.8744606352671691E-01 -5.8642326834293568E-01 -5.8540034813150854E-01 +-5.8437730293515078E-01 -5.8335413279654724E-01 -5.8233083775835082E-01 -5.8130741786318352E-01 -5.8028387315363639E-01 +-5.7926020367226916E-01 -5.7823640946161059E-01 -5.7721249056415813E-01 -5.7618844702237881E-01 -5.7516427887870780E-01 +-5.7413998617555007E-01 -5.7311556895527649E-01 -5.7209102726023531E-01 -5.7106636113273568E-01 -5.7004157061505867E-01 +-5.6901665574945459E-01 -5.6799161657814290E-01 -5.6696645314331218E-01 -5.6594116548712048E-01 -5.6491575365169489E-01 +-5.6389021767913217E-01 -5.6286455761149790E-01 -5.6183877349082745E-01 -5.6081286535912533E-01 -5.5978683325836576E-01 +-5.5876067723049239E-01 -5.5773439731741792E-01 -5.5670799356102485E-01 -5.5568146600316548E-01 -5.5465481468566102E-01 +-5.5362803965030316E-01 -5.5260114093885226E-01 -5.5157411859303906E-01 -5.5054697265456343E-01 -5.4951970316509546E-01 +-5.4849231016627198E-01 -5.4746479369970757E-01 -5.4643715380697866E-01 -5.4540939052963400E-01 -5.4438150390919260E-01 +-5.4335349398714283E-01 -5.4232536080494376E-01 -5.4129710440402323E-01 -5.4026872482577970E-01 -5.3924022211158162E-01 +-5.3821159630276727E-01 -5.3718284744064537E-01 -5.3615397556649402E-01 -5.3512498072156178E-01 -5.3409586294706723E-01 +-5.3306662228419932E-01 -5.3203725877411701E-01 -5.3100777245794917E-01 -5.2997816337679549E-01 -5.2894843157172533E-01 +-5.2791857708377854E-01 -5.2688859995396542E-01 -5.2585850022326641E-01 -5.2482827793262987E-01 -5.2379793312298206E-01 +-5.2276746583521205E-01 -5.2173687611018194E-01 -5.2070616398872405E-01 -5.1967532951164175E-01 -5.1864437271970854E-01 +-5.1761329365366826E-01 -5.1658209235423591E-01 -5.1555076886209605E-01 -5.1451932321790517E-01 -5.1348775546228975E-01 +-5.1245606563584645E-01 -5.1142425377914358E-01 -5.1039231993271961E-01 -5.0936026413708402E-01 -5.0832808643271676E-01 +-5.0729578686006882E-01 -5.0626336545956208E-01 -5.0523082227158900E-01 -5.0419815733651308E-01 -5.0316537069466893E-01 +-5.0213246238636178E-01 -5.0109943245186794E-01 -5.0006628093143224E-01 -4.9903300786527810E-01 -4.9799961329359210E-01 +-4.9696609725653496E-01 -4.9593245979423822E-01 -4.9489870094680438E-01 -4.9386482075430693E-01 -4.9283081925679145E-01 +-4.9179669649427366E-01 -4.9076245250674116E-01 -4.8972808733415257E-01 -4.8869360101643761E-01 -4.8765899359349768E-01 +-4.8662426510520512E-01 -4.8558941559140401E-01 -4.8455444509190959E-01 -4.8351935364650833E-01 -4.8248414129495848E-01 +-4.8144880807698937E-01 -4.8041335403230256E-01 -4.7937777920056990E-01 -4.7834208362143593E-01 -4.7730626733451620E-01 +-4.7627033037939781E-01 -4.7523427279563701E-01 -4.7419809462276930E-01 -4.7316179590029439E-01 -4.7212537666768600E-01 +-4.7108883696438952E-01 -4.7005217682982231E-01 -4.6901539630337347E-01 -4.6797849542440351E-01 -4.6694147423224514E-01 +-4.6590433276620280E-01 -4.6486707106555286E-01 -4.6382968916954326E-01 -4.6279218711739434E-01 -4.6175456494829809E-01 +-4.6071682270141834E-01 -4.5967896041589101E-01 -4.5864097813082427E-01 -4.5760287588529813E-01 -4.5656465371836447E-01 +-4.5552631166904772E-01 -4.5448784977634393E-01 -4.5344926807922176E-01 -4.5241056661662155E-01 -4.5137174542745367E-01 +-4.5033280455060809E-01 -4.4929374402493943E-01 -4.4825456388927742E-01 -4.4721526418242336E-01 -4.4617584494315182E-01 +-4.4513630621020894E-01 -4.4409664802231352E-01 -4.4305687041815667E-01 -4.4201697343640201E-01 -4.4097695711568546E-01 +-4.3993682149461544E-01 -4.3889656661177306E-01 -4.3785619250571162E-01 -4.3681569921495705E-01 -4.3577508677800803E-01 +-4.3473435523333542E-01 -4.3369350461938316E-01 -4.3265253497456752E-01 -4.3161144633727749E-01 -4.3057023874587458E-01 +-4.2952891223869333E-01 -4.2848746685404093E-01 -4.2744590263019699E-01 -4.2640421960541175E-01 -4.2536241781791578E-01 +-4.2432049730590471E-01 -4.2327845810754949E-01 -4.2223630026099429E-01 -4.2119402380435583E-01 -4.2015162877572393E-01 +-4.1910911521316135E-01 -4.1806648315470368E-01 -4.1702373263835990E-01 -4.1598086370211124E-01 -4.1493787638391294E-01 +-4.1389477072169256E-01 -4.1285154675335095E-01 -4.1180820451676203E-01 -4.1076474404977326E-01 -4.0972116539020470E-01 +-4.0867746857584997E-01 -4.0763365364447562E-01 -4.0658972063382154E-01 -4.0554566958160099E-01 -4.0450150052550055E-01 +-4.0345721350317976E-01 -4.0241280855227168E-01 -4.0136828571038036E-01 -4.0032364501509071E-01 -3.9927888650395321E-01 +-3.9823401021449450E-01 -3.9718901618421459E-01 -3.9614390445058739E-01 -3.9509867505105939E-01 -3.9405332802305143E-01 +-3.9300786340395738E-01 -3.9196228123114502E-01 -3.9091658154195547E-01 -3.8987076437370355E-01 -3.8882482976367783E-01 +-3.8777877774914027E-01 -3.8673260836732676E-01 -3.8568632165544653E-01 -3.8463991765068301E-01 -3.8359339639019308E-01 +-3.8254675791110737E-01 -3.8150000225053043E-01 -3.8045312944554066E-01 -3.7940613953319019E-01 -3.7835903255050501E-01 +-3.7731180853448260E-01 -3.7626446752210158E-01 -3.7521700955030746E-01 -3.7416943465602170E-01 -3.7312174287614003E-01 +-3.7207393424753227E-01 -3.7102600880704184E-01 -3.6997796659148691E-01 -3.6892980763765898E-01 -3.6788153198232393E-01 +-3.6683313966222197E-01 -3.6578463071406708E-01 -3.6473600517454763E-01 -3.6368726308032623E-01 -3.6263840446803941E-01 +-3.6158942937429828E-01 -3.6054033783568790E-01 -3.5949112988876780E-01 -3.5844180557007149E-01 -3.5739236491610737E-01 +-3.5634280796335760E-01 -3.5529313474827912E-01 -3.5424334530730289E-01 -3.5319343967683475E-01 -3.5214341789325199E-01 +-3.5109327999291412E-01 -3.5004302601214760E-01 -3.4899265598725576E-01 -3.4794216995451666E-01 -3.4689156795018261E-01 +-3.4584085001048082E-01 -3.4479001617161303E-01 -3.4373906646975516E-01 -3.4268800094105833E-01 -3.4163681962164805E-01 +-3.4058552254762453E-01 -3.3953410975506260E-01 -3.3848258128001191E-01 -3.3743093715849698E-01 -3.3637917742651674E-01 +-3.3532730212004530E-01 -3.3427531127503113E-01 -3.3322320492739815E-01 -3.3217098311304455E-01 -3.3111864586784356E-01 +-3.3006619322764363E-01 -3.2901362522826777E-01 -3.2796094190551384E-01 -3.2690814329515250E-01 -3.2585522943293682E-01 +-3.2480220035458718E-01 -3.2374905609580173E-01 -3.2269579669225357E-01 -3.2164242217959066E-01 -3.2058893259343635E-01 +-3.1953532796938916E-01 -3.1848160834302242E-01 -3.1742777374988485E-01 -3.1637382422550026E-01 -3.1531975980536775E-01 +-3.1426558052496151E-01 -3.1321128641973123E-01 -3.1215687752510146E-01 -3.1110235387647245E-01 -3.1004771550921956E-01 +-3.0899296245869340E-01 -3.0793809476022010E-01 -3.0688311244910116E-01 -3.0582801556061334E-01 -3.0477280413000896E-01 +-3.0371747819251566E-01 -3.0266203778333417E-01 -3.0160648293764802E-01 -3.0055081369060899E-01 -2.9949503007734657E-01 +-2.9843913213296619E-01 -2.9738311989254845E-01 -2.9632699339114982E-01 -2.9527075266380226E-01 -2.9421439774551333E-01 +-2.9315792867126633E-01 -2.9210134547602018E-01 -2.9104464819470954E-01 -2.8998783686224472E-01 -2.8893091151351186E-01 +-2.8787387218337274E-01 -2.8681671890666499E-01 -2.8575945171820205E-01 -2.8470207065277314E-01 -2.8364457574514323E-01 +-2.8258696703005348E-01 -2.8152924454222067E-01 -2.8047140831633732E-01 -2.7941345838707238E-01 -2.7835539478907018E-01 +-2.7729721755694892E-01 -2.7623892672531031E-01 -2.7518052232872414E-01 -2.7412200440173917E-01 -2.7306337297887995E-01 +-2.7200462809464726E-01 -2.7094576978351803E-01 -2.6988679807994492E-01 -2.6882771301835712E-01 -2.6776851463315998E-01 +-2.6670920295873457E-01 -2.6564977802943884E-01 -2.6459023987960623E-01 -2.6353058854354694E-01 -2.6247082405554734E-01 +-2.6141094644986984E-01 -2.6035095576075346E-01 -2.5929085202241314E-01 -2.5823063526904072E-01 -2.5717030553480386E-01 +-2.5610986285384690E-01 -2.5504930726029046E-01 -2.5398863878823164E-01 -2.5292785747174140E-01 -2.5186696334487491E-01 +-2.5080595644165593E-01 -2.4974483679608753E-01 -2.4868360444214924E-01 -2.4762225941379692E-01 -2.4656080174496342E-01 +-2.4549923146955765E-01 -2.4443754862146561E-01 -2.4337575323454957E-01 -2.4231384534264863E-01 -2.4125182497957848E-01 +-2.4018969217913158E-01 -2.3912744697507696E-01 -2.3806508940116042E-01 -2.3700261949110457E-01 -2.3594003727860882E-01 +-2.3487734279734912E-01 -2.3381453608097855E-01 -2.3275161716312667E-01 -2.3168858607740025E-01 -2.3062544285738268E-01 +-2.2956218753663429E-01 -2.2849882014869230E-01 -2.2743534072706836E-01 -2.2637174930525863E-01 -2.2530804591672857E-01 +-2.2424423059492338E-01 -2.2318030337326503E-01 -2.2211626428515255E-01 -2.2105211336396216E-01 -2.1998785064304696E-01 +-2.1892347615573732E-01 -2.1785898993534045E-01 -2.1679439201514089E-01 -2.1572968242840040E-01 -2.1466486120835762E-01 +-2.1359992838822850E-01 -2.1253488400120629E-01 -2.1146972808046141E-01 -2.1040446065914131E-01 -2.0933908177037100E-01 +-2.0827359144725260E-01 -2.0720798972286555E-01 -2.0614227663026669E-01 -2.0507645220249007E-01 -2.0401051647254714E-01 +-2.0294446947342687E-01 -2.0187831123809277E-01 -2.0081204179949369E-01 -1.9974566119054801E-01 -1.9867916944415445E-01 +-1.9761256659318896E-01 -1.9654585267050498E-01 -1.9547902770893347E-01 -1.9441209174128310E-01 -1.9334504480033987E-01 +-1.9227788691886744E-01 -1.9121061812960705E-01 -1.9014323846527753E-01 -1.8907574795857535E-01 -1.8800814664217455E-01 +-1.8694043454872705E-01 -1.8587261171086222E-01 -1.8480467816118720E-01 -1.8373663393228695E-01 -1.8266847905672404E-01 +-1.8160021356703879E-01 -1.8053183749574941E-01 -1.7946335087535190E-01 -1.7839475373831992E-01 -1.7732604611710265E-01 +-1.7625722804413449E-01 -1.7518829955182028E-01 -1.7411926067254532E-01 -1.7305011143867263E-01 -1.7198085188254331E-01 +-1.7091148203647638E-01 -1.6984200193276877E-01 -1.6877241160369547E-01 -1.6770271108150939E-01 -1.6663290039844161E-01 +-1.6556297958670102E-01 -1.6449294867847483E-01 -1.6342280770592810E-01 -1.6235255670120419E-01 -1.6128219569642438E-01 +-1.6021172472368825E-01 -1.5914114381507341E-01 -1.5807045300263572E-01 -1.5699965231840923E-01 -1.5592874179440619E-01 +-1.5485772146261698E-01 -1.5378659135501035E-01 -1.5271535150353330E-01 -1.5164400194010855E-01 -1.5057254269664466E-01 +-1.4950097380502098E-01 -1.4842929529709784E-01 -1.4735750720471372E-01 -1.4628560955968559E-01 -1.4521360239380876E-01 +-1.4414148573885699E-01 -1.4306925962658254E-01 -1.4199692408871592E-01 -1.4092447915696626E-01 -1.3985192486302123E-01 +-1.3877926123854684E-01 -1.3770648831518770E-01 -1.3663360612456699E-01 -1.3556061469828637E-01 -1.3448751406792614E-01 +-1.3341430426504519E-01 -1.3234098532118097E-01 -1.3126755726784964E-01 -1.3019402013654593E-01 -1.2912037395874326E-01 +-1.2804661876589377E-01 -1.2697275458942830E-01 -1.2589878146075389E-01 -1.2482469941126380E-01 -1.2375050847232251E-01 +-1.2267620867527589E-01 -1.2160180005144852E-01 -1.2052728263214384E-01 -1.1945265644864407E-01 -1.1837792153221033E-01 +-1.1730307791408252E-01 -1.1622812562547948E-01 -1.1515306469759894E-01 -1.1407789516161759E-01 -1.1300261704869098E-01 +-1.1192723038995368E-01 -1.1085173521651916E-01 -1.0977613155947995E-01 -1.0870041944990758E-01 -1.0762459891885250E-01 +-1.0654866999734434E-01 -1.0547263271639173E-01 -1.0439648710698234E-01 -1.0332023320008303E-01 -1.0224387102663970E-01 +-1.0116740061757484E-01 -1.0009082200379772E-01 -9.9014135216189167E-02 -9.7937340285611699E-02 -9.6860437242907133E-02 +-9.5783426118896328E-02 -9.4706306944379537E-02 -9.3629079750136235E-02 -9.2551744566925109E-02 -9.1474301425484170E-02 +-9.0396750356530692E-02 -8.9319091390761385E-02 -8.8241324558852169E-02 -8.7163449891458397E-02 -8.6085467419214773E-02 +-8.5007377172735391E-02 -8.3929179182613750E-02 -8.2850873479422826E-02 -8.1772460093714985E-02 -8.0693939056022054E-02 +-7.9615310396855349E-02 -7.8536574146705673E-02 -7.7457730336043404E-02 -7.6378778995318350E-02 -7.5299720154957436E-02 +-7.4220553845374668E-02 -7.3141280096956057E-02 -7.2061898940069730E-02 -7.0982410405063562E-02 -6.9902814522264836E-02 +-6.8823111321980684E-02 -6.7743300834497741E-02 -6.6663383090082476E-02 -6.5583358118980986E-02 -6.4503225951419108E-02 +-6.3422986617602345E-02 -6.2342640147716073E-02 -6.1262186571925323E-02 -6.0181625920374952E-02 -5.9100958223189691E-02 +-5.8020183510473951E-02 -5.6939301812312139E-02 -5.5858313158768373E-02 -5.4777217579886739E-02 -5.3696015105691143E-02 +-5.2614705766185474E-02 -5.1533289591353441E-02 -5.0451766611158792E-02 -4.9370136855542646E-02 -4.8288400354433665E-02 +-4.7206557137732953E-02 -4.6124607235324140E-02 -4.5042550677070851E-02 -4.3960387492816770E-02 -4.2878117712385658E-02 +-4.1795741365581285E-02 -4.0713258482187577E-02 -3.9630669091968544E-02 -3.8547973224668269E-02 -3.7465170910011066E-02 +-3.6382262177701311E-02 -3.5299247057423599E-02 -3.4216125578842724E-02 -3.3132897771603650E-02 -3.2049563665331585E-02 +-3.0966123289631966E-02 -2.9882576674090489E-02 -2.8798923848273105E-02 -2.7715164841726078E-02 -2.6631299683975953E-02 +-2.5547328404529612E-02 -2.4463251032871745E-02 -2.3379067598474933E-02 -2.2294778130784596E-02 -2.1210382659229057E-02 +-2.0125881213217019E-02 -1.9041273822137626E-02 -1.7956560515360449E-02 -1.6871741322235494E-02 -1.5786816272093256E-02 +-1.4701785394244705E-02 -1.3616648717981301E-02 -1.2531406272575030E-02 -1.1446058087278409E-02 -1.0360604191324488E-02 +-9.2750446139269072E-03 -8.1893793842798615E-03 -7.1036085315581577E-03 -6.0177320849172091E-03 -4.9317500734930558E-03 +-3.8456625264023862E-03 -2.7594694727425457E-03 -1.6731709415915602E-03 -5.8676696200814454E-04 4.9974243696827608E-04 + 1.5863572263200669E-03 2.6730773770413086E-03 3.7599028601528681E-03 4.8468336466923273E-03 5.9338697077164779E-03 + 7.0210110143013081E-03 8.1082575375419873E-03 9.1956092485528419E-03 1.0283066118467354E-02 1.1370628118438132E-02 + 1.2458295219636911E-02 1.3546067393254512E-02 1.4633944610500849E-02 1.5721926842604903E-02 1.6810014060814706E-02 + 1.7898206236397329E-02 1.8986503340638873E-02 2.0074905344844424E-02 2.1163412220338077E-02 2.2252023938462897E-02 + 2.3340740470580899E-02 2.4429561788073054E-02 2.5518487862339241E-02 2.6607518664798276E-02 2.7696654166890367E-02 + 2.8785894340067064E-02 2.9875239155806314E-02 3.0964688585602442E-02 3.2054242600968536E-02 3.3143901173436567E-02 + 3.4233664274557270E-02 3.5323531875900191E-02 3.6413503949053627E-02 3.7503580465624631E-02 3.8593761397239017E-02 + 3.9684046715541307E-02 4.0774436392194760E-02 4.1864930398881277E-02 4.2955528707301460E-02 4.4046231289174620E-02 + 4.5137038116238655E-02 4.6227949160250137E-02 4.7318964392984199E-02 4.8410083786234660E-02 4.9501307311813847E-02 + 5.0592634941552694E-02 5.1684066647300714E-02 5.2775602400928434E-02 5.3867242174317369E-02 5.4958985939375100E-02 + 5.6050833668025185E-02 5.7142785332209678E-02 5.8234840903889050E-02 5.9327000355042292E-02 6.0419263657666769E-02 + 6.1511630783778283E-02 6.2604101705411044E-02 6.3696676394617679E-02 6.4789354823469147E-02 6.5882136964054719E-02 + 6.6975022788482164E-02 6.8068012268877418E-02 6.9161105377384818E-02 7.0254302086166981E-02 7.1347602367404811E-02 + 7.2441006193297464E-02 7.3534513536062357E-02 7.4628124367935131E-02 7.5721838661169730E-02 7.6815656388038167E-02 + 7.7909577520830761E-02 7.9003602031858494E-02 8.0097729893442965E-02 8.1191961077931432E-02 8.2286295557686823E-02 + 8.3380733305090174E-02 8.4475274292540592E-02 8.5569918492455280E-02 8.6664665877269606E-02 8.7759516419436898E-02 + 8.8854470091428522E-02 8.9949526865733931E-02 9.1044686714860545E-02 9.2139949611333857E-02 9.3235315527697232E-02 + 9.4330784436512174E-02 9.5426356310357938E-02 9.6522031121831872E-02 9.7617808843549245E-02 9.8713689448143113E-02 + 9.9809672908264563E-02 1.0090575919658254E-01 1.0200194828578379E-01 1.0309824014857297E-01 1.0419463475767514E-01 + 1.0529113208582545E-01 1.0638773210578466E-01 1.0748443479032863E-01 1.0858124011225104E-01 1.0967814804436340E-01 + 1.1077515855949489E-01 1.1187227163049249E-01 1.1296948723022086E-01 1.1406680533156238E-01 1.1516422590741716E-01 + 1.1626174893070292E-01 1.1735937437435510E-01 1.1845710221132681E-01 1.1955493241458873E-01 1.2065286495712918E-01 + 1.2175089981195414E-01 1.2284903695208711E-01 1.2394727635056926E-01 1.2504561798045921E-01 1.2614406181483323E-01 + 1.2724260782678509E-01 1.2834125598942608E-01 1.2944000627588495E-01 1.3053885865931064E-01 1.3163781311286174E-01 + 1.3273686960972206E-01 1.3383602812309031E-01 1.3493528862618259E-01 1.3603465109223242E-01 1.3713411549449081E-01 + 1.3823368180622614E-01 1.3933335000072405E-01 1.4043312005128766E-01 1.4153299193123747E-01 1.4263296561391123E-01 + 1.4373304107266405E-01 1.4483321828086834E-01 1.4593349721191382E-01 1.4703387783920752E-01 1.4813436013617370E-01 + 1.4923494407625376E-01 1.5033562963290661E-01 1.5143641677960820E-01 1.5253730548985170E-01 1.5363829573714752E-01 + 1.5473938749502311E-01 1.5584058073702342E-01 1.5694187543671279E-01 1.5804327156766521E-01 1.5914476910347933E-01 + 1.6024636801776848E-01 1.6134806828416307E-01 1.6244986987631049E-01 1.6355177276787541E-01 1.6465377693253933E-01 + 1.6575588234400096E-01 1.6685808897597598E-01 1.6796039680219699E-01 1.6906280579641378E-01 1.7016531593239306E-01 + 1.7126792718391845E-01 1.7237063952479056E-01 1.7347345292882702E-01 1.7457636736986235E-01 1.7567938282174791E-01 + 1.7678249925835213E-01 1.7788571665356015E-01 1.7898903498127419E-01 1.8009245421541314E-01 1.8119597432991288E-01 + 1.8229959529872869E-01 1.8340331709582486E-01 1.8450713969519036E-01 1.8561106307082822E-01 1.8671508719675833E-01 + 1.8781921204701749E-01 1.8892343759565897E-01 1.9002776381675301E-01 1.9113219068438655E-01 1.9223671817266308E-01 + 1.9334134625570307E-01 1.9444607490764351E-01 1.9555090410263803E-01 1.9665583381485705E-01 1.9776086401848747E-01 + 1.9886599468773303E-01 1.9997122579681401E-01 2.0107655731996721E-01 2.0218198923144609E-01 2.0328752150552082E-01 + 2.0439315411647793E-01 2.0549888703862065E-01 2.0660472024626866E-01 2.0771065371375827E-01 2.0881668741544479E-01 + 2.0992282132569234E-01 2.1102905541888928E-01 2.1213538966943785E-01 2.1324182405175679E-01 2.1434835854028128E-01 + 2.1545499310946278E-01 2.1656172773376942E-01 2.1766856238768553E-01 2.1877549704571206E-01 2.1988253168236616E-01 + 2.2098966627218142E-01 2.2209690078970773E-01 2.2320423520951149E-01 2.2431166950617526E-01 2.2541920365429796E-01 + 2.2652683762849476E-01 2.2763457140339732E-01 2.2874240495365339E-01 2.2985033825392712E-01 2.3095837127889873E-01 + 2.3206650400326487E-01 2.3317473640173839E-01 2.3428306844904820E-01 2.3539150011994200E-01 2.3650003138917636E-01 + 2.3760866223153118E-01 2.3871739262180033E-01 2.3982622253479366E-01 2.4093515194533707E-01 2.4204418082827295E-01 + 2.4315330915845942E-01 2.4426253691077093E-01 2.4537186406009781E-01 2.4648129058134663E-01 2.4759081644943998E-01 + 2.4870044163931646E-01 2.4981016612593082E-01 2.5091998988425351E-01 2.5202991288927157E-01 2.5313993511598742E-01 + 2.5425005653941973E-01 2.5536027713460324E-01 2.5647059687658846E-01 2.5758101574044201E-01 2.5869153370124637E-01 + 2.5980215073409968E-01 2.6091286681411902E-01 2.6202368191642950E-01 2.6313459601617961E-01 2.6424560908853134E-01 + 2.6535672110866243E-01 2.6646793205176661E-01 2.6757924189305315E-01 2.6869065060774761E-01 2.6980215817109077E-01 + 2.7091376455833971E-01 2.7202546974476693E-01 2.7313727370566110E-01 2.7424917641632612E-01 2.7536117785208208E-01 + 2.7647327798826449E-01 2.7758547680022494E-01 2.7869777426333026E-01 2.7981017035296324E-01 2.8092266504452246E-01 + 2.8203525831342185E-01 2.8314795013509142E-01 2.8426074048497629E-01 2.8537362933853760E-01 2.8648661667125203E-01 + 2.8759970245861449E-01 2.8871288667612732E-01 2.8982616929931687E-01 2.9093955030372215E-01 2.9205302966489749E-01 + 2.9316660735841316E-01 2.9428028335985462E-01 2.9539405764482307E-01 2.9650793018893518E-01 2.9762190096782304E-01 + 2.9873596995713425E-01 2.9985013713253200E-01 3.0096440246969475E-01 3.0207876594431654E-01 3.0319322753210670E-01 + 3.0430778720879009E-01 3.0542244495010701E-01 3.0653720073181295E-01 3.0765205452967925E-01 3.0876700631949194E-01 + 3.0988205607705305E-01 3.1099720377817947E-01 3.1211244939870381E-01 3.1322779291447372E-01 3.1434323430135469E-01 + 3.1545877353522028E-01 3.1657441059196650E-01 3.1769014544750229E-01 3.1880597807775185E-01 3.1992190845865454E-01 + 3.2103793656616519E-01 3.2215406237625360E-01 3.2327028586490475E-01 3.2438660700811917E-01 3.2550302578191226E-01 + 3.2661954216231470E-01 3.2773615612537238E-01 3.2885286764714616E-01 3.2996967670371230E-01 3.3108658327116197E-01 + 3.3220358732560157E-01 3.3332068884315275E-01 3.3443788779995187E-01 3.3555518417215069E-01 3.3667257793591587E-01 + 3.3779006906742925E-01 3.3890765754288776E-01 3.4002534333850570E-01 3.4114312643050493E-01 3.4226100679512977E-01 + 3.4337898440863734E-01 3.4449705924729923E-01 3.4561523128740251E-01 3.4673350050524898E-01 3.4785186687715530E-01 + 3.4897033037945335E-01 3.5008889098848961E-01 3.5120754868062576E-01 3.5232630343223836E-01 3.5344515521971837E-01 + 3.5456410401947241E-01 3.5568314980792121E-01 3.5680229256150120E-01 3.5792153225666273E-01 3.5904086886987180E-01 + 3.6016030237760871E-01 3.6127983275636860E-01 3.6239945998266171E-01 3.6351918403301298E-01 3.6463900488396173E-01 + 3.6575892251206260E-01 3.6687893689388718E-01 3.6799904800601424E-01 3.6911925582504512E-01 3.7023956032759298E-01 + 3.7135996149028588E-01 3.7248045928976647E-01 3.7360105370269242E-01 3.7472174470573572E-01 3.7584253227558290E-01 + 3.7696341638893560E-01 3.7808439702250973E-01 3.7920547415303607E-01 3.8032664775725977E-01 3.8144791781194076E-01 + 3.8256928429385328E-01 3.8369074717978668E-01 3.8481230644654457E-01 3.8593396207094482E-01 3.8705571402982042E-01 + 3.8817756230001849E-01 3.8929950685840081E-01 3.9042154768184373E-01 3.9154368474723789E-01 3.9266591803148870E-01 + 3.9378824751151831E-01 3.9491067316425582E-01 3.9603319496665262E-01 3.9715581289567164E-01 3.9827852692829052E-01 + 3.9940133704150121E-01 4.0052424321230995E-01 4.0164724541773761E-01 4.0277034363481934E-01 4.0389353784060461E-01 + 4.0501682801215738E-01 4.0614021412655571E-01 4.0726369616089242E-01 4.0838727409227421E-01 4.0951094789782244E-01 + 4.1063471755467268E-01 4.1175858303997459E-01 4.1288254433089255E-01 4.1400660140460460E-01 4.1513075423830365E-01 + 4.1625500280919658E-01 4.1737934709450447E-01 4.1850378707146269E-01 4.1962832271732364E-01 4.2075295400934543E-01 + 4.2187768092480932E-01 4.2300250344100698E-01 4.2412742153524502E-01 4.2525243518484379E-01 4.2637754436713815E-01 + 4.2750274905947683E-01 4.2862804923922276E-01 4.2975344488375306E-01 4.3087893597045895E-01 4.3200452247674548E-01 + 4.3313020438003214E-01 4.3425598165775237E-01 4.3538185428735365E-01 4.3650782224629742E-01 4.3763388551205956E-01 + 4.3876004406212943E-01 4.3988629787401068E-01 4.4101264692522102E-01 4.4213909119329220E-01 4.4326563065576968E-01 + 4.4439226529021325E-01 4.4551899507419640E-01 4.4664581998530917E-01 4.4777274000114792E-01 4.4889975509933072E-01 + 4.5002686525748686E-01 4.5115407045325956E-01 4.5228137066430585E-01 4.5340876586829709E-01 4.5453625604291792E-01 + 4.5566384116586722E-01 4.5679152121485761E-01 4.5791929616761556E-01 4.5904716600188150E-01 4.6017513069540950E-01 + 4.6130319022596733E-01 4.6243134457133711E-01 4.6355959370931438E-01 4.6468793761770821E-01 4.6581637627434180E-01 + 4.6694490965705210E-01 4.6807353774368982E-01 4.6920226051211916E-01 4.7033107794021828E-01 4.7145999000587907E-01 + 4.7258899668700943E-01 4.7371809796152364E-01 4.7484729380735707E-01 4.7597658420245631E-01 4.7710596912478176E-01 + 4.7823544855230710E-01 4.7936502246302004E-01 4.8049469083492169E-01 4.8162445364602680E-01 4.8275431087436382E-01 + 4.8388426249797489E-01 4.8501430849491534E-01 4.8614444884325492E-01 4.8727468352107572E-01 4.8840501250647456E-01 + 4.8953543577756103E-01 4.9066595331245860E-01 4.9179656508930425E-01 4.9292727108624840E-01 4.9405807128145524E-01 + 4.9518896565310183E-01 4.9631995417937941E-01 4.9745103683849234E-01 4.9858221360865851E-01 4.9971348446811170E-01 + 5.0084484939509200E-01 5.0197630836785956E-01 5.0310786136468644E-01 5.0423950836385789E-01 5.0537124934367206E-01 + 5.0650308428244073E-01 5.0763501315848936E-01 5.0876703595015660E-01 5.0989915263579433E-01 5.1103136319376785E-01 + 5.1216366760245591E-01 5.1329606584025056E-01 5.1442855788555708E-01 5.1556114371679396E-01 5.1669382331239344E-01 + 5.1782659665080055E-01 5.1895946371047397E-01 5.2009242446988524E-01 5.2122547890751969E-01 5.2235862700187530E-01 + 5.2349186873146369E-01 5.2462520407480995E-01 5.2575863301045156E-01 5.2689215551694257E-01 5.2802577157284236E-01 + 5.2915948115673073E-01 5.3029328424719857E-01 5.3142718082285001E-01 5.3256117086230192E-01 5.3369525434418441E-01 + 5.3482943124714122E-01 5.3596370154982842E-01 5.3709806523091619E-01 5.3823252226908669E-01 5.3936707264303585E-01 + 5.4050171633147281E-01 5.4163645331311938E-01 5.4277128356671067E-01 5.4390620707099491E-01 5.4504122380473319E-01 + 5.4617633374669938E-01 5.4731153687568113E-01 5.4844683317047849E-01 5.4958222260990475E-01 5.5071770517278607E-01 + 5.5185328083796192E-01 5.5298894958428668E-01 5.5412471139062081E-01 5.5526056623584497E-01 5.5639651409884983E-01 + 5.5753255495853993E-01 5.5866868879383180E-01 5.5980491558365564E-01 5.6094123530695406E-01 5.6207764794268256E-01 + 5.6321415346981007E-01 5.6435075186731787E-01 5.6548744311420018E-01 5.6662422718946426E-01 5.6776110407213021E-01 + 5.6889807374123091E-01 5.7003513617581181E-01 5.7117229135493142E-01 5.7230953925766137E-01 5.7344687986308540E-01 + 5.7458431315030056E-01 5.7572183909841690E-01 5.7685945768655633E-01 5.7799716889385433E-01 5.7913497269945879E-01 + 5.8027286908253317E-01 5.8141085802224546E-01 5.8254893949778463E-01 5.8368711348834945E-01 5.8482537997315165E-01 + 5.8596373893141562E-01 5.8710219034237776E-01 5.8824073418528822E-01 5.8937937043940902E-01 5.9051809908401520E-01 + 5.9165692009839443E-01 5.9279583346184683E-01 5.9393483915368517E-01 5.9507393715323509E-01 5.9621312743983468E-01 + 5.9735240999283457E-01 5.9849178479159781E-01 5.9963125181550048E-01 6.0077081104393093E-01 6.0191046245628987E-01 + 6.0305020603199122E-01 6.0419004175046087E-01 6.0532996959113738E-01 6.0646998953347175E-01 6.0761010155693029E-01 + 6.0875030564098387E-01 6.0989060176512366E-01 6.1103098990885096E-01 6.1217147005167882E-01 6.1331204217313373E-01 + 6.1445270625275417E-01 6.1559346227009071E-01 6.1673431020470704E-01 6.1787525003617871E-01 6.1901628174409395E-01 + 6.2015740530805330E-01 6.2129862070766972E-01 6.2243992792256897E-01 6.2358132693238844E-01 6.2472281771677818E-01 + 6.2586440025540102E-01 6.2700607452793156E-01 6.2814784051405714E-01 6.2928969819347680E-01 6.3043164754590297E-01 + 6.3157368855105944E-01 6.3271582118868275E-01 6.3385804543852409E-01 6.3500036128033943E-01 6.3614276869390485E-01 + 6.3728526765900562E-01 6.3842785815543968E-01 6.3957054016301695E-01 6.4071331366155981E-01 6.4185617863090283E-01 + 6.4299913505089290E-01 6.4414218290138847E-01 6.4528532216226120E-01 6.4642855281339440E-01 6.4757187483468337E-01 + 6.4871528820603608E-01 6.4985879290737203E-01 6.5100238891862361E-01 6.5214607621973486E-01 6.5328985479066193E-01 + 6.5443372461137350E-01 6.5557768566184971E-01 6.5672173792208399E-01 6.5786588137208024E-01 6.5901011599185588E-01 + 6.6015444176143967E-01 6.6129885866087501E-01 6.6244336667021031E-01 6.6358796576951262E-01 6.6473265593885944E-01 + 6.6587743715834002E-01 6.6702230940805574E-01 6.6816727266811937E-01 6.6931232691865650E-01 6.7045747213980411E-01 + 6.7160270831171187E-01 6.7274803541454065E-01 6.7389345342846374E-01 6.7503896233366634E-01 6.7618456211034561E-01 + 6.7733025273871061E-01 6.7847603419898217E-01 6.7962190647139320E-01 6.8076786953618895E-01 6.8191392337362555E-01 + 6.8306006796397223E-01 6.8420630328750898E-01 6.8535262932452856E-01 6.8649904605533563E-01 6.8764555346024570E-01 + 6.8879215151958950E-01 6.8993884021370200E-01 6.9108561952293712E-01 6.9223248942765880E-01 6.9337944990824207E-01 + 6.9452650094507451E-01 6.9567364251855435E-01 6.9682087460909348E-01 6.9796819719711312E-01 6.9911561026304836E-01 + 7.0026311378734518E-01 7.0141070775046144E-01 7.0255839213286664E-01 7.0370616691504206E-01 7.0485403207748099E-01 + 7.0600198760068777E-01 7.0715003346517968E-01 7.0829816965148429E-01 7.0944639614014138E-01 7.1059471291170295E-01 + 7.1174311994673223E-01 7.1289161722580408E-01 7.1404020472950480E-01 7.1518888243843570E-01 7.1633765033320129E-01 + 7.1748650839442552E-01 7.1863545660274197E-01 7.1978449493879493E-01 7.2093362338324107E-01 7.2208284191674832E-01 + 7.2323215051999612E-01 7.2438154917367570E-01 7.2553103785849005E-01 7.2668061655515304E-01 7.2783028524439075E-01 + 7.2898004390694071E-01 7.3012989252355143E-01 7.3127983107498362E-01 7.3242985954200934E-01 7.3357997790541196E-01 + 7.3473018614598673E-01 7.3588048424453978E-01 7.3703087218188945E-01 7.3818134993886508E-01 7.3933191749630744E-01 + 7.4048257483506930E-01 7.4163332193601406E-01 7.4278415878001991E-01 7.4393508534796837E-01 7.4508610162076017E-01 + 7.4623720757930467E-01 7.4738840320452338E-01 7.4853968847734820E-01 7.4969106337872315E-01 7.5084252788960348E-01 + 7.5199408199095541E-01 7.5314572566375726E-01 7.5429745888899813E-01 7.5544928164767844E-01 7.5660119392081060E-01 + 7.5775319568941779E-01 7.5890528693453407E-01 7.6005746763720616E-01 7.6120973777849077E-01 7.6236209733945670E-01 + 7.6351454630118420E-01 7.6466708464476352E-01 7.6581971235129775E-01 7.6697242940190025E-01 7.6812523577769609E-01 + 7.6927813145982160E-01 7.7043111642942630E-01 7.7158419066766404E-01 7.7273735415570732E-01 7.7389060687473687E-01 + 7.7504394880594563E-01 7.7619737993053650E-01 7.7735090022972453E-01 7.7850450968473539E-01 7.7965820827680643E-01 + 7.8081199598718531E-01 7.8196587279713181E-01 7.8311983868791679E-01 7.8427389364082134E-01 7.8542803763713842E-01 + 7.8658227065817199E-01 7.8773659268523732E-01 7.8889100369966025E-01 7.9004550368277804E-01 7.9120009261593904E-01 + 7.9235477048050296E-01 7.9350953725784013E-01 7.9466439292933211E-01 7.9581933747637146E-01 7.9697437088036427E-01 + 7.9812949312272075E-01 7.9928470418486852E-01 8.0044000404824511E-01 8.0159539269429747E-01 8.0275087010448509E-01 + 8.0390643626027736E-01 8.0506209114315508E-01 8.0621783473461051E-01 8.0737366701614599E-01 8.0852958796927565E-01 + 8.0968559757552372E-01 8.1084169581642618E-01 8.1199788267352924E-01 8.1315415812839087E-01 8.1431052216257938E-01 + 8.1546697475767427E-01 8.1662351589526561E-01 8.1778014555695477E-01 8.1893686372435381E-01 8.2009367037908554E-01 + 8.2125056550278397E-01 8.2240754907709379E-01 8.2356462108367079E-01 8.2472178150418352E-01 8.2587903032030485E-01 + 8.2703636751372489E-01 8.2819379306614316E-01 8.2935130695926895E-01 8.3050890917482290E-01 8.3166659969453705E-01 + 8.3282437850015256E-01 8.3398224557342349E-01 8.3514020089611318E-01 8.3629824444999601E-01 8.3745637621685787E-01 + 8.3861459617849410E-01 8.3977290431671259E-01 8.4093130061332988E-01 8.4208978505017473E-01 8.4324835760908634E-01 + 8.4440701827191444E-01 8.4556576702051955E-01 8.4672460383677273E-01 8.4788352870255612E-01 8.4904254159976200E-01 + 8.5020164251029362E-01 8.5136083141606778E-01 8.5252010829900382E-01 8.5367947314103942E-01 8.5483892592412081E-01 + 8.5599846663020418E-01 8.5715809524125719E-01 8.5831781173925725E-01 8.5947761610619289E-01 8.6063750832406316E-01 + 8.6179748837487768E-01 8.6295755624065695E-01 8.6411771190343156E-01 8.6527795534524254E-01 8.6643828654814226E-01 + 8.6759870549419371E-01 8.6875921216546970E-01 8.6991980654405321E-01 8.7108048861203891E-01 8.7224125835153166E-01 + 8.7340211574464677E-01 8.7456306077350943E-01 8.7572409342025648E-01 8.7688521366703431E-01 8.7804642149600076E-01 + 8.7920771688932542E-01 8.8036909982918166E-01 8.8153057029776105E-01 8.8269212827726207E-01 8.8385377374989527E-01 + 8.8501550669787987E-01 8.8617732710344710E-01 8.8733923494883726E-01 8.8850123021630190E-01 8.8966331288810296E-01 + 8.9082548294651265E-01 8.9198774037381301E-01 8.9315008515229777E-01 8.9431251726426997E-01 8.9547503669204309E-01 + 8.9663764341794161E-01 8.9780033742430021E-01 8.9896311869346335E-01 9.0012598720778625E-01 9.0128894294963458E-01 + 9.0245198590138409E-01 9.0361511604542122E-01 9.0477833336414204E-01 9.0594163783995352E-01 9.0710502945527549E-01 + 9.0826850819253035E-01 9.0943207403415827E-01 9.1059572696260693E-01 9.1175946696033483E-01 9.1292329400981054E-01 + 9.1408720809351296E-01 9.1525120919393033E-01 9.1641529729356341E-01 9.1757947237492010E-01 9.1874373442052137E-01 + 9.1990808341289665E-01 9.2107251933458600E-01 9.2223704216814006E-01 9.2340165189611889E-01 9.2456634850109432E-01 + 9.2573113196564616E-01 9.2689600227236613E-01 9.2806095940385569E-01 9.2922600334272587E-01 9.3039113407159846E-01 + 9.3155635157310501E-01 9.3272165582988764E-01 9.3388704682460100E-01 9.3505252453990184E-01 9.3621808895846526E-01 + 9.3738374006297354E-01 9.3854947783611919E-01 9.3971530226060462E-01 9.4088121331914276E-01 9.4204721099445610E-01 + 9.4321329526927733E-01 9.4437946612634982E-01 9.4554572354842614E-01 9.4671206751826953E-01 9.4787849801865276E-01 + 9.4904501503235872E-01 9.5021161854218106E-01 9.5137830853092253E-01 9.5254508498139612E-01 9.5371194787642521E-01 + 9.5487889719884289E-01 9.5604593293149243E-01 9.5721305505722687E-01 9.5838026355890904E-01 9.5954755841941219E-01 + 9.6071493962161947E-01 9.6188240714842577E-01 9.6304996098272966E-01 9.6421760110744648E-01 9.6538532750549855E-01 + 9.6655314015981941E-01 9.6772103905335061E-01 9.6888902416904554E-01 9.7005709548986641E-01 9.7122525299878548E-01 + 9.7239349667878505E-01 9.7356182651285761E-01 9.7473024248400453E-01 9.7589874457523795E-01 9.7706733276958002E-01 + 9.7823600705006186E-01 9.7940476739972515E-01 9.8057361380162122E-01 9.8174254623881074E-01 9.8291156469436536E-01 + 9.8408066915136516E-01 9.8524985959290112E-01 9.8641913600207332E-01 9.8758849836199258E-01 9.8875794665577821E-01 + 9.8992748086656279E-01 9.9109710097748061E-01 9.9226680697168401E-01 9.9343659883233149E-01 9.9460647654259204E-01 + 9.9577644008564425E-01 9.9694648944467634E-01 9.9811662460288653E-01 9.9928684554348224E-01 1.0004571522496817E+00 + 1.0016275447047114E+00 1.0027980228918085E+00 1.0039685867942194E+00 1.0051392363952008E+00 1.0063099716780184E+00 + 1.0074807926259484E+00 1.0086516992222756E+00 1.0098226914502948E+00 1.0109937692933111E+00 1.0121649327346387E+00 + 1.0133361817576014E+00 1.0145075163455333E+00 1.0156789364817769E+00 1.0168504421496880E+00 1.0180220333326235E+00 + 1.0191937100139590E+00 1.0203654721770754E+00 1.0215373198053643E+00 1.0227092528822261E+00 1.0238812713910714E+00 + 1.0250533753153204E+00 1.0262255646384026E+00 1.0273978393437568E+00 1.0285701994148324E+00 1.0297426448350868E+00 + 1.0309151755879888E+00 1.0320877916570148E+00 1.0332604930256517E+00 1.0344332796773961E+00 1.0356061515957544E+00 + 1.0367791087642406E+00 1.0379521511663803E+00 1.0391252787857084E+00 1.0402984916057680E+00 1.0414717896101127E+00 + 1.0426451727823052E+00 1.0438186411059176E+00 1.0449921945645342E+00 1.0461658331417418E+00 1.0473395568211421E+00 + 1.0485133655863466E+00 1.0496872594209739E+00 1.0508612383086531E+00 1.0520353022330227E+00 1.0532094511777297E+00 + 1.0543836851264323E+00 1.0555580040627961E+00 1.0567324079704976E+00 1.0579068968332221E+00 1.0590814706346636E+00 + 1.0602561293585269E+00 1.0614308729885247E+00 1.0626057015083803E+00 1.0637806149018256E+00 1.0649556131526021E+00 + 1.0661306962444606E+00 1.0673058641611608E+00 1.0684811168864730E+00 1.0696564544041747E+00 1.0708318766980551E+00 + 1.0720073837519111E+00 1.0731829755495519E+00 1.0743586520747881E+00 1.0755344133114482E+00 1.0767102592433657E+00 + 1.0778861898543857E+00 1.0790622051283598E+00 1.0802383050491506E+00 1.0814144896006306E+00 1.0825907587666799E+00 + 1.0837671125311881E+00 1.0849435508780552E+00 1.0861200737911891E+00 1.0872966812545080E+00 1.0884733732519385E+00 + 1.0896501497674167E+00 1.0908270107848874E+00 1.0920039562883057E+00 1.0931809862616355E+00 1.0943581006888492E+00 + 1.0955352995539289E+00 1.0967125828408657E+00 1.0978899505336597E+00 1.0990674026163207E+00 1.1002449390728701E+00 + 1.1014225598873304E+00 1.1026002650437403E+00 1.1037780545261469E+00 1.1049559283186046E+00 1.1061338864051780E+00 + 1.1073119287699404E+00 1.1084900553969741E+00 1.1096682662703707E+00 1.1108465613742309E+00 1.1120249406926643E+00 + 1.1132034042097898E+00 1.1143819519097351E+00 1.1155605837766371E+00 1.1167392997946417E+00 1.1179180999479041E+00 + 1.1190969842205885E+00 1.1202759525968673E+00 1.1214550050609231E+00 1.1226341415969465E+00 1.1238133621891391E+00 + 1.1249926668217078E+00 1.1261720554788726E+00 1.1273515281448596E+00 1.1285310848039078E+00 1.1297107254402579E+00 + 1.1308904500381649E+00 1.1320702585818934E+00 1.1332501510557149E+00 1.1344301274439101E+00 1.1356101877307685E+00 + 1.1367903319005903E+00 1.1379705599376821E+00 1.1391508718263612E+00 1.1403312675509532E+00 1.1415117470957927E+00 + 1.1426923104452229E+00 1.1438729575835966E+00 1.1450536884952749E+00 1.1462345031646277E+00 1.1474154015760343E+00 + 1.1485963837138826E+00 1.1497774495625699E+00 1.1509585991065012E+00 1.1521398323300913E+00 1.1533211492177635E+00 + 1.1545025497539512E+00 1.1556840339230934E+00 1.1568656017096441E+00 1.1580472530980566E+00 1.1592289880728008E+00 + 1.1604108066183532E+00 1.1615927087191991E+00 1.1627746943598325E+00 1.1639567635247565E+00 1.1651389161984826E+00 + 1.1663211523655310E+00 1.1675034720104305E+00 1.1686858751177200E+00 1.1698683616719454E+00 1.1710509316576627E+00 + 1.1722335850594359E+00 1.1734163218618379E+00 1.1745991420494508E+00 1.1757820456068644E+00 1.1769650325186785E+00 + 1.1781481027695011E+00 1.1793312563439482E+00 1.1805144932266454E+00 1.1816978134022273E+00 1.1828812168553360E+00 + 1.1840647035706258E+00 1.1852482735327516E+00 1.1864319267263850E+00 1.1876156631362034E+00 1.1887994827468928E+00 + 1.1899833855431476E+00 1.1911673715096724E+00 1.1923514406311784E+00 1.1935355928923865E+00 1.1947198282780265E+00 + 1.1959041467728369E+00 1.1970885483615628E+00 1.1982730330289608E+00 1.1994576007597939E+00 1.2006422515388357E+00 + 1.2018269853508663E+00 1.2030118021806764E+00 1.2041967020130631E+00 1.2053816848328340E+00 1.2065667506248052E+00 + 1.2077518993737992E+00 1.2089371310646497E+00 1.2101224456821973E+00 1.2113078432112925E+00 1.2124933236367952E+00 + 1.2136788869435675E+00 1.2148645331164871E+00 1.2160502621404383E+00 1.2172360740003130E+00 1.2184219686810125E+00 + 1.2196079461674456E+00 1.2207940064445308E+00 1.2219801494971945E+00 1.2231663753103712E+00 1.2243526838690042E+00 + 1.2255390751580464E+00 1.2267255491624571E+00 1.2279121058672056E+00 1.2290987452572690E+00 1.2302854673176331E+00 + 1.2314722720332918E+00 1.2326591593892484E+00 1.2338461293705139E+00 1.2350331819621070E+00 1.2362203171490562E+00 + 1.2374075349163980E+00 1.2385948352491769E+00 1.2397822181324492E+00 1.2409696835512702E+00 1.2421572314907134E+00 + 1.2433448619358569E+00 1.2445325748717877E+00 1.2457203702836006E+00 1.2469082481563993E+00 1.2480962084752958E+00 + 1.2492842512254101E+00 1.2504723763918713E+00 1.2516605839598154E+00 1.2528488739143886E+00 1.2540372462407439E+00 + 1.2552257009240437E+00 1.2564142379494587E+00 1.2576028573021669E+00 1.2587915589673553E+00 1.2599803429302192E+00 + 1.2611692091759619E+00 1.2623581576897960E+00 1.2635471884569409E+00 1.2647363014626252E+00 1.2659254966920863E+00 + 1.2671147741305677E+00 1.2683041337633276E+00 1.2694935755756198E+00 1.2706830995527183E+00 1.2718727056799004E+00 + 1.2730623939424528E+00 1.2742521643256695E+00 1.2754420168148541E+00 1.2766319513953166E+00 1.2778219680523768E+00 + 1.2790120667713623E+00 1.2802022475376080E+00 1.2813925103364585E+00 1.2825828551532654E+00 1.2837732819733889E+00 + 1.2849637907821978E+00 1.2861543815650687E+00 1.2873450543073854E+00 1.2885358089945425E+00 1.2897266456119398E+00 + 1.2909175641449873E+00 1.2921085645791017E+00 1.2932996468997093E+00 1.2944908110922440E+00 1.2956820571421468E+00 + 1.2968733850348706E+00 1.2980647947558683E+00 1.2992562862906096E+00 1.3004478596245677E+00 1.3016395147432256E+00 + 1.3028312516320741E+00 1.3040230702766116E+00 1.3052149706623442E+00 1.3064069527747879E+00 1.3075990165994649E+00 + 1.3087911621219066E+00 1.3099833893276520E+00 1.3111756982022478E+00 1.3123680887312494E+00 1.3135605609002203E+00 + 1.3147531146947318E+00 1.3159457501003631E+00 1.3171384671027011E+00 1.3183312656873420E+00 1.3195241458398890E+00 + 1.3207171075459532E+00 1.3219101507911544E+00 1.3231032755611203E+00 1.3242964818414880E+00 1.3254897696178964E+00 + 1.3266831388760001E+00 1.3278765896014575E+00 1.3290701217799366E+00 1.3302637353971123E+00 1.3314574304386690E+00 + 1.3326512068902974E+00 1.3338450647376960E+00 1.3350390039665738E+00 1.3362330245626444E+00 1.3374271265116313E+00 + 1.3386213097992665E+00 1.3398155744112876E+00 1.3410099203334425E+00 1.3422043475514860E+00 1.3433988560511803E+00 + 1.3445934458182964E+00 1.3457881168386128E+00 1.3469828690979155E+00 1.3481777025819996E+00 1.3493726172766674E+00 + 1.3505676131677282E+00 1.3517626902410007E+00 1.3529578484823133E+00 1.3541530878774937E+00 1.3553484084123872E+00 + 1.3565438100728429E+00 1.3577392928447172E+00 1.3589348567138768E+00 1.3601305016661938E+00 1.3613262276875489E+00 + 1.3625220347638309E+00 1.3637179228809360E+00 1.3649138920247690E+00 1.3661099421812415E+00 1.3673060733362730E+00 + 1.3685022854757920E+00 1.3696985785857343E+00 1.3708949526520420E+00 1.3720914076606670E+00 1.3732879435975676E+00 + 1.3744845604487106E+00 1.3756812582000704E+00 1.3768780368376292E+00 1.3780748963473766E+00 1.3792718367153103E+00 + 1.3804688579274356E+00 1.3816659599697685E+00 1.3828631428283242E+00 1.3840604064891351E+00 1.3852577509382360E+00 + 1.3864551761616715E+00 1.3876526821454935E+00 1.3888502688757609E+00 1.3900479363385416E+00 1.3912456845199102E+00 + 1.3924435134059483E+00 1.3936414229827481E+00 1.3948394132364057E+00 1.3960374841530274E+00 1.3972356357187263E+00 + 1.3984338679196233E+00 1.3996321807418470E+00 1.4008305741715339E+00 1.4020290481948274E+00 1.4032276027978794E+00 + 1.4044262379668495E+00 1.4056249536879029E+00 1.4068237499472160E+00 1.4080226267309699E+00 1.4092215840253561E+00 + 1.4104206218165682E+00 1.4116197400908124E+00 1.4128189388343020E+00 1.4140182180332572E+00 1.4152175776739047E+00 + 1.4164170177424806E+00 1.4176165382252279E+00 1.4188161391083967E+00 1.4200158203782447E+00 1.4212155820210375E+00 + 1.4224154240230484E+00 1.4236153463705588E+00 1.4248153490498561E+00 1.4260154320472358E+00 1.4272155953490018E+00 + 1.4284158389414650E+00 1.4296161628109432E+00 1.4308165669437634E+00 1.4320170513262576E+00 1.4332176159447676E+00 + 1.4344182607856417E+00 1.4356189858352364E+00 1.4368197910799139E+00 1.4380206765060490E+00 1.4392216421000135E+00 + 1.4404226878481974E+00 1.4416238137369937E+00 1.4428250197528021E+00 1.4440263058820320E+00 1.4452276721110999E+00 + 1.4464291184264280E+00 1.4476306448144465E+00 1.4488322512615952E+00 1.4500339377543181E+00 1.4512357042790689E+00 + 1.4524375508223077E+00 1.4536394773705035E+00 1.4548414839101307E+00 1.4560435704276722E+00 1.4572457369096177E+00 + 1.4584479833424651E+00 1.4596503097127196E+00 1.4608527160068936E+00 1.4620552022115059E+00 1.4632577683130847E+00 + 1.4644604142981641E+00 1.4656631401532862E+00 1.4668659458650020E+00 1.4680688314198642E+00 1.4692717968044382E+00 + 1.4704748420052962E+00 1.4716779670090161E+00 1.4728811718021846E+00 1.4740844563713951E+00 1.4752878207032472E+00 + 1.4764912647843502E+00 1.4776947886013194E+00 1.4788983921407768E+00 1.4801020753893523E+00 1.4813058383336843E+00 + 1.4825096809604166E+00 1.4837136032562008E+00 1.4849176052076969E+00 1.4861216868015708E+00 1.4873258480244969E+00 + 1.4885300888631556E+00 1.4897344093042357E+00 1.4909388093344329E+00 1.4921432889404493E+00 1.4933478481089959E+00 + 1.4945524868267923E+00 1.4957572050805579E+00 1.4969620028570274E+00 1.4981668801429406E+00 1.4993718369250419E+00 + 1.5005768731900875E+00 1.5017819889248358E+00 1.5029871841160565E+00 1.5041924587505240E+00 1.5053978128150209E+00 + 1.5066032462963377E+00 1.5078087591812706E+00 1.5090143514566232E+00 1.5102200231092078E+00 1.5114257741258421E+00 + 1.5126316044933523E+00 1.5138375141985709E+00 1.5150435032283376E+00 1.5162495715694999E+00 1.5174557192089126E+00 + 1.5186619461334367E+00 1.5198682523299407E+00 1.5210746377853008E+00 1.5222811024863996E+00 1.5234876464201299E+00 + 1.5246942695733836E+00 1.5259009719330676E+00 1.5271077534860931E+00 1.5283146142193793E+00 1.5295215541198521E+00 + 1.5307285731744436E+00 1.5319356713700933E+00 1.5331428486937495E+00 1.5343501051323654E+00 1.5355574406729022E+00 + 1.5367648553023288E+00 1.5379723490076194E+00 1.5391799217757571E+00 1.5403875735937320E+00 1.5415953044485402E+00 + 1.5428031143271852E+00 1.5440110032166772E+00 1.5452189711040345E+00 1.5464270179762816E+00 1.5476351438204508E+00 + 1.5488433486235809E+00 1.5500516323727169E+00 1.5512599950549157E+00 1.5524684366572312E+00 1.5536769571667330E+00 + 1.5548855565704947E+00 1.5560942348555986E+00 1.5573029920091310E+00 1.5585118280181876E+00 1.5597207428698714E+00 + 1.5609297365512897E+00 1.5621388090495594E+00 1.5633479603518032E+00 1.5645571904451512E+00 1.5657664993167397E+00 + 1.5669758869537134E+00 1.5681853533432220E+00 1.5693948984724249E+00 1.5706045223284850E+00 1.5718142248985754E+00 + 1.5730240061698739E+00 1.5742338661295663E+00 1.5754438047648447E+00 1.5766538220629089E+00 1.5778639180109650E+00 + 1.5790740925962268E+00 1.5802843458059164E+00 1.5814946776272560E+00 1.5827050880474827E+00 1.5839155770538360E+00 + 1.5851261446335649E+00 1.5863367907739236E+00 1.5875475154621732E+00 1.5887583186855827E+00 1.5899692004314272E+00 + 1.5911801606869895E+00 1.5923911994395576E+00 1.5936023166764282E+00 1.5948135123849034E+00 1.5960247865522941E+00 + 1.5972361391659153E+00 1.5984475702130907E+00 1.5996590796811507E+00 1.6008706675574327E+00 1.6020823338292796E+00 + 1.6032940784840430E+00 1.6045059015090797E+00 1.6057178028917540E+00 1.6069297826194373E+00 1.6081418406795074E+00 + 1.6093539770593517E+00 1.6105661917463563E+00 1.6117784847279222E+00 1.6129908559914545E+00 1.6142033055243656E+00 + 1.6154158333140729E+00 1.6166284393480033E+00 1.6178411236135877E+00 1.6190538860982659E+00 1.6202667267894837E+00 + 1.6214796456746927E+00 1.6226926427413531E+00 1.6239057179769305E+00 1.6251188713688980E+00 1.6263321029047344E+00 + 1.6275454125719262E+00 1.6287588003579667E+00 1.6299722662503553E+00 1.6311858102365979E+00 1.6323994323042084E+00 + 1.6336131324407062E+00 1.6348269106336177E+00 1.6360407668704766E+00 1.6372547011388252E+00 1.6384687134262055E+00 + 1.6396828037201716E+00 1.6408969720082853E+00 1.6421112182781126E+00 1.6433255425172268E+00 1.6445399447132083E+00 + 1.6457544248536440E+00 1.6469689829261258E+00 1.6481836189182553E+00 1.6493983328176383E+00 1.6506131246118891E+00 + 1.6518279942886263E+00 1.6530429418354771E+00 1.6542579672400757E+00 1.6554730704900600E+00 1.6566882515730783E+00 + 1.6579035104767830E+00 1.6591188471888334E+00 1.6603342616968972E+00 1.6615497539886459E+00 1.6627653240517597E+00 + 1.6639809718739245E+00 1.6651966974428334E+00 1.6664125007461881E+00 1.6676283817716904E+00 1.6688443405070537E+00 + 1.6700603769399984E+00 1.6712764910582492E+00 1.6724926828495388E+00 1.6737089523016064E+00 1.6749252994021970E+00 + 1.6761417241390622E+00 1.6773582264999620E+00 1.6785748064726589E+00 1.6797914640449267E+00 1.6810081992045425E+00 + 1.6822250119392914E+00 1.6834419022369638E+00 1.6846588700853578E+00 1.6858759154722780E+00 1.6870930383855354E+00 + 1.6883102388129461E+00 1.6895275167423347E+00 1.6907448721615312E+00 1.6919623050583725E+00 1.6931798154207023E+00 + 1.6943974032363696E+00 1.6956150684932334E+00 1.6968328111791515E+00 1.6980506312819952E+00 1.6992685287896414E+00 + 1.7004865036899706E+00 1.7017045559708726E+00 1.7029226856202417E+00 1.7041408926259802E+00 1.7053591769759959E+00 + 1.7065775386582027E+00 1.7077959776605216E+00 1.7090144939708807E+00 1.7102330875772127E+00 1.7114517584674589E+00 + 1.7126705066295649E+00 1.7138893320514834E+00 1.7151082347211757E+00 1.7163272146266055E+00 1.7175462717557466E+00 + 1.7187654060965774E+00 1.7199846176370825E+00 1.7212039063652536E+00 1.7224232722690882E+00 1.7236427153365941E+00 + 1.7248622355557759E+00 1.7260818329146537E+00 1.7273015074012499E+00 1.7285212590035954E+00 1.7297410877097263E+00 + 1.7309609935076846E+00 1.7321809763855194E+00 1.7334010363312857E+00 1.7346211733330454E+00 1.7358413873788661E+00 + 1.7370616784568225E+00 1.7382820465549942E+00 1.7395024916614685E+00 1.7407230137643395E+00 1.7419436128517058E+00 + 1.7431642889116741E+00 1.7443850419323557E+00 1.7456058719018699E+00 1.7468267788083407E+00 1.7480477626398998E+00 + 1.7492688233846849E+00 1.7504899610308393E+00 1.7517111755665133E+00 1.7529324669798656E+00 1.7541538352590531E+00 + 1.7553752803922482E+00 1.7565968023676253E+00 1.7578184011733662E+00 1.7590400767976579E+00 1.7602618292286960E+00 + 1.7614836584546787E+00 1.7627055644638141E+00 1.7639275472443137E+00 1.7651496067843968E+00 1.7663717430722892E+00 + 1.7675939560962213E+00 1.7688162458444314E+00 1.7700386123051635E+00 1.7712610554666672E+00 1.7724835753171990E+00 + 1.7737061718450218E+00 1.7749288450384040E+00 1.7761515948856208E+00 1.7773744213749532E+00 1.7785973244946889E+00 + 1.7798203042331207E+00 1.7810433605785490E+00 1.7822664935192820E+00 1.7834897030436279E+00 1.7847129891399058E+00 + 1.7859363517964408E+00 1.7871597910015644E+00 1.7883833067436119E+00 1.7896068990109280E+00 1.7908305677918603E+00 + 1.7920543130747650E+00 1.7932781348480038E+00 1.7945020330999439E+00 1.7957260078189583E+00 1.7969500589934286E+00 + 1.7981741866117389E+00 1.7993983906622828E+00 1.8006226711334579E+00 1.8018470280136691E+00 1.8030714612913259E+00 + 1.8042959709548461E+00 1.8055205569926525E+00 1.8067452193931726E+00 1.8079699581448425E+00 1.8091947732361029E+00 + 1.8104196646554040E+00 1.8116446323911930E+00 1.8128696764319325E+00 1.8140947967660879E+00 1.8153199933821300E+00 + 1.8165452662685369E+00 1.8177706154137929E+00 1.8189960408063861E+00 1.8202215424348134E+00 1.8214471202875766E+00 + 1.8226727743531836E+00 1.8238985046201477E+00 1.8251243110769892E+00 1.8263501937122342E+00 1.8275761525144145E+00 + 1.8288021874720690E+00 1.8300282985737413E+00 1.8312544858079811E+00 1.8324807491633450E+00 1.8337070886283953E+00 + 1.8349335041917008E+00 1.8361599958418338E+00 1.8373865635673770E+00 1.8386132073569144E+00 1.8398399271990420E+00 + 1.8410667230823523E+00 1.8422935949954526E+00 1.8435205429269530E+00 1.8447475668654698E+00 1.8459746667996249E+00 + 1.8472018427180465E+00 1.8484290946093691E+00 1.8496564224622316E+00 1.8508838262652814E+00 1.8521113060071692E+00 + 1.8533388616765545E+00 1.8545664932621000E+00 1.8557942007524761E+00 1.8570219841363587E+00 1.8582498434024288E+00 + 1.8594777785393750E+00 1.8607057895358905E+00 1.8619338763806745E+00 1.8631620390624331E+00 1.8643902775698775E+00 + 1.8656185918917245E+00 1.8668469820166980E+00 1.8680754479335271E+00 1.8693039896309485E+00 1.8705326070976993E+00 + 1.8717613003225280E+00 1.8729900692941874E+00 1.8742189140014365E+00 1.8754478344330399E+00 1.8766768305777670E+00 + 1.8779059024243954E+00 1.8791350499617059E+00 1.8803642731784880E+00 1.8815935720635346E+00 1.8828229466056452E+00 + 1.8840523967936262E+00 1.8852819226162878E+00 1.8865115240624493E+00 1.8877412011209318E+00 1.8889709537805655E+00 + 1.8902007820301852E+00 1.8914306858586309E+00 1.8926606652547500E+00 1.8938907202073942E+00 1.8951208507054216E+00 + 1.8963510567376964E+00 1.8975813382930908E+00 1.8988116953604754E+00 1.9000421279287345E+00 1.9012726359867551E+00 + 1.9025032195234297E+00 1.9037338785276583E+00 1.9049646129883442E+00 1.9061954228943985E+00 1.9074263082347376E+00 + 1.9086572689982830E+00 1.9098883051739626E+00 1.9111194167507097E+00 1.9123506037174642E+00 1.9135818660631709E+00 + 1.9148132037767811E+00 1.9160446168472502E+00 1.9172761052635416E+00 1.9185076690146228E+00 1.9197393080894685E+00 + 1.9209710224770573E+00 1.9222028121663748E+00 1.9234346771464133E+00 1.9246666174061682E+00 1.9258986329346421E+00 + 1.9271307237208464E+00 1.9283628897537897E+00 1.9295951310224944E+00 1.9308274475159859E+00 1.9320598392232953E+00 + 1.9332923061334590E+00 1.9345248482355215E+00 1.9357574655185283E+00 1.9369901579715352E+00 1.9382229255836012E+00 + 1.9394557683437921E+00 1.9406886862411779E+00 1.9419216792648364E+00 1.9431547474038497E+00 1.9443878906473060E+00 + 1.9456211089842981E+00 1.9468544024039269E+00 1.9480877708952962E+00 1.9493212144475176E+00 1.9505547330497068E+00 + 1.9517883266909857E+00 1.9530219953604833E+00 1.9542557390473314E+00 1.9554895577406726E+00 1.9567234514296459E+00 + 1.9579574201034045E+00 1.9591914637511032E+00 1.9604255823619046E+00 1.9616597759249759E+00 1.9628940444294887E+00 + 1.9641283878646227E+00 1.9653628062195612E+00 1.9665972994834942E+00 1.9678318676456166E+00 1.9690665106951286E+00 + 1.9703012286212374E+00 1.9715360214131548E+00 1.9727708890600981E+00 1.9740058315512909E+00 1.9752408488759614E+00 + 1.9764759410233446E+00 1.9777111079826806E+00 1.9789463497432138E+00 1.9801816662941958E+00 1.9814170576248835E+00 + 1.9826525237245385E+00 1.9838880645824284E+00 1.9851236801878305E+00 1.9863593705300169E+00 1.9875951355982748E+00 + 1.9888309753818956E+00 1.9900668898701726E+00 1.9913028790524081E+00 1.9925389429179086E+00 1.9937750814559860E+00 + 1.9950112946559575E+00 1.9962475825071471E+00 1.9974839449988822E+00 1.9987203821204986E+00 1.9999568938613344E+00 + 2.0011934802107358E+00 2.0024301411580527E+00 2.0036668766926420E+00 2.0049036868038650E+00 2.0061405714810889E+00 + 2.0073775307136867E+00 2.0086145644910363E+00 2.0098516728025211E+00 2.0110888556375310E+00 2.0123261129854595E+00 + 2.0135634448357065E+00 2.0148008511776818E+00 2.0160383320007895E+00 2.0172758872944501E+00 2.0185135170480843E+00 + 2.0197512212511199E+00 2.0209889998929906E+00 2.0222268529631333E+00 2.0234647804509920E+00 2.0247027823460164E+00 + 2.0259408586376613E+00 2.0271790093153856E+00 2.0284172343686553E+00 2.0296555337869422E+00 2.0308939075597210E+00 + 2.0321323556764748E+00 2.0333708781266906E+00 2.0346094748998600E+00 2.0358481459854816E+00 2.0370868913730584E+00 + 2.0383257110521007E+00 2.0395646050121203E+00 2.0408035732426395E+00 2.0420426157331804E+00 2.0432817324732784E+00 + 2.0445209234524619E+00 2.0457601886602759E+00 2.0469995280862676E+00 2.0482389417199873E+00 2.0494784295509936E+00 + 2.0507179915688476E+00 2.0519576277631186E+00 2.0531973381233803E+00 2.0544371226392095E+00 2.0556769813001923E+00 + 2.0569169140959165E+00 2.0581569210159771E+00 2.0593970020499754E+00 2.0606371571875162E+00 2.0618773864182098E+00 + 2.0631176897316728E+00 2.0643580671175270E+00 2.0655985185653982E+00 2.0668390440649191E+00 2.0680796436057274E+00 + 2.0693203171774646E+00 2.0705610647697807E+00 2.0718018863723269E+00 2.0730427819747663E+00 2.0742837515667563E+00 + 2.0755247951379694E+00 2.0767659126780806E+00 2.0780071041767689E+00 2.0792483696237198E+00 2.0804897090086238E+00 + 2.0817311223211763E+00 2.0829726095510788E+00 2.0842141706880377E+00 2.0854558057217640E+00 2.0866975146419739E+00 + 2.0879392974383908E+00 2.0891811541007410E+00 2.0904230846187586E+00 2.0916650889821797E+00 2.0929071671807482E+00 + 2.0941493192042127E+00 2.0953915450423257E+00 2.0966338446848480E+00 2.0978762181215416E+00 2.0991186653421772E+00 + 2.1003611863365284E+00 2.1016037810943757E+00 2.1028464496055066E+00 2.1040891918597056E+00 2.1053320078467710E+00 + 2.1065748975565040E+00 2.1078178609787099E+00 2.1090608981032002E+00 2.1103040089197904E+00 2.1115471934183030E+00 + 2.1127904515885638E+00 2.1140337834204050E+00 2.1152771889036641E+00 2.1165206680281829E+00 2.1177642207838092E+00 + 2.1190078471603955E+00 2.1202515471477992E+00 2.1214953207358835E+00 2.1227391679145167E+00 2.1239830886735720E+00 + 2.1252270830029283E+00 2.1264711508924692E+00 2.1277152923320823E+00 2.1289595073116634E+00 2.1302037958211097E+00 + 2.1314481578503304E+00 2.1326925933892280E+00 2.1339371024277196E+00 2.1351816849557261E+00 2.1364263409631716E+00 + 2.1376710704399859E+00 2.1389158733761047E+00 2.1401607497614679E+00 2.1414056995860209E+00 2.1426507228397131E+00 + 2.1438958195125020E+00 2.1451409895943474E+00 2.1463862330752148E+00 2.1476315499450758E+00 2.1488769401939054E+00 + 2.1501224038116851E+00 2.1513679407884028E+00 2.1526135511140474E+00 2.1538592347786172E+00 2.1551049917721117E+00 + 2.1563508220845384E+00 2.1575967257059103E+00 2.1588427026262420E+00 2.1600887528355575E+00 2.1613348763238838E+00 + 2.1625810730812498E+00 2.1638273430976933E+00 2.1650736863632578E+00 2.1663201028679904E+00 2.1675665926019430E+00 + 2.1688131555551715E+00 2.1700597917177400E+00 2.1713065010797155E+00 2.1725532836311698E+00 2.1738001393621809E+00 + 2.1750470682628307E+00 2.1762940703232072E+00 2.1775411455334024E+00 2.1787882938835139E+00 2.1800355153636457E+00 + 2.1812828099639030E+00 2.1825301776743999E+00 2.1837776184852542E+00 2.1850251323865875E+00 2.1862727193685281E+00 + 2.1875203794212084E+00 2.1887681125347664E+00 2.1900159186993444E+00 2.1912637979050924E+00 2.1925117501421587E+00 + 2.1937597754007037E+00 2.1950078736708876E+00 2.1962560449428805E+00 2.1975042892068539E+00 2.1987526064529859E+00 + 2.2000009966714580E+00 2.2012494598524586E+00 2.2024979959861803E+00 2.2037466050628201E+00 2.2049952870725797E+00 + 2.2062440420056677E+00 2.2074928698522953E+00 2.2087417706026806E+00 2.2099907442470452E+00 2.2112397907756165E+00 + 2.2124889101786258E+00 2.2137381024463116E+00 2.2149873675689151E+00 2.2162367055366827E+00 2.2174861163398663E+00 + 2.2187355999687228E+00 2.2199851564135171E+00 2.2212347856645094E+00 2.2224844877119749E+00 2.2237342625461896E+00 + 2.2249841101574339E+00 2.2262340305359958E+00 2.2274840236721647E+00 2.2287340895562378E+00 2.2299842281785152E+00 + 2.2312344395293029E+00 2.2324847235989118E+00 2.2337350803776577E+00 2.2349855098558602E+00 2.2362360120238458E+00 + 2.2374865868719449E+00 2.2387372343904901E+00 2.2399879545698247E+00 2.2412387474002915E+00 2.2424896128722409E+00 + 2.2437405509760269E+00 2.2449915617020100E+00 2.2462426450405530E+00 2.2474938009820269E+00 2.2487450295168041E+00 + 2.2499963306352675E+00 2.2512477043277950E+00 2.2524991505847765E+00 2.2537506693966072E+00 2.2550022607536842E+00 + 2.2562539246464111E+00 2.2575056610651956E+00 2.2587574700004502E+00 2.2600093514425934E+00 2.2612613053820469E+00 + 2.2625133318092367E+00 2.2637654307145967E+00 2.2650176020885628E+00 2.2662698459215775E+00 2.2675221622040858E+00 + 2.2687745509265391E+00 2.2700270120793946E+00 2.2712795456531127E+00 2.2725321516381585E+00 2.2737848300250025E+00 + 2.2750375808041197E+00 2.2762904039659912E+00 2.2775432995011000E+00 2.2787962673999376E+00 2.2800493076530000E+00 + 2.2813024202507810E+00 2.2825556051837861E+00 2.2838088624425259E+00 2.2850621920175125E+00 2.2863155938992641E+00 + 2.2875690680783043E+00 2.2888226145451598E+00 2.2900762332903644E+00 2.2913299243044536E+00 2.2925836875779702E+00 + 2.2938375231014612E+00 2.2950914308654773E+00 2.2963454108605750E+00 2.2975994630773156E+00 2.2988535875062630E+00 + 2.3001077841379898E+00 2.3013620529630692E+00 2.3026163939720825E+00 2.3038708071556129E+00 2.3051252925042500E+00 + 2.3063798500085881E+00 2.3076344796592254E+00 2.3088891814467689E+00 2.3101439553618195E+00 2.3113988013949940E+00 + 2.3126537195369092E+00 2.3139087097781887E+00 2.3151637721094573E+00 2.3164189065213470E+00 2.3176741130044944E+00 + 2.3189293915495410E+00 2.3201847421471311E+00 2.3214401647879166E+00 2.3226956594625499E+00 2.3239512261616930E+00 + 2.3252068648760100E+00 2.3264625755961683E+00 2.3277183583128425E+00 2.3289742130167110E+00 2.3302301396984566E+00 + 2.3314861383487662E+00 2.3327422089583330E+00 2.3339983515178528E+00 2.3352545660180279E+00 2.3365108524495644E+00 + 2.3377672108031731E+00 2.3390236410695717E+00 2.3402801432394762E+00 2.3415367173036126E+00 2.3427933632527105E+00 + 2.3440500810775040E+00 2.3453068707687321E+00 2.3465637323171373E+00 2.3478206657134679E+00 2.3490776709484762E+00 + 2.3503347480129193E+00 2.3515918968975593E+00 2.3528491175931618E+00 2.3541064100904974E+00 2.3553637743803426E+00 + 2.3566212104534765E+00 2.3578787183006855E+00 2.3591362979127561E+00 2.3603939492804842E+00 2.3616516723946672E+00 + 2.3629094672461091E+00 2.3641673338256162E+00 2.3654252721240017E+00 2.3666832821320818E+00 2.3679413638406808E+00 + 2.3691995172406197E+00 2.3704577423227309E+00 2.3717160390778491E+00 2.3729744074968147E+00 2.3742328475704713E+00 + 2.3754913592896676E+00 2.3767499426452567E+00 2.3780085976280976E+00 2.3792673242290512E+00 2.3805261224389849E+00 + 2.3817849922487699E+00 2.3830439336492826E+00 2.3843029466314030E+00 2.3855620311860166E+00 2.3868211873040126E+00 + 2.3880804149762853E+00 2.3893397141937331E+00 2.3905990849472585E+00 2.3918585272277704E+00 2.3931180410261801E+00 + 2.3943776263334051E+00 2.3956372831403656E+00 2.3968970114379875E+00 2.3981568112172043E+00 2.3994166824689445E+00 + 2.4006766251841500E+00 2.4019366393537656E+00 2.4031967249687378E+00 2.4044568820200207E+00 2.4057171104985708E+00 + 2.4069774103953496E+00 2.4082377817013234E+00 2.4094982244074630E+00 2.4107587385047431E+00 2.4120193239841430E+00 + 2.4132799808366476E+00 2.4145407090532451E+00 2.4158015086249276E+00 2.4170623795426929E+00 2.4183233217975437E+00 + 2.4195843353804851E+00 2.4208454202825296E+00 2.4221065764946910E+00 2.4233678040079889E+00 2.4246291028134470E+00 + 2.4258904729020956E+00 2.4271519142649667E+00 2.4284134268931004E+00 2.4296750107775331E+00 2.4309366659093143E+00 + 2.4321983922794943E+00 2.4334601898791282E+00 2.4347220586992759E+00 2.4359839987310017E+00 2.4372460099653730E+00 + 2.4385080923934637E+00 2.4397702460063497E+00 2.4410324707951143E+00 2.4422947667508423E+00 2.4435571338646254E+00 + 2.4448195721275572E+00 2.4460820815307383E+00 2.4473446620652712E+00 2.4486073137222641E+00 2.4498700364928294E+00 + 2.4511328303680848E+00 2.4523956953391512E+00 2.4536586313971540E+00 2.4549216385332229E+00 2.4561847167384929E+00 + 2.4574478660041046E+00 2.4587110863211974E+00 2.4599743776809189E+00 2.4612377400744228E+00 2.4625011734928655E+00 + 2.4637646779274061E+00 2.4650282533692107E+00 2.4662918998094487E+00 2.4675556172392934E+00 2.4688194056499220E+00 + 2.4700832650325184E+00 2.4713471953782675E+00 2.4726111966783622E+00 2.4738752689239969E+00 2.4751394121063712E+00 + 2.4764036262166891E+00 2.4776679112461593E+00 2.4789322671859946E+00 2.4801966940274118E+00 2.4814611917616318E+00 + 2.4827257603798811E+00 2.4839903998733899E+00 2.4852551102333917E+00 2.4865198914511257E+00 2.4877847435178366E+00 + 2.4890496664247670E+00 2.4903146601631718E+00 2.4915797247243057E+00 2.4928448600994284E+00 2.4941100662798057E+00 + 2.4953753432567054E+00 2.4966406910214021E+00 2.4979061095651711E+00 2.4991715988792946E+00 2.5004371589550587E+00 + 2.5017027897837552E+00 2.5029684913566754E+00 2.5042342636651203E+00 2.5055001067003921E+00 2.5067660204537980E+00 + 2.5080320049166493E+00 2.5092980600802641E+00 2.5105641859359586E+00 2.5118303824750603E+00 2.5130966496888960E+00 + 2.5143629875687989E+00 2.5156293961061067E+00 2.5168958752921609E+00 2.5181624251183092E+00 2.5194290455758961E+00 + 2.5206957366562781E+00 2.5219624983508142E+00 2.5232293306508664E+00 2.5244962335478021E+00 2.5257632070329916E+00 + 2.5270302510978109E+00 2.5282973657336392E+00 2.5295645509318589E+00 2.5308318066838611E+00 2.5320991329810343E+00 + 2.5333665298147765E+00 2.5346339971764897E+00 2.5359015350575769E+00 2.5371691434494470E+00 2.5384368223435132E+00 + 2.5397045717311939E+00 2.5409723916039106E+00 2.5422402819530880E+00 2.5435082427701570E+00 2.5447762740465518E+00 + 2.5460443757737115E+00 2.5473125479430787E+00 2.5485807905460973E+00 2.5498491035742203E+00 2.5511174870189022E+00 + 2.5523859408716030E+00 2.5536544651237865E+00 2.5549230597669190E+00 2.5561917247924737E+00 2.5574604601919253E+00 + 2.5587292659567553E+00 2.5599981420784461E+00 2.5612670885484889E+00 2.5625361053583742E+00 2.5638051924995997E+00 + 2.5650743499636657E+00 2.5663435777420776E+00 2.5676128758263452E+00 2.5688822442079804E+00 2.5701516828785027E+00 + 2.5714211918294327E+00 2.5726907710522955E+00 2.5739604205386226E+00 2.5752301402799467E+00 2.5764999302678064E+00 + 2.5777697904937473E+00 2.5790397209493108E+00 2.5803097216260475E+00 2.5815797925155155E+00 2.5828499336092712E+00 + 2.5841201448988786E+00 2.5853904263759038E+00 2.5866607780319195E+00 2.5879311998585002E+00 2.5892016918472249E+00 + 2.5904722539896774E+00 2.5917428862774448E+00 2.5930135887021195E+00 2.5942843612552964E+00 2.5955552039285754E+00 + 2.5968261167135620E+00 2.5980970996018620E+00 2.5993681525850891E+00 2.6006392756548586E+00 2.6019104688027910E+00 + 2.6031817320205102E+00 2.6044530652996460E+00 2.6057244686318302E+00 2.6069959420086981E+00 2.6082674854218943E+00 + 2.6095390988630585E+00 2.6108107823238407E+00 2.6120825357958952E+00 2.6133543592708772E+00 2.6146262527404498E+00 + 2.6158982161962760E+00 2.6171702496300253E+00 2.6184423530333718E+00 2.6197145263979915E+00 2.6209867697155662E+00 + 2.6222590829777803E+00 2.6235314661763245E+00 2.6248039193028907E+00 2.6260764423491754E+00 2.6273490353068829E+00 + 2.6286216981677155E+00 2.6298944309233852E+00 2.6311672335656029E+00 2.6324401060860874E+00 2.6337130484765598E+00 + 2.6349860607287470E+00 2.6362591428343762E+00 2.6375322947851845E+00 2.6388055165729045E+00 2.6400788081892803E+00 + 2.6413521696260567E+00 2.6426256008749833E+00 2.6438991019278149E+00 2.6451726727763063E+00 2.6464463134122225E+00 + 2.6477200238273260E+00 2.6489938040133878E+00 2.6502676539621812E+00 2.6515415736654839E+00 2.6528155631150767E+00 + 2.6540896223027448E+00 2.6553637512202783E+00 2.6566379498594701E+00 2.6579122182121178E+00 2.6591865562700234E+00 + 2.6604609640249905E+00 2.6617354414688297E+00 2.6630099885933527E+00 2.6642846053903781E+00 2.6655592918517272E+00 + 2.6668340479692239E+00 2.6681088737347007E+00 2.6693837691399858E+00 2.6706587341769166E+00 2.6719337688373348E+00 + 2.6732088731130870E+00 2.6744840469960205E+00 2.6757592904779877E+00 2.6770346035508461E+00 2.6783099862064561E+00 + 2.6795854384366824E+00 2.6808609602333919E+00 2.6821365515884574E+00 2.6834122124937574E+00 2.6846879429411699E+00 + 2.6859637429225796E+00 2.6872396124298743E+00 2.6885155514549459E+00 2.6897915599896907E+00 2.6910676380260088E+00 + 2.6923437855558032E+00 2.6936200025709818E+00 2.6948962890634558E+00 2.6961726450251398E+00 2.6974490704479548E+00 + 2.6987255653238265E+00 2.7000021296446746E+00 2.7012787634024353E+00 2.7025554665890419E+00 2.7038322391964327E+00 + 2.7051090812165528E+00 2.7063859926413460E+00 2.7076629734627642E+00 2.7089400236727608E+00 2.7102171432632942E+00 + 2.7114943322263270E+00 2.7127715905538250E+00 2.7140489182377565E+00 2.7153263152700973E+00 2.7166037816428230E+00 + 2.7178813173479166E+00 2.7191589223773613E+00 2.7204365967231485E+00 2.7217143403772686E+00 2.7229921533317212E+00 + 2.7242700355785039E+00 2.7255479871096231E+00 2.7268260079170874E+00 2.7281040979929099E+00 2.7293822573291027E+00 + 2.7306604859176873E+00 2.7319387837506879E+00 2.7332171508201326E+00 2.7344955871180514E+00 2.7357740926364804E+00 + 2.7370526673674576E+00 2.7383313113030274E+00 2.7396100244352346E+00 2.7408888067561317E+00 2.7421676582577716E+00 + 2.7434465789322124E+00 2.7447255687715160E+00 2.7460046277677481E+00 2.7472837559129788E+00 2.7485629531992806E+00 + 2.7498422196187313E+00 2.7511215551634125E+00 2.7524009598254069E+00 2.7536804335968039E+00 2.7549599764696961E+00 + 2.7562395884361792E+00 2.7575192694883550E+00 2.7587990196183267E+00 2.7600788388181980E+00 2.7613587270800832E+00 + 2.7626386843960962E+00 2.7639187107583578E+00 2.7651988061589887E+00 2.7664789705901160E+00 2.7677592040438688E+00 + 2.7690395065123816E+00 2.7703198779877933E+00 2.7716003184622440E+00 2.7728808279278798E+00 2.7741614063768489E+00 + 2.7754420538013034E+00 2.7767227701934010E+00 2.7780035555453022E+00 2.7792844098491694E+00 2.7805653330971709E+00 + 2.7818463252814793E+00 2.7831273863942689E+00 2.7844085164277175E+00 2.7856897153740103E+00 2.7869709832253315E+00 + 2.7882523199738753E+00 2.7895337256118298E+00 2.7908152001313953E+00 2.7920967435247732E+00 2.7933783557841685E+00 + 2.7946600369017909E+00 2.7959417868698511E+00 2.7972236056805668E+00 2.7985054933261582E+00 2.7997874497988469E+00 + 2.8010694750908622E+00 2.8023515691944354E+00 2.8036337321018006E+00 2.8049159638051959E+00 2.8061982642968641E+00 + 2.8074806335690519E+00 2.8087630716140075E+00 2.8100455784239848E+00 2.8113281539912407E+00 2.8126107983080360E+00 + 2.8138935113666368E+00 2.8151762931593076E+00 2.8164591436783231E+00 2.8177420629159586E+00 2.8190250508644943E+00 + 2.8203081075162091E+00 2.8215912328633910E+00 2.8228744268983328E+00 2.8241576896133251E+00 2.8254410210006657E+00 + 2.8267244210526594E+00 2.8280078897616066E+00 2.8292914271198191E+00 2.8305750331196076E+00 2.8318587077532875E+00 + 2.8331424510131797E+00 2.8344262628916064E+00 2.8357101433808953E+00 2.8369940924733763E+00 2.8382781101613834E+00 + 2.8395621964372544E+00 2.8408463512933313E+00 2.8421305747219598E+00 2.8434148667154857E+00 2.8446992272662643E+00 + 2.8459836563666503E+00 2.8472681540090043E+00 2.8485527201856877E+00 2.8498373548890710E+00 2.8511220581115206E+00 + 2.8524068298454117E+00 2.8536916700831232E+00 2.8549765788170358E+00 2.8562615560395344E+00 2.8575466017430085E+00 + 2.8588317159198486E+00 2.8601168985624521E+00 2.8614021496632183E+00 2.8626874692145496E+00 2.8639728572088545E+00 + 2.8652583136385408E+00 2.8665438384960238E+00 2.8678294317737203E+00 2.8691150934640515E+00 2.8704008235594416E+00 + 2.8716866220523207E+00 2.8729724889351202E+00 2.8742584242002738E+00 2.8755444278402225E+00 2.8768304998474075E+00 + 2.8781166402142753E+00 2.8794028489332799E+00 2.8806891259968674E+00 2.8819754713974985E+00 2.8832618851276326E+00 + 2.8845483671797352E+00 2.8858349175462732E+00 2.8871215362197180E+00 2.8884082231925454E+00 2.8896949784572317E+00 + 2.8909818020062592E+00 2.8922686938321149E+00 2.8935556539272875E+00 2.8948426822842674E+00 2.8961297788955545E+00 + 2.8974169437536452E+00 2.8987041768510444E+00 2.8999914781802589E+00 2.9012788477337987E+00 2.9025662855041769E+00 + 2.9038537914839124E+00 2.9051413656655249E+00 2.9064290080415405E+00 2.9077167186044859E+00 2.9090044973468938E+00 + 2.9102923442613005E+00 2.9115802593402398E+00 2.9128682425762573E+00 2.9141562939618981E+00 2.9154444134897108E+00 + 2.9167326011522499E+00 2.9180208569420696E+00 2.9193091808517306E+00 2.9205975728737963E+00 2.9218860330008338E+00 + 2.9231745612254127E+00 2.9244631575401074E+00 2.9257518219374958E+00 2.9270405544101559E+00 2.9283293549506757E+00 + 2.9296182235516404E+00 2.9309071602056425E+00 2.9321961649052763E+00 2.9334852376431404E+00 2.9347743784118374E+00 + 2.9360635872039706E+00 2.9373528640121500E+00 2.9386422088289881E+00 2.9399316216471001E+00 2.9412211024591080E+00 + 2.9425106512576296E+00 2.9438002680352939E+00 2.9450899527847287E+00 2.9463797054985696E+00 2.9476695261694519E+00 + 2.9489594147900151E+00 2.9502493713529039E+00 2.9515393958507650E+00 2.9528294882762496E+00 2.9541196486220098E+00 + 2.9554098768807044E+00 2.9567001730449927E+00 2.9579905371075412E+00 2.9592809690610160E+00 2.9605714688980895E+00 + 2.9618620366114348E+00 2.9631526721937318E+00 2.9644433756376594E+00 2.9657341469359055E+00 2.9670249860811575E+00 + 2.9683158930661064E+00 2.9696068678834480E+00 2.9708979105258839E+00 2.9721890209861108E+00 2.9734801992568376E+00 + 2.9747714453307723E+00 2.9760627592006279E+00 2.9773541408591204E+00 2.9786455902989677E+00 2.9799371075128942E+00 + 2.9812286924936253E+00 2.9825203452338909E+00 2.9838120657264238E+00 2.9851038539639596E+00 2.9863957099392402E+00 + 2.9876876336450056E+00 2.9889796250740042E+00 2.9902716842189867E+00 2.9915638110727061E+00 2.9928560056279188E+00 + 2.9941482678773839E+00 2.9954405978138667E+00 2.9967329954301336E+00 2.9980254607189547E+00 2.9993179936731051E+00 + 3.0006105942853600E+00 3.0019032625485038E+00 3.0031959984553138E+00 3.0044888019985820E+00 3.0057816731710982E+00 + 3.0070746119656557E+00 3.0083676183750532E+00 3.0096606923920901E+00 3.0109538340095714E+00 3.0122470432203050E+00 + 3.0135403200171020E+00 3.0148336643927753E+00 3.0161270763401435E+00 3.0174205558520280E+00 3.0187141029212525E+00 + 3.0200077175406448E+00 3.0213013997030371E+00 3.0225951494012624E+00 3.0238889666281583E+00 3.0251828513765671E+00 + 3.0264768036393330E+00 3.0277708234093033E+00 3.0290649106793301E+00 3.0303590654422674E+00 3.0316532876909728E+00 + 3.0329475774183110E+00 3.0342419346171399E+00 3.0355363592803322E+00 3.0368308514007571E+00 3.0381254109712890E+00 + 3.0394200379848075E+00 3.0407147324341937E+00 3.0420094943123304E+00 3.0433043236121069E+00 3.0445992203264143E+00 + 3.0458941844481462E+00 3.0471892159701999E+00 3.0484843148854792E+00 3.0497794811868868E+00 3.0510747148673301E+00 + 3.0523700159197213E+00 3.0536653843369725E+00 3.0549608201120040E+00 3.0562563232377364E+00 3.0575518937070925E+00 + 3.0588475315130013E+00 3.0601432366483929E+00 3.0614390091062029E+00 3.0627348488793693E+00 3.0640307559608280E+00 + 3.0653267303435263E+00 3.0666227720204136E+00 3.0679188809844362E+00 3.0692150572285506E+00 3.0705113007457139E+00 + 3.0718076115288873E+00 3.0731039895710315E+00 3.0744004348651179E+00 3.0756969474041131E+00 3.0769935271809921E+00 + 3.0782901741887332E+00 3.0795868884203141E+00 3.0808836698687201E+00 3.0821805185269362E+00 3.0834774343879530E+00 + 3.0847744174447644E+00 3.0860714676903651E+00 3.0873685851177575E+00 3.0886657697199427E+00 3.0899630214899272E+00 + 3.0912603404207202E+00 3.0925577265053343E+00 3.0938551797367895E+00 3.0951527001080983E+00 3.0964502876122864E+00 + 3.0977479422423801E+00 3.0990456639914057E+00 3.1003434528523988E+00 3.1016413088183938E+00 3.1029392318824272E+00 + 3.1042372220375443E+00 3.1055352792767872E+00 3.1068334035932073E+00 3.1081315949798527E+00 3.1094298534297811E+00 + 3.1107281789360486E+00 3.1120265714917181E+00 3.1133250310898530E+00 3.1146235577235211E+00 3.1159221513857935E+00 + 3.1172208120697436E+00 3.1185195397684504E+00 3.1198183344749926E+00 3.1211171961824551E+00 3.1224161248839239E+00 + 3.1237151205724913E+00 3.1250141832412512E+00 3.1263133128832941E+00 3.1276125094917258E+00 3.1289117730596461E+00 + 3.1302111035801636E+00 3.1315105010463857E+00 3.1328099654514254E+00 3.1341094967883998E+00 3.1354090950504254E+00 + 3.1367087602306265E+00 3.1380084923221285E+00 3.1393082913180570E+00 3.1406081572115481E+00 3.1419080899957321E+00 + 3.1432080896637502E+00 3.1445081562087429E+00 3.1458082896238539E+00 3.1471084899022306E+00 3.1484087570370258E+00 + 3.1497090910213905E+00 3.1510094918484834E+00 3.1523099595114648E+00 3.1536104940034972E+00 3.1549110953177513E+00 + 3.1562117634473892E+00 3.1575124983855893E+00 3.1588133001255256E+00 3.1601141686603773E+00 3.1614151039833276E+00 + 3.1627161060875606E+00 3.1640171749662671E+00 3.1653183106126370E+00 3.1666195130198660E+00 3.1679207821811528E+00 + 3.1692221180896967E+00 3.1705235207387035E+00 3.1718249901213809E+00 3.1731265262309387E+00 3.1744281290605909E+00 + 3.1757297986035553E+00 3.1770315348530498E+00 3.1783333378022993E+00 3.1796352074445302E+00 3.1809371437729710E+00 + 3.1822391467808542E+00 3.1835412164614163E+00 3.1848433528078939E+00 3.1861455558135345E+00 3.1874478254715761E+00 + 3.1887501617752694E+00 3.1900525647178664E+00 3.1913550342926222E+00 3.1926575704927913E+00 3.1939601733116363E+00 + 3.1952628427424217E+00 3.1965655787784111E+00 3.1978683814128783E+00 3.1991712506390932E+00 3.2004741864503332E+00 + 3.2017771888398783E+00 3.2030802578010089E+00 3.2043833933270109E+00 3.2056865954111733E+00 3.2069898640467867E+00 + 3.2082931992271471E+00 3.2095966009455510E+00 3.2109000691952989E+00 3.2122036039696966E+00 3.2135072052620499E+00 + 3.2148108730656673E+00 3.2161146073738660E+00 3.2174184081799573E+00 3.2187222754772624E+00 3.2200262092591050E+00 + 3.2213302095188077E+00 3.2226342762497011E+00 3.2239384094451164E+00 3.2252426090983883E+00 3.2265468752028532E+00 + 3.2278512077518542E+00 3.2291556067387317E+00 3.2304600721568355E+00 3.2317646039995136E+00 3.2330692022601202E+00 + 3.2343738669320108E+00 3.2356785980085436E+00 3.2369833954830827E+00 3.2382882593489919E+00 3.2395931895996384E+00 + 3.2408981862283954E+00 3.2422032492286355E+00 3.2435083785937375E+00 3.2448135743170816E+00 3.2461188363920495E+00 + 3.2474241648120326E+00 3.2487295595704131E+00 3.2500350206605866E+00 3.2513405480759494E+00 3.2526461418098989E+00 + 3.2539518018558375E+00 3.2552575282071694E+00 3.2565633208573033E+00 3.2578691797996475E+00 3.2591751050276172E+00 + 3.2604810965346291E+00 3.2617871543141028E+00 3.2630932783594604E+00 3.2643994686641289E+00 3.2657057252215353E+00 + 3.2670120480251121E+00 3.2683184370682952E+00 3.2696248923445199E+00 3.2709314138472299E+00 3.2722380015698653E+00 + 3.2735446555058760E+00 3.2748513756487108E+00 3.2761581619918223E+00 3.2774650145286661E+00 3.2787719332527030E+00 + 3.2800789181573906E+00 3.2813859692361964E+00 3.2826930864825865E+00 3.2840002698900315E+00 3.2853075194520076E+00 + 3.2866148351619890E+00 3.2879222170134570E+00 3.2892296649998936E+00 3.2905371791147835E+00 3.2918447593516156E+00 + 3.2931524057038848E+00 3.2944601181650794E+00 3.2957678967287021E+00 3.2970757413882499E+00 3.2983836521372289E+00 + 3.2996916289691436E+00 3.3009996718775048E+00 3.3023077808558221E+00 3.3036159558976146E+00 3.3049241969963985E+00 + 3.3062325041456946E+00 3.3075408773390276E+00 3.3088493165699275E+00 3.3101578218319188E+00 3.3114663931185371E+00 + 3.3127750304233188E+00 3.3140837337398033E+00 3.3153925030615294E+00 3.3167013383820461E+00 3.3180102396948978E+00 + 3.3193192069936379E+00 3.3206282402718168E+00 3.3219373395229939E+00 3.3232465047407267E+00 3.3245557359185800E+00 + 3.3258650330501167E+00 3.3271743961289064E+00 3.3284838251485200E+00 3.3297933201025307E+00 3.3311028809845178E+00 + 3.3324125077880589E+00 3.3337222005067391E+00 3.3350319591341422E+00 3.3363417836638587E+00 3.3376516740894795E+00 + 3.3389616304045995E+00 3.3402716526028176E+00 3.3415817406777300E+00 3.3428918946229427E+00 3.3442021144320613E+00 + 3.3455124000986958E+00 3.3468227516164570E+00 3.3481331689789613E+00 3.3494436521798265E+00 3.3507542012126721E+00 + 3.3520648160711222E+00 3.3533754967488045E+00 3.3546862432393469E+00 3.3559970555363825E+00 3.3573079336335461E+00 + 3.3586188775244765E+00 3.3599298872028145E+00 3.3612409626622024E+00 3.3625521038962907E+00 3.3638633108987257E+00 + 3.3651745836631606E+00 3.3664859221832524E+00 3.3677973264526564E+00 3.3691087964650381E+00 3.3704203322140573E+00 + 3.3717319336933862E+00 3.3730436008966884E+00 3.3743553338176389E+00 3.3756671324499155E+00 3.3769789967871926E+00 + 3.3782909268231558E+00 3.3796029225514865E+00 3.3809149839658730E+00 3.3822271110600033E+00 3.3835393038275723E+00 + 3.3848515622622757E+00 3.3861638863578110E+00 3.3874762761078774E+00 3.3887887315061831E+00 3.3901012525464327E+00 + 3.3914138392223370E+00 3.3927264915276076E+00 3.3940392094559613E+00 3.3953519930011158E+00 3.3966648421567935E+00 + 3.3979777569167160E+00 3.3992907372746139E+00 3.4006037832242137E+00 3.4019168947592515E+00 3.4032300718734585E+00 + 3.4045433145605748E+00 3.4058566228143414E+00 3.4071699966285034E+00 3.4084834359968061E+00 3.4097969409129996E+00 + 3.4111105113708367E+00 3.4124241473640717E+00 3.4137378488864636E+00 3.4150516159317736E+00 3.4163654484937647E+00 + 3.4176793465662039E+00 3.4189933101428598E+00 3.4203073392175050E+00 3.4216214337839141E+00 3.4229355938358661E+00 + 3.4242498193671409E+00 3.4255641103715218E+00 3.4268784668427950E+00 3.4281928887747495E+00 3.4295073761611774E+00 + 3.4308219289958743E+00 3.4321365472726351E+00 3.4334512309852641E+00 3.4347659801275592E+00 3.4360807946933289E+00 + 3.4373956746763814E+00 3.4387106200705286E+00 3.4400256308695845E+00 3.4413407070673654E+00 3.4426558486576928E+00 + 3.4439710556343872E+00 3.4452863279912753E+00 3.4466016657221847E+00 3.4479170688209471E+00 3.4492325372813952E+00 + 3.4505480710973666E+00 3.4518636702626990E+00 3.4531793347712361E+00 3.4544950646168218E+00 3.4558108597933033E+00 + 3.4571267202945313E+00 3.4584426461143596E+00 3.4597586372466433E+00 3.4610746936852408E+00 3.4623908154240155E+00 + 3.4637070024568279E+00 3.4650232547775524E+00 3.4663395723800488E+00 3.4676559552581949E+00 3.4689724034058655E+00 + 3.4702889168169384E+00 3.4716054954852935E+00 3.4729221394048153E+00 3.4742388485693905E+00 3.4755556229729070E+00 + 3.4768724626092573E+00 3.4781893674723343E+00 3.4795063375560380E+00 3.4808233728542644E+00 3.4821404733609214E+00 + 3.4834576390699090E+00 3.4847748699751384E+00 3.4860921660705220E+00 3.4874095273499699E+00 3.4887269538074008E+00 + 3.4900444454367321E+00 3.4913620022318881E+00 3.4926796241867910E+00 3.4939973112953693E+00 3.4953150635515562E+00 + 3.4966328809492775E+00 3.4979507634824731E+00 3.4992687111450809E+00 3.5005867239310402E+00 3.5019048018342960E+00 + 3.5032229448487944E+00 3.5045411529684847E+00 3.5058594261873179E+00 3.5071777644992501E+00 3.5084961678982367E+00 + 3.5098146363782390E+00 3.5111331699332191E+00 3.5124517685571415E+00 3.5137704322439758E+00 3.5150891609876918E+00 + 3.5164079547822631E+00 3.5177268136216657E+00 3.5190457374998783E+00 3.5203647264108833E+00 3.5216837803486647E+00 + 3.5230028993072087E+00 3.5243220832805062E+00 3.5256413322625475E+00 3.5269606462473324E+00 3.5282800252288515E+00 + 3.5295994692011088E+00 3.5309189781581081E+00 3.5322385520938537E+00 3.5335581910023537E+00 3.5348778948776212E+00 + 3.5361976637136685E+00 3.5375174975045129E+00 3.5388373962441739E+00 3.5401573599266714E+00 3.5414773885460309E+00 + 3.5427974820962804E+00 3.5441176405714492E+00 3.5454378639655699E+00 3.5467581522726772E+00 3.5480785054868083E+00 + 3.5493989236020056E+00 3.5507194066123109E+00 3.5520399545117698E+00 3.5533605672944319E+00 3.5546812449543483E+00 + 3.5560019874855722E+00 3.5573227948821597E+00 3.5586436671381736E+00 3.5599646042476691E+00 3.5612856062047151E+00 + 3.5626066730033759E+00 3.5639278046377236E+00 3.5652490011018303E+00 3.5665702623897708E+00 3.5678915884956210E+00 + 3.5692129794134644E+00 3.5705344351373820E+00 3.5718559556614582E+00 3.5731775409797835E+00 3.5744991910864474E+00 + 3.5758209059755441E+00 3.5771426856411690E+00 3.5784645300774218E+00 3.5797864392784025E+00 3.5811084132382165E+00 + 3.5824304519509695E+00 3.5837525554107716E+00 3.5850747236117337E+00 3.5863969565479721E+00 3.5877192542136007E+00 + 3.5890416166027443E+00 3.5903640437095197E+00 3.5916865355280558E+00 3.5930090920524771E+00 3.5943317132769161E+00 + 3.5956543991955039E+00 3.5969771498023775E+00 3.5982999650916745E+00 3.5996228450575352E+00 3.6009457896941033E+00 + 3.6022687989955249E+00 3.6035918729559469E+00 3.6049150115695223E+00 3.6062382148304040E+00 3.6075614827327480E+00 + 3.6088848152707143E+00 3.6102082124384616E+00 3.6115316742301586E+00 3.6128552006399666E+00 3.6141787916620594E+00 + 3.6155024472906065E+00 3.6168261675197830E+00 3.6181499523437646E+00 3.6194738017567327E+00 3.6207977157528717E+00 + 3.6221216943263594E+00 3.6234457374713887E+00 3.6247698451821480E+00 3.6260940174528287E+00 3.6274182542776270E+00 + 3.6287425556507418E+00 3.6300669215663719E+00 3.6313913520187202E+00 3.6327158470019927E+00 3.6340404065103971E+00 + 3.6353650305381420E+00 3.6366897190794445E+00 3.6380144721285173E+00 3.6393392896795795E+00 3.6406641717268520E+00 + 3.6419891182645570E+00 3.6433141292869218E+00 3.6446392047881746E+00 3.6459643447625467E+00 3.6472895492042712E+00 + 3.6486148181075841E+00 3.6499401514667245E+00 3.6512655492759367E+00 3.6525910115294566E+00 3.6539165382215373E+00 + 3.6552421293464255E+00 3.6565677848983724E+00 3.6578935048716330E+00 3.6592192892604629E+00 3.6605451380591219E+00 + 3.6618710512618713E+00 3.6631970288629754E+00 3.6645230708567005E+00 3.6658491772373161E+00 3.6671753479990943E+00 + 3.6685015831363081E+00 3.6698278826432373E+00 3.6711542465141580E+00 3.6724806747433547E+00 3.6738071673251098E+00 + 3.6751337242537110E+00 3.6764603455234481E+00 3.6777870311286120E+00 3.6791137810634993E+00 3.6804405953224064E+00 + 3.6817674738996309E+00 3.6830944167894799E+00 3.6844214239862523E+00 3.6857484954842561E+00 3.6870756312778039E+00 + 3.6884028313612047E+00 3.6897300957287760E+00 3.6910574243748329E+00 3.6923848172936959E+00 3.6937122744796875E+00 + 3.6950397959271317E+00 3.6963673816303566E+00 3.6976950315836912E+00 3.6990227457814679E+00 3.7003505242180208E+00 + 3.7016783668876894E+00 3.7030062737848102E+00 3.7043342449037278E+00 3.7056622802387862E+00 3.7069903797843331E+00 + 3.7083185435347175E+00 3.7096467714842905E+00 3.7109750636274086E+00 3.7123034199584288E+00 3.7136318404717095E+00 + 3.7149603251616168E+00 3.7162888740225086E+00 3.7176174870487562E+00 3.7189461642347297E+00 3.7202749055747990E+00 + 3.7216037110633393E+00 3.7229325806947284E+00 3.7242615144633455E+00 3.7255905123635729E+00 3.7269195743897932E+00 + 3.7282487005363958E+00 3.7295778907977692E+00 3.7309071451683051E+00 3.7322364636423973E+00 3.7335658462144434E+00 + 3.7348952928788424E+00 3.7362248036299963E+00 3.7375543784623080E+00 3.7388840173701858E+00 3.7402137203480379E+00 + 3.7415434873902766E+00 3.7428733184913150E+00 3.7442032136455707E+00 3.7455331728474639E+00 3.7468631960914114E+00 + 3.7481932833718399E+00 3.7495234346831752E+00 3.7508536500198466E+00 3.7521839293762849E+00 3.7535142727469246E+00 + 3.7548446801262001E+00 3.7561751515085509E+00 3.7575056868884178E+00 3.7588362862602445E+00 3.7601669496184766E+00 + 3.7614976769575632E+00 3.7628284682719526E+00 3.7641593235561008E+00 3.7654902428044630E+00 3.7668212260114950E+00 + 3.7681522731716584E+00 3.7694833842794178E+00 3.7708145593292355E+00 + 1.2958085329481928E-01 1.2958084943300893E-01 1.2958083784757826E-01 1.2958081853852829E-01 1.2958079150586077E-01 + 1.2958075674957811E-01 1.2958071426968340E-01 1.2958066406618043E-01 1.2958060613907371E-01 1.2958054048836845E-01 + 1.2958046711407045E-01 1.2958038601618627E-01 1.2958029719472322E-01 1.2958020064968923E-01 1.2958009638109280E-01 + 1.2957998438894344E-01 1.2957986467325097E-01 1.2957973723402622E-01 1.2957960207128050E-01 1.2957945918502589E-01 + 1.2957930857527514E-01 1.2957915024204175E-01 1.2957898418533975E-01 1.2957881040518404E-01 1.2957862890159008E-01 + 1.2957843967457405E-01 1.2957824272415286E-01 1.2957803805034404E-01 1.2957782565316583E-01 1.2957760553263714E-01 + 1.2957737768877767E-01 1.2957714212160759E-01 1.2957689883114798E-01 1.2957664781742037E-01 1.2957638908044719E-01 + 1.2957612262025145E-01 1.2957584843685682E-01 1.2957556653028771E-01 1.2957527690056914E-01 1.2957497954772679E-01 + 1.2957467447178722E-01 1.2957436167277739E-01 1.2957404115072510E-01 1.2957371290565878E-01 1.2957337693760754E-01 + 1.2957303324660116E-01 1.2957268183267012E-01 1.2957232269584554E-01 1.2957195583615919E-01 1.2957158125364351E-01 + 1.2957119894833172E-01 1.2957080892025760E-01 1.2957041116945558E-01 1.2957000569596086E-01 1.2956959249980923E-01 + 1.2956917158103709E-01 1.2956874293968165E-01 1.2956830657578070E-01 1.2956786248937260E-01 1.2956741068049660E-01 + 1.2956695114919242E-01 1.2956648389550049E-01 1.2956600891946188E-01 1.2956552622111839E-01 1.2956503580051237E-01 + 1.2956453765768688E-01 1.2956403179268566E-01 1.2956351820555304E-01 1.2956299689633405E-01 1.2956246786507433E-01 + 1.2956193111182018E-01 1.2956138663661856E-01 1.2956083443951710E-01 1.2956027452056396E-01 1.2955970687980811E-01 + 1.2955913151729903E-01 1.2955854843308687E-01 1.2955795762722244E-01 1.2955735909975719E-01 1.2955675285074317E-01 + 1.2955613888023312E-01 1.2955551718828037E-01 1.2955488777493887E-01 1.2955425064026324E-01 1.2955360578430869E-01 + 1.2955295320713109E-01 1.2955229290878689E-01 1.2955162488933325E-01 1.2955094914882787E-01 1.2955026568732905E-01 + 1.2954957450489576E-01 1.2954887560158765E-01 1.2954816897746485E-01 1.2954745463258818E-01 1.2954673256701910E-01 + 1.2954600278081957E-01 1.2954526527405233E-01 1.2954452004678055E-01 1.2954376709906804E-01 1.2954300643097932E-01 + 1.2954223804257944E-01 1.2954146193393407E-01 1.2954067810510939E-01 1.2953988655617232E-01 1.2953908728719027E-01 + 1.2953828029823125E-01 1.2953746558936396E-01 1.2953664316065752E-01 1.2953581301218176E-01 1.2953497514400711E-01 + 1.2953412955620444E-01 1.2953327624884536E-01 1.2953241522200196E-01 1.2953154647574697E-01 1.2953067001015361E-01 + 1.2952978582529576E-01 1.2952889392124783E-01 1.2952799429808484E-01 1.2952708695588225E-01 1.2952617189471619E-01 + 1.2952524911466337E-01 1.2952431861580099E-01 1.2952338039820685E-01 1.2952243446195930E-01 1.2952148080713718E-01 + 1.2952051943382001E-01 1.2951955034208770E-01 1.2951857353202084E-01 1.2951758900370050E-01 1.2951659675720828E-01 + 1.2951559679262634E-01 1.2951458911003735E-01 1.2951357370952463E-01 1.2951255059117184E-01 1.2951151975506334E-01 + 1.2951048120128383E-01 1.2950943492991879E-01 1.2950838094105399E-01 1.2950731923477579E-01 1.2950624981117112E-01 + 1.2950517267032743E-01 1.2950408781233258E-01 1.2950299523727496E-01 1.2950189494524361E-01 1.2950078693632786E-01 + 1.2949967121061770E-01 1.2949854776820355E-01 1.2949741660917632E-01 1.2949627773362749E-01 1.2949513114164896E-01 + 1.2949397683333302E-01 1.2949281480877267E-01 1.2949164506806130E-01 1.2949046761129263E-01 1.2948928243856106E-01 + 1.2948808954996135E-01 1.2948688894558880E-01 1.2948568062553914E-01 1.2948446458990850E-01 1.2948324083879362E-01 + 1.2948200937229157E-01 1.2948077019049992E-01 1.2947952329351670E-01 1.2947826868144044E-01 1.2947700635436998E-01 + 1.2947573631240472E-01 1.2947445855564449E-01 1.2947317308418951E-01 1.2947187989814046E-01 1.2947057899759842E-01 + 1.2946927038266504E-01 1.2946795405344216E-01 1.2946663001003225E-01 1.2946529825253802E-01 1.2946395878106282E-01 + 1.2946261159571024E-01 1.2946125669658431E-01 1.2945989408378947E-01 1.2945852375743061E-01 1.2945714571761299E-01 + 1.2945575996444225E-01 1.2945436649802441E-01 1.2945296531846598E-01 1.2945155642587372E-01 1.2945013982035483E-01 + 1.2944871550201692E-01 1.2944728347096796E-01 1.2944584372731632E-01 1.2944439627117063E-01 1.2944294110264004E-01 + 1.2944147822183394E-01 1.2944000762886215E-01 1.2943852932383482E-01 1.2943704330686243E-01 1.2943554957805589E-01 + 1.2943404813752629E-01 1.2943253898538534E-01 1.2943102212174476E-01 1.2942949754671684E-01 1.2942796526041414E-01 + 1.2942642526294951E-01 1.2942487755443610E-01 1.2942332213498750E-01 1.2942175900471753E-01 1.2942018816374029E-01 + 1.2941860961217030E-01 1.2941702335012231E-01 1.2941542937771133E-01 1.2941382769505272E-01 1.2941221830226218E-01 + 1.2941060119945563E-01 1.2940897638674934E-01 1.2940734386425978E-01 1.2940570363210371E-01 1.2940405569039828E-01 + 1.2940240003926076E-01 1.2940073667880875E-01 1.2939906560916017E-01 1.2939738683043309E-01 1.2939570034274592E-01 + 1.2939400614621729E-01 1.2939230424096604E-01 1.2939059462711133E-01 1.2938887730477250E-01 1.2938715227406913E-01 + 1.2938541953512114E-01 1.2938367908804843E-01 1.2938193093297137E-01 1.2938017507001040E-01 1.2937841149928628E-01 + 1.2937664022091988E-01 1.2937486123503233E-01 1.2937307454174496E-01 1.2937128014117935E-01 1.2936947803345711E-01 + 1.2936766821870013E-01 1.2936585069703060E-01 1.2936402546857073E-01 1.2936219253344297E-01 1.2936035189176995E-01 + 1.2935850354367442E-01 1.2935664748927933E-01 1.2935478372870776E-01 1.2935291226208301E-01 1.2935103308952850E-01 + 1.2934914621116772E-01 1.2934725162712438E-01 1.2934534933752229E-01 1.2934343934248549E-01 1.2934152164213802E-01 + 1.2933959623660402E-01 1.2933766312600792E-01 1.2933572231047413E-01 1.2933377379012717E-01 1.2933181756509171E-01 + 1.2932985363549254E-01 1.2932788200145443E-01 1.2932590266310237E-01 1.2932391562056145E-01 1.2932192087395666E-01 + 1.2931991842341323E-01 1.2931790826905643E-01 1.2931589041101152E-01 1.2931386484940396E-01 1.2931183158435916E-01 + 1.2930979061600259E-01 1.2930774194445982E-01 1.2930568556985644E-01 1.2930362149231808E-01 1.2930154971197033E-01 + 1.2929947022893895E-01 1.2929738304334965E-01 1.2929528815532806E-01 1.2929318556500000E-01 1.2929107527249117E-01 + 1.2928895727792736E-01 1.2928683158143434E-01 1.2928469818313781E-01 1.2928255708316352E-01 1.2928040828163717E-01 + 1.2927825177868446E-01 1.2927608757443110E-01 1.2927391566900268E-01 1.2927173606252479E-01 1.2926954875512298E-01 + 1.2926735374692286E-01 1.2926515103804975E-01 1.2926294062862917E-01 1.2926072251878637E-01 1.2925849670864667E-01 + 1.2925626319833525E-01 1.2925402198797725E-01 1.2925177307769770E-01 1.2924951646762148E-01 1.2924725215787358E-01 + 1.2924498014857863E-01 1.2924270043986136E-01 1.2924041303184622E-01 1.2923811792465775E-01 1.2923581511842011E-01 + 1.2923350461325761E-01 1.2923118640929426E-01 1.2922886050665391E-01 1.2922652690546038E-01 1.2922418560583726E-01 + 1.2922183660790804E-01 1.2921947991179597E-01 1.2921711551762427E-01 1.2921474342551584E-01 1.2921236363559349E-01 + 1.2920997614797988E-01 1.2920758096279741E-01 1.2920517808016826E-01 1.2920276750021453E-01 1.2920034922305798E-01 + 1.2919792324882037E-01 1.2919548957762292E-01 1.2919304820958699E-01 1.2919059914483347E-01 1.2918814238348300E-01 + 1.2918567792565624E-01 1.2918320577147324E-01 1.2918072592105417E-01 1.2917823837451872E-01 1.2917574313198632E-01 + 1.2917324019357623E-01 1.2917072955940737E-01 1.2916821122959835E-01 1.2916568520426769E-01 1.2916315148353333E-01 + 1.2916061006751317E-01 1.2915806095632459E-01 1.2915550415008487E-01 1.2915293964891078E-01 1.2915036745291894E-01 + 1.2914778756222556E-01 1.2914519997694648E-01 1.2914260469719729E-01 1.2914000172309317E-01 1.2913739105474900E-01 + 1.2913477269227924E-01 1.2913214663579803E-01 1.2912951288541916E-01 1.2912687144125604E-01 1.2912422230342158E-01 + 1.2912156547202852E-01 1.2911890094718900E-01 1.2911622872901496E-01 1.2911354881761766E-01 1.2911086121310827E-01 + 1.2910816591559726E-01 1.2910546292519487E-01 1.2910275224201084E-01 1.2910003386615443E-01 1.2909730779773451E-01 + 1.2909457403685951E-01 1.2909183258363738E-01 1.2908908343817554E-01 1.2908632660058109E-01 1.2908356207096053E-01 + 1.2908078984941995E-01 1.2907800993606489E-01 1.2907522233100044E-01 1.2907242703433119E-01 1.2906962404616126E-01 + 1.2906681336659409E-01 1.2906399499573284E-01 1.2906116893367992E-01 1.2905833518053733E-01 1.2905549373640651E-01 + 1.2905264460138838E-01 1.2904978777558324E-01 1.2904692325909087E-01 1.2904405105201047E-01 1.2904117115444069E-01 + 1.2903828356647953E-01 1.2903538828822453E-01 1.2903248531977252E-01 1.2902957466121981E-01 1.2902665631266200E-01 + 1.2902373027419423E-01 1.2902079654591081E-01 1.2901785512790567E-01 1.2901490602027191E-01 1.2901194922310211E-01 + 1.2900898473648806E-01 1.2900601256052105E-01 1.2900303269529165E-01 1.2900004514088978E-01 1.2899704989740460E-01 + 1.2899404696492470E-01 1.2899103634353787E-01 1.2898801803333132E-01 1.2898499203439151E-01 1.2898195834680415E-01 + 1.2897891697065422E-01 1.2897586790602611E-01 1.2897281115300335E-01 1.2896974671166878E-01 1.2896667458210445E-01 + 1.2896359476439173E-01 1.2896050725861119E-01 1.2895741206484265E-01 1.2895430918316511E-01 1.2895119861365686E-01 + 1.2894808035639535E-01 1.2894495441145726E-01 1.2894182077891841E-01 1.2893867945885396E-01 1.2893553045133804E-01 + 1.2893237375644415E-01 1.2892920937424485E-01 1.2892603730481189E-01 1.2892285754821617E-01 1.2891967010452771E-01 + 1.2891647497381578E-01 1.2891327215614864E-01 1.2891006165159377E-01 1.2890684346021772E-01 1.2890361758208616E-01 + 1.2890038401726386E-01 1.2889714276581477E-01 1.2889389382780170E-01 1.2889063720328683E-01 1.2888737289233121E-01 + 1.2888410089499505E-01 1.2888082121133759E-01 1.2887753384141709E-01 1.2887423878529092E-01 1.2887093604301542E-01 + 1.2886762561464596E-01 1.2886430750023703E-01 1.2886098169984200E-01 1.2885764821351334E-01 1.2885430704130246E-01 + 1.2885095818325976E-01 1.2884760163943473E-01 1.2884423740987563E-01 1.2884086549462992E-01 1.2883748589374383E-01 + 1.2883409860726264E-01 1.2883070363523055E-01 1.2882730097769068E-01 1.2882389063468511E-01 1.2882047260625479E-01 + 1.2881704689243970E-01 1.2881361349327861E-01 1.2881017240880915E-01 1.2880672363906795E-01 1.2880326718409058E-01 + 1.2879980304391120E-01 1.2879633121856315E-01 1.2879285170807847E-01 1.2878936451248807E-01 1.2878586963182165E-01 + 1.2878236706610791E-01 1.2877885681537421E-01 1.2877533887964679E-01 1.2877181325895068E-01 1.2876827995330972E-01 + 1.2876473896274662E-01 1.2876119028728281E-01 1.2875763392693837E-01 1.2875406988173235E-01 1.2875049815168252E-01 + 1.2874691873680533E-01 1.2874333163711607E-01 1.2873973685262860E-01 1.2873613438335574E-01 1.2873252422930884E-01 + 1.2872890639049808E-01 1.2872528086693227E-01 1.2872164765861893E-01 1.2871800676556436E-01 1.2871435818777341E-01 + 1.2871070192524967E-01 1.2870703797799535E-01 1.2870336634601137E-01 1.2869968702929729E-01 1.2869600002785128E-01 + 1.2869230534167012E-01 1.2868860297074927E-01 1.2868489291508278E-01 1.2868117517466329E-01 1.2867744974948203E-01 + 1.2867371663952890E-01 1.2866997584479223E-01 1.2866622736525909E-01 1.2866247120091495E-01 1.2865870735174398E-01 + 1.2865493581772877E-01 1.2865115659885060E-01 1.2864736969508908E-01 1.2864357510642252E-01 1.2863977283282763E-01 + 1.2863596287427967E-01 1.2863214523075245E-01 1.2862831990221807E-01 1.2862448688864739E-01 1.2862064619000949E-01 + 1.2861679780627208E-01 1.2861294173740118E-01 1.2860907798336138E-01 1.2860520654411561E-01 1.2860132741962535E-01 + 1.2859744060985032E-01 1.2859354611474874E-01 1.2858964393427733E-01 1.2858573406839102E-01 1.2858181651704320E-01 + 1.2857789128018565E-01 1.2857395835776853E-01 1.2857001774974028E-01 1.2856606945604779E-01 1.2856211347663621E-01 + 1.2855814981144903E-01 1.2855417846042808E-01 1.2855019942351348E-01 1.2854621270064370E-01 1.2854221829175538E-01 + 1.2853821619678366E-01 1.2853420641566174E-01 1.2853018894832122E-01 1.2852616379469192E-01 1.2852213095470183E-01 + 1.2851809042827733E-01 1.2851404221534293E-01 1.2850998631582139E-01 1.2850592272963368E-01 1.2850185145669896E-01 + 1.2849777249693459E-01 1.2849368585025614E-01 1.2848959151657732E-01 1.2848548949581012E-01 1.2848137978786442E-01 + 1.2847726239264859E-01 1.2847313731006885E-01 1.2846900454002980E-01 1.2846486408243393E-01 1.2846071593718197E-01 + 1.2845656010417278E-01 1.2845239658330321E-01 1.2844822537446826E-01 1.2844404647756108E-01 1.2843985989247270E-01 + 1.2843566561909234E-01 1.2843146365730720E-01 1.2842725400700267E-01 1.2842303666806199E-01 1.2841881164036642E-01 + 1.2841457892379540E-01 1.2841033851822620E-01 1.2840609042353421E-01 1.2840183463959262E-01 1.2839757116627287E-01 + 1.2839330000344407E-01 1.2838902115097350E-01 1.2838473460872629E-01 1.2838044037656551E-01 1.2837613845435220E-01 + 1.2837182884194520E-01 1.2836751153920142E-01 1.2836318654597553E-01 1.2835885386212018E-01 1.2835451348748589E-01 + 1.2835016542192093E-01 1.2834580966527159E-01 1.2834144621738194E-01 1.2833707507809380E-01 1.2833269624724702E-01 + 1.2832830972467915E-01 1.2832391551022543E-01 1.2831951360371918E-01 1.2831510400499130E-01 1.2831068671387053E-01 + 1.2830626173018339E-01 1.2830182905375417E-01 1.2829738868440488E-01 1.2829294062195534E-01 1.2828848486622299E-01 + 1.2828402141702308E-01 1.2827955027416862E-01 1.2827507143747022E-01 1.2827058490673621E-01 1.2826609068177258E-01 + 1.2826158876238308E-01 1.2825707914836912E-01 1.2825256183952960E-01 1.2824803683566133E-01 1.2824350413655849E-01 + 1.2823896374201310E-01 1.2823441565181465E-01 1.2822985986575028E-01 1.2822529638360478E-01 1.2822072520516042E-01 + 1.2821614633019712E-01 1.2821155975849238E-01 1.2820696548982125E-01 1.2820236352395620E-01 1.2819775386066742E-01 + 1.2819313649972250E-01 1.2818851144088664E-01 1.2818387868392242E-01 1.2817923822859001E-01 1.2817459007464713E-01 + 1.2816993422184875E-01 1.2816527066994754E-01 1.2816059941869348E-01 1.2815592046783408E-01 1.2815123381711421E-01 + 1.2814653946627624E-01 1.2814183741505994E-01 1.2813712766320240E-01 1.2813241021043820E-01 1.2812768505649921E-01 + 1.2812295220111483E-01 1.2811821164401169E-01 1.2811346338491375E-01 1.2810870742354247E-01 1.2810394375961648E-01 + 1.2809917239285182E-01 1.2809439332296182E-01 1.2808960654965712E-01 1.2808481207264560E-01 1.2808000989163254E-01 + 1.2807520000632033E-01 1.2807038241640875E-01 1.2806555712159484E-01 1.2806072412157271E-01 1.2805588341603388E-01 + 1.2805103500466700E-01 1.2804617888715797E-01 1.2804131506318989E-01 1.2803644353244301E-01 1.2803156429459475E-01 + 1.2802667734931975E-01 1.2802178269628975E-01 1.2801688033517367E-01 1.2801197026563757E-01 1.2800705248734465E-01 + 1.2800212699995520E-01 1.2799719380312652E-01 1.2799225289651317E-01 1.2798730427976668E-01 1.2798234795253571E-01 + 1.2797738391446592E-01 1.2797241216520017E-01 1.2796743270437813E-01 1.2796244553163666E-01 1.2795745064660960E-01 + 1.2795244804892783E-01 1.2794743773821915E-01 1.2794241971410836E-01 1.2793739397621737E-01 1.2793236052416487E-01 + 1.2792731935756657E-01 1.2792227047603519E-01 1.2791721387918037E-01 1.2791214956660854E-01 1.2790707753792324E-01 + 1.2790199779272468E-01 1.2789691033061021E-01 1.2789181515117390E-01 1.2788671225400672E-01 1.2788160163869650E-01 + 1.2787648330482798E-01 1.2787135725198254E-01 1.2786622347973864E-01 1.2786108198767146E-01 1.2785593277535287E-01 + 1.2785077584235172E-01 1.2784561118823345E-01 1.2784043881256041E-01 1.2783525871489171E-01 1.2783007089478310E-01 + 1.2782487535178716E-01 1.2781967208545317E-01 1.2781446109532713E-01 1.2780924238095173E-01 1.2780401594186638E-01 + 1.2779878177760712E-01 1.2779353988770678E-01 1.2778829027169472E-01 1.2778303292909704E-01 1.2777776785943637E-01 + 1.2777249506223212E-01 1.2776721453700018E-01 1.2776192628325314E-01 1.2775663030050011E-01 1.2775132658824692E-01 + 1.2774601514599573E-01 1.2774069597324547E-01 1.2773536906949157E-01 1.2773003443422598E-01 1.2772469206693718E-01 + 1.2771934196711013E-01 1.2771398413422638E-01 1.2770861856776397E-01 1.2770324526719729E-01 1.2769786423199733E-01 + 1.2769247546163148E-01 1.2768707895556372E-01 1.2768167471325420E-01 1.2767626273415975E-01 1.2767084301773343E-01 + 1.2766541556342489E-01 1.2765998037068002E-01 1.2765453743894115E-01 1.2764908676764700E-01 1.2764362835623261E-01 + 1.2763816220412932E-01 1.2763268831076496E-01 1.2762720667556354E-01 1.2762171729794547E-01 1.2761622017732741E-01 + 1.2761071531312243E-01 1.2760520270473960E-01 1.2759968235158456E-01 1.2759415425305909E-01 1.2758861840856112E-01 + 1.2758307481748501E-01 1.2757752347922122E-01 1.2757196439315643E-01 1.2756639755867349E-01 1.2756082297515153E-01 + 1.2755524064196580E-01 1.2754965055848771E-01 1.2754405272408481E-01 1.2753844713812085E-01 1.2753283379995570E-01 + 1.2752721270894524E-01 1.2752158386444160E-01 1.2751594726579299E-01 1.2751030291234355E-01 1.2750465080343371E-01 + 1.2749899093839986E-01 1.2749332331657434E-01 1.2748764793728576E-01 1.2748196479985846E-01 1.2747627390361310E-01 + 1.2747057524786612E-01 1.2746486883193009E-01 1.2745915465511345E-01 1.2745343271672069E-01 1.2744770301605218E-01 + 1.2744196555240439E-01 1.2743622032506949E-01 1.2743046733333574E-01 1.2742470657648727E-01 1.2741893805380414E-01 + 1.2741316176456216E-01 1.2740737770803320E-01 1.2740158588348494E-01 1.2739578629018075E-01 1.2738997892738008E-01 + 1.2738416379433801E-01 1.2737834089030561E-01 1.2737251021452958E-01 1.2736667176625249E-01 1.2736082554471279E-01 + 1.2735497154914452E-01 1.2734910977877764E-01 1.2734324023283769E-01 1.2733736291054604E-01 1.2733147781111981E-01 + 1.2732558493377172E-01 1.2731968427771034E-01 1.2731377584213982E-01 1.2730785962625993E-01 1.2730193562926626E-01 + 1.2729600385034992E-01 1.2729006428869771E-01 1.2728411694349204E-01 1.2727816181391097E-01 1.2727219889912808E-01 + 1.2726622819831263E-01 1.2726024971062941E-01 1.2725426343523882E-01 1.2724826937129669E-01 1.2724226751795462E-01 + 1.2723625787435944E-01 1.2723024043965375E-01 1.2722421521297558E-01 1.2721818219345837E-01 1.2721214138023118E-01 + 1.2720609277241840E-01 1.2720003636914001E-01 1.2719397216951131E-01 1.2718790017264314E-01 1.2718182037764172E-01 + 1.2717573278360864E-01 1.2716963738964093E-01 1.2716353419483103E-01 1.2715742319826664E-01 1.2715130439903102E-01 + 1.2714517779620255E-01 1.2713904338885509E-01 1.2713290117605783E-01 1.2712675115687522E-01 1.2712059333036690E-01 + 1.2711442769558809E-01 1.2710825425158900E-01 1.2710207299741530E-01 1.2709588393210774E-01 1.2708968705470247E-01 + 1.2708348236423070E-01 1.2707726985971907E-01 1.2707104954018922E-01 1.2706482140465808E-01 1.2705858545213777E-01 + 1.2705234168163543E-01 1.2704609009215359E-01 1.2703983068268973E-01 1.2703356345223654E-01 1.2702728839978181E-01 + 1.2702100552430842E-01 1.2701471482479440E-01 1.2700841630021276E-01 1.2700210994953165E-01 1.2699579577171430E-01 + 1.2698947376571887E-01 1.2698314393049867E-01 1.2697680626500193E-01 1.2697046076817198E-01 1.2696410743894704E-01 + 1.2695774627626044E-01 1.2695137727904027E-01 1.2694500044620985E-01 1.2693861577668725E-01 1.2693222326938550E-01 + 1.2692582292321253E-01 1.2691941473707130E-01 1.2691299870985956E-01 1.2690657484046994E-01 1.2690014312778994E-01 + 1.2689370357070201E-01 1.2688725616808325E-01 1.2688080091880580E-01 1.2687433782173649E-01 1.2686786687573703E-01 + 1.2686138807966388E-01 1.2685490143236822E-01 1.2684840693269614E-01 1.2684190457948838E-01 1.2683539437158051E-01 + 1.2682887630780271E-01 1.2682235038697992E-01 1.2681581660793192E-01 1.2680927496947306E-01 1.2680272547041230E-01 + 1.2679616810955341E-01 1.2678960288569477E-01 1.2678302979762940E-01 1.2677644884414491E-01 1.2676986002402357E-01 + 1.2676326333604229E-01 1.2675665877897244E-01 1.2675004635158021E-01 1.2674342605262612E-01 1.2673679788086528E-01 + 1.2673016183504751E-01 1.2672351791391698E-01 1.2671686611621250E-01 1.2671020644066722E-01 1.2670353888600899E-01 + 1.2669686345096001E-01 1.2669018013423697E-01 1.2668348893455103E-01 1.2667678985060779E-01 1.2667008288110720E-01 + 1.2666336802474382E-01 1.2665664528020637E-01 1.2664991464617814E-01 1.2664317612133677E-01 1.2663642970435415E-01 + 1.2662967539389663E-01 1.2662291318862490E-01 1.2661614308719396E-01 1.2660936508825305E-01 1.2660257919044585E-01 + 1.2659578539241020E-01 1.2658898369277827E-01 1.2658217409017652E-01 1.2657535658322566E-01 1.2656853117054051E-01 + 1.2656169785073032E-01 1.2655485662239843E-01 1.2654800748414233E-01 1.2654115043455386E-01 1.2653428547221884E-01 + 1.2652741259571745E-01 1.2652053180362377E-01 1.2651364309450630E-01 1.2650674646692747E-01 1.2649984191944391E-01 + 1.2649292945060620E-01 1.2648600905895921E-01 1.2647908074304176E-01 1.2647214450138677E-01 1.2646520033252112E-01 + 1.2645824823496590E-01 1.2645128820723603E-01 1.2644432024784050E-01 1.2643734435528237E-01 1.2643036052805859E-01 + 1.2642336876466009E-01 1.2641636906357182E-01 1.2640936142327258E-01 1.2640234584223520E-01 1.2639532231892631E-01 + 1.2638829085180656E-01 1.2638125143933038E-01 1.2637420407994618E-01 1.2636714877209618E-01 1.2636008551421649E-01 + 1.2635301430473697E-01 1.2634593514208137E-01 1.2633884802466730E-01 1.2633175295090610E-01 1.2632464991920289E-01 + 1.2631753892795661E-01 1.2631041997555997E-01 1.2630329306039936E-01 1.2629615818085499E-01 1.2628901533530065E-01 + 1.2628186452210408E-01 1.2627470573962649E-01 1.2626753898622284E-01 1.2626036426024184E-01 1.2625318156002577E-01 + 1.2624599088391056E-01 1.2623879223022583E-01 1.2623158559729475E-01 1.2622437098343417E-01 1.2621714838695444E-01 + 1.2620991780615959E-01 1.2620267923934711E-01 1.2619543268480810E-01 1.2618817814082725E-01 1.2618091560568270E-01 + 1.2617364507764617E-01 1.2616636655498276E-01 1.2615908003595125E-01 1.2615178551880371E-01 1.2614448300178574E-01 + 1.2613717248313647E-01 1.2612985396108833E-01 1.2612252743386726E-01 1.2611519289969261E-01 1.2610785035677707E-01 + 1.2610049980332680E-01 1.2609314123754120E-01 1.2608577465761317E-01 1.2607840006172893E-01 1.2607101744806787E-01 + 1.2606362681480296E-01 1.2605622816010026E-01 1.2604882148211921E-01 1.2604140677901257E-01 1.2603398404892621E-01 + 1.2602655328999951E-01 1.2601911450036482E-01 1.2601166767814789E-01 1.2600421282146765E-01 1.2599674992843618E-01 + 1.2598927899715878E-01 1.2598180002573395E-01 1.2597431301225331E-01 1.2596681795480166E-01 1.2595931485145692E-01 + 1.2595180370029010E-01 1.2594428449936540E-01 1.2593675724674006E-01 1.2592922194046435E-01 1.2592167857858177E-01 + 1.2591412715912872E-01 1.2590656768013472E-01 1.2589900013962227E-01 1.2589142453560698E-01 1.2588384086609733E-01 + 1.2587624912909492E-01 1.2586864932259428E-01 1.2586104144458285E-01 1.2585342549304107E-01 1.2584580146594235E-01 + 1.2583816936125300E-01 1.2583052917693219E-01 1.2582288091093208E-01 1.2581522456119762E-01 1.2580756012566677E-01 + 1.2579988760227012E-01 1.2579220698893140E-01 1.2578451828356693E-01 1.2577682148408595E-01 1.2576911658839052E-01 + 1.2576140359437549E-01 1.2575368249992841E-01 1.2574595330292973E-01 1.2573821600125254E-01 1.2573047059276274E-01 + 1.2572271707531890E-01 1.2571495544677236E-01 1.2570718570496717E-01 1.2569940784774000E-01 1.2569162187292024E-01 + 1.2568382777832995E-01 1.2567602556178381E-01 1.2566821522108915E-01 1.2566039675404592E-01 1.2565257015844672E-01 + 1.2564473543207669E-01 1.2563689257271354E-01 1.2562904157812763E-01 1.2562118244608181E-01 1.2561331517433144E-01 + 1.2560543976062458E-01 1.2559755620270160E-01 1.2558966449829553E-01 1.2558176464513177E-01 1.2557385664092824E-01 + 1.2556594048339539E-01 1.2555801617023601E-01 1.2555008369914550E-01 1.2554214306781147E-01 1.2553419427391407E-01 + 1.2552623731512583E-01 1.2551827218911166E-01 1.2551029889352885E-01 1.2550231742602699E-01 1.2549432778424816E-01 + 1.2548632996582657E-01 1.2547832396838896E-01 1.2547030978955423E-01 1.2546228742693361E-01 1.2545425687813061E-01 + 1.2544621814074108E-01 1.2543817121235298E-01 1.2543011609054663E-01 1.2542205277289459E-01 1.2541398125696146E-01 + 1.2540590154030429E-01 1.2539781362047211E-01 1.2538971749500624E-01 1.2538161316144011E-01 1.2537350061729938E-01 + 1.2536537986010168E-01 1.2535725088735691E-01 1.2534911369656704E-01 1.2534096828522617E-01 1.2533281465082041E-01 + 1.2532465279082794E-01 1.2531648270271906E-01 1.2530830438395604E-01 1.2530011783199332E-01 1.2529192304427719E-01 + 1.2528372001824598E-01 1.2527550875133012E-01 1.2526728924095187E-01 1.2525906148452559E-01 1.2525082547945751E-01 + 1.2524258122314580E-01 1.2523432871298054E-01 1.2522606794634383E-01 1.2521779892060952E-01 1.2520952163314347E-01 + 1.2520123608130332E-01 1.2519294226243863E-01 1.2518464017389078E-01 1.2517632981299298E-01 1.2516801117707027E-01 + 1.2515968426343951E-01 1.2515134906940931E-01 1.2514300559228017E-01 1.2513465382934413E-01 1.2512629377788528E-01 + 1.2511792543517919E-01 1.2510954879849337E-01 1.2510116386508685E-01 1.2509277063221055E-01 1.2508436909710696E-01 + 1.2507595925701026E-01 1.2506754110914622E-01 1.2505911465073252E-01 1.2505067987897817E-01 1.2504223679108400E-01 + 1.2503378538424234E-01 1.2502532565563726E-01 1.2501685760244421E-01 1.2500838122183036E-01 1.2499989651095446E-01 + 1.2499140346696665E-01 1.2498290208700870E-01 1.2497439236821400E-01 1.2496587430770723E-01 1.2495734790260472E-01 + 1.2494881315001427E-01 1.2494027004703501E-01 1.2493171859075772E-01 1.2492315877826450E-01 1.2491459060662891E-01 + 1.2490601407291592E-01 1.2489742917418188E-01 1.2488883590747456E-01 1.2488023426983309E-01 1.2487162425828797E-01 + 1.2486300586986113E-01 1.2485437910156560E-01 1.2484574395040603E-01 1.2483710041337817E-01 1.2482844848746914E-01 + 1.2481978816965740E-01 1.2481111945691256E-01 1.2480244234619559E-01 1.2479375683445866E-01 1.2478506291864519E-01 + 1.2477636059568983E-01 1.2476764986251838E-01 1.2475893071604792E-01 1.2475020315318665E-01 1.2474146717083395E-01 + 1.2473272276588035E-01 1.2472396993520757E-01 1.2471520867568842E-01 1.2470643898418683E-01 1.2469766085755779E-01 + 1.2468887429264748E-01 1.2468007928629307E-01 1.2467127583532289E-01 1.2466246393655615E-01 1.2465364358680335E-01 + 1.2464481478286576E-01 1.2463597752153587E-01 1.2462713179959703E-01 1.2461827761382362E-01 1.2460941496098106E-01 + 1.2460054383782565E-01 1.2459166424110465E-01 1.2458277616755631E-01 1.2457387961390973E-01 1.2456497457688499E-01 + 1.2455606105319307E-01 1.2454713903953574E-01 1.2453820853260575E-01 1.2452926952908661E-01 1.2452032202565284E-01 + 1.2451136601896957E-01 1.2450240150569296E-01 1.2449342848246986E-01 1.2448444694593791E-01 1.2447545689272560E-01 + 1.2446645831945218E-01 1.2445745122272762E-01 1.2444843559915265E-01 1.2443941144531874E-01 1.2443037875780805E-01 + 1.2442133753319351E-01 1.2441228776803868E-01 1.2440322945889785E-01 1.2439416260231592E-01 1.2438508719482853E-01 + 1.2437600323296191E-01 1.2436691071323291E-01 1.2435780963214899E-01 1.2434869998620832E-01 1.2433958177189951E-01 + 1.2433045498570190E-01 1.2432131962408523E-01 1.2431217568350998E-01 1.2430302316042705E-01 1.2429386205127789E-01 + 1.2428469235249454E-01 1.2427551406049937E-01 1.2426632717170545E-01 1.2425713168251619E-01 1.2424792758932558E-01 + 1.2423871488851793E-01 1.2422949357646812E-01 1.2422026364954132E-01 1.2421102510409329E-01 1.2420177793647004E-01 + 1.2419252214300809E-01 1.2418325772003427E-01 1.2417398466386576E-01 1.2416470297081013E-01 1.2415541263716533E-01 + 1.2414611365921958E-01 1.2413680603325145E-01 1.2412748975552981E-01 1.2411816482231376E-01 1.2410883122985278E-01 + 1.2409948897438657E-01 1.2409013805214512E-01 1.2408077845934856E-01 1.2407141019220740E-01 1.2406203324692222E-01 + 1.2405264761968395E-01 1.2404325330667354E-01 1.2403385030406237E-01 1.2402443860801171E-01 1.2401501821467319E-01 + 1.2400558912018848E-01 1.2399615132068940E-01 1.2398670481229800E-01 1.2397724959112622E-01 1.2396778565327626E-01 + 1.2395831299484041E-01 1.2394883161190090E-01 1.2393934150053020E-01 1.2392984265679062E-01 1.2392033507673468E-01 + 1.2391081875640488E-01 1.2390129369183360E-01 1.2389175987904341E-01 1.2388221731404676E-01 1.2387266599284606E-01 + 1.2386310591143372E-01 1.2385353706579214E-01 1.2384395945189354E-01 1.2383437306570018E-01 1.2382477790316412E-01 + 1.2381517396022748E-01 1.2380556123282214E-01 1.2379593971686984E-01 1.2378630940828229E-01 1.2377667030296101E-01 + 1.2376702239679732E-01 1.2375736568567240E-01 1.2374770016545726E-01 1.2373802583201271E-01 1.2372834268118929E-01 + 1.2371865070882745E-01 1.2370894991075730E-01 1.2369924028279869E-01 1.2368952182076132E-01 1.2367979452044459E-01 + 1.2367005837763753E-01 1.2366031338811902E-01 1.2365055954765751E-01 1.2364079685201121E-01 1.2363102529692803E-01 + 1.2362124487814544E-01 1.2361145559139061E-01 1.2360165743238040E-01 1.2359185039682126E-01 1.2358203448040922E-01 + 1.2357220967882995E-01 1.2356237598775871E-01 1.2355253340286029E-01 1.2354268191978916E-01 1.2353282153418925E-01 + 1.2352295224169405E-01 1.2351307403792658E-01 1.2350318691849946E-01 1.2349329087901467E-01 1.2348338591506390E-01 + 1.2347347202222805E-01 1.2346354919607774E-01 1.2345361743217295E-01 1.2344367672606309E-01 1.2343372707328711E-01 + 1.2342376846937322E-01 1.2341380090983924E-01 1.2340382439019221E-01 1.2339383890592877E-01 1.2338384445253477E-01 + 1.2337384102548545E-01 1.2336382862024553E-01 1.2335380723226898E-01 1.2334377685699910E-01 1.2333373748986856E-01 + 1.2332368912629930E-01 1.2331363176170267E-01 1.2330356539147913E-01 1.2329349001101858E-01 1.2328340561570014E-01 + 1.2327331220089216E-01 1.2326320976195224E-01 1.2325309829422727E-01 1.2324297779305327E-01 1.2323284825375561E-01 + 1.2322270967164868E-01 1.2321256204203623E-01 1.2320240536021113E-01 1.2319223962145533E-01 1.2318206482104009E-01 + 1.2317188095422565E-01 1.2316168801626155E-01 1.2315148600238639E-01 1.2314127490782785E-01 1.2313105472780266E-01 + 1.2312082545751681E-01 1.2311058709216521E-01 1.2310033962693193E-01 1.2309008305699003E-01 1.2307981737750170E-01 + 1.2306954258361812E-01 1.2305925867047941E-01 1.2304896563321489E-01 1.2303866346694273E-01 1.2302835216677015E-01 + 1.2301803172779333E-01 1.2300770214509744E-01 1.2299736341375660E-01 1.2298701552883391E-01 1.2297665848538132E-01 + 1.2296629227843980E-01 1.2295591690303921E-01 1.2294553235419833E-01 1.2293513862692472E-01 1.2292473571621501E-01 + 1.2291432361705457E-01 1.2290390232441764E-01 1.2289347183326742E-01 1.2288303213855582E-01 1.2287258323522368E-01 + 1.2286212511820052E-01 1.2285165778240492E-01 1.2284118122274398E-01 1.2283069543411379E-01 1.2282020041139911E-01 + 1.2280969614947354E-01 1.2279918264319933E-01 1.2278865988742763E-01 1.2277812787699817E-01 1.2276758660673950E-01 + 1.2275703607146894E-01 1.2274647626599232E-01 1.2273590718510438E-01 1.2272532882358843E-01 1.2271474117621645E-01 + 1.2270414423774915E-01 1.2269353800293581E-01 1.2268292246651444E-01 1.2267229762321163E-01 1.2266166346774264E-01 + 1.2265101999481129E-01 1.2264036719910998E-01 1.2262970507531980E-01 1.2261903361811033E-01 1.2260835282213979E-01 + 1.2259766268205495E-01 1.2258696319249110E-01 1.2257625434807209E-01 1.2256553614341037E-01 1.2255480857310674E-01 + 1.2254407163175074E-01 1.2253332531392021E-01 1.2252256961418159E-01 1.2251180452708980E-01 1.2250103004718824E-01 + 1.2249024616900871E-01 1.2247945288707153E-01 1.2246865019588540E-01 1.2245783808994755E-01 1.2244701656374357E-01 + 1.2243618561174743E-01 1.2242534522842165E-01 1.2241449540821694E-01 1.2240363614557259E-01 1.2239276743491612E-01 + 1.2238188927066350E-01 1.2237100164721904E-01 1.2236010455897538E-01 1.2234919800031357E-01 1.2233828196560287E-01 + 1.2232735644920094E-01 1.2231642144545374E-01 1.2230547694869552E-01 1.2229452295324883E-01 1.2228355945342449E-01 + 1.2227258644352160E-01 1.2226160391782753E-01 1.2225061187061792E-01 1.2223961029615660E-01 1.2222859918869572E-01 + 1.2221757854247554E-01 1.2220654835172463E-01 1.2219550861065978E-01 1.2218445931348590E-01 1.2217340045439616E-01 + 1.2216233202757187E-01 1.2215125402718252E-01 1.2214016644738578E-01 1.2212906928232747E-01 1.2211796252614157E-01 + 1.2210684617295012E-01 1.2209572021686337E-01 1.2208458465197966E-01 1.2207343947238546E-01 1.2206228467215531E-01 + 1.2205112024535186E-01 1.2203994618602580E-01 1.2202876248821601E-01 1.2201756914594927E-01 1.2200636615324059E-01 + 1.2199515350409285E-01 1.2198393119249712E-01 1.2197269921243249E-01 1.2196145755786598E-01 1.2195020622275264E-01 + 1.2193894520103561E-01 1.2192767448664599E-01 1.2191639407350278E-01 1.2190510395551307E-01 1.2189380412657193E-01 + 1.2188249458056231E-01 1.2187117531135522E-01 1.2185984631280941E-01 1.2184850757877186E-01 1.2183715910307726E-01 + 1.2182580087954828E-01 1.2181443290199562E-01 1.2180305516421766E-01 1.2179166766000089E-01 1.2178027038311955E-01 + 1.2176886332733584E-01 1.2175744648639980E-01 1.2174601985404936E-01 1.2173458342401029E-01 1.2172313718999619E-01 + 1.2171168114570856E-01 1.2170021528483668E-01 1.2168873960105764E-01 1.2167725408803640E-01 1.2166575873942576E-01 + 1.2165425354886619E-01 1.2164273850998614E-01 1.2163121361640167E-01 1.2161967886171672E-01 1.2160813423952299E-01 + 1.2159657974339996E-01 1.2158501536691475E-01 1.2157344110362242E-01 1.2156185694706563E-01 1.2155026289077481E-01 + 1.2153865892826811E-01 1.2152704505305144E-01 1.2151542125861840E-01 1.2150378753845029E-01 1.2149214388601610E-01 + 1.2148049029477249E-01 1.2146882675816387E-01 1.2145715326962227E-01 1.2144546982256743E-01 1.2143377641040670E-01 + 1.2142207302653511E-01 1.2141035966433535E-01 1.2139863631717773E-01 1.2138690297842022E-01 1.2137515964140839E-01 + 1.2136340629947547E-01 1.2135164294594224E-01 1.2133986957411708E-01 1.2132808617729608E-01 1.2131629274876281E-01 + 1.2130448928178847E-01 1.2129267576963182E-01 1.2128085220553922E-01 1.2126901858274458E-01 1.2125717489446940E-01 + 1.2124532113392265E-01 1.2123345729430089E-01 1.2122158336878829E-01 1.2120969935055642E-01 1.2119780523276451E-01 + 1.2118590100855915E-01 1.2117398667107462E-01 1.2116206221343262E-01 1.2115012762874232E-01 1.2113818291010045E-01 + 1.2112622805059119E-01 1.2111426304328619E-01 1.2110228788124462E-01 1.2109030255751312E-01 1.2107830706512572E-01 + 1.2106630139710399E-01 1.2105428554645691E-01 1.2104225950618090E-01 1.2103022326925990E-01 1.2101817682866517E-01 + 1.2100612017735544E-01 1.2099405330827692E-01 1.2098197621436317E-01 1.2096988888853516E-01 1.2095779132370127E-01 + 1.2094568351275738E-01 1.2093356544858656E-01 1.2092143712405951E-01 1.2090929853203410E-01 1.2089714966535572E-01 + 1.2088499051685705E-01 1.2087282107935819E-01 1.2086064134566658E-01 1.2084845130857701E-01 1.2083625096087160E-01 + 1.2082404029531985E-01 1.2081181930467866E-01 1.2079958798169210E-01 1.2078734631909174E-01 1.2077509430959636E-01 + 1.2076283194591211E-01 1.2075055922073245E-01 1.2073827612673819E-01 1.2072598265659734E-01 1.2071367880296530E-01 + 1.2070136455848474E-01 1.2068903991578561E-01 1.2067670486748516E-01 1.2066435940618792E-01 1.2065200352448566E-01 + 1.2063963721495749E-01 1.2062726047016974E-01 1.2061487328267603E-01 1.2060247564501719E-01 1.2059006754972137E-01 + 1.2057764898930391E-01 1.2056521995626746E-01 1.2055278044310179E-01 1.2054033044228406E-01 1.2052786994627859E-01 + 1.2051539894753689E-01 1.2050291743849774E-01 1.2049042541158715E-01 1.2047792285921831E-01 1.2046540977379165E-01 + 1.2045288614769481E-01 1.2044035197330261E-01 1.2042780724297704E-01 1.2041525194906737E-01 1.2040268608391000E-01 + 1.2039010963982859E-01 1.2037752260913386E-01 1.2036492498412379E-01 1.2035231675708356E-01 1.2033969792028554E-01 + 1.2032706846598910E-01 1.2031442838644101E-01 1.2030177767387507E-01 1.2028911632051224E-01 1.2027644431856072E-01 + 1.2026376166021571E-01 1.2025106833765975E-01 1.2023836434306240E-01 1.2022564966858040E-01 1.2021292430635766E-01 + 1.2020018824852513E-01 1.2018744148720098E-01 1.2017468401449055E-01 1.2016191582248620E-01 1.2014913690326751E-01 + 1.2013634724890108E-01 1.2012354685144075E-01 1.2011073570292743E-01 1.2009791379538907E-01 1.2008508112084088E-01 + 1.2007223767128504E-01 1.2005938343871092E-01 1.2004651841509496E-01 1.2003364259240076E-01 1.2002075596257891E-01 + 1.2000785851756719E-01 1.1999495024929045E-01 1.1998203114966068E-01 1.1996910121057683E-01 1.1995616042392505E-01 + 1.1994320878157860E-01 1.1993024627539771E-01 1.1991727289722981E-01 1.1990428863890930E-01 1.1989129349225776E-01 + 1.1987828744908381E-01 1.1986527050118315E-01 1.1985224264033852E-01 1.1983920385831974E-01 1.1982615414688376E-01 + 1.1981309349777455E-01 1.1980002190272313E-01 1.1978693935344764E-01 1.1977384584165324E-01 1.1976074135903222E-01 + 1.1974762589726380E-01 1.1973449944801440E-01 1.1972136200293745E-01 1.1970821355367341E-01 1.1969505409184983E-01 + 1.1968188360908130E-01 1.1966870209696945E-01 1.1965550954710304E-01 1.1964230595105779E-01 1.1962909130039653E-01 + 1.1961586558666915E-01 1.1960262880141251E-01 1.1958938093615057E-01 1.1957612198239445E-01 1.1956285193164212E-01 + 1.1954957077537873E-01 1.1953627850507649E-01 1.1952297511219453E-01 1.1950966058817915E-01 1.1949633492446370E-01 + 1.1948299811246847E-01 1.1946965014360093E-01 1.1945629100925552E-01 1.1944292070081369E-01 1.1942953920964401E-01 + 1.1941614652710213E-01 1.1940274264453062E-01 1.1938932755325922E-01 1.1937590124460463E-01 1.1936246370987066E-01 + 1.1934901494034815E-01 1.1933555492731496E-01 1.1932208366203605E-01 1.1930860113576341E-01 1.1929510733973603E-01 + 1.1928160226518003E-01 1.1926808590330856E-01 1.1925455824532179E-01 1.1924101928240695E-01 1.1922746900573838E-01 + 1.1921390740647739E-01 1.1920033447577240E-01 1.1918675020475891E-01 1.1917315458455945E-01 1.1915954760628357E-01 + 1.1914592926102791E-01 1.1913229953987621E-01 1.1911865843389927E-01 1.1910500593415484E-01 1.1909134203168792E-01 + 1.1907766671753044E-01 1.1906397998270143E-01 1.1905028181820705E-01 1.1903657221504042E-01 1.1902285116418189E-01 + 1.1900911865659872E-01 1.1899537468324535E-01 1.1898161923506334E-01 1.1896785230298118E-01 1.1895407387791461E-01 + 1.1894028395076633E-01 1.1892648251242620E-01 1.1891266955377119E-01 1.1889884506566527E-01 1.1888500903895959E-01 + 1.1887116146449241E-01 1.1885730233308897E-01 1.1884343163556177E-01 1.1882954936271035E-01 1.1881565550532130E-01 + 1.1880175005416839E-01 1.1878783300001250E-01 1.1877390433360167E-01 1.1875996404567091E-01 1.1874601212694252E-01 + 1.1873204856812584E-01 1.1871807335991737E-01 1.1870408649300074E-01 1.1869008795804664E-01 1.1867607774571309E-01 + 1.1866205584664506E-01 1.1864802225147475E-01 1.1863397695082151E-01 1.1861991993529181E-01 1.1860585119547934E-01 + 1.1859177072196493E-01 1.1857767850531649E-01 1.1856357453608926E-01 1.1854945880482549E-01 1.1853533130205474E-01 + 1.1852119201829366E-01 1.1850704094404610E-01 1.1849287806980317E-01 1.1847870338604310E-01 1.1846451688323133E-01 + 1.1845031855182056E-01 1.1843610838225062E-01 1.1842188636494855E-01 1.1840765249032872E-01 1.1839340674879262E-01 + 1.1837914913072900E-01 1.1836487962651376E-01 1.1835059822651020E-01 1.1833630492106877E-01 1.1832199970052709E-01 + 1.1830768255521019E-01 1.1829335347543023E-01 1.1827901245148670E-01 1.1826465947366631E-01 1.1825029453224310E-01 + 1.1823591761747837E-01 1.1822152871962065E-01 1.1820712782890581E-01 1.1819271493555703E-01 1.1817829002978475E-01 + 1.1816385310178677E-01 1.1814940414174813E-01 1.1813494313984121E-01 1.1812047008622580E-01 1.1810598497104891E-01 + 1.1809148778444491E-01 1.1807697851653559E-01 1.1806245715742998E-01 1.1804792369722455E-01 1.1803337812600312E-01 + 1.1801882043383684E-01 1.1800425061078430E-01 1.1798966864689141E-01 1.1797507453219147E-01 1.1796046825670524E-01 + 1.1794584981044080E-01 1.1793121918339376E-01 1.1791657636554700E-01 1.1790192134687093E-01 1.1788725411732341E-01 + 1.1787257466684960E-01 1.1785788298538225E-01 1.1784317906284154E-01 1.1782846288913504E-01 1.1781373445415787E-01 + 1.1779899374779255E-01 1.1778424075990920E-01 1.1776947548036532E-01 1.1775469789900597E-01 1.1773990800566367E-01 + 1.1772510579015852E-01 1.1771029124229809E-01 1.1769546435187761E-01 1.1768062510867967E-01 1.1766577350247448E-01 + 1.1765090952301983E-01 1.1763603316006113E-01 1.1762114440333131E-01 1.1760624324255080E-01 1.1759132966742777E-01 + 1.1757640366765797E-01 1.1756146523292461E-01 1.1754651435289877E-01 1.1753155101723893E-01 1.1751657521559131E-01 + 1.1750158693758982E-01 1.1748658617285596E-01 1.1747157291099893E-01 1.1745654714161557E-01 1.1744150885429047E-01 + 1.1742645803859587E-01 1.1741139468409170E-01 1.1739631878032569E-01 1.1738123031683317E-01 1.1736612928313733E-01 + 1.1735101566874905E-01 1.1733588946316691E-01 1.1732075065587740E-01 1.1730559923635460E-01 1.1729043519406060E-01 + 1.1727525851844513E-01 1.1726006919894569E-01 1.1724486722498775E-01 1.1722965258598456E-01 1.1721442527133713E-01 + 1.1719918527043441E-01 1.1718393257265318E-01 1.1716866716735810E-01 1.1715338904390174E-01 1.1713809819162449E-01 + 1.1712279459985477E-01 1.1710747825790876E-01 1.1709214915509072E-01 1.1707680728069281E-01 1.1706145262399509E-01 + 1.1704608517426562E-01 1.1703070492076051E-01 1.1701531185272368E-01 1.1699990595938729E-01 1.1698448722997133E-01 + 1.1696905565368385E-01 1.1695361121972103E-01 1.1693815391726700E-01 1.1692268373549401E-01 1.1690720066356237E-01 + 1.1689170469062046E-01 1.1687619580580481E-01 1.1686067399824003E-01 1.1684513925703886E-01 1.1682959157130214E-01 + 1.1681403093011902E-01 1.1679845732256662E-01 1.1678287073771036E-01 1.1676727116460382E-01 1.1675165859228878E-01 + 1.1673603300979526E-01 1.1672039440614151E-01 1.1670474277033405E-01 1.1668907809136760E-01 1.1667340035822520E-01 + 1.1665770955987818E-01 1.1664200568528617E-01 1.1662628872339714E-01 1.1661055866314735E-01 1.1659481549346147E-01 + 1.1657905920325240E-01 1.1656328978142161E-01 1.1654750721685880E-01 1.1653171149844216E-01 1.1651590261503832E-01 + 1.1650008055550223E-01 1.1648424530867736E-01 1.1646839686339572E-01 1.1645253520847773E-01 1.1643666033273226E-01 + 1.1642077222495673E-01 1.1640487087393715E-01 1.1638895626844803E-01 1.1637302839725236E-01 1.1635708724910186E-01 + 1.1634113281273671E-01 1.1632516507688583E-01 1.1630918403026652E-01 1.1629318966158500E-01 1.1627718195953597E-01 + 1.1626116091280289E-01 1.1624512651005789E-01 1.1622907873996173E-01 1.1621301759116394E-01 1.1619694305230288E-01 + 1.1618085511200553E-01 1.1616475375888771E-01 1.1614863898155399E-01 1.1613251076859780E-01 1.1611636910860135E-01 + 1.1610021399013572E-01 1.1608404540176082E-01 1.1606786333202544E-01 1.1605166776946735E-01 1.1603545870261306E-01 + 1.1601923611997818E-01 1.1600300001006708E-01 1.1598675036137336E-01 1.1597048716237933E-01 1.1595421040155651E-01 + 1.1593792006736529E-01 1.1592161614825519E-01 1.1590529863266480E-01 1.1588896750902165E-01 1.1587262276574256E-01 + 1.1585626439123330E-01 1.1583989237388885E-01 1.1582350670209335E-01 1.1580710736422004E-01 1.1579069434863146E-01 + 1.1577426764367925E-01 1.1575782723770432E-01 1.1574137311903693E-01 1.1572490527599637E-01 1.1570842369689148E-01 + 1.1569192837002019E-01 1.1567541928366995E-01 1.1565889642611740E-01 1.1564235978562863E-01 1.1562580935045909E-01 + 1.1560924510885369E-01 1.1559266704904668E-01 1.1557607515926181E-01 1.1555946942771235E-01 1.1554284984260092E-01 + 1.1552621639211987E-01 1.1550956906445083E-01 1.1549290784776518E-01 1.1547623273022375E-01 1.1545954369997710E-01 + 1.1544284074516528E-01 1.1542612385391803E-01 1.1540939301435477E-01 1.1539264821458456E-01 1.1537588944270623E-01 + 1.1535911668680827E-01 1.1534232993496898E-01 1.1532552917525639E-01 1.1530871439572830E-01 1.1529188558443237E-01 + 1.1527504272940613E-01 1.1525818581867689E-01 1.1524131484026193E-01 1.1522442978216833E-01 1.1520753063239324E-01 + 1.1519061737892365E-01 1.1517369000973653E-01 1.1515674851279893E-01 1.1513979287606785E-01 1.1512282308749042E-01 + 1.1510583913500372E-01 1.1508884100653498E-01 1.1507182869000161E-01 1.1505480217331109E-01 1.1503776144436106E-01 + 1.1502070649103942E-01 1.1500363730122415E-01 1.1498655386278367E-01 1.1496945616357647E-01 1.1495234419145145E-01 + 1.1493521793424777E-01 1.1491807737979491E-01 1.1490092251591280E-01 1.1488375333041169E-01 1.1486656981109218E-01 + 1.1484937194574547E-01 1.1483215972215310E-01 1.1481493312808709E-01 1.1479769215131014E-01 1.1478043677957522E-01 + 1.1476316700062611E-01 1.1474588280219707E-01 1.1472858417201295E-01 1.1471127109778941E-01 1.1469394356723253E-01 + 1.1467660156803929E-01 1.1465924508789727E-01 1.1464187411448495E-01 1.1462448863547142E-01 1.1460708863851665E-01 + 1.1458967411127144E-01 1.1457224504137752E-01 1.1455480141646733E-01 1.1453734322416440E-01 1.1451987045208308E-01 + 1.1450238308782876E-01 1.1448488111899779E-01 1.1446736453317762E-01 1.1444983331794657E-01 1.1443228746087428E-01 + 1.1441472694952129E-01 1.1439715177143941E-01 1.1437956191417156E-01 1.1436195736525190E-01 1.1434433811220567E-01 + 1.1432670414254957E-01 1.1430905544379145E-01 1.1429139200343046E-01 1.1427371380895715E-01 1.1425602084785341E-01 + 1.1423831310759257E-01 1.1422059057563928E-01 1.1420285323944973E-01 1.1418510108647160E-01 1.1416733410414409E-01 + 1.1414955227989784E-01 1.1413175560115520E-01 1.1411394405533005E-01 1.1409611762982794E-01 1.1407827631204606E-01 + 1.1406042008937334E-01 1.1404254894919040E-01 1.1402466287886961E-01 1.1400676186577517E-01 1.1398884589726310E-01 + 1.1397091496068121E-01 1.1395296904336930E-01 1.1393500813265894E-01 1.1391703221587378E-01 1.1389904128032945E-01 + 1.1388103531333346E-01 1.1386301430218547E-01 1.1384497823417718E-01 1.1382692709659244E-01 1.1380886087670716E-01 + 1.1379077956178953E-01 1.1377268313909979E-01 1.1375457159589054E-01 1.1373644491940667E-01 1.1371830309688527E-01 + 1.1370014611555583E-01 1.1368197396264015E-01 1.1366378662535256E-01 1.1364558409089967E-01 1.1362736634648068E-01 + 1.1360913337928723E-01 1.1359088517650352E-01 1.1357262172530629E-01 1.1355434301286491E-01 1.1353604902634144E-01 + 1.1351773975289051E-01 1.1349941517965954E-01 1.1348107529378865E-01 1.1346272008241079E-01 1.1344434953265162E-01 + 1.1342596363162973E-01 1.1340756236645659E-01 1.1338914572423661E-01 1.1337071369206705E-01 1.1335226625703829E-01 + 1.1333380340623359E-01 1.1331532512672943E-01 1.1329683140559528E-01 1.1327832222989376E-01 1.1325979758668064E-01 + 1.1324125746300495E-01 1.1322270184590899E-01 1.1320413072242820E-01 1.1318554407959144E-01 1.1316694190442092E-01 + 1.1314832418393220E-01 1.1312969090513429E-01 1.1311104205502961E-01 1.1309237762061421E-01 1.1307369758887753E-01 + 1.1305500194680264E-01 1.1303629068136627E-01 1.1301756377953870E-01 1.1299882122828404E-01 1.1298006301456003E-01 + 1.1296128912531810E-01 1.1294249954750368E-01 1.1292369426805590E-01 1.1290487327390779E-01 1.1288603655198635E-01 + 1.1286718408921249E-01 1.1284831587250115E-01 1.1282943188876124E-01 1.1281053212489588E-01 1.1279161656780212E-01 + 1.1277268520437138E-01 1.1275373802148909E-01 1.1273477500603500E-01 1.1271579614488315E-01 1.1269680142490182E-01 + 1.1267779083295376E-01 1.1265876435589602E-01 1.1263972198058012E-01 1.1262066369385200E-01 1.1260158948255225E-01 + 1.1258249933351591E-01 1.1256339323357266E-01 1.1254427116954679E-01 1.1252513312825733E-01 1.1250597909651802E-01 + 1.1248680906113728E-01 1.1246762300891842E-01 1.1244842092665962E-01 1.1242920280115391E-01 1.1240996861918921E-01 + 1.1239071836754856E-01 1.1237145203300983E-01 1.1235216960234612E-01 1.1233287106232551E-01 1.1231355639971133E-01 + 1.1229422560126195E-01 1.1227487865373119E-01 1.1225551554386798E-01 1.1223613625841662E-01 1.1221674078411677E-01 + 1.1219732910770354E-01 1.1217790121590739E-01 1.1215845709545437E-01 1.1213899673306603E-01 1.1211952011545954E-01 + 1.1210002722934764E-01 1.1208051806143880E-01 1.1206099259843715E-01 1.1204145082704264E-01 1.1202189273395098E-01 + 1.1200231830585376E-01 1.1198272752943852E-01 1.1196312039138860E-01 1.1194349687838345E-01 1.1192385697709853E-01 + 1.1190420067420534E-01 1.1188452795637160E-01 1.1186483881026105E-01 1.1184513322253384E-01 1.1182541117984621E-01 + 1.1180567266885083E-01 1.1178591767619664E-01 1.1176614618852906E-01 1.1174635819248997E-01 1.1172655367471762E-01 + 1.1170673262184704E-01 1.1168689502050956E-01 1.1166704085733341E-01 1.1164717011894336E-01 1.1162728279196101E-01 + 1.1160737886300465E-01 1.1158745831868949E-01 1.1156752114562755E-01 1.1154756733042784E-01 1.1152759685969635E-01 + 1.1150760972003601E-01 1.1148760589804697E-01 1.1146758538032636E-01 1.1144754815346856E-01 1.1142749420406521E-01 + 1.1140742351870511E-01 1.1138733608397453E-01 1.1136723188645696E-01 1.1134711091273340E-01 1.1132697314938238E-01 + 1.1130681858297976E-01 1.1128664720009922E-01 1.1126645898731187E-01 1.1124625393118656E-01 1.1122603201828993E-01 + 1.1120579323518624E-01 1.1118553756843777E-01 1.1116526500460454E-01 1.1114497553024448E-01 1.1112466913191364E-01 + 1.1110434579616603E-01 1.1108400550955368E-01 1.1106364825862686E-01 1.1104327402993396E-01 1.1102288281002161E-01 + 1.1100247458543480E-01 1.1098204934271681E-01 1.1096160706840935E-01 1.1094114774905252E-01 1.1092067137118501E-01 + 1.1090017792134399E-01 1.1087966738606528E-01 1.1085913975188337E-01 1.1083859500533144E-01 1.1081803313294149E-01 + 1.1079745412124427E-01 1.1077685795676948E-01 1.1075624462604568E-01 1.1073561411560054E-01 1.1071496641196059E-01 + 1.1069430150165166E-01 1.1067361937119854E-01 1.1065292000712540E-01 1.1063220339595554E-01 1.1061146952421161E-01 + 1.1059071837841571E-01 1.1056994994508927E-01 1.1054916421075318E-01 1.1052836116192803E-01 1.1050754078513383E-01 + 1.1048670306689030E-01 1.1046584799371693E-01 1.1044497555213290E-01 1.1042408572865720E-01 1.1040317850980877E-01 + 1.1038225388210642E-01 1.1036131183206896E-01 1.1034035234621528E-01 1.1031937541106433E-01 1.1029838101313530E-01 + 1.1027736913894748E-01 1.1025633977502053E-01 1.1023529290787444E-01 1.1021422852402954E-01 1.1019314661000666E-01 + 1.1017204715232715E-01 1.1015093013751286E-01 1.1012979555208628E-01 1.1010864338257070E-01 1.1008747361549008E-01 + 1.1006628623736908E-01 1.1004508123473339E-01 1.1002385859410953E-01 1.1000261830202503E-01 1.0998136034500851E-01 + 1.0996008470958951E-01 1.0993879138229901E-01 1.0991748034966896E-01 1.0989615159823274E-01 1.0987480511452503E-01 + 1.0985344088508191E-01 1.0983205889644089E-01 1.0981065913514113E-01 1.0978924158772319E-01 1.0976780624072945E-01 + 1.0974635308070389E-01 1.0972488209419229E-01 1.0970339326774234E-01 1.0968188658790347E-01 1.0966036204122720E-01 + 1.0963881961426697E-01 1.0961725929357845E-01 1.0959568106571922E-01 1.0957408491724929E-01 1.0955247083473084E-01 + 1.0953083880472832E-01 1.0950918881380872E-01 1.0948752084854138E-01 1.0946583489549820E-01 1.0944413094125365E-01 + 1.0942240897238485E-01 1.0940066897547168E-01 1.0937891093709669E-01 1.0935713484384534E-01 1.0933534068230602E-01 + 1.0931352843907007E-01 1.0929169810073178E-01 1.0926984965388871E-01 1.0924798308514137E-01 1.0922609838109375E-01 + 1.0920419552835285E-01 1.0918227451352926E-01 1.0916033532323689E-01 1.0913837794409315E-01 1.0911640236271899E-01 + 1.0909440856573908E-01 1.0907239653978164E-01 1.0905036627147874E-01 1.0902831774746621E-01 1.0900625095438383E-01 + 1.0898416587887527E-01 1.0896206250758829E-01 1.0893994082717467E-01 1.0891780082429040E-01 1.0889564248559563E-01 + 1.0887346579775485E-01 1.0885127074743695E-01 1.0882905732131515E-01 1.0880682550606717E-01 1.0878457528837539E-01 + 1.0876230665492673E-01 1.0874001959241285E-01 1.0871771408753017E-01 1.0869539012697990E-01 1.0867304769746822E-01 + 1.0865068678570627E-01 1.0862830737841020E-01 1.0860590946230132E-01 1.0858349302410604E-01 1.0856105805055619E-01 + 1.0853860452838866E-01 1.0851613244434601E-01 1.0849364178517604E-01 1.0847113253763223E-01 1.0844860468847360E-01 + 1.0842605822446480E-01 1.0840349313237634E-01 1.0838090939898441E-01 1.0835830701107126E-01 1.0833568595542484E-01 + 1.0831304621883937E-01 1.0829038778811506E-01 1.0826771065005833E-01 1.0824501479148178E-01 1.0822230019920438E-01 + 1.0819956686005146E-01 1.0817681476085488E-01 1.0815404388845289E-01 1.0813125422969046E-01 1.0810844577141920E-01 + 1.0808561850049753E-01 1.0806277240379057E-01 1.0803990746817040E-01 1.0801702368051615E-01 1.0799412102771386E-01 + 1.0797119949665673E-01 1.0794825907424518E-01 1.0792529974738688E-01 1.0790232150299686E-01 1.0787932432799752E-01 + 1.0785630820931871E-01 1.0783327313389798E-01 1.0781021908868041E-01 1.0778714606061880E-01 1.0776405403667375E-01 + 1.0774094300381373E-01 1.0771781294901515E-01 1.0769466385926242E-01 1.0767149572154805E-01 1.0764830852287263E-01 + 1.0762510225024514E-01 1.0760187689068278E-01 1.0757863243121114E-01 1.0755536885886433E-01 1.0753208616068495E-01 + 1.0750878432372427E-01 1.0748546333504216E-01 1.0746212318170741E-01 1.0743876385079755E-01 1.0741538532939914E-01 + 1.0739198760460762E-01 1.0736857066352758E-01 1.0734513449327279E-01 1.0732167908096628E-01 1.0729820441374027E-01 + 1.0727471047873659E-01 1.0725119726310631E-01 1.0722766475401024E-01 1.0720411293861870E-01 1.0718054180411180E-01 + 1.0715695133767937E-01 1.0713334152652117E-01 1.0710971235784690E-01 1.0708606381887621E-01 1.0706239589683897E-01 + 1.0703870857897521E-01 1.0701500185253511E-01 1.0699127570477934E-01 1.0696753012297897E-01 1.0694376509441550E-01 + 1.0691998060638110E-01 1.0689617664617854E-01 1.0687235320112136E-01 1.0684851025853399E-01 1.0682464780575170E-01 + 1.0680076583012077E-01 1.0677686431899854E-01 1.0675294325975353E-01 1.0672900263976548E-01 1.0670504244642544E-01 + 1.0668106266713592E-01 1.0665706328931079E-01 1.0663304430037561E-01 1.0660900568776750E-01 1.0658494743893536E-01 + 1.0656086954133986E-01 1.0653677198245361E-01 1.0651265474976110E-01 1.0648851783075904E-01 1.0646436121295615E-01 + 1.0644018488387341E-01 1.0641598883104411E-01 1.0639177304201397E-01 1.0636753750434116E-01 1.0634328220559638E-01 + 1.0631900713336301E-01 1.0629471227523719E-01 1.0627039761882778E-01 1.0624606315175662E-01 1.0622170886165851E-01 + 1.0619733473618133E-01 1.0617294076298606E-01 1.0614852692974697E-01 1.0612409322415163E-01 1.0609963963390107E-01 + 1.0607516614670973E-01 1.0605067275030565E-01 1.0602615943243060E-01 1.0600162618084003E-01 1.0597707298330324E-01 + 1.0595249982760348E-01 1.0592790670153797E-01 1.0590329359291809E-01 1.0587866048956936E-01 1.0585400737933150E-01 + 1.0582933425005878E-01 1.0580464108961971E-01 1.0577992788589739E-01 1.0575519462678963E-01 1.0573044130020882E-01 + 1.0570566789408224E-01 1.0568087439635199E-01 1.0565606079497515E-01 1.0563122707792388E-01 1.0560637323318547E-01 + 1.0558149924876242E-01 1.0555660511267261E-01 1.0553169081294927E-01 1.0550675633764116E-01 1.0548180167481265E-01 + 1.0545682681254370E-01 1.0543183173893012E-01 1.0540681644208358E-01 1.0538178091013160E-01 1.0535672513121785E-01 + 1.0533164909350207E-01 1.0530655278516017E-01 1.0528143619438446E-01 1.0525629930938357E-01 1.0523114211838265E-01 + 1.0520596460962332E-01 1.0518076677136411E-01 1.0515554859188006E-01 1.0513031005946311E-01 1.0510505116242225E-01 + 1.0507977188908338E-01 1.0505447222778956E-01 1.0502915216690105E-01 1.0500381169479545E-01 1.0497845079986769E-01 + 1.0495306947053024E-01 1.0492766769521314E-01 1.0490224546236403E-01 1.0487680276044845E-01 1.0485133957794959E-01 + 1.0482585590336878E-01 1.0480035172522528E-01 1.0477482703205658E-01 1.0474928181241823E-01 1.0472371605488424E-01 + 1.0469812974804696E-01 1.0467252288051722E-01 1.0464689544092456E-01 1.0462124741791708E-01 1.0459557880016175E-01 + 1.0456988957634432E-01 1.0454417973516963E-01 1.0451844926536150E-01 1.0449269815566288E-01 1.0446692639483611E-01 + 1.0444113397166269E-01 1.0441532087494372E-01 1.0438948709349974E-01 1.0436363261617092E-01 1.0433775743181722E-01 + 1.0431186152931839E-01 1.0428594489757402E-01 1.0426000752550384E-01 1.0423404940204754E-01 1.0420807051616512E-01 + 1.0418207085683683E-01 1.0415605041306332E-01 1.0413000917386571E-01 1.0410394712828572E-01 1.0407786426538576E-01 + 1.0405176057424895E-01 1.0402563604397935E-01 1.0399949066370190E-01 1.0397332442256278E-01 1.0394713730972908E-01 + 1.0392092931438937E-01 1.0389470042575341E-01 1.0386845063305251E-01 1.0384217992553950E-01 1.0381588829248878E-01 + 1.0378957572319665E-01 1.0376324220698110E-01 1.0373688773318210E-01 1.0371051229116167E-01 1.0368411587030395E-01 + 1.0365769846001528E-01 1.0363126004972445E-01 1.0360480062888248E-01 1.0357832018696307E-01 1.0355181871346242E-01 + 1.0352529619789960E-01 1.0349875262981630E-01 1.0347218799877733E-01 1.0344560229437040E-01 1.0341899550620631E-01 + 1.0339236762391915E-01 1.0336571863716627E-01 1.0333904853562845E-01 1.0331235730901001E-01 1.0328564494703878E-01 + 1.0325891143946642E-01 1.0323215677606831E-01 1.0320538094664380E-01 1.0317858394101623E-01 1.0315176574903297E-01 + 1.0312492636056569E-01 1.0309806576551038E-01 1.0307118395378738E-01 1.0304428091534155E-01 1.0301735664014233E-01 + 1.0299041111818398E-01 1.0296344433948540E-01 1.0293645629409058E-01 1.0290944697206837E-01 1.0288241636351286E-01 + 1.0285536445854322E-01 1.0282829124730405E-01 1.0280119671996532E-01 1.0277408086672250E-01 1.0274694367779667E-01 + 1.0271978514343472E-01 1.0269260525390921E-01 1.0266540399951875E-01 1.0263818137058796E-01 1.0261093735746751E-01 + 1.0258367195053433E-01 1.0255638514019177E-01 1.0252907691686951E-01 1.0250174727102376E-01 1.0247439619313739E-01 + 1.0244702367372009E-01 1.0241962970330828E-01 1.0239221427246538E-01 1.0236477737178185E-01 1.0233731899187525E-01 + 1.0230983912339051E-01 1.0228233775699977E-01 1.0225481488340277E-01 1.0222727049332671E-01 1.0219970457752652E-01 + 1.0217211712678485E-01 1.0214450813191224E-01 1.0211687758374723E-01 1.0208922547315641E-01 1.0206155179103454E-01 + 1.0203385652830474E-01 1.0200613967591846E-01 1.0197840122485563E-01 1.0195064116612480E-01 1.0192285949076328E-01 + 1.0189505618983707E-01 1.0186723125444121E-01 1.0183938467569963E-01 1.0181151644476549E-01 1.0178362655282111E-01 + 1.0175571499107816E-01 1.0172778175077778E-01 1.0169982682319051E-01 1.0167185019961672E-01 1.0164385187138641E-01 + 1.0161583182985948E-01 1.0158779006642575E-01 1.0155972657250513E-01 1.0153164133954770E-01 1.0150353435903381E-01 + 1.0147540562247422E-01 1.0144725512141010E-01 1.0141908284741327E-01 1.0139088879208620E-01 1.0136267294706224E-01 + 1.0133443530400556E-01 1.0130617585461139E-01 1.0127789459060609E-01 1.0124959150374720E-01 1.0122126658582359E-01 + 1.0119291982865559E-01 1.0116455122409516E-01 1.0113616076402572E-01 1.0110774844036259E-01 1.0107931424505288E-01 + 1.0105085817007572E-01 1.0102238020744232E-01 1.0099388034919596E-01 1.0096535858741230E-01 1.0093681491419944E-01 + 1.0090824932169785E-01 1.0087966180208073E-01 1.0085105234755390E-01 1.0082242095035604E-01 1.0079376760275878E-01 + 1.0076509229706673E-01 1.0073639502561771E-01 1.0070767578078271E-01 1.0067893455496615E-01 1.0065017134060585E-01 + 1.0062138613017323E-01 1.0059257891617340E-01 1.0056374969114525E-01 1.0053489844766150E-01 1.0050602517832896E-01 + 1.0047712987578848E-01 1.0044821253271517E-01 1.0041927314181845E-01 1.0039031169584212E-01 1.0036132818756457E-01 + 1.0033232260979887E-01 1.0030329495539271E-01 1.0027424521722877E-01 1.0024517338822467E-01 1.0021607946133304E-01 + 1.0018696342954174E-01 1.0015782528587398E-01 1.0012866502338824E-01 1.0009948263517862E-01 1.0007027811437477E-01 + 1.0004105145414210E-01 1.0001180264768186E-01 9.9982531688231180E-02 9.9953238569063296E-02 9.9923923283487565E-02 + 9.9894585824849655E-02 9.9865226186531555E-02 9.9835844361951753E-02 9.9806440344565345E-02 9.9777014127864092E-02 + 9.9747565705376615E-02 9.9718095070668367E-02 9.9688602217341923E-02 9.9659087139036914E-02 9.9629549829430258E-02 + 9.9599990282236178E-02 9.9570408491206380E-02 9.9540804450130152E-02 9.9511178152834417E-02 9.9481529593183973E-02 + 9.9451858765081336E-02 9.9422165662467213E-02 9.9392450279320296E-02 9.9362712609657566E-02 9.9332952647534278E-02 + 9.9303170387044185E-02 9.9273365822319493E-02 9.9243538947531171E-02 9.9213689756888920E-02 9.9183818244641189E-02 + 9.9153924405075602E-02 9.9124008232518768E-02 9.9094069721336456E-02 9.9064108865933836E-02 9.9034125660755423E-02 + 9.9004120100285309E-02 9.8974092179047207E-02 9.8944041891604537E-02 9.8913969232560600E-02 9.8883874196558655E-02 + 9.8853756778282051E-02 9.8823616972454273E-02 9.8793454773839134E-02 9.8763270177240792E-02 9.8733063177503994E-02 + 9.8702833769514040E-02 9.8672581948196933E-02 9.8642307708519603E-02 9.8612011045489820E-02 9.8581691954156433E-02 + 9.8551350429609524E-02 9.8520986466980362E-02 9.8490600061441586E-02 9.8460191208207398E-02 9.8429759902533526E-02 + 9.8399306139717466E-02 9.8368829915098419E-02 9.8338331224057662E-02 9.8307810062018344E-02 9.8277266424445911E-02 + 9.8246700306847928E-02 9.8216111704774386E-02 9.8185500613817728E-02 9.8154867029612985E-02 9.8124210947837825E-02 + 9.8093532364212782E-02 9.8062831274501272E-02 9.8032107674509678E-02 9.8001361560087513E-02 9.7970592927127592E-02 + 9.7939801771565971E-02 9.7908988089382212E-02 9.7878151876599442E-02 9.7847293129284391E-02 9.7816411843547627E-02 + 9.7785508015543546E-02 9.7754581641470537E-02 9.7723632717571160E-02 9.7692661240132095E-02 9.7661667205484415E-02 + 9.7630650610003547E-02 9.7599611450109439E-02 9.7568549722266779E-02 9.7537465422984915E-02 9.7506358548818090E-02 + 9.7475229096365482E-02 9.7444077062271386E-02 9.7412902443225272E-02 9.7381705235961832E-02 9.7350485437261297E-02 + 9.7319243043949233E-02 9.7287978052896962E-02 9.7256690461021450E-02 9.7225380265285544E-02 9.7194047462697997E-02 + 9.7162692050313582E-02 9.7131314025233298E-02 9.7099913384604344E-02 9.7068490125620341E-02 9.7037044245521342E-02 + 9.7005575741594005E-02 9.6974084611171713E-02 9.6942570851634546E-02 9.6911034460409634E-02 9.6879475434971024E-02 + 9.6847893772839935E-02 9.6816289471584785E-02 9.6784662528821327E-02 9.6753012942212765E-02 9.6721340709469916E-02 + 9.6689645828351156E-02 9.6657928296662698E-02 9.6626188112258579E-02 9.6594425273040879E-02 9.6562639776959711E-02 + 9.6530831622013397E-02 9.6499000806248555E-02 9.6467147327760225E-02 9.6435271184691959E-02 9.6403372375235941E-02 + 9.6371450897633021E-02 9.6339506750172929E-02 9.6307539931194383E-02 9.6275550439085034E-02 9.6243538272281784E-02 + 9.6211503429270734E-02 9.6179445908587374E-02 9.6147365708816671E-02 9.6115262828593118E-02 9.6083137266600976E-02 + 9.6050989021574204E-02 9.6018818092296704E-02 9.5986624477602381E-02 9.5954408176375211E-02 9.5922169187549394E-02 + 9.5889907510109451E-02 9.5857623143090334E-02 9.5825316085577483E-02 9.5792986336706992E-02 9.5760633895665664E-02 + 9.5728258761691179E-02 9.5695860934072174E-02 9.5663440412148248E-02 9.5630997195310222E-02 9.5598531283000193E-02 + 9.5566042674711568E-02 9.5533531369989211E-02 9.5500997368429610E-02 9.5468440669680923E-02 9.5435861273443001E-02 + 9.5403259179467695E-02 9.5370634387558773E-02 9.5337986897572100E-02 9.5305316709415708E-02 9.5272623823050004E-02 + 9.5239908238487714E-02 9.5207169955794133E-02 9.5174408975087083E-02 9.5141625296537150E-02 9.5108818920367724E-02 + 9.5075989846855100E-02 9.5043138076328582E-02 9.5010263609170642E-02 9.4977366445816891E-02 9.4944446586756326E-02 + 9.4911504032531360E-02 9.4878538783737906E-02 9.4845550841025528E-02 9.4812540205097523E-02 9.4779506876711023E-02 + 9.4746450856677086E-02 9.4713372145860786E-02 9.4680270745181400E-02 9.4647146655612344E-02 9.4613999878181490E-02 + 9.4580830413971029E-02 9.4547638264117800E-02 9.4514423429813199E-02 9.4481185912303423E-02 9.4447925712889472E-02 + 9.4414642832927304E-02 9.4381337273827942E-02 9.4348009037057506E-02 9.4314658124137404E-02 9.4281284536644333E-02 + 9.4247888276210473E-02 9.4214469344523558E-02 9.4181027743326901E-02 9.4147563474419591E-02 9.4114076539656602E-02 + 9.4080566940948698E-02 9.4047034680262875E-02 9.4013479759622084E-02 9.3979902181105607E-02 9.3946301946849081E-02 + 9.3912679059044449E-02 9.3879033519940300E-02 9.3845365331841804E-02 9.3811674497110809E-02 9.3777961018166031E-02 + 9.3744224897483130E-02 9.3710466137594664E-02 9.3676684741090449E-02 9.3642880710617382E-02 9.3609054048879703E-02 + 9.3575204758639091E-02 9.3541332842714667E-02 9.3507438303983170E-02 9.3473521145379018E-02 9.3439581369894387E-02 + 9.3405618980579405E-02 9.3371633980542088E-02 9.3337626372948526E-02 9.3303596161023059E-02 9.3269543348048198E-02 + 9.3235467937364827E-02 9.3201369932372297E-02 9.3167249336528507E-02 9.3133106153349923E-02 9.3098940386411796E-02 + 9.3064752039348234E-02 9.3030541115852183E-02 9.2996307619675658E-02 9.2962051554629749E-02 9.2927772924584706E-02 + 9.2893471733470193E-02 9.2859147985275087E-02 9.2824801684047845E-02 9.2790432833896472E-02 9.2756041438988648E-02 + 9.2721627503551729E-02 9.2687191031872992E-02 9.2652732028299600E-02 9.2618250497238749E-02 9.2583746443157755E-02 + 9.2549219870584148E-02 9.2514670784105746E-02 9.2480099188370732E-02 9.2445505088087770E-02 9.2410888488026130E-02 + 9.2376249393015697E-02 9.2341587807947129E-02 9.2306903737771867E-02 9.2272197187502333E-02 9.2237468162211941E-02 + 9.2202716667035195E-02 9.2167942707167799E-02 9.2133146287866730E-02 9.2098327414450343E-02 9.2063486092298405E-02 + 9.2028622326852286E-02 9.1993736123614972E-02 9.1958827488151068E-02 9.1923896426087129E-02 9.1888942943111507E-02 + 9.1853967044974547E-02 9.1818968737488627E-02 9.1783948026528367E-02 9.1748904918030491E-02 9.1713839417994131E-02 + 9.1678751532480798E-02 9.1643641267614498E-02 9.1608508629581795E-02 9.1573353624631912E-02 9.1538176259076842E-02 + 9.1502976539291347E-02 9.1467754471713181E-02 9.1432510062842989E-02 9.1397243319244606E-02 9.1361954247544910E-02 + 9.1326642854434148E-02 9.1291309146665778E-02 9.1255953131056722E-02 9.1220574814487379E-02 9.1185174203901737E-02 + 9.1149751306307425E-02 9.1114306128775788E-02 9.1078838678442020E-02 9.1043348962505197E-02 9.1007836988228327E-02 + 9.0972302762938537E-02 9.0936746294027107E-02 9.0901167588949450E-02 9.0865566655225355E-02 9.0829943500438923E-02 + 9.0794298132238771E-02 9.0758630558337966E-02 9.0722940786514286E-02 9.0687228824610125E-02 9.0651494680532671E-02 + 9.0615738362253978E-02 9.0579959877810964E-02 9.0544159235305621E-02 9.0508336442904930E-02 9.0472491508841082E-02 + 9.0436624441411526E-02 9.0400735248978958E-02 9.0364823939971445E-02 9.0328890522882552E-02 9.0292935006271349E-02 + 9.0256957398762550E-02 9.0220957709046479E-02 9.0184935945879313E-02 9.0148892118082954E-02 9.0112826234545237E-02 + 9.0076738304220028E-02 9.0040628336127179E-02 9.0004496339352674E-02 8.9968342323048706E-02 8.9932166296433746E-02 + 8.9895968268792564E-02 8.9859748249476346E-02 8.9823506247902807E-02 8.9787242273556125E-02 8.9750956335987175E-02 + 8.9714648444813500E-02 8.9678318609719407E-02 8.9641966840456014E-02 8.9605593146841356E-02 8.9569197538760484E-02 + 8.9532780026165396E-02 8.9496340619075271E-02 8.9459879327576403E-02 8.9423396161822405E-02 8.9386891132034157E-02 + 8.9350364248499889E-02 8.9313815521575343E-02 8.9277244961683710E-02 8.9240652579315807E-02 8.9204038385030091E-02 + 8.9167402389452685E-02 8.9130744603277495E-02 8.9094065037266329E-02 8.9057363702248843E-02 8.9020640609122667E-02 + 8.8983895768853488E-02 8.8947129192475063E-02 8.8910340891089332E-02 8.8873530875866427E-02 8.8836699158044818E-02 + 8.8799845748931266E-02 8.8762970659900964E-02 8.8726073902397590E-02 8.8689155487933324E-02 8.8652215428088973E-02 + 8.8615253734514010E-02 8.8578270418926547E-02 8.8541265493113530E-02 8.8504238968930754E-02 8.8467190858302902E-02 + 8.8430121173223533E-02 8.8393029925755290E-02 8.8355917128029884E-02 8.8318782792248141E-02 8.8281626930680049E-02 + 8.8244449555664878E-02 8.8207250679611160E-02 8.8170030314996789E-02 8.8132788474369103E-02 8.8095525170344871E-02 + 8.8058240415610389E-02 8.8020934222921537E-02 8.7983606605103806E-02 8.7946257575052408E-02 8.7908887145732306E-02 + 8.7871495330178157E-02 8.7834082141494602E-02 8.7796647592856075E-02 8.7759191697507025E-02 8.7721714468761841E-02 + 8.7684215920005068E-02 8.7646696064691235E-02 8.7609154916345106E-02 8.7571592488561639E-02 8.7534008795006044E-02 + 8.7496403849413873E-02 8.7458777665590959E-02 8.7421130257413604E-02 8.7383461638828569E-02 8.7345771823853072E-02 + 8.7308060826574899E-02 8.7270328661152460E-02 8.7232575341814819E-02 8.7194800882861648E-02 8.7157005298663465E-02 + 8.7119188603661510E-02 8.7081350812367855E-02 8.7043491939365503E-02 8.7005611999308313E-02 8.6967711006921120E-02 + 8.6929788976999767E-02 8.6891845924411223E-02 8.6853881864093430E-02 8.6815896811055560E-02 8.6777890780377925E-02 + 8.6739863787212101E-02 8.6701815846780841E-02 8.6663746974378314E-02 8.6625657185369964E-02 8.6587546495192638E-02 + 8.6549414919354625E-02 8.6511262473435643E-02 8.6473089173086951E-02 8.6434895034031345E-02 8.6396680072063192E-02 + 8.6358444303048509E-02 8.6320187742924923E-02 8.6281910407701792E-02 8.6243612313460186E-02 8.6205293476352945E-02 + 8.6166953912604746E-02 8.6128593638512094E-02 8.6090212670443325E-02 8.6051811024838692E-02 8.6013388718210460E-02 + 8.5974945767142791E-02 8.5936482188291904E-02 8.5897997998386030E-02 8.5859493214225507E-02 8.5820967852682756E-02 + 8.5782421930702360E-02 8.5743855465301014E-02 8.5705268473567714E-02 8.5666660972663580E-02 8.5628032979822091E-02 + 8.5589384512348946E-02 8.5550715587622186E-02 8.5512026223092216E-02 8.5473316436281754E-02 8.5434586244786045E-02 + 8.5395835666272638E-02 8.5357064718481618E-02 8.5318273419225515E-02 8.5279461786389385E-02 8.5240629837930848E-02 + 8.5201777591879996E-02 8.5162905066339625E-02 8.5124012279485059E-02 8.5085099249564269E-02 8.5046165994897907E-02 + 8.5007212533879287E-02 8.4968238884974415E-02 8.4929245066722045E-02 8.4890231097733651E-02 8.4851196996693523E-02 + 8.4812142782358643E-02 8.4773068473558907E-02 8.4733974089196987E-02 8.4694859648248369E-02 8.4655725169761456E-02 + 8.4616570672857508E-02 8.4577396176730685E-02 8.4538201700648102E-02 8.4498987263949749E-02 8.4459752886048609E-02 + 8.4420498586430595E-02 8.4381224384654660E-02 8.4341930300352710E-02 8.4302616353229651E-02 8.4263282563063480E-02 + 8.4223928949705151E-02 8.4184555533078728E-02 8.4145162333181325E-02 8.4105749370083124E-02 8.4066316663927429E-02 + 8.4026864234930596E-02 8.3987392103382130E-02 8.3947900289644634E-02 8.3908388814153856E-02 8.3868857697418697E-02 + 8.3829306960021194E-02 8.3789736622616504E-02 8.3750146705933032E-02 8.3710537230772278E-02 8.3670908218009002E-02 + 8.3631259688591059E-02 8.3591591663539563E-02 8.3551904163948809E-02 8.3512197210986280E-02 8.3472470825892695E-02 + 8.3432725029982002E-02 8.3392959844641262E-02 8.3353175291330878E-02 8.3313371391584415E-02 8.3273548167008660E-02 + 8.3233705639283631E-02 8.3193843830162581E-02 8.3153962761471995E-02 8.3114062455111548E-02 8.3074142933054193E-02 + 8.3034204217346072E-02 8.2994246330106561E-02 8.2954269293528254E-02 8.2914273129876953E-02 8.2874257861491718E-02 + 8.2834223510784802E-02 8.2794170100241662E-02 8.2754097652420977E-02 8.2714006189954545E-02 8.2673895735547509E-02 + 8.2633766311978080E-02 8.2593617942097700E-02 8.2553450648830962E-02 8.2513264455175678E-02 8.2473059384202740E-02 + 8.2432835459056289E-02 8.2392592702953529E-02 8.2352331139184845E-02 8.2312050791113714E-02 8.2271751682176764E-02 + 8.2231433835883702E-02 8.2191097275817318E-02 8.2150742025633494E-02 8.2110368109061194E-02 8.2069975549902419E-02 + 8.2029564372032196E-02 8.1989134599398605E-02 8.1948686256022724E-02 8.1908219365998666E-02 8.1867733953493435E-02 + 8.1827230042747084E-02 8.1786707658072610E-02 8.1746166823855881E-02 8.1705607564555749E-02 8.1665029904703909E-02 + 8.1624433868904958E-02 8.1583819481836350E-02 8.1543186768248399E-02 8.1502535752964164E-02 8.1461866460879606E-02 + 8.1421178916963349E-02 8.1380473146256876E-02 8.1339749173874334E-02 8.1299007025002590E-02 8.1258246724901242E-02 + 8.1217468298902459E-02 8.1176671772411169E-02 8.1135857170904782E-02 8.1095024519933404E-02 8.1054173845119648E-02 + 8.1013305172158642E-02 8.0972418526818080E-02 8.0931513934938096E-02 8.0890591422431268E-02 8.0849651015282631E-02 + 8.0808692739549590E-02 8.0767716621361924E-02 8.0726722686921715E-02 8.0685710962503418E-02 8.0644681474453694E-02 + 8.0603634249191453E-02 8.0562569313207821E-02 8.0521486693066135E-02 8.0480386415401811E-02 8.0439268506922401E-02 + 8.0398132994407512E-02 8.0356979904708845E-02 8.0315809264750029E-02 8.0274621101526736E-02 8.0233415442106437E-02 + 8.0192192313628646E-02 8.0150951743304652E-02 8.0109693758417547E-02 8.0068418386322240E-02 8.0027125654445377E-02 + 7.9985815590285253E-02 7.9944488221411855E-02 7.9903143575466781E-02 7.9861781680163210E-02 7.9820402563285861E-02 + 7.9779006252690896E-02 7.9737592776305974E-02 7.9696162162130116E-02 7.9654714438233742E-02 7.9613249632758537E-02 + 7.9571767773917529E-02 7.9530268889994871E-02 7.9488753009345978E-02 7.9447220160397319E-02 7.9405670371646475E-02 + 7.9364103671662106E-02 7.9322520089083803E-02 7.9280919652622087E-02 7.9239302391058405E-02 7.9197668333244972E-02 + 7.9156017508104859E-02 7.9114349944631832E-02 7.9072665671890363E-02 7.9030964719015509E-02 7.8989247115212949E-02 + 7.8947512889758834E-02 7.8905762071999813E-02 7.8863994691352995E-02 7.8822210777305751E-02 7.8780410359415784E-02 + 7.8738593467311088E-02 7.8696760130689825E-02 7.8654910379320250E-02 7.8613044243040719E-02 7.8571161751759613E-02 + 7.8529262935455257E-02 7.8487347824175852E-02 7.8445416448039484E-02 7.8403468837233967E-02 7.8361505022016845E-02 + 7.8319525032715318E-02 7.8277528899726168E-02 7.8235516653515705E-02 7.8193488324619712E-02 7.8151443943643331E-02 + 7.8109383541261096E-02 7.8067307148216789E-02 7.8025214795323344E-02 7.7983106513462921E-02 7.7940982333586692E-02 + 7.7898842286714842E-02 7.7856686403936476E-02 7.7814514716409600E-02 7.7772327255361012E-02 7.7730124052086194E-02 + 7.7687905137949320E-02 7.7645670544383150E-02 7.7603420302888970E-02 7.7561154445036473E-02 7.7518873002463753E-02 + 7.7476576006877226E-02 7.7434263490051433E-02 7.7391935483829194E-02 7.7349592020121302E-02 7.7307233130906636E-02 + 7.7264858848231921E-02 7.7222469204211774E-02 7.7180064231028606E-02 7.7137643960932450E-02 7.7095208426241055E-02 + 7.7052757659339596E-02 7.7010291692680810E-02 7.6967810558784738E-02 7.6925314290238772E-02 7.6882802919697513E-02 + 7.6840276479882660E-02 7.6797735003583015E-02 7.6755178523654335E-02 7.6712607073019259E-02 7.6670020684667273E-02 + 7.6627419391654530E-02 7.6584803227103870E-02 7.6542172224204619E-02 7.6499526416212674E-02 7.6456865836450241E-02 + 7.6414190518305822E-02 7.6371500495234126E-02 7.6328795800756050E-02 7.6286076468458447E-02 7.6243342531994135E-02 + 7.6200594025081780E-02 7.6157830981505803E-02 7.6115053435116375E-02 7.6072261419829090E-02 7.6029454969625182E-02 + 7.5986634118551236E-02 7.5943798900719117E-02 7.5900949350305918E-02 7.5858085501553832E-02 7.5815207388770081E-02 + 7.5772315046326838E-02 7.5729408508661125E-02 7.5686487810274594E-02 7.5643552985733664E-02 7.5600604069669244E-02 + 7.5557641096776651E-02 7.5514664101815593E-02 7.5471673119610019E-02 7.5428668185048023E-02 7.5385649333081742E-02 + 7.5342616598727249E-02 7.5299570017064499E-02 7.5256509623237142E-02 7.5213435452452487E-02 7.5170347539981447E-02 + 7.5127245921158270E-02 7.5084130631380613E-02 7.5041001706109306E-02 7.4997859180868348E-02 7.4954703091244732E-02 + 7.4911533472888370E-02 7.4868350361511959E-02 7.4825153792890953E-02 7.4781943802863321E-02 7.4738720427329597E-02 + 7.4695483702252596E-02 7.4652233663657502E-02 7.4608970347631531E-02 7.4565693790324100E-02 7.4522404027946409E-02 + 7.4479101096771555E-02 7.4435785033134388E-02 7.4392455873431254E-02 7.4349113654120058E-02 7.4305758411720060E-02 + 7.4262390182811791E-02 7.4219009004036898E-02 7.4175614912098078E-02 7.4132207943758938E-02 7.4088788135843880E-02 + 7.4045355525237957E-02 7.4001910148886865E-02 7.3958452043796682E-02 7.3914981247033815E-02 7.3871497795724911E-02 + 7.3828001727056655E-02 7.3784493078275767E-02 7.3740971886688780E-02 7.3697438189661957E-02 7.3653892024621179E-02 + 7.3610333429051780E-02 7.3566762440498507E-02 7.3523179096565305E-02 7.3479583434915244E-02 7.3435975493270397E-02 + 7.3392355309411711E-02 7.3348722921178861E-02 7.3305078366470128E-02 7.3261421683242303E-02 7.3217752909510547E-02 + 7.3174072083348252E-02 7.3130379242886873E-02 7.3086674426315903E-02 7.3042957671882680E-02 7.2999229017892284E-02 + 7.2955488502707277E-02 7.2911736164747859E-02 7.2867972042491388E-02 7.2824196174472583E-02 7.2780408599283072E-02 + 7.2736609355571538E-02 7.2692798482043450E-02 7.2648976017460884E-02 7.2605142000642553E-02 7.2561296470463471E-02 + 7.2517439465854941E-02 7.2473571025804484E-02 7.2429691189355522E-02 7.2385799995607389E-02 7.2341897483715084E-02 + 7.2297983692889270E-02 7.2254058662395995E-02 7.2210122431556653E-02 7.2166175039747774E-02 7.2122216526400940E-02 + 7.2078246931002649E-02 7.2034266293094090E-02 7.1990274652271133E-02 7.1946272048184060E-02 7.1902258520537485E-02 + 7.1858234109090230E-02 7.1814198853655156E-02 7.1770152794099026E-02 7.1726095970342324E-02 7.1682028422359184E-02 + 7.1637950190177158E-02 7.1593861313877155E-02 7.1549761833593281E-02 7.1505651789512625E-02 7.1461531221875138E-02 + 7.1417400170973575E-02 7.1373258677153203E-02 7.1329106780811793E-02 7.1284944522399363E-02 7.1240771942418096E-02 + 7.1196589081422110E-02 7.1152395980017449E-02 7.1108192678861801E-02 7.1063979218664336E-02 7.1019755640185742E-02 + 7.0975521984237802E-02 7.0931278291683497E-02 7.0887024603436655E-02 7.0842760960461937E-02 7.0798487403774604E-02 + 7.0754203974440322E-02 7.0709910713575186E-02 7.0665607662345392E-02 7.0621294861967110E-02 7.0576972353706385E-02 + 7.0532640178878961E-02 7.0488298378850095E-02 7.0443946995034409E-02 7.0399586068895792E-02 7.0355215641947091E-02 + 7.0310835755750173E-02 7.0266446451915529E-02 7.0222047772102336E-02 7.0177639758018107E-02 7.0133222451418620E-02 + 7.0088795894107839E-02 7.0044360127937508E-02 6.9999915194807305E-02 6.9955461136664399E-02 6.9910997995503460E-02 + 6.9866525813366456E-02 6.9822044632342414E-02 6.9777554494567337E-02 6.9733055442224107E-02 6.9688547517542068E-02 + 6.9644030762797168E-02 6.9599505220311580E-02 6.9554970932453594E-02 6.9510427941637504E-02 6.9465876290323358E-02 + 6.9421316021016852E-02 6.9376747176269113E-02 6.9332169798676582E-02 6.9287583930880817E-02 6.9242989615568282E-02 + 6.9198386895470282E-02 6.9153775813362683E-02 6.9109156412065789E-02 6.9064528734444214E-02 6.9019892823406606E-02 + 6.8975248721905594E-02 6.8930596472937505E-02 6.8885936119542274E-02 6.8841267704803227E-02 6.8796591271846938E-02 + 6.8751906863842999E-02 6.8707214524003912E-02 6.8662514295584870E-02 6.8617806221883626E-02 6.8573090346240248E-02 + 6.8528366712037006E-02 6.8483635362698136E-02 6.8438896341689787E-02 6.8394149692519626E-02 6.8349395458736903E-02 + 6.8304633683932095E-02 6.8259864411736815E-02 6.8215087685823628E-02 6.8170303549905803E-02 6.8125512047737216E-02 + 6.8080713223112141E-02 6.8035907119865041E-02 6.7991093781870460E-02 6.7946273253042727E-02 6.7901445577335892E-02 + 6.7856610798743486E-02 6.7811768961298327E-02 6.7766920109072343E-02 6.7722064286176456E-02 6.7677201536760295E-02 + 6.7632331905012069E-02 6.7587455435158386E-02 6.7542572171464074E-02 6.7497682158231903E-02 6.7452785439802571E-02 + 6.7407882060554369E-02 6.7362972064903090E-02 6.7318055497301701E-02 6.7273132402240379E-02 6.7228202824246117E-02 + 6.7183266807882669E-02 6.7138324397750276E-02 6.7093375638485539E-02 6.7048420574761208E-02 6.7003459251285979E-02 + 6.6958491712804311E-02 6.6913518004096242E-02 6.6868538169977232E-02 6.6823552255297888E-02 6.6778560304943876E-02 + 6.6733562363835625E-02 6.6688558476928256E-02 6.6643548689211254E-02 6.6598533045708397E-02 6.6553511591477502E-02 + 6.6508484371610194E-02 6.6463451431231849E-02 6.6418412815501218E-02 6.6373368569610403E-02 6.6328318738784559E-02 + 6.6283263368281733E-02 6.6238202503392643E-02 6.6193136189440518E-02 6.6148064471780940E-02 6.6102987395801505E-02 + 6.6057905006921783E-02 6.6012817350593056E-02 6.5967724472298081E-02 6.5922626417551020E-02 6.5877523231897064E-02 + 6.5832414960912383E-02 6.5787301650203869E-02 6.5742183345408919E-02 6.5697060092195336E-02 6.5651931936260954E-02 + 6.5606798923333612E-02 6.5561661099170887E-02 6.5516518509559821E-02 6.5471371200316875E-02 6.5426219217287598E-02 + 6.5381062606346491E-02 6.5335901413396805E-02 6.5290735684370271E-02 6.5245565465226987E-02 6.5200390801955208E-02 + 6.5155211740571053E-02 6.5110028327118444E-02 6.5064840607668775E-02 6.5019648628320756E-02 6.4974452435200239E-02 + 6.4929252074459987E-02 6.4884047592279476E-02 6.4838839034864676E-02 6.4793626448447897E-02 6.4748409879287497E-02 + 6.4703189373667772E-02 6.4657964977898663E-02 6.4612736738315676E-02 6.4567504701279491E-02 6.4522268913175959E-02 + 6.4477029420415707E-02 6.4431786269434133E-02 6.4386539506691001E-02 6.4341289178670366E-02 6.4296035331880302E-02 + 6.4250778012852783E-02 6.4205517268143289E-02 6.4160253144330839E-02 6.4114985688017628E-02 6.4069714945828804E-02 + 6.4024440964412427E-02 6.3979163790439039E-02 6.3933883470601582E-02 6.3888600051615216E-02 6.3843313580217026E-02 + 6.3798024103165846E-02 6.3752731667242102E-02 6.3707436319247496E-02 6.3662138106004879E-02 6.3616837074358015E-02 + 6.3571533271171349E-02 6.3526226743329875E-02 6.3480917537738824E-02 6.3435605701323491E-02 6.3390291281029049E-02 + 6.3344974323820330E-02 6.3299654876681571E-02 6.3254332986616285E-02 6.3209008700646954E-02 6.3163682065814852E-02 + 6.3118353129179891E-02 6.3073021937820328E-02 6.3027688538832560E-02 6.2982352979330997E-02 6.2937015306447727E-02 + 6.2891675567332384E-02 6.2846333809151930E-02 6.2800990079090416E-02 6.2755644424348722E-02 6.2710296892144496E-02 + 6.2664947529711787E-02 6.2619596384300841E-02 6.2574243503178001E-02 6.2528888933625418E-02 6.2483532722940799E-02 + 6.2438174918437242E-02 6.2392815567443041E-02 6.2347454717301423E-02 6.2302092415370360E-02 6.2256728709022290E-02 + 6.2211363645644072E-02 6.2165997272636539E-02 6.2120629637414451E-02 6.2075260787406224E-02 6.2029890770053699E-02 + 6.1984519632811971E-02 6.1939147423149099E-02 6.1893774188545962E-02 6.1848399976496021E-02 6.1803024834505074E-02 + 6.1757648810091048E-02 6.1712271950783854E-02 6.1666894304125024E-02 6.1621515917667659E-02 6.1576136838976052E-02 + 6.1530757115625619E-02 6.1485376795202579E-02 6.1439995925303782E-02 6.1394614553536418E-02 6.1349232727517980E-02 + 6.1303850494875814E-02 6.1258467903247057E-02 6.1213085000278333E-02 6.1167701833625680E-02 6.1122318450954082E-02 + 6.1076934899937485E-02 6.1031551228258478E-02 6.0986167483608071E-02 6.0940783713685456E-02 6.0895399966197881E-02 + 6.0850016288860345E-02 6.0804632729395361E-02 6.0759249335532846E-02 6.0713866155009802E-02 6.0668483235570135E-02 + 6.0623100624964399E-02 6.0577718370949676E-02 6.0532336521289219E-02 6.0486955123752351E-02 6.0441574226114174E-02 + 6.0396193876155350E-02 6.0350814121661933E-02 6.0305435010425082E-02 6.0260056590240939E-02 6.0214678908910267E-02 + 6.0169302014238375E-02 6.0123925954034797E-02 6.0078550776113099E-02 6.0033176528290710E-02 5.9987803258388608E-02 + 5.9942431014231190E-02 5.9897059843645968E-02 5.9851689794463411E-02 5.9806320914516750E-02 5.9760953251641637E-02 + 5.9715586853676041E-02 5.9670221768459986E-02 5.9624858043835334E-02 5.9579495727645523E-02 5.9534134867735455E-02 + 5.9488775511951135E-02 5.9443417708139545E-02 5.9398061504148447E-02 5.9352706947826017E-02 5.9307354087020807E-02 + 5.9262002969581389E-02 5.9216653643356210E-02 5.9171306156193343E-02 5.9125960555940223E-02 5.9080616890443569E-02 + 5.9035275207548962E-02 5.8989935555100778E-02 5.8944597980941919E-02 5.8899262532913582E-02 5.8853929258855055E-02 + 5.8808598206603453E-02 5.8763269423993597E-02 5.8717942958857676E-02 5.8672618859025090E-02 5.8627297172322228E-02 + 5.8581977946572251E-02 5.8536661229594819E-02 5.8491347069205932E-02 5.8446035513217712E-02 5.8400726609438132E-02 + 5.8355420405670787E-02 5.8310116949714788E-02 5.8264816289364404E-02 5.8219518472408902E-02 5.8174223546632362E-02 + 5.8128931559813378E-02 5.8083642559724889E-02 5.8038356594133977E-02 5.7993073710801583E-02 5.7947793957482334E-02 + 5.7902517381924305E-02 5.7857244031868836E-02 5.7811973955050257E-02 5.7766707199195702E-02 5.7721443812024854E-02 + 5.7676183841249777E-02 5.7630927334574693E-02 5.7585674339695699E-02 5.7540424904300579E-02 5.7495179076068666E-02 + 5.7449936902670494E-02 5.7404698431767646E-02 5.7359463711012533E-02 5.7314232788048168E-02 5.7269005710507928E-02 + 5.7223782526015392E-02 5.7178563282184042E-02 5.7133348026617112E-02 5.7088136806907330E-02 5.7042929670636740E-02 + 5.6997726665376426E-02 5.6952527838686332E-02 5.6907333238115060E-02 5.6862142911199558E-02 5.6816956905465087E-02 + 5.6771775268424793E-02 5.6726598047579631E-02 5.6681425290418058E-02 5.6636257044415932E-02 5.6591093357036139E-02 + 5.6545934275728536E-02 5.6500779847929575E-02 5.6455630121062250E-02 5.6410485142535730E-02 5.6365344959745253E-02 + 5.6320209620071858E-02 5.6275079170882134E-02 5.6229953659528126E-02 5.6184833133346962E-02 5.6139717639660768E-02 + 5.6094607225776354E-02 5.6049501938985072E-02 5.6004401826562571E-02 5.5959306935768567E-02 5.5914217313846659E-02 + 5.5869133008024083E-02 5.5824054065511504E-02 5.5778980533502810E-02 5.5733912459174931E-02 5.5688849889687538E-02 + 5.5643792872182914E-02 5.5598741453785690E-02 5.5553695681602636E-02 5.5508655602722494E-02 5.5463621264215682E-02 + 5.5418592713134152E-02 5.5373569996511163E-02 5.5328553161361017E-02 5.5283542254678922E-02 5.5238537323440716E-02 + 5.5193538414602686E-02 5.5148545575101356E-02 5.5103558851853272E-02 5.5058578291754777E-02 5.5013603941681810E-02 + 5.4968635848489669E-02 5.4923674059012904E-02 5.4878718620064916E-02 5.4833769578437941E-02 5.4788826980902698E-02 + 5.4743890874208258E-02 5.4698961305081804E-02 5.4654038320228436E-02 5.4609121966330935E-02 5.4564212290049589E-02 + 5.4519309338021932E-02 5.4474413156862592E-02 5.4429523793163043E-02 5.4384641293491402E-02 5.4339765704392244E-02 + 5.4294897072386383E-02 5.4250035443970619E-02 5.4205180865617604E-02 5.4160333383775593E-02 5.4115493044868200E-02 + 5.4070659895294304E-02 5.4025833981427719E-02 5.3981015349617037E-02 5.3936204046185439E-02 5.3891400117430481E-02 + 5.3846603609623858E-02 5.3801814569011217E-02 5.3757033041811980E-02 5.3712259074219088E-02 5.3667492712398818E-02 + 5.3622734002490603E-02 5.3577982990606760E-02 5.3533239722832374E-02 5.3488504245225048E-02 5.3443776603814649E-02 + 5.3399056844603207E-02 5.3354345013564668E-02 5.3309641156644633E-02 5.3264945319760219E-02 5.3220257548799881E-02 + 5.3175577889623148E-02 5.3130906388060430E-02 5.3086243089912846E-02 5.3041588040951985E-02 5.2996941286919765E-02 + 5.2952302873528187E-02 5.2907672846459114E-02 5.2863051251364118E-02 5.2818438133864241E-02 5.2773833539549862E-02 + 5.2729237513980377E-02 5.2684650102684139E-02 5.2640071351158141E-02 5.2595501304867939E-02 5.2550940009247288E-02 + 5.2506387509698126E-02 5.2461843851590230E-02 5.2417309080261106E-02 5.2372783241015790E-02 5.2328266379126555E-02 + 5.2283758539832852E-02 5.2239259768341033E-02 5.2194770109824137E-02 5.2150289609421766E-02 5.2105818312239816E-02 + 5.2061356263350345E-02 5.2016903507791340E-02 5.1972460090566525E-02 5.1928026056645198E-02 5.1883601450961971E-02 + 5.1839186318416650E-02 5.1794780703874034E-02 5.1750384652163653E-02 5.1705998208079647E-02 5.1661621416380553E-02 + 5.1617254321789104E-02 5.1572896968992039E-02 5.1528549402639921E-02 5.1484211667346950E-02 5.1439883807690760E-02 + 5.1395565868212222E-02 5.1351257893415284E-02 5.1306959927766772E-02 5.1262672015696134E-02 5.1218394201595414E-02 + 5.1174126529818863E-02 5.1129869044682898E-02 5.1085621790465857E-02 5.1041384811407818E-02 5.0997158151710409E-02 + 5.0952941855536636E-02 5.0908735967010676E-02 5.0864540530217724E-02 5.0820355589203760E-02 5.0776181187975410E-02 + 5.0732017370499739E-02 5.0687864180704055E-02 5.0643721662475757E-02 5.0599589859662147E-02 5.0555468816070169E-02 + 5.0511358575466396E-02 5.0467259181576650E-02 5.0423170678085938E-02 5.0379093108638279E-02 5.0335026516836467E-02 + 5.0290970946241909E-02 5.0246926440374449E-02 5.0202893042712159E-02 5.0158870796691256E-02 5.0114859745705800E-02 + 5.0070859933107566E-02 5.0026871402205915E-02 4.9982894196267516E-02 4.9938928358516259E-02 4.9894973932133012E-02 + 4.9851030960255484E-02 4.9807099485978050E-02 4.9763179552351537E-02 4.9719271202383092E-02 4.9675374479035972E-02 + 4.9631489425229408E-02 4.9587616083838368E-02 4.9543754497693458E-02 4.9499904709580690E-02 4.9456066762241339E-02 + 4.9412240698371780E-02 4.9368426560623249E-02 4.9324624391601762E-02 4.9280834233867886E-02 4.9237056129936570E-02 + 4.9193290122277009E-02 4.9149536253312455E-02 4.9105794565419990E-02 4.9062065100930481E-02 4.9018347902128293E-02 + 4.8974643011251165E-02 4.8930950470490092E-02 4.8887270321989022E-02 4.8843602607844878E-02 4.8799947370107198E-02 + 4.8756304650778105E-02 4.8712674491812089E-02 4.8669056935115841E-02 4.8625452022548095E-02 4.8581859795919446E-02 + 4.8538280296992253E-02 4.8494713567480342E-02 4.8451159649048968E-02 4.8407618583314625E-02 4.8364090411844855E-02 + 4.8320575176158058E-02 4.8277072917723408E-02 4.8233583677960649E-02 4.8190107498239917E-02 4.8146644419881632E-02 + 4.8103194484156273E-02 4.8059757732284276E-02 4.8016334205435836E-02 4.7972923944730766E-02 4.7929526991238341E-02 + 4.7886143385977124E-02 4.7842773169914837E-02 4.7799416383968174E-02 4.7756073069002661E-02 4.7712743265832504E-02 + 4.7669427015220402E-02 4.7626124357877442E-02 4.7582835334462927E-02 4.7539559985584193E-02 4.7496298351796466E-02 + 4.7453050473602758E-02 4.7409816391453634E-02 4.7366596145747134E-02 4.7323389776828595E-02 4.7280197324990426E-02 + 4.7237018830472134E-02 4.7193854333459954E-02 4.7150703874086902E-02 4.7107567492432480E-02 4.7064445228522579E-02 + 4.7021337122329386E-02 4.6978243213771115E-02 4.6935163542711975E-02 4.6892098148961961E-02 4.6849047072276703E-02 + 4.6806010352357375E-02 4.6762988028850490E-02 4.6719980141347796E-02 4.6676986729386083E-02 4.6634007832447102E-02 + 4.6591043489957386E-02 4.6548093741288092E-02 4.6505158625754904E-02 4.6462238182617827E-02 4.6419332451081138E-02 + 4.6376441470293107E-02 4.6333565279346046E-02 4.6290703917275966E-02 4.6247857423062595E-02 4.6205025835629139E-02 + 4.6162209193842209E-02 4.6119407536511642E-02 4.6076620902390376E-02 4.6033849330174320E-02 4.5991092858502218E-02 + 4.5948351525955479E-02 4.5905625371058113E-02 4.5862914432276504E-02 4.5820218748019351E-02 4.5777538356637525E-02 + 4.5734873296423853E-02 4.5692223605613112E-02 4.5649589322381813E-02 4.5606970484848068E-02 4.5564367131071495E-02 + 4.5521779299053086E-02 4.5479207026735045E-02 4.5436650352000660E-02 4.5394109312674236E-02 4.5351583946520849E-02 + 4.5309074291246358E-02 4.5266580384497157E-02 4.5224102263860116E-02 4.5181639966862426E-02 4.5139193530971497E-02 + 4.5096762993594788E-02 4.5054348392079745E-02 4.5011949763713602E-02 4.4969567145723317E-02 4.4927200575275446E-02 + 4.4884850089475965E-02 4.4842515725370180E-02 4.4800197519942631E-02 4.4757895510116961E-02 4.4715609732755728E-02 + 4.4673340224660373E-02 4.4631087022571077E-02 4.4588850163166577E-02 4.4546629683064137E-02 4.4504425618819371E-02 + 4.4462238006926176E-02 4.4420066883816542E-02 4.4377912285860480E-02 4.4335774249365925E-02 4.4293652810578586E-02 + 4.4251548005681811E-02 4.4209459870796559E-02 4.4167388441981169E-02 4.4125333755231325E-02 4.4083295846479957E-02 + 4.4041274751597033E-02 4.3999270506389562E-02 4.3957283146601397E-02 4.3915312707913150E-02 4.3873359225942106E-02 + 4.3831422736242076E-02 4.3789503274303310E-02 4.3747600875552399E-02 4.3705715575352126E-02 4.3663847409001380E-02 + 4.3621996411735052E-02 4.3580162618723946E-02 4.3538346065074646E-02 4.3496546785829385E-02 4.3454764815965996E-02 + 4.3413000190397795E-02 4.3371252943973447E-02 4.3329523111476885E-02 4.3287810727627177E-02 4.3246115827078491E-02 + 4.3204438444419908E-02 4.3162778614175397E-02 4.3121136370803656E-02 4.3079511748698042E-02 4.3037904782186442E-02 + 4.2996315505531263E-02 4.2954743952929163E-02 4.2913190158511132E-02 4.2871654156342295E-02 4.2830135980421825E-02 + 4.2788635664682877E-02 4.2747153242992456E-02 4.2705688749151358E-02 4.2664242216894015E-02 4.2622813679888502E-02 + 4.2581403171736310E-02 4.2540010725972396E-02 4.2498636376064970E-02 4.2457280155415458E-02 4.2415942097358411E-02 + 4.2374622235161405E-02 4.2333320602024958E-02 4.2292037231082408E-02 4.2250772155399879E-02 4.2209525407976151E-02 + 4.2168297021742553E-02 4.2127087029562957E-02 4.2085895464233580E-02 4.2044722358483000E-02 4.2003567744971999E-02 + 4.1962431656293521E-02 4.1921314124972534E-02 4.1880215183466012E-02 4.1839134864162797E-02 4.1798073199383563E-02 + 4.1757030221380678E-02 4.1716005962338147E-02 4.1675000454371579E-02 4.1634013729527991E-02 4.1593045819785839E-02 + 4.1552096757054902E-02 4.1511166573176148E-02 4.1470255299921752E-02 4.1429362968994930E-02 4.1388489612029920E-02 + 4.1347635260591861E-02 4.1306799946176746E-02 4.1265983700211360E-02 4.1225186554053127E-02 4.1184408538990129E-02 + 4.1143649686240985E-02 4.1102910026954757E-02 4.1062189592210925E-02 4.1021488413019280E-02 4.0980806520319865E-02 + 4.0940143944982889E-02 4.0899500717808665E-02 4.0858876869527556E-02 4.0818272430799864E-02 4.0777687432215812E-02 + 4.0737121904295397E-02 4.0696575877488428E-02 4.0656049382174361E-02 4.0615542448662278E-02 4.0575055107190824E-02 + 4.0534587387928131E-02 4.0494139320971713E-02 4.0453710936348454E-02 4.0413302264014565E-02 4.0372913333855419E-02 + 4.0332544175685589E-02 4.0292194819248728E-02 4.0251865294217523E-02 4.0211555630193609E-02 4.0171265856707591E-02 + 4.0130996003218858E-02 4.0090746099115636E-02 4.0050516173714808E-02 4.0010306256262007E-02 3.9970116375931411E-02 + 3.9929946561825788E-02 3.9889796842976367E-02 3.9849667248342838E-02 3.9809557806813251E-02 3.9769468547203979E-02 + 3.9729399498259668E-02 3.9689350688653161E-02 3.9649322146985459E-02 3.9609313901785702E-02 3.9569325981511000E-02 + 3.9529358414546530E-02 3.9489411229205386E-02 3.9449484453728534E-02 3.9409578116284802E-02 3.9369692244970785E-02 + 3.9329826867810856E-02 3.9289982012757033E-02 3.9250157707688978E-02 3.9210353980413962E-02 3.9170570858666778E-02 + 3.9130808370109731E-02 3.9091066542332568E-02 3.9051345402852419E-02 3.9011644979113788E-02 3.8971965298488467E-02 + 3.8932306388275544E-02 3.8892668275701293E-02 3.8853050987919184E-02 3.8813454552009810E-02 3.8773878994980852E-02 + 3.8734324343767043E-02 3.8694790625230110E-02 3.8655277866158778E-02 3.8615786093268635E-02 3.8576315333202202E-02 + 3.8536865612528844E-02 3.8497436957744678E-02 3.8458029395272660E-02 3.8418642951462412E-02 3.8379277652590263E-02 + 3.8339933524859246E-02 3.8300610594398932E-02 3.8261308887265512E-02 3.8222028429441716E-02 3.8182769246836813E-02 + 3.8143531365286504E-02 3.8104314810552944E-02 3.8065119608324725E-02 3.8025945784216787E-02 3.7986793363770435E-02 + 3.7947662372453263E-02 3.7908552835659158E-02 3.7869464778708270E-02 3.7830398226846959E-02 3.7791353205247763E-02 + 3.7752329739009410E-02 3.7713327853156745E-02 3.7674347572640723E-02 3.7635388922338371E-02 3.7596451927052785E-02 + 3.7557536611513065E-02 3.7518643000374316E-02 3.7479771118217625E-02 3.7440920989550021E-02 3.7402092638804459E-02 + 3.7363286090339794E-02 3.7324501368440760E-02 3.7285738497317943E-02 3.7246997501107763E-02 3.7208278403872454E-02 + 3.7169581229600034E-02 3.7130906002204270E-02 3.7092252745524718E-02 3.7053621483326651E-02 3.7015012239301016E-02 + 3.6976425037064498E-02 3.6937859900159416E-02 3.6899316852053776E-02 3.6860795916141199E-02 3.6822297115740928E-02 + 3.6783820474097825E-02 3.6745366014382323E-02 3.6706933759690460E-02 3.6668523733043780E-02 3.6630135957389433E-02 + 3.6591770455600060E-02 3.6553427250473822E-02 3.6515106364734408E-02 3.6476807821031000E-02 3.6438531641938221E-02 + 3.6400277849956225E-02 3.6362046467510574E-02 3.6323837516952312E-02 3.6285651020557919E-02 3.6247487000529280E-02 + 3.6209345478993758E-02 3.6171226478004068E-02 3.6133130019538391E-02 3.6095056125500249E-02 3.6057004817718612E-02 + 3.6018976117947799E-02 3.5980970047867544E-02 3.5942986629082928E-02 3.5905025883124393E-02 3.5867087831447798E-02 + 3.5829172495434339E-02 3.5791279896390554E-02 3.5753410055548399E-02 3.5715562994065093E-02 3.5677738733023302E-02 + 3.5639937293430977E-02 3.5602158696221471E-02 3.5564402962253466E-02 3.5526670112310983E-02 3.5488960167103421E-02 + 3.5451273147265538E-02 3.5413609073357430E-02 3.5375967965864515E-02 3.5338349845197660E-02 3.5300754731693029E-02 + 3.5263182645612179E-02 3.5225633607142023E-02 3.5188107636394871E-02 3.5150604753408386E-02 3.5113124978145650E-02 + 3.5075668330495108E-02 3.5038234830270638E-02 3.5000824497211473E-02 3.4963437350982306E-02 3.4926073411173243E-02 + 3.4888732697299807E-02 3.4851415228802946E-02 3.4814121025049098E-02 3.4776850105330104E-02 3.4739602488863347E-02 + 3.4702378194791592E-02 3.4665177242183175E-02 3.4627999650031903E-02 3.4590845437257080E-02 3.4553714622703548E-02 + 3.4516607225141709E-02 3.4479523263267475E-02 3.4442462755702376E-02 3.4405425720993463E-02 3.4368412177613418E-02 + 3.4331422143960524E-02 3.4294455638358708E-02 3.4257512679057495E-02 3.4220593284232118E-02 3.4183697471983444E-02 + 3.4146825260338055E-02 3.4109976667248257E-02 3.4073151710592060E-02 3.4036350408173231E-02 3.3999572777721303E-02 + 3.3962818836891603E-02 3.3926088603265250E-02 3.3889382094349219E-02 3.3852699327576299E-02 3.3816040320305177E-02 + 3.3779405089820434E-02 3.3742793653332534E-02 3.3706206027977921E-02 3.3669642230818968E-02 3.3633102278844057E-02 + 3.3596586188967541E-02 3.3560093978029858E-02 3.3523625662797464E-02 3.3487181259962924E-02 3.3450760786144909E-02 + 3.3414364257888213E-02 3.3377991691663798E-02 3.3341643103868800E-02 3.3305318510826638E-02 3.3269017928786900E-02 + 3.3232741373925477E-02 3.3196488862344595E-02 3.3160260410072744E-02 3.3124056033064848E-02 3.3087875747202164E-02 + 3.3051719568292427E-02 3.3015587512069761E-02 3.2979479594194845E-02 3.2943395830254837E-02 3.2907336235763439E-02 + 3.2871300826160951E-02 3.2835289616814284E-02 3.2799302623016981E-02 3.2763339859989297E-02 3.2727401342878201E-02 + 3.2691487086757377E-02 3.2655597106627354E-02 3.2619731417415400E-02 3.2583890033975750E-02 3.2548072971089421E-02 + 3.2512280243464434E-02 3.2476511865735767E-02 3.2440767852465399E-02 3.2405048218142329E-02 3.2369352977182679E-02 + 3.2333682143929648E-02 3.2298035732653628E-02 3.2262413757552219E-02 3.2226816232750213E-02 3.2191243172299738E-02 + 3.2155694590180188E-02 3.2120170500298355E-02 3.2084670916488443E-02 3.2049195852512050E-02 3.2013745322058307E-02 + 3.1978319338743892E-02 3.1942917916112985E-02 3.1907541067637428E-02 3.1872188806716731E-02 3.1836861146678094E-02 + 3.1801558100776464E-02 3.1766279682194601E-02 3.1731025904043052E-02 3.1695796779360332E-02 3.1660592321112797E-02 + 3.1625412542194857E-02 3.1590257455428900E-02 3.1555127073565392E-02 3.1520021409282943E-02 3.1484940475188315E-02 + 3.1449884283816461E-02 3.1414852847630646E-02 3.1379846179022390E-02 3.1344864290311650E-02 3.1309907193746732E-02 + 3.1274974901504410E-02 3.1240067425690025E-02 3.1205184778337440E-02 3.1170326971409101E-02 3.1135494016796196E-02 + 3.1100685926318591E-02 3.1065902711724904E-02 3.1031144384692639E-02 3.0996410956828098E-02 3.0961702439666571E-02 + 3.0927018844672326E-02 3.0892360183238651E-02 3.0857726466687919E-02 3.0823117706271691E-02 3.0788533913170681E-02 + 3.0753975098494896E-02 3.0719441273283649E-02 3.0684932448505616E-02 3.0650448635058909E-02 3.0615989843771108E-02 + 3.0581556085399350E-02 3.0547147370630374E-02 3.0512763710080562E-02 3.0478405114295996E-02 3.0444071593752575E-02 + 3.0409763158855990E-02 3.0375479819941830E-02 3.0341221587275653E-02 3.0306988471053023E-02 3.0272780481399572E-02 + 3.0238597628371028E-02 3.0204439921953364E-02 3.0170307372062791E-02 3.0136199988545814E-02 3.0102117781179324E-02 + 3.0068060759670678E-02 3.0034028933657708E-02 3.0000022312708801E-02 2.9966040906322995E-02 2.9932084723930000E-02 + 2.9898153774890305E-02 2.9864248068495178E-02 2.9830367613966825E-02 2.9796512420458342E-02 2.9762682497053879E-02 + 2.9728877852768641E-02 2.9695098496548986E-02 2.9661344437272478E-02 2.9627615683747967E-02 2.9593912244715640E-02 + 2.9560234128847087E-02 2.9526581344745364E-02 2.9492953900945106E-02 2.9459351805912536E-02 2.9425775068045553E-02 + 2.9392223695673805E-02 2.9358697697058792E-02 2.9325197080393828E-02 2.9291721853804256E-02 2.9258272025347396E-02 + 2.9224847603012687E-02 2.9191448594721708E-02 2.9158075008328319E-02 2.9124726851618626E-02 2.9091404132311149E-02 + 2.9058106858056855E-02 2.9024835036439212E-02 2.8991588674974297E-02 2.8958367781110834E-02 2.8925172362230307E-02 + 2.8892002425646983E-02 2.8858857978608023E-02 2.8825739028293544E-02 2.8792645581816691E-02 2.8759577646223691E-02 + 2.8726535228493975E-02 2.8693518335540225E-02 2.8660526974208417E-02 2.8627561151277958E-02 2.8594620873461710E-02 + 2.8561706147406104E-02 2.8528816979691170E-02 2.8495953376830668E-02 2.8463115345272134E-02 2.8430302891396936E-02 + 2.8397516021520387E-02 2.8364754741891804E-02 2.8332019058694608E-02 2.8299308978046375E-02 2.8266624505998893E-02 + 2.8233965648538323E-02 2.8201332411585157E-02 2.8168724800994426E-02 2.8136142822555676E-02 2.8103586481993112E-02 + 2.8071055784965618E-02 2.8038550737066903E-02 2.8006071343825538E-02 2.7973617610705052E-02 2.7941189543103980E-02 + 2.7908787146355987E-02 2.7876410425729962E-02 2.7844059386430010E-02 2.7811734033595648E-02 2.7779434372301789E-02 + 2.7747160407558882E-02 2.7714912144312973E-02 2.7682689587445797E-02 2.7650492741774862E-02 2.7618321612053506E-02 + 2.7586176202970998E-02 2.7554056519152641E-02 2.7521962565159822E-02 2.7489894345490096E-02 2.7457851864577318E-02 + 2.7425835126791653E-02 2.7393844136439745E-02 2.7361878897764688E-02 2.7329939414946245E-02 2.7298025692100835E-02 + 2.7266137733281657E-02 2.7234275542478734E-02 2.7202439123619099E-02 2.7170628480566759E-02 2.7138843617122849E-02 + 2.7107084537025726E-02 2.7075351243950989E-02 2.7043643741511660E-02 2.7011962033258185E-02 2.6980306122678595E-02 + 2.6948676013198510E-02 2.6917071708181299E-02 2.6885493210928160E-02 2.6853940524678144E-02 2.6822413652608311E-02 + 2.6790912597833810E-02 2.6759437363407919E-02 2.6727987952322195E-02 2.6696564367506510E-02 2.6665166611829199E-02 + 2.6633794688097082E-02 2.6602448599055608E-02 2.6571128347388909E-02 2.6539833935719914E-02 2.6508565366610413E-02 + 2.6477322642561200E-02 2.6446105766012064E-02 2.6414914739342005E-02 2.6383749564869233E-02 2.6352610244851291E-02 + 2.6321496781485119E-02 2.6290409176907215E-02 2.6259347433193650E-02 2.6228311552360190E-02 2.6197301536362405E-02 + 2.6166317387095721E-02 2.6135359106395542E-02 2.6104426696037356E-02 2.6073520157736788E-02 2.6042639493149701E-02 + 2.6011784703872332E-02 2.5980955791441312E-02 2.5950152757333821E-02 2.5919375602967667E-02 2.5888624329701359E-02 + 2.5857898938834219E-02 2.5827199431606468E-02 2.5796525809199323E-02 2.5765878072735091E-02 2.5735256223277273E-02 + 2.5704660261830634E-02 2.5674090189341321E-02 2.5643546006696938E-02 2.5613027714726677E-02 2.5582535314201349E-02 + 2.5552068805833560E-02 2.5521628190277736E-02 2.5491213468130259E-02 2.5460824639929554E-02 2.5430461706156177E-02 + 2.5400124667232894E-02 2.5369813523524857E-02 2.5339528275339588E-02 2.5309268922927140E-02 2.5279035466480203E-02 + 2.5248827906134162E-02 2.5218646241967225E-02 2.5188490474000499E-02 2.5158360602198115E-02 2.5128256626467272E-02 + 2.5098178546658394E-02 2.5068126362565203E-02 2.5038100073924811E-02 2.5008099680417808E-02 2.4978125181668396E-02 + 2.4948176577244463E-02 2.4918253866657660E-02 2.4888357049363555E-02 2.4858486124761686E-02 2.4828641092195680E-02 + 2.4798821950953325E-02 2.4769028700266711E-02 2.4739261339312292E-02 2.4709519867210997E-02 2.4679804283028364E-02 + 2.4650114585774575E-02 2.4620450774404588E-02 2.4590812847818250E-02 2.4561200804860388E-02 2.4531614644320875E-02 + 2.4502054364934783E-02 2.4472519965382453E-02 2.4443011444289602E-02 2.4413528800227423E-02 2.4384072031712681E-02 + 2.4354641137207804E-02 2.4325236115121010E-02 2.4295856963806411E-02 2.4266503681564060E-02 2.4237176266640112E-02 + 2.4207874717226897E-02 2.4178599031463022E-02 2.4149349207433467E-02 2.4120125243169713E-02 2.4090927136649825E-02 + 2.4061754885798533E-02 2.4032608488487369E-02 2.4003487942534749E-02 2.3974393245706091E-02 2.3945324395713893E-02 + 2.3916281390217831E-02 2.3887264226824925E-02 2.3858272903089537E-02 2.3829307416513571E-02 2.3800367764546530E-02 + 2.3771453944585581E-02 2.3742565953975756E-02 2.3713703790009949E-02 2.3684867449929099E-02 2.3656056930922247E-02 + 2.3627272230126652E-02 2.3598513344627897E-02 2.3569780271459985E-02 2.3541073007605454E-02 2.3512391549995449E-02 + 2.3483735895509887E-02 2.3455106040977475E-02 2.3426501983175904E-02 2.3397923718831887E-02 2.3369371244621264E-02 + 2.3340844557169168E-02 2.3312343653050051E-02 2.3283868528787829E-02 2.3255419180856000E-02 2.3226995605677692E-02 + 2.3198597799625839E-02 2.3170225759023211E-02 2.3141879480142579E-02 2.3113558959206786E-02 2.3085264192388866E-02 + 2.3056995175812129E-02 2.3028751905550295E-02 2.3000534377627564E-02 2.2972342588018752E-02 2.2944176532649366E-02 + 2.2916036207395747E-02 2.2887921608085116E-02 2.2859832730495758E-02 2.2831769570357038E-02 2.2803732123349577E-02 + 2.2775720385105329E-02 2.2747734351207673E-02 2.2719774017191548E-02 2.2691839378543525E-02 2.2663930430701924E-02 + 2.2636047169056959E-02 2.2608189588950750E-02 2.2580357685677545E-02 2.2552551454483722E-02 2.2524770890567952E-02 + 2.2497015989081291E-02 2.2469286745127284E-02 2.2441583153762063E-02 2.2413905209994475E-02 2.2386252908786149E-02 + 2.2358626245051645E-02 2.2331025213658519E-02 2.2303449809427455E-02 2.2275900027132377E-02 2.2248375861500535E-02 + 2.2220877307212589E-02 2.2193404358902775E-02 2.2165957011158977E-02 2.2138535258522791E-02 2.2111139095489733E-02 + 2.2083768516509245E-02 2.2056423515984837E-02 2.2029104088274229E-02 2.2001810227689399E-02 2.1974541928496707E-02 + 2.1947299184917016E-02 2.1920081991125811E-02 2.1892890341253232E-02 2.1865724229384292E-02 2.1838583649558874E-02 + 2.1811468595771894E-02 2.1784379061973416E-02 2.1757315042068723E-02 2.1730276529918439E-02 2.1703263519338652E-02 + 2.1676276004100978E-02 2.1649313977932717E-02 2.1622377434516907E-02 2.1595466367492478E-02 2.1568580770454340E-02 + 2.1541720636953473E-02 2.1514885960497044E-02 2.1488076734548521E-02 2.1461292952527786E-02 2.1434534607811213E-02 + 2.1407801693731788E-02 2.1381094203579219E-02 2.1354412130600055E-02 2.1327755467997752E-02 2.1301124208932827E-02 + 2.1274518346522917E-02 2.1247937873842927E-02 2.1221382783925109E-02 2.1194853069759188E-02 2.1168348724292442E-02 + 2.1141869740429836E-02 2.1115416111034107E-02 2.1088987828925879E-02 2.1062584886883774E-02 2.1036207277644502E-02 + 2.1009854993903003E-02 2.0983528028312479E-02 2.0957226373484603E-02 2.0930950021989529E-02 2.0904698966356071E-02 + 2.0878473199071754E-02 2.0852272712582953E-02 2.0826097499294989E-02 2.0799947551572238E-02 2.0773822861738220E-02 + 2.0747723422075742E-02 2.0721649224826954E-02 2.0695600262193511E-02 2.0669576526336633E-02 2.0643578009377227E-02 + 2.0617604703396002E-02 2.0591656600433553E-02 2.0565733692490502E-02 2.0539835971527552E-02 2.0513963429465650E-02 + 2.0488116058186043E-02 2.0462293849530435E-02 2.0436496795301028E-02 2.0410724887260690E-02 2.0384978117133024E-02 + 2.0359256476602489E-02 2.0333559957314479E-02 2.0307888550875484E-02 2.0282242248853128E-02 2.0256621042776334E-02 + 2.0231024924135393E-02 2.0205453884382066E-02 2.0179907914929726E-02 2.0154387007153420E-02 2.0128891152390010E-02 + 2.0103420341938256E-02 2.0077974567058923E-02 2.0052553818974903E-02 2.0027158088871299E-02 2.0001787367895530E-02 + 1.9976441647157474E-02 1.9951120917729534E-02 1.9925825170646720E-02 1.9900554396906835E-02 1.9875308587470514E-02 + 1.9850087733261336E-02 1.9824891825165961E-02 1.9799720854034194E-02 1.9774574810679124E-02 1.9749453685877209E-02 + 1.9724357470368391E-02 1.9699286154856176E-02 1.9674239730007793E-02 1.9649218186454244E-02 1.9624221514790412E-02 + 1.9599249705575219E-02 1.9574302749331668E-02 1.9549380636546970E-02 1.9524483357672668E-02 1.9499610903124708E-02 + 1.9474763263283571E-02 1.9449940428494367E-02 1.9425142389066917E-02 1.9400369135275902E-02 1.9375620657360929E-02 + 1.9350896945526660E-02 1.9326197989942877E-02 1.9301523780744650E-02 1.9276874308032373E-02 1.9252249561871923E-02 + 1.9227649532294722E-02 1.9203074209297854E-02 1.9178523582844203E-02 1.9153997642862478E-02 1.9129496379247407E-02 + 1.9105019781859779E-02 1.9080567840526554E-02 1.9056140545041001E-02 1.9031737885162766E-02 1.9007359850617994E-02 + 1.8983006431099406E-02 1.8958677616266451E-02 1.8934373395745351E-02 1.8910093759129245E-02 1.8885838695978277E-02 + 1.8861608195819699E-02 1.8837402248147977E-02 1.8813220842424889E-02 1.8789063968079632E-02 1.8764931614508918E-02 + 1.8740823771077081E-02 1.8716740427116175E-02 1.8692681571926106E-02 1.8668647194774672E-02 1.8644637284897719E-02 + 1.8620651831499215E-02 1.8596690823751379E-02 1.8572754250794760E-02 1.8548842101738336E-02 1.8524954365659620E-02 + 1.8501091031604786E-02 1.8477252088588737E-02 1.8453437525595220E-02 1.8429647331576936E-02 1.8405881495455610E-02 + 1.8382140006122146E-02 1.8358422852436662E-02 1.8334730023228663E-02 1.8311061507297083E-02 1.8287417293410397E-02 + 1.8263797370306759E-02 1.8240201726694060E-02 1.8216630351250044E-02 1.8193083232622417E-02 1.8169560359428943E-02 + 1.8146061720257525E-02 1.8122587303666327E-02 1.8099137098183882E-02 1.8075711092309175E-02 1.8052309274511728E-02 + 1.8028931633231736E-02 1.8005578156880152E-02 1.7982248833838768E-02 1.7958943652460358E-02 1.7935662601068717E-02 + 1.7912405667958823E-02 1.7889172841396895E-02 1.7865964109620505E-02 1.7842779460838679E-02 1.7819618883231993E-02 + 1.7796482364952692E-02 1.7773369894124726E-02 1.7750281458843945E-02 1.7727217047178105E-02 1.7704176647167041E-02 + 1.7681160246822709E-02 1.7658167834129320E-02 1.7635199397043420E-02 1.7612254923493994E-02 1.7589334401382582E-02 + 1.7566437818583330E-02 1.7543565162943146E-02 1.7520716422281757E-02 1.7497891584391814E-02 1.7475090637039004E-02 + 1.7452313567962150E-02 1.7429560364873285E-02 1.7406831015457751E-02 1.7384125507374327E-02 1.7361443828255305E-02 + 1.7338785965706573E-02 1.7316151907307752E-02 1.7293541640612246E-02 1.7270955153147378E-02 1.7248392432414456E-02 + 1.7225853465888900E-02 1.7203338241020313E-02 1.7180846745232580E-02 1.7158378965923999E-02 1.7135934890467309E-02 + 1.7113514506209866E-02 1.7091117800473673E-02 1.7068744760555515E-02 1.7046395373727034E-02 1.7024069627234847E-02 + 1.7001767508300604E-02 1.6979489004121134E-02 1.6957234101868505E-02 1.6935002788690114E-02 1.6912795051708798E-02 + 1.6890610878022957E-02 1.6868450254706575E-02 1.6846313168809399E-02 1.6824199607356954E-02 1.6802109557350706E-02 + 1.6780043005768127E-02 1.6757999939562767E-02 1.6735980345664397E-02 1.6713984210979058E-02 1.6692011522389180E-02 + 1.6670062266753678E-02 1.6648136430908025E-02 1.6626234001664377E-02 1.6604354965811620E-02 1.6582499310115517E-02 + 1.6560667021318767E-02 1.6538858086141105E-02 1.6517072491279403E-02 1.6495310223407753E-02 1.6473571269177565E-02 + 1.6451855615217652E-02 1.6430163248134358E-02 1.6408494154511580E-02 1.6386848320910932E-02 1.6365225733871804E-02 + 1.6343626379911453E-02 1.6322050245525101E-02 1.6300497317186025E-02 1.6278967581345654E-02 1.6257461024433661E-02 + 1.6235977632858029E-02 1.6214517393005199E-02 1.6193080291240090E-02 1.6171666313906256E-02 1.6150275447325928E-02 + 1.6128907677800133E-02 1.6107562991608770E-02 1.6086241375010722E-02 1.6064942814243914E-02 1.6043667295525435E-02 + 1.6022414805051600E-02 1.6001185328998083E-02 1.5979978853519941E-02 1.5958795364751772E-02 1.5937634848807763E-02 + 1.5916497291781791E-02 1.5895382679747518E-02 1.5874290998758474E-02 1.5853222234848155E-02 1.5832176374030092E-02 + 1.5811153402297960E-02 1.5790153305625672E-02 1.5769176069967441E-02 1.5748221681257890E-02 1.5727290125412137E-02 + 1.5706381388325880E-02 1.5685495455875498E-02 1.5664632313918101E-02 1.5643791948291678E-02 1.5622974344815129E-02 + 1.5602179489288390E-02 1.5581407367492498E-02 1.5560657965189699E-02 1.5539931268123509E-02 1.5519227262018835E-02 + 1.5498545932582024E-02 1.5477887265500985E-02 1.5457251246445255E-02 1.5436637861066096E-02 1.5416047094996575E-02 + 1.5395478933851649E-02 1.5374933363228266E-02 1.5354410368705426E-02 1.5333909935844301E-02 1.5313432050188286E-02 + 1.5292976697263112E-02 1.5272543862576905E-02 1.5252133531620315E-02 1.5231745689866552E-02 1.5211380322771499E-02 + 1.5191037415773798E-02 1.5170716954294916E-02 1.5150418923739261E-02 1.5130143309494233E-02 1.5109890096930336E-02 + 1.5089659271401242E-02 1.5069450818243886E-02 1.5049264722778564E-02 1.5029100970308986E-02 1.5008959546122386E-02 + 1.4988840435489576E-02 1.4968743623665083E-02 1.4948669095887180E-02 1.4928616837377983E-02 1.4908586833343561E-02 + 1.4888579068973985E-02 1.4868593529443431E-02 1.4848630199910253E-02 1.4828689065517070E-02 1.4808770111390861E-02 + 1.4788873322643012E-02 1.4768998684369448E-02 1.4749146181650659E-02 1.4729315799551853E-02 1.4709507523122962E-02 + 1.4689721337398773E-02 1.4669957227398995E-02 1.4650215178128343E-02 1.4630495174576623E-02 1.4610797201718791E-02 + 1.4591121244515070E-02 1.4571467287911005E-02 1.4551835316837559E-02 1.4532225316211175E-02 1.4512637270933880E-02 + 1.4493071165893339E-02 1.4473526985962971E-02 1.4454004716001990E-02 1.4434504340855515E-02 1.4415025845354626E-02 + 1.4395569214316475E-02 1.4376134432544336E-02 1.4356721484827691E-02 1.4337330355942321E-02 1.4317961030650380E-02 + 1.4298613493700473E-02 1.4279287729827726E-02 1.4259983723753875E-02 1.4240701460187358E-02 1.4221440923823362E-02 + 1.4202202099343924E-02 1.4182984971417999E-02 1.4163789524701551E-02 1.4144615743837616E-02 1.4125463613456388E-02 + 1.4106333118175302E-02 1.4087224242599092E-02 1.4068136971319896E-02 1.4049071288917301E-02 1.4030027179958453E-02 + 1.4011004628998108E-02 1.3992003620578728E-02 1.3973024139230546E-02 1.3954066169471650E-02 1.3935129695808042E-02 + 1.3916214702733748E-02 1.3897321174730854E-02 1.3878449096269610E-02 1.3859598451808503E-02 1.3840769225794329E-02 + 1.3821961402662253E-02 1.3803174966835908E-02 1.3784409902727460E-02 1.3765666194737696E-02 1.3746943827256056E-02 + 1.3728242784660774E-02 1.3709563051318896E-02 1.3690904611586384E-02 1.3672267449808180E-02 1.3653651550318292E-02 + 1.3635056897439846E-02 1.3616483475485178E-02 1.3597931268755914E-02 1.3579400261543017E-02 1.3560890438126883E-02 + 1.3542401782777413E-02 1.3523934279754079E-02 1.3505487913305993E-02 1.3487062667671999E-02 1.3468658527080717E-02 + 1.3450275475750654E-02 1.3431913497890226E-02 1.3413572577697892E-02 1.3395252699362165E-02 1.3376953847061735E-02 + 1.3358676004965504E-02 1.3340419157232677E-02 1.3322183288012834E-02 1.3303968381445996E-02 1.3285774421662682E-02 + 1.3267601392784023E-02 1.3249449278921780E-02 1.3231318064178463E-02 1.3213207732647364E-02 1.3195118268412648E-02 + 1.3177049655549425E-02 1.3159001878123803E-02 1.3140974920192977E-02 1.3122968765805298E-02 1.3104983399000325E-02 + 1.3087018803808907E-02 1.3069074964253269E-02 1.3051151864347047E-02 1.3033249488095384E-02 1.3015367819494994E-02 + 1.2997506842534211E-02 1.2979666541193103E-02 1.2961846899443481E-02 1.2944047901249027E-02 1.2926269530565320E-02 + 1.2908511771339925E-02 1.2890774607512446E-02 1.2873058023014618E-02 1.2855362001770353E-02 1.2837686527695815E-02 + 1.2820031584699498E-02 1.2802397156682275E-02 1.2784783227537462E-02 1.2767189781150922E-02 1.2749616801401098E-02 + 1.2732064272159083E-02 1.2714532177288705E-02 1.2697020500646571E-02 1.2679529226082150E-02 1.2662058337437835E-02 + 1.2644607818549003E-02 1.2627177653244096E-02 1.2609767825344665E-02 1.2592378318665462E-02 1.2575009117014474E-02 + 1.2557660204193025E-02 1.2540331563995815E-02 1.2523023180210983E-02 1.2505735036620195E-02 1.2488467116998699E-02 + 1.2471219405115365E-02 1.2453991884732799E-02 1.2436784539607360E-02 1.2419597353489261E-02 1.2402430310122590E-02 + 1.2385283393245424E-02 1.2368156586589863E-02 1.2351049873882101E-02 1.2333963238842486E-02 1.2316896665185586E-02 + 1.2299850136620253E-02 1.2282823636849689E-02 1.2265817149571505E-02 1.2248830658477780E-02 1.2231864147255137E-02 + 1.2214917599584787E-02 1.2197990999142613E-02 1.2181084329599214E-02 1.2164197574619970E-02 1.2147330717865123E-02 + 1.2130483742989806E-02 1.2113656633644138E-02 1.2096849373473264E-02 1.2080061946117425E-02 1.2063294335212015E-02 + 1.2046546524387641E-02 1.2029818497270200E-02 1.2013110237480919E-02 1.1996421728636419E-02 1.1979752954348791E-02 + 1.1963103898225646E-02 1.1946474543870170E-02 1.1929864874881192E-02 1.1913274874853245E-02 1.1896704527376609E-02 + 1.1880153816037412E-02 1.1863622724417638E-02 1.1847111236095217E-02 1.1830619334644080E-02 1.1814147003634218E-02 + 1.1797694226631737E-02 1.1781260987198920E-02 1.1764847268894280E-02 1.1748453055272636E-02 1.1732078329885140E-02 + 1.1715723076279374E-02 1.1699387277999370E-02 1.1683070918585706E-02 1.1666773981575533E-02 1.1650496450502637E-02 + 1.1634238308897522E-02 1.1617999540287430E-02 1.1601780128196437E-02 1.1585580056145479E-02 1.1569399307652418E-02 + 1.1553237866232113E-02 1.1537095715396455E-02 1.1520972838654444E-02 1.1504869219512222E-02 1.1488784841473157E-02 + 1.1472719688037879E-02 1.1456673742704338E-02 1.1440646988967875E-02 1.1424639410321260E-02 1.1408650990254756E-02 + 1.1392681712256167E-02 1.1376731559810904E-02 1.1360800516402047E-02 1.1344888565510369E-02 1.1328995690614425E-02 + 1.1313121875190587E-02 1.1297267102713102E-02 1.1281431356654152E-02 1.1265614620483901E-02 1.1249816877670569E-02 + 1.1234038111680443E-02 1.1218278305977981E-02 1.1202537444025830E-02 1.1186815509284905E-02 1.1171112485214421E-02 + 1.1155428355271954E-02 1.1139763102913503E-02 1.1124116711593530E-02 1.1108489164765029E-02 1.1092880445879555E-02 + 1.1077290538387304E-02 1.1061719425737138E-02 1.1046167091376666E-02 1.1030633518752270E-02 1.1015118691309181E-02 + 1.0999622592491506E-02 1.0984145205742304E-02 1.0968686514503619E-02 1.0953246502216542E-02 1.0937825152321255E-02 + 1.0922422448257104E-02 1.0907038373462611E-02 1.0891672911375562E-02 1.0876326045433033E-02 1.0860997759071457E-02 + 1.0845688035726671E-02 1.0830396858833965E-02 1.0815124211828118E-02 1.0799870078143474E-02 1.0784634441213978E-02 + 1.0769417284473224E-02 1.0754218591354513E-02 1.0739038345290892E-02 1.0723876529715218E-02 1.0708733128060186E-02 + 1.0693608123758412E-02 1.0678501500242438E-02 1.0663413240944823E-02 1.0648343329298161E-02 1.0633291748735152E-02 + 1.0618258482688627E-02 1.0603243514591625E-02 1.0588246827877417E-02 1.0573268405979577E-02 1.0558308232331993E-02 + 1.0543366290368958E-02 1.0528442563525187E-02 1.0513537035235890E-02 1.0498649688936790E-02 1.0483780508064200E-02 + 1.0468929476055037E-02 1.0454096576346912E-02 1.0439281792378128E-02 1.0424485107587781E-02 1.0409706505415750E-02 + 1.0394945969302787E-02 1.0380203482690543E-02 1.0365479029021622E-02 1.0350772591739622E-02 1.0336084154289179E-02 + 1.0321413700116036E-02 1.0306761212667040E-02 1.0292126675390241E-02 1.0277510071734901E-02 1.0262911385151566E-02 + 1.0248330599092088E-02 1.0233767697009682E-02 1.0219222662358966E-02 1.0204695478596013E-02 1.0190186129178396E-02 + 1.0175694597565210E-02 1.0161220867217158E-02 1.0146764921596555E-02 1.0132326744167398E-02 1.0117906318395396E-02 + 1.0103503627748022E-02 1.0089118655694552E-02 1.0074751385706109E-02 1.0060401801255716E-02 1.0046069885818324E-02 + 1.0031755622870862E-02 1.0017458995892292E-02 1.0003179988363626E-02 9.9889185837679952E-03 9.9746747655906735E-03 + 9.9604485173191322E-03 9.9462398224430849E-03 9.9320486644545077E-03 9.9178750268477129E-03 9.9037188931193655E-03 + 9.8895802467685399E-03 9.8754590712967581E-03 9.8613553502080245E-03 9.8472690670088833E-03 9.8332002052084356E-03 + 9.8191487483184087E-03 9.8051146798531757E-03 9.7910979833298120E-03 9.7770986422681203E-03 9.7631166401906840E-03 + 9.7491519606229139E-03 9.7352045870930624E-03 9.7212745031322895E-03 9.7073616922746953E-03 9.6934661380573550E-03 + 9.6795878240203709E-03 9.6657267337068933E-03 9.6518828506631828E-03 9.6380561584386328E-03 9.6242466405858148E-03 + 9.6104542806605200E-03 9.5966790622217992E-03 9.5829209688319990E-03 9.5691799840567984E-03 9.5554560914652576E-03 + 9.5417492746298384E-03 9.5280595171264703E-03 9.5143868025345645E-03 9.5007311144370641E-03 9.4870924364204752E-03 + 9.4734707520749192E-03 9.4598660449941568E-03 9.4462782987756230E-03 9.4327074970204875E-03 9.4191536233336655E-03 + 9.4056166613238814E-03 9.3920965946036744E-03 9.3785934067894677E-03 9.3651070815015877E-03 9.3516376023642985E-03 + 9.3381849530058646E-03 9.3247491170585489E-03 9.3113300781586823E-03 9.2979278199466810E-03 9.2845423260670898E-03 + 9.2711735801686221E-03 9.2578215659041910E-03 9.2444862669309458E-03 9.2311676669103119E-03 9.2178657495080255E-03 + 9.2045804983941597E-03 9.1913118972431779E-03 9.1780599297339501E-03 9.1648245795498094E-03 9.1516058303785664E-03 + 9.1384036659125627E-03 9.1252180698486937E-03 9.1120490258884360E-03 9.0988965177379155E-03 9.0857605291079051E-03 + 9.0726410437138773E-03 9.0595380452760388E-03 9.0464515175193525E-03 9.0333814441735973E-03 9.0203278089733777E-03 + 9.0072905956581559E-03 8.9942697879723151E-03 8.9812653696651652E-03 8.9682773244909794E-03 8.9553056362090457E-03 + 8.9423502885836812E-03 8.9294112653842735E-03 8.9164885503853156E-03 8.9035821273664353E-03 8.8906919801124314E-03 + 8.8778180924133036E-03 8.8649604480642800E-03 8.8521190308658709E-03 8.8392938246238707E-03 8.8264848131494149E-03 + 8.8136919802590061E-03 8.8009153097745353E-03 8.7881547855233281E-03 8.7754103913381693E-03 8.7626821110573395E-03 + 8.7499699285246407E-03 8.7372738275894278E-03 8.7245937921066538E-03 8.7119298059368782E-03 8.6992818529463209E-03 + 8.6866499170068744E-03 8.6740339819961539E-03 8.6614340317975082E-03 8.6488500503000693E-03 8.6362820213987650E-03 + 8.6237299289943677E-03 8.6111937569935092E-03 8.5986734893087214E-03 8.5861691098584672E-03 8.5736806025671509E-03 + 8.5612079513651806E-03 8.5487511401889770E-03 8.5363101529810029E-03 8.5238849736898013E-03 8.5114755862700214E-03 + 8.4990819746824462E-03 8.4867041228940208E-03 8.4743420148778986E-03 8.4619956346134399E-03 8.4496649660862656E-03 + 8.4373499932882800E-03 8.4250507002176876E-03 8.4127670708790490E-03 8.4004990892832757E-03 8.3882467394476839E-03 + 8.3760100053960167E-03 8.3637888711584670E-03 8.3515833207717070E-03 8.3393933382789193E-03 8.3272189077298279E-03 + 8.3150600131807143E-03 8.3029166386944641E-03 8.2907887683405738E-03 8.2786763861951943E-03 8.2665794763411449E-03 + 8.2544980228679583E-03 8.2424320098718872E-03 8.2303814214559519E-03 8.2183462417299482E-03 8.2063264548104878E-03 + 8.1943220448210206E-03 8.1823329958918625E-03 8.1703592921602182E-03 8.1584009177702085E-03 8.1464578568729087E-03 + 8.1345300936263559E-03 8.1226176121955828E-03 8.1107203967526569E-03 8.0988384314766796E-03 8.0869717005538390E-03 + 8.0751201881774232E-03 8.0632838785478396E-03 8.0514627558726515E-03 8.0396568043666020E-03 8.0278660082516353E-03 + 8.0160903517569222E-03 8.0043298191188970E-03 7.9925843945812501E-03 7.9808540623950031E-03 7.9691388068184842E-03 + 7.9574386121173887E-03 7.9457534625647780E-03 7.9340833424411325E-03 7.9224282360343366E-03 7.9107881276397462E-03 + 7.8991630015601815E-03 7.8875528421059708E-03 7.8759576335949554E-03 7.8643773603525348E-03 7.8528120067116701E-03 + 7.8412615570129292E-03 7.8297259956044887E-03 7.8182053068421766E-03 7.8066994750894767E-03 7.7952084847175713E-03 + 7.7837323201053500E-03 7.7722709656394481E-03 7.7608244057142430E-03 7.7493926247319111E-03 7.7379756071024250E-03 + 7.7265733372435808E-03 7.7151857995810345E-03 7.7038129785483127E-03 7.6924548585868341E-03 7.6811114241459354E-03 + 7.6697826596829003E-03 7.6584685496629643E-03 7.6471690785593592E-03 7.6358842308533112E-03 7.6246139910340844E-03 + 7.6133583435989902E-03 7.6021172730534109E-03 7.5908907639108273E-03 7.5796788006928248E-03 7.5684813679291396E-03 + 7.5572984501576530E-03 7.5461300319244343E-03 7.5349760977837504E-03 7.5238366322980949E-03 7.5127116200381918E-03 + 7.5016010455830400E-03 7.4905048935199180E-03 7.4794231484444076E-03 7.4683557949604233E-03 7.4573028176802220E-03 + 7.4462642012244167E-03 7.4352399302220267E-03 7.4242299893104652E-03 7.4132343631355766E-03 7.4022530363516527E-03 + 7.3912859936214491E-03 7.3803332196162152E-03 7.3693946990157052E-03 7.3584704165081975E-03 7.3475603567905159E-03 + 7.3366645045680520E-03 7.3257828445547866E-03 7.3149153614732983E-03 7.3040620400547946E-03 7.2932228650391248E-03 + 7.2823978211747969E-03 7.2715868932190040E-03 7.2607900659376369E-03 7.2500073241053070E-03 7.2392386525053651E-03 + 7.2284840359299104E-03 7.2177434591798231E-03 7.2070169070647724E-03 7.1963043644032486E-03 7.1856058160225580E-03 + 7.1749212467588650E-03 7.1642506414571943E-03 7.1535939849714575E-03 7.1429512621644653E-03 7.1323224579079537E-03 + 7.1217075570825881E-03 7.1111065445779989E-03 7.1005194052927798E-03 7.0899461241345193E-03 7.0793866860198165E-03 + 7.0688410758742879E-03 7.0583092786325992E-03 7.0477912792384721E-03 7.0372870626447068E-03 7.0267966138131913E-03 + 7.0163199177149301E-03 7.0058569593300559E-03 6.9954077236478373E-03 6.9849721956667110E-03 6.9745503603942903E-03 + 6.9641422028473721E-03 6.9537477080519787E-03 6.9433668610433454E-03 6.9329996468659606E-03 6.9226460505735611E-03 + 6.9123060572291650E-03 6.9019796519050793E-03 6.8916668196829173E-03 6.8813675456536154E-03 6.8710818149174506E-03 + 6.8608096125840424E-03 6.8505509237723966E-03 6.8403057336108896E-03 6.8300740272373055E-03 6.8198557897988406E-03 + 6.8096510064521243E-03 6.7994596623632301E-03 6.7892817427076925E-03 6.7791172326705255E-03 6.7689661174462276E-03 + 6.7588283822388106E-03 6.7487040122618013E-03 6.7385929927382612E-03 6.7284953089008061E-03 6.7184109459916133E-03 + 6.7083398892624395E-03 6.6982821239746342E-03 6.6882376353991557E-03 6.6782064088165812E-03 6.6681884295171270E-03 + 6.6581836828006604E-03 6.6481921539767036E-03 6.6382138283644686E-03 6.6282486912928483E-03 6.6182967281004515E-03 + 6.6083579241355923E-03 6.5984322647563319E-03 6.5885197353304685E-03 6.5786203212355645E-03 6.5687340078589502E-03 + 6.5588607805977450E-03 6.5490006248588670E-03 6.5391535260590486E-03 6.5293194696248447E-03 6.5194984409926559E-03 + 6.5096904256087195E-03 6.4998954089291556E-03 6.4901133764199460E-03 6.4803443135569719E-03 6.4705882058260092E-03 + 6.4608450387227548E-03 6.4511147977528317E-03 6.4413974684317983E-03 6.4316930362851741E-03 6.4220014868484323E-03 + 6.4123228056670268E-03 6.4026569782964053E-03 6.3930039903020066E-03 6.3833638272592875E-03 6.3737364747537290E-03 + 6.3641219183808492E-03 6.3545201437462092E-03 6.3449311364654325E-03 6.3353548821642172E-03 6.3257913664783389E-03 + 6.3162405750536669E-03 6.3067024935461822E-03 6.2971771076219731E-03 6.2876644029572683E-03 6.2781643652384204E-03 + 6.2686769801619463E-03 6.2592022334345158E-03 6.2497401107729743E-03 6.2402905979043466E-03 6.2308536805658534E-03 + 6.2214293445049251E-03 6.2120175754791984E-03 6.2026183592565386E-03 6.1932316816150522E-03 6.1838575283430881E-03 + 6.1744958852392512E-03 6.1651467381124174E-03 6.1558100727817401E-03 6.1464858750766554E-03 6.1371741308369043E-03 + 6.1278748259125338E-03 6.1185879461639050E-03 6.1093134774617133E-03 6.1000514056869870E-03 6.0908017167311066E-03 + 6.0815643964958017E-03 6.0723394308931766E-03 6.0631268058457125E-03 6.0539265072862723E-03 6.0447385211581123E-03 + 6.0355628334149043E-03 6.0263994300207178E-03 6.0172482969500654E-03 6.0081094201878743E-03 5.9989827857295256E-03 + 5.9898683795808431E-03 5.9807661877581140E-03 5.9716761962880964E-03 5.9625983912080238E-03 5.9535327585656115E-03 + 5.9444792844190785E-03 5.9354379548371390E-03 5.9264087558990224E-03 5.9173916736944849E-03 5.9083866943238032E-03 + 5.8993938038977949E-03 5.8904129885378239E-03 5.8814442343758109E-03 5.8724875275542304E-03 5.8635428542261371E-03 + 5.8546102005551624E-03 5.8456895527155212E-03 5.8367808968920231E-03 5.8278842192800821E-03 5.8189995060857229E-03 + 5.8101267435255880E-03 5.8012659178269428E-03 5.7924170152276943E-03 5.7835800219763808E-03 5.7747549243321932E-03 + 5.7659417085649811E-03 5.7571403609552553E-03 5.7483508677941969E-03 5.7395732153836653E-03 5.7308073900362091E-03 + 5.7220533780750612E-03 5.7133111658341628E-03 5.7045807396581575E-03 5.6958620859024018E-03 5.6871551909329727E-03 + 5.6784600411266808E-03 5.6697766228710625E-03 5.6611049225644000E-03 5.6524449266157220E-03 5.6437966214448118E-03 + 5.6351599934822139E-03 5.6265350291692358E-03 5.6179217149579675E-03 5.6093200373112714E-03 5.6007299827028015E-03 + 5.5921515376170013E-03 5.5835846885491135E-03 5.5750294220051899E-03 5.5664857245020898E-03 5.5579535825674891E-03 + 5.5494329827398929E-03 5.5409239115686267E-03 5.5324263556138622E-03 5.5239403014466009E-03 5.5154657356486971E-03 + 5.5070026448128606E-03 5.4985510155426505E-03 5.4901108344524944E-03 5.4816820881676935E-03 5.4732647633244178E-03 + 5.4648588465697158E-03 5.4564643245615307E-03 5.4480811839686880E-03 5.4397094114709112E-03 5.4313489937588286E-03 + 5.4229999175339676E-03 5.4146621695087774E-03 5.4063357364066179E-03 5.3980206049617681E-03 5.3897167619194400E-03 + 5.3814241940357693E-03 5.3731428880778405E-03 5.3648728308236630E-03 5.3566140090622050E-03 5.3483664095933768E-03 + 5.3401300192280508E-03 5.3319048247880531E-03 5.3236908131061769E-03 5.3154879710261855E-03 5.3072962854028094E-03 + 5.2991157431017634E-03 5.2909463309997393E-03 5.2827880359844178E-03 5.2746408449544655E-03 5.2665047448195498E-03 + 5.2583797225003292E-03 5.2502657649284700E-03 5.2421628590466410E-03 5.2340709918085272E-03 5.2259901501788197E-03 + 5.2179203211332337E-03 5.2098614916585070E-03 5.2018136487523951E-03 5.1937767794236938E-03 5.1857508706922208E-03 + 5.1777359095888393E-03 5.1697318831554484E-03 5.1617387784449915E-03 5.1537565825214562E-03 5.1457852824598862E-03 + 5.1378248653463753E-03 5.1298753182780713E-03 5.1219366283631910E-03 5.1140087827210067E-03 5.1060917684818581E-03 + 5.0981855727871596E-03 5.0902901827893912E-03 5.0824055856521170E-03 5.0745317685499712E-03 5.0666687186686765E-03 + 5.0588164232050377E-03 5.0509748693669428E-03 5.0431440443733759E-03 5.0353239354544114E-03 5.0275145298512179E-03 + 5.0197158148160646E-03 5.0119277776123185E-03 5.0041504055144516E-03 4.9963836858080398E-03 4.9886276057897715E-03 + 4.9808821527674374E-03 4.9731473140599471E-03 4.9654230769973261E-03 4.9577094289207134E-03 4.9500063571823677E-03 + 4.9423138491456742E-03 4.9346318921851340E-03 4.9269604736863811E-03 4.9192995810461741E-03 4.9116492016724016E-03 + 4.9040093229840856E-03 4.8963799324113783E-03 4.8887610173955704E-03 4.8811525653890894E-03 4.8735545638555026E-03 + 4.8659670002695167E-03 4.8583898621169788E-03 4.8508231368948841E-03 4.8432668121113718E-03 4.8357208752857275E-03 + 4.8281853139483860E-03 4.8206601156409335E-03 4.8131452679161073E-03 4.8056407583377944E-03 4.7981465744810388E-03 + 4.7906627039320413E-03 4.7831891342881572E-03 4.7757258531578965E-03 4.7682728481609369E-03 4.7608301069281085E-03 + 4.7533976171014077E-03 4.7459753663339878E-03 4.7385633422901679E-03 4.7311615326454358E-03 4.7237699250864355E-03 + 4.7163885073109868E-03 4.7090172670280666E-03 4.7016561919578257E-03 4.6943052698315809E-03 4.6869644883918158E-03 + 4.6796338353921885E-03 4.6723132985975269E-03 4.6650028657838237E-03 4.6577025247382491E-03 4.6504122632591380E-03 + 4.6431320691560094E-03 4.6358619302495439E-03 4.6286018343715974E-03 4.6213517693652062E-03 4.6141117230845685E-03 + 4.6068816833950655E-03 4.5996616381732500E-03 4.5924515753068473E-03 4.5852514826947603E-03 4.5780613482470627E-03 + 4.5708811598850060E-03 4.5637109055410149E-03 4.5565505731586875E-03 4.5494001506928006E-03 4.5422596261092988E-03 + 4.5351289873853066E-03 4.5280082225091214E-03 4.5208973194802099E-03 4.5137962663092199E-03 4.5067050510179682E-03 + 4.4996236616394441E-03 4.4925520862178136E-03 4.4854903128084085E-03 4.4784383294777389E-03 4.4713961243034814E-03 + 4.4643636853744870E-03 4.4573410007907764E-03 4.4503280586635375E-03 4.4433248471151291E-03 4.4363313542790800E-03 + 4.4293475683000825E-03 4.4223734773340025E-03 4.4154090695478635E-03 4.4084543331198650E-03 4.4015092562393618E-03 + 4.3945738271068784E-03 4.3876480339340978E-03 4.3807318649438671E-03 4.3738253083701962E-03 4.3669283524582526E-03 + 4.3600409854643637E-03 4.3531631956560133E-03 4.3462949713118440E-03 4.3394363007216536E-03 4.3325871721863933E-03 + 4.3257475740181659E-03 4.3189174945402311E-03 4.3120969220869941E-03 4.3052858450040128E-03 4.2984842516479932E-03 + 4.2916921303867844E-03 4.2849094695993828E-03 4.2781362576759310E-03 4.2713724830177099E-03 4.2646181340371429E-03 + 4.2578731991577915E-03 4.2511376668143584E-03 4.2444115254526753E-03 4.2376947635297171E-03 4.2309873695135823E-03 + 4.2242893318835077E-03 4.2176006391298542E-03 4.2109212797541134E-03 4.2042512422689002E-03 4.1975905151979557E-03 + 4.1909390870761383E-03 4.1842969464494341E-03 4.1776640818749367E-03 4.1710404819208678E-03 4.1644261351665521E-03 + 4.1578210302024325E-03 4.1512251556300598E-03 4.1446385000620941E-03 4.1380610521223006E-03 4.1314928004455454E-03 + 4.1249337336777990E-03 4.1183838404761320E-03 4.1118431095087081E-03 4.1053115294547885E-03 4.0987890890047266E-03 + 4.0922757768599638E-03 4.0857715817330300E-03 4.0792764923475427E-03 4.0727904974381971E-03 4.0663135857507728E-03 + 4.0598457460421259E-03 4.0533869670801867E-03 4.0469372376439623E-03 4.0404965465235237E-03 4.0340648825200132E-03 + 4.0276422344456388E-03 4.0212285911236682E-03 4.0148239413884314E-03 4.0084282740853122E-03 4.0020415780707497E-03 + 3.9956638422122357E-03 3.9892950553883097E-03 3.9829352064885545E-03 3.9765842844135977E-03 3.9702422780751086E-03 + 3.9639091763957893E-03 3.9575849683093798E-03 3.9512696427606480E-03 3.9449631887053926E-03 3.9386655951104367E-03 + 3.9323768509536214E-03 3.9260969452238120E-03 3.9198258669208858E-03 3.9135636050557374E-03 3.9073101486502664E-03 + 3.9010654867373774E-03 3.8948296083609834E-03 3.8886025025759927E-03 3.8823841584483122E-03 3.8761745650548415E-03 + 3.8699737114834720E-03 3.8637815868330753E-03 3.8575981802135137E-03 3.8514234807456248E-03 3.8452574775612249E-03 + 3.8391001598030998E-03 3.8329515166250056E-03 3.8268115371916703E-03 3.8206802106787747E-03 3.8145575262729663E-03 + 3.8084434731718410E-03 3.8023380405839509E-03 3.7962412177287952E-03 3.7901529938368173E-03 3.7840733581493979E-03 + 3.7780022999188596E-03 3.7719398084084554E-03 3.7658858728923687E-03 3.7598404826557083E-03 3.7538036269945006E-03 + 3.7477752952156970E-03 3.7417554766371592E-03 3.7357441605876587E-03 3.7297413364068750E-03 3.7237469934453880E-03 + 3.7177611210646769E-03 3.7117837086371166E-03 3.7058147455459704E-03 3.6998542211853884E-03 3.6939021249604051E-03 + 3.6879584462869309E-03 3.6820231745917503E-03 3.6760962993125190E-03 3.6701778098977597E-03 3.6642676958068541E-03 + 3.6583659465100429E-03 3.6524725514884204E-03 3.6465875002339308E-03 3.6407107822493605E-03 3.6348423870483397E-03 + 3.6289823041553331E-03 3.6231305231056369E-03 3.6172870334453757E-03 3.6114518247314974E-03 3.6056248865317694E-03 + 3.5998062084247728E-03 3.5939957799998980E-03 3.5881935908573439E-03 3.5823996306081061E-03 3.5766138888739811E-03 + 3.5708363552875559E-03 3.5650670194922029E-03 3.5593058711420812E-03 3.5535528999021248E-03 3.5478080954480444E-03 + 3.5420714474663187E-03 3.5363429456541913E-03 3.5306225797196657E-03 3.5249103393814991E-03 3.5192062143692008E-03 + 3.5135101944230259E-03 3.5078222692939711E-03 3.5021424287437655E-03 3.4964706625448760E-03 3.4908069604804924E-03 + 3.4851513123445219E-03 3.4795037079416000E-03 3.4738641370870645E-03 3.4682325896069647E-03 3.4626090553380486E-03 + 3.4569935241277679E-03 3.4513859858342605E-03 3.4457864303263572E-03 3.4401948474835644E-03 3.4346112271960742E-03 + 3.4290355593647437E-03 3.4234678339011035E-03 3.4179080407273424E-03 3.4123561697763081E-03 3.4068122109915029E-03 + 3.4012761543270684E-03 3.3957479897477982E-03 3.3902277072291151E-03 3.3847152967570776E-03 3.3792107483283673E-03 + 3.3737140519502912E-03 3.3682251976407708E-03 3.3627441754283350E-03 3.3572709753521197E-03 3.3518055874618676E-03 + 3.3463480018179038E-03 3.3408982084911542E-03 3.3354561975631239E-03 3.3300219591258979E-03 3.3245954832821323E-03 + 3.3191767601450542E-03 3.3137657798384540E-03 3.3083625324966765E-03 3.3029670082646190E-03 3.2975791972977286E-03 + 3.2921990897619873E-03 3.2868266758339188E-03 3.2814619457005711E-03 3.2761048895595204E-03 3.2707554976188625E-03 + 3.2654137600972009E-03 3.2600796672236504E-03 3.2547532092378332E-03 3.2494343763898566E-03 3.2441231589403281E-03 + 3.2388195471603361E-03 3.2335235313314496E-03 3.2282351017457111E-03 3.2229542487056321E-03 3.2176809625241889E-03 + 3.2124152335248060E-03 3.2071570520413695E-03 3.2019064084182060E-03 3.1966632930100812E-03 3.1914276961821915E-03 + 3.1861996083101694E-03 3.1809790197800643E-03 3.1757659209883386E-03 3.1705603023418748E-03 3.1653621542579490E-03 + 3.1601714671642437E-03 3.1549882314988323E-03 3.1498124377101742E-03 3.1446440762571068E-03 3.1394831376088516E-03 + 3.1343296122449886E-03 3.1291834906554670E-03 3.1240447633405946E-03 3.1189134208110232E-03 3.1137894535877581E-03 + 3.1086728522021355E-03 3.1035636071958341E-03 3.0984617091208504E-03 3.0933671485395080E-03 3.0882799160244427E-03 + 3.0832000021586022E-03 3.0781273975352304E-03 3.0730620927578757E-03 3.0680040784403688E-03 3.0629533452068325E-03 + 3.0579098836916621E-03 3.0528736845395286E-03 3.0478447384053647E-03 3.0428230359543680E-03 3.0378085678619852E-03 + 3.0328013248139096E-03 3.0278012975060806E-03 3.0228084766446648E-03 3.0178228529460630E-03 3.0128444171368960E-03 + 3.0078731599540009E-03 3.0029090721444230E-03 2.9979521444654126E-03 2.9930023676844144E-03 2.9880597325790651E-03 + 2.9831242299371858E-03 2.9781958505567738E-03 2.9732745852459998E-03 2.9683604248231985E-03 2.9634533601168613E-03 + 2.9585533819656367E-03 2.9536604812183125E-03 2.9487746487338188E-03 2.9438958753812221E-03 2.9390241520397065E-03 + 2.9341594695985866E-03 2.9293018189572783E-03 2.9244511910253182E-03 2.9196075767223312E-03 2.9147709669780399E-03 + 2.9099413527322606E-03 2.9051187249348773E-03 2.9003030745458611E-03 2.8954943925352424E-03 2.8906926698831163E-03 + 2.8858978975796314E-03 2.8811100666249843E-03 2.8763291680294106E-03 2.8715551928131825E-03 2.8667881320066039E-03 + 2.8620279766499901E-03 2.8572747177936808E-03 2.8525283464980182E-03 2.8477888538333499E-03 2.8430562308800105E-03 + 2.8383304687283318E-03 2.8336115584786203E-03 2.8288994912411590E-03 2.8241942581361981E-03 2.8194958502939494E-03 + 2.8148042588545807E-03 2.8101194749681996E-03 2.8054414897948667E-03 2.8007702945045654E-03 2.7961058802772102E-03 + 2.7914482383026374E-03 2.7867973597805952E-03 2.7821532359207377E-03 2.7775158579426214E-03 2.7728852170756904E-03 + 2.7682613045592820E-03 2.7636441116426066E-03 2.7590336295847512E-03 2.7544298496546661E-03 2.7498327631311592E-03 + 2.7452423613028927E-03 2.7406586354683719E-03 2.7360815769359404E-03 2.7315111770237726E-03 2.7269474270598666E-03 + 2.7223903183820394E-03 2.7178398423379135E-03 2.7132959902849184E-03 2.7087587535902804E-03 2.7042281236310120E-03 + 2.6997040917939087E-03 2.6951866494755437E-03 2.6906757880822527E-03 2.6861714990301395E-03 2.6816737737450557E-03 + 2.6771826036626049E-03 2.6726979802281295E-03 2.6682198948967009E-03 2.6637483391331214E-03 2.6592833044119099E-03 + 2.6548247822172971E-03 2.6503727640432182E-03 2.6459272413933083E-03 2.6414882057808897E-03 2.6370556487289704E-03 + 2.6326295617702345E-03 2.6282099364470317E-03 2.6237967643113810E-03 2.6193900369249467E-03 2.6149897458590502E-03 + 2.6105958826946473E-03 2.6062084390223303E-03 2.6018274064423144E-03 2.5974527765644387E-03 2.5930845410081517E-03 + 2.5887226914025055E-03 2.5843672193861505E-03 2.5800181166073274E-03 2.5756753747238612E-03 2.5713389854031500E-03 + 2.5670089403221643E-03 2.5626852311674332E-03 2.5583678496350405E-03 2.5540567874306184E-03 2.5497520362693349E-03 + 2.5454535878758960E-03 2.5411614339845277E-03 2.5368755663389767E-03 2.5325959766924998E-03 2.5283226568078563E-03 + 2.5240555984573027E-03 2.5197947934225830E-03 2.5155402334949223E-03 2.5112919104750236E-03 2.5070498161730488E-03 + 2.5028139424086290E-03 2.4985842810108382E-03 2.4943608238182030E-03 2.4901435626786821E-03 2.4859324894496641E-03 + 2.4817275959979649E-03 2.4775288741998129E-03 2.4733363159408421E-03 2.4691499131160922E-03 2.4649696576299913E-03 + 2.4607955413963570E-03 2.4566275563383823E-03 2.4524656943886334E-03 2.4483099474890409E-03 2.4441603075908880E-03 + 2.4400167666548097E-03 2.4358793166507804E-03 2.4317479495581107E-03 2.4276226573654381E-03 2.4235034320707147E-03 + 2.4193902656812088E-03 2.4152831502134921E-03 2.4111820776934311E-03 2.4070870401561831E-03 2.4029980296461865E-03 + 2.3989150382171566E-03 2.3948380579320696E-03 2.3907670808631701E-03 2.3867020990919457E-03 2.3826431047091323E-03 + 2.3785900898147046E-03 2.3745430465178649E-03 2.3705019669370362E-03 2.3664668431998565E-03 2.3624376674431752E-03 + 2.3584144318130320E-03 2.3543971284646702E-03 2.3503857495625054E-03 2.3463802872801388E-03 2.3423807338003367E-03 + 2.3383870813150306E-03 2.3343993220253010E-03 2.3304174481413795E-03 2.3264414518826366E-03 2.3224713254775728E-03 + 2.3185070611638115E-03 2.3145486511880952E-03 2.3105960878062738E-03 2.3066493632833002E-03 2.3027084698932204E-03 + 2.2987733999191634E-03 2.2948441456533417E-03 2.2909206993970343E-03 2.2870030534605885E-03 2.2830912001634029E-03 + 2.2791851318339261E-03 2.2752848408096491E-03 2.2713903194370925E-03 2.2675015600718035E-03 2.2636185550783511E-03 + 2.2597412968303060E-03 2.2558697777102514E-03 2.2520039901097557E-03 2.2481439264293835E-03 2.2442895790786730E-03 + 2.2404409404761360E-03 2.2365980030492495E-03 2.2327607592344482E-03 2.2289292014771125E-03 2.2251033222315682E-03 + 2.2212831139610720E-03 2.2174685691378087E-03 2.2136596802428796E-03 2.2098564397662998E-03 2.2060588402069855E-03 + 2.2022668740727474E-03 2.1984805338802877E-03 2.1946998121551839E-03 2.1909247014318916E-03 2.1871551942537269E-03 + 2.1833912831728652E-03 2.1796329607503303E-03 2.1758802195559887E-03 2.1721330521685426E-03 2.1683914511755158E-03 + 2.1646554091732544E-03 2.1609249187669161E-03 2.1571999725704598E-03 2.1534805632066421E-03 2.1497666833070056E-03 + 2.1460583255118741E-03 2.1423554824703461E-03 2.1386581468402807E-03 2.1349663112882975E-03 2.1312799684897639E-03 + 2.1275991111287884E-03 2.1239237318982167E-03 2.1202538234996174E-03 2.1165893786432794E-03 2.1129303900482010E-03 + 2.1092768504420868E-03 2.1056287525613340E-03 2.1019860891510261E-03 2.0983488529649312E-03 2.0947170367654842E-03 + 2.0910906333237904E-03 2.0874696354196065E-03 2.0838540358413412E-03 2.0802438273860436E-03 2.0766390028593967E-03 + 2.0730395550757081E-03 2.0694454768579052E-03 2.0658567610375251E-03 2.0622734004547062E-03 2.0586953879581840E-03 + 2.0551227164052797E-03 2.0515553786618927E-03 2.0479933676024946E-03 2.0444366761101242E-03 2.0408852970763718E-03 + 2.0373392234013781E-03 2.0337984479938238E-03 2.0302629637709221E-03 2.0267327636584124E-03 2.0232078405905507E-03 + 2.0196881875101029E-03 2.0161737973683354E-03 2.0126646631250093E-03 2.0091607777483721E-03 2.0056621342151516E-03 + 2.0021687255105409E-03 1.9986805446282037E-03 1.9951975845702518E-03 1.9917198383472470E-03 1.9882472989781923E-03 + 1.9847799594905203E-03 1.9813178129200909E-03 1.9778608523111740E-03 1.9744090707164556E-03 1.9709624611970174E-03 + 1.9675210168223363E-03 1.9640847306702722E-03 1.9606535958270658E-03 1.9572276053873251E-03 1.9538067524540186E-03 + 1.9503910301384747E-03 1.9469804315603602E-03 1.9435749498476870E-03 1.9401745781367952E-03 1.9367793095723485E-03 + 1.9333891373073222E-03 1.9300040545030066E-03 1.9266240543289843E-03 1.9232491299631335E-03 1.9198792745916170E-03 + 1.9165144814088713E-03 1.9131547436176044E-03 1.9098000544287813E-03 1.9064504070616260E-03 1.9031057947436010E-03 + 1.8997662107104094E-03 1.8964316482059857E-03 1.8931021004824841E-03 1.8897775608002724E-03 1.8864580224279266E-03 + 1.8831434786422193E-03 1.8798339227281164E-03 1.8765293479787633E-03 1.8732297476954849E-03 1.8699351151877696E-03 + 1.8666454437732680E-03 1.8633607267777826E-03 1.8600809575352575E-03 1.8568061293877762E-03 1.8535362356855481E-03 + 1.8502712697869067E-03 1.8470112250582944E-03 1.8437560948742625E-03 1.8405058726174589E-03 1.8372605516786187E-03 + 1.8340201254565620E-03 1.8307845873581810E-03 1.8275539307984366E-03 1.8243281492003455E-03 1.8211072359949777E-03 + 1.8178911846214445E-03 1.8146799885268941E-03 1.8114736411665013E-03 1.8082721360034601E-03 1.8050754665089770E-03 + 1.8018836261622646E-03 1.7986966084505285E-03 1.7955144068689665E-03 1.7923370149207536E-03 1.7891644261170431E-03 + 1.7859966339769482E-03 1.7828336320275431E-03 1.7796754138038526E-03 1.7765219728488396E-03 1.7733733027134060E-03 + 1.7702293969563785E-03 1.7670902491445026E-03 1.7639558528524323E-03 1.7608262016627317E-03 1.7577012891658540E-03 + 1.7545811089601424E-03 1.7514656546518236E-03 1.7483549198549907E-03 1.7452488981916051E-03 1.7421475832914862E-03 + 1.7390509687923003E-03 1.7359590483395540E-03 1.7328718155865909E-03 1.7297892641945786E-03 1.7267113878325039E-03 + 1.7236381801771625E-03 1.7205696349131537E-03 1.7175057457328737E-03 1.7144465063365019E-03 1.7113919104320020E-03 + 1.7083419517351052E-03 1.7052966239693085E-03 1.7022559208658668E-03 1.6992198361637828E-03 1.6961883636097978E-03 + 1.6931614969583893E-03 1.6901392299717584E-03 1.6871215564198258E-03 1.6841084700802203E-03 1.6810999647382744E-03 + 1.6780960341870154E-03 1.6750966722271555E-03 1.6721018726670882E-03 1.6691116293228779E-03 1.6661259360182536E-03 + 1.6631447865845988E-03 1.6601681748609448E-03 1.6571960946939685E-03 1.6542285399379732E-03 1.6512655044548913E-03 + 1.6483069821142736E-03 1.6453529667932788E-03 1.6424034523766678E-03 1.6394584327567975E-03 1.6365179018336107E-03 + 1.6335818535146299E-03 1.6306502817149487E-03 1.6277231803572248E-03 1.6248005433716730E-03 1.6218823646960544E-03 + 1.6189686382756733E-03 1.6160593580633645E-03 1.6131545180194916E-03 1.6102541121119334E-03 1.6073581343160803E-03 + 1.6044665786148239E-03 1.6015794389985527E-03 1.5986967094651415E-03 1.5958183840199423E-03 1.5929444566757831E-03 + 1.5900749214529525E-03 1.5872097723791992E-03 1.5843490034897179E-03 1.5814926088271459E-03 1.5786405824415540E-03 + 1.5757929183904402E-03 1.5729496107387195E-03 1.5701106535587171E-03 1.5672760409301636E-03 1.5644457669401835E-03 + 1.5616198256832893E-03 1.5587982112613748E-03 1.5559809177837062E-03 1.5531679393669139E-03 1.5503592701349878E-03 + 1.5475549042192639E-03 1.5447548357584245E-03 1.5419590588984845E-03 1.5391675677927865E-03 1.5363803566019922E-03 + 1.5335974194940749E-03 1.5308187506443138E-03 1.5280443442352827E-03 1.5252741944568452E-03 1.5225082955061472E-03 + 1.5197466415876085E-03 1.5169892269129132E-03 1.5142360457010078E-03 1.5114870921780854E-03 1.5087423605775882E-03 + 1.5060018451401897E-03 1.5032655401137941E-03 1.5005334397535273E-03 1.4978055383217277E-03 1.4950818300879384E-03 + 1.4923623093289031E-03 1.4896469703285537E-03 1.4869358073780082E-03 1.4842288147755582E-03 1.4815259868266643E-03 + 1.4788273178439480E-03 1.4761328021471825E-03 1.4734424340632874E-03 1.4707562079263213E-03 1.4680741180774720E-03 + 1.4653961588650497E-03 1.4627223246444824E-03 1.4600526097783039E-03 1.4573870086361498E-03 1.4547255155947486E-03 + 1.4520681250379127E-03 1.4494148313565340E-03 1.4467656289485745E-03 1.4441205122190581E-03 1.4414794755800671E-03 + 1.4388425134507284E-03 1.4362096202572110E-03 1.4335807904327169E-03 1.4309560184174741E-03 1.4283352986587273E-03 + 1.4257186256107324E-03 1.4231059937347506E-03 1.4204973974990349E-03 1.4178928313788287E-03 1.4152922898563571E-03 + 1.4126957674208160E-03 1.4101032585683703E-03 1.4075147578021408E-03 1.4049302596321996E-03 1.4023497585755643E-03 + 1.3997732491561861E-03 1.3972007259049467E-03 1.3946321833596480E-03 1.3920676160650066E-03 1.3895070185726451E-03 + 1.3869503854410852E-03 1.3843977112357405E-03 1.3818489905289080E-03 1.3793042178997625E-03 1.3767633879343472E-03 + 1.3742264952255685E-03 1.3716935343731861E-03 1.3691644999838082E-03 1.3666393866708824E-03 1.3641181890546880E-03 + 1.3616009017623305E-03 1.3590875194277321E-03 1.3565780366916263E-03 1.3540724482015494E-03 1.3515707486118330E-03 + 1.3490729325835965E-03 1.3465789947847411E-03 1.3440889298899415E-03 1.3416027325806384E-03 1.3391203975450317E-03 + 1.3366419194780713E-03 1.3341672930814535E-03 1.3316965130636105E-03 1.3292295741397034E-03 1.3267664710316168E-03 + 1.3243071984679489E-03 1.3218517511840062E-03 1.3194001239217963E-03 1.3169523114300186E-03 1.3145083084640579E-03 + 1.3120681097859785E-03 1.3096317101645150E-03 1.3071991043750667E-03 1.3047702871996874E-03 1.3023452534270832E-03 + 1.2999239978526004E-03 1.2975065152782185E-03 1.2950928005125474E-03 1.2926828483708153E-03 1.2902766536748635E-03 + 1.2878742112531389E-03 1.2854755159406879E-03 1.2830805625791461E-03 1.2806893460167354E-03 1.2783018611082519E-03 + 1.2759181027150622E-03 1.2735380657050962E-03 1.2711617449528360E-03 1.2687891353393144E-03 1.2664202317521026E-03 + 1.2640550290853065E-03 1.2616935222395575E-03 1.2593357061220051E-03 1.2569815756463113E-03 1.2546311257326432E-03 + 1.2522843513076644E-03 1.2499412473045281E-03 1.2476018086628722E-03 1.2452660303288079E-03 1.2429339072549173E-03 + 1.2406054344002426E-03 1.2382806067302802E-03 1.2359594192169741E-03 1.2336418668387075E-03 1.2313279445802967E-03 + 1.2290176474329855E-03 1.2267109703944321E-03 1.2244079084687107E-03 1.2221084566662952E-03 1.2198126100040594E-03 + 1.2175203635052666E-03 1.2152317121995632E-03 1.2129466511229695E-03 1.2106651753178764E-03 1.2083872798330350E-03 + 1.2061129597235520E-03 1.2038422100508800E-03 1.2015750258828129E-03 1.1993114022934772E-03 1.1970513343633248E-03 + 1.1947948171791279E-03 1.1925418458339694E-03 1.1902924154272370E-03 1.1880465210646171E-03 1.1858041578580863E-03 + 1.1835653209259038E-03 1.1813300053926069E-03 1.1790982063890018E-03 1.1768699190521557E-03 1.1746451385253932E-03 + 1.1724238599582877E-03 1.1702060785066506E-03 1.1679917893325320E-03 1.1657809876042058E-03 1.1635736684961671E-03 + 1.1613698271891260E-03 1.1591694588699969E-03 1.1569725587318937E-03 1.1547791219741227E-03 1.1525891438021775E-03 + 1.1504026194277257E-03 1.1482195440686109E-03 1.1460399129488380E-03 1.1438637212985690E-03 1.1416909643541188E-03 + 1.1395216373579439E-03 1.1373557355586373E-03 1.1351932542109223E-03 1.1330341885756438E-03 1.1308785339197631E-03 + 1.1287262855163493E-03 1.1265774386445750E-03 1.1244319885897053E-03 1.1222899306430952E-03 1.1201512601021794E-03 + 1.1180159722704672E-03 1.1158840624575341E-03 1.1137555259790176E-03 1.1116303581566070E-03 1.1095085543180385E-03 + 1.1073901097970883E-03 1.1052750199335652E-03 1.1031632800733023E-03 1.1010548855681533E-03 1.0989498317759841E-03 + 1.0968481140606642E-03 1.0947497277920631E-03 1.0926546683460395E-03 1.0905629311044401E-03 1.0884745114550856E-03 + 1.0863894047917703E-03 1.0843076065142512E-03 1.0822291120282438E-03 1.0801539167454126E-03 1.0780820160833659E-03 + 1.0760134054656502E-03 1.0739480803217403E-03 1.0718860360870348E-03 1.0698272682028490E-03 1.0677717721164076E-03 + 1.0657195432808371E-03 1.0636705771551618E-03 1.0616248692042931E-03 1.0595824148990276E-03 1.0575432097160336E-03 + 1.0555072491378527E-03 1.0534745286528847E-03 1.0514450437553882E-03 1.0494187899454683E-03 1.0473957627290720E-03 + 1.0453759576179817E-03 1.0433593701298100E-03 1.0413459957879874E-03 1.0393358301217634E-03 1.0373288686661929E-03 + 1.0353251069621331E-03 1.0333245405562367E-03 1.0313271650009435E-03 1.0293329758544760E-03 1.0273419686808293E-03 + 1.0253541390497682E-03 1.0233694825368194E-03 1.0213879947232613E-03 1.0194096711961236E-03 1.0174345075481760E-03 + 1.0154624993779214E-03 1.0134936422895938E-03 1.0115279318931452E-03 1.0095653638042450E-03 1.0076059336442684E-03 + 1.0056496370402935E-03 1.0036964696250930E-03 1.0017464270371270E-03 9.9979950492053789E-04 9.9785569892514212E-04 + 9.9591500470642513E-04 9.9397741792553408E-04 9.9204293424927131E-04 9.9011154935008659E-04 9.8818325890607291E-04 + 9.8625805860095704E-04 9.8433594412409577E-04 9.8241691117046813E-04 9.8050095544066824E-04 9.7858807264089858E-04 + 9.7667825848296477E-04 9.7477150868426879E-04 9.7286781896780089E-04 9.7096718506213553E-04 9.6906960270142168E-04 + 9.6717506762537971E-04 9.6528357557929272E-04 9.6339512231399924E-04 9.6150970358588913E-04 9.5962731515689646E-04 + 9.5774795279449185E-04 9.5587161227167570E-04 9.5399828936697316E-04 9.5212797986442841E-04 9.5026067955359468E-04 + 9.4839638422953068E-04 9.4653508969279375E-04 9.4467679174943314E-04 9.4282148621098222E-04 9.4096916889445446E-04 + 9.3911983562233465E-04 9.3727348222257445E-04 9.3543010452858447E-04 9.3358969837922822E-04 9.3175225961881602E-04 + 9.2991778409709904E-04 9.2808626766926116E-04 9.2625770619591380E-04 9.2443209554309014E-04 9.2260943158223676E-04 + 9.2078971019020936E-04 9.1897292724926521E-04 9.1715907864705563E-04 9.1534816027662245E-04 9.1354016803638972E-04 + 9.1173509783015771E-04 9.0993294556709621E-04 9.0813370716173855E-04 9.0633737853397533E-04 9.0454395560904822E-04 + 9.0275343431754271E-04 9.0096581059538280E-04 8.9918108038382349E-04 8.9739923962944715E-04 8.9562028428415228E-04 + 8.9384421030515337E-04 8.9207101365496846E-04 8.9030069030141825E-04 8.8853323621761562E-04 8.8676864738196099E-04 + 8.8500691977813758E-04 8.8324804939510205E-04 8.8149203222708005E-04 8.7973886427356062E-04 8.7798854153928749E-04 + 8.7624106003425560E-04 8.7449641577370236E-04 8.7275460477810368E-04 8.7101562307316603E-04 8.6927946668982007E-04 + 8.6754613166421617E-04 8.6581561403771740E-04 8.6408790985689115E-04 8.6236301517350720E-04 8.6064092604452662E-04 + 8.5892163853210069E-04 8.5720514870355922E-04 8.5549145263140935E-04 8.5378054639332582E-04 8.5207242607214734E-04 + 8.5036708775586777E-04 8.4866452753763256E-04 8.4696474151573018E-04 8.4526772579358877E-04 8.4357347647976701E-04 + 8.4188198968794959E-04 8.4019326153694101E-04 8.3850728815065910E-04 8.3682406565812955E-04 8.3514359019347796E-04 + 8.3346585789592631E-04 8.3179086490978410E-04 8.3011860738444528E-04 8.2844908147437931E-04 8.2678228333912644E-04 + 8.2511820914329124E-04 8.2345685505653748E-04 8.2179821725358057E-04 8.2014229191418168E-04 8.1848907522314351E-04 + 8.1683856337030089E-04 8.1519075255051868E-04 8.1354563896368236E-04 8.1190321881469336E-04 8.1026348831346332E-04 + 8.0862644367490758E-04 8.0699208111893934E-04 8.0536039687046279E-04 8.0373138715936893E-04 8.0210504822052729E-04 + 8.0048137629378175E-04 7.9886036762394374E-04 7.9724201846078562E-04 7.9562632505903613E-04 7.9401328367837342E-04 + 7.9240289058341864E-04 7.9079514204373220E-04 7.8919003433380365E-04 7.8758756373305120E-04 7.8598772652581003E-04 + 7.8439051900133045E-04 7.8279593745377073E-04 7.8120397818219047E-04 7.7961463749054514E-04 7.7802791168768046E-04 + 7.7644379708732576E-04 7.7486229000808913E-04 7.7328338677344968E-04 7.7170708371175438E-04 7.7013337715620925E-04 + 7.6856226344487473E-04 7.6699373892066087E-04 7.6542779993131883E-04 7.6386444282943756E-04 7.6230366397243702E-04 + 7.6074545972256108E-04 7.5918982644687335E-04 7.5763676051725096E-04 7.5608625831037818E-04 7.5453831620774002E-04 + 7.5299293059561811E-04 7.5145009786508352E-04 7.4990981441199129E-04 7.4837207663697462E-04 7.4683688094543863E-04 + 7.4530422374755598E-04 7.4377410145825824E-04 7.4224651049723304E-04 7.4072144728891767E-04 7.3919890826249000E-04 + 7.3767888985186881E-04 7.3616138849570180E-04 7.3464640063736404E-04 7.3313392272494947E-04 7.3162395121126756E-04 + 7.3011648255383516E-04 7.2861151321487229E-04 7.2710903966129723E-04 7.2560905836471703E-04 7.2411156580142605E-04 + 7.2261655845239808E-04 7.2112403280328089E-04 7.1963398534438986E-04 7.1814641257070364E-04 7.1666131098185783E-04 + 7.1517867708213885E-04 7.1369850738047815E-04 7.1222079839044767E-04 7.1074554663025315E-04 7.0927274862272831E-04 + 7.0780240089532963E-04 7.0633449998013062E-04 7.0486904241381606E-04 7.0340602473767660E-04 7.0194544349760262E-04 + 7.0048729524407861E-04 6.9903157653217782E-04 6.9757828392155653E-04 6.9612741397644855E-04 6.9467896326565887E-04 + 6.9323292836255914E-04 6.9178930584508130E-04 6.9034809229571168E-04 6.8890928430148613E-04 6.8747287845398475E-04 + 6.8603887134932443E-04 6.8460725958815550E-04 6.8317803977565456E-04 6.8175120852151893E-04 6.8032676243996303E-04 + 6.7890469814970995E-04 6.7748501227398838E-04 6.7606770144052494E-04 6.7465276228154017E-04 6.7324019143374264E-04 + 6.7182998553832216E-04 6.7042214124094662E-04 6.6901665519175451E-04 6.6761352404534938E-04 6.6621274446079554E-04 + 6.6481431310161214E-04 6.6341822663576716E-04 6.6202448173567174E-04 6.6063307507817576E-04 6.5924400334456087E-04 + 6.5785726322053692E-04 6.5647285139623483E-04 6.5509076456620092E-04 6.5371099942939303E-04 6.5233355268917411E-04 + 6.5095842105330657E-04 6.4958560123394690E-04 6.4821508994764097E-04 6.4684688391531699E-04 6.4548097986228238E-04 + 6.4411737451821596E-04 6.4275606461716380E-04 6.4139704689753364E-04 6.4004031810208984E-04 6.3868587497794692E-04 + 6.3733371427656478E-04 6.3598383275374347E-04 6.3463622716961748E-04 6.3329089428865073E-04 6.3194783087963029E-04 + 6.3060703371566214E-04 6.2926849957416480E-04 6.2793222523686539E-04 6.2659820748979154E-04 6.2526644312326971E-04 + 6.2393692893191637E-04 6.2260966171463511E-04 6.2128463827460987E-04 6.1996185541930021E-04 6.1864130996043608E-04 + 6.1732299871401200E-04 6.1600691850028191E-04 6.1469306614375457E-04 6.1338143847318655E-04 6.1207203232157897E-04 + 6.1076484452617075E-04 6.0945987192843399E-04 6.0815711137406851E-04 6.0685655971299613E-04 6.0555821379935600E-04 + 6.0426207049149984E-04 6.0296812665198421E-04 6.0167637914756934E-04 6.0038682484920918E-04 5.9909946063204994E-04 + 5.9781428337542307E-04 5.9653128996284006E-04 5.9525047728198820E-04 5.9397184222472344E-04 5.9269538168706722E-04 + 5.9142109256920053E-04 5.9014897177545782E-04 5.8887901621432290E-04 5.8761122279842373E-04 5.8634558844452623E-04 + 5.8508211007352962E-04 5.8382078461046219E-04 5.8256160898447461E-04 5.8130458012883521E-04 5.8004969498092558E-04 + 5.7879695048223395E-04 5.7754634357835236E-04 5.7629787121896842E-04 5.7505153035786270E-04 5.7380731795290203E-04 + 5.7256523096603604E-04 5.7132526636329006E-04 5.7008742111476127E-04 5.6885169219461293E-04 5.6761807658106992E-04 + 5.6638657125641337E-04 5.6515717320697507E-04 5.6392987942313264E-04 5.6270468689930471E-04 5.6148159263394622E-04 + 5.6026059362954172E-04 5.5904168689260261E-04 5.5782486943365913E-04 5.5661013826725900E-04 5.5539749041195856E-04 + 5.5418692289032018E-04 5.5297843272890683E-04 5.5177201695827632E-04 5.5056767261297635E-04 5.4936539673154042E-04 + 5.4816518635648177E-04 5.4696703853428881E-04 5.4577095031541967E-04 5.4457691875429829E-04 5.4338494090930810E-04 + 5.4219501384278757E-04 5.4100713462102530E-04 5.3982130031425513E-04 5.3863750799665083E-04 5.3745575474632116E-04 + 5.3627603764530498E-04 5.3509835377956653E-04 5.3392270023898956E-04 5.3274907411737370E-04 5.3157747251242869E-04 + 5.3040789252576954E-04 5.2924033126291146E-04 5.2807478583326501E-04 5.2691125335013115E-04 5.2574973093069710E-04 + 5.2459021569602963E-04 5.2343270477107234E-04 5.2227719528463864E-04 5.2112368436940800E-04 5.1997216916192161E-04 + 5.1882264680257564E-04 5.1767511443561842E-04 5.1652956920914385E-04 5.1538600827508759E-04 5.1424442878922165E-04 + 5.1310482791115035E-04 5.1196720280430395E-04 5.1083155063593485E-04 5.0969786857711283E-04 5.0856615380271970E-04 + 5.0743640349144490E-04 5.0630861482577972E-04 5.0518278499201428E-04 5.0405891118023049E-04 5.0293699058429921E-04 + 5.0181702040187398E-04 5.0069899783438678E-04 4.9958292008704360E-04 4.9846878436881855E-04 4.9735658789245077E-04 + 4.9624632787443755E-04 4.9513800153503154E-04 4.9403160609823445E-04 4.9292713879179337E-04 4.9182459684719469E-04 + 4.9072397749966095E-04 4.8962527798814502E-04 4.8852849555532530E-04 4.8743362744760207E-04 4.8634067091509072E-04 + 4.8524962321161940E-04 4.8416048159472241E-04 4.8307324332563648E-04 4.8198790566929527E-04 4.8090446589432631E-04 + 4.7982292127304345E-04 4.7874326908144534E-04 4.7766550659920795E-04 4.7658963110968212E-04 4.7551563989988718E-04 + 4.7444353026050696E-04 4.7337329948588560E-04 4.7230494487402196E-04 4.7123846372656525E-04 4.7017385334881088E-04 + 4.6911111104969470E-04 4.6805023414178991E-04 4.6699121994130078E-04 4.6593406576805923E-04 4.6487876894551919E-04 + 4.6382532680075308E-04 4.6277373666444601E-04 4.6172399587089187E-04 4.6067610175798895E-04 4.5963005166723434E-04 + 4.5858584294372027E-04 4.5754347293612904E-04 4.5650293899672853E-04 4.5546423848136783E-04 4.5442736874947191E-04 + 4.5339232716403799E-04 4.5235911109163014E-04 4.5132771790237547E-04 4.5029814496995891E-04 4.4927038967161901E-04 + 4.4824444938814322E-04 4.4722032150386326E-04 4.4619800340665134E-04 4.4517749248791389E-04 4.4415878614258901E-04 + 4.4314188176914059E-04 4.4212677676955454E-04 4.4111346854933359E-04 4.4010195451749345E-04 4.3909223208655758E-04 + 4.3808429867255380E-04 4.3707815169500831E-04 4.3607378857694228E-04 4.3507120674486719E-04 4.3407040362877954E-04 + 4.3307137666215799E-04 4.3207412328195692E-04 4.3107864092860375E-04 4.3008492704599310E-04 4.2909297908148305E-04 + 4.2810279448589025E-04 4.2711437071348663E-04 4.2612770522199310E-04 4.2514279547257625E-04 4.2415963892984416E-04 + 4.2317823306184122E-04 4.2219857534004366E-04 4.2122066323935654E-04 4.2024449423810694E-04 4.1927006581804195E-04 + 4.1829737546432254E-04 4.1732642066552030E-04 4.1635719891361210E-04 4.1538970770397637E-04 4.1442394453538857E-04 + 4.1345990691001684E-04 4.1249759233341707E-04 4.1153699831452924E-04 4.1057812236567270E-04 4.0962096200254221E-04 + 4.0866551474420300E-04 4.0771177811308650E-04 4.0675974963498649E-04 4.0580942683905448E-04 4.0486080725779473E-04 + 4.0391388842706124E-04 4.0296866788605269E-04 4.0202514317730755E-04 4.0108331184670075E-04 4.0014317144343892E-04 + 3.9920471952005596E-04 3.9826795363240910E-04 3.9733287133967443E-04 3.9639947020434223E-04 3.9546774779221339E-04 + 3.9453770167239454E-04 3.9360932941729445E-04 3.9268262860261857E-04 3.9175759680736602E-04 3.9083423161382453E-04 + 3.8991253060756691E-04 3.8899249137744574E-04 3.8807411151558997E-04 3.8715738861740058E-04 3.8624232028154604E-04 + 3.8532890410995812E-04 3.8441713770782807E-04 3.8350701868360181E-04 3.8259854464897604E-04 3.8169171321889407E-04 + 3.8078652201154151E-04 3.7988296864834183E-04 3.7898105075395282E-04 3.7808076595626151E-04 3.7718211188638091E-04 + 3.7628508617864508E-04 3.7538968647060519E-04 3.7449591040302562E-04 3.7360375561987924E-04 3.7271321976834360E-04 + 3.7182430049879716E-04 3.7093699546481419E-04 3.7005130232316134E-04 3.6916721873379328E-04 3.6828474235984853E-04 + 3.6740387086764528E-04 3.6652460192667735E-04 3.6564693320961035E-04 3.6477086239227683E-04 3.6389638715367251E-04 + 3.6302350517595274E-04 3.6215221414442753E-04 3.6128251174755789E-04 3.6041439567695158E-04 3.5954786362735934E-04 + 3.5868291329667009E-04 3.5781954238590756E-04 3.5695774859922604E-04 3.5609752964390592E-04 3.5523888323035047E-04 + 3.5438180707208063E-04 3.5352629888573160E-04 3.5267235639104905E-04 3.5181997731088463E-04 3.5096915937119183E-04 + 3.5011990030102235E-04 3.4927219783252188E-04 3.4842604970092571E-04 3.4758145364455542E-04 3.4673840740481439E-04 + 3.4589690872618365E-04 3.4505695535621850E-04 3.4421854504554345E-04 3.4338167554784946E-04 3.4254634461988910E-04 + 3.4171255002147274E-04 3.4088028951546461E-04 3.4004956086777902E-04 3.3922036184737563E-04 3.3839269022625681E-04 + 3.3756654377946224E-04 3.3674192028506581E-04 3.3591881752417134E-04 3.3509723328090888E-04 3.3427716534243046E-04 + 3.3345861149890633E-04 3.3264156954352102E-04 3.3182603727246887E-04 3.3101201248495138E-04 3.3019949298317180E-04 + 3.2938847657233217E-04 3.2857896106062908E-04 3.2777094425924969E-04 3.2696442398236783E-04 3.2615939804714046E-04 + 3.2535586427370343E-04 3.2455382048516722E-04 3.2375326450761408E-04 3.2295419417009317E-04 3.2215660730461690E-04 + 3.2136050174615745E-04 3.2056587533264261E-04 3.1977272590495178E-04 3.1898105130691252E-04 3.1819084938529624E-04 + 3.1740211798981437E-04 3.1661485497311504E-04 3.1582905819077875E-04 3.1504472550131452E-04 3.1426185476615627E-04 + 3.1348044384965878E-04 3.1270049061909419E-04 3.1192199294464810E-04 3.1114494869941505E-04 3.1036935575939580E-04 + 3.0959521200349280E-04 3.0882251531350670E-04 3.0805126357413224E-04 3.0728145467295447E-04 3.0651308650044592E-04 + 3.0574615694996135E-04 3.0498066391773464E-04 3.0421660530287553E-04 3.0345397900736462E-04 3.0269278293605114E-04 + 3.0193301499664775E-04 3.0117467309972740E-04 3.0041775515871988E-04 2.9966225908990786E-04 2.9890818281242266E-04 + 2.9815552424824104E-04 2.9740428132218134E-04 2.9665445196189980E-04 2.9590603409788659E-04 2.9515902566346243E-04 + 2.9441342459477458E-04 2.9366922883079311E-04 2.9292643631330769E-04 2.9218504498692324E-04 2.9144505279905656E-04 + 2.9070645769993265E-04 2.8996925764258067E-04 2.8923345058283093E-04 2.8849903447931074E-04 2.8776600729344033E-04 + 2.8703436698943003E-04 2.8630411153427631E-04 2.8557523889775796E-04 2.8484774705243203E-04 2.8412163397363127E-04 + 2.8339689763945956E-04 2.8267353603078806E-04 2.8195154713125308E-04 2.8123092892725054E-04 2.8051167940793361E-04 + 2.7979379656520846E-04 2.7907727839373084E-04 2.7836212289090268E-04 2.7764832805686826E-04 2.7693589189451009E-04 + 2.7622481240944645E-04 2.7551508761002676E-04 2.7480671550732846E-04 2.7409969411515341E-04 2.7339402145002404E-04 + 2.7268969553118002E-04 2.7198671438057444E-04 2.7128507602287063E-04 2.7058477848543821E-04 2.6988581979834941E-04 + 2.6918819799437628E-04 2.6849191110898610E-04 2.6779695718033862E-04 2.6710333424928177E-04 2.6641104035934920E-04 + 2.6572007355675546E-04 2.6503043189039349E-04 2.6434211341183042E-04 2.6365511617530447E-04 2.6296943823772128E-04 + 2.6228507765865009E-04 2.6160203250032073E-04 2.6092030082761991E-04 2.6023988070808740E-04 2.5956077021191317E-04 + 2.5888296741193305E-04 2.5820647038362612E-04 2.5753127720511062E-04 2.5685738595714063E-04 2.5618479472310271E-04 + 2.5551350158901193E-04 2.5484350464350942E-04 2.5417480197785768E-04 2.5350739168593801E-04 2.5284127186424652E-04 + 2.5217644061189095E-04 2.5151289603058731E-04 2.5085063622465597E-04 2.5018965930101884E-04 2.4952996336919525E-04 + 2.4887154654129899E-04 2.4821440693203491E-04 2.4755854265869526E-04 2.4690395184115611E-04 2.4625063260187447E-04 + 2.4559858306588434E-04 2.4494780136079372E-04 2.4429828561678066E-04 2.4365003396659081E-04 2.4300304454553270E-04 + 2.4235731549147551E-04 2.4171284494484507E-04 2.4106963104862073E-04 2.4042767194833184E-04 2.3978696579205421E-04 + 2.3914751073040723E-04 2.3850930491655021E-04 2.3787234650617862E-04 2.3723663365752165E-04 2.3660216453133784E-04 + 2.3596893729091275E-04 2.3533695010205440E-04 2.3470620113309108E-04 2.3407668855486742E-04 2.3344841054074122E-04 + 2.3282136526657981E-04 2.3219555091075729E-04 2.3157096565415051E-04 2.3094760768013653E-04 2.3032547517458859E-04 + 2.2970456632587330E-04 2.2908487932484702E-04 2.2846641236485272E-04 2.2784916364171663E-04 2.2723313135374488E-04 + 2.2661831370172049E-04 2.2600470888889949E-04 2.2539231512100848E-04 2.2478113060624049E-04 2.2417115355525237E-04 + 2.2356238218116124E-04 2.2295481469954094E-04 2.2234844932841929E-04 2.2174328428827477E-04 2.2113931780203263E-04 + 2.2053654809506268E-04 2.1993497339517495E-04 2.1933459193261719E-04 2.1873540194007152E-04 2.1813740165265087E-04 + 2.1754058930789608E-04 2.1694496314577253E-04 2.1635052140866703E-04 2.1575726234138425E-04 2.1516518419114413E-04 + 2.1457428520757797E-04 2.1398456364272574E-04 2.1339601775103274E-04 2.1280864578934630E-04 2.1222244601691259E-04 + 2.1163741669537350E-04 2.1105355608876347E-04 2.1047086246350628E-04 2.0988933408841185E-04 2.0930896923467313E-04 + 2.0872976617586272E-04 2.0815172318793020E-04 2.0757483854919813E-04 2.0699911054035974E-04 2.0642453744447548E-04 + 2.0585111754696950E-04 2.0527884913562716E-04 2.0470773050059119E-04 2.0413775993435924E-04 2.0356893573178020E-04 + 2.0300125619005131E-04 2.0243471960871502E-04 2.0186932428965579E-04 2.0130506853709712E-04 2.0074195065759840E-04 + 2.0017996896005150E-04 1.9961912175567800E-04 1.9905940735802602E-04 1.9850082408296712E-04 1.9794337024869318E-04 + 1.9738704417571296E-04 1.9683184418684986E-04 1.9627776860723801E-04 1.9572481576431952E-04 1.9517298398784142E-04 + 1.9462227160985265E-04 1.9407267696470060E-04 1.9352419838902853E-04 1.9297683422177242E-04 1.9243058280415763E-04 + 1.9188544247969601E-04 1.9134141159418306E-04 1.9079848849569431E-04 1.9025667153458296E-04 1.8971595906347655E-04 + 1.8917634943727365E-04 1.8863784101314125E-04 1.8810043215051157E-04 1.8756412121107908E-04 1.8702890655879724E-04 + 1.8649478655987587E-04 1.8596175958277773E-04 1.8542982399821607E-04 1.8489897817915100E-04 1.8436922050078677E-04 + 1.8384054934056886E-04 1.8331296307818093E-04 1.8278646009554185E-04 1.8226103877680240E-04 1.8173669750834288E-04 + 1.8121343467876949E-04 1.8069124867891196E-04 1.8017013790182015E-04 1.7965010074276117E-04 1.7913113559921650E-04 + 1.7861324087087912E-04 1.7809641495965039E-04 1.7758065626963696E-04 1.7706596320714820E-04 1.7655233418069303E-04 + 1.7603976760097691E-04 1.7552826188089906E-04 1.7501781543554954E-04 1.7450842668220620E-04 1.7400009404033170E-04 + 1.7349281593157081E-04 1.7298659077974731E-04 1.7248141701086122E-04 1.7197729305308559E-04 1.7147421733676419E-04 + 1.7097218829440787E-04 1.7047120436069213E-04 1.6997126397245402E-04 1.6947236556868962E-04 1.6897450759055058E-04 + 1.6847768848134154E-04 1.6798190668651744E-04 1.6748716065368016E-04 1.6699344883257613E-04 1.6650076967509296E-04 + 1.6600912163525732E-04 1.6551850316923116E-04 1.6502891273530949E-04 1.6454034879391741E-04 1.6405280980760702E-04 + 1.6356629424105483E-04 1.6308080056105879E-04 1.6259632723653554E-04 1.6211287273851745E-04 1.6163043554014980E-04 + 1.6114901411668812E-04 1.6066860694549502E-04 1.6018921250603784E-04 1.5971082927988535E-04 1.5923345575070529E-04 + 1.5875709040426148E-04 1.5828173172841072E-04 1.5780737821310048E-04 1.5733402835036551E-04 1.5686168063432578E-04 + 1.5639033356118278E-04 1.5591998562921778E-04 1.5545063533878797E-04 1.5498228119232446E-04 1.5451492169432914E-04 + 1.5404855535137201E-04 1.5358318067208837E-04 1.5311879616717615E-04 1.5265540034939287E-04 1.5219299173355319E-04 + 1.5173156883652601E-04 1.5127113017723165E-04 1.5081167427663931E-04 1.5035319965776405E-04 1.4989570484566422E-04 + 1.4943918836743874E-04 1.4898364875222422E-04 1.4852908453119227E-04 1.4807549423754697E-04 1.4762287640652163E-04 + 1.4717122957537694E-04 1.4672055228339716E-04 1.4627084307188820E-04 1.4582210048417481E-04 1.4537432306559748E-04 + 1.4492750936351005E-04 1.4448165792727702E-04 1.4403676730827055E-04 1.4359283605986829E-04 1.4314986273745000E-04 + 1.4270784589839552E-04 1.4226678410208176E-04 1.4182667590987983E-04 1.4138751988515276E-04 1.4094931459325265E-04 + 1.4051205860151798E-04 1.4007575047927085E-04 1.3964038879781443E-04 1.3920597213043051E-04 1.3877249905237633E-04 + 1.3833996814088223E-04 1.3790837797514918E-04 1.3747772713634582E-04 1.3704801420760576E-04 1.3661923777402536E-04 + 1.3619139642266067E-04 1.3576448874252499E-04 1.3533851332458624E-04 1.3491346876176417E-04 1.3448935364892791E-04 + 1.3406616658289343E-04 1.3364390616242067E-04 1.3322257098821096E-04 1.3280215966290465E-04 1.3238267079107824E-04 + 1.3196410297924193E-04 1.3154645483583687E-04 1.3112972497123282E-04 1.3071391199772519E-04 1.3029901452953280E-04 + 1.2988503118279516E-04 1.2947196057556967E-04 1.2905980132782945E-04 1.2864855206146038E-04 1.2823821140025884E-04 + 1.2782877796992887E-04 1.2742025039807976E-04 1.2701262731422335E-04 1.2660590734977180E-04 1.2620008913803466E-04 + 1.2579517131421631E-04 1.2539115251541377E-04 1.2498803138061377E-04 1.2458580655069044E-04 1.2418447666840270E-04 + 1.2378404037839165E-04 1.2338449632717812E-04 1.2298584316316021E-04 1.2258807953661051E-04 1.2219120409967378E-04 + 1.2179521550636442E-04 1.2140011241256387E-04 1.2100589347601816E-04 1.2061255735633532E-04 1.2022010271498306E-04 + 1.1982852821528581E-04 1.1943783252242290E-04 1.1904801430342544E-04 1.1865907222717418E-04 1.1827100496439694E-04 + 1.1788381118766593E-04 1.1749748957139558E-04 1.1711203879183980E-04 1.1672745752708974E-04 1.1634374445707102E-04 + 1.1596089826354146E-04 1.1557891763008860E-04 1.1519780124212709E-04 1.1481754778689646E-04 1.1443815595345838E-04 + 1.1405962443269444E-04 1.1368195191730367E-04 1.1330513710179984E-04 1.1292917868250926E-04 1.1255407535756835E-04 + 1.1217982582692098E-04 1.1180642879231626E-04 1.1143388295730604E-04 1.1106218702724229E-04 1.1069133970927499E-04 + 1.1032133971234948E-04 1.0995218574720406E-04 1.0958387652636763E-04 1.0921641076415727E-04 1.0884978717667584E-04 + 1.0848400448180937E-04 1.0811906139922509E-04 1.0775495665036850E-04 1.0739168895846136E-04 1.0702925704849914E-04 + 1.0666765964724857E-04 1.0630689548324544E-04 1.0594696328679188E-04 1.0558786178995449E-04 1.0522958972656133E-04 + 1.0487214583220010E-04 1.0451552884421539E-04 1.0415973750170656E-04 1.0380477054552506E-04 1.0345062671827243E-04 + 1.0309730476429775E-04 1.0274480342969512E-04 1.0239312146230169E-04 1.0204225761169494E-04 1.0169221062919054E-04 + 1.0134297926783991E-04 1.0099456228242790E-04 1.0064695842947044E-04 1.0030016646721225E-04 9.9954185155624379E-05 + 9.9609013256402081E-05 9.9264649532962237E-05 9.8921092750441168E-05 9.8578341675692368E-05 9.8236395077284025E-05 + 9.7895251725496822E-05 9.7554910392321610E-05 9.7215369851456966E-05 9.6876628878307081E-05 9.6538686249979317E-05 + 9.6201540745281962E-05 9.5865191144721963E-05 9.5529636230502459E-05 9.5194874786520657E-05 9.4860905598365553E-05 + 9.4527727453315574E-05 9.4195339140336191E-05 9.3863739450077862E-05 9.3532927174873578E-05 9.3202901108736666E-05 + 9.2873660047358475E-05 9.2545202788106215E-05 9.2217528130020485E-05 9.1890634873813111E-05 9.1564521821865062E-05 + 9.1239187778223836E-05 9.0914631548601519E-05 9.0590851940372359E-05 9.0267847762570574E-05 8.9945617825888126E-05 + 8.9624160942672432E-05 8.9303475926924127E-05 8.8983561594294816E-05 8.8664416762084956E-05 8.8346040249241397E-05 + 8.8028430876355420E-05 8.7711587465660239E-05 8.7395508841029085E-05 8.7080193827972674E-05 8.6765641253637199E-05 + 8.6451849946802029E-05 8.6138818737877524E-05 8.5826546458902788E-05 8.5515031943543524E-05 8.5204274027089844E-05 + 8.4894271546453933E-05 8.4585023340168005E-05 8.4276528248382053E-05 8.3968785112861625E-05 8.3661792776985644E-05 + 8.3355550085744348E-05 8.3050055885736847E-05 8.2745309025169218E-05 8.2441308353852183E-05 8.2138052723198927E-05 + 8.1835540986222933E-05 8.1533771997535892E-05 8.1232744613345508E-05 8.0932457691453290E-05 8.0632910091252302E-05 + 8.0334100673725304E-05 8.0036028301442262E-05 7.9738691838558462E-05 7.9442090150812125E-05 7.9146222105522455E-05 + 7.8851086571587445E-05 7.8556682419481626E-05 7.8263008521254062E-05 7.7970063750526248E-05 7.7677846982489714E-05 + 7.7386357093904326E-05 7.7095592963095664E-05 7.6805553469953361E-05 7.6516237495928642E-05 7.6227643924032382E-05 + 7.5939771638832955E-05 7.5652619526454077E-05 7.5366186474572772E-05 7.5080471372417179E-05 7.4795473110764559E-05 + 7.4511190581939070E-05 7.4227622679809793E-05 7.3944768299788450E-05 7.3662626338827510E-05 7.3381195695418103E-05 + 7.3100475269587711E-05 7.2820463962898276E-05 7.2541160678444097E-05 7.2262564320849646E-05 7.1984673796267622E-05 + 7.1707488012376870E-05 7.1431005878380086E-05 7.1155226305002101E-05 7.0880148204487540E-05 7.0605770490598941E-05 + 7.0332092078614471E-05 7.0059111885326160E-05 6.9786828829037587E-05 6.9515241829561978E-05 6.9244349808220154E-05 + 6.8974151687838336E-05 6.8704646392746320E-05 6.8435832848775288E-05 6.8167709983255753E-05 6.7900276725015702E-05 + 6.7633532004378276E-05 6.7367474753160118E-05 6.7102103904668895E-05 6.6837418393701626E-05 6.6573417156542573E-05 + 6.6310099130961151E-05 6.6047463256209922E-05 6.5785508473022687E-05 6.5524233723612260E-05 6.5263637951668775E-05 + 6.5003720102357329E-05 6.4744479122316300E-05 6.4485913959655086E-05 6.4228023563952272E-05 6.3970806886253490E-05 + 6.3714262879069688E-05 6.3458390496374793E-05 6.3203188693604020E-05 6.2948656427651664E-05 6.2694792656869253E-05 + 6.2441596341063574E-05 6.2189066441494596E-05 6.1937201920873617E-05 6.1686001743361103E-05 6.1435464874565001E-05 + 6.1185590281538524E-05 6.0936376932778251E-05 6.0687823798222282E-05 6.0439929849248111E-05 6.0192694058670768E-05 + 5.9946115400740835E-05 5.9700192851142547E-05 5.9454925386991763E-05 5.9210311986834042E-05 5.8966351630642753E-05 + 5.8723043299817054E-05 5.8480385977180050E-05 5.8238378646976756E-05 5.7997020294872188E-05 5.7756309907949503E-05 + 5.7516246474708030E-05 5.7276828985061306E-05 5.7038056430335148E-05 5.6799927803265852E-05 5.6562442097998114E-05 + 5.6325598310083220E-05 5.6089395436477160E-05 5.5853832475538545E-05 5.5618908427026902E-05 5.5384622292100652E-05 + 5.5150973073315276E-05 5.4917959774621306E-05 5.4685581401362562E-05 5.4453836960274173E-05 5.4222725459480646E-05 + 5.3992245908494170E-05 5.3762397318212461E-05 5.3533178700917091E-05 5.3304589070271433E-05 5.3076627441318958E-05 + 5.2849292830481273E-05 5.2622584255556172E-05 5.2396500735715856E-05 5.2171041291505099E-05 5.1946204944839223E-05 + 5.1721990719002457E-05 5.1498397638645840E-05 5.1275424729785508E-05 5.1053071019800813E-05 5.0831335537432442E-05 + 5.0610217312780568E-05 5.0389715377303004E-05 5.0169828763813402E-05 4.9950556506479294E-05 4.9731897640820366E-05 + 4.9513851203706565E-05 4.9296416233356237E-05 4.9079591769334370E-05 4.8863376852550653E-05 4.8647770525257751E-05 + 4.8432771831049411E-05 4.8218379814858653E-05 4.8004593522955945E-05 4.7791412002947401E-05 4.7578834303772895E-05 + 4.7366859475704386E-05 4.7155486570343910E-05 4.6944714640621985E-05 4.6734542740795567E-05 4.6524969926446455E-05 + 4.6315995254479382E-05 4.6107617783120183E-05 4.5899836571914128E-05 4.5692650681723931E-05 4.5486059174728165E-05 + 4.5280061114419312E-05 4.5074655565602030E-05 4.4869841594391372E-05 4.4665618268211022E-05 4.4461984655791432E-05 + 4.4258939827168145E-05 4.4056482853679931E-05 4.3854612807967034E-05 4.3653328763969502E-05 4.3452629796925186E-05 + 4.3252514983368258E-05 4.3052983401127180E-05 4.2854034129323099E-05 4.2655666248368071E-05 4.2457878839963290E-05 + 4.2260670987097229E-05 4.2064041774044052E-05 4.1867990286361767E-05 4.1672515610890481E-05 4.1477616835750673E-05 + 4.1283293050341444E-05 4.1089543345338773E-05 4.0896366812693795E-05 4.0703762545630989E-05 4.0511729638646552E-05 + 4.0320267187506569E-05 4.0129374289245351E-05 3.9939050042163682E-05 3.9749293545827052E-05 3.9560103901064023E-05 + 3.9371480209964437E-05 3.9183421575877656E-05 3.8995927103410998E-05 3.8808995898427878E-05 3.8622627068046113E-05 + 3.8436819720636322E-05 3.8251572965820070E-05 3.8066885914468248E-05 3.7882757678699377E-05 3.7699187371877853E-05 + 3.7516174108612318E-05 3.7333717004753852E-05 3.7151815177394429E-05 3.6970467744865098E-05 3.6789673826734349E-05 + 3.6609432543806417E-05 3.6429743018119612E-05 3.6250604372944594E-05 3.6072015732782721E-05 3.5893976223364404E-05 + 3.5716484971647376E-05 3.5539541105815001E-05 3.5363143755274693E-05 3.5187292050656140E-05 3.5011985123809737E-05 + 3.4837222107804844E-05 3.4663002136928143E-05 3.4489324346681987E-05 3.4316187873782776E-05 3.4143591856159224E-05 + 3.3971535432950748E-05 3.3800017744505845E-05 3.3629037932380360E-05 3.3458595139335935E-05 3.3288688509338305E-05 + 3.3119317187555659E-05 3.2950480320356989E-05 3.2782177055310530E-05 3.2614406541182022E-05 3.2447167927933104E-05 + 3.2280460366719737E-05 3.2114283009890497E-05 3.1948635010985004E-05 3.1783515524732282E-05 3.1618923707049117E-05 + 3.1454858715038435E-05 3.1291319706987706E-05 3.1128305842367332E-05 3.0965816281829035E-05 3.0803850187204169E-05 + 3.0642406721502217E-05 3.0481485048909117E-05 3.0321084334785669E-05 3.0161203745665940E-05 3.0001842449255683E-05 + 2.9842999614430655E-05 2.9684674411235142E-05 2.9526866010880244E-05 2.9369573585742379E-05 2.9212796309361611E-05 + 2.9056533356440140E-05 2.8900783902840648E-05 2.8745547125584747E-05 2.8590822202851378E-05 2.8436608313975293E-05 + 2.8282904639445363E-05 2.8129710360903121E-05 2.7977024661141086E-05 2.7824846724101281E-05 2.7673175734873591E-05 + 2.7522010879694245E-05 2.7371351345944234E-05 2.7221196322147709E-05 2.7071544997970485E-05 2.6922396564218472E-05 + 2.6773750212836047E-05 2.6625605136904588E-05 2.6477960530640873E-05 2.6330815589395533E-05 2.6184169509651509E-05 + 2.6038021489022510E-05 2.5892370726251478E-05 2.5747216421209000E-05 2.5602557774891832E-05 2.5458393989421297E-05 + 2.5314724268041810E-05 2.5171547815119287E-05 2.5028863836139659E-05 2.4886671537707290E-05 2.4744970127543527E-05 + 2.4603758814485091E-05 2.4463036808482602E-05 2.4322803320599052E-05 2.4183057563008259E-05 2.4043798748993389E-05 + 2.3905026092945410E-05 2.3766738810361568E-05 2.3628936117843932E-05 2.3491617233097830E-05 2.3354781374930335E-05 + 2.3218427763248831E-05 2.3082555619059408E-05 2.2947164164465464E-05 2.2812252622666107E-05 2.2677820217954740E-05 + 2.2543866175717520E-05 2.2410389722431888E-05 2.2277390085665023E-05 2.2144866494072454E-05 2.2012818177396451E-05 + 2.1881244366464651E-05 2.1750144293188502E-05 2.1619517190561808E-05 2.1489362292659252E-05 2.1359678834634900E-05 + 2.1230466052720736E-05 2.1101723184225212E-05 2.0973449467531743E-05 2.0845644142097234E-05 2.0718306448450655E-05 + 2.0591435628191526E-05 2.0465030923988479E-05 2.0339091579577803E-05 2.0213616839761965E-05 2.0088605950408175E-05 + 1.9964058158446890E-05 1.9839972711870416E-05 1.9716348859731392E-05 1.9593185852141423E-05 1.9470482940269540E-05 + 1.9348239376340813E-05 1.9226454413634906E-05 1.9105127306484599E-05 1.8984257310274385E-05 1.8863843681439010E-05 + 1.8743885677462041E-05 1.8624382556874437E-05 1.8505333579253121E-05 1.8386738005219524E-05 1.8268595096438197E-05 + 1.8150904115615352E-05 1.8033664326497430E-05 1.7916874993869724E-05 1.7800535383554908E-05 1.7684644762411656E-05 + 1.7569202398333198E-05 1.7454207560245923E-05 1.7339659518107950E-05 1.7225557542907732E-05 1.7111900906662638E-05 + 1.6998688882417539E-05 1.6885920744243431E-05 1.6773595767235990E-05 1.6661713227514194E-05 1.6550272402218938E-05 + 1.6439272569511601E-05 1.6328713008572665E-05 1.6218592999600344E-05 1.6108911823809151E-05 1.5999668763428530E-05 + 1.5890863101701470E-05 1.5782494122883112E-05 1.5674561112239357E-05 1.5567063356045499E-05 1.5460000141584841E-05 + 1.5353370757147297E-05 1.5247174492028038E-05 1.5141410636526094E-05 1.5036078481943019E-05 1.4931177320581461E-05 + 1.4826706445743849E-05 1.4722665151730985E-05 1.4619052733840706E-05 1.4515868488366497E-05 1.4413111712596133E-05 + 1.4310781704810335E-05 1.4208877764281399E-05 1.4107399191271826E-05 1.4006345287032994E-05 1.3905715353803781E-05 + 1.3805508694809235E-05 1.3705724614259188E-05 1.3606362417346964E-05 1.3507421410247985E-05 1.3408900900118431E-05 + 1.3310800195093936E-05 1.3213118604288194E-05 1.3115855437791674E-05 1.3019010006670228E-05 1.2922581622963808E-05 + 1.2826569599685090E-05 1.2730973250818175E-05 1.2635791891317238E-05 1.2541024837105206E-05 1.2446671405072436E-05 + 1.2352730913075381E-05 1.2259202679935281E-05 1.2166086025436837E-05 1.2073380270326878E-05 1.1981084736313069E-05 + 1.1889198746062567E-05 1.1797721623200747E-05 1.1706652692309833E-05 1.1615991278927645E-05 1.1525736709546255E-05 + 1.1435888311610696E-05 1.1346445413517646E-05 1.1257407344614144E-05 1.1168773435196257E-05 1.1080543016507819E-05 + 1.0992715420739105E-05 1.0905289981025542E-05 1.0818266031446418E-05 1.0731642907023585E-05 1.0645419943720174E-05 + 1.0559596478439308E-05 1.0474171849022802E-05 1.0389145394249893E-05 1.0304516453835933E-05 1.0220284368431142E-05 + 1.0136448479619291E-05 1.0053008129916459E-05 9.9699626627697155E-06 9.8873114225558920E-06 9.8050537545802549E-06 + 9.7231890050752895E-06 9.6417165211993895E-06 9.5606356510356053E-06 9.4799457435903787E-06 9.3996461487922603E-06 + 9.3197362174906814E-06 9.2402153014546631E-06 9.1610827533715542E-06 9.0823379268457946E-06 9.0039801763976546E-06 + 8.9260088574619548E-06 8.8484233263868594E-06 8.7712229404325702E-06 8.6944070577701222E-06 8.6179750374801214E-06 + 8.5419262395514815E-06 8.4662600248802082E-06 8.3909757552681368E-06 8.3160727934216943E-06 8.2415505029506668E-06 + 8.1674082483669544E-06 8.0936453950833458E-06 8.0202613094122656E-06 7.9472553585645603E-06 7.8746269106482593E-06 + 7.8023753346673422E-06 7.7305000005205186E-06 7.6590002789999972E-06 7.5878755417902579E-06 7.5171251614668436E-06 + 7.4467485114951294E-06 7.3767449662290893E-06 7.3071139009101097E-06 7.2378546916657466E-06 7.1689667155085238E-06 + 7.1004493503347198E-06 7.0323019749231475E-06 6.9645239689339577E-06 6.8971147129074251E-06 6.8300735882627415E-06 + 6.7633999772968060E-06 6.6970932631830392E-06 6.6311528299701611E-06 6.5655780625810042E-06 6.5003683468113167E-06 + 6.4355230693285558E-06 6.3710416176706986E-06 6.3069233802450562E-06 6.2431677463270728E-06 6.1797741060591343E-06 + 6.1167418504493876E-06 6.0540703713705494E-06 5.9917590615587228E-06 5.9298073146122096E-06 5.8682145249903405E-06 + 5.8069800880122788E-06 5.7461033998558498E-06 5.6855838575563673E-06 5.6254208590054506E-06 5.5656138029498572E-06 + 5.5061620889903048E-06 5.4470651175803043E-06 5.3883222900249899E-06 5.3299330084799558E-06 5.2718966759500756E-06 + 5.2142126962883583E-06 5.1568804741947725E-06 5.0998994152150864E-06 5.0432689257397108E-06 4.9869884130025454E-06 + 4.9310572850798100E-06 4.8754749508889019E-06 4.8202408201872344E-06 4.7653543035710960E-06 4.7108148124744839E-06 + 4.6566217591679669E-06 4.6027745567575378E-06 4.5492726191834645E-06 4.4961153612191454E-06 4.4433021984699746E-06 + 4.3908325473721896E-06 4.3387058251917402E-06 4.2869214500231478E-06 4.2354788407883698E-06 4.1843774172356673E-06 + 4.1336165999384662E-06 4.0831958102942330E-06 4.0331144705233374E-06 3.9833720036679296E-06 3.9339678335908110E-06 + 3.8849013849743071E-06 3.8361720833191479E-06 3.7877793549433417E-06 3.7397226269810557E-06 3.6920013273814954E-06 + 3.6446148849077927E-06 3.5975627291358792E-06 3.5508442904533802E-06 3.5044590000585003E-06 3.4584062899589036E-06 + 3.4126855929706174E-06 3.3672963427169101E-06 3.3222379736271925E-06 3.2775099209359074E-06 3.2331116206814315E-06 + 3.1890425097049642E-06 3.1453020256494323E-06 3.1018896069583878E-06 3.0588046928749130E-06 3.0160467234405217E-06 + 2.9736151394940601E-06 2.9315093826706199E-06 2.8897288954004424E-06 2.8482731209078273E-06 2.8071415032100473E-06 + 2.7663334871162533E-06 2.7258485182263948E-06 2.6856860429301328E-06 2.6458455084057534E-06 2.6063263626190939E-06 + 2.5671280543224526E-06 2.5282500330535150E-06 2.4896917491342790E-06 2.4514526536699715E-06 2.4135321985479816E-06 + 2.3759298364367804E-06 2.3386450207848575E-06 2.3016772058196430E-06 2.2650258465464424E-06 2.2286903987473707E-06 + 2.1926703189802834E-06 2.1569650645777139E-06 2.1215740936458115E-06 2.0864968650632787E-06 2.0517328384803105E-06 + 2.0172814743175379E-06 1.9831422337649681E-06 1.9493145787809312E-06 1.9157979720910258E-06 1.8825918771870643E-06 + 1.8496957583260240E-06 1.8171090805289939E-06 1.7848313095801299E-06 1.7528619120256051E-06 1.7212003551725652E-06 + 1.6898461070880848E-06 1.6587986365981215E-06 1.6280574132864800E-06 1.5976219074937663E-06 1.5674915903163533E-06 + 1.5376659336053424E-06 1.5081444099655249E-06 1.4789264927543539E-06 1.4500116560809044E-06 1.4213993748048479E-06 + 1.3930891245354178E-06 1.3650803816303828E-06 1.3373726231950196E-06 1.3099653270810859E-06 1.2828579718857969E-06 + 1.2560500369508021E-06 1.2295410023611631E-06 1.2033303489443335E-06 1.1774175582691402E-06 1.1518021126447648E-06 + 1.1264834951197301E-06 1.1014611894808815E-06 1.0767346802523767E-06 1.0523034526946711E-06 1.0281669928035114E-06 + 1.0043247873089202E-06 9.8077632367419437E-07 9.5752109009489373E-07 9.3455857549783852E-07 9.1188826954010496E-07 + 8.8950966260802219E-07 8.6742224581617264E-07 8.4562551100639087E-07 8.2411895074676637E-07 8.0290205833064579E-07 + 7.8197432777563763E-07 7.6133525382261881E-07 7.4098433193473992E-07 7.2092105829643570E-07 7.0114492981243364E-07 + 6.8165544410676514E-07 6.6245209952177917E-07 6.4353439511715429E-07 6.2490183066891591E-07 6.0655390666845090E-07 + 5.8849012432152695E-07 5.7070998554731087E-07 5.5321299297739001E-07 5.3599864995479312E-07 5.1906646053301435E-07 + 5.0241592947503738E-07 4.8604656225236204E-07 4.6995786504403030E-07 4.5414934473565598E-07 4.3862050891845390E-07 + 4.2337086588827141E-07 4.0839992464462100E-07 3.9370719488971370E-07 3.7929218702749447E-07 3.6515441216267863E-07 + 3.5129338209979023E-07 3.3770860934219962E-07 3.2439960709116581E-07 3.1136588924487636E-07 2.9860697039749162E-07 + 2.8612236583818868E-07 2.7391159155020703E-07 2.6197416420989495E-07 2.5030960118575872E-07 2.3891742053751147E-07 + 2.2779714101512393E-07 2.1694828205787713E-07 2.0637036379341505E-07 1.9606290703679999E-07 1.8602543328956817E-07 + 1.7625746473878712E-07 1.6675852425611413E-07 1.5752813539685634E-07 1.4856582239903153E-07 1.3987111018243088E-07 + 1.3144352434768237E-07 1.2328259117531584E-07 1.1538783762482934E-07 1.0775879133375637E-07 1.0039498061673495E-07 + 9.3295934464577550E-08 8.6461182543342368E-08 7.9890255193405966E-08 7.3582683428537148E-08 6.7537998934972012E-08 + 6.1755734070490388E-08 5.6235421863493463E-08 5.0976596012082631E-08 4.5978790883139762E-08 4.1241541511408426E-08 + 3.6764383598576760E-08 3.2546853512361213E-08 2.8588488285591833E-08 2.4888825615298599E-08 2.1447403861799117E-08 + 1.8263762047787515E-08 1.5337439857424584E-08 1.2667977635429169E-08 1.0254916386170817E-08 8.0977977727635969E-09 + 6.1961641161612611E-09 4.5495583942535325E-09 3.1575242409637009E-09 2.0196059453474273E-09 1.1353484506927641E-09 + 5.0429735362142380E-10 1.2599890319126388E-10 0.0000000000000000E+00 + 1.5237599966437169E+05 7.6187999832185844E+04 3.8093960645064377E+04 2.5395930128952761E+04 1.9046901780652592E+04 + 1.5237474299543315E+04 1.2697847252100339E+04 1.0883820452541042E+04 9.5232938079858977E+03 8.4651006001790029E+03 + 7.6185407981762783E+03 6.9258962004764699E+03 6.3486880060865979E+03 5.8602770450957387E+03 5.4416353390028398E+03 + 5.0788090369134243E+03 4.7613327506625592E+03 4.4812035363649611E+03 4.2321968821151286E+03 4.0093986995715723E+03 + 3.8088777180658271E+03 3.6274514803946045E+03 3.4625161579413079E+03 3.3119207618528858E+03 3.1738728014223743E+03 + 3.0468665844597272E+03 2.9296280637308278E+03 2.8210719397434591E+03 2.7202679557933902E+03 2.6264141664491731E+03 + 2.5388155523400546E+03 2.4568667740171359E+03 2.3800381594655742E+03 2.3078642393418636E+03 2.2399343054045057E+03 + 2.1758845874994472E+03 2.1153917343812604E+03 2.0581673516984733E+03 2.0039534024022437E+03 1.9525183147845123E+03 + 1.9036536743103638E+03 1.8571713995725509E+03 1.8129013216810611E+03 1.7706891014122457E+03 1.7303944303831204E+03 + 1.6918894720690685E+03 1.6550575061670552E+03 1.6197917460188564E+03 1.5859943038564077E+03 1.5535752827517697E+03 + 1.5224519775331298E+03 1.4925481697106650E+03 1.4637935037571237E+03 1.4361229339981392E+03 1.4094762329591995E+03 + 1.3837975533474644E+03 1.3590350369641233E+03 1.3351404647838665E+03 1.3120689432330269E+03 1.2897786223716487E+03 + 1.2682304422573409E+03 1.2473879042569524E+03 1.2272168644893843E+03 1.2076853469404875E+03 1.1887633740984720E+03 + 1.1704228132229566E+03 1.1526372365895411E+03 1.1353817942498360E+03 1.1186330980184916E+03 1.1023691155483586E+03 + 1.0865690734848984E+03 1.0712133688047218E+03 1.0562834875426063E+03 1.0417619301984612E+03 1.0276321431923905E+03 + 1.0138784558033458E+03 1.0004860220862990E+03 9.8744076731537382E+02 9.7472933854670316E+02 9.6233905893604117E+02 + 9.5025788548251910E+02 9.3847436990251992E+02 9.2697762236643234E+02 9.1575727785683466E+02 9.0480346492968738E+02 + 8.9410677668058952E+02 8.8365824373666715E+02 8.7344930911108929E+02 8.6347180477202824E+02 8.5371792979126860E+02 + 8.4418022994954788E+02 8.3485157868663055E+02 8.2572515929373799E+02 8.1679444825487280E+02 8.0805319965145759E+02 + 7.9949543055194601E+02 7.9111540731457933E+02 7.8290763273739867E+02 7.7486683399498565E+02 7.6698795130631765E+02 + 7.5926612728254815E+02 7.5169669690758860E+02 7.4427517810807251E+02 7.3699726287264184E+02 7.2985880888358110E+02 + 7.2285583162663625E+02 7.1598449694747057E+02 7.0924111402548249E+02 7.0262212873799831E+02 6.9612411738971468E+02 + 6.8974378078418499E+02 6.8347793861576758E+02 6.7732352416199467E+02 6.7127757925776564E+02 6.6533724953406670E+02 + 6.5949977990509171E+02 6.5376251028879085E+02 6.4812287154689011E+02 6.4257838163133204E+02 6.3712664192502825E+02 + 6.3176533376556392E+02 6.2649221514129181E+02 6.2130511754990141E+02 6.1620194301023582E+02 6.1118066121869970E+02 + 6.0623930684215009E+02 6.0137597693971406E+02 5.9658882850638713E+02 5.9187607613179580E+02 5.8723598976784945E+02 + 5.8266689259941325E+02 5.7816715901252485E+02 5.7373521265494639E+02 5.6936952458423025E+02 5.6506861149868610E+02 + 5.6083103404699023E+02 5.5665539521236076E+02 5.5254033876749770E+02 5.4848454779670863E+02 5.4448674328181585E+02 + 5.4054568274867972E+02 5.3666015897130580E+02 5.3282899873071347E+02 5.2905106162588220E+02 5.2532523893423445E+02 + 5.2165045251927882E+02 5.1802565378314057E+02 5.1444982266184343E+02 5.1092196666132878E+02 5.0744111993229410E+02 + 5.0400634238202531E+02 5.0061671882153945E+02 4.9727135814637296E+02 4.9396939254951138E+02 4.9070997676497933E+02 + 4.8749228734070766E+02 4.8431552193936773E+02 4.8117889866593288E+02 4.7808165542076119E+02 4.7502304927710890E+02 + 4.7200235588197046E+02 4.6901886887925565E+02 4.6607189935432956E+02 4.6316077529899832E+02 4.6028484109606688E+02 + 4.5744345702264536E+02 4.5463599877140098E+02 4.5186185698901636E+02 4.4912043683112807E+02 4.4641115753306764E+02 + 4.4373345199575635E+02 4.4108676638611934E+02 4.3847055975144906E+02 4.3588430364714480E+02 4.3332748177727302E+02 + 4.3079958964747630E+02 4.2830013422968722E+02 4.2582863363823350E+02 4.2338461681683833E+02 4.2096762323613279E+02 + 4.1857720260123682E+02 4.1621291456903498E+02 4.1387432847478328E+02 4.1156102306766809E+02 4.0927258625499309E+02 + 4.0700861485466288E+02 4.0476871435565010E+02 4.0255249868614931E+02 4.0035958998912719E+02 3.9818961840500350E+02 + 3.9604222186118778E+02 3.9391704586823630E+02 3.9181374332236794E+02 3.8973197431412910E+02 3.8767140594297445E+02 + 3.8563171213754566E+02 3.8361257348146137E+02 3.8161367704440835E+02 3.7963471621835163E+02 3.7767539055867985E+02 + 3.7573540563012585E+02 3.7381447285727205E+02 3.7191230937951275E+02 3.7002863791028943E+02 3.6816318660047352E+02 + 3.6631568890574556E+02 3.6448588345783747E+02 3.6267351393950764E+02 3.6087832896312074E+02 3.5910008195271558E+02 + 3.5733853102943880E+02 3.5559343890024161E+02 3.5386457274972219E+02 3.5215170413501551E+02 3.5045460888363544E+02 + 3.4877306699415681E+02 3.4710686253966611E+02 3.4545578357388194E+02 3.4381962203984779E+02 3.4219817368114320E+02 + 3.4059123795550016E+02 3.3899861795077771E+02 3.3742012030320029E+02 3.3585555511779518E+02 3.3430473589096795E+02 + 3.3276747943513556E+02 3.3124360580536450E+02 3.2973293822794329E+02 3.2823530303084260E+02 3.2675052957598984E+02 + 3.2527845019331357E+02 3.2381890011650069E+02 3.2237171742041761E+02 3.2093674296013660E+02 3.1951382031153162E+02 + 3.1810279571338810E+02 3.1670351801098735E+02 3.1531583860111317E+02 3.1393961137844963E+02 3.1257469268332727E+02 + 3.1122094125076569E+02 3.0987821816079696E+02 3.0854638679000936E+02 3.0722531276429760E+02 3.0591486391276726E+02 + 3.0461491022277113E+02 3.0332532379604390E+02 3.0204597880589961E+02 3.0077675145546510E+02 2.9951751993692210E+02 + 2.9826816439172410E+02 2.9702856687176717E+02 2.9579861130148345E+02 2.9457818344083529E+02 2.9336717084918064E+02 + 2.9216546284999271E+02 2.9097295049640246E+02 2.8978952653754874E+02 2.8861508538571030E+02 2.8744952308419522E+02 + 2.8629273727597979E+02 2.8514462717305821E+02 2.8400509352650158E+02 2.8287403859719944E+02 2.8175136612726237E+02 + 2.8063698131207229E+02 2.7953079077296951E+02 2.7843270253054726E+02 2.7734262597854269E+02 2.7626047185831897E+02 + 2.7518615223390634E+02 2.7411958046759776E+02 2.7306067119608491E+02 2.7200934030711630E+02 2.7096550491666807E+02 + 2.6992908334661269E+02 2.6889999510287186E+02 2.6787816085404324E+02 2.6686350241049206E+02 2.6585594270388407E+02 + 2.6485540576716488E+02 2.6386181671496558E+02 2.6287510172441870E+02 2.6189518801639258E+02 2.6092200383710804E+02 + 2.5995547844015658E+02 2.5899554206888291E+02 2.5804212593914599E+02 2.5709516222243320E+02 2.5615458402932427E+02 + 2.5522032539330471E+02 2.5429232125490432E+02 2.5337050744616681E+02 2.5245482067543540E+02 2.5154519851245047E+02 + 2.5064157937374821E+02 2.4974390250835737E+02 2.4885210798378361E+02 2.4796613667227555E+02 2.4708593023736918E+02 + 2.4621143112069731E+02 2.4534258252906741E+02 2.4447932842178832E+02 2.4362161349825604E+02 2.4276938318578044E+02 + 2.4192258362764997E+02 2.4108116167143606E+02 2.4024506485751795E+02 2.3941424140784000E+02 2.3858864021488012E+02 + 2.3776821083083453E+02 2.3695290345701255E+02 2.3614266893343310E+02 2.3533745872862156E+02 2.3453722492960097E+02 + 2.3374192023207493E+02 2.3295149793079671E+02 2.3216591191011872E+02 2.3138511663472397E+02 2.3060906714052828E+02 + 2.2983771902575415E+02 2.2907102844217354E+02 2.2830895208651128E+02 2.2755144719200879E+02 2.2679847152014310E+02 + 2.2604998335250377E+02 2.2530594148281023E+02 2.2456630520908624E+02 2.2383103432596650E+02 2.2310008911715479E+02 + 2.2237343034800853E+02 2.2165101925826602E+02 2.2093281755490187E+02 2.2021878740510817E+02 2.1950889142940875E+02 + 2.1880309269488987E+02 2.1810135470855653E+02 2.1740364141080443E+02 2.1670991716900767E+02 2.1602014677122335E+02 + 2.1533429542000249E+02 2.1465232872631304E+02 2.1397421270356892E+02 2.1329991376176355E+02 2.1262939870170388E+02 + 2.1196263470934670E+02 2.1129958935023515E+02 2.1064023056402488E+02 2.0998452665911029E+02 2.0933244630734370E+02 + 2.0868395853884027E+02 2.0803903273687402E+02 2.0739763863286336E+02 2.0675974630143716E+02 2.0612532615558902E+02 + 2.0549434894191037E+02 2.0486678573590510E+02 2.0424260793738191E+02 2.0362178726592589E+02 2.0300429575644361E+02 + 2.0239010575478437E+02 2.0177918991343196E+02 2.0117152118727066E+02 2.0056707282941841E+02 1.9996581838713078E+02 + 1.9936773169777067E+02 1.9877278688484662E+02 1.9818095835411171E+02 1.9759222078972954E+02 1.9700654915050276E+02 + 1.9642391866615907E+02 1.9584430483370241E+02 1.9526768341381688E+02 1.9469403042733569E+02 1.9412332215176104E+02 + 1.9355553511784024E+02 1.9299064610620115E+02 1.9242863214403539E+02 1.9186947050183821E+02 1.9131313869019593E+02 + 1.9075961445663000E+02 1.9020887578248545E+02 1.8966090087987001E+02 1.8911566818864134E+02 1.8857315637344337E+02 + 1.8803334432078347E+02 1.8749621113616070E+02 1.8696173614123441E+02 1.8642989887104164E+02 1.8590067907125032E+02 + 1.8537405669546021E+02 1.8485001190254587E+02 1.8432852505403409E+02 1.8380957671152922E+02 1.8329314763417020E+02 + 1.8277921877613340E+02 1.8226777128416830E+02 1.8175878649517017E+02 1.8125224593379423E+02 1.8074813131010069E+02 + 1.8024642451723690E+02 1.7974710762915521E+02 1.7925016289836293E+02 1.7875557275370713E+02 1.7826331979819236E+02 + 1.7777338680682973E+02 1.7728575672451916E+02 1.7680041266396066E+02 1.7631733790359945E+02 1.7583651588559761E+02 + 1.7535793021384035E+02 1.7488156465196462E+02 1.7440740312142171E+02 1.7393542969956826E+02 1.7346562861777988E+02 + 1.7299798425959736E+02 1.7253248115889812E+02 1.7206910399809013E+02 1.7160783760633879E+02 1.7114866695781393E+02 + 1.7069157716996153E+02 1.7023655350180528E+02 1.6978358135226600E+02 1.6933264625850990E+02 1.6888373389431646E+02 + 1.6843683006847175E+02 1.6799192072318365E+02 1.6754899193251904E+02 1.6710802990086336E+02 1.6666902096140126E+02 + 1.6623195157461959E+02 1.6579680832682902E+02 1.6536357792870777E+02 1.6493224721386719E+02 1.6450280313743175E+02 + 1.6407523277464594E+02 1.6364952331949277E+02 1.6322566208333873E+02 1.6280363649359003E+02 1.6238343409237379E+02 + 1.6196504253523216E+02 1.6154844958983651E+02 1.6113364313471956E+02 1.6072061115802336E+02 1.6030934175626479E+02 + 1.5989982313311765E+02 1.5949204359821076E+02 1.5908599156594349E+02 1.5868165555431526E+02 1.5827902418377218E+02 + 1.5787808617606817E+02 1.5747883035314194E+02 1.5708124563600811E+02 1.5668532104366454E+02 1.5629104569201098E+02 + 1.5589840879278560E+02 1.5550739965251410E+02 1.5511800767147051E+02 1.5473022234265611E+02 1.5434403325078671E+02 + 1.5395943007129711E+02 1.5357640256935682E+02 1.5319494059889709E+02 1.5281503410165419E+02 1.5243667310622220E+02 + 1.5205984772711852E+02 1.5168454816386188E+02 1.5131076470006246E+02 1.5093848770252276E+02 1.5056770762035015E+02 + 1.5019841498408269E+02 1.4983060040482223E+02 1.4946425457338239E+02 1.4909936825944430E+02 1.4873593231072732E+02 + 1.4837393765216331E+02 1.4801337528508819E+02 1.4765423628644018E+02 1.4729651180796864E+02 1.4694019307545196E+02 + 1.4658527138792854E+02 1.4623173811693323E+02 1.4587958470574458E+02 1.4552880266864409E+02 1.4517938359018072E+02 + 1.4483131912444631E+02 1.4448460099436119E+02 1.4413922099096581E+02 1.4379517097272364E+02 1.4345244286483106E+02 + 1.4311102865853610E+02 1.4277092041046609E+02 1.4243211024196214E+02 1.4209459033842370E+02 1.4175835294865877E+02 + 1.4142339038424493E+02 1.4108969501889436E+02 1.4075725928782938E+02 1.4042607568716545E+02 1.4009613677329961E+02 + 1.3976743516230701E+02 1.3943996352934818E+02 1.3911371460807587E+02 1.3878868119005682E+02 1.3846485612419605E+02 + 1.3814223231616745E+02 1.3782080272785510E+02 1.3750056037679693E+02 1.3718149833563726E+02 1.3686360973158546E+02 + 1.3654688774588075E+02 1.3623132561326221E+02 1.3591691662144763E+02 1.3560365411061724E+02 1.3529153147290086E+02 + 1.3498054215187531E+02 1.3467067964206518E+02 1.3436193748844906E+02 1.3405430928597463E+02 1.3374778867907389E+02 + 1.3344236936118890E+02 1.3313804507430194E+02 1.3283480960846848E+02 1.3253265680135931E+02 1.3223158053780327E+02 + 1.3193157474934191E+02 1.3163263341378075E+02 1.3133475055475373E+02 1.3103792024128725E+02 1.3074213658737111E+02 + 1.3044739375153461E+02 1.3015368593642592E+02 1.2986100738839858E+02 1.2956935239710040E+02 1.2927871529506808E+02 + 1.2898909045732563E+02 1.2870047230098959E+02 1.2841285528487455E+02 1.2812623390910673E+02 1.2784060271474067E+02 + 1.2755595628337879E+02 1.2727228923679903E+02 1.2698959623658024E+02 1.2670787198373958E+02 1.2642711121836582E+02 + 1.2614730871926440E+02 1.2586845930359949E+02 1.2559055782654539E+02 1.2531359918093899E+02 1.2503757829693498E+02 + 1.2476249014166871E+02 1.2448832971891889E+02 1.2421509206877637E+02 1.2394277226731471E+02 1.2367136542626557E+02 + 1.2340086669269708E+02 1.2313127124869739E+02 1.2286257431105746E+02 1.2259477113096190E+02 1.2232785699368023E+02 + 1.2206182721826266E+02 1.2179667715723825E+02 1.2153240219631832E+02 1.2126899775409984E+02 1.2100645928177391E+02 + 1.2074478226283914E+02 1.2048396221281229E+02 1.2022399467894986E+02 1.1996487523996579E+02 1.1970659950575487E+02 + 1.1944916311712051E+02 1.1919256174550321E+02 1.1893679109271127E+02 1.1868184689065779E+02 1.1842772490109674E+02 + 1.1817442091536367E+02 1.1792193075411862E+02 1.1767025026709202E+02 1.1741937533283287E+02 1.1716930185845952E+02 + 1.1692002577941349E+02 1.1667154305921495E+02 1.1642384968922265E+02 1.1617694168839299E+02 1.1593081510304451E+02 + 1.1568546600662494E+02 1.1544089049947738E+02 1.1519708470861187E+02 1.1495404478747957E+02 1.1471176691574682E+02 + 1.1447024729907213E+02 1.1422948216888847E+02 1.1398946778218240E+02 1.1375020042128097E+02 1.1351167639363688E+02 + 1.1327389203161727E+02 1.1303684369229467E+02 1.1280052775724003E+02 1.1256494063231717E+02 1.1233007874748030E+02 + 1.1209593855657283E+02 1.1186251653712858E+02 1.1162980919017451E+02 1.1139781304003596E+02 1.1116652463414314E+02 + 1.1093594054284152E+02 1.1070605735920016E+02 1.1047687169882569E+02 1.1024838019967748E+02 1.1002057952188197E+02 + 1.0979346634755285E+02 1.0956703738060905E+02 1.0934128934659758E+02 1.0911621899251736E+02 1.0889182308664215E+02 + 1.0866809841834973E+02 1.0844504179794946E+02 1.0822265005651219E+02 1.0800092004570254E+02 1.0777984863761181E+02 + 1.0755943272459398E+02 1.0733966921910127E+02 1.0712055505352302E+02 1.0690208718002552E+02 1.0668426257039285E+02 + 1.0646707821587040E+02 1.0625053112700830E+02 1.0603461833350889E+02 1.0581933688407183E+02 1.0560468384624500E+02 + 1.0539065630627303E+02 1.0517725136894965E+02 1.0496446615747159E+02 1.0475229781329152E+02 1.0454074349597454E+02 + 1.0432980038305554E+02 1.0411946566989778E+02 1.0390973656955165E+02 1.0370061031261794E+02 1.0349208414710799E+02 + 1.0328415533830943E+02 1.0307682116864987E+02 1.0287007893756392E+02 1.0266392596136028E+02 1.0245835957309109E+02 + 1.0225337712242151E+02 1.0204897597550075E+02 1.0184515351483550E+02 1.0164190713916233E+02 1.0143923426332287E+02 + 1.0123713231813950E+02 1.0103559875029391E+02 1.0083463102220243E+02 1.0063422661189867E+02 1.0043438301291056E+02 + 1.0023509773414482E+02 1.0003636829976806E+02 9.9838192249089971E+01 9.9640567136449562E+01 9.9443490531099712E+01 + 9.9246960017094636E+01 9.9050973193177541E+01 9.8855527672668941E+01 9.8660621083357583E+01 9.8466251067390587E+01 + 9.8272415281164996E+01 9.8079111395222256E+01 9.7886337094139591E+01 9.7694090076426491E+01 9.7502368054419591E+01 + 9.7311168754179619E+01 9.7120489915389356E+01 9.6930329291250729E+01 9.6740684648385979E+01 9.6551553766735921E+01 + 9.6362934439463260E+01 9.6174824472852379E+01 9.5987221686214426E+01 9.5800123911788887E+01 9.5613528994650096E+01 + 9.5427434792611663E+01 9.5241839176132842E+01 9.5056740028225335E+01 9.4872135244362113E+01 9.4688022732385434E+01 + 9.4504400412416672E+01 9.4321266216766062E+01 9.4138618089844698E+01 9.3956453988075495E+01 9.3774771879806806E+01 + 9.3593569745224855E+01 9.3412845576268097E+01 9.3232597376542657E+01 9.3052823161237825E+01 9.2873520957041521E+01 + 9.2694688802058920E+01 9.2516324745728198E+01 9.2338426848741662E+01 9.2160993182962130E+01 9.1984021831345373E+01 + 9.1807510887858385E+01 9.1631458457402715E+01 9.1455862655735046E+01 9.1280721609390440E+01 9.1106033455605370E+01 + 9.0931796342241228E+01 9.0758008427709697E+01 9.0584667880897470E+01 9.0411772881091977E+01 9.0239321617908686E+01 + 9.0067312291216950E+01 8.9895743111068356E+01 8.9724612297625086E+01 8.9553918081088540E+01 8.9383658701629457E+01 + 8.9213832409317234E+01 8.9044437464050731E+01 8.8875472135490497E+01 8.8706934702988889E+01 8.8538823455524579E+01 + 8.8371136691633353E+01 8.8203872719343366E+01 8.8037029856108305E+01 8.7870606428742590E+01 8.7704600773355594E+01 + 8.7539011235288470E+01 8.7373836169049724E+01 8.7209073938252232E+01 8.7044722915550381E+01 8.6880781482577902E+01 + 8.6717248029886420E+01 8.6554120956883651E+01 8.6391398671773558E+01 8.6229079591495278E+01 8.6067162141664554E+01 + 8.5905644756513468E+01 8.5744525878831709E+01 8.5583803959909829E+01 8.5423477459479429E+01 8.5263544845656767E+01 + 8.5104004594887115E+01 8.4944855191885637E+01 8.4786095129584453E+01 8.4627722909075217E+01 8.4469737039554275E+01 + 8.4312136038269003E+01 8.4154918430463070E+01 8.3998082749322705E+01 8.3841627535923564E+01 8.3685551339177707E+01 + 8.3529852715781360E+01 8.3374530230162989E+01 8.3219582454431375E+01 8.3065007968324593E+01 8.2910805359159596E+01 + 8.2756973221781038E+01 8.2603510158511980E+01 8.2450414779104648E+01 8.2297685700689897E+01 8.2145321547729409E+01 + 8.1993320951967746E+01 8.1841682552382778E+01 8.1690404995139971E+01 8.1539486933543060E+01 8.1388927027988871E+01 + 8.1238723945920029E+01 8.1088876361778404E+01 8.0939382956960216E+01 8.0790242419769910E+01 8.0641453445375504E+01 + 8.0493014735763282E+01 8.0344924999693845E+01 8.0197182952658068E+01 8.0049787316833090E+01 7.9902736821039099E+01 + 7.9756030200696458E+01 7.9609666197782772E+01 7.9463643560790530E+01 7.9317961044684992E+01 7.9172617410863097E+01 + 7.9027611427111154E+01 7.8882941867563943E+01 7.8738607512664913E+01 7.8594607149124130E+01 7.8450939569879750E+01 + 7.8307603574056699E+01 7.8164597966928255E+01 7.8021921559876375E+01 7.7879573170352941E+01 7.7737551621840254E+01 + 7.7595855743814212E+01 7.7454484371705149E+01 7.7313436346860172E+01 7.7172710516506157E+01 7.7032305733712050E+01 + 7.6892220857352271E+01 7.6752454752069809E+01 7.6613006288240271E+01 7.6473874341935343E+01 7.6335057794887007E+01 + 7.6196555534452585E+01 7.6058366453578756E+01 7.5920489450766368E+01 7.5782923430037130E+01 7.5645667300896903E+01 + 7.5508719978303660E+01 7.5372080382631609E+01 7.5235747439638885E+01 7.5099720080433670E+01 7.4963997241439898E+01 + 7.4828577864366068E+01 7.4693460896171146E+01 7.4558645289032810E+01 7.4424130000314321E+01 7.4289913992533627E+01 + 7.4155996233330626E+01 7.4022375695436239E+01 7.3889051356640408E+01 7.3756022199762256E+01 7.3623287212617484E+01 + 7.3490845387989140E+01 7.3358695723596512E+01 7.3226837222064745E+01 7.3095268890896222E+01 7.2963989742438670E+01 + 7.2832998793857712E+01 7.2702295067105879E+01 7.2571877588894750E+01 7.2441745390664892E+01 7.2311897508558545E+01 + 7.2182332983389557E+01 7.2053050860616580E+01 7.1924050190313878E+01 7.1795330027144360E+01 7.1666889430330869E+01 + 7.1538727463629684E+01 7.1410843195302760E+01 7.1283235698090806E+01 7.1155904049186134E+01 7.1028847330206190E+01 + 7.0902064627167007E+01 7.0775555030457227E+01 7.0649317634811098E+01 7.0523351539283439E+01 7.0397655847223135E+01 + 7.0272229666248492E+01 7.0147072108220769E+01 7.0022182289219558E+01 6.9897559329517932E+01 6.9773202353557352E+01 + 6.9649110489922364E+01 6.9525282871317387E+01 6.9401718634541169E+01 6.9278416920463329E+01 6.9155376874000140E+01 + 6.9032597644090714E+01 6.8910078383673479E+01 6.8787818249662010E+01 6.8665816402922800E+01 6.8544072008251291E+01 + 6.8422584234349088E+01 6.8301352253801070E+01 6.8180375243053092E+01 6.8059652382388691E+01 6.7939182855907418E+01 + 6.7818965851501957E+01 6.7699000560837135E+01 6.7579286179326743E+01 6.7459821906112339E+01 6.7340606944042179E+01 + 6.7221640499648686E+01 6.7102921783128068E+01 6.6984450008318362E+01 6.6866224392679186E+01 6.6748244157270676E+01 + 6.6630508526731802E+01 6.6513016729261224E+01 6.6395767996595964E+01 6.6278761563991338E+01 6.6161996670200665E+01 + 6.6045472557455412E+01 6.5929188471445116E+01 6.5813143661297772E+01 6.5697337379560011E+01 6.5581768882177869E+01 + 6.5466437428477249E+01 6.5351342281144511E+01 6.5236482706208136E+01 6.5121857973018720E+01 6.5007467354230570E+01 + 6.4893310125783401E+01 6.4779385566883093E+01 6.4665692959983787E+01 6.4552231590768685E+01 6.4439000748133054E+01 + 6.4325999724165328E+01 6.4213227814128885E+01 6.4100684316445069E+01 6.3988368532674805E+01 6.3876279767501039E+01 + 6.3764417328711758E+01 6.3652780527181491E+01 6.3541368676855406E+01 6.3430181094731054E+01 6.3319217100842302E+01 + 6.3208476018241477E+01 6.3097957172983079E+01 6.2987659894106791E+01 6.2877583513621225E+01 6.2767727366487456E+01 + 6.2658090790601968E+01 6.2548673126781196E+01 6.2439473718745205E+01 6.2330491913101021E+01 6.2221727059327684E+01 + 6.2113178509759223E+01 6.2004845619570105E+01 6.1896727746759026E+01 6.1788824252132926E+01 6.1681134499292469E+01 + 6.1573657854616116E+01 6.1466393687245095E+01 6.1359341369068396E+01 6.1252500274707067E+01 6.1145869781500089E+01 + 6.1039449269489182E+01 6.0933238121404344E+01 6.0827235722648716E+01 6.0721441461284115E+01 6.0615854728017027E+01 + 6.0510474916183547E+01 6.0405301421736183E+01 6.0300333643228477E+01 6.0195570981801154E+01 6.0091012841169302E+01 + 5.9986658627606651E+01 5.9882507749933268E+01 5.9778559619500783E+01 5.9674813650179409E+01 5.9571269258344387E+01 + 5.9467925862861676E+01 5.9364782885075634E+01 5.9261839748795090E+01 5.9159095880280354E+01 5.9056550708230056E+01 + 5.8954203663767970E+01 5.8852054180430244E+01 5.8750101694152328E+01 5.8648345643256306E+01 5.8546785468438244E+01 + 5.8445420612755186E+01 5.8344250521613020E+01 5.8243274642753974E+01 5.8142492426243827E+01 5.8041903324459838E+01 + 5.7941506792078705E+01 5.7841302286063943E+01 5.7741289265654281E+01 5.7641467192350902E+01 5.7541835529906677E+01 + 5.7442393744313037E+01 5.7343141303788912E+01 5.7244077678769088E+01 5.7145202341892052E+01 5.7046514767988924E+01 + 5.6948014434071254E+01 5.6849700819320560E+01 5.6751573405076272E+01 5.6653631674824609E+01 5.6555875114187373E+01 + 5.6458303210910771E+01 5.6360915454854791E+01 5.6263711337981135E+01 5.6166690354343388E+01 5.6069852000075215E+01 + 5.5973195773380617E+01 5.5876721174522103E+01 5.5780427705810439E+01 5.5684314871594552E+01 5.5588382178249887E+01 + 5.5492629134168986E+01 5.5397055249750743E+01 5.5301660037389325E+01 5.5206443011465012E+01 5.5111403688333453E+01 + 5.5016541586315029E+01 5.4921856225685779E+01 5.4827347128666361E+01 5.4733013819412839E+01 5.4638855824006207E+01 + 5.4544872670442800E+01 5.4451063888624496E+01 5.4357429010348753E+01 5.4263967569299155E+01 5.4170679101036015E+01 + 5.4077563142986179E+01 5.3984619234433723E+01 5.3891846916511184E+01 5.3799245732189199E+01 5.3706815226267480E+01 + 5.3614554945366052E+01 5.3522464437915232E+01 5.3430543254147025E+01 5.3338790946085936E+01 5.3247207067539357E+01 + 5.3155791174089451E+01 5.3064542823083563E+01 5.2973461573625599E+01 5.2882546986566652E+01 5.2791798624497233E+01 + 5.2701216051737511E+01 5.2610798834329302E+01 5.2520546540026913E+01 5.2430458738289104E+01 5.2340535000269838E+01 + 5.2250774898810782E+01 5.2161178008431875E+01 5.2071743905323501E+01 5.1982472167337974E+01 5.1893362373981454E+01 + 5.1804414106405204E+01 5.1715626947398341E+01 5.1627000481378460E+01 5.1538534294384704E+01 5.1450227974068724E+01 + 5.1362081109687551E+01 5.1274093292095117E+01 5.1186264113734282E+01 5.1098593168629527E+01 5.1011080052378375E+01 + 5.0923724362144355E+01 5.0836525696648863E+01 5.0749483656163534E+01 5.0662597842502599E+01 5.0575867859015496E+01 + 5.0489293310578972E+01 5.0402873803589969E+01 5.0316608945957924E+01 5.0230498347097246E+01 5.0144541617920417E+01 + 5.0058738370830135E+01 4.9973088219712160E+01 4.9887590779928594E+01 4.9802245668309666E+01 4.9717052503147684E+01 + 4.9632010904188782E+01 4.9547120492626973E+01 4.9462380891096480E+01 4.9377791723664373E+01 4.9293352615824645E+01 + 4.9209063194490390E+01 4.9124923087987497E+01 4.9040931926047051E+01 4.8957089339799566E+01 4.8873394961767538E+01 + 4.8789848425858807E+01 4.8706449367359902E+01 4.8623197422929735E+01 4.8540092230592457E+01 4.8457133429731066E+01 + 4.8374320661081121E+01 4.8291653566723795E+01 4.8209131790080122E+01 4.8126754975903523E+01 4.8044522770274675E+01 + 4.7962434820593884E+01 4.7880490775575950E+01 4.7798690285242827E+01 4.7717033000918349E+01 4.7635518575220985E+01 + 4.7554146662058812E+01 4.7472916916622388E+01 4.7391828995379321E+01 4.7310882556067853E+01 4.7230077257690574E+01 + 4.7149412760509144E+01 4.7068888726037777E+01 4.6988504817037388E+01 4.6908260697509810E+01 4.6828156032691943E+01 + 4.6748190489049684E+01 4.6668363734272283E+01 4.6588675437266495E+01 4.6509125268151244E+01 4.6429712898251218E+01 + 4.6350438000091437E+01 4.6271300247392205E+01 4.6192299315062499E+01 4.6113434879195260E+01 4.6034706617061119E+01 + 4.5956114207103496E+01 4.5877657328932891E+01 4.5799335663320960E+01 4.5721148892195842E+01 4.5643096698636327E+01 + 4.5565178766866453E+01 4.5487394782250504E+01 4.5409744431287201E+01 4.5332227401604740E+01 4.5254843381955617E+01 + 4.5177592062211097E+01 4.5100473133356267E+01 4.5023486287484758E+01 4.4946631217793467E+01 4.4869907618578026E+01 + 4.4793315185226824E+01 4.4716853614216532E+01 4.4640522603107264E+01 4.4564321850536771E+01 4.4488251056216406E+01 + 4.4412309920925360E+01 4.4336498146506479E+01 4.4260815435860621E+01 4.4185261492942359E+01 4.4109836022754997E+01 + 4.4034538731345719E+01 4.3959369325800452E+01 4.3884327514239743E+01 4.3809413005813681E+01 4.3734625510697079E+01 + 4.3659964740085073E+01 4.3585430406188081E+01 4.3511022222227602E+01 4.3436739902431114E+01 4.3362583162028166E+01 + 4.3288551717245113E+01 4.3214645285300733E+01 4.3140863584402254E+01 4.3067206333740124E+01 4.2993673253483919E+01 + 4.2920264064778117E+01 4.2846978489736941E+01 4.2773816251441019E+01 4.2700777073931810E+01 4.2627860682208379E+01 + 4.2555066802222314E+01 4.2482395160873899E+01 4.2409845486007164E+01 4.2337417506406467E+01 4.2265110951791797E+01 + 4.2192925552814508E+01 4.2120861041053395E+01 4.2048917149010215E+01 4.1977093610105811E+01 4.1905390158675864E+01 + 4.1833806529966687E+01 4.1762342460131521E+01 4.1690997686225991E+01 4.1619771946204359E+01 4.1548664978915355E+01 + 4.1477676524098435E+01 4.1406806322379424E+01 4.1336054115267096E+01 4.1265419645148434E+01 4.1194902655285581E+01 + 4.1124502889811559E+01 4.1054220093726073E+01 4.0984054012892294E+01 4.0914004394032702E+01 4.0844070984725022E+01 + 4.0774253533398912E+01 4.0704551789331994E+01 4.0634965502645997E+01 4.0565494424303125E+01 4.0496138306102338E+01 + 4.0426896900675622E+01 4.0357769961484195E+01 4.0288757242815414E+01 4.0219858499778262E+01 4.0151073488300341E+01 + 4.0082401965124028E+01 4.0013843687803259E+01 3.9945398414699220E+01 3.9877065904977670E+01 3.9808845918604661E+01 + 3.9740738216343694E+01 3.9672742559751605E+01 3.9604858711175567E+01 3.9537086433749451E+01 3.9469425491390218E+01 + 3.9401875648794885E+01 3.9334436671436777E+01 3.9267108325562340E+01 3.9199890378187682E+01 3.9132782597095208E+01 + 3.9065784750830396E+01 3.8998896608698324E+01 3.8932117940760548E+01 3.8865448517831588E+01 3.8798888111475918E+01 + 3.8732436494004453E+01 3.8666093438471776E+01 3.8599858718672174E+01 3.8533732109137041E+01 3.8467713385131788E+01 + 3.8401802322651839E+01 3.8335998698420582E+01 3.8270302289885315E+01 3.8204712875214781E+01 3.8139230233295514E+01 + 3.8073854143729150E+01 3.8008584386829320E+01 3.7943420743618340E+01 3.7878362995824368E+01 3.7813410925878273E+01 + 3.7748564316910731E+01 3.7683822952749274E+01 3.7619186617915013E+01 3.7554655097619957E+01 3.7490228177763875E+01 + 3.7425905644931703E+01 3.7361687286390065E+01 3.7297572890084844E+01 3.7233562244637930E+01 3.7169655139344805E+01 + 3.7105851364171158E+01 3.7042150709750167E+01 3.6978552967380203E+01 3.6915057929020989E+01 3.6851665387291817E+01 + 3.6788375135468215E+01 3.6725186967478990E+01 3.6662100677903958E+01 3.6599116061970911E+01 3.6536232915553001E+01 + 3.6473451035165681E+01 3.6410770217964426E+01 3.6348190261741799E+01 3.6285710964924874E+01 3.6223332126572458E+01 + 3.6161053546372472E+01 3.6098875024639135E+01 3.6036796362310930E+01 3.5974817360947142E+01 3.5912937822725866E+01 + 3.5851157550440995E+01 3.5789476347500198E+01 3.5727894017921670E+01 3.5666410366332109E+01 3.5605025197963862E+01 + 3.5543738318652508E+01 3.5482549534834291E+01 3.5421458653543880E+01 3.5360465482411129E+01 3.5299569829659646E+01 + 3.5238771504103489E+01 3.5178070315145085E+01 3.5117466072772665E+01 3.5056958587557816E+01 3.4996547670653207E+01 + 3.4936233133789898E+01 3.4876014789275246E+01 3.4815892449990329E+01 3.4755865929387589E+01 3.4695935041488568E+01 + 3.4636099600881387E+01 3.4576359422718483E+01 3.4516714322714499E+01 3.4457164117143400E+01 3.4397708622836923E+01 + 3.4338347657181515E+01 3.4279081038116523E+01 3.4219908584131858E+01 3.4160830114265735E+01 3.4101845448102104E+01 + 3.4042954405768803E+01 3.3984156807935321E+01 3.3925452475810104E+01 3.3866841231138849E+01 3.3808322896202249E+01 + 3.3749897293813397E+01 3.3691564247316172E+01 3.3633323580582569E+01 3.3575175118010826E+01 3.3517118684523261E+01 + 3.3459154105563883E+01 3.3401281207096801E+01 3.3343499815603401E+01 3.3285809758080823E+01 3.3228210862039482E+01 + 3.3170702955501298E+01 3.3113285866997266E+01 3.3055959425565796E+01 3.2998723460750128E+01 3.2941577802597017E+01 + 3.2884522281653751E+01 3.2827556728967068E+01 3.2770680976080506E+01 3.2713894855032514E+01 3.2657198198354692E+01 + 3.2600590839069532E+01 3.2544072610688559E+01 3.2487643347210316E+01 3.2431302883118470E+01 3.2375051053379764E+01 + 3.2318887693442065E+01 3.2262812639232514E+01 3.2206825727155639E+01 3.2150926794091170E+01 3.2095115677392535E+01 + 3.2039392214884636E+01 3.1983756244861890E+01 3.1928207606086925E+01 3.1872746137787875E+01 3.1817371679657324E+01 + 3.1762084071849639E+01 3.1706883154980002E+01 3.1651768770121677E+01 3.1596740758804984E+01 3.1541798963014891E+01 + 3.1486943225189634E+01 3.1432173388218356E+01 3.1377489295439965E+01 3.1322890790640930E+01 3.1268377718053596E+01 + 3.1213949922354438E+01 3.1159607248662219E+01 3.1105349542536427E+01 3.1051176649975275E+01 3.0997088417414037E+01 + 3.0943084691723595E+01 3.0889165320208306E+01 3.0835330150604349E+01 3.0781579031078493E+01 3.0727911810225716E+01 + 3.0674328337067877E+01 3.0620828461052167E+01 3.0567412032049031E+01 3.0514078900350835E+01 3.0460828916670241E+01 + 3.0407661932138041E+01 3.0354577798302181E+01 3.0301576367125723E+01 3.0248657490985259E+01 3.0195821022669509E+01 + 3.0143066815377217E+01 3.0090394722716134E+01 3.0037804598701044E+01 2.9985296297752203E+01 2.9932869674694064E+01 + 2.9880524584753154E+01 2.9828260883556943E+01 2.9776078427132081E+01 2.9723977071902908E+01 2.9671956674690009E+01 + 2.9620017092708295E+01 2.9568158183566027E+01 2.9516379805262613E+01 2.9464681816187902E+01 2.9413064075119781E+01 + 2.9361526441223443E+01 2.9310068774049242E+01 2.9258690933531724E+01 2.9207392779987916E+01 2.9156174174115755E+01 + 2.9105034976992606E+01 2.9053975050074083E+01 2.9002994255192306E+01 2.8952092454554499E+01 2.8901269510741660E+01 + 2.8850525286706940E+01 2.8799859645774330E+01 2.8749272451637147E+01 2.8698763568356853E+01 2.8648332860361290E+01 + 2.8597980192443309E+01 2.8547705429759862E+01 2.8497508437829840E+01 2.8447389082533235E+01 2.8397347230109688E+01 + 2.8347382747156779E+01 2.8297495500629072E+01 2.8247685357836616E+01 2.8197952186443224E+01 2.8148295854465747E+01 + 2.8098716230272331E+01 2.8049213182580942E+01 2.7999786580458473E+01 2.7950436293319097E+01 2.7901162190922992E+01 + 2.7851964143375142E+01 2.7802842021123780E+01 2.7753795694959393E+01 2.7704825036013190E+01 2.7655929915755745E+01 + 2.7607110205996182E+01 2.7558365778880219E+01 2.7509696506889298E+01 2.7461102262839432E+01 2.7412582919879508E+01 + 2.7364138351490254E+01 2.7315768431483182E+01 2.7267473033998957E+01 2.7219252033506432E+01 2.7171105304801372E+01 + 2.7123032723004947E+01 2.7075034163562904E+01 2.7027109502244130E+01 2.6979258615139397E+01 2.6931481378660358E+01 + 2.6883777669537963E+01 2.6836147364821702E+01 2.6788590341878070E+01 2.6741106478389504E+01 2.6693695652353412E+01 + 2.6646357742080490E+01 2.6599092626193993E+01 2.6551900183628348E+01 2.6504780293627984E+01 2.6457732835746466E+01 + 2.6410757689844864E+01 2.6363854736090854E+01 2.6317023854957768E+01 2.6270264927223028E+01 2.6223577833967358E+01 + 2.6176962456573573E+01 2.6130418676725167E+01 2.6083946376405727E+01 2.6037545437897393E+01 2.5991215743779794E+01 + 2.5944957176929179E+01 2.5898769620517069E+01 2.5852652958009301E+01 2.5806607073164891E+01 2.5760631850034894E+01 + 2.5714727172961425E+01 2.5668892926576508E+01 2.5623128995801061E+01 2.5577435265843683E+01 2.5531811622199903E+01 + 2.5486257950650756E+01 2.5440774137261837E+01 2.5395360068382534E+01 2.5350015630644553E+01 2.5304740710961180E+01 + 2.5259535196526059E+01 2.5214398974812369E+01 2.5169331933571481E+01 2.5124333960832328E+01 2.5079404944900087E+01 + 2.5034544774355222E+01 2.4989753338052545E+01 2.4945030525120249E+01 2.4900376224958766E+01 2.4855790327239799E+01 + 2.4811272721905492E+01 2.4766823299167193E+01 2.4722441949504713E+01 2.4678128563665108E+01 2.4633883032661924E+01 + 2.4589705247774017E+01 2.4545595100544858E+01 2.4501552482781285E+01 2.4457577286552628E+01 2.4413669404189953E+01 + 2.4369828728284780E+01 2.4326055151688422E+01 2.4282348567510802E+01 2.4238708869119794E+01 2.4195135950139935E+01 + 2.4151629704451903E+01 2.4108190026191238E+01 2.4064816809747544E+01 2.4021509949763658E+01 2.3978269341134602E+01 + 2.3935094879006801E+01 2.3891986458776987E+01 2.3848943976091547E+01 2.3805967326845352E+01 2.3763056407181093E+01 + 2.3720211113488247E+01 2.3677431342402194E+01 2.3634716990803494E+01 2.3592067955816752E+01 2.3549484134809976E+01 + 2.3506965425393428E+01 2.3464511725419172E+01 2.3422122932979690E+01 2.3379798946407618E+01 2.3337539664274178E+01 + 2.3295344985388937E+01 2.3253214808798791E+01 2.3211149033786775E+01 2.3169147559871668E+01 2.3127210286806992E+01 + 2.3085337114580163E+01 2.3043527943411458E+01 2.3001782673753567E+01 2.2960101206290503E+01 2.2918483441936903E+01 + 2.2876929281837089E+01 2.2835438627364294E+01 2.2794011380120022E+01 2.2752647441932922E+01 2.2711346714858212E+01 + 2.2670109101176749E+01 2.2628934503394440E+01 2.2587822824241137E+01 2.2546773966670045E+01 2.2505787833856978E+01 + 2.2464864329199326E+01 2.2424003356315556E+01 2.2383204819044273E+01 2.2342468621443444E+01 2.2301794667789650E+01 + 2.2261182862577424E+01 2.2220633110518214E+01 2.2180145316539871E+01 2.2139719385785828E+01 2.2099355223614300E+01 + 2.2059052735597472E+01 2.2018811827520985E+01 2.1978632405382825E+01 2.1938514375392913E+01 2.1898457643972126E+01 + 2.1858462117751820E+01 2.1818527703572787E+01 2.1778654308484679E+01 2.1738841839745252E+01 2.1699090204819807E+01 + 2.1659399311380078E+01 2.1619769067303988E+01 2.1580199380674433E+01 2.1540690159779107E+01 2.1501241313109166E+01 + 2.1461852749359156E+01 2.1422524377425862E+01 2.1383256106407845E+01 2.1344047845604461E+01 2.1304899504515557E+01 + 2.1265810992840411E+01 2.1226782220477357E+01 2.1187813097522774E+01 2.1148903534270648E+01 2.1110053441211814E+01 + 2.1071262729033222E+01 2.1032531308617266E+01 2.0993859091041305E+01 2.0955245987576646E+01 2.0916691909688161E+01 + 2.0878196769033419E+01 2.0839760477462288E+01 2.0801382947015931E+01 2.0763064089926473E+01 2.0724803818616017E+01 + 2.0686602045696329E+01 2.0648458683968034E+01 2.0610373646419774E+01 2.0572346846227905E+01 2.0534378196755682E+01 + 2.0496467611552649E+01 2.0458615004353870E+01 2.0420820289079536E+01 2.0383083379834140E+01 2.0345404190905963E+01 + 2.0307782636766397E+01 2.0270218632069255E+01 2.0232712091650246E+01 2.0195262930526425E+01 2.0157871063895346E+01 + 2.0120536407134630E+01 2.0083258875801242E+01 2.0046038385631121E+01 2.0008874852538113E+01 1.9971768192613951E+01 + 1.9934718322127054E+01 1.9897725157522498E+01 1.9860788615420866E+01 1.9823908612618119E+01 1.9787085066084842E+01 + 1.9750317892965416E+01 1.9713607010577789E+01 1.9676952336412779E+01 1.9640353788133300E+01 1.9603811283574089E+01 + 1.9567324740740879E+01 1.9530894077809929E+01 1.9494519213127454E+01 1.9458200065209017E+01 1.9421936552739030E+01 + 1.9385728594569990E+01 1.9349576109722303E+01 1.9313479017383298E+01 1.9277437236906824E+01 1.9241450687812904E+01 + 1.9205519289786821E+01 1.9169642962678740E+01 1.9133821626503316E+01 1.9098055201438751E+01 1.9062343607826669E+01 + 1.9026686766171338E+01 1.8991084597139064E+01 1.8955537021557845E+01 1.8920043960416788E+01 1.8884605334865434E+01 + 1.8849221066213378E+01 1.8813891075929671E+01 1.8778615285642317E+01 1.8743393617137670E+01 1.8708225992359996E+01 + 1.8673112333410970E+01 1.8638052562549042E+01 1.8603046602188993E+01 1.8568094374901399E+01 1.8533195803412223E+01 + 1.8498350810602087E+01 1.8463559319505830E+01 1.8428821253312297E+01 1.8394136535363270E+01 1.8359505089153526E+01 + 1.8324926838329894E+01 1.8290401706691100E+01 1.8255929618187050E+01 1.8221510496918327E+01 1.8187144267135892E+01 + 1.8152830853240360E+01 1.8118570179781671E+01 1.8084362171458519E+01 1.8050206753117944E+01 1.8016103849754717E+01 + 1.7982053386510955E+01 1.7948055288675636E+01 1.7914109481684132E+01 1.7880215891117579E+01 1.7846374442702619E+01 + 1.7812585062310927E+01 1.7778847675958453E+01 1.7745162209805176E+01 1.7711528590154746E+01 1.7677946743453720E+01 + 1.7644416596291364E+01 1.7610938075398963E+01 1.7577511107649620E+01 1.7544135620057478E+01 1.7510811539777599E+01 + 1.7477538794105250E+01 1.7444317310475650E+01 1.7411147016463236E+01 1.7378027839781542E+01 1.7344959708282587E+01 + 1.7311942549956413E+01 1.7278976292930661E+01 1.7246060865470177E+01 1.7213196195976487E+01 1.7180382212987372E+01 + 1.7147618845176616E+01 1.7114906021353285E+01 1.7082243670461427E+01 1.7049631721579608E+01 1.7017070103920691E+01 + 1.6984558746830935E+01 1.6952097579790166E+01 1.6919686532410786E+01 1.6887325534437785E+01 1.6855014515747982E+01 + 1.6822753406349896E+01 1.6790542136383173E+01 1.6758380636118094E+01 1.6726268835955310E+01 1.6694206666425412E+01 + 1.6662194058188433E+01 1.6630230942033464E+01 1.6598317248878299E+01 1.6566452909768998E+01 1.6534637855879410E+01 + 1.6502872018510882E+01 1.6471155329091797E+01 1.6439487719177151E+01 1.6407869120448240E+01 1.6376299464712197E+01 + 1.6344778683901495E+01 1.6313306710073817E+01 1.6281883475411384E+01 1.6250508912220774E+01 1.6219182952932332E+01 + 1.6187905530100043E+01 1.6156676576400809E+01 1.6125496024634359E+01 1.6094363807722786E+01 1.6063279858710008E+01 + 1.6032244110761578E+01 1.6001256497164242E+01 1.5970316951325524E+01 1.5939425406773395E+01 1.5908581797155847E+01 + 1.5877786056240598E+01 1.5847038117914614E+01 1.5816337916183844E+01 1.5785685385172780E+01 1.5755080459124050E+01 + 1.5724523072398272E+01 1.5694013159473373E+01 1.5663550654944395E+01 1.5633135493523220E+01 1.5602767610037978E+01 + 1.5572446939432924E+01 1.5542173416767833E+01 1.5511946977217955E+01 1.5481767556073292E+01 1.5451635088738582E+01 + 1.5421549510732731E+01 1.5391510757688597E+01 1.5361518765352415E+01 1.5331573469583773E+01 1.5301674806354999E+01 + 1.5271822711750946E+01 1.5242017121968599E+01 1.5212257973316756E+01 1.5182545202215676E+01 1.5152878745196658E+01 + 1.5123258538901963E+01 1.5093684520084114E+01 1.5064156625605785E+01 1.5034674792439411E+01 1.5005238957666958E+01 + 1.4975849058479350E+01 1.4946505032176381E+01 1.4917206816166162E+01 1.4887954347965103E+01 1.4858747565197177E+01 + 1.4829586405593965E+01 1.4800470806994138E+01 1.4771400707343087E+01 1.4742376044692799E+01 1.4713396757201339E+01 + 1.4684462783132663E+01 1.4655574060856217E+01 1.4626730528846627E+01 1.4597932125683439E+01 1.4569178790050724E+01 + 1.4540470460736847E+01 1.4511807076634108E+01 1.4483188576738399E+01 1.4454614900148901E+01 1.4426085986067928E+01 + 1.4397601773800394E+01 1.4369162202753566E+01 1.4340767212436921E+01 1.4312416742461552E+01 1.4284110732540238E+01 + 1.4255849122486705E+01 1.4227631852215669E+01 1.4199458861742494E+01 1.4171330091182602E+01 1.4143245480751570E+01 + 1.4115204970764591E+01 1.4087208501636226E+01 1.4059256013880171E+01 1.4031347448108813E+01 1.4003482745033134E+01 + 1.3975661845462261E+01 1.3947884690303354E+01 1.3920151220561063E+01 1.3892461377337435E+01 1.3864815101831596E+01 + 1.3837212335339387E+01 1.3809653019253203E+01 1.3782137095061582E+01 1.3754664504348959E+01 1.3727235188795513E+01 + 1.3699849090176658E+01 1.3672506150362983E+01 1.3645206311319784E+01 1.3617949515106924E+01 1.3590735703878577E+01 + 1.3563564819882746E+01 1.3536436805461229E+01 1.3509351603049229E+01 1.3482309155175095E+01 1.3455309404460051E+01 + 1.3428352293617939E+01 1.3401437765454954E+01 1.3374565762869322E+01 1.3347736228851122E+01 1.3320949106481937E+01 + 1.3294204338934650E+01 1.3267501869473175E+01 1.3240841641452093E+01 1.3214223598316615E+01 1.3187647683602005E+01 + 1.3161113840933677E+01 1.3134622014026611E+01 1.3108172146685261E+01 1.3081764182803333E+01 1.3055398066363459E+01 + 1.3029073741436896E+01 1.3002791152183372E+01 1.2976550242850816E+01 1.2950350957775017E+01 1.2924193241379488E+01 + 1.2898077038175149E+01 1.2872002292760072E+01 1.2845968949819309E+01 1.2819976954124526E+01 1.2794026250533880E+01 + 1.2768116783991655E+01 1.2742248499528122E+01 1.2716421342259189E+01 1.2690635257386340E+01 1.2664890190196163E+01 + 1.2639186086060224E+01 1.2613522890434908E+01 1.2587900548860970E+01 1.2562319006963577E+01 1.2536778210451736E+01 + 1.2511278105118393E+01 1.2485818636839914E+01 1.2460399751576080E+01 1.2435021395369729E+01 1.2409683514346476E+01 + 1.2384386054714607E+01 1.2359128962764791E+01 1.2333912184869860E+01 1.2308735667484521E+01 1.2283599357145242E+01 + 1.2258503200469908E+01 1.2233447144157662E+01 1.2208431134988658E+01 1.2183455119823853E+01 1.2158519045604772E+01 + 1.2133622859353213E+01 1.2108766508171257E+01 1.2083949939240698E+01 1.2059173099823120E+01 1.2034435937259566E+01 + 1.2009738398970239E+01 1.1985080432454472E+01 1.1960461985290282E+01 1.1935883005134370E+01 1.1911343439721801E+01 + 1.1886843236865705E+01 1.1862382344457254E+01 1.1837960710465296E+01 1.1813578282936257E+01 1.1789235009993760E+01 + 1.1764930839838632E+01 1.1740665720748485E+01 1.1716439601077694E+01 1.1692252429257040E+01 1.1668104153793584E+01 + 1.1643994723270435E+01 1.1619924086346535E+01 1.1595892191756457E+01 1.1571898988310261E+01 1.1547944424893169E+01 + 1.1524028450465488E+01 1.1500151014062292E+01 1.1476312064793301E+01 1.1452511551842681E+01 1.1428749424468815E+01 + 1.1405025632004053E+01 1.1381340123854619E+01 1.1357692849500401E+01 1.1334083758494598E+01 1.1310512800463732E+01 + 1.1286979925107339E+01 1.1263485082197784E+01 1.1240028221580106E+01 1.1216609293171784E+01 1.1193228246962541E+01 + 1.1169885033014191E+01 1.1146579601460390E+01 1.1123311902506520E+01 1.1100081886429473E+01 1.1076889503577396E+01 + 1.1053734704369573E+01 1.1030617439296263E+01 1.1007537658918421E+01 1.0984495313867523E+01 1.0961490354845552E+01 + 1.0938522732624508E+01 1.0915592398046533E+01 1.0892699302023534E+01 1.0869843395537005E+01 1.0847024629638005E+01 + 1.0824242955446776E+01 1.0801498324152675E+01 1.0778790687014016E+01 1.0756119995357759E+01 1.0733486200579463E+01 + 1.0710889254143078E+01 1.0688329107580742E+01 1.0665805712492631E+01 1.0643319020546702E+01 1.0620868983478642E+01 + 1.0598455553091611E+01 1.0576078681256057E+01 1.0553738319909684E+01 1.0531434421057023E+01 1.0509166936769525E+01 + 1.0486935819185181E+01 1.0464741020508534E+01 1.0442582493010308E+01 1.0420460189027464E+01 1.0398374060962803E+01 + 1.0376324061284965E+01 1.0354310142528194E+01 1.0332332257292240E+01 1.0310390358241971E+01 1.0288484398107533E+01 + 1.0266614329683939E+01 1.0244780105831026E+01 1.0222981679473223E+01 1.0201219003599407E+01 1.0179492031262754E+01 + 1.0157800715580631E+01 1.0136145009734296E+01 1.0114524866968846E+01 1.0092940240593000E+01 1.0071391083979053E+01 + 1.0049877350562484E+01 1.0028398993842098E+01 1.0006955967379589E+01 9.9855482247996079E+00 9.9641757197893899E+00 + 9.9428384060988240E+00 9.9215362375400797E+00 9.9002691679876573E+00 9.8790371513780766E+00 9.8578401417097972E+00 + 9.8366780930430551E+00 9.8155509594996460E+00 9.7944586952628896E+00 9.7734012545774291E+00 9.7523785917489807E+00 + 9.7313906611444025E+00 9.7104374171913026E+00 9.6895188143780473E+00 9.6686348072535626E+00 9.6477853504271387E+00 + 9.6269703985684441E+00 9.6061899064071632E+00 9.5854438287329646E+00 9.5647321203954192E+00 9.5440547363036625E+00 + 9.5234116314264909E+00 9.5028027607919725E+00 9.4822280794874878E+00 9.4616875426595630E+00 9.4411811055135662E+00 + 9.4207087233137798E+00 9.4002703513831261E+00 9.3798659451030755E+00 9.3594954599134841E+00 9.3391588513124564E+00 + 9.3188560748562317E+00 9.2985870861590083E+00 9.2783518408928138E+00 9.2581502947874021E+00 9.2379824036300420E+00 + 9.2178481232654779E+00 9.1977474095957206E+00 9.1776802185799102E+00 9.1576465062342063E+00 9.1376462286316951E+00 + 9.1176793419021340E+00 9.0977458022319784E+00 9.0778455658640720E+00 9.0579785890976527E+00 9.0381448282881927E+00 + 9.0183442398471723E+00 8.9985767802420806E+00 8.9788424059961827E+00 8.9591410736884782E+00 8.9394727399534943E+00 + 8.9198373614811892E+00 8.9002348950167729E+00 8.8806652973606646E+00 8.8611285253683700E+00 8.8416245359502401E+00 + 8.8221532860714174E+00 8.8027147327517348E+00 8.7833088330654920E+00 8.7639355441415017E+00 8.7445948231627728E+00 + 8.7252866273664544E+00 8.7060109140438335E+00 8.6867676405399568E+00 8.6675567642538027E+00 8.6483782426378841E+00 + 8.6292320331983188E+00 8.6101180934946679E+00 8.5910363811396930E+00 8.5719868537993982E+00 8.5529694691928224E+00 + 8.5339841850919296E+00 8.5150309593215283E+00 8.4961097497590501E+00 8.4772205143345420E+00 8.4583632110304965E+00 + 8.4395377978817816E+00 8.4207442329754212E+00 8.4019824744505929E+00 8.3832524804983954E+00 8.3645542093618257E+00 + 8.3458876193356843E+00 8.3272526687663397E+00 8.3086493160516728E+00 8.2900775196410539E+00 8.2715372380350249E+00 + 8.2530284297854433E+00 8.2345510534950979E+00 8.2161050678178125E+00 8.1976904314582413E+00 8.1793071031717286E+00 + 8.1609550417642609E+00 8.1426342060923211E+00 8.1243445550627928E+00 8.1060860476328376E+00 8.0878586428097758E+00 + 8.0696622996510072E+00 8.0514969772638683E+00 8.0333626348055667E+00 8.0152592314830038E+00 7.9971867265527452E+00 + 7.9791450793208316E+00 7.9611342491427974E+00 7.9431541954234026E+00 7.9252048776166308E+00 7.9072862552255954E+00 + 7.8893982878023090E+00 7.8715409349477872E+00 7.8537141563116935E+00 7.8359179115924844E+00 7.8181521605370774E+00 + 7.8004168629409296E+00 7.7827119786478329E+00 7.7650374675498339E+00 7.7473932895871540E+00 7.7297794047480295E+00 + 7.7121957730686779E+00 7.6946423546331690E+00 7.6771191095733027E+00 7.6596259980685444E+00 7.6421629803458737E+00 + 7.6247300166797878E+00 7.6073270673920677E+00 7.5899540928517606E+00 7.5726110534750521E+00 7.5552979097252262E+00 + 7.5380146221124731E+00 7.5207611511938319E+00 7.5035374575731630E+00 7.4863435019009037E+00 7.4691792448741205E+00 + 7.4520446472363444E+00 7.4349396697774228E+00 7.4178642733335316E+00 7.4008184187870398E+00 7.3838020670663331E+00 + 7.3668151791458509E+00 7.3498577160459080E+00 7.3329296388326224E+00 7.3160309086178366E+00 7.2991614865589938E+00 + 7.2823213338590724E+00 7.2655104117664786E+00 7.2487286815749163E+00 7.2319761046234303E+00 7.2152526422961616E+00 + 7.1985582560222765E+00 7.1818929072760254E+00 7.1652565575764395E+00 7.1486491684873830E+00 7.1320707016174589E+00 + 7.1155211186197942E+00 7.0990003811921412E+00 7.0825084510766514E+00 7.0660452900597877E+00 7.0496108599723195E+00 + 7.0332051226891670E+00 7.0168280401293739E+00 7.0004795742558947E+00 6.9841596870756817E+00 6.9678683406394661E+00 + 6.9516054970417454E+00 6.9353711184206377E+00 6.9191651669578498E+00 6.9029876048785530E+00 6.8868383944513392E+00 + 6.8707174979881156E+00 6.8546248778439800E+00 6.8385604964171653E+00 6.8225243161490470E+00 6.8065162995238788E+00 + 6.7905364090688938E+00 6.7745846073540541E+00 6.7586608569921287E+00 6.7427651206384542E+00 6.7268973609910017E+00 + 6.7110575407901978E+00 6.6952456228188453E+00 6.6794615699021014E+00 6.6637053449073393E+00 6.6479769107441369E+00 + 6.6322762303641003E+00 6.6166032667608530E+00 6.6009579829699510E+00 6.5853403420687719E+00 6.5697503071764700E+00 + 6.5541878414538832E+00 6.5386529081034439E+00 6.5231454703691103E+00 6.5076654915363248E+00 6.4922129349318674E+00 + 6.4767877639238005E+00 6.4613899419214613E+00 6.4460194323752678E+00 6.4306761987767596E+00 6.4153602046584091E+00 + 6.4000714135936576E+00 6.3848097891967326E+00 6.3695752951226519E+00 6.3543678950671447E+00 6.3391875527665142E+00 + 6.3240342319976470E+00 6.3089078965778214E+00 6.2938085103647810E+00 6.2787360372565537E+00 6.2636904411914278E+00 + 6.2486716861478468E+00 6.2336797361443539E+00 6.2187145552395506E+00 6.2037761075319588E+00 6.1888643571599919E+00 + 6.1739792683018564E+00 6.1591208051755704E+00 6.1442889320387186E+00 6.1294836131885777E+00 6.1147048129618682E+00 + 6.0999524957348514E+00 6.0852266259230872E+00 6.0705271679815471E+00 6.0558540864043646E+00 6.0412073457248843E+00 + 6.0265869105155909E+00 6.0119927453879924E+00 5.9974248149925264E+00 5.9828830840185780E+00 5.9683675171943600E+00 + 5.9538780792868504E+00 5.9394147351017397E+00 5.9249774494833289E+00 5.9105661873144779E+00 5.8961809135166074E+00 + 5.8818215930495077E+00 5.8674881909113568E+00 5.8531806721386150E+00 5.8388990018060341E+00 5.8246431450264522E+00 + 5.8104130669509013E+00 5.7962087327683651E+00 5.7820301077058760E+00 5.7678771570283205E+00 5.7537498460384526E+00 + 5.7396481400768353E+00 5.7255720045216849E+00 5.7115214047889218E+00 5.6974963063320478E+00 5.6834966746420763E+00 + 5.6695224752474953E+00 5.6555736737141968E+00 5.6416502356454004E+00 5.6277521266816155E+00 5.6138793125005639E+00 + 5.6000317588170958E+00 5.5862094313831898E+00 5.5724122959878306E+00 5.5586403184569573E+00 5.5448934646534749E+00 + 5.5311717004770680E+00 5.5174749918642654E+00 5.5038033047882555E+00 5.4901566052589663E+00 5.4765348593228724E+00 + 5.4629380330630424E+00 5.4493660925989884E+00 5.4358190040866887E+00 5.4222967337184826E+00 5.4087992477229889E+00 + 5.3953265123651173E+00 5.3818784939459565E+00 5.3684551588027398E+00 5.3550564733087622E+00 5.3416824038733566E+00 + 5.3283329169418092E+00 5.3150079789953049E+00 5.3017075565508813E+00 5.2884316161614082E+00 5.2751801244154324E+00 + 5.2619530479372143E+00 5.2487503533866029E+00 5.2355720074590719E+00 5.2224179768855539E+00 5.2092882284324675E+00 + 5.1961827289016052E+00 5.1831014451301547E+00 5.1700443439905204E+00 5.1570113923903973E+00 5.1440025572726702E+00 + 5.1310178056152944E+00 5.1180571044313448E+00 5.1051204207689027E+00 5.0922077217110031E+00 5.0793189743756129E+00 + 5.0664541459155483E+00 5.0536132035184211E+00 5.0407961144066027E+00 5.0280028458371708E+00 5.0152333651018264E+00 + 5.0024876395268905E+00 4.9897656364732219E+00 4.9770673233361578E+00 4.9643926675454653E+00 4.9517416365653464E+00 + 4.9391141978942690E+00 4.9265103190650459E+00 4.9139299676446750E+00 4.9013731112343795E+00 4.8888397174694722E+00 + 4.8763297540193777E+00 4.8638431885875297E+00 4.8513799889113827E+00 4.8389401227622519E+00 4.8265235579453876E+00 + 4.8141302622998570E+00 4.8017602036985112E+00 4.7894133500479272E+00 4.7770896692883680E+00 4.7647891293937326E+00 + 4.7525116983715012E+00 4.7402573442626794E+00 4.7280260351417969E+00 4.7158177391168117E+00 4.7036324243290348E+00 + 4.6914700589531808E+00 4.6793306111972210E+00 4.6672140493023822E+00 4.6551203415431228E+00 4.6430494562270086E+00 + 4.6310013616947510E+00 4.6189760263201212E+00 4.6069734185098810E+00 4.5949935067037728E+00 4.5830362593744693E+00 + 4.5711016450275181E+00 4.5591896322012966E+00 4.5473001894669398E+00 4.5354332854283594E+00 4.5235888887221396E+00 + 4.5117669680175068E+00 4.4999674920163262E+00 4.4881904294529820E+00 4.4764357490943780E+00 4.4647034197399060E+00 + 4.4529934102213504E+00 4.4413056894029177E+00 4.4296402261811183E+00 4.4179969894847408E+00 4.4063759482748726E+00 + 4.3947770715447518E+00 4.3832003283198047E+00 4.3716456876575913E+00 4.3601131186476980E+00 4.3486025904117822E+00 + 4.3371140721034829E+00 4.3256475329083477E+00 4.3142029420438766E+00 4.3027802687594132E+00 4.2913794823361071E+00 + 4.2800005520868911E+00 4.2686434473564345E+00 4.2573081375210968E+00 4.2459945919888851E+00 4.2347027801994068E+00 + 4.2234326716238737E+00 4.2121842357649859E+00 4.2009574421569313E+00 4.1897522603653492E+00 4.1785686599873006E+00 + 4.1674066106511747E+00 4.1562660820167192E+00 4.1451470437749283E+00 4.1340494656480606E+00 4.1229733173895688E+00 + 4.1119185687840698E+00 4.1008851896472995E+00 4.0898731498260981E+00 4.0788824191982904E+00 4.0679129676727728E+00 + 4.0569647651893623E+00 4.0460377817188187E+00 4.0351319872627789E+00 4.0242473518537407E+00 4.0133838455549995E+00 + 4.0025414384606188E+00 3.9917201006953884E+00 3.9809198024148302E+00 3.9701405138050756E+00 3.9593822050828806E+00 + 3.9486448464956148E+00 3.9379284083211559E+00 3.9272328608678850E+00 3.9165581744746834E+00 3.9059043195108161E+00 + 3.8952712663759801E+00 3.8846589855002196E+00 3.8740674473438674E+00 3.8634966223975757E+00 3.8529464811822267E+00 + 3.8424169942489224E+00 3.8319081321788966E+00 3.8214198655835712E+00 3.8109521651044300E+00 3.8005050014130521E+00 + 3.7900783452110196E+00 3.7796721672299021E+00 3.7692864382312687E+00 3.7589211290065623E+00 3.7485762103771347E+00 + 3.7382516531941623E+00 3.7279474283386853E+00 3.7176635067214767E+00 3.7073998592830750E+00 3.6971564569937425E+00 + 3.6869332708533862E+00 3.6767302718915884E+00 3.6665474311674973E+00 3.6563847197698767E+00 3.6462421088170220E+00 + 3.6361195694566870E+00 3.6260170728661549E+00 3.6159345902521123E+00 3.6058720928506678E+00 3.5958295519272876E+00 + 3.5858069387767730E+00 3.5758042247232367E+00 3.5658213811200490E+00 3.5558583793498335E+00 3.5459151908244020E+00 + 3.5359917869847357E+00 3.5260881393009824E+00 3.5162042192723599E+00 3.5063399984271642E+00 3.4964954483227642E+00 + 3.4866705405454947E+00 3.4768652467106897E+00 3.4670795384626212E+00 3.4573133874744815E+00 3.4475667654483244E+00 + 3.4378396441150731E+00 3.4281319952344442E+00 3.4184437905949649E+00 3.4087750020138956E+00 3.3991256013372366E+00 + 3.3894955604396637E+00 3.3798848512245150E+00 3.3702934456237714E+00 3.3607213155979978E+00 3.3511684331363290E+00 + 3.3416347702564404E+00 3.3321202990045129E+00 3.3226249914552031E+00 3.3131488197115959E+00 3.3036917559052354E+00 + 3.2942537721959968E+00 3.2848348407721555E+00 3.2754349338502853E+00 3.2660540236752551E+00 3.2566920825202108E+00 + 3.2473490826865361E+00 3.2380249965038064E+00 3.2287197963297825E+00 3.2194334545503853E+00 3.2101659435796179E+00 + 3.2009172358596079E+00 3.1916873038605273E+00 3.1824761200805898E+00 3.1732836570459924E+00 3.1641098873109264E+00 + 3.1549547834575167E+00 3.1458183180957966E+00 3.1367004638637086E+00 3.1276011934270369E+00 3.1185204794793973E+00 + 3.1094582947422293E+00 3.1004146119647222E+00 3.0913894039238161E+00 3.0823826434241934E+00 3.0733943032981945E+00 + 3.0644243564058558E+00 3.0554727756348146E+00 3.0465395339003543E+00 3.0376246041453063E+00 3.0287279593400691E+00 + 3.0198495724825807E+00 3.0109894165982682E+00 3.0021474647400170E+00 2.9933236899881672E+00 2.9845180654504930E+00 + 2.9757305642621388E+00 2.9669611595856278E+00 2.9582098246108113E+00 2.9494765325548529E+00 2.9407612566622072E+00 + 2.9320639702045979E+00 2.9233846464809599E+00 2.9147232588174443E+00 2.9060797805673784E+00 2.8974541851112567E+00 + 2.8888464458566858E+00 2.8802565362383916E+00 2.8716844297181519E+00 2.8631300997848341E+00 2.8545935199542871E+00 + 2.8460746637693903E+00 2.8375735047999968E+00 2.8290900166428878E+00 2.8206241729217858E+00 2.8121759472873094E+00 + 2.8037453134169530E+00 2.7953322450150524E+00 2.7869367158127751E+00 2.7785586995680824E+00 2.7701981700657097E+00 + 2.7618551011171468E+00 2.7535294665606056E+00 2.7452212402609888E+00 2.7369303961098996E+00 2.7286569080255734E+00 + 2.7204007499528653E+00 2.7121618958632623E+00 2.7039403197547989E+00 2.6957359956520928E+00 2.6875488976062649E+00 + 2.6793789996949751E+00 2.6712262760223244E+00 2.6630907007189162E+00 2.6549722479417648E+00 2.6468708918742978E+00 + 2.6387866067263372E+00 2.6307193667340747E+00 2.6226691461600335E+00 2.6146359192930571E+00 2.6066196604482901E+00 + 2.5986203439671445E+00 2.5906379442172796E+00 2.5826724355925892E+00 2.5747237925131592E+00 2.5667919894252504E+00 + 2.5588770008013095E+00 2.5509788011398906E+00 2.5430973649656603E+00 2.5352326668293959E+00 2.5273846813079142E+00 + 2.5195533830041024E+00 2.5117387465468415E+00 2.5039407465910437E+00 2.4961593578175703E+00 2.4883945549332482E+00 + 2.4806463126708462E+00 2.4729146057890414E+00 2.4651994090723783E+00 2.4575006973312936E+00 2.4498184454020633E+00 + 2.4421526281467809E+00 2.4345032204533470E+00 2.4268701972354383E+00 2.4192535334324945E+00 2.4116532040096810E+00 + 2.4040691839579056E+00 2.3965014482937383E+00 2.3889499720594416E+00 2.3814147303229167E+00 2.3738956981777148E+00 + 2.3663928507429710E+00 2.3589061631634345E+00 2.3514356106093990E+00 2.3439811682767262E+00 2.3365428113867752E+00 + 2.3291205151864367E+00 2.3217142549480814E+00 2.3143240059695209E+00 2.3069497435740360E+00 2.2995914431103133E+00 + 2.2922490799524451E+00 2.2849226294999134E+00 2.2776120671775448E+00 2.2703173684355225E+00 2.2630385087493341E+00 + 2.2557754636197798E+00 2.2485282085729326E+00 2.2412967191601254E+00 2.2340809709579279E+00 2.2268809395681481E+00 + 2.2196966006177679E+00 2.2125279297589553E+00 2.2053749026690626E+00 2.1982374950505426E+00 2.1911156826310054E+00 + 2.1840094411631319E+00 2.1769187464247066E+00 2.1698435742185689E+00 2.1627839003725953E+00 2.1557397007396872E+00 + 2.1487109511977565E+00 2.1416976276496915E+00 2.1346997060233579E+00 2.1277171622715443E+00 2.1207499723719865E+00 + 2.1137981123273129E+00 2.1068615581650634E+00 2.0999402859376262E+00 2.0930342717222485E+00 2.0861434916210064E+00 + 2.0792679217607852E+00 2.0724075382932812E+00 2.0655623173949511E+00 2.0587322352670046E+00 2.0519172681354085E+00 + 2.0451173922508299E+00 2.0383325838886526E+00 2.0315628193489284E+00 2.0248080749563857E+00 2.0180683270603996E+00 + 2.0113435520349574E+00 2.0046337262786706E+00 1.9979388262147388E+00 1.9912588282909318E+00 1.9845937089795749E+00 + 1.9779434447775346E+00 1.9713080122061912E+00 1.9646873878114257E+00 1.9580815481636074E+00 1.9514904698575657E+00 + 1.9449141295125767E+00 1.9383525037723521E+00 1.9318055693050034E+00 1.9252733028030566E+00 1.9187556809833888E+00 + 1.9122526805872637E+00 1.9057642783802629E+00 1.8992904511522934E+00 1.8928311757175875E+00 1.8863864289146559E+00 + 1.8799561876062676E+00 1.8735404286794657E+00 1.8671391290455288E+00 1.8607522656399356E+00 1.8543798154223887E+00 + 1.8480217553767671E+00 1.8416780625111175E+00 1.8353487138576441E+00 1.8290336864726768E+00 1.8227329574366700E+00 + 1.8164465038541744E+00 1.8101743028538233E+00 1.8039163315883178E+00 1.7976725672344183E+00 1.7914429869929047E+00 + 1.7852275680885719E+00 1.7790262877702299E+00 1.7728391233106628E+00 1.7666660520066106E+00 1.7605070511787844E+00 + 1.7543620981718184E+00 1.7482311703542570E+00 1.7421142451185605E+00 1.7360112998810540E+00 1.7299223120819465E+00 + 1.7238472591852916E+00 1.7177861186789805E+00 1.7117388680747223E+00 1.7057054849080284E+00 1.6996859467381951E+00 + 1.6936802311482959E+00 1.6876883157451492E+00 1.6817101781593207E+00 1.6757457960450921E+00 1.6697951470804531E+00 + 1.6638582089670817E+00 1.6579349594303394E+00 1.6520253762192396E+00 1.6461294371064337E+00 1.6402471198882138E+00 + 1.6343784023844645E+00 1.6285232624386883E+00 1.6226816779179469E+00 1.6168536267128804E+00 1.6110390867376749E+00 + 1.6052380359300427E+00 1.5994504522512196E+00 1.5936763136859446E+00 1.5879155982424402E+00 1.5821682839524018E+00 + 1.5764343488709778E+00 1.5707137710767642E+00 1.5650065286717705E+00 1.5593125997814294E+00 1.5536319625545578E+00 + 1.5479645951633567E+00 1.5423104758033899E+00 1.5366695826935672E+00 1.5310418940761443E+00 1.5254273882166800E+00 + 1.5198260434040416E+00 1.5142378379503973E+00 1.5086627501911698E+00 1.5031007584850522E+00 1.4975518412139841E+00 + 1.4920159767831218E+00 1.4864931436208444E+00 1.4809833201787324E+00 1.4754864849315408E+00 1.4700026163772035E+00 + 1.4645316930368035E+00 1.4590736934545678E+00 1.4536285961978475E+00 1.4481963798571007E+00 1.4427770230458894E+00 + 1.4373705044008507E+00 1.4319768025816881E+00 1.4265958962711631E+00 1.4212277641750677E+00 1.4158723850222286E+00 + 1.4105297375644681E+00 1.4051998005766089E+00 1.3998825528564607E+00 1.3945779732247838E+00 1.3892860405253076E+00 + 1.3840067336246806E+00 1.3787400314124889E+00 1.3734859128012213E+00 1.3682443567262559E+00 1.3630153421458602E+00 + 1.3577988480411602E+00 1.3525948534161440E+00 1.3474033372976193E+00 1.3422242787352341E+00 1.3370576568014376E+00 + 1.3319034505914813E+00 1.3267616392233839E+00 1.3216322018379516E+00 1.3165151175987309E+00 1.3114103656920075E+00 + 1.3063179253267962E+00 1.3012377757348215E+00 1.2961698961705124E+00 1.2911142659109691E+00 1.2860708642559791E+00 + 1.2810396705279694E+00 1.2760206640720173E+00 1.2710138242558275E+00 1.2660191304697286E+00 1.2610365621266324E+00 + 1.2560660986620553E+00 1.2511077195340781E+00 1.2461614042233522E+00 1.2412271322330581E+00 1.2363048830889285E+00 + 1.2313946363392048E+00 1.2264963715546386E+00 1.2216100683284719E+00 1.2167357062764292E+00 1.2118732650366959E+00 + 1.2070227242699145E+00 1.2021840636591679E+00 1.1973572629099567E+00 1.1925423017501950E+00 1.1877391599302058E+00 + 1.1829478172226864E+00 1.1781682534227067E+00 1.1734004483477061E+00 1.1686443818374530E+00 1.1639000337540626E+00 + 1.1591673839819672E+00 1.1544464124278930E+00 1.1497370990208700E+00 1.1450394237122086E+00 1.1403533664754806E+00 + 1.1356789073065068E+00 1.1310160262233580E+00 1.1263647032663247E+00 1.1217249184979154E+00 1.1170966520028391E+00 + 1.1124798838879850E+00 1.1078745942824340E+00 1.1032807633374104E+00 1.0986983712262992E+00 1.0941273981446145E+00 + 1.0895678243099953E+00 1.0850196299621941E+00 1.0804827953630571E+00 1.0759573007965162E+00 1.0714431265685689E+00 + 1.0669402530072856E+00 1.0624486604627641E+00 1.0579683293071453E+00 1.0534992399345964E+00 1.0490413727612744E+00 + 1.0445947082253468E+00 1.0401592267869542E+00 1.0357349089282102E+00 1.0313217351531820E+00 1.0269196859878842E+00 + 1.0225287419802584E+00 1.0181488837001671E+00 1.0137800917393767E+00 1.0094223467115473E+00 1.0050756292522209E+00 + 1.0007399200188030E+00 9.9641519969056325E-01 9.9210144896860464E-01 9.8779864857586130E-01 9.8350677925709407E-01 + 9.7922582177885453E-01 9.7495575692950420E-01 9.7069656551916639E-01 9.6644822837974609E-01 9.6221072636489924E-01 + 9.5798404035001838E-01 9.5376815123223591E-01 9.4956303993039715E-01 9.4536868738505353E-01 9.4118507455844813E-01 + 9.3701218243450735E-01 9.3284999201882501E-01 9.2869848433865110E-01 9.2455764044287603E-01 9.2042744140203114E-01 + 9.1630786830825695E-01 9.1219890227530431E-01 9.0810052443851874E-01 9.0401271595482391E-01 8.9993545800272512E-01 + 8.9586873178227244E-01 8.9181251851507004E-01 8.8776679944424886E-01 8.8373155583446739E-01 8.7970676897188649E-01 + 8.7569242016417381E-01 8.7168849074046773E-01 8.6769496205139041E-01 8.6371181546902043E-01 8.5973903238688476E-01 + 8.5577659421994934E-01 8.5182448240459463E-01 8.4788267839862363E-01 8.4395116368123491E-01 8.4002991975301367E-01 + 8.3611892813592126E-01 8.3221817037328827E-01 8.2832762802978943E-01 8.2444728269144096E-01 8.2057711596558991E-01 + 8.1671710948089227E-01 8.1286724488731776E-01 8.0902750385611599E-01 8.0519786807982852E-01 8.0137831927225323E-01 + 7.9756883916845200E-01 7.9376940952472419E-01 7.8998001211860602E-01 7.8620062874885321E-01 7.8243124123542518E-01 + 7.7867183141948104E-01 7.7492238116336531E-01 7.7118287235059046E-01 7.6745328688583458E-01 7.6373360669492096E-01 + 7.6002381372481143E-01 7.5632388994359001E-01 7.5263381734045753E-01 7.4895357792571426E-01 7.4528315373074938E-01 + 7.4162252680803065E-01 7.3797167923109042E-01 7.3433059309451876E-01 7.3069925051394102E-01 7.2707763362602307E-01 + 7.2346572458843916E-01 7.1986350557987933E-01 7.1627095880002034E-01 7.1268806646953131E-01 7.0911481083004424E-01 + 7.0555117414415836E-01 7.0199713869541802E-01 6.9845268678830796E-01 6.9491780074822862E-01 6.9139246292150136E-01 + 6.8787665567535006E-01 6.8437036139788299E-01 6.8087356249808928E-01 6.7738624140582593E-01 6.7390838057180236E-01 + 6.7043996246757065E-01 6.6698096958551933E-01 6.6353138443885074E-01 6.6009118956158075E-01 6.5666036750851486E-01 + 6.5323890085525260E-01 6.4982677219815921E-01 6.4642396415436765E-01 6.4303045936175351E-01 6.3964624047894170E-01 + 6.3627129018527262E-01 6.3290559118081058E-01 6.2954912618632253E-01 6.2620187794326143E-01 6.2286382921376826E-01 + 6.1953496278064912E-01 6.1621526144737038E-01 6.1290470803804076E-01 6.0960328539740793E-01 6.0631097639083864E-01 + 6.0302776390431390E-01 5.9975363084441335E-01 5.9648856013830509E-01 5.9323253473373116E-01 5.8998553759900618E-01 + 5.8674755172299209E-01 5.8351856011509395E-01 5.8029854580525342E-01 5.7708749184392194E-01 5.7388538130206834E-01 + 5.7069219727114917E-01 5.6750792286311469E-01 5.6433254121037990E-01 5.6116603546582799E-01 5.5800838880278991E-01 + 5.5485958441503747E-01 5.5171960551676580E-01 5.4858843534259027E-01 5.4546605714752960E-01 5.4235245420699696E-01 + 5.3924760981678377E-01 5.3615150729305439E-01 5.3306412997233232E-01 5.2998546121148737E-01 5.2691548438772329E-01 + 5.2385418289857488E-01 5.2080154016188329E-01 5.1775753961579252E-01 5.1472216471874166E-01 5.1169539894944338E-01 + 5.0867722580687846E-01 5.0566762881028782E-01 5.0266659149915072E-01 4.9967409743318564E-01 4.9669013019232994E-01 + 4.9371467337673042E-01 4.9074771060673478E-01 4.8778922552287834E-01 4.8483920178587170E-01 4.8189762307659179E-01 + 4.7896447309606566E-01 4.7603973556546564E-01 4.7312339422609467E-01 4.7021543283937151E-01 4.6731583518682956E-01 + 4.6442458507009149E-01 4.6154166631087079E-01 4.5866706275094998E-01 4.5580075825217653E-01 4.5294273669645102E-01 + 4.5009298198570902E-01 4.4725147804191800E-01 4.4441820880706234E-01 4.4159315824312817E-01 4.3877631033210041E-01 + 4.3596764907594698E-01 4.3316715849660192E-01 4.3037482263596533E-01 4.2759062555588395E-01 4.2481455133813945E-01 + 4.2204658408444362E-01 4.1928670791642098E-01 4.1653490697560008E-01 4.1379116542340139E-01 4.1105546744112420E-01 + 4.0832779722994084E-01 4.0560813901087905E-01 4.0289647702481124E-01 4.0019279553245146E-01 3.9749707881433149E-01 + 3.9480931117079870E-01 3.9212947692199968E-01 3.8945756040787444E-01 3.8679354598813709E-01 3.8413741804227347E-01 + 3.8148916096952012E-01 3.7884875918886496E-01 3.7621619713902038E-01 3.7359145927842830E-01 3.7097453008523695E-01 + 3.6836539405729585E-01 3.6576403571213989E-01 3.6317043958698192E-01 3.6058459023870060E-01 3.5800647224382653E-01 + 3.5543607019853424E-01 3.5287336871862784E-01 3.5031835243953241E-01 3.4777100601628086E-01 3.4523131412350161E-01 + 3.4269926145541302E-01 3.4017483272580357E-01 3.3765801266802498E-01 3.3514878603498299E-01 3.3264713759912212E-01 + 3.3015305215241442E-01 3.2766651450635320E-01 3.2518750949193276E-01 3.2271602195964744E-01 3.2025203677947239E-01 + 3.1779553884085421E-01 3.1534651305270139E-01 3.1290494434337174E-01 3.1047081766066154E-01 3.0804411797179221E-01 + 3.0562483026340109E-01 3.0321293954153034E-01 3.0080843083161396E-01 2.9841128917846693E-01 2.9602149964627433E-01 + 2.9363904731858037E-01 2.9126391729827533E-01 2.8889609470758459E-01 2.8653556468805891E-01 2.8418231240056291E-01 + 2.8183632302526085E-01 2.7949758176160738E-01 2.7716607382833847E-01 2.7484178446345353E-01 2.7252469892421122E-01 + 2.7021480248711244E-01 2.6791208044789333E-01 2.6561651812151221E-01 2.6332810084213421E-01 2.6104681396312757E-01 + 2.5877264285704604E-01 2.5650557291562076E-01 2.5424558954974591E-01 2.5199267818947169E-01 2.4974682428398820E-01 + 2.4750801330161720E-01 2.4527623072979890E-01 2.4305146207508263E-01 2.4083369286311118E-01 2.3862290863861704E-01 + 2.3641909496540184E-01 2.3422223742633061E-01 2.3203232162332060E-01 2.2984933317732659E-01 2.2767325772833083E-01 + 2.2550408093533350E-01 2.2334178847633951E-01 2.2118636604834538E-01 2.1903779936733236E-01 2.1689607416824946E-01 + 2.1476117620500676E-01 2.1263309125046168E-01 2.1051180509640766E-01 2.0839730355356226E-01 2.0628957245155830E-01 + 2.0418859763892797E-01 2.0209436498309613E-01 2.0000686037036403E-01 1.9792606970590221E-01 1.9585197891373729E-01 + 1.9378457393673840E-01 1.9172384073660920E-01 1.8966976529387580E-01 1.8762233360787192E-01 1.8558153169672992E-01 + 1.8354734559737179E-01 1.8151976136549275E-01 1.7949876507555196E-01 1.7748434282076234E-01 1.7547648071307700E-01 + 1.7347516488317866E-01 1.7148038148046735E-01 1.6949211667305000E-01 1.6751035664772876E-01 1.6553508760998861E-01 + 1.6356629578398660E-01 1.6160396741253988E-01 1.5964808875711492E-01 1.5769864609781403E-01 1.5575562573336652E-01 + 1.5381901398111422E-01 1.5188879717700354E-01 1.4996496167556989E-01 1.4804749384993005E-01 1.4613638009176683E-01 + 1.4423160681131947E-01 1.4233316043737354E-01 1.4044102741724529E-01 1.3855519421677498E-01 1.3667564732030990E-01 + 1.3480237323069919E-01 1.3293535846927526E-01 1.3107458957584767E-01 1.2922005310868928E-01 1.2737173564452384E-01 + 1.2552962377851687E-01 1.2369370412426181E-01 1.2186396331376800E-01 1.2004038799745279E-01 1.1822296484412478E-01 + 1.1641168054097625E-01 1.1460652179357006E-01 1.1280747532582616E-01 1.1101452788001372E-01 1.0922766621673705E-01 + 1.0744687711492330E-01 1.0567214737181260E-01 1.0390346380294635E-01 1.0214081324215349E-01 1.0038418254154145E-01 + 9.8633558571481386E-02 9.6888928220601245E-02 9.5150278395768395E-02 9.3417596022081439E-02 9.1690868042858392E-02 + 8.9970081419624648E-02 8.8255223132098673E-02 8.6546280178185803E-02 8.4843239573961129E-02 8.3146088353660108E-02 + 8.1454813569667578E-02 7.9769402292504080E-02 7.8089841610817001E-02 7.6416118631364160E-02 7.4748220479007685E-02 + 7.3086134296697094E-02 7.1429847245461864E-02 6.9779346504397280E-02 6.8134619270651481E-02 6.6495652759417850E-02 + 6.4862434203918795E-02 6.3234950855396890E-02 6.1613189983101592E-02 5.9997138874278017E-02 5.8386784834155436E-02 + 5.6782115185934345E-02 5.5183117270776461E-02 5.3589778447791045E-02 5.2002086094023889E-02 5.0420027604446027E-02 + 4.8843590391940729E-02 4.7272761887293145E-02 4.5707529539177658E-02 4.4147880814144946E-02 4.2593803196612483E-02 + 4.1045284188849868E-02 3.9502311310970810E-02 3.7964872100916813E-02 3.6432954114448877E-02 3.4906544925133613E-02 + 3.3385632124332057E-02 3.1870203321187854E-02 3.0360246142615104E-02 2.8855748233286200E-02 2.7356697255621686E-02 + 2.5863080889775621E-02 2.4374886833624924E-02 2.2892102802759086E-02 2.1414716530465085E-02 1.9942715767718094E-02 + 1.8476088283167807E-02 1.7014821863128315E-02 1.5558904311564002E-02 1.4108323450079622E-02 1.2663067117907014E-02 + 1.1223123171892654E-02 9.7884794864886212E-03 8.3591239537371079E-03 6.9350444832597018E-03 5.5162290022469744E-03 + 4.1026654554437705E-03 2.6943418051398999E-03 1.2912460311559298E-03 -1.0663386916743091E-04 -1.4993098809824412E-03 +-2.8867939719449090E-03 -4.2690980922277912E-03 -5.6462341745313607E-03 -7.0182141340972889E-03 -8.3850498687195272E-03 +-9.7467532587558643E-03 -1.1103336167141840E-02 -1.2454810439400046E-02 -1.3801187903654833E-02 -1.5142480370643507E-02 +-1.6478699633726696E-02 -1.7809857468903553E-02 -1.9135965634821069E-02 -2.0457035872787507E-02 -2.1773079906785058E-02 +-2.3084109443479606E-02 -2.4390136172234785E-02 -2.5691171765125465E-02 -2.6987227876945193E-02 -2.8278316145222963E-02 +-2.9564448190233832E-02 -3.0845635615009206E-02 -3.2121890005351247E-02 -3.3393222929845423E-02 -3.4659645939869692E-02 +-3.5921170569609938E-02 -3.7177808336069817E-02 -3.8429570739084061E-02 -3.9676469261330699E-02 -4.0918515368342304E-02 +-4.2155720508518887E-02 -4.3388096113140394E-02 -4.4615653596378889E-02 -4.5838404355308879E-02 -4.7056359769922333E-02 +-4.8269531203138615E-02 -4.9477930000818751E-02 -5.0681567491775506E-02 -5.1880454987786817E-02 -5.3074603783607864E-02 +-5.4264025156984176E-02 -5.5448730368661749E-02 -5.6628730662400720E-02 -5.7804037264988804E-02 -5.8974661386250092E-02 +-6.0140614219060806E-02 -6.1301906939360266E-02 -6.2458550706161360E-02 -6.3610556661567522E-02 -6.4757935930779512E-02 +-6.5900699622111078E-02 -6.7038858827000558E-02 -6.8172424620022820E-02 -6.9301408058902558E-02 -7.0425820184524437E-02 +-7.1545672020948192E-02 -7.2660974575419118E-02 -7.3771738838380743E-02 -7.4877975783487705E-02 -7.5979696367616881E-02 +-7.7076911530881892E-02 -7.8169632196643052E-02 -7.9257869271521272E-02 -8.0341633645409513E-02 -8.1420936191487020E-02 +-8.2495787766228845E-02 -8.3566199209419934E-02 -8.4632181344168000E-02 -8.5693744976914829E-02 -8.6750900897449204E-02 +-8.7803659878918389E-02 -8.8852032677842363E-02 -8.9896030034124857E-02 -9.0935662671066300E-02 -9.1970941295375475E-02 +-9.3001876597183619E-02 -9.4028479250054739E-02 -9.5050759910999733E-02 -9.6068729220488119E-02 -9.7082397802461126E-02 +-9.8091776264342734E-02 -9.9096875197053791E-02 -1.0009770517502364E-01 -1.0109427675620275E-01 -1.0208660048207478E-01 +-1.0307468687767049E-01 -1.0405854645157799E-01 -1.0503818969595782E-01 -1.0601362708655268E-01 -1.0698486908270265E-01 +-1.0795192612735691E-01 -1.0891480864708375E-01 -1.0987352705208643E-01 -1.1082809173621490E-01 -1.1177851307697810E-01 +-1.1272480143555527E-01 -1.1366696715681052E-01 -1.1460502056930266E-01 -1.1553897198530212E-01 -1.1646883170079970E-01 +-1.1739460999552036E-01 -1.1831631713293625E-01 -1.1923396336027856E-01 -1.2014755890854976E-01 -1.2105711399253873E-01 +-1.2196263881083061E-01 -1.2286414354581918E-01 -1.2376163836372334E-01 -1.2465513341459401E-01 -1.2554463883233286E-01 +-1.2643016473469865E-01 -1.2731172122332554E-01 -1.2818931838373301E-01 -1.2906296628533737E-01 -1.2993267498146677E-01 +-1.3079845450937383E-01 -1.3166031489024560E-01 -1.3251826612921991E-01 -1.3337231821539469E-01 -1.3422248112184260E-01 +-1.3506876480562360E-01 -1.3591117920779722E-01 -1.3674973425343515E-01 -1.3758443985163452E-01 -1.3841530589553003E-01 +-1.3924234226230622E-01 -1.4006555881321214E-01 -1.4088496539357220E-01 -1.4170057183279880E-01 -1.4251238794440763E-01 +-1.4332042352602634E-01 -1.4412468835941097E-01 -1.4492519221045633E-01 -1.4572194482921044E-01 -1.4651495594988706E-01 +-1.4730423529087558E-01 -1.4808979255475860E-01 -1.4887163742832052E-01 -1.4964977958256401E-01 -1.5042422867271849E-01 +-1.5119499433825720E-01 -1.5196208620290763E-01 -1.5272551387466327E-01 -1.5348528694580027E-01 -1.5424141499288668E-01 +-1.5499390757679599E-01 -1.5574277424272170E-01 -1.5648802452018834E-01 -1.5722966792306522E-01 -1.5796771394957806E-01 +-1.5870217208232426E-01 -1.5943305178828232E-01 -1.6016036251882873E-01 -1.6088411370974681E-01 -1.6160431478124304E-01 +-1.6232097513795737E-01 -1.6303410416897698E-01 -1.6374371124785009E-01 -1.6444980573259818E-01 -1.6515239696572781E-01 +-1.6585149427424478E-01 -1.6654710696966674E-01 -1.6723924434803711E-01 -1.6792791568993526E-01 -1.6861313026049232E-01 +-1.6929489730940228E-01 -1.6997322607093623E-01 -1.7064812576395408E-01 -1.7131960559191886E-01 -1.7198767474290638E-01 +-1.7265234238962468E-01 -1.7331361768942008E-01 -1.7397150978429221E-01 -1.7462602780091122E-01 -1.7527718085062441E-01 +-1.7592497802947277E-01 -1.7656942841820483E-01 -1.7721054108228515E-01 -1.7784832507191289E-01 -1.7848278942203166E-01 +-1.7911394315234150E-01 -1.7974179526731507E-01 -1.8036635475620788E-01 -1.8098763059307404E-01 -1.8160563173677569E-01 +-1.8222036713099921E-01 -1.8283184570426669E-01 -1.8344007636994958E-01 -1.8404506802627971E-01 -1.8464682955636716E-01 +-1.8524536982820841E-01 -1.8584069769470069E-01 -1.8643282199365591E-01 -1.8702175154781439E-01 -1.8760749516485520E-01 +-1.8819006163741250E-01 -1.8876945974308570E-01 -1.8934569824445460E-01 -1.8991878588909183E-01 -1.9048873140957490E-01 +-1.9105554352350088E-01 -1.9161923093349922E-01 -1.9217980232724358E-01 -1.9273726637746563E-01 -1.9329163174196998E-01 +-1.9384290706364371E-01 -1.9439110097047235E-01 -1.9493622207555236E-01 -1.9547827897710318E-01 -1.9601728025848075E-01 +-1.9655323448819370E-01 -1.9708615021991055E-01 -1.9761603599247790E-01 -1.9814290032993073E-01 -1.9866675174150861E-01 +-1.9918759872166406E-01 -1.9970544975008081E-01 -2.0022031329168327E-01 -2.0073219779665291E-01 -2.0124111170043690E-01 +-2.0174706342376647E-01 -2.0225006137266541E-01 -2.0275011393846765E-01 -2.0324722949782711E-01 -2.0374141641273197E-01 +-2.0423268303051823E-01 -2.0472103768388289E-01 -2.0520648869089625E-01 -2.0568904435501581E-01 -2.0616871296510039E-01 +-2.0664550279542077E-01 -2.0711942210567538E-01 -2.0759047914100359E-01 -2.0805868213199649E-01 -2.0852403929471161E-01 +-2.0898655883068809E-01 -2.0944624892695513E-01 -2.0990311775605186E-01 -2.1035717347603242E-01 -2.1080842423048782E-01 +-2.1125687814855135E-01 -2.1170254334491923E-01 -2.1214542791985586E-01 -2.1258553995921511E-01 -2.1302288753444787E-01 +-2.1345747870261897E-01 -2.1388932150641579E-01 -2.1431842397416753E-01 -2.1474479411985381E-01 -2.1516843994312035E-01 +-2.1558936942929161E-01 -2.1600759054938312E-01 -2.1642311126011632E-01 -2.1683593950393243E-01 -2.1724608320900274E-01 +-2.1765355028924413E-01 -2.1805834864433182E-01 -2.1846048615971483E-01 -2.1885997070662447E-01 -2.1925681014209142E-01 +-2.1965101230895998E-01 -2.2004258503589647E-01 -2.2043153613740821E-01 -2.2081787341385423E-01 -2.2120160465145630E-01 +-2.2158273762231681E-01 -2.2196128008443017E-01 -2.2233723978169370E-01 -2.2271062444392556E-01 -2.2308144178687447E-01 +-2.2344969951223551E-01 -2.2381540530766092E-01 -2.2417856684677614E-01 -2.2453919178919129E-01 -2.2489728778051499E-01 +-2.2525286245236870E-01 -2.2560592342239963E-01 -2.2595647829429158E-01 -2.2630453465778261E-01 -2.2665010008867631E-01 +-2.2699318214885461E-01 -2.2733378838629134E-01 -2.2767192633506761E-01 -2.2800760351538277E-01 -2.2834082743356859E-01 +-2.2867160558210398E-01 -2.2899994543962437E-01 -2.2932585447094159E-01 -2.2964934012705160E-01 -2.2997040984515066E-01 +-2.3028907104864843E-01 -2.3060533114717899E-01 -2.3091919753661846E-01 -2.3123067759909594E-01 -2.3153977870300613E-01 +-2.3184650820302596E-01 -2.3215087344012422E-01 -2.3245288174157741E-01 -2.3275254042098245E-01 -2.3304985677826873E-01 +-2.3334483809971637E-01 -2.3363749165796424E-01 -2.3392782471202345E-01 -2.3421584450729810E-01 -2.3450155827558808E-01 +-2.3478497323511183E-01 -2.3506609659051245E-01 -2.3534493553287794E-01 -2.3562149723974965E-01 -2.3589578887513815E-01 +-2.3616781758953415E-01 -2.3643759051992563E-01 -2.3670511478980966E-01 -2.3697039750920432E-01 -2.3723344577466429E-01 +-2.3749426666929377E-01 -2.3775286726275982E-01 -2.3800925461130551E-01 -2.3826343575776335E-01 -2.3851541773156959E-01 +-2.3876520754877803E-01 -2.3901281221207210E-01 -2.3925823871077778E-01 -2.3950149402088095E-01 -2.3974258510503552E-01 +-2.3998151891258204E-01 -2.4021830237955646E-01 -2.4045294242870932E-01 -2.4068544596951191E-01 -2.4091581989817740E-01 +-2.4114407109766900E-01 -2.4137020643771481E-01 -2.4159423277482345E-01 -2.4181615695229455E-01 -2.4203598580023408E-01 +-2.4225372613556814E-01 -2.4246938476205376E-01 -2.4268296847029738E-01 -2.4289448403776259E-01 -2.4310393822878809E-01 +-2.4331133779459926E-01 -2.4351668947332145E-01 -2.4371999998999599E-01 -2.4392127605659017E-01 -2.4412052437201151E-01 +-2.4431775162212596E-01 -2.4451296447976420E-01 -2.4470616960473937E-01 -2.4489737364386105E-01 -2.4508658323094801E-01 +-2.4527380498683959E-01 -2.4545904551941233E-01 -2.4564231142359330E-01 -2.4582360928137004E-01 -2.4600294566180853E-01 +-2.4618032712106511E-01 -2.4635576020239908E-01 -2.4652925143618765E-01 -2.4670080733993788E-01 -2.4687043441830253E-01 +-2.4703813916309184E-01 -2.4720392805328678E-01 -2.4736780755505483E-01 -2.4752978412176074E-01 -2.4768986419398306E-01 +-2.4784805419952499E-01 -2.4800436055342842E-01 -2.4815878965799038E-01 -2.4831134790277173E-01 -2.4846204166461675E-01 +-2.4861087730765902E-01 -2.4875786118334370E-01 -2.4890299963043308E-01 -2.4904629897502606E-01 -2.4918776553056896E-01 +-2.4932740559787020E-01 -2.4946522546511057E-01 -2.4960123140786289E-01 -2.4973542968910017E-01 -2.4986782655921211E-01 +-2.4999842825601734E-01 -2.5012724100477762E-01 -2.5025427101821157E-01 -2.5037952449650680E-01 -2.5050300762733668E-01 +-2.5062472658587004E-01 -2.5074468753478696E-01 -2.5086289662429184E-01 -2.5097935999212861E-01 -2.5109408376359016E-01 +-2.5120707405153819E-01 -2.5131833695640898E-01 -2.5142787856623533E-01 -2.5153570495665178E-01 -2.5164182219091585E-01 +-2.5174623631991810E-01 -2.5184895338219315E-01 -2.5194997940393771E-01 -2.5204932039902250E-01 -2.5214698236900590E-01 +-2.5224297130314610E-01 -2.5233729317841735E-01 -2.5242995395952172E-01 -2.5252095959890225E-01 -2.5261031603675949E-01 +-2.5269802920106055E-01 -2.5278410500755660E-01 -2.5286854935979519E-01 -2.5295136814913316E-01 -2.5303256725475032E-01 +-2.5311215254366504E-01 -2.5319012987074418E-01 -2.5326650507872084E-01 -2.5334128399820377E-01 -2.5341447244769583E-01 +-2.5348607623360125E-01 -2.5355610115024563E-01 -2.5362455297988667E-01 -2.5369143749272538E-01 -2.5375676044692408E-01 +-2.5382052758861778E-01 -2.5388274465192806E-01 -2.5394341735897558E-01 -2.5400255141989520E-01 -2.5406015253284991E-01 +-2.5411622638404252E-01 -2.5417077864773013E-01 -2.5422381498623831E-01 -2.5427534104997379E-01 -2.5432536247744036E-01 +-2.5437388489524831E-01 -2.5442091391813021E-01 -2.5446645514895699E-01 -2.5451051417874648E-01 -2.5455309658668190E-01 +-2.5459420794012039E-01 -2.5463385379461295E-01 -2.5467203969391078E-01 -2.5470877116998508E-01 -2.5474405374303732E-01 +-2.5477789292151487E-01 -2.5481029420211959E-01 -2.5484126306982896E-01 -2.5487080499790410E-01 -2.5489892544790504E-01 +-2.5492562986970563E-01 -2.5495092370150391E-01 -2.5497481236983915E-01 -2.5499730128960268E-01 -2.5501839586405273E-01 +-2.5503810148482986E-01 -2.5505642353196650E-01 -2.5507336737390240E-01 -2.5508893836750063E-01 -2.5510314185805621E-01 +-2.5511598317931533E-01 -2.5512746765348260E-01 -2.5513760059124146E-01 -2.5514638729176120E-01 -2.5515383304271660E-01 +-2.5515994312029544E-01 -2.5516472278921704E-01 -2.5516817730274416E-01 -2.5517031190269523E-01 -2.5517113181945961E-01 +-2.5517064227201047E-01 -2.5516884846791799E-01 -2.5516575560336369E-01 -2.5516136886315322E-01 -2.5515569342073163E-01 +-2.5514873443819364E-01 -2.5514049706630038E-01 -2.5513098644449062E-01 -2.5512020770089788E-01 -2.5510816595235897E-01 +-2.5509486630442990E-01 -2.5508031385140234E-01 -2.5506451367631122E-01 -2.5504747085095425E-01 -2.5502919043589978E-01 +-2.5500967748050490E-01 -2.5498893702292857E-01 -2.5496697409014069E-01 -2.5494379369794073E-01 -2.5491940085096970E-01 +-2.5489380054272287E-01 -2.5486699775556237E-01 -2.5483899746073391E-01 -2.5480980461837766E-01 -2.5477942417754251E-01 +-2.5474786107619973E-01 -2.5471512024125720E-01 -2.5468120658857135E-01 -2.5464612502296124E-01 -2.5460988043822214E-01 +-2.5457247771713976E-01 -2.5453392173150408E-01 -2.5449421734211908E-01 -2.5445336939882257E-01 -2.5441138274049341E-01 +-2.5436826219506986E-01 -2.5432401257955950E-01 -2.5427863870005485E-01 -2.5423214535174771E-01 -2.5418453731893770E-01 +-2.5413581937505275E-01 -2.5408599628265743E-01 -2.5403507279346837E-01 -2.5398305364836854E-01 -2.5392994357741688E-01 +-2.5387574729986701E-01 -2.5382046952417670E-01 -2.5376411494802542E-01 -2.5370668825832282E-01 -2.5364819413122519E-01 +-2.5358863723214797E-01 -2.5352802221578052E-01 -2.5346635372609905E-01 -2.5340363639637858E-01 -2.5333987484920695E-01 +-2.5327507369650171E-01 -2.5320923753951663E-01 -2.5314237096886344E-01 -2.5307447856451726E-01 -2.5300556489583587E-01 +-2.5293563452157120E-01 -2.5286469198988321E-01 -2.5279274183834932E-01 -2.5271978859398508E-01 -2.5264583677325253E-01 +-2.5257089088207429E-01 -2.5249495541584882E-01 -2.5241803485946146E-01 -2.5234013368729941E-01 -2.5226125636326480E-01 +-2.5218140734078820E-01 -2.5210059106284016E-01 -2.5201881196195036E-01 -2.5193607446021271E-01 -2.5185238296930434E-01 +-2.5176774189049933E-01 -2.5168215561467822E-01 -2.5159562852234352E-01 -2.5150816498363554E-01 -2.5141976935834065E-01 +-2.5133044599590937E-01 -2.5124019923546731E-01 -2.5114903340582828E-01 -2.5105695282550866E-01 -2.5096396180274111E-01 +-2.5087006463548694E-01 -2.5077526561144992E-01 -2.5067956900808958E-01 -2.5058297909263411E-01 -2.5048550012209470E-01 +-2.5038713634327808E-01 -2.5028789199280033E-01 -2.5018777129709979E-01 -2.5008677847245075E-01 -2.4998491772497586E-01 +-2.4988219325066230E-01 -2.4977860923537057E-01 -2.4967416985485169E-01 -2.4956887927475968E-01 -2.4946274165066193E-01 +-2.4935576112805816E-01 -2.4924794184238738E-01 -2.4913928791904613E-01 -2.4902980347340017E-01 -2.4891949261079535E-01 +-2.4880835942657567E-01 -2.4869640800609227E-01 -2.4858364242471950E-01 -2.4847006674786720E-01 -2.4835568503099170E-01 +-2.4824050131961384E-01 -2.4812451964932811E-01 -2.4800774404581935E-01 -2.4789017852487311E-01 -2.4777182709238876E-01 +-2.4765269374439589E-01 -2.4753278246706356E-01 -2.4741209723671848E-01 -2.4729064201985340E-01 -2.4716842077314133E-01 +-2.4704543744345306E-01 -2.4692169596786326E-01 -2.4679720027367139E-01 -2.4667195427840716E-01 -2.4654596188985092E-01 +-2.4641922700604255E-01 -2.4629175351529439E-01 -2.4616354529620751E-01 -2.4603460621768294E-01 -2.4590494013893469E-01 +-2.4577455090950348E-01 -2.4564344236926947E-01 -2.4551161834846691E-01 -2.4537908266769504E-01 -2.4524583913793302E-01 +-2.4511189156055249E-01 -2.4497724372733062E-01 -2.4484189942046233E-01 -2.4470586241257777E-01 -2.4456913646674908E-01 +-2.4443172533650681E-01 -2.4429363276585558E-01 -2.4415486248928195E-01 -2.4401541823177186E-01 -2.4387530370882016E-01 +-2.4373452262644846E-01 -2.4359307868121252E-01 -2.4345097556022019E-01 -2.4330821694114260E-01 -2.4316480649222699E-01 +-2.4302074787230929E-01 -2.4287604473082877E-01 -2.4273070070784133E-01 -2.4258471943403032E-01 -2.4243810453072143E-01 +-2.4229085960989546E-01 -2.4214298827420086E-01 -2.4199449411696866E-01 -2.4184538072222203E-01 -2.4169565166469326E-01 +-2.4154531050983216E-01 -2.4139436081382595E-01 -2.4124280612360532E-01 -2.4109064997686003E-01 -2.4093789590205522E-01 +-2.4078454741843835E-01 -2.4063060803605713E-01 -2.4047608125577208E-01 -2.4032097056926455E-01 -2.4016527945905686E-01 +-2.4000901139852110E-01 -2.3985216985189131E-01 -2.3969475827428005E-01 -2.3953678011168891E-01 -2.3937823880102194E-01 +-2.3921913777009821E-01 -2.3905948043766645E-01 -2.3889927021341578E-01 -2.3873851049799047E-01 -2.3857720468300095E-01 +-2.3841535615104037E-01 -2.3825296827569317E-01 -2.3809004442155082E-01 -2.3792658794422308E-01 -2.3776260219035358E-01 +-2.3759809049762909E-01 -2.3743305619479657E-01 -2.3726750260167070E-01 -2.3710143302915312E-01 -2.3693485077924017E-01 +-2.3676775914503839E-01 -2.3660016141077714E-01 -2.3643206085182139E-01 -2.3626346073468266E-01 -2.3609436431703526E-01 +-2.3592477484772736E-01 -2.3575469556679321E-01 -2.3558412970546755E-01 -2.3541308048619761E-01 -2.3524155112265555E-01 +-2.3506954481975151E-01 -2.3489706477364866E-01 -2.3472411417177266E-01 -2.3455069619282526E-01 -2.3437681400679861E-01 +-2.3420247077498862E-01 -2.3402766965000363E-01 -2.3385241377578281E-01 -2.3367670628760395E-01 -2.3350055031209990E-01 +-2.3332394896726885E-01 -2.3314690536248978E-01 -2.3296942259853079E-01 -2.3279150376756741E-01 -2.3261315195319185E-01 +-2.3243437023042604E-01 -2.3225516166573545E-01 -2.3207552931704201E-01 -2.3189547623373347E-01 -2.3171500545668058E-01 +-2.3153412001824925E-01 -2.3135282294231019E-01 -2.3117111724425404E-01 -2.3098900593100341E-01 -2.3080649200102588E-01 +-2.3062357844434536E-01 -2.3044026824255870E-01 -2.3025656436884237E-01 -2.3007246978797113E-01 -2.2988798745632505E-01 +-2.2970312032190812E-01 -2.2951787132435528E-01 -2.2933224339494962E-01 -2.2914623945663073E-01 -2.2895986242401201E-01 +-2.2877311520338967E-01 -2.2858600069275795E-01 -2.2839852178181730E-01 -2.2821068135199338E-01 -2.2802248227644514E-01 +-2.2783392742007874E-01 -2.2764501963956024E-01 -2.2745576178332721E-01 -2.2726615669160341E-01 -2.2707620719640847E-01 +-2.2688591612157497E-01 -2.2669528628275487E-01 -2.2650432048743618E-01 -2.2631302153495639E-01 -2.2612139221651148E-01 +-2.2592943531516993E-01 -2.2573715360588786E-01 -2.2554454985551622E-01 -2.2535162682281831E-01 -2.2515838725848089E-01 +-2.2496483390512351E-01 -2.2477096949731584E-01 -2.2457679676158818E-01 -2.2438231841644068E-01 -2.2418753717236245E-01 +-2.2399245573183788E-01 -2.2379707678936345E-01 -2.2360140303145640E-01 -2.2340543713667127E-01 -2.2320918177560856E-01 +-2.2301263961092951E-01 -2.2281581329736694E-01 -2.2261870548174065E-01 -2.2242131880296587E-01 -2.2222365589206752E-01 +-2.2202571937219401E-01 -2.2182751185862751E-01 -2.2162903595879571E-01 -2.2143029427228880E-01 -2.2123128939086503E-01 +-2.2103202389846910E-01 -2.2083250037124216E-01 -2.2063272137753165E-01 -2.2043268947790831E-01 -2.2023240722517617E-01 +-2.2003187716438460E-01 -2.1983110183284008E-01 -2.1963008376012058E-01 -2.1942882546808684E-01 -2.1922732947089399E-01 +-2.1902559827500476E-01 -2.1882363437920099E-01 -2.1862144027459773E-01 -2.1841901844465320E-01 -2.1821637136518132E-01 +-2.1801350150436508E-01 -2.1781041132276963E-01 -2.1760710327335231E-01 -2.1740357980147493E-01 -2.1719984334491904E-01 +-2.1699589633389349E-01 -2.1679174119105216E-01 -2.1658738033149999E-01 -2.1638281616281044E-01 -2.1617805108503588E-01 +-2.1597308749071872E-01 -2.1576792776490389E-01 -2.1556257428515210E-01 -2.1535702942155174E-01 -2.1515129553673051E-01 +-2.1494537498586749E-01 -2.1473927011670554E-01 -2.1453298326956421E-01 -2.1432651677735037E-01 -2.1411987296557106E-01 +-2.1391305415234554E-01 -2.1370606264841874E-01 -2.1349890075717098E-01 -2.1329157077463007E-01 -2.1308407498948739E-01 +-2.1287641568310461E-01 -2.1266859512952835E-01 -2.1246061559550339E-01 -2.1225247934048383E-01 -2.1204418861664165E-01 +-2.1183574566888588E-01 -2.1162715273486654E-01 -2.1141841204499415E-01 -2.1120952582244626E-01 -2.1100049628318210E-01 +-2.1079132563595412E-01 -2.1058201608231966E-01 -2.1037256981665289E-01 -2.1016298902615696E-01 -2.0995327589087670E-01 +-2.0974343258370862E-01 -2.0953346127041539E-01 -2.0932336410963570E-01 -2.0911314325289634E-01 -2.0890280084462720E-01 +-2.0869233902216855E-01 -2.0848175991578516E-01 -2.0827106564868009E-01 -2.0806025833700220E-01 -2.0784934008986247E-01 +-2.0763831300934418E-01 -2.0742717919051198E-01 -2.0721594072142907E-01 -2.0700459968316587E-01 -2.0679315814981028E-01 +-2.0658161818848375E-01 -2.0636998185934993E-01 -2.0615825121562795E-01 -2.0594642830360332E-01 -2.0573451516264024E-01 +-2.0552251382519396E-01 -2.0531042631682075E-01 -2.0509825465619194E-01 -2.0488600085510419E-01 -2.0467366691849095E-01 +-2.0446125484443725E-01 -2.0424876662418703E-01 -2.0403620424215715E-01 -2.0382356967595069E-01 -2.0361086489636432E-01 +-2.0339809186740576E-01 -2.0318525254629943E-01 -2.0297234888350357E-01 -2.0275938282271772E-01 -2.0254635630089726E-01 +-2.0233327124826334E-01 -2.0212012958831646E-01 -2.0190693323784453E-01 -2.0169368410693939E-01 -2.0148038409900418E-01 +-2.0126703511076771E-01 -2.0105363903229467E-01 -2.0084019774699796E-01 -2.0062671313164979E-01 -2.0041318705639283E-01 +-2.0019962138475467E-01 -1.9998601797365542E-01 -1.9977237867342093E-01 -1.9955870532779513E-01 -1.9934499977395154E-01 +-1.9913126384250288E-01 -1.9891749935751571E-01 -1.9870370813651853E-01 -1.9848989199051678E-01 -1.9827605272400045E-01 +-1.9806219213495943E-01 -1.9784831201489397E-01 -1.9763441414882260E-01 -1.9742050031529926E-01 -1.9720657228642108E-01 +-1.9699263182784091E-01 -1.9677868069877880E-01 -1.9656472065203301E-01 -1.9635075343399222E-01 -1.9613678078464611E-01 +-1.9592280443759749E-01 -1.9570882612007326E-01 -1.9549484755293584E-01 -1.9528087045069534E-01 -1.9506689652152004E-01 +-1.9485292746724711E-01 -1.9463896498339661E-01 -1.9442501075918009E-01 -1.9421106647751232E-01 -1.9399713381502529E-01 +-1.9378321444207663E-01 -1.9356931002276068E-01 -1.9335542221492305E-01 -1.9314155267016964E-01 -1.9292770303387605E-01 +-1.9271387494520323E-01 -1.9250007003710634E-01 -1.9228628993634556E-01 -1.9207253626349868E-01 -1.9185881063297111E-01 +-1.9164511465300807E-01 -1.9143144992570585E-01 -1.9121781804702215E-01 -1.9100422060678815E-01 -1.9079065918871904E-01 +-1.9057713537042692E-01 -1.9036365072342948E-01 -1.9015020681316164E-01 -1.8993680519899050E-01 -1.8972344743421973E-01 +-1.8951013506610795E-01 -1.8929686963587364E-01 -1.8908365267871166E-01 -1.8887048572379903E-01 -1.8865737029431134E-01 +-1.8844430790743064E-01 -1.8823130007435590E-01 -1.8801834830031716E-01 -1.8780545408458441E-01 -1.8759261892047940E-01 +-1.8737984429538596E-01 -1.8716713169076227E-01 -1.8695448258215083E-01 -1.8674189843919003E-01 -1.8652938072562547E-01 +-1.8631693089931975E-01 -1.8610455041226584E-01 -1.8589224071059549E-01 -1.8568000323459061E-01 -1.8546783941869749E-01 +-1.8525575069153324E-01 -1.8504373847589872E-01 -1.8483180418879128E-01 -1.8461994924141203E-01 -1.8440817503918050E-01 +-1.8419648298174376E-01 -1.8398487446298531E-01 -1.8377335087104082E-01 -1.8356191358830501E-01 -1.8335056399144423E-01 +-1.8313930345140692E-01 -1.8292813333343552E-01 -1.8271705499707414E-01 -1.8250606979618336E-01 -1.8229517907895021E-01 +-1.8208438418789696E-01 -1.8187368645989352E-01 -1.8166308722616800E-01 -1.8145258781231760E-01 -1.8124218953831855E-01 +-1.8103189371853975E-01 -1.8082170166174924E-01 -1.8061161467112927E-01 -1.8040163404428253E-01 -1.8019176107324858E-01 +-1.7998199704450843E-01 -1.7977234323900096E-01 -1.7956280093212829E-01 -1.7935337139377175E-01 -1.7914405588829879E-01 +-1.7893485567457573E-01 -1.7872577200597609E-01 -1.7851680613039445E-01 -1.7830795929025559E-01 -1.7809923272252387E-01 +-1.7789062765871660E-01 -1.7768214532491253E-01 -1.7747378694176238E-01 -1.7726555372450264E-01 -1.7705744688296202E-01 +-1.7684946762157411E-01 -1.7664161713938767E-01 -1.7643389663007880E-01 -1.7622630728195782E-01 -1.7601885027798447E-01 +-1.7581152679577375E-01 -1.7560433800761110E-01 -1.7539728508045838E-01 -1.7519036917596928E-01 -1.7498359145049441E-01 +-1.7477695305509711E-01 -1.7457045513556069E-01 -1.7436409883239956E-01 -1.7415788528087067E-01 -1.7395181561098200E-01 +-1.7374589094750537E-01 -1.7354011240998526E-01 -1.7333448111275071E-01 -1.7312899816492350E-01 -1.7292366467043208E-01 +-1.7271848172801793E-01 -1.7251345043124880E-01 -1.7230857186852794E-01 -1.7210384712310564E-01 -1.7189927727308815E-01 +-1.7169486339144829E-01 -1.7149060654603770E-01 -1.7128650779959390E-01 -1.7108256820975434E-01 -1.7087878882906327E-01 +-1.7067517070498495E-01 -1.7047171487991267E-01 -1.7026842239117781E-01 -1.7006529427106259E-01 -1.6986233154680938E-01 +-1.6965953524063027E-01 -1.6945690636971786E-01 -1.6925444594625622E-01 -1.6905215497742970E-01 -1.6885003446543465E-01 +-1.6864808540748882E-01 -1.6844630879584130E-01 -1.6824470561778354E-01 -1.6804327685565892E-01 -1.6784202348687424E-01 +-1.6764094648390829E-01 -1.6744004681432126E-01 -1.6723932544076939E-01 -1.6703878332100849E-01 -1.6683842140791108E-01 +-1.6663824064946997E-01 -1.6643824198881366E-01 -1.6623842636421418E-01 -1.6603879470909544E-01 -1.6583934795204766E-01 +-1.6564008701683355E-01 -1.6544101282240067E-01 -1.6524212628288995E-01 -1.6504342830764682E-01 -1.6484491980123134E-01 +-1.6464660166342740E-01 -1.6444847478925323E-01 -1.6425054006897258E-01 -1.6405279838810188E-01 -1.6385525062742293E-01 +-1.6365789766299152E-01 -1.6346074036614774E-01 -1.6326377960352714E-01 -1.6306701623706785E-01 -1.6287045112402393E-01 +-1.6267408511697204E-01 -1.6247791906382505E-01 -1.6228195380783753E-01 -1.6208619018762058E-01 -1.6189062903714638E-01 +-1.6169527118576366E-01 -1.6150011745820350E-01 -1.6130516867459083E-01 -1.6111042565045455E-01 -1.6091588919673538E-01 +-1.6072156011979874E-01 -1.6052743922144283E-01 -1.6033352729890810E-01 -1.6013982514488800E-01 -1.5994633354753937E-01 +-1.5975305329049000E-01 -1.5955998515285044E-01 -1.5936712990922317E-01 -1.5917448832971159E-01 -1.5898206117993224E-01 +-1.5878984922102060E-01 -1.5859785320964542E-01 -1.5840607389801387E-01 -1.5821451203388548E-01 -1.5802316836057825E-01 +-1.5783204361698117E-01 -1.5764113853756281E-01 -1.5745045385237938E-01 -1.5725999028708798E-01 -1.5706974856295269E-01 +-1.5687972939685702E-01 -1.5668993350131150E-01 -1.5650036158446434E-01 -1.5631101435011124E-01 -1.5612189249770456E-01 +-1.5593299672236249E-01 -1.5574432771487939E-01 -1.5555588616173571E-01 -1.5536767274510649E-01 -1.5517968814287111E-01 +-1.5499193302862474E-01 -1.5480440807168414E-01 -1.5461711393710173E-01 -1.5443005128567092E-01 -1.5424322077393904E-01 +-1.5405662305421369E-01 -1.5387025877457575E-01 -1.5368412857888542E-01 -1.5349823310679386E-01 -1.5331257299375281E-01 +-1.5312714887102283E-01 -1.5294196136568253E-01 -1.5275701110063955E-01 -1.5257229869463937E-01 -1.5238782476227392E-01 +-1.5220358991399230E-01 -1.5201959475610904E-01 -1.5183583989081431E-01 -1.5165232591618202E-01 -1.5146905342618217E-01 +-1.5128602301068617E-01 -1.5110323525547933E-01 -1.5092069074226824E-01 -1.5073839004869211E-01 -1.5055633374832986E-01 +-1.5037452241071181E-01 -1.5019295660132606E-01 -1.5001163688163099E-01 -1.4983056380906151E-01 -1.4964973793704109E-01 +-1.4946915981498993E-01 -1.4928882998833184E-01 -1.4910874899850840E-01 -1.4892891738298433E-01 -1.4874933567525733E-01 +-1.4857000440486892E-01 -1.4839092409741189E-01 -1.4821209527454060E-01 -1.4803351845397941E-01 -1.4785519414953241E-01 +-1.4767712287109239E-01 -1.4749930512464926E-01 -1.4732174141230203E-01 -1.4714443223226376E-01 -1.4696737807887297E-01 +-1.4679057944260440E-01 -1.4661403681007387E-01 -1.4643775066405226E-01 -1.4626172148346961E-01 -1.4608594974342939E-01 +-1.4591043591521247E-01 -1.4573518046629033E-01 -1.4556018386033262E-01 -1.4538544655721419E-01 -1.4521096901302774E-01 +-1.4503675168009014E-01 -1.4486279500695304E-01 -1.4468909943841049E-01 -1.4451566541550900E-01 -1.4434249337555632E-01 +-1.4416958375213013E-01 -1.4399693697508692E-01 -1.4382455347057077E-01 -1.4365243366102440E-01 -1.4348057796519470E-01 +-1.4330898679814344E-01 -1.4313766057125762E-01 -1.4296659969225523E-01 -1.4279580456519583E-01 -1.4262527559049082E-01 +-1.4245501316490919E-01 -1.4228501768158908E-01 -1.4211528953004596E-01 -1.4194582909617948E-01 -1.4177663676228597E-01 +-1.4160771290706392E-01 -1.4143905790562547E-01 -1.4127067212950173E-01 -1.4110255594665591E-01 -1.4093470972148880E-01 +-1.4076713381484945E-01 -1.4059982858404235E-01 -1.4043279438283726E-01 -1.4026603156147863E-01 -1.4009954046669257E-01 +-1.3993332144169640E-01 -1.3976737482620746E-01 -1.3960170095645261E-01 -1.3943630016517519E-01 -1.3927117278164447E-01 +-1.3910631913166571E-01 -1.3894173953758640E-01 -1.3877743431830683E-01 -1.3861340378928796E-01 -1.3844964826255965E-01 +-1.3828616804673033E-01 -1.3812296344699554E-01 -1.3796003476514443E-01 -1.3779738229957172E-01 -1.3763500634528397E-01 +-1.3747290719390895E-01 -1.3731108513370363E-01 -1.3714954044956401E-01 -1.3698827342303191E-01 -1.3682728433230498E-01 +-1.3666657345224434E-01 -1.3650614105438463E-01 -1.3634598740694004E-01 -1.3618611277481438E-01 -1.3602651741960961E-01 +-1.3586720159963447E-01 -1.3570816556991172E-01 -1.3554940958218831E-01 -1.3539093388494203E-01 -1.3523273872339214E-01 +-1.3507482433950499E-01 -1.3491719097200519E-01 -1.3475983885638312E-01 -1.3460276822490172E-01 -1.3444597930660745E-01 +-1.3428947232733704E-01 -1.3413324750972663E-01 -1.3397730507321928E-01 -1.3382164523407464E-01 -1.3366626820537578E-01 +-1.3351117419703903E-01 -1.3335636341582099E-01 -1.3320183606532712E-01 -1.3304759234602187E-01 -1.3289363245523447E-01 +-1.3273995658716797E-01 -1.3258656493290802E-01 -1.3243345768043174E-01 -1.3228063501461382E-01 -1.3212809711723775E-01 +-1.3197584416700048E-01 -1.3182387633952489E-01 -1.3167219380736334E-01 -1.3152079674001002E-01 -1.3136968530390700E-01 +-1.3121885966245334E-01 -1.3106831997601132E-01 -1.3091806640191719E-01 -1.3076809909448842E-01 -1.3061841820503137E-01 +-1.3046902388184950E-01 -1.3031991627025211E-01 -1.3017109551256228E-01 -1.3002256174812385E-01 -1.2987431511331207E-01 +-1.2972635574153932E-01 -1.2957868376326373E-01 -1.2943129930599759E-01 -1.2928420249431655E-01 -1.2913739344986488E-01 +-1.2899087229136691E-01 -1.2884463913463137E-01 -1.2869869409256346E-01 -1.2855303727516890E-01 -1.2840766878956508E-01 +-1.2826258873998805E-01 -1.2811779722779904E-01 -1.2797329435149465E-01 -1.2782908020671396E-01 -1.2768515488624582E-01 +-1.2754151848003806E-01 -1.2739817107520460E-01 -1.2725511275603305E-01 -1.2711234360399387E-01 -1.2696986369774726E-01 +-1.2682767311315168E-01 -1.2668577192327091E-01 -1.2654416019838330E-01 -1.2640283800598792E-01 -1.2626180541081433E-01 +-1.2612106247482879E-01 -1.2598060925724322E-01 -1.2584044581452244E-01 -1.2570057220039221E-01 -1.2556098846584704E-01 +-1.2542169465915801E-01 -1.2528269082588042E-01 -1.2514397700886229E-01 -1.2500555324825077E-01 -1.2486741958150159E-01 +-1.2472957604338518E-01 -1.2459202266599578E-01 -1.2445475947875843E-01 -1.2431778650843701E-01 -1.2418110377914181E-01 +-1.2404471131233735E-01 -1.2390860912684981E-01 -1.2377279723887548E-01 -1.2363727566198746E-01 -1.2350204440714434E-01 +-1.2336710348269668E-01 -1.2323245289439592E-01 -1.2309809264540153E-01 -1.2296402273628808E-01 -1.2283024316505368E-01 +-1.2269675392712735E-01 -1.2256355501537679E-01 -1.2243064642011552E-01 -1.2229802812911067E-01 -1.2216570012759105E-01 +-1.2203366239825393E-01 -1.2190191492127361E-01 -1.2177045767430753E-01 -1.2163929063250535E-01 -1.2150841376851565E-01 +-1.2137782705249359E-01 -1.2124753045210857E-01 -1.2111752393255124E-01 -1.2098780745654229E-01 -1.2085838098433822E-01 +-1.2072924447373994E-01 -1.2060039788010028E-01 -1.2047184115633058E-01 -1.2034357425290930E-01 -1.2021559711788854E-01 +-1.2008790969690204E-01 -1.1996051193317223E-01 -1.1983340376751801E-01 -1.1970658513836173E-01 -1.1958005598173671E-01 +-1.1945381623129561E-01 -1.1932786581831584E-01 -1.1920220467170889E-01 -1.1907683271802619E-01 -1.1895174988146771E-01 +-1.1882695608388852E-01 -1.1870245124480612E-01 -1.1857823528140840E-01 -1.1845430810856004E-01 -1.1833066963881077E-01 +-1.1820731978240179E-01 -1.1808425844727394E-01 -1.1796148553907408E-01 -1.1783900096116330E-01 -1.1771680461462310E-01 +-1.1759489639826368E-01 -1.1747327620863060E-01 -1.1735194394001228E-01 -1.1723089948444677E-01 -1.1711014273172952E-01 +-1.1698967356942018E-01 -1.1686949188285055E-01 -1.1674959755513041E-01 -1.1662999046715589E-01 -1.1651067049761613E-01 +-1.1639163752300079E-01 -1.1627289141760659E-01 -1.1615443205354496E-01 -1.1603625930074925E-01 -1.1591837302698120E-01 +-1.1580077309783895E-01 -1.1568345937676319E-01 -1.1556643172504541E-01 -1.1544969000183351E-01 -1.1533323406414064E-01 +-1.1521706376685041E-01 -1.1510117896272543E-01 -1.1498557950241366E-01 -1.1487026523445586E-01 -1.1475523600529140E-01 +-1.1464049165926754E-01 -1.1452603203864431E-01 -1.1441185698360255E-01 -1.1429796633225053E-01 -1.1418435992063157E-01 +-1.1407103758273004E-01 -1.1395799915047936E-01 -1.1384524445376779E-01 -1.1373277332044671E-01 -1.1362058557633638E-01 +-1.1350868104523373E-01 -1.1339705954891884E-01 -1.1328572090716169E-01 -1.1317466493772955E-01 -1.1306389145639394E-01 +-1.1295340027693661E-01 -1.1284319121115763E-01 -1.1273326406888105E-01 -1.1262361865796307E-01 -1.1251425478429762E-01 +-1.1240517225182409E-01 -1.1229637086253373E-01 -1.1218785041647676E-01 -1.1207961071176865E-01 -1.1197165154459786E-01 +-1.1186397270923142E-01 -1.1175657399802298E-01 -1.1164945520141860E-01 -1.1154261610796397E-01 -1.1143605650431132E-01 +-1.1132977617522595E-01 -1.1122377490359243E-01 -1.1111805247042232E-01 -1.1101260865486078E-01 -1.1090744323419230E-01 +-1.1080255598384869E-01 -1.1069794667741444E-01 -1.1059361508663494E-01 -1.1048956098142178E-01 -1.1038578412986012E-01 +-1.1028228429821556E-01 -1.1017906125094018E-01 -1.1007611475067913E-01 -1.0997344455827807E-01 -1.0987105043278969E-01 +-1.0976893213147910E-01 -1.0966708940983187E-01 -1.0956552202155967E-01 -1.0946422971860793E-01 -1.0936321225116104E-01 +-1.0926246936764997E-01 -1.0916200081475863E-01 -1.0906180633743026E-01 -1.0896188567887360E-01 -1.0886223858057023E-01 +-1.0876286478228084E-01 -1.0866376402205140E-01 -1.0856493603621997E-01 -1.0846638055942294E-01 -1.0836809732460209E-01 +-1.0827008606301058E-01 -1.0817234650421918E-01 -1.0807487837612376E-01 -1.0797768140495063E-01 -1.0788075531526371E-01 +-1.0778409982997056E-01 -1.0768771467032909E-01 -1.0759159955595375E-01 -1.0749575420482202E-01 -1.0740017833328139E-01 +-1.0730487165605451E-01 -1.0720983388624669E-01 -1.0711506473535214E-01 -1.0702056391325941E-01 -1.0692633112825904E-01 +-1.0683236608704910E-01 -1.0673866849474171E-01 -1.0664523805486952E-01 -1.0655207446939173E-01 -1.0645917743870105E-01 +-1.0636654666162901E-01 -1.0627418183545348E-01 -1.0618208265590361E-01 -1.0609024881716736E-01 -1.0599868001189709E-01 +-1.0590737593121578E-01 -1.0581633626472370E-01 -1.0572556070050450E-01 -1.0563504892513119E-01 -1.0554480062367258E-01 +-1.0545481547969957E-01 -1.0536509317529155E-01 -1.0527563339104182E-01 -1.0518643580606482E-01 -1.0509750009800174E-01 +-1.0500882594302646E-01 -1.0492041301585238E-01 -1.0483226098973800E-01 -1.0474436953649374E-01 -1.0465673832648703E-01 +-1.0456936702864994E-01 -1.0448225531048372E-01 -1.0439540283806588E-01 -1.0430880927605633E-01 -1.0422247428770313E-01 +-1.0413639753484835E-01 -1.0405057867793503E-01 -1.0396501737601251E-01 -1.0387971328674253E-01 -1.0379466606640589E-01 +-1.0370987536990763E-01 -1.0362534085078406E-01 -1.0354106216120790E-01 -1.0345703895199468E-01 -1.0337327087260900E-01 +-1.0328975757117045E-01 -1.0320649869445865E-01 -1.0312349388792101E-01 -1.0304074279567738E-01 -1.0295824506052634E-01 +-1.0287600032395124E-01 -1.0279400822612625E-01 -1.0271226840592235E-01 -1.0263078050091305E-01 -1.0254954414738005E-01 +-1.0246855898032003E-01 -1.0238782463345021E-01 -1.0230734073921328E-01 -1.0222710692878503E-01 -1.0214712283207883E-01 +-1.0206738807775236E-01 -1.0198790229321292E-01 -1.0190866510462349E-01 -1.0182967613690902E-01 -1.0175093501376140E-01 +-1.0167244135764646E-01 -1.0159419478980830E-01 -1.0151619493027671E-01 -1.0143844139787164E-01 -1.0136093381021016E-01 +-1.0128367178371109E-01 -1.0120665493360206E-01 -1.0112988287392397E-01 -1.0105335521753817E-01 -1.0097707157613101E-01 +-1.0090103156021986E-01 -1.0082523477915976E-01 -1.0074968084114776E-01 -1.0067436935322985E-01 -1.0059929992130606E-01 +-1.0052447215013641E-01 -1.0044988564334627E-01 -1.0037554000343259E-01 -1.0030143483176922E-01 -1.0022756972861270E-01 +-1.0015394429310776E-01 -1.0008055812329365E-01 -1.0000741081610866E-01 -9.9934501967396755E-02 -9.9861831171913273E-02 +-9.9789398023329215E-02 -9.9717202114238540E-02 -9.9645243036162984E-02 -9.9573520379557481E-02 -9.9502033733816067E-02 +-9.9430782687277980E-02 -9.9359766827231938E-02 -9.9288985739922744E-02 -9.9218439010556894E-02 -9.9148126223307306E-02 +-9.9078046961319804E-02 -9.9008200806718030E-02 -9.8938587340609535E-02 -9.8869206143090430E-02 -9.8800056793251864E-02 +-9.8731138869184915E-02 -9.8662451947986327E-02 -9.8593995605764151E-02 -9.8525769417642836E-02 -9.8457772957769085E-02 +-9.8390005799316838E-02 -9.8322467514493403E-02 -9.8255157674544458E-02 -9.8188075849759734E-02 -9.8121221609478032E-02 +-9.8054594522093044E-02 -9.7988194155058841E-02 -9.7922020074894922E-02 -9.7856071847191792E-02 -9.7790349036616694E-02 +-9.7724851206918220E-02 -9.7659577920932467E-02 -9.7594528740588132E-02 -9.7529703226911582E-02 -9.7465100940032662E-02 +-9.7400721439189916E-02 -9.7336564282735696E-02 -9.7272629028141683E-02 -9.7208915232004145E-02 -9.7145422450049368E-02 +-9.7082150237139078E-02 -9.7019098147275190E-02 -9.6956265733605676E-02 -9.6893652548429660E-02 -9.6831258143202606E-02 +-9.6769082068541623E-02 -9.6707123874230902E-02 -9.6645383109226657E-02 -9.6583859321662524E-02 -9.6522552058854724E-02 +-9.6461460867307849E-02 -9.6400585292718971E-02 -9.6339924879983968E-02 -9.6279479173201940E-02 -9.6219247715680800E-02 +-9.6159230049942451E-02 -9.6099425717727824E-02 -9.6039834260002149E-02 -9.5980455216959956E-02 -9.5921288128030552E-02 +-9.5862332531882671E-02 -9.5803587966430487E-02 -9.5745053968837479E-02 -9.5686730075522683E-02 -9.5628615822165391E-02 +-9.5570710743710111E-02 -9.5513014374371694E-02 -9.5455526247640712E-02 -9.5398245896288369E-02 -9.5341172852371550E-02 +-9.5284306647237971E-02 -9.5227646811531064E-02 -9.5171192875195113E-02 -9.5114944367480539E-02 -9.5058900816948483E-02 +-9.5003061751476339E-02 -9.4947426698262408E-02 -9.4891995183831013E-02 -9.4836766734037625E-02 -9.4781740874073622E-02 +-9.4726917128471325E-02 -9.4672295021109465E-02 -9.4617874075217157E-02 -9.4563653813380180E-02 -9.4509633757544689E-02 +-9.4455813429022872E-02 -9.4402192348497962E-02 -9.4348770036028359E-02 -9.4295546011053610E-02 -9.4242519792398893E-02 +-9.4189690898279319E-02 -9.4137058846306368E-02 -9.4084623153490907E-02 -9.4032383336249262E-02 -9.3980338910408412E-02 +-9.3928489391209152E-02 -9.3876834293313310E-02 -9.3825373130806300E-02 -9.3774105417203907E-02 -9.3723030665455689E-02 +-9.3672148387950849E-02 -9.3621458096522225E-02 -9.3570959302451726E-02 -9.3520651516474873E-02 -9.3470534248785611E-02 +-9.3420607009041007E-02 -9.3370869306366455E-02 -9.3321320649360023E-02 -9.3271960546097196E-02 -9.3222788504136025E-02 +-9.3173804030521598E-02 -9.3125006631790963E-02 -9.3076395813977600E-02 -9.3027971082616304E-02 -9.2979731942748278E-02 +-9.2931677898925119E-02 -9.2883808455213934E-02 -9.2836123115202257E-02 -9.2788621382002431E-02 -9.2741302758256192E-02 +-9.2694166746139728E-02 -9.2647212847368085E-02 -9.2600440563200007E-02 -9.2553849394442084E-02 -9.2507438841454390E-02 +-9.2461208404154213E-02 -9.2415157582020846E-02 -9.2369285874100912E-02 -9.2323592779011782E-02 -9.2278077794947330E-02 +-9.2232740419682102E-02 -9.2187580150575502E-02 -9.2142596484576816E-02 -9.2097788918229936E-02 -9.2053156947677919E-02 +-9.2008700068666793E-02 -9.1964417776551108E-02 -9.1920309566297570E-02 -9.1876374932490915E-02 -9.1832613369336610E-02 +-9.1789024370667105E-02 -9.1745607429945336E-02 -9.1702362040269464E-02 -9.1659287694377464E-02 -9.1616383884651750E-02 +-9.1573650103123336E-02 -9.1531085841476498E-02 -9.1488690591053204E-02 -9.1446463842857845E-02 -9.1404405087560994E-02 +-9.1362513815504837E-02 -9.1320789516707038E-02 -9.1279231680864728E-02 -9.1237839797359999E-02 -9.1196613355263578E-02 +-9.1155551843339469E-02 -9.1114654750049207E-02 -9.1073921563556509E-02 -9.1033351771731608E-02 -9.0992944862155214E-02 +-9.0952700322123686E-02 -9.0912617638652701E-02 -9.0872696298481798E-02 -9.0832935788078856E-02 -9.0793335593644553E-02 +-9.0753895201116527E-02 -9.0714614096173291E-02 -9.0675491764239530E-02 -9.0636527690489396E-02 -9.0597721359851807E-02 +-9.0559072257013679E-02 -9.0520579866425227E-02 -9.0482243672303411E-02 -9.0444063158636859E-02 -9.0406037809189904E-02 +-9.0368167107506642E-02 -9.0330450536915435E-02 -9.0292887580533082E-02 -9.0255477721269059E-02 -9.0218220441829644E-02 +-9.0181115224722858E-02 -9.0144161552261196E-02 -9.0107358906567472E-02 -9.0070706769577680E-02 -9.0034204623046232E-02 +-8.9997851948549798E-02 -8.9961648227490795E-02 -8.9925592941102847E-02 -8.9889685570453778E-02 -8.9853925596450515E-02 +-8.9818312499842762E-02 -8.9782845761227831E-02 -8.9747524861053696E-02 -8.9712349279624307E-02 -8.9677318497102795E-02 +-8.9642431993516056E-02 -8.9607689248758698E-02 -8.9573089742597353E-02 -8.9538632954674249E-02 -8.9504318364512309E-02 +-8.9470145451517685E-02 -8.9436113694985345E-02 -8.9402222574102450E-02 -8.9368471567952190E-02 -8.9334860155518434E-02 +-8.9301387815689123E-02 -8.9268054027260818E-02 -8.9234858268942507E-02 -8.9201800019359692E-02 -8.9168878757058298E-02 +-8.9136093960508742E-02 -8.9103445108109872E-02 -8.9070931678193271E-02 -8.9038553149026631E-02 -8.9006308998818118E-02 +-8.8974198705720570E-02 -8.8942221747835129E-02 -8.8910377603214977E-02 -8.8878665749869579E-02 -8.8847085665769057E-02 +-8.8815636828847133E-02 -8.8784318717005845E-02 -8.8753130808119168E-02 -8.8722072580037017E-02 -8.8691143510588627E-02 +-8.8660343077587800E-02 -8.8629670758834850E-02 -8.8599126032122291E-02 -8.8568708375237670E-02 -8.8538417265967673E-02 +-8.8508252182102273E-02 -8.8478212601437914E-02 -8.8448298001782055E-02 -8.8418507860956494E-02 -8.8388841656801789E-02 +-8.8359298867180469E-02 -8.8329878969980860E-02 -8.8300581443121529E-02 -8.8271405764554403E-02 -8.8242351412269146E-02 +-8.8213417864296081E-02 -8.8184604598710886E-02 -8.8155911093638240E-02 -8.8127336827254682E-02 -8.8098881277793611E-02 +-8.8070543923547989E-02 -8.8042324242875045E-02 -8.8014221714198912E-02 -8.7986235816015390E-02 -8.7958366026895177E-02 +-8.7930611825487212E-02 -8.7902972690523370E-02 -8.7875448100821082E-02 -8.7848037535287957E-02 -8.7820740472924499E-02 +-8.7793556392828931E-02 -8.7766484774199627E-02 -8.7739525096339976E-02 -8.7712676838660991E-02 -8.7685939480685801E-02 +-8.7659312502052403E-02 -8.7632795382518280E-02 -8.7606387601963195E-02 -8.7580088640393447E-02 -8.7553897977945008E-02 +-8.7527815094887162E-02 -8.7501839471626736E-02 -8.7475970588710622E-02 -8.7450207926830392E-02 -8.7424550966825040E-02 +-8.7398999189685300E-02 -8.7373552076556532E-02 -8.7348209108742469E-02 -8.7322969767709410E-02 -8.7297833535088659E-02 +-8.7272799892680802E-02 -8.7247868322459163E-02 -8.7223038306573158E-02 -8.7198309327351328E-02 -8.7173680867306494E-02 +-8.7149152409136788E-02 -8.7124723435731286E-02 -8.7100393430172549E-02 -8.7076161875740229E-02 -8.7052028255914238E-02 +-8.7027992054378514E-02 -8.7004052755024819E-02 -8.6980209841955786E-02 -8.6956462799487752E-02 -8.6932811112155728E-02 +-8.6909254264715005E-02 -8.6885791742146307E-02 -8.6862423029657548E-02 -8.6839147612688836E-02 -8.6815964976914406E-02 +-8.6792874608247361E-02 -8.6769875992841777E-02 -8.6746968617096923E-02 -8.6724151967660437E-02 -8.6701425531431495E-02 +-8.6678788795564538E-02 -8.6656241247471788E-02 -8.6633782374827828E-02 -8.6611411665572138E-02 -8.6589128607912097E-02 +-8.6566932690327142E-02 -8.6544823401571658E-02 -8.6522800230678196E-02 -8.6500862666960887E-02 -8.6479010200019024E-02 +-8.6457242319739253E-02 -8.6435558516300665E-02 -8.6413958280176006E-02 -8.6392441102136758E-02 -8.6371006473254977E-02 +-8.6349653884907687E-02 -8.6328382828779068E-02 -8.6307192796864413E-02 -8.6286083281473205E-02 -8.6265053775232192E-02 +-8.6244103771088459E-02 -8.6223232762313196E-02 -8.6202440242503925E-02 -8.6181725705589116E-02 -8.6161088645829706E-02 +-8.6140528557823601E-02 -8.6120044936508058E-02 -8.6099637277163368E-02 -8.6079305075415516E-02 -8.6059047827239832E-02 +-8.6038865028963407E-02 -8.6018756177269173E-02 -8.5998720769198275E-02 -8.5978758302153319E-02 -8.5958868273901909E-02 +-8.5939050182579205E-02 -8.5919303526691249E-02 -8.5899627805118159E-02 -8.5880022517117002E-02 -8.5860487162325111E-02 +-8.5841021240762677E-02 -8.5821624252836501E-02 -8.5802295699342251E-02 -8.5783035081468603E-02 -8.5763841900798665E-02 +-8.5744715659314935E-02 -8.5725655859400368E-02 -8.5706662003843109E-02 -8.5687733595838297E-02 -8.5668870138991771E-02 +-8.5650071137322731E-02 -8.5631336095266616E-02 -8.5612664517678433E-02 -8.5594055909835459E-02 -8.5575509777440564E-02 +-8.5557025626624567E-02 -8.5538602963949897E-02 -8.5520241296412572E-02 -8.5501940131446394E-02 -8.5483698976924746E-02 +-8.5465517341164352E-02 -8.5447394732927603E-02 -8.5429330661425606E-02 -8.5411324636321326E-02 -8.5393376167732363E-02 +-8.5375484766233620E-02 -8.5357649942860409E-02 -8.5339871209111379E-02 -8.5322148076951057E-02 -8.5304480058813248E-02 +-8.5286866667603128E-02 -8.5269307416700996E-02 -8.5251801819963988E-02 -8.5234349391730316E-02 -8.5216949646820958E-02 +-8.5199602100542629E-02 -8.5182306268690999E-02 -8.5165061667553332E-02 -8.5147867813911399E-02 -8.5130724225043711E-02 +-8.5113630418728936E-02 -8.5096585913248479E-02 -8.5079590227388951E-02 -8.5062642880445544E-02 -8.5045743392224038E-02 +-8.5028891283044153E-02 -8.5012086073741985E-02 -8.4995327285672773E-02 -8.4978614440713890E-02 -8.4961947061266738E-02 +-8.4945324670260669E-02 -8.4928746791154794E-02 -8.4912212947941088E-02 -8.4895722665146389E-02 -8.4879275467836315E-02 +-8.4862870881616925E-02 -8.4846508432637635E-02 -8.4830187647594008E-02 -8.4813908053730402E-02 -8.4797669178842516E-02 +-8.4781470551279908E-02 -8.4765311699949275E-02 -8.4749192154315631E-02 -8.4733111444406914E-02 -8.4717069100814987E-02 +-8.4701064654698802E-02 -8.4685097637787157E-02 -8.4669167582381188E-02 -8.4653274021356625E-02 -8.4637416488166875E-02 +-8.4621594516844992E-02 -8.4605807642007216E-02 -8.4590055398854058E-02 -8.4574337323174389E-02 -8.4558652951346944E-02 +-8.4543001820343133E-02 -8.4527383467729630E-02 -8.4511797431671060E-02 -8.4496243250932218E-02 -8.4480720464880449E-02 +-8.4465228613488583E-02 -8.4449767237337131E-02 -8.4434335877617062E-02 -8.4418934076131574E-02 -8.4403561375299335E-02 +-8.4388217318156600E-02 -8.4372901448359849E-02 -8.4357613310187596E-02 -8.4342352448544114E-02 -8.4327118408960330E-02 +-8.4311910737597362E-02 -8.4296728981248514E-02 -8.4281572687341502E-02 -8.4266441403941461E-02 -8.4251334679752807E-02 +-8.4236252064121692E-02 -8.4221193107038544E-02 -8.4206157359140416E-02 -8.4191144371713350E-02 -8.4176153696694483E-02 +-8.4161184886674789E-02 -8.4146237494901271E-02 -8.4131311075279172E-02 -8.4116405182374579E-02 -8.4101519371416300E-02 +-8.4086653198298694E-02 -8.4071806219583725E-02 -8.4056977992503196E-02 -8.4042168074961218E-02 -8.4027376025536352E-02 +-8.4012601403483891E-02 -8.3997843768738395E-02 -8.3983102681915681E-02 -8.3968377704314853E-02 -8.3953668397921413E-02 +-8.3938974325408672E-02 -8.3924295050140221E-02 -8.3909630136172211E-02 -8.3894979148255749E-02 -8.3880341651838566E-02 +-8.3865717213068319E-02 -8.3851105398793424E-02 -8.3836505776565998E-02 -8.3821917914644314E-02 -8.3807341381994138E-02 +-8.3792775748291998E-02 -8.3778220583926116E-02 -8.3763675459999534E-02 -8.3749139948331955E-02 -8.3734613621461812E-02 +-8.3720096052648366E-02 -8.3705586815874033E-02 -8.3691085485846195E-02 -8.3676591637999939E-02 -8.3662104848499397E-02 +-8.3647624694240350E-02 -8.3633150752852062E-02 -8.3618682602699682E-02 -8.3604219822886086E-02 -8.3589761993253769E-02 +-8.3575308694387285E-02 -8.3560859507615451E-02 -8.3546414015012574E-02 -8.3531971799401222E-02 -8.3517532444354517E-02 +-8.3503095534196964E-02 -8.3488660654007923E-02 -8.3474227389622319E-02 -8.3459795327633798E-02 -8.3445364055395890E-02 +-8.3430933161024415E-02 -8.3416502233399456E-02 -8.3402070862167110E-02 -8.3387638637741554E-02 -8.3373205151307292E-02 +-8.3358769994820711E-02 -8.3344332761012260E-02 -8.3329893043388475E-02 -8.3315450436233437E-02 -8.3301004534611464E-02 +-8.3286554934368387E-02 -8.3272101232133855E-02 -8.3257643025323014E-02 -8.3243179912138379E-02 -8.3228711491572072E-02 +-8.3214237363407217E-02 -8.3199757128220364E-02 -8.3185270387382867E-02 -8.3170776743063279E-02 -8.3156275798228277E-02 +-8.3141767156645882E-02 -8.3127250422886045E-02 -8.3112725202323282E-02 -8.3098191101137961E-02 -8.3083647726318724E-02 +-8.3069094685663633E-02 -8.3054531587782560E-02 -8.3039958042098586E-02 -8.3025373658850155E-02 -8.3010778049092307E-02 +-8.2996170824699261E-02 -8.2981551598365413E-02 -8.2966919983607529E-02 -8.2952275594766436E-02 -8.2937618047008527E-02 +-8.2922946956328236E-02 -8.2908261939548783E-02 -8.2893562614324554E-02 -8.2878848599142504E-02 -8.2864119513324355E-02 +-8.2849374977027823E-02 -8.2834614611248220E-02 -8.2819838037820726E-02 -8.2805044879421738E-02 -8.2790234759570272E-02 +-8.2775407302630208E-02 -8.2760562133811652E-02 -8.2745698879172311E-02 -8.2730817165620030E-02 -8.2715916620913293E-02 +-8.2700996873663807E-02 -8.2686057553337397E-02 -8.2671098290256470E-02 -8.2656118715600510E-02 -8.2641118461408952E-02 +-8.2626097160581849E-02 -8.2611054446881715E-02 -8.2595989954935292E-02 -8.2580903320234905E-02 -8.2565794179140062E-02 +-8.2550662168879615E-02 -8.2535506927551960E-02 -8.2520328094128154E-02 -8.2505125308452359E-02 -8.2489898211243681E-02 +-8.2474646444098174E-02 -8.2459369649489439E-02 -8.2444067470770974E-02 -8.2428739552177360E-02 -8.2413385538825643E-02 +-8.2398005076717046E-02 -8.2382597812738503E-02 -8.2367163394663434E-02 -8.2351701471154254E-02 -8.2336211691763597E-02 +-8.2320693706934789E-02 -8.2305147168004564E-02 -8.2289571727204067E-02 -8.2273967037659684E-02 -8.2258332753395780E-02 +-8.2242668529334664E-02 -8.2226974021298901E-02 -8.2211248886012597E-02 -8.2195492781102594E-02 -8.2179705365099873E-02 +-8.2163886297441591E-02 -8.2148035238470973E-02 -8.2132151849440324E-02 -8.2116235792511580E-02 -8.2100286730757380E-02 +-8.2084304328163368E-02 -8.2068288249628599E-02 -8.2052238160967308E-02 -8.2036153728910349E-02 -8.2020034621106006E-02 +-8.2003880506121882E-02 -8.1987691053445916E-02 -8.1971465933487822E-02 -8.1955204817580285E-02 -8.1938907377980055E-02 +-8.1922573287869532E-02 -8.1906202221358068E-02 -8.1889793853482731E-02 -8.1873347860210430E-02 -8.1856863918438105E-02 +-8.1840341705995218E-02 -8.1823780901643259E-02 -8.1807181185079000E-02 -8.1790542236934244E-02 -8.1773863738777569E-02 +-8.1757145373115431E-02 -8.1740386823393393E-02 -8.1723587773997533E-02 -8.1706747910255229E-02 -8.1689866918436535E-02 +-8.1672944485755239E-02 -8.1655980300370551E-02 -8.1638974051387411E-02 -8.1621925428858363E-02 -8.1604834123783929E-02 +-8.1587699828114771E-02 -8.1570522234751724E-02 -8.1553301037548070E-02 -8.1536035931309619E-02 -8.1518726611796030E-02 +-8.1501372775722572E-02 -8.1483974120760388E-02 -8.1466530345538288E-02 -8.1449041149642909E-02 -8.1431506233620776E-02 +-8.1413925298978868E-02 -8.1396298048185670E-02 -8.1378624184672260E-02 -8.1360903412833516E-02 -8.1343135438028680E-02 +-8.1325319966583057E-02 -8.1307456705788414E-02 -8.1289545363904578E-02 -8.1271585650159711E-02 -8.1253577274751923E-02 +-8.1235519948850171E-02 -8.1217413384595011E-02 -8.1199257295099539E-02 -8.1181051394450671E-02 -8.1162795397709972E-02 +-8.1144489020914437E-02 -8.1126131981077654E-02 -8.1107723996190553E-02 -8.1089264785222728E-02 -8.1070754068122641E-02 +-8.1052191565819304E-02 -8.1033577000222831E-02 -8.1014910094225179E-02 -8.0996190571701487E-02 -8.0977418157510431E-02 +-8.0958592577495644E-02 -8.0939713558486087E-02 -8.0920780828297512E-02 -8.0901794115732450E-02 -8.0882753150582243E-02 +-8.0863657663626395E-02 -8.0844507386635012E-02 -8.0825302052368458E-02 -8.0806041394578573E-02 -8.0786725148009747E-02 +-8.0767353048399160E-02 -8.0747924832478085E-02 -8.0728440237972543E-02 -8.0708899003604020E-02 -8.0689300869089875E-02 +-8.0669645575145277E-02 -8.0649932863482515E-02 -8.0630162476812803E-02 -8.0610334158846386E-02 -8.0590447654294073E-02 +-8.0570502708866815E-02 -8.0550499069277720E-02 -8.0530436483241610E-02 -8.0510314699476615E-02 -8.0490133467704311E-02 +-8.0469892538650972E-02 -8.0449591664047512E-02 -8.0429230596630846E-02 -8.0408809090144362E-02 -8.0388326899338364E-02 +-8.0367783779970919E-02 -8.0347179488808748E-02 -8.0326513783627554E-02 -8.0305786423212525E-02 -8.0284997167359526E-02 +-8.0264145776875018E-02 -8.0243232013577484E-02 -8.0222255640297502E-02 -8.0201216420878282E-02 -8.0180114120176449E-02 +-8.0158948504062910E-02 -8.0137719339423027E-02 -8.0116426394157281E-02 -8.0095069437181837E-02 -8.0073648238429357E-02 +-8.0052162568849422E-02 -8.0030612200408677E-02 -8.0008996906092186E-02 -7.9987316459902980E-02 -7.9965570636863423E-02 +-7.9943759213015608E-02 -7.9921881965421299E-02 -7.9899938672162898E-02 -7.9877929112344190E-02 -7.9855853066090124E-02 +-7.9833710314547834E-02 -7.9811500639886873E-02 -7.9789223825299918E-02 -7.9766879655003134E-02 -7.9744467914236339E-02 +-7.9721988389264170E-02 -7.9699440867375224E-02 -7.9676825136884177E-02 -7.9654140987130972E-02 -7.9631388208481577E-02 +-7.9608566592328608E-02 -7.9585675931091657E-02 -7.9562716018217128E-02 -7.9539686648179703E-02 -7.9516587616481699E-02 +-7.9493418719654138E-02 -7.9470179755256845E-02 -7.9446870521878418E-02 -7.9423490819137535E-02 -7.9400040447682368E-02 +-7.9376519209191587E-02 -7.9352926906374313E-02 -7.9329263342970399E-02 -7.9305528323751040E-02 -7.9281721654518938E-02 +-7.9257843142108722E-02 -7.9233892594386721E-02 -7.9209869820252479E-02 -7.9185774629637176E-02 -7.9161606833505802E-02 +-7.9137366243856144E-02 -7.9113052673719764E-02 -7.9088665937161906E-02 -7.9064205849281713E-02 -7.9039672226212512E-02 +-7.9015064885122541E-02 -7.8990383644214082E-02 -7.8965628322724912E-02 -7.8940798740927715E-02 -7.8915894720130580E-02 +-7.8890916082677121E-02 -7.8865862651946575E-02 -7.8840734252354230E-02 -7.8815530709351656E-02 -7.8790251849426063E-02 +-7.8764897500101960E-02 -7.8739467489939721E-02 -7.8713961648536807E-02 -7.8688379806527514E-02 -7.8662721795583104E-02 +-7.8636987448411924E-02 -7.8611176598759810E-02 -7.8585289081409590E-02 -7.8559324732181926E-02 -7.8533283387934846E-02 +-7.8507164886564271E-02 -7.8480969067003692E-02 -7.8454695769224397E-02 -7.8428344834235608E-02 -7.8401916104084743E-02 +-7.8375409421857084E-02 -7.8348824631675640E-02 -7.8322161578702296E-02 -7.8295420109136205E-02 -7.8268600070215674E-02 +-7.8241701310216197E-02 -7.8214723678452391E-02 -7.8187667025276450E-02 -7.8160531202078928E-02 -7.8133316061289176E-02 +-7.8106021456373756E-02 -7.8078647241838064E-02 -7.8051193273225711E-02 -7.8023659407117904E-02 -7.7996045501134509E-02 +-7.7968351413933101E-02 -7.7940577005209163E-02 -7.7912722135696319E-02 -7.7884786667165903E-02 -7.7856770462427075E-02 +-7.7828673385326577E-02 -7.7800495300748770E-02 -7.7772236074615420E-02 -7.7743895573885988E-02 -7.7715473666556845E-02 +-7.7686970221661752E-02 -7.7658385109271394E-02 -7.7629718200493122E-02 -7.7600969367471559E-02 -7.7572138483387496E-02 +-7.7543225422458423E-02 -7.7514230059937905E-02 -7.7485152272115818E-02 -7.7455991936317720E-02 -7.7426748930905467E-02 +-7.7397423135275853E-02 -7.7368014429861381E-02 -7.7338522696129772E-02 -7.7308947816583526E-02 -7.7279289674760193E-02 +-7.7249548155231301E-02 -7.7219723143603425E-02 -7.7189814526516423E-02 -7.7159822191644495E-02 -7.7129746027695331E-02 +-7.7099585924409658E-02 -7.7069341772561514E-02 -7.7039013463957640E-02 -7.7008600891437157E-02 -7.6978103948871307E-02 +-7.6947522531163631E-02 -7.6916856534248915E-02 -7.6886105855093367E-02 -7.6855270391694208E-02 -7.6824350043079193E-02 +-7.6793344709306571E-02 -7.6762254291464521E-02 -7.6731078691670909E-02 -7.6699817813072960E-02 -7.6668471559846560E-02 +-7.6637039837196760E-02 -7.6605522551356151E-02 -7.6573919609586052E-02 -7.6542230920174092E-02 -7.6510456392436171E-02 +-7.6478595936714105E-02 -7.6446649464376154E-02 -7.6414616887816561E-02 -7.6382498120454959E-02 -7.6350293076736159E-02 +-7.6318001672129321E-02 -7.6285623823127979E-02 -7.6253159447249225E-02 -7.6220608463033385E-02 -7.6187970790044052E-02 +-7.6155246348866515E-02 -7.6122435061108412E-02 -7.6089536849398592E-02 -7.6056551637386852E-02 -7.6023479349743392E-02 +-7.5990319912158336E-02 -7.5957073251341295E-02 -7.5923739295020831E-02 -7.5890317971943524E-02 -7.5856809211874474E-02 +-7.5823212945595492E-02 -7.5789529104905523E-02 -7.5755757622619685E-02 -7.5721898432568893E-02 -7.5687951469598752E-02 +-7.5653916669570137E-02 -7.5619793969357488E-02 -7.5585583306848600E-02 -7.5551284620944334E-02 -7.5516897851557852E-02 +-7.5482422939613575E-02 -7.5447859827047339E-02 -7.5413208456805450E-02 -7.5378468772843488E-02 -7.5343640720126823E-02 +-7.5308724244629033E-02 -7.5273719293331612E-02 -7.5238625814223678E-02 -7.5203443756300545E-02 -7.5168173069563554E-02 +-7.5132813705019466E-02 -7.5097365614679598E-02 -7.5061828751559229E-02 -7.5026203069676736E-02 -7.4990488524053323E-02 +-7.4954685070711860E-02 -7.4918792666676379E-02 -7.4882811269971525E-02 -7.4846740839621298E-02 -7.4810581335649107E-02 +-7.4774332719076464E-02 -7.4737994951922487E-02 -7.4701567997202789E-02 -7.4665051818929323E-02 -7.4628446382109345E-02 +-7.4591751652744329E-02 -7.4554967597829730E-02 -7.4518094185353850E-02 -7.4481131384297128E-02 -7.4444079164631777E-02 +-7.4406937497320080E-02 -7.4369706354314294E-02 -7.4332385708555951E-02 -7.4294975533974100E-02 -7.4257475805485779E-02 +-7.4219886498994220E-02 -7.4182207591388452E-02 -7.4144439060542078E-02 -7.4106580885312842E-02 -7.4068633045541871E-02 +-7.4030595522052281E-02 -7.3992468296648517E-02 -7.3954251352115766E-02 -7.3915944672218611E-02 -7.3877548241700744E-02 +-7.3839062046283335E-02 -7.3800486072664734E-02 -7.3761820308519285E-02 -7.3723064742496555E-02 -7.3684219364220260E-02 +-7.3645284164287367E-02 -7.3606259134267174E-02 -7.3567144266700635E-02 -7.3527939555099120E-02 -7.3488644993943211E-02 +-7.3449260578682452E-02 -7.3409786305734026E-02 -7.3370222172481167E-02 -7.3330568177273528E-02 -7.3290824319425019E-02 +-7.3250990599213084E-02 -7.3211067017878481E-02 -7.3171053577623282E-02 -7.3130950281610124E-02 -7.3090757133961237E-02 +-7.3050474139758112E-02 -7.3010101305039307E-02 -7.2969638636800130E-02 -7.2929086142991484E-02 -7.2888443832518829E-02 +-7.2847711715240959E-02 -7.2806889801969213E-02 -7.2765978104466111E-02 -7.2724976635444402E-02 -7.2683885408566545E-02 +-7.2642704438442340E-02 -7.2601433740629287E-02 -7.2560073331630212E-02 -7.2518623228893270E-02 -7.2477083450810192E-02 +-7.2435454016715167E-02 -7.2393734946884072E-02 -7.2351926262532965E-02 -7.2310027985817329E-02 -7.2268040139830445E-02 +-7.2225962748603101E-02 -7.2183795837101217E-02 -7.2141539431226018E-02 -7.2099193557811581E-02 -7.2056758244624708E-02 +-7.2014233520363291E-02 -7.1971619414655144E-02 -7.1928915958056852E-02 -7.1886123182052647E-02 -7.1843241119053117E-02 +-7.1800269802393846E-02 -7.1757209266334970E-02 -7.1714059546058639E-02 -7.1670820677669167E-02 -7.1627492698190798E-02 +-7.1584075645567069E-02 -7.1540569558659214E-02 -7.1496974477245248E-02 -7.1453290442018383E-02 -7.1409517494585933E-02 +-7.1365655677468054E-02 -7.1321705034096530E-02 -7.1277665608813420E-02 -7.1233537446869569E-02 -7.1189320594423927E-02 +-7.1145015098541486E-02 -7.1100621007192638E-02 -7.1056138369251426E-02 -7.1011567234494602E-02 -7.0966907653599934E-02 +-7.0922159678145080E-02 -7.0877323360606190E-02 -7.0832398754356984E-02 -7.0787385913666803E-02 -7.0742284893699256E-02 +-7.0697095750511627E-02 -7.0651818541052944E-02 -7.0606453323162302E-02 -7.0561000155568307E-02 -7.0515459097887173E-02 +-7.0469830210621406E-02 -7.0424113555158485E-02 -7.0378309193769695E-02 -7.0332417189608157E-02 -7.0286437606707802E-02 +-7.0240370509982400E-02 -7.0194215965222989E-02 -7.0147974039097588E-02 -7.0101644799149238E-02 -7.0055228313794862E-02 +-7.0008724652323329E-02 -6.9962133884894279E-02 -6.9915456082537103E-02 -6.9868691317148651E-02 -6.9821839661492718E-02 +-6.9774901189197810E-02 -6.9727875974755757E-02 -6.9680764093520892E-02 -6.9633565621707832E-02 -6.9586280636390552E-02 +-6.9538909215500211E-02 -6.9491451437824467E-02 -6.9443907383005196E-02 -6.9396277131537912E-02 -6.9348560764769251E-02 +-6.9300758364896062E-02 -6.9252870014963802E-02 -6.9204895798864866E-02 -6.9156835801337205E-02 -6.9108690107962695E-02 +-6.9060458805165606E-02 -6.9012141980211064E-02 -6.8963739721203385E-02 -6.8915252117084935E-02 -6.8866679257633803E-02 +-6.8818021233463283E-02 -6.8769278136018977E-02 -6.8720450057578708E-02 -6.8671537091249277E-02 -6.8622539330966723E-02 +-6.8573456871492952E-02 -6.8524289808415309E-02 -6.8475038238144659E-02 -6.8425702257913543E-02 -6.8376281965774791E-02 +-6.8326777460599786E-02 -6.8277188842077133E-02 -6.8227516210710534E-02 -6.8177759667817528E-02 -6.8127919315527627E-02 +-6.8077995256780877E-02 -6.8027987595325967E-02 -6.7977896435718665E-02 -6.7927721883320441E-02 -6.7877464044296357E-02 +-6.7827123025613376E-02 -6.7776698935039376E-02 -6.7726191881140554E-02 -6.7675601973280319E-02 -6.7624929321617538E-02 +-6.7574174037104293E-02 -6.7523336231485126E-02 -6.7472416017294756E-02 -6.7421413507856104E-02 -6.7370328817279196E-02 +-6.7319162060458917E-02 -6.7267913353073930E-02 -6.7216582811584116E-02 -6.7165170553229361E-02 -6.7113676696027594E-02 +-6.7062101358773427E-02 -6.7010444661035951E-02 -6.6958706723157124E-02 -6.6906887666249928E-02 -6.6854987612196978E-02 +-6.6803006683648303E-02 -6.6750945004019735E-02 -6.6698802697491108E-02 -6.6646579889004645E-02 -6.6594276704262712E-02 +-6.6541893269726982E-02 -6.6489429712615095E-02 -6.6436886160900335E-02 -6.6384262743309302E-02 -6.6331559589319536E-02 +-6.6278776829158614E-02 -6.6225914593801657E-02 -6.6172973014969827E-02 -6.6119952225128453E-02 -6.6066852357485092E-02 +-6.6013673545987778E-02 -6.5960415925323104E-02 -6.5907079630914439E-02 -6.5853664798920117E-02 -6.5800171566231219E-02 +-6.5746600070470410E-02 -6.5692950449989448E-02 -6.5639222843867362E-02 -6.5585417391908901E-02 -6.5531534234642599E-02 +-6.5477573513318427E-02 -6.5423535369906652E-02 -6.5369419947095109E-02 -6.5315227388288211E-02 -6.5260957837604022E-02 +-6.5206611439873344E-02 -6.5152188340637060E-02 -6.5097688686144600E-02 -6.5043112623351926E-02 -6.4988460299919670E-02 +-6.4933731864210947E-02 -6.4878927465289726E-02 -6.4824047252918918E-02 -6.4769091377557986E-02 -6.4714059990361561E-02 +-6.4658953243177067E-02 -6.4603771288542985E-02 -6.4548514279686872E-02 -6.4493182370523441E-02 -6.4437775715652290E-02 +-6.4382294470356372E-02 -6.4326738790599594E-02 -6.4271108833025198E-02 -6.4215404754953728E-02 -6.4159626714380621E-02 +-6.4103774869974914E-02 -6.4047849381076577E-02 -6.3991850407694770E-02 -6.3935778110506200E-02 -6.3879632650852447E-02 +-6.3823414190738531E-02 -6.3767122892830458E-02 -6.3710758920453456E-02 -6.3654322437589922E-02 -6.3597813608877438E-02 +-6.3541232599606548E-02 -6.3484579575718875E-02 -6.3427854703804867E-02 -6.3371058151102305E-02 -6.3314190085493591E-02 +-6.3257250675504056E-02 -6.3200240090299856E-02 -6.3143158499686006E-02 -6.3086006074103904E-02 -6.3028782984629897E-02 +-6.2971489402972647E-02 -6.2914125501471366E-02 -6.2856691453093708E-02 -6.2799187431433728E-02 -6.2741613610709401E-02 +-6.2683970165761174E-02 -6.2626257272049304E-02 -6.2568475105652277E-02 -6.2510623843264057E-02 -6.2452703662192854E-02 +-6.2394714740358195E-02 -6.2336657256288987E-02 -6.2278531389122108E-02 -6.2220337318599196E-02 -6.2162075225065436E-02 +-6.2103745289466869E-02 -6.2045347693348685E-02 -6.1986882618852726E-02 -6.1928350248715493E-02 -6.1869750766266191E-02 +-6.1811084355424213E-02 -6.1752351200697331E-02 -6.1693551487179470E-02 -6.1634685400548284E-02 -6.1575753127063641E-02 +-6.1516754853564712E-02 -6.1457690767468084E-02 -6.1398561056766013E-02 -6.1339365910023667E-02 -6.1280105516377185E-02 +-6.1220780065531763E-02 -6.1161389747758928E-02 -6.1101934753894714E-02 -6.1042415275337727E-02 -6.0982831504046181E-02 +-6.0923183632536716E-02 -6.0863471853881010E-02 -6.0803696361705011E-02 -6.0743857350185351E-02 -6.0683955014048163E-02 +-6.0623989548566258E-02 -6.0563961149557151E-02 -6.0503870013381089E-02 -6.0443716336938402E-02 -6.0383500317667267E-02 +-6.0323222153542098E-02 -6.0262882043070801E-02 -6.0202480185292451E-02 -6.0142016779775549E-02 -6.0081492026615363E-02 +-6.0020906126431905E-02 -5.9960259280367759E-02 -5.9899551690085449E-02 -5.9838783557765778E-02 -5.9777955086105221E-02 +-5.9717066478313402E-02 -5.9656117938111555E-02 -5.9595109669729959E-02 -5.9534041877905224E-02 -5.9472914767878735E-02 +-5.9411728545393866E-02 -5.9350483416694196E-02 -5.9289179588520736E-02 -5.9227817268109981E-02 -5.9166396663191637E-02 +-5.9104917981986103E-02 -5.9043381433202591E-02 -5.8981787226036336E-02 -5.8920135570166794E-02 -5.8858426675755200E-02 +-5.8796660753441851E-02 -5.8734838014344724E-02 -5.8672958670056320E-02 -5.8611022932641671E-02 -5.8549031014636557E-02 +-5.8486983129044122E-02 -5.8424879489333545E-02 -5.8362720309437295E-02 -5.8300505803748771E-02 -5.8238236187120401E-02 +-5.8175911674860852E-02 -5.8113532482733044E-02 -5.8051098826951579E-02 -5.7988610924180624E-02 -5.7926068991531590E-02 +-5.7863473246560597E-02 -5.7800823907266367E-02 -5.7738121192087967E-02 -5.7675365319902153E-02 -5.7612556510021187E-02 +-5.7549694982190869E-02 -5.7486780956587512E-02 -5.7423814653816165E-02 -5.7360796294907979E-02 -5.7297726101318197E-02 +-5.7234604294923129E-02 -5.7171431098018907E-02 -5.7108206733317846E-02 -5.7044931423947121E-02 -5.6981605393446016E-02 +-5.6918228865763351E-02 -5.6854802065255727E-02 -5.6791325216684480E-02 -5.6727798545213801E-02 -5.6664222276408424E-02 +-5.6600596636230592E-02 -5.6536921851038716E-02 -5.6473198147583913E-02 -5.6409425753008793E-02 -5.6345604894843859E-02 +-5.6281735801006358E-02 -5.6217818699796827E-02 -5.6153853819897487E-02 -5.6089841390369592E-02 -5.6025781640650953E-02 +-5.5961674800553557E-02 -5.5897521100261589E-02 -5.5833320770328529E-02 -5.5769074041674860E-02 -5.5704781145586080E-02 +-5.5640442313710008E-02 -5.5576057778054230E-02 -5.5511627770984118E-02 -5.5447152525220103E-02 -5.5382632273835677E-02 +-5.5318067250254212E-02 -5.5253457688247479E-02 -5.5188803821932954E-02 -5.5124105885771116E-02 -5.5059364114563164E-02 +-5.4994578743448867E-02 -5.4929750007904142E-02 -5.4864878143738152E-02 -5.4799963387091671E-02 -5.4735005974433940E-02 +-5.4670006142560811E-02 -5.4604964128592004E-02 -5.4539880169968920E-02 -5.4474754504451946E-02 -5.4409587370118459E-02 +-5.4344379005359905E-02 -5.4279129648880049E-02 -5.4213839539691770E-02 -5.4148508917115278E-02 -5.4083138020775377E-02 +-5.4017727090599113E-02 -5.3952276366813545E-02 -5.3886786089943017E-02 -5.3821256500806894E-02 -5.3755687840517180E-02 +-5.3690080350476038E-02 -5.3624434272373171E-02 -5.3558749848184019E-02 -5.3493027320166489E-02 -5.3427266930859231E-02 +-5.3361468923078886E-02 -5.3295633539917592E-02 -5.3229761024740752E-02 -5.3163851621184588E-02 -5.3097905573153477E-02 +-5.3031923124817949E-02 -5.2965904520611694E-02 -5.2899850005229780E-02 -5.2833759823625565E-02 -5.2767634221008927E-02 +-5.2701473442842969E-02 -5.2635277734842667E-02 -5.2569047342971457E-02 -5.2502782513439490E-02 -5.2436483492700747E-02 +-5.2370150527450809E-02 -5.2303783864624476E-02 -5.2237383751393127E-02 -5.2170950435162337E-02 -5.2104484163569754E-02 +-5.2037985184482195E-02 -5.1971453745993490E-02 -5.1904890096422095E-02 -5.1838294484308184E-02 -5.1771667158411992E-02 +-5.1705008367710581E-02 -5.1638318361396096E-02 -5.1571597388872570E-02 -5.1504845699754415E-02 -5.1438063543863100E-02 +-5.1371251171225082E-02 -5.1304408832069645E-02 -5.1237536776826034E-02 -5.1170635256121040E-02 -5.1103704520776734E-02 +-5.1036744821808235E-02 -5.0969756410420654E-02 -5.0902739538007259E-02 -5.0835694456146489E-02 -5.0768621416600233E-02 +-5.0701520671310632E-02 -5.0634392472397989E-02 -5.0567237072158586E-02 -5.0500054723061537E-02 -5.0432845677747161E-02 +-5.0365610189023982E-02 -5.0298348509866510E-02 -5.0231060893412706E-02 -5.0163747592961730E-02 -5.0096408861971170E-02 +-5.0029044954054858E-02 -4.9961656122980591E-02 -4.9894242622667076E-02 -4.9826804707182391E-02 -4.9759342630740472E-02 +-4.9691856647699699E-02 -4.9624347012559876E-02 -4.9556813979959806E-02 -4.9489257804675196E-02 -4.9421678741615870E-02 +-4.9354077045823348E-02 -4.9286452972468933E-02 -4.9218806776850463E-02 -4.9151138714390384E-02 -4.9083449040633324E-02 +-4.9015738011243662E-02 -4.8948005882002640E-02 -4.8880252908806529E-02 -4.8812479347664035E-02 -4.8744685454693598E-02 +-4.8676871486121105E-02 -4.8609037698277895E-02 -4.8541184347597535E-02 -4.8473311690613946E-02 -4.8405419983958912E-02 +-4.8337509484359428E-02 -4.8269580448635628E-02 -4.8201633133697956E-02 -4.8133667796545029E-02 -4.8065684694261257E-02 +-4.7997684084014045E-02 -4.7929666223051844E-02 -4.7861631368701398E-02 -4.7793579778365437E-02 -4.7725511709520475E-02 +-4.7657427419713828E-02 -4.7589327166561925E-02 -4.7521211207747091E-02 -4.7453079801015999E-02 -4.7384933204176589E-02 +-4.7316771675096014E-02 -4.7248595471697991E-02 -4.7180404851960601E-02 -4.7112200073913681E-02 -4.7043981395636765E-02 +-4.6975749075256104E-02 -4.6907503370942960E-02 -4.6839244540910589E-02 -4.6770972843412223E-02 -4.6702688536738472E-02 +-4.6634391879215038E-02 -4.6566083129200422E-02 -4.6497762545083067E-02 -4.6429430385279559E-02 -4.6361086908231847E-02 +-4.6292732372404860E-02 -4.6224367036284519E-02 -4.6155991158374730E-02 -4.6087604997195532E-02 -4.6019208811280368E-02 +-4.5950802859174071E-02 -4.5882387399429750E-02 -4.5813962690607425E-02 -4.5745528991270684E-02 -4.5677086559985189E-02 +-4.5608635655315671E-02 -4.5540176535823443E-02 -4.5471709460064812E-02 -4.5403234686587808E-02 -4.5334752473930588E-02 +-4.5266263080618596E-02 -4.5197766765162024E-02 -4.5129263786054134E-02 -4.5060754401768287E-02 -4.4992238870755770E-02 +-4.4923717451443822E-02 -4.4855190402232396E-02 -4.4786657981492631E-02 -4.4718120447564222E-02 -4.4649578058752880E-02 +-4.4581031073328239E-02 -4.4512479749521563E-02 -4.4443924345522953E-02 -4.4375365119479530E-02 -4.4306802329492780E-02 +-4.4238236233616487E-02 -4.4169667089854023E-02 -4.4101095156156310E-02 -4.4032520690419255E-02 -4.3963943950481789E-02 +-4.3895365194123098E-02 -4.3826784679060642E-02 -4.3758202662947721E-02 -4.3689619403370988E-02 -4.3621035157848369E-02 +-4.3552450183826655E-02 -4.3483864738679136E-02 -4.3415279079703481E-02 -4.3346693464118957E-02 -4.3278108149064916E-02 +-4.3209523391597615E-02 -4.3140939448688687E-02 -4.3072356577222068E-02 -4.3003775033992483E-02 -4.2935195075702613E-02 +-4.2866616958961032E-02 -4.2798040940279787E-02 -4.2729467276072221E-02 -4.2660896222650582E-02 -4.2592328036224050E-02 +-4.2523762972895882E-02 -4.2455201288661808E-02 -4.2386643239407003E-02 -4.2318089080904703E-02 -4.2249539068813131E-02 +-4.2180993458673703E-02 -4.2112452505908581E-02 -4.2043916465818364E-02 -4.1975385593580279E-02 -4.1906860144245203E-02 +-4.1838340372735879E-02 -4.1769826533844708E-02 -4.1701318882231130E-02 -4.1632817672419963E-02 -4.1564323158798329E-02 +-4.1495835595614268E-02 -4.1427355236974120E-02 -4.1358882336840208E-02 -4.1290417149028660E-02 -4.1221959927207334E-02 +-4.1153510924893541E-02 -4.1085070395451673E-02 -4.1016638592091072E-02 -4.0948215767864019E-02 -4.0879802175663116E-02 +-4.0811398068219450E-02 -4.0743003698100196E-02 -4.0674619317706516E-02 -4.0606245179271250E-02 -4.0537881534856816E-02 +-4.0469528636352989E-02 -4.0401186735474562E-02 -4.0332856083759652E-02 -4.0264536932566722E-02 -4.0196229533073266E-02 +-4.0127934136272927E-02 -4.0059650992973803E-02 -3.9991380353795999E-02 -3.9923122469169584E-02 -3.9854877589332413E-02 +-3.9786645964327932E-02 -3.9718427844003160E-02 -3.9650223478006105E-02 -3.9582033115784468E-02 -3.9513857006582449E-02 +-3.9445695399439547E-02 -3.9377548543187611E-02 -3.9309416686449390E-02 -3.9241300077636036E-02 -3.9173198964945061E-02 +-3.9105113596358064E-02 -3.9037044219639022E-02 -3.8968991082331650E-02 -3.8900954431757583E-02 -3.8832934515014454E-02 +-3.8764931578973268E-02 -3.8696945870276875E-02 -3.8628977635337264E-02 -3.8561027120334122E-02 -3.8493094571212264E-02 +-3.8425180233679718E-02 -3.8357284353205727E-02 -3.8289407175018379E-02 -3.8221548944102818E-02 -3.8153709905199257E-02 +-3.8085890302800511E-02 -3.8018090381150310E-02 -3.7950310384240932E-02 -3.7882550555811467E-02 -3.7814811139345636E-02 +-3.7747092378069419E-02 -3.7679394514949664E-02 -3.7611717792691464E-02 -3.7544062453736572E-02 -3.7476428740260907E-02 +-3.7408816894172955E-02 -3.7341227157111342E-02 -3.7273659770443404E-02 -3.7206114975262466E-02 -3.7138593012386291E-02 +-3.7071094122354958E-02 -3.7003618545428912E-02 -3.6936166521586801E-02 -3.6868738290523673E-02 -3.6801334091648916E-02 +-3.6733954164084127E-02 -3.6666598746661470E-02 -3.6599268077921410E-02 -3.6531962396110819E-02 -3.6464681939180975E-02 +-3.6397426944785781E-02 -3.6330197650279533E-02 -3.6262994292715234E-02 -3.6195817108842267E-02 -3.6128666335105093E-02 +-3.6061542207640539E-02 -3.5994444962276433E-02 -3.5927374834529388E-02 -3.5860332059603053E-02 -3.5793316872385961E-02 +-3.5726329507449903E-02 -3.5659370199047843E-02 -3.5592439181111817E-02 -3.5525536687251461E-02 -3.5458662950751819E-02 +-3.5391818204571407E-02 -3.5325002681340645E-02 -3.5258216613359622E-02 -3.5191460232596262E-02 -3.5124733770684799E-02 +-3.5058037458923268E-02 -3.4991371528272412E-02 -3.4924736209353026E-02 -3.4858131732444807E-02 -3.4791558327483992E-02 +-3.4725016224061746E-02 -3.4658505651422367E-02 -3.4592026838461153E-02 -3.4525580013722995E-02 -3.4459165405400137E-02 +-3.4392783241330716E-02 -3.4326433748996500E-02 -3.4260117155521679E-02 -3.4193833687670358E-02 -3.4127583571845345E-02 +-3.4061367034086076E-02 -3.3995184300066844E-02 -3.3929035595094886E-02 -3.3862921144109041E-02 -3.3796841171677382E-02 +-3.3730795901995826E-02 -3.3664785558886377E-02 -3.3598810365795019E-02 -3.3532870545790357E-02 -3.3466966321561716E-02 +-3.3401097915417177E-02 -3.3335265549282241E-02 -3.3269469444697740E-02 -3.3203709822818325E-02 -3.3137986904410638E-02 +-3.3072300909851512E-02 -3.3006652059126396E-02 -3.2941040571827611E-02 -3.2875466667152735E-02 -3.2809930563902488E-02 +-3.2744432480479604E-02 -3.2678972634886748E-02 -3.2613551244725016E-02 -3.2548168527192098E-02 -3.2482824699080856E-02 +-3.2417519976777297E-02 -3.2352254576259169E-02 -3.2287028713094322E-02 -3.2221842602438891E-02 -3.2156696459035704E-02 +-3.2091590497212837E-02 -3.2026524930881463E-02 -3.1961499973534847E-02 -3.1896515838246348E-02 -3.1831572737667797E-02 +-3.1766670884027993E-02 -3.1701810489131232E-02 -3.1636991764355325E-02 -3.1572214920650182E-02 -3.1507480168536370E-02 +-3.1442787718103452E-02 -3.1378137779008157E-02 -3.1313530560473077E-02 -3.1248966271285074E-02 -3.1184445119793576E-02 +-3.1119967313909112E-02 -3.1055533061101842E-02 -3.0991142568399618E-02 -3.0926796042387152E-02 -3.0862493689203643E-02 +-3.0798235714542026E-02 -3.0734022323646751E-02 -3.0669853721312815E-02 -3.0605730111883913E-02 -3.0541651699251115E-02 +-3.0477618686851227E-02 -3.0413631277665425E-02 -3.0349689674217573E-02 -3.0285794078572913E-02 -3.0221944692336699E-02 +-3.0158141716652213E-02 -3.0094385352200045E-02 -3.0030675799195806E-02 -2.9967013257389426E-02 -2.9903397926063235E-02 +-2.9839830004030673E-02 -2.9776309689634774E-02 -2.9712837180746868E-02 -2.9649412674765060E-02 -2.9586036368612845E-02 +-2.9522708458737501E-02 -2.9459429141109158E-02 -2.9396198611218949E-02 -2.9333017064077656E-02 -2.9269884694214571E-02 +-2.9206801695675900E-02 -2.9143768262023424E-02 -2.9080784586333227E-02 -2.9017850861194176E-02 -2.8954967278706688E-02 +-2.8892134030481208E-02 -2.8829351307637183E-02 -2.8766619300801346E-02 -2.8703938200106666E-02 -2.8641308195190750E-02 +-2.8578729475194818E-02 -2.8516202228762194E-02 -2.8453726644037045E-02 -2.8391302908662985E-02 -2.8328931209782009E-02 +-2.8266611734032967E-02 -2.8204344667550309E-02 -2.8142130195963046E-02 -2.8079968504393066E-02 -2.8017859777454260E-02 +-2.7955804199251089E-02 -2.7893801953377172E-02 -2.7831853222914326E-02 -2.7769958190431234E-02 -2.7708117037982059E-02 +-2.7646329947105339E-02 -2.7584597098822890E-02 -2.7522918673638298E-02 -2.7461294851535818E-02 -2.7399725811979483E-02 +-2.7338211733911280E-02 -2.7276752795750557E-02 -2.7215349175392509E-02 -2.7154001050207127E-02 -2.7092708597037898E-02 +-2.7031471992200785E-02 -2.6970291411483039E-02 -2.6909167030141921E-02 -2.6848099022903624E-02 -2.6787087563962350E-02 +-2.6726132826978770E-02 -2.6665234985079216E-02 -2.6604394210854448E-02 -2.6543610676358492E-02 -2.6482884553107572E-02 +-2.6422216012079145E-02 -2.6361605223710512E-02 -2.6301052357898060E-02 -2.6240557583995950E-02 -2.6180121070815021E-02 +-2.6119742986622001E-02 -2.6059423499138049E-02 -2.5999162775538105E-02 -2.5938960982449473E-02 -2.5878818285951021E-02 +-2.5818734851572128E-02 -2.5758710844291492E-02 -2.5698746428536284E-02 -2.5638841768180997E-02 -2.5578997026546629E-02 +-2.5519212366399466E-02 -2.5459487949950066E-02 -2.5399823938852598E-02 -2.5340220494203532E-02 -2.5280677776540708E-02 +-2.5221195945842496E-02 -2.5161775161526807E-02 -2.5102415582450004E-02 -2.5043117366906099E-02 -2.4983880672625716E-02 +-2.4924705656775285E-02 -2.4865592475955902E-02 -2.4806541286202580E-02 -2.4747552242983313E-02 -2.4688625501198130E-02 +-2.4629761215178122E-02 -2.4570959538684652E-02 -2.4512220624908505E-02 -2.4453544626468871E-02 -2.4394931695412566E-02 +-2.4336381983213039E-02 -2.4277895640769806E-02 -2.4219472818407247E-02 -2.4161113665873854E-02 -2.4102818332341555E-02 +-2.4044586966404796E-02 -2.3986419716079514E-02 -2.3928316728802624E-02 -2.3870278151431060E-02 -2.3812304130240915E-02 +-2.3754394810926664E-02 -2.3696550338600603E-02 -2.3638770857791664E-02 -2.3581056512444843E-02 -2.3523407445920609E-02 +-2.3465823800993667E-02 -2.3408305719852775E-02 -2.3350853344099469E-02 -2.3293466814747678E-02 -2.3236146272222806E-02 +-2.3178891856361086E-02 -2.3121703706408762E-02 -2.3064581961021451E-02 -2.3007526758263397E-02 -2.2950538235606846E-02 +-2.2893616529931153E-02 -2.2836761777522366E-02 -2.2779974114072277E-02 -2.2723253674677892E-02 -2.2666600593840843E-02 +-2.2610015005466451E-02 -2.2553497042863357E-02 -2.2497046838742679E-02 -2.2440664525217455E-02 -2.2384350233802110E-02 +-2.2328104095411506E-02 -2.2271926240360767E-02 -2.2215816798364200E-02 -2.2159775898535079E-02 -2.2103803669384803E-02 +-2.2047900238822450E-02 -2.1992065734154045E-02 -2.1936300282082134E-02 -2.1880604008705055E-02 -2.1824977039516524E-02 +-2.1769419499404932E-02 -2.1713931512653013E-02 -2.1658513202936963E-02 -2.1603164693326266E-02 -2.1547886106282915E-02 +-2.1492677563660995E-02 -2.1437539186706062E-02 -2.1382471096054758E-02 -2.1327473411734372E-02 -2.1272546253162099E-02 +-2.1217689739144684E-02 -2.1162903987877985E-02 -2.1108189116946532E-02 -2.1053545243322810E-02 -2.0998972483367153E-02 +-2.0944470952827029E-02 -2.0890040766836617E-02 -2.0835682039916554E-02 -2.0781394885973307E-02 -2.0727179418298734E-02 +-2.0673035749569964E-02 -2.0618963991848611E-02 -2.0564964256580505E-02 -2.0511036654595454E-02 -2.0457181296106585E-02 +-2.0403398290710160E-02 -2.0349687747385142E-02 -2.0296049774492859E-02 -2.0242484479776460E-02 -2.0188991970360753E-02 +-2.0135572352751954E-02 -2.0082225732837029E-02 -2.0028952215883612E-02 -1.9975751906539479E-02 -1.9922624908832540E-02 +-1.9869571326170142E-02 -1.9816591261339039E-02 -1.9763684816505041E-02 -1.9710852093212595E-02 -1.9658093192384658E-02 +-1.9605408214322328E-02 -1.9552797258704589E-02 -1.9500260424588068E-02 -1.9447797810406738E-02 -1.9395409513971781E-02 +-1.9343095632471108E-02 -1.9290856262469475E-02 -1.9238691499907857E-02 -1.9186601440103566E-02 -1.9134586177749803E-02 +-1.9082645806915592E-02 -1.9030780421045522E-02 -1.8978990112959563E-02 -1.8927274974852807E-02 -1.8875635098295492E-02 +-1.8824070574232549E-02 -1.8772581492983730E-02 -1.8721167944243132E-02 -1.8669830017079336E-02 -1.8618567799935166E-02 +-1.8567381380627350E-02 -1.8516270846346747E-02 -1.8465236283657930E-02 -1.8414277778499296E-02 -1.8363395416182714E-02 +-1.8312589281393551E-02 -1.8261859458190727E-02 -1.8211206030006286E-02 -1.8160629079645628E-02 -1.8110128689287179E-02 +-1.8059704940482573E-02 -1.8009357914156403E-02 -1.7959087690606272E-02 -1.7908894349502647E-02 -1.7858777969888891E-02 +-1.7808738630181276E-02 -1.7758776408168822E-02 -1.7708891381013340E-02 -1.7659083625249532E-02 -1.7609353216784755E-02 +-1.7559700230899235E-02 -1.7510124742245954E-02 -1.7460626824850719E-02 -1.7411206552112153E-02 -1.7361863996801754E-02 +-1.7312599231063864E-02 -1.7263412326415782E-02 -1.7214303353747882E-02 -1.7165272383323413E-02 -1.7116319484778885E-02 +-1.7067444727123852E-02 -1.7018648178741227E-02 -1.6969929907387191E-02 -1.6921289980191382E-02 -1.6872728463656936E-02 +-1.6824245423660653E-02 -1.6775840925453023E-02 -1.6727515033658408E-02 -1.6679267812275200E-02 -1.6631099324675814E-02 +-1.6583009633607041E-02 -1.6534998801189919E-02 -1.6487066888920127E-02 -1.6439213957668071E-02 -1.6391440067678949E-02 +-1.6343745278573085E-02 -1.6296129649345958E-02 -1.6248593238368515E-02 -1.6201136103387220E-02 -1.6153758301524487E-02 +-1.6106459889278564E-02 -1.6059240922524112E-02 -1.6012101456512023E-02 -1.5965041545870001E-02 -1.5918061244602634E-02 +-1.5871160606091606E-02 -1.5824339683096031E-02 -1.5777598527752620E-02 -1.5730937191575974E-02 -1.5684355725458992E-02 +-1.5637854179672821E-02 -1.5591432603867502E-02 -1.5545091047071932E-02 -1.5498829557694422E-02 -1.5452648183522865E-02 +-1.5406546971724954E-02 -1.5360525968848751E-02 -1.5314585220822729E-02 -1.5268724772956392E-02 -1.5222944669940269E-02 +-1.5177244955846519E-02 -1.5131625674129127E-02 -1.5086086867624388E-02 -1.5040628578551188E-02 -1.4995250848511291E-02 +-1.4949953718489886E-02 -1.4904737228855861E-02 -1.4859601419362160E-02 -1.4814546329146245E-02 -1.4769571996730476E-02 +-1.4724678460022509E-02 -1.4679865756315724E-02 -1.4635133922289569E-02 -1.4590482994010112E-02 -1.4545913006930306E-02 +-1.4501423995890661E-02 -1.4457015995119452E-02 -1.4412689038233253E-02 -1.4368443158237437E-02 -1.4324278387526684E-02 +-1.4280194757885275E-02 -1.4236192300487699E-02 -1.4192271045899079E-02 -1.4148431024075783E-02 -1.4104672264365712E-02 +-1.4060994795508975E-02 -1.4017398645638352E-02 -1.3973883842279725E-02 -1.3930450412352729E-02 -1.3887098382171163E-02 +-1.3843827777443625E-02 -1.3800638623273949E-02 -1.3757530944161878E-02 -1.3714504764003446E-02 -1.3671560106091741E-02 +-1.3628696993117240E-02 -1.3585915447168626E-02 -1.3543215489733118E-02 -1.3500597141697242E-02 -1.3458060423347342E-02 +-1.3415605354370233E-02 -1.3373231953853660E-02 -1.3330940240287050E-02 -1.3288730231562147E-02 -1.3246601944973416E-02 +-1.3204555397219001E-02 -1.3162590604400979E-02 -1.3120707582026369E-02 -1.3078906345007441E-02 -1.3037186907662665E-02 +-1.2995549283717166E-02 -1.2953993486303437E-02 -1.2912519527962053E-02 -1.2871127420642284E-02 -1.2829817175702871E-02 +-1.2788588803912532E-02 -1.2747442315450920E-02 -1.2706377719909031E-02 -1.2665395026290141E-02 -1.2624494243010429E-02 +-1.2583675377899593E-02 -1.2542938438201775E-02 -1.2502283430576154E-02 -1.2461710361097717E-02 -1.2421219235257991E-02 +-1.2380810057965793E-02 -1.2340482833547916E-02 -1.2300237565750114E-02 -1.2260074257737527E-02 -1.2219992912095747E-02 +-1.2179993530831450E-02 -1.2140076115373164E-02 -1.2100240666572120E-02 -1.2060487184703029E-02 -1.2020815669464859E-02 +-1.1981226119981659E-02 -1.1941718534803313E-02 -1.1902292911906504E-02 -1.1862949248695310E-02 -1.1823687542002257E-02 +-1.1784507788089038E-02 -1.1745409982647276E-02 -1.1706394120799539E-02 -1.1667460197100103E-02 -1.1628608205535755E-02 +-1.1589838139526779E-02 -1.1551149991927700E-02 -1.1512543755028212E-02 -1.1474019420554087E-02 -1.1435576979667987E-02 +-1.1397216422970391E-02 -1.1358937740500497E-02 -1.1320740921737101E-02 -1.1282625955599505E-02 -1.1244592830448470E-02 +-1.1206641534087031E-02 -1.1168772053761522E-02 -1.1130984376162473E-02 -1.1093278487425487E-02 -1.1055654373132254E-02 +-1.1018112018311455E-02 -1.0980651407439691E-02 -1.0943272524442512E-02 -1.0905975352695262E-02 -1.0868759875024144E-02 +-1.0831626073707148E-02 -1.0794573930474987E-02 -1.0757603426512182E-02 -1.0720714542457925E-02 -1.0683907258407141E-02 +-1.0647181553911490E-02 -1.0610537407980311E-02 -1.0573974799081667E-02 -1.0537493705143378E-02 -1.0501094103553960E-02 +-1.0464775971163718E-02 -1.0428539284285776E-02 -1.0392384018697009E-02 -1.0356310149639236E-02 -1.0320317651820085E-02 +-1.0284406499414193E-02 -1.0248576666064164E-02 -1.0212828124881656E-02 -1.0177160848448441E-02 -1.0141574808817467E-02 +-1.0106069977513909E-02 -1.0070646325536321E-02 -1.0035303823357584E-02 -1.0000042440926140E-02 -9.9648621476669755E-03 +-9.9297629124827352E-03 -9.8947447037548656E-03 -9.8598074893447019E-03 -9.8249512365945237E-03 -9.7901759123287455E-03 +-9.7554814828549937E-03 -9.7208679139652501E-03 -9.6863351709369373E-03 -9.6518832185341422E-03 -9.6175120210086323E-03 +-9.5832215421010874E-03 -9.5490117450422306E-03 -9.5148825925539544E-03 -9.4808340468505031E-03 -9.4468660696395961E-03 +-9.4129786221236467E-03 -9.3791716650009020E-03 -9.3454451584665914E-03 -9.3117990622141756E-03 -9.2782333354364498E-03 +-9.2447479368267717E-03 -9.2113428245802712E-03 -9.1780179563950379E-03 -9.1447732894732563E-03 -9.1116087805225010E-03 +-9.0785243857569257E-03 -9.0455200608984248E-03 -9.0125957611779054E-03 -8.9797514413365014E-03 -8.9469870556267723E-03 +-8.9143025578139762E-03 -8.8816979011772535E-03 -8.8491730385109237E-03 -8.8167279221257021E-03 -8.7843625038499049E-03 +-8.7520767350307924E-03 -8.7198705665357430E-03 -8.6877439487535683E-03 -8.6556968315957480E-03 -8.6237291644976795E-03 +-8.5918408964200128E-03 -8.5600319758498671E-03 -8.5283023508021666E-03 -8.4966519688208370E-03 -8.4650807769802057E-03 +-8.4335887218862041E-03 -8.4021757496777240E-03 -8.3708418060278490E-03 -8.3395868361452706E-03 -8.3084107847754517E-03 +-8.2773135962020700E-03 -8.2462952142482501E-03 -8.2153555822779209E-03 -8.1844946431971228E-03 -8.1537123394553428E-03 +-8.1230086130468643E-03 -8.0923834055120179E-03 -8.0618366579386681E-03 -8.0313683109634118E-03 -8.0009783047729714E-03 +-7.9706665791055859E-03 -7.9404330732523454E-03 -7.9102777260584879E-03 -7.8802004759248260E-03 -7.8502012608090872E-03 +-7.8202800182272745E-03 -7.7904366852550935E-03 -7.7606711985291846E-03 -7.7309834942486805E-03 -7.7013735081764602E-03 +-7.6718411756405720E-03 -7.6423864315356320E-03 -7.6130092103241917E-03 -7.5837094460381727E-03 -7.5544870722802047E-03 +-7.5253420222250803E-03 -7.4962742286211349E-03 -7.4672836237916511E-03 -7.4383701396362927E-03 -7.4095337076324746E-03 +-7.3807742588368180E-03 -7.3520917238865677E-03 -7.3234860330010166E-03 -7.2949571159828929E-03 -7.2665049022198639E-03 +-7.2381293206858627E-03 -7.2098302999426527E-03 -7.1816077681411501E-03 -7.1534616530229576E-03 -7.1253918819217301E-03 +-7.0973983817646854E-03 -7.0694810790740328E-03 -7.0416398999683990E-03 -7.0138747701643314E-03 -6.9861856149777213E-03 +-6.9585723593253001E-03 -6.9310349277260626E-03 -6.9035732443027869E-03 -6.8761872327834442E-03 -6.8488768165027233E-03 +-6.8216419184034729E-03 -6.7944824610382129E-03 -6.7673983665706063E-03 -6.7403895567768957E-03 -6.7134559530474701E-03 +-6.6865974763883132E-03 -6.6598140474224618E-03 -6.6331055863915770E-03 -6.6064720131573870E-03 -6.5799132472031917E-03 +-6.5534292076353824E-03 -6.5270198131849493E-03 -6.5006849822089475E-03 -6.4744246326920787E-03 -6.4482386822481350E-03 +-6.4221270481215429E-03 -6.3960896471889021E-03 -6.3701263959604435E-03 -6.3442372105816189E-03 -6.3184220068345856E-03 +-6.2926807001397458E-03 -6.2670132055572658E-03 -6.2414194377886038E-03 -6.2158993111780681E-03 -6.1904527397143279E-03 +-6.1650796370319580E-03 -6.1397799164129791E-03 -6.1145534907883978E-03 -6.0894002727397527E-03 -6.0643201745006507E-03 +-6.0393131079583507E-03 -6.0143789846552366E-03 -5.9895177157904570E-03 -5.9647292122214125E-03 -5.9400133844653745E-03 +-5.9153701427009679E-03 -5.8907993967697988E-03 -5.8663010561779694E-03 -5.8418750300976386E-03 -5.8175212273686647E-03 +-5.7932395565000530E-03 -5.7690299256716298E-03 -5.7448922427355206E-03 -5.7208264152178272E-03 -5.6968323503201008E-03 +-5.6729099549209941E-03 -5.6490591355777562E-03 -5.6252797985279100E-03 -5.6015718496907627E-03 -5.5779351946690084E-03 +-5.5543697387503040E-03 -5.5308753869088697E-03 -5.5074520438070824E-03 -5.4840996137970107E-03 -5.4608180009220681E-03 +-5.4376071089185839E-03 -5.4144668412173811E-03 -5.3913971009453580E-03 -5.3683977909271480E-03 -5.3454688136866397E-03 +-5.3226100714486076E-03 -5.2998214661403274E-03 -5.2771028993931594E-03 -5.2544542725441292E-03 -5.2318754866375718E-03 +-5.2093664424267072E-03 -5.1869270403752717E-03 -5.1645571806590651E-03 -5.1422567631676528E-03 -5.1200256875058850E-03 +-5.0978638529955624E-03 -5.0757711586770097E-03 -5.0537475033107142E-03 -5.0317927853789426E-03 -5.0099069030873173E-03 +-4.9880897543664680E-03 -4.9663412368736448E-03 -4.9446612479943077E-03 -4.9230496848437699E-03 -4.9015064442688040E-03 +-4.8800314228492677E-03 -4.8586245168997155E-03 -4.8372856224710411E-03 -4.8160146353520587E-03 -4.7948114510711678E-03 +-4.7736759648979400E-03 -4.7526080718447699E-03 -4.7316076666685030E-03 -4.7106746438720258E-03 -4.6898088977059219E-03 +-4.6690103221700826E-03 -4.6482788110153543E-03 -4.6276142577451329E-03 -4.6070165556170396E-03 -4.5864855976444777E-03 +-4.5660212765983492E-03 -4.5456234850086031E-03 -4.5252921151659039E-03 -4.5050270591232905E-03 -4.4848282086977437E-03 +-4.4646954554718515E-03 -4.4446286907954529E-03 -4.4246278057872334E-03 -4.4046926913363848E-03 -4.3848232381042233E-03 +-4.3650193365258510E-03 -4.3452808768117256E-03 -4.3256077489493604E-03 -4.3059998427049271E-03 -4.2864570476248724E-03 +-4.2669792530375802E-03 -4.2475663480550018E-03 -4.2282182215742613E-03 -4.2089347622793257E-03 -4.1897158586426050E-03 +-4.1705613989266111E-03 -4.1514712711855821E-03 -4.1324453632671032E-03 -4.1134835628137637E-03 -4.0945857572647721E-03 +-4.0757518338575879E-03 -4.0569816796295604E-03 -4.0382751814195747E-03 -4.0196322258696498E-03 -4.0010526994266058E-03 +-3.9825364883436772E-03 -3.9640834786821427E-03 -3.9456935563129793E-03 -3.9273666069184468E-03 -3.9091025159937766E-03 +-3.8909011688487518E-03 -3.8727624506093641E-03 -3.8546862462194558E-03 -3.8366724404422974E-03 -3.8187209178622691E-03 +-3.8008315628864689E-03 -3.7830042597463368E-03 -3.7652388924992795E-03 -3.7475353450303027E-03 -3.7298935010536493E-03 +-3.7123132441144015E-03 -3.6947944575901120E-03 -3.6773370246924474E-03 -3.6599408284687784E-03 -3.6426057518038350E-03 +-3.6253316774212951E-03 -3.6081184878854478E-03 -3.5909660656027686E-03 -3.5738742928235821E-03 -3.5568430516436326E-03 +-3.5398722240057552E-03 -3.5229616917014481E-03 -3.5061113363725146E-03 -3.4893210395126753E-03 -3.4725906824691686E-03 +-3.4559201464443791E-03 -3.4393093124974435E-03 -3.4227580615458666E-03 -3.4062662743671221E-03 -3.3898338316002822E-03 +-3.3734606137475892E-03 -3.3571465011761107E-03 -3.3408913741193075E-03 -3.3246951126786541E-03 -3.3085575968252409E-03 +-3.2924787064013759E-03 -3.2764583211221869E-03 -3.2604963205772248E-03 -3.2445925842320513E-03 -3.2287469914298603E-03 +-3.2129594213930477E-03 -3.1972297532248122E-03 -3.1815578659107695E-03 -3.1659436383205211E-03 -3.1503869492092544E-03 +-3.1348876772193308E-03 -3.1194457008818935E-03 -3.1040608986184033E-03 -3.0887331487422808E-03 -3.0734623294604666E-03 +-3.0582483188749828E-03 -3.0430909949845605E-03 -3.0279902356861754E-03 -3.0129459187766424E-03 -2.9979579219542073E-03 +-2.9830261228200872E-03 -2.9681503988800741E-03 -2.9533306275460829E-03 -2.9385666861377465E-03 -2.9238584518839544E-03 +-2.9092058019244442E-03 -2.8946086133113448E-03 -2.8800667630107489E-03 -2.8655801279042835E-03 -2.8511485847906499E-03 +-2.8367720103871885E-03 -2.8224502813314380E-03 -2.8081832741826845E-03 -2.7939708654235048E-03 -2.7798129314613351E-03 +-2.7657093486300041E-03 -2.7516599931912819E-03 -2.7376647413364227E-03 -2.7237234691877030E-03 -2.7098360527999720E-03 +-2.6960023681621673E-03 -2.6822222911988911E-03 -2.6684956977718905E-03 -2.6548224636816250E-03 -2.6412024646687874E-03 +-2.6276355764158284E-03 -2.6141216745484718E-03 -2.6006606346372532E-03 -2.5872523321990421E-03 -2.5738966426985289E-03 +-2.5605934415497840E-03 -2.5473426041177343E-03 -2.5341440057196963E-03 -2.5209975216268707E-03 -2.5079030270658714E-03 +-2.4948603972201932E-03 -2.4818695072317547E-03 -2.4689302322023596E-03 -2.4560424471952221E-03 -2.4432060272364443E-03 +-2.4304208473165186E-03 -2.4176867823918003E-03 -2.4050037073860262E-03 -2.3923714971917590E-03 -2.3797900266718996E-03 +-2.3672591706611593E-03 -2.3547788039675185E-03 -2.3423488013737314E-03 -2.3299690376387709E-03 -2.3176393874993163E-03 +-2.3053597256711966E-03 -2.2931299268508887E-03 -2.2809498657169343E-03 -2.2688194169314417E-03 -2.2567384551415073E-03 +-2.2447068549806847E-03 -2.2327244910704397E-03 -2.2207912380215696E-03 -2.2089069704356898E-03 -2.1970715629066337E-03 +-2.1852848900219125E-03 -2.1735468263641582E-03 -2.1618572465125318E-03 -2.1502160250441715E-03 -2.1386230365356188E-03 +-2.1270781555642318E-03 -2.1155812567096193E-03 -2.1041322145550442E-03 -2.0927309036888561E-03 -2.0813771987058839E-03 +-2.0700709742088614E-03 -2.0588121048098237E-03 -2.0476004651315055E-03 -2.0364359298087617E-03 -2.0253183734899377E-03 +-2.0142476708382802E-03 -2.0032236965333212E-03 -1.9922463252722705E-03 -1.9813154317713817E-03 -1.9704308907673705E-03 +-1.9595925770187462E-03 -1.9488003653072108E-03 -1.9380541304390444E-03 -1.9273537472464370E-03 -1.9166990905888880E-03 +-1.9060900353545360E-03 -1.8955264564615442E-03 -1.8850082288594343E-03 -1.8745352275304601E-03 -1.8641073274909259E-03 +-1.8537244037925586E-03 -1.8433863315238279E-03 -1.8330929858113040E-03 -1.8228442418209718E-03 -1.8126399747595725E-03 +-1.8024800598759358E-03 -1.7923643724622850E-03 -1.7822927878555835E-03 -1.7722651814388306E-03 -1.7622814286423847E-03 +-1.7523414049452643E-03 -1.7424449858764676E-03 -1.7325920470162640E-03 -1.7227824639974988E-03 -1.7130161125068866E-03 +-1.7032928682863015E-03 -1.6936126071340656E-03 -1.6839752049062431E-03 -1.6743805375179042E-03 -1.6648284809444172E-03 +-1.6553189112227093E-03 -1.6458517044525489E-03 -1.6364267367978019E-03 -1.6270438844877043E-03 -1.6177030238181060E-03 +-1.6084040311527392E-03 -1.5991467829244565E-03 -1.5899311556364926E-03 -1.5807570258637024E-03 -1.5716242702537898E-03 +-1.5625327655285628E-03 -1.5534823884851402E-03 -1.5444730159972109E-03 -1.5355045250162289E-03 -1.5265767925726477E-03 +-1.5176896957771408E-03 -1.5088431118218028E-03 -1.5000369179813569E-03 -1.4912709916143740E-03 -1.4825452101644623E-03 +-1.4738594511614629E-03 -1.4652135922226476E-03 -1.4566075110538986E-03 -1.4480410854509082E-03 -1.4395141933003430E-03 +-1.4310267125810306E-03 -1.4225785213651282E-03 -1.4141694978192861E-03 -1.4057995202058260E-03 -1.3974684668838805E-03 +-1.3891762163105706E-03 -1.3809226470421424E-03 -1.3727076377351194E-03 -1.3645310671474456E-03 -1.3563928141396310E-03 +-1.3482927576758705E-03 -1.3402307768251953E-03 -1.3322067507625793E-03 -1.3242205587700880E-03 -1.3162720802379656E-03 +-1.3083611946657725E-03 -1.3004877816634865E-03 -1.2926517209526044E-03 -1.2848528923672532E-03 -1.2770911758552819E-03 +-1.2693664514793490E-03 -1.2616785994180222E-03 -1.2540274999668533E-03 -1.2464130335394636E-03 -1.2388350806686161E-03 +-1.2312935220072862E-03 -1.2237882383297322E-03 -1.2163191105325573E-03 -1.2088860196357606E-03 -1.2014888467837979E-03 +-1.1941274732466380E-03 -1.1868017804207822E-03 -1.1795116498303346E-03 -1.1722569631280213E-03 -1.1650376020962221E-03 +-1.1578534486480089E-03 -1.1507043848281507E-03 -1.1435902928141491E-03 -1.1365110549172400E-03 -1.1294665535834130E-03 +-1.1224566713944051E-03 -1.1154812910687088E-03 -1.1085402954625673E-03 -1.1016335675709625E-03 -1.0947609905286033E-03 +-1.0879224476109052E-03 -1.0811178222349745E-03 -1.0743469979605754E-03 -1.0676098584910996E-03 -1.0609062876745345E-03 +-1.0542361695044153E-03 -1.0475993881207829E-03 -1.0409958278111405E-03 -1.0344253730113857E-03 -1.0278879083067648E-03 +-1.0213833184327982E-03 -1.0149114882762236E-03 -1.0084723028759113E-03 -1.0020656474237942E-03 -9.9569140726578202E-04 +-9.8934946790267390E-04 -9.8303971499107720E-04 -9.7676203434429059E-04 -9.7051631193322528E-04 -9.6430243388728103E-04 +-9.5812028649524996E-04 -9.5196975620619152E-04 -9.4585072963032060E-04 -9.3976309353987618E-04 -9.3370673486999490E-04 +-9.2768154071958030E-04 -9.2168739835215988E-04 -9.1572419519674161E-04 -9.0979181884866928E-04 -9.0389015707047010E-04 +-8.9801909779268759E-04 -8.9217852911473042E-04 -8.8636833930570398E-04 -8.8058841680523298E-04 -8.7483865022428301E-04 +-8.6911892834598905E-04 -8.6342914012646195E-04 -8.5776917469559868E-04 -8.5213892135788236E-04 -8.4653826959319182E-04 +-8.4096710905758564E-04 -8.3542532958409818E-04 -8.2991282118352171E-04 -8.2442947404518549E-04 -8.1897517853773234E-04 +-8.1354982520989347E-04 -8.0815330479124274E-04 -8.0278550819296881E-04 -7.9744632650862379E-04 -7.9213565101487918E-04 +-7.8685337317226458E-04 -7.8159938462591858E-04 -7.7637357720631748E-04 -7.7117584293001033E-04 -7.6600607400034411E-04 +-7.6086416280818630E-04 -7.5575000193264146E-04 -7.5066348414176579E-04 -7.4560450239326574E-04 -7.4057294983521211E-04 +-7.3556871980672977E-04 -7.3059170583868757E-04 -7.2564180165439712E-04 -7.2071890117028495E-04 -7.1582289849657127E-04 +-7.1095368793795102E-04 -7.0611116399424965E-04 -7.0129522136109645E-04 -6.9650575493057881E-04 -6.9174265979189415E-04 +-6.8700583123199933E-04 -6.8229516473625391E-04 -6.7761055598906017E-04 -6.7295190087449379E-04 -6.6831909547693507E-04 +-6.6371203608169092E-04 -6.5913061917561319E-04 -6.5457474144771757E-04 -6.5004429978978145E-04 -6.4553919129696274E-04 +-6.4105931326838576E-04 -6.3660456320774274E-04 -6.3217483882388361E-04 -6.2777003803139101E-04 -6.2339005895117330E-04 +-6.1903479991102974E-04 -6.1470415944622173E-04 -6.1039803630003769E-04 -6.0611632942435582E-04 -6.0185893798019171E-04 +-5.9762576133825574E-04 -5.9341669907949431E-04 -5.8923165099562878E-04 -5.8507051708969369E-04 -5.8093319757656291E-04 +-5.7681959288347811E-04 -5.7272960365056813E-04 -5.6866313073136168E-04 -5.6462007519330064E-04 -5.6060033831824882E-04 +-5.5660382160298120E-04 -5.5263042675969228E-04 -5.4868005571647859E-04 -5.4475261061782629E-04 -5.4084799382509720E-04 +-5.3696610791699527E-04 -5.3310685569004442E-04 -5.2927014015905340E-04 -5.2545586455757622E-04 -5.2166393233836744E-04 +-5.1789424717383552E-04 -5.1414671295649066E-04 -5.1042123379937878E-04 -5.0671771403652940E-04 -5.0303605822337892E-04 +-4.9937617113719930E-04 -4.9573795777752168E-04 -4.9212132336655455E-04 -4.8852617334959334E-04 -4.8495241339542588E-04 +-4.8139994939673959E-04 -4.7786868747052029E-04 -4.7435853395843527E-04 -4.7086939542723247E-04 -4.6740117866911633E-04 +-4.6395379070212766E-04 -4.6052713877051913E-04 -4.5712113034512207E-04 -4.5373567312370655E-04 -4.5037067503134572E-04 +-4.4702604422076832E-04 -4.4370168907270510E-04 -4.4039751819623373E-04 -4.3711344042912003E-04 -4.3384936483815344E-04 +-4.3060520071947124E-04 -4.2738085759888881E-04 -4.2417624523221828E-04 -4.2099127360558394E-04 -4.1782585293572881E-04 +-4.1467989367032653E-04 -4.1155330648828071E-04 -4.0844600230001665E-04 -4.0535789224777850E-04 -4.0228888770590997E-04 +-3.9923890028114228E-04 -3.9620784181286641E-04 -3.9319562437340936E-04 -3.9020216026829568E-04 -3.8722736203651749E-04 +-3.8427114245078662E-04 -3.8133341451779176E-04 -3.7841409147844503E-04 -3.7551308680812569E-04 -3.7263031421692103E-04 +-3.6976568764985907E-04 -3.6691912128713848E-04 -3.6409052954435511E-04 -3.6127982707271971E-04 -3.5848692875927645E-04 +-3.5571174972711268E-04 -3.5295420533556213E-04 -3.5021421118041355E-04 -3.4749168309410131E-04 -3.4478653714589995E-04 +-3.4209868964211348E-04 -3.3942805712625600E-04 -3.3677455637923102E-04 -3.3413810441950634E-04 -3.3151861850328054E-04 +-3.2891601612465180E-04 -3.2633021501577407E-04 -3.2376113314701370E-04 -3.2120868872710179E-04 -3.1867280020327993E-04 +-3.1615338626143821E-04 -3.1365036582625916E-04 -3.1116365806134499E-04 -3.0869318236934713E-04 -3.0623885839209126E-04 +-3.0380060601069427E-04 -3.0137834534568135E-04 -2.9897199675709297E-04 -2.9658148084459388E-04 -2.9420671844756986E-04 +-2.9184763064522872E-04 -2.8950413875669060E-04 -2.8717616434107454E-04 -2.8486362919758336E-04 -2.8256645536558242E-04 +-2.8028456512467313E-04 -2.7801788099476334E-04 -2.7576632573613293E-04 -2.7352982234949509E-04 -2.7130829407605311E-04 +-2.6910166439755189E-04 -2.6690985703632842E-04 -2.6473279595535143E-04 -2.6257040535826573E-04 -2.6042260968942293E-04 +-2.5828933363391426E-04 -2.5617050211759588E-04 -2.5406604030711323E-04 -2.5197587360991492E-04 -2.4989992767427012E-04 +-2.4783812838927470E-04 -2.4579040188485852E-04 -2.4375667453178536E-04 -2.4173687294164802E-04 -2.3973092396686231E-04 +-2.3773875470065468E-04 -2.3576029247704517E-04 -2.3379546487082778E-04 -2.3184419969754687E-04 -2.2990642501346541E-04 +-2.2798206911553543E-04 -2.2607106054135911E-04 -2.2417332806914735E-04 -2.2228880071767642E-04 -2.2041740774623577E-04 +-2.1855907865457703E-04 -2.1671374318285461E-04 -2.1488133131156544E-04 -2.1306177326148098E-04 -2.1125499949358064E-04 +-2.0946094070897609E-04 -2.0767952784883138E-04 -2.0591069209428483E-04 -2.0415436486636185E-04 -2.0241047782588320E-04 +-2.0067896287337392E-04 -1.9895975214896276E-04 -1.9725277803228226E-04 -1.9555797314236320E-04 -1.9387527033752337E-04 +-1.9220460271525503E-04 -1.9054590361210742E-04 -1.8889910660356541E-04 -1.8726414550392383E-04 -1.8564095436615841E-04 +-1.8402946748179448E-04 -1.8242961938076649E-04 -1.8084134483128153E-04 -1.7926457883967294E-04 -1.7769925665025107E-04 +-1.7614531374515440E-04 -1.7460268584419027E-04 -1.7307130890467751E-04 -1.7155111912128330E-04 -1.7004205292585510E-04 +-1.6854404698725005E-04 -1.6705703821116223E-04 -1.6558096373994220E-04 -1.6411576095241758E-04 -1.6266136746370528E-04 +-1.6121772112502575E-04 -1.5978476002350634E-04 -1.5836242248198868E-04 -1.5695064705882606E-04 -1.5554937254768196E-04 +-1.5415853797732130E-04 -1.5277808261140278E-04 -1.5140794594826093E-04 -1.5004806772069102E-04 -1.4869838789572794E-04 +-1.4735884667442037E-04 -1.4602938449160353E-04 -1.4470994201566702E-04 -1.4340046014832072E-04 -1.4210088002435540E-04 +-1.4081114301140189E-04 -1.3953119070968454E-04 -1.3826096495177289E-04 -1.3700040780233115E-04 -1.3574946155786051E-04 +-1.3450806874644219E-04 -1.3327617212747424E-04 -1.3205371469140732E-04 -1.3084063965947441E-04 -1.2963689048342081E-04 +-1.2844241084522746E-04 -1.2725714465683304E-04 -1.2608103605985226E-04 -1.2491402942529039E-04 -1.2375606935325690E-04 +-1.2260710067267164E-04 -1.2146706844097246E-04 -1.2033591794381626E-04 -1.1921359469477982E-04 -1.1810004443505367E-04 +-1.1699521313313690E-04 -1.1589904698452670E-04 -1.1481149241140483E-04 -1.1373249606232163E-04 -1.1266200481187674E-04 +-1.1159996576039692E-04 -1.1054632623361112E-04 -1.0950103378232131E-04 -1.0846403618207201E-04 -1.0743528143281593E-04 +-1.0641471775857651E-04 -1.0540229360710849E-04 -1.0439795764955458E-04 -1.0340165878009937E-04 -1.0241334611562060E-04 +-1.0143296899533852E-04 -1.0046047698045991E-04 -9.9495819853822305E-05 -9.8538947619532876E-05 -9.7589810502605870E-05 +-9.6648358948597652E-05 -9.5714543623237028E-05 -9.4788315412055158E-05 -9.3869625420011507E-05 -9.2958424971116836E-05 +-9.2054665608054618E-05 -9.1158299091798119E-05 -9.0269277401227435E-05 -8.9387552732740616E-05 -8.8513077499864813E-05 +-8.7645804332863597E-05 -8.6785686078341657E-05 -8.5932675798847834E-05 -8.5086726772474536E-05 -8.4247792492455240E-05 +-8.3415826666759121E-05 -8.2590783217683357E-05 -8.1772616281443333E-05 -8.0961280207759705E-05 -8.0156729559443493E-05 +-7.9358919111978198E-05 -7.8567803853100398E-05 -7.7783338982377294E-05 -7.7005479910781537E-05 -7.6234182260265191E-05 +-7.5469401863329199E-05 -7.4711094762592409E-05 -7.3959217210357476E-05 -7.3213725668174631E-05 -7.2474576806402511E-05 +-7.1741727503767911E-05 -7.1015134846922809E-05 -7.0294756129998906E-05 -6.9580548854159801E-05 -6.8872470727152042E-05 +-6.8170479662852548E-05 -6.7474533780815350E-05 -6.6784591405815003E-05 -6.6100611067388930E-05 -6.5422551499376235E-05 +-6.4750371639456271E-05 -6.4084030628683948E-05 -6.3423487811022823E-05 -6.2768702732877090E-05 -6.2119635142621283E-05 +-6.1476244990126905E-05 -6.0838492426289350E-05 -6.0206337802550200E-05 -5.9579741670419985E-05 -5.8958664780997110E-05 +-5.8343068084486257E-05 -5.7732912729714388E-05 -5.7128160063644785E-05 -5.6528771630889357E-05 -5.5934709173218932E-05 +-5.5345934629072418E-05 -5.4762410133063445E-05 -5.4184098015485412E-05 -5.3610960801815004E-05 -5.3042961212213954E-05 +-5.2480062161028826E-05 -5.1922226756289129E-05 -5.1369418299204257E-05 -5.0821600283658217E-05 -5.0278736395702787E-05 +-4.9740790513049458E-05 -4.9207726704559164E-05 -4.8679509229730838E-05 -4.8156102538188563E-05 -4.7637471269166545E-05 +-4.7123580250993260E-05 -4.6614394500573340E-05 -4.6109879222868815E-05 -4.5609999810378155E-05 -4.5114721842614113E-05 +-4.4624011085580565E-05 -4.4137833491246793E-05 -4.3656155197021850E-05 -4.3178942525226187E-05 -4.2706161982562699E-05 +-4.2237780259586375E-05 -4.1773764230172026E-05 -4.1314080950981701E-05 -4.0858697660929706E-05 -4.0407581780647191E-05 +-3.9960700911944943E-05 -3.9518022837275294E-05 -3.9079515519192618E-05 -3.8645147099812583E-05 -3.8214885900270463E-05 +-3.7788700420177856E-05 -3.7366559337078649E-05 -3.6948431505903836E-05 -3.6534285958424759E-05 -3.6124091902705703E-05 +-3.5717818722555501E-05 -3.5315435976977579E-05 -3.4916913399619133E-05 -3.4522220898219766E-05 -3.4131328554058501E-05 +-3.3744206621399841E-05 -3.3360825526939470E-05 -3.2981155869248079E-05 -3.2605168418215101E-05 -3.2232834114491052E-05 +-3.1864124068929032E-05 -3.1499009562025350E-05 -3.1137462043359516E-05 -3.0779453131032958E-05 -3.0424954611107280E-05 +-3.0073938437041429E-05 -2.9726376729128372E-05 -2.9382241773930690E-05 -2.9041506023715526E-05 -2.8704142095888802E-05 +-2.8370122772428855E-05 -2.8039420999318920E-05 -2.7712009885979468E-05 -2.7387862704699494E-05 -2.7066952890067346E-05 +-2.6749254038400712E-05 -2.6434739907176226E-05 -2.6123384414458172E-05 -2.5815161638326990E-05 -2.5510045816307018E-05 +-2.5208011344793225E-05 -2.4909032778478491E-05 -2.4613084829779129E-05 -2.4320142368260899E-05 -2.4030180420063823E-05 +-2.3743174167327156E-05 -2.3459098947613266E-05 -2.3177930253331623E-05 -2.2899643731162029E-05 -2.2624215181477687E-05 +-2.2351620557767570E-05 -2.2081835966058815E-05 -2.1814837664338482E-05 -2.1550602061975068E-05 -2.1289105719139645E-05 +-2.1030325346226987E-05 -2.0774237803275835E-05 -2.0520820099389521E-05 -2.0270049392156036E-05 -2.0021902987067650E-05 +-1.9776358336940892E-05 -1.9533393041335773E-05 -1.9292984845975158E-05 -1.9055111642163772E-05 -1.8819751466207187E-05 +-1.8586882498830649E-05 -1.8356483064597782E-05 -1.8128531631329061E-05 -1.7903006809520397E-05 -1.7679887351761593E-05 +-1.7459152152154692E-05 -1.7240780245732221E-05 -1.7024750807875580E-05 -1.6811043153733451E-05 -1.6599636737639877E-05 +-1.6390511152532851E-05 -1.6183646129372486E-05 -1.5979021536559564E-05 -1.5776617379354094E-05 -1.5576413799293741E-05 +-1.5378391073612744E-05 -1.5182529614660476E-05 -1.4988809969320735E-05 -1.4797212818430468E-05 -1.4607718976199387E-05 +-1.4420309389629168E-05 -1.4234965137933248E-05 -1.4051667431956653E-05 -1.3870397613596031E-05 -1.3691137155220004E-05 +-1.3513867659089785E-05 -1.3338570856780031E-05 -1.3165228608599934E-05 -1.2993822903014684E-05 -1.2824335856067303E-05 +-1.2656749710800619E-05 -1.2491046836679747E-05 -1.2327209729014973E-05 -1.2165221008384783E-05 -1.2005063420059514E-05 +-1.1846719833425319E-05 -1.1690173241408527E-05 -1.1535406759900472E-05 -1.1382403627182794E-05 -1.1231147203353055E-05 +-1.1081620969751117E-05 -1.0933808528385677E-05 -1.0787693601361574E-05 -1.0643260030307424E-05 -1.0500491775803923E-05 +-1.0359372916812666E-05 -1.0219887650105405E-05 -1.0082020289694103E-05 -9.9457552662612926E-06 -9.8110771265914088E-06 +-9.6779705330023099E-06 -9.5464202627777726E-06 -9.4164112076004336E-06 -9.2879283729854640E-06 -9.1609568777149189E-06 +-9.0354819532726661E-06 -8.9114889432802285E-06 -8.7889633029330484E-06 -8.6678905984376980E-06 -8.5482565064497528E-06 +-8.4300468135123550E-06 -8.3132474154956261E-06 -8.1978443170368106E-06 -8.0838236309811818E-06 -7.9711715778237774E-06 +-7.8598744851519658E-06 -7.7499187870888247E-06 -7.6412910237372339E-06 -7.5339778406250462E-06 -7.4279659881509605E-06 +-7.3232423210312269E-06 -7.2197937977474076E-06 -7.1176074799949223E-06 -7.0166705321324560E-06 -6.9169702206324236E-06 +-6.8184939135322343E-06 -6.7212290798866074E-06 -6.6251632892207959E-06 -6.5302842109847233E-06 -6.4365796140082191E-06 +-6.3440373659571697E-06 -6.2526454327906558E-06 -6.1623918782191580E-06 -6.0732648631637366E-06 -5.9852526452163222E-06 +-5.8983435781009547E-06 -5.8125261111361455E-06 -5.7277887886983304E-06 -5.6441202496863016E-06 -5.5615092269868487E-06 +-5.4799445469414257E-06 -5.3994151288140039E-06 -5.3199099842598920E-06 -5.2414182167959242E-06 -5.1639290212715773E-06 +-5.0874316833413793E-06 -5.0119155789384107E-06 -4.9373701737490190E-06 -4.8637850226887005E-06 -4.7911497693791897E-06 +-4.7194541456267284E-06 -4.6486879709016058E-06 -4.5788411518188496E-06 -4.5099036816202144E-06 -4.4418656396573689E-06 +-4.3747171908764052E-06 -4.3084485853034992E-06 -4.2430501575319608E-06 -4.1785123262105147E-06 -4.1148255935328455E-06 +-4.0519805447284924E-06 -3.9899678475550555E-06 -3.9287782517916543E-06 -3.8684025887338123E-06 -3.8088317706895904E-06 +-3.7500567904771269E-06 -3.6920687209234889E-06 -3.6348587143649362E-06 -3.5784180021484825E-06 -3.5227378941349385E-06 +-3.4678097782032377E-06 -3.4136251197562373E-06 -3.3601754612278924E-06 -3.3074524215918162E-06 -3.2554476958713488E-06 +-3.2041530546509422E-06 -3.1535603435890619E-06 -3.1036614829325251E-06 -3.0544484670322424E-06 -3.0059133638604738E-06 +-2.9580483145295358E-06 -2.9108455328119642E-06 -2.8642973046621877E-06 -2.8183959877396816E-06 -2.7731340109335922E-06 +-2.7285038738889231E-06 -2.6844981465341722E-06 -2.6411094686105211E-06 -2.5983305492025581E-06 -2.5561541662704823E-06 +-2.5145731661839208E-06 -2.4735804632572129E-06 -2.4331690392863258E-06 -2.3933319430872431E-06 -2.3540622900359852E-06 +-2.3153532616101946E-06 -2.2771981049322401E-06 -2.2395901323139713E-06 -2.2025227208030367E-06 -2.1659893117307764E-06 +-2.1299834102617583E-06 -2.0944985849448839E-06 -2.0595284672661106E-06 -2.0250667512028378E-06 -1.9911071927798329E-06 +-1.9576436096268728E-06 -1.9246698805379561E-06 -1.8921799450321966E-06 -1.8601678029163275E-06 -1.8286275138488741E-06 +-1.7975531969059996E-06 -1.7669390301489559E-06 -1.7367792501932653E-06 -1.7070681517795197E-06 -1.6778000873458705E-06 +-1.6489694666022150E-06 -1.6205707561060320E-06 -1.5925984788399397E-06 -1.5650472137909154E-06 -1.5379115955312292E-06 +-1.5111863138010641E-06 -1.4848661130928604E-06 -1.4589457922373532E-06 -1.4334202039913134E-06 -1.4082842546270250E-06 +-1.3835329035234795E-06 -1.3591611627592617E-06 -1.3351640967072170E-06 -1.3115368216307898E-06 -1.2882745052821471E-06 +-1.2653723665019969E-06 -1.2428256748211806E-06 -1.2206297500639776E-06 -1.1987799619531845E-06 -1.1772717297169206E-06 +-1.1561005216972023E-06 -1.1352618549602551E-06 -1.1147512949086017E-06 -1.0945644548948982E-06 -1.0746969958375304E-06 +-1.0551446258379873E-06 -1.0359030997999879E-06 -1.0169682190503917E-06 -9.9833583096186626E-07 -9.8000182857734168E-07 +-9.6196215023623408E-07 -9.4421277920244498E-07 -9.2674974329415197E-07 -9.0956911451536462E-07 -8.9266700868927275E-07 +-8.7603958509338589E-07 -8.5968304609644435E-07 -8.4359363679712741E-07 -8.2776764466455292E-07 -8.1220139918055844E-07 +-7.9689127148378122E-07 -7.8183367401553188E-07 -7.6702506016745246E-07 -7.5246192393098560E-07 -7.3814079954862044E-07 +-7.2405826116694774E-07 -7.1021092249151396E-07 -6.9659543644345996E-07 -6.8320849481797228E-07 -6.7004682794452609E-07 +-6.5710720434892888E-07 -6.4438643041716577E-07 -6.3188135006103576E-07 -6.1958884438560714E-07 -6.0750583135844950E-07 +-5.9562926548068614E-07 -5.8395613745983413E-07 -5.7248347388444565E-07 -5.6120833690055789E-07 -5.5012782388993205E-07 +-5.3923906715009626E-07 -5.2853923357618486E-07 -5.1802552434458222E-07 -5.0769517459834841E-07 -4.9754545313446651E-07 +-4.8757366209285807E-07 -4.7777713664721498E-07 -4.6815324469761621E-07 -4.5869938656493852E-07 -4.4941299468705898E-07 +-4.4029153331685023E-07 -4.3133249822196710E-07 -4.2253341638641766E-07 -4.1389184571392360E-07 -4.0540537473306512E-07 +-3.9707162230421279E-07 -3.8888823732823940E-07 -3.8085289845701224E-07 -3.7296331380567013E-07 -3.6521722066666783E-07 +-3.5761238522560729E-07 -3.5014660227883224E-07 -3.4281769495280449E-07 -3.3562351442524217E-07 -3.2856193964802522E-07 +-3.2163087707187298E-07 -3.1482826037277947E-07 -3.0815205018020514E-07 -3.0160023380703970E-07 -2.9517082498130544E-07 +-2.8886186357962305E-07 -2.8267141536242541E-07 -2.7659757171091931E-07 -2.7063844936579068E-07 -2.6479219016765184E-07 +-2.5905696079923120E-07 -2.5343095252929599E-07 -2.4791238095830698E-07 -2.4249948576580915E-07 -2.3719053045954085E-07 +-2.3198380212627603E-07 -2.2687761118437736E-07 -2.2187029113807313E-07 -2.1696019833344628E-07 -2.1214571171613071E-07 +-2.0742523259071761E-07 -2.0279718438186365E-07 -1.9826001239709717E-07 -1.9381218359132137E-07 -1.8945218633300948E-07 +-1.8517853017208553E-07 -1.8098974560949321E-07 -1.7688438386844030E-07 -1.7286101666732224E-07 -1.6891823599431610E-07 +-1.6505465388364317E-07 -1.6126890219349465E-07 -1.5755963238561657E-07 -1.5392551530654939E-07 -1.5036524097052078E-07 +-1.4687751834398008E-07 -1.4346107513177776E-07 -1.4011465756498202E-07 -1.3683703019032626E-07 -1.3362697566128545E-07 +-1.3048329453077591E-07 -1.2740480504547323E-07 -1.2439034294174421E-07 -1.2143876124318577E-07 -1.1854893005977189E-07 +-1.1571973638859448E-07 -1.1295008391620131E-07 -1.1023889282252250E-07 -1.0758509958637966E-07 -1.0498765679257398E-07 +-1.0244553294054859E-07 -9.9957712254617576E-08 -9.7523194495758413E-08 -9.5140994774962470E-08 -9.2810143368136465E-08 +-9.0529685532551014E-08 -8.8298681324830210E-08 -8.6116205420476622E-08 -8.3981346934926526E-08 -8.1893209246128843E-08 +-7.9850909818643889E-08 -7.7853580029253185E-08 -7.5900364994078206E-08 -7.3990423397199877E-08 -7.2122927320772995E-08 +-7.0297062076631134E-08 -6.8512026039374909E-08 -6.6767030480937639E-08 -6.5061299406623356E-08 -6.3394069392610072E-08 +-6.1764589424912585E-08 -6.0172120739799254E-08 -5.8615936665655611E-08 -5.7095322466288844E-08 -5.5609575185668232E-08 +-5.4158003494092912E-08 -5.2739927535782698E-08 -5.1354678777884905E-08 -5.0001599860890249E-08 -4.8680044450452284E-08 +-4.7389377090603547E-08 -4.6128973058362049E-08 -4.4898218219721107E-08 -4.3696508887016866E-08 -4.2523251677666288E-08 +-4.1377863374269020E-08 -4.0259770786066967E-08 -3.9168410611754315E-08 -3.8103229303632033E-08 -3.7063682933099222E-08 +-3.6049237057475236E-08 -3.5059366588146109E-08 -3.4093555660027092E-08 -3.3151297502336412E-08 -3.2232094310671320E-08 +-3.1335457120381672E-08 -3.0460905681232412E-08 -2.9607968333348684E-08 -2.8776181884437208E-08 -2.7965091488275843E-08 +-2.7174250524464936E-08 -2.6403220479433945E-08 -2.5651570828695001E-08 -2.4918878920337700E-08 -2.4204729859757024E-08 +-2.3508716395608155E-08 -2.2830438806980280E-08 -2.2169504791782719E-08 -2.1525529356336437E-08 -2.0898134706162785E-08 +-2.0286950137963759E-08 -1.9691611932785078E-08 -1.9111763250356165E-08 -1.8547054024598712E-08 -1.7997140860297394E-08 +-1.7461686930925026E-08 -1.6940361877615125E-08 -1.6432841709274332E-08 -1.5938808703827760E-08 -1.5457951310589597E-08 +-1.4989964053751850E-08 -1.4534547436984050E-08 -1.4091407849136022E-08 -1.3660257471037079E-08 -1.3240814183383865E-08 +-1.2832801475709421E-08 -1.2435948356426451E-08 -1.2049989263937083E-08 -1.1674663978801952E-08 -1.1309717536960970E-08 +-1.0954900143998810E-08 -1.0609967090447161E-08 -1.0274678668116856E-08 -9.9488000874520765E-09 -9.6321013958994613E-09 +-9.3243573972846418E-09 -9.0253475721887284E-09 -8.7348559993174260E-09 -8.4526712778552194E-09 -8.1785864507974878E-09 +-7.9123989292527276E-09 -7.6539104177078555E-09 -7.4029268402489369E-09 -7.1592582677299979E-09 -6.9227188458825181E-09 +-6.6931267243582264E-09 -6.4703039866976928E-09 -6.2540765812174337E-09 -6.0442742528080316E-09 -5.8407304756359874E-09 +-5.6432823867418510E-09 -5.4517707205272118E-09 -5.2660397441233029E-09 -5.0859371936337308E-09 -4.9113142112440631E-09 +-4.7420252831908572E-09 -4.5779281785828538E-09 -4.4188838890669371E-09 -4.2647565693316218E-09 -4.1154134784407246E-09 +-3.9707249219898013E-09 -3.8305641950783628E-09 -3.6948075260902518E-09 -3.5633340212751354E-09 -3.4360256101238048E-09 +-3.3127669915300206E-09 -3.1934455807317812E-09 -3.0779514570245970E-09 -2.9661773122398595E-09 -2.8580183999808796E-09 +-2.7533724856096129E-09 -2.6521397969767813E-09 -2.5542229758884263E-09 -2.4595270303015850E-09 -2.3679592872422246E-09 +-2.2794293464381624E-09 -2.1938490346600368E-09 -2.1111323607632438E-09 -2.0311954714238463E-09 -1.9539566075614547E-09 +-1.8793360614421084E-09 -1.8072561344541806E-09 -1.7376410955504234E-09 -1.6704171403491970E-09 -1.6055123508880424E-09 +-1.5428566560226708E-09 -1.4823817924646077E-09 -1.4240212664506169E-09 -1.3677103160371425E-09 -1.3133858740129786E-09 +-1.2609865314234594E-09 -1.2104525016994246E-09 -1.1617255853842830E-09 -1.1147491354524999E-09 -1.0694680232129017E-09 +-1.0258286047901495E-09 -9.8377868817781876E-10 -9.4326750085654906E-10 -9.0424565797070743E-10 -8.6666513105708376E-10 +-8.3047921731916735E-10 -7.9564250944053160E-10 -7.6211086593096148E-10 -7.2984138199890943E-10 -6.9879236094397354E-10 +-6.6892328606303664E-10 -6.4019479306383106E-10 -6.1256864297963725E-10 -5.8600769557893823E-10 -5.6047588326379689E-10 +-5.3593818545084868E-10 -5.1236060342875190E-10 -4.8971013568604017E-10 -4.6795475370330382E-10 -4.4706337820368550E-10 +-4.2700585585572026E-10 -4.0775293642254650E-10 -3.8927625035160451E-10 -3.7154828679891635E-10 -3.5454237208212518E-10 +-3.3823264855647656E-10 -3.2259405390797982E-10 -3.0760230085800903E-10 -2.9323385727365428E-10 -2.7946592667816077E-10 +-2.6627642915583768E-10 -2.5364398264585037E-10 -2.4154788461935045E-10 -2.2996809413444247E-10 -2.1888521426351169E-10 +-2.0828047488748834E-10 -1.9813571585165323E-10 -1.8843337047764118E-10 -1.7915644942632107E-10 -1.7028852490628779E-10 +-1.6181371522272946E-10 -1.5371666966148436E-10 -1.4598255370312590E-10 -1.3859703456197451E-10 -1.3154626704496155E-10 +-1.2481687972531671E-10 -1.1839596142609057E-10 -1.1227104800856639E-10 -1.0643010946065593E-10 -1.0086153728041361E-10 +-9.5554132149850854E-11 -9.0497091894266982E-11 -8.5679999722361075E-11 -8.1092812742429622E-11 -7.6725850749995225E-11 +-7.2569785282257302E-11 -6.8615628934795700E-11 -6.4854724936003125E-11 -6.1278736974763994E-11 -5.7879639276938999E-11 +-5.4649706926261565E-11 -5.1581506425290706E-11 -4.8667886492112752E-11 -4.5901969088524059E-11 -4.3277140675471955E-11 +-4.0787043691575047E-11 -3.8425568250586577E-11 -3.6186844053708230E-11 -3.4065232512706143E-11 -3.2055319079824056E-11 +-3.0151905780532546E-11 -2.8350003945196225E-11 -2.6644827135786485E-11 -2.5031784263808708E-11 -2.3506472895658960E-11 +-2.2064672741667274E-11 -2.0702339325129957E-11 -1.9415597827675810E-11 -1.8200737107356128E-11 -1.7054203885890992E-11 +-1.5972597101549879E-11 -1.4952662424185914E-11 -1.3991286928989271E-11 -1.3085493925567264E-11 -1.2232437939002716E-11 +-1.1429399839586105E-11 -1.0673782117959979E-11 -9.9631043024578596E-12 -9.2949985154629632E-12 -8.6672051656557225E-12 +-8.0775687730616000E-12 -7.5240339238546199E-12 -7.0046413519141047E-12 -6.5175241441758167E-12 -6.0609040668607097E-12 +-5.6330880097077947E-12 -5.2324645453794849E-12 -4.8575006012507195E-12 -4.5067382408350141E-12 -4.1787915521428783E-12 +-3.8723436403097683E-12 -3.5861437218727912E-12 -3.3190043181167595E-12 -3.0697985449516457E-12 -2.8374574968249614E-12 +-2.6209677222133216E-12 -2.4193687882787123E-12 -2.2317509323153254E-12 -2.0572527976536141E-12 -1.8950592517282769E-12 +-1.7443992840571312E-12 -1.6045439819175269E-12 -1.4748045815467142E-12 -1.3545305927319370E-12 -1.2431079946950924E-12 +-1.1399575012158817E-12 -1.0445328929758975E-12 -9.5631941514463493E-13 -8.7483223826644918E-13 -7.9961498054547427E-13 +-7.3023828966310350E-13 -6.6629848229997172E-13 -6.0741623957145635E-13 -5.5323535662250191E-13 -5.0342154466402788E-13 +-4.5766128376942546E-13 -4.1566072478546995E-13 -3.7714463874761949E-13 -3.4185541222488702E-13 -3.0955208705445901E-13 +-2.8000944296084634E-13 -2.5301712158864376E-13 -2.2837879051197377E-13 -2.0591134581728477E-13 -1.8544415188948922E-13 +-1.6681831706436063E-13 -1.4988600384270575E-13 -1.3450977239406065E-13 -1.2056195610954238E-13 -1.0792406799500569E-13 +-9.6486236726793351E-14 -8.6146671223156019E-14 -7.6811152614803742E-14 -6.8392552528088046E-14 -6.0810376623933759E-14 +-5.3990332364906282E-14 -4.7863920011644570E-14 -4.2368045878369108E-14 -3.7444656905232212E-14 -3.3040395632951612E-14 +-2.9106274692429883E-14 -2.5597369948920003E-14 -2.2472531466744044E-14 -1.9694111486608109E-14 -1.7227708633175453E-14 +-1.5041927595762190E-14 -1.3108153549802392E-14 -1.1400340611088645E-14 -9.8948136387293649E-15 -8.5700827262733605E-15 +-7.4066697435314764E-15 -6.3869463142759133E-15 -5.4949826372161070E-15 -4.7164065794345629E-15 -4.0382724928175686E-15 +-3.4489392249297170E-15 -2.9379568162601882E-15 -2.4959613958089830E-15 -2.1145778065842513E-15 -1.7863295117453982E-15 +-1.5045553508517244E-15 -1.2633327339617138E-15 -1.0574068791744128E-15 -8.8212571661152655E-16 -7.3338009880721586E-16 +-6.0754897400273365E-16 -5.0144919493559872E-16 -4.1228965136896984E-16 -3.3762942982717554E-16 -2.7533971878940770E-16 +-2.2356919194679704E-16 -1.8071261605006952E-16 -1.4538244336777077E-16 -1.1638316184051860E-16 -9.2688188657390727E-17 +-7.3419105198724052E-17 -5.7827043088117311E-17 -4.5276042478193657E-17 -3.5228214662865287E-17 -2.7230551666860221E-17 +-2.0903235614735774E-17 -1.5929310430387086E-17 -1.2045587768266719E-17 -9.0346680335034392E-18 -6.7179659144437936E-18 +-4.9496380326808589E-18 -3.6113181174766012E-18 -2.6075725389877753E-18 -1.8619960934845696E-18 -1.3138746296934185E-18 +-9.1534744465324943E-19 -6.2900836647700016E-19 -4.2589008686406826E-19 -2.8378161510286899E-19 -1.8583370491137961E-19 +-1.1941176335294446E-19 -7.5160095095250666E-20 -4.6245373611852008E-20 -2.7750972020718722E-20 -1.6197238883664982E-20 +-9.1659775367657711E-21 -5.0102907841607671E-21 -2.6335957860391244E-21 -1.3240067516425943E-21 -6.3243598535370992E-22 +-2.8468763847328358E-22 -1.1952424047074969E-22 -4.6185114529319070E-23 -1.6139864915454378E-23 -4.9813532386835407E-24 +-1.3134103391970392E-24 -2.8177664103889677E-25 -4.5610504183900817E-26 -4.9083664747149533E-27 -2.7702677466016771E-28 +-4.8148324440257693E-30 -4.7125192509738767E-33 0.0000000000000000E+00 \ No newline at end of file diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/confs/std-fcc/POSCAR b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/confs/std-fcc/POSCAR new file mode 100755 index 00000000..2b9f10d0 --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/confs/std-fcc/POSCAR @@ -0,0 +1,17 @@ +Al4 + 1.0000000000000000 + 4.00 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 4.00 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 4.00 + Al + 4 +Direct + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.5000000000000000 0.5000000000000000 + 0.5000000000000000 0.0000000000000000 0.5000000000000000 + 0.5000000000000000 0.5000000000000000 0.0000000000000000 + + 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/global_bohrium.json b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/global_bohrium.json new file mode 100755 index 00000000..ef92c756 --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/global_bohrium.json @@ -0,0 +1,13 @@ +{ + "dflow_host": "https://workflows.deepmodeling.com", + "k8s_api_server": "https://workflows.deepmodeling.com", + "batch_type": "Bohrium", + "context_type": "Bohrium", + "email": "YOUREMAIL@abc.com", + "password": "password", + "program_id": 1234, + "apex_image_name":"registry.dp.tech/dptech/prod-11045/apex-dependency:1.2.0", + "lammps_image_name": "registry.dp.tech/dptech/deepmd-kit:3.1.1", + "lammps_run_command":"lmp -in in.lammps", + "scass_type":"c8_m31_1 * NVIDIA T4" +} diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/param_props.json b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/param_props.json new file mode 100755 index 00000000..f0f3f488 --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/param_props.json @@ -0,0 +1,27 @@ +{ + "structures": ["confs/std-*"], + "interaction": { + "type": "eam_alloy", + "model": "Al.eam.alloy", + "type_map": {"Al": 0} + }, + "properties": [ + { + "type": "eos", + "skip": false, + "vol_start": 0.6, + "vol_end": 1.4, + "vol_step": 0.1, + "cal_setting": {"etol": 0, + "ftol": 1e-10} + }, + { + "type": "elastic", + "skip": false, + "norm_deform": 1e-2, + "shear_deform": 1e-2, + "cal_setting": {"etol": 0, + "ftol": 1e-10} + } + ] +} diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/param_relax.json b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/param_relax.json new file mode 100755 index 00000000..93680ffd --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.1_bohrium/param_relax.json @@ -0,0 +1,14 @@ +{ + "structures": ["confs/std-*"], + "interaction": { + "type": "eam_alloy", + "model": "Al.eam.alloy", + "type_map": {"Al": 0} + }, + "relaxation": { + "cal_setting": {"etol": 0, + "ftol": 1e-10, + "maxiter": 5000, + "maximal": 500000} + } +} diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/Al.eam.alloy b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/Al.eam.alloy new file mode 100755 index 00000000..b05f1803 --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/Al.eam.alloy @@ -0,0 +1,4923 @@ +! EAM potential for Al from the original analytical potential in file Al-EAM-Zhak1 of 2 October 2007. +! Vasily V. Zhakhovsky: 6asi1z@gmail.com. The potential is fitted by stress-matching method upto compression V/V0=0.3 +! bulk modulus B=81.57 GPa at (P=0,T=0). See details in Appl. Surf. Sci., vol.255, pp. 9592-9596 (2009) + 1 Al + 8193 6.7138671875E-04 8193 8.392333984375E-04 6.875 +13 26.9815384 4.032 fcc + 0.0000000000000000E+00 -6.3980610815881616E-03 -1.2780087746439362E-02 -1.9146131609598164E-02 -2.5496244064162111E-02 +-3.1830476282473409E-02 -3.8148879217302950E-02 -4.4451503603026750E-02 -5.0738399956794779E-02 -5.7009618579692320E-02 +-6.3265209557893928E-02 -6.9505222763809896E-02 -7.5729707857225548E-02 -8.1938714286432998E-02 -8.8132291289356054E-02 +-9.4310487894667575E-02 -1.0047335292289995E-01 -1.0662093498754849E-01 -1.1275328249616762E-01 -1.1887044365146048E-01 +-1.2497246645236110E-01 -1.3105939869511032E-01 -1.3713128797432445E-01 -1.4318818168405720E-01 -1.4923012701885524E-01 +-1.5525717097480685E-01 -1.6126936035058384E-01 -1.6726674174847725E-01 -1.7324936157542620E-01 -1.7921726604404065E-01 +-1.8517050117361730E-01 -1.9110911279114950E-01 -1.9703314653233064E-01 -2.0294264784255128E-01 -2.0883766197789014E-01 +-2.1471823400609871E-01 -2.2058440880758026E-01 -2.2643623107636177E-01 -2.3227374532106085E-01 -2.3809699586584576E-01 +-2.4390602685139035E-01 -2.4970088223582243E-01 -2.5548160579566631E-01 -2.6124824112677997E-01 -2.6700083164528560E-01 +-2.7273942058849571E-01 -2.7846405101583172E-01 -2.8417476580973894E-01 -2.8987160767659403E-01 -2.9555461914760800E-01 +-3.0122384257972362E-01 -3.0687932015650665E-01 -3.1252109388903221E-01 -3.1814920561676563E-01 -3.2376369700843777E-01 +-3.2936460956291469E-01 -3.3495198461006304E-01 -3.4052586331160889E-01 -3.4608628666199176E-01 -3.5163329548921457E-01 +-3.5716693045568659E-01 -3.6268723205906173E-01 -3.6819424063307360E-01 -3.7368799634836286E-01 -3.7916853921330085E-01 +-3.8463590907480871E-01 -3.9009014561916999E-01 -3.9553128837284085E-01 -4.0095937670325221E-01 -4.0637444981960918E-01 +-4.1177654677368586E-01 -4.1716570646061457E-01 -4.2254196761966917E-01 -4.2790536883504643E-01 -4.3325594853664073E-01 +-4.3859374500081461E-01 -4.4391879635116449E-01 -4.4923114055928232E-01 -4.5453081544551249E-01 -4.5981785867970415E-01 +-4.6509230778195859E-01 -4.7035420012337292E-01 -4.7560357292677935E-01 -4.8084046326747909E-01 -4.8606490807397301E-01 +-4.9127694412868728E-01 -4.9647660806869481E-01 -5.0166393638643314E-01 -5.0683896543041651E-01 -5.1200173140594563E-01 +-5.1715227037581157E-01 -5.2229061826099710E-01 -5.2741681084137171E-01 -5.3253088375638546E-01 -5.3763287250575564E-01 +-5.4272281245015264E-01 -5.4780073881187807E-01 -5.5286668667554240E-01 -5.5792069098873676E-01 -5.6296278656270082E-01 +-5.6799300807298725E-01 -5.7301139006012269E-01 -5.7801796693026386E-01 -5.8301277295584997E-01 -5.8799584227625301E-01 +-5.9296720889842125E-01 -5.9792690669752191E-01 -6.0287496941757857E-01 -6.0781143067210541E-01 -6.1273632394473598E-01 +-6.1764968258985264E-01 -6.2255153983320777E-01 -6.2744192877254312E-01 -6.3232088237820683E-01 -6.3718843349376453E-01 +-6.4204461483660968E-01 -6.4688945899856709E-01 -6.5172299844649595E-01 -6.5654526552288817E-01 -6.6135629244646288E-01 +-6.6615611131275820E-01 -6.7094475409471876E-01 -6.7572225264328145E-01 -6.8048863868795639E-01 -6.8524394383740483E-01 +-6.8998819958001401E-01 -6.9472143728446933E-01 -6.9944368820032166E-01 -7.0415498345855265E-01 -7.0885535407213718E-01 +-7.1354483093660126E-01 -7.1822344483057787E-01 -7.2289122641635906E-01 -7.2754820624044525E-01 -7.3219441473409097E-01 +-7.3682988221384871E-01 -7.4145463888210783E-01 -7.4606871482763215E-01 -7.5067214002609273E-01 -7.5526494434060099E-01 +-7.5984715752223342E-01 -7.6441880921055916E-01 -7.6897992893416089E-01 -7.7353054611115368E-01 -7.7807069004970031E-01 +-7.8260038994852643E-01 -7.8711967489743007E-01 -7.9162857387778784E-01 -7.9612711576306161E-01 -8.0061532931929869E-01 +-8.0509324320563203E-01 -8.0956088597477571E-01 -8.1401828607351900E-01 -8.1846547184321594E-01 -8.2290247152027596E-01 +-8.2732931323664538E-01 -8.3174602502029404E-01 -8.3615263479569168E-01 -8.4054917038428800E-01 -8.4493565950498584E-01 +-8.4931212977461368E-01 -8.5367860870839474E-01 -8.5803512372041402E-01 -8.6238170212408294E-01 -8.6671837113260020E-01 +-8.7104515785941183E-01 -8.7536208931866744E-01 -8.7966919242567443E-01 -8.8396649399734928E-01 -8.8825402075266757E-01 +-8.9253179931310944E-01 -8.9679985620310476E-01 -9.0105821785047624E-01 -9.0530691058687529E-01 -9.0954596064822291E-01 +-9.1377539417514164E-01 -9.1799523721338971E-01 -9.2220551571428966E-01 -9.2640625553515699E-01 -9.3059748243972407E-01 +-9.3477922209856457E-01 -9.3895150008951367E-01 -9.4311434189808574E-01 -9.4726777291789188E-01 -9.5141181845105205E-01 +-9.5554650370860938E-01 -9.5967185381093600E-01 -9.6378789378814333E-01 -9.6789464858048602E-01 -9.7199214303876480E-01 +-9.7608040192472667E-01 -9.8015944991146475E-01 -9.8422931158381322E-01 -9.8829001143874307E-01 -9.9234157388575273E-01 +-9.9638402324725928E-01 -1.0004173837589863E+00 -1.0044416795703488E+00 -1.0084569347448391E+00 -1.0124631732604059E+00 +-1.0164604190098367E+00 -1.0204486958011341E+00 -1.0244280273578910E+00 -1.0283984373196664E+00 -1.0323599492423556E+00 +-1.0363125865985594E+00 -1.0402563727779541E+00 -1.0441913310876558E+00 -1.0481174847525840E+00 -1.0520348569158255E+00 +-1.0559434706389921E+00 -1.0598433489025807E+00 -1.0637345146063288E+00 -1.0676169905695700E+00 -1.0714907995315843E+00 +-1.0753559641519510E+00 -1.0792125070108969E+00 -1.0830604506096431E+00 -1.0868998173707503E+00 -1.0907306296384620E+00 +-1.0945529096790474E+00 -1.0983666796811400E+00 -1.1021719617560755E+00 -1.1059687779382292E+00 -1.1097571501853492E+00 +-1.1135371003788910E+00 -1.1173086503243468E+00 -1.1210718217515754E+00 -1.1248266363151305E+00 -1.1285731155945860E+00 +-1.1323112810948601E+00 -1.1360411542465385E+00 -1.1397627564061943E+00 -1.1434761088567096E+00 -1.1471812328075883E+00 +-1.1508781493952780E+00 -1.1545668796834805E+00 -1.1582474446634645E+00 -1.1619198652543787E+00 -1.1655841623035592E+00 +-1.1692403565868390E+00 -1.1728884688088537E+00 -1.1765285196033450E+00 -1.1801605295334661E+00 -1.1837845190920824E+00 +-1.1874005087020700E+00 -1.1910085187166175E+00 -1.1946085694195188E+00 -1.1982006810254731E+00 -1.2017848736803753E+00 +-1.2053611674616100E+00 -1.2089295823783435E+00 -1.2124901383718101E+00 -1.2160428553156031E+00 -1.2195877530159611E+00 +-1.2231248512120514E+00 -1.2266541695762552E+00 -1.2301757277144487E+00 -1.2336895451662855E+00 -1.2371956414054741E+00 +-1.2406940358400571E+00 -1.2441847478126871E+00 -1.2476677966009024E+00 -1.2511432014174004E+00 -1.2546109814103106E+00 +-1.2580711556634638E+00 -1.2615237431966646E+00 -1.2649687629659565E+00 -1.2684062338638924E+00 -1.2718361747197968E+00 +-1.2752586043000327E+00 -1.2786735413082617E+00 -1.2820810043857103E+00 -1.2854810121114240E+00 -1.2888735830025326E+00 +-1.2922587355145030E+00 -1.2956364880413977E+00 -1.2990068589161314E+00 -1.3023698664107217E+00 -1.3057255287365441E+00 +-1.3090738640445827E+00 -1.3124148904256809E+00 -1.3157486259107882E+00 -1.3190750884712106E+00 -1.3223942960188553E+00 +-1.3257062664064765E+00 -1.3290110174279195E+00 -1.3323085668183621E+00 -1.3355989322545585E+00 -1.3388821313550789E+00 +-1.3421581816805463E+00 -1.3454271007338781E+00 -1.3486889059605212E+00 -1.3519436147486870E+00 -1.3551912444295884E+00 +-1.3584318122776695E+00 -1.3616653355108419E+00 -1.3648918312907121E+00 -1.3681113167228138E+00 -1.3713238088568367E+00 +-1.3745293246868528E+00 -1.3777278811515432E+00 -1.3809194951344248E+00 -1.3841041834640759E+00 -1.3872819629143534E+00 +-1.3904528502046229E+00 -1.3936168619999747E+00 -1.3967740149114454E+00 -1.3999243254962372E+00 -1.4030678102579346E+00 +-1.4062044856467231E+00 -1.4093343680596031E+00 -1.4124574738406064E+00 -1.4155738192810079E+00 -1.4186834206195398E+00 +-1.4217862940426038E+00 -1.4248824556844806E+00 -1.4279719216275382E+00 -1.4310547079024438E+00 -1.4341308304883693E+00 +-1.4372003053131976E+00 -1.4402631482537294E+00 -1.4433193751358879E+00 -1.4463690017349198E+00 -1.4494120437756022E+00 +-1.4524485169324410E+00 -1.4554784368298734E+00 -1.4585018190424661E+00 -1.4615186790951151E+00 -1.4645290324632450E+00 +-1.4675328945730011E+00 -1.4705302808014526E+00 -1.4735212064767806E+00 -1.4765056868784767E+00 -1.4794837372375345E+00 +-1.4824553727366423E+00 -1.4854206085103727E+00 -1.4883794596453768E+00 -1.4913319411805712E+00 -1.4942780681073256E+00 +-1.4972178553696529E+00 -1.5001513178643955E+00 -1.5030784704414093E+00 -1.5059993279037525E+00 -1.5089139050078655E+00 +-1.5118222164637583E+00 -1.5147242769351901E+00 -1.5176201010398527E+00 -1.5205097033495485E+00 -1.5233930983903745E+00 +-1.5262703006428993E+00 -1.5291413245423402E+00 -1.5320061844787416E+00 -1.5348648947971535E+00 -1.5377174697978022E+00 +-1.5405639237362727E+00 -1.5434042708236753E+00 -1.5462385252268231E+00 -1.5490667010684036E+00 -1.5518888124271497E+00 +-1.5547048733380116E+00 -1.5575148977923274E+00 -1.5603188997379884E+00 -1.5631168930796138E+00 -1.5659088916787132E+00 +-1.5686949093538560E+00 -1.5714749598808369E+00 -1.5742490569928418E+00 -1.5770172143806125E+00 -1.5797794456926082E+00 +-1.5825357645351721E+00 -1.5852861844726918E+00 -1.5880307190277605E+00 -1.5907693816813393E+00 -1.5935021858729166E+00 +-1.5962291450006663E+00 -1.5989502724216085E+00 -1.6016655814517657E+00 -1.6043750853663226E+00 -1.6070787973997782E+00 +-1.6097767307461048E+00 -1.6124688985589024E+00 -1.6151553139515531E+00 -1.6178359899973733E+00 -1.6205109397297690E+00 +-1.6231801761423852E+00 -1.6258437121892602E+00 -1.6285015607849738E+00 -1.6311537348048000E+00 -1.6338002470848538E+00 +-1.6364411104222427E+00 -1.6390763375752118E+00 -1.6417059412632944E+00 -1.6443299341674549E+00 -1.6469483289302387E+00 +-1.6495611381559154E+00 -1.6521683744106244E+00 -1.6547700502225178E+00 -1.6573661780819053E+00 -1.6599567704413969E+00 +-1.6625418397160427E+00 -1.6651213982834776E+00 -1.6676954584840606E+00 -1.6702640326210150E+00 -1.6728271329605680E+00 +-1.6753847717320898E+00 -1.6779369611282320E+00 -1.6804837133050645E+00 -1.6830250403822149E+00 -1.6855609544430019E+00 +-1.6880914675345726E+00 -1.6906165916680389E+00 -1.6931363388186111E+00 -1.6956507209257297E+00 -1.6981597498932033E+00 +-1.7006634375893386E+00 -1.7031617958470726E+00 -1.7056548364641044E+00 -1.7081425712030294E+00 -1.7106250117914634E+00 +-1.7131021699221787E+00 -1.7155740572532303E+00 -1.7180406854080847E+00 -1.7205020659757493E+00 -1.7229582105108994E+00 +-1.7254091305340051E+00 -1.7278548375314577E+00 -1.7302953429556960E+00 -1.7327306582253312E+00 -1.7351607947252727E+00 +-1.7375857638068499E+00 -1.7400055767879401E+00 -1.7424202449530866E+00 -1.7448297795536261E+00 -1.7472341918078076E+00 +-1.7496334929009132E+00 -1.7520276939853840E+00 -1.7544168061809360E+00 -1.7568008405746804E+00 -1.7591798082212455E+00 +-1.7615537201428926E+00 -1.7639225873296371E+00 -1.7662864207393636E+00 -1.7686452312979479E+00 -1.7709990298993665E+00 +-1.7733478274058194E+00 -1.7756916346478431E+00 -1.7780304624244265E+00 -1.7803643215031246E+00 -1.7826932226201759E+00 +-1.7850171764806109E+00 -1.7873361937583703E+00 -1.7896502850964167E+00 -1.7919594611068432E+00 -1.7942637323709913E+00 +-1.7965631094395578E+00 -1.7988576028327066E+00 -1.8011472230401799E+00 -1.8034319805214065E+00 -1.8057118857056158E+00 +-1.8079869489919382E+00 -1.8102571807495222E+00 -1.8125225913176390E+00 -1.8147831910057870E+00 -1.8170389900938038E+00 +-1.8192899988319711E+00 -1.8215362274411189E+00 -1.8237776861127335E+00 -1.8260143850090631E+00 -1.8282463342632191E+00 +-1.8304735439792863E+00 -1.8326960242324193E+00 -1.8349137850689516E+00 -1.8371268365064994E+00 -1.8393351885340583E+00 +-1.8415388511121096E+00 -1.8437378341727222E+00 -1.8459321476196520E+00 -1.8481218013284446E+00 -1.8503068051465330E+00 +-1.8524871688933398E+00 -1.8546629023603771E+00 -1.8568340153113438E+00 -1.8590005174822248E+00 -1.8611624185813891E+00 +-1.8633197282896905E+00 -1.8654724562605598E+00 -1.8676206121201064E+00 -1.8697642054672130E+00 -1.8719032458736289E+00 +-1.8740377428840747E+00 -1.8761677060163267E+00 -1.8782931447613189E+00 -1.8804140685832358E+00 -1.8825304869196049E+00 +-1.8846424091813947E+00 -1.8867498447531026E+00 -1.8888528029928520E+00 -1.8909512932324843E+00 -1.8930453247776480E+00 +-1.8951349069078967E+00 -1.8972200488767721E+00 -1.8993007599119018E+00 -1.9013770492150892E+00 -1.9034489259624012E+00 +-1.9055163993042588E+00 -1.9075794783655264E+00 -1.9096381722456026E+00 -1.9116924900185115E+00 -1.9137424407329819E+00 +-1.9157880334125439E+00 -1.9178292770556147E+00 -1.9198661806355821E+00 -1.9218987531008989E+00 -1.9239270033751601E+00 +-1.9259509403571966E+00 -1.9279705729211583E+00 -1.9299859099165995E+00 -1.9319969601685629E+00 -1.9340037324776678E+00 +-1.9360062356201928E+00 -1.9380044783481563E+00 -1.9399984693894083E+00 -1.9419882174477048E+00 -1.9439737312027978E+00 +-1.9459550193105140E+00 -1.9479320904028399E+00 -1.9499049530879993E+00 -1.9518736159505428E+00 -1.9538380875514205E+00 +-1.9557983764280689E+00 -1.9577544910944886E+00 -1.9597064400413278E+00 -1.9616542317359580E+00 -1.9635978746225566E+00 +-1.9655373771221862E+00 -1.9674727476328737E+00 -1.9694039945296860E+00 -1.9713311261648119E+00 -1.9732541508676418E+00 +-1.9751730769448370E+00 -1.9770879126804188E+00 -1.9789986663358350E+00 -1.9809053461500448E+00 -1.9828079603395898E+00 +-1.9847065170986731E+00 -1.9866010245992327E+00 -1.9884914909910221E+00 -1.9903779244016797E+00 -1.9922603329368058E+00 +-1.9941387246800379E+00 -1.9960131076931265E+00 -1.9978834900160054E+00 -1.9997498796668682E+00 -2.0016122846422411E+00 +-2.0034707129170544E+00 -2.0053251724447203E+00 -2.0071756711571989E+00 -2.0090222169650747E+00 -2.0108648177576267E+00 +-2.0127034814029017E+00 -2.0145382157477854E+00 -2.0163690286180702E+00 -2.0181959278185317E+00 -2.0200189211329933E+00 +-2.0218380163244030E+00 -2.0236532211348970E+00 -2.0254645432858722E+00 -2.0272719904780558E+00 -2.0290755703915759E+00 +-2.0308752906860272E+00 -2.0326711590005391E+00 -2.0344631829538482E+00 -2.0362513701443636E+00 -2.0380357281502346E+00 +-2.0398162645294184E+00 -2.0415929868197478E+00 -2.0433659025389974E+00 -2.0451350191849507E+00 -2.0469003442354681E+00 +-2.0486618851485487E+00 -2.0504196493624010E+00 -2.0521736442955043E+00 -2.0539238773466804E+00 -2.0556703558951503E+00 +-2.0574130873006027E+00 -2.0591520789032627E+00 -2.0608873380239512E+00 -2.0626188719641489E+00 -2.0643466880060624E+00 +-2.0660707934126865E+00 -2.0677911954278700E+00 -2.0695079012763733E+00 -2.0712209181639367E+00 -2.0729302532773399E+00 +-2.0746359137844657E+00 -2.0763379068343619E+00 -2.0780362395573020E+00 -2.0797309190648470E+00 -2.0814219524499094E+00 +-2.0831093467868120E+00 -2.0847931091313465E+00 -2.0864732465208387E+00 -2.0881497659742063E+00 -2.0898226744920207E+00 +-2.0914919790565643E+00 -2.0931576866318915E+00 -2.0948198041638890E+00 -2.0964783385803343E+00 -2.0981332967909552E+00 +-2.0997846856874869E+00 -2.1014325121437323E+00 -2.1030767830156183E+00 -2.1047175051412577E+00 -2.1063546853410031E+00 +-2.1079883304175060E+00 -2.1096184471557731E+00 -2.1112450423232270E+00 -2.1128681226697594E+00 -2.1144876949277878E+00 +-2.1161037658123152E+00 -2.1177163420209832E+00 -2.1193254302341304E+00 -2.1209310371148460E+00 -2.1225331693090266E+00 +-2.1241318334454333E+00 -2.1257270361357432E+00 -2.1273187839746086E+00 -2.1289070835397075E+00 -2.1304919413918002E+00 +-2.1320733640747860E+00 -2.1336513581157530E+00 -2.1352259300250340E+00 -2.1367970862962622E+00 -2.1383648334064209E+00 +-2.1399291778158993E+00 -2.1414901259685459E+00 -2.1430476842917190E+00 -2.1446018591963427E+00 -2.1461526570769567E+00 +-2.1477000843117700E+00 -2.1492441472627117E+00 -2.1507848522754855E+00 -2.1523222056796176E+00 -2.1538562137885129E+00 +-2.1553868828995006E+00 -2.1569142192938902E+00 -2.1584382292370208E+00 -2.1599589189783113E+00 -2.1614762947513113E+00 +-2.1629903627737512E+00 -2.1645011292475944E+00 -2.1660086003590822E+00 -2.1675127822787883E+00 -2.1690136811616694E+00 +-2.1705113031471068E+00 -2.1720056543589661E+00 -2.1734967409056378E+00 -2.1749845688800917E+00 -2.1764691443599200E+00 +-2.1779504734073911E+00 -2.1794285620694964E+00 -2.1809034163779963E+00 -2.1823750423494701E+00 -2.1838434459853628E+00 +-2.1853086332720335E+00 -2.1867706101808015E+00 -2.1882293826679953E+00 -2.1896849566749985E+00 -2.1911373381282959E+00 +-2.1925865329395218E+00 -2.1940325470055053E+00 -2.1954753862083178E+00 -2.1969150564153157E+00 -2.1983515634791946E+00 +-2.1997849132380236E+00 -2.2012151115153000E+00 -2.2026421641199914E+00 -2.2040660768465803E+00 -2.2054868554751108E+00 +-2.2069045057712326E+00 -2.2083190334862461E+00 -2.2097304443571471E+00 -2.2111387441066706E+00 -2.2125439384433370E+00 +-2.2139460330614922E+00 -2.2153450336413569E+00 -2.2167409458490672E+00 -2.2181337753367165E+00 -2.2195235277424032E+00 +-2.2209102086902717E+00 -2.2222938237905550E+00 -2.2236743786396200E+00 -2.2250518788200053E+00 -2.2264263299004710E+00 +-2.2277977374360369E+00 -2.2291661069680249E+00 -2.2305314440240998E+00 -2.2318937541183166E+00 -2.2332530427511590E+00 +-2.2346093154095783E+00 -2.2359625775670402E+00 -2.2373128346835629E+00 -2.2386600922057607E+00 -2.2400043555668816E+00 +-2.2413456301868533E+00 -2.2426839214723193E+00 -2.2440192348166805E+00 -2.2453515756001381E+00 -2.2466809491897348E+00 +-2.2480073609393885E+00 -2.2493308161899384E+00 -2.2506513202691831E+00 -2.2519688784919216E+00 -2.2532834961599897E+00 +-2.2545951785623028E+00 -2.2559039309748927E+00 -2.2572097586609505E+00 -2.2585126668708604E+00 -2.2598126608422437E+00 +-2.2611097457999927E+00 -2.2624039269563152E+00 -2.2636952095107676E+00 -2.2649835986502969E+00 -2.2662690995492740E+00 +-2.2675517173695394E+00 -2.2688314572604344E+00 -2.2701083243588420E+00 -2.2713823237892243E+00 -2.2726534606636588E+00 +-2.2739217400818759E+00 -2.2751871671313006E+00 -2.2764497468870815E+00 -2.2777094844121351E+00 -2.2789663847571782E+00 +-2.2802204529607684E+00 -2.2814716940493347E+00 -2.2827201130372203E+00 -2.2839657149267150E+00 -2.2852085047080957E+00 +-2.2864484873596549E+00 -2.2876856678477449E+00 -2.2889200511268073E+00 -2.2901516421394126E+00 -2.2913804458162952E+00 +-2.2926064670763862E+00 -2.2938297108268513E+00 -2.2950501819631248E+00 -2.2962678853689464E+00 -2.2974828259163922E+00 +-2.2986950084659146E+00 -2.2999044378663722E+00 -2.3011111189550677E+00 -2.3023150565577808E+00 -2.3035162554888027E+00 +-2.3047147205509702E+00 -2.3059104565356994E+00 -2.3071034682230218E+00 -2.3082937603816154E+00 -2.3094813377688390E+00 +-2.3106662051307660E+00 -2.3118483672022192E+00 -2.3130278287068027E+00 -2.3142045943569336E+00 -2.3153786688538784E+00 +-2.3165500568877850E+00 -2.3177187631377132E+00 -2.3188847922716689E+00 -2.3200481489466398E+00 -2.3212088378086233E+00 +-2.3223668634926602E+00 -2.3235222306228684E+00 -2.3246749438124743E+00 -2.3258250076638425E+00 -2.3269724267685121E+00 +-2.3281172057072270E+00 -2.3292593490499653E+00 -2.3303988613559725E+00 -2.3315357471737941E+00 -2.3326700110413050E+00 +-2.3338016574857425E+00 -2.3349306910237364E+00 -2.3360571161613408E+00 -2.3371809373940629E+00 -2.3383021592068958E+00 +-2.3394207860743501E+00 -2.3405368224604830E+00 -2.3416502728189288E+00 -2.3427611415929301E+00 -2.3438694332153664E+00 +-2.3449751521087872E+00 -2.3460783026854366E+00 -2.3471788893472936E+00 -2.3482769164860895E+00 -2.3493723884833457E+00 +-2.3504653097104020E+00 -2.3515556845284449E+00 -2.3526435172885365E+00 -2.3537288123316458E+00 -2.3548115739886786E+00 +-2.3558918065805012E+00 -2.3569695144179788E+00 -2.3580447018019930E+00 -2.3591173730234818E+00 -2.3601875323634607E+00 +-2.3612551840930545E+00 -2.3623203324735247E+00 -2.3633829817562995E+00 -2.3644431361830005E+00 -2.3655007999854698E+00 +-2.3665559773858051E+00 -2.3676086725963779E+00 -2.3686588898198657E+00 -2.3697066332492840E+00 -2.3707519070680099E+00 +-2.3717947154498065E+00 -2.3728350625588588E+00 -2.3738729525497941E+00 -2.3749083895677123E+00 -2.3759413777482132E+00 +-2.3769719212174243E+00 -2.3780000240920240E+00 -2.3790256904792746E+00 -2.3800489244770469E+00 -2.3810697301738410E+00 +-2.3820881116488244E+00 -2.3831040729718498E+00 -2.3841176182034829E+00 -2.3851287513950359E+00 -2.3861374765885830E+00 +-2.3871437978169934E+00 -2.3881477191039577E+00 -2.3891492444640123E+00 -2.3901483779025621E+00 -2.3911451234159156E+00 +-2.3921394849913016E+00 -2.3931314666068988E+00 -2.3941210722318615E+00 -2.3951083058263443E+00 -2.3960931713415290E+00 +-2.3970756727196494E+00 -2.3980558138940147E+00 -2.3990335987890363E+00 -2.4000090313202551E+00 -2.4009821153943629E+00 +-2.4019528549092275E+00 -2.4029212537539228E+00 -2.4038873158087473E+00 -2.4048510449452505E+00 -2.4058124450262603E+00 +-2.4067715199059045E+00 -2.4077282734296372E+00 -2.4086827094342631E+00 -2.4096348317479572E+00 -2.4105846441902985E+00 +-2.4115321505722842E+00 -2.4124773546963594E+00 -2.4134202603564421E+00 -2.4143608713379403E+00 -2.4152991914177857E+00 +-2.4162352243644469E+00 -2.4171689739379620E+00 -2.4181004438899567E+00 -2.4190296379636695E+00 -2.4199565598939774E+00 +-2.4208812134074122E+00 -2.4218036022221940E+00 -2.4227237300482463E+00 -2.4236416005872208E+00 -2.4245572175325232E+00 +-2.4254705845693345E+00 -2.4263817053746322E+00 -2.4272905836172156E+00 -2.4281972229577282E+00 -2.4291016270486772E+00 +-2.4300037995344637E+00 -2.4309037440513941E+00 -2.4318014642277128E+00 -2.4326969636836178E+00 -2.4335902460312879E+00 +-2.4344813148749003E+00 -2.4353701738106550E+00 -2.4362568264267992E+00 -2.4371412763036444E+00 -2.4380235270135917E+00 +-2.4389035821211529E+00 -2.4397814451829709E+00 -2.4406571197478439E+00 -2.4415306093567466E+00 -2.4424019175428477E+00 +-2.4432710478315385E+00 -2.4441380037404459E+00 -2.4450027887794623E+00 -2.4458654064507597E+00 -2.4467258602488164E+00 +-2.4475841536604337E+00 -2.4484402901647604E+00 -2.4492942732333125E+00 -2.4501461063299912E+00 -2.4509957929111095E+00 +-2.4518433364254086E+00 -2.4526887403140827E+00 -2.4535320080107921E+00 -2.4543731429416913E+00 -2.4552121485254479E+00 +-2.4560490281732599E+00 -2.4568837852888796E+00 -2.4577164232686322E+00 -2.4585469455014368E+00 -2.4593753553688216E+00 +-2.4602016562449589E+00 -2.4610258514966628E+00 -2.4618479444834285E+00 -2.4626679385574435E+00 -2.4634858370636068E+00 +-2.4643016433395539E+00 -2.4651153607156702E+00 -2.4659269925151164E+00 -2.4667365420538427E+00 -2.4675440126406136E+00 +-2.4683494075770249E+00 -2.4691527301575200E+00 -2.4699539836694160E+00 -2.4707531713929183E+00 -2.4715502966011393E+00 +-2.4723453625601199E+00 -2.4731383725288478E+00 -2.4739293297592777E+00 -2.4747182374963472E+00 -2.4755050989779988E+00 +-2.4762899174351967E+00 -2.4770726960919474E+00 -2.4778534381653161E+00 -2.4786321468654462E+00 -2.4794088253955819E+00 +-2.4801834769520803E+00 -2.4809561047244326E+00 -2.4817267118952837E+00 -2.4824953016404510E+00 -2.4832618771289376E+00 +-2.4840264415229583E+00 -2.4847889979779505E+00 -2.4855495496425970E+00 -2.4863080996588436E+00 -2.4870646511619148E+00 +-2.4878192072803325E+00 -2.4885717711359376E+00 -2.4893223458438998E+00 -2.4900709345127465E+00 -2.4908175402443686E+00 +-2.4915621661340475E+00 -2.4923048152704679E+00 -2.4930454907357369E+00 -2.4937841956054001E+00 -2.4945209329484630E+00 +-2.4952557058274025E+00 -2.4959885172981888E+00 -2.4967193704102999E+00 -2.4974482682067429E+00 -2.4981752137240654E+00 +-2.4989002099923763E+00 -2.4996232600353632E+00 -2.5003443668703071E+00 -2.5010635335081020E+00 -2.5017807629532696E+00 +-2.5024960582039752E+00 -2.5032094222520502E+00 -2.5039208580830006E+00 -2.5046303686760294E+00 -2.5053379570040550E+00 +-2.5060436260337200E+00 -2.5067473787254149E+00 -2.5074492180332908E+00 -2.5081491469052777E+00 -2.5088471682830993E+00 +-2.5095432851022910E+00 -2.5102375002922153E+00 -2.5109298167760770E+00 -2.5116202374709431E+00 -2.5123087652877518E+00 +-2.5129954031313373E+00 -2.5136801539004412E+00 -2.5143630204877248E+00 -2.5150440057797931E+00 -2.5157231126572048E+00 +-2.5164003439944898E+00 -2.5170757026601667E+00 -2.5177491915167534E+00 -2.5184208134207902E+00 -2.5190905712228484E+00 +-2.5197584677675513E+00 -2.5204245058935859E+00 -2.5210886884337191E+00 -2.5217510182148155E+00 -2.5224114980578505E+00 +-2.5230701307779255E+00 -2.5237269191842846E+00 -2.5243818660803292E+00 -2.5250349742636318E+00 -2.5256862465259555E+00 +-2.5263356856532622E+00 -2.5269832944257340E+00 -2.5276290756177846E+00 -2.5282730319980753E+00 -2.5289151663295302E+00 +-2.5295554813693522E+00 -2.5301939798690332E+00 -2.5308306645743746E+00 -2.5314655382254991E+00 -2.5320986035568644E+00 +-2.5327298632972810E+00 -2.5333593201699220E+00 -2.5339869768923435E+00 -2.5346128361764952E+00 -2.5352369007287359E+00 +-2.5358591732498472E+00 -2.5364796564350480E+00 -2.5370983529740121E+00 -2.5377152655508768E+00 -2.5383303968442599E+00 +-2.5389437495272751E+00 -2.5395553262675459E+00 -2.5401651297272156E+00 -2.5407731625629681E+00 -2.5413794274260355E+00 +-2.5419839269622182E+00 -2.5425866638118904E+00 -2.5431876406100247E+00 -2.5437868599861941E+00 -2.5443843245645987E+00 +-2.5449800369640694E+00 -2.5455739997980849E+00 -2.5461662156747846E+00 -2.5467566871969849E+00 -2.5473454169621901E+00 +-2.5479324075626075E+00 -2.5485176615851590E+00 -2.5491011816114955E+00 -2.5496829702180119E+00 -2.5502630299758580E+00 +-2.5508413634509557E+00 -2.5514179732040048E+00 -2.5519928617905050E+00 -2.5525660317607639E+00 -2.5531374856599101E+00 +-2.5537072260279099E+00 -2.5542752553995758E+00 -2.5548415763045829E+00 -2.5554061912674819E+00 -2.5559691028077096E+00 +-2.5565303134396040E+00 -2.5570898256724170E+00 -2.5576476420103260E+00 -2.5582037649524469E+00 -2.5587581969928483E+00 +-2.5593109406205632E+00 -2.5598619983196027E+00 -2.5604113725689666E+00 -2.5609590658426562E+00 -2.5615050806096926E+00 +-2.5620494193341190E+00 -2.5625920844750221E+00 -2.5631330784865414E+00 -2.5636724038178782E+00 -2.5642100629133160E+00 +-2.5647460582122261E+00 -2.5652803921490812E+00 -2.5658130671534680E+00 -2.5663440856501039E+00 -2.5668734500588410E+00 +-2.5674011627946829E+00 -2.5679272262678001E+00 -2.5684516428835327E+00 -2.5689744150424141E+00 -2.5694955451401746E+00 +-2.5700150355677533E+00 -2.5705328887113197E+00 -2.5710491069522710E+00 -2.5715636926672563E+00 -2.5720766482281818E+00 +-2.5725879760022266E+00 -2.5730976783518491E+00 -2.5736057576348048E+00 -2.5741122162041563E+00 -2.5746170564082806E+00 +-2.5751202805908862E+00 -2.5756218910910240E+00 -2.5761218902430927E+00 -2.5766202803768623E+00 -2.5771170638174721E+00 +-2.5776122428854515E+00 -2.5781058198967282E+00 -2.5785977971626393E+00 -2.5790881769899441E+00 -2.5795769616808331E+00 +-2.5800641535329434E+00 -2.5805497548393643E+00 -2.5810337678886532E+00 -2.5815161949648440E+00 -2.5819970383474611E+00 +-2.5824763003115287E+00 -2.5829539831275810E+00 -2.5834300890616735E+00 -2.5839046203753968E+00 -2.5843775793258859E+00 +-2.5848489681658284E+00 -2.5853187891434812E+00 -2.5857870445026738E+00 -2.5862537364828286E+00 -2.5867188673189632E+00 +-2.5871824392417051E+00 -2.5876444544773047E+00 -2.5881049152476399E+00 -2.5885638237702322E+00 -2.5890211822582545E+00 +-2.5894769929205443E+00 -2.5899312579616121E+00 -2.5903839795816506E+00 -2.5908351599765500E+00 -2.5912848013379057E+00 +-2.5917329058530267E+00 -2.5921794757049512E+00 -2.5926245130724501E+00 -2.5930680201300476E+00 -2.5935099990480186E+00 +-2.5939504519924106E+00 -2.5943893811250471E+00 -2.5948267886035410E+00 -2.5952626765813025E+00 -2.5956970472075520E+00 +-2.5961299026273301E+00 -2.5965612449815030E+00 -2.5969910764067801E+00 -2.5974193990357168E+00 -2.5978462149967299E+00 +-2.5982715264141083E+00 -2.5986953354080162E+00 -2.5991176440945103E+00 -2.5995384545855442E+00 -2.5999577689889848E+00 +-2.6003755894086136E+00 -2.6007919179441461E+00 -2.6012067566912331E+00 -2.6016201077414767E+00 -2.6020319731824362E+00 +-2.6024423550976410E+00 -2.6028512555665966E+00 -2.6032586766647996E+00 -2.6036646204637410E+00 -2.6040690890309190E+00 +-2.6044720844298506E+00 -2.6048736087200779E+00 -2.6052736639571799E+00 -2.6056722521927793E+00 -2.6060693754745561E+00 +-2.6064650358462540E+00 -2.6068592353476889E+00 -2.6072519760147630E+00 -2.6076432598794681E+00 -2.6080330889698997E+00 +-2.6084214653102662E+00 -2.6088083909208946E+00 -2.6091938678182425E+00 -2.6095778980149062E+00 -2.6099604835196324E+00 +-2.6103416263373251E+00 -2.6107213284690522E+00 -2.6110995919120623E+00 -2.6114764186597861E+00 -2.6118518107018480E+00 +-2.6122257700240805E+00 -2.6125982986085234E+00 -2.6129693984334410E+00 -2.6133390714733267E+00 -2.6137073196989138E+00 +-2.6140741450771832E+00 -2.6144395495713750E+00 -2.6148035351409940E+00 -2.6151661037418199E+00 -2.6155272573259176E+00 +-2.6158869978416437E+00 -2.6162453272336563E+00 -2.6166022474429265E+00 -2.6169577604067404E+00 -2.6173118680587146E+00 +-2.6176645723288003E+00 -2.6180158751432967E+00 -2.6183657784248533E+00 -2.6187142840924844E+00 -2.6190613940615766E+00 +-2.6194071102438916E+00 -2.6197514345475836E+00 -2.6200943688772016E+00 -2.6204359151336991E+00 -2.6207760752144456E+00 +-2.6211148510132301E+00 -2.6214522444202748E+00 -2.6217882573222386E+00 -2.6221228916022281E+00 -2.6224561491398068E+00 +-2.6227880318110031E+00 -2.6231185414883122E+00 -2.6234476800407180E+00 -2.6237754493336864E+00 -2.6241018512291845E+00 +-2.6244268875856820E+00 -2.6247505602581658E+00 -2.6250728710981419E+00 -2.6253938219536459E+00 -2.6257134146692538E+00 +-2.6260316510860835E+00 -2.6263485330418108E+00 -2.6266640623706730E+00 -2.6269782409034770E+00 -2.6272910704676078E+00 +-2.6276025528870370E+00 -2.6279126899823311E+00 -2.6282214835706590E+00 -2.6285289354657975E+00 -2.6288350474781432E+00 +-2.6291398214147192E+00 -2.6294432590791805E+00 -2.6297453622718243E+00 -2.6300461327895985E+00 -2.6303455724261067E+00 +-2.6306436829716175E+00 -2.6309404662130742E+00 -2.6312359239340966E+00 -2.6315300579149965E+00 -2.6318228699327801E+00 +-2.6321143617611571E+00 -2.6324045351705476E+00 -2.6326933919280915E+00 -2.6329809337976542E+00 -2.6332671625398354E+00 +-2.6335520799119778E+00 -2.6338356876681703E+00 -2.6341179875592600E+00 -2.6343989813328572E+00 -2.6346786707333449E+00 +-2.6349570575018832E+00 -2.6352341433764210E+00 -2.6355099300916991E+00 -2.6357844193792603E+00 -2.6360576129674560E+00 +-2.6363295125814523E+00 -2.6366001199432394E+00 -2.6368694367716383E+00 -2.6371374647823078E+00 -2.6374042056877518E+00 +-2.6376696611973252E+00 -2.6379338330172444E+00 -2.6381967228505911E+00 -2.6384583323973225E+00 -2.6387186633542759E+00 +-2.6389777174151758E+00 -2.6392354962706448E+00 -2.6394920016082062E+00 -2.6397472351122917E+00 -2.6400011984642537E+00 +-2.6402538933423636E+00 -2.6405053214218279E+00 -2.6407554843747878E+00 -2.6410043838703303E+00 -2.6412520215744926E+00 +-2.6414983991502745E+00 -2.6417435182576385E+00 -2.6419873805535201E+00 -2.6422299876918336E+00 -2.6424713413234828E+00 +-2.6427114430963594E+00 -2.6429502946553596E+00 -2.6431878976423850E+00 -2.6434242536963501E+00 -2.6436593644531907E+00 +-2.6438932315458707E+00 -2.6441258566043855E+00 -2.6443572412557730E+00 -2.6445873871241199E+00 -2.6448162958305637E+00 +-2.6450439689933050E+00 -2.6452704082276099E+00 -2.6454956151458209E+00 -2.6457195913573601E+00 -2.6459423384687364E+00 +-2.6461638580835531E+00 -2.6463841518025149E+00 -2.6466032212234327E+00 -2.6468210679412287E+00 -2.6470376935479503E+00 +-2.6472530996327661E+00 -2.6474672877819816E+00 -2.6476802595790399E+00 -2.6478920166045303E+00 -2.6481025604361950E+00 +-2.6483118926489344E+00 -2.6485200148148151E+00 -2.6487269285030739E+00 -2.6489326352801252E+00 -2.6491371367095691E+00 +-2.6493404343521969E+00 -2.6495425297659945E+00 -2.6497434245061524E+00 -2.6499431201250712E+00 -2.6501416181723640E+00 +-2.6503389201948706E+00 -2.6505350277366535E+00 -2.6507299423390163E+00 -2.6509236655404971E+00 -2.6511161988768821E+00 +-2.6513075438812126E+00 -2.6514977020837880E+00 -2.6516866750121721E+00 -2.6518744641912009E+00 -2.6520610711429864E+00 +-2.6522464973869253E+00 -2.6524307444397035E+00 -2.6526138138153015E+00 -2.6527957070250023E+00 -2.6529764255773971E+00 +-2.6531559709783883E+00 -2.6533343447312006E+00 -2.6535115483363834E+00 -2.6536875832918154E+00 -2.6538624510927153E+00 +-2.6540361532316443E+00 -2.6542086911985119E+00 -2.6543800664805834E+00 -2.6545502805624861E+00 -2.6547193349262113E+00 +-2.6548872310511258E+00 -2.6550539704139733E+00 -2.6552195544888817E+00 -2.6553839847473699E+00 -2.6555472626583514E+00 +-2.6557093896881403E+00 -2.6558703673004622E+00 -2.6560301969564519E+00 -2.6561888801146645E+00 -2.6563464182310788E+00 +-2.6565028127591037E+00 -2.6566580651495855E+00 -2.6568121768508091E+00 -2.6569651493085078E+00 -2.6571169839658695E+00 +-2.6572676822635382E+00 -2.6574172456396208E+00 -2.6575656755296970E+00 -2.6577129733668214E+00 -2.6578591405815239E+00 +-2.6580041786018263E+00 -2.6581480888532396E+00 -2.6582908727587720E+00 -2.6584325317389350E+00 -2.6585730672117482E+00 +-2.6587124805927442E+00 -2.6588507732949744E+00 -2.6589879467290154E+00 -2.6591240023029736E+00 -2.6592589414224896E+00 +-2.6593927654907472E+00 -2.6595254759084734E+00 -2.6596570740739494E+00 -2.6597875613830091E+00 -2.6599169392290531E+00 +-2.6600452090030466E+00 -2.6601723720935282E+00 -2.6602984298866144E+00 -2.6604233837660058E+00 -2.6605472351129902E+00 +-2.6606699853064488E+00 -2.6607916357228656E+00 -2.6609121877363240E+00 -2.6610316427185210E+00 -2.6611500020387657E+00 +-2.6612672670639861E+00 -2.6613834391587394E+00 -2.6614985196852086E+00 -2.6616125100032142E+00 -2.6617254114702171E+00 +-2.6618372254413236E+00 -2.6619479532692898E+00 -2.6620575963045288E+00 -2.6621661558951151E+00 -2.6622736333867865E+00 +-2.6623800301229545E+00 -2.6624853474447048E+00 -2.6625895866908040E+00 -2.6626927491977068E+00 -2.6627948362995557E+00 +-2.6628958493281925E+00 -2.6629957896131584E+00 -2.6630946584817017E+00 -2.6631924572587766E+00 -2.6632891872670603E+00 +-2.6633848498269477E+00 -2.6634794462565576E+00 -2.6635729778717407E+00 -2.6636654459860840E+00 -2.6637568519109145E+00 +-2.6638471969553033E+00 -2.6639364824260707E+00 -2.6640247096277956E+00 -2.6641118798628121E+00 -2.6641979944312215E+00 +-2.6642830546308942E+00 -2.6643670617574715E+00 -2.6644500171043788E+00 -2.6645319219628210E+00 -2.6646127776217932E+00 +-2.6646925853680821E+00 -2.6647713464862735E+00 -2.6648490622587544E+00 -2.6649257339657200E+00 -2.6650013628851767E+00 +-2.6650759502929477E+00 -2.6651494974626777E+00 -2.6652220056658367E+00 -2.6652934761717244E+00 -2.6653639102474784E+00 +-2.6654333091580735E+00 -2.6655016741663284E+00 -2.6655690065329121E+00 -2.6656353075163470E+00 -2.6657005783730137E+00 +-2.6657648203571545E+00 -2.6658280347208785E+00 -2.6658902227141681E+00 -2.6659513855848811E+00 -2.6660115245787548E+00 +-2.6660706409394139E+00 -2.6661287359083716E+00 -2.6661858107250347E+00 -2.6662418666267098E+00 -2.6662969048486054E+00 +-2.6663509266238394E+00 -2.6664039331834397E+00 -2.6664559257563507E+00 -2.6665069055694381E+00 -2.6665568738474930E+00 +-2.6666058318132362E+00 -2.6666537806873203E+00 -2.6667007216883407E+00 -2.6667466560328310E+00 -2.6667915849352744E+00 +-2.6668355096081027E+00 -2.6668784312617060E+00 -2.6669203511044333E+00 -2.6669612703425964E+00 -2.6670011901804793E+00 +-2.6670401118203357E+00 -2.6670780364623967E+00 -2.6671149653048754E+00 -2.6671508995439699E+00 -2.6671858403738700E+00 +-2.6672197889867557E+00 -2.6672527465728084E+00 -2.6672847143202101E+00 -2.6673156934151518E+00 -2.6673456850418318E+00 +-2.6673746903824664E+00 -2.6674027106172895E+00 -2.6674297469245585E+00 -2.6674558004805577E+00 -2.6674808724596040E+00 +-2.6675049640340478E+00 -2.6675280763742828E+00 -2.6675502106487441E+00 -2.6675713680239141E+00 -2.6675915496643285E+00 +-2.6676107567325795E+00 -2.6676289903893173E+00 -2.6676462517932591E+00 -2.6676625421011875E+00 -2.6676778624679578E+00 +-2.6676922140465043E+00 -2.6677055979878377E+00 -2.6677180154410562E+00 -2.6677294675533427E+00 -2.6677399554699779E+00 +-2.6677494803343316E+00 -2.6677580432878787E+00 -2.6677656454701966E+00 -2.6677722880189685E+00 -2.6677779720699943E+00 +-2.6677826987571858E+00 -2.6677864692125759E+00 -2.6677892845663207E+00 -2.6677911459467061E+00 -2.6677920544801430E+00 +-2.6677920112911870E+00 -2.6677910175025250E+00 -2.6677890742349892E+00 -2.6677861826075602E+00 -2.6677823437373678E+00 +-2.6677775587396950E+00 -2.6677718287279868E+00 -2.6677651548138459E+00 -2.6677575381070446E+00 -2.6677489797155216E+00 +-2.6677394807453894E+00 -2.6677290423009414E+00 -2.6677176654846475E+00 -2.6677053513971658E+00 -2.6676921011373387E+00 +-2.6676779158022041E+00 -2.6676627964869946E+00 -2.6676467442851428E+00 -2.6676297602882828E+00 -2.6676118455862570E+00 +-2.6675930012671185E+00 -2.6675732284171354E+00 -2.6675525281207904E+00 -2.6675309014607933E+00 -2.6675083495180760E+00 +-2.6674848733717966E+00 -2.6674604740993502E+00 -2.6674351527763651E+00 -2.6674089104767109E+00 -2.6673817482725006E+00 +-2.6673536672340927E+00 -2.6673246684300977E+00 -2.6672947529273787E+00 -2.6672639217910588E+00 -2.6672321760845175E+00 +-2.6671995168694069E+00 -2.6671659452056389E+00 -2.6671314621514020E+00 -2.6670960687631604E+00 -2.6670597660956537E+00 +-2.6670225552019073E+00 -2.6669844371332307E+00 -2.6669454129392229E+00 -2.6669054836677759E+00 -2.6668646503650781E+00 +-2.6668229140756168E+00 -2.6667802758421835E+00 -2.6667367367058756E+00 -2.6666922977061018E+00 -2.6666469598805826E+00 +-2.6666007242653569E+00 -2.6665535918947825E+00 -2.6665055638015422E+00 -2.6664566410166444E+00 -2.6664068245694299E+00 +-2.6663561154875719E+00 -2.6663045147970812E+00 -2.6662520235223095E+00 -2.6661986426859512E+00 -2.6661443733090522E+00 +-2.6660892164110037E+00 -2.6660331730095543E+00 -2.6659762441208072E+00 -2.6659184307592292E+00 -2.6658597339376491E+00 +-2.6658001546672629E+00 -2.6657396939576379E+00 -2.6656783528167152E+00 -2.6656161322508125E+00 -2.6655530332646267E+00 +-2.6654890568612410E+00 -2.6654242040421243E+00 -2.6653584758071331E+00 -2.6652918731545214E+00 -2.6652243970809364E+00 +-2.6651560485814270E+00 -2.6650868286494442E+00 -2.6650167382768446E+00 -2.6649457784538959E+00 -2.6648739501692766E+00 +-2.6648012544100808E+00 -2.6647276921618221E+00 -2.6646532644084386E+00 -2.6645779721322902E+00 -2.6645018163141665E+00 +-2.6644247979332878E+00 -2.6643469179673098E+00 -2.6642681773923269E+00 -2.6641885771828715E+00 -2.6641081183119222E+00 +-2.6640268017509054E+00 -2.6639446284696962E+00 -2.6638615994366224E+00 -2.6637777156184699E+00 -2.6636929779804839E+00 +-2.6636073874863704E+00 -2.6635209450983033E+00 -2.6634336517769226E+00 -2.6633455084813424E+00 -2.6632565161691497E+00 +-2.6631666757964099E+00 -2.6630759883176687E+00 -2.6629844546859571E+00 -2.6628920758527919E+00 -2.6627988527681783E+00 +-2.6627047863806159E+00 -2.6626098776371014E+00 -2.6625141274831274E+00 -2.6624175368626890E+00 -2.6623201067182878E+00 +-2.6622218379909310E+00 -2.6621227316201375E+00 -2.6620227885439380E+00 -2.6619220096988818E+00 -2.6618203960200382E+00 +-2.6617179484409963E+00 -2.6616146678938706E+00 -2.6615105553093064E+00 -2.6614056116164777E+00 -2.6612998377430954E+00 +-2.6611932346154035E+00 -2.6610858031581865E+00 -2.6609775442947745E+00 -2.6608684589470393E+00 -2.6607585480354037E+00 +-2.6606478124788411E+00 -2.6605362531948780E+00 -2.6604238710995989E+00 -2.6603106671076469E+00 -2.6601966421322287E+00 +-2.6600817970851165E+00 -2.6599661328766517E+00 -2.6598496504157421E+00 -2.6597323506098753E+00 -2.6596142343651121E+00 +-2.6594953025860919E+00 -2.6593755561760393E+00 -2.6592549960367631E+00 -2.6591336230686564E+00 -2.6590114381707073E+00 +-2.6588884422404946E+00 -2.6587646361741957E+00 -2.6586400208665819E+00 -2.6585145972110316E+00 -2.6583883660995231E+00 +-2.6582613284226442E+00 -2.6581334850695919E+00 -2.6580048369281744E+00 -2.6578753848848162E+00 -2.6577451298245585E+00 +-2.6576140726310649E+00 -2.6574822141866190E+00 -2.6573495553721327E+00 -2.6572160970671481E+00 -2.6570818401498335E+00 +-2.6569467854969959E+00 -2.6568109339840751E+00 -2.6566742864851531E+00 -2.6565368438729502E+00 -2.6563986070188350E+00 +-2.6562595767928205E+00 -2.6561197540635701E+00 -2.6559791396984003E+00 -2.6558377345632818E+00 -2.6556955395228412E+00 +-2.6555525554403689E+00 -2.6554087831778159E+00 -2.6552642235957982E+00 -2.6551188775535994E+00 -2.6549727459091756E+00 +-2.6548258295191536E+00 -2.6546781292388371E+00 -2.6545296459222074E+00 -2.6543803804219284E+00 -2.6542303335893447E+00 +-2.6540795062744857E+00 -2.6539278993260726E+00 -2.6537755135915173E+00 -2.6536223499169220E+00 -2.6534684091470884E+00 +-2.6533136921255132E+00 -2.6531581996943960E+00 -2.6530019326946390E+00 -2.6528448919658514E+00 -2.6526870783463501E+00 +-2.6525284926731620E+00 -2.6523691357820298E+00 -2.6522090085074095E+00 -2.6520481116824755E+00 -2.6518864461391258E+00 +-2.6517240127079802E+00 -2.6515608122183818E+00 -2.6513968454984052E+00 -2.6512321133748520E+00 -2.6510666166732602E+00 +-2.6509003562179023E+00 -2.6507333328317868E+00 -2.6505655473366643E+00 -2.6503970005530282E+00 -2.6502276933001157E+00 +-2.6500576263959119E+00 -2.6498868006571517E+00 -2.6497152168993230E+00 -2.6495428759366670E+00 -2.6493697785821837E+00 +-2.6491959256476272E+00 -2.6490213179435242E+00 -2.6488459562791551E+00 -2.6486698414625707E+00 -2.6484929743005905E+00 +-2.6483153555988039E+00 -2.6481369861615760E+00 -2.6479578667920465E+00 -2.6477779982921330E+00 -2.6475973814625338E+00 +-2.6474160171027288E+00 -2.6472339060109853E+00 -2.6470510489843573E+00 -2.6468674468186881E+00 -2.6466831003086115E+00 +-2.6464980102475573E+00 -2.6463121774277525E+00 -2.6461256026402218E+00 -2.6459382866747903E+00 -2.6457502303200884E+00 +-2.6455614343635521E+00 -2.6453718995914222E+00 -2.6451816267887538E+00 -2.6449906167394102E+00 -2.6447988702260727E+00 +-2.6446063880302413E+00 -2.6444131709322285E+00 -2.6442192197111742E+00 -2.6440245351450402E+00 -2.6438291180106108E+00 +-2.6436329690835043E+00 -2.6434360891381647E+00 -2.6432384789478691E+00 -2.6430401392847314E+00 -2.6428410709197001E+00 +-2.6426412746225636E+00 -2.6424407511619523E+00 -2.6422395013053381E+00 -2.6420375258190401E+00 -2.6418348254682247E+00 +-2.6416314010169080E+00 -2.6414272532279575E+00 -2.6412223828630967E+00 -2.6410167906829036E+00 -2.6408104774468164E+00 +-2.6406034439131325E+00 -2.6403956908390138E+00 -2.6401872189804845E+00 -2.6399780290924357E+00 -2.6397681219286340E+00 +-2.6395574982417100E+00 -2.6393461587831699E+00 -2.6391341043033973E+00 -2.6389213355516508E+00 -2.6387078532760690E+00 +-2.6384936582236755E+00 -2.6382787511403740E+00 -2.6380631327709567E+00 -2.6378468038590999E+00 -2.6376297651473757E+00 +-2.6374120173772444E+00 -2.6371935612890609E+00 -2.6369743976220796E+00 -2.6367545271144492E+00 -2.6365339505032210E+00 +-2.6363126685243481E+00 -2.6360906819126879E+00 -2.6358679914020047E+00 -2.6356445977249718E+00 -2.6354205016131744E+00 +-2.6351957037971063E+00 -2.6349702050061770E+00 -2.6347440059687193E+00 -2.6345171074119760E+00 -2.6342895100621151E+00 +-2.6340612146442246E+00 -2.6338322218823196E+00 -2.6336025324993408E+00 -2.6333721472171585E+00 -2.6331410667565729E+00 +-2.6329092918373171E+00 -2.6326768231780582E+00 -2.6324436614963997E+00 -2.6322098075088856E+00 -2.6319752619309980E+00 +-2.6317400254771623E+00 -2.6315040988607494E+00 -2.6312674827940752E+00 -2.6310301779884040E+00 -2.6307921851539522E+00 +-2.6305535049998849E+00 -2.6303141382343251E+00 -2.6300740855643490E+00 -2.6298333476959925E+00 -2.6295919253342510E+00 +-2.6293498191830778E+00 -2.6291070299453985E+00 -2.6288635583230984E+00 -2.6286194050170311E+00 -2.6283745707270181E+00 +-2.6281290561518547E+00 -2.6278828619893093E+00 -2.6276359889361247E+00 -2.6273884376880190E+00 -2.6271402089396925E+00 +-2.6268913033848253E+00 -2.6266417217160760E+00 -2.6263914646250948E+00 -2.6261405328025118E+00 -2.6258889269379497E+00 +-2.6256366477200173E+00 -2.6253836958363181E+00 -2.6251300719734494E+00 -2.6248757768170026E+00 -2.6246208110515670E+00 +-2.6243651753607309E+00 -2.6241088704270847E+00 -2.6238518969322207E+00 -2.6235942555567355E+00 -2.6233359469802311E+00 +-2.6230769718813240E+00 -2.6228173309376337E+00 -2.6225570248257948E+00 -2.6222960542214544E+00 -2.6220344197992778E+00 +-2.6217721222329429E+00 -2.6215091621951521E+00 -2.6212455403576240E+00 -2.6209812573911040E+00 -2.6207163139653575E+00 +-2.6204507107491799E+00 -2.6201844484103938E+00 -2.6199175276158493E+00 -2.6196499490314320E+00 -2.6193817133220567E+00 +-2.6191128211516763E+00 -2.6188432731832774E+00 -2.6185730700788885E+00 -2.6183022124995756E+00 -2.6180307011054493E+00 +-2.6177585365556615E+00 -2.6174857195084109E+00 -2.6172122506209425E+00 -2.6169381305495532E+00 -2.6166633599495870E+00 +-2.6163879394754397E+00 -2.6161118697805650E+00 -2.6158351515174698E+00 -2.6155577853377179E+00 -2.6152797718919354E+00 +-2.6150011118298062E+00 -2.6147218058000781E+00 -2.6144418544505621E+00 -2.6141612584281364E+00 -2.6138800183787474E+00 +-2.6135981349474089E+00 -2.6133156087782061E+00 -2.6130324405142988E+00 -2.6127486307979191E+00 -2.6124641802703752E+00 +-2.6121790895720540E+00 -2.6118933593424214E+00 -2.6116069902200238E+00 -2.6113199828424909E+00 -2.6110323378465354E+00 +-2.6107440558679569E+00 -2.6104551375416416E+00 -2.6101655835015687E+00 -2.6098753943808037E+00 -2.6095845708115051E+00 +-2.6092931134249273E+00 -2.6090010228514204E+00 -2.6087082997204294E+00 -2.6084149446605007E+00 -2.6081209582992795E+00 +-2.6078263412635150E+00 -2.6075310941790595E+00 -2.6072352176708682E+00 -2.6069387123630072E+00 -2.6066415788786488E+00 +-2.6063438178400768E+00 -2.6060454298686846E+00 -2.6057464155849801E+00 -2.6054467756085882E+00 -2.6051465105582459E+00 +-2.6048456210518118E+00 -2.6045441077062632E+00 -2.6042419711376974E+00 -2.6039392119613356E+00 -2.6036358307915237E+00 +-2.6033318282417306E+00 -2.6030272049245591E+00 -2.6027219614517341E+00 -2.6024160984341140E+00 -2.6021096164816884E+00 +-2.6018025162035818E+00 -2.6014947982080532E+00 -2.6011864631024975E+00 -2.6008775114934490E+00 -2.6005679439865803E+00 +-2.6002577611867075E+00 -2.5999469636977874E+00 -2.5996355521229213E+00 -2.5993235270643580E+00 -2.5990108891234920E+00 +-2.5986976389008660E+00 -2.5983837769961760E+00 -2.5980693040082681E+00 -2.5977542205351396E+00 -2.5974385271739457E+00 +-2.5971222245209971E+00 -2.5968053131717626E+00 -2.5964877937208697E+00 -2.5961696667621039E+00 -2.5958509328884203E+00 +-2.5955315926919322E+00 -2.5952116467639179E+00 -2.5948910956948250E+00 -2.5945699400742668E+00 -2.5942481804910291E+00 +-2.5939258175330657E+00 -2.5936028517875043E+00 -2.5932792838406473E+00 -2.5929551142779719E+00 -2.5926303436841320E+00 +-2.5923049726429603E+00 -2.5919790017374678E+00 -2.5916524315498504E+00 -2.5913252626614827E+00 -2.5909974956529243E+00 +-2.5906691311039221E+00 -2.5903401695934076E+00 -2.5900106116995039E+00 -2.5896804579995201E+00 -2.5893497090699586E+00 +-2.5890183654865151E+00 -2.5886864278240767E+00 -2.5883538966567277E+00 -2.5880207725577518E+00 -2.5876870560996266E+00 +-2.5873527478540317E+00 -2.5870178483918469E+00 -2.5866823582831548E+00 -2.5863462780972415E+00 -2.5860096084025992E+00 +-2.5856723497669258E+00 -2.5853345027571288E+00 -2.5849960679393229E+00 -2.5846570458788345E+00 -2.5843174371402027E+00 +-2.5839772422871796E+00 -2.5836364618827323E+00 -2.5832950964890449E+00 -2.5829531466675166E+00 -2.5826106129787689E+00 +-2.5822674959826410E+00 -2.5819237962381960E+00 -2.5815795143037183E+00 -2.5812346507367172E+00 -2.5808892060939277E+00 +-2.5805431809313109E+00 -2.5801965758040604E+00 -2.5798493912665954E+00 -2.5795016278725678E+00 -2.5791532861748596E+00 +-2.5788043667255915E+00 -2.5784548700761132E+00 -2.5781047967770165E+00 -2.5777541473781271E+00 -2.5774029224285111E+00 +-2.5770511224764752E+00 -2.5766987480695662E+00 -2.5763457997545780E+00 -2.5759922780775426E+00 -2.5756381835837434E+00 +-2.5752835168177071E+00 -2.5749282783232097E+00 -2.5745724686432778E+00 -2.5742160883201870E+00 -2.5738591378954658E+00 +-2.5735016179098964E+00 -2.5731435289035143E+00 -2.5727848714156125E+00 -2.5724256459847421E+00 -2.5720658531487071E+00 +-2.5717054934445813E+00 -2.5713445674086906E+00 -2.5709830755766259E+00 -2.5706210184832439E+00 -2.5702583966626631E+00 +-2.5698952106482698E+00 -2.5695314609727178E+00 -2.5691671481679275E+00 -2.5688022727650934E+00 -2.5684368352946758E+00 +-2.5680708362864122E+00 -2.5677042762693096E+00 -2.5673371557716540E+00 -2.5669694753210046E+00 -2.5666012354441978E+00 +-2.5662324366673519E+00 -2.5658630795158603E+00 -2.5654931645144026E+00 -2.5651226921869354E+00 -2.5647516630567035E+00 +-2.5643800776462333E+00 -2.5640079364773389E+00 -2.5636352400711213E+00 -2.5632619889479669E+00 -2.5628881836275585E+00 +-2.5625138246288643E+00 -2.5621389124701452E+00 -2.5617634476689561E+00 -2.5613874307421485E+00 -2.5610108622058632E+00 +-2.5606337425755461E+00 -2.5602560723659349E+00 -2.5598778520910694E+00 -2.5594990822642898E+00 -2.5591197633982357E+00 +-2.5587398960048526E+00 -2.5583594805953882E+00 -2.5579785176803957E+00 -2.5575970077697345E+00 -2.5572149513725728E+00 +-2.5568323489973852E+00 -2.5564492011519580E+00 -2.5560655083433876E+00 -2.5556812710780834E+00 -2.5552964898617687E+00 +-2.5549111651994787E+00 -2.5545252975955655E+00 -2.5541388875537021E+00 -2.5537519355768756E+00 -2.5533644421673909E+00 +-2.5529764078268755E+00 -2.5525878330562790E+00 -2.5521987183558723E+00 -2.5518090642252500E+00 -2.5514188711633330E+00 +-2.5510281396683667E+00 -2.5506368702379243E+00 -2.5502450633689073E+00 -2.5498527195575478E+00 -2.5494598392994061E+00 +-2.5490664230893767E+00 -2.5486724714216851E+00 -2.5482779847898924E+00 -2.5478829636868925E+00 -2.5474874086049186E+00 +-2.5470913200355390E+00 -2.5466946984696603E+00 -2.5462975443975293E+00 -2.5458998583087347E+00 -2.5455016406922057E+00 +-2.5451028920362124E+00 -2.5447036128283735E+00 -2.5443038035556507E+00 -2.5439034647043495E+00 -2.5435025967601255E+00 +-2.5431012002079822E+00 -2.5426992755322719E+00 -2.5422968232166978E+00 -2.5418938437443153E+00 -2.5414903375975313E+00 +-2.5410863052581063E+00 -2.5406817472071590E+00 -2.5402766639251597E+00 -2.5398710558919393E+00 -2.5394649235866837E+00 +-2.5390582674879409E+00 -2.5386510880736171E+00 -2.5382433858209814E+00 -2.5378351612066639E+00 -2.5374264147066583E+00 +-2.5370171467963245E+00 -2.5366073579503872E+00 -2.5361970486429359E+00 -2.5357862193474308E+00 -2.5353748705366961E+00 +-2.5349630026829337E+00 -2.5345506162577109E+00 -2.5341377117319657E+00 -2.5337242895760128E+00 -2.5333103502595389E+00 +-2.5328958942516060E+00 -2.5324809220206528E+00 -2.5320654340344930E+00 -2.5316494307603219E+00 -2.5312329126647115E+00 +-2.5308158802136154E+00 -2.5303983338723670E+00 -2.5299802741056823E+00 -2.5295617013776623E+00 -2.5291426161517903E+00 +-2.5287230188909353E+00 -2.5283029100573540E+00 -2.5278822901126898E+00 -2.5274611595179732E+00 -2.5270395187336252E+00 +-2.5266173682194579E+00 -2.5261947084346743E+00 -2.5257715398378666E+00 -2.5253478628870281E+00 -2.5249236780395399E+00 +-2.5244989857521802E+00 -2.5240737864811242E+00 -2.5236480806819448E+00 -2.5232218688096122E+00 -2.5227951513184972E+00 +-2.5223679286623697E+00 -2.5219402012944028E+00 -2.5215119696671704E+00 -2.5210832342326501E+00 -2.5206539954422253E+00 +-2.5202242537466817E+00 -2.5197940095962150E+00 -2.5193632634404257E+00 -2.5189320157283226E+00 -2.5185002669083247E+00 +-2.5180680174282615E+00 -2.5176352677353728E+00 -2.5172020182763100E+00 -2.5167682694971387E+00 -2.5163340218433397E+00 +-2.5158992757598067E+00 -2.5154640316908465E+00 -2.5150282900801924E+00 -2.5145920513709874E+00 -2.5141553160057954E+00 +-2.5137180844266007E+00 -2.5132803570748075E+00 -2.5128421343912426E+00 -2.5124034168161558E+00 -2.5119642047892188E+00 +-2.5115244987495302E+00 -2.5110842991356117E+00 -2.5106436063854121E+00 -2.5102024209363094E+00 -2.5097607432251081E+00 +-2.5093185736880419E+00 -2.5088759127607765E+00 -2.5084327608784052E+00 -2.5079891184754577E+00 -2.5075449859858923E+00 +-2.5071003638431058E+00 -2.5066552524799248E+00 -2.5062096523286161E+00 -2.5057635638208797E+00 -2.5053169873878574E+00 +-2.5048699234601206E+00 -2.5044223724676935E+00 -2.5039743348400298E+00 -2.5035258110060283E+00 -2.5030768013940303E+00 +-2.5026273064318190E+00 -2.5021773265466214E+00 -2.5017268621651101E+00 -2.5012759137134037E+00 -2.5008244816170668E+00 +-2.5003725663011118E+00 -2.4999201681899983E+00 -2.4994672877076383E+00 -2.4990139252773900E+00 -2.4985600813220672E+00 +-2.4981057562639313E+00 -2.4976509505246995E+00 -2.4971956645255418E+00 -2.4967398986870832E+00 -2.4962836534294031E+00 +-2.4958269291720385E+00 -2.4953697263339838E+00 -2.4949120453336913E+00 -2.4944538865890684E+00 -2.4939952505174934E+00 +-2.4935361375357941E+00 -2.4930765480602641E+00 -2.4926164825066603E+00 -2.4921559412902021E+00 -2.4916949248255738E+00 +-2.4912334335269231E+00 -2.4907714678078658E+00 -2.4903090280814841E+00 -2.4898461147603266E+00 -2.4893827282564112E+00 +-2.4889188689812269E+00 -2.4884545373457314E+00 -2.4879897337603527E+00 -2.4875244586349923E+00 -2.4870587123790222E+00 +-2.4865924954012932E+00 -2.4861258081101250E+00 -2.4856586509133143E+00 -2.4851910242181368E+00 -2.4847229284313426E+00 +-2.4842543639591597E+00 -2.4837853312072951E+00 -2.4833158305809335E+00 -2.4828458624847469E+00 -2.4823754273228822E+00 +-2.4819045254989680E+00 -2.4814331574161188E+00 -2.4809613234769325E+00 -2.4804890240834907E+00 -2.4800162596373587E+00 +-2.4795430305395905E+00 -2.4790693371907269E+00 -2.4785951799907973E+00 -2.4781205593393154E+00 -2.4776454756352888E+00 +-2.4771699292772151E+00 -2.4766939206630809E+00 -2.4762174501903655E+00 -2.4757405182560417E+00 -2.4752631252565749E+00 +-2.4747852715879248E+00 -2.4743069576455481E+00 -2.4738281838243945E+00 -2.4733489505189130E+00 -2.4728692581230489E+00 +-2.4723891070302457E+00 -2.4719084976334442E+00 -2.4714274303250918E+00 -2.4709459054971310E+00 -2.4704639235410055E+00 +-2.4699814848476644E+00 -2.4694985898075572E+00 -2.4690152388106390E+00 -2.4685314322463685E+00 -2.4680471705037133E+00 +-2.4675624539711403E+00 -2.4670772830366299E+00 -2.4665916580876681E+00 -2.4661055795112485E+00 -2.4656190476938762E+00 +-2.4651320630215650E+00 -2.4646446258798398E+00 -2.4641567366537371E+00 -2.4636683957278067E+00 -2.4631796034861098E+00 +-2.4626903603122248E+00 -2.4622006665892422E+00 -2.4617105226997698E+00 -2.4612199290259289E+00 -2.4607288859493601E+00 +-2.4602373938512248E+00 -2.4597454531121969E+00 -2.4592530641124744E+00 -2.4587602272317719E+00 -2.4582669428493285E+00 +-2.4577732113439006E+00 -2.4572790330937728E+00 -2.4567844084767470E+00 -2.4562893378701522E+00 -2.4557938216508424E+00 +-2.4552978601951958E+00 -2.4548014538791159E+00 -2.4543046030780351E+00 -2.4538073081669123E+00 -2.4533095695202354E+00 +-2.4528113875120212E+00 -2.4523127625158150E+00 -2.4518136949046956E+00 -2.4513141850512699E+00 -2.4508142333276810E+00 +-2.4503138401055993E+00 -2.4498130057562335E+00 -2.4493117306503236E+00 -2.4488100151581453E+00 -2.4483078596495131E+00 +-2.4478052644937747E+00 -2.4473022300598153E+00 -2.4467987567160576E+00 -2.4462948448304656E+00 -2.4457904947705389E+00 +-2.4452857069033196E+00 -2.4447804815953909E+00 -2.4442748192128763E+00 -2.4437687201214411E+00 -2.4432621846862954E+00 +-2.4427552132721915E+00 -2.4422478062434267E+00 -2.4417399639638431E+00 -2.4412316867968293E+00 -2.4407229751053188E+00 +-2.4402138292517939E+00 -2.4397042495982855E+00 -2.4391942365063697E+00 -2.4386837903371754E+00 -2.4381729114513786E+00 +-2.4376616002092106E+00 -2.4371498569704468E+00 -2.4366376820944233E+00 -2.4361250759400246E+00 -2.4356120388656866E+00 +-2.4350985712294033E+00 -2.4345846733887222E+00 -2.4340703457007447E+00 -2.4335555885221316E+00 -2.4330404022090990E+00 +-2.4325247871174205E+00 -2.4320087436024274E+00 -2.4314922720190126E+00 -2.4309753727216257E+00 -2.4304580460642788E+00 +-2.4299402924005449E+00 -2.4294221120835577E+00 -2.4289035054660135E+00 -2.4283844729001731E+00 -2.4278650147378587E+00 +-2.4273451313304593E+00 -2.4268248230289275E+00 -2.4263040901837836E+00 -2.4257829331451122E+00 -2.4252613522625652E+00 +-2.4247393478853629E+00 -2.4242169203622970E+00 -2.4236940700417242E+00 -2.4231707972715721E+00 -2.4226471023993392E+00 +-2.4221229857720954E+00 -2.4215984477364825E+00 -2.4210734886387133E+00 -2.4205481088245757E+00 -2.4200223086394299E+00 +-2.4194960884282124E+00 -2.4189694485354325E+00 -2.4184423893051759E+00 -2.4179149110811062E+00 -2.4173870142064620E+00 +-2.4168586990240621E+00 -2.4163299658763004E+00 -2.4158008151051531E+00 -2.4152712470521736E+00 -2.4147412620584978E+00 +-2.4142108604648396E+00 -2.4136800426114959E+00 -2.4131488088383479E+00 -2.4126171594848564E+00 -2.4120850948900663E+00 +-2.4115526153926110E+00 -2.4110197213307032E+00 -2.4104864130421420E+00 -2.4099526908643156E+00 -2.4094185551341956E+00 +-2.4088840061883423E+00 -2.4083490443629043E+00 -2.4078136699936179E+00 -2.4072778834158091E+00 -2.4067416849643939E+00 +-2.4062050749738786E+00 -2.4056680537783608E+00 -2.4051306217115287E+00 -2.4045927791066641E+00 -2.4040545262966417E+00 +-2.4035158636139289E+00 -2.4029767913905897E+00 -2.4024373099582794E+00 -2.4018974196482499E+00 -2.4013571207913516E+00 +-2.4008164137180281E+00 -2.4002752987583231E+00 -2.3997337762418733E+00 -2.3991918464979243E+00 -2.3986495098553098E+00 +-2.3981067666424685E+00 -2.3975636171874379E+00 -2.3970200618178588E+00 -2.3964761008609696E+00 -2.3959317346436149E+00 +-2.3953869634922391E+00 -2.3948417877328914E+00 -2.3942962076912244E+00 -2.3937502236924972E+00 -2.3932038360615708E+00 +-2.3926570451229141E+00 -2.3921098512006025E+00 -2.3915622546183166E+00 -2.3910142556993472E+00 -2.3904658547665907E+00 +-2.3899170521425539E+00 -2.3893678481493521E+00 -2.3888182431087119E+00 -2.3882682373419679E+00 -2.3877178311700678E+00 +-2.3871670249135710E+00 -2.3866158188926470E+00 -2.3860642134270824E+00 -2.3855122088362744E+00 -2.3849598054392329E+00 +-2.3844070035545855E+00 -2.3838538035005743E+00 -2.3833002055950541E+00 -2.3827462101555001E+00 -2.3821918174990020E+00 +-2.3816370279422698E+00 -2.3810818418016275E+00 -2.3805262593930205E+00 -2.3799702810320138E+00 -2.3794139070337907E+00 +-2.3788571377131555E+00 -2.3782999733845340E+00 -2.3777424143619714E+00 -2.3771844609591390E+00 -2.3766261134893285E+00 +-2.3760673722654522E+00 -2.3755082376000503E+00 -2.3749487098052864E+00 -2.3743887891929480E+00 -2.3738284760744484E+00 +-2.3732677707608256E+00 -2.3727066735627496E+00 -2.3721451847905120E+00 -2.3715833047540333E+00 -2.3710210337628643E+00 +-2.3704583721261820E+00 -2.3698953201527941E+00 -2.3693318781511401E+00 -2.3687680464292868E+00 -2.3682038252949340E+00 +-2.3676392150554113E+00 -2.3670742160176843E+00 -2.3665088284883473E+00 -2.3659430527736300E+00 -2.3653768891793940E+00 +-2.3648103380111394E+00 -2.3642433995739958E+00 -2.3636760741727323E+00 -2.3631083621117526E+00 -2.3625402636950965E+00 +-2.3619717792264425E+00 -2.3614029090091044E+00 -2.3608336533460363E+00 -2.3602640125398278E+00 -2.3596939868927147E+00 +-2.3591235767065655E+00 -2.3585527822828918E+00 -2.3579816039228452E+00 -2.3574100419272201E+00 -2.3568380965964515E+00 +-2.3562657682306183E+00 -2.3556930571294408E+00 -2.3551199635922839E+00 -2.3545464879181566E+00 -2.3539726304057100E+00 +-2.3533983913532452E+00 -2.3528237710587052E+00 -2.3522487698196795E+00 -2.3516733879334057E+00 -2.3510976256967675E+00 +-2.3505214834062973E+00 -2.3499449613581742E+00 -2.3493680598482278E+00 -2.3487907791719365E+00 -2.3482131196244267E+00 +-2.3476350815004787E+00 -2.3470566650945206E+00 -2.3464778707006313E+00 -2.3458986986125474E+00 -2.3453191491236516E+00 +-2.3447392225269819E+00 -2.3441589191152299E+00 -2.3435782391807396E+00 -2.3429971830155121E+00 -2.3424157509112007E+00 +-2.3418339431591164E+00 -2.3412517600502252E+00 -2.3406692018751500E+00 -2.3400862689241695E+00 -2.3395029614872218E+00 +-2.3389192798539016E+00 -2.3383352243134619E+00 -2.3377507951548160E+00 -2.3371659926665362E+00 -2.3365808171368556E+00 +-2.3359952688536647E+00 -2.3354093481045188E+00 -2.3348230551766336E+00 -2.3342363903568848E+00 -2.3336493539318144E+00 +-2.3330619461876236E+00 -2.3324741674101763E+00 -2.3318860178850085E+00 -2.3312974978973129E+00 -2.3307086077319483E+00 +-2.3301193476734410E+00 -2.3295297180059813E+00 -2.3289397190134284E+00 -2.3283493509793058E+00 -2.3277586141868056E+00 +-2.3271675089187891E+00 -2.3265760354577840E+00 -2.3259841940859882E+00 -2.3253919850852678E+00 -2.3247994087371602E+00 +-2.3242064653228720E+00 -2.3236131551232808E+00 -2.3230194784189364E+00 -2.3224254354900595E+00 -2.3218310266165436E+00 +-2.3212362520779548E+00 -2.3206411121535311E+00 -2.3200456071221867E+00 -2.3194497372625089E+00 -2.3188535028527575E+00 +-2.3182569041708718E+00 -2.3176599414944650E+00 -2.3170626151008236E+00 -2.3164649252669141E+00 -2.3158668722693778E+00 +-2.3152684563845356E+00 -2.3146696778883844E+00 -2.3140705370565988E+00 -2.3134710341645377E+00 -2.3128711694872321E+00 +-2.3122709432993980E+00 -2.3116703558754290E+00 -2.3110694074894012E+00 -2.3104680984150709E+00 -2.3098664289258770E+00 +-2.3092643992949391E+00 -2.3086620097950599E+00 -2.3080592606987267E+00 -2.3074561522781085E+00 -2.3068526848050595E+00 +-2.3062488585511174E+00 -2.3056446737875054E+00 -2.3050401307851325E+00 -2.3044352298145898E+00 -2.3038299711461625E+00 +-2.3032243550498159E+00 -2.3026183817952051E+00 -2.3020120516516718E+00 -2.3014053648882458E+00 -2.3007983217736467E+00 +-2.3001909225762827E+00 -2.2995831675642493E+00 -2.2989750570053347E+00 -2.2983665911670168E+00 -2.2977577703164642E+00 +-2.2971485947205350E+00 -2.2965390646457817E+00 -2.2959291803584478E+00 -2.2953189421244682E+00 -2.2947083502094721E+00 +-2.2940974048787828E+00 -2.2934861063974163E+00 -2.2928744550300832E+00 -2.2922624510411898E+00 -2.2916500946948348E+00 +-2.2910373862548163E+00 -2.2904243259846262E+00 -2.2898109141474525E+00 -2.2891971510061841E+00 -2.2885830368234026E+00 +-2.2879685718613900E+00 -2.2873537563821253E+00 -2.2867385906472872E+00 -2.2861230749182524E+00 -2.2855072094560986E+00 +-2.2848909945216023E+00 -2.2842744303752425E+00 -2.2836575172771960E+00 -2.2830402554873430E+00 -2.2824226452652652E+00 +-2.2818046868702466E+00 -2.2811863805612722E+00 -2.2805677265970310E+00 -2.2799487252359172E+00 -2.2793293767360265E+00 +-2.2787096813551599E+00 -2.2780896393508221E+00 -2.2774692509802255E+00 -2.2768485165002845E+00 -2.2762274361676225E+00 +-2.2756060102385653E+00 -2.2749842389691528E+00 -2.2743621226151252E+00 -2.2737396614319336E+00 -2.2731168556747354E+00 +-2.2724937055983983E+00 -2.2718702114574980E+00 -2.2712463735063193E+00 -2.2706221919988563E+00 -2.2699976671888162E+00 +-2.2693727993296120E+00 -2.2687475886743727E+00 -2.2681220354759346E+00 -2.2674961399868470E+00 -2.2668699024593737E+00 +-2.2662433231454879E+00 -2.2656164022968777E+00 -2.2649891401649440E+00 -2.2643615370008012E+00 -2.2637335930552798E+00 +-2.2631053085789223E+00 -2.2624766838219887E+00 -2.2618477190344524E+00 -2.2612184144660032E+00 -2.2605887703660468E+00 +-2.2599587869837108E+00 -2.2593284645678318E+00 -2.2586978033669682E+00 -2.2580668036293963E+00 -2.2574354656031086E+00 +-2.2568037895358199E+00 -2.2561717756749600E+00 -2.2555394242676807E+00 -2.2549067355608527E+00 -2.2542737098010686E+00 +-2.2536403472346387E+00 -2.2530066481075970E+00 -2.2523726126656984E+00 -2.2517382411544182E+00 -2.2511035338189562E+00 +-2.2504684909042334E+00 -2.2498331126548932E+00 -2.2491973993153045E+00 -2.2485613511295588E+00 -2.2479249683414704E+00 +-2.2472882511945818E+00 -2.2466511999321570E+00 -2.2460138147971849E+00 -2.2453760960323867E+00 -2.2447380438802020E+00 +-2.2440996585828010E+00 -2.2434609403820795E+00 -2.2428218895196603E+00 -2.2421825062368952E+00 -2.2415427907748628E+00 +-2.2409027433743711E+00 -2.2402623642759569E+00 -2.2396216537198850E+00 -2.2389806119461517E+00 -2.2383392391944805E+00 +-2.2376975357043296E+00 -2.2370555017148837E+00 -2.2364131374650595E+00 -2.2357704431935077E+00 -2.2351274191386086E+00 +-2.2344840655384757E+00 -2.2338403826309530E+00 -2.2331963706536211E+00 -2.2325520298437911E+00 -2.2319073604385089E+00 +-2.2312623626745554E+00 -2.2306170367884417E+00 -2.2299713830164212E+00 -2.2293254015944779E+00 -2.2286790927583300E+00 +-2.2280324567434362E+00 -2.2273854937849853E+00 -2.2267382041179102E+00 -2.2260905879768753E+00 -2.2254426455962855E+00 +-2.2247943772102805E+00 -2.2241457830527409E+00 -2.2234968633572860E+00 -2.2228476183572723E+00 -2.2221980482857950E+00 +-2.2215481533756916E+00 -2.2208979338595389E+00 -2.2202473899696522E+00 -2.2195965219380889E+00 -2.2189453299966480E+00 +-2.2182938143768691E+00 -2.2176419753100332E+00 -2.2169898130271650E+00 -2.2163373277590308E+00 -2.2156845197361381E+00 +-2.2150313891887392E+00 -2.2143779363468341E+00 -2.2137241614401608E+00 -2.2130700646982029E+00 -2.2124156463501903E+00 +-2.2117609066250963E+00 -2.2111058457516410E+00 -2.2104504639582894E+00 -2.2097947614732534E+00 -2.2091387385244894E+00 +-2.2084823953397033E+00 -2.2078257321463468E+00 -2.2071687491716179E+00 -2.2065114466424647E+00 -2.2058538247855823E+00 +-2.2051958838274150E+00 -2.2045376239941543E+00 -2.2038790455117434E+00 -2.2032201486058729E+00 -2.2025609335019856E+00 +-2.2019014004252715E+00 -2.2012415496006743E+00 -2.2005813812528876E+00 -2.1999208956063527E+00 -2.1992600928852712E+00 +-2.1985989733135898E+00 -2.1979375371150085E+00 -2.1972757845129816E+00 -2.1966137157307144E+00 -2.1959513309911669E+00 +-2.1952886305170543E+00 -2.1946256145308425E+00 -2.1939622832547538E+00 -2.1932986369107663E+00 -2.1926346757206105E+00 +-2.1919703999057747E+00 -2.1913058096875004E+00 -2.1906409052867879E+00 -2.1899756869243929E+00 -2.1893101548208271E+00 +-2.1886443091963601E+00 -2.1879781502710194E+00 -2.1873116782645874E+00 -2.1866448933966089E+00 -2.1859777958863855E+00 +-2.1853103859529743E+00 -2.1846426638151972E+00 -2.1839746296916283E+00 -2.1833062838006110E+00 -2.1826376263602412E+00 +-2.1819686575883770E+00 -2.1812993777026386E+00 -2.1806297869204068E+00 -2.1799598854588220E+00 -2.1792896735347882E+00 +-2.1786191513649724E+00 -2.1779483191658002E+00 -2.1772771771534640E+00 -2.1766057255439177E+00 -2.1759339645528768E+00 +-2.1752618943958235E+00 -2.1745895152880017E+00 -2.1739168274444207E+00 -2.1732438310798541E+00 -2.1725705264088417E+00 +-2.1718969136456860E+00 -2.1712229930044571E+00 -2.1705487646989905E+00 -2.1698742289428878E+00 -2.1691993859495176E+00 +-2.1685242359320149E+00 -2.1678487791032803E+00 -2.1671730156759876E+00 -2.1664969458625722E+00 -2.1658205698752422E+00 +-2.1651438879259692E+00 -2.1644669002264973E+00 -2.1637896069883391E+00 -2.1631120084227775E+00 -2.1624341047408615E+00 +-2.1617558961534149E+00 -2.1610773828710279E+00 -2.1603985651040638E+00 -2.1597194430626567E+00 -2.1590400169567103E+00 +-2.1583602869959018E+00 -2.1576802533896786E+00 -2.1569999163472633E+00 -2.1563192760776473E+00 -2.1556383327895969E+00 +-2.1549570866916508E+00 -2.1542755379921235E+00 -2.1535936868990997E+00 -2.1529115336204394E+00 -2.1522290783637761E+00 +-2.1515463213365242E+00 -2.1508632627458657E+00 -2.1501799027987594E+00 -2.1494962417019425E+00 -2.1488122796619242E+00 +-2.1481280168849950E+00 -2.1474434535772158E+00 -2.1467585899444290E+00 -2.1460734261922529E+00 -2.1453879625260823E+00 +-2.1447021991510908E+00 -2.1440161362722283E+00 -2.1433297740942265E+00 -2.1426431128215926E+00 -2.1419561526586128E+00 +-2.1412688938093543E+00 -2.1405813364776627E+00 -2.1398934808671632E+00 -2.1392053271812626E+00 -2.1385168756231447E+00 +-2.1378281263957795E+00 -2.1371390797019121E+00 -2.1364497357440739E+00 -2.1357600947245725E+00 -2.1350701568455044E+00 +-2.1343799223087427E+00 -2.1336893913159445E+00 -2.1329985640685507E+00 -2.1323074407677831E+00 -2.1316160216146489E+00 +-2.1309243068099377E+00 -2.1302322965542242E+00 -2.1295399910478663E+00 -2.1288473904910079E+00 -2.1281544950835749E+00 +-2.1274613050252809E+00 -2.1267678205156231E+00 -2.1260740417538870E+00 -2.1253799689391411E+00 -2.1246856022702412E+00 +-2.1239909419458307E+00 -2.1232959881643381E+00 -2.1226007411239793E+00 -2.1219052010227601E+00 -2.1212093680584703E+00 +-2.1205132424286899E+00 -2.1198168243307860E+00 -2.1191201139619134E+00 -2.1184231115190211E+00 -2.1177258171988411E+00 +-2.1170282311978972E+00 -2.1163303537125020E+00 -2.1156321849387592E+00 -2.1149337250725613E+00 -2.1142349743095932E+00 +-2.1135359328453283E+00 -2.1128366008750334E+00 -2.1121369785937651E+00 -2.1114370661963719E+00 -2.1107368638774946E+00 +-2.1100363718315651E+00 -2.1093355902528095E+00 -2.1086345193352454E+00 -2.1079331592726822E+00 -2.1072315102587269E+00 +-2.1065295724867745E+00 -2.1058273461500177E+00 -2.1051248314414428E+00 -2.1044220285538286E+00 -2.1037189376797509E+00 +-2.1030155590115762E+00 -2.1023118927414743E+00 -2.1016079390614029E+00 -2.1009036981631177E+00 -2.1001991702381724E+00 +-2.0994943554779137E+00 -2.0987892540734867E+00 -2.0980838662158332E+00 -2.0973781920956922E+00 -2.0966722319036002E+00 +-2.0959659858298907E+00 -2.0952594540646952E+00 -2.0945526367979439E+00 -2.0938455342193643E+00 -2.0931381465184851E+00 +-2.0924304738846304E+00 -2.0917225165069273E+00 -2.0910142745742997E+00 -2.0903057482754721E+00 -2.0895969377989689E+00 +-2.0888878433331151E+00 -2.0881784650660369E+00 -2.0874688031856596E+00 -2.0867588578797114E+00 -2.0860486293357181E+00 +-2.0853381177410149E+00 -2.0846273232827315E+00 -2.0839162461478029E+00 -2.0832048865229660E+00 -2.0824932445947590E+00 +-2.0817813205495250E+00 -2.0810691145734102E+00 -2.0803566268523626E+00 -2.0796438575721359E+00 -2.0789308069182861E+00 +-2.0782174750761739E+00 -2.0775038622309658E+00 -2.0767899685676317E+00 -2.0760757942709454E+00 -2.0753613395254891E+00 +-2.0746466045156482E+00 -2.0739315894256136E+00 -2.0732162944393835E+00 -2.0725007197407619E+00 -2.0717848655133597E+00 +-2.0710687319405938E+00 -2.0703523192056883E+00 -2.0696356274916750E+00 -2.0689186569813911E+00 -2.0682014078574880E+00 +-2.0674838803024178E+00 -2.0667660744984460E+00 -2.0660479906276419E+00 -2.0653296288718876E+00 -2.0646109894128730E+00 +-2.0638920724320964E+00 -2.0631728781108674E+00 -2.0624534066303037E+00 -2.0617336581713346E+00 -2.0610136329146980E+00 +-2.0602933310409437E+00 -2.0595727527304319E+00 -2.0588518981633346E+00 -2.0581307675196334E+00 -2.0574093609791224E+00 +-2.0566876787214077E+00 -2.0559657209259075E+00 -2.0552434877718513E+00 -2.0545209794382830E+00 -2.0537981961040574E+00 +-2.0530751379478427E+00 -2.0523518051481191E+00 -2.0516281978831863E+00 -2.0509043163311511E+00 -2.0501801606699366E+00 +-2.0494557310772805E+00 -2.0487310277307338E+00 -2.0480060508076630E+00 -2.0472808004852503E+00 -2.0465552769404920E+00 +-2.0458294803502008E+00 -2.0451034108910031E+00 -2.0443770687393439E+00 -2.0436504540714830E+00 -2.0429235670634962E+00 +-2.0421964078912769E+00 -2.0414689767305347E+00 -2.0407412737567969E+00 -2.0400132991454076E+00 -2.0392850530715290E+00 +-2.0385565357101401E+00 -2.0378277472360393E+00 -2.0370986878238444E+00 -2.0363693576479864E+00 -2.0356397568827220E+00 +-2.0349098857021195E+00 -2.0341797442800762E+00 -2.0334493327903016E+00 -2.0327186514063245E+00 -2.0319877003014977E+00 +-2.0312564796489920E+00 -2.0305249896217981E+00 -2.0297932303927282E+00 -2.0290612021344168E+00 -2.0283289050193161E+00 +-2.0275963392197029E+00 -2.0268635049076735E+00 -2.0261304022551476E+00 -2.0253970314338661E+00 -2.0246633926153916E+00 +-2.0239294859711099E+00 -2.0231953116722292E+00 -2.0224608698897812E+00 -2.0217261607946209E+00 -2.0209911845574258E+00 +-2.0202559413486978E+00 -2.0195204313387616E+00 -2.0187846546977677E+00 -2.0180486115956877E+00 -2.0173123022023240E+00 +-2.0165757266872983E+00 -2.0158388852200582E+00 -2.0151017779698783E+00 -2.0143644051058565E+00 -2.0136267667969174E+00 +-2.0128888632118125E+00 -2.0121506945191174E+00 -2.0114122608872362E+00 -2.0106735624843979E+00 -2.0099345994786586E+00 +-2.0091953720379019E+00 -2.0084558803298389E+00 -2.0077161245220081E+00 -2.0069761047817742E+00 -2.0062358212763316E+00 +-2.0054952741727017E+00 -2.0047544636377350E+00 -2.0040133898381107E+00 -2.0032720529403361E+00 -2.0025304531107482E+00 +-2.0017885905155119E+00 -2.0010464653206230E+00 -2.0003040776919043E+00 -1.9995614277950156E+00 -1.9988185157954386E+00 +-1.9980753418584896E+00 -1.9973319061493136E+00 -1.9965882088328879E+00 -1.9958442500740194E+00 -1.9951000300373476E+00 +-1.9943555488873419E+00 -1.9936108067883047E+00 -1.9928658039043685E+00 -1.9921205403995008E+00 -1.9913750164374981E+00 +-1.9906292321819921E+00 -1.9898831877964445E+00 -1.9891368834441521E+00 -1.9883903192882439E+00 -1.9876434954916826E+00 +-1.9868964122172648E+00 -1.9861490696276194E+00 -1.9854014678852112E+00 -1.9846536071523366E+00 -1.9839054875911295E+00 +-1.9831571093635560E+00 -1.9824084726314162E+00 -1.9816595775563512E+00 -1.9809104242998314E+00 -1.9801610130231637E+00 +-1.9794113438874910E+00 -1.9786614170537935E+00 -1.9779112326828852E+00 -1.9771607909354183E+00 -1.9764100919718806E+00 +-1.9756591359525963E+00 -1.9749079230377280E+00 -1.9741564533872735E+00 -1.9734047271610691E+00 -1.9726527445187885E+00 +-1.9719005056199428E+00 -1.9711480106238808E+00 -1.9703952596897902E+00 -1.9696422529766973E+00 -1.9688889906434661E+00 +-1.9681354728487990E+00 -1.9673816997512386E+00 -1.9666276715091660E+00 -1.9658733882808017E+00 -1.9651188502242034E+00 +-1.9643640574972765E+00 -1.9636090102577579E+00 -1.9628537086632278E+00 -1.9620981528711070E+00 -1.9613423430386561E+00 +-1.9605862793229780E+00 -1.9598299618810149E+00 -1.9590733908695508E+00 -1.9583165664452122E+00 -1.9575594887644647E+00 +-1.9568021579836179E+00 -1.9560445742588231E+00 -1.9552867377460734E+00 -1.9545286486012043E+00 -1.9537703069798931E+00 +-1.9530117130376612E+00 -1.9522528669298731E+00 -1.9514937688117355E+00 -1.9507344188382989E+00 -1.9499748171644575E+00 +-1.9492149639449488E+00 -1.9484548593343549E+00 -1.9476945034871025E+00 -1.9469338965574585E+00 -1.9461730386995433E+00 +-1.9454119300673149E+00 -1.9446505708145765E+00 -1.9438889610949790E+00 -1.9431271010620170E+00 -1.9423649908690330E+00 +-1.9416026306692111E+00 -1.9408400206155856E+00 -1.9400771608610339E+00 -1.9393140515582818E+00 -1.9385506928599003E+00 +-1.9377870849183076E+00 -1.9370232278857691E+00 -1.9362591219143963E+00 -1.9354947671561489E+00 -1.9347301637628342E+00 +-1.9339653118861062E+00 -1.9332002116774674E+00 -1.9324348632882693E+00 -1.9316692668697095E+00 -1.9309034225728348E+00 +-1.9301373305485419E+00 -1.9293709909475756E+00 -1.9286044039205263E+00 -1.9278375696178416E+00 -1.9270704881898117E+00 +-1.9263031597865783E+00 -1.9255355845581323E+00 -1.9247677626543156E+00 -1.9239996942248194E+00 -1.9232313794191860E+00 +-1.9224628183868080E+00 -1.9216940112769272E+00 -1.9209249582386392E+00 -1.9201556594208875E+00 -1.9193861149724694E+00 +-1.9186163250420323E+00 -1.9178462897780748E+00 -1.9170760093289489E+00 -1.9163054838428573E+00 -1.9155347134678555E+00 +-1.9147636983518508E+00 -1.9139924386426033E+00 -1.9132209344877265E+00 -1.9124491860346857E+00 -1.9116771934307997E+00 +-1.9109049568232388E+00 -1.9101324763590326E+00 -1.9093597521850592E+00 -1.9085867844480504E+00 -1.9078135732945942E+00 +-1.9070401188711317E+00 -1.9062664213239582E+00 -1.9054924807992246E+00 -1.9047182974429351E+00 -1.9039438714009498E+00 +-1.9031692028189835E+00 -1.9023942918426069E+00 -1.9016191386172456E+00 -1.9008437432881802E+00 -1.9000681060005480E+00 +-1.8992922268993424E+00 -1.8985161061294131E+00 -1.8977397438354651E+00 -1.8969631401620599E+00 -1.8961862952536173E+00 +-1.8954092092544126E+00 -1.8946318823085786E+00 -1.8938543145601052E+00 -1.8930765061528401E+00 -1.8922984572304860E+00 +-1.8915201679366096E+00 -1.8907416384146298E+00 -1.8899628688078247E+00 -1.8891838592593322E+00 -1.8884046099121479E+00 +-1.8876251209091250E+00 -1.8868453923929775E+00 -1.8860654245062765E+00 -1.8852852173914536E+00 -1.8845047711907994E+00 +-1.8837240860464635E+00 -1.8829431621004551E+00 -1.8821619994946455E+00 -1.8813805983707623E+00 -1.8805989588703964E+00 +-1.8798170811349970E+00 -1.8790349653058760E+00 -1.8782526115242038E+00 -1.8774700199310130E+00 -1.8766871906671962E+00 +-1.8759041238735095E+00 -1.8751208196905675E+00 -1.8743372782588483E+00 -1.8735534997186885E+00 -1.8727694842102942E+00 +-1.8719852318737256E+00 -1.8712007428489097E+00 -1.8704160172756334E+00 -1.8696310552935478E+00 -1.8688458570421647E+00 +-1.8680604226608619E+00 -1.8672747522888786E+00 -1.8664888460653168E+00 -1.8657027041291427E+00 -1.8649163266191862E+00 +-1.8641297136741404E+00 -1.8633428654325621E+00 -1.8625557820328731E+00 -1.8617684636133596E+00 -1.8609809103121711E+00 +-1.8601931222673220E+00 -1.8594050996166926E+00 -1.8586168424980267E+00 -1.8578283510489335E+00 -1.8570396254068893E+00 +-1.8562506657092321E+00 -1.8554614720931675E+00 -1.8546720446957701E+00 -1.8538823836539753E+00 -1.8530924891045868E+00 +-1.8523023611842748E+00 -1.8515120000295753E+00 -1.8507214057768910E+00 -1.8499305785624911E+00 -1.8491395185225119E+00 +-1.8483482257929567E+00 -1.8475567005096978E+00 -1.8467649428084711E+00 -1.8459729528248838E+00 -1.8451807306944081E+00 +-1.8443882765523856E+00 -1.8435955905340260E+00 -1.8428026727744065E+00 -1.8420095234084717E+00 -1.8412161425710383E+00 +-1.8404225303967867E+00 -1.8396286870202700E+00 -1.8388346125759094E+00 -1.8380403071979936E+00 -1.8372457710206826E+00 +-1.8364510041780029E+00 -1.8356560068038570E+00 -1.8348607790320106E+00 -1.8340653209961029E+00 -1.8332696328296409E+00 +-1.8324737146660039E+00 -1.8316775666384397E+00 -1.8308811888800682E+00 -1.8300845815238798E+00 -1.8292877447027358E+00 +-1.8284906785493675E+00 -1.8276933831963791E+00 -1.8268958587762445E+00 -1.8260981054213106E+00 -1.8253001232637944E+00 +-1.8245019124357864E+00 -1.8237034730692478E+00 -1.8229048052960131E+00 -1.8221059092477871E+00 -1.8213067850561493E+00 +-1.8205074328525503E+00 -1.8197078527683146E+00 -1.8189080449346393E+00 -1.8181080094825928E+00 -1.8173077465431171E+00 +-1.8165072562470326E+00 -1.8157065387250271E+00 -1.8149055941076655E+00 -1.8141044225253826E+00 -1.8133030241084931E+00 +-1.8125013989871799E+00 -1.8116995472915041E+00 -1.8108974691513999E+00 -1.8100951646966761E+00 -1.8092926340570168E+00 +-1.8084898773619800E+00 -1.8076868947409990E+00 -1.8068836863233830E+00 -1.8060802522383161E+00 -1.8052765926148584E+00 +-1.8044727075819436E+00 -1.8036685972683841E+00 -1.8028642618028667E+00 -1.8020597013139539E+00 -1.8012549159300855E+00 +-1.8004499057795766E+00 -1.7996446709906200E+00 -1.7988392116912821E+00 -1.7980335280095134E+00 -1.7972276200731339E+00 +-1.7964214880098441E+00 -1.7956151319472209E+00 -1.7948085520127184E+00 -1.7940017483336697E+00 -1.7931947210372834E+00 +-1.7923874702506479E+00 -1.7915799961007293E+00 -1.7907722987143706E+00 -1.7899643782182939E+00 -1.7891562347391012E+00 +-1.7883478684032705E+00 -1.7875392793371598E+00 -1.7867304676670073E+00 -1.7859214335189271E+00 -1.7851121770189156E+00 +-1.7843026982928458E+00 -1.7834929974664731E+00 -1.7826830746654305E+00 -1.7818729300152309E+00 -1.7810625636412674E+00 +-1.7802519756688133E+00 -1.7794411662230196E+00 -1.7786301354289249E+00 -1.7778188834114403E+00 -1.7770074102953619E+00 +-1.7761957162053634E+00 -1.7753838012660030E+00 -1.7745716656017170E+00 -1.7737593093368240E+00 -1.7729467325955250E+00 +-1.7721339355019003E+00 -1.7713209181799137E+00 -1.7705076807534093E+00 -1.7696942233461141E+00 -1.7688805460816379E+00 +-1.7680666490834698E+00 -1.7672525324749833E+00 -1.7664381963794362E+00 -1.7656236409199639E+00 -1.7648088662195889E+00 +-1.7639938724012145E+00 -1.7631786595876275E+00 -1.7623632279014985E+00 -1.7615475774653799E+00 -1.7607317084017069E+00 +-1.7599156208328042E+00 -1.7590993148808738E+00 -1.7582827906680023E+00 -1.7574660483161628E+00 -1.7566490879472105E+00 +-1.7558319096828865E+00 -1.7550145136448141E+00 -1.7541968999545037E+00 -1.7533790687333479E+00 -1.7525610201026263E+00 +-1.7517427541835018E+00 -1.7509242710970230E+00 -1.7501055709641242E+00 -1.7492866539056238E+00 -1.7484675200422271E+00 +-1.7476481694945236E+00 -1.7468286023829909E+00 -1.7460088188279890E+00 -1.7451888189497673E+00 -1.7443686028684589E+00 +-1.7435481707040850E+00 -1.7427275225765517E+00 -1.7419066586056529E+00 -1.7410855789110669E+00 -1.7402642836123641E+00 +-1.7394427728289965E+00 -1.7386210466803056E+00 -1.7377991052855193E+00 -1.7369769487637532E+00 -1.7361545772340097E+00 +-1.7353319908151805E+00 -1.7345091896260443E+00 -1.7336861737852669E+00 -1.7328629434114025E+00 -1.7320394986228942E+00 +-1.7312158395380723E+00 -1.7303919662751566E+00 -1.7295678789522548E+00 -1.7287435776873645E+00 -1.7279190625983689E+00 +-1.7270943338030440E+00 -1.7262693914190532E+00 -1.7254442355639481E+00 -1.7246188663551711E+00 -1.7237932839100543E+00 +-1.7229674883458179E+00 -1.7221414797795729E+00 -1.7213152583283176E+00 -1.7204888241089482E+00 -1.7196621772382410E+00 +-1.7188353178328686E+00 -1.7180082460093922E+00 -1.7171809618842631E+00 -1.7163534655738246E+00 -1.7155257571943094E+00 +-1.7146978368618413E+00 -1.7138697046924367E+00 -1.7130413608020005E+00 -1.7122128053063319E+00 -1.7113840383211185E+00 +-1.7105550599619419E+00 -1.7097258703442737E+00 -1.7088964695834774E+00 -1.7080668577948097E+00 -1.7072370350934185E+00 +-1.7064070015943436E+00 -1.7055767574125180E+00 -1.7047463026627652E+00 -1.7039156374598037E+00 -1.7030847619182428E+00 +-1.7022536761525839E+00 -1.7014223802772264E+00 -1.7005908744064573E+00 -1.6997591586544583E+00 -1.6989272331353049E+00 +-1.6980950979629650E+00 -1.6972627532513016E+00 -1.6964301991140707E+00 -1.6955974356649213E+00 -1.6947644630173975E+00 +-1.6939312812849365E+00 -1.6930978905808698E+00 -1.6922642910184242E+00 -1.6914304827107198E+00 -1.6905964657707713E+00 +-1.6897622403114887E+00 -1.6889278064456767E+00 -1.6880931642860344E+00 -1.6872583139451551E+00 -1.6864232555355296E+00 +-1.6855879891695424E+00 -1.6847525149594738E+00 -1.6839168330174987E+00 -1.6830809434556893E+00 -1.6822448463860094E+00 +-1.6814085419203273E+00 -1.6805720301703995E+00 -1.6797353112478806E+00 -1.6788983852643216E+00 -1.6780612523311713E+00 +-1.6772239125597732E+00 -1.6763863660613678E+00 -1.6755486129470922E+00 -1.6747106533279814E+00 -1.6738724873149662E+00 +-1.6730341150188750E+00 -1.6721955365504326E+00 -1.6713567520202635E+00 -1.6705177615388864E+00 -1.6696785652167192E+00 +-1.6688391631640784E+00 -1.6679995554911757E+00 -1.6671597423081237E+00 -1.6663197237249308E+00 -1.6654794998515048E+00 +-1.6646390707976511E+00 -1.6637984366730729E+00 -1.6629575975873740E+00 -1.6621165536500524E+00 -1.6612753049705125E+00 +-1.6604338516580508E+00 -1.6595921938218645E+00 -1.6587503315710512E+00 -1.6579082650146062E+00 -1.6570659942614248E+00 +-1.6562235194203019E+00 -1.6553808405999311E+00 -1.6545379579089072E+00 -1.6536948714557236E+00 -1.6528515813487732E+00 +-1.6520080876963499E+00 -1.6511643906066480E+00 -1.6503204901877608E+00 -1.6494763865476827E+00 -1.6486320797943079E+00 +-1.6477875700354330E+00 -1.6469428573787530E+00 -1.6460979419318653E+00 -1.6452528238022670E+00 -1.6444075030973579E+00 +-1.6435619799244372E+00 -1.6427162543907043E+00 -1.6418703266032659E+00 -1.6410241966691250E+00 -1.6401778646951859E+00 +-1.6393313307882569E+00 -1.6384845950550471E+00 -1.6376376576021681E+00 -1.6367905185361329E+00 -1.6359431779633571E+00 +-1.6350956359901585E+00 -1.6342478927227568E+00 -1.6333999482672750E+00 -1.6325518027297390E+00 -1.6317034562160764E+00 +-1.6308549088321176E+00 -1.6300061606835967E+00 -1.6291572118761508E+00 -1.6283080625153203E+00 -1.6274587127065481E+00 +-1.6266091625551811E+00 -1.6257594121664696E+00 -1.6249094616455675E+00 -1.6240593110975328E+00 -1.6232089606273263E+00 +-1.6223584103398119E+00 -1.6215076603397636E+00 -1.6206567107318521E+00 -1.6198055616206559E+00 -1.6189542131106571E+00 +-1.6181026653062427E+00 -1.6172509183117048E+00 -1.6163989722312384E+00 -1.6155468271689448E+00 -1.6146944832288306E+00 +-1.6138419405148063E+00 -1.6129891991306877E+00 -1.6121362591801973E+00 -1.6112831207669607E+00 -1.6104297839945105E+00 +-1.6095762489662846E+00 -1.6087225157856271E+00 -1.6078685845557863E+00 -1.6070144553799177E+00 -1.6061601283610834E+00 +-1.6053056036022497E+00 -1.6044508812062905E+00 -1.6035959612759860E+00 -1.6027408439140227E+00 -1.6018855292229901E+00 +-1.6010300173053933E+00 -1.6001743082636368E+00 -1.5993184022000324E+00 -1.5984622992168009E+00 -1.5976059994160701E+00 +-1.5967495028998737E+00 -1.5958928097701539E+00 -1.5950359201287592E+00 -1.5941788340774465E+00 -1.5933215517178805E+00 +-1.5924640731516322E+00 -1.5916063984801825E+00 -1.5907485278049176E+00 -1.5898904612271343E+00 -1.5890321988480358E+00 +-1.5881737407687344E+00 -1.5873150870902504E+00 -1.5864562379135125E+00 -1.5855971933393582E+00 -1.5847379534685329E+00 +-1.5838785184016926E+00 -1.5830188882393992E+00 -1.5821590630821247E+00 -1.5812990430302540E+00 -1.5804388281840760E+00 +-1.5795784186437904E+00 -1.5787178145095075E+00 -1.5778570158812453E+00 -1.5769960228589328E+00 -1.5761348355424074E+00 +-1.5752734540314177E+00 -1.5744118784256211E+00 -1.5735501088245853E+00 -1.5726881453277881E+00 -1.5718259880346181E+00 +-1.5709636370443725E+00 -1.5701010924562604E+00 -1.5692383543694020E+00 -1.5683754228828255E+00 -1.5675122980954728E+00 +-1.5666489801061931E+00 -1.5657854690137505E+00 -1.5649217649168172E+00 -1.5640578679139776E+00 -1.5631937781037271E+00 +-1.5623294955844720E+00 -1.5614650204545288E+00 -1.5606003528121311E+00 -1.5597354927554172E+00 -1.5588704403824409E+00 +-1.5580051957911671E+00 -1.5571397590794709E+00 -1.5562741303451415E+00 -1.5554083096858795E+00 -1.5545422971992982E+00 +-1.5536760929829219E+00 -1.5528096971341878E+00 -1.5519431097504464E+00 -1.5510763309289604E+00 -1.5502093607669043E+00 +-1.5493421993613661E+00 -1.5484748468093472E+00 -1.5476073032077609E+00 -1.5467395686534340E+00 -1.5458716432431061E+00 +-1.5450035270734315E+00 -1.5441352202409762E+00 -1.5432667228422201E+00 -1.5423980349735571E+00 -1.5415291567312943E+00 +-1.5406600882116506E+00 -1.5397908295107650E+00 -1.5389213807246847E+00 -1.5380517419493727E+00 -1.5371819132807047E+00 +-1.5363118948144734E+00 -1.5354416866463829E+00 -1.5345712888720544E+00 -1.5337007015870212E+00 -1.5328299248867336E+00 +-1.5319589588665545E+00 -1.5310878036217630E+00 -1.5302164592475518E+00 -1.5293449258390299E+00 -1.5284732034912207E+00 +-1.5276012922990636E+00 -1.5267291923574111E+00 -1.5258569037610341E+00 -1.5249844266046164E+00 -1.5241117609827590E+00 +-1.5232389069899774E+00 -1.5223658647207039E+00 -1.5214926342692858E+00 -1.5206192157299845E+00 -1.5197456091969845E+00 +-1.5188718147643787E+00 -1.5179978325261794E+00 -1.5171236625763147E+00 -1.5162493050086294E+00 -1.5153747599168841E+00 +-1.5145000273947566E+00 -1.5136251075358418E+00 -1.5127500004336509E+00 -1.5118747061816113E+00 -1.5109992248730686E+00 +-1.5101235566012845E+00 -1.5092477014594383E+00 -1.5083716595406267E+00 -1.5074954309378625E+00 -1.5066190157440777E+00 +-1.5057424140521209E+00 -1.5048656259547577E+00 -1.5039886515446734E+00 -1.5031114909144685E+00 -1.5022341441566627E+00 +-1.5013566113636945E+00 -1.5004788926279191E+00 -1.4996009880416070E+00 -1.4987228976969560E+00 -1.4978446216860739E+00 +-1.4969661601009896E+00 -1.4960875130336497E+00 -1.4952086805759208E+00 -1.4943296628195870E+00 -1.4934504598563514E+00 +-1.4925710717778369E+00 -1.4916914986755847E+00 -1.4908117406410539E+00 -1.4899317977656255E+00 -1.4890516701405967E+00 +-1.4881713578571860E+00 -1.4872908610065303E+00 -1.4864101796796871E+00 -1.4855293139676324E+00 -1.4846482639612624E+00 +-1.4837670297513923E+00 -1.4828856114287583E+00 -1.4820040090840159E+00 -1.4811222228077410E+00 -1.4802402526904284E+00 +-1.4793580988224928E+00 -1.4784757612942743E+00 -1.4775932401960277E+00 -1.4767105356179300E+00 -1.4758276476500782E+00 +-1.4749445763824913E+00 -1.4740613219051084E+00 -1.4731778843077881E+00 -1.4722942636803122E+00 -1.4714104601123823E+00 +-1.4705264736936208E+00 -1.4696423045135725E+00 -1.4687579526617014E+00 -1.4678734182273940E+00 -1.4669887012999594E+00 +-1.4661038019686266E+00 -1.4652187203225457E+00 -1.4643334564507908E+00 -1.4634480104423555E+00 -1.4625623823861562E+00 +-1.4616765723710312E+00 -1.4607905804857413E+00 -1.4599044068189686E+00 -1.4590180514593174E+00 -1.4581315144953131E+00 +-1.4572447960154089E+00 -1.4563578961079739E+00 -1.4554708148613036E+00 -1.4545835523636137E+00 -1.4536961087030440E+00 +-1.4528084839676574E+00 -1.4519206782454379E+00 -1.4510326916242953E+00 -1.4501445241920596E+00 -1.4492561760364859E+00 +-1.4483676472452514E+00 -1.4474789379059567E+00 -1.4465900481061269E+00 -1.4457009779332091E+00 -1.4448117274745746E+00 +-1.4439222968175183E+00 -1.4430326860492586E+00 -1.4421428952569386E+00 -1.4412529245276242E+00 -1.4403627739483056E+00 +-1.4394724436058965E+00 -1.4385819335872365E+00 -1.4376912439790874E+00 -1.4368003748681339E+00 -1.4359093263409926E+00 +-1.4350180984841958E+00 -1.4341266913842048E+00 -1.4332351051274039E+00 -1.4323433398001029E+00 -1.4314513954885368E+00 +-1.4305592722788643E+00 -1.4296669702571692E+00 -1.4287744895094614E+00 -1.4278818301216758E+00 -1.4269889921796708E+00 +-1.4260959757692320E+00 -1.4252027809760697E+00 -1.4243094078858192E+00 -1.4234158565840420E+00 -1.4225221271562245E+00 +-1.4216282196877799E+00 -1.4207341342640454E+00 -1.4198398709702860E+00 -1.4189454298916917E+00 -1.4180508111133772E+00 +-1.4171560147203861E+00 -1.4162610407976834E+00 -1.4153658894301695E+00 -1.4144705607026613E+00 -1.4135750546999073E+00 +-1.4126793715065806E+00 -1.4117835112072816E+00 -1.4108874738865373E+00 -1.4099912596288018E+00 -1.4090948685184550E+00 +-1.4081983006398042E+00 -1.4073015560770841E+00 -1.4064046349144561E+00 -1.4055075372360080E+00 -1.4046102631257562E+00 +-1.4037128126676435E+00 -1.4028151859455400E+00 -1.4019173830432441E+00 -1.4010194040444799E+00 -1.4001212490329009E+00 +-1.3992229180920877E+00 -1.3983244113055491E+00 -1.3974257287567202E+00 -1.3965268705289653E+00 -1.3956278367055768E+00 +-1.3947286273697721E+00 -1.3938292426047039E+00 -1.3929296824934470E+00 -1.3920299471190052E+00 -1.3911300365643120E+00 +-1.3902299509122289E+00 -1.3893296902455459E+00 -1.3884292546469814E+00 -1.3875286441991832E+00 -1.3866278589847276E+00 +-1.3857268990861189E+00 -1.3848257645857911E+00 -1.3839244555661068E+00 -1.3830229721093581E+00 -1.3821213142977664E+00 +-1.3812194822134813E+00 -1.3803174759385826E+00 -1.3794152955550789E+00 -1.3785129411449091E+00 -1.3776104127899402E+00 +-1.3767077105719705E+00 -1.3758048345727267E+00 -1.3749017848738656E+00 -1.3739985615569739E+00 -1.3730951647035661E+00 +-1.3721915943950924E+00 -1.3712878507129289E+00 -1.3703839337383807E+00 -1.3694798435526858E+00 -1.3685755802370105E+00 +-1.3676711438724529E+00 -1.3667665345400406E+00 -1.3658617523207324E+00 -1.3649567972954164E+00 -1.3640516695449134E+00 +-1.3631463691499737E+00 -1.3622408961912782E+00 -1.3613352507494383E+00 -1.3604294329049980E+00 -1.3595234427384308E+00 +-1.3586172803301415E+00 -1.3577109457604670E+00 -1.3568044391096743E+00 -1.3558977604579621E+00 -1.3549909098854618E+00 +-1.3540838874722341E+00 -1.3531766932982714E+00 -1.3522693274434971E+00 -1.3513617899877723E+00 -1.3504540810108827E+00 +-1.3495462005925483E+00 -1.3486381488124215E+00 -1.3477299257500852E+00 -1.3468215314850562E+00 -1.3459129660967826E+00 +-1.3450042296646434E+00 -1.3440953222679528E+00 -1.3431862439859541E+00 -1.3422769948978255E+00 -1.3413675750826766E+00 +-1.3404579846195490E+00 -1.3395482235874183E+00 -1.3386382920651920E+00 -1.3377281901317097E+00 -1.3368179178657451E+00 +-1.3359074753460045E+00 -1.3349968626511262E+00 -1.3340860798596830E+00 -1.3331751270501793E+00 -1.3322640043010543E+00 +-1.3313527116906791E+00 -1.3304412492973572E+00 -1.3295296171993300E+00 -1.3286178154747688E+00 -1.3277058442017780E+00 +-1.3267937034583965E+00 -1.3258813933225977E+00 -1.3249689138722875E+00 -1.3240562651853063E+00 -1.3231434473394290E+00 +-1.3222304604123625E+00 -1.3213173044817499E+00 -1.3204039796251670E+00 -1.3194904859201244E+00 -1.3185768234440669E+00 +-1.3176629922743734E+00 -1.3167489924883578E+00 -1.3158348241632674E+00 -1.3149204873762850E+00 -1.3140059822045271E+00 +-1.3130913087250458E+00 -1.3121764670148268E+00 -1.3112614571507926E+00 -1.3103462792097980E+00 -1.3094309332686349E+00 +-1.3085154194040258E+00 -1.3075997376926380E+00 -1.3066838882110645E+00 -1.3057678710358367E+00 -1.3048516862434216E+00 +-1.3039353339102211E+00 -1.3030188141125723E+00 -1.3021021269267494E+00 -1.3011852724289596E+00 -1.3002682506953480E+00 +-1.2993510618019943E+00 -1.2984337058249140E+00 -1.2975161828400583E+00 -1.2965984929233147E+00 -1.2956806361505069E+00 +-1.2947626125973934E+00 -1.2938444223396706E+00 -1.2929260654529693E+00 -1.2920075420128578E+00 -1.2910888520948405E+00 +-1.2901699957743569E+00 -1.2892509731267852E+00 -1.2883317842274375E+00 -1.2874124291515625E+00 -1.2864929079743512E+00 +-1.2855732207709243E+00 -1.2846533676163423E+00 -1.2837333485856022E+00 -1.2828131637536377E+00 -1.2818928131953196E+00 +-1.2809722969854553E+00 -1.2800516151987904E+00 -1.2791307679100066E+00 -1.2782097551937237E+00 -1.2772885771244982E+00 +-1.2763672337768237E+00 -1.2754457252251319E+00 -1.2745240515437914E+00 -1.2736022128071094E+00 -1.2726802090893294E+00 +-1.2717580404646336E+00 -1.2708357070071412E+00 -1.2699132087909097E+00 -1.2689905458899344E+00 -1.2680677183781490E+00 +-1.2671447263294238E+00 -1.2662215698175689E+00 -1.2652982489163287E+00 -1.2643747636993943E+00 -1.2634511142403870E+00 +-1.2625273006128690E+00 -1.2616033228903409E+00 -1.2606791811462428E+00 -1.2597548754539509E+00 -1.2588304058867827E+00 +-1.2579057725179932E+00 -1.2569809754207750E+00 -1.2560560146682613E+00 -1.2551308903335237E+00 -1.2542056024895720E+00 +-1.2532801512093557E+00 -1.2523545365657629E+00 -1.2514287586316213E+00 -1.2505028174796975E+00 -1.2495767131826965E+00 +-1.2486504458132646E+00 -1.2477240154439855E+00 -1.2467974221473832E+00 -1.2458706659959211E+00 -1.2449437470620026E+00 +-1.2440166654179698E+00 -1.2430894211361025E+00 -1.2421620142886283E+00 -1.2412344449477055E+00 -1.2403067131854362E+00 +-1.2393788190738624E+00 -1.2384507626849650E+00 -1.2375225440906659E+00 -1.2365941633628270E+00 -1.2356656205732504E+00 +-1.2347369157936781E+00 -1.2338080490957921E+00 -1.2328790205512163E+00 -1.2319498302315126E+00 -1.2310204782081862E+00 +-1.2300909645526807E+00 -1.2291612893363808E+00 -1.2282314526306126E+00 -1.2273014545066427E+00 -1.2263712950356778E+00 +-1.2254409742888652E+00 -1.2245104923372954E+00 -1.2235798492519974E+00 -1.2226490451039420E+00 -1.2217180799640395E+00 +-1.2207869539031475E+00 -1.2198556669920579E+00 -1.2189242193015071E+00 -1.2179926109021717E+00 -1.2170608418646705E+00 +-1.2161289122595631E+00 -1.2151968221573513E+00 -1.2142645716284783E+00 -1.2133321607433285E+00 -1.2123995895722288E+00 +-1.2114668581854469E+00 -1.2105339666531936E+00 -1.2096009150456206E+00 -1.2086677034328215E+00 -1.2077343318848324E+00 +-1.2068008004716315E+00 -1.2058671092631383E+00 -1.2049332583292163E+00 -1.2039992477396695E+00 -1.2030650775642442E+00 +-1.2021307478726311E+00 -1.2011962587344605E+00 -1.2002616102193076E+00 -1.1993268023966857E+00 -1.1983918353360601E+00 +-1.1974567091068298E+00 -1.1965214237783399E+00 -1.1955859794198775E+00 -1.1946503761006735E+00 -1.1937146138899009E+00 +-1.1927786928566759E+00 -1.1918426130700579E+00 -1.1909063745990496E+00 -1.1899699775125960E+00 -1.1890334218795857E+00 +-1.1880967077688513E+00 -1.1871598352491681E+00 -1.1862228043892540E+00 -1.1852856152577720E+00 -1.1843482679233266E+00 +-1.1834107624544679E+00 -1.1824730989196883E+00 -1.1815352773874239E+00 -1.1805972979260551E+00 -1.1796591606039062E+00 +-1.1787208654892440E+00 -1.1777824126502789E+00 -1.1768438021551706E+00 -1.1759050340720163E+00 -1.1749661084688594E+00 +-1.1740270254136884E+00 -1.1730877849744350E+00 -1.1721483872189751E+00 -1.1712088322151297E+00 -1.1702691200306632E+00 +-1.1693292507332855E+00 -1.1683892243906500E+00 -1.1674490410703546E+00 -1.1665087008399431E+00 -1.1655682037669022E+00 +-1.1646275499186642E+00 -1.1636867393626062E+00 -1.1627457721660501E+00 -1.1618046483962625E+00 -1.1608633681204550E+00 +-1.1599219314057838E+00 -1.1589803383193507E+00 -1.1580385889282023E+00 -1.1570966832993301E+00 -1.1561546214996719E+00 +-1.1552124035961069E+00 -1.1542700296554673E+00 -1.1533274997445246E+00 -1.1523848139299966E+00 -1.1514419722785467E+00 +-1.1504989748567851E+00 -1.1495558217312665E+00 -1.1486125129684912E+00 -1.1476690486349064E+00 -1.1467254287969029E+00 +-1.1457816535208201E+00 -1.1448377228729412E+00 -1.1438936369194952E+00 -1.1429493957266588E+00 -1.1420049993605534E+00 +-1.1410604478872468E+00 -1.1401157413727527E+00 -1.1391708798830318E+00 -1.1382258634839904E+00 -1.1372806922414809E+00 +-1.1363353662213032E+00 -1.1353898854892019E+00 -1.1344442501108698E+00 -1.1334984601519444E+00 -1.1325525156780094E+00 +-1.1316064167546012E+00 -1.1306601634471956E+00 -1.1297137558212176E+00 -1.1287671939420398E+00 -1.1278204778749814E+00 +-1.1268736076853063E+00 -1.1259265834382293E+00 -1.1249794051989090E+00 -1.1240320730324522E+00 -1.1230845870039132E+00 +-1.1221369471782934E+00 -1.1211891536205401E+00 -1.1202412063955505E+00 -1.1192931055681661E+00 -1.1183448512031779E+00 +-1.1173964433653236E+00 -1.1164478821192885E+00 -1.1154991675297052E+00 -1.1145502996611549E+00 -1.1136012785781648E+00 +-1.1126521043452116E+00 -1.1117027770267185E+00 -1.1107532966870541E+00 -1.1098036633905430E+00 -1.1088538772014493E+00 +-1.1079039381839895E+00 -1.1069538464023256E+00 -1.1060036019205692E+00 -1.1050532048027797E+00 -1.1041026551129649E+00 +-1.1031519529150806E+00 -1.1022010982730306E+00 -1.1012500912506678E+00 -1.1002989319117926E+00 -1.0993476203201544E+00 +-1.0983961565394516E+00 -1.0974445406333295E+00 -1.0964927726653839E+00 -1.0955408526991579E+00 -1.0945887807981445E+00 +-1.0936365570257840E+00 -1.0926841814454666E+00 -1.0917316541205311E+00 -1.0907789751142651E+00 -1.0898261444899053E+00 +-1.0888731623106369E+00 -1.0879200286395927E+00 -1.0869667435398611E+00 -1.0860133070744731E+00 -1.0850597193064100E+00 +-1.0841059802986037E+00 -1.0831520901139358E+00 -1.0821980488152354E+00 -1.0812438564652822E+00 -1.0802895131268058E+00 +-1.0793350188624844E+00 -1.0783803737349467E+00 -1.0774255778067696E+00 -1.0764706311404817E+00 -1.0755155337985591E+00 +-1.0745602858434296E+00 -1.0736048873374695E+00 -1.0726493383430058E+00 -1.0716936389223153E+00 -1.0707377891376237E+00 +-1.0697817890511092E+00 -1.0688256387248973E+00 -1.0678693382210649E+00 -1.0669128876016396E+00 -1.0659562869285983E+00 +-1.0649995362638662E+00 -1.0640426356693262E+00 -1.0630855852068037E+00 -1.0621283849380780E+00 -1.0611710349248777E+00 +-1.0602135352288828E+00 -1.0592558859117238E+00 -1.0582980870349812E+00 -1.0573401386601864E+00 -1.0563820408488225E+00 +-1.0554237936623216E+00 -1.0544653971620686E+00 -1.0535068514093977E+00 -1.0525481564655950E+00 -1.0515893123918967E+00 +-1.0506303192494908E+00 -1.0496711770995160E+00 -1.0487118860030624E+00 -1.0477524460211707E+00 -1.0467928572148337E+00 +-1.0458331196449946E+00 -1.0448732333725488E+00 -1.0439131984583416E+00 -1.0429530149631687E+00 -1.0419926829477846E+00 +-1.0410322024728864E+00 -1.0400715735991273E+00 -1.0391107963871105E+00 -1.0381498708973917E+00 -1.0371887971904779E+00 +-1.0362275753268284E+00 -1.0352662053668533E+00 -1.0343046873709154E+00 -1.0333430213993291E+00 -1.0323812075123606E+00 +-1.0314192457702291E+00 -1.0304571362331039E+00 -1.0294948789611078E+00 -1.0285324740143160E+00 -1.0275699214527552E+00 +-1.0266072213364037E+00 -1.0256443737251935E+00 -1.0246813786790079E+00 -1.0237182362576829E+00 -1.0227549465210073E+00 +-1.0217915095287220E+00 -1.0208279253405199E+00 -1.0198641940160449E+00 -1.0189003156149004E+00 -1.0179362901966347E+00 +-1.0169721178207529E+00 -1.0160077985467104E+00 -1.0150433324339174E+00 -1.0140787195417365E+00 -1.0131139599294818E+00 +-1.0121490536564226E+00 -1.0111840007817796E+00 -1.0102188013647266E+00 -1.0092534554643915E+00 -1.0082879631398540E+00 +-1.0073223244501479E+00 -1.0063565394542602E+00 -1.0053906082111306E+00 -1.0044245307796527E+00 -1.0034583072186725E+00 +-1.0024919375869912E+00 -1.0015254219433607E+00 -1.0005587603464894E+00 -9.9959195285503732E-01 -9.9862499952761863E-01 +-9.9765790042280089E-01 -9.9669065559910341E-01 -9.9572326511500620E-01 -9.9475572902893550E-01 -9.9378804739927429E-01 +-9.9282022028435868E-01 -9.9185224774247993E-01 -9.9088412983188168E-01 -9.8991586661076281E-01 -9.8894745813727603E-01 +-9.8797890446952752E-01 -9.8701020566557784E-01 -9.8604136178344248E-01 -9.8507237288108995E-01 -9.8410323901644381E-01 +-9.8313396024738187E-01 -9.8216453663173575E-01 -9.8119496822729257E-01 -9.8022525509179248E-01 -9.7925539728293143E-01 +-9.7828539485835897E-01 -9.7731524787568003E-01 -9.7634495639245322E-01 -9.7537452046619244E-01 -9.7440394015436382E-01 +-9.7343321551439566E-01 -9.7246234660366326E-01 -9.7149133347949979E-01 -9.7052017619919317E-01 -9.6954887481998608E-01 +-9.6857742939907598E-01 -9.6760583999361605E-01 -9.6663410666071370E-01 -9.6566222945743185E-01 -9.6469020844078912E-01 +-9.6371804366775837E-01 -9.6274573519526818E-01 -9.6177328308020282E-01 -9.6080068737940105E-01 -9.5982794814965744E-01 +-9.5885506544772181E-01 -9.5788203933030014E-01 -9.5690886985405310E-01 -9.5593555707559719E-01 -9.5496210105150436E-01 +-9.5398850183830286E-01 -9.5301475949247527E-01 -9.5204087407046178E-01 -9.5106684562865385E-01 -9.5009267422340771E-01 +-9.4911835991102744E-01 -9.4814390274777560E-01 -9.4716930278987044E-01 -9.4619456009348635E-01 -9.4521967471475410E-01 +-9.4424464670975994E-01 -9.4326947613454670E-01 -9.4229416304511304E-01 -9.4131870749741409E-01 -9.4034310954736089E-01 +-9.3936736925082132E-01 -9.3839148666361860E-01 -9.3741546184153379E-01 -9.3643929484030319E-01 -9.3546298571561970E-01 +-9.3448653452313335E-01 -9.3350994131845000E-01 -9.3253320615713242E-01 -9.3155632909470021E-01 -9.3057931018662865E-01 +-9.2960214948835140E-01 -9.2862484705525528E-01 -9.2764740294269132E-01 -9.2666981720596042E-01 -9.2569208990032248E-01 +-9.2471422108099421E-01 -9.2373621080314960E-01 -9.2275805912191977E-01 -9.2177976609239276E-01 -9.2080133176961310E-01 +-9.1982275620858367E-01 -9.1884403946426330E-01 -9.1786518159156893E-01 -9.1688618264537392E-01 -9.1590704268050993E-01 +-9.1492776175176505E-01 -9.1394833991388535E-01 -9.1296877722157388E-01 -9.1198907372949167E-01 -9.1100922949225649E-01 +-9.1002924456444456E-01 -9.0904911900058938E-01 -9.0806885285518169E-01 -9.0708844618266993E-01 -9.0610789903746070E-01 +-9.0512721147391606E-01 -9.0414638354636212E-01 -9.0316541530907690E-01 -9.0218430681629758E-01 -9.0120305812221990E-01 +-9.0022166928099756E-01 -8.9924014034674160E-01 -8.9825847137352199E-01 -8.9727666241536619E-01 -8.9629471352625989E-01 +-8.9531262476014728E-01 -8.9433039617093024E-01 -8.9334802781246891E-01 -8.9236551973858280E-01 -8.9138287200304767E-01 +-8.9040008465959986E-01 -8.8941715776193231E-01 -8.8843409136369778E-01 -8.8745088551850648E-01 -8.8646754027992825E-01 +-8.8548405570149014E-01 -8.8450043183667870E-01 -8.8351666873893908E-01 -8.8253276646167467E-01 -8.8154872505824577E-01 +-8.8056454458197808E-01 -8.7958022508614919E-01 -8.7859576662399830E-01 -8.7761116924872262E-01 -8.7662643301347887E-01 +-8.7564155797138288E-01 -8.7465654417550898E-01 -8.7367139167889074E-01 -8.7268610053452100E-01 -8.7170067079535118E-01 +-8.7071510251429296E-01 -8.6972939574421615E-01 -8.6874355053795038E-01 -8.6775756694828377E-01 -8.6677144502796466E-01 +-8.6578518482970057E-01 -8.6479878640615804E-01 -8.6381224980996352E-01 -8.6282557509370261E-01 -8.6183876230992007E-01 +-8.6085181151112100E-01 -8.5986472274976944E-01 -8.5887749607828745E-01 -8.5789013154906324E-01 -8.5690262921443761E-01 +-8.5591498912671360E-01 -8.5492721133815419E-01 -8.5393929590098183E-01 -8.5295124286737944E-01 -8.5196305228948921E-01 +-8.5097472421941323E-01 -8.4998625870921440E-01 -8.4899765581091491E-01 -8.4800891557649716E-01 -8.4702003805790360E-01 +-8.4603102330703683E-01 -8.4504187137575959E-01 -8.4405258231589508E-01 -8.4306315617922667E-01 -8.4207359301749785E-01 +-8.4108389288241225E-01 -8.4009405582563446E-01 -8.3910408189878860E-01 -8.3811397115345998E-01 -8.3712372364119436E-01 +-8.3613333941349732E-01 -8.3514281852183359E-01 -8.3415216101763479E-01 -8.3316136695228626E-01 -8.3217043637713672E-01 +-8.3117936934349546E-01 -8.3018816590263200E-01 -8.2919682610577705E-01 -8.2820535000412210E-01 -8.2721373764881967E-01 +-8.2622198909098266E-01 -8.2523010438168609E-01 -8.2423808357196393E-01 -8.2324592671281294E-01 -8.2225363385519024E-01 +-8.2126120505001354E-01 -8.2026864034816271E-01 -8.1927593980047819E-01 -8.1828310345776145E-01 -8.1729013137077533E-01 +-8.1629702359024403E-01 -8.1530378016685312E-01 -8.1431040115124909E-01 -8.1331688659404044E-01 -8.1232323654579663E-01 +-8.1132945105704590E-01 -8.1033553017828597E-01 -8.0934147395996781E-01 -8.0834728245250786E-01 -8.0735295570628240E-01 +-8.0635849377163060E-01 -8.0536389669885311E-01 -8.0436916453821161E-01 -8.0337429733992960E-01 -8.0237929515419393E-01 +-8.0138415803115060E-01 -8.0038888602090985E-01 -7.9939347917354264E-01 -7.9839793753908184E-01 -7.9740226116752266E-01 +-7.9640645010882216E-01 -7.9541050441289907E-01 -7.9441442412963470E-01 -7.9341820930887241E-01 -7.9242186000041737E-01 +-7.9142537625403708E-01 -7.9042875811946123E-01 -7.8943200564638194E-01 -7.8843511888445095E-01 -7.8743809788328956E-01 +-7.8644094269247411E-01 -7.8544365336154631E-01 -7.8444622994000934E-01 -7.8344867247732974E-01 -7.8245098102293620E-01 +-7.8145315562621975E-01 -7.8045519633653393E-01 -7.7945710320319550E-01 -7.7845887627548327E-01 -7.7746051560263840E-01 +-7.7646202123386587E-01 -7.7546339321833246E-01 -7.7446463160516832E-01 -7.7346573644346583E-01 -7.7246670778228066E-01 +-7.7146754567063103E-01 -7.7046825015749842E-01 -7.6946882129182692E-01 -7.6846925912252395E-01 -7.6746956369845964E-01 +-7.6646973506846761E-01 -7.6546977328134358E-01 -7.6446967838584545E-01 -7.6346945043070069E-01 -7.6246908946459224E-01 +-7.6146859553616952E-01 -7.6046796869404487E-01 -7.5946720898679410E-01 -7.5846631646295604E-01 -7.5746529117103334E-01 +-7.5646413315949157E-01 -7.5546284247675999E-01 -7.5446141917123155E-01 -7.5345986329126202E-01 -7.5245817488517130E-01 +-7.5145635400124300E-01 -7.5045440068772384E-01 -7.4945231499282416E-01 -7.4845009696471876E-01 -7.4744774665154501E-01 +-7.4644526410140521E-01 -7.4544264936236448E-01 -7.4443990248245229E-01 -7.4343702350966123E-01 -7.4243401249194940E-01 +-7.4143086947723691E-01 -7.4042759451340623E-01 -7.3942418764831186E-01 -7.3842064892976345E-01 -7.3741697840553855E-01 +-7.3641317612337787E-01 -7.3540924213098646E-01 -7.3440517647603420E-01 -7.3340097920615421E-01 -7.3239665036894408E-01 +-7.3139219001196587E-01 -7.3038759818274590E-01 -7.2938287492877485E-01 -7.2837802029750764E-01 -7.2737303433636380E-01 +-7.2636791709272674E-01 -7.2536266861394449E-01 -7.2435728894733009E-01 -7.2335177814016105E-01 -7.2234613623967836E-01 +-7.2134036329308904E-01 -7.2033445934756357E-01 -7.1932842445023804E-01 -7.1832225864821275E-01 -7.1731596198854986E-01 +-7.1630953451828439E-01 -7.1530297628440842E-01 -7.1429628733388129E-01 -7.1328946771362722E-01 -7.1228251747053561E-01 +-7.1127543665146020E-01 -7.1026822530322009E-01 -7.0926088347259963E-01 -7.0825341120634722E-01 -7.0724580855117714E-01 +-7.0623807555376883E-01 -7.0523021226076610E-01 -7.0422221871877855E-01 -7.0321409497438059E-01 -7.0220584107411232E-01 +-7.0119745706447889E-01 -7.0018894299195034E-01 -6.9918029890296196E-01 -6.9817152484391509E-01 -6.9716262086117597E-01 +-6.9615358700107666E-01 -6.9514442330991388E-01 -6.9413512983395043E-01 -6.9312570661941220E-01 -6.9211615371249757E-01 +-6.9110647115936352E-01 -6.9009665900613459E-01 -6.8908671729890136E-01 -6.8807664608372021E-01 -6.8706644540661288E-01 +-6.8605611531356714E-01 -6.8504565585053567E-01 -6.8403506706343831E-01 -6.8302434899815967E-01 -6.8201350170055042E-01 +-6.8100252521642746E-01 -6.7999141959157350E-01 -6.7898018487173695E-01 -6.7796882110263201E-01 -6.7695732832993982E-01 +-6.7594570659930664E-01 -6.7493395595634509E-01 -6.7392207644663404E-01 -6.7291006811571852E-01 -6.7189793100910933E-01 +-6.7088566517228410E-01 -6.6987327065068614E-01 -6.6886074748972257E-01 -6.6784809573477488E-01 -6.6683531543118268E-01 +-6.6582240662425485E-01 -6.6480936935926649E-01 -6.6379620368145886E-01 -6.6278290963604070E-01 -6.6176948726818607E-01 +-6.6075593662303600E-01 -6.5974225774569806E-01 -6.5872845068124641E-01 -6.5771451547472204E-01 -6.5670045217113215E-01 +-6.5568626081545056E-01 -6.5467194145261842E-01 -6.5365749412754282E-01 -6.5264291888509862E-01 -6.5162821577012620E-01 +-6.5061338482743369E-01 -6.4959842610179597E-01 -6.4858333963795423E-01 -6.4756812548061760E-01 -6.4655278367446090E-01 +-6.4553731426412453E-01 -6.4452171729422270E-01 -6.4350599280932930E-01 -6.4249014085398815E-01 -6.4147416147270986E-01 +-6.4045805470997186E-01 -6.3944182061021970E-01 -6.3842545921786464E-01 -6.3740897057728674E-01 -6.3639235473283229E-01 +-6.3537561172881529E-01 -6.3435874160951677E-01 -6.3334174441918534E-01 -6.3232462020203684E-01 -6.3130736900225459E-01 +-6.3028999086398918E-01 -6.2927248583135897E-01 -6.2825485394844960E-01 -6.2723709525931404E-01 -6.2621920980797341E-01 +-6.2520119763841553E-01 -6.2418305879459668E-01 -6.2316479332044017E-01 -6.2214640125983756E-01 -6.2112788265664520E-01 +-6.2010923755469449E-01 -6.1909046599777751E-01 -6.1807156802965646E-01 -6.1705254369406137E-01 -6.1603339303468996E-01 +-6.1501411609520817E-01 -6.1399471291924967E-01 -6.1297518355041569E-01 -6.1195552803227637E-01 -6.1093574640836867E-01 +-6.0991583872219857E-01 -6.0889580501723939E-01 -6.0787564533693317E-01 -6.0685535972468951E-01 -6.0583494822388617E-01 +-6.0481441087786969E-01 -6.0379374772995431E-01 -6.0277295882342208E-01 -6.0175204420152451E-01 -6.0073100390748024E-01 +-5.9970983798447686E-01 -5.9868854647567005E-01 -5.9766712942418154E-01 -5.9664558687310898E-01 -5.9562391886551047E-01 +-5.9460212544441560E-01 -5.9358020665282252E-01 -5.9255816253369731E-01 -5.9153599312997518E-01 -5.9051369848455948E-01 +-5.8949127864032280E-01 -5.8846873364010532E-01 -5.8744606352671691E-01 -5.8642326834293568E-01 -5.8540034813150854E-01 +-5.8437730293515078E-01 -5.8335413279654724E-01 -5.8233083775835082E-01 -5.8130741786318352E-01 -5.8028387315363639E-01 +-5.7926020367226916E-01 -5.7823640946161059E-01 -5.7721249056415813E-01 -5.7618844702237881E-01 -5.7516427887870780E-01 +-5.7413998617555007E-01 -5.7311556895527649E-01 -5.7209102726023531E-01 -5.7106636113273568E-01 -5.7004157061505867E-01 +-5.6901665574945459E-01 -5.6799161657814290E-01 -5.6696645314331218E-01 -5.6594116548712048E-01 -5.6491575365169489E-01 +-5.6389021767913217E-01 -5.6286455761149790E-01 -5.6183877349082745E-01 -5.6081286535912533E-01 -5.5978683325836576E-01 +-5.5876067723049239E-01 -5.5773439731741792E-01 -5.5670799356102485E-01 -5.5568146600316548E-01 -5.5465481468566102E-01 +-5.5362803965030316E-01 -5.5260114093885226E-01 -5.5157411859303906E-01 -5.5054697265456343E-01 -5.4951970316509546E-01 +-5.4849231016627198E-01 -5.4746479369970757E-01 -5.4643715380697866E-01 -5.4540939052963400E-01 -5.4438150390919260E-01 +-5.4335349398714283E-01 -5.4232536080494376E-01 -5.4129710440402323E-01 -5.4026872482577970E-01 -5.3924022211158162E-01 +-5.3821159630276727E-01 -5.3718284744064537E-01 -5.3615397556649402E-01 -5.3512498072156178E-01 -5.3409586294706723E-01 +-5.3306662228419932E-01 -5.3203725877411701E-01 -5.3100777245794917E-01 -5.2997816337679549E-01 -5.2894843157172533E-01 +-5.2791857708377854E-01 -5.2688859995396542E-01 -5.2585850022326641E-01 -5.2482827793262987E-01 -5.2379793312298206E-01 +-5.2276746583521205E-01 -5.2173687611018194E-01 -5.2070616398872405E-01 -5.1967532951164175E-01 -5.1864437271970854E-01 +-5.1761329365366826E-01 -5.1658209235423591E-01 -5.1555076886209605E-01 -5.1451932321790517E-01 -5.1348775546228975E-01 +-5.1245606563584645E-01 -5.1142425377914358E-01 -5.1039231993271961E-01 -5.0936026413708402E-01 -5.0832808643271676E-01 +-5.0729578686006882E-01 -5.0626336545956208E-01 -5.0523082227158900E-01 -5.0419815733651308E-01 -5.0316537069466893E-01 +-5.0213246238636178E-01 -5.0109943245186794E-01 -5.0006628093143224E-01 -4.9903300786527810E-01 -4.9799961329359210E-01 +-4.9696609725653496E-01 -4.9593245979423822E-01 -4.9489870094680438E-01 -4.9386482075430693E-01 -4.9283081925679145E-01 +-4.9179669649427366E-01 -4.9076245250674116E-01 -4.8972808733415257E-01 -4.8869360101643761E-01 -4.8765899359349768E-01 +-4.8662426510520512E-01 -4.8558941559140401E-01 -4.8455444509190959E-01 -4.8351935364650833E-01 -4.8248414129495848E-01 +-4.8144880807698937E-01 -4.8041335403230256E-01 -4.7937777920056990E-01 -4.7834208362143593E-01 -4.7730626733451620E-01 +-4.7627033037939781E-01 -4.7523427279563701E-01 -4.7419809462276930E-01 -4.7316179590029439E-01 -4.7212537666768600E-01 +-4.7108883696438952E-01 -4.7005217682982231E-01 -4.6901539630337347E-01 -4.6797849542440351E-01 -4.6694147423224514E-01 +-4.6590433276620280E-01 -4.6486707106555286E-01 -4.6382968916954326E-01 -4.6279218711739434E-01 -4.6175456494829809E-01 +-4.6071682270141834E-01 -4.5967896041589101E-01 -4.5864097813082427E-01 -4.5760287588529813E-01 -4.5656465371836447E-01 +-4.5552631166904772E-01 -4.5448784977634393E-01 -4.5344926807922176E-01 -4.5241056661662155E-01 -4.5137174542745367E-01 +-4.5033280455060809E-01 -4.4929374402493943E-01 -4.4825456388927742E-01 -4.4721526418242336E-01 -4.4617584494315182E-01 +-4.4513630621020894E-01 -4.4409664802231352E-01 -4.4305687041815667E-01 -4.4201697343640201E-01 -4.4097695711568546E-01 +-4.3993682149461544E-01 -4.3889656661177306E-01 -4.3785619250571162E-01 -4.3681569921495705E-01 -4.3577508677800803E-01 +-4.3473435523333542E-01 -4.3369350461938316E-01 -4.3265253497456752E-01 -4.3161144633727749E-01 -4.3057023874587458E-01 +-4.2952891223869333E-01 -4.2848746685404093E-01 -4.2744590263019699E-01 -4.2640421960541175E-01 -4.2536241781791578E-01 +-4.2432049730590471E-01 -4.2327845810754949E-01 -4.2223630026099429E-01 -4.2119402380435583E-01 -4.2015162877572393E-01 +-4.1910911521316135E-01 -4.1806648315470368E-01 -4.1702373263835990E-01 -4.1598086370211124E-01 -4.1493787638391294E-01 +-4.1389477072169256E-01 -4.1285154675335095E-01 -4.1180820451676203E-01 -4.1076474404977326E-01 -4.0972116539020470E-01 +-4.0867746857584997E-01 -4.0763365364447562E-01 -4.0658972063382154E-01 -4.0554566958160099E-01 -4.0450150052550055E-01 +-4.0345721350317976E-01 -4.0241280855227168E-01 -4.0136828571038036E-01 -4.0032364501509071E-01 -3.9927888650395321E-01 +-3.9823401021449450E-01 -3.9718901618421459E-01 -3.9614390445058739E-01 -3.9509867505105939E-01 -3.9405332802305143E-01 +-3.9300786340395738E-01 -3.9196228123114502E-01 -3.9091658154195547E-01 -3.8987076437370355E-01 -3.8882482976367783E-01 +-3.8777877774914027E-01 -3.8673260836732676E-01 -3.8568632165544653E-01 -3.8463991765068301E-01 -3.8359339639019308E-01 +-3.8254675791110737E-01 -3.8150000225053043E-01 -3.8045312944554066E-01 -3.7940613953319019E-01 -3.7835903255050501E-01 +-3.7731180853448260E-01 -3.7626446752210158E-01 -3.7521700955030746E-01 -3.7416943465602170E-01 -3.7312174287614003E-01 +-3.7207393424753227E-01 -3.7102600880704184E-01 -3.6997796659148691E-01 -3.6892980763765898E-01 -3.6788153198232393E-01 +-3.6683313966222197E-01 -3.6578463071406708E-01 -3.6473600517454763E-01 -3.6368726308032623E-01 -3.6263840446803941E-01 +-3.6158942937429828E-01 -3.6054033783568790E-01 -3.5949112988876780E-01 -3.5844180557007149E-01 -3.5739236491610737E-01 +-3.5634280796335760E-01 -3.5529313474827912E-01 -3.5424334530730289E-01 -3.5319343967683475E-01 -3.5214341789325199E-01 +-3.5109327999291412E-01 -3.5004302601214760E-01 -3.4899265598725576E-01 -3.4794216995451666E-01 -3.4689156795018261E-01 +-3.4584085001048082E-01 -3.4479001617161303E-01 -3.4373906646975516E-01 -3.4268800094105833E-01 -3.4163681962164805E-01 +-3.4058552254762453E-01 -3.3953410975506260E-01 -3.3848258128001191E-01 -3.3743093715849698E-01 -3.3637917742651674E-01 +-3.3532730212004530E-01 -3.3427531127503113E-01 -3.3322320492739815E-01 -3.3217098311304455E-01 -3.3111864586784356E-01 +-3.3006619322764363E-01 -3.2901362522826777E-01 -3.2796094190551384E-01 -3.2690814329515250E-01 -3.2585522943293682E-01 +-3.2480220035458718E-01 -3.2374905609580173E-01 -3.2269579669225357E-01 -3.2164242217959066E-01 -3.2058893259343635E-01 +-3.1953532796938916E-01 -3.1848160834302242E-01 -3.1742777374988485E-01 -3.1637382422550026E-01 -3.1531975980536775E-01 +-3.1426558052496151E-01 -3.1321128641973123E-01 -3.1215687752510146E-01 -3.1110235387647245E-01 -3.1004771550921956E-01 +-3.0899296245869340E-01 -3.0793809476022010E-01 -3.0688311244910116E-01 -3.0582801556061334E-01 -3.0477280413000896E-01 +-3.0371747819251566E-01 -3.0266203778333417E-01 -3.0160648293764802E-01 -3.0055081369060899E-01 -2.9949503007734657E-01 +-2.9843913213296619E-01 -2.9738311989254845E-01 -2.9632699339114982E-01 -2.9527075266380226E-01 -2.9421439774551333E-01 +-2.9315792867126633E-01 -2.9210134547602018E-01 -2.9104464819470954E-01 -2.8998783686224472E-01 -2.8893091151351186E-01 +-2.8787387218337274E-01 -2.8681671890666499E-01 -2.8575945171820205E-01 -2.8470207065277314E-01 -2.8364457574514323E-01 +-2.8258696703005348E-01 -2.8152924454222067E-01 -2.8047140831633732E-01 -2.7941345838707238E-01 -2.7835539478907018E-01 +-2.7729721755694892E-01 -2.7623892672531031E-01 -2.7518052232872414E-01 -2.7412200440173917E-01 -2.7306337297887995E-01 +-2.7200462809464726E-01 -2.7094576978351803E-01 -2.6988679807994492E-01 -2.6882771301835712E-01 -2.6776851463315998E-01 +-2.6670920295873457E-01 -2.6564977802943884E-01 -2.6459023987960623E-01 -2.6353058854354694E-01 -2.6247082405554734E-01 +-2.6141094644986984E-01 -2.6035095576075346E-01 -2.5929085202241314E-01 -2.5823063526904072E-01 -2.5717030553480386E-01 +-2.5610986285384690E-01 -2.5504930726029046E-01 -2.5398863878823164E-01 -2.5292785747174140E-01 -2.5186696334487491E-01 +-2.5080595644165593E-01 -2.4974483679608753E-01 -2.4868360444214924E-01 -2.4762225941379692E-01 -2.4656080174496342E-01 +-2.4549923146955765E-01 -2.4443754862146561E-01 -2.4337575323454957E-01 -2.4231384534264863E-01 -2.4125182497957848E-01 +-2.4018969217913158E-01 -2.3912744697507696E-01 -2.3806508940116042E-01 -2.3700261949110457E-01 -2.3594003727860882E-01 +-2.3487734279734912E-01 -2.3381453608097855E-01 -2.3275161716312667E-01 -2.3168858607740025E-01 -2.3062544285738268E-01 +-2.2956218753663429E-01 -2.2849882014869230E-01 -2.2743534072706836E-01 -2.2637174930525863E-01 -2.2530804591672857E-01 +-2.2424423059492338E-01 -2.2318030337326503E-01 -2.2211626428515255E-01 -2.2105211336396216E-01 -2.1998785064304696E-01 +-2.1892347615573732E-01 -2.1785898993534045E-01 -2.1679439201514089E-01 -2.1572968242840040E-01 -2.1466486120835762E-01 +-2.1359992838822850E-01 -2.1253488400120629E-01 -2.1146972808046141E-01 -2.1040446065914131E-01 -2.0933908177037100E-01 +-2.0827359144725260E-01 -2.0720798972286555E-01 -2.0614227663026669E-01 -2.0507645220249007E-01 -2.0401051647254714E-01 +-2.0294446947342687E-01 -2.0187831123809277E-01 -2.0081204179949369E-01 -1.9974566119054801E-01 -1.9867916944415445E-01 +-1.9761256659318896E-01 -1.9654585267050498E-01 -1.9547902770893347E-01 -1.9441209174128310E-01 -1.9334504480033987E-01 +-1.9227788691886744E-01 -1.9121061812960705E-01 -1.9014323846527753E-01 -1.8907574795857535E-01 -1.8800814664217455E-01 +-1.8694043454872705E-01 -1.8587261171086222E-01 -1.8480467816118720E-01 -1.8373663393228695E-01 -1.8266847905672404E-01 +-1.8160021356703879E-01 -1.8053183749574941E-01 -1.7946335087535190E-01 -1.7839475373831992E-01 -1.7732604611710265E-01 +-1.7625722804413449E-01 -1.7518829955182028E-01 -1.7411926067254532E-01 -1.7305011143867263E-01 -1.7198085188254331E-01 +-1.7091148203647638E-01 -1.6984200193276877E-01 -1.6877241160369547E-01 -1.6770271108150939E-01 -1.6663290039844161E-01 +-1.6556297958670102E-01 -1.6449294867847483E-01 -1.6342280770592810E-01 -1.6235255670120419E-01 -1.6128219569642438E-01 +-1.6021172472368825E-01 -1.5914114381507341E-01 -1.5807045300263572E-01 -1.5699965231840923E-01 -1.5592874179440619E-01 +-1.5485772146261698E-01 -1.5378659135501035E-01 -1.5271535150353330E-01 -1.5164400194010855E-01 -1.5057254269664466E-01 +-1.4950097380502098E-01 -1.4842929529709784E-01 -1.4735750720471372E-01 -1.4628560955968559E-01 -1.4521360239380876E-01 +-1.4414148573885699E-01 -1.4306925962658254E-01 -1.4199692408871592E-01 -1.4092447915696626E-01 -1.3985192486302123E-01 +-1.3877926123854684E-01 -1.3770648831518770E-01 -1.3663360612456699E-01 -1.3556061469828637E-01 -1.3448751406792614E-01 +-1.3341430426504519E-01 -1.3234098532118097E-01 -1.3126755726784964E-01 -1.3019402013654593E-01 -1.2912037395874326E-01 +-1.2804661876589377E-01 -1.2697275458942830E-01 -1.2589878146075389E-01 -1.2482469941126380E-01 -1.2375050847232251E-01 +-1.2267620867527589E-01 -1.2160180005144852E-01 -1.2052728263214384E-01 -1.1945265644864407E-01 -1.1837792153221033E-01 +-1.1730307791408252E-01 -1.1622812562547948E-01 -1.1515306469759894E-01 -1.1407789516161759E-01 -1.1300261704869098E-01 +-1.1192723038995368E-01 -1.1085173521651916E-01 -1.0977613155947995E-01 -1.0870041944990758E-01 -1.0762459891885250E-01 +-1.0654866999734434E-01 -1.0547263271639173E-01 -1.0439648710698234E-01 -1.0332023320008303E-01 -1.0224387102663970E-01 +-1.0116740061757484E-01 -1.0009082200379772E-01 -9.9014135216189167E-02 -9.7937340285611699E-02 -9.6860437242907133E-02 +-9.5783426118896328E-02 -9.4706306944379537E-02 -9.3629079750136235E-02 -9.2551744566925109E-02 -9.1474301425484170E-02 +-9.0396750356530692E-02 -8.9319091390761385E-02 -8.8241324558852169E-02 -8.7163449891458397E-02 -8.6085467419214773E-02 +-8.5007377172735391E-02 -8.3929179182613750E-02 -8.2850873479422826E-02 -8.1772460093714985E-02 -8.0693939056022054E-02 +-7.9615310396855349E-02 -7.8536574146705673E-02 -7.7457730336043404E-02 -7.6378778995318350E-02 -7.5299720154957436E-02 +-7.4220553845374668E-02 -7.3141280096956057E-02 -7.2061898940069730E-02 -7.0982410405063562E-02 -6.9902814522264836E-02 +-6.8823111321980684E-02 -6.7743300834497741E-02 -6.6663383090082476E-02 -6.5583358118980986E-02 -6.4503225951419108E-02 +-6.3422986617602345E-02 -6.2342640147716073E-02 -6.1262186571925323E-02 -6.0181625920374952E-02 -5.9100958223189691E-02 +-5.8020183510473951E-02 -5.6939301812312139E-02 -5.5858313158768373E-02 -5.4777217579886739E-02 -5.3696015105691143E-02 +-5.2614705766185474E-02 -5.1533289591353441E-02 -5.0451766611158792E-02 -4.9370136855542646E-02 -4.8288400354433665E-02 +-4.7206557137732953E-02 -4.6124607235324140E-02 -4.5042550677070851E-02 -4.3960387492816770E-02 -4.2878117712385658E-02 +-4.1795741365581285E-02 -4.0713258482187577E-02 -3.9630669091968544E-02 -3.8547973224668269E-02 -3.7465170910011066E-02 +-3.6382262177701311E-02 -3.5299247057423599E-02 -3.4216125578842724E-02 -3.3132897771603650E-02 -3.2049563665331585E-02 +-3.0966123289631966E-02 -2.9882576674090489E-02 -2.8798923848273105E-02 -2.7715164841726078E-02 -2.6631299683975953E-02 +-2.5547328404529612E-02 -2.4463251032871745E-02 -2.3379067598474933E-02 -2.2294778130784596E-02 -2.1210382659229057E-02 +-2.0125881213217019E-02 -1.9041273822137626E-02 -1.7956560515360449E-02 -1.6871741322235494E-02 -1.5786816272093256E-02 +-1.4701785394244705E-02 -1.3616648717981301E-02 -1.2531406272575030E-02 -1.1446058087278409E-02 -1.0360604191324488E-02 +-9.2750446139269072E-03 -8.1893793842798615E-03 -7.1036085315581577E-03 -6.0177320849172091E-03 -4.9317500734930558E-03 +-3.8456625264023862E-03 -2.7594694727425457E-03 -1.6731709415915602E-03 -5.8676696200814454E-04 4.9974243696827608E-04 + 1.5863572263200669E-03 2.6730773770413086E-03 3.7599028601528681E-03 4.8468336466923273E-03 5.9338697077164779E-03 + 7.0210110143013081E-03 8.1082575375419873E-03 9.1956092485528419E-03 1.0283066118467354E-02 1.1370628118438132E-02 + 1.2458295219636911E-02 1.3546067393254512E-02 1.4633944610500849E-02 1.5721926842604903E-02 1.6810014060814706E-02 + 1.7898206236397329E-02 1.8986503340638873E-02 2.0074905344844424E-02 2.1163412220338077E-02 2.2252023938462897E-02 + 2.3340740470580899E-02 2.4429561788073054E-02 2.5518487862339241E-02 2.6607518664798276E-02 2.7696654166890367E-02 + 2.8785894340067064E-02 2.9875239155806314E-02 3.0964688585602442E-02 3.2054242600968536E-02 3.3143901173436567E-02 + 3.4233664274557270E-02 3.5323531875900191E-02 3.6413503949053627E-02 3.7503580465624631E-02 3.8593761397239017E-02 + 3.9684046715541307E-02 4.0774436392194760E-02 4.1864930398881277E-02 4.2955528707301460E-02 4.4046231289174620E-02 + 4.5137038116238655E-02 4.6227949160250137E-02 4.7318964392984199E-02 4.8410083786234660E-02 4.9501307311813847E-02 + 5.0592634941552694E-02 5.1684066647300714E-02 5.2775602400928434E-02 5.3867242174317369E-02 5.4958985939375100E-02 + 5.6050833668025185E-02 5.7142785332209678E-02 5.8234840903889050E-02 5.9327000355042292E-02 6.0419263657666769E-02 + 6.1511630783778283E-02 6.2604101705411044E-02 6.3696676394617679E-02 6.4789354823469147E-02 6.5882136964054719E-02 + 6.6975022788482164E-02 6.8068012268877418E-02 6.9161105377384818E-02 7.0254302086166981E-02 7.1347602367404811E-02 + 7.2441006193297464E-02 7.3534513536062357E-02 7.4628124367935131E-02 7.5721838661169730E-02 7.6815656388038167E-02 + 7.7909577520830761E-02 7.9003602031858494E-02 8.0097729893442965E-02 8.1191961077931432E-02 8.2286295557686823E-02 + 8.3380733305090174E-02 8.4475274292540592E-02 8.5569918492455280E-02 8.6664665877269606E-02 8.7759516419436898E-02 + 8.8854470091428522E-02 8.9949526865733931E-02 9.1044686714860545E-02 9.2139949611333857E-02 9.3235315527697232E-02 + 9.4330784436512174E-02 9.5426356310357938E-02 9.6522031121831872E-02 9.7617808843549245E-02 9.8713689448143113E-02 + 9.9809672908264563E-02 1.0090575919658254E-01 1.0200194828578379E-01 1.0309824014857297E-01 1.0419463475767514E-01 + 1.0529113208582545E-01 1.0638773210578466E-01 1.0748443479032863E-01 1.0858124011225104E-01 1.0967814804436340E-01 + 1.1077515855949489E-01 1.1187227163049249E-01 1.1296948723022086E-01 1.1406680533156238E-01 1.1516422590741716E-01 + 1.1626174893070292E-01 1.1735937437435510E-01 1.1845710221132681E-01 1.1955493241458873E-01 1.2065286495712918E-01 + 1.2175089981195414E-01 1.2284903695208711E-01 1.2394727635056926E-01 1.2504561798045921E-01 1.2614406181483323E-01 + 1.2724260782678509E-01 1.2834125598942608E-01 1.2944000627588495E-01 1.3053885865931064E-01 1.3163781311286174E-01 + 1.3273686960972206E-01 1.3383602812309031E-01 1.3493528862618259E-01 1.3603465109223242E-01 1.3713411549449081E-01 + 1.3823368180622614E-01 1.3933335000072405E-01 1.4043312005128766E-01 1.4153299193123747E-01 1.4263296561391123E-01 + 1.4373304107266405E-01 1.4483321828086834E-01 1.4593349721191382E-01 1.4703387783920752E-01 1.4813436013617370E-01 + 1.4923494407625376E-01 1.5033562963290661E-01 1.5143641677960820E-01 1.5253730548985170E-01 1.5363829573714752E-01 + 1.5473938749502311E-01 1.5584058073702342E-01 1.5694187543671279E-01 1.5804327156766521E-01 1.5914476910347933E-01 + 1.6024636801776848E-01 1.6134806828416307E-01 1.6244986987631049E-01 1.6355177276787541E-01 1.6465377693253933E-01 + 1.6575588234400096E-01 1.6685808897597598E-01 1.6796039680219699E-01 1.6906280579641378E-01 1.7016531593239306E-01 + 1.7126792718391845E-01 1.7237063952479056E-01 1.7347345292882702E-01 1.7457636736986235E-01 1.7567938282174791E-01 + 1.7678249925835213E-01 1.7788571665356015E-01 1.7898903498127419E-01 1.8009245421541314E-01 1.8119597432991288E-01 + 1.8229959529872869E-01 1.8340331709582486E-01 1.8450713969519036E-01 1.8561106307082822E-01 1.8671508719675833E-01 + 1.8781921204701749E-01 1.8892343759565897E-01 1.9002776381675301E-01 1.9113219068438655E-01 1.9223671817266308E-01 + 1.9334134625570307E-01 1.9444607490764351E-01 1.9555090410263803E-01 1.9665583381485705E-01 1.9776086401848747E-01 + 1.9886599468773303E-01 1.9997122579681401E-01 2.0107655731996721E-01 2.0218198923144609E-01 2.0328752150552082E-01 + 2.0439315411647793E-01 2.0549888703862065E-01 2.0660472024626866E-01 2.0771065371375827E-01 2.0881668741544479E-01 + 2.0992282132569234E-01 2.1102905541888928E-01 2.1213538966943785E-01 2.1324182405175679E-01 2.1434835854028128E-01 + 2.1545499310946278E-01 2.1656172773376942E-01 2.1766856238768553E-01 2.1877549704571206E-01 2.1988253168236616E-01 + 2.2098966627218142E-01 2.2209690078970773E-01 2.2320423520951149E-01 2.2431166950617526E-01 2.2541920365429796E-01 + 2.2652683762849476E-01 2.2763457140339732E-01 2.2874240495365339E-01 2.2985033825392712E-01 2.3095837127889873E-01 + 2.3206650400326487E-01 2.3317473640173839E-01 2.3428306844904820E-01 2.3539150011994200E-01 2.3650003138917636E-01 + 2.3760866223153118E-01 2.3871739262180033E-01 2.3982622253479366E-01 2.4093515194533707E-01 2.4204418082827295E-01 + 2.4315330915845942E-01 2.4426253691077093E-01 2.4537186406009781E-01 2.4648129058134663E-01 2.4759081644943998E-01 + 2.4870044163931646E-01 2.4981016612593082E-01 2.5091998988425351E-01 2.5202991288927157E-01 2.5313993511598742E-01 + 2.5425005653941973E-01 2.5536027713460324E-01 2.5647059687658846E-01 2.5758101574044201E-01 2.5869153370124637E-01 + 2.5980215073409968E-01 2.6091286681411902E-01 2.6202368191642950E-01 2.6313459601617961E-01 2.6424560908853134E-01 + 2.6535672110866243E-01 2.6646793205176661E-01 2.6757924189305315E-01 2.6869065060774761E-01 2.6980215817109077E-01 + 2.7091376455833971E-01 2.7202546974476693E-01 2.7313727370566110E-01 2.7424917641632612E-01 2.7536117785208208E-01 + 2.7647327798826449E-01 2.7758547680022494E-01 2.7869777426333026E-01 2.7981017035296324E-01 2.8092266504452246E-01 + 2.8203525831342185E-01 2.8314795013509142E-01 2.8426074048497629E-01 2.8537362933853760E-01 2.8648661667125203E-01 + 2.8759970245861449E-01 2.8871288667612732E-01 2.8982616929931687E-01 2.9093955030372215E-01 2.9205302966489749E-01 + 2.9316660735841316E-01 2.9428028335985462E-01 2.9539405764482307E-01 2.9650793018893518E-01 2.9762190096782304E-01 + 2.9873596995713425E-01 2.9985013713253200E-01 3.0096440246969475E-01 3.0207876594431654E-01 3.0319322753210670E-01 + 3.0430778720879009E-01 3.0542244495010701E-01 3.0653720073181295E-01 3.0765205452967925E-01 3.0876700631949194E-01 + 3.0988205607705305E-01 3.1099720377817947E-01 3.1211244939870381E-01 3.1322779291447372E-01 3.1434323430135469E-01 + 3.1545877353522028E-01 3.1657441059196650E-01 3.1769014544750229E-01 3.1880597807775185E-01 3.1992190845865454E-01 + 3.2103793656616519E-01 3.2215406237625360E-01 3.2327028586490475E-01 3.2438660700811917E-01 3.2550302578191226E-01 + 3.2661954216231470E-01 3.2773615612537238E-01 3.2885286764714616E-01 3.2996967670371230E-01 3.3108658327116197E-01 + 3.3220358732560157E-01 3.3332068884315275E-01 3.3443788779995187E-01 3.3555518417215069E-01 3.3667257793591587E-01 + 3.3779006906742925E-01 3.3890765754288776E-01 3.4002534333850570E-01 3.4114312643050493E-01 3.4226100679512977E-01 + 3.4337898440863734E-01 3.4449705924729923E-01 3.4561523128740251E-01 3.4673350050524898E-01 3.4785186687715530E-01 + 3.4897033037945335E-01 3.5008889098848961E-01 3.5120754868062576E-01 3.5232630343223836E-01 3.5344515521971837E-01 + 3.5456410401947241E-01 3.5568314980792121E-01 3.5680229256150120E-01 3.5792153225666273E-01 3.5904086886987180E-01 + 3.6016030237760871E-01 3.6127983275636860E-01 3.6239945998266171E-01 3.6351918403301298E-01 3.6463900488396173E-01 + 3.6575892251206260E-01 3.6687893689388718E-01 3.6799904800601424E-01 3.6911925582504512E-01 3.7023956032759298E-01 + 3.7135996149028588E-01 3.7248045928976647E-01 3.7360105370269242E-01 3.7472174470573572E-01 3.7584253227558290E-01 + 3.7696341638893560E-01 3.7808439702250973E-01 3.7920547415303607E-01 3.8032664775725977E-01 3.8144791781194076E-01 + 3.8256928429385328E-01 3.8369074717978668E-01 3.8481230644654457E-01 3.8593396207094482E-01 3.8705571402982042E-01 + 3.8817756230001849E-01 3.8929950685840081E-01 3.9042154768184373E-01 3.9154368474723789E-01 3.9266591803148870E-01 + 3.9378824751151831E-01 3.9491067316425582E-01 3.9603319496665262E-01 3.9715581289567164E-01 3.9827852692829052E-01 + 3.9940133704150121E-01 4.0052424321230995E-01 4.0164724541773761E-01 4.0277034363481934E-01 4.0389353784060461E-01 + 4.0501682801215738E-01 4.0614021412655571E-01 4.0726369616089242E-01 4.0838727409227421E-01 4.0951094789782244E-01 + 4.1063471755467268E-01 4.1175858303997459E-01 4.1288254433089255E-01 4.1400660140460460E-01 4.1513075423830365E-01 + 4.1625500280919658E-01 4.1737934709450447E-01 4.1850378707146269E-01 4.1962832271732364E-01 4.2075295400934543E-01 + 4.2187768092480932E-01 4.2300250344100698E-01 4.2412742153524502E-01 4.2525243518484379E-01 4.2637754436713815E-01 + 4.2750274905947683E-01 4.2862804923922276E-01 4.2975344488375306E-01 4.3087893597045895E-01 4.3200452247674548E-01 + 4.3313020438003214E-01 4.3425598165775237E-01 4.3538185428735365E-01 4.3650782224629742E-01 4.3763388551205956E-01 + 4.3876004406212943E-01 4.3988629787401068E-01 4.4101264692522102E-01 4.4213909119329220E-01 4.4326563065576968E-01 + 4.4439226529021325E-01 4.4551899507419640E-01 4.4664581998530917E-01 4.4777274000114792E-01 4.4889975509933072E-01 + 4.5002686525748686E-01 4.5115407045325956E-01 4.5228137066430585E-01 4.5340876586829709E-01 4.5453625604291792E-01 + 4.5566384116586722E-01 4.5679152121485761E-01 4.5791929616761556E-01 4.5904716600188150E-01 4.6017513069540950E-01 + 4.6130319022596733E-01 4.6243134457133711E-01 4.6355959370931438E-01 4.6468793761770821E-01 4.6581637627434180E-01 + 4.6694490965705210E-01 4.6807353774368982E-01 4.6920226051211916E-01 4.7033107794021828E-01 4.7145999000587907E-01 + 4.7258899668700943E-01 4.7371809796152364E-01 4.7484729380735707E-01 4.7597658420245631E-01 4.7710596912478176E-01 + 4.7823544855230710E-01 4.7936502246302004E-01 4.8049469083492169E-01 4.8162445364602680E-01 4.8275431087436382E-01 + 4.8388426249797489E-01 4.8501430849491534E-01 4.8614444884325492E-01 4.8727468352107572E-01 4.8840501250647456E-01 + 4.8953543577756103E-01 4.9066595331245860E-01 4.9179656508930425E-01 4.9292727108624840E-01 4.9405807128145524E-01 + 4.9518896565310183E-01 4.9631995417937941E-01 4.9745103683849234E-01 4.9858221360865851E-01 4.9971348446811170E-01 + 5.0084484939509200E-01 5.0197630836785956E-01 5.0310786136468644E-01 5.0423950836385789E-01 5.0537124934367206E-01 + 5.0650308428244073E-01 5.0763501315848936E-01 5.0876703595015660E-01 5.0989915263579433E-01 5.1103136319376785E-01 + 5.1216366760245591E-01 5.1329606584025056E-01 5.1442855788555708E-01 5.1556114371679396E-01 5.1669382331239344E-01 + 5.1782659665080055E-01 5.1895946371047397E-01 5.2009242446988524E-01 5.2122547890751969E-01 5.2235862700187530E-01 + 5.2349186873146369E-01 5.2462520407480995E-01 5.2575863301045156E-01 5.2689215551694257E-01 5.2802577157284236E-01 + 5.2915948115673073E-01 5.3029328424719857E-01 5.3142718082285001E-01 5.3256117086230192E-01 5.3369525434418441E-01 + 5.3482943124714122E-01 5.3596370154982842E-01 5.3709806523091619E-01 5.3823252226908669E-01 5.3936707264303585E-01 + 5.4050171633147281E-01 5.4163645331311938E-01 5.4277128356671067E-01 5.4390620707099491E-01 5.4504122380473319E-01 + 5.4617633374669938E-01 5.4731153687568113E-01 5.4844683317047849E-01 5.4958222260990475E-01 5.5071770517278607E-01 + 5.5185328083796192E-01 5.5298894958428668E-01 5.5412471139062081E-01 5.5526056623584497E-01 5.5639651409884983E-01 + 5.5753255495853993E-01 5.5866868879383180E-01 5.5980491558365564E-01 5.6094123530695406E-01 5.6207764794268256E-01 + 5.6321415346981007E-01 5.6435075186731787E-01 5.6548744311420018E-01 5.6662422718946426E-01 5.6776110407213021E-01 + 5.6889807374123091E-01 5.7003513617581181E-01 5.7117229135493142E-01 5.7230953925766137E-01 5.7344687986308540E-01 + 5.7458431315030056E-01 5.7572183909841690E-01 5.7685945768655633E-01 5.7799716889385433E-01 5.7913497269945879E-01 + 5.8027286908253317E-01 5.8141085802224546E-01 5.8254893949778463E-01 5.8368711348834945E-01 5.8482537997315165E-01 + 5.8596373893141562E-01 5.8710219034237776E-01 5.8824073418528822E-01 5.8937937043940902E-01 5.9051809908401520E-01 + 5.9165692009839443E-01 5.9279583346184683E-01 5.9393483915368517E-01 5.9507393715323509E-01 5.9621312743983468E-01 + 5.9735240999283457E-01 5.9849178479159781E-01 5.9963125181550048E-01 6.0077081104393093E-01 6.0191046245628987E-01 + 6.0305020603199122E-01 6.0419004175046087E-01 6.0532996959113738E-01 6.0646998953347175E-01 6.0761010155693029E-01 + 6.0875030564098387E-01 6.0989060176512366E-01 6.1103098990885096E-01 6.1217147005167882E-01 6.1331204217313373E-01 + 6.1445270625275417E-01 6.1559346227009071E-01 6.1673431020470704E-01 6.1787525003617871E-01 6.1901628174409395E-01 + 6.2015740530805330E-01 6.2129862070766972E-01 6.2243992792256897E-01 6.2358132693238844E-01 6.2472281771677818E-01 + 6.2586440025540102E-01 6.2700607452793156E-01 6.2814784051405714E-01 6.2928969819347680E-01 6.3043164754590297E-01 + 6.3157368855105944E-01 6.3271582118868275E-01 6.3385804543852409E-01 6.3500036128033943E-01 6.3614276869390485E-01 + 6.3728526765900562E-01 6.3842785815543968E-01 6.3957054016301695E-01 6.4071331366155981E-01 6.4185617863090283E-01 + 6.4299913505089290E-01 6.4414218290138847E-01 6.4528532216226120E-01 6.4642855281339440E-01 6.4757187483468337E-01 + 6.4871528820603608E-01 6.4985879290737203E-01 6.5100238891862361E-01 6.5214607621973486E-01 6.5328985479066193E-01 + 6.5443372461137350E-01 6.5557768566184971E-01 6.5672173792208399E-01 6.5786588137208024E-01 6.5901011599185588E-01 + 6.6015444176143967E-01 6.6129885866087501E-01 6.6244336667021031E-01 6.6358796576951262E-01 6.6473265593885944E-01 + 6.6587743715834002E-01 6.6702230940805574E-01 6.6816727266811937E-01 6.6931232691865650E-01 6.7045747213980411E-01 + 6.7160270831171187E-01 6.7274803541454065E-01 6.7389345342846374E-01 6.7503896233366634E-01 6.7618456211034561E-01 + 6.7733025273871061E-01 6.7847603419898217E-01 6.7962190647139320E-01 6.8076786953618895E-01 6.8191392337362555E-01 + 6.8306006796397223E-01 6.8420630328750898E-01 6.8535262932452856E-01 6.8649904605533563E-01 6.8764555346024570E-01 + 6.8879215151958950E-01 6.8993884021370200E-01 6.9108561952293712E-01 6.9223248942765880E-01 6.9337944990824207E-01 + 6.9452650094507451E-01 6.9567364251855435E-01 6.9682087460909348E-01 6.9796819719711312E-01 6.9911561026304836E-01 + 7.0026311378734518E-01 7.0141070775046144E-01 7.0255839213286664E-01 7.0370616691504206E-01 7.0485403207748099E-01 + 7.0600198760068777E-01 7.0715003346517968E-01 7.0829816965148429E-01 7.0944639614014138E-01 7.1059471291170295E-01 + 7.1174311994673223E-01 7.1289161722580408E-01 7.1404020472950480E-01 7.1518888243843570E-01 7.1633765033320129E-01 + 7.1748650839442552E-01 7.1863545660274197E-01 7.1978449493879493E-01 7.2093362338324107E-01 7.2208284191674832E-01 + 7.2323215051999612E-01 7.2438154917367570E-01 7.2553103785849005E-01 7.2668061655515304E-01 7.2783028524439075E-01 + 7.2898004390694071E-01 7.3012989252355143E-01 7.3127983107498362E-01 7.3242985954200934E-01 7.3357997790541196E-01 + 7.3473018614598673E-01 7.3588048424453978E-01 7.3703087218188945E-01 7.3818134993886508E-01 7.3933191749630744E-01 + 7.4048257483506930E-01 7.4163332193601406E-01 7.4278415878001991E-01 7.4393508534796837E-01 7.4508610162076017E-01 + 7.4623720757930467E-01 7.4738840320452338E-01 7.4853968847734820E-01 7.4969106337872315E-01 7.5084252788960348E-01 + 7.5199408199095541E-01 7.5314572566375726E-01 7.5429745888899813E-01 7.5544928164767844E-01 7.5660119392081060E-01 + 7.5775319568941779E-01 7.5890528693453407E-01 7.6005746763720616E-01 7.6120973777849077E-01 7.6236209733945670E-01 + 7.6351454630118420E-01 7.6466708464476352E-01 7.6581971235129775E-01 7.6697242940190025E-01 7.6812523577769609E-01 + 7.6927813145982160E-01 7.7043111642942630E-01 7.7158419066766404E-01 7.7273735415570732E-01 7.7389060687473687E-01 + 7.7504394880594563E-01 7.7619737993053650E-01 7.7735090022972453E-01 7.7850450968473539E-01 7.7965820827680643E-01 + 7.8081199598718531E-01 7.8196587279713181E-01 7.8311983868791679E-01 7.8427389364082134E-01 7.8542803763713842E-01 + 7.8658227065817199E-01 7.8773659268523732E-01 7.8889100369966025E-01 7.9004550368277804E-01 7.9120009261593904E-01 + 7.9235477048050296E-01 7.9350953725784013E-01 7.9466439292933211E-01 7.9581933747637146E-01 7.9697437088036427E-01 + 7.9812949312272075E-01 7.9928470418486852E-01 8.0044000404824511E-01 8.0159539269429747E-01 8.0275087010448509E-01 + 8.0390643626027736E-01 8.0506209114315508E-01 8.0621783473461051E-01 8.0737366701614599E-01 8.0852958796927565E-01 + 8.0968559757552372E-01 8.1084169581642618E-01 8.1199788267352924E-01 8.1315415812839087E-01 8.1431052216257938E-01 + 8.1546697475767427E-01 8.1662351589526561E-01 8.1778014555695477E-01 8.1893686372435381E-01 8.2009367037908554E-01 + 8.2125056550278397E-01 8.2240754907709379E-01 8.2356462108367079E-01 8.2472178150418352E-01 8.2587903032030485E-01 + 8.2703636751372489E-01 8.2819379306614316E-01 8.2935130695926895E-01 8.3050890917482290E-01 8.3166659969453705E-01 + 8.3282437850015256E-01 8.3398224557342349E-01 8.3514020089611318E-01 8.3629824444999601E-01 8.3745637621685787E-01 + 8.3861459617849410E-01 8.3977290431671259E-01 8.4093130061332988E-01 8.4208978505017473E-01 8.4324835760908634E-01 + 8.4440701827191444E-01 8.4556576702051955E-01 8.4672460383677273E-01 8.4788352870255612E-01 8.4904254159976200E-01 + 8.5020164251029362E-01 8.5136083141606778E-01 8.5252010829900382E-01 8.5367947314103942E-01 8.5483892592412081E-01 + 8.5599846663020418E-01 8.5715809524125719E-01 8.5831781173925725E-01 8.5947761610619289E-01 8.6063750832406316E-01 + 8.6179748837487768E-01 8.6295755624065695E-01 8.6411771190343156E-01 8.6527795534524254E-01 8.6643828654814226E-01 + 8.6759870549419371E-01 8.6875921216546970E-01 8.6991980654405321E-01 8.7108048861203891E-01 8.7224125835153166E-01 + 8.7340211574464677E-01 8.7456306077350943E-01 8.7572409342025648E-01 8.7688521366703431E-01 8.7804642149600076E-01 + 8.7920771688932542E-01 8.8036909982918166E-01 8.8153057029776105E-01 8.8269212827726207E-01 8.8385377374989527E-01 + 8.8501550669787987E-01 8.8617732710344710E-01 8.8733923494883726E-01 8.8850123021630190E-01 8.8966331288810296E-01 + 8.9082548294651265E-01 8.9198774037381301E-01 8.9315008515229777E-01 8.9431251726426997E-01 8.9547503669204309E-01 + 8.9663764341794161E-01 8.9780033742430021E-01 8.9896311869346335E-01 9.0012598720778625E-01 9.0128894294963458E-01 + 9.0245198590138409E-01 9.0361511604542122E-01 9.0477833336414204E-01 9.0594163783995352E-01 9.0710502945527549E-01 + 9.0826850819253035E-01 9.0943207403415827E-01 9.1059572696260693E-01 9.1175946696033483E-01 9.1292329400981054E-01 + 9.1408720809351296E-01 9.1525120919393033E-01 9.1641529729356341E-01 9.1757947237492010E-01 9.1874373442052137E-01 + 9.1990808341289665E-01 9.2107251933458600E-01 9.2223704216814006E-01 9.2340165189611889E-01 9.2456634850109432E-01 + 9.2573113196564616E-01 9.2689600227236613E-01 9.2806095940385569E-01 9.2922600334272587E-01 9.3039113407159846E-01 + 9.3155635157310501E-01 9.3272165582988764E-01 9.3388704682460100E-01 9.3505252453990184E-01 9.3621808895846526E-01 + 9.3738374006297354E-01 9.3854947783611919E-01 9.3971530226060462E-01 9.4088121331914276E-01 9.4204721099445610E-01 + 9.4321329526927733E-01 9.4437946612634982E-01 9.4554572354842614E-01 9.4671206751826953E-01 9.4787849801865276E-01 + 9.4904501503235872E-01 9.5021161854218106E-01 9.5137830853092253E-01 9.5254508498139612E-01 9.5371194787642521E-01 + 9.5487889719884289E-01 9.5604593293149243E-01 9.5721305505722687E-01 9.5838026355890904E-01 9.5954755841941219E-01 + 9.6071493962161947E-01 9.6188240714842577E-01 9.6304996098272966E-01 9.6421760110744648E-01 9.6538532750549855E-01 + 9.6655314015981941E-01 9.6772103905335061E-01 9.6888902416904554E-01 9.7005709548986641E-01 9.7122525299878548E-01 + 9.7239349667878505E-01 9.7356182651285761E-01 9.7473024248400453E-01 9.7589874457523795E-01 9.7706733276958002E-01 + 9.7823600705006186E-01 9.7940476739972515E-01 9.8057361380162122E-01 9.8174254623881074E-01 9.8291156469436536E-01 + 9.8408066915136516E-01 9.8524985959290112E-01 9.8641913600207332E-01 9.8758849836199258E-01 9.8875794665577821E-01 + 9.8992748086656279E-01 9.9109710097748061E-01 9.9226680697168401E-01 9.9343659883233149E-01 9.9460647654259204E-01 + 9.9577644008564425E-01 9.9694648944467634E-01 9.9811662460288653E-01 9.9928684554348224E-01 1.0004571522496817E+00 + 1.0016275447047114E+00 1.0027980228918085E+00 1.0039685867942194E+00 1.0051392363952008E+00 1.0063099716780184E+00 + 1.0074807926259484E+00 1.0086516992222756E+00 1.0098226914502948E+00 1.0109937692933111E+00 1.0121649327346387E+00 + 1.0133361817576014E+00 1.0145075163455333E+00 1.0156789364817769E+00 1.0168504421496880E+00 1.0180220333326235E+00 + 1.0191937100139590E+00 1.0203654721770754E+00 1.0215373198053643E+00 1.0227092528822261E+00 1.0238812713910714E+00 + 1.0250533753153204E+00 1.0262255646384026E+00 1.0273978393437568E+00 1.0285701994148324E+00 1.0297426448350868E+00 + 1.0309151755879888E+00 1.0320877916570148E+00 1.0332604930256517E+00 1.0344332796773961E+00 1.0356061515957544E+00 + 1.0367791087642406E+00 1.0379521511663803E+00 1.0391252787857084E+00 1.0402984916057680E+00 1.0414717896101127E+00 + 1.0426451727823052E+00 1.0438186411059176E+00 1.0449921945645342E+00 1.0461658331417418E+00 1.0473395568211421E+00 + 1.0485133655863466E+00 1.0496872594209739E+00 1.0508612383086531E+00 1.0520353022330227E+00 1.0532094511777297E+00 + 1.0543836851264323E+00 1.0555580040627961E+00 1.0567324079704976E+00 1.0579068968332221E+00 1.0590814706346636E+00 + 1.0602561293585269E+00 1.0614308729885247E+00 1.0626057015083803E+00 1.0637806149018256E+00 1.0649556131526021E+00 + 1.0661306962444606E+00 1.0673058641611608E+00 1.0684811168864730E+00 1.0696564544041747E+00 1.0708318766980551E+00 + 1.0720073837519111E+00 1.0731829755495519E+00 1.0743586520747881E+00 1.0755344133114482E+00 1.0767102592433657E+00 + 1.0778861898543857E+00 1.0790622051283598E+00 1.0802383050491506E+00 1.0814144896006306E+00 1.0825907587666799E+00 + 1.0837671125311881E+00 1.0849435508780552E+00 1.0861200737911891E+00 1.0872966812545080E+00 1.0884733732519385E+00 + 1.0896501497674167E+00 1.0908270107848874E+00 1.0920039562883057E+00 1.0931809862616355E+00 1.0943581006888492E+00 + 1.0955352995539289E+00 1.0967125828408657E+00 1.0978899505336597E+00 1.0990674026163207E+00 1.1002449390728701E+00 + 1.1014225598873304E+00 1.1026002650437403E+00 1.1037780545261469E+00 1.1049559283186046E+00 1.1061338864051780E+00 + 1.1073119287699404E+00 1.1084900553969741E+00 1.1096682662703707E+00 1.1108465613742309E+00 1.1120249406926643E+00 + 1.1132034042097898E+00 1.1143819519097351E+00 1.1155605837766371E+00 1.1167392997946417E+00 1.1179180999479041E+00 + 1.1190969842205885E+00 1.1202759525968673E+00 1.1214550050609231E+00 1.1226341415969465E+00 1.1238133621891391E+00 + 1.1249926668217078E+00 1.1261720554788726E+00 1.1273515281448596E+00 1.1285310848039078E+00 1.1297107254402579E+00 + 1.1308904500381649E+00 1.1320702585818934E+00 1.1332501510557149E+00 1.1344301274439101E+00 1.1356101877307685E+00 + 1.1367903319005903E+00 1.1379705599376821E+00 1.1391508718263612E+00 1.1403312675509532E+00 1.1415117470957927E+00 + 1.1426923104452229E+00 1.1438729575835966E+00 1.1450536884952749E+00 1.1462345031646277E+00 1.1474154015760343E+00 + 1.1485963837138826E+00 1.1497774495625699E+00 1.1509585991065012E+00 1.1521398323300913E+00 1.1533211492177635E+00 + 1.1545025497539512E+00 1.1556840339230934E+00 1.1568656017096441E+00 1.1580472530980566E+00 1.1592289880728008E+00 + 1.1604108066183532E+00 1.1615927087191991E+00 1.1627746943598325E+00 1.1639567635247565E+00 1.1651389161984826E+00 + 1.1663211523655310E+00 1.1675034720104305E+00 1.1686858751177200E+00 1.1698683616719454E+00 1.1710509316576627E+00 + 1.1722335850594359E+00 1.1734163218618379E+00 1.1745991420494508E+00 1.1757820456068644E+00 1.1769650325186785E+00 + 1.1781481027695011E+00 1.1793312563439482E+00 1.1805144932266454E+00 1.1816978134022273E+00 1.1828812168553360E+00 + 1.1840647035706258E+00 1.1852482735327516E+00 1.1864319267263850E+00 1.1876156631362034E+00 1.1887994827468928E+00 + 1.1899833855431476E+00 1.1911673715096724E+00 1.1923514406311784E+00 1.1935355928923865E+00 1.1947198282780265E+00 + 1.1959041467728369E+00 1.1970885483615628E+00 1.1982730330289608E+00 1.1994576007597939E+00 1.2006422515388357E+00 + 1.2018269853508663E+00 1.2030118021806764E+00 1.2041967020130631E+00 1.2053816848328340E+00 1.2065667506248052E+00 + 1.2077518993737992E+00 1.2089371310646497E+00 1.2101224456821973E+00 1.2113078432112925E+00 1.2124933236367952E+00 + 1.2136788869435675E+00 1.2148645331164871E+00 1.2160502621404383E+00 1.2172360740003130E+00 1.2184219686810125E+00 + 1.2196079461674456E+00 1.2207940064445308E+00 1.2219801494971945E+00 1.2231663753103712E+00 1.2243526838690042E+00 + 1.2255390751580464E+00 1.2267255491624571E+00 1.2279121058672056E+00 1.2290987452572690E+00 1.2302854673176331E+00 + 1.2314722720332918E+00 1.2326591593892484E+00 1.2338461293705139E+00 1.2350331819621070E+00 1.2362203171490562E+00 + 1.2374075349163980E+00 1.2385948352491769E+00 1.2397822181324492E+00 1.2409696835512702E+00 1.2421572314907134E+00 + 1.2433448619358569E+00 1.2445325748717877E+00 1.2457203702836006E+00 1.2469082481563993E+00 1.2480962084752958E+00 + 1.2492842512254101E+00 1.2504723763918713E+00 1.2516605839598154E+00 1.2528488739143886E+00 1.2540372462407439E+00 + 1.2552257009240437E+00 1.2564142379494587E+00 1.2576028573021669E+00 1.2587915589673553E+00 1.2599803429302192E+00 + 1.2611692091759619E+00 1.2623581576897960E+00 1.2635471884569409E+00 1.2647363014626252E+00 1.2659254966920863E+00 + 1.2671147741305677E+00 1.2683041337633276E+00 1.2694935755756198E+00 1.2706830995527183E+00 1.2718727056799004E+00 + 1.2730623939424528E+00 1.2742521643256695E+00 1.2754420168148541E+00 1.2766319513953166E+00 1.2778219680523768E+00 + 1.2790120667713623E+00 1.2802022475376080E+00 1.2813925103364585E+00 1.2825828551532654E+00 1.2837732819733889E+00 + 1.2849637907821978E+00 1.2861543815650687E+00 1.2873450543073854E+00 1.2885358089945425E+00 1.2897266456119398E+00 + 1.2909175641449873E+00 1.2921085645791017E+00 1.2932996468997093E+00 1.2944908110922440E+00 1.2956820571421468E+00 + 1.2968733850348706E+00 1.2980647947558683E+00 1.2992562862906096E+00 1.3004478596245677E+00 1.3016395147432256E+00 + 1.3028312516320741E+00 1.3040230702766116E+00 1.3052149706623442E+00 1.3064069527747879E+00 1.3075990165994649E+00 + 1.3087911621219066E+00 1.3099833893276520E+00 1.3111756982022478E+00 1.3123680887312494E+00 1.3135605609002203E+00 + 1.3147531146947318E+00 1.3159457501003631E+00 1.3171384671027011E+00 1.3183312656873420E+00 1.3195241458398890E+00 + 1.3207171075459532E+00 1.3219101507911544E+00 1.3231032755611203E+00 1.3242964818414880E+00 1.3254897696178964E+00 + 1.3266831388760001E+00 1.3278765896014575E+00 1.3290701217799366E+00 1.3302637353971123E+00 1.3314574304386690E+00 + 1.3326512068902974E+00 1.3338450647376960E+00 1.3350390039665738E+00 1.3362330245626444E+00 1.3374271265116313E+00 + 1.3386213097992665E+00 1.3398155744112876E+00 1.3410099203334425E+00 1.3422043475514860E+00 1.3433988560511803E+00 + 1.3445934458182964E+00 1.3457881168386128E+00 1.3469828690979155E+00 1.3481777025819996E+00 1.3493726172766674E+00 + 1.3505676131677282E+00 1.3517626902410007E+00 1.3529578484823133E+00 1.3541530878774937E+00 1.3553484084123872E+00 + 1.3565438100728429E+00 1.3577392928447172E+00 1.3589348567138768E+00 1.3601305016661938E+00 1.3613262276875489E+00 + 1.3625220347638309E+00 1.3637179228809360E+00 1.3649138920247690E+00 1.3661099421812415E+00 1.3673060733362730E+00 + 1.3685022854757920E+00 1.3696985785857343E+00 1.3708949526520420E+00 1.3720914076606670E+00 1.3732879435975676E+00 + 1.3744845604487106E+00 1.3756812582000704E+00 1.3768780368376292E+00 1.3780748963473766E+00 1.3792718367153103E+00 + 1.3804688579274356E+00 1.3816659599697685E+00 1.3828631428283242E+00 1.3840604064891351E+00 1.3852577509382360E+00 + 1.3864551761616715E+00 1.3876526821454935E+00 1.3888502688757609E+00 1.3900479363385416E+00 1.3912456845199102E+00 + 1.3924435134059483E+00 1.3936414229827481E+00 1.3948394132364057E+00 1.3960374841530274E+00 1.3972356357187263E+00 + 1.3984338679196233E+00 1.3996321807418470E+00 1.4008305741715339E+00 1.4020290481948274E+00 1.4032276027978794E+00 + 1.4044262379668495E+00 1.4056249536879029E+00 1.4068237499472160E+00 1.4080226267309699E+00 1.4092215840253561E+00 + 1.4104206218165682E+00 1.4116197400908124E+00 1.4128189388343020E+00 1.4140182180332572E+00 1.4152175776739047E+00 + 1.4164170177424806E+00 1.4176165382252279E+00 1.4188161391083967E+00 1.4200158203782447E+00 1.4212155820210375E+00 + 1.4224154240230484E+00 1.4236153463705588E+00 1.4248153490498561E+00 1.4260154320472358E+00 1.4272155953490018E+00 + 1.4284158389414650E+00 1.4296161628109432E+00 1.4308165669437634E+00 1.4320170513262576E+00 1.4332176159447676E+00 + 1.4344182607856417E+00 1.4356189858352364E+00 1.4368197910799139E+00 1.4380206765060490E+00 1.4392216421000135E+00 + 1.4404226878481974E+00 1.4416238137369937E+00 1.4428250197528021E+00 1.4440263058820320E+00 1.4452276721110999E+00 + 1.4464291184264280E+00 1.4476306448144465E+00 1.4488322512615952E+00 1.4500339377543181E+00 1.4512357042790689E+00 + 1.4524375508223077E+00 1.4536394773705035E+00 1.4548414839101307E+00 1.4560435704276722E+00 1.4572457369096177E+00 + 1.4584479833424651E+00 1.4596503097127196E+00 1.4608527160068936E+00 1.4620552022115059E+00 1.4632577683130847E+00 + 1.4644604142981641E+00 1.4656631401532862E+00 1.4668659458650020E+00 1.4680688314198642E+00 1.4692717968044382E+00 + 1.4704748420052962E+00 1.4716779670090161E+00 1.4728811718021846E+00 1.4740844563713951E+00 1.4752878207032472E+00 + 1.4764912647843502E+00 1.4776947886013194E+00 1.4788983921407768E+00 1.4801020753893523E+00 1.4813058383336843E+00 + 1.4825096809604166E+00 1.4837136032562008E+00 1.4849176052076969E+00 1.4861216868015708E+00 1.4873258480244969E+00 + 1.4885300888631556E+00 1.4897344093042357E+00 1.4909388093344329E+00 1.4921432889404493E+00 1.4933478481089959E+00 + 1.4945524868267923E+00 1.4957572050805579E+00 1.4969620028570274E+00 1.4981668801429406E+00 1.4993718369250419E+00 + 1.5005768731900875E+00 1.5017819889248358E+00 1.5029871841160565E+00 1.5041924587505240E+00 1.5053978128150209E+00 + 1.5066032462963377E+00 1.5078087591812706E+00 1.5090143514566232E+00 1.5102200231092078E+00 1.5114257741258421E+00 + 1.5126316044933523E+00 1.5138375141985709E+00 1.5150435032283376E+00 1.5162495715694999E+00 1.5174557192089126E+00 + 1.5186619461334367E+00 1.5198682523299407E+00 1.5210746377853008E+00 1.5222811024863996E+00 1.5234876464201299E+00 + 1.5246942695733836E+00 1.5259009719330676E+00 1.5271077534860931E+00 1.5283146142193793E+00 1.5295215541198521E+00 + 1.5307285731744436E+00 1.5319356713700933E+00 1.5331428486937495E+00 1.5343501051323654E+00 1.5355574406729022E+00 + 1.5367648553023288E+00 1.5379723490076194E+00 1.5391799217757571E+00 1.5403875735937320E+00 1.5415953044485402E+00 + 1.5428031143271852E+00 1.5440110032166772E+00 1.5452189711040345E+00 1.5464270179762816E+00 1.5476351438204508E+00 + 1.5488433486235809E+00 1.5500516323727169E+00 1.5512599950549157E+00 1.5524684366572312E+00 1.5536769571667330E+00 + 1.5548855565704947E+00 1.5560942348555986E+00 1.5573029920091310E+00 1.5585118280181876E+00 1.5597207428698714E+00 + 1.5609297365512897E+00 1.5621388090495594E+00 1.5633479603518032E+00 1.5645571904451512E+00 1.5657664993167397E+00 + 1.5669758869537134E+00 1.5681853533432220E+00 1.5693948984724249E+00 1.5706045223284850E+00 1.5718142248985754E+00 + 1.5730240061698739E+00 1.5742338661295663E+00 1.5754438047648447E+00 1.5766538220629089E+00 1.5778639180109650E+00 + 1.5790740925962268E+00 1.5802843458059164E+00 1.5814946776272560E+00 1.5827050880474827E+00 1.5839155770538360E+00 + 1.5851261446335649E+00 1.5863367907739236E+00 1.5875475154621732E+00 1.5887583186855827E+00 1.5899692004314272E+00 + 1.5911801606869895E+00 1.5923911994395576E+00 1.5936023166764282E+00 1.5948135123849034E+00 1.5960247865522941E+00 + 1.5972361391659153E+00 1.5984475702130907E+00 1.5996590796811507E+00 1.6008706675574327E+00 1.6020823338292796E+00 + 1.6032940784840430E+00 1.6045059015090797E+00 1.6057178028917540E+00 1.6069297826194373E+00 1.6081418406795074E+00 + 1.6093539770593517E+00 1.6105661917463563E+00 1.6117784847279222E+00 1.6129908559914545E+00 1.6142033055243656E+00 + 1.6154158333140729E+00 1.6166284393480033E+00 1.6178411236135877E+00 1.6190538860982659E+00 1.6202667267894837E+00 + 1.6214796456746927E+00 1.6226926427413531E+00 1.6239057179769305E+00 1.6251188713688980E+00 1.6263321029047344E+00 + 1.6275454125719262E+00 1.6287588003579667E+00 1.6299722662503553E+00 1.6311858102365979E+00 1.6323994323042084E+00 + 1.6336131324407062E+00 1.6348269106336177E+00 1.6360407668704766E+00 1.6372547011388252E+00 1.6384687134262055E+00 + 1.6396828037201716E+00 1.6408969720082853E+00 1.6421112182781126E+00 1.6433255425172268E+00 1.6445399447132083E+00 + 1.6457544248536440E+00 1.6469689829261258E+00 1.6481836189182553E+00 1.6493983328176383E+00 1.6506131246118891E+00 + 1.6518279942886263E+00 1.6530429418354771E+00 1.6542579672400757E+00 1.6554730704900600E+00 1.6566882515730783E+00 + 1.6579035104767830E+00 1.6591188471888334E+00 1.6603342616968972E+00 1.6615497539886459E+00 1.6627653240517597E+00 + 1.6639809718739245E+00 1.6651966974428334E+00 1.6664125007461881E+00 1.6676283817716904E+00 1.6688443405070537E+00 + 1.6700603769399984E+00 1.6712764910582492E+00 1.6724926828495388E+00 1.6737089523016064E+00 1.6749252994021970E+00 + 1.6761417241390622E+00 1.6773582264999620E+00 1.6785748064726589E+00 1.6797914640449267E+00 1.6810081992045425E+00 + 1.6822250119392914E+00 1.6834419022369638E+00 1.6846588700853578E+00 1.6858759154722780E+00 1.6870930383855354E+00 + 1.6883102388129461E+00 1.6895275167423347E+00 1.6907448721615312E+00 1.6919623050583725E+00 1.6931798154207023E+00 + 1.6943974032363696E+00 1.6956150684932334E+00 1.6968328111791515E+00 1.6980506312819952E+00 1.6992685287896414E+00 + 1.7004865036899706E+00 1.7017045559708726E+00 1.7029226856202417E+00 1.7041408926259802E+00 1.7053591769759959E+00 + 1.7065775386582027E+00 1.7077959776605216E+00 1.7090144939708807E+00 1.7102330875772127E+00 1.7114517584674589E+00 + 1.7126705066295649E+00 1.7138893320514834E+00 1.7151082347211757E+00 1.7163272146266055E+00 1.7175462717557466E+00 + 1.7187654060965774E+00 1.7199846176370825E+00 1.7212039063652536E+00 1.7224232722690882E+00 1.7236427153365941E+00 + 1.7248622355557759E+00 1.7260818329146537E+00 1.7273015074012499E+00 1.7285212590035954E+00 1.7297410877097263E+00 + 1.7309609935076846E+00 1.7321809763855194E+00 1.7334010363312857E+00 1.7346211733330454E+00 1.7358413873788661E+00 + 1.7370616784568225E+00 1.7382820465549942E+00 1.7395024916614685E+00 1.7407230137643395E+00 1.7419436128517058E+00 + 1.7431642889116741E+00 1.7443850419323557E+00 1.7456058719018699E+00 1.7468267788083407E+00 1.7480477626398998E+00 + 1.7492688233846849E+00 1.7504899610308393E+00 1.7517111755665133E+00 1.7529324669798656E+00 1.7541538352590531E+00 + 1.7553752803922482E+00 1.7565968023676253E+00 1.7578184011733662E+00 1.7590400767976579E+00 1.7602618292286960E+00 + 1.7614836584546787E+00 1.7627055644638141E+00 1.7639275472443137E+00 1.7651496067843968E+00 1.7663717430722892E+00 + 1.7675939560962213E+00 1.7688162458444314E+00 1.7700386123051635E+00 1.7712610554666672E+00 1.7724835753171990E+00 + 1.7737061718450218E+00 1.7749288450384040E+00 1.7761515948856208E+00 1.7773744213749532E+00 1.7785973244946889E+00 + 1.7798203042331207E+00 1.7810433605785490E+00 1.7822664935192820E+00 1.7834897030436279E+00 1.7847129891399058E+00 + 1.7859363517964408E+00 1.7871597910015644E+00 1.7883833067436119E+00 1.7896068990109280E+00 1.7908305677918603E+00 + 1.7920543130747650E+00 1.7932781348480038E+00 1.7945020330999439E+00 1.7957260078189583E+00 1.7969500589934286E+00 + 1.7981741866117389E+00 1.7993983906622828E+00 1.8006226711334579E+00 1.8018470280136691E+00 1.8030714612913259E+00 + 1.8042959709548461E+00 1.8055205569926525E+00 1.8067452193931726E+00 1.8079699581448425E+00 1.8091947732361029E+00 + 1.8104196646554040E+00 1.8116446323911930E+00 1.8128696764319325E+00 1.8140947967660879E+00 1.8153199933821300E+00 + 1.8165452662685369E+00 1.8177706154137929E+00 1.8189960408063861E+00 1.8202215424348134E+00 1.8214471202875766E+00 + 1.8226727743531836E+00 1.8238985046201477E+00 1.8251243110769892E+00 1.8263501937122342E+00 1.8275761525144145E+00 + 1.8288021874720690E+00 1.8300282985737413E+00 1.8312544858079811E+00 1.8324807491633450E+00 1.8337070886283953E+00 + 1.8349335041917008E+00 1.8361599958418338E+00 1.8373865635673770E+00 1.8386132073569144E+00 1.8398399271990420E+00 + 1.8410667230823523E+00 1.8422935949954526E+00 1.8435205429269530E+00 1.8447475668654698E+00 1.8459746667996249E+00 + 1.8472018427180465E+00 1.8484290946093691E+00 1.8496564224622316E+00 1.8508838262652814E+00 1.8521113060071692E+00 + 1.8533388616765545E+00 1.8545664932621000E+00 1.8557942007524761E+00 1.8570219841363587E+00 1.8582498434024288E+00 + 1.8594777785393750E+00 1.8607057895358905E+00 1.8619338763806745E+00 1.8631620390624331E+00 1.8643902775698775E+00 + 1.8656185918917245E+00 1.8668469820166980E+00 1.8680754479335271E+00 1.8693039896309485E+00 1.8705326070976993E+00 + 1.8717613003225280E+00 1.8729900692941874E+00 1.8742189140014365E+00 1.8754478344330399E+00 1.8766768305777670E+00 + 1.8779059024243954E+00 1.8791350499617059E+00 1.8803642731784880E+00 1.8815935720635346E+00 1.8828229466056452E+00 + 1.8840523967936262E+00 1.8852819226162878E+00 1.8865115240624493E+00 1.8877412011209318E+00 1.8889709537805655E+00 + 1.8902007820301852E+00 1.8914306858586309E+00 1.8926606652547500E+00 1.8938907202073942E+00 1.8951208507054216E+00 + 1.8963510567376964E+00 1.8975813382930908E+00 1.8988116953604754E+00 1.9000421279287345E+00 1.9012726359867551E+00 + 1.9025032195234297E+00 1.9037338785276583E+00 1.9049646129883442E+00 1.9061954228943985E+00 1.9074263082347376E+00 + 1.9086572689982830E+00 1.9098883051739626E+00 1.9111194167507097E+00 1.9123506037174642E+00 1.9135818660631709E+00 + 1.9148132037767811E+00 1.9160446168472502E+00 1.9172761052635416E+00 1.9185076690146228E+00 1.9197393080894685E+00 + 1.9209710224770573E+00 1.9222028121663748E+00 1.9234346771464133E+00 1.9246666174061682E+00 1.9258986329346421E+00 + 1.9271307237208464E+00 1.9283628897537897E+00 1.9295951310224944E+00 1.9308274475159859E+00 1.9320598392232953E+00 + 1.9332923061334590E+00 1.9345248482355215E+00 1.9357574655185283E+00 1.9369901579715352E+00 1.9382229255836012E+00 + 1.9394557683437921E+00 1.9406886862411779E+00 1.9419216792648364E+00 1.9431547474038497E+00 1.9443878906473060E+00 + 1.9456211089842981E+00 1.9468544024039269E+00 1.9480877708952962E+00 1.9493212144475176E+00 1.9505547330497068E+00 + 1.9517883266909857E+00 1.9530219953604833E+00 1.9542557390473314E+00 1.9554895577406726E+00 1.9567234514296459E+00 + 1.9579574201034045E+00 1.9591914637511032E+00 1.9604255823619046E+00 1.9616597759249759E+00 1.9628940444294887E+00 + 1.9641283878646227E+00 1.9653628062195612E+00 1.9665972994834942E+00 1.9678318676456166E+00 1.9690665106951286E+00 + 1.9703012286212374E+00 1.9715360214131548E+00 1.9727708890600981E+00 1.9740058315512909E+00 1.9752408488759614E+00 + 1.9764759410233446E+00 1.9777111079826806E+00 1.9789463497432138E+00 1.9801816662941958E+00 1.9814170576248835E+00 + 1.9826525237245385E+00 1.9838880645824284E+00 1.9851236801878305E+00 1.9863593705300169E+00 1.9875951355982748E+00 + 1.9888309753818956E+00 1.9900668898701726E+00 1.9913028790524081E+00 1.9925389429179086E+00 1.9937750814559860E+00 + 1.9950112946559575E+00 1.9962475825071471E+00 1.9974839449988822E+00 1.9987203821204986E+00 1.9999568938613344E+00 + 2.0011934802107358E+00 2.0024301411580527E+00 2.0036668766926420E+00 2.0049036868038650E+00 2.0061405714810889E+00 + 2.0073775307136867E+00 2.0086145644910363E+00 2.0098516728025211E+00 2.0110888556375310E+00 2.0123261129854595E+00 + 2.0135634448357065E+00 2.0148008511776818E+00 2.0160383320007895E+00 2.0172758872944501E+00 2.0185135170480843E+00 + 2.0197512212511199E+00 2.0209889998929906E+00 2.0222268529631333E+00 2.0234647804509920E+00 2.0247027823460164E+00 + 2.0259408586376613E+00 2.0271790093153856E+00 2.0284172343686553E+00 2.0296555337869422E+00 2.0308939075597210E+00 + 2.0321323556764748E+00 2.0333708781266906E+00 2.0346094748998600E+00 2.0358481459854816E+00 2.0370868913730584E+00 + 2.0383257110521007E+00 2.0395646050121203E+00 2.0408035732426395E+00 2.0420426157331804E+00 2.0432817324732784E+00 + 2.0445209234524619E+00 2.0457601886602759E+00 2.0469995280862676E+00 2.0482389417199873E+00 2.0494784295509936E+00 + 2.0507179915688476E+00 2.0519576277631186E+00 2.0531973381233803E+00 2.0544371226392095E+00 2.0556769813001923E+00 + 2.0569169140959165E+00 2.0581569210159771E+00 2.0593970020499754E+00 2.0606371571875162E+00 2.0618773864182098E+00 + 2.0631176897316728E+00 2.0643580671175270E+00 2.0655985185653982E+00 2.0668390440649191E+00 2.0680796436057274E+00 + 2.0693203171774646E+00 2.0705610647697807E+00 2.0718018863723269E+00 2.0730427819747663E+00 2.0742837515667563E+00 + 2.0755247951379694E+00 2.0767659126780806E+00 2.0780071041767689E+00 2.0792483696237198E+00 2.0804897090086238E+00 + 2.0817311223211763E+00 2.0829726095510788E+00 2.0842141706880377E+00 2.0854558057217640E+00 2.0866975146419739E+00 + 2.0879392974383908E+00 2.0891811541007410E+00 2.0904230846187586E+00 2.0916650889821797E+00 2.0929071671807482E+00 + 2.0941493192042127E+00 2.0953915450423257E+00 2.0966338446848480E+00 2.0978762181215416E+00 2.0991186653421772E+00 + 2.1003611863365284E+00 2.1016037810943757E+00 2.1028464496055066E+00 2.1040891918597056E+00 2.1053320078467710E+00 + 2.1065748975565040E+00 2.1078178609787099E+00 2.1090608981032002E+00 2.1103040089197904E+00 2.1115471934183030E+00 + 2.1127904515885638E+00 2.1140337834204050E+00 2.1152771889036641E+00 2.1165206680281829E+00 2.1177642207838092E+00 + 2.1190078471603955E+00 2.1202515471477992E+00 2.1214953207358835E+00 2.1227391679145167E+00 2.1239830886735720E+00 + 2.1252270830029283E+00 2.1264711508924692E+00 2.1277152923320823E+00 2.1289595073116634E+00 2.1302037958211097E+00 + 2.1314481578503304E+00 2.1326925933892280E+00 2.1339371024277196E+00 2.1351816849557261E+00 2.1364263409631716E+00 + 2.1376710704399859E+00 2.1389158733761047E+00 2.1401607497614679E+00 2.1414056995860209E+00 2.1426507228397131E+00 + 2.1438958195125020E+00 2.1451409895943474E+00 2.1463862330752148E+00 2.1476315499450758E+00 2.1488769401939054E+00 + 2.1501224038116851E+00 2.1513679407884028E+00 2.1526135511140474E+00 2.1538592347786172E+00 2.1551049917721117E+00 + 2.1563508220845384E+00 2.1575967257059103E+00 2.1588427026262420E+00 2.1600887528355575E+00 2.1613348763238838E+00 + 2.1625810730812498E+00 2.1638273430976933E+00 2.1650736863632578E+00 2.1663201028679904E+00 2.1675665926019430E+00 + 2.1688131555551715E+00 2.1700597917177400E+00 2.1713065010797155E+00 2.1725532836311698E+00 2.1738001393621809E+00 + 2.1750470682628307E+00 2.1762940703232072E+00 2.1775411455334024E+00 2.1787882938835139E+00 2.1800355153636457E+00 + 2.1812828099639030E+00 2.1825301776743999E+00 2.1837776184852542E+00 2.1850251323865875E+00 2.1862727193685281E+00 + 2.1875203794212084E+00 2.1887681125347664E+00 2.1900159186993444E+00 2.1912637979050924E+00 2.1925117501421587E+00 + 2.1937597754007037E+00 2.1950078736708876E+00 2.1962560449428805E+00 2.1975042892068539E+00 2.1987526064529859E+00 + 2.2000009966714580E+00 2.2012494598524586E+00 2.2024979959861803E+00 2.2037466050628201E+00 2.2049952870725797E+00 + 2.2062440420056677E+00 2.2074928698522953E+00 2.2087417706026806E+00 2.2099907442470452E+00 2.2112397907756165E+00 + 2.2124889101786258E+00 2.2137381024463116E+00 2.2149873675689151E+00 2.2162367055366827E+00 2.2174861163398663E+00 + 2.2187355999687228E+00 2.2199851564135171E+00 2.2212347856645094E+00 2.2224844877119749E+00 2.2237342625461896E+00 + 2.2249841101574339E+00 2.2262340305359958E+00 2.2274840236721647E+00 2.2287340895562378E+00 2.2299842281785152E+00 + 2.2312344395293029E+00 2.2324847235989118E+00 2.2337350803776577E+00 2.2349855098558602E+00 2.2362360120238458E+00 + 2.2374865868719449E+00 2.2387372343904901E+00 2.2399879545698247E+00 2.2412387474002915E+00 2.2424896128722409E+00 + 2.2437405509760269E+00 2.2449915617020100E+00 2.2462426450405530E+00 2.2474938009820269E+00 2.2487450295168041E+00 + 2.2499963306352675E+00 2.2512477043277950E+00 2.2524991505847765E+00 2.2537506693966072E+00 2.2550022607536842E+00 + 2.2562539246464111E+00 2.2575056610651956E+00 2.2587574700004502E+00 2.2600093514425934E+00 2.2612613053820469E+00 + 2.2625133318092367E+00 2.2637654307145967E+00 2.2650176020885628E+00 2.2662698459215775E+00 2.2675221622040858E+00 + 2.2687745509265391E+00 2.2700270120793946E+00 2.2712795456531127E+00 2.2725321516381585E+00 2.2737848300250025E+00 + 2.2750375808041197E+00 2.2762904039659912E+00 2.2775432995011000E+00 2.2787962673999376E+00 2.2800493076530000E+00 + 2.2813024202507810E+00 2.2825556051837861E+00 2.2838088624425259E+00 2.2850621920175125E+00 2.2863155938992641E+00 + 2.2875690680783043E+00 2.2888226145451598E+00 2.2900762332903644E+00 2.2913299243044536E+00 2.2925836875779702E+00 + 2.2938375231014612E+00 2.2950914308654773E+00 2.2963454108605750E+00 2.2975994630773156E+00 2.2988535875062630E+00 + 2.3001077841379898E+00 2.3013620529630692E+00 2.3026163939720825E+00 2.3038708071556129E+00 2.3051252925042500E+00 + 2.3063798500085881E+00 2.3076344796592254E+00 2.3088891814467689E+00 2.3101439553618195E+00 2.3113988013949940E+00 + 2.3126537195369092E+00 2.3139087097781887E+00 2.3151637721094573E+00 2.3164189065213470E+00 2.3176741130044944E+00 + 2.3189293915495410E+00 2.3201847421471311E+00 2.3214401647879166E+00 2.3226956594625499E+00 2.3239512261616930E+00 + 2.3252068648760100E+00 2.3264625755961683E+00 2.3277183583128425E+00 2.3289742130167110E+00 2.3302301396984566E+00 + 2.3314861383487662E+00 2.3327422089583330E+00 2.3339983515178528E+00 2.3352545660180279E+00 2.3365108524495644E+00 + 2.3377672108031731E+00 2.3390236410695717E+00 2.3402801432394762E+00 2.3415367173036126E+00 2.3427933632527105E+00 + 2.3440500810775040E+00 2.3453068707687321E+00 2.3465637323171373E+00 2.3478206657134679E+00 2.3490776709484762E+00 + 2.3503347480129193E+00 2.3515918968975593E+00 2.3528491175931618E+00 2.3541064100904974E+00 2.3553637743803426E+00 + 2.3566212104534765E+00 2.3578787183006855E+00 2.3591362979127561E+00 2.3603939492804842E+00 2.3616516723946672E+00 + 2.3629094672461091E+00 2.3641673338256162E+00 2.3654252721240017E+00 2.3666832821320818E+00 2.3679413638406808E+00 + 2.3691995172406197E+00 2.3704577423227309E+00 2.3717160390778491E+00 2.3729744074968147E+00 2.3742328475704713E+00 + 2.3754913592896676E+00 2.3767499426452567E+00 2.3780085976280976E+00 2.3792673242290512E+00 2.3805261224389849E+00 + 2.3817849922487699E+00 2.3830439336492826E+00 2.3843029466314030E+00 2.3855620311860166E+00 2.3868211873040126E+00 + 2.3880804149762853E+00 2.3893397141937331E+00 2.3905990849472585E+00 2.3918585272277704E+00 2.3931180410261801E+00 + 2.3943776263334051E+00 2.3956372831403656E+00 2.3968970114379875E+00 2.3981568112172043E+00 2.3994166824689445E+00 + 2.4006766251841500E+00 2.4019366393537656E+00 2.4031967249687378E+00 2.4044568820200207E+00 2.4057171104985708E+00 + 2.4069774103953496E+00 2.4082377817013234E+00 2.4094982244074630E+00 2.4107587385047431E+00 2.4120193239841430E+00 + 2.4132799808366476E+00 2.4145407090532451E+00 2.4158015086249276E+00 2.4170623795426929E+00 2.4183233217975437E+00 + 2.4195843353804851E+00 2.4208454202825296E+00 2.4221065764946910E+00 2.4233678040079889E+00 2.4246291028134470E+00 + 2.4258904729020956E+00 2.4271519142649667E+00 2.4284134268931004E+00 2.4296750107775331E+00 2.4309366659093143E+00 + 2.4321983922794943E+00 2.4334601898791282E+00 2.4347220586992759E+00 2.4359839987310017E+00 2.4372460099653730E+00 + 2.4385080923934637E+00 2.4397702460063497E+00 2.4410324707951143E+00 2.4422947667508423E+00 2.4435571338646254E+00 + 2.4448195721275572E+00 2.4460820815307383E+00 2.4473446620652712E+00 2.4486073137222641E+00 2.4498700364928294E+00 + 2.4511328303680848E+00 2.4523956953391512E+00 2.4536586313971540E+00 2.4549216385332229E+00 2.4561847167384929E+00 + 2.4574478660041046E+00 2.4587110863211974E+00 2.4599743776809189E+00 2.4612377400744228E+00 2.4625011734928655E+00 + 2.4637646779274061E+00 2.4650282533692107E+00 2.4662918998094487E+00 2.4675556172392934E+00 2.4688194056499220E+00 + 2.4700832650325184E+00 2.4713471953782675E+00 2.4726111966783622E+00 2.4738752689239969E+00 2.4751394121063712E+00 + 2.4764036262166891E+00 2.4776679112461593E+00 2.4789322671859946E+00 2.4801966940274118E+00 2.4814611917616318E+00 + 2.4827257603798811E+00 2.4839903998733899E+00 2.4852551102333917E+00 2.4865198914511257E+00 2.4877847435178366E+00 + 2.4890496664247670E+00 2.4903146601631718E+00 2.4915797247243057E+00 2.4928448600994284E+00 2.4941100662798057E+00 + 2.4953753432567054E+00 2.4966406910214021E+00 2.4979061095651711E+00 2.4991715988792946E+00 2.5004371589550587E+00 + 2.5017027897837552E+00 2.5029684913566754E+00 2.5042342636651203E+00 2.5055001067003921E+00 2.5067660204537980E+00 + 2.5080320049166493E+00 2.5092980600802641E+00 2.5105641859359586E+00 2.5118303824750603E+00 2.5130966496888960E+00 + 2.5143629875687989E+00 2.5156293961061067E+00 2.5168958752921609E+00 2.5181624251183092E+00 2.5194290455758961E+00 + 2.5206957366562781E+00 2.5219624983508142E+00 2.5232293306508664E+00 2.5244962335478021E+00 2.5257632070329916E+00 + 2.5270302510978109E+00 2.5282973657336392E+00 2.5295645509318589E+00 2.5308318066838611E+00 2.5320991329810343E+00 + 2.5333665298147765E+00 2.5346339971764897E+00 2.5359015350575769E+00 2.5371691434494470E+00 2.5384368223435132E+00 + 2.5397045717311939E+00 2.5409723916039106E+00 2.5422402819530880E+00 2.5435082427701570E+00 2.5447762740465518E+00 + 2.5460443757737115E+00 2.5473125479430787E+00 2.5485807905460973E+00 2.5498491035742203E+00 2.5511174870189022E+00 + 2.5523859408716030E+00 2.5536544651237865E+00 2.5549230597669190E+00 2.5561917247924737E+00 2.5574604601919253E+00 + 2.5587292659567553E+00 2.5599981420784461E+00 2.5612670885484889E+00 2.5625361053583742E+00 2.5638051924995997E+00 + 2.5650743499636657E+00 2.5663435777420776E+00 2.5676128758263452E+00 2.5688822442079804E+00 2.5701516828785027E+00 + 2.5714211918294327E+00 2.5726907710522955E+00 2.5739604205386226E+00 2.5752301402799467E+00 2.5764999302678064E+00 + 2.5777697904937473E+00 2.5790397209493108E+00 2.5803097216260475E+00 2.5815797925155155E+00 2.5828499336092712E+00 + 2.5841201448988786E+00 2.5853904263759038E+00 2.5866607780319195E+00 2.5879311998585002E+00 2.5892016918472249E+00 + 2.5904722539896774E+00 2.5917428862774448E+00 2.5930135887021195E+00 2.5942843612552964E+00 2.5955552039285754E+00 + 2.5968261167135620E+00 2.5980970996018620E+00 2.5993681525850891E+00 2.6006392756548586E+00 2.6019104688027910E+00 + 2.6031817320205102E+00 2.6044530652996460E+00 2.6057244686318302E+00 2.6069959420086981E+00 2.6082674854218943E+00 + 2.6095390988630585E+00 2.6108107823238407E+00 2.6120825357958952E+00 2.6133543592708772E+00 2.6146262527404498E+00 + 2.6158982161962760E+00 2.6171702496300253E+00 2.6184423530333718E+00 2.6197145263979915E+00 2.6209867697155662E+00 + 2.6222590829777803E+00 2.6235314661763245E+00 2.6248039193028907E+00 2.6260764423491754E+00 2.6273490353068829E+00 + 2.6286216981677155E+00 2.6298944309233852E+00 2.6311672335656029E+00 2.6324401060860874E+00 2.6337130484765598E+00 + 2.6349860607287470E+00 2.6362591428343762E+00 2.6375322947851845E+00 2.6388055165729045E+00 2.6400788081892803E+00 + 2.6413521696260567E+00 2.6426256008749833E+00 2.6438991019278149E+00 2.6451726727763063E+00 2.6464463134122225E+00 + 2.6477200238273260E+00 2.6489938040133878E+00 2.6502676539621812E+00 2.6515415736654839E+00 2.6528155631150767E+00 + 2.6540896223027448E+00 2.6553637512202783E+00 2.6566379498594701E+00 2.6579122182121178E+00 2.6591865562700234E+00 + 2.6604609640249905E+00 2.6617354414688297E+00 2.6630099885933527E+00 2.6642846053903781E+00 2.6655592918517272E+00 + 2.6668340479692239E+00 2.6681088737347007E+00 2.6693837691399858E+00 2.6706587341769166E+00 2.6719337688373348E+00 + 2.6732088731130870E+00 2.6744840469960205E+00 2.6757592904779877E+00 2.6770346035508461E+00 2.6783099862064561E+00 + 2.6795854384366824E+00 2.6808609602333919E+00 2.6821365515884574E+00 2.6834122124937574E+00 2.6846879429411699E+00 + 2.6859637429225796E+00 2.6872396124298743E+00 2.6885155514549459E+00 2.6897915599896907E+00 2.6910676380260088E+00 + 2.6923437855558032E+00 2.6936200025709818E+00 2.6948962890634558E+00 2.6961726450251398E+00 2.6974490704479548E+00 + 2.6987255653238265E+00 2.7000021296446746E+00 2.7012787634024353E+00 2.7025554665890419E+00 2.7038322391964327E+00 + 2.7051090812165528E+00 2.7063859926413460E+00 2.7076629734627642E+00 2.7089400236727608E+00 2.7102171432632942E+00 + 2.7114943322263270E+00 2.7127715905538250E+00 2.7140489182377565E+00 2.7153263152700973E+00 2.7166037816428230E+00 + 2.7178813173479166E+00 2.7191589223773613E+00 2.7204365967231485E+00 2.7217143403772686E+00 2.7229921533317212E+00 + 2.7242700355785039E+00 2.7255479871096231E+00 2.7268260079170874E+00 2.7281040979929099E+00 2.7293822573291027E+00 + 2.7306604859176873E+00 2.7319387837506879E+00 2.7332171508201326E+00 2.7344955871180514E+00 2.7357740926364804E+00 + 2.7370526673674576E+00 2.7383313113030274E+00 2.7396100244352346E+00 2.7408888067561317E+00 2.7421676582577716E+00 + 2.7434465789322124E+00 2.7447255687715160E+00 2.7460046277677481E+00 2.7472837559129788E+00 2.7485629531992806E+00 + 2.7498422196187313E+00 2.7511215551634125E+00 2.7524009598254069E+00 2.7536804335968039E+00 2.7549599764696961E+00 + 2.7562395884361792E+00 2.7575192694883550E+00 2.7587990196183267E+00 2.7600788388181980E+00 2.7613587270800832E+00 + 2.7626386843960962E+00 2.7639187107583578E+00 2.7651988061589887E+00 2.7664789705901160E+00 2.7677592040438688E+00 + 2.7690395065123816E+00 2.7703198779877933E+00 2.7716003184622440E+00 2.7728808279278798E+00 2.7741614063768489E+00 + 2.7754420538013034E+00 2.7767227701934010E+00 2.7780035555453022E+00 2.7792844098491694E+00 2.7805653330971709E+00 + 2.7818463252814793E+00 2.7831273863942689E+00 2.7844085164277175E+00 2.7856897153740103E+00 2.7869709832253315E+00 + 2.7882523199738753E+00 2.7895337256118298E+00 2.7908152001313953E+00 2.7920967435247732E+00 2.7933783557841685E+00 + 2.7946600369017909E+00 2.7959417868698511E+00 2.7972236056805668E+00 2.7985054933261582E+00 2.7997874497988469E+00 + 2.8010694750908622E+00 2.8023515691944354E+00 2.8036337321018006E+00 2.8049159638051959E+00 2.8061982642968641E+00 + 2.8074806335690519E+00 2.8087630716140075E+00 2.8100455784239848E+00 2.8113281539912407E+00 2.8126107983080360E+00 + 2.8138935113666368E+00 2.8151762931593076E+00 2.8164591436783231E+00 2.8177420629159586E+00 2.8190250508644943E+00 + 2.8203081075162091E+00 2.8215912328633910E+00 2.8228744268983328E+00 2.8241576896133251E+00 2.8254410210006657E+00 + 2.8267244210526594E+00 2.8280078897616066E+00 2.8292914271198191E+00 2.8305750331196076E+00 2.8318587077532875E+00 + 2.8331424510131797E+00 2.8344262628916064E+00 2.8357101433808953E+00 2.8369940924733763E+00 2.8382781101613834E+00 + 2.8395621964372544E+00 2.8408463512933313E+00 2.8421305747219598E+00 2.8434148667154857E+00 2.8446992272662643E+00 + 2.8459836563666503E+00 2.8472681540090043E+00 2.8485527201856877E+00 2.8498373548890710E+00 2.8511220581115206E+00 + 2.8524068298454117E+00 2.8536916700831232E+00 2.8549765788170358E+00 2.8562615560395344E+00 2.8575466017430085E+00 + 2.8588317159198486E+00 2.8601168985624521E+00 2.8614021496632183E+00 2.8626874692145496E+00 2.8639728572088545E+00 + 2.8652583136385408E+00 2.8665438384960238E+00 2.8678294317737203E+00 2.8691150934640515E+00 2.8704008235594416E+00 + 2.8716866220523207E+00 2.8729724889351202E+00 2.8742584242002738E+00 2.8755444278402225E+00 2.8768304998474075E+00 + 2.8781166402142753E+00 2.8794028489332799E+00 2.8806891259968674E+00 2.8819754713974985E+00 2.8832618851276326E+00 + 2.8845483671797352E+00 2.8858349175462732E+00 2.8871215362197180E+00 2.8884082231925454E+00 2.8896949784572317E+00 + 2.8909818020062592E+00 2.8922686938321149E+00 2.8935556539272875E+00 2.8948426822842674E+00 2.8961297788955545E+00 + 2.8974169437536452E+00 2.8987041768510444E+00 2.8999914781802589E+00 2.9012788477337987E+00 2.9025662855041769E+00 + 2.9038537914839124E+00 2.9051413656655249E+00 2.9064290080415405E+00 2.9077167186044859E+00 2.9090044973468938E+00 + 2.9102923442613005E+00 2.9115802593402398E+00 2.9128682425762573E+00 2.9141562939618981E+00 2.9154444134897108E+00 + 2.9167326011522499E+00 2.9180208569420696E+00 2.9193091808517306E+00 2.9205975728737963E+00 2.9218860330008338E+00 + 2.9231745612254127E+00 2.9244631575401074E+00 2.9257518219374958E+00 2.9270405544101559E+00 2.9283293549506757E+00 + 2.9296182235516404E+00 2.9309071602056425E+00 2.9321961649052763E+00 2.9334852376431404E+00 2.9347743784118374E+00 + 2.9360635872039706E+00 2.9373528640121500E+00 2.9386422088289881E+00 2.9399316216471001E+00 2.9412211024591080E+00 + 2.9425106512576296E+00 2.9438002680352939E+00 2.9450899527847287E+00 2.9463797054985696E+00 2.9476695261694519E+00 + 2.9489594147900151E+00 2.9502493713529039E+00 2.9515393958507650E+00 2.9528294882762496E+00 2.9541196486220098E+00 + 2.9554098768807044E+00 2.9567001730449927E+00 2.9579905371075412E+00 2.9592809690610160E+00 2.9605714688980895E+00 + 2.9618620366114348E+00 2.9631526721937318E+00 2.9644433756376594E+00 2.9657341469359055E+00 2.9670249860811575E+00 + 2.9683158930661064E+00 2.9696068678834480E+00 2.9708979105258839E+00 2.9721890209861108E+00 2.9734801992568376E+00 + 2.9747714453307723E+00 2.9760627592006279E+00 2.9773541408591204E+00 2.9786455902989677E+00 2.9799371075128942E+00 + 2.9812286924936253E+00 2.9825203452338909E+00 2.9838120657264238E+00 2.9851038539639596E+00 2.9863957099392402E+00 + 2.9876876336450056E+00 2.9889796250740042E+00 2.9902716842189867E+00 2.9915638110727061E+00 2.9928560056279188E+00 + 2.9941482678773839E+00 2.9954405978138667E+00 2.9967329954301336E+00 2.9980254607189547E+00 2.9993179936731051E+00 + 3.0006105942853600E+00 3.0019032625485038E+00 3.0031959984553138E+00 3.0044888019985820E+00 3.0057816731710982E+00 + 3.0070746119656557E+00 3.0083676183750532E+00 3.0096606923920901E+00 3.0109538340095714E+00 3.0122470432203050E+00 + 3.0135403200171020E+00 3.0148336643927753E+00 3.0161270763401435E+00 3.0174205558520280E+00 3.0187141029212525E+00 + 3.0200077175406448E+00 3.0213013997030371E+00 3.0225951494012624E+00 3.0238889666281583E+00 3.0251828513765671E+00 + 3.0264768036393330E+00 3.0277708234093033E+00 3.0290649106793301E+00 3.0303590654422674E+00 3.0316532876909728E+00 + 3.0329475774183110E+00 3.0342419346171399E+00 3.0355363592803322E+00 3.0368308514007571E+00 3.0381254109712890E+00 + 3.0394200379848075E+00 3.0407147324341937E+00 3.0420094943123304E+00 3.0433043236121069E+00 3.0445992203264143E+00 + 3.0458941844481462E+00 3.0471892159701999E+00 3.0484843148854792E+00 3.0497794811868868E+00 3.0510747148673301E+00 + 3.0523700159197213E+00 3.0536653843369725E+00 3.0549608201120040E+00 3.0562563232377364E+00 3.0575518937070925E+00 + 3.0588475315130013E+00 3.0601432366483929E+00 3.0614390091062029E+00 3.0627348488793693E+00 3.0640307559608280E+00 + 3.0653267303435263E+00 3.0666227720204136E+00 3.0679188809844362E+00 3.0692150572285506E+00 3.0705113007457139E+00 + 3.0718076115288873E+00 3.0731039895710315E+00 3.0744004348651179E+00 3.0756969474041131E+00 3.0769935271809921E+00 + 3.0782901741887332E+00 3.0795868884203141E+00 3.0808836698687201E+00 3.0821805185269362E+00 3.0834774343879530E+00 + 3.0847744174447644E+00 3.0860714676903651E+00 3.0873685851177575E+00 3.0886657697199427E+00 3.0899630214899272E+00 + 3.0912603404207202E+00 3.0925577265053343E+00 3.0938551797367895E+00 3.0951527001080983E+00 3.0964502876122864E+00 + 3.0977479422423801E+00 3.0990456639914057E+00 3.1003434528523988E+00 3.1016413088183938E+00 3.1029392318824272E+00 + 3.1042372220375443E+00 3.1055352792767872E+00 3.1068334035932073E+00 3.1081315949798527E+00 3.1094298534297811E+00 + 3.1107281789360486E+00 3.1120265714917181E+00 3.1133250310898530E+00 3.1146235577235211E+00 3.1159221513857935E+00 + 3.1172208120697436E+00 3.1185195397684504E+00 3.1198183344749926E+00 3.1211171961824551E+00 3.1224161248839239E+00 + 3.1237151205724913E+00 3.1250141832412512E+00 3.1263133128832941E+00 3.1276125094917258E+00 3.1289117730596461E+00 + 3.1302111035801636E+00 3.1315105010463857E+00 3.1328099654514254E+00 3.1341094967883998E+00 3.1354090950504254E+00 + 3.1367087602306265E+00 3.1380084923221285E+00 3.1393082913180570E+00 3.1406081572115481E+00 3.1419080899957321E+00 + 3.1432080896637502E+00 3.1445081562087429E+00 3.1458082896238539E+00 3.1471084899022306E+00 3.1484087570370258E+00 + 3.1497090910213905E+00 3.1510094918484834E+00 3.1523099595114648E+00 3.1536104940034972E+00 3.1549110953177513E+00 + 3.1562117634473892E+00 3.1575124983855893E+00 3.1588133001255256E+00 3.1601141686603773E+00 3.1614151039833276E+00 + 3.1627161060875606E+00 3.1640171749662671E+00 3.1653183106126370E+00 3.1666195130198660E+00 3.1679207821811528E+00 + 3.1692221180896967E+00 3.1705235207387035E+00 3.1718249901213809E+00 3.1731265262309387E+00 3.1744281290605909E+00 + 3.1757297986035553E+00 3.1770315348530498E+00 3.1783333378022993E+00 3.1796352074445302E+00 3.1809371437729710E+00 + 3.1822391467808542E+00 3.1835412164614163E+00 3.1848433528078939E+00 3.1861455558135345E+00 3.1874478254715761E+00 + 3.1887501617752694E+00 3.1900525647178664E+00 3.1913550342926222E+00 3.1926575704927913E+00 3.1939601733116363E+00 + 3.1952628427424217E+00 3.1965655787784111E+00 3.1978683814128783E+00 3.1991712506390932E+00 3.2004741864503332E+00 + 3.2017771888398783E+00 3.2030802578010089E+00 3.2043833933270109E+00 3.2056865954111733E+00 3.2069898640467867E+00 + 3.2082931992271471E+00 3.2095966009455510E+00 3.2109000691952989E+00 3.2122036039696966E+00 3.2135072052620499E+00 + 3.2148108730656673E+00 3.2161146073738660E+00 3.2174184081799573E+00 3.2187222754772624E+00 3.2200262092591050E+00 + 3.2213302095188077E+00 3.2226342762497011E+00 3.2239384094451164E+00 3.2252426090983883E+00 3.2265468752028532E+00 + 3.2278512077518542E+00 3.2291556067387317E+00 3.2304600721568355E+00 3.2317646039995136E+00 3.2330692022601202E+00 + 3.2343738669320108E+00 3.2356785980085436E+00 3.2369833954830827E+00 3.2382882593489919E+00 3.2395931895996384E+00 + 3.2408981862283954E+00 3.2422032492286355E+00 3.2435083785937375E+00 3.2448135743170816E+00 3.2461188363920495E+00 + 3.2474241648120326E+00 3.2487295595704131E+00 3.2500350206605866E+00 3.2513405480759494E+00 3.2526461418098989E+00 + 3.2539518018558375E+00 3.2552575282071694E+00 3.2565633208573033E+00 3.2578691797996475E+00 3.2591751050276172E+00 + 3.2604810965346291E+00 3.2617871543141028E+00 3.2630932783594604E+00 3.2643994686641289E+00 3.2657057252215353E+00 + 3.2670120480251121E+00 3.2683184370682952E+00 3.2696248923445199E+00 3.2709314138472299E+00 3.2722380015698653E+00 + 3.2735446555058760E+00 3.2748513756487108E+00 3.2761581619918223E+00 3.2774650145286661E+00 3.2787719332527030E+00 + 3.2800789181573906E+00 3.2813859692361964E+00 3.2826930864825865E+00 3.2840002698900315E+00 3.2853075194520076E+00 + 3.2866148351619890E+00 3.2879222170134570E+00 3.2892296649998936E+00 3.2905371791147835E+00 3.2918447593516156E+00 + 3.2931524057038848E+00 3.2944601181650794E+00 3.2957678967287021E+00 3.2970757413882499E+00 3.2983836521372289E+00 + 3.2996916289691436E+00 3.3009996718775048E+00 3.3023077808558221E+00 3.3036159558976146E+00 3.3049241969963985E+00 + 3.3062325041456946E+00 3.3075408773390276E+00 3.3088493165699275E+00 3.3101578218319188E+00 3.3114663931185371E+00 + 3.3127750304233188E+00 3.3140837337398033E+00 3.3153925030615294E+00 3.3167013383820461E+00 3.3180102396948978E+00 + 3.3193192069936379E+00 3.3206282402718168E+00 3.3219373395229939E+00 3.3232465047407267E+00 3.3245557359185800E+00 + 3.3258650330501167E+00 3.3271743961289064E+00 3.3284838251485200E+00 3.3297933201025307E+00 3.3311028809845178E+00 + 3.3324125077880589E+00 3.3337222005067391E+00 3.3350319591341422E+00 3.3363417836638587E+00 3.3376516740894795E+00 + 3.3389616304045995E+00 3.3402716526028176E+00 3.3415817406777300E+00 3.3428918946229427E+00 3.3442021144320613E+00 + 3.3455124000986958E+00 3.3468227516164570E+00 3.3481331689789613E+00 3.3494436521798265E+00 3.3507542012126721E+00 + 3.3520648160711222E+00 3.3533754967488045E+00 3.3546862432393469E+00 3.3559970555363825E+00 3.3573079336335461E+00 + 3.3586188775244765E+00 3.3599298872028145E+00 3.3612409626622024E+00 3.3625521038962907E+00 3.3638633108987257E+00 + 3.3651745836631606E+00 3.3664859221832524E+00 3.3677973264526564E+00 3.3691087964650381E+00 3.3704203322140573E+00 + 3.3717319336933862E+00 3.3730436008966884E+00 3.3743553338176389E+00 3.3756671324499155E+00 3.3769789967871926E+00 + 3.3782909268231558E+00 3.3796029225514865E+00 3.3809149839658730E+00 3.3822271110600033E+00 3.3835393038275723E+00 + 3.3848515622622757E+00 3.3861638863578110E+00 3.3874762761078774E+00 3.3887887315061831E+00 3.3901012525464327E+00 + 3.3914138392223370E+00 3.3927264915276076E+00 3.3940392094559613E+00 3.3953519930011158E+00 3.3966648421567935E+00 + 3.3979777569167160E+00 3.3992907372746139E+00 3.4006037832242137E+00 3.4019168947592515E+00 3.4032300718734585E+00 + 3.4045433145605748E+00 3.4058566228143414E+00 3.4071699966285034E+00 3.4084834359968061E+00 3.4097969409129996E+00 + 3.4111105113708367E+00 3.4124241473640717E+00 3.4137378488864636E+00 3.4150516159317736E+00 3.4163654484937647E+00 + 3.4176793465662039E+00 3.4189933101428598E+00 3.4203073392175050E+00 3.4216214337839141E+00 3.4229355938358661E+00 + 3.4242498193671409E+00 3.4255641103715218E+00 3.4268784668427950E+00 3.4281928887747495E+00 3.4295073761611774E+00 + 3.4308219289958743E+00 3.4321365472726351E+00 3.4334512309852641E+00 3.4347659801275592E+00 3.4360807946933289E+00 + 3.4373956746763814E+00 3.4387106200705286E+00 3.4400256308695845E+00 3.4413407070673654E+00 3.4426558486576928E+00 + 3.4439710556343872E+00 3.4452863279912753E+00 3.4466016657221847E+00 3.4479170688209471E+00 3.4492325372813952E+00 + 3.4505480710973666E+00 3.4518636702626990E+00 3.4531793347712361E+00 3.4544950646168218E+00 3.4558108597933033E+00 + 3.4571267202945313E+00 3.4584426461143596E+00 3.4597586372466433E+00 3.4610746936852408E+00 3.4623908154240155E+00 + 3.4637070024568279E+00 3.4650232547775524E+00 3.4663395723800488E+00 3.4676559552581949E+00 3.4689724034058655E+00 + 3.4702889168169384E+00 3.4716054954852935E+00 3.4729221394048153E+00 3.4742388485693905E+00 3.4755556229729070E+00 + 3.4768724626092573E+00 3.4781893674723343E+00 3.4795063375560380E+00 3.4808233728542644E+00 3.4821404733609214E+00 + 3.4834576390699090E+00 3.4847748699751384E+00 3.4860921660705220E+00 3.4874095273499699E+00 3.4887269538074008E+00 + 3.4900444454367321E+00 3.4913620022318881E+00 3.4926796241867910E+00 3.4939973112953693E+00 3.4953150635515562E+00 + 3.4966328809492775E+00 3.4979507634824731E+00 3.4992687111450809E+00 3.5005867239310402E+00 3.5019048018342960E+00 + 3.5032229448487944E+00 3.5045411529684847E+00 3.5058594261873179E+00 3.5071777644992501E+00 3.5084961678982367E+00 + 3.5098146363782390E+00 3.5111331699332191E+00 3.5124517685571415E+00 3.5137704322439758E+00 3.5150891609876918E+00 + 3.5164079547822631E+00 3.5177268136216657E+00 3.5190457374998783E+00 3.5203647264108833E+00 3.5216837803486647E+00 + 3.5230028993072087E+00 3.5243220832805062E+00 3.5256413322625475E+00 3.5269606462473324E+00 3.5282800252288515E+00 + 3.5295994692011088E+00 3.5309189781581081E+00 3.5322385520938537E+00 3.5335581910023537E+00 3.5348778948776212E+00 + 3.5361976637136685E+00 3.5375174975045129E+00 3.5388373962441739E+00 3.5401573599266714E+00 3.5414773885460309E+00 + 3.5427974820962804E+00 3.5441176405714492E+00 3.5454378639655699E+00 3.5467581522726772E+00 3.5480785054868083E+00 + 3.5493989236020056E+00 3.5507194066123109E+00 3.5520399545117698E+00 3.5533605672944319E+00 3.5546812449543483E+00 + 3.5560019874855722E+00 3.5573227948821597E+00 3.5586436671381736E+00 3.5599646042476691E+00 3.5612856062047151E+00 + 3.5626066730033759E+00 3.5639278046377236E+00 3.5652490011018303E+00 3.5665702623897708E+00 3.5678915884956210E+00 + 3.5692129794134644E+00 3.5705344351373820E+00 3.5718559556614582E+00 3.5731775409797835E+00 3.5744991910864474E+00 + 3.5758209059755441E+00 3.5771426856411690E+00 3.5784645300774218E+00 3.5797864392784025E+00 3.5811084132382165E+00 + 3.5824304519509695E+00 3.5837525554107716E+00 3.5850747236117337E+00 3.5863969565479721E+00 3.5877192542136007E+00 + 3.5890416166027443E+00 3.5903640437095197E+00 3.5916865355280558E+00 3.5930090920524771E+00 3.5943317132769161E+00 + 3.5956543991955039E+00 3.5969771498023775E+00 3.5982999650916745E+00 3.5996228450575352E+00 3.6009457896941033E+00 + 3.6022687989955249E+00 3.6035918729559469E+00 3.6049150115695223E+00 3.6062382148304040E+00 3.6075614827327480E+00 + 3.6088848152707143E+00 3.6102082124384616E+00 3.6115316742301586E+00 3.6128552006399666E+00 3.6141787916620594E+00 + 3.6155024472906065E+00 3.6168261675197830E+00 3.6181499523437646E+00 3.6194738017567327E+00 3.6207977157528717E+00 + 3.6221216943263594E+00 3.6234457374713887E+00 3.6247698451821480E+00 3.6260940174528287E+00 3.6274182542776270E+00 + 3.6287425556507418E+00 3.6300669215663719E+00 3.6313913520187202E+00 3.6327158470019927E+00 3.6340404065103971E+00 + 3.6353650305381420E+00 3.6366897190794445E+00 3.6380144721285173E+00 3.6393392896795795E+00 3.6406641717268520E+00 + 3.6419891182645570E+00 3.6433141292869218E+00 3.6446392047881746E+00 3.6459643447625467E+00 3.6472895492042712E+00 + 3.6486148181075841E+00 3.6499401514667245E+00 3.6512655492759367E+00 3.6525910115294566E+00 3.6539165382215373E+00 + 3.6552421293464255E+00 3.6565677848983724E+00 3.6578935048716330E+00 3.6592192892604629E+00 3.6605451380591219E+00 + 3.6618710512618713E+00 3.6631970288629754E+00 3.6645230708567005E+00 3.6658491772373161E+00 3.6671753479990943E+00 + 3.6685015831363081E+00 3.6698278826432373E+00 3.6711542465141580E+00 3.6724806747433547E+00 3.6738071673251098E+00 + 3.6751337242537110E+00 3.6764603455234481E+00 3.6777870311286120E+00 3.6791137810634993E+00 3.6804405953224064E+00 + 3.6817674738996309E+00 3.6830944167894799E+00 3.6844214239862523E+00 3.6857484954842561E+00 3.6870756312778039E+00 + 3.6884028313612047E+00 3.6897300957287760E+00 3.6910574243748329E+00 3.6923848172936959E+00 3.6937122744796875E+00 + 3.6950397959271317E+00 3.6963673816303566E+00 3.6976950315836912E+00 3.6990227457814679E+00 3.7003505242180208E+00 + 3.7016783668876894E+00 3.7030062737848102E+00 3.7043342449037278E+00 3.7056622802387862E+00 3.7069903797843331E+00 + 3.7083185435347175E+00 3.7096467714842905E+00 3.7109750636274086E+00 3.7123034199584288E+00 3.7136318404717095E+00 + 3.7149603251616168E+00 3.7162888740225086E+00 3.7176174870487562E+00 3.7189461642347297E+00 3.7202749055747990E+00 + 3.7216037110633393E+00 3.7229325806947284E+00 3.7242615144633455E+00 3.7255905123635729E+00 3.7269195743897932E+00 + 3.7282487005363958E+00 3.7295778907977692E+00 3.7309071451683051E+00 3.7322364636423973E+00 3.7335658462144434E+00 + 3.7348952928788424E+00 3.7362248036299963E+00 3.7375543784623080E+00 3.7388840173701858E+00 3.7402137203480379E+00 + 3.7415434873902766E+00 3.7428733184913150E+00 3.7442032136455707E+00 3.7455331728474639E+00 3.7468631960914114E+00 + 3.7481932833718399E+00 3.7495234346831752E+00 3.7508536500198466E+00 3.7521839293762849E+00 3.7535142727469246E+00 + 3.7548446801262001E+00 3.7561751515085509E+00 3.7575056868884178E+00 3.7588362862602445E+00 3.7601669496184766E+00 + 3.7614976769575632E+00 3.7628284682719526E+00 3.7641593235561008E+00 3.7654902428044630E+00 3.7668212260114950E+00 + 3.7681522731716584E+00 3.7694833842794178E+00 3.7708145593292355E+00 + 1.2958085329481928E-01 1.2958084943300893E-01 1.2958083784757826E-01 1.2958081853852829E-01 1.2958079150586077E-01 + 1.2958075674957811E-01 1.2958071426968340E-01 1.2958066406618043E-01 1.2958060613907371E-01 1.2958054048836845E-01 + 1.2958046711407045E-01 1.2958038601618627E-01 1.2958029719472322E-01 1.2958020064968923E-01 1.2958009638109280E-01 + 1.2957998438894344E-01 1.2957986467325097E-01 1.2957973723402622E-01 1.2957960207128050E-01 1.2957945918502589E-01 + 1.2957930857527514E-01 1.2957915024204175E-01 1.2957898418533975E-01 1.2957881040518404E-01 1.2957862890159008E-01 + 1.2957843967457405E-01 1.2957824272415286E-01 1.2957803805034404E-01 1.2957782565316583E-01 1.2957760553263714E-01 + 1.2957737768877767E-01 1.2957714212160759E-01 1.2957689883114798E-01 1.2957664781742037E-01 1.2957638908044719E-01 + 1.2957612262025145E-01 1.2957584843685682E-01 1.2957556653028771E-01 1.2957527690056914E-01 1.2957497954772679E-01 + 1.2957467447178722E-01 1.2957436167277739E-01 1.2957404115072510E-01 1.2957371290565878E-01 1.2957337693760754E-01 + 1.2957303324660116E-01 1.2957268183267012E-01 1.2957232269584554E-01 1.2957195583615919E-01 1.2957158125364351E-01 + 1.2957119894833172E-01 1.2957080892025760E-01 1.2957041116945558E-01 1.2957000569596086E-01 1.2956959249980923E-01 + 1.2956917158103709E-01 1.2956874293968165E-01 1.2956830657578070E-01 1.2956786248937260E-01 1.2956741068049660E-01 + 1.2956695114919242E-01 1.2956648389550049E-01 1.2956600891946188E-01 1.2956552622111839E-01 1.2956503580051237E-01 + 1.2956453765768688E-01 1.2956403179268566E-01 1.2956351820555304E-01 1.2956299689633405E-01 1.2956246786507433E-01 + 1.2956193111182018E-01 1.2956138663661856E-01 1.2956083443951710E-01 1.2956027452056396E-01 1.2955970687980811E-01 + 1.2955913151729903E-01 1.2955854843308687E-01 1.2955795762722244E-01 1.2955735909975719E-01 1.2955675285074317E-01 + 1.2955613888023312E-01 1.2955551718828037E-01 1.2955488777493887E-01 1.2955425064026324E-01 1.2955360578430869E-01 + 1.2955295320713109E-01 1.2955229290878689E-01 1.2955162488933325E-01 1.2955094914882787E-01 1.2955026568732905E-01 + 1.2954957450489576E-01 1.2954887560158765E-01 1.2954816897746485E-01 1.2954745463258818E-01 1.2954673256701910E-01 + 1.2954600278081957E-01 1.2954526527405233E-01 1.2954452004678055E-01 1.2954376709906804E-01 1.2954300643097932E-01 + 1.2954223804257944E-01 1.2954146193393407E-01 1.2954067810510939E-01 1.2953988655617232E-01 1.2953908728719027E-01 + 1.2953828029823125E-01 1.2953746558936396E-01 1.2953664316065752E-01 1.2953581301218176E-01 1.2953497514400711E-01 + 1.2953412955620444E-01 1.2953327624884536E-01 1.2953241522200196E-01 1.2953154647574697E-01 1.2953067001015361E-01 + 1.2952978582529576E-01 1.2952889392124783E-01 1.2952799429808484E-01 1.2952708695588225E-01 1.2952617189471619E-01 + 1.2952524911466337E-01 1.2952431861580099E-01 1.2952338039820685E-01 1.2952243446195930E-01 1.2952148080713718E-01 + 1.2952051943382001E-01 1.2951955034208770E-01 1.2951857353202084E-01 1.2951758900370050E-01 1.2951659675720828E-01 + 1.2951559679262634E-01 1.2951458911003735E-01 1.2951357370952463E-01 1.2951255059117184E-01 1.2951151975506334E-01 + 1.2951048120128383E-01 1.2950943492991879E-01 1.2950838094105399E-01 1.2950731923477579E-01 1.2950624981117112E-01 + 1.2950517267032743E-01 1.2950408781233258E-01 1.2950299523727496E-01 1.2950189494524361E-01 1.2950078693632786E-01 + 1.2949967121061770E-01 1.2949854776820355E-01 1.2949741660917632E-01 1.2949627773362749E-01 1.2949513114164896E-01 + 1.2949397683333302E-01 1.2949281480877267E-01 1.2949164506806130E-01 1.2949046761129263E-01 1.2948928243856106E-01 + 1.2948808954996135E-01 1.2948688894558880E-01 1.2948568062553914E-01 1.2948446458990850E-01 1.2948324083879362E-01 + 1.2948200937229157E-01 1.2948077019049992E-01 1.2947952329351670E-01 1.2947826868144044E-01 1.2947700635436998E-01 + 1.2947573631240472E-01 1.2947445855564449E-01 1.2947317308418951E-01 1.2947187989814046E-01 1.2947057899759842E-01 + 1.2946927038266504E-01 1.2946795405344216E-01 1.2946663001003225E-01 1.2946529825253802E-01 1.2946395878106282E-01 + 1.2946261159571024E-01 1.2946125669658431E-01 1.2945989408378947E-01 1.2945852375743061E-01 1.2945714571761299E-01 + 1.2945575996444225E-01 1.2945436649802441E-01 1.2945296531846598E-01 1.2945155642587372E-01 1.2945013982035483E-01 + 1.2944871550201692E-01 1.2944728347096796E-01 1.2944584372731632E-01 1.2944439627117063E-01 1.2944294110264004E-01 + 1.2944147822183394E-01 1.2944000762886215E-01 1.2943852932383482E-01 1.2943704330686243E-01 1.2943554957805589E-01 + 1.2943404813752629E-01 1.2943253898538534E-01 1.2943102212174476E-01 1.2942949754671684E-01 1.2942796526041414E-01 + 1.2942642526294951E-01 1.2942487755443610E-01 1.2942332213498750E-01 1.2942175900471753E-01 1.2942018816374029E-01 + 1.2941860961217030E-01 1.2941702335012231E-01 1.2941542937771133E-01 1.2941382769505272E-01 1.2941221830226218E-01 + 1.2941060119945563E-01 1.2940897638674934E-01 1.2940734386425978E-01 1.2940570363210371E-01 1.2940405569039828E-01 + 1.2940240003926076E-01 1.2940073667880875E-01 1.2939906560916017E-01 1.2939738683043309E-01 1.2939570034274592E-01 + 1.2939400614621729E-01 1.2939230424096604E-01 1.2939059462711133E-01 1.2938887730477250E-01 1.2938715227406913E-01 + 1.2938541953512114E-01 1.2938367908804843E-01 1.2938193093297137E-01 1.2938017507001040E-01 1.2937841149928628E-01 + 1.2937664022091988E-01 1.2937486123503233E-01 1.2937307454174496E-01 1.2937128014117935E-01 1.2936947803345711E-01 + 1.2936766821870013E-01 1.2936585069703060E-01 1.2936402546857073E-01 1.2936219253344297E-01 1.2936035189176995E-01 + 1.2935850354367442E-01 1.2935664748927933E-01 1.2935478372870776E-01 1.2935291226208301E-01 1.2935103308952850E-01 + 1.2934914621116772E-01 1.2934725162712438E-01 1.2934534933752229E-01 1.2934343934248549E-01 1.2934152164213802E-01 + 1.2933959623660402E-01 1.2933766312600792E-01 1.2933572231047413E-01 1.2933377379012717E-01 1.2933181756509171E-01 + 1.2932985363549254E-01 1.2932788200145443E-01 1.2932590266310237E-01 1.2932391562056145E-01 1.2932192087395666E-01 + 1.2931991842341323E-01 1.2931790826905643E-01 1.2931589041101152E-01 1.2931386484940396E-01 1.2931183158435916E-01 + 1.2930979061600259E-01 1.2930774194445982E-01 1.2930568556985644E-01 1.2930362149231808E-01 1.2930154971197033E-01 + 1.2929947022893895E-01 1.2929738304334965E-01 1.2929528815532806E-01 1.2929318556500000E-01 1.2929107527249117E-01 + 1.2928895727792736E-01 1.2928683158143434E-01 1.2928469818313781E-01 1.2928255708316352E-01 1.2928040828163717E-01 + 1.2927825177868446E-01 1.2927608757443110E-01 1.2927391566900268E-01 1.2927173606252479E-01 1.2926954875512298E-01 + 1.2926735374692286E-01 1.2926515103804975E-01 1.2926294062862917E-01 1.2926072251878637E-01 1.2925849670864667E-01 + 1.2925626319833525E-01 1.2925402198797725E-01 1.2925177307769770E-01 1.2924951646762148E-01 1.2924725215787358E-01 + 1.2924498014857863E-01 1.2924270043986136E-01 1.2924041303184622E-01 1.2923811792465775E-01 1.2923581511842011E-01 + 1.2923350461325761E-01 1.2923118640929426E-01 1.2922886050665391E-01 1.2922652690546038E-01 1.2922418560583726E-01 + 1.2922183660790804E-01 1.2921947991179597E-01 1.2921711551762427E-01 1.2921474342551584E-01 1.2921236363559349E-01 + 1.2920997614797988E-01 1.2920758096279741E-01 1.2920517808016826E-01 1.2920276750021453E-01 1.2920034922305798E-01 + 1.2919792324882037E-01 1.2919548957762292E-01 1.2919304820958699E-01 1.2919059914483347E-01 1.2918814238348300E-01 + 1.2918567792565624E-01 1.2918320577147324E-01 1.2918072592105417E-01 1.2917823837451872E-01 1.2917574313198632E-01 + 1.2917324019357623E-01 1.2917072955940737E-01 1.2916821122959835E-01 1.2916568520426769E-01 1.2916315148353333E-01 + 1.2916061006751317E-01 1.2915806095632459E-01 1.2915550415008487E-01 1.2915293964891078E-01 1.2915036745291894E-01 + 1.2914778756222556E-01 1.2914519997694648E-01 1.2914260469719729E-01 1.2914000172309317E-01 1.2913739105474900E-01 + 1.2913477269227924E-01 1.2913214663579803E-01 1.2912951288541916E-01 1.2912687144125604E-01 1.2912422230342158E-01 + 1.2912156547202852E-01 1.2911890094718900E-01 1.2911622872901496E-01 1.2911354881761766E-01 1.2911086121310827E-01 + 1.2910816591559726E-01 1.2910546292519487E-01 1.2910275224201084E-01 1.2910003386615443E-01 1.2909730779773451E-01 + 1.2909457403685951E-01 1.2909183258363738E-01 1.2908908343817554E-01 1.2908632660058109E-01 1.2908356207096053E-01 + 1.2908078984941995E-01 1.2907800993606489E-01 1.2907522233100044E-01 1.2907242703433119E-01 1.2906962404616126E-01 + 1.2906681336659409E-01 1.2906399499573284E-01 1.2906116893367992E-01 1.2905833518053733E-01 1.2905549373640651E-01 + 1.2905264460138838E-01 1.2904978777558324E-01 1.2904692325909087E-01 1.2904405105201047E-01 1.2904117115444069E-01 + 1.2903828356647953E-01 1.2903538828822453E-01 1.2903248531977252E-01 1.2902957466121981E-01 1.2902665631266200E-01 + 1.2902373027419423E-01 1.2902079654591081E-01 1.2901785512790567E-01 1.2901490602027191E-01 1.2901194922310211E-01 + 1.2900898473648806E-01 1.2900601256052105E-01 1.2900303269529165E-01 1.2900004514088978E-01 1.2899704989740460E-01 + 1.2899404696492470E-01 1.2899103634353787E-01 1.2898801803333132E-01 1.2898499203439151E-01 1.2898195834680415E-01 + 1.2897891697065422E-01 1.2897586790602611E-01 1.2897281115300335E-01 1.2896974671166878E-01 1.2896667458210445E-01 + 1.2896359476439173E-01 1.2896050725861119E-01 1.2895741206484265E-01 1.2895430918316511E-01 1.2895119861365686E-01 + 1.2894808035639535E-01 1.2894495441145726E-01 1.2894182077891841E-01 1.2893867945885396E-01 1.2893553045133804E-01 + 1.2893237375644415E-01 1.2892920937424485E-01 1.2892603730481189E-01 1.2892285754821617E-01 1.2891967010452771E-01 + 1.2891647497381578E-01 1.2891327215614864E-01 1.2891006165159377E-01 1.2890684346021772E-01 1.2890361758208616E-01 + 1.2890038401726386E-01 1.2889714276581477E-01 1.2889389382780170E-01 1.2889063720328683E-01 1.2888737289233121E-01 + 1.2888410089499505E-01 1.2888082121133759E-01 1.2887753384141709E-01 1.2887423878529092E-01 1.2887093604301542E-01 + 1.2886762561464596E-01 1.2886430750023703E-01 1.2886098169984200E-01 1.2885764821351334E-01 1.2885430704130246E-01 + 1.2885095818325976E-01 1.2884760163943473E-01 1.2884423740987563E-01 1.2884086549462992E-01 1.2883748589374383E-01 + 1.2883409860726264E-01 1.2883070363523055E-01 1.2882730097769068E-01 1.2882389063468511E-01 1.2882047260625479E-01 + 1.2881704689243970E-01 1.2881361349327861E-01 1.2881017240880915E-01 1.2880672363906795E-01 1.2880326718409058E-01 + 1.2879980304391120E-01 1.2879633121856315E-01 1.2879285170807847E-01 1.2878936451248807E-01 1.2878586963182165E-01 + 1.2878236706610791E-01 1.2877885681537421E-01 1.2877533887964679E-01 1.2877181325895068E-01 1.2876827995330972E-01 + 1.2876473896274662E-01 1.2876119028728281E-01 1.2875763392693837E-01 1.2875406988173235E-01 1.2875049815168252E-01 + 1.2874691873680533E-01 1.2874333163711607E-01 1.2873973685262860E-01 1.2873613438335574E-01 1.2873252422930884E-01 + 1.2872890639049808E-01 1.2872528086693227E-01 1.2872164765861893E-01 1.2871800676556436E-01 1.2871435818777341E-01 + 1.2871070192524967E-01 1.2870703797799535E-01 1.2870336634601137E-01 1.2869968702929729E-01 1.2869600002785128E-01 + 1.2869230534167012E-01 1.2868860297074927E-01 1.2868489291508278E-01 1.2868117517466329E-01 1.2867744974948203E-01 + 1.2867371663952890E-01 1.2866997584479223E-01 1.2866622736525909E-01 1.2866247120091495E-01 1.2865870735174398E-01 + 1.2865493581772877E-01 1.2865115659885060E-01 1.2864736969508908E-01 1.2864357510642252E-01 1.2863977283282763E-01 + 1.2863596287427967E-01 1.2863214523075245E-01 1.2862831990221807E-01 1.2862448688864739E-01 1.2862064619000949E-01 + 1.2861679780627208E-01 1.2861294173740118E-01 1.2860907798336138E-01 1.2860520654411561E-01 1.2860132741962535E-01 + 1.2859744060985032E-01 1.2859354611474874E-01 1.2858964393427733E-01 1.2858573406839102E-01 1.2858181651704320E-01 + 1.2857789128018565E-01 1.2857395835776853E-01 1.2857001774974028E-01 1.2856606945604779E-01 1.2856211347663621E-01 + 1.2855814981144903E-01 1.2855417846042808E-01 1.2855019942351348E-01 1.2854621270064370E-01 1.2854221829175538E-01 + 1.2853821619678366E-01 1.2853420641566174E-01 1.2853018894832122E-01 1.2852616379469192E-01 1.2852213095470183E-01 + 1.2851809042827733E-01 1.2851404221534293E-01 1.2850998631582139E-01 1.2850592272963368E-01 1.2850185145669896E-01 + 1.2849777249693459E-01 1.2849368585025614E-01 1.2848959151657732E-01 1.2848548949581012E-01 1.2848137978786442E-01 + 1.2847726239264859E-01 1.2847313731006885E-01 1.2846900454002980E-01 1.2846486408243393E-01 1.2846071593718197E-01 + 1.2845656010417278E-01 1.2845239658330321E-01 1.2844822537446826E-01 1.2844404647756108E-01 1.2843985989247270E-01 + 1.2843566561909234E-01 1.2843146365730720E-01 1.2842725400700267E-01 1.2842303666806199E-01 1.2841881164036642E-01 + 1.2841457892379540E-01 1.2841033851822620E-01 1.2840609042353421E-01 1.2840183463959262E-01 1.2839757116627287E-01 + 1.2839330000344407E-01 1.2838902115097350E-01 1.2838473460872629E-01 1.2838044037656551E-01 1.2837613845435220E-01 + 1.2837182884194520E-01 1.2836751153920142E-01 1.2836318654597553E-01 1.2835885386212018E-01 1.2835451348748589E-01 + 1.2835016542192093E-01 1.2834580966527159E-01 1.2834144621738194E-01 1.2833707507809380E-01 1.2833269624724702E-01 + 1.2832830972467915E-01 1.2832391551022543E-01 1.2831951360371918E-01 1.2831510400499130E-01 1.2831068671387053E-01 + 1.2830626173018339E-01 1.2830182905375417E-01 1.2829738868440488E-01 1.2829294062195534E-01 1.2828848486622299E-01 + 1.2828402141702308E-01 1.2827955027416862E-01 1.2827507143747022E-01 1.2827058490673621E-01 1.2826609068177258E-01 + 1.2826158876238308E-01 1.2825707914836912E-01 1.2825256183952960E-01 1.2824803683566133E-01 1.2824350413655849E-01 + 1.2823896374201310E-01 1.2823441565181465E-01 1.2822985986575028E-01 1.2822529638360478E-01 1.2822072520516042E-01 + 1.2821614633019712E-01 1.2821155975849238E-01 1.2820696548982125E-01 1.2820236352395620E-01 1.2819775386066742E-01 + 1.2819313649972250E-01 1.2818851144088664E-01 1.2818387868392242E-01 1.2817923822859001E-01 1.2817459007464713E-01 + 1.2816993422184875E-01 1.2816527066994754E-01 1.2816059941869348E-01 1.2815592046783408E-01 1.2815123381711421E-01 + 1.2814653946627624E-01 1.2814183741505994E-01 1.2813712766320240E-01 1.2813241021043820E-01 1.2812768505649921E-01 + 1.2812295220111483E-01 1.2811821164401169E-01 1.2811346338491375E-01 1.2810870742354247E-01 1.2810394375961648E-01 + 1.2809917239285182E-01 1.2809439332296182E-01 1.2808960654965712E-01 1.2808481207264560E-01 1.2808000989163254E-01 + 1.2807520000632033E-01 1.2807038241640875E-01 1.2806555712159484E-01 1.2806072412157271E-01 1.2805588341603388E-01 + 1.2805103500466700E-01 1.2804617888715797E-01 1.2804131506318989E-01 1.2803644353244301E-01 1.2803156429459475E-01 + 1.2802667734931975E-01 1.2802178269628975E-01 1.2801688033517367E-01 1.2801197026563757E-01 1.2800705248734465E-01 + 1.2800212699995520E-01 1.2799719380312652E-01 1.2799225289651317E-01 1.2798730427976668E-01 1.2798234795253571E-01 + 1.2797738391446592E-01 1.2797241216520017E-01 1.2796743270437813E-01 1.2796244553163666E-01 1.2795745064660960E-01 + 1.2795244804892783E-01 1.2794743773821915E-01 1.2794241971410836E-01 1.2793739397621737E-01 1.2793236052416487E-01 + 1.2792731935756657E-01 1.2792227047603519E-01 1.2791721387918037E-01 1.2791214956660854E-01 1.2790707753792324E-01 + 1.2790199779272468E-01 1.2789691033061021E-01 1.2789181515117390E-01 1.2788671225400672E-01 1.2788160163869650E-01 + 1.2787648330482798E-01 1.2787135725198254E-01 1.2786622347973864E-01 1.2786108198767146E-01 1.2785593277535287E-01 + 1.2785077584235172E-01 1.2784561118823345E-01 1.2784043881256041E-01 1.2783525871489171E-01 1.2783007089478310E-01 + 1.2782487535178716E-01 1.2781967208545317E-01 1.2781446109532713E-01 1.2780924238095173E-01 1.2780401594186638E-01 + 1.2779878177760712E-01 1.2779353988770678E-01 1.2778829027169472E-01 1.2778303292909704E-01 1.2777776785943637E-01 + 1.2777249506223212E-01 1.2776721453700018E-01 1.2776192628325314E-01 1.2775663030050011E-01 1.2775132658824692E-01 + 1.2774601514599573E-01 1.2774069597324547E-01 1.2773536906949157E-01 1.2773003443422598E-01 1.2772469206693718E-01 + 1.2771934196711013E-01 1.2771398413422638E-01 1.2770861856776397E-01 1.2770324526719729E-01 1.2769786423199733E-01 + 1.2769247546163148E-01 1.2768707895556372E-01 1.2768167471325420E-01 1.2767626273415975E-01 1.2767084301773343E-01 + 1.2766541556342489E-01 1.2765998037068002E-01 1.2765453743894115E-01 1.2764908676764700E-01 1.2764362835623261E-01 + 1.2763816220412932E-01 1.2763268831076496E-01 1.2762720667556354E-01 1.2762171729794547E-01 1.2761622017732741E-01 + 1.2761071531312243E-01 1.2760520270473960E-01 1.2759968235158456E-01 1.2759415425305909E-01 1.2758861840856112E-01 + 1.2758307481748501E-01 1.2757752347922122E-01 1.2757196439315643E-01 1.2756639755867349E-01 1.2756082297515153E-01 + 1.2755524064196580E-01 1.2754965055848771E-01 1.2754405272408481E-01 1.2753844713812085E-01 1.2753283379995570E-01 + 1.2752721270894524E-01 1.2752158386444160E-01 1.2751594726579299E-01 1.2751030291234355E-01 1.2750465080343371E-01 + 1.2749899093839986E-01 1.2749332331657434E-01 1.2748764793728576E-01 1.2748196479985846E-01 1.2747627390361310E-01 + 1.2747057524786612E-01 1.2746486883193009E-01 1.2745915465511345E-01 1.2745343271672069E-01 1.2744770301605218E-01 + 1.2744196555240439E-01 1.2743622032506949E-01 1.2743046733333574E-01 1.2742470657648727E-01 1.2741893805380414E-01 + 1.2741316176456216E-01 1.2740737770803320E-01 1.2740158588348494E-01 1.2739578629018075E-01 1.2738997892738008E-01 + 1.2738416379433801E-01 1.2737834089030561E-01 1.2737251021452958E-01 1.2736667176625249E-01 1.2736082554471279E-01 + 1.2735497154914452E-01 1.2734910977877764E-01 1.2734324023283769E-01 1.2733736291054604E-01 1.2733147781111981E-01 + 1.2732558493377172E-01 1.2731968427771034E-01 1.2731377584213982E-01 1.2730785962625993E-01 1.2730193562926626E-01 + 1.2729600385034992E-01 1.2729006428869771E-01 1.2728411694349204E-01 1.2727816181391097E-01 1.2727219889912808E-01 + 1.2726622819831263E-01 1.2726024971062941E-01 1.2725426343523882E-01 1.2724826937129669E-01 1.2724226751795462E-01 + 1.2723625787435944E-01 1.2723024043965375E-01 1.2722421521297558E-01 1.2721818219345837E-01 1.2721214138023118E-01 + 1.2720609277241840E-01 1.2720003636914001E-01 1.2719397216951131E-01 1.2718790017264314E-01 1.2718182037764172E-01 + 1.2717573278360864E-01 1.2716963738964093E-01 1.2716353419483103E-01 1.2715742319826664E-01 1.2715130439903102E-01 + 1.2714517779620255E-01 1.2713904338885509E-01 1.2713290117605783E-01 1.2712675115687522E-01 1.2712059333036690E-01 + 1.2711442769558809E-01 1.2710825425158900E-01 1.2710207299741530E-01 1.2709588393210774E-01 1.2708968705470247E-01 + 1.2708348236423070E-01 1.2707726985971907E-01 1.2707104954018922E-01 1.2706482140465808E-01 1.2705858545213777E-01 + 1.2705234168163543E-01 1.2704609009215359E-01 1.2703983068268973E-01 1.2703356345223654E-01 1.2702728839978181E-01 + 1.2702100552430842E-01 1.2701471482479440E-01 1.2700841630021276E-01 1.2700210994953165E-01 1.2699579577171430E-01 + 1.2698947376571887E-01 1.2698314393049867E-01 1.2697680626500193E-01 1.2697046076817198E-01 1.2696410743894704E-01 + 1.2695774627626044E-01 1.2695137727904027E-01 1.2694500044620985E-01 1.2693861577668725E-01 1.2693222326938550E-01 + 1.2692582292321253E-01 1.2691941473707130E-01 1.2691299870985956E-01 1.2690657484046994E-01 1.2690014312778994E-01 + 1.2689370357070201E-01 1.2688725616808325E-01 1.2688080091880580E-01 1.2687433782173649E-01 1.2686786687573703E-01 + 1.2686138807966388E-01 1.2685490143236822E-01 1.2684840693269614E-01 1.2684190457948838E-01 1.2683539437158051E-01 + 1.2682887630780271E-01 1.2682235038697992E-01 1.2681581660793192E-01 1.2680927496947306E-01 1.2680272547041230E-01 + 1.2679616810955341E-01 1.2678960288569477E-01 1.2678302979762940E-01 1.2677644884414491E-01 1.2676986002402357E-01 + 1.2676326333604229E-01 1.2675665877897244E-01 1.2675004635158021E-01 1.2674342605262612E-01 1.2673679788086528E-01 + 1.2673016183504751E-01 1.2672351791391698E-01 1.2671686611621250E-01 1.2671020644066722E-01 1.2670353888600899E-01 + 1.2669686345096001E-01 1.2669018013423697E-01 1.2668348893455103E-01 1.2667678985060779E-01 1.2667008288110720E-01 + 1.2666336802474382E-01 1.2665664528020637E-01 1.2664991464617814E-01 1.2664317612133677E-01 1.2663642970435415E-01 + 1.2662967539389663E-01 1.2662291318862490E-01 1.2661614308719396E-01 1.2660936508825305E-01 1.2660257919044585E-01 + 1.2659578539241020E-01 1.2658898369277827E-01 1.2658217409017652E-01 1.2657535658322566E-01 1.2656853117054051E-01 + 1.2656169785073032E-01 1.2655485662239843E-01 1.2654800748414233E-01 1.2654115043455386E-01 1.2653428547221884E-01 + 1.2652741259571745E-01 1.2652053180362377E-01 1.2651364309450630E-01 1.2650674646692747E-01 1.2649984191944391E-01 + 1.2649292945060620E-01 1.2648600905895921E-01 1.2647908074304176E-01 1.2647214450138677E-01 1.2646520033252112E-01 + 1.2645824823496590E-01 1.2645128820723603E-01 1.2644432024784050E-01 1.2643734435528237E-01 1.2643036052805859E-01 + 1.2642336876466009E-01 1.2641636906357182E-01 1.2640936142327258E-01 1.2640234584223520E-01 1.2639532231892631E-01 + 1.2638829085180656E-01 1.2638125143933038E-01 1.2637420407994618E-01 1.2636714877209618E-01 1.2636008551421649E-01 + 1.2635301430473697E-01 1.2634593514208137E-01 1.2633884802466730E-01 1.2633175295090610E-01 1.2632464991920289E-01 + 1.2631753892795661E-01 1.2631041997555997E-01 1.2630329306039936E-01 1.2629615818085499E-01 1.2628901533530065E-01 + 1.2628186452210408E-01 1.2627470573962649E-01 1.2626753898622284E-01 1.2626036426024184E-01 1.2625318156002577E-01 + 1.2624599088391056E-01 1.2623879223022583E-01 1.2623158559729475E-01 1.2622437098343417E-01 1.2621714838695444E-01 + 1.2620991780615959E-01 1.2620267923934711E-01 1.2619543268480810E-01 1.2618817814082725E-01 1.2618091560568270E-01 + 1.2617364507764617E-01 1.2616636655498276E-01 1.2615908003595125E-01 1.2615178551880371E-01 1.2614448300178574E-01 + 1.2613717248313647E-01 1.2612985396108833E-01 1.2612252743386726E-01 1.2611519289969261E-01 1.2610785035677707E-01 + 1.2610049980332680E-01 1.2609314123754120E-01 1.2608577465761317E-01 1.2607840006172893E-01 1.2607101744806787E-01 + 1.2606362681480296E-01 1.2605622816010026E-01 1.2604882148211921E-01 1.2604140677901257E-01 1.2603398404892621E-01 + 1.2602655328999951E-01 1.2601911450036482E-01 1.2601166767814789E-01 1.2600421282146765E-01 1.2599674992843618E-01 + 1.2598927899715878E-01 1.2598180002573395E-01 1.2597431301225331E-01 1.2596681795480166E-01 1.2595931485145692E-01 + 1.2595180370029010E-01 1.2594428449936540E-01 1.2593675724674006E-01 1.2592922194046435E-01 1.2592167857858177E-01 + 1.2591412715912872E-01 1.2590656768013472E-01 1.2589900013962227E-01 1.2589142453560698E-01 1.2588384086609733E-01 + 1.2587624912909492E-01 1.2586864932259428E-01 1.2586104144458285E-01 1.2585342549304107E-01 1.2584580146594235E-01 + 1.2583816936125300E-01 1.2583052917693219E-01 1.2582288091093208E-01 1.2581522456119762E-01 1.2580756012566677E-01 + 1.2579988760227012E-01 1.2579220698893140E-01 1.2578451828356693E-01 1.2577682148408595E-01 1.2576911658839052E-01 + 1.2576140359437549E-01 1.2575368249992841E-01 1.2574595330292973E-01 1.2573821600125254E-01 1.2573047059276274E-01 + 1.2572271707531890E-01 1.2571495544677236E-01 1.2570718570496717E-01 1.2569940784774000E-01 1.2569162187292024E-01 + 1.2568382777832995E-01 1.2567602556178381E-01 1.2566821522108915E-01 1.2566039675404592E-01 1.2565257015844672E-01 + 1.2564473543207669E-01 1.2563689257271354E-01 1.2562904157812763E-01 1.2562118244608181E-01 1.2561331517433144E-01 + 1.2560543976062458E-01 1.2559755620270160E-01 1.2558966449829553E-01 1.2558176464513177E-01 1.2557385664092824E-01 + 1.2556594048339539E-01 1.2555801617023601E-01 1.2555008369914550E-01 1.2554214306781147E-01 1.2553419427391407E-01 + 1.2552623731512583E-01 1.2551827218911166E-01 1.2551029889352885E-01 1.2550231742602699E-01 1.2549432778424816E-01 + 1.2548632996582657E-01 1.2547832396838896E-01 1.2547030978955423E-01 1.2546228742693361E-01 1.2545425687813061E-01 + 1.2544621814074108E-01 1.2543817121235298E-01 1.2543011609054663E-01 1.2542205277289459E-01 1.2541398125696146E-01 + 1.2540590154030429E-01 1.2539781362047211E-01 1.2538971749500624E-01 1.2538161316144011E-01 1.2537350061729938E-01 + 1.2536537986010168E-01 1.2535725088735691E-01 1.2534911369656704E-01 1.2534096828522617E-01 1.2533281465082041E-01 + 1.2532465279082794E-01 1.2531648270271906E-01 1.2530830438395604E-01 1.2530011783199332E-01 1.2529192304427719E-01 + 1.2528372001824598E-01 1.2527550875133012E-01 1.2526728924095187E-01 1.2525906148452559E-01 1.2525082547945751E-01 + 1.2524258122314580E-01 1.2523432871298054E-01 1.2522606794634383E-01 1.2521779892060952E-01 1.2520952163314347E-01 + 1.2520123608130332E-01 1.2519294226243863E-01 1.2518464017389078E-01 1.2517632981299298E-01 1.2516801117707027E-01 + 1.2515968426343951E-01 1.2515134906940931E-01 1.2514300559228017E-01 1.2513465382934413E-01 1.2512629377788528E-01 + 1.2511792543517919E-01 1.2510954879849337E-01 1.2510116386508685E-01 1.2509277063221055E-01 1.2508436909710696E-01 + 1.2507595925701026E-01 1.2506754110914622E-01 1.2505911465073252E-01 1.2505067987897817E-01 1.2504223679108400E-01 + 1.2503378538424234E-01 1.2502532565563726E-01 1.2501685760244421E-01 1.2500838122183036E-01 1.2499989651095446E-01 + 1.2499140346696665E-01 1.2498290208700870E-01 1.2497439236821400E-01 1.2496587430770723E-01 1.2495734790260472E-01 + 1.2494881315001427E-01 1.2494027004703501E-01 1.2493171859075772E-01 1.2492315877826450E-01 1.2491459060662891E-01 + 1.2490601407291592E-01 1.2489742917418188E-01 1.2488883590747456E-01 1.2488023426983309E-01 1.2487162425828797E-01 + 1.2486300586986113E-01 1.2485437910156560E-01 1.2484574395040603E-01 1.2483710041337817E-01 1.2482844848746914E-01 + 1.2481978816965740E-01 1.2481111945691256E-01 1.2480244234619559E-01 1.2479375683445866E-01 1.2478506291864519E-01 + 1.2477636059568983E-01 1.2476764986251838E-01 1.2475893071604792E-01 1.2475020315318665E-01 1.2474146717083395E-01 + 1.2473272276588035E-01 1.2472396993520757E-01 1.2471520867568842E-01 1.2470643898418683E-01 1.2469766085755779E-01 + 1.2468887429264748E-01 1.2468007928629307E-01 1.2467127583532289E-01 1.2466246393655615E-01 1.2465364358680335E-01 + 1.2464481478286576E-01 1.2463597752153587E-01 1.2462713179959703E-01 1.2461827761382362E-01 1.2460941496098106E-01 + 1.2460054383782565E-01 1.2459166424110465E-01 1.2458277616755631E-01 1.2457387961390973E-01 1.2456497457688499E-01 + 1.2455606105319307E-01 1.2454713903953574E-01 1.2453820853260575E-01 1.2452926952908661E-01 1.2452032202565284E-01 + 1.2451136601896957E-01 1.2450240150569296E-01 1.2449342848246986E-01 1.2448444694593791E-01 1.2447545689272560E-01 + 1.2446645831945218E-01 1.2445745122272762E-01 1.2444843559915265E-01 1.2443941144531874E-01 1.2443037875780805E-01 + 1.2442133753319351E-01 1.2441228776803868E-01 1.2440322945889785E-01 1.2439416260231592E-01 1.2438508719482853E-01 + 1.2437600323296191E-01 1.2436691071323291E-01 1.2435780963214899E-01 1.2434869998620832E-01 1.2433958177189951E-01 + 1.2433045498570190E-01 1.2432131962408523E-01 1.2431217568350998E-01 1.2430302316042705E-01 1.2429386205127789E-01 + 1.2428469235249454E-01 1.2427551406049937E-01 1.2426632717170545E-01 1.2425713168251619E-01 1.2424792758932558E-01 + 1.2423871488851793E-01 1.2422949357646812E-01 1.2422026364954132E-01 1.2421102510409329E-01 1.2420177793647004E-01 + 1.2419252214300809E-01 1.2418325772003427E-01 1.2417398466386576E-01 1.2416470297081013E-01 1.2415541263716533E-01 + 1.2414611365921958E-01 1.2413680603325145E-01 1.2412748975552981E-01 1.2411816482231376E-01 1.2410883122985278E-01 + 1.2409948897438657E-01 1.2409013805214512E-01 1.2408077845934856E-01 1.2407141019220740E-01 1.2406203324692222E-01 + 1.2405264761968395E-01 1.2404325330667354E-01 1.2403385030406237E-01 1.2402443860801171E-01 1.2401501821467319E-01 + 1.2400558912018848E-01 1.2399615132068940E-01 1.2398670481229800E-01 1.2397724959112622E-01 1.2396778565327626E-01 + 1.2395831299484041E-01 1.2394883161190090E-01 1.2393934150053020E-01 1.2392984265679062E-01 1.2392033507673468E-01 + 1.2391081875640488E-01 1.2390129369183360E-01 1.2389175987904341E-01 1.2388221731404676E-01 1.2387266599284606E-01 + 1.2386310591143372E-01 1.2385353706579214E-01 1.2384395945189354E-01 1.2383437306570018E-01 1.2382477790316412E-01 + 1.2381517396022748E-01 1.2380556123282214E-01 1.2379593971686984E-01 1.2378630940828229E-01 1.2377667030296101E-01 + 1.2376702239679732E-01 1.2375736568567240E-01 1.2374770016545726E-01 1.2373802583201271E-01 1.2372834268118929E-01 + 1.2371865070882745E-01 1.2370894991075730E-01 1.2369924028279869E-01 1.2368952182076132E-01 1.2367979452044459E-01 + 1.2367005837763753E-01 1.2366031338811902E-01 1.2365055954765751E-01 1.2364079685201121E-01 1.2363102529692803E-01 + 1.2362124487814544E-01 1.2361145559139061E-01 1.2360165743238040E-01 1.2359185039682126E-01 1.2358203448040922E-01 + 1.2357220967882995E-01 1.2356237598775871E-01 1.2355253340286029E-01 1.2354268191978916E-01 1.2353282153418925E-01 + 1.2352295224169405E-01 1.2351307403792658E-01 1.2350318691849946E-01 1.2349329087901467E-01 1.2348338591506390E-01 + 1.2347347202222805E-01 1.2346354919607774E-01 1.2345361743217295E-01 1.2344367672606309E-01 1.2343372707328711E-01 + 1.2342376846937322E-01 1.2341380090983924E-01 1.2340382439019221E-01 1.2339383890592877E-01 1.2338384445253477E-01 + 1.2337384102548545E-01 1.2336382862024553E-01 1.2335380723226898E-01 1.2334377685699910E-01 1.2333373748986856E-01 + 1.2332368912629930E-01 1.2331363176170267E-01 1.2330356539147913E-01 1.2329349001101858E-01 1.2328340561570014E-01 + 1.2327331220089216E-01 1.2326320976195224E-01 1.2325309829422727E-01 1.2324297779305327E-01 1.2323284825375561E-01 + 1.2322270967164868E-01 1.2321256204203623E-01 1.2320240536021113E-01 1.2319223962145533E-01 1.2318206482104009E-01 + 1.2317188095422565E-01 1.2316168801626155E-01 1.2315148600238639E-01 1.2314127490782785E-01 1.2313105472780266E-01 + 1.2312082545751681E-01 1.2311058709216521E-01 1.2310033962693193E-01 1.2309008305699003E-01 1.2307981737750170E-01 + 1.2306954258361812E-01 1.2305925867047941E-01 1.2304896563321489E-01 1.2303866346694273E-01 1.2302835216677015E-01 + 1.2301803172779333E-01 1.2300770214509744E-01 1.2299736341375660E-01 1.2298701552883391E-01 1.2297665848538132E-01 + 1.2296629227843980E-01 1.2295591690303921E-01 1.2294553235419833E-01 1.2293513862692472E-01 1.2292473571621501E-01 + 1.2291432361705457E-01 1.2290390232441764E-01 1.2289347183326742E-01 1.2288303213855582E-01 1.2287258323522368E-01 + 1.2286212511820052E-01 1.2285165778240492E-01 1.2284118122274398E-01 1.2283069543411379E-01 1.2282020041139911E-01 + 1.2280969614947354E-01 1.2279918264319933E-01 1.2278865988742763E-01 1.2277812787699817E-01 1.2276758660673950E-01 + 1.2275703607146894E-01 1.2274647626599232E-01 1.2273590718510438E-01 1.2272532882358843E-01 1.2271474117621645E-01 + 1.2270414423774915E-01 1.2269353800293581E-01 1.2268292246651444E-01 1.2267229762321163E-01 1.2266166346774264E-01 + 1.2265101999481129E-01 1.2264036719910998E-01 1.2262970507531980E-01 1.2261903361811033E-01 1.2260835282213979E-01 + 1.2259766268205495E-01 1.2258696319249110E-01 1.2257625434807209E-01 1.2256553614341037E-01 1.2255480857310674E-01 + 1.2254407163175074E-01 1.2253332531392021E-01 1.2252256961418159E-01 1.2251180452708980E-01 1.2250103004718824E-01 + 1.2249024616900871E-01 1.2247945288707153E-01 1.2246865019588540E-01 1.2245783808994755E-01 1.2244701656374357E-01 + 1.2243618561174743E-01 1.2242534522842165E-01 1.2241449540821694E-01 1.2240363614557259E-01 1.2239276743491612E-01 + 1.2238188927066350E-01 1.2237100164721904E-01 1.2236010455897538E-01 1.2234919800031357E-01 1.2233828196560287E-01 + 1.2232735644920094E-01 1.2231642144545374E-01 1.2230547694869552E-01 1.2229452295324883E-01 1.2228355945342449E-01 + 1.2227258644352160E-01 1.2226160391782753E-01 1.2225061187061792E-01 1.2223961029615660E-01 1.2222859918869572E-01 + 1.2221757854247554E-01 1.2220654835172463E-01 1.2219550861065978E-01 1.2218445931348590E-01 1.2217340045439616E-01 + 1.2216233202757187E-01 1.2215125402718252E-01 1.2214016644738578E-01 1.2212906928232747E-01 1.2211796252614157E-01 + 1.2210684617295012E-01 1.2209572021686337E-01 1.2208458465197966E-01 1.2207343947238546E-01 1.2206228467215531E-01 + 1.2205112024535186E-01 1.2203994618602580E-01 1.2202876248821601E-01 1.2201756914594927E-01 1.2200636615324059E-01 + 1.2199515350409285E-01 1.2198393119249712E-01 1.2197269921243249E-01 1.2196145755786598E-01 1.2195020622275264E-01 + 1.2193894520103561E-01 1.2192767448664599E-01 1.2191639407350278E-01 1.2190510395551307E-01 1.2189380412657193E-01 + 1.2188249458056231E-01 1.2187117531135522E-01 1.2185984631280941E-01 1.2184850757877186E-01 1.2183715910307726E-01 + 1.2182580087954828E-01 1.2181443290199562E-01 1.2180305516421766E-01 1.2179166766000089E-01 1.2178027038311955E-01 + 1.2176886332733584E-01 1.2175744648639980E-01 1.2174601985404936E-01 1.2173458342401029E-01 1.2172313718999619E-01 + 1.2171168114570856E-01 1.2170021528483668E-01 1.2168873960105764E-01 1.2167725408803640E-01 1.2166575873942576E-01 + 1.2165425354886619E-01 1.2164273850998614E-01 1.2163121361640167E-01 1.2161967886171672E-01 1.2160813423952299E-01 + 1.2159657974339996E-01 1.2158501536691475E-01 1.2157344110362242E-01 1.2156185694706563E-01 1.2155026289077481E-01 + 1.2153865892826811E-01 1.2152704505305144E-01 1.2151542125861840E-01 1.2150378753845029E-01 1.2149214388601610E-01 + 1.2148049029477249E-01 1.2146882675816387E-01 1.2145715326962227E-01 1.2144546982256743E-01 1.2143377641040670E-01 + 1.2142207302653511E-01 1.2141035966433535E-01 1.2139863631717773E-01 1.2138690297842022E-01 1.2137515964140839E-01 + 1.2136340629947547E-01 1.2135164294594224E-01 1.2133986957411708E-01 1.2132808617729608E-01 1.2131629274876281E-01 + 1.2130448928178847E-01 1.2129267576963182E-01 1.2128085220553922E-01 1.2126901858274458E-01 1.2125717489446940E-01 + 1.2124532113392265E-01 1.2123345729430089E-01 1.2122158336878829E-01 1.2120969935055642E-01 1.2119780523276451E-01 + 1.2118590100855915E-01 1.2117398667107462E-01 1.2116206221343262E-01 1.2115012762874232E-01 1.2113818291010045E-01 + 1.2112622805059119E-01 1.2111426304328619E-01 1.2110228788124462E-01 1.2109030255751312E-01 1.2107830706512572E-01 + 1.2106630139710399E-01 1.2105428554645691E-01 1.2104225950618090E-01 1.2103022326925990E-01 1.2101817682866517E-01 + 1.2100612017735544E-01 1.2099405330827692E-01 1.2098197621436317E-01 1.2096988888853516E-01 1.2095779132370127E-01 + 1.2094568351275738E-01 1.2093356544858656E-01 1.2092143712405951E-01 1.2090929853203410E-01 1.2089714966535572E-01 + 1.2088499051685705E-01 1.2087282107935819E-01 1.2086064134566658E-01 1.2084845130857701E-01 1.2083625096087160E-01 + 1.2082404029531985E-01 1.2081181930467866E-01 1.2079958798169210E-01 1.2078734631909174E-01 1.2077509430959636E-01 + 1.2076283194591211E-01 1.2075055922073245E-01 1.2073827612673819E-01 1.2072598265659734E-01 1.2071367880296530E-01 + 1.2070136455848474E-01 1.2068903991578561E-01 1.2067670486748516E-01 1.2066435940618792E-01 1.2065200352448566E-01 + 1.2063963721495749E-01 1.2062726047016974E-01 1.2061487328267603E-01 1.2060247564501719E-01 1.2059006754972137E-01 + 1.2057764898930391E-01 1.2056521995626746E-01 1.2055278044310179E-01 1.2054033044228406E-01 1.2052786994627859E-01 + 1.2051539894753689E-01 1.2050291743849774E-01 1.2049042541158715E-01 1.2047792285921831E-01 1.2046540977379165E-01 + 1.2045288614769481E-01 1.2044035197330261E-01 1.2042780724297704E-01 1.2041525194906737E-01 1.2040268608391000E-01 + 1.2039010963982859E-01 1.2037752260913386E-01 1.2036492498412379E-01 1.2035231675708356E-01 1.2033969792028554E-01 + 1.2032706846598910E-01 1.2031442838644101E-01 1.2030177767387507E-01 1.2028911632051224E-01 1.2027644431856072E-01 + 1.2026376166021571E-01 1.2025106833765975E-01 1.2023836434306240E-01 1.2022564966858040E-01 1.2021292430635766E-01 + 1.2020018824852513E-01 1.2018744148720098E-01 1.2017468401449055E-01 1.2016191582248620E-01 1.2014913690326751E-01 + 1.2013634724890108E-01 1.2012354685144075E-01 1.2011073570292743E-01 1.2009791379538907E-01 1.2008508112084088E-01 + 1.2007223767128504E-01 1.2005938343871092E-01 1.2004651841509496E-01 1.2003364259240076E-01 1.2002075596257891E-01 + 1.2000785851756719E-01 1.1999495024929045E-01 1.1998203114966068E-01 1.1996910121057683E-01 1.1995616042392505E-01 + 1.1994320878157860E-01 1.1993024627539771E-01 1.1991727289722981E-01 1.1990428863890930E-01 1.1989129349225776E-01 + 1.1987828744908381E-01 1.1986527050118315E-01 1.1985224264033852E-01 1.1983920385831974E-01 1.1982615414688376E-01 + 1.1981309349777455E-01 1.1980002190272313E-01 1.1978693935344764E-01 1.1977384584165324E-01 1.1976074135903222E-01 + 1.1974762589726380E-01 1.1973449944801440E-01 1.1972136200293745E-01 1.1970821355367341E-01 1.1969505409184983E-01 + 1.1968188360908130E-01 1.1966870209696945E-01 1.1965550954710304E-01 1.1964230595105779E-01 1.1962909130039653E-01 + 1.1961586558666915E-01 1.1960262880141251E-01 1.1958938093615057E-01 1.1957612198239445E-01 1.1956285193164212E-01 + 1.1954957077537873E-01 1.1953627850507649E-01 1.1952297511219453E-01 1.1950966058817915E-01 1.1949633492446370E-01 + 1.1948299811246847E-01 1.1946965014360093E-01 1.1945629100925552E-01 1.1944292070081369E-01 1.1942953920964401E-01 + 1.1941614652710213E-01 1.1940274264453062E-01 1.1938932755325922E-01 1.1937590124460463E-01 1.1936246370987066E-01 + 1.1934901494034815E-01 1.1933555492731496E-01 1.1932208366203605E-01 1.1930860113576341E-01 1.1929510733973603E-01 + 1.1928160226518003E-01 1.1926808590330856E-01 1.1925455824532179E-01 1.1924101928240695E-01 1.1922746900573838E-01 + 1.1921390740647739E-01 1.1920033447577240E-01 1.1918675020475891E-01 1.1917315458455945E-01 1.1915954760628357E-01 + 1.1914592926102791E-01 1.1913229953987621E-01 1.1911865843389927E-01 1.1910500593415484E-01 1.1909134203168792E-01 + 1.1907766671753044E-01 1.1906397998270143E-01 1.1905028181820705E-01 1.1903657221504042E-01 1.1902285116418189E-01 + 1.1900911865659872E-01 1.1899537468324535E-01 1.1898161923506334E-01 1.1896785230298118E-01 1.1895407387791461E-01 + 1.1894028395076633E-01 1.1892648251242620E-01 1.1891266955377119E-01 1.1889884506566527E-01 1.1888500903895959E-01 + 1.1887116146449241E-01 1.1885730233308897E-01 1.1884343163556177E-01 1.1882954936271035E-01 1.1881565550532130E-01 + 1.1880175005416839E-01 1.1878783300001250E-01 1.1877390433360167E-01 1.1875996404567091E-01 1.1874601212694252E-01 + 1.1873204856812584E-01 1.1871807335991737E-01 1.1870408649300074E-01 1.1869008795804664E-01 1.1867607774571309E-01 + 1.1866205584664506E-01 1.1864802225147475E-01 1.1863397695082151E-01 1.1861991993529181E-01 1.1860585119547934E-01 + 1.1859177072196493E-01 1.1857767850531649E-01 1.1856357453608926E-01 1.1854945880482549E-01 1.1853533130205474E-01 + 1.1852119201829366E-01 1.1850704094404610E-01 1.1849287806980317E-01 1.1847870338604310E-01 1.1846451688323133E-01 + 1.1845031855182056E-01 1.1843610838225062E-01 1.1842188636494855E-01 1.1840765249032872E-01 1.1839340674879262E-01 + 1.1837914913072900E-01 1.1836487962651376E-01 1.1835059822651020E-01 1.1833630492106877E-01 1.1832199970052709E-01 + 1.1830768255521019E-01 1.1829335347543023E-01 1.1827901245148670E-01 1.1826465947366631E-01 1.1825029453224310E-01 + 1.1823591761747837E-01 1.1822152871962065E-01 1.1820712782890581E-01 1.1819271493555703E-01 1.1817829002978475E-01 + 1.1816385310178677E-01 1.1814940414174813E-01 1.1813494313984121E-01 1.1812047008622580E-01 1.1810598497104891E-01 + 1.1809148778444491E-01 1.1807697851653559E-01 1.1806245715742998E-01 1.1804792369722455E-01 1.1803337812600312E-01 + 1.1801882043383684E-01 1.1800425061078430E-01 1.1798966864689141E-01 1.1797507453219147E-01 1.1796046825670524E-01 + 1.1794584981044080E-01 1.1793121918339376E-01 1.1791657636554700E-01 1.1790192134687093E-01 1.1788725411732341E-01 + 1.1787257466684960E-01 1.1785788298538225E-01 1.1784317906284154E-01 1.1782846288913504E-01 1.1781373445415787E-01 + 1.1779899374779255E-01 1.1778424075990920E-01 1.1776947548036532E-01 1.1775469789900597E-01 1.1773990800566367E-01 + 1.1772510579015852E-01 1.1771029124229809E-01 1.1769546435187761E-01 1.1768062510867967E-01 1.1766577350247448E-01 + 1.1765090952301983E-01 1.1763603316006113E-01 1.1762114440333131E-01 1.1760624324255080E-01 1.1759132966742777E-01 + 1.1757640366765797E-01 1.1756146523292461E-01 1.1754651435289877E-01 1.1753155101723893E-01 1.1751657521559131E-01 + 1.1750158693758982E-01 1.1748658617285596E-01 1.1747157291099893E-01 1.1745654714161557E-01 1.1744150885429047E-01 + 1.1742645803859587E-01 1.1741139468409170E-01 1.1739631878032569E-01 1.1738123031683317E-01 1.1736612928313733E-01 + 1.1735101566874905E-01 1.1733588946316691E-01 1.1732075065587740E-01 1.1730559923635460E-01 1.1729043519406060E-01 + 1.1727525851844513E-01 1.1726006919894569E-01 1.1724486722498775E-01 1.1722965258598456E-01 1.1721442527133713E-01 + 1.1719918527043441E-01 1.1718393257265318E-01 1.1716866716735810E-01 1.1715338904390174E-01 1.1713809819162449E-01 + 1.1712279459985477E-01 1.1710747825790876E-01 1.1709214915509072E-01 1.1707680728069281E-01 1.1706145262399509E-01 + 1.1704608517426562E-01 1.1703070492076051E-01 1.1701531185272368E-01 1.1699990595938729E-01 1.1698448722997133E-01 + 1.1696905565368385E-01 1.1695361121972103E-01 1.1693815391726700E-01 1.1692268373549401E-01 1.1690720066356237E-01 + 1.1689170469062046E-01 1.1687619580580481E-01 1.1686067399824003E-01 1.1684513925703886E-01 1.1682959157130214E-01 + 1.1681403093011902E-01 1.1679845732256662E-01 1.1678287073771036E-01 1.1676727116460382E-01 1.1675165859228878E-01 + 1.1673603300979526E-01 1.1672039440614151E-01 1.1670474277033405E-01 1.1668907809136760E-01 1.1667340035822520E-01 + 1.1665770955987818E-01 1.1664200568528617E-01 1.1662628872339714E-01 1.1661055866314735E-01 1.1659481549346147E-01 + 1.1657905920325240E-01 1.1656328978142161E-01 1.1654750721685880E-01 1.1653171149844216E-01 1.1651590261503832E-01 + 1.1650008055550223E-01 1.1648424530867736E-01 1.1646839686339572E-01 1.1645253520847773E-01 1.1643666033273226E-01 + 1.1642077222495673E-01 1.1640487087393715E-01 1.1638895626844803E-01 1.1637302839725236E-01 1.1635708724910186E-01 + 1.1634113281273671E-01 1.1632516507688583E-01 1.1630918403026652E-01 1.1629318966158500E-01 1.1627718195953597E-01 + 1.1626116091280289E-01 1.1624512651005789E-01 1.1622907873996173E-01 1.1621301759116394E-01 1.1619694305230288E-01 + 1.1618085511200553E-01 1.1616475375888771E-01 1.1614863898155399E-01 1.1613251076859780E-01 1.1611636910860135E-01 + 1.1610021399013572E-01 1.1608404540176082E-01 1.1606786333202544E-01 1.1605166776946735E-01 1.1603545870261306E-01 + 1.1601923611997818E-01 1.1600300001006708E-01 1.1598675036137336E-01 1.1597048716237933E-01 1.1595421040155651E-01 + 1.1593792006736529E-01 1.1592161614825519E-01 1.1590529863266480E-01 1.1588896750902165E-01 1.1587262276574256E-01 + 1.1585626439123330E-01 1.1583989237388885E-01 1.1582350670209335E-01 1.1580710736422004E-01 1.1579069434863146E-01 + 1.1577426764367925E-01 1.1575782723770432E-01 1.1574137311903693E-01 1.1572490527599637E-01 1.1570842369689148E-01 + 1.1569192837002019E-01 1.1567541928366995E-01 1.1565889642611740E-01 1.1564235978562863E-01 1.1562580935045909E-01 + 1.1560924510885369E-01 1.1559266704904668E-01 1.1557607515926181E-01 1.1555946942771235E-01 1.1554284984260092E-01 + 1.1552621639211987E-01 1.1550956906445083E-01 1.1549290784776518E-01 1.1547623273022375E-01 1.1545954369997710E-01 + 1.1544284074516528E-01 1.1542612385391803E-01 1.1540939301435477E-01 1.1539264821458456E-01 1.1537588944270623E-01 + 1.1535911668680827E-01 1.1534232993496898E-01 1.1532552917525639E-01 1.1530871439572830E-01 1.1529188558443237E-01 + 1.1527504272940613E-01 1.1525818581867689E-01 1.1524131484026193E-01 1.1522442978216833E-01 1.1520753063239324E-01 + 1.1519061737892365E-01 1.1517369000973653E-01 1.1515674851279893E-01 1.1513979287606785E-01 1.1512282308749042E-01 + 1.1510583913500372E-01 1.1508884100653498E-01 1.1507182869000161E-01 1.1505480217331109E-01 1.1503776144436106E-01 + 1.1502070649103942E-01 1.1500363730122415E-01 1.1498655386278367E-01 1.1496945616357647E-01 1.1495234419145145E-01 + 1.1493521793424777E-01 1.1491807737979491E-01 1.1490092251591280E-01 1.1488375333041169E-01 1.1486656981109218E-01 + 1.1484937194574547E-01 1.1483215972215310E-01 1.1481493312808709E-01 1.1479769215131014E-01 1.1478043677957522E-01 + 1.1476316700062611E-01 1.1474588280219707E-01 1.1472858417201295E-01 1.1471127109778941E-01 1.1469394356723253E-01 + 1.1467660156803929E-01 1.1465924508789727E-01 1.1464187411448495E-01 1.1462448863547142E-01 1.1460708863851665E-01 + 1.1458967411127144E-01 1.1457224504137752E-01 1.1455480141646733E-01 1.1453734322416440E-01 1.1451987045208308E-01 + 1.1450238308782876E-01 1.1448488111899779E-01 1.1446736453317762E-01 1.1444983331794657E-01 1.1443228746087428E-01 + 1.1441472694952129E-01 1.1439715177143941E-01 1.1437956191417156E-01 1.1436195736525190E-01 1.1434433811220567E-01 + 1.1432670414254957E-01 1.1430905544379145E-01 1.1429139200343046E-01 1.1427371380895715E-01 1.1425602084785341E-01 + 1.1423831310759257E-01 1.1422059057563928E-01 1.1420285323944973E-01 1.1418510108647160E-01 1.1416733410414409E-01 + 1.1414955227989784E-01 1.1413175560115520E-01 1.1411394405533005E-01 1.1409611762982794E-01 1.1407827631204606E-01 + 1.1406042008937334E-01 1.1404254894919040E-01 1.1402466287886961E-01 1.1400676186577517E-01 1.1398884589726310E-01 + 1.1397091496068121E-01 1.1395296904336930E-01 1.1393500813265894E-01 1.1391703221587378E-01 1.1389904128032945E-01 + 1.1388103531333346E-01 1.1386301430218547E-01 1.1384497823417718E-01 1.1382692709659244E-01 1.1380886087670716E-01 + 1.1379077956178953E-01 1.1377268313909979E-01 1.1375457159589054E-01 1.1373644491940667E-01 1.1371830309688527E-01 + 1.1370014611555583E-01 1.1368197396264015E-01 1.1366378662535256E-01 1.1364558409089967E-01 1.1362736634648068E-01 + 1.1360913337928723E-01 1.1359088517650352E-01 1.1357262172530629E-01 1.1355434301286491E-01 1.1353604902634144E-01 + 1.1351773975289051E-01 1.1349941517965954E-01 1.1348107529378865E-01 1.1346272008241079E-01 1.1344434953265162E-01 + 1.1342596363162973E-01 1.1340756236645659E-01 1.1338914572423661E-01 1.1337071369206705E-01 1.1335226625703829E-01 + 1.1333380340623359E-01 1.1331532512672943E-01 1.1329683140559528E-01 1.1327832222989376E-01 1.1325979758668064E-01 + 1.1324125746300495E-01 1.1322270184590899E-01 1.1320413072242820E-01 1.1318554407959144E-01 1.1316694190442092E-01 + 1.1314832418393220E-01 1.1312969090513429E-01 1.1311104205502961E-01 1.1309237762061421E-01 1.1307369758887753E-01 + 1.1305500194680264E-01 1.1303629068136627E-01 1.1301756377953870E-01 1.1299882122828404E-01 1.1298006301456003E-01 + 1.1296128912531810E-01 1.1294249954750368E-01 1.1292369426805590E-01 1.1290487327390779E-01 1.1288603655198635E-01 + 1.1286718408921249E-01 1.1284831587250115E-01 1.1282943188876124E-01 1.1281053212489588E-01 1.1279161656780212E-01 + 1.1277268520437138E-01 1.1275373802148909E-01 1.1273477500603500E-01 1.1271579614488315E-01 1.1269680142490182E-01 + 1.1267779083295376E-01 1.1265876435589602E-01 1.1263972198058012E-01 1.1262066369385200E-01 1.1260158948255225E-01 + 1.1258249933351591E-01 1.1256339323357266E-01 1.1254427116954679E-01 1.1252513312825733E-01 1.1250597909651802E-01 + 1.1248680906113728E-01 1.1246762300891842E-01 1.1244842092665962E-01 1.1242920280115391E-01 1.1240996861918921E-01 + 1.1239071836754856E-01 1.1237145203300983E-01 1.1235216960234612E-01 1.1233287106232551E-01 1.1231355639971133E-01 + 1.1229422560126195E-01 1.1227487865373119E-01 1.1225551554386798E-01 1.1223613625841662E-01 1.1221674078411677E-01 + 1.1219732910770354E-01 1.1217790121590739E-01 1.1215845709545437E-01 1.1213899673306603E-01 1.1211952011545954E-01 + 1.1210002722934764E-01 1.1208051806143880E-01 1.1206099259843715E-01 1.1204145082704264E-01 1.1202189273395098E-01 + 1.1200231830585376E-01 1.1198272752943852E-01 1.1196312039138860E-01 1.1194349687838345E-01 1.1192385697709853E-01 + 1.1190420067420534E-01 1.1188452795637160E-01 1.1186483881026105E-01 1.1184513322253384E-01 1.1182541117984621E-01 + 1.1180567266885083E-01 1.1178591767619664E-01 1.1176614618852906E-01 1.1174635819248997E-01 1.1172655367471762E-01 + 1.1170673262184704E-01 1.1168689502050956E-01 1.1166704085733341E-01 1.1164717011894336E-01 1.1162728279196101E-01 + 1.1160737886300465E-01 1.1158745831868949E-01 1.1156752114562755E-01 1.1154756733042784E-01 1.1152759685969635E-01 + 1.1150760972003601E-01 1.1148760589804697E-01 1.1146758538032636E-01 1.1144754815346856E-01 1.1142749420406521E-01 + 1.1140742351870511E-01 1.1138733608397453E-01 1.1136723188645696E-01 1.1134711091273340E-01 1.1132697314938238E-01 + 1.1130681858297976E-01 1.1128664720009922E-01 1.1126645898731187E-01 1.1124625393118656E-01 1.1122603201828993E-01 + 1.1120579323518624E-01 1.1118553756843777E-01 1.1116526500460454E-01 1.1114497553024448E-01 1.1112466913191364E-01 + 1.1110434579616603E-01 1.1108400550955368E-01 1.1106364825862686E-01 1.1104327402993396E-01 1.1102288281002161E-01 + 1.1100247458543480E-01 1.1098204934271681E-01 1.1096160706840935E-01 1.1094114774905252E-01 1.1092067137118501E-01 + 1.1090017792134399E-01 1.1087966738606528E-01 1.1085913975188337E-01 1.1083859500533144E-01 1.1081803313294149E-01 + 1.1079745412124427E-01 1.1077685795676948E-01 1.1075624462604568E-01 1.1073561411560054E-01 1.1071496641196059E-01 + 1.1069430150165166E-01 1.1067361937119854E-01 1.1065292000712540E-01 1.1063220339595554E-01 1.1061146952421161E-01 + 1.1059071837841571E-01 1.1056994994508927E-01 1.1054916421075318E-01 1.1052836116192803E-01 1.1050754078513383E-01 + 1.1048670306689030E-01 1.1046584799371693E-01 1.1044497555213290E-01 1.1042408572865720E-01 1.1040317850980877E-01 + 1.1038225388210642E-01 1.1036131183206896E-01 1.1034035234621528E-01 1.1031937541106433E-01 1.1029838101313530E-01 + 1.1027736913894748E-01 1.1025633977502053E-01 1.1023529290787444E-01 1.1021422852402954E-01 1.1019314661000666E-01 + 1.1017204715232715E-01 1.1015093013751286E-01 1.1012979555208628E-01 1.1010864338257070E-01 1.1008747361549008E-01 + 1.1006628623736908E-01 1.1004508123473339E-01 1.1002385859410953E-01 1.1000261830202503E-01 1.0998136034500851E-01 + 1.0996008470958951E-01 1.0993879138229901E-01 1.0991748034966896E-01 1.0989615159823274E-01 1.0987480511452503E-01 + 1.0985344088508191E-01 1.0983205889644089E-01 1.0981065913514113E-01 1.0978924158772319E-01 1.0976780624072945E-01 + 1.0974635308070389E-01 1.0972488209419229E-01 1.0970339326774234E-01 1.0968188658790347E-01 1.0966036204122720E-01 + 1.0963881961426697E-01 1.0961725929357845E-01 1.0959568106571922E-01 1.0957408491724929E-01 1.0955247083473084E-01 + 1.0953083880472832E-01 1.0950918881380872E-01 1.0948752084854138E-01 1.0946583489549820E-01 1.0944413094125365E-01 + 1.0942240897238485E-01 1.0940066897547168E-01 1.0937891093709669E-01 1.0935713484384534E-01 1.0933534068230602E-01 + 1.0931352843907007E-01 1.0929169810073178E-01 1.0926984965388871E-01 1.0924798308514137E-01 1.0922609838109375E-01 + 1.0920419552835285E-01 1.0918227451352926E-01 1.0916033532323689E-01 1.0913837794409315E-01 1.0911640236271899E-01 + 1.0909440856573908E-01 1.0907239653978164E-01 1.0905036627147874E-01 1.0902831774746621E-01 1.0900625095438383E-01 + 1.0898416587887527E-01 1.0896206250758829E-01 1.0893994082717467E-01 1.0891780082429040E-01 1.0889564248559563E-01 + 1.0887346579775485E-01 1.0885127074743695E-01 1.0882905732131515E-01 1.0880682550606717E-01 1.0878457528837539E-01 + 1.0876230665492673E-01 1.0874001959241285E-01 1.0871771408753017E-01 1.0869539012697990E-01 1.0867304769746822E-01 + 1.0865068678570627E-01 1.0862830737841020E-01 1.0860590946230132E-01 1.0858349302410604E-01 1.0856105805055619E-01 + 1.0853860452838866E-01 1.0851613244434601E-01 1.0849364178517604E-01 1.0847113253763223E-01 1.0844860468847360E-01 + 1.0842605822446480E-01 1.0840349313237634E-01 1.0838090939898441E-01 1.0835830701107126E-01 1.0833568595542484E-01 + 1.0831304621883937E-01 1.0829038778811506E-01 1.0826771065005833E-01 1.0824501479148178E-01 1.0822230019920438E-01 + 1.0819956686005146E-01 1.0817681476085488E-01 1.0815404388845289E-01 1.0813125422969046E-01 1.0810844577141920E-01 + 1.0808561850049753E-01 1.0806277240379057E-01 1.0803990746817040E-01 1.0801702368051615E-01 1.0799412102771386E-01 + 1.0797119949665673E-01 1.0794825907424518E-01 1.0792529974738688E-01 1.0790232150299686E-01 1.0787932432799752E-01 + 1.0785630820931871E-01 1.0783327313389798E-01 1.0781021908868041E-01 1.0778714606061880E-01 1.0776405403667375E-01 + 1.0774094300381373E-01 1.0771781294901515E-01 1.0769466385926242E-01 1.0767149572154805E-01 1.0764830852287263E-01 + 1.0762510225024514E-01 1.0760187689068278E-01 1.0757863243121114E-01 1.0755536885886433E-01 1.0753208616068495E-01 + 1.0750878432372427E-01 1.0748546333504216E-01 1.0746212318170741E-01 1.0743876385079755E-01 1.0741538532939914E-01 + 1.0739198760460762E-01 1.0736857066352758E-01 1.0734513449327279E-01 1.0732167908096628E-01 1.0729820441374027E-01 + 1.0727471047873659E-01 1.0725119726310631E-01 1.0722766475401024E-01 1.0720411293861870E-01 1.0718054180411180E-01 + 1.0715695133767937E-01 1.0713334152652117E-01 1.0710971235784690E-01 1.0708606381887621E-01 1.0706239589683897E-01 + 1.0703870857897521E-01 1.0701500185253511E-01 1.0699127570477934E-01 1.0696753012297897E-01 1.0694376509441550E-01 + 1.0691998060638110E-01 1.0689617664617854E-01 1.0687235320112136E-01 1.0684851025853399E-01 1.0682464780575170E-01 + 1.0680076583012077E-01 1.0677686431899854E-01 1.0675294325975353E-01 1.0672900263976548E-01 1.0670504244642544E-01 + 1.0668106266713592E-01 1.0665706328931079E-01 1.0663304430037561E-01 1.0660900568776750E-01 1.0658494743893536E-01 + 1.0656086954133986E-01 1.0653677198245361E-01 1.0651265474976110E-01 1.0648851783075904E-01 1.0646436121295615E-01 + 1.0644018488387341E-01 1.0641598883104411E-01 1.0639177304201397E-01 1.0636753750434116E-01 1.0634328220559638E-01 + 1.0631900713336301E-01 1.0629471227523719E-01 1.0627039761882778E-01 1.0624606315175662E-01 1.0622170886165851E-01 + 1.0619733473618133E-01 1.0617294076298606E-01 1.0614852692974697E-01 1.0612409322415163E-01 1.0609963963390107E-01 + 1.0607516614670973E-01 1.0605067275030565E-01 1.0602615943243060E-01 1.0600162618084003E-01 1.0597707298330324E-01 + 1.0595249982760348E-01 1.0592790670153797E-01 1.0590329359291809E-01 1.0587866048956936E-01 1.0585400737933150E-01 + 1.0582933425005878E-01 1.0580464108961971E-01 1.0577992788589739E-01 1.0575519462678963E-01 1.0573044130020882E-01 + 1.0570566789408224E-01 1.0568087439635199E-01 1.0565606079497515E-01 1.0563122707792388E-01 1.0560637323318547E-01 + 1.0558149924876242E-01 1.0555660511267261E-01 1.0553169081294927E-01 1.0550675633764116E-01 1.0548180167481265E-01 + 1.0545682681254370E-01 1.0543183173893012E-01 1.0540681644208358E-01 1.0538178091013160E-01 1.0535672513121785E-01 + 1.0533164909350207E-01 1.0530655278516017E-01 1.0528143619438446E-01 1.0525629930938357E-01 1.0523114211838265E-01 + 1.0520596460962332E-01 1.0518076677136411E-01 1.0515554859188006E-01 1.0513031005946311E-01 1.0510505116242225E-01 + 1.0507977188908338E-01 1.0505447222778956E-01 1.0502915216690105E-01 1.0500381169479545E-01 1.0497845079986769E-01 + 1.0495306947053024E-01 1.0492766769521314E-01 1.0490224546236403E-01 1.0487680276044845E-01 1.0485133957794959E-01 + 1.0482585590336878E-01 1.0480035172522528E-01 1.0477482703205658E-01 1.0474928181241823E-01 1.0472371605488424E-01 + 1.0469812974804696E-01 1.0467252288051722E-01 1.0464689544092456E-01 1.0462124741791708E-01 1.0459557880016175E-01 + 1.0456988957634432E-01 1.0454417973516963E-01 1.0451844926536150E-01 1.0449269815566288E-01 1.0446692639483611E-01 + 1.0444113397166269E-01 1.0441532087494372E-01 1.0438948709349974E-01 1.0436363261617092E-01 1.0433775743181722E-01 + 1.0431186152931839E-01 1.0428594489757402E-01 1.0426000752550384E-01 1.0423404940204754E-01 1.0420807051616512E-01 + 1.0418207085683683E-01 1.0415605041306332E-01 1.0413000917386571E-01 1.0410394712828572E-01 1.0407786426538576E-01 + 1.0405176057424895E-01 1.0402563604397935E-01 1.0399949066370190E-01 1.0397332442256278E-01 1.0394713730972908E-01 + 1.0392092931438937E-01 1.0389470042575341E-01 1.0386845063305251E-01 1.0384217992553950E-01 1.0381588829248878E-01 + 1.0378957572319665E-01 1.0376324220698110E-01 1.0373688773318210E-01 1.0371051229116167E-01 1.0368411587030395E-01 + 1.0365769846001528E-01 1.0363126004972445E-01 1.0360480062888248E-01 1.0357832018696307E-01 1.0355181871346242E-01 + 1.0352529619789960E-01 1.0349875262981630E-01 1.0347218799877733E-01 1.0344560229437040E-01 1.0341899550620631E-01 + 1.0339236762391915E-01 1.0336571863716627E-01 1.0333904853562845E-01 1.0331235730901001E-01 1.0328564494703878E-01 + 1.0325891143946642E-01 1.0323215677606831E-01 1.0320538094664380E-01 1.0317858394101623E-01 1.0315176574903297E-01 + 1.0312492636056569E-01 1.0309806576551038E-01 1.0307118395378738E-01 1.0304428091534155E-01 1.0301735664014233E-01 + 1.0299041111818398E-01 1.0296344433948540E-01 1.0293645629409058E-01 1.0290944697206837E-01 1.0288241636351286E-01 + 1.0285536445854322E-01 1.0282829124730405E-01 1.0280119671996532E-01 1.0277408086672250E-01 1.0274694367779667E-01 + 1.0271978514343472E-01 1.0269260525390921E-01 1.0266540399951875E-01 1.0263818137058796E-01 1.0261093735746751E-01 + 1.0258367195053433E-01 1.0255638514019177E-01 1.0252907691686951E-01 1.0250174727102376E-01 1.0247439619313739E-01 + 1.0244702367372009E-01 1.0241962970330828E-01 1.0239221427246538E-01 1.0236477737178185E-01 1.0233731899187525E-01 + 1.0230983912339051E-01 1.0228233775699977E-01 1.0225481488340277E-01 1.0222727049332671E-01 1.0219970457752652E-01 + 1.0217211712678485E-01 1.0214450813191224E-01 1.0211687758374723E-01 1.0208922547315641E-01 1.0206155179103454E-01 + 1.0203385652830474E-01 1.0200613967591846E-01 1.0197840122485563E-01 1.0195064116612480E-01 1.0192285949076328E-01 + 1.0189505618983707E-01 1.0186723125444121E-01 1.0183938467569963E-01 1.0181151644476549E-01 1.0178362655282111E-01 + 1.0175571499107816E-01 1.0172778175077778E-01 1.0169982682319051E-01 1.0167185019961672E-01 1.0164385187138641E-01 + 1.0161583182985948E-01 1.0158779006642575E-01 1.0155972657250513E-01 1.0153164133954770E-01 1.0150353435903381E-01 + 1.0147540562247422E-01 1.0144725512141010E-01 1.0141908284741327E-01 1.0139088879208620E-01 1.0136267294706224E-01 + 1.0133443530400556E-01 1.0130617585461139E-01 1.0127789459060609E-01 1.0124959150374720E-01 1.0122126658582359E-01 + 1.0119291982865559E-01 1.0116455122409516E-01 1.0113616076402572E-01 1.0110774844036259E-01 1.0107931424505288E-01 + 1.0105085817007572E-01 1.0102238020744232E-01 1.0099388034919596E-01 1.0096535858741230E-01 1.0093681491419944E-01 + 1.0090824932169785E-01 1.0087966180208073E-01 1.0085105234755390E-01 1.0082242095035604E-01 1.0079376760275878E-01 + 1.0076509229706673E-01 1.0073639502561771E-01 1.0070767578078271E-01 1.0067893455496615E-01 1.0065017134060585E-01 + 1.0062138613017323E-01 1.0059257891617340E-01 1.0056374969114525E-01 1.0053489844766150E-01 1.0050602517832896E-01 + 1.0047712987578848E-01 1.0044821253271517E-01 1.0041927314181845E-01 1.0039031169584212E-01 1.0036132818756457E-01 + 1.0033232260979887E-01 1.0030329495539271E-01 1.0027424521722877E-01 1.0024517338822467E-01 1.0021607946133304E-01 + 1.0018696342954174E-01 1.0015782528587398E-01 1.0012866502338824E-01 1.0009948263517862E-01 1.0007027811437477E-01 + 1.0004105145414210E-01 1.0001180264768186E-01 9.9982531688231180E-02 9.9953238569063296E-02 9.9923923283487565E-02 + 9.9894585824849655E-02 9.9865226186531555E-02 9.9835844361951753E-02 9.9806440344565345E-02 9.9777014127864092E-02 + 9.9747565705376615E-02 9.9718095070668367E-02 9.9688602217341923E-02 9.9659087139036914E-02 9.9629549829430258E-02 + 9.9599990282236178E-02 9.9570408491206380E-02 9.9540804450130152E-02 9.9511178152834417E-02 9.9481529593183973E-02 + 9.9451858765081336E-02 9.9422165662467213E-02 9.9392450279320296E-02 9.9362712609657566E-02 9.9332952647534278E-02 + 9.9303170387044185E-02 9.9273365822319493E-02 9.9243538947531171E-02 9.9213689756888920E-02 9.9183818244641189E-02 + 9.9153924405075602E-02 9.9124008232518768E-02 9.9094069721336456E-02 9.9064108865933836E-02 9.9034125660755423E-02 + 9.9004120100285309E-02 9.8974092179047207E-02 9.8944041891604537E-02 9.8913969232560600E-02 9.8883874196558655E-02 + 9.8853756778282051E-02 9.8823616972454273E-02 9.8793454773839134E-02 9.8763270177240792E-02 9.8733063177503994E-02 + 9.8702833769514040E-02 9.8672581948196933E-02 9.8642307708519603E-02 9.8612011045489820E-02 9.8581691954156433E-02 + 9.8551350429609524E-02 9.8520986466980362E-02 9.8490600061441586E-02 9.8460191208207398E-02 9.8429759902533526E-02 + 9.8399306139717466E-02 9.8368829915098419E-02 9.8338331224057662E-02 9.8307810062018344E-02 9.8277266424445911E-02 + 9.8246700306847928E-02 9.8216111704774386E-02 9.8185500613817728E-02 9.8154867029612985E-02 9.8124210947837825E-02 + 9.8093532364212782E-02 9.8062831274501272E-02 9.8032107674509678E-02 9.8001361560087513E-02 9.7970592927127592E-02 + 9.7939801771565971E-02 9.7908988089382212E-02 9.7878151876599442E-02 9.7847293129284391E-02 9.7816411843547627E-02 + 9.7785508015543546E-02 9.7754581641470537E-02 9.7723632717571160E-02 9.7692661240132095E-02 9.7661667205484415E-02 + 9.7630650610003547E-02 9.7599611450109439E-02 9.7568549722266779E-02 9.7537465422984915E-02 9.7506358548818090E-02 + 9.7475229096365482E-02 9.7444077062271386E-02 9.7412902443225272E-02 9.7381705235961832E-02 9.7350485437261297E-02 + 9.7319243043949233E-02 9.7287978052896962E-02 9.7256690461021450E-02 9.7225380265285544E-02 9.7194047462697997E-02 + 9.7162692050313582E-02 9.7131314025233298E-02 9.7099913384604344E-02 9.7068490125620341E-02 9.7037044245521342E-02 + 9.7005575741594005E-02 9.6974084611171713E-02 9.6942570851634546E-02 9.6911034460409634E-02 9.6879475434971024E-02 + 9.6847893772839935E-02 9.6816289471584785E-02 9.6784662528821327E-02 9.6753012942212765E-02 9.6721340709469916E-02 + 9.6689645828351156E-02 9.6657928296662698E-02 9.6626188112258579E-02 9.6594425273040879E-02 9.6562639776959711E-02 + 9.6530831622013397E-02 9.6499000806248555E-02 9.6467147327760225E-02 9.6435271184691959E-02 9.6403372375235941E-02 + 9.6371450897633021E-02 9.6339506750172929E-02 9.6307539931194383E-02 9.6275550439085034E-02 9.6243538272281784E-02 + 9.6211503429270734E-02 9.6179445908587374E-02 9.6147365708816671E-02 9.6115262828593118E-02 9.6083137266600976E-02 + 9.6050989021574204E-02 9.6018818092296704E-02 9.5986624477602381E-02 9.5954408176375211E-02 9.5922169187549394E-02 + 9.5889907510109451E-02 9.5857623143090334E-02 9.5825316085577483E-02 9.5792986336706992E-02 9.5760633895665664E-02 + 9.5728258761691179E-02 9.5695860934072174E-02 9.5663440412148248E-02 9.5630997195310222E-02 9.5598531283000193E-02 + 9.5566042674711568E-02 9.5533531369989211E-02 9.5500997368429610E-02 9.5468440669680923E-02 9.5435861273443001E-02 + 9.5403259179467695E-02 9.5370634387558773E-02 9.5337986897572100E-02 9.5305316709415708E-02 9.5272623823050004E-02 + 9.5239908238487714E-02 9.5207169955794133E-02 9.5174408975087083E-02 9.5141625296537150E-02 9.5108818920367724E-02 + 9.5075989846855100E-02 9.5043138076328582E-02 9.5010263609170642E-02 9.4977366445816891E-02 9.4944446586756326E-02 + 9.4911504032531360E-02 9.4878538783737906E-02 9.4845550841025528E-02 9.4812540205097523E-02 9.4779506876711023E-02 + 9.4746450856677086E-02 9.4713372145860786E-02 9.4680270745181400E-02 9.4647146655612344E-02 9.4613999878181490E-02 + 9.4580830413971029E-02 9.4547638264117800E-02 9.4514423429813199E-02 9.4481185912303423E-02 9.4447925712889472E-02 + 9.4414642832927304E-02 9.4381337273827942E-02 9.4348009037057506E-02 9.4314658124137404E-02 9.4281284536644333E-02 + 9.4247888276210473E-02 9.4214469344523558E-02 9.4181027743326901E-02 9.4147563474419591E-02 9.4114076539656602E-02 + 9.4080566940948698E-02 9.4047034680262875E-02 9.4013479759622084E-02 9.3979902181105607E-02 9.3946301946849081E-02 + 9.3912679059044449E-02 9.3879033519940300E-02 9.3845365331841804E-02 9.3811674497110809E-02 9.3777961018166031E-02 + 9.3744224897483130E-02 9.3710466137594664E-02 9.3676684741090449E-02 9.3642880710617382E-02 9.3609054048879703E-02 + 9.3575204758639091E-02 9.3541332842714667E-02 9.3507438303983170E-02 9.3473521145379018E-02 9.3439581369894387E-02 + 9.3405618980579405E-02 9.3371633980542088E-02 9.3337626372948526E-02 9.3303596161023059E-02 9.3269543348048198E-02 + 9.3235467937364827E-02 9.3201369932372297E-02 9.3167249336528507E-02 9.3133106153349923E-02 9.3098940386411796E-02 + 9.3064752039348234E-02 9.3030541115852183E-02 9.2996307619675658E-02 9.2962051554629749E-02 9.2927772924584706E-02 + 9.2893471733470193E-02 9.2859147985275087E-02 9.2824801684047845E-02 9.2790432833896472E-02 9.2756041438988648E-02 + 9.2721627503551729E-02 9.2687191031872992E-02 9.2652732028299600E-02 9.2618250497238749E-02 9.2583746443157755E-02 + 9.2549219870584148E-02 9.2514670784105746E-02 9.2480099188370732E-02 9.2445505088087770E-02 9.2410888488026130E-02 + 9.2376249393015697E-02 9.2341587807947129E-02 9.2306903737771867E-02 9.2272197187502333E-02 9.2237468162211941E-02 + 9.2202716667035195E-02 9.2167942707167799E-02 9.2133146287866730E-02 9.2098327414450343E-02 9.2063486092298405E-02 + 9.2028622326852286E-02 9.1993736123614972E-02 9.1958827488151068E-02 9.1923896426087129E-02 9.1888942943111507E-02 + 9.1853967044974547E-02 9.1818968737488627E-02 9.1783948026528367E-02 9.1748904918030491E-02 9.1713839417994131E-02 + 9.1678751532480798E-02 9.1643641267614498E-02 9.1608508629581795E-02 9.1573353624631912E-02 9.1538176259076842E-02 + 9.1502976539291347E-02 9.1467754471713181E-02 9.1432510062842989E-02 9.1397243319244606E-02 9.1361954247544910E-02 + 9.1326642854434148E-02 9.1291309146665778E-02 9.1255953131056722E-02 9.1220574814487379E-02 9.1185174203901737E-02 + 9.1149751306307425E-02 9.1114306128775788E-02 9.1078838678442020E-02 9.1043348962505197E-02 9.1007836988228327E-02 + 9.0972302762938537E-02 9.0936746294027107E-02 9.0901167588949450E-02 9.0865566655225355E-02 9.0829943500438923E-02 + 9.0794298132238771E-02 9.0758630558337966E-02 9.0722940786514286E-02 9.0687228824610125E-02 9.0651494680532671E-02 + 9.0615738362253978E-02 9.0579959877810964E-02 9.0544159235305621E-02 9.0508336442904930E-02 9.0472491508841082E-02 + 9.0436624441411526E-02 9.0400735248978958E-02 9.0364823939971445E-02 9.0328890522882552E-02 9.0292935006271349E-02 + 9.0256957398762550E-02 9.0220957709046479E-02 9.0184935945879313E-02 9.0148892118082954E-02 9.0112826234545237E-02 + 9.0076738304220028E-02 9.0040628336127179E-02 9.0004496339352674E-02 8.9968342323048706E-02 8.9932166296433746E-02 + 8.9895968268792564E-02 8.9859748249476346E-02 8.9823506247902807E-02 8.9787242273556125E-02 8.9750956335987175E-02 + 8.9714648444813500E-02 8.9678318609719407E-02 8.9641966840456014E-02 8.9605593146841356E-02 8.9569197538760484E-02 + 8.9532780026165396E-02 8.9496340619075271E-02 8.9459879327576403E-02 8.9423396161822405E-02 8.9386891132034157E-02 + 8.9350364248499889E-02 8.9313815521575343E-02 8.9277244961683710E-02 8.9240652579315807E-02 8.9204038385030091E-02 + 8.9167402389452685E-02 8.9130744603277495E-02 8.9094065037266329E-02 8.9057363702248843E-02 8.9020640609122667E-02 + 8.8983895768853488E-02 8.8947129192475063E-02 8.8910340891089332E-02 8.8873530875866427E-02 8.8836699158044818E-02 + 8.8799845748931266E-02 8.8762970659900964E-02 8.8726073902397590E-02 8.8689155487933324E-02 8.8652215428088973E-02 + 8.8615253734514010E-02 8.8578270418926547E-02 8.8541265493113530E-02 8.8504238968930754E-02 8.8467190858302902E-02 + 8.8430121173223533E-02 8.8393029925755290E-02 8.8355917128029884E-02 8.8318782792248141E-02 8.8281626930680049E-02 + 8.8244449555664878E-02 8.8207250679611160E-02 8.8170030314996789E-02 8.8132788474369103E-02 8.8095525170344871E-02 + 8.8058240415610389E-02 8.8020934222921537E-02 8.7983606605103806E-02 8.7946257575052408E-02 8.7908887145732306E-02 + 8.7871495330178157E-02 8.7834082141494602E-02 8.7796647592856075E-02 8.7759191697507025E-02 8.7721714468761841E-02 + 8.7684215920005068E-02 8.7646696064691235E-02 8.7609154916345106E-02 8.7571592488561639E-02 8.7534008795006044E-02 + 8.7496403849413873E-02 8.7458777665590959E-02 8.7421130257413604E-02 8.7383461638828569E-02 8.7345771823853072E-02 + 8.7308060826574899E-02 8.7270328661152460E-02 8.7232575341814819E-02 8.7194800882861648E-02 8.7157005298663465E-02 + 8.7119188603661510E-02 8.7081350812367855E-02 8.7043491939365503E-02 8.7005611999308313E-02 8.6967711006921120E-02 + 8.6929788976999767E-02 8.6891845924411223E-02 8.6853881864093430E-02 8.6815896811055560E-02 8.6777890780377925E-02 + 8.6739863787212101E-02 8.6701815846780841E-02 8.6663746974378314E-02 8.6625657185369964E-02 8.6587546495192638E-02 + 8.6549414919354625E-02 8.6511262473435643E-02 8.6473089173086951E-02 8.6434895034031345E-02 8.6396680072063192E-02 + 8.6358444303048509E-02 8.6320187742924923E-02 8.6281910407701792E-02 8.6243612313460186E-02 8.6205293476352945E-02 + 8.6166953912604746E-02 8.6128593638512094E-02 8.6090212670443325E-02 8.6051811024838692E-02 8.6013388718210460E-02 + 8.5974945767142791E-02 8.5936482188291904E-02 8.5897997998386030E-02 8.5859493214225507E-02 8.5820967852682756E-02 + 8.5782421930702360E-02 8.5743855465301014E-02 8.5705268473567714E-02 8.5666660972663580E-02 8.5628032979822091E-02 + 8.5589384512348946E-02 8.5550715587622186E-02 8.5512026223092216E-02 8.5473316436281754E-02 8.5434586244786045E-02 + 8.5395835666272638E-02 8.5357064718481618E-02 8.5318273419225515E-02 8.5279461786389385E-02 8.5240629837930848E-02 + 8.5201777591879996E-02 8.5162905066339625E-02 8.5124012279485059E-02 8.5085099249564269E-02 8.5046165994897907E-02 + 8.5007212533879287E-02 8.4968238884974415E-02 8.4929245066722045E-02 8.4890231097733651E-02 8.4851196996693523E-02 + 8.4812142782358643E-02 8.4773068473558907E-02 8.4733974089196987E-02 8.4694859648248369E-02 8.4655725169761456E-02 + 8.4616570672857508E-02 8.4577396176730685E-02 8.4538201700648102E-02 8.4498987263949749E-02 8.4459752886048609E-02 + 8.4420498586430595E-02 8.4381224384654660E-02 8.4341930300352710E-02 8.4302616353229651E-02 8.4263282563063480E-02 + 8.4223928949705151E-02 8.4184555533078728E-02 8.4145162333181325E-02 8.4105749370083124E-02 8.4066316663927429E-02 + 8.4026864234930596E-02 8.3987392103382130E-02 8.3947900289644634E-02 8.3908388814153856E-02 8.3868857697418697E-02 + 8.3829306960021194E-02 8.3789736622616504E-02 8.3750146705933032E-02 8.3710537230772278E-02 8.3670908218009002E-02 + 8.3631259688591059E-02 8.3591591663539563E-02 8.3551904163948809E-02 8.3512197210986280E-02 8.3472470825892695E-02 + 8.3432725029982002E-02 8.3392959844641262E-02 8.3353175291330878E-02 8.3313371391584415E-02 8.3273548167008660E-02 + 8.3233705639283631E-02 8.3193843830162581E-02 8.3153962761471995E-02 8.3114062455111548E-02 8.3074142933054193E-02 + 8.3034204217346072E-02 8.2994246330106561E-02 8.2954269293528254E-02 8.2914273129876953E-02 8.2874257861491718E-02 + 8.2834223510784802E-02 8.2794170100241662E-02 8.2754097652420977E-02 8.2714006189954545E-02 8.2673895735547509E-02 + 8.2633766311978080E-02 8.2593617942097700E-02 8.2553450648830962E-02 8.2513264455175678E-02 8.2473059384202740E-02 + 8.2432835459056289E-02 8.2392592702953529E-02 8.2352331139184845E-02 8.2312050791113714E-02 8.2271751682176764E-02 + 8.2231433835883702E-02 8.2191097275817318E-02 8.2150742025633494E-02 8.2110368109061194E-02 8.2069975549902419E-02 + 8.2029564372032196E-02 8.1989134599398605E-02 8.1948686256022724E-02 8.1908219365998666E-02 8.1867733953493435E-02 + 8.1827230042747084E-02 8.1786707658072610E-02 8.1746166823855881E-02 8.1705607564555749E-02 8.1665029904703909E-02 + 8.1624433868904958E-02 8.1583819481836350E-02 8.1543186768248399E-02 8.1502535752964164E-02 8.1461866460879606E-02 + 8.1421178916963349E-02 8.1380473146256876E-02 8.1339749173874334E-02 8.1299007025002590E-02 8.1258246724901242E-02 + 8.1217468298902459E-02 8.1176671772411169E-02 8.1135857170904782E-02 8.1095024519933404E-02 8.1054173845119648E-02 + 8.1013305172158642E-02 8.0972418526818080E-02 8.0931513934938096E-02 8.0890591422431268E-02 8.0849651015282631E-02 + 8.0808692739549590E-02 8.0767716621361924E-02 8.0726722686921715E-02 8.0685710962503418E-02 8.0644681474453694E-02 + 8.0603634249191453E-02 8.0562569313207821E-02 8.0521486693066135E-02 8.0480386415401811E-02 8.0439268506922401E-02 + 8.0398132994407512E-02 8.0356979904708845E-02 8.0315809264750029E-02 8.0274621101526736E-02 8.0233415442106437E-02 + 8.0192192313628646E-02 8.0150951743304652E-02 8.0109693758417547E-02 8.0068418386322240E-02 8.0027125654445377E-02 + 7.9985815590285253E-02 7.9944488221411855E-02 7.9903143575466781E-02 7.9861781680163210E-02 7.9820402563285861E-02 + 7.9779006252690896E-02 7.9737592776305974E-02 7.9696162162130116E-02 7.9654714438233742E-02 7.9613249632758537E-02 + 7.9571767773917529E-02 7.9530268889994871E-02 7.9488753009345978E-02 7.9447220160397319E-02 7.9405670371646475E-02 + 7.9364103671662106E-02 7.9322520089083803E-02 7.9280919652622087E-02 7.9239302391058405E-02 7.9197668333244972E-02 + 7.9156017508104859E-02 7.9114349944631832E-02 7.9072665671890363E-02 7.9030964719015509E-02 7.8989247115212949E-02 + 7.8947512889758834E-02 7.8905762071999813E-02 7.8863994691352995E-02 7.8822210777305751E-02 7.8780410359415784E-02 + 7.8738593467311088E-02 7.8696760130689825E-02 7.8654910379320250E-02 7.8613044243040719E-02 7.8571161751759613E-02 + 7.8529262935455257E-02 7.8487347824175852E-02 7.8445416448039484E-02 7.8403468837233967E-02 7.8361505022016845E-02 + 7.8319525032715318E-02 7.8277528899726168E-02 7.8235516653515705E-02 7.8193488324619712E-02 7.8151443943643331E-02 + 7.8109383541261096E-02 7.8067307148216789E-02 7.8025214795323344E-02 7.7983106513462921E-02 7.7940982333586692E-02 + 7.7898842286714842E-02 7.7856686403936476E-02 7.7814514716409600E-02 7.7772327255361012E-02 7.7730124052086194E-02 + 7.7687905137949320E-02 7.7645670544383150E-02 7.7603420302888970E-02 7.7561154445036473E-02 7.7518873002463753E-02 + 7.7476576006877226E-02 7.7434263490051433E-02 7.7391935483829194E-02 7.7349592020121302E-02 7.7307233130906636E-02 + 7.7264858848231921E-02 7.7222469204211774E-02 7.7180064231028606E-02 7.7137643960932450E-02 7.7095208426241055E-02 + 7.7052757659339596E-02 7.7010291692680810E-02 7.6967810558784738E-02 7.6925314290238772E-02 7.6882802919697513E-02 + 7.6840276479882660E-02 7.6797735003583015E-02 7.6755178523654335E-02 7.6712607073019259E-02 7.6670020684667273E-02 + 7.6627419391654530E-02 7.6584803227103870E-02 7.6542172224204619E-02 7.6499526416212674E-02 7.6456865836450241E-02 + 7.6414190518305822E-02 7.6371500495234126E-02 7.6328795800756050E-02 7.6286076468458447E-02 7.6243342531994135E-02 + 7.6200594025081780E-02 7.6157830981505803E-02 7.6115053435116375E-02 7.6072261419829090E-02 7.6029454969625182E-02 + 7.5986634118551236E-02 7.5943798900719117E-02 7.5900949350305918E-02 7.5858085501553832E-02 7.5815207388770081E-02 + 7.5772315046326838E-02 7.5729408508661125E-02 7.5686487810274594E-02 7.5643552985733664E-02 7.5600604069669244E-02 + 7.5557641096776651E-02 7.5514664101815593E-02 7.5471673119610019E-02 7.5428668185048023E-02 7.5385649333081742E-02 + 7.5342616598727249E-02 7.5299570017064499E-02 7.5256509623237142E-02 7.5213435452452487E-02 7.5170347539981447E-02 + 7.5127245921158270E-02 7.5084130631380613E-02 7.5041001706109306E-02 7.4997859180868348E-02 7.4954703091244732E-02 + 7.4911533472888370E-02 7.4868350361511959E-02 7.4825153792890953E-02 7.4781943802863321E-02 7.4738720427329597E-02 + 7.4695483702252596E-02 7.4652233663657502E-02 7.4608970347631531E-02 7.4565693790324100E-02 7.4522404027946409E-02 + 7.4479101096771555E-02 7.4435785033134388E-02 7.4392455873431254E-02 7.4349113654120058E-02 7.4305758411720060E-02 + 7.4262390182811791E-02 7.4219009004036898E-02 7.4175614912098078E-02 7.4132207943758938E-02 7.4088788135843880E-02 + 7.4045355525237957E-02 7.4001910148886865E-02 7.3958452043796682E-02 7.3914981247033815E-02 7.3871497795724911E-02 + 7.3828001727056655E-02 7.3784493078275767E-02 7.3740971886688780E-02 7.3697438189661957E-02 7.3653892024621179E-02 + 7.3610333429051780E-02 7.3566762440498507E-02 7.3523179096565305E-02 7.3479583434915244E-02 7.3435975493270397E-02 + 7.3392355309411711E-02 7.3348722921178861E-02 7.3305078366470128E-02 7.3261421683242303E-02 7.3217752909510547E-02 + 7.3174072083348252E-02 7.3130379242886873E-02 7.3086674426315903E-02 7.3042957671882680E-02 7.2999229017892284E-02 + 7.2955488502707277E-02 7.2911736164747859E-02 7.2867972042491388E-02 7.2824196174472583E-02 7.2780408599283072E-02 + 7.2736609355571538E-02 7.2692798482043450E-02 7.2648976017460884E-02 7.2605142000642553E-02 7.2561296470463471E-02 + 7.2517439465854941E-02 7.2473571025804484E-02 7.2429691189355522E-02 7.2385799995607389E-02 7.2341897483715084E-02 + 7.2297983692889270E-02 7.2254058662395995E-02 7.2210122431556653E-02 7.2166175039747774E-02 7.2122216526400940E-02 + 7.2078246931002649E-02 7.2034266293094090E-02 7.1990274652271133E-02 7.1946272048184060E-02 7.1902258520537485E-02 + 7.1858234109090230E-02 7.1814198853655156E-02 7.1770152794099026E-02 7.1726095970342324E-02 7.1682028422359184E-02 + 7.1637950190177158E-02 7.1593861313877155E-02 7.1549761833593281E-02 7.1505651789512625E-02 7.1461531221875138E-02 + 7.1417400170973575E-02 7.1373258677153203E-02 7.1329106780811793E-02 7.1284944522399363E-02 7.1240771942418096E-02 + 7.1196589081422110E-02 7.1152395980017449E-02 7.1108192678861801E-02 7.1063979218664336E-02 7.1019755640185742E-02 + 7.0975521984237802E-02 7.0931278291683497E-02 7.0887024603436655E-02 7.0842760960461937E-02 7.0798487403774604E-02 + 7.0754203974440322E-02 7.0709910713575186E-02 7.0665607662345392E-02 7.0621294861967110E-02 7.0576972353706385E-02 + 7.0532640178878961E-02 7.0488298378850095E-02 7.0443946995034409E-02 7.0399586068895792E-02 7.0355215641947091E-02 + 7.0310835755750173E-02 7.0266446451915529E-02 7.0222047772102336E-02 7.0177639758018107E-02 7.0133222451418620E-02 + 7.0088795894107839E-02 7.0044360127937508E-02 6.9999915194807305E-02 6.9955461136664399E-02 6.9910997995503460E-02 + 6.9866525813366456E-02 6.9822044632342414E-02 6.9777554494567337E-02 6.9733055442224107E-02 6.9688547517542068E-02 + 6.9644030762797168E-02 6.9599505220311580E-02 6.9554970932453594E-02 6.9510427941637504E-02 6.9465876290323358E-02 + 6.9421316021016852E-02 6.9376747176269113E-02 6.9332169798676582E-02 6.9287583930880817E-02 6.9242989615568282E-02 + 6.9198386895470282E-02 6.9153775813362683E-02 6.9109156412065789E-02 6.9064528734444214E-02 6.9019892823406606E-02 + 6.8975248721905594E-02 6.8930596472937505E-02 6.8885936119542274E-02 6.8841267704803227E-02 6.8796591271846938E-02 + 6.8751906863842999E-02 6.8707214524003912E-02 6.8662514295584870E-02 6.8617806221883626E-02 6.8573090346240248E-02 + 6.8528366712037006E-02 6.8483635362698136E-02 6.8438896341689787E-02 6.8394149692519626E-02 6.8349395458736903E-02 + 6.8304633683932095E-02 6.8259864411736815E-02 6.8215087685823628E-02 6.8170303549905803E-02 6.8125512047737216E-02 + 6.8080713223112141E-02 6.8035907119865041E-02 6.7991093781870460E-02 6.7946273253042727E-02 6.7901445577335892E-02 + 6.7856610798743486E-02 6.7811768961298327E-02 6.7766920109072343E-02 6.7722064286176456E-02 6.7677201536760295E-02 + 6.7632331905012069E-02 6.7587455435158386E-02 6.7542572171464074E-02 6.7497682158231903E-02 6.7452785439802571E-02 + 6.7407882060554369E-02 6.7362972064903090E-02 6.7318055497301701E-02 6.7273132402240379E-02 6.7228202824246117E-02 + 6.7183266807882669E-02 6.7138324397750276E-02 6.7093375638485539E-02 6.7048420574761208E-02 6.7003459251285979E-02 + 6.6958491712804311E-02 6.6913518004096242E-02 6.6868538169977232E-02 6.6823552255297888E-02 6.6778560304943876E-02 + 6.6733562363835625E-02 6.6688558476928256E-02 6.6643548689211254E-02 6.6598533045708397E-02 6.6553511591477502E-02 + 6.6508484371610194E-02 6.6463451431231849E-02 6.6418412815501218E-02 6.6373368569610403E-02 6.6328318738784559E-02 + 6.6283263368281733E-02 6.6238202503392643E-02 6.6193136189440518E-02 6.6148064471780940E-02 6.6102987395801505E-02 + 6.6057905006921783E-02 6.6012817350593056E-02 6.5967724472298081E-02 6.5922626417551020E-02 6.5877523231897064E-02 + 6.5832414960912383E-02 6.5787301650203869E-02 6.5742183345408919E-02 6.5697060092195336E-02 6.5651931936260954E-02 + 6.5606798923333612E-02 6.5561661099170887E-02 6.5516518509559821E-02 6.5471371200316875E-02 6.5426219217287598E-02 + 6.5381062606346491E-02 6.5335901413396805E-02 6.5290735684370271E-02 6.5245565465226987E-02 6.5200390801955208E-02 + 6.5155211740571053E-02 6.5110028327118444E-02 6.5064840607668775E-02 6.5019648628320756E-02 6.4974452435200239E-02 + 6.4929252074459987E-02 6.4884047592279476E-02 6.4838839034864676E-02 6.4793626448447897E-02 6.4748409879287497E-02 + 6.4703189373667772E-02 6.4657964977898663E-02 6.4612736738315676E-02 6.4567504701279491E-02 6.4522268913175959E-02 + 6.4477029420415707E-02 6.4431786269434133E-02 6.4386539506691001E-02 6.4341289178670366E-02 6.4296035331880302E-02 + 6.4250778012852783E-02 6.4205517268143289E-02 6.4160253144330839E-02 6.4114985688017628E-02 6.4069714945828804E-02 + 6.4024440964412427E-02 6.3979163790439039E-02 6.3933883470601582E-02 6.3888600051615216E-02 6.3843313580217026E-02 + 6.3798024103165846E-02 6.3752731667242102E-02 6.3707436319247496E-02 6.3662138106004879E-02 6.3616837074358015E-02 + 6.3571533271171349E-02 6.3526226743329875E-02 6.3480917537738824E-02 6.3435605701323491E-02 6.3390291281029049E-02 + 6.3344974323820330E-02 6.3299654876681571E-02 6.3254332986616285E-02 6.3209008700646954E-02 6.3163682065814852E-02 + 6.3118353129179891E-02 6.3073021937820328E-02 6.3027688538832560E-02 6.2982352979330997E-02 6.2937015306447727E-02 + 6.2891675567332384E-02 6.2846333809151930E-02 6.2800990079090416E-02 6.2755644424348722E-02 6.2710296892144496E-02 + 6.2664947529711787E-02 6.2619596384300841E-02 6.2574243503178001E-02 6.2528888933625418E-02 6.2483532722940799E-02 + 6.2438174918437242E-02 6.2392815567443041E-02 6.2347454717301423E-02 6.2302092415370360E-02 6.2256728709022290E-02 + 6.2211363645644072E-02 6.2165997272636539E-02 6.2120629637414451E-02 6.2075260787406224E-02 6.2029890770053699E-02 + 6.1984519632811971E-02 6.1939147423149099E-02 6.1893774188545962E-02 6.1848399976496021E-02 6.1803024834505074E-02 + 6.1757648810091048E-02 6.1712271950783854E-02 6.1666894304125024E-02 6.1621515917667659E-02 6.1576136838976052E-02 + 6.1530757115625619E-02 6.1485376795202579E-02 6.1439995925303782E-02 6.1394614553536418E-02 6.1349232727517980E-02 + 6.1303850494875814E-02 6.1258467903247057E-02 6.1213085000278333E-02 6.1167701833625680E-02 6.1122318450954082E-02 + 6.1076934899937485E-02 6.1031551228258478E-02 6.0986167483608071E-02 6.0940783713685456E-02 6.0895399966197881E-02 + 6.0850016288860345E-02 6.0804632729395361E-02 6.0759249335532846E-02 6.0713866155009802E-02 6.0668483235570135E-02 + 6.0623100624964399E-02 6.0577718370949676E-02 6.0532336521289219E-02 6.0486955123752351E-02 6.0441574226114174E-02 + 6.0396193876155350E-02 6.0350814121661933E-02 6.0305435010425082E-02 6.0260056590240939E-02 6.0214678908910267E-02 + 6.0169302014238375E-02 6.0123925954034797E-02 6.0078550776113099E-02 6.0033176528290710E-02 5.9987803258388608E-02 + 5.9942431014231190E-02 5.9897059843645968E-02 5.9851689794463411E-02 5.9806320914516750E-02 5.9760953251641637E-02 + 5.9715586853676041E-02 5.9670221768459986E-02 5.9624858043835334E-02 5.9579495727645523E-02 5.9534134867735455E-02 + 5.9488775511951135E-02 5.9443417708139545E-02 5.9398061504148447E-02 5.9352706947826017E-02 5.9307354087020807E-02 + 5.9262002969581389E-02 5.9216653643356210E-02 5.9171306156193343E-02 5.9125960555940223E-02 5.9080616890443569E-02 + 5.9035275207548962E-02 5.8989935555100778E-02 5.8944597980941919E-02 5.8899262532913582E-02 5.8853929258855055E-02 + 5.8808598206603453E-02 5.8763269423993597E-02 5.8717942958857676E-02 5.8672618859025090E-02 5.8627297172322228E-02 + 5.8581977946572251E-02 5.8536661229594819E-02 5.8491347069205932E-02 5.8446035513217712E-02 5.8400726609438132E-02 + 5.8355420405670787E-02 5.8310116949714788E-02 5.8264816289364404E-02 5.8219518472408902E-02 5.8174223546632362E-02 + 5.8128931559813378E-02 5.8083642559724889E-02 5.8038356594133977E-02 5.7993073710801583E-02 5.7947793957482334E-02 + 5.7902517381924305E-02 5.7857244031868836E-02 5.7811973955050257E-02 5.7766707199195702E-02 5.7721443812024854E-02 + 5.7676183841249777E-02 5.7630927334574693E-02 5.7585674339695699E-02 5.7540424904300579E-02 5.7495179076068666E-02 + 5.7449936902670494E-02 5.7404698431767646E-02 5.7359463711012533E-02 5.7314232788048168E-02 5.7269005710507928E-02 + 5.7223782526015392E-02 5.7178563282184042E-02 5.7133348026617112E-02 5.7088136806907330E-02 5.7042929670636740E-02 + 5.6997726665376426E-02 5.6952527838686332E-02 5.6907333238115060E-02 5.6862142911199558E-02 5.6816956905465087E-02 + 5.6771775268424793E-02 5.6726598047579631E-02 5.6681425290418058E-02 5.6636257044415932E-02 5.6591093357036139E-02 + 5.6545934275728536E-02 5.6500779847929575E-02 5.6455630121062250E-02 5.6410485142535730E-02 5.6365344959745253E-02 + 5.6320209620071858E-02 5.6275079170882134E-02 5.6229953659528126E-02 5.6184833133346962E-02 5.6139717639660768E-02 + 5.6094607225776354E-02 5.6049501938985072E-02 5.6004401826562571E-02 5.5959306935768567E-02 5.5914217313846659E-02 + 5.5869133008024083E-02 5.5824054065511504E-02 5.5778980533502810E-02 5.5733912459174931E-02 5.5688849889687538E-02 + 5.5643792872182914E-02 5.5598741453785690E-02 5.5553695681602636E-02 5.5508655602722494E-02 5.5463621264215682E-02 + 5.5418592713134152E-02 5.5373569996511163E-02 5.5328553161361017E-02 5.5283542254678922E-02 5.5238537323440716E-02 + 5.5193538414602686E-02 5.5148545575101356E-02 5.5103558851853272E-02 5.5058578291754777E-02 5.5013603941681810E-02 + 5.4968635848489669E-02 5.4923674059012904E-02 5.4878718620064916E-02 5.4833769578437941E-02 5.4788826980902698E-02 + 5.4743890874208258E-02 5.4698961305081804E-02 5.4654038320228436E-02 5.4609121966330935E-02 5.4564212290049589E-02 + 5.4519309338021932E-02 5.4474413156862592E-02 5.4429523793163043E-02 5.4384641293491402E-02 5.4339765704392244E-02 + 5.4294897072386383E-02 5.4250035443970619E-02 5.4205180865617604E-02 5.4160333383775593E-02 5.4115493044868200E-02 + 5.4070659895294304E-02 5.4025833981427719E-02 5.3981015349617037E-02 5.3936204046185439E-02 5.3891400117430481E-02 + 5.3846603609623858E-02 5.3801814569011217E-02 5.3757033041811980E-02 5.3712259074219088E-02 5.3667492712398818E-02 + 5.3622734002490603E-02 5.3577982990606760E-02 5.3533239722832374E-02 5.3488504245225048E-02 5.3443776603814649E-02 + 5.3399056844603207E-02 5.3354345013564668E-02 5.3309641156644633E-02 5.3264945319760219E-02 5.3220257548799881E-02 + 5.3175577889623148E-02 5.3130906388060430E-02 5.3086243089912846E-02 5.3041588040951985E-02 5.2996941286919765E-02 + 5.2952302873528187E-02 5.2907672846459114E-02 5.2863051251364118E-02 5.2818438133864241E-02 5.2773833539549862E-02 + 5.2729237513980377E-02 5.2684650102684139E-02 5.2640071351158141E-02 5.2595501304867939E-02 5.2550940009247288E-02 + 5.2506387509698126E-02 5.2461843851590230E-02 5.2417309080261106E-02 5.2372783241015790E-02 5.2328266379126555E-02 + 5.2283758539832852E-02 5.2239259768341033E-02 5.2194770109824137E-02 5.2150289609421766E-02 5.2105818312239816E-02 + 5.2061356263350345E-02 5.2016903507791340E-02 5.1972460090566525E-02 5.1928026056645198E-02 5.1883601450961971E-02 + 5.1839186318416650E-02 5.1794780703874034E-02 5.1750384652163653E-02 5.1705998208079647E-02 5.1661621416380553E-02 + 5.1617254321789104E-02 5.1572896968992039E-02 5.1528549402639921E-02 5.1484211667346950E-02 5.1439883807690760E-02 + 5.1395565868212222E-02 5.1351257893415284E-02 5.1306959927766772E-02 5.1262672015696134E-02 5.1218394201595414E-02 + 5.1174126529818863E-02 5.1129869044682898E-02 5.1085621790465857E-02 5.1041384811407818E-02 5.0997158151710409E-02 + 5.0952941855536636E-02 5.0908735967010676E-02 5.0864540530217724E-02 5.0820355589203760E-02 5.0776181187975410E-02 + 5.0732017370499739E-02 5.0687864180704055E-02 5.0643721662475757E-02 5.0599589859662147E-02 5.0555468816070169E-02 + 5.0511358575466396E-02 5.0467259181576650E-02 5.0423170678085938E-02 5.0379093108638279E-02 5.0335026516836467E-02 + 5.0290970946241909E-02 5.0246926440374449E-02 5.0202893042712159E-02 5.0158870796691256E-02 5.0114859745705800E-02 + 5.0070859933107566E-02 5.0026871402205915E-02 4.9982894196267516E-02 4.9938928358516259E-02 4.9894973932133012E-02 + 4.9851030960255484E-02 4.9807099485978050E-02 4.9763179552351537E-02 4.9719271202383092E-02 4.9675374479035972E-02 + 4.9631489425229408E-02 4.9587616083838368E-02 4.9543754497693458E-02 4.9499904709580690E-02 4.9456066762241339E-02 + 4.9412240698371780E-02 4.9368426560623249E-02 4.9324624391601762E-02 4.9280834233867886E-02 4.9237056129936570E-02 + 4.9193290122277009E-02 4.9149536253312455E-02 4.9105794565419990E-02 4.9062065100930481E-02 4.9018347902128293E-02 + 4.8974643011251165E-02 4.8930950470490092E-02 4.8887270321989022E-02 4.8843602607844878E-02 4.8799947370107198E-02 + 4.8756304650778105E-02 4.8712674491812089E-02 4.8669056935115841E-02 4.8625452022548095E-02 4.8581859795919446E-02 + 4.8538280296992253E-02 4.8494713567480342E-02 4.8451159649048968E-02 4.8407618583314625E-02 4.8364090411844855E-02 + 4.8320575176158058E-02 4.8277072917723408E-02 4.8233583677960649E-02 4.8190107498239917E-02 4.8146644419881632E-02 + 4.8103194484156273E-02 4.8059757732284276E-02 4.8016334205435836E-02 4.7972923944730766E-02 4.7929526991238341E-02 + 4.7886143385977124E-02 4.7842773169914837E-02 4.7799416383968174E-02 4.7756073069002661E-02 4.7712743265832504E-02 + 4.7669427015220402E-02 4.7626124357877442E-02 4.7582835334462927E-02 4.7539559985584193E-02 4.7496298351796466E-02 + 4.7453050473602758E-02 4.7409816391453634E-02 4.7366596145747134E-02 4.7323389776828595E-02 4.7280197324990426E-02 + 4.7237018830472134E-02 4.7193854333459954E-02 4.7150703874086902E-02 4.7107567492432480E-02 4.7064445228522579E-02 + 4.7021337122329386E-02 4.6978243213771115E-02 4.6935163542711975E-02 4.6892098148961961E-02 4.6849047072276703E-02 + 4.6806010352357375E-02 4.6762988028850490E-02 4.6719980141347796E-02 4.6676986729386083E-02 4.6634007832447102E-02 + 4.6591043489957386E-02 4.6548093741288092E-02 4.6505158625754904E-02 4.6462238182617827E-02 4.6419332451081138E-02 + 4.6376441470293107E-02 4.6333565279346046E-02 4.6290703917275966E-02 4.6247857423062595E-02 4.6205025835629139E-02 + 4.6162209193842209E-02 4.6119407536511642E-02 4.6076620902390376E-02 4.6033849330174320E-02 4.5991092858502218E-02 + 4.5948351525955479E-02 4.5905625371058113E-02 4.5862914432276504E-02 4.5820218748019351E-02 4.5777538356637525E-02 + 4.5734873296423853E-02 4.5692223605613112E-02 4.5649589322381813E-02 4.5606970484848068E-02 4.5564367131071495E-02 + 4.5521779299053086E-02 4.5479207026735045E-02 4.5436650352000660E-02 4.5394109312674236E-02 4.5351583946520849E-02 + 4.5309074291246358E-02 4.5266580384497157E-02 4.5224102263860116E-02 4.5181639966862426E-02 4.5139193530971497E-02 + 4.5096762993594788E-02 4.5054348392079745E-02 4.5011949763713602E-02 4.4969567145723317E-02 4.4927200575275446E-02 + 4.4884850089475965E-02 4.4842515725370180E-02 4.4800197519942631E-02 4.4757895510116961E-02 4.4715609732755728E-02 + 4.4673340224660373E-02 4.4631087022571077E-02 4.4588850163166577E-02 4.4546629683064137E-02 4.4504425618819371E-02 + 4.4462238006926176E-02 4.4420066883816542E-02 4.4377912285860480E-02 4.4335774249365925E-02 4.4293652810578586E-02 + 4.4251548005681811E-02 4.4209459870796559E-02 4.4167388441981169E-02 4.4125333755231325E-02 4.4083295846479957E-02 + 4.4041274751597033E-02 4.3999270506389562E-02 4.3957283146601397E-02 4.3915312707913150E-02 4.3873359225942106E-02 + 4.3831422736242076E-02 4.3789503274303310E-02 4.3747600875552399E-02 4.3705715575352126E-02 4.3663847409001380E-02 + 4.3621996411735052E-02 4.3580162618723946E-02 4.3538346065074646E-02 4.3496546785829385E-02 4.3454764815965996E-02 + 4.3413000190397795E-02 4.3371252943973447E-02 4.3329523111476885E-02 4.3287810727627177E-02 4.3246115827078491E-02 + 4.3204438444419908E-02 4.3162778614175397E-02 4.3121136370803656E-02 4.3079511748698042E-02 4.3037904782186442E-02 + 4.2996315505531263E-02 4.2954743952929163E-02 4.2913190158511132E-02 4.2871654156342295E-02 4.2830135980421825E-02 + 4.2788635664682877E-02 4.2747153242992456E-02 4.2705688749151358E-02 4.2664242216894015E-02 4.2622813679888502E-02 + 4.2581403171736310E-02 4.2540010725972396E-02 4.2498636376064970E-02 4.2457280155415458E-02 4.2415942097358411E-02 + 4.2374622235161405E-02 4.2333320602024958E-02 4.2292037231082408E-02 4.2250772155399879E-02 4.2209525407976151E-02 + 4.2168297021742553E-02 4.2127087029562957E-02 4.2085895464233580E-02 4.2044722358483000E-02 4.2003567744971999E-02 + 4.1962431656293521E-02 4.1921314124972534E-02 4.1880215183466012E-02 4.1839134864162797E-02 4.1798073199383563E-02 + 4.1757030221380678E-02 4.1716005962338147E-02 4.1675000454371579E-02 4.1634013729527991E-02 4.1593045819785839E-02 + 4.1552096757054902E-02 4.1511166573176148E-02 4.1470255299921752E-02 4.1429362968994930E-02 4.1388489612029920E-02 + 4.1347635260591861E-02 4.1306799946176746E-02 4.1265983700211360E-02 4.1225186554053127E-02 4.1184408538990129E-02 + 4.1143649686240985E-02 4.1102910026954757E-02 4.1062189592210925E-02 4.1021488413019280E-02 4.0980806520319865E-02 + 4.0940143944982889E-02 4.0899500717808665E-02 4.0858876869527556E-02 4.0818272430799864E-02 4.0777687432215812E-02 + 4.0737121904295397E-02 4.0696575877488428E-02 4.0656049382174361E-02 4.0615542448662278E-02 4.0575055107190824E-02 + 4.0534587387928131E-02 4.0494139320971713E-02 4.0453710936348454E-02 4.0413302264014565E-02 4.0372913333855419E-02 + 4.0332544175685589E-02 4.0292194819248728E-02 4.0251865294217523E-02 4.0211555630193609E-02 4.0171265856707591E-02 + 4.0130996003218858E-02 4.0090746099115636E-02 4.0050516173714808E-02 4.0010306256262007E-02 3.9970116375931411E-02 + 3.9929946561825788E-02 3.9889796842976367E-02 3.9849667248342838E-02 3.9809557806813251E-02 3.9769468547203979E-02 + 3.9729399498259668E-02 3.9689350688653161E-02 3.9649322146985459E-02 3.9609313901785702E-02 3.9569325981511000E-02 + 3.9529358414546530E-02 3.9489411229205386E-02 3.9449484453728534E-02 3.9409578116284802E-02 3.9369692244970785E-02 + 3.9329826867810856E-02 3.9289982012757033E-02 3.9250157707688978E-02 3.9210353980413962E-02 3.9170570858666778E-02 + 3.9130808370109731E-02 3.9091066542332568E-02 3.9051345402852419E-02 3.9011644979113788E-02 3.8971965298488467E-02 + 3.8932306388275544E-02 3.8892668275701293E-02 3.8853050987919184E-02 3.8813454552009810E-02 3.8773878994980852E-02 + 3.8734324343767043E-02 3.8694790625230110E-02 3.8655277866158778E-02 3.8615786093268635E-02 3.8576315333202202E-02 + 3.8536865612528844E-02 3.8497436957744678E-02 3.8458029395272660E-02 3.8418642951462412E-02 3.8379277652590263E-02 + 3.8339933524859246E-02 3.8300610594398932E-02 3.8261308887265512E-02 3.8222028429441716E-02 3.8182769246836813E-02 + 3.8143531365286504E-02 3.8104314810552944E-02 3.8065119608324725E-02 3.8025945784216787E-02 3.7986793363770435E-02 + 3.7947662372453263E-02 3.7908552835659158E-02 3.7869464778708270E-02 3.7830398226846959E-02 3.7791353205247763E-02 + 3.7752329739009410E-02 3.7713327853156745E-02 3.7674347572640723E-02 3.7635388922338371E-02 3.7596451927052785E-02 + 3.7557536611513065E-02 3.7518643000374316E-02 3.7479771118217625E-02 3.7440920989550021E-02 3.7402092638804459E-02 + 3.7363286090339794E-02 3.7324501368440760E-02 3.7285738497317943E-02 3.7246997501107763E-02 3.7208278403872454E-02 + 3.7169581229600034E-02 3.7130906002204270E-02 3.7092252745524718E-02 3.7053621483326651E-02 3.7015012239301016E-02 + 3.6976425037064498E-02 3.6937859900159416E-02 3.6899316852053776E-02 3.6860795916141199E-02 3.6822297115740928E-02 + 3.6783820474097825E-02 3.6745366014382323E-02 3.6706933759690460E-02 3.6668523733043780E-02 3.6630135957389433E-02 + 3.6591770455600060E-02 3.6553427250473822E-02 3.6515106364734408E-02 3.6476807821031000E-02 3.6438531641938221E-02 + 3.6400277849956225E-02 3.6362046467510574E-02 3.6323837516952312E-02 3.6285651020557919E-02 3.6247487000529280E-02 + 3.6209345478993758E-02 3.6171226478004068E-02 3.6133130019538391E-02 3.6095056125500249E-02 3.6057004817718612E-02 + 3.6018976117947799E-02 3.5980970047867544E-02 3.5942986629082928E-02 3.5905025883124393E-02 3.5867087831447798E-02 + 3.5829172495434339E-02 3.5791279896390554E-02 3.5753410055548399E-02 3.5715562994065093E-02 3.5677738733023302E-02 + 3.5639937293430977E-02 3.5602158696221471E-02 3.5564402962253466E-02 3.5526670112310983E-02 3.5488960167103421E-02 + 3.5451273147265538E-02 3.5413609073357430E-02 3.5375967965864515E-02 3.5338349845197660E-02 3.5300754731693029E-02 + 3.5263182645612179E-02 3.5225633607142023E-02 3.5188107636394871E-02 3.5150604753408386E-02 3.5113124978145650E-02 + 3.5075668330495108E-02 3.5038234830270638E-02 3.5000824497211473E-02 3.4963437350982306E-02 3.4926073411173243E-02 + 3.4888732697299807E-02 3.4851415228802946E-02 3.4814121025049098E-02 3.4776850105330104E-02 3.4739602488863347E-02 + 3.4702378194791592E-02 3.4665177242183175E-02 3.4627999650031903E-02 3.4590845437257080E-02 3.4553714622703548E-02 + 3.4516607225141709E-02 3.4479523263267475E-02 3.4442462755702376E-02 3.4405425720993463E-02 3.4368412177613418E-02 + 3.4331422143960524E-02 3.4294455638358708E-02 3.4257512679057495E-02 3.4220593284232118E-02 3.4183697471983444E-02 + 3.4146825260338055E-02 3.4109976667248257E-02 3.4073151710592060E-02 3.4036350408173231E-02 3.3999572777721303E-02 + 3.3962818836891603E-02 3.3926088603265250E-02 3.3889382094349219E-02 3.3852699327576299E-02 3.3816040320305177E-02 + 3.3779405089820434E-02 3.3742793653332534E-02 3.3706206027977921E-02 3.3669642230818968E-02 3.3633102278844057E-02 + 3.3596586188967541E-02 3.3560093978029858E-02 3.3523625662797464E-02 3.3487181259962924E-02 3.3450760786144909E-02 + 3.3414364257888213E-02 3.3377991691663798E-02 3.3341643103868800E-02 3.3305318510826638E-02 3.3269017928786900E-02 + 3.3232741373925477E-02 3.3196488862344595E-02 3.3160260410072744E-02 3.3124056033064848E-02 3.3087875747202164E-02 + 3.3051719568292427E-02 3.3015587512069761E-02 3.2979479594194845E-02 3.2943395830254837E-02 3.2907336235763439E-02 + 3.2871300826160951E-02 3.2835289616814284E-02 3.2799302623016981E-02 3.2763339859989297E-02 3.2727401342878201E-02 + 3.2691487086757377E-02 3.2655597106627354E-02 3.2619731417415400E-02 3.2583890033975750E-02 3.2548072971089421E-02 + 3.2512280243464434E-02 3.2476511865735767E-02 3.2440767852465399E-02 3.2405048218142329E-02 3.2369352977182679E-02 + 3.2333682143929648E-02 3.2298035732653628E-02 3.2262413757552219E-02 3.2226816232750213E-02 3.2191243172299738E-02 + 3.2155694590180188E-02 3.2120170500298355E-02 3.2084670916488443E-02 3.2049195852512050E-02 3.2013745322058307E-02 + 3.1978319338743892E-02 3.1942917916112985E-02 3.1907541067637428E-02 3.1872188806716731E-02 3.1836861146678094E-02 + 3.1801558100776464E-02 3.1766279682194601E-02 3.1731025904043052E-02 3.1695796779360332E-02 3.1660592321112797E-02 + 3.1625412542194857E-02 3.1590257455428900E-02 3.1555127073565392E-02 3.1520021409282943E-02 3.1484940475188315E-02 + 3.1449884283816461E-02 3.1414852847630646E-02 3.1379846179022390E-02 3.1344864290311650E-02 3.1309907193746732E-02 + 3.1274974901504410E-02 3.1240067425690025E-02 3.1205184778337440E-02 3.1170326971409101E-02 3.1135494016796196E-02 + 3.1100685926318591E-02 3.1065902711724904E-02 3.1031144384692639E-02 3.0996410956828098E-02 3.0961702439666571E-02 + 3.0927018844672326E-02 3.0892360183238651E-02 3.0857726466687919E-02 3.0823117706271691E-02 3.0788533913170681E-02 + 3.0753975098494896E-02 3.0719441273283649E-02 3.0684932448505616E-02 3.0650448635058909E-02 3.0615989843771108E-02 + 3.0581556085399350E-02 3.0547147370630374E-02 3.0512763710080562E-02 3.0478405114295996E-02 3.0444071593752575E-02 + 3.0409763158855990E-02 3.0375479819941830E-02 3.0341221587275653E-02 3.0306988471053023E-02 3.0272780481399572E-02 + 3.0238597628371028E-02 3.0204439921953364E-02 3.0170307372062791E-02 3.0136199988545814E-02 3.0102117781179324E-02 + 3.0068060759670678E-02 3.0034028933657708E-02 3.0000022312708801E-02 2.9966040906322995E-02 2.9932084723930000E-02 + 2.9898153774890305E-02 2.9864248068495178E-02 2.9830367613966825E-02 2.9796512420458342E-02 2.9762682497053879E-02 + 2.9728877852768641E-02 2.9695098496548986E-02 2.9661344437272478E-02 2.9627615683747967E-02 2.9593912244715640E-02 + 2.9560234128847087E-02 2.9526581344745364E-02 2.9492953900945106E-02 2.9459351805912536E-02 2.9425775068045553E-02 + 2.9392223695673805E-02 2.9358697697058792E-02 2.9325197080393828E-02 2.9291721853804256E-02 2.9258272025347396E-02 + 2.9224847603012687E-02 2.9191448594721708E-02 2.9158075008328319E-02 2.9124726851618626E-02 2.9091404132311149E-02 + 2.9058106858056855E-02 2.9024835036439212E-02 2.8991588674974297E-02 2.8958367781110834E-02 2.8925172362230307E-02 + 2.8892002425646983E-02 2.8858857978608023E-02 2.8825739028293544E-02 2.8792645581816691E-02 2.8759577646223691E-02 + 2.8726535228493975E-02 2.8693518335540225E-02 2.8660526974208417E-02 2.8627561151277958E-02 2.8594620873461710E-02 + 2.8561706147406104E-02 2.8528816979691170E-02 2.8495953376830668E-02 2.8463115345272134E-02 2.8430302891396936E-02 + 2.8397516021520387E-02 2.8364754741891804E-02 2.8332019058694608E-02 2.8299308978046375E-02 2.8266624505998893E-02 + 2.8233965648538323E-02 2.8201332411585157E-02 2.8168724800994426E-02 2.8136142822555676E-02 2.8103586481993112E-02 + 2.8071055784965618E-02 2.8038550737066903E-02 2.8006071343825538E-02 2.7973617610705052E-02 2.7941189543103980E-02 + 2.7908787146355987E-02 2.7876410425729962E-02 2.7844059386430010E-02 2.7811734033595648E-02 2.7779434372301789E-02 + 2.7747160407558882E-02 2.7714912144312973E-02 2.7682689587445797E-02 2.7650492741774862E-02 2.7618321612053506E-02 + 2.7586176202970998E-02 2.7554056519152641E-02 2.7521962565159822E-02 2.7489894345490096E-02 2.7457851864577318E-02 + 2.7425835126791653E-02 2.7393844136439745E-02 2.7361878897764688E-02 2.7329939414946245E-02 2.7298025692100835E-02 + 2.7266137733281657E-02 2.7234275542478734E-02 2.7202439123619099E-02 2.7170628480566759E-02 2.7138843617122849E-02 + 2.7107084537025726E-02 2.7075351243950989E-02 2.7043643741511660E-02 2.7011962033258185E-02 2.6980306122678595E-02 + 2.6948676013198510E-02 2.6917071708181299E-02 2.6885493210928160E-02 2.6853940524678144E-02 2.6822413652608311E-02 + 2.6790912597833810E-02 2.6759437363407919E-02 2.6727987952322195E-02 2.6696564367506510E-02 2.6665166611829199E-02 + 2.6633794688097082E-02 2.6602448599055608E-02 2.6571128347388909E-02 2.6539833935719914E-02 2.6508565366610413E-02 + 2.6477322642561200E-02 2.6446105766012064E-02 2.6414914739342005E-02 2.6383749564869233E-02 2.6352610244851291E-02 + 2.6321496781485119E-02 2.6290409176907215E-02 2.6259347433193650E-02 2.6228311552360190E-02 2.6197301536362405E-02 + 2.6166317387095721E-02 2.6135359106395542E-02 2.6104426696037356E-02 2.6073520157736788E-02 2.6042639493149701E-02 + 2.6011784703872332E-02 2.5980955791441312E-02 2.5950152757333821E-02 2.5919375602967667E-02 2.5888624329701359E-02 + 2.5857898938834219E-02 2.5827199431606468E-02 2.5796525809199323E-02 2.5765878072735091E-02 2.5735256223277273E-02 + 2.5704660261830634E-02 2.5674090189341321E-02 2.5643546006696938E-02 2.5613027714726677E-02 2.5582535314201349E-02 + 2.5552068805833560E-02 2.5521628190277736E-02 2.5491213468130259E-02 2.5460824639929554E-02 2.5430461706156177E-02 + 2.5400124667232894E-02 2.5369813523524857E-02 2.5339528275339588E-02 2.5309268922927140E-02 2.5279035466480203E-02 + 2.5248827906134162E-02 2.5218646241967225E-02 2.5188490474000499E-02 2.5158360602198115E-02 2.5128256626467272E-02 + 2.5098178546658394E-02 2.5068126362565203E-02 2.5038100073924811E-02 2.5008099680417808E-02 2.4978125181668396E-02 + 2.4948176577244463E-02 2.4918253866657660E-02 2.4888357049363555E-02 2.4858486124761686E-02 2.4828641092195680E-02 + 2.4798821950953325E-02 2.4769028700266711E-02 2.4739261339312292E-02 2.4709519867210997E-02 2.4679804283028364E-02 + 2.4650114585774575E-02 2.4620450774404588E-02 2.4590812847818250E-02 2.4561200804860388E-02 2.4531614644320875E-02 + 2.4502054364934783E-02 2.4472519965382453E-02 2.4443011444289602E-02 2.4413528800227423E-02 2.4384072031712681E-02 + 2.4354641137207804E-02 2.4325236115121010E-02 2.4295856963806411E-02 2.4266503681564060E-02 2.4237176266640112E-02 + 2.4207874717226897E-02 2.4178599031463022E-02 2.4149349207433467E-02 2.4120125243169713E-02 2.4090927136649825E-02 + 2.4061754885798533E-02 2.4032608488487369E-02 2.4003487942534749E-02 2.3974393245706091E-02 2.3945324395713893E-02 + 2.3916281390217831E-02 2.3887264226824925E-02 2.3858272903089537E-02 2.3829307416513571E-02 2.3800367764546530E-02 + 2.3771453944585581E-02 2.3742565953975756E-02 2.3713703790009949E-02 2.3684867449929099E-02 2.3656056930922247E-02 + 2.3627272230126652E-02 2.3598513344627897E-02 2.3569780271459985E-02 2.3541073007605454E-02 2.3512391549995449E-02 + 2.3483735895509887E-02 2.3455106040977475E-02 2.3426501983175904E-02 2.3397923718831887E-02 2.3369371244621264E-02 + 2.3340844557169168E-02 2.3312343653050051E-02 2.3283868528787829E-02 2.3255419180856000E-02 2.3226995605677692E-02 + 2.3198597799625839E-02 2.3170225759023211E-02 2.3141879480142579E-02 2.3113558959206786E-02 2.3085264192388866E-02 + 2.3056995175812129E-02 2.3028751905550295E-02 2.3000534377627564E-02 2.2972342588018752E-02 2.2944176532649366E-02 + 2.2916036207395747E-02 2.2887921608085116E-02 2.2859832730495758E-02 2.2831769570357038E-02 2.2803732123349577E-02 + 2.2775720385105329E-02 2.2747734351207673E-02 2.2719774017191548E-02 2.2691839378543525E-02 2.2663930430701924E-02 + 2.2636047169056959E-02 2.2608189588950750E-02 2.2580357685677545E-02 2.2552551454483722E-02 2.2524770890567952E-02 + 2.2497015989081291E-02 2.2469286745127284E-02 2.2441583153762063E-02 2.2413905209994475E-02 2.2386252908786149E-02 + 2.2358626245051645E-02 2.2331025213658519E-02 2.2303449809427455E-02 2.2275900027132377E-02 2.2248375861500535E-02 + 2.2220877307212589E-02 2.2193404358902775E-02 2.2165957011158977E-02 2.2138535258522791E-02 2.2111139095489733E-02 + 2.2083768516509245E-02 2.2056423515984837E-02 2.2029104088274229E-02 2.2001810227689399E-02 2.1974541928496707E-02 + 2.1947299184917016E-02 2.1920081991125811E-02 2.1892890341253232E-02 2.1865724229384292E-02 2.1838583649558874E-02 + 2.1811468595771894E-02 2.1784379061973416E-02 2.1757315042068723E-02 2.1730276529918439E-02 2.1703263519338652E-02 + 2.1676276004100978E-02 2.1649313977932717E-02 2.1622377434516907E-02 2.1595466367492478E-02 2.1568580770454340E-02 + 2.1541720636953473E-02 2.1514885960497044E-02 2.1488076734548521E-02 2.1461292952527786E-02 2.1434534607811213E-02 + 2.1407801693731788E-02 2.1381094203579219E-02 2.1354412130600055E-02 2.1327755467997752E-02 2.1301124208932827E-02 + 2.1274518346522917E-02 2.1247937873842927E-02 2.1221382783925109E-02 2.1194853069759188E-02 2.1168348724292442E-02 + 2.1141869740429836E-02 2.1115416111034107E-02 2.1088987828925879E-02 2.1062584886883774E-02 2.1036207277644502E-02 + 2.1009854993903003E-02 2.0983528028312479E-02 2.0957226373484603E-02 2.0930950021989529E-02 2.0904698966356071E-02 + 2.0878473199071754E-02 2.0852272712582953E-02 2.0826097499294989E-02 2.0799947551572238E-02 2.0773822861738220E-02 + 2.0747723422075742E-02 2.0721649224826954E-02 2.0695600262193511E-02 2.0669576526336633E-02 2.0643578009377227E-02 + 2.0617604703396002E-02 2.0591656600433553E-02 2.0565733692490502E-02 2.0539835971527552E-02 2.0513963429465650E-02 + 2.0488116058186043E-02 2.0462293849530435E-02 2.0436496795301028E-02 2.0410724887260690E-02 2.0384978117133024E-02 + 2.0359256476602489E-02 2.0333559957314479E-02 2.0307888550875484E-02 2.0282242248853128E-02 2.0256621042776334E-02 + 2.0231024924135393E-02 2.0205453884382066E-02 2.0179907914929726E-02 2.0154387007153420E-02 2.0128891152390010E-02 + 2.0103420341938256E-02 2.0077974567058923E-02 2.0052553818974903E-02 2.0027158088871299E-02 2.0001787367895530E-02 + 1.9976441647157474E-02 1.9951120917729534E-02 1.9925825170646720E-02 1.9900554396906835E-02 1.9875308587470514E-02 + 1.9850087733261336E-02 1.9824891825165961E-02 1.9799720854034194E-02 1.9774574810679124E-02 1.9749453685877209E-02 + 1.9724357470368391E-02 1.9699286154856176E-02 1.9674239730007793E-02 1.9649218186454244E-02 1.9624221514790412E-02 + 1.9599249705575219E-02 1.9574302749331668E-02 1.9549380636546970E-02 1.9524483357672668E-02 1.9499610903124708E-02 + 1.9474763263283571E-02 1.9449940428494367E-02 1.9425142389066917E-02 1.9400369135275902E-02 1.9375620657360929E-02 + 1.9350896945526660E-02 1.9326197989942877E-02 1.9301523780744650E-02 1.9276874308032373E-02 1.9252249561871923E-02 + 1.9227649532294722E-02 1.9203074209297854E-02 1.9178523582844203E-02 1.9153997642862478E-02 1.9129496379247407E-02 + 1.9105019781859779E-02 1.9080567840526554E-02 1.9056140545041001E-02 1.9031737885162766E-02 1.9007359850617994E-02 + 1.8983006431099406E-02 1.8958677616266451E-02 1.8934373395745351E-02 1.8910093759129245E-02 1.8885838695978277E-02 + 1.8861608195819699E-02 1.8837402248147977E-02 1.8813220842424889E-02 1.8789063968079632E-02 1.8764931614508918E-02 + 1.8740823771077081E-02 1.8716740427116175E-02 1.8692681571926106E-02 1.8668647194774672E-02 1.8644637284897719E-02 + 1.8620651831499215E-02 1.8596690823751379E-02 1.8572754250794760E-02 1.8548842101738336E-02 1.8524954365659620E-02 + 1.8501091031604786E-02 1.8477252088588737E-02 1.8453437525595220E-02 1.8429647331576936E-02 1.8405881495455610E-02 + 1.8382140006122146E-02 1.8358422852436662E-02 1.8334730023228663E-02 1.8311061507297083E-02 1.8287417293410397E-02 + 1.8263797370306759E-02 1.8240201726694060E-02 1.8216630351250044E-02 1.8193083232622417E-02 1.8169560359428943E-02 + 1.8146061720257525E-02 1.8122587303666327E-02 1.8099137098183882E-02 1.8075711092309175E-02 1.8052309274511728E-02 + 1.8028931633231736E-02 1.8005578156880152E-02 1.7982248833838768E-02 1.7958943652460358E-02 1.7935662601068717E-02 + 1.7912405667958823E-02 1.7889172841396895E-02 1.7865964109620505E-02 1.7842779460838679E-02 1.7819618883231993E-02 + 1.7796482364952692E-02 1.7773369894124726E-02 1.7750281458843945E-02 1.7727217047178105E-02 1.7704176647167041E-02 + 1.7681160246822709E-02 1.7658167834129320E-02 1.7635199397043420E-02 1.7612254923493994E-02 1.7589334401382582E-02 + 1.7566437818583330E-02 1.7543565162943146E-02 1.7520716422281757E-02 1.7497891584391814E-02 1.7475090637039004E-02 + 1.7452313567962150E-02 1.7429560364873285E-02 1.7406831015457751E-02 1.7384125507374327E-02 1.7361443828255305E-02 + 1.7338785965706573E-02 1.7316151907307752E-02 1.7293541640612246E-02 1.7270955153147378E-02 1.7248392432414456E-02 + 1.7225853465888900E-02 1.7203338241020313E-02 1.7180846745232580E-02 1.7158378965923999E-02 1.7135934890467309E-02 + 1.7113514506209866E-02 1.7091117800473673E-02 1.7068744760555515E-02 1.7046395373727034E-02 1.7024069627234847E-02 + 1.7001767508300604E-02 1.6979489004121134E-02 1.6957234101868505E-02 1.6935002788690114E-02 1.6912795051708798E-02 + 1.6890610878022957E-02 1.6868450254706575E-02 1.6846313168809399E-02 1.6824199607356954E-02 1.6802109557350706E-02 + 1.6780043005768127E-02 1.6757999939562767E-02 1.6735980345664397E-02 1.6713984210979058E-02 1.6692011522389180E-02 + 1.6670062266753678E-02 1.6648136430908025E-02 1.6626234001664377E-02 1.6604354965811620E-02 1.6582499310115517E-02 + 1.6560667021318767E-02 1.6538858086141105E-02 1.6517072491279403E-02 1.6495310223407753E-02 1.6473571269177565E-02 + 1.6451855615217652E-02 1.6430163248134358E-02 1.6408494154511580E-02 1.6386848320910932E-02 1.6365225733871804E-02 + 1.6343626379911453E-02 1.6322050245525101E-02 1.6300497317186025E-02 1.6278967581345654E-02 1.6257461024433661E-02 + 1.6235977632858029E-02 1.6214517393005199E-02 1.6193080291240090E-02 1.6171666313906256E-02 1.6150275447325928E-02 + 1.6128907677800133E-02 1.6107562991608770E-02 1.6086241375010722E-02 1.6064942814243914E-02 1.6043667295525435E-02 + 1.6022414805051600E-02 1.6001185328998083E-02 1.5979978853519941E-02 1.5958795364751772E-02 1.5937634848807763E-02 + 1.5916497291781791E-02 1.5895382679747518E-02 1.5874290998758474E-02 1.5853222234848155E-02 1.5832176374030092E-02 + 1.5811153402297960E-02 1.5790153305625672E-02 1.5769176069967441E-02 1.5748221681257890E-02 1.5727290125412137E-02 + 1.5706381388325880E-02 1.5685495455875498E-02 1.5664632313918101E-02 1.5643791948291678E-02 1.5622974344815129E-02 + 1.5602179489288390E-02 1.5581407367492498E-02 1.5560657965189699E-02 1.5539931268123509E-02 1.5519227262018835E-02 + 1.5498545932582024E-02 1.5477887265500985E-02 1.5457251246445255E-02 1.5436637861066096E-02 1.5416047094996575E-02 + 1.5395478933851649E-02 1.5374933363228266E-02 1.5354410368705426E-02 1.5333909935844301E-02 1.5313432050188286E-02 + 1.5292976697263112E-02 1.5272543862576905E-02 1.5252133531620315E-02 1.5231745689866552E-02 1.5211380322771499E-02 + 1.5191037415773798E-02 1.5170716954294916E-02 1.5150418923739261E-02 1.5130143309494233E-02 1.5109890096930336E-02 + 1.5089659271401242E-02 1.5069450818243886E-02 1.5049264722778564E-02 1.5029100970308986E-02 1.5008959546122386E-02 + 1.4988840435489576E-02 1.4968743623665083E-02 1.4948669095887180E-02 1.4928616837377983E-02 1.4908586833343561E-02 + 1.4888579068973985E-02 1.4868593529443431E-02 1.4848630199910253E-02 1.4828689065517070E-02 1.4808770111390861E-02 + 1.4788873322643012E-02 1.4768998684369448E-02 1.4749146181650659E-02 1.4729315799551853E-02 1.4709507523122962E-02 + 1.4689721337398773E-02 1.4669957227398995E-02 1.4650215178128343E-02 1.4630495174576623E-02 1.4610797201718791E-02 + 1.4591121244515070E-02 1.4571467287911005E-02 1.4551835316837559E-02 1.4532225316211175E-02 1.4512637270933880E-02 + 1.4493071165893339E-02 1.4473526985962971E-02 1.4454004716001990E-02 1.4434504340855515E-02 1.4415025845354626E-02 + 1.4395569214316475E-02 1.4376134432544336E-02 1.4356721484827691E-02 1.4337330355942321E-02 1.4317961030650380E-02 + 1.4298613493700473E-02 1.4279287729827726E-02 1.4259983723753875E-02 1.4240701460187358E-02 1.4221440923823362E-02 + 1.4202202099343924E-02 1.4182984971417999E-02 1.4163789524701551E-02 1.4144615743837616E-02 1.4125463613456388E-02 + 1.4106333118175302E-02 1.4087224242599092E-02 1.4068136971319896E-02 1.4049071288917301E-02 1.4030027179958453E-02 + 1.4011004628998108E-02 1.3992003620578728E-02 1.3973024139230546E-02 1.3954066169471650E-02 1.3935129695808042E-02 + 1.3916214702733748E-02 1.3897321174730854E-02 1.3878449096269610E-02 1.3859598451808503E-02 1.3840769225794329E-02 + 1.3821961402662253E-02 1.3803174966835908E-02 1.3784409902727460E-02 1.3765666194737696E-02 1.3746943827256056E-02 + 1.3728242784660774E-02 1.3709563051318896E-02 1.3690904611586384E-02 1.3672267449808180E-02 1.3653651550318292E-02 + 1.3635056897439846E-02 1.3616483475485178E-02 1.3597931268755914E-02 1.3579400261543017E-02 1.3560890438126883E-02 + 1.3542401782777413E-02 1.3523934279754079E-02 1.3505487913305993E-02 1.3487062667671999E-02 1.3468658527080717E-02 + 1.3450275475750654E-02 1.3431913497890226E-02 1.3413572577697892E-02 1.3395252699362165E-02 1.3376953847061735E-02 + 1.3358676004965504E-02 1.3340419157232677E-02 1.3322183288012834E-02 1.3303968381445996E-02 1.3285774421662682E-02 + 1.3267601392784023E-02 1.3249449278921780E-02 1.3231318064178463E-02 1.3213207732647364E-02 1.3195118268412648E-02 + 1.3177049655549425E-02 1.3159001878123803E-02 1.3140974920192977E-02 1.3122968765805298E-02 1.3104983399000325E-02 + 1.3087018803808907E-02 1.3069074964253269E-02 1.3051151864347047E-02 1.3033249488095384E-02 1.3015367819494994E-02 + 1.2997506842534211E-02 1.2979666541193103E-02 1.2961846899443481E-02 1.2944047901249027E-02 1.2926269530565320E-02 + 1.2908511771339925E-02 1.2890774607512446E-02 1.2873058023014618E-02 1.2855362001770353E-02 1.2837686527695815E-02 + 1.2820031584699498E-02 1.2802397156682275E-02 1.2784783227537462E-02 1.2767189781150922E-02 1.2749616801401098E-02 + 1.2732064272159083E-02 1.2714532177288705E-02 1.2697020500646571E-02 1.2679529226082150E-02 1.2662058337437835E-02 + 1.2644607818549003E-02 1.2627177653244096E-02 1.2609767825344665E-02 1.2592378318665462E-02 1.2575009117014474E-02 + 1.2557660204193025E-02 1.2540331563995815E-02 1.2523023180210983E-02 1.2505735036620195E-02 1.2488467116998699E-02 + 1.2471219405115365E-02 1.2453991884732799E-02 1.2436784539607360E-02 1.2419597353489261E-02 1.2402430310122590E-02 + 1.2385283393245424E-02 1.2368156586589863E-02 1.2351049873882101E-02 1.2333963238842486E-02 1.2316896665185586E-02 + 1.2299850136620253E-02 1.2282823636849689E-02 1.2265817149571505E-02 1.2248830658477780E-02 1.2231864147255137E-02 + 1.2214917599584787E-02 1.2197990999142613E-02 1.2181084329599214E-02 1.2164197574619970E-02 1.2147330717865123E-02 + 1.2130483742989806E-02 1.2113656633644138E-02 1.2096849373473264E-02 1.2080061946117425E-02 1.2063294335212015E-02 + 1.2046546524387641E-02 1.2029818497270200E-02 1.2013110237480919E-02 1.1996421728636419E-02 1.1979752954348791E-02 + 1.1963103898225646E-02 1.1946474543870170E-02 1.1929864874881192E-02 1.1913274874853245E-02 1.1896704527376609E-02 + 1.1880153816037412E-02 1.1863622724417638E-02 1.1847111236095217E-02 1.1830619334644080E-02 1.1814147003634218E-02 + 1.1797694226631737E-02 1.1781260987198920E-02 1.1764847268894280E-02 1.1748453055272636E-02 1.1732078329885140E-02 + 1.1715723076279374E-02 1.1699387277999370E-02 1.1683070918585706E-02 1.1666773981575533E-02 1.1650496450502637E-02 + 1.1634238308897522E-02 1.1617999540287430E-02 1.1601780128196437E-02 1.1585580056145479E-02 1.1569399307652418E-02 + 1.1553237866232113E-02 1.1537095715396455E-02 1.1520972838654444E-02 1.1504869219512222E-02 1.1488784841473157E-02 + 1.1472719688037879E-02 1.1456673742704338E-02 1.1440646988967875E-02 1.1424639410321260E-02 1.1408650990254756E-02 + 1.1392681712256167E-02 1.1376731559810904E-02 1.1360800516402047E-02 1.1344888565510369E-02 1.1328995690614425E-02 + 1.1313121875190587E-02 1.1297267102713102E-02 1.1281431356654152E-02 1.1265614620483901E-02 1.1249816877670569E-02 + 1.1234038111680443E-02 1.1218278305977981E-02 1.1202537444025830E-02 1.1186815509284905E-02 1.1171112485214421E-02 + 1.1155428355271954E-02 1.1139763102913503E-02 1.1124116711593530E-02 1.1108489164765029E-02 1.1092880445879555E-02 + 1.1077290538387304E-02 1.1061719425737138E-02 1.1046167091376666E-02 1.1030633518752270E-02 1.1015118691309181E-02 + 1.0999622592491506E-02 1.0984145205742304E-02 1.0968686514503619E-02 1.0953246502216542E-02 1.0937825152321255E-02 + 1.0922422448257104E-02 1.0907038373462611E-02 1.0891672911375562E-02 1.0876326045433033E-02 1.0860997759071457E-02 + 1.0845688035726671E-02 1.0830396858833965E-02 1.0815124211828118E-02 1.0799870078143474E-02 1.0784634441213978E-02 + 1.0769417284473224E-02 1.0754218591354513E-02 1.0739038345290892E-02 1.0723876529715218E-02 1.0708733128060186E-02 + 1.0693608123758412E-02 1.0678501500242438E-02 1.0663413240944823E-02 1.0648343329298161E-02 1.0633291748735152E-02 + 1.0618258482688627E-02 1.0603243514591625E-02 1.0588246827877417E-02 1.0573268405979577E-02 1.0558308232331993E-02 + 1.0543366290368958E-02 1.0528442563525187E-02 1.0513537035235890E-02 1.0498649688936790E-02 1.0483780508064200E-02 + 1.0468929476055037E-02 1.0454096576346912E-02 1.0439281792378128E-02 1.0424485107587781E-02 1.0409706505415750E-02 + 1.0394945969302787E-02 1.0380203482690543E-02 1.0365479029021622E-02 1.0350772591739622E-02 1.0336084154289179E-02 + 1.0321413700116036E-02 1.0306761212667040E-02 1.0292126675390241E-02 1.0277510071734901E-02 1.0262911385151566E-02 + 1.0248330599092088E-02 1.0233767697009682E-02 1.0219222662358966E-02 1.0204695478596013E-02 1.0190186129178396E-02 + 1.0175694597565210E-02 1.0161220867217158E-02 1.0146764921596555E-02 1.0132326744167398E-02 1.0117906318395396E-02 + 1.0103503627748022E-02 1.0089118655694552E-02 1.0074751385706109E-02 1.0060401801255716E-02 1.0046069885818324E-02 + 1.0031755622870862E-02 1.0017458995892292E-02 1.0003179988363626E-02 9.9889185837679952E-03 9.9746747655906735E-03 + 9.9604485173191322E-03 9.9462398224430849E-03 9.9320486644545077E-03 9.9178750268477129E-03 9.9037188931193655E-03 + 9.8895802467685399E-03 9.8754590712967581E-03 9.8613553502080245E-03 9.8472690670088833E-03 9.8332002052084356E-03 + 9.8191487483184087E-03 9.8051146798531757E-03 9.7910979833298120E-03 9.7770986422681203E-03 9.7631166401906840E-03 + 9.7491519606229139E-03 9.7352045870930624E-03 9.7212745031322895E-03 9.7073616922746953E-03 9.6934661380573550E-03 + 9.6795878240203709E-03 9.6657267337068933E-03 9.6518828506631828E-03 9.6380561584386328E-03 9.6242466405858148E-03 + 9.6104542806605200E-03 9.5966790622217992E-03 9.5829209688319990E-03 9.5691799840567984E-03 9.5554560914652576E-03 + 9.5417492746298384E-03 9.5280595171264703E-03 9.5143868025345645E-03 9.5007311144370641E-03 9.4870924364204752E-03 + 9.4734707520749192E-03 9.4598660449941568E-03 9.4462782987756230E-03 9.4327074970204875E-03 9.4191536233336655E-03 + 9.4056166613238814E-03 9.3920965946036744E-03 9.3785934067894677E-03 9.3651070815015877E-03 9.3516376023642985E-03 + 9.3381849530058646E-03 9.3247491170585489E-03 9.3113300781586823E-03 9.2979278199466810E-03 9.2845423260670898E-03 + 9.2711735801686221E-03 9.2578215659041910E-03 9.2444862669309458E-03 9.2311676669103119E-03 9.2178657495080255E-03 + 9.2045804983941597E-03 9.1913118972431779E-03 9.1780599297339501E-03 9.1648245795498094E-03 9.1516058303785664E-03 + 9.1384036659125627E-03 9.1252180698486937E-03 9.1120490258884360E-03 9.0988965177379155E-03 9.0857605291079051E-03 + 9.0726410437138773E-03 9.0595380452760388E-03 9.0464515175193525E-03 9.0333814441735973E-03 9.0203278089733777E-03 + 9.0072905956581559E-03 8.9942697879723151E-03 8.9812653696651652E-03 8.9682773244909794E-03 8.9553056362090457E-03 + 8.9423502885836812E-03 8.9294112653842735E-03 8.9164885503853156E-03 8.9035821273664353E-03 8.8906919801124314E-03 + 8.8778180924133036E-03 8.8649604480642800E-03 8.8521190308658709E-03 8.8392938246238707E-03 8.8264848131494149E-03 + 8.8136919802590061E-03 8.8009153097745353E-03 8.7881547855233281E-03 8.7754103913381693E-03 8.7626821110573395E-03 + 8.7499699285246407E-03 8.7372738275894278E-03 8.7245937921066538E-03 8.7119298059368782E-03 8.6992818529463209E-03 + 8.6866499170068744E-03 8.6740339819961539E-03 8.6614340317975082E-03 8.6488500503000693E-03 8.6362820213987650E-03 + 8.6237299289943677E-03 8.6111937569935092E-03 8.5986734893087214E-03 8.5861691098584672E-03 8.5736806025671509E-03 + 8.5612079513651806E-03 8.5487511401889770E-03 8.5363101529810029E-03 8.5238849736898013E-03 8.5114755862700214E-03 + 8.4990819746824462E-03 8.4867041228940208E-03 8.4743420148778986E-03 8.4619956346134399E-03 8.4496649660862656E-03 + 8.4373499932882800E-03 8.4250507002176876E-03 8.4127670708790490E-03 8.4004990892832757E-03 8.3882467394476839E-03 + 8.3760100053960167E-03 8.3637888711584670E-03 8.3515833207717070E-03 8.3393933382789193E-03 8.3272189077298279E-03 + 8.3150600131807143E-03 8.3029166386944641E-03 8.2907887683405738E-03 8.2786763861951943E-03 8.2665794763411449E-03 + 8.2544980228679583E-03 8.2424320098718872E-03 8.2303814214559519E-03 8.2183462417299482E-03 8.2063264548104878E-03 + 8.1943220448210206E-03 8.1823329958918625E-03 8.1703592921602182E-03 8.1584009177702085E-03 8.1464578568729087E-03 + 8.1345300936263559E-03 8.1226176121955828E-03 8.1107203967526569E-03 8.0988384314766796E-03 8.0869717005538390E-03 + 8.0751201881774232E-03 8.0632838785478396E-03 8.0514627558726515E-03 8.0396568043666020E-03 8.0278660082516353E-03 + 8.0160903517569222E-03 8.0043298191188970E-03 7.9925843945812501E-03 7.9808540623950031E-03 7.9691388068184842E-03 + 7.9574386121173887E-03 7.9457534625647780E-03 7.9340833424411325E-03 7.9224282360343366E-03 7.9107881276397462E-03 + 7.8991630015601815E-03 7.8875528421059708E-03 7.8759576335949554E-03 7.8643773603525348E-03 7.8528120067116701E-03 + 7.8412615570129292E-03 7.8297259956044887E-03 7.8182053068421766E-03 7.8066994750894767E-03 7.7952084847175713E-03 + 7.7837323201053500E-03 7.7722709656394481E-03 7.7608244057142430E-03 7.7493926247319111E-03 7.7379756071024250E-03 + 7.7265733372435808E-03 7.7151857995810345E-03 7.7038129785483127E-03 7.6924548585868341E-03 7.6811114241459354E-03 + 7.6697826596829003E-03 7.6584685496629643E-03 7.6471690785593592E-03 7.6358842308533112E-03 7.6246139910340844E-03 + 7.6133583435989902E-03 7.6021172730534109E-03 7.5908907639108273E-03 7.5796788006928248E-03 7.5684813679291396E-03 + 7.5572984501576530E-03 7.5461300319244343E-03 7.5349760977837504E-03 7.5238366322980949E-03 7.5127116200381918E-03 + 7.5016010455830400E-03 7.4905048935199180E-03 7.4794231484444076E-03 7.4683557949604233E-03 7.4573028176802220E-03 + 7.4462642012244167E-03 7.4352399302220267E-03 7.4242299893104652E-03 7.4132343631355766E-03 7.4022530363516527E-03 + 7.3912859936214491E-03 7.3803332196162152E-03 7.3693946990157052E-03 7.3584704165081975E-03 7.3475603567905159E-03 + 7.3366645045680520E-03 7.3257828445547866E-03 7.3149153614732983E-03 7.3040620400547946E-03 7.2932228650391248E-03 + 7.2823978211747969E-03 7.2715868932190040E-03 7.2607900659376369E-03 7.2500073241053070E-03 7.2392386525053651E-03 + 7.2284840359299104E-03 7.2177434591798231E-03 7.2070169070647724E-03 7.1963043644032486E-03 7.1856058160225580E-03 + 7.1749212467588650E-03 7.1642506414571943E-03 7.1535939849714575E-03 7.1429512621644653E-03 7.1323224579079537E-03 + 7.1217075570825881E-03 7.1111065445779989E-03 7.1005194052927798E-03 7.0899461241345193E-03 7.0793866860198165E-03 + 7.0688410758742879E-03 7.0583092786325992E-03 7.0477912792384721E-03 7.0372870626447068E-03 7.0267966138131913E-03 + 7.0163199177149301E-03 7.0058569593300559E-03 6.9954077236478373E-03 6.9849721956667110E-03 6.9745503603942903E-03 + 6.9641422028473721E-03 6.9537477080519787E-03 6.9433668610433454E-03 6.9329996468659606E-03 6.9226460505735611E-03 + 6.9123060572291650E-03 6.9019796519050793E-03 6.8916668196829173E-03 6.8813675456536154E-03 6.8710818149174506E-03 + 6.8608096125840424E-03 6.8505509237723966E-03 6.8403057336108896E-03 6.8300740272373055E-03 6.8198557897988406E-03 + 6.8096510064521243E-03 6.7994596623632301E-03 6.7892817427076925E-03 6.7791172326705255E-03 6.7689661174462276E-03 + 6.7588283822388106E-03 6.7487040122618013E-03 6.7385929927382612E-03 6.7284953089008061E-03 6.7184109459916133E-03 + 6.7083398892624395E-03 6.6982821239746342E-03 6.6882376353991557E-03 6.6782064088165812E-03 6.6681884295171270E-03 + 6.6581836828006604E-03 6.6481921539767036E-03 6.6382138283644686E-03 6.6282486912928483E-03 6.6182967281004515E-03 + 6.6083579241355923E-03 6.5984322647563319E-03 6.5885197353304685E-03 6.5786203212355645E-03 6.5687340078589502E-03 + 6.5588607805977450E-03 6.5490006248588670E-03 6.5391535260590486E-03 6.5293194696248447E-03 6.5194984409926559E-03 + 6.5096904256087195E-03 6.4998954089291556E-03 6.4901133764199460E-03 6.4803443135569719E-03 6.4705882058260092E-03 + 6.4608450387227548E-03 6.4511147977528317E-03 6.4413974684317983E-03 6.4316930362851741E-03 6.4220014868484323E-03 + 6.4123228056670268E-03 6.4026569782964053E-03 6.3930039903020066E-03 6.3833638272592875E-03 6.3737364747537290E-03 + 6.3641219183808492E-03 6.3545201437462092E-03 6.3449311364654325E-03 6.3353548821642172E-03 6.3257913664783389E-03 + 6.3162405750536669E-03 6.3067024935461822E-03 6.2971771076219731E-03 6.2876644029572683E-03 6.2781643652384204E-03 + 6.2686769801619463E-03 6.2592022334345158E-03 6.2497401107729743E-03 6.2402905979043466E-03 6.2308536805658534E-03 + 6.2214293445049251E-03 6.2120175754791984E-03 6.2026183592565386E-03 6.1932316816150522E-03 6.1838575283430881E-03 + 6.1744958852392512E-03 6.1651467381124174E-03 6.1558100727817401E-03 6.1464858750766554E-03 6.1371741308369043E-03 + 6.1278748259125338E-03 6.1185879461639050E-03 6.1093134774617133E-03 6.1000514056869870E-03 6.0908017167311066E-03 + 6.0815643964958017E-03 6.0723394308931766E-03 6.0631268058457125E-03 6.0539265072862723E-03 6.0447385211581123E-03 + 6.0355628334149043E-03 6.0263994300207178E-03 6.0172482969500654E-03 6.0081094201878743E-03 5.9989827857295256E-03 + 5.9898683795808431E-03 5.9807661877581140E-03 5.9716761962880964E-03 5.9625983912080238E-03 5.9535327585656115E-03 + 5.9444792844190785E-03 5.9354379548371390E-03 5.9264087558990224E-03 5.9173916736944849E-03 5.9083866943238032E-03 + 5.8993938038977949E-03 5.8904129885378239E-03 5.8814442343758109E-03 5.8724875275542304E-03 5.8635428542261371E-03 + 5.8546102005551624E-03 5.8456895527155212E-03 5.8367808968920231E-03 5.8278842192800821E-03 5.8189995060857229E-03 + 5.8101267435255880E-03 5.8012659178269428E-03 5.7924170152276943E-03 5.7835800219763808E-03 5.7747549243321932E-03 + 5.7659417085649811E-03 5.7571403609552553E-03 5.7483508677941969E-03 5.7395732153836653E-03 5.7308073900362091E-03 + 5.7220533780750612E-03 5.7133111658341628E-03 5.7045807396581575E-03 5.6958620859024018E-03 5.6871551909329727E-03 + 5.6784600411266808E-03 5.6697766228710625E-03 5.6611049225644000E-03 5.6524449266157220E-03 5.6437966214448118E-03 + 5.6351599934822139E-03 5.6265350291692358E-03 5.6179217149579675E-03 5.6093200373112714E-03 5.6007299827028015E-03 + 5.5921515376170013E-03 5.5835846885491135E-03 5.5750294220051899E-03 5.5664857245020898E-03 5.5579535825674891E-03 + 5.5494329827398929E-03 5.5409239115686267E-03 5.5324263556138622E-03 5.5239403014466009E-03 5.5154657356486971E-03 + 5.5070026448128606E-03 5.4985510155426505E-03 5.4901108344524944E-03 5.4816820881676935E-03 5.4732647633244178E-03 + 5.4648588465697158E-03 5.4564643245615307E-03 5.4480811839686880E-03 5.4397094114709112E-03 5.4313489937588286E-03 + 5.4229999175339676E-03 5.4146621695087774E-03 5.4063357364066179E-03 5.3980206049617681E-03 5.3897167619194400E-03 + 5.3814241940357693E-03 5.3731428880778405E-03 5.3648728308236630E-03 5.3566140090622050E-03 5.3483664095933768E-03 + 5.3401300192280508E-03 5.3319048247880531E-03 5.3236908131061769E-03 5.3154879710261855E-03 5.3072962854028094E-03 + 5.2991157431017634E-03 5.2909463309997393E-03 5.2827880359844178E-03 5.2746408449544655E-03 5.2665047448195498E-03 + 5.2583797225003292E-03 5.2502657649284700E-03 5.2421628590466410E-03 5.2340709918085272E-03 5.2259901501788197E-03 + 5.2179203211332337E-03 5.2098614916585070E-03 5.2018136487523951E-03 5.1937767794236938E-03 5.1857508706922208E-03 + 5.1777359095888393E-03 5.1697318831554484E-03 5.1617387784449915E-03 5.1537565825214562E-03 5.1457852824598862E-03 + 5.1378248653463753E-03 5.1298753182780713E-03 5.1219366283631910E-03 5.1140087827210067E-03 5.1060917684818581E-03 + 5.0981855727871596E-03 5.0902901827893912E-03 5.0824055856521170E-03 5.0745317685499712E-03 5.0666687186686765E-03 + 5.0588164232050377E-03 5.0509748693669428E-03 5.0431440443733759E-03 5.0353239354544114E-03 5.0275145298512179E-03 + 5.0197158148160646E-03 5.0119277776123185E-03 5.0041504055144516E-03 4.9963836858080398E-03 4.9886276057897715E-03 + 4.9808821527674374E-03 4.9731473140599471E-03 4.9654230769973261E-03 4.9577094289207134E-03 4.9500063571823677E-03 + 4.9423138491456742E-03 4.9346318921851340E-03 4.9269604736863811E-03 4.9192995810461741E-03 4.9116492016724016E-03 + 4.9040093229840856E-03 4.8963799324113783E-03 4.8887610173955704E-03 4.8811525653890894E-03 4.8735545638555026E-03 + 4.8659670002695167E-03 4.8583898621169788E-03 4.8508231368948841E-03 4.8432668121113718E-03 4.8357208752857275E-03 + 4.8281853139483860E-03 4.8206601156409335E-03 4.8131452679161073E-03 4.8056407583377944E-03 4.7981465744810388E-03 + 4.7906627039320413E-03 4.7831891342881572E-03 4.7757258531578965E-03 4.7682728481609369E-03 4.7608301069281085E-03 + 4.7533976171014077E-03 4.7459753663339878E-03 4.7385633422901679E-03 4.7311615326454358E-03 4.7237699250864355E-03 + 4.7163885073109868E-03 4.7090172670280666E-03 4.7016561919578257E-03 4.6943052698315809E-03 4.6869644883918158E-03 + 4.6796338353921885E-03 4.6723132985975269E-03 4.6650028657838237E-03 4.6577025247382491E-03 4.6504122632591380E-03 + 4.6431320691560094E-03 4.6358619302495439E-03 4.6286018343715974E-03 4.6213517693652062E-03 4.6141117230845685E-03 + 4.6068816833950655E-03 4.5996616381732500E-03 4.5924515753068473E-03 4.5852514826947603E-03 4.5780613482470627E-03 + 4.5708811598850060E-03 4.5637109055410149E-03 4.5565505731586875E-03 4.5494001506928006E-03 4.5422596261092988E-03 + 4.5351289873853066E-03 4.5280082225091214E-03 4.5208973194802099E-03 4.5137962663092199E-03 4.5067050510179682E-03 + 4.4996236616394441E-03 4.4925520862178136E-03 4.4854903128084085E-03 4.4784383294777389E-03 4.4713961243034814E-03 + 4.4643636853744870E-03 4.4573410007907764E-03 4.4503280586635375E-03 4.4433248471151291E-03 4.4363313542790800E-03 + 4.4293475683000825E-03 4.4223734773340025E-03 4.4154090695478635E-03 4.4084543331198650E-03 4.4015092562393618E-03 + 4.3945738271068784E-03 4.3876480339340978E-03 4.3807318649438671E-03 4.3738253083701962E-03 4.3669283524582526E-03 + 4.3600409854643637E-03 4.3531631956560133E-03 4.3462949713118440E-03 4.3394363007216536E-03 4.3325871721863933E-03 + 4.3257475740181659E-03 4.3189174945402311E-03 4.3120969220869941E-03 4.3052858450040128E-03 4.2984842516479932E-03 + 4.2916921303867844E-03 4.2849094695993828E-03 4.2781362576759310E-03 4.2713724830177099E-03 4.2646181340371429E-03 + 4.2578731991577915E-03 4.2511376668143584E-03 4.2444115254526753E-03 4.2376947635297171E-03 4.2309873695135823E-03 + 4.2242893318835077E-03 4.2176006391298542E-03 4.2109212797541134E-03 4.2042512422689002E-03 4.1975905151979557E-03 + 4.1909390870761383E-03 4.1842969464494341E-03 4.1776640818749367E-03 4.1710404819208678E-03 4.1644261351665521E-03 + 4.1578210302024325E-03 4.1512251556300598E-03 4.1446385000620941E-03 4.1380610521223006E-03 4.1314928004455454E-03 + 4.1249337336777990E-03 4.1183838404761320E-03 4.1118431095087081E-03 4.1053115294547885E-03 4.0987890890047266E-03 + 4.0922757768599638E-03 4.0857715817330300E-03 4.0792764923475427E-03 4.0727904974381971E-03 4.0663135857507728E-03 + 4.0598457460421259E-03 4.0533869670801867E-03 4.0469372376439623E-03 4.0404965465235237E-03 4.0340648825200132E-03 + 4.0276422344456388E-03 4.0212285911236682E-03 4.0148239413884314E-03 4.0084282740853122E-03 4.0020415780707497E-03 + 3.9956638422122357E-03 3.9892950553883097E-03 3.9829352064885545E-03 3.9765842844135977E-03 3.9702422780751086E-03 + 3.9639091763957893E-03 3.9575849683093798E-03 3.9512696427606480E-03 3.9449631887053926E-03 3.9386655951104367E-03 + 3.9323768509536214E-03 3.9260969452238120E-03 3.9198258669208858E-03 3.9135636050557374E-03 3.9073101486502664E-03 + 3.9010654867373774E-03 3.8948296083609834E-03 3.8886025025759927E-03 3.8823841584483122E-03 3.8761745650548415E-03 + 3.8699737114834720E-03 3.8637815868330753E-03 3.8575981802135137E-03 3.8514234807456248E-03 3.8452574775612249E-03 + 3.8391001598030998E-03 3.8329515166250056E-03 3.8268115371916703E-03 3.8206802106787747E-03 3.8145575262729663E-03 + 3.8084434731718410E-03 3.8023380405839509E-03 3.7962412177287952E-03 3.7901529938368173E-03 3.7840733581493979E-03 + 3.7780022999188596E-03 3.7719398084084554E-03 3.7658858728923687E-03 3.7598404826557083E-03 3.7538036269945006E-03 + 3.7477752952156970E-03 3.7417554766371592E-03 3.7357441605876587E-03 3.7297413364068750E-03 3.7237469934453880E-03 + 3.7177611210646769E-03 3.7117837086371166E-03 3.7058147455459704E-03 3.6998542211853884E-03 3.6939021249604051E-03 + 3.6879584462869309E-03 3.6820231745917503E-03 3.6760962993125190E-03 3.6701778098977597E-03 3.6642676958068541E-03 + 3.6583659465100429E-03 3.6524725514884204E-03 3.6465875002339308E-03 3.6407107822493605E-03 3.6348423870483397E-03 + 3.6289823041553331E-03 3.6231305231056369E-03 3.6172870334453757E-03 3.6114518247314974E-03 3.6056248865317694E-03 + 3.5998062084247728E-03 3.5939957799998980E-03 3.5881935908573439E-03 3.5823996306081061E-03 3.5766138888739811E-03 + 3.5708363552875559E-03 3.5650670194922029E-03 3.5593058711420812E-03 3.5535528999021248E-03 3.5478080954480444E-03 + 3.5420714474663187E-03 3.5363429456541913E-03 3.5306225797196657E-03 3.5249103393814991E-03 3.5192062143692008E-03 + 3.5135101944230259E-03 3.5078222692939711E-03 3.5021424287437655E-03 3.4964706625448760E-03 3.4908069604804924E-03 + 3.4851513123445219E-03 3.4795037079416000E-03 3.4738641370870645E-03 3.4682325896069647E-03 3.4626090553380486E-03 + 3.4569935241277679E-03 3.4513859858342605E-03 3.4457864303263572E-03 3.4401948474835644E-03 3.4346112271960742E-03 + 3.4290355593647437E-03 3.4234678339011035E-03 3.4179080407273424E-03 3.4123561697763081E-03 3.4068122109915029E-03 + 3.4012761543270684E-03 3.3957479897477982E-03 3.3902277072291151E-03 3.3847152967570776E-03 3.3792107483283673E-03 + 3.3737140519502912E-03 3.3682251976407708E-03 3.3627441754283350E-03 3.3572709753521197E-03 3.3518055874618676E-03 + 3.3463480018179038E-03 3.3408982084911542E-03 3.3354561975631239E-03 3.3300219591258979E-03 3.3245954832821323E-03 + 3.3191767601450542E-03 3.3137657798384540E-03 3.3083625324966765E-03 3.3029670082646190E-03 3.2975791972977286E-03 + 3.2921990897619873E-03 3.2868266758339188E-03 3.2814619457005711E-03 3.2761048895595204E-03 3.2707554976188625E-03 + 3.2654137600972009E-03 3.2600796672236504E-03 3.2547532092378332E-03 3.2494343763898566E-03 3.2441231589403281E-03 + 3.2388195471603361E-03 3.2335235313314496E-03 3.2282351017457111E-03 3.2229542487056321E-03 3.2176809625241889E-03 + 3.2124152335248060E-03 3.2071570520413695E-03 3.2019064084182060E-03 3.1966632930100812E-03 3.1914276961821915E-03 + 3.1861996083101694E-03 3.1809790197800643E-03 3.1757659209883386E-03 3.1705603023418748E-03 3.1653621542579490E-03 + 3.1601714671642437E-03 3.1549882314988323E-03 3.1498124377101742E-03 3.1446440762571068E-03 3.1394831376088516E-03 + 3.1343296122449886E-03 3.1291834906554670E-03 3.1240447633405946E-03 3.1189134208110232E-03 3.1137894535877581E-03 + 3.1086728522021355E-03 3.1035636071958341E-03 3.0984617091208504E-03 3.0933671485395080E-03 3.0882799160244427E-03 + 3.0832000021586022E-03 3.0781273975352304E-03 3.0730620927578757E-03 3.0680040784403688E-03 3.0629533452068325E-03 + 3.0579098836916621E-03 3.0528736845395286E-03 3.0478447384053647E-03 3.0428230359543680E-03 3.0378085678619852E-03 + 3.0328013248139096E-03 3.0278012975060806E-03 3.0228084766446648E-03 3.0178228529460630E-03 3.0128444171368960E-03 + 3.0078731599540009E-03 3.0029090721444230E-03 2.9979521444654126E-03 2.9930023676844144E-03 2.9880597325790651E-03 + 2.9831242299371858E-03 2.9781958505567738E-03 2.9732745852459998E-03 2.9683604248231985E-03 2.9634533601168613E-03 + 2.9585533819656367E-03 2.9536604812183125E-03 2.9487746487338188E-03 2.9438958753812221E-03 2.9390241520397065E-03 + 2.9341594695985866E-03 2.9293018189572783E-03 2.9244511910253182E-03 2.9196075767223312E-03 2.9147709669780399E-03 + 2.9099413527322606E-03 2.9051187249348773E-03 2.9003030745458611E-03 2.8954943925352424E-03 2.8906926698831163E-03 + 2.8858978975796314E-03 2.8811100666249843E-03 2.8763291680294106E-03 2.8715551928131825E-03 2.8667881320066039E-03 + 2.8620279766499901E-03 2.8572747177936808E-03 2.8525283464980182E-03 2.8477888538333499E-03 2.8430562308800105E-03 + 2.8383304687283318E-03 2.8336115584786203E-03 2.8288994912411590E-03 2.8241942581361981E-03 2.8194958502939494E-03 + 2.8148042588545807E-03 2.8101194749681996E-03 2.8054414897948667E-03 2.8007702945045654E-03 2.7961058802772102E-03 + 2.7914482383026374E-03 2.7867973597805952E-03 2.7821532359207377E-03 2.7775158579426214E-03 2.7728852170756904E-03 + 2.7682613045592820E-03 2.7636441116426066E-03 2.7590336295847512E-03 2.7544298496546661E-03 2.7498327631311592E-03 + 2.7452423613028927E-03 2.7406586354683719E-03 2.7360815769359404E-03 2.7315111770237726E-03 2.7269474270598666E-03 + 2.7223903183820394E-03 2.7178398423379135E-03 2.7132959902849184E-03 2.7087587535902804E-03 2.7042281236310120E-03 + 2.6997040917939087E-03 2.6951866494755437E-03 2.6906757880822527E-03 2.6861714990301395E-03 2.6816737737450557E-03 + 2.6771826036626049E-03 2.6726979802281295E-03 2.6682198948967009E-03 2.6637483391331214E-03 2.6592833044119099E-03 + 2.6548247822172971E-03 2.6503727640432182E-03 2.6459272413933083E-03 2.6414882057808897E-03 2.6370556487289704E-03 + 2.6326295617702345E-03 2.6282099364470317E-03 2.6237967643113810E-03 2.6193900369249467E-03 2.6149897458590502E-03 + 2.6105958826946473E-03 2.6062084390223303E-03 2.6018274064423144E-03 2.5974527765644387E-03 2.5930845410081517E-03 + 2.5887226914025055E-03 2.5843672193861505E-03 2.5800181166073274E-03 2.5756753747238612E-03 2.5713389854031500E-03 + 2.5670089403221643E-03 2.5626852311674332E-03 2.5583678496350405E-03 2.5540567874306184E-03 2.5497520362693349E-03 + 2.5454535878758960E-03 2.5411614339845277E-03 2.5368755663389767E-03 2.5325959766924998E-03 2.5283226568078563E-03 + 2.5240555984573027E-03 2.5197947934225830E-03 2.5155402334949223E-03 2.5112919104750236E-03 2.5070498161730488E-03 + 2.5028139424086290E-03 2.4985842810108382E-03 2.4943608238182030E-03 2.4901435626786821E-03 2.4859324894496641E-03 + 2.4817275959979649E-03 2.4775288741998129E-03 2.4733363159408421E-03 2.4691499131160922E-03 2.4649696576299913E-03 + 2.4607955413963570E-03 2.4566275563383823E-03 2.4524656943886334E-03 2.4483099474890409E-03 2.4441603075908880E-03 + 2.4400167666548097E-03 2.4358793166507804E-03 2.4317479495581107E-03 2.4276226573654381E-03 2.4235034320707147E-03 + 2.4193902656812088E-03 2.4152831502134921E-03 2.4111820776934311E-03 2.4070870401561831E-03 2.4029980296461865E-03 + 2.3989150382171566E-03 2.3948380579320696E-03 2.3907670808631701E-03 2.3867020990919457E-03 2.3826431047091323E-03 + 2.3785900898147046E-03 2.3745430465178649E-03 2.3705019669370362E-03 2.3664668431998565E-03 2.3624376674431752E-03 + 2.3584144318130320E-03 2.3543971284646702E-03 2.3503857495625054E-03 2.3463802872801388E-03 2.3423807338003367E-03 + 2.3383870813150306E-03 2.3343993220253010E-03 2.3304174481413795E-03 2.3264414518826366E-03 2.3224713254775728E-03 + 2.3185070611638115E-03 2.3145486511880952E-03 2.3105960878062738E-03 2.3066493632833002E-03 2.3027084698932204E-03 + 2.2987733999191634E-03 2.2948441456533417E-03 2.2909206993970343E-03 2.2870030534605885E-03 2.2830912001634029E-03 + 2.2791851318339261E-03 2.2752848408096491E-03 2.2713903194370925E-03 2.2675015600718035E-03 2.2636185550783511E-03 + 2.2597412968303060E-03 2.2558697777102514E-03 2.2520039901097557E-03 2.2481439264293835E-03 2.2442895790786730E-03 + 2.2404409404761360E-03 2.2365980030492495E-03 2.2327607592344482E-03 2.2289292014771125E-03 2.2251033222315682E-03 + 2.2212831139610720E-03 2.2174685691378087E-03 2.2136596802428796E-03 2.2098564397662998E-03 2.2060588402069855E-03 + 2.2022668740727474E-03 2.1984805338802877E-03 2.1946998121551839E-03 2.1909247014318916E-03 2.1871551942537269E-03 + 2.1833912831728652E-03 2.1796329607503303E-03 2.1758802195559887E-03 2.1721330521685426E-03 2.1683914511755158E-03 + 2.1646554091732544E-03 2.1609249187669161E-03 2.1571999725704598E-03 2.1534805632066421E-03 2.1497666833070056E-03 + 2.1460583255118741E-03 2.1423554824703461E-03 2.1386581468402807E-03 2.1349663112882975E-03 2.1312799684897639E-03 + 2.1275991111287884E-03 2.1239237318982167E-03 2.1202538234996174E-03 2.1165893786432794E-03 2.1129303900482010E-03 + 2.1092768504420868E-03 2.1056287525613340E-03 2.1019860891510261E-03 2.0983488529649312E-03 2.0947170367654842E-03 + 2.0910906333237904E-03 2.0874696354196065E-03 2.0838540358413412E-03 2.0802438273860436E-03 2.0766390028593967E-03 + 2.0730395550757081E-03 2.0694454768579052E-03 2.0658567610375251E-03 2.0622734004547062E-03 2.0586953879581840E-03 + 2.0551227164052797E-03 2.0515553786618927E-03 2.0479933676024946E-03 2.0444366761101242E-03 2.0408852970763718E-03 + 2.0373392234013781E-03 2.0337984479938238E-03 2.0302629637709221E-03 2.0267327636584124E-03 2.0232078405905507E-03 + 2.0196881875101029E-03 2.0161737973683354E-03 2.0126646631250093E-03 2.0091607777483721E-03 2.0056621342151516E-03 + 2.0021687255105409E-03 1.9986805446282037E-03 1.9951975845702518E-03 1.9917198383472470E-03 1.9882472989781923E-03 + 1.9847799594905203E-03 1.9813178129200909E-03 1.9778608523111740E-03 1.9744090707164556E-03 1.9709624611970174E-03 + 1.9675210168223363E-03 1.9640847306702722E-03 1.9606535958270658E-03 1.9572276053873251E-03 1.9538067524540186E-03 + 1.9503910301384747E-03 1.9469804315603602E-03 1.9435749498476870E-03 1.9401745781367952E-03 1.9367793095723485E-03 + 1.9333891373073222E-03 1.9300040545030066E-03 1.9266240543289843E-03 1.9232491299631335E-03 1.9198792745916170E-03 + 1.9165144814088713E-03 1.9131547436176044E-03 1.9098000544287813E-03 1.9064504070616260E-03 1.9031057947436010E-03 + 1.8997662107104094E-03 1.8964316482059857E-03 1.8931021004824841E-03 1.8897775608002724E-03 1.8864580224279266E-03 + 1.8831434786422193E-03 1.8798339227281164E-03 1.8765293479787633E-03 1.8732297476954849E-03 1.8699351151877696E-03 + 1.8666454437732680E-03 1.8633607267777826E-03 1.8600809575352575E-03 1.8568061293877762E-03 1.8535362356855481E-03 + 1.8502712697869067E-03 1.8470112250582944E-03 1.8437560948742625E-03 1.8405058726174589E-03 1.8372605516786187E-03 + 1.8340201254565620E-03 1.8307845873581810E-03 1.8275539307984366E-03 1.8243281492003455E-03 1.8211072359949777E-03 + 1.8178911846214445E-03 1.8146799885268941E-03 1.8114736411665013E-03 1.8082721360034601E-03 1.8050754665089770E-03 + 1.8018836261622646E-03 1.7986966084505285E-03 1.7955144068689665E-03 1.7923370149207536E-03 1.7891644261170431E-03 + 1.7859966339769482E-03 1.7828336320275431E-03 1.7796754138038526E-03 1.7765219728488396E-03 1.7733733027134060E-03 + 1.7702293969563785E-03 1.7670902491445026E-03 1.7639558528524323E-03 1.7608262016627317E-03 1.7577012891658540E-03 + 1.7545811089601424E-03 1.7514656546518236E-03 1.7483549198549907E-03 1.7452488981916051E-03 1.7421475832914862E-03 + 1.7390509687923003E-03 1.7359590483395540E-03 1.7328718155865909E-03 1.7297892641945786E-03 1.7267113878325039E-03 + 1.7236381801771625E-03 1.7205696349131537E-03 1.7175057457328737E-03 1.7144465063365019E-03 1.7113919104320020E-03 + 1.7083419517351052E-03 1.7052966239693085E-03 1.7022559208658668E-03 1.6992198361637828E-03 1.6961883636097978E-03 + 1.6931614969583893E-03 1.6901392299717584E-03 1.6871215564198258E-03 1.6841084700802203E-03 1.6810999647382744E-03 + 1.6780960341870154E-03 1.6750966722271555E-03 1.6721018726670882E-03 1.6691116293228779E-03 1.6661259360182536E-03 + 1.6631447865845988E-03 1.6601681748609448E-03 1.6571960946939685E-03 1.6542285399379732E-03 1.6512655044548913E-03 + 1.6483069821142736E-03 1.6453529667932788E-03 1.6424034523766678E-03 1.6394584327567975E-03 1.6365179018336107E-03 + 1.6335818535146299E-03 1.6306502817149487E-03 1.6277231803572248E-03 1.6248005433716730E-03 1.6218823646960544E-03 + 1.6189686382756733E-03 1.6160593580633645E-03 1.6131545180194916E-03 1.6102541121119334E-03 1.6073581343160803E-03 + 1.6044665786148239E-03 1.6015794389985527E-03 1.5986967094651415E-03 1.5958183840199423E-03 1.5929444566757831E-03 + 1.5900749214529525E-03 1.5872097723791992E-03 1.5843490034897179E-03 1.5814926088271459E-03 1.5786405824415540E-03 + 1.5757929183904402E-03 1.5729496107387195E-03 1.5701106535587171E-03 1.5672760409301636E-03 1.5644457669401835E-03 + 1.5616198256832893E-03 1.5587982112613748E-03 1.5559809177837062E-03 1.5531679393669139E-03 1.5503592701349878E-03 + 1.5475549042192639E-03 1.5447548357584245E-03 1.5419590588984845E-03 1.5391675677927865E-03 1.5363803566019922E-03 + 1.5335974194940749E-03 1.5308187506443138E-03 1.5280443442352827E-03 1.5252741944568452E-03 1.5225082955061472E-03 + 1.5197466415876085E-03 1.5169892269129132E-03 1.5142360457010078E-03 1.5114870921780854E-03 1.5087423605775882E-03 + 1.5060018451401897E-03 1.5032655401137941E-03 1.5005334397535273E-03 1.4978055383217277E-03 1.4950818300879384E-03 + 1.4923623093289031E-03 1.4896469703285537E-03 1.4869358073780082E-03 1.4842288147755582E-03 1.4815259868266643E-03 + 1.4788273178439480E-03 1.4761328021471825E-03 1.4734424340632874E-03 1.4707562079263213E-03 1.4680741180774720E-03 + 1.4653961588650497E-03 1.4627223246444824E-03 1.4600526097783039E-03 1.4573870086361498E-03 1.4547255155947486E-03 + 1.4520681250379127E-03 1.4494148313565340E-03 1.4467656289485745E-03 1.4441205122190581E-03 1.4414794755800671E-03 + 1.4388425134507284E-03 1.4362096202572110E-03 1.4335807904327169E-03 1.4309560184174741E-03 1.4283352986587273E-03 + 1.4257186256107324E-03 1.4231059937347506E-03 1.4204973974990349E-03 1.4178928313788287E-03 1.4152922898563571E-03 + 1.4126957674208160E-03 1.4101032585683703E-03 1.4075147578021408E-03 1.4049302596321996E-03 1.4023497585755643E-03 + 1.3997732491561861E-03 1.3972007259049467E-03 1.3946321833596480E-03 1.3920676160650066E-03 1.3895070185726451E-03 + 1.3869503854410852E-03 1.3843977112357405E-03 1.3818489905289080E-03 1.3793042178997625E-03 1.3767633879343472E-03 + 1.3742264952255685E-03 1.3716935343731861E-03 1.3691644999838082E-03 1.3666393866708824E-03 1.3641181890546880E-03 + 1.3616009017623305E-03 1.3590875194277321E-03 1.3565780366916263E-03 1.3540724482015494E-03 1.3515707486118330E-03 + 1.3490729325835965E-03 1.3465789947847411E-03 1.3440889298899415E-03 1.3416027325806384E-03 1.3391203975450317E-03 + 1.3366419194780713E-03 1.3341672930814535E-03 1.3316965130636105E-03 1.3292295741397034E-03 1.3267664710316168E-03 + 1.3243071984679489E-03 1.3218517511840062E-03 1.3194001239217963E-03 1.3169523114300186E-03 1.3145083084640579E-03 + 1.3120681097859785E-03 1.3096317101645150E-03 1.3071991043750667E-03 1.3047702871996874E-03 1.3023452534270832E-03 + 1.2999239978526004E-03 1.2975065152782185E-03 1.2950928005125474E-03 1.2926828483708153E-03 1.2902766536748635E-03 + 1.2878742112531389E-03 1.2854755159406879E-03 1.2830805625791461E-03 1.2806893460167354E-03 1.2783018611082519E-03 + 1.2759181027150622E-03 1.2735380657050962E-03 1.2711617449528360E-03 1.2687891353393144E-03 1.2664202317521026E-03 + 1.2640550290853065E-03 1.2616935222395575E-03 1.2593357061220051E-03 1.2569815756463113E-03 1.2546311257326432E-03 + 1.2522843513076644E-03 1.2499412473045281E-03 1.2476018086628722E-03 1.2452660303288079E-03 1.2429339072549173E-03 + 1.2406054344002426E-03 1.2382806067302802E-03 1.2359594192169741E-03 1.2336418668387075E-03 1.2313279445802967E-03 + 1.2290176474329855E-03 1.2267109703944321E-03 1.2244079084687107E-03 1.2221084566662952E-03 1.2198126100040594E-03 + 1.2175203635052666E-03 1.2152317121995632E-03 1.2129466511229695E-03 1.2106651753178764E-03 1.2083872798330350E-03 + 1.2061129597235520E-03 1.2038422100508800E-03 1.2015750258828129E-03 1.1993114022934772E-03 1.1970513343633248E-03 + 1.1947948171791279E-03 1.1925418458339694E-03 1.1902924154272370E-03 1.1880465210646171E-03 1.1858041578580863E-03 + 1.1835653209259038E-03 1.1813300053926069E-03 1.1790982063890018E-03 1.1768699190521557E-03 1.1746451385253932E-03 + 1.1724238599582877E-03 1.1702060785066506E-03 1.1679917893325320E-03 1.1657809876042058E-03 1.1635736684961671E-03 + 1.1613698271891260E-03 1.1591694588699969E-03 1.1569725587318937E-03 1.1547791219741227E-03 1.1525891438021775E-03 + 1.1504026194277257E-03 1.1482195440686109E-03 1.1460399129488380E-03 1.1438637212985690E-03 1.1416909643541188E-03 + 1.1395216373579439E-03 1.1373557355586373E-03 1.1351932542109223E-03 1.1330341885756438E-03 1.1308785339197631E-03 + 1.1287262855163493E-03 1.1265774386445750E-03 1.1244319885897053E-03 1.1222899306430952E-03 1.1201512601021794E-03 + 1.1180159722704672E-03 1.1158840624575341E-03 1.1137555259790176E-03 1.1116303581566070E-03 1.1095085543180385E-03 + 1.1073901097970883E-03 1.1052750199335652E-03 1.1031632800733023E-03 1.1010548855681533E-03 1.0989498317759841E-03 + 1.0968481140606642E-03 1.0947497277920631E-03 1.0926546683460395E-03 1.0905629311044401E-03 1.0884745114550856E-03 + 1.0863894047917703E-03 1.0843076065142512E-03 1.0822291120282438E-03 1.0801539167454126E-03 1.0780820160833659E-03 + 1.0760134054656502E-03 1.0739480803217403E-03 1.0718860360870348E-03 1.0698272682028490E-03 1.0677717721164076E-03 + 1.0657195432808371E-03 1.0636705771551618E-03 1.0616248692042931E-03 1.0595824148990276E-03 1.0575432097160336E-03 + 1.0555072491378527E-03 1.0534745286528847E-03 1.0514450437553882E-03 1.0494187899454683E-03 1.0473957627290720E-03 + 1.0453759576179817E-03 1.0433593701298100E-03 1.0413459957879874E-03 1.0393358301217634E-03 1.0373288686661929E-03 + 1.0353251069621331E-03 1.0333245405562367E-03 1.0313271650009435E-03 1.0293329758544760E-03 1.0273419686808293E-03 + 1.0253541390497682E-03 1.0233694825368194E-03 1.0213879947232613E-03 1.0194096711961236E-03 1.0174345075481760E-03 + 1.0154624993779214E-03 1.0134936422895938E-03 1.0115279318931452E-03 1.0095653638042450E-03 1.0076059336442684E-03 + 1.0056496370402935E-03 1.0036964696250930E-03 1.0017464270371270E-03 9.9979950492053789E-04 9.9785569892514212E-04 + 9.9591500470642513E-04 9.9397741792553408E-04 9.9204293424927131E-04 9.9011154935008659E-04 9.8818325890607291E-04 + 9.8625805860095704E-04 9.8433594412409577E-04 9.8241691117046813E-04 9.8050095544066824E-04 9.7858807264089858E-04 + 9.7667825848296477E-04 9.7477150868426879E-04 9.7286781896780089E-04 9.7096718506213553E-04 9.6906960270142168E-04 + 9.6717506762537971E-04 9.6528357557929272E-04 9.6339512231399924E-04 9.6150970358588913E-04 9.5962731515689646E-04 + 9.5774795279449185E-04 9.5587161227167570E-04 9.5399828936697316E-04 9.5212797986442841E-04 9.5026067955359468E-04 + 9.4839638422953068E-04 9.4653508969279375E-04 9.4467679174943314E-04 9.4282148621098222E-04 9.4096916889445446E-04 + 9.3911983562233465E-04 9.3727348222257445E-04 9.3543010452858447E-04 9.3358969837922822E-04 9.3175225961881602E-04 + 9.2991778409709904E-04 9.2808626766926116E-04 9.2625770619591380E-04 9.2443209554309014E-04 9.2260943158223676E-04 + 9.2078971019020936E-04 9.1897292724926521E-04 9.1715907864705563E-04 9.1534816027662245E-04 9.1354016803638972E-04 + 9.1173509783015771E-04 9.0993294556709621E-04 9.0813370716173855E-04 9.0633737853397533E-04 9.0454395560904822E-04 + 9.0275343431754271E-04 9.0096581059538280E-04 8.9918108038382349E-04 8.9739923962944715E-04 8.9562028428415228E-04 + 8.9384421030515337E-04 8.9207101365496846E-04 8.9030069030141825E-04 8.8853323621761562E-04 8.8676864738196099E-04 + 8.8500691977813758E-04 8.8324804939510205E-04 8.8149203222708005E-04 8.7973886427356062E-04 8.7798854153928749E-04 + 8.7624106003425560E-04 8.7449641577370236E-04 8.7275460477810368E-04 8.7101562307316603E-04 8.6927946668982007E-04 + 8.6754613166421617E-04 8.6581561403771740E-04 8.6408790985689115E-04 8.6236301517350720E-04 8.6064092604452662E-04 + 8.5892163853210069E-04 8.5720514870355922E-04 8.5549145263140935E-04 8.5378054639332582E-04 8.5207242607214734E-04 + 8.5036708775586777E-04 8.4866452753763256E-04 8.4696474151573018E-04 8.4526772579358877E-04 8.4357347647976701E-04 + 8.4188198968794959E-04 8.4019326153694101E-04 8.3850728815065910E-04 8.3682406565812955E-04 8.3514359019347796E-04 + 8.3346585789592631E-04 8.3179086490978410E-04 8.3011860738444528E-04 8.2844908147437931E-04 8.2678228333912644E-04 + 8.2511820914329124E-04 8.2345685505653748E-04 8.2179821725358057E-04 8.2014229191418168E-04 8.1848907522314351E-04 + 8.1683856337030089E-04 8.1519075255051868E-04 8.1354563896368236E-04 8.1190321881469336E-04 8.1026348831346332E-04 + 8.0862644367490758E-04 8.0699208111893934E-04 8.0536039687046279E-04 8.0373138715936893E-04 8.0210504822052729E-04 + 8.0048137629378175E-04 7.9886036762394374E-04 7.9724201846078562E-04 7.9562632505903613E-04 7.9401328367837342E-04 + 7.9240289058341864E-04 7.9079514204373220E-04 7.8919003433380365E-04 7.8758756373305120E-04 7.8598772652581003E-04 + 7.8439051900133045E-04 7.8279593745377073E-04 7.8120397818219047E-04 7.7961463749054514E-04 7.7802791168768046E-04 + 7.7644379708732576E-04 7.7486229000808913E-04 7.7328338677344968E-04 7.7170708371175438E-04 7.7013337715620925E-04 + 7.6856226344487473E-04 7.6699373892066087E-04 7.6542779993131883E-04 7.6386444282943756E-04 7.6230366397243702E-04 + 7.6074545972256108E-04 7.5918982644687335E-04 7.5763676051725096E-04 7.5608625831037818E-04 7.5453831620774002E-04 + 7.5299293059561811E-04 7.5145009786508352E-04 7.4990981441199129E-04 7.4837207663697462E-04 7.4683688094543863E-04 + 7.4530422374755598E-04 7.4377410145825824E-04 7.4224651049723304E-04 7.4072144728891767E-04 7.3919890826249000E-04 + 7.3767888985186881E-04 7.3616138849570180E-04 7.3464640063736404E-04 7.3313392272494947E-04 7.3162395121126756E-04 + 7.3011648255383516E-04 7.2861151321487229E-04 7.2710903966129723E-04 7.2560905836471703E-04 7.2411156580142605E-04 + 7.2261655845239808E-04 7.2112403280328089E-04 7.1963398534438986E-04 7.1814641257070364E-04 7.1666131098185783E-04 + 7.1517867708213885E-04 7.1369850738047815E-04 7.1222079839044767E-04 7.1074554663025315E-04 7.0927274862272831E-04 + 7.0780240089532963E-04 7.0633449998013062E-04 7.0486904241381606E-04 7.0340602473767660E-04 7.0194544349760262E-04 + 7.0048729524407861E-04 6.9903157653217782E-04 6.9757828392155653E-04 6.9612741397644855E-04 6.9467896326565887E-04 + 6.9323292836255914E-04 6.9178930584508130E-04 6.9034809229571168E-04 6.8890928430148613E-04 6.8747287845398475E-04 + 6.8603887134932443E-04 6.8460725958815550E-04 6.8317803977565456E-04 6.8175120852151893E-04 6.8032676243996303E-04 + 6.7890469814970995E-04 6.7748501227398838E-04 6.7606770144052494E-04 6.7465276228154017E-04 6.7324019143374264E-04 + 6.7182998553832216E-04 6.7042214124094662E-04 6.6901665519175451E-04 6.6761352404534938E-04 6.6621274446079554E-04 + 6.6481431310161214E-04 6.6341822663576716E-04 6.6202448173567174E-04 6.6063307507817576E-04 6.5924400334456087E-04 + 6.5785726322053692E-04 6.5647285139623483E-04 6.5509076456620092E-04 6.5371099942939303E-04 6.5233355268917411E-04 + 6.5095842105330657E-04 6.4958560123394690E-04 6.4821508994764097E-04 6.4684688391531699E-04 6.4548097986228238E-04 + 6.4411737451821596E-04 6.4275606461716380E-04 6.4139704689753364E-04 6.4004031810208984E-04 6.3868587497794692E-04 + 6.3733371427656478E-04 6.3598383275374347E-04 6.3463622716961748E-04 6.3329089428865073E-04 6.3194783087963029E-04 + 6.3060703371566214E-04 6.2926849957416480E-04 6.2793222523686539E-04 6.2659820748979154E-04 6.2526644312326971E-04 + 6.2393692893191637E-04 6.2260966171463511E-04 6.2128463827460987E-04 6.1996185541930021E-04 6.1864130996043608E-04 + 6.1732299871401200E-04 6.1600691850028191E-04 6.1469306614375457E-04 6.1338143847318655E-04 6.1207203232157897E-04 + 6.1076484452617075E-04 6.0945987192843399E-04 6.0815711137406851E-04 6.0685655971299613E-04 6.0555821379935600E-04 + 6.0426207049149984E-04 6.0296812665198421E-04 6.0167637914756934E-04 6.0038682484920918E-04 5.9909946063204994E-04 + 5.9781428337542307E-04 5.9653128996284006E-04 5.9525047728198820E-04 5.9397184222472344E-04 5.9269538168706722E-04 + 5.9142109256920053E-04 5.9014897177545782E-04 5.8887901621432290E-04 5.8761122279842373E-04 5.8634558844452623E-04 + 5.8508211007352962E-04 5.8382078461046219E-04 5.8256160898447461E-04 5.8130458012883521E-04 5.8004969498092558E-04 + 5.7879695048223395E-04 5.7754634357835236E-04 5.7629787121896842E-04 5.7505153035786270E-04 5.7380731795290203E-04 + 5.7256523096603604E-04 5.7132526636329006E-04 5.7008742111476127E-04 5.6885169219461293E-04 5.6761807658106992E-04 + 5.6638657125641337E-04 5.6515717320697507E-04 5.6392987942313264E-04 5.6270468689930471E-04 5.6148159263394622E-04 + 5.6026059362954172E-04 5.5904168689260261E-04 5.5782486943365913E-04 5.5661013826725900E-04 5.5539749041195856E-04 + 5.5418692289032018E-04 5.5297843272890683E-04 5.5177201695827632E-04 5.5056767261297635E-04 5.4936539673154042E-04 + 5.4816518635648177E-04 5.4696703853428881E-04 5.4577095031541967E-04 5.4457691875429829E-04 5.4338494090930810E-04 + 5.4219501384278757E-04 5.4100713462102530E-04 5.3982130031425513E-04 5.3863750799665083E-04 5.3745575474632116E-04 + 5.3627603764530498E-04 5.3509835377956653E-04 5.3392270023898956E-04 5.3274907411737370E-04 5.3157747251242869E-04 + 5.3040789252576954E-04 5.2924033126291146E-04 5.2807478583326501E-04 5.2691125335013115E-04 5.2574973093069710E-04 + 5.2459021569602963E-04 5.2343270477107234E-04 5.2227719528463864E-04 5.2112368436940800E-04 5.1997216916192161E-04 + 5.1882264680257564E-04 5.1767511443561842E-04 5.1652956920914385E-04 5.1538600827508759E-04 5.1424442878922165E-04 + 5.1310482791115035E-04 5.1196720280430395E-04 5.1083155063593485E-04 5.0969786857711283E-04 5.0856615380271970E-04 + 5.0743640349144490E-04 5.0630861482577972E-04 5.0518278499201428E-04 5.0405891118023049E-04 5.0293699058429921E-04 + 5.0181702040187398E-04 5.0069899783438678E-04 4.9958292008704360E-04 4.9846878436881855E-04 4.9735658789245077E-04 + 4.9624632787443755E-04 4.9513800153503154E-04 4.9403160609823445E-04 4.9292713879179337E-04 4.9182459684719469E-04 + 4.9072397749966095E-04 4.8962527798814502E-04 4.8852849555532530E-04 4.8743362744760207E-04 4.8634067091509072E-04 + 4.8524962321161940E-04 4.8416048159472241E-04 4.8307324332563648E-04 4.8198790566929527E-04 4.8090446589432631E-04 + 4.7982292127304345E-04 4.7874326908144534E-04 4.7766550659920795E-04 4.7658963110968212E-04 4.7551563989988718E-04 + 4.7444353026050696E-04 4.7337329948588560E-04 4.7230494487402196E-04 4.7123846372656525E-04 4.7017385334881088E-04 + 4.6911111104969470E-04 4.6805023414178991E-04 4.6699121994130078E-04 4.6593406576805923E-04 4.6487876894551919E-04 + 4.6382532680075308E-04 4.6277373666444601E-04 4.6172399587089187E-04 4.6067610175798895E-04 4.5963005166723434E-04 + 4.5858584294372027E-04 4.5754347293612904E-04 4.5650293899672853E-04 4.5546423848136783E-04 4.5442736874947191E-04 + 4.5339232716403799E-04 4.5235911109163014E-04 4.5132771790237547E-04 4.5029814496995891E-04 4.4927038967161901E-04 + 4.4824444938814322E-04 4.4722032150386326E-04 4.4619800340665134E-04 4.4517749248791389E-04 4.4415878614258901E-04 + 4.4314188176914059E-04 4.4212677676955454E-04 4.4111346854933359E-04 4.4010195451749345E-04 4.3909223208655758E-04 + 4.3808429867255380E-04 4.3707815169500831E-04 4.3607378857694228E-04 4.3507120674486719E-04 4.3407040362877954E-04 + 4.3307137666215799E-04 4.3207412328195692E-04 4.3107864092860375E-04 4.3008492704599310E-04 4.2909297908148305E-04 + 4.2810279448589025E-04 4.2711437071348663E-04 4.2612770522199310E-04 4.2514279547257625E-04 4.2415963892984416E-04 + 4.2317823306184122E-04 4.2219857534004366E-04 4.2122066323935654E-04 4.2024449423810694E-04 4.1927006581804195E-04 + 4.1829737546432254E-04 4.1732642066552030E-04 4.1635719891361210E-04 4.1538970770397637E-04 4.1442394453538857E-04 + 4.1345990691001684E-04 4.1249759233341707E-04 4.1153699831452924E-04 4.1057812236567270E-04 4.0962096200254221E-04 + 4.0866551474420300E-04 4.0771177811308650E-04 4.0675974963498649E-04 4.0580942683905448E-04 4.0486080725779473E-04 + 4.0391388842706124E-04 4.0296866788605269E-04 4.0202514317730755E-04 4.0108331184670075E-04 4.0014317144343892E-04 + 3.9920471952005596E-04 3.9826795363240910E-04 3.9733287133967443E-04 3.9639947020434223E-04 3.9546774779221339E-04 + 3.9453770167239454E-04 3.9360932941729445E-04 3.9268262860261857E-04 3.9175759680736602E-04 3.9083423161382453E-04 + 3.8991253060756691E-04 3.8899249137744574E-04 3.8807411151558997E-04 3.8715738861740058E-04 3.8624232028154604E-04 + 3.8532890410995812E-04 3.8441713770782807E-04 3.8350701868360181E-04 3.8259854464897604E-04 3.8169171321889407E-04 + 3.8078652201154151E-04 3.7988296864834183E-04 3.7898105075395282E-04 3.7808076595626151E-04 3.7718211188638091E-04 + 3.7628508617864508E-04 3.7538968647060519E-04 3.7449591040302562E-04 3.7360375561987924E-04 3.7271321976834360E-04 + 3.7182430049879716E-04 3.7093699546481419E-04 3.7005130232316134E-04 3.6916721873379328E-04 3.6828474235984853E-04 + 3.6740387086764528E-04 3.6652460192667735E-04 3.6564693320961035E-04 3.6477086239227683E-04 3.6389638715367251E-04 + 3.6302350517595274E-04 3.6215221414442753E-04 3.6128251174755789E-04 3.6041439567695158E-04 3.5954786362735934E-04 + 3.5868291329667009E-04 3.5781954238590756E-04 3.5695774859922604E-04 3.5609752964390592E-04 3.5523888323035047E-04 + 3.5438180707208063E-04 3.5352629888573160E-04 3.5267235639104905E-04 3.5181997731088463E-04 3.5096915937119183E-04 + 3.5011990030102235E-04 3.4927219783252188E-04 3.4842604970092571E-04 3.4758145364455542E-04 3.4673840740481439E-04 + 3.4589690872618365E-04 3.4505695535621850E-04 3.4421854504554345E-04 3.4338167554784946E-04 3.4254634461988910E-04 + 3.4171255002147274E-04 3.4088028951546461E-04 3.4004956086777902E-04 3.3922036184737563E-04 3.3839269022625681E-04 + 3.3756654377946224E-04 3.3674192028506581E-04 3.3591881752417134E-04 3.3509723328090888E-04 3.3427716534243046E-04 + 3.3345861149890633E-04 3.3264156954352102E-04 3.3182603727246887E-04 3.3101201248495138E-04 3.3019949298317180E-04 + 3.2938847657233217E-04 3.2857896106062908E-04 3.2777094425924969E-04 3.2696442398236783E-04 3.2615939804714046E-04 + 3.2535586427370343E-04 3.2455382048516722E-04 3.2375326450761408E-04 3.2295419417009317E-04 3.2215660730461690E-04 + 3.2136050174615745E-04 3.2056587533264261E-04 3.1977272590495178E-04 3.1898105130691252E-04 3.1819084938529624E-04 + 3.1740211798981437E-04 3.1661485497311504E-04 3.1582905819077875E-04 3.1504472550131452E-04 3.1426185476615627E-04 + 3.1348044384965878E-04 3.1270049061909419E-04 3.1192199294464810E-04 3.1114494869941505E-04 3.1036935575939580E-04 + 3.0959521200349280E-04 3.0882251531350670E-04 3.0805126357413224E-04 3.0728145467295447E-04 3.0651308650044592E-04 + 3.0574615694996135E-04 3.0498066391773464E-04 3.0421660530287553E-04 3.0345397900736462E-04 3.0269278293605114E-04 + 3.0193301499664775E-04 3.0117467309972740E-04 3.0041775515871988E-04 2.9966225908990786E-04 2.9890818281242266E-04 + 2.9815552424824104E-04 2.9740428132218134E-04 2.9665445196189980E-04 2.9590603409788659E-04 2.9515902566346243E-04 + 2.9441342459477458E-04 2.9366922883079311E-04 2.9292643631330769E-04 2.9218504498692324E-04 2.9144505279905656E-04 + 2.9070645769993265E-04 2.8996925764258067E-04 2.8923345058283093E-04 2.8849903447931074E-04 2.8776600729344033E-04 + 2.8703436698943003E-04 2.8630411153427631E-04 2.8557523889775796E-04 2.8484774705243203E-04 2.8412163397363127E-04 + 2.8339689763945956E-04 2.8267353603078806E-04 2.8195154713125308E-04 2.8123092892725054E-04 2.8051167940793361E-04 + 2.7979379656520846E-04 2.7907727839373084E-04 2.7836212289090268E-04 2.7764832805686826E-04 2.7693589189451009E-04 + 2.7622481240944645E-04 2.7551508761002676E-04 2.7480671550732846E-04 2.7409969411515341E-04 2.7339402145002404E-04 + 2.7268969553118002E-04 2.7198671438057444E-04 2.7128507602287063E-04 2.7058477848543821E-04 2.6988581979834941E-04 + 2.6918819799437628E-04 2.6849191110898610E-04 2.6779695718033862E-04 2.6710333424928177E-04 2.6641104035934920E-04 + 2.6572007355675546E-04 2.6503043189039349E-04 2.6434211341183042E-04 2.6365511617530447E-04 2.6296943823772128E-04 + 2.6228507765865009E-04 2.6160203250032073E-04 2.6092030082761991E-04 2.6023988070808740E-04 2.5956077021191317E-04 + 2.5888296741193305E-04 2.5820647038362612E-04 2.5753127720511062E-04 2.5685738595714063E-04 2.5618479472310271E-04 + 2.5551350158901193E-04 2.5484350464350942E-04 2.5417480197785768E-04 2.5350739168593801E-04 2.5284127186424652E-04 + 2.5217644061189095E-04 2.5151289603058731E-04 2.5085063622465597E-04 2.5018965930101884E-04 2.4952996336919525E-04 + 2.4887154654129899E-04 2.4821440693203491E-04 2.4755854265869526E-04 2.4690395184115611E-04 2.4625063260187447E-04 + 2.4559858306588434E-04 2.4494780136079372E-04 2.4429828561678066E-04 2.4365003396659081E-04 2.4300304454553270E-04 + 2.4235731549147551E-04 2.4171284494484507E-04 2.4106963104862073E-04 2.4042767194833184E-04 2.3978696579205421E-04 + 2.3914751073040723E-04 2.3850930491655021E-04 2.3787234650617862E-04 2.3723663365752165E-04 2.3660216453133784E-04 + 2.3596893729091275E-04 2.3533695010205440E-04 2.3470620113309108E-04 2.3407668855486742E-04 2.3344841054074122E-04 + 2.3282136526657981E-04 2.3219555091075729E-04 2.3157096565415051E-04 2.3094760768013653E-04 2.3032547517458859E-04 + 2.2970456632587330E-04 2.2908487932484702E-04 2.2846641236485272E-04 2.2784916364171663E-04 2.2723313135374488E-04 + 2.2661831370172049E-04 2.2600470888889949E-04 2.2539231512100848E-04 2.2478113060624049E-04 2.2417115355525237E-04 + 2.2356238218116124E-04 2.2295481469954094E-04 2.2234844932841929E-04 2.2174328428827477E-04 2.2113931780203263E-04 + 2.2053654809506268E-04 2.1993497339517495E-04 2.1933459193261719E-04 2.1873540194007152E-04 2.1813740165265087E-04 + 2.1754058930789608E-04 2.1694496314577253E-04 2.1635052140866703E-04 2.1575726234138425E-04 2.1516518419114413E-04 + 2.1457428520757797E-04 2.1398456364272574E-04 2.1339601775103274E-04 2.1280864578934630E-04 2.1222244601691259E-04 + 2.1163741669537350E-04 2.1105355608876347E-04 2.1047086246350628E-04 2.0988933408841185E-04 2.0930896923467313E-04 + 2.0872976617586272E-04 2.0815172318793020E-04 2.0757483854919813E-04 2.0699911054035974E-04 2.0642453744447548E-04 + 2.0585111754696950E-04 2.0527884913562716E-04 2.0470773050059119E-04 2.0413775993435924E-04 2.0356893573178020E-04 + 2.0300125619005131E-04 2.0243471960871502E-04 2.0186932428965579E-04 2.0130506853709712E-04 2.0074195065759840E-04 + 2.0017996896005150E-04 1.9961912175567800E-04 1.9905940735802602E-04 1.9850082408296712E-04 1.9794337024869318E-04 + 1.9738704417571296E-04 1.9683184418684986E-04 1.9627776860723801E-04 1.9572481576431952E-04 1.9517298398784142E-04 + 1.9462227160985265E-04 1.9407267696470060E-04 1.9352419838902853E-04 1.9297683422177242E-04 1.9243058280415763E-04 + 1.9188544247969601E-04 1.9134141159418306E-04 1.9079848849569431E-04 1.9025667153458296E-04 1.8971595906347655E-04 + 1.8917634943727365E-04 1.8863784101314125E-04 1.8810043215051157E-04 1.8756412121107908E-04 1.8702890655879724E-04 + 1.8649478655987587E-04 1.8596175958277773E-04 1.8542982399821607E-04 1.8489897817915100E-04 1.8436922050078677E-04 + 1.8384054934056886E-04 1.8331296307818093E-04 1.8278646009554185E-04 1.8226103877680240E-04 1.8173669750834288E-04 + 1.8121343467876949E-04 1.8069124867891196E-04 1.8017013790182015E-04 1.7965010074276117E-04 1.7913113559921650E-04 + 1.7861324087087912E-04 1.7809641495965039E-04 1.7758065626963696E-04 1.7706596320714820E-04 1.7655233418069303E-04 + 1.7603976760097691E-04 1.7552826188089906E-04 1.7501781543554954E-04 1.7450842668220620E-04 1.7400009404033170E-04 + 1.7349281593157081E-04 1.7298659077974731E-04 1.7248141701086122E-04 1.7197729305308559E-04 1.7147421733676419E-04 + 1.7097218829440787E-04 1.7047120436069213E-04 1.6997126397245402E-04 1.6947236556868962E-04 1.6897450759055058E-04 + 1.6847768848134154E-04 1.6798190668651744E-04 1.6748716065368016E-04 1.6699344883257613E-04 1.6650076967509296E-04 + 1.6600912163525732E-04 1.6551850316923116E-04 1.6502891273530949E-04 1.6454034879391741E-04 1.6405280980760702E-04 + 1.6356629424105483E-04 1.6308080056105879E-04 1.6259632723653554E-04 1.6211287273851745E-04 1.6163043554014980E-04 + 1.6114901411668812E-04 1.6066860694549502E-04 1.6018921250603784E-04 1.5971082927988535E-04 1.5923345575070529E-04 + 1.5875709040426148E-04 1.5828173172841072E-04 1.5780737821310048E-04 1.5733402835036551E-04 1.5686168063432578E-04 + 1.5639033356118278E-04 1.5591998562921778E-04 1.5545063533878797E-04 1.5498228119232446E-04 1.5451492169432914E-04 + 1.5404855535137201E-04 1.5358318067208837E-04 1.5311879616717615E-04 1.5265540034939287E-04 1.5219299173355319E-04 + 1.5173156883652601E-04 1.5127113017723165E-04 1.5081167427663931E-04 1.5035319965776405E-04 1.4989570484566422E-04 + 1.4943918836743874E-04 1.4898364875222422E-04 1.4852908453119227E-04 1.4807549423754697E-04 1.4762287640652163E-04 + 1.4717122957537694E-04 1.4672055228339716E-04 1.4627084307188820E-04 1.4582210048417481E-04 1.4537432306559748E-04 + 1.4492750936351005E-04 1.4448165792727702E-04 1.4403676730827055E-04 1.4359283605986829E-04 1.4314986273745000E-04 + 1.4270784589839552E-04 1.4226678410208176E-04 1.4182667590987983E-04 1.4138751988515276E-04 1.4094931459325265E-04 + 1.4051205860151798E-04 1.4007575047927085E-04 1.3964038879781443E-04 1.3920597213043051E-04 1.3877249905237633E-04 + 1.3833996814088223E-04 1.3790837797514918E-04 1.3747772713634582E-04 1.3704801420760576E-04 1.3661923777402536E-04 + 1.3619139642266067E-04 1.3576448874252499E-04 1.3533851332458624E-04 1.3491346876176417E-04 1.3448935364892791E-04 + 1.3406616658289343E-04 1.3364390616242067E-04 1.3322257098821096E-04 1.3280215966290465E-04 1.3238267079107824E-04 + 1.3196410297924193E-04 1.3154645483583687E-04 1.3112972497123282E-04 1.3071391199772519E-04 1.3029901452953280E-04 + 1.2988503118279516E-04 1.2947196057556967E-04 1.2905980132782945E-04 1.2864855206146038E-04 1.2823821140025884E-04 + 1.2782877796992887E-04 1.2742025039807976E-04 1.2701262731422335E-04 1.2660590734977180E-04 1.2620008913803466E-04 + 1.2579517131421631E-04 1.2539115251541377E-04 1.2498803138061377E-04 1.2458580655069044E-04 1.2418447666840270E-04 + 1.2378404037839165E-04 1.2338449632717812E-04 1.2298584316316021E-04 1.2258807953661051E-04 1.2219120409967378E-04 + 1.2179521550636442E-04 1.2140011241256387E-04 1.2100589347601816E-04 1.2061255735633532E-04 1.2022010271498306E-04 + 1.1982852821528581E-04 1.1943783252242290E-04 1.1904801430342544E-04 1.1865907222717418E-04 1.1827100496439694E-04 + 1.1788381118766593E-04 1.1749748957139558E-04 1.1711203879183980E-04 1.1672745752708974E-04 1.1634374445707102E-04 + 1.1596089826354146E-04 1.1557891763008860E-04 1.1519780124212709E-04 1.1481754778689646E-04 1.1443815595345838E-04 + 1.1405962443269444E-04 1.1368195191730367E-04 1.1330513710179984E-04 1.1292917868250926E-04 1.1255407535756835E-04 + 1.1217982582692098E-04 1.1180642879231626E-04 1.1143388295730604E-04 1.1106218702724229E-04 1.1069133970927499E-04 + 1.1032133971234948E-04 1.0995218574720406E-04 1.0958387652636763E-04 1.0921641076415727E-04 1.0884978717667584E-04 + 1.0848400448180937E-04 1.0811906139922509E-04 1.0775495665036850E-04 1.0739168895846136E-04 1.0702925704849914E-04 + 1.0666765964724857E-04 1.0630689548324544E-04 1.0594696328679188E-04 1.0558786178995449E-04 1.0522958972656133E-04 + 1.0487214583220010E-04 1.0451552884421539E-04 1.0415973750170656E-04 1.0380477054552506E-04 1.0345062671827243E-04 + 1.0309730476429775E-04 1.0274480342969512E-04 1.0239312146230169E-04 1.0204225761169494E-04 1.0169221062919054E-04 + 1.0134297926783991E-04 1.0099456228242790E-04 1.0064695842947044E-04 1.0030016646721225E-04 9.9954185155624379E-05 + 9.9609013256402081E-05 9.9264649532962237E-05 9.8921092750441168E-05 9.8578341675692368E-05 9.8236395077284025E-05 + 9.7895251725496822E-05 9.7554910392321610E-05 9.7215369851456966E-05 9.6876628878307081E-05 9.6538686249979317E-05 + 9.6201540745281962E-05 9.5865191144721963E-05 9.5529636230502459E-05 9.5194874786520657E-05 9.4860905598365553E-05 + 9.4527727453315574E-05 9.4195339140336191E-05 9.3863739450077862E-05 9.3532927174873578E-05 9.3202901108736666E-05 + 9.2873660047358475E-05 9.2545202788106215E-05 9.2217528130020485E-05 9.1890634873813111E-05 9.1564521821865062E-05 + 9.1239187778223836E-05 9.0914631548601519E-05 9.0590851940372359E-05 9.0267847762570574E-05 8.9945617825888126E-05 + 8.9624160942672432E-05 8.9303475926924127E-05 8.8983561594294816E-05 8.8664416762084956E-05 8.8346040249241397E-05 + 8.8028430876355420E-05 8.7711587465660239E-05 8.7395508841029085E-05 8.7080193827972674E-05 8.6765641253637199E-05 + 8.6451849946802029E-05 8.6138818737877524E-05 8.5826546458902788E-05 8.5515031943543524E-05 8.5204274027089844E-05 + 8.4894271546453933E-05 8.4585023340168005E-05 8.4276528248382053E-05 8.3968785112861625E-05 8.3661792776985644E-05 + 8.3355550085744348E-05 8.3050055885736847E-05 8.2745309025169218E-05 8.2441308353852183E-05 8.2138052723198927E-05 + 8.1835540986222933E-05 8.1533771997535892E-05 8.1232744613345508E-05 8.0932457691453290E-05 8.0632910091252302E-05 + 8.0334100673725304E-05 8.0036028301442262E-05 7.9738691838558462E-05 7.9442090150812125E-05 7.9146222105522455E-05 + 7.8851086571587445E-05 7.8556682419481626E-05 7.8263008521254062E-05 7.7970063750526248E-05 7.7677846982489714E-05 + 7.7386357093904326E-05 7.7095592963095664E-05 7.6805553469953361E-05 7.6516237495928642E-05 7.6227643924032382E-05 + 7.5939771638832955E-05 7.5652619526454077E-05 7.5366186474572772E-05 7.5080471372417179E-05 7.4795473110764559E-05 + 7.4511190581939070E-05 7.4227622679809793E-05 7.3944768299788450E-05 7.3662626338827510E-05 7.3381195695418103E-05 + 7.3100475269587711E-05 7.2820463962898276E-05 7.2541160678444097E-05 7.2262564320849646E-05 7.1984673796267622E-05 + 7.1707488012376870E-05 7.1431005878380086E-05 7.1155226305002101E-05 7.0880148204487540E-05 7.0605770490598941E-05 + 7.0332092078614471E-05 7.0059111885326160E-05 6.9786828829037587E-05 6.9515241829561978E-05 6.9244349808220154E-05 + 6.8974151687838336E-05 6.8704646392746320E-05 6.8435832848775288E-05 6.8167709983255753E-05 6.7900276725015702E-05 + 6.7633532004378276E-05 6.7367474753160118E-05 6.7102103904668895E-05 6.6837418393701626E-05 6.6573417156542573E-05 + 6.6310099130961151E-05 6.6047463256209922E-05 6.5785508473022687E-05 6.5524233723612260E-05 6.5263637951668775E-05 + 6.5003720102357329E-05 6.4744479122316300E-05 6.4485913959655086E-05 6.4228023563952272E-05 6.3970806886253490E-05 + 6.3714262879069688E-05 6.3458390496374793E-05 6.3203188693604020E-05 6.2948656427651664E-05 6.2694792656869253E-05 + 6.2441596341063574E-05 6.2189066441494596E-05 6.1937201920873617E-05 6.1686001743361103E-05 6.1435464874565001E-05 + 6.1185590281538524E-05 6.0936376932778251E-05 6.0687823798222282E-05 6.0439929849248111E-05 6.0192694058670768E-05 + 5.9946115400740835E-05 5.9700192851142547E-05 5.9454925386991763E-05 5.9210311986834042E-05 5.8966351630642753E-05 + 5.8723043299817054E-05 5.8480385977180050E-05 5.8238378646976756E-05 5.7997020294872188E-05 5.7756309907949503E-05 + 5.7516246474708030E-05 5.7276828985061306E-05 5.7038056430335148E-05 5.6799927803265852E-05 5.6562442097998114E-05 + 5.6325598310083220E-05 5.6089395436477160E-05 5.5853832475538545E-05 5.5618908427026902E-05 5.5384622292100652E-05 + 5.5150973073315276E-05 5.4917959774621306E-05 5.4685581401362562E-05 5.4453836960274173E-05 5.4222725459480646E-05 + 5.3992245908494170E-05 5.3762397318212461E-05 5.3533178700917091E-05 5.3304589070271433E-05 5.3076627441318958E-05 + 5.2849292830481273E-05 5.2622584255556172E-05 5.2396500735715856E-05 5.2171041291505099E-05 5.1946204944839223E-05 + 5.1721990719002457E-05 5.1498397638645840E-05 5.1275424729785508E-05 5.1053071019800813E-05 5.0831335537432442E-05 + 5.0610217312780568E-05 5.0389715377303004E-05 5.0169828763813402E-05 4.9950556506479294E-05 4.9731897640820366E-05 + 4.9513851203706565E-05 4.9296416233356237E-05 4.9079591769334370E-05 4.8863376852550653E-05 4.8647770525257751E-05 + 4.8432771831049411E-05 4.8218379814858653E-05 4.8004593522955945E-05 4.7791412002947401E-05 4.7578834303772895E-05 + 4.7366859475704386E-05 4.7155486570343910E-05 4.6944714640621985E-05 4.6734542740795567E-05 4.6524969926446455E-05 + 4.6315995254479382E-05 4.6107617783120183E-05 4.5899836571914128E-05 4.5692650681723931E-05 4.5486059174728165E-05 + 4.5280061114419312E-05 4.5074655565602030E-05 4.4869841594391372E-05 4.4665618268211022E-05 4.4461984655791432E-05 + 4.4258939827168145E-05 4.4056482853679931E-05 4.3854612807967034E-05 4.3653328763969502E-05 4.3452629796925186E-05 + 4.3252514983368258E-05 4.3052983401127180E-05 4.2854034129323099E-05 4.2655666248368071E-05 4.2457878839963290E-05 + 4.2260670987097229E-05 4.2064041774044052E-05 4.1867990286361767E-05 4.1672515610890481E-05 4.1477616835750673E-05 + 4.1283293050341444E-05 4.1089543345338773E-05 4.0896366812693795E-05 4.0703762545630989E-05 4.0511729638646552E-05 + 4.0320267187506569E-05 4.0129374289245351E-05 3.9939050042163682E-05 3.9749293545827052E-05 3.9560103901064023E-05 + 3.9371480209964437E-05 3.9183421575877656E-05 3.8995927103410998E-05 3.8808995898427878E-05 3.8622627068046113E-05 + 3.8436819720636322E-05 3.8251572965820070E-05 3.8066885914468248E-05 3.7882757678699377E-05 3.7699187371877853E-05 + 3.7516174108612318E-05 3.7333717004753852E-05 3.7151815177394429E-05 3.6970467744865098E-05 3.6789673826734349E-05 + 3.6609432543806417E-05 3.6429743018119612E-05 3.6250604372944594E-05 3.6072015732782721E-05 3.5893976223364404E-05 + 3.5716484971647376E-05 3.5539541105815001E-05 3.5363143755274693E-05 3.5187292050656140E-05 3.5011985123809737E-05 + 3.4837222107804844E-05 3.4663002136928143E-05 3.4489324346681987E-05 3.4316187873782776E-05 3.4143591856159224E-05 + 3.3971535432950748E-05 3.3800017744505845E-05 3.3629037932380360E-05 3.3458595139335935E-05 3.3288688509338305E-05 + 3.3119317187555659E-05 3.2950480320356989E-05 3.2782177055310530E-05 3.2614406541182022E-05 3.2447167927933104E-05 + 3.2280460366719737E-05 3.2114283009890497E-05 3.1948635010985004E-05 3.1783515524732282E-05 3.1618923707049117E-05 + 3.1454858715038435E-05 3.1291319706987706E-05 3.1128305842367332E-05 3.0965816281829035E-05 3.0803850187204169E-05 + 3.0642406721502217E-05 3.0481485048909117E-05 3.0321084334785669E-05 3.0161203745665940E-05 3.0001842449255683E-05 + 2.9842999614430655E-05 2.9684674411235142E-05 2.9526866010880244E-05 2.9369573585742379E-05 2.9212796309361611E-05 + 2.9056533356440140E-05 2.8900783902840648E-05 2.8745547125584747E-05 2.8590822202851378E-05 2.8436608313975293E-05 + 2.8282904639445363E-05 2.8129710360903121E-05 2.7977024661141086E-05 2.7824846724101281E-05 2.7673175734873591E-05 + 2.7522010879694245E-05 2.7371351345944234E-05 2.7221196322147709E-05 2.7071544997970485E-05 2.6922396564218472E-05 + 2.6773750212836047E-05 2.6625605136904588E-05 2.6477960530640873E-05 2.6330815589395533E-05 2.6184169509651509E-05 + 2.6038021489022510E-05 2.5892370726251478E-05 2.5747216421209000E-05 2.5602557774891832E-05 2.5458393989421297E-05 + 2.5314724268041810E-05 2.5171547815119287E-05 2.5028863836139659E-05 2.4886671537707290E-05 2.4744970127543527E-05 + 2.4603758814485091E-05 2.4463036808482602E-05 2.4322803320599052E-05 2.4183057563008259E-05 2.4043798748993389E-05 + 2.3905026092945410E-05 2.3766738810361568E-05 2.3628936117843932E-05 2.3491617233097830E-05 2.3354781374930335E-05 + 2.3218427763248831E-05 2.3082555619059408E-05 2.2947164164465464E-05 2.2812252622666107E-05 2.2677820217954740E-05 + 2.2543866175717520E-05 2.2410389722431888E-05 2.2277390085665023E-05 2.2144866494072454E-05 2.2012818177396451E-05 + 2.1881244366464651E-05 2.1750144293188502E-05 2.1619517190561808E-05 2.1489362292659252E-05 2.1359678834634900E-05 + 2.1230466052720736E-05 2.1101723184225212E-05 2.0973449467531743E-05 2.0845644142097234E-05 2.0718306448450655E-05 + 2.0591435628191526E-05 2.0465030923988479E-05 2.0339091579577803E-05 2.0213616839761965E-05 2.0088605950408175E-05 + 1.9964058158446890E-05 1.9839972711870416E-05 1.9716348859731392E-05 1.9593185852141423E-05 1.9470482940269540E-05 + 1.9348239376340813E-05 1.9226454413634906E-05 1.9105127306484599E-05 1.8984257310274385E-05 1.8863843681439010E-05 + 1.8743885677462041E-05 1.8624382556874437E-05 1.8505333579253121E-05 1.8386738005219524E-05 1.8268595096438197E-05 + 1.8150904115615352E-05 1.8033664326497430E-05 1.7916874993869724E-05 1.7800535383554908E-05 1.7684644762411656E-05 + 1.7569202398333198E-05 1.7454207560245923E-05 1.7339659518107950E-05 1.7225557542907732E-05 1.7111900906662638E-05 + 1.6998688882417539E-05 1.6885920744243431E-05 1.6773595767235990E-05 1.6661713227514194E-05 1.6550272402218938E-05 + 1.6439272569511601E-05 1.6328713008572665E-05 1.6218592999600344E-05 1.6108911823809151E-05 1.5999668763428530E-05 + 1.5890863101701470E-05 1.5782494122883112E-05 1.5674561112239357E-05 1.5567063356045499E-05 1.5460000141584841E-05 + 1.5353370757147297E-05 1.5247174492028038E-05 1.5141410636526094E-05 1.5036078481943019E-05 1.4931177320581461E-05 + 1.4826706445743849E-05 1.4722665151730985E-05 1.4619052733840706E-05 1.4515868488366497E-05 1.4413111712596133E-05 + 1.4310781704810335E-05 1.4208877764281399E-05 1.4107399191271826E-05 1.4006345287032994E-05 1.3905715353803781E-05 + 1.3805508694809235E-05 1.3705724614259188E-05 1.3606362417346964E-05 1.3507421410247985E-05 1.3408900900118431E-05 + 1.3310800195093936E-05 1.3213118604288194E-05 1.3115855437791674E-05 1.3019010006670228E-05 1.2922581622963808E-05 + 1.2826569599685090E-05 1.2730973250818175E-05 1.2635791891317238E-05 1.2541024837105206E-05 1.2446671405072436E-05 + 1.2352730913075381E-05 1.2259202679935281E-05 1.2166086025436837E-05 1.2073380270326878E-05 1.1981084736313069E-05 + 1.1889198746062567E-05 1.1797721623200747E-05 1.1706652692309833E-05 1.1615991278927645E-05 1.1525736709546255E-05 + 1.1435888311610696E-05 1.1346445413517646E-05 1.1257407344614144E-05 1.1168773435196257E-05 1.1080543016507819E-05 + 1.0992715420739105E-05 1.0905289981025542E-05 1.0818266031446418E-05 1.0731642907023585E-05 1.0645419943720174E-05 + 1.0559596478439308E-05 1.0474171849022802E-05 1.0389145394249893E-05 1.0304516453835933E-05 1.0220284368431142E-05 + 1.0136448479619291E-05 1.0053008129916459E-05 9.9699626627697155E-06 9.8873114225558920E-06 9.8050537545802549E-06 + 9.7231890050752895E-06 9.6417165211993895E-06 9.5606356510356053E-06 9.4799457435903787E-06 9.3996461487922603E-06 + 9.3197362174906814E-06 9.2402153014546631E-06 9.1610827533715542E-06 9.0823379268457946E-06 9.0039801763976546E-06 + 8.9260088574619548E-06 8.8484233263868594E-06 8.7712229404325702E-06 8.6944070577701222E-06 8.6179750374801214E-06 + 8.5419262395514815E-06 8.4662600248802082E-06 8.3909757552681368E-06 8.3160727934216943E-06 8.2415505029506668E-06 + 8.1674082483669544E-06 8.0936453950833458E-06 8.0202613094122656E-06 7.9472553585645603E-06 7.8746269106482593E-06 + 7.8023753346673422E-06 7.7305000005205186E-06 7.6590002789999972E-06 7.5878755417902579E-06 7.5171251614668436E-06 + 7.4467485114951294E-06 7.3767449662290893E-06 7.3071139009101097E-06 7.2378546916657466E-06 7.1689667155085238E-06 + 7.1004493503347198E-06 7.0323019749231475E-06 6.9645239689339577E-06 6.8971147129074251E-06 6.8300735882627415E-06 + 6.7633999772968060E-06 6.6970932631830392E-06 6.6311528299701611E-06 6.5655780625810042E-06 6.5003683468113167E-06 + 6.4355230693285558E-06 6.3710416176706986E-06 6.3069233802450562E-06 6.2431677463270728E-06 6.1797741060591343E-06 + 6.1167418504493876E-06 6.0540703713705494E-06 5.9917590615587228E-06 5.9298073146122096E-06 5.8682145249903405E-06 + 5.8069800880122788E-06 5.7461033998558498E-06 5.6855838575563673E-06 5.6254208590054506E-06 5.5656138029498572E-06 + 5.5061620889903048E-06 5.4470651175803043E-06 5.3883222900249899E-06 5.3299330084799558E-06 5.2718966759500756E-06 + 5.2142126962883583E-06 5.1568804741947725E-06 5.0998994152150864E-06 5.0432689257397108E-06 4.9869884130025454E-06 + 4.9310572850798100E-06 4.8754749508889019E-06 4.8202408201872344E-06 4.7653543035710960E-06 4.7108148124744839E-06 + 4.6566217591679669E-06 4.6027745567575378E-06 4.5492726191834645E-06 4.4961153612191454E-06 4.4433021984699746E-06 + 4.3908325473721896E-06 4.3387058251917402E-06 4.2869214500231478E-06 4.2354788407883698E-06 4.1843774172356673E-06 + 4.1336165999384662E-06 4.0831958102942330E-06 4.0331144705233374E-06 3.9833720036679296E-06 3.9339678335908110E-06 + 3.8849013849743071E-06 3.8361720833191479E-06 3.7877793549433417E-06 3.7397226269810557E-06 3.6920013273814954E-06 + 3.6446148849077927E-06 3.5975627291358792E-06 3.5508442904533802E-06 3.5044590000585003E-06 3.4584062899589036E-06 + 3.4126855929706174E-06 3.3672963427169101E-06 3.3222379736271925E-06 3.2775099209359074E-06 3.2331116206814315E-06 + 3.1890425097049642E-06 3.1453020256494323E-06 3.1018896069583878E-06 3.0588046928749130E-06 3.0160467234405217E-06 + 2.9736151394940601E-06 2.9315093826706199E-06 2.8897288954004424E-06 2.8482731209078273E-06 2.8071415032100473E-06 + 2.7663334871162533E-06 2.7258485182263948E-06 2.6856860429301328E-06 2.6458455084057534E-06 2.6063263626190939E-06 + 2.5671280543224526E-06 2.5282500330535150E-06 2.4896917491342790E-06 2.4514526536699715E-06 2.4135321985479816E-06 + 2.3759298364367804E-06 2.3386450207848575E-06 2.3016772058196430E-06 2.2650258465464424E-06 2.2286903987473707E-06 + 2.1926703189802834E-06 2.1569650645777139E-06 2.1215740936458115E-06 2.0864968650632787E-06 2.0517328384803105E-06 + 2.0172814743175379E-06 1.9831422337649681E-06 1.9493145787809312E-06 1.9157979720910258E-06 1.8825918771870643E-06 + 1.8496957583260240E-06 1.8171090805289939E-06 1.7848313095801299E-06 1.7528619120256051E-06 1.7212003551725652E-06 + 1.6898461070880848E-06 1.6587986365981215E-06 1.6280574132864800E-06 1.5976219074937663E-06 1.5674915903163533E-06 + 1.5376659336053424E-06 1.5081444099655249E-06 1.4789264927543539E-06 1.4500116560809044E-06 1.4213993748048479E-06 + 1.3930891245354178E-06 1.3650803816303828E-06 1.3373726231950196E-06 1.3099653270810859E-06 1.2828579718857969E-06 + 1.2560500369508021E-06 1.2295410023611631E-06 1.2033303489443335E-06 1.1774175582691402E-06 1.1518021126447648E-06 + 1.1264834951197301E-06 1.1014611894808815E-06 1.0767346802523767E-06 1.0523034526946711E-06 1.0281669928035114E-06 + 1.0043247873089202E-06 9.8077632367419437E-07 9.5752109009489373E-07 9.3455857549783852E-07 9.1188826954010496E-07 + 8.8950966260802219E-07 8.6742224581617264E-07 8.4562551100639087E-07 8.2411895074676637E-07 8.0290205833064579E-07 + 7.8197432777563763E-07 7.6133525382261881E-07 7.4098433193473992E-07 7.2092105829643570E-07 7.0114492981243364E-07 + 6.8165544410676514E-07 6.6245209952177917E-07 6.4353439511715429E-07 6.2490183066891591E-07 6.0655390666845090E-07 + 5.8849012432152695E-07 5.7070998554731087E-07 5.5321299297739001E-07 5.3599864995479312E-07 5.1906646053301435E-07 + 5.0241592947503738E-07 4.8604656225236204E-07 4.6995786504403030E-07 4.5414934473565598E-07 4.3862050891845390E-07 + 4.2337086588827141E-07 4.0839992464462100E-07 3.9370719488971370E-07 3.7929218702749447E-07 3.6515441216267863E-07 + 3.5129338209979023E-07 3.3770860934219962E-07 3.2439960709116581E-07 3.1136588924487636E-07 2.9860697039749162E-07 + 2.8612236583818868E-07 2.7391159155020703E-07 2.6197416420989495E-07 2.5030960118575872E-07 2.3891742053751147E-07 + 2.2779714101512393E-07 2.1694828205787713E-07 2.0637036379341505E-07 1.9606290703679999E-07 1.8602543328956817E-07 + 1.7625746473878712E-07 1.6675852425611413E-07 1.5752813539685634E-07 1.4856582239903153E-07 1.3987111018243088E-07 + 1.3144352434768237E-07 1.2328259117531584E-07 1.1538783762482934E-07 1.0775879133375637E-07 1.0039498061673495E-07 + 9.3295934464577550E-08 8.6461182543342368E-08 7.9890255193405966E-08 7.3582683428537148E-08 6.7537998934972012E-08 + 6.1755734070490388E-08 5.6235421863493463E-08 5.0976596012082631E-08 4.5978790883139762E-08 4.1241541511408426E-08 + 3.6764383598576760E-08 3.2546853512361213E-08 2.8588488285591833E-08 2.4888825615298599E-08 2.1447403861799117E-08 + 1.8263762047787515E-08 1.5337439857424584E-08 1.2667977635429169E-08 1.0254916386170817E-08 8.0977977727635969E-09 + 6.1961641161612611E-09 4.5495583942535325E-09 3.1575242409637009E-09 2.0196059453474273E-09 1.1353484506927641E-09 + 5.0429735362142380E-10 1.2599890319126388E-10 0.0000000000000000E+00 + 1.5237599966437169E+05 7.6187999832185844E+04 3.8093960645064377E+04 2.5395930128952761E+04 1.9046901780652592E+04 + 1.5237474299543315E+04 1.2697847252100339E+04 1.0883820452541042E+04 9.5232938079858977E+03 8.4651006001790029E+03 + 7.6185407981762783E+03 6.9258962004764699E+03 6.3486880060865979E+03 5.8602770450957387E+03 5.4416353390028398E+03 + 5.0788090369134243E+03 4.7613327506625592E+03 4.4812035363649611E+03 4.2321968821151286E+03 4.0093986995715723E+03 + 3.8088777180658271E+03 3.6274514803946045E+03 3.4625161579413079E+03 3.3119207618528858E+03 3.1738728014223743E+03 + 3.0468665844597272E+03 2.9296280637308278E+03 2.8210719397434591E+03 2.7202679557933902E+03 2.6264141664491731E+03 + 2.5388155523400546E+03 2.4568667740171359E+03 2.3800381594655742E+03 2.3078642393418636E+03 2.2399343054045057E+03 + 2.1758845874994472E+03 2.1153917343812604E+03 2.0581673516984733E+03 2.0039534024022437E+03 1.9525183147845123E+03 + 1.9036536743103638E+03 1.8571713995725509E+03 1.8129013216810611E+03 1.7706891014122457E+03 1.7303944303831204E+03 + 1.6918894720690685E+03 1.6550575061670552E+03 1.6197917460188564E+03 1.5859943038564077E+03 1.5535752827517697E+03 + 1.5224519775331298E+03 1.4925481697106650E+03 1.4637935037571237E+03 1.4361229339981392E+03 1.4094762329591995E+03 + 1.3837975533474644E+03 1.3590350369641233E+03 1.3351404647838665E+03 1.3120689432330269E+03 1.2897786223716487E+03 + 1.2682304422573409E+03 1.2473879042569524E+03 1.2272168644893843E+03 1.2076853469404875E+03 1.1887633740984720E+03 + 1.1704228132229566E+03 1.1526372365895411E+03 1.1353817942498360E+03 1.1186330980184916E+03 1.1023691155483586E+03 + 1.0865690734848984E+03 1.0712133688047218E+03 1.0562834875426063E+03 1.0417619301984612E+03 1.0276321431923905E+03 + 1.0138784558033458E+03 1.0004860220862990E+03 9.8744076731537382E+02 9.7472933854670316E+02 9.6233905893604117E+02 + 9.5025788548251910E+02 9.3847436990251992E+02 9.2697762236643234E+02 9.1575727785683466E+02 9.0480346492968738E+02 + 8.9410677668058952E+02 8.8365824373666715E+02 8.7344930911108929E+02 8.6347180477202824E+02 8.5371792979126860E+02 + 8.4418022994954788E+02 8.3485157868663055E+02 8.2572515929373799E+02 8.1679444825487280E+02 8.0805319965145759E+02 + 7.9949543055194601E+02 7.9111540731457933E+02 7.8290763273739867E+02 7.7486683399498565E+02 7.6698795130631765E+02 + 7.5926612728254815E+02 7.5169669690758860E+02 7.4427517810807251E+02 7.3699726287264184E+02 7.2985880888358110E+02 + 7.2285583162663625E+02 7.1598449694747057E+02 7.0924111402548249E+02 7.0262212873799831E+02 6.9612411738971468E+02 + 6.8974378078418499E+02 6.8347793861576758E+02 6.7732352416199467E+02 6.7127757925776564E+02 6.6533724953406670E+02 + 6.5949977990509171E+02 6.5376251028879085E+02 6.4812287154689011E+02 6.4257838163133204E+02 6.3712664192502825E+02 + 6.3176533376556392E+02 6.2649221514129181E+02 6.2130511754990141E+02 6.1620194301023582E+02 6.1118066121869970E+02 + 6.0623930684215009E+02 6.0137597693971406E+02 5.9658882850638713E+02 5.9187607613179580E+02 5.8723598976784945E+02 + 5.8266689259941325E+02 5.7816715901252485E+02 5.7373521265494639E+02 5.6936952458423025E+02 5.6506861149868610E+02 + 5.6083103404699023E+02 5.5665539521236076E+02 5.5254033876749770E+02 5.4848454779670863E+02 5.4448674328181585E+02 + 5.4054568274867972E+02 5.3666015897130580E+02 5.3282899873071347E+02 5.2905106162588220E+02 5.2532523893423445E+02 + 5.2165045251927882E+02 5.1802565378314057E+02 5.1444982266184343E+02 5.1092196666132878E+02 5.0744111993229410E+02 + 5.0400634238202531E+02 5.0061671882153945E+02 4.9727135814637296E+02 4.9396939254951138E+02 4.9070997676497933E+02 + 4.8749228734070766E+02 4.8431552193936773E+02 4.8117889866593288E+02 4.7808165542076119E+02 4.7502304927710890E+02 + 4.7200235588197046E+02 4.6901886887925565E+02 4.6607189935432956E+02 4.6316077529899832E+02 4.6028484109606688E+02 + 4.5744345702264536E+02 4.5463599877140098E+02 4.5186185698901636E+02 4.4912043683112807E+02 4.4641115753306764E+02 + 4.4373345199575635E+02 4.4108676638611934E+02 4.3847055975144906E+02 4.3588430364714480E+02 4.3332748177727302E+02 + 4.3079958964747630E+02 4.2830013422968722E+02 4.2582863363823350E+02 4.2338461681683833E+02 4.2096762323613279E+02 + 4.1857720260123682E+02 4.1621291456903498E+02 4.1387432847478328E+02 4.1156102306766809E+02 4.0927258625499309E+02 + 4.0700861485466288E+02 4.0476871435565010E+02 4.0255249868614931E+02 4.0035958998912719E+02 3.9818961840500350E+02 + 3.9604222186118778E+02 3.9391704586823630E+02 3.9181374332236794E+02 3.8973197431412910E+02 3.8767140594297445E+02 + 3.8563171213754566E+02 3.8361257348146137E+02 3.8161367704440835E+02 3.7963471621835163E+02 3.7767539055867985E+02 + 3.7573540563012585E+02 3.7381447285727205E+02 3.7191230937951275E+02 3.7002863791028943E+02 3.6816318660047352E+02 + 3.6631568890574556E+02 3.6448588345783747E+02 3.6267351393950764E+02 3.6087832896312074E+02 3.5910008195271558E+02 + 3.5733853102943880E+02 3.5559343890024161E+02 3.5386457274972219E+02 3.5215170413501551E+02 3.5045460888363544E+02 + 3.4877306699415681E+02 3.4710686253966611E+02 3.4545578357388194E+02 3.4381962203984779E+02 3.4219817368114320E+02 + 3.4059123795550016E+02 3.3899861795077771E+02 3.3742012030320029E+02 3.3585555511779518E+02 3.3430473589096795E+02 + 3.3276747943513556E+02 3.3124360580536450E+02 3.2973293822794329E+02 3.2823530303084260E+02 3.2675052957598984E+02 + 3.2527845019331357E+02 3.2381890011650069E+02 3.2237171742041761E+02 3.2093674296013660E+02 3.1951382031153162E+02 + 3.1810279571338810E+02 3.1670351801098735E+02 3.1531583860111317E+02 3.1393961137844963E+02 3.1257469268332727E+02 + 3.1122094125076569E+02 3.0987821816079696E+02 3.0854638679000936E+02 3.0722531276429760E+02 3.0591486391276726E+02 + 3.0461491022277113E+02 3.0332532379604390E+02 3.0204597880589961E+02 3.0077675145546510E+02 2.9951751993692210E+02 + 2.9826816439172410E+02 2.9702856687176717E+02 2.9579861130148345E+02 2.9457818344083529E+02 2.9336717084918064E+02 + 2.9216546284999271E+02 2.9097295049640246E+02 2.8978952653754874E+02 2.8861508538571030E+02 2.8744952308419522E+02 + 2.8629273727597979E+02 2.8514462717305821E+02 2.8400509352650158E+02 2.8287403859719944E+02 2.8175136612726237E+02 + 2.8063698131207229E+02 2.7953079077296951E+02 2.7843270253054726E+02 2.7734262597854269E+02 2.7626047185831897E+02 + 2.7518615223390634E+02 2.7411958046759776E+02 2.7306067119608491E+02 2.7200934030711630E+02 2.7096550491666807E+02 + 2.6992908334661269E+02 2.6889999510287186E+02 2.6787816085404324E+02 2.6686350241049206E+02 2.6585594270388407E+02 + 2.6485540576716488E+02 2.6386181671496558E+02 2.6287510172441870E+02 2.6189518801639258E+02 2.6092200383710804E+02 + 2.5995547844015658E+02 2.5899554206888291E+02 2.5804212593914599E+02 2.5709516222243320E+02 2.5615458402932427E+02 + 2.5522032539330471E+02 2.5429232125490432E+02 2.5337050744616681E+02 2.5245482067543540E+02 2.5154519851245047E+02 + 2.5064157937374821E+02 2.4974390250835737E+02 2.4885210798378361E+02 2.4796613667227555E+02 2.4708593023736918E+02 + 2.4621143112069731E+02 2.4534258252906741E+02 2.4447932842178832E+02 2.4362161349825604E+02 2.4276938318578044E+02 + 2.4192258362764997E+02 2.4108116167143606E+02 2.4024506485751795E+02 2.3941424140784000E+02 2.3858864021488012E+02 + 2.3776821083083453E+02 2.3695290345701255E+02 2.3614266893343310E+02 2.3533745872862156E+02 2.3453722492960097E+02 + 2.3374192023207493E+02 2.3295149793079671E+02 2.3216591191011872E+02 2.3138511663472397E+02 2.3060906714052828E+02 + 2.2983771902575415E+02 2.2907102844217354E+02 2.2830895208651128E+02 2.2755144719200879E+02 2.2679847152014310E+02 + 2.2604998335250377E+02 2.2530594148281023E+02 2.2456630520908624E+02 2.2383103432596650E+02 2.2310008911715479E+02 + 2.2237343034800853E+02 2.2165101925826602E+02 2.2093281755490187E+02 2.2021878740510817E+02 2.1950889142940875E+02 + 2.1880309269488987E+02 2.1810135470855653E+02 2.1740364141080443E+02 2.1670991716900767E+02 2.1602014677122335E+02 + 2.1533429542000249E+02 2.1465232872631304E+02 2.1397421270356892E+02 2.1329991376176355E+02 2.1262939870170388E+02 + 2.1196263470934670E+02 2.1129958935023515E+02 2.1064023056402488E+02 2.0998452665911029E+02 2.0933244630734370E+02 + 2.0868395853884027E+02 2.0803903273687402E+02 2.0739763863286336E+02 2.0675974630143716E+02 2.0612532615558902E+02 + 2.0549434894191037E+02 2.0486678573590510E+02 2.0424260793738191E+02 2.0362178726592589E+02 2.0300429575644361E+02 + 2.0239010575478437E+02 2.0177918991343196E+02 2.0117152118727066E+02 2.0056707282941841E+02 1.9996581838713078E+02 + 1.9936773169777067E+02 1.9877278688484662E+02 1.9818095835411171E+02 1.9759222078972954E+02 1.9700654915050276E+02 + 1.9642391866615907E+02 1.9584430483370241E+02 1.9526768341381688E+02 1.9469403042733569E+02 1.9412332215176104E+02 + 1.9355553511784024E+02 1.9299064610620115E+02 1.9242863214403539E+02 1.9186947050183821E+02 1.9131313869019593E+02 + 1.9075961445663000E+02 1.9020887578248545E+02 1.8966090087987001E+02 1.8911566818864134E+02 1.8857315637344337E+02 + 1.8803334432078347E+02 1.8749621113616070E+02 1.8696173614123441E+02 1.8642989887104164E+02 1.8590067907125032E+02 + 1.8537405669546021E+02 1.8485001190254587E+02 1.8432852505403409E+02 1.8380957671152922E+02 1.8329314763417020E+02 + 1.8277921877613340E+02 1.8226777128416830E+02 1.8175878649517017E+02 1.8125224593379423E+02 1.8074813131010069E+02 + 1.8024642451723690E+02 1.7974710762915521E+02 1.7925016289836293E+02 1.7875557275370713E+02 1.7826331979819236E+02 + 1.7777338680682973E+02 1.7728575672451916E+02 1.7680041266396066E+02 1.7631733790359945E+02 1.7583651588559761E+02 + 1.7535793021384035E+02 1.7488156465196462E+02 1.7440740312142171E+02 1.7393542969956826E+02 1.7346562861777988E+02 + 1.7299798425959736E+02 1.7253248115889812E+02 1.7206910399809013E+02 1.7160783760633879E+02 1.7114866695781393E+02 + 1.7069157716996153E+02 1.7023655350180528E+02 1.6978358135226600E+02 1.6933264625850990E+02 1.6888373389431646E+02 + 1.6843683006847175E+02 1.6799192072318365E+02 1.6754899193251904E+02 1.6710802990086336E+02 1.6666902096140126E+02 + 1.6623195157461959E+02 1.6579680832682902E+02 1.6536357792870777E+02 1.6493224721386719E+02 1.6450280313743175E+02 + 1.6407523277464594E+02 1.6364952331949277E+02 1.6322566208333873E+02 1.6280363649359003E+02 1.6238343409237379E+02 + 1.6196504253523216E+02 1.6154844958983651E+02 1.6113364313471956E+02 1.6072061115802336E+02 1.6030934175626479E+02 + 1.5989982313311765E+02 1.5949204359821076E+02 1.5908599156594349E+02 1.5868165555431526E+02 1.5827902418377218E+02 + 1.5787808617606817E+02 1.5747883035314194E+02 1.5708124563600811E+02 1.5668532104366454E+02 1.5629104569201098E+02 + 1.5589840879278560E+02 1.5550739965251410E+02 1.5511800767147051E+02 1.5473022234265611E+02 1.5434403325078671E+02 + 1.5395943007129711E+02 1.5357640256935682E+02 1.5319494059889709E+02 1.5281503410165419E+02 1.5243667310622220E+02 + 1.5205984772711852E+02 1.5168454816386188E+02 1.5131076470006246E+02 1.5093848770252276E+02 1.5056770762035015E+02 + 1.5019841498408269E+02 1.4983060040482223E+02 1.4946425457338239E+02 1.4909936825944430E+02 1.4873593231072732E+02 + 1.4837393765216331E+02 1.4801337528508819E+02 1.4765423628644018E+02 1.4729651180796864E+02 1.4694019307545196E+02 + 1.4658527138792854E+02 1.4623173811693323E+02 1.4587958470574458E+02 1.4552880266864409E+02 1.4517938359018072E+02 + 1.4483131912444631E+02 1.4448460099436119E+02 1.4413922099096581E+02 1.4379517097272364E+02 1.4345244286483106E+02 + 1.4311102865853610E+02 1.4277092041046609E+02 1.4243211024196214E+02 1.4209459033842370E+02 1.4175835294865877E+02 + 1.4142339038424493E+02 1.4108969501889436E+02 1.4075725928782938E+02 1.4042607568716545E+02 1.4009613677329961E+02 + 1.3976743516230701E+02 1.3943996352934818E+02 1.3911371460807587E+02 1.3878868119005682E+02 1.3846485612419605E+02 + 1.3814223231616745E+02 1.3782080272785510E+02 1.3750056037679693E+02 1.3718149833563726E+02 1.3686360973158546E+02 + 1.3654688774588075E+02 1.3623132561326221E+02 1.3591691662144763E+02 1.3560365411061724E+02 1.3529153147290086E+02 + 1.3498054215187531E+02 1.3467067964206518E+02 1.3436193748844906E+02 1.3405430928597463E+02 1.3374778867907389E+02 + 1.3344236936118890E+02 1.3313804507430194E+02 1.3283480960846848E+02 1.3253265680135931E+02 1.3223158053780327E+02 + 1.3193157474934191E+02 1.3163263341378075E+02 1.3133475055475373E+02 1.3103792024128725E+02 1.3074213658737111E+02 + 1.3044739375153461E+02 1.3015368593642592E+02 1.2986100738839858E+02 1.2956935239710040E+02 1.2927871529506808E+02 + 1.2898909045732563E+02 1.2870047230098959E+02 1.2841285528487455E+02 1.2812623390910673E+02 1.2784060271474067E+02 + 1.2755595628337879E+02 1.2727228923679903E+02 1.2698959623658024E+02 1.2670787198373958E+02 1.2642711121836582E+02 + 1.2614730871926440E+02 1.2586845930359949E+02 1.2559055782654539E+02 1.2531359918093899E+02 1.2503757829693498E+02 + 1.2476249014166871E+02 1.2448832971891889E+02 1.2421509206877637E+02 1.2394277226731471E+02 1.2367136542626557E+02 + 1.2340086669269708E+02 1.2313127124869739E+02 1.2286257431105746E+02 1.2259477113096190E+02 1.2232785699368023E+02 + 1.2206182721826266E+02 1.2179667715723825E+02 1.2153240219631832E+02 1.2126899775409984E+02 1.2100645928177391E+02 + 1.2074478226283914E+02 1.2048396221281229E+02 1.2022399467894986E+02 1.1996487523996579E+02 1.1970659950575487E+02 + 1.1944916311712051E+02 1.1919256174550321E+02 1.1893679109271127E+02 1.1868184689065779E+02 1.1842772490109674E+02 + 1.1817442091536367E+02 1.1792193075411862E+02 1.1767025026709202E+02 1.1741937533283287E+02 1.1716930185845952E+02 + 1.1692002577941349E+02 1.1667154305921495E+02 1.1642384968922265E+02 1.1617694168839299E+02 1.1593081510304451E+02 + 1.1568546600662494E+02 1.1544089049947738E+02 1.1519708470861187E+02 1.1495404478747957E+02 1.1471176691574682E+02 + 1.1447024729907213E+02 1.1422948216888847E+02 1.1398946778218240E+02 1.1375020042128097E+02 1.1351167639363688E+02 + 1.1327389203161727E+02 1.1303684369229467E+02 1.1280052775724003E+02 1.1256494063231717E+02 1.1233007874748030E+02 + 1.1209593855657283E+02 1.1186251653712858E+02 1.1162980919017451E+02 1.1139781304003596E+02 1.1116652463414314E+02 + 1.1093594054284152E+02 1.1070605735920016E+02 1.1047687169882569E+02 1.1024838019967748E+02 1.1002057952188197E+02 + 1.0979346634755285E+02 1.0956703738060905E+02 1.0934128934659758E+02 1.0911621899251736E+02 1.0889182308664215E+02 + 1.0866809841834973E+02 1.0844504179794946E+02 1.0822265005651219E+02 1.0800092004570254E+02 1.0777984863761181E+02 + 1.0755943272459398E+02 1.0733966921910127E+02 1.0712055505352302E+02 1.0690208718002552E+02 1.0668426257039285E+02 + 1.0646707821587040E+02 1.0625053112700830E+02 1.0603461833350889E+02 1.0581933688407183E+02 1.0560468384624500E+02 + 1.0539065630627303E+02 1.0517725136894965E+02 1.0496446615747159E+02 1.0475229781329152E+02 1.0454074349597454E+02 + 1.0432980038305554E+02 1.0411946566989778E+02 1.0390973656955165E+02 1.0370061031261794E+02 1.0349208414710799E+02 + 1.0328415533830943E+02 1.0307682116864987E+02 1.0287007893756392E+02 1.0266392596136028E+02 1.0245835957309109E+02 + 1.0225337712242151E+02 1.0204897597550075E+02 1.0184515351483550E+02 1.0164190713916233E+02 1.0143923426332287E+02 + 1.0123713231813950E+02 1.0103559875029391E+02 1.0083463102220243E+02 1.0063422661189867E+02 1.0043438301291056E+02 + 1.0023509773414482E+02 1.0003636829976806E+02 9.9838192249089971E+01 9.9640567136449562E+01 9.9443490531099712E+01 + 9.9246960017094636E+01 9.9050973193177541E+01 9.8855527672668941E+01 9.8660621083357583E+01 9.8466251067390587E+01 + 9.8272415281164996E+01 9.8079111395222256E+01 9.7886337094139591E+01 9.7694090076426491E+01 9.7502368054419591E+01 + 9.7311168754179619E+01 9.7120489915389356E+01 9.6930329291250729E+01 9.6740684648385979E+01 9.6551553766735921E+01 + 9.6362934439463260E+01 9.6174824472852379E+01 9.5987221686214426E+01 9.5800123911788887E+01 9.5613528994650096E+01 + 9.5427434792611663E+01 9.5241839176132842E+01 9.5056740028225335E+01 9.4872135244362113E+01 9.4688022732385434E+01 + 9.4504400412416672E+01 9.4321266216766062E+01 9.4138618089844698E+01 9.3956453988075495E+01 9.3774771879806806E+01 + 9.3593569745224855E+01 9.3412845576268097E+01 9.3232597376542657E+01 9.3052823161237825E+01 9.2873520957041521E+01 + 9.2694688802058920E+01 9.2516324745728198E+01 9.2338426848741662E+01 9.2160993182962130E+01 9.1984021831345373E+01 + 9.1807510887858385E+01 9.1631458457402715E+01 9.1455862655735046E+01 9.1280721609390440E+01 9.1106033455605370E+01 + 9.0931796342241228E+01 9.0758008427709697E+01 9.0584667880897470E+01 9.0411772881091977E+01 9.0239321617908686E+01 + 9.0067312291216950E+01 8.9895743111068356E+01 8.9724612297625086E+01 8.9553918081088540E+01 8.9383658701629457E+01 + 8.9213832409317234E+01 8.9044437464050731E+01 8.8875472135490497E+01 8.8706934702988889E+01 8.8538823455524579E+01 + 8.8371136691633353E+01 8.8203872719343366E+01 8.8037029856108305E+01 8.7870606428742590E+01 8.7704600773355594E+01 + 8.7539011235288470E+01 8.7373836169049724E+01 8.7209073938252232E+01 8.7044722915550381E+01 8.6880781482577902E+01 + 8.6717248029886420E+01 8.6554120956883651E+01 8.6391398671773558E+01 8.6229079591495278E+01 8.6067162141664554E+01 + 8.5905644756513468E+01 8.5744525878831709E+01 8.5583803959909829E+01 8.5423477459479429E+01 8.5263544845656767E+01 + 8.5104004594887115E+01 8.4944855191885637E+01 8.4786095129584453E+01 8.4627722909075217E+01 8.4469737039554275E+01 + 8.4312136038269003E+01 8.4154918430463070E+01 8.3998082749322705E+01 8.3841627535923564E+01 8.3685551339177707E+01 + 8.3529852715781360E+01 8.3374530230162989E+01 8.3219582454431375E+01 8.3065007968324593E+01 8.2910805359159596E+01 + 8.2756973221781038E+01 8.2603510158511980E+01 8.2450414779104648E+01 8.2297685700689897E+01 8.2145321547729409E+01 + 8.1993320951967746E+01 8.1841682552382778E+01 8.1690404995139971E+01 8.1539486933543060E+01 8.1388927027988871E+01 + 8.1238723945920029E+01 8.1088876361778404E+01 8.0939382956960216E+01 8.0790242419769910E+01 8.0641453445375504E+01 + 8.0493014735763282E+01 8.0344924999693845E+01 8.0197182952658068E+01 8.0049787316833090E+01 7.9902736821039099E+01 + 7.9756030200696458E+01 7.9609666197782772E+01 7.9463643560790530E+01 7.9317961044684992E+01 7.9172617410863097E+01 + 7.9027611427111154E+01 7.8882941867563943E+01 7.8738607512664913E+01 7.8594607149124130E+01 7.8450939569879750E+01 + 7.8307603574056699E+01 7.8164597966928255E+01 7.8021921559876375E+01 7.7879573170352941E+01 7.7737551621840254E+01 + 7.7595855743814212E+01 7.7454484371705149E+01 7.7313436346860172E+01 7.7172710516506157E+01 7.7032305733712050E+01 + 7.6892220857352271E+01 7.6752454752069809E+01 7.6613006288240271E+01 7.6473874341935343E+01 7.6335057794887007E+01 + 7.6196555534452585E+01 7.6058366453578756E+01 7.5920489450766368E+01 7.5782923430037130E+01 7.5645667300896903E+01 + 7.5508719978303660E+01 7.5372080382631609E+01 7.5235747439638885E+01 7.5099720080433670E+01 7.4963997241439898E+01 + 7.4828577864366068E+01 7.4693460896171146E+01 7.4558645289032810E+01 7.4424130000314321E+01 7.4289913992533627E+01 + 7.4155996233330626E+01 7.4022375695436239E+01 7.3889051356640408E+01 7.3756022199762256E+01 7.3623287212617484E+01 + 7.3490845387989140E+01 7.3358695723596512E+01 7.3226837222064745E+01 7.3095268890896222E+01 7.2963989742438670E+01 + 7.2832998793857712E+01 7.2702295067105879E+01 7.2571877588894750E+01 7.2441745390664892E+01 7.2311897508558545E+01 + 7.2182332983389557E+01 7.2053050860616580E+01 7.1924050190313878E+01 7.1795330027144360E+01 7.1666889430330869E+01 + 7.1538727463629684E+01 7.1410843195302760E+01 7.1283235698090806E+01 7.1155904049186134E+01 7.1028847330206190E+01 + 7.0902064627167007E+01 7.0775555030457227E+01 7.0649317634811098E+01 7.0523351539283439E+01 7.0397655847223135E+01 + 7.0272229666248492E+01 7.0147072108220769E+01 7.0022182289219558E+01 6.9897559329517932E+01 6.9773202353557352E+01 + 6.9649110489922364E+01 6.9525282871317387E+01 6.9401718634541169E+01 6.9278416920463329E+01 6.9155376874000140E+01 + 6.9032597644090714E+01 6.8910078383673479E+01 6.8787818249662010E+01 6.8665816402922800E+01 6.8544072008251291E+01 + 6.8422584234349088E+01 6.8301352253801070E+01 6.8180375243053092E+01 6.8059652382388691E+01 6.7939182855907418E+01 + 6.7818965851501957E+01 6.7699000560837135E+01 6.7579286179326743E+01 6.7459821906112339E+01 6.7340606944042179E+01 + 6.7221640499648686E+01 6.7102921783128068E+01 6.6984450008318362E+01 6.6866224392679186E+01 6.6748244157270676E+01 + 6.6630508526731802E+01 6.6513016729261224E+01 6.6395767996595964E+01 6.6278761563991338E+01 6.6161996670200665E+01 + 6.6045472557455412E+01 6.5929188471445116E+01 6.5813143661297772E+01 6.5697337379560011E+01 6.5581768882177869E+01 + 6.5466437428477249E+01 6.5351342281144511E+01 6.5236482706208136E+01 6.5121857973018720E+01 6.5007467354230570E+01 + 6.4893310125783401E+01 6.4779385566883093E+01 6.4665692959983787E+01 6.4552231590768685E+01 6.4439000748133054E+01 + 6.4325999724165328E+01 6.4213227814128885E+01 6.4100684316445069E+01 6.3988368532674805E+01 6.3876279767501039E+01 + 6.3764417328711758E+01 6.3652780527181491E+01 6.3541368676855406E+01 6.3430181094731054E+01 6.3319217100842302E+01 + 6.3208476018241477E+01 6.3097957172983079E+01 6.2987659894106791E+01 6.2877583513621225E+01 6.2767727366487456E+01 + 6.2658090790601968E+01 6.2548673126781196E+01 6.2439473718745205E+01 6.2330491913101021E+01 6.2221727059327684E+01 + 6.2113178509759223E+01 6.2004845619570105E+01 6.1896727746759026E+01 6.1788824252132926E+01 6.1681134499292469E+01 + 6.1573657854616116E+01 6.1466393687245095E+01 6.1359341369068396E+01 6.1252500274707067E+01 6.1145869781500089E+01 + 6.1039449269489182E+01 6.0933238121404344E+01 6.0827235722648716E+01 6.0721441461284115E+01 6.0615854728017027E+01 + 6.0510474916183547E+01 6.0405301421736183E+01 6.0300333643228477E+01 6.0195570981801154E+01 6.0091012841169302E+01 + 5.9986658627606651E+01 5.9882507749933268E+01 5.9778559619500783E+01 5.9674813650179409E+01 5.9571269258344387E+01 + 5.9467925862861676E+01 5.9364782885075634E+01 5.9261839748795090E+01 5.9159095880280354E+01 5.9056550708230056E+01 + 5.8954203663767970E+01 5.8852054180430244E+01 5.8750101694152328E+01 5.8648345643256306E+01 5.8546785468438244E+01 + 5.8445420612755186E+01 5.8344250521613020E+01 5.8243274642753974E+01 5.8142492426243827E+01 5.8041903324459838E+01 + 5.7941506792078705E+01 5.7841302286063943E+01 5.7741289265654281E+01 5.7641467192350902E+01 5.7541835529906677E+01 + 5.7442393744313037E+01 5.7343141303788912E+01 5.7244077678769088E+01 5.7145202341892052E+01 5.7046514767988924E+01 + 5.6948014434071254E+01 5.6849700819320560E+01 5.6751573405076272E+01 5.6653631674824609E+01 5.6555875114187373E+01 + 5.6458303210910771E+01 5.6360915454854791E+01 5.6263711337981135E+01 5.6166690354343388E+01 5.6069852000075215E+01 + 5.5973195773380617E+01 5.5876721174522103E+01 5.5780427705810439E+01 5.5684314871594552E+01 5.5588382178249887E+01 + 5.5492629134168986E+01 5.5397055249750743E+01 5.5301660037389325E+01 5.5206443011465012E+01 5.5111403688333453E+01 + 5.5016541586315029E+01 5.4921856225685779E+01 5.4827347128666361E+01 5.4733013819412839E+01 5.4638855824006207E+01 + 5.4544872670442800E+01 5.4451063888624496E+01 5.4357429010348753E+01 5.4263967569299155E+01 5.4170679101036015E+01 + 5.4077563142986179E+01 5.3984619234433723E+01 5.3891846916511184E+01 5.3799245732189199E+01 5.3706815226267480E+01 + 5.3614554945366052E+01 5.3522464437915232E+01 5.3430543254147025E+01 5.3338790946085936E+01 5.3247207067539357E+01 + 5.3155791174089451E+01 5.3064542823083563E+01 5.2973461573625599E+01 5.2882546986566652E+01 5.2791798624497233E+01 + 5.2701216051737511E+01 5.2610798834329302E+01 5.2520546540026913E+01 5.2430458738289104E+01 5.2340535000269838E+01 + 5.2250774898810782E+01 5.2161178008431875E+01 5.2071743905323501E+01 5.1982472167337974E+01 5.1893362373981454E+01 + 5.1804414106405204E+01 5.1715626947398341E+01 5.1627000481378460E+01 5.1538534294384704E+01 5.1450227974068724E+01 + 5.1362081109687551E+01 5.1274093292095117E+01 5.1186264113734282E+01 5.1098593168629527E+01 5.1011080052378375E+01 + 5.0923724362144355E+01 5.0836525696648863E+01 5.0749483656163534E+01 5.0662597842502599E+01 5.0575867859015496E+01 + 5.0489293310578972E+01 5.0402873803589969E+01 5.0316608945957924E+01 5.0230498347097246E+01 5.0144541617920417E+01 + 5.0058738370830135E+01 4.9973088219712160E+01 4.9887590779928594E+01 4.9802245668309666E+01 4.9717052503147684E+01 + 4.9632010904188782E+01 4.9547120492626973E+01 4.9462380891096480E+01 4.9377791723664373E+01 4.9293352615824645E+01 + 4.9209063194490390E+01 4.9124923087987497E+01 4.9040931926047051E+01 4.8957089339799566E+01 4.8873394961767538E+01 + 4.8789848425858807E+01 4.8706449367359902E+01 4.8623197422929735E+01 4.8540092230592457E+01 4.8457133429731066E+01 + 4.8374320661081121E+01 4.8291653566723795E+01 4.8209131790080122E+01 4.8126754975903523E+01 4.8044522770274675E+01 + 4.7962434820593884E+01 4.7880490775575950E+01 4.7798690285242827E+01 4.7717033000918349E+01 4.7635518575220985E+01 + 4.7554146662058812E+01 4.7472916916622388E+01 4.7391828995379321E+01 4.7310882556067853E+01 4.7230077257690574E+01 + 4.7149412760509144E+01 4.7068888726037777E+01 4.6988504817037388E+01 4.6908260697509810E+01 4.6828156032691943E+01 + 4.6748190489049684E+01 4.6668363734272283E+01 4.6588675437266495E+01 4.6509125268151244E+01 4.6429712898251218E+01 + 4.6350438000091437E+01 4.6271300247392205E+01 4.6192299315062499E+01 4.6113434879195260E+01 4.6034706617061119E+01 + 4.5956114207103496E+01 4.5877657328932891E+01 4.5799335663320960E+01 4.5721148892195842E+01 4.5643096698636327E+01 + 4.5565178766866453E+01 4.5487394782250504E+01 4.5409744431287201E+01 4.5332227401604740E+01 4.5254843381955617E+01 + 4.5177592062211097E+01 4.5100473133356267E+01 4.5023486287484758E+01 4.4946631217793467E+01 4.4869907618578026E+01 + 4.4793315185226824E+01 4.4716853614216532E+01 4.4640522603107264E+01 4.4564321850536771E+01 4.4488251056216406E+01 + 4.4412309920925360E+01 4.4336498146506479E+01 4.4260815435860621E+01 4.4185261492942359E+01 4.4109836022754997E+01 + 4.4034538731345719E+01 4.3959369325800452E+01 4.3884327514239743E+01 4.3809413005813681E+01 4.3734625510697079E+01 + 4.3659964740085073E+01 4.3585430406188081E+01 4.3511022222227602E+01 4.3436739902431114E+01 4.3362583162028166E+01 + 4.3288551717245113E+01 4.3214645285300733E+01 4.3140863584402254E+01 4.3067206333740124E+01 4.2993673253483919E+01 + 4.2920264064778117E+01 4.2846978489736941E+01 4.2773816251441019E+01 4.2700777073931810E+01 4.2627860682208379E+01 + 4.2555066802222314E+01 4.2482395160873899E+01 4.2409845486007164E+01 4.2337417506406467E+01 4.2265110951791797E+01 + 4.2192925552814508E+01 4.2120861041053395E+01 4.2048917149010215E+01 4.1977093610105811E+01 4.1905390158675864E+01 + 4.1833806529966687E+01 4.1762342460131521E+01 4.1690997686225991E+01 4.1619771946204359E+01 4.1548664978915355E+01 + 4.1477676524098435E+01 4.1406806322379424E+01 4.1336054115267096E+01 4.1265419645148434E+01 4.1194902655285581E+01 + 4.1124502889811559E+01 4.1054220093726073E+01 4.0984054012892294E+01 4.0914004394032702E+01 4.0844070984725022E+01 + 4.0774253533398912E+01 4.0704551789331994E+01 4.0634965502645997E+01 4.0565494424303125E+01 4.0496138306102338E+01 + 4.0426896900675622E+01 4.0357769961484195E+01 4.0288757242815414E+01 4.0219858499778262E+01 4.0151073488300341E+01 + 4.0082401965124028E+01 4.0013843687803259E+01 3.9945398414699220E+01 3.9877065904977670E+01 3.9808845918604661E+01 + 3.9740738216343694E+01 3.9672742559751605E+01 3.9604858711175567E+01 3.9537086433749451E+01 3.9469425491390218E+01 + 3.9401875648794885E+01 3.9334436671436777E+01 3.9267108325562340E+01 3.9199890378187682E+01 3.9132782597095208E+01 + 3.9065784750830396E+01 3.8998896608698324E+01 3.8932117940760548E+01 3.8865448517831588E+01 3.8798888111475918E+01 + 3.8732436494004453E+01 3.8666093438471776E+01 3.8599858718672174E+01 3.8533732109137041E+01 3.8467713385131788E+01 + 3.8401802322651839E+01 3.8335998698420582E+01 3.8270302289885315E+01 3.8204712875214781E+01 3.8139230233295514E+01 + 3.8073854143729150E+01 3.8008584386829320E+01 3.7943420743618340E+01 3.7878362995824368E+01 3.7813410925878273E+01 + 3.7748564316910731E+01 3.7683822952749274E+01 3.7619186617915013E+01 3.7554655097619957E+01 3.7490228177763875E+01 + 3.7425905644931703E+01 3.7361687286390065E+01 3.7297572890084844E+01 3.7233562244637930E+01 3.7169655139344805E+01 + 3.7105851364171158E+01 3.7042150709750167E+01 3.6978552967380203E+01 3.6915057929020989E+01 3.6851665387291817E+01 + 3.6788375135468215E+01 3.6725186967478990E+01 3.6662100677903958E+01 3.6599116061970911E+01 3.6536232915553001E+01 + 3.6473451035165681E+01 3.6410770217964426E+01 3.6348190261741799E+01 3.6285710964924874E+01 3.6223332126572458E+01 + 3.6161053546372472E+01 3.6098875024639135E+01 3.6036796362310930E+01 3.5974817360947142E+01 3.5912937822725866E+01 + 3.5851157550440995E+01 3.5789476347500198E+01 3.5727894017921670E+01 3.5666410366332109E+01 3.5605025197963862E+01 + 3.5543738318652508E+01 3.5482549534834291E+01 3.5421458653543880E+01 3.5360465482411129E+01 3.5299569829659646E+01 + 3.5238771504103489E+01 3.5178070315145085E+01 3.5117466072772665E+01 3.5056958587557816E+01 3.4996547670653207E+01 + 3.4936233133789898E+01 3.4876014789275246E+01 3.4815892449990329E+01 3.4755865929387589E+01 3.4695935041488568E+01 + 3.4636099600881387E+01 3.4576359422718483E+01 3.4516714322714499E+01 3.4457164117143400E+01 3.4397708622836923E+01 + 3.4338347657181515E+01 3.4279081038116523E+01 3.4219908584131858E+01 3.4160830114265735E+01 3.4101845448102104E+01 + 3.4042954405768803E+01 3.3984156807935321E+01 3.3925452475810104E+01 3.3866841231138849E+01 3.3808322896202249E+01 + 3.3749897293813397E+01 3.3691564247316172E+01 3.3633323580582569E+01 3.3575175118010826E+01 3.3517118684523261E+01 + 3.3459154105563883E+01 3.3401281207096801E+01 3.3343499815603401E+01 3.3285809758080823E+01 3.3228210862039482E+01 + 3.3170702955501298E+01 3.3113285866997266E+01 3.3055959425565796E+01 3.2998723460750128E+01 3.2941577802597017E+01 + 3.2884522281653751E+01 3.2827556728967068E+01 3.2770680976080506E+01 3.2713894855032514E+01 3.2657198198354692E+01 + 3.2600590839069532E+01 3.2544072610688559E+01 3.2487643347210316E+01 3.2431302883118470E+01 3.2375051053379764E+01 + 3.2318887693442065E+01 3.2262812639232514E+01 3.2206825727155639E+01 3.2150926794091170E+01 3.2095115677392535E+01 + 3.2039392214884636E+01 3.1983756244861890E+01 3.1928207606086925E+01 3.1872746137787875E+01 3.1817371679657324E+01 + 3.1762084071849639E+01 3.1706883154980002E+01 3.1651768770121677E+01 3.1596740758804984E+01 3.1541798963014891E+01 + 3.1486943225189634E+01 3.1432173388218356E+01 3.1377489295439965E+01 3.1322890790640930E+01 3.1268377718053596E+01 + 3.1213949922354438E+01 3.1159607248662219E+01 3.1105349542536427E+01 3.1051176649975275E+01 3.0997088417414037E+01 + 3.0943084691723595E+01 3.0889165320208306E+01 3.0835330150604349E+01 3.0781579031078493E+01 3.0727911810225716E+01 + 3.0674328337067877E+01 3.0620828461052167E+01 3.0567412032049031E+01 3.0514078900350835E+01 3.0460828916670241E+01 + 3.0407661932138041E+01 3.0354577798302181E+01 3.0301576367125723E+01 3.0248657490985259E+01 3.0195821022669509E+01 + 3.0143066815377217E+01 3.0090394722716134E+01 3.0037804598701044E+01 2.9985296297752203E+01 2.9932869674694064E+01 + 2.9880524584753154E+01 2.9828260883556943E+01 2.9776078427132081E+01 2.9723977071902908E+01 2.9671956674690009E+01 + 2.9620017092708295E+01 2.9568158183566027E+01 2.9516379805262613E+01 2.9464681816187902E+01 2.9413064075119781E+01 + 2.9361526441223443E+01 2.9310068774049242E+01 2.9258690933531724E+01 2.9207392779987916E+01 2.9156174174115755E+01 + 2.9105034976992606E+01 2.9053975050074083E+01 2.9002994255192306E+01 2.8952092454554499E+01 2.8901269510741660E+01 + 2.8850525286706940E+01 2.8799859645774330E+01 2.8749272451637147E+01 2.8698763568356853E+01 2.8648332860361290E+01 + 2.8597980192443309E+01 2.8547705429759862E+01 2.8497508437829840E+01 2.8447389082533235E+01 2.8397347230109688E+01 + 2.8347382747156779E+01 2.8297495500629072E+01 2.8247685357836616E+01 2.8197952186443224E+01 2.8148295854465747E+01 + 2.8098716230272331E+01 2.8049213182580942E+01 2.7999786580458473E+01 2.7950436293319097E+01 2.7901162190922992E+01 + 2.7851964143375142E+01 2.7802842021123780E+01 2.7753795694959393E+01 2.7704825036013190E+01 2.7655929915755745E+01 + 2.7607110205996182E+01 2.7558365778880219E+01 2.7509696506889298E+01 2.7461102262839432E+01 2.7412582919879508E+01 + 2.7364138351490254E+01 2.7315768431483182E+01 2.7267473033998957E+01 2.7219252033506432E+01 2.7171105304801372E+01 + 2.7123032723004947E+01 2.7075034163562904E+01 2.7027109502244130E+01 2.6979258615139397E+01 2.6931481378660358E+01 + 2.6883777669537963E+01 2.6836147364821702E+01 2.6788590341878070E+01 2.6741106478389504E+01 2.6693695652353412E+01 + 2.6646357742080490E+01 2.6599092626193993E+01 2.6551900183628348E+01 2.6504780293627984E+01 2.6457732835746466E+01 + 2.6410757689844864E+01 2.6363854736090854E+01 2.6317023854957768E+01 2.6270264927223028E+01 2.6223577833967358E+01 + 2.6176962456573573E+01 2.6130418676725167E+01 2.6083946376405727E+01 2.6037545437897393E+01 2.5991215743779794E+01 + 2.5944957176929179E+01 2.5898769620517069E+01 2.5852652958009301E+01 2.5806607073164891E+01 2.5760631850034894E+01 + 2.5714727172961425E+01 2.5668892926576508E+01 2.5623128995801061E+01 2.5577435265843683E+01 2.5531811622199903E+01 + 2.5486257950650756E+01 2.5440774137261837E+01 2.5395360068382534E+01 2.5350015630644553E+01 2.5304740710961180E+01 + 2.5259535196526059E+01 2.5214398974812369E+01 2.5169331933571481E+01 2.5124333960832328E+01 2.5079404944900087E+01 + 2.5034544774355222E+01 2.4989753338052545E+01 2.4945030525120249E+01 2.4900376224958766E+01 2.4855790327239799E+01 + 2.4811272721905492E+01 2.4766823299167193E+01 2.4722441949504713E+01 2.4678128563665108E+01 2.4633883032661924E+01 + 2.4589705247774017E+01 2.4545595100544858E+01 2.4501552482781285E+01 2.4457577286552628E+01 2.4413669404189953E+01 + 2.4369828728284780E+01 2.4326055151688422E+01 2.4282348567510802E+01 2.4238708869119794E+01 2.4195135950139935E+01 + 2.4151629704451903E+01 2.4108190026191238E+01 2.4064816809747544E+01 2.4021509949763658E+01 2.3978269341134602E+01 + 2.3935094879006801E+01 2.3891986458776987E+01 2.3848943976091547E+01 2.3805967326845352E+01 2.3763056407181093E+01 + 2.3720211113488247E+01 2.3677431342402194E+01 2.3634716990803494E+01 2.3592067955816752E+01 2.3549484134809976E+01 + 2.3506965425393428E+01 2.3464511725419172E+01 2.3422122932979690E+01 2.3379798946407618E+01 2.3337539664274178E+01 + 2.3295344985388937E+01 2.3253214808798791E+01 2.3211149033786775E+01 2.3169147559871668E+01 2.3127210286806992E+01 + 2.3085337114580163E+01 2.3043527943411458E+01 2.3001782673753567E+01 2.2960101206290503E+01 2.2918483441936903E+01 + 2.2876929281837089E+01 2.2835438627364294E+01 2.2794011380120022E+01 2.2752647441932922E+01 2.2711346714858212E+01 + 2.2670109101176749E+01 2.2628934503394440E+01 2.2587822824241137E+01 2.2546773966670045E+01 2.2505787833856978E+01 + 2.2464864329199326E+01 2.2424003356315556E+01 2.2383204819044273E+01 2.2342468621443444E+01 2.2301794667789650E+01 + 2.2261182862577424E+01 2.2220633110518214E+01 2.2180145316539871E+01 2.2139719385785828E+01 2.2099355223614300E+01 + 2.2059052735597472E+01 2.2018811827520985E+01 2.1978632405382825E+01 2.1938514375392913E+01 2.1898457643972126E+01 + 2.1858462117751820E+01 2.1818527703572787E+01 2.1778654308484679E+01 2.1738841839745252E+01 2.1699090204819807E+01 + 2.1659399311380078E+01 2.1619769067303988E+01 2.1580199380674433E+01 2.1540690159779107E+01 2.1501241313109166E+01 + 2.1461852749359156E+01 2.1422524377425862E+01 2.1383256106407845E+01 2.1344047845604461E+01 2.1304899504515557E+01 + 2.1265810992840411E+01 2.1226782220477357E+01 2.1187813097522774E+01 2.1148903534270648E+01 2.1110053441211814E+01 + 2.1071262729033222E+01 2.1032531308617266E+01 2.0993859091041305E+01 2.0955245987576646E+01 2.0916691909688161E+01 + 2.0878196769033419E+01 2.0839760477462288E+01 2.0801382947015931E+01 2.0763064089926473E+01 2.0724803818616017E+01 + 2.0686602045696329E+01 2.0648458683968034E+01 2.0610373646419774E+01 2.0572346846227905E+01 2.0534378196755682E+01 + 2.0496467611552649E+01 2.0458615004353870E+01 2.0420820289079536E+01 2.0383083379834140E+01 2.0345404190905963E+01 + 2.0307782636766397E+01 2.0270218632069255E+01 2.0232712091650246E+01 2.0195262930526425E+01 2.0157871063895346E+01 + 2.0120536407134630E+01 2.0083258875801242E+01 2.0046038385631121E+01 2.0008874852538113E+01 1.9971768192613951E+01 + 1.9934718322127054E+01 1.9897725157522498E+01 1.9860788615420866E+01 1.9823908612618119E+01 1.9787085066084842E+01 + 1.9750317892965416E+01 1.9713607010577789E+01 1.9676952336412779E+01 1.9640353788133300E+01 1.9603811283574089E+01 + 1.9567324740740879E+01 1.9530894077809929E+01 1.9494519213127454E+01 1.9458200065209017E+01 1.9421936552739030E+01 + 1.9385728594569990E+01 1.9349576109722303E+01 1.9313479017383298E+01 1.9277437236906824E+01 1.9241450687812904E+01 + 1.9205519289786821E+01 1.9169642962678740E+01 1.9133821626503316E+01 1.9098055201438751E+01 1.9062343607826669E+01 + 1.9026686766171338E+01 1.8991084597139064E+01 1.8955537021557845E+01 1.8920043960416788E+01 1.8884605334865434E+01 + 1.8849221066213378E+01 1.8813891075929671E+01 1.8778615285642317E+01 1.8743393617137670E+01 1.8708225992359996E+01 + 1.8673112333410970E+01 1.8638052562549042E+01 1.8603046602188993E+01 1.8568094374901399E+01 1.8533195803412223E+01 + 1.8498350810602087E+01 1.8463559319505830E+01 1.8428821253312297E+01 1.8394136535363270E+01 1.8359505089153526E+01 + 1.8324926838329894E+01 1.8290401706691100E+01 1.8255929618187050E+01 1.8221510496918327E+01 1.8187144267135892E+01 + 1.8152830853240360E+01 1.8118570179781671E+01 1.8084362171458519E+01 1.8050206753117944E+01 1.8016103849754717E+01 + 1.7982053386510955E+01 1.7948055288675636E+01 1.7914109481684132E+01 1.7880215891117579E+01 1.7846374442702619E+01 + 1.7812585062310927E+01 1.7778847675958453E+01 1.7745162209805176E+01 1.7711528590154746E+01 1.7677946743453720E+01 + 1.7644416596291364E+01 1.7610938075398963E+01 1.7577511107649620E+01 1.7544135620057478E+01 1.7510811539777599E+01 + 1.7477538794105250E+01 1.7444317310475650E+01 1.7411147016463236E+01 1.7378027839781542E+01 1.7344959708282587E+01 + 1.7311942549956413E+01 1.7278976292930661E+01 1.7246060865470177E+01 1.7213196195976487E+01 1.7180382212987372E+01 + 1.7147618845176616E+01 1.7114906021353285E+01 1.7082243670461427E+01 1.7049631721579608E+01 1.7017070103920691E+01 + 1.6984558746830935E+01 1.6952097579790166E+01 1.6919686532410786E+01 1.6887325534437785E+01 1.6855014515747982E+01 + 1.6822753406349896E+01 1.6790542136383173E+01 1.6758380636118094E+01 1.6726268835955310E+01 1.6694206666425412E+01 + 1.6662194058188433E+01 1.6630230942033464E+01 1.6598317248878299E+01 1.6566452909768998E+01 1.6534637855879410E+01 + 1.6502872018510882E+01 1.6471155329091797E+01 1.6439487719177151E+01 1.6407869120448240E+01 1.6376299464712197E+01 + 1.6344778683901495E+01 1.6313306710073817E+01 1.6281883475411384E+01 1.6250508912220774E+01 1.6219182952932332E+01 + 1.6187905530100043E+01 1.6156676576400809E+01 1.6125496024634359E+01 1.6094363807722786E+01 1.6063279858710008E+01 + 1.6032244110761578E+01 1.6001256497164242E+01 1.5970316951325524E+01 1.5939425406773395E+01 1.5908581797155847E+01 + 1.5877786056240598E+01 1.5847038117914614E+01 1.5816337916183844E+01 1.5785685385172780E+01 1.5755080459124050E+01 + 1.5724523072398272E+01 1.5694013159473373E+01 1.5663550654944395E+01 1.5633135493523220E+01 1.5602767610037978E+01 + 1.5572446939432924E+01 1.5542173416767833E+01 1.5511946977217955E+01 1.5481767556073292E+01 1.5451635088738582E+01 + 1.5421549510732731E+01 1.5391510757688597E+01 1.5361518765352415E+01 1.5331573469583773E+01 1.5301674806354999E+01 + 1.5271822711750946E+01 1.5242017121968599E+01 1.5212257973316756E+01 1.5182545202215676E+01 1.5152878745196658E+01 + 1.5123258538901963E+01 1.5093684520084114E+01 1.5064156625605785E+01 1.5034674792439411E+01 1.5005238957666958E+01 + 1.4975849058479350E+01 1.4946505032176381E+01 1.4917206816166162E+01 1.4887954347965103E+01 1.4858747565197177E+01 + 1.4829586405593965E+01 1.4800470806994138E+01 1.4771400707343087E+01 1.4742376044692799E+01 1.4713396757201339E+01 + 1.4684462783132663E+01 1.4655574060856217E+01 1.4626730528846627E+01 1.4597932125683439E+01 1.4569178790050724E+01 + 1.4540470460736847E+01 1.4511807076634108E+01 1.4483188576738399E+01 1.4454614900148901E+01 1.4426085986067928E+01 + 1.4397601773800394E+01 1.4369162202753566E+01 1.4340767212436921E+01 1.4312416742461552E+01 1.4284110732540238E+01 + 1.4255849122486705E+01 1.4227631852215669E+01 1.4199458861742494E+01 1.4171330091182602E+01 1.4143245480751570E+01 + 1.4115204970764591E+01 1.4087208501636226E+01 1.4059256013880171E+01 1.4031347448108813E+01 1.4003482745033134E+01 + 1.3975661845462261E+01 1.3947884690303354E+01 1.3920151220561063E+01 1.3892461377337435E+01 1.3864815101831596E+01 + 1.3837212335339387E+01 1.3809653019253203E+01 1.3782137095061582E+01 1.3754664504348959E+01 1.3727235188795513E+01 + 1.3699849090176658E+01 1.3672506150362983E+01 1.3645206311319784E+01 1.3617949515106924E+01 1.3590735703878577E+01 + 1.3563564819882746E+01 1.3536436805461229E+01 1.3509351603049229E+01 1.3482309155175095E+01 1.3455309404460051E+01 + 1.3428352293617939E+01 1.3401437765454954E+01 1.3374565762869322E+01 1.3347736228851122E+01 1.3320949106481937E+01 + 1.3294204338934650E+01 1.3267501869473175E+01 1.3240841641452093E+01 1.3214223598316615E+01 1.3187647683602005E+01 + 1.3161113840933677E+01 1.3134622014026611E+01 1.3108172146685261E+01 1.3081764182803333E+01 1.3055398066363459E+01 + 1.3029073741436896E+01 1.3002791152183372E+01 1.2976550242850816E+01 1.2950350957775017E+01 1.2924193241379488E+01 + 1.2898077038175149E+01 1.2872002292760072E+01 1.2845968949819309E+01 1.2819976954124526E+01 1.2794026250533880E+01 + 1.2768116783991655E+01 1.2742248499528122E+01 1.2716421342259189E+01 1.2690635257386340E+01 1.2664890190196163E+01 + 1.2639186086060224E+01 1.2613522890434908E+01 1.2587900548860970E+01 1.2562319006963577E+01 1.2536778210451736E+01 + 1.2511278105118393E+01 1.2485818636839914E+01 1.2460399751576080E+01 1.2435021395369729E+01 1.2409683514346476E+01 + 1.2384386054714607E+01 1.2359128962764791E+01 1.2333912184869860E+01 1.2308735667484521E+01 1.2283599357145242E+01 + 1.2258503200469908E+01 1.2233447144157662E+01 1.2208431134988658E+01 1.2183455119823853E+01 1.2158519045604772E+01 + 1.2133622859353213E+01 1.2108766508171257E+01 1.2083949939240698E+01 1.2059173099823120E+01 1.2034435937259566E+01 + 1.2009738398970239E+01 1.1985080432454472E+01 1.1960461985290282E+01 1.1935883005134370E+01 1.1911343439721801E+01 + 1.1886843236865705E+01 1.1862382344457254E+01 1.1837960710465296E+01 1.1813578282936257E+01 1.1789235009993760E+01 + 1.1764930839838632E+01 1.1740665720748485E+01 1.1716439601077694E+01 1.1692252429257040E+01 1.1668104153793584E+01 + 1.1643994723270435E+01 1.1619924086346535E+01 1.1595892191756457E+01 1.1571898988310261E+01 1.1547944424893169E+01 + 1.1524028450465488E+01 1.1500151014062292E+01 1.1476312064793301E+01 1.1452511551842681E+01 1.1428749424468815E+01 + 1.1405025632004053E+01 1.1381340123854619E+01 1.1357692849500401E+01 1.1334083758494598E+01 1.1310512800463732E+01 + 1.1286979925107339E+01 1.1263485082197784E+01 1.1240028221580106E+01 1.1216609293171784E+01 1.1193228246962541E+01 + 1.1169885033014191E+01 1.1146579601460390E+01 1.1123311902506520E+01 1.1100081886429473E+01 1.1076889503577396E+01 + 1.1053734704369573E+01 1.1030617439296263E+01 1.1007537658918421E+01 1.0984495313867523E+01 1.0961490354845552E+01 + 1.0938522732624508E+01 1.0915592398046533E+01 1.0892699302023534E+01 1.0869843395537005E+01 1.0847024629638005E+01 + 1.0824242955446776E+01 1.0801498324152675E+01 1.0778790687014016E+01 1.0756119995357759E+01 1.0733486200579463E+01 + 1.0710889254143078E+01 1.0688329107580742E+01 1.0665805712492631E+01 1.0643319020546702E+01 1.0620868983478642E+01 + 1.0598455553091611E+01 1.0576078681256057E+01 1.0553738319909684E+01 1.0531434421057023E+01 1.0509166936769525E+01 + 1.0486935819185181E+01 1.0464741020508534E+01 1.0442582493010308E+01 1.0420460189027464E+01 1.0398374060962803E+01 + 1.0376324061284965E+01 1.0354310142528194E+01 1.0332332257292240E+01 1.0310390358241971E+01 1.0288484398107533E+01 + 1.0266614329683939E+01 1.0244780105831026E+01 1.0222981679473223E+01 1.0201219003599407E+01 1.0179492031262754E+01 + 1.0157800715580631E+01 1.0136145009734296E+01 1.0114524866968846E+01 1.0092940240593000E+01 1.0071391083979053E+01 + 1.0049877350562484E+01 1.0028398993842098E+01 1.0006955967379589E+01 9.9855482247996079E+00 9.9641757197893899E+00 + 9.9428384060988240E+00 9.9215362375400797E+00 9.9002691679876573E+00 9.8790371513780766E+00 9.8578401417097972E+00 + 9.8366780930430551E+00 9.8155509594996460E+00 9.7944586952628896E+00 9.7734012545774291E+00 9.7523785917489807E+00 + 9.7313906611444025E+00 9.7104374171913026E+00 9.6895188143780473E+00 9.6686348072535626E+00 9.6477853504271387E+00 + 9.6269703985684441E+00 9.6061899064071632E+00 9.5854438287329646E+00 9.5647321203954192E+00 9.5440547363036625E+00 + 9.5234116314264909E+00 9.5028027607919725E+00 9.4822280794874878E+00 9.4616875426595630E+00 9.4411811055135662E+00 + 9.4207087233137798E+00 9.4002703513831261E+00 9.3798659451030755E+00 9.3594954599134841E+00 9.3391588513124564E+00 + 9.3188560748562317E+00 9.2985870861590083E+00 9.2783518408928138E+00 9.2581502947874021E+00 9.2379824036300420E+00 + 9.2178481232654779E+00 9.1977474095957206E+00 9.1776802185799102E+00 9.1576465062342063E+00 9.1376462286316951E+00 + 9.1176793419021340E+00 9.0977458022319784E+00 9.0778455658640720E+00 9.0579785890976527E+00 9.0381448282881927E+00 + 9.0183442398471723E+00 8.9985767802420806E+00 8.9788424059961827E+00 8.9591410736884782E+00 8.9394727399534943E+00 + 8.9198373614811892E+00 8.9002348950167729E+00 8.8806652973606646E+00 8.8611285253683700E+00 8.8416245359502401E+00 + 8.8221532860714174E+00 8.8027147327517348E+00 8.7833088330654920E+00 8.7639355441415017E+00 8.7445948231627728E+00 + 8.7252866273664544E+00 8.7060109140438335E+00 8.6867676405399568E+00 8.6675567642538027E+00 8.6483782426378841E+00 + 8.6292320331983188E+00 8.6101180934946679E+00 8.5910363811396930E+00 8.5719868537993982E+00 8.5529694691928224E+00 + 8.5339841850919296E+00 8.5150309593215283E+00 8.4961097497590501E+00 8.4772205143345420E+00 8.4583632110304965E+00 + 8.4395377978817816E+00 8.4207442329754212E+00 8.4019824744505929E+00 8.3832524804983954E+00 8.3645542093618257E+00 + 8.3458876193356843E+00 8.3272526687663397E+00 8.3086493160516728E+00 8.2900775196410539E+00 8.2715372380350249E+00 + 8.2530284297854433E+00 8.2345510534950979E+00 8.2161050678178125E+00 8.1976904314582413E+00 8.1793071031717286E+00 + 8.1609550417642609E+00 8.1426342060923211E+00 8.1243445550627928E+00 8.1060860476328376E+00 8.0878586428097758E+00 + 8.0696622996510072E+00 8.0514969772638683E+00 8.0333626348055667E+00 8.0152592314830038E+00 7.9971867265527452E+00 + 7.9791450793208316E+00 7.9611342491427974E+00 7.9431541954234026E+00 7.9252048776166308E+00 7.9072862552255954E+00 + 7.8893982878023090E+00 7.8715409349477872E+00 7.8537141563116935E+00 7.8359179115924844E+00 7.8181521605370774E+00 + 7.8004168629409296E+00 7.7827119786478329E+00 7.7650374675498339E+00 7.7473932895871540E+00 7.7297794047480295E+00 + 7.7121957730686779E+00 7.6946423546331690E+00 7.6771191095733027E+00 7.6596259980685444E+00 7.6421629803458737E+00 + 7.6247300166797878E+00 7.6073270673920677E+00 7.5899540928517606E+00 7.5726110534750521E+00 7.5552979097252262E+00 + 7.5380146221124731E+00 7.5207611511938319E+00 7.5035374575731630E+00 7.4863435019009037E+00 7.4691792448741205E+00 + 7.4520446472363444E+00 7.4349396697774228E+00 7.4178642733335316E+00 7.4008184187870398E+00 7.3838020670663331E+00 + 7.3668151791458509E+00 7.3498577160459080E+00 7.3329296388326224E+00 7.3160309086178366E+00 7.2991614865589938E+00 + 7.2823213338590724E+00 7.2655104117664786E+00 7.2487286815749163E+00 7.2319761046234303E+00 7.2152526422961616E+00 + 7.1985582560222765E+00 7.1818929072760254E+00 7.1652565575764395E+00 7.1486491684873830E+00 7.1320707016174589E+00 + 7.1155211186197942E+00 7.0990003811921412E+00 7.0825084510766514E+00 7.0660452900597877E+00 7.0496108599723195E+00 + 7.0332051226891670E+00 7.0168280401293739E+00 7.0004795742558947E+00 6.9841596870756817E+00 6.9678683406394661E+00 + 6.9516054970417454E+00 6.9353711184206377E+00 6.9191651669578498E+00 6.9029876048785530E+00 6.8868383944513392E+00 + 6.8707174979881156E+00 6.8546248778439800E+00 6.8385604964171653E+00 6.8225243161490470E+00 6.8065162995238788E+00 + 6.7905364090688938E+00 6.7745846073540541E+00 6.7586608569921287E+00 6.7427651206384542E+00 6.7268973609910017E+00 + 6.7110575407901978E+00 6.6952456228188453E+00 6.6794615699021014E+00 6.6637053449073393E+00 6.6479769107441369E+00 + 6.6322762303641003E+00 6.6166032667608530E+00 6.6009579829699510E+00 6.5853403420687719E+00 6.5697503071764700E+00 + 6.5541878414538832E+00 6.5386529081034439E+00 6.5231454703691103E+00 6.5076654915363248E+00 6.4922129349318674E+00 + 6.4767877639238005E+00 6.4613899419214613E+00 6.4460194323752678E+00 6.4306761987767596E+00 6.4153602046584091E+00 + 6.4000714135936576E+00 6.3848097891967326E+00 6.3695752951226519E+00 6.3543678950671447E+00 6.3391875527665142E+00 + 6.3240342319976470E+00 6.3089078965778214E+00 6.2938085103647810E+00 6.2787360372565537E+00 6.2636904411914278E+00 + 6.2486716861478468E+00 6.2336797361443539E+00 6.2187145552395506E+00 6.2037761075319588E+00 6.1888643571599919E+00 + 6.1739792683018564E+00 6.1591208051755704E+00 6.1442889320387186E+00 6.1294836131885777E+00 6.1147048129618682E+00 + 6.0999524957348514E+00 6.0852266259230872E+00 6.0705271679815471E+00 6.0558540864043646E+00 6.0412073457248843E+00 + 6.0265869105155909E+00 6.0119927453879924E+00 5.9974248149925264E+00 5.9828830840185780E+00 5.9683675171943600E+00 + 5.9538780792868504E+00 5.9394147351017397E+00 5.9249774494833289E+00 5.9105661873144779E+00 5.8961809135166074E+00 + 5.8818215930495077E+00 5.8674881909113568E+00 5.8531806721386150E+00 5.8388990018060341E+00 5.8246431450264522E+00 + 5.8104130669509013E+00 5.7962087327683651E+00 5.7820301077058760E+00 5.7678771570283205E+00 5.7537498460384526E+00 + 5.7396481400768353E+00 5.7255720045216849E+00 5.7115214047889218E+00 5.6974963063320478E+00 5.6834966746420763E+00 + 5.6695224752474953E+00 5.6555736737141968E+00 5.6416502356454004E+00 5.6277521266816155E+00 5.6138793125005639E+00 + 5.6000317588170958E+00 5.5862094313831898E+00 5.5724122959878306E+00 5.5586403184569573E+00 5.5448934646534749E+00 + 5.5311717004770680E+00 5.5174749918642654E+00 5.5038033047882555E+00 5.4901566052589663E+00 5.4765348593228724E+00 + 5.4629380330630424E+00 5.4493660925989884E+00 5.4358190040866887E+00 5.4222967337184826E+00 5.4087992477229889E+00 + 5.3953265123651173E+00 5.3818784939459565E+00 5.3684551588027398E+00 5.3550564733087622E+00 5.3416824038733566E+00 + 5.3283329169418092E+00 5.3150079789953049E+00 5.3017075565508813E+00 5.2884316161614082E+00 5.2751801244154324E+00 + 5.2619530479372143E+00 5.2487503533866029E+00 5.2355720074590719E+00 5.2224179768855539E+00 5.2092882284324675E+00 + 5.1961827289016052E+00 5.1831014451301547E+00 5.1700443439905204E+00 5.1570113923903973E+00 5.1440025572726702E+00 + 5.1310178056152944E+00 5.1180571044313448E+00 5.1051204207689027E+00 5.0922077217110031E+00 5.0793189743756129E+00 + 5.0664541459155483E+00 5.0536132035184211E+00 5.0407961144066027E+00 5.0280028458371708E+00 5.0152333651018264E+00 + 5.0024876395268905E+00 4.9897656364732219E+00 4.9770673233361578E+00 4.9643926675454653E+00 4.9517416365653464E+00 + 4.9391141978942690E+00 4.9265103190650459E+00 4.9139299676446750E+00 4.9013731112343795E+00 4.8888397174694722E+00 + 4.8763297540193777E+00 4.8638431885875297E+00 4.8513799889113827E+00 4.8389401227622519E+00 4.8265235579453876E+00 + 4.8141302622998570E+00 4.8017602036985112E+00 4.7894133500479272E+00 4.7770896692883680E+00 4.7647891293937326E+00 + 4.7525116983715012E+00 4.7402573442626794E+00 4.7280260351417969E+00 4.7158177391168117E+00 4.7036324243290348E+00 + 4.6914700589531808E+00 4.6793306111972210E+00 4.6672140493023822E+00 4.6551203415431228E+00 4.6430494562270086E+00 + 4.6310013616947510E+00 4.6189760263201212E+00 4.6069734185098810E+00 4.5949935067037728E+00 4.5830362593744693E+00 + 4.5711016450275181E+00 4.5591896322012966E+00 4.5473001894669398E+00 4.5354332854283594E+00 4.5235888887221396E+00 + 4.5117669680175068E+00 4.4999674920163262E+00 4.4881904294529820E+00 4.4764357490943780E+00 4.4647034197399060E+00 + 4.4529934102213504E+00 4.4413056894029177E+00 4.4296402261811183E+00 4.4179969894847408E+00 4.4063759482748726E+00 + 4.3947770715447518E+00 4.3832003283198047E+00 4.3716456876575913E+00 4.3601131186476980E+00 4.3486025904117822E+00 + 4.3371140721034829E+00 4.3256475329083477E+00 4.3142029420438766E+00 4.3027802687594132E+00 4.2913794823361071E+00 + 4.2800005520868911E+00 4.2686434473564345E+00 4.2573081375210968E+00 4.2459945919888851E+00 4.2347027801994068E+00 + 4.2234326716238737E+00 4.2121842357649859E+00 4.2009574421569313E+00 4.1897522603653492E+00 4.1785686599873006E+00 + 4.1674066106511747E+00 4.1562660820167192E+00 4.1451470437749283E+00 4.1340494656480606E+00 4.1229733173895688E+00 + 4.1119185687840698E+00 4.1008851896472995E+00 4.0898731498260981E+00 4.0788824191982904E+00 4.0679129676727728E+00 + 4.0569647651893623E+00 4.0460377817188187E+00 4.0351319872627789E+00 4.0242473518537407E+00 4.0133838455549995E+00 + 4.0025414384606188E+00 3.9917201006953884E+00 3.9809198024148302E+00 3.9701405138050756E+00 3.9593822050828806E+00 + 3.9486448464956148E+00 3.9379284083211559E+00 3.9272328608678850E+00 3.9165581744746834E+00 3.9059043195108161E+00 + 3.8952712663759801E+00 3.8846589855002196E+00 3.8740674473438674E+00 3.8634966223975757E+00 3.8529464811822267E+00 + 3.8424169942489224E+00 3.8319081321788966E+00 3.8214198655835712E+00 3.8109521651044300E+00 3.8005050014130521E+00 + 3.7900783452110196E+00 3.7796721672299021E+00 3.7692864382312687E+00 3.7589211290065623E+00 3.7485762103771347E+00 + 3.7382516531941623E+00 3.7279474283386853E+00 3.7176635067214767E+00 3.7073998592830750E+00 3.6971564569937425E+00 + 3.6869332708533862E+00 3.6767302718915884E+00 3.6665474311674973E+00 3.6563847197698767E+00 3.6462421088170220E+00 + 3.6361195694566870E+00 3.6260170728661549E+00 3.6159345902521123E+00 3.6058720928506678E+00 3.5958295519272876E+00 + 3.5858069387767730E+00 3.5758042247232367E+00 3.5658213811200490E+00 3.5558583793498335E+00 3.5459151908244020E+00 + 3.5359917869847357E+00 3.5260881393009824E+00 3.5162042192723599E+00 3.5063399984271642E+00 3.4964954483227642E+00 + 3.4866705405454947E+00 3.4768652467106897E+00 3.4670795384626212E+00 3.4573133874744815E+00 3.4475667654483244E+00 + 3.4378396441150731E+00 3.4281319952344442E+00 3.4184437905949649E+00 3.4087750020138956E+00 3.3991256013372366E+00 + 3.3894955604396637E+00 3.3798848512245150E+00 3.3702934456237714E+00 3.3607213155979978E+00 3.3511684331363290E+00 + 3.3416347702564404E+00 3.3321202990045129E+00 3.3226249914552031E+00 3.3131488197115959E+00 3.3036917559052354E+00 + 3.2942537721959968E+00 3.2848348407721555E+00 3.2754349338502853E+00 3.2660540236752551E+00 3.2566920825202108E+00 + 3.2473490826865361E+00 3.2380249965038064E+00 3.2287197963297825E+00 3.2194334545503853E+00 3.2101659435796179E+00 + 3.2009172358596079E+00 3.1916873038605273E+00 3.1824761200805898E+00 3.1732836570459924E+00 3.1641098873109264E+00 + 3.1549547834575167E+00 3.1458183180957966E+00 3.1367004638637086E+00 3.1276011934270369E+00 3.1185204794793973E+00 + 3.1094582947422293E+00 3.1004146119647222E+00 3.0913894039238161E+00 3.0823826434241934E+00 3.0733943032981945E+00 + 3.0644243564058558E+00 3.0554727756348146E+00 3.0465395339003543E+00 3.0376246041453063E+00 3.0287279593400691E+00 + 3.0198495724825807E+00 3.0109894165982682E+00 3.0021474647400170E+00 2.9933236899881672E+00 2.9845180654504930E+00 + 2.9757305642621388E+00 2.9669611595856278E+00 2.9582098246108113E+00 2.9494765325548529E+00 2.9407612566622072E+00 + 2.9320639702045979E+00 2.9233846464809599E+00 2.9147232588174443E+00 2.9060797805673784E+00 2.8974541851112567E+00 + 2.8888464458566858E+00 2.8802565362383916E+00 2.8716844297181519E+00 2.8631300997848341E+00 2.8545935199542871E+00 + 2.8460746637693903E+00 2.8375735047999968E+00 2.8290900166428878E+00 2.8206241729217858E+00 2.8121759472873094E+00 + 2.8037453134169530E+00 2.7953322450150524E+00 2.7869367158127751E+00 2.7785586995680824E+00 2.7701981700657097E+00 + 2.7618551011171468E+00 2.7535294665606056E+00 2.7452212402609888E+00 2.7369303961098996E+00 2.7286569080255734E+00 + 2.7204007499528653E+00 2.7121618958632623E+00 2.7039403197547989E+00 2.6957359956520928E+00 2.6875488976062649E+00 + 2.6793789996949751E+00 2.6712262760223244E+00 2.6630907007189162E+00 2.6549722479417648E+00 2.6468708918742978E+00 + 2.6387866067263372E+00 2.6307193667340747E+00 2.6226691461600335E+00 2.6146359192930571E+00 2.6066196604482901E+00 + 2.5986203439671445E+00 2.5906379442172796E+00 2.5826724355925892E+00 2.5747237925131592E+00 2.5667919894252504E+00 + 2.5588770008013095E+00 2.5509788011398906E+00 2.5430973649656603E+00 2.5352326668293959E+00 2.5273846813079142E+00 + 2.5195533830041024E+00 2.5117387465468415E+00 2.5039407465910437E+00 2.4961593578175703E+00 2.4883945549332482E+00 + 2.4806463126708462E+00 2.4729146057890414E+00 2.4651994090723783E+00 2.4575006973312936E+00 2.4498184454020633E+00 + 2.4421526281467809E+00 2.4345032204533470E+00 2.4268701972354383E+00 2.4192535334324945E+00 2.4116532040096810E+00 + 2.4040691839579056E+00 2.3965014482937383E+00 2.3889499720594416E+00 2.3814147303229167E+00 2.3738956981777148E+00 + 2.3663928507429710E+00 2.3589061631634345E+00 2.3514356106093990E+00 2.3439811682767262E+00 2.3365428113867752E+00 + 2.3291205151864367E+00 2.3217142549480814E+00 2.3143240059695209E+00 2.3069497435740360E+00 2.2995914431103133E+00 + 2.2922490799524451E+00 2.2849226294999134E+00 2.2776120671775448E+00 2.2703173684355225E+00 2.2630385087493341E+00 + 2.2557754636197798E+00 2.2485282085729326E+00 2.2412967191601254E+00 2.2340809709579279E+00 2.2268809395681481E+00 + 2.2196966006177679E+00 2.2125279297589553E+00 2.2053749026690626E+00 2.1982374950505426E+00 2.1911156826310054E+00 + 2.1840094411631319E+00 2.1769187464247066E+00 2.1698435742185689E+00 2.1627839003725953E+00 2.1557397007396872E+00 + 2.1487109511977565E+00 2.1416976276496915E+00 2.1346997060233579E+00 2.1277171622715443E+00 2.1207499723719865E+00 + 2.1137981123273129E+00 2.1068615581650634E+00 2.0999402859376262E+00 2.0930342717222485E+00 2.0861434916210064E+00 + 2.0792679217607852E+00 2.0724075382932812E+00 2.0655623173949511E+00 2.0587322352670046E+00 2.0519172681354085E+00 + 2.0451173922508299E+00 2.0383325838886526E+00 2.0315628193489284E+00 2.0248080749563857E+00 2.0180683270603996E+00 + 2.0113435520349574E+00 2.0046337262786706E+00 1.9979388262147388E+00 1.9912588282909318E+00 1.9845937089795749E+00 + 1.9779434447775346E+00 1.9713080122061912E+00 1.9646873878114257E+00 1.9580815481636074E+00 1.9514904698575657E+00 + 1.9449141295125767E+00 1.9383525037723521E+00 1.9318055693050034E+00 1.9252733028030566E+00 1.9187556809833888E+00 + 1.9122526805872637E+00 1.9057642783802629E+00 1.8992904511522934E+00 1.8928311757175875E+00 1.8863864289146559E+00 + 1.8799561876062676E+00 1.8735404286794657E+00 1.8671391290455288E+00 1.8607522656399356E+00 1.8543798154223887E+00 + 1.8480217553767671E+00 1.8416780625111175E+00 1.8353487138576441E+00 1.8290336864726768E+00 1.8227329574366700E+00 + 1.8164465038541744E+00 1.8101743028538233E+00 1.8039163315883178E+00 1.7976725672344183E+00 1.7914429869929047E+00 + 1.7852275680885719E+00 1.7790262877702299E+00 1.7728391233106628E+00 1.7666660520066106E+00 1.7605070511787844E+00 + 1.7543620981718184E+00 1.7482311703542570E+00 1.7421142451185605E+00 1.7360112998810540E+00 1.7299223120819465E+00 + 1.7238472591852916E+00 1.7177861186789805E+00 1.7117388680747223E+00 1.7057054849080284E+00 1.6996859467381951E+00 + 1.6936802311482959E+00 1.6876883157451492E+00 1.6817101781593207E+00 1.6757457960450921E+00 1.6697951470804531E+00 + 1.6638582089670817E+00 1.6579349594303394E+00 1.6520253762192396E+00 1.6461294371064337E+00 1.6402471198882138E+00 + 1.6343784023844645E+00 1.6285232624386883E+00 1.6226816779179469E+00 1.6168536267128804E+00 1.6110390867376749E+00 + 1.6052380359300427E+00 1.5994504522512196E+00 1.5936763136859446E+00 1.5879155982424402E+00 1.5821682839524018E+00 + 1.5764343488709778E+00 1.5707137710767642E+00 1.5650065286717705E+00 1.5593125997814294E+00 1.5536319625545578E+00 + 1.5479645951633567E+00 1.5423104758033899E+00 1.5366695826935672E+00 1.5310418940761443E+00 1.5254273882166800E+00 + 1.5198260434040416E+00 1.5142378379503973E+00 1.5086627501911698E+00 1.5031007584850522E+00 1.4975518412139841E+00 + 1.4920159767831218E+00 1.4864931436208444E+00 1.4809833201787324E+00 1.4754864849315408E+00 1.4700026163772035E+00 + 1.4645316930368035E+00 1.4590736934545678E+00 1.4536285961978475E+00 1.4481963798571007E+00 1.4427770230458894E+00 + 1.4373705044008507E+00 1.4319768025816881E+00 1.4265958962711631E+00 1.4212277641750677E+00 1.4158723850222286E+00 + 1.4105297375644681E+00 1.4051998005766089E+00 1.3998825528564607E+00 1.3945779732247838E+00 1.3892860405253076E+00 + 1.3840067336246806E+00 1.3787400314124889E+00 1.3734859128012213E+00 1.3682443567262559E+00 1.3630153421458602E+00 + 1.3577988480411602E+00 1.3525948534161440E+00 1.3474033372976193E+00 1.3422242787352341E+00 1.3370576568014376E+00 + 1.3319034505914813E+00 1.3267616392233839E+00 1.3216322018379516E+00 1.3165151175987309E+00 1.3114103656920075E+00 + 1.3063179253267962E+00 1.3012377757348215E+00 1.2961698961705124E+00 1.2911142659109691E+00 1.2860708642559791E+00 + 1.2810396705279694E+00 1.2760206640720173E+00 1.2710138242558275E+00 1.2660191304697286E+00 1.2610365621266324E+00 + 1.2560660986620553E+00 1.2511077195340781E+00 1.2461614042233522E+00 1.2412271322330581E+00 1.2363048830889285E+00 + 1.2313946363392048E+00 1.2264963715546386E+00 1.2216100683284719E+00 1.2167357062764292E+00 1.2118732650366959E+00 + 1.2070227242699145E+00 1.2021840636591679E+00 1.1973572629099567E+00 1.1925423017501950E+00 1.1877391599302058E+00 + 1.1829478172226864E+00 1.1781682534227067E+00 1.1734004483477061E+00 1.1686443818374530E+00 1.1639000337540626E+00 + 1.1591673839819672E+00 1.1544464124278930E+00 1.1497370990208700E+00 1.1450394237122086E+00 1.1403533664754806E+00 + 1.1356789073065068E+00 1.1310160262233580E+00 1.1263647032663247E+00 1.1217249184979154E+00 1.1170966520028391E+00 + 1.1124798838879850E+00 1.1078745942824340E+00 1.1032807633374104E+00 1.0986983712262992E+00 1.0941273981446145E+00 + 1.0895678243099953E+00 1.0850196299621941E+00 1.0804827953630571E+00 1.0759573007965162E+00 1.0714431265685689E+00 + 1.0669402530072856E+00 1.0624486604627641E+00 1.0579683293071453E+00 1.0534992399345964E+00 1.0490413727612744E+00 + 1.0445947082253468E+00 1.0401592267869542E+00 1.0357349089282102E+00 1.0313217351531820E+00 1.0269196859878842E+00 + 1.0225287419802584E+00 1.0181488837001671E+00 1.0137800917393767E+00 1.0094223467115473E+00 1.0050756292522209E+00 + 1.0007399200188030E+00 9.9641519969056325E-01 9.9210144896860464E-01 9.8779864857586130E-01 9.8350677925709407E-01 + 9.7922582177885453E-01 9.7495575692950420E-01 9.7069656551916639E-01 9.6644822837974609E-01 9.6221072636489924E-01 + 9.5798404035001838E-01 9.5376815123223591E-01 9.4956303993039715E-01 9.4536868738505353E-01 9.4118507455844813E-01 + 9.3701218243450735E-01 9.3284999201882501E-01 9.2869848433865110E-01 9.2455764044287603E-01 9.2042744140203114E-01 + 9.1630786830825695E-01 9.1219890227530431E-01 9.0810052443851874E-01 9.0401271595482391E-01 8.9993545800272512E-01 + 8.9586873178227244E-01 8.9181251851507004E-01 8.8776679944424886E-01 8.8373155583446739E-01 8.7970676897188649E-01 + 8.7569242016417381E-01 8.7168849074046773E-01 8.6769496205139041E-01 8.6371181546902043E-01 8.5973903238688476E-01 + 8.5577659421994934E-01 8.5182448240459463E-01 8.4788267839862363E-01 8.4395116368123491E-01 8.4002991975301367E-01 + 8.3611892813592126E-01 8.3221817037328827E-01 8.2832762802978943E-01 8.2444728269144096E-01 8.2057711596558991E-01 + 8.1671710948089227E-01 8.1286724488731776E-01 8.0902750385611599E-01 8.0519786807982852E-01 8.0137831927225323E-01 + 7.9756883916845200E-01 7.9376940952472419E-01 7.8998001211860602E-01 7.8620062874885321E-01 7.8243124123542518E-01 + 7.7867183141948104E-01 7.7492238116336531E-01 7.7118287235059046E-01 7.6745328688583458E-01 7.6373360669492096E-01 + 7.6002381372481143E-01 7.5632388994359001E-01 7.5263381734045753E-01 7.4895357792571426E-01 7.4528315373074938E-01 + 7.4162252680803065E-01 7.3797167923109042E-01 7.3433059309451876E-01 7.3069925051394102E-01 7.2707763362602307E-01 + 7.2346572458843916E-01 7.1986350557987933E-01 7.1627095880002034E-01 7.1268806646953131E-01 7.0911481083004424E-01 + 7.0555117414415836E-01 7.0199713869541802E-01 6.9845268678830796E-01 6.9491780074822862E-01 6.9139246292150136E-01 + 6.8787665567535006E-01 6.8437036139788299E-01 6.8087356249808928E-01 6.7738624140582593E-01 6.7390838057180236E-01 + 6.7043996246757065E-01 6.6698096958551933E-01 6.6353138443885074E-01 6.6009118956158075E-01 6.5666036750851486E-01 + 6.5323890085525260E-01 6.4982677219815921E-01 6.4642396415436765E-01 6.4303045936175351E-01 6.3964624047894170E-01 + 6.3627129018527262E-01 6.3290559118081058E-01 6.2954912618632253E-01 6.2620187794326143E-01 6.2286382921376826E-01 + 6.1953496278064912E-01 6.1621526144737038E-01 6.1290470803804076E-01 6.0960328539740793E-01 6.0631097639083864E-01 + 6.0302776390431390E-01 5.9975363084441335E-01 5.9648856013830509E-01 5.9323253473373116E-01 5.8998553759900618E-01 + 5.8674755172299209E-01 5.8351856011509395E-01 5.8029854580525342E-01 5.7708749184392194E-01 5.7388538130206834E-01 + 5.7069219727114917E-01 5.6750792286311469E-01 5.6433254121037990E-01 5.6116603546582799E-01 5.5800838880278991E-01 + 5.5485958441503747E-01 5.5171960551676580E-01 5.4858843534259027E-01 5.4546605714752960E-01 5.4235245420699696E-01 + 5.3924760981678377E-01 5.3615150729305439E-01 5.3306412997233232E-01 5.2998546121148737E-01 5.2691548438772329E-01 + 5.2385418289857488E-01 5.2080154016188329E-01 5.1775753961579252E-01 5.1472216471874166E-01 5.1169539894944338E-01 + 5.0867722580687846E-01 5.0566762881028782E-01 5.0266659149915072E-01 4.9967409743318564E-01 4.9669013019232994E-01 + 4.9371467337673042E-01 4.9074771060673478E-01 4.8778922552287834E-01 4.8483920178587170E-01 4.8189762307659179E-01 + 4.7896447309606566E-01 4.7603973556546564E-01 4.7312339422609467E-01 4.7021543283937151E-01 4.6731583518682956E-01 + 4.6442458507009149E-01 4.6154166631087079E-01 4.5866706275094998E-01 4.5580075825217653E-01 4.5294273669645102E-01 + 4.5009298198570902E-01 4.4725147804191800E-01 4.4441820880706234E-01 4.4159315824312817E-01 4.3877631033210041E-01 + 4.3596764907594698E-01 4.3316715849660192E-01 4.3037482263596533E-01 4.2759062555588395E-01 4.2481455133813945E-01 + 4.2204658408444362E-01 4.1928670791642098E-01 4.1653490697560008E-01 4.1379116542340139E-01 4.1105546744112420E-01 + 4.0832779722994084E-01 4.0560813901087905E-01 4.0289647702481124E-01 4.0019279553245146E-01 3.9749707881433149E-01 + 3.9480931117079870E-01 3.9212947692199968E-01 3.8945756040787444E-01 3.8679354598813709E-01 3.8413741804227347E-01 + 3.8148916096952012E-01 3.7884875918886496E-01 3.7621619713902038E-01 3.7359145927842830E-01 3.7097453008523695E-01 + 3.6836539405729585E-01 3.6576403571213989E-01 3.6317043958698192E-01 3.6058459023870060E-01 3.5800647224382653E-01 + 3.5543607019853424E-01 3.5287336871862784E-01 3.5031835243953241E-01 3.4777100601628086E-01 3.4523131412350161E-01 + 3.4269926145541302E-01 3.4017483272580357E-01 3.3765801266802498E-01 3.3514878603498299E-01 3.3264713759912212E-01 + 3.3015305215241442E-01 3.2766651450635320E-01 3.2518750949193276E-01 3.2271602195964744E-01 3.2025203677947239E-01 + 3.1779553884085421E-01 3.1534651305270139E-01 3.1290494434337174E-01 3.1047081766066154E-01 3.0804411797179221E-01 + 3.0562483026340109E-01 3.0321293954153034E-01 3.0080843083161396E-01 2.9841128917846693E-01 2.9602149964627433E-01 + 2.9363904731858037E-01 2.9126391729827533E-01 2.8889609470758459E-01 2.8653556468805891E-01 2.8418231240056291E-01 + 2.8183632302526085E-01 2.7949758176160738E-01 2.7716607382833847E-01 2.7484178446345353E-01 2.7252469892421122E-01 + 2.7021480248711244E-01 2.6791208044789333E-01 2.6561651812151221E-01 2.6332810084213421E-01 2.6104681396312757E-01 + 2.5877264285704604E-01 2.5650557291562076E-01 2.5424558954974591E-01 2.5199267818947169E-01 2.4974682428398820E-01 + 2.4750801330161720E-01 2.4527623072979890E-01 2.4305146207508263E-01 2.4083369286311118E-01 2.3862290863861704E-01 + 2.3641909496540184E-01 2.3422223742633061E-01 2.3203232162332060E-01 2.2984933317732659E-01 2.2767325772833083E-01 + 2.2550408093533350E-01 2.2334178847633951E-01 2.2118636604834538E-01 2.1903779936733236E-01 2.1689607416824946E-01 + 2.1476117620500676E-01 2.1263309125046168E-01 2.1051180509640766E-01 2.0839730355356226E-01 2.0628957245155830E-01 + 2.0418859763892797E-01 2.0209436498309613E-01 2.0000686037036403E-01 1.9792606970590221E-01 1.9585197891373729E-01 + 1.9378457393673840E-01 1.9172384073660920E-01 1.8966976529387580E-01 1.8762233360787192E-01 1.8558153169672992E-01 + 1.8354734559737179E-01 1.8151976136549275E-01 1.7949876507555196E-01 1.7748434282076234E-01 1.7547648071307700E-01 + 1.7347516488317866E-01 1.7148038148046735E-01 1.6949211667305000E-01 1.6751035664772876E-01 1.6553508760998861E-01 + 1.6356629578398660E-01 1.6160396741253988E-01 1.5964808875711492E-01 1.5769864609781403E-01 1.5575562573336652E-01 + 1.5381901398111422E-01 1.5188879717700354E-01 1.4996496167556989E-01 1.4804749384993005E-01 1.4613638009176683E-01 + 1.4423160681131947E-01 1.4233316043737354E-01 1.4044102741724529E-01 1.3855519421677498E-01 1.3667564732030990E-01 + 1.3480237323069919E-01 1.3293535846927526E-01 1.3107458957584767E-01 1.2922005310868928E-01 1.2737173564452384E-01 + 1.2552962377851687E-01 1.2369370412426181E-01 1.2186396331376800E-01 1.2004038799745279E-01 1.1822296484412478E-01 + 1.1641168054097625E-01 1.1460652179357006E-01 1.1280747532582616E-01 1.1101452788001372E-01 1.0922766621673705E-01 + 1.0744687711492330E-01 1.0567214737181260E-01 1.0390346380294635E-01 1.0214081324215349E-01 1.0038418254154145E-01 + 9.8633558571481386E-02 9.6888928220601245E-02 9.5150278395768395E-02 9.3417596022081439E-02 9.1690868042858392E-02 + 8.9970081419624648E-02 8.8255223132098673E-02 8.6546280178185803E-02 8.4843239573961129E-02 8.3146088353660108E-02 + 8.1454813569667578E-02 7.9769402292504080E-02 7.8089841610817001E-02 7.6416118631364160E-02 7.4748220479007685E-02 + 7.3086134296697094E-02 7.1429847245461864E-02 6.9779346504397280E-02 6.8134619270651481E-02 6.6495652759417850E-02 + 6.4862434203918795E-02 6.3234950855396890E-02 6.1613189983101592E-02 5.9997138874278017E-02 5.8386784834155436E-02 + 5.6782115185934345E-02 5.5183117270776461E-02 5.3589778447791045E-02 5.2002086094023889E-02 5.0420027604446027E-02 + 4.8843590391940729E-02 4.7272761887293145E-02 4.5707529539177658E-02 4.4147880814144946E-02 4.2593803196612483E-02 + 4.1045284188849868E-02 3.9502311310970810E-02 3.7964872100916813E-02 3.6432954114448877E-02 3.4906544925133613E-02 + 3.3385632124332057E-02 3.1870203321187854E-02 3.0360246142615104E-02 2.8855748233286200E-02 2.7356697255621686E-02 + 2.5863080889775621E-02 2.4374886833624924E-02 2.2892102802759086E-02 2.1414716530465085E-02 1.9942715767718094E-02 + 1.8476088283167807E-02 1.7014821863128315E-02 1.5558904311564002E-02 1.4108323450079622E-02 1.2663067117907014E-02 + 1.1223123171892654E-02 9.7884794864886212E-03 8.3591239537371079E-03 6.9350444832597018E-03 5.5162290022469744E-03 + 4.1026654554437705E-03 2.6943418051398999E-03 1.2912460311559298E-03 -1.0663386916743091E-04 -1.4993098809824412E-03 +-2.8867939719449090E-03 -4.2690980922277912E-03 -5.6462341745313607E-03 -7.0182141340972889E-03 -8.3850498687195272E-03 +-9.7467532587558643E-03 -1.1103336167141840E-02 -1.2454810439400046E-02 -1.3801187903654833E-02 -1.5142480370643507E-02 +-1.6478699633726696E-02 -1.7809857468903553E-02 -1.9135965634821069E-02 -2.0457035872787507E-02 -2.1773079906785058E-02 +-2.3084109443479606E-02 -2.4390136172234785E-02 -2.5691171765125465E-02 -2.6987227876945193E-02 -2.8278316145222963E-02 +-2.9564448190233832E-02 -3.0845635615009206E-02 -3.2121890005351247E-02 -3.3393222929845423E-02 -3.4659645939869692E-02 +-3.5921170569609938E-02 -3.7177808336069817E-02 -3.8429570739084061E-02 -3.9676469261330699E-02 -4.0918515368342304E-02 +-4.2155720508518887E-02 -4.3388096113140394E-02 -4.4615653596378889E-02 -4.5838404355308879E-02 -4.7056359769922333E-02 +-4.8269531203138615E-02 -4.9477930000818751E-02 -5.0681567491775506E-02 -5.1880454987786817E-02 -5.3074603783607864E-02 +-5.4264025156984176E-02 -5.5448730368661749E-02 -5.6628730662400720E-02 -5.7804037264988804E-02 -5.8974661386250092E-02 +-6.0140614219060806E-02 -6.1301906939360266E-02 -6.2458550706161360E-02 -6.3610556661567522E-02 -6.4757935930779512E-02 +-6.5900699622111078E-02 -6.7038858827000558E-02 -6.8172424620022820E-02 -6.9301408058902558E-02 -7.0425820184524437E-02 +-7.1545672020948192E-02 -7.2660974575419118E-02 -7.3771738838380743E-02 -7.4877975783487705E-02 -7.5979696367616881E-02 +-7.7076911530881892E-02 -7.8169632196643052E-02 -7.9257869271521272E-02 -8.0341633645409513E-02 -8.1420936191487020E-02 +-8.2495787766228845E-02 -8.3566199209419934E-02 -8.4632181344168000E-02 -8.5693744976914829E-02 -8.6750900897449204E-02 +-8.7803659878918389E-02 -8.8852032677842363E-02 -8.9896030034124857E-02 -9.0935662671066300E-02 -9.1970941295375475E-02 +-9.3001876597183619E-02 -9.4028479250054739E-02 -9.5050759910999733E-02 -9.6068729220488119E-02 -9.7082397802461126E-02 +-9.8091776264342734E-02 -9.9096875197053791E-02 -1.0009770517502364E-01 -1.0109427675620275E-01 -1.0208660048207478E-01 +-1.0307468687767049E-01 -1.0405854645157799E-01 -1.0503818969595782E-01 -1.0601362708655268E-01 -1.0698486908270265E-01 +-1.0795192612735691E-01 -1.0891480864708375E-01 -1.0987352705208643E-01 -1.1082809173621490E-01 -1.1177851307697810E-01 +-1.1272480143555527E-01 -1.1366696715681052E-01 -1.1460502056930266E-01 -1.1553897198530212E-01 -1.1646883170079970E-01 +-1.1739460999552036E-01 -1.1831631713293625E-01 -1.1923396336027856E-01 -1.2014755890854976E-01 -1.2105711399253873E-01 +-1.2196263881083061E-01 -1.2286414354581918E-01 -1.2376163836372334E-01 -1.2465513341459401E-01 -1.2554463883233286E-01 +-1.2643016473469865E-01 -1.2731172122332554E-01 -1.2818931838373301E-01 -1.2906296628533737E-01 -1.2993267498146677E-01 +-1.3079845450937383E-01 -1.3166031489024560E-01 -1.3251826612921991E-01 -1.3337231821539469E-01 -1.3422248112184260E-01 +-1.3506876480562360E-01 -1.3591117920779722E-01 -1.3674973425343515E-01 -1.3758443985163452E-01 -1.3841530589553003E-01 +-1.3924234226230622E-01 -1.4006555881321214E-01 -1.4088496539357220E-01 -1.4170057183279880E-01 -1.4251238794440763E-01 +-1.4332042352602634E-01 -1.4412468835941097E-01 -1.4492519221045633E-01 -1.4572194482921044E-01 -1.4651495594988706E-01 +-1.4730423529087558E-01 -1.4808979255475860E-01 -1.4887163742832052E-01 -1.4964977958256401E-01 -1.5042422867271849E-01 +-1.5119499433825720E-01 -1.5196208620290763E-01 -1.5272551387466327E-01 -1.5348528694580027E-01 -1.5424141499288668E-01 +-1.5499390757679599E-01 -1.5574277424272170E-01 -1.5648802452018834E-01 -1.5722966792306522E-01 -1.5796771394957806E-01 +-1.5870217208232426E-01 -1.5943305178828232E-01 -1.6016036251882873E-01 -1.6088411370974681E-01 -1.6160431478124304E-01 +-1.6232097513795737E-01 -1.6303410416897698E-01 -1.6374371124785009E-01 -1.6444980573259818E-01 -1.6515239696572781E-01 +-1.6585149427424478E-01 -1.6654710696966674E-01 -1.6723924434803711E-01 -1.6792791568993526E-01 -1.6861313026049232E-01 +-1.6929489730940228E-01 -1.6997322607093623E-01 -1.7064812576395408E-01 -1.7131960559191886E-01 -1.7198767474290638E-01 +-1.7265234238962468E-01 -1.7331361768942008E-01 -1.7397150978429221E-01 -1.7462602780091122E-01 -1.7527718085062441E-01 +-1.7592497802947277E-01 -1.7656942841820483E-01 -1.7721054108228515E-01 -1.7784832507191289E-01 -1.7848278942203166E-01 +-1.7911394315234150E-01 -1.7974179526731507E-01 -1.8036635475620788E-01 -1.8098763059307404E-01 -1.8160563173677569E-01 +-1.8222036713099921E-01 -1.8283184570426669E-01 -1.8344007636994958E-01 -1.8404506802627971E-01 -1.8464682955636716E-01 +-1.8524536982820841E-01 -1.8584069769470069E-01 -1.8643282199365591E-01 -1.8702175154781439E-01 -1.8760749516485520E-01 +-1.8819006163741250E-01 -1.8876945974308570E-01 -1.8934569824445460E-01 -1.8991878588909183E-01 -1.9048873140957490E-01 +-1.9105554352350088E-01 -1.9161923093349922E-01 -1.9217980232724358E-01 -1.9273726637746563E-01 -1.9329163174196998E-01 +-1.9384290706364371E-01 -1.9439110097047235E-01 -1.9493622207555236E-01 -1.9547827897710318E-01 -1.9601728025848075E-01 +-1.9655323448819370E-01 -1.9708615021991055E-01 -1.9761603599247790E-01 -1.9814290032993073E-01 -1.9866675174150861E-01 +-1.9918759872166406E-01 -1.9970544975008081E-01 -2.0022031329168327E-01 -2.0073219779665291E-01 -2.0124111170043690E-01 +-2.0174706342376647E-01 -2.0225006137266541E-01 -2.0275011393846765E-01 -2.0324722949782711E-01 -2.0374141641273197E-01 +-2.0423268303051823E-01 -2.0472103768388289E-01 -2.0520648869089625E-01 -2.0568904435501581E-01 -2.0616871296510039E-01 +-2.0664550279542077E-01 -2.0711942210567538E-01 -2.0759047914100359E-01 -2.0805868213199649E-01 -2.0852403929471161E-01 +-2.0898655883068809E-01 -2.0944624892695513E-01 -2.0990311775605186E-01 -2.1035717347603242E-01 -2.1080842423048782E-01 +-2.1125687814855135E-01 -2.1170254334491923E-01 -2.1214542791985586E-01 -2.1258553995921511E-01 -2.1302288753444787E-01 +-2.1345747870261897E-01 -2.1388932150641579E-01 -2.1431842397416753E-01 -2.1474479411985381E-01 -2.1516843994312035E-01 +-2.1558936942929161E-01 -2.1600759054938312E-01 -2.1642311126011632E-01 -2.1683593950393243E-01 -2.1724608320900274E-01 +-2.1765355028924413E-01 -2.1805834864433182E-01 -2.1846048615971483E-01 -2.1885997070662447E-01 -2.1925681014209142E-01 +-2.1965101230895998E-01 -2.2004258503589647E-01 -2.2043153613740821E-01 -2.2081787341385423E-01 -2.2120160465145630E-01 +-2.2158273762231681E-01 -2.2196128008443017E-01 -2.2233723978169370E-01 -2.2271062444392556E-01 -2.2308144178687447E-01 +-2.2344969951223551E-01 -2.2381540530766092E-01 -2.2417856684677614E-01 -2.2453919178919129E-01 -2.2489728778051499E-01 +-2.2525286245236870E-01 -2.2560592342239963E-01 -2.2595647829429158E-01 -2.2630453465778261E-01 -2.2665010008867631E-01 +-2.2699318214885461E-01 -2.2733378838629134E-01 -2.2767192633506761E-01 -2.2800760351538277E-01 -2.2834082743356859E-01 +-2.2867160558210398E-01 -2.2899994543962437E-01 -2.2932585447094159E-01 -2.2964934012705160E-01 -2.2997040984515066E-01 +-2.3028907104864843E-01 -2.3060533114717899E-01 -2.3091919753661846E-01 -2.3123067759909594E-01 -2.3153977870300613E-01 +-2.3184650820302596E-01 -2.3215087344012422E-01 -2.3245288174157741E-01 -2.3275254042098245E-01 -2.3304985677826873E-01 +-2.3334483809971637E-01 -2.3363749165796424E-01 -2.3392782471202345E-01 -2.3421584450729810E-01 -2.3450155827558808E-01 +-2.3478497323511183E-01 -2.3506609659051245E-01 -2.3534493553287794E-01 -2.3562149723974965E-01 -2.3589578887513815E-01 +-2.3616781758953415E-01 -2.3643759051992563E-01 -2.3670511478980966E-01 -2.3697039750920432E-01 -2.3723344577466429E-01 +-2.3749426666929377E-01 -2.3775286726275982E-01 -2.3800925461130551E-01 -2.3826343575776335E-01 -2.3851541773156959E-01 +-2.3876520754877803E-01 -2.3901281221207210E-01 -2.3925823871077778E-01 -2.3950149402088095E-01 -2.3974258510503552E-01 +-2.3998151891258204E-01 -2.4021830237955646E-01 -2.4045294242870932E-01 -2.4068544596951191E-01 -2.4091581989817740E-01 +-2.4114407109766900E-01 -2.4137020643771481E-01 -2.4159423277482345E-01 -2.4181615695229455E-01 -2.4203598580023408E-01 +-2.4225372613556814E-01 -2.4246938476205376E-01 -2.4268296847029738E-01 -2.4289448403776259E-01 -2.4310393822878809E-01 +-2.4331133779459926E-01 -2.4351668947332145E-01 -2.4371999998999599E-01 -2.4392127605659017E-01 -2.4412052437201151E-01 +-2.4431775162212596E-01 -2.4451296447976420E-01 -2.4470616960473937E-01 -2.4489737364386105E-01 -2.4508658323094801E-01 +-2.4527380498683959E-01 -2.4545904551941233E-01 -2.4564231142359330E-01 -2.4582360928137004E-01 -2.4600294566180853E-01 +-2.4618032712106511E-01 -2.4635576020239908E-01 -2.4652925143618765E-01 -2.4670080733993788E-01 -2.4687043441830253E-01 +-2.4703813916309184E-01 -2.4720392805328678E-01 -2.4736780755505483E-01 -2.4752978412176074E-01 -2.4768986419398306E-01 +-2.4784805419952499E-01 -2.4800436055342842E-01 -2.4815878965799038E-01 -2.4831134790277173E-01 -2.4846204166461675E-01 +-2.4861087730765902E-01 -2.4875786118334370E-01 -2.4890299963043308E-01 -2.4904629897502606E-01 -2.4918776553056896E-01 +-2.4932740559787020E-01 -2.4946522546511057E-01 -2.4960123140786289E-01 -2.4973542968910017E-01 -2.4986782655921211E-01 +-2.4999842825601734E-01 -2.5012724100477762E-01 -2.5025427101821157E-01 -2.5037952449650680E-01 -2.5050300762733668E-01 +-2.5062472658587004E-01 -2.5074468753478696E-01 -2.5086289662429184E-01 -2.5097935999212861E-01 -2.5109408376359016E-01 +-2.5120707405153819E-01 -2.5131833695640898E-01 -2.5142787856623533E-01 -2.5153570495665178E-01 -2.5164182219091585E-01 +-2.5174623631991810E-01 -2.5184895338219315E-01 -2.5194997940393771E-01 -2.5204932039902250E-01 -2.5214698236900590E-01 +-2.5224297130314610E-01 -2.5233729317841735E-01 -2.5242995395952172E-01 -2.5252095959890225E-01 -2.5261031603675949E-01 +-2.5269802920106055E-01 -2.5278410500755660E-01 -2.5286854935979519E-01 -2.5295136814913316E-01 -2.5303256725475032E-01 +-2.5311215254366504E-01 -2.5319012987074418E-01 -2.5326650507872084E-01 -2.5334128399820377E-01 -2.5341447244769583E-01 +-2.5348607623360125E-01 -2.5355610115024563E-01 -2.5362455297988667E-01 -2.5369143749272538E-01 -2.5375676044692408E-01 +-2.5382052758861778E-01 -2.5388274465192806E-01 -2.5394341735897558E-01 -2.5400255141989520E-01 -2.5406015253284991E-01 +-2.5411622638404252E-01 -2.5417077864773013E-01 -2.5422381498623831E-01 -2.5427534104997379E-01 -2.5432536247744036E-01 +-2.5437388489524831E-01 -2.5442091391813021E-01 -2.5446645514895699E-01 -2.5451051417874648E-01 -2.5455309658668190E-01 +-2.5459420794012039E-01 -2.5463385379461295E-01 -2.5467203969391078E-01 -2.5470877116998508E-01 -2.5474405374303732E-01 +-2.5477789292151487E-01 -2.5481029420211959E-01 -2.5484126306982896E-01 -2.5487080499790410E-01 -2.5489892544790504E-01 +-2.5492562986970563E-01 -2.5495092370150391E-01 -2.5497481236983915E-01 -2.5499730128960268E-01 -2.5501839586405273E-01 +-2.5503810148482986E-01 -2.5505642353196650E-01 -2.5507336737390240E-01 -2.5508893836750063E-01 -2.5510314185805621E-01 +-2.5511598317931533E-01 -2.5512746765348260E-01 -2.5513760059124146E-01 -2.5514638729176120E-01 -2.5515383304271660E-01 +-2.5515994312029544E-01 -2.5516472278921704E-01 -2.5516817730274416E-01 -2.5517031190269523E-01 -2.5517113181945961E-01 +-2.5517064227201047E-01 -2.5516884846791799E-01 -2.5516575560336369E-01 -2.5516136886315322E-01 -2.5515569342073163E-01 +-2.5514873443819364E-01 -2.5514049706630038E-01 -2.5513098644449062E-01 -2.5512020770089788E-01 -2.5510816595235897E-01 +-2.5509486630442990E-01 -2.5508031385140234E-01 -2.5506451367631122E-01 -2.5504747085095425E-01 -2.5502919043589978E-01 +-2.5500967748050490E-01 -2.5498893702292857E-01 -2.5496697409014069E-01 -2.5494379369794073E-01 -2.5491940085096970E-01 +-2.5489380054272287E-01 -2.5486699775556237E-01 -2.5483899746073391E-01 -2.5480980461837766E-01 -2.5477942417754251E-01 +-2.5474786107619973E-01 -2.5471512024125720E-01 -2.5468120658857135E-01 -2.5464612502296124E-01 -2.5460988043822214E-01 +-2.5457247771713976E-01 -2.5453392173150408E-01 -2.5449421734211908E-01 -2.5445336939882257E-01 -2.5441138274049341E-01 +-2.5436826219506986E-01 -2.5432401257955950E-01 -2.5427863870005485E-01 -2.5423214535174771E-01 -2.5418453731893770E-01 +-2.5413581937505275E-01 -2.5408599628265743E-01 -2.5403507279346837E-01 -2.5398305364836854E-01 -2.5392994357741688E-01 +-2.5387574729986701E-01 -2.5382046952417670E-01 -2.5376411494802542E-01 -2.5370668825832282E-01 -2.5364819413122519E-01 +-2.5358863723214797E-01 -2.5352802221578052E-01 -2.5346635372609905E-01 -2.5340363639637858E-01 -2.5333987484920695E-01 +-2.5327507369650171E-01 -2.5320923753951663E-01 -2.5314237096886344E-01 -2.5307447856451726E-01 -2.5300556489583587E-01 +-2.5293563452157120E-01 -2.5286469198988321E-01 -2.5279274183834932E-01 -2.5271978859398508E-01 -2.5264583677325253E-01 +-2.5257089088207429E-01 -2.5249495541584882E-01 -2.5241803485946146E-01 -2.5234013368729941E-01 -2.5226125636326480E-01 +-2.5218140734078820E-01 -2.5210059106284016E-01 -2.5201881196195036E-01 -2.5193607446021271E-01 -2.5185238296930434E-01 +-2.5176774189049933E-01 -2.5168215561467822E-01 -2.5159562852234352E-01 -2.5150816498363554E-01 -2.5141976935834065E-01 +-2.5133044599590937E-01 -2.5124019923546731E-01 -2.5114903340582828E-01 -2.5105695282550866E-01 -2.5096396180274111E-01 +-2.5087006463548694E-01 -2.5077526561144992E-01 -2.5067956900808958E-01 -2.5058297909263411E-01 -2.5048550012209470E-01 +-2.5038713634327808E-01 -2.5028789199280033E-01 -2.5018777129709979E-01 -2.5008677847245075E-01 -2.4998491772497586E-01 +-2.4988219325066230E-01 -2.4977860923537057E-01 -2.4967416985485169E-01 -2.4956887927475968E-01 -2.4946274165066193E-01 +-2.4935576112805816E-01 -2.4924794184238738E-01 -2.4913928791904613E-01 -2.4902980347340017E-01 -2.4891949261079535E-01 +-2.4880835942657567E-01 -2.4869640800609227E-01 -2.4858364242471950E-01 -2.4847006674786720E-01 -2.4835568503099170E-01 +-2.4824050131961384E-01 -2.4812451964932811E-01 -2.4800774404581935E-01 -2.4789017852487311E-01 -2.4777182709238876E-01 +-2.4765269374439589E-01 -2.4753278246706356E-01 -2.4741209723671848E-01 -2.4729064201985340E-01 -2.4716842077314133E-01 +-2.4704543744345306E-01 -2.4692169596786326E-01 -2.4679720027367139E-01 -2.4667195427840716E-01 -2.4654596188985092E-01 +-2.4641922700604255E-01 -2.4629175351529439E-01 -2.4616354529620751E-01 -2.4603460621768294E-01 -2.4590494013893469E-01 +-2.4577455090950348E-01 -2.4564344236926947E-01 -2.4551161834846691E-01 -2.4537908266769504E-01 -2.4524583913793302E-01 +-2.4511189156055249E-01 -2.4497724372733062E-01 -2.4484189942046233E-01 -2.4470586241257777E-01 -2.4456913646674908E-01 +-2.4443172533650681E-01 -2.4429363276585558E-01 -2.4415486248928195E-01 -2.4401541823177186E-01 -2.4387530370882016E-01 +-2.4373452262644846E-01 -2.4359307868121252E-01 -2.4345097556022019E-01 -2.4330821694114260E-01 -2.4316480649222699E-01 +-2.4302074787230929E-01 -2.4287604473082877E-01 -2.4273070070784133E-01 -2.4258471943403032E-01 -2.4243810453072143E-01 +-2.4229085960989546E-01 -2.4214298827420086E-01 -2.4199449411696866E-01 -2.4184538072222203E-01 -2.4169565166469326E-01 +-2.4154531050983216E-01 -2.4139436081382595E-01 -2.4124280612360532E-01 -2.4109064997686003E-01 -2.4093789590205522E-01 +-2.4078454741843835E-01 -2.4063060803605713E-01 -2.4047608125577208E-01 -2.4032097056926455E-01 -2.4016527945905686E-01 +-2.4000901139852110E-01 -2.3985216985189131E-01 -2.3969475827428005E-01 -2.3953678011168891E-01 -2.3937823880102194E-01 +-2.3921913777009821E-01 -2.3905948043766645E-01 -2.3889927021341578E-01 -2.3873851049799047E-01 -2.3857720468300095E-01 +-2.3841535615104037E-01 -2.3825296827569317E-01 -2.3809004442155082E-01 -2.3792658794422308E-01 -2.3776260219035358E-01 +-2.3759809049762909E-01 -2.3743305619479657E-01 -2.3726750260167070E-01 -2.3710143302915312E-01 -2.3693485077924017E-01 +-2.3676775914503839E-01 -2.3660016141077714E-01 -2.3643206085182139E-01 -2.3626346073468266E-01 -2.3609436431703526E-01 +-2.3592477484772736E-01 -2.3575469556679321E-01 -2.3558412970546755E-01 -2.3541308048619761E-01 -2.3524155112265555E-01 +-2.3506954481975151E-01 -2.3489706477364866E-01 -2.3472411417177266E-01 -2.3455069619282526E-01 -2.3437681400679861E-01 +-2.3420247077498862E-01 -2.3402766965000363E-01 -2.3385241377578281E-01 -2.3367670628760395E-01 -2.3350055031209990E-01 +-2.3332394896726885E-01 -2.3314690536248978E-01 -2.3296942259853079E-01 -2.3279150376756741E-01 -2.3261315195319185E-01 +-2.3243437023042604E-01 -2.3225516166573545E-01 -2.3207552931704201E-01 -2.3189547623373347E-01 -2.3171500545668058E-01 +-2.3153412001824925E-01 -2.3135282294231019E-01 -2.3117111724425404E-01 -2.3098900593100341E-01 -2.3080649200102588E-01 +-2.3062357844434536E-01 -2.3044026824255870E-01 -2.3025656436884237E-01 -2.3007246978797113E-01 -2.2988798745632505E-01 +-2.2970312032190812E-01 -2.2951787132435528E-01 -2.2933224339494962E-01 -2.2914623945663073E-01 -2.2895986242401201E-01 +-2.2877311520338967E-01 -2.2858600069275795E-01 -2.2839852178181730E-01 -2.2821068135199338E-01 -2.2802248227644514E-01 +-2.2783392742007874E-01 -2.2764501963956024E-01 -2.2745576178332721E-01 -2.2726615669160341E-01 -2.2707620719640847E-01 +-2.2688591612157497E-01 -2.2669528628275487E-01 -2.2650432048743618E-01 -2.2631302153495639E-01 -2.2612139221651148E-01 +-2.2592943531516993E-01 -2.2573715360588786E-01 -2.2554454985551622E-01 -2.2535162682281831E-01 -2.2515838725848089E-01 +-2.2496483390512351E-01 -2.2477096949731584E-01 -2.2457679676158818E-01 -2.2438231841644068E-01 -2.2418753717236245E-01 +-2.2399245573183788E-01 -2.2379707678936345E-01 -2.2360140303145640E-01 -2.2340543713667127E-01 -2.2320918177560856E-01 +-2.2301263961092951E-01 -2.2281581329736694E-01 -2.2261870548174065E-01 -2.2242131880296587E-01 -2.2222365589206752E-01 +-2.2202571937219401E-01 -2.2182751185862751E-01 -2.2162903595879571E-01 -2.2143029427228880E-01 -2.2123128939086503E-01 +-2.2103202389846910E-01 -2.2083250037124216E-01 -2.2063272137753165E-01 -2.2043268947790831E-01 -2.2023240722517617E-01 +-2.2003187716438460E-01 -2.1983110183284008E-01 -2.1963008376012058E-01 -2.1942882546808684E-01 -2.1922732947089399E-01 +-2.1902559827500476E-01 -2.1882363437920099E-01 -2.1862144027459773E-01 -2.1841901844465320E-01 -2.1821637136518132E-01 +-2.1801350150436508E-01 -2.1781041132276963E-01 -2.1760710327335231E-01 -2.1740357980147493E-01 -2.1719984334491904E-01 +-2.1699589633389349E-01 -2.1679174119105216E-01 -2.1658738033149999E-01 -2.1638281616281044E-01 -2.1617805108503588E-01 +-2.1597308749071872E-01 -2.1576792776490389E-01 -2.1556257428515210E-01 -2.1535702942155174E-01 -2.1515129553673051E-01 +-2.1494537498586749E-01 -2.1473927011670554E-01 -2.1453298326956421E-01 -2.1432651677735037E-01 -2.1411987296557106E-01 +-2.1391305415234554E-01 -2.1370606264841874E-01 -2.1349890075717098E-01 -2.1329157077463007E-01 -2.1308407498948739E-01 +-2.1287641568310461E-01 -2.1266859512952835E-01 -2.1246061559550339E-01 -2.1225247934048383E-01 -2.1204418861664165E-01 +-2.1183574566888588E-01 -2.1162715273486654E-01 -2.1141841204499415E-01 -2.1120952582244626E-01 -2.1100049628318210E-01 +-2.1079132563595412E-01 -2.1058201608231966E-01 -2.1037256981665289E-01 -2.1016298902615696E-01 -2.0995327589087670E-01 +-2.0974343258370862E-01 -2.0953346127041539E-01 -2.0932336410963570E-01 -2.0911314325289634E-01 -2.0890280084462720E-01 +-2.0869233902216855E-01 -2.0848175991578516E-01 -2.0827106564868009E-01 -2.0806025833700220E-01 -2.0784934008986247E-01 +-2.0763831300934418E-01 -2.0742717919051198E-01 -2.0721594072142907E-01 -2.0700459968316587E-01 -2.0679315814981028E-01 +-2.0658161818848375E-01 -2.0636998185934993E-01 -2.0615825121562795E-01 -2.0594642830360332E-01 -2.0573451516264024E-01 +-2.0552251382519396E-01 -2.0531042631682075E-01 -2.0509825465619194E-01 -2.0488600085510419E-01 -2.0467366691849095E-01 +-2.0446125484443725E-01 -2.0424876662418703E-01 -2.0403620424215715E-01 -2.0382356967595069E-01 -2.0361086489636432E-01 +-2.0339809186740576E-01 -2.0318525254629943E-01 -2.0297234888350357E-01 -2.0275938282271772E-01 -2.0254635630089726E-01 +-2.0233327124826334E-01 -2.0212012958831646E-01 -2.0190693323784453E-01 -2.0169368410693939E-01 -2.0148038409900418E-01 +-2.0126703511076771E-01 -2.0105363903229467E-01 -2.0084019774699796E-01 -2.0062671313164979E-01 -2.0041318705639283E-01 +-2.0019962138475467E-01 -1.9998601797365542E-01 -1.9977237867342093E-01 -1.9955870532779513E-01 -1.9934499977395154E-01 +-1.9913126384250288E-01 -1.9891749935751571E-01 -1.9870370813651853E-01 -1.9848989199051678E-01 -1.9827605272400045E-01 +-1.9806219213495943E-01 -1.9784831201489397E-01 -1.9763441414882260E-01 -1.9742050031529926E-01 -1.9720657228642108E-01 +-1.9699263182784091E-01 -1.9677868069877880E-01 -1.9656472065203301E-01 -1.9635075343399222E-01 -1.9613678078464611E-01 +-1.9592280443759749E-01 -1.9570882612007326E-01 -1.9549484755293584E-01 -1.9528087045069534E-01 -1.9506689652152004E-01 +-1.9485292746724711E-01 -1.9463896498339661E-01 -1.9442501075918009E-01 -1.9421106647751232E-01 -1.9399713381502529E-01 +-1.9378321444207663E-01 -1.9356931002276068E-01 -1.9335542221492305E-01 -1.9314155267016964E-01 -1.9292770303387605E-01 +-1.9271387494520323E-01 -1.9250007003710634E-01 -1.9228628993634556E-01 -1.9207253626349868E-01 -1.9185881063297111E-01 +-1.9164511465300807E-01 -1.9143144992570585E-01 -1.9121781804702215E-01 -1.9100422060678815E-01 -1.9079065918871904E-01 +-1.9057713537042692E-01 -1.9036365072342948E-01 -1.9015020681316164E-01 -1.8993680519899050E-01 -1.8972344743421973E-01 +-1.8951013506610795E-01 -1.8929686963587364E-01 -1.8908365267871166E-01 -1.8887048572379903E-01 -1.8865737029431134E-01 +-1.8844430790743064E-01 -1.8823130007435590E-01 -1.8801834830031716E-01 -1.8780545408458441E-01 -1.8759261892047940E-01 +-1.8737984429538596E-01 -1.8716713169076227E-01 -1.8695448258215083E-01 -1.8674189843919003E-01 -1.8652938072562547E-01 +-1.8631693089931975E-01 -1.8610455041226584E-01 -1.8589224071059549E-01 -1.8568000323459061E-01 -1.8546783941869749E-01 +-1.8525575069153324E-01 -1.8504373847589872E-01 -1.8483180418879128E-01 -1.8461994924141203E-01 -1.8440817503918050E-01 +-1.8419648298174376E-01 -1.8398487446298531E-01 -1.8377335087104082E-01 -1.8356191358830501E-01 -1.8335056399144423E-01 +-1.8313930345140692E-01 -1.8292813333343552E-01 -1.8271705499707414E-01 -1.8250606979618336E-01 -1.8229517907895021E-01 +-1.8208438418789696E-01 -1.8187368645989352E-01 -1.8166308722616800E-01 -1.8145258781231760E-01 -1.8124218953831855E-01 +-1.8103189371853975E-01 -1.8082170166174924E-01 -1.8061161467112927E-01 -1.8040163404428253E-01 -1.8019176107324858E-01 +-1.7998199704450843E-01 -1.7977234323900096E-01 -1.7956280093212829E-01 -1.7935337139377175E-01 -1.7914405588829879E-01 +-1.7893485567457573E-01 -1.7872577200597609E-01 -1.7851680613039445E-01 -1.7830795929025559E-01 -1.7809923272252387E-01 +-1.7789062765871660E-01 -1.7768214532491253E-01 -1.7747378694176238E-01 -1.7726555372450264E-01 -1.7705744688296202E-01 +-1.7684946762157411E-01 -1.7664161713938767E-01 -1.7643389663007880E-01 -1.7622630728195782E-01 -1.7601885027798447E-01 +-1.7581152679577375E-01 -1.7560433800761110E-01 -1.7539728508045838E-01 -1.7519036917596928E-01 -1.7498359145049441E-01 +-1.7477695305509711E-01 -1.7457045513556069E-01 -1.7436409883239956E-01 -1.7415788528087067E-01 -1.7395181561098200E-01 +-1.7374589094750537E-01 -1.7354011240998526E-01 -1.7333448111275071E-01 -1.7312899816492350E-01 -1.7292366467043208E-01 +-1.7271848172801793E-01 -1.7251345043124880E-01 -1.7230857186852794E-01 -1.7210384712310564E-01 -1.7189927727308815E-01 +-1.7169486339144829E-01 -1.7149060654603770E-01 -1.7128650779959390E-01 -1.7108256820975434E-01 -1.7087878882906327E-01 +-1.7067517070498495E-01 -1.7047171487991267E-01 -1.7026842239117781E-01 -1.7006529427106259E-01 -1.6986233154680938E-01 +-1.6965953524063027E-01 -1.6945690636971786E-01 -1.6925444594625622E-01 -1.6905215497742970E-01 -1.6885003446543465E-01 +-1.6864808540748882E-01 -1.6844630879584130E-01 -1.6824470561778354E-01 -1.6804327685565892E-01 -1.6784202348687424E-01 +-1.6764094648390829E-01 -1.6744004681432126E-01 -1.6723932544076939E-01 -1.6703878332100849E-01 -1.6683842140791108E-01 +-1.6663824064946997E-01 -1.6643824198881366E-01 -1.6623842636421418E-01 -1.6603879470909544E-01 -1.6583934795204766E-01 +-1.6564008701683355E-01 -1.6544101282240067E-01 -1.6524212628288995E-01 -1.6504342830764682E-01 -1.6484491980123134E-01 +-1.6464660166342740E-01 -1.6444847478925323E-01 -1.6425054006897258E-01 -1.6405279838810188E-01 -1.6385525062742293E-01 +-1.6365789766299152E-01 -1.6346074036614774E-01 -1.6326377960352714E-01 -1.6306701623706785E-01 -1.6287045112402393E-01 +-1.6267408511697204E-01 -1.6247791906382505E-01 -1.6228195380783753E-01 -1.6208619018762058E-01 -1.6189062903714638E-01 +-1.6169527118576366E-01 -1.6150011745820350E-01 -1.6130516867459083E-01 -1.6111042565045455E-01 -1.6091588919673538E-01 +-1.6072156011979874E-01 -1.6052743922144283E-01 -1.6033352729890810E-01 -1.6013982514488800E-01 -1.5994633354753937E-01 +-1.5975305329049000E-01 -1.5955998515285044E-01 -1.5936712990922317E-01 -1.5917448832971159E-01 -1.5898206117993224E-01 +-1.5878984922102060E-01 -1.5859785320964542E-01 -1.5840607389801387E-01 -1.5821451203388548E-01 -1.5802316836057825E-01 +-1.5783204361698117E-01 -1.5764113853756281E-01 -1.5745045385237938E-01 -1.5725999028708798E-01 -1.5706974856295269E-01 +-1.5687972939685702E-01 -1.5668993350131150E-01 -1.5650036158446434E-01 -1.5631101435011124E-01 -1.5612189249770456E-01 +-1.5593299672236249E-01 -1.5574432771487939E-01 -1.5555588616173571E-01 -1.5536767274510649E-01 -1.5517968814287111E-01 +-1.5499193302862474E-01 -1.5480440807168414E-01 -1.5461711393710173E-01 -1.5443005128567092E-01 -1.5424322077393904E-01 +-1.5405662305421369E-01 -1.5387025877457575E-01 -1.5368412857888542E-01 -1.5349823310679386E-01 -1.5331257299375281E-01 +-1.5312714887102283E-01 -1.5294196136568253E-01 -1.5275701110063955E-01 -1.5257229869463937E-01 -1.5238782476227392E-01 +-1.5220358991399230E-01 -1.5201959475610904E-01 -1.5183583989081431E-01 -1.5165232591618202E-01 -1.5146905342618217E-01 +-1.5128602301068617E-01 -1.5110323525547933E-01 -1.5092069074226824E-01 -1.5073839004869211E-01 -1.5055633374832986E-01 +-1.5037452241071181E-01 -1.5019295660132606E-01 -1.5001163688163099E-01 -1.4983056380906151E-01 -1.4964973793704109E-01 +-1.4946915981498993E-01 -1.4928882998833184E-01 -1.4910874899850840E-01 -1.4892891738298433E-01 -1.4874933567525733E-01 +-1.4857000440486892E-01 -1.4839092409741189E-01 -1.4821209527454060E-01 -1.4803351845397941E-01 -1.4785519414953241E-01 +-1.4767712287109239E-01 -1.4749930512464926E-01 -1.4732174141230203E-01 -1.4714443223226376E-01 -1.4696737807887297E-01 +-1.4679057944260440E-01 -1.4661403681007387E-01 -1.4643775066405226E-01 -1.4626172148346961E-01 -1.4608594974342939E-01 +-1.4591043591521247E-01 -1.4573518046629033E-01 -1.4556018386033262E-01 -1.4538544655721419E-01 -1.4521096901302774E-01 +-1.4503675168009014E-01 -1.4486279500695304E-01 -1.4468909943841049E-01 -1.4451566541550900E-01 -1.4434249337555632E-01 +-1.4416958375213013E-01 -1.4399693697508692E-01 -1.4382455347057077E-01 -1.4365243366102440E-01 -1.4348057796519470E-01 +-1.4330898679814344E-01 -1.4313766057125762E-01 -1.4296659969225523E-01 -1.4279580456519583E-01 -1.4262527559049082E-01 +-1.4245501316490919E-01 -1.4228501768158908E-01 -1.4211528953004596E-01 -1.4194582909617948E-01 -1.4177663676228597E-01 +-1.4160771290706392E-01 -1.4143905790562547E-01 -1.4127067212950173E-01 -1.4110255594665591E-01 -1.4093470972148880E-01 +-1.4076713381484945E-01 -1.4059982858404235E-01 -1.4043279438283726E-01 -1.4026603156147863E-01 -1.4009954046669257E-01 +-1.3993332144169640E-01 -1.3976737482620746E-01 -1.3960170095645261E-01 -1.3943630016517519E-01 -1.3927117278164447E-01 +-1.3910631913166571E-01 -1.3894173953758640E-01 -1.3877743431830683E-01 -1.3861340378928796E-01 -1.3844964826255965E-01 +-1.3828616804673033E-01 -1.3812296344699554E-01 -1.3796003476514443E-01 -1.3779738229957172E-01 -1.3763500634528397E-01 +-1.3747290719390895E-01 -1.3731108513370363E-01 -1.3714954044956401E-01 -1.3698827342303191E-01 -1.3682728433230498E-01 +-1.3666657345224434E-01 -1.3650614105438463E-01 -1.3634598740694004E-01 -1.3618611277481438E-01 -1.3602651741960961E-01 +-1.3586720159963447E-01 -1.3570816556991172E-01 -1.3554940958218831E-01 -1.3539093388494203E-01 -1.3523273872339214E-01 +-1.3507482433950499E-01 -1.3491719097200519E-01 -1.3475983885638312E-01 -1.3460276822490172E-01 -1.3444597930660745E-01 +-1.3428947232733704E-01 -1.3413324750972663E-01 -1.3397730507321928E-01 -1.3382164523407464E-01 -1.3366626820537578E-01 +-1.3351117419703903E-01 -1.3335636341582099E-01 -1.3320183606532712E-01 -1.3304759234602187E-01 -1.3289363245523447E-01 +-1.3273995658716797E-01 -1.3258656493290802E-01 -1.3243345768043174E-01 -1.3228063501461382E-01 -1.3212809711723775E-01 +-1.3197584416700048E-01 -1.3182387633952489E-01 -1.3167219380736334E-01 -1.3152079674001002E-01 -1.3136968530390700E-01 +-1.3121885966245334E-01 -1.3106831997601132E-01 -1.3091806640191719E-01 -1.3076809909448842E-01 -1.3061841820503137E-01 +-1.3046902388184950E-01 -1.3031991627025211E-01 -1.3017109551256228E-01 -1.3002256174812385E-01 -1.2987431511331207E-01 +-1.2972635574153932E-01 -1.2957868376326373E-01 -1.2943129930599759E-01 -1.2928420249431655E-01 -1.2913739344986488E-01 +-1.2899087229136691E-01 -1.2884463913463137E-01 -1.2869869409256346E-01 -1.2855303727516890E-01 -1.2840766878956508E-01 +-1.2826258873998805E-01 -1.2811779722779904E-01 -1.2797329435149465E-01 -1.2782908020671396E-01 -1.2768515488624582E-01 +-1.2754151848003806E-01 -1.2739817107520460E-01 -1.2725511275603305E-01 -1.2711234360399387E-01 -1.2696986369774726E-01 +-1.2682767311315168E-01 -1.2668577192327091E-01 -1.2654416019838330E-01 -1.2640283800598792E-01 -1.2626180541081433E-01 +-1.2612106247482879E-01 -1.2598060925724322E-01 -1.2584044581452244E-01 -1.2570057220039221E-01 -1.2556098846584704E-01 +-1.2542169465915801E-01 -1.2528269082588042E-01 -1.2514397700886229E-01 -1.2500555324825077E-01 -1.2486741958150159E-01 +-1.2472957604338518E-01 -1.2459202266599578E-01 -1.2445475947875843E-01 -1.2431778650843701E-01 -1.2418110377914181E-01 +-1.2404471131233735E-01 -1.2390860912684981E-01 -1.2377279723887548E-01 -1.2363727566198746E-01 -1.2350204440714434E-01 +-1.2336710348269668E-01 -1.2323245289439592E-01 -1.2309809264540153E-01 -1.2296402273628808E-01 -1.2283024316505368E-01 +-1.2269675392712735E-01 -1.2256355501537679E-01 -1.2243064642011552E-01 -1.2229802812911067E-01 -1.2216570012759105E-01 +-1.2203366239825393E-01 -1.2190191492127361E-01 -1.2177045767430753E-01 -1.2163929063250535E-01 -1.2150841376851565E-01 +-1.2137782705249359E-01 -1.2124753045210857E-01 -1.2111752393255124E-01 -1.2098780745654229E-01 -1.2085838098433822E-01 +-1.2072924447373994E-01 -1.2060039788010028E-01 -1.2047184115633058E-01 -1.2034357425290930E-01 -1.2021559711788854E-01 +-1.2008790969690204E-01 -1.1996051193317223E-01 -1.1983340376751801E-01 -1.1970658513836173E-01 -1.1958005598173671E-01 +-1.1945381623129561E-01 -1.1932786581831584E-01 -1.1920220467170889E-01 -1.1907683271802619E-01 -1.1895174988146771E-01 +-1.1882695608388852E-01 -1.1870245124480612E-01 -1.1857823528140840E-01 -1.1845430810856004E-01 -1.1833066963881077E-01 +-1.1820731978240179E-01 -1.1808425844727394E-01 -1.1796148553907408E-01 -1.1783900096116330E-01 -1.1771680461462310E-01 +-1.1759489639826368E-01 -1.1747327620863060E-01 -1.1735194394001228E-01 -1.1723089948444677E-01 -1.1711014273172952E-01 +-1.1698967356942018E-01 -1.1686949188285055E-01 -1.1674959755513041E-01 -1.1662999046715589E-01 -1.1651067049761613E-01 +-1.1639163752300079E-01 -1.1627289141760659E-01 -1.1615443205354496E-01 -1.1603625930074925E-01 -1.1591837302698120E-01 +-1.1580077309783895E-01 -1.1568345937676319E-01 -1.1556643172504541E-01 -1.1544969000183351E-01 -1.1533323406414064E-01 +-1.1521706376685041E-01 -1.1510117896272543E-01 -1.1498557950241366E-01 -1.1487026523445586E-01 -1.1475523600529140E-01 +-1.1464049165926754E-01 -1.1452603203864431E-01 -1.1441185698360255E-01 -1.1429796633225053E-01 -1.1418435992063157E-01 +-1.1407103758273004E-01 -1.1395799915047936E-01 -1.1384524445376779E-01 -1.1373277332044671E-01 -1.1362058557633638E-01 +-1.1350868104523373E-01 -1.1339705954891884E-01 -1.1328572090716169E-01 -1.1317466493772955E-01 -1.1306389145639394E-01 +-1.1295340027693661E-01 -1.1284319121115763E-01 -1.1273326406888105E-01 -1.1262361865796307E-01 -1.1251425478429762E-01 +-1.1240517225182409E-01 -1.1229637086253373E-01 -1.1218785041647676E-01 -1.1207961071176865E-01 -1.1197165154459786E-01 +-1.1186397270923142E-01 -1.1175657399802298E-01 -1.1164945520141860E-01 -1.1154261610796397E-01 -1.1143605650431132E-01 +-1.1132977617522595E-01 -1.1122377490359243E-01 -1.1111805247042232E-01 -1.1101260865486078E-01 -1.1090744323419230E-01 +-1.1080255598384869E-01 -1.1069794667741444E-01 -1.1059361508663494E-01 -1.1048956098142178E-01 -1.1038578412986012E-01 +-1.1028228429821556E-01 -1.1017906125094018E-01 -1.1007611475067913E-01 -1.0997344455827807E-01 -1.0987105043278969E-01 +-1.0976893213147910E-01 -1.0966708940983187E-01 -1.0956552202155967E-01 -1.0946422971860793E-01 -1.0936321225116104E-01 +-1.0926246936764997E-01 -1.0916200081475863E-01 -1.0906180633743026E-01 -1.0896188567887360E-01 -1.0886223858057023E-01 +-1.0876286478228084E-01 -1.0866376402205140E-01 -1.0856493603621997E-01 -1.0846638055942294E-01 -1.0836809732460209E-01 +-1.0827008606301058E-01 -1.0817234650421918E-01 -1.0807487837612376E-01 -1.0797768140495063E-01 -1.0788075531526371E-01 +-1.0778409982997056E-01 -1.0768771467032909E-01 -1.0759159955595375E-01 -1.0749575420482202E-01 -1.0740017833328139E-01 +-1.0730487165605451E-01 -1.0720983388624669E-01 -1.0711506473535214E-01 -1.0702056391325941E-01 -1.0692633112825904E-01 +-1.0683236608704910E-01 -1.0673866849474171E-01 -1.0664523805486952E-01 -1.0655207446939173E-01 -1.0645917743870105E-01 +-1.0636654666162901E-01 -1.0627418183545348E-01 -1.0618208265590361E-01 -1.0609024881716736E-01 -1.0599868001189709E-01 +-1.0590737593121578E-01 -1.0581633626472370E-01 -1.0572556070050450E-01 -1.0563504892513119E-01 -1.0554480062367258E-01 +-1.0545481547969957E-01 -1.0536509317529155E-01 -1.0527563339104182E-01 -1.0518643580606482E-01 -1.0509750009800174E-01 +-1.0500882594302646E-01 -1.0492041301585238E-01 -1.0483226098973800E-01 -1.0474436953649374E-01 -1.0465673832648703E-01 +-1.0456936702864994E-01 -1.0448225531048372E-01 -1.0439540283806588E-01 -1.0430880927605633E-01 -1.0422247428770313E-01 +-1.0413639753484835E-01 -1.0405057867793503E-01 -1.0396501737601251E-01 -1.0387971328674253E-01 -1.0379466606640589E-01 +-1.0370987536990763E-01 -1.0362534085078406E-01 -1.0354106216120790E-01 -1.0345703895199468E-01 -1.0337327087260900E-01 +-1.0328975757117045E-01 -1.0320649869445865E-01 -1.0312349388792101E-01 -1.0304074279567738E-01 -1.0295824506052634E-01 +-1.0287600032395124E-01 -1.0279400822612625E-01 -1.0271226840592235E-01 -1.0263078050091305E-01 -1.0254954414738005E-01 +-1.0246855898032003E-01 -1.0238782463345021E-01 -1.0230734073921328E-01 -1.0222710692878503E-01 -1.0214712283207883E-01 +-1.0206738807775236E-01 -1.0198790229321292E-01 -1.0190866510462349E-01 -1.0182967613690902E-01 -1.0175093501376140E-01 +-1.0167244135764646E-01 -1.0159419478980830E-01 -1.0151619493027671E-01 -1.0143844139787164E-01 -1.0136093381021016E-01 +-1.0128367178371109E-01 -1.0120665493360206E-01 -1.0112988287392397E-01 -1.0105335521753817E-01 -1.0097707157613101E-01 +-1.0090103156021986E-01 -1.0082523477915976E-01 -1.0074968084114776E-01 -1.0067436935322985E-01 -1.0059929992130606E-01 +-1.0052447215013641E-01 -1.0044988564334627E-01 -1.0037554000343259E-01 -1.0030143483176922E-01 -1.0022756972861270E-01 +-1.0015394429310776E-01 -1.0008055812329365E-01 -1.0000741081610866E-01 -9.9934501967396755E-02 -9.9861831171913273E-02 +-9.9789398023329215E-02 -9.9717202114238540E-02 -9.9645243036162984E-02 -9.9573520379557481E-02 -9.9502033733816067E-02 +-9.9430782687277980E-02 -9.9359766827231938E-02 -9.9288985739922744E-02 -9.9218439010556894E-02 -9.9148126223307306E-02 +-9.9078046961319804E-02 -9.9008200806718030E-02 -9.8938587340609535E-02 -9.8869206143090430E-02 -9.8800056793251864E-02 +-9.8731138869184915E-02 -9.8662451947986327E-02 -9.8593995605764151E-02 -9.8525769417642836E-02 -9.8457772957769085E-02 +-9.8390005799316838E-02 -9.8322467514493403E-02 -9.8255157674544458E-02 -9.8188075849759734E-02 -9.8121221609478032E-02 +-9.8054594522093044E-02 -9.7988194155058841E-02 -9.7922020074894922E-02 -9.7856071847191792E-02 -9.7790349036616694E-02 +-9.7724851206918220E-02 -9.7659577920932467E-02 -9.7594528740588132E-02 -9.7529703226911582E-02 -9.7465100940032662E-02 +-9.7400721439189916E-02 -9.7336564282735696E-02 -9.7272629028141683E-02 -9.7208915232004145E-02 -9.7145422450049368E-02 +-9.7082150237139078E-02 -9.7019098147275190E-02 -9.6956265733605676E-02 -9.6893652548429660E-02 -9.6831258143202606E-02 +-9.6769082068541623E-02 -9.6707123874230902E-02 -9.6645383109226657E-02 -9.6583859321662524E-02 -9.6522552058854724E-02 +-9.6461460867307849E-02 -9.6400585292718971E-02 -9.6339924879983968E-02 -9.6279479173201940E-02 -9.6219247715680800E-02 +-9.6159230049942451E-02 -9.6099425717727824E-02 -9.6039834260002149E-02 -9.5980455216959956E-02 -9.5921288128030552E-02 +-9.5862332531882671E-02 -9.5803587966430487E-02 -9.5745053968837479E-02 -9.5686730075522683E-02 -9.5628615822165391E-02 +-9.5570710743710111E-02 -9.5513014374371694E-02 -9.5455526247640712E-02 -9.5398245896288369E-02 -9.5341172852371550E-02 +-9.5284306647237971E-02 -9.5227646811531064E-02 -9.5171192875195113E-02 -9.5114944367480539E-02 -9.5058900816948483E-02 +-9.5003061751476339E-02 -9.4947426698262408E-02 -9.4891995183831013E-02 -9.4836766734037625E-02 -9.4781740874073622E-02 +-9.4726917128471325E-02 -9.4672295021109465E-02 -9.4617874075217157E-02 -9.4563653813380180E-02 -9.4509633757544689E-02 +-9.4455813429022872E-02 -9.4402192348497962E-02 -9.4348770036028359E-02 -9.4295546011053610E-02 -9.4242519792398893E-02 +-9.4189690898279319E-02 -9.4137058846306368E-02 -9.4084623153490907E-02 -9.4032383336249262E-02 -9.3980338910408412E-02 +-9.3928489391209152E-02 -9.3876834293313310E-02 -9.3825373130806300E-02 -9.3774105417203907E-02 -9.3723030665455689E-02 +-9.3672148387950849E-02 -9.3621458096522225E-02 -9.3570959302451726E-02 -9.3520651516474873E-02 -9.3470534248785611E-02 +-9.3420607009041007E-02 -9.3370869306366455E-02 -9.3321320649360023E-02 -9.3271960546097196E-02 -9.3222788504136025E-02 +-9.3173804030521598E-02 -9.3125006631790963E-02 -9.3076395813977600E-02 -9.3027971082616304E-02 -9.2979731942748278E-02 +-9.2931677898925119E-02 -9.2883808455213934E-02 -9.2836123115202257E-02 -9.2788621382002431E-02 -9.2741302758256192E-02 +-9.2694166746139728E-02 -9.2647212847368085E-02 -9.2600440563200007E-02 -9.2553849394442084E-02 -9.2507438841454390E-02 +-9.2461208404154213E-02 -9.2415157582020846E-02 -9.2369285874100912E-02 -9.2323592779011782E-02 -9.2278077794947330E-02 +-9.2232740419682102E-02 -9.2187580150575502E-02 -9.2142596484576816E-02 -9.2097788918229936E-02 -9.2053156947677919E-02 +-9.2008700068666793E-02 -9.1964417776551108E-02 -9.1920309566297570E-02 -9.1876374932490915E-02 -9.1832613369336610E-02 +-9.1789024370667105E-02 -9.1745607429945336E-02 -9.1702362040269464E-02 -9.1659287694377464E-02 -9.1616383884651750E-02 +-9.1573650103123336E-02 -9.1531085841476498E-02 -9.1488690591053204E-02 -9.1446463842857845E-02 -9.1404405087560994E-02 +-9.1362513815504837E-02 -9.1320789516707038E-02 -9.1279231680864728E-02 -9.1237839797359999E-02 -9.1196613355263578E-02 +-9.1155551843339469E-02 -9.1114654750049207E-02 -9.1073921563556509E-02 -9.1033351771731608E-02 -9.0992944862155214E-02 +-9.0952700322123686E-02 -9.0912617638652701E-02 -9.0872696298481798E-02 -9.0832935788078856E-02 -9.0793335593644553E-02 +-9.0753895201116527E-02 -9.0714614096173291E-02 -9.0675491764239530E-02 -9.0636527690489396E-02 -9.0597721359851807E-02 +-9.0559072257013679E-02 -9.0520579866425227E-02 -9.0482243672303411E-02 -9.0444063158636859E-02 -9.0406037809189904E-02 +-9.0368167107506642E-02 -9.0330450536915435E-02 -9.0292887580533082E-02 -9.0255477721269059E-02 -9.0218220441829644E-02 +-9.0181115224722858E-02 -9.0144161552261196E-02 -9.0107358906567472E-02 -9.0070706769577680E-02 -9.0034204623046232E-02 +-8.9997851948549798E-02 -8.9961648227490795E-02 -8.9925592941102847E-02 -8.9889685570453778E-02 -8.9853925596450515E-02 +-8.9818312499842762E-02 -8.9782845761227831E-02 -8.9747524861053696E-02 -8.9712349279624307E-02 -8.9677318497102795E-02 +-8.9642431993516056E-02 -8.9607689248758698E-02 -8.9573089742597353E-02 -8.9538632954674249E-02 -8.9504318364512309E-02 +-8.9470145451517685E-02 -8.9436113694985345E-02 -8.9402222574102450E-02 -8.9368471567952190E-02 -8.9334860155518434E-02 +-8.9301387815689123E-02 -8.9268054027260818E-02 -8.9234858268942507E-02 -8.9201800019359692E-02 -8.9168878757058298E-02 +-8.9136093960508742E-02 -8.9103445108109872E-02 -8.9070931678193271E-02 -8.9038553149026631E-02 -8.9006308998818118E-02 +-8.8974198705720570E-02 -8.8942221747835129E-02 -8.8910377603214977E-02 -8.8878665749869579E-02 -8.8847085665769057E-02 +-8.8815636828847133E-02 -8.8784318717005845E-02 -8.8753130808119168E-02 -8.8722072580037017E-02 -8.8691143510588627E-02 +-8.8660343077587800E-02 -8.8629670758834850E-02 -8.8599126032122291E-02 -8.8568708375237670E-02 -8.8538417265967673E-02 +-8.8508252182102273E-02 -8.8478212601437914E-02 -8.8448298001782055E-02 -8.8418507860956494E-02 -8.8388841656801789E-02 +-8.8359298867180469E-02 -8.8329878969980860E-02 -8.8300581443121529E-02 -8.8271405764554403E-02 -8.8242351412269146E-02 +-8.8213417864296081E-02 -8.8184604598710886E-02 -8.8155911093638240E-02 -8.8127336827254682E-02 -8.8098881277793611E-02 +-8.8070543923547989E-02 -8.8042324242875045E-02 -8.8014221714198912E-02 -8.7986235816015390E-02 -8.7958366026895177E-02 +-8.7930611825487212E-02 -8.7902972690523370E-02 -8.7875448100821082E-02 -8.7848037535287957E-02 -8.7820740472924499E-02 +-8.7793556392828931E-02 -8.7766484774199627E-02 -8.7739525096339976E-02 -8.7712676838660991E-02 -8.7685939480685801E-02 +-8.7659312502052403E-02 -8.7632795382518280E-02 -8.7606387601963195E-02 -8.7580088640393447E-02 -8.7553897977945008E-02 +-8.7527815094887162E-02 -8.7501839471626736E-02 -8.7475970588710622E-02 -8.7450207926830392E-02 -8.7424550966825040E-02 +-8.7398999189685300E-02 -8.7373552076556532E-02 -8.7348209108742469E-02 -8.7322969767709410E-02 -8.7297833535088659E-02 +-8.7272799892680802E-02 -8.7247868322459163E-02 -8.7223038306573158E-02 -8.7198309327351328E-02 -8.7173680867306494E-02 +-8.7149152409136788E-02 -8.7124723435731286E-02 -8.7100393430172549E-02 -8.7076161875740229E-02 -8.7052028255914238E-02 +-8.7027992054378514E-02 -8.7004052755024819E-02 -8.6980209841955786E-02 -8.6956462799487752E-02 -8.6932811112155728E-02 +-8.6909254264715005E-02 -8.6885791742146307E-02 -8.6862423029657548E-02 -8.6839147612688836E-02 -8.6815964976914406E-02 +-8.6792874608247361E-02 -8.6769875992841777E-02 -8.6746968617096923E-02 -8.6724151967660437E-02 -8.6701425531431495E-02 +-8.6678788795564538E-02 -8.6656241247471788E-02 -8.6633782374827828E-02 -8.6611411665572138E-02 -8.6589128607912097E-02 +-8.6566932690327142E-02 -8.6544823401571658E-02 -8.6522800230678196E-02 -8.6500862666960887E-02 -8.6479010200019024E-02 +-8.6457242319739253E-02 -8.6435558516300665E-02 -8.6413958280176006E-02 -8.6392441102136758E-02 -8.6371006473254977E-02 +-8.6349653884907687E-02 -8.6328382828779068E-02 -8.6307192796864413E-02 -8.6286083281473205E-02 -8.6265053775232192E-02 +-8.6244103771088459E-02 -8.6223232762313196E-02 -8.6202440242503925E-02 -8.6181725705589116E-02 -8.6161088645829706E-02 +-8.6140528557823601E-02 -8.6120044936508058E-02 -8.6099637277163368E-02 -8.6079305075415516E-02 -8.6059047827239832E-02 +-8.6038865028963407E-02 -8.6018756177269173E-02 -8.5998720769198275E-02 -8.5978758302153319E-02 -8.5958868273901909E-02 +-8.5939050182579205E-02 -8.5919303526691249E-02 -8.5899627805118159E-02 -8.5880022517117002E-02 -8.5860487162325111E-02 +-8.5841021240762677E-02 -8.5821624252836501E-02 -8.5802295699342251E-02 -8.5783035081468603E-02 -8.5763841900798665E-02 +-8.5744715659314935E-02 -8.5725655859400368E-02 -8.5706662003843109E-02 -8.5687733595838297E-02 -8.5668870138991771E-02 +-8.5650071137322731E-02 -8.5631336095266616E-02 -8.5612664517678433E-02 -8.5594055909835459E-02 -8.5575509777440564E-02 +-8.5557025626624567E-02 -8.5538602963949897E-02 -8.5520241296412572E-02 -8.5501940131446394E-02 -8.5483698976924746E-02 +-8.5465517341164352E-02 -8.5447394732927603E-02 -8.5429330661425606E-02 -8.5411324636321326E-02 -8.5393376167732363E-02 +-8.5375484766233620E-02 -8.5357649942860409E-02 -8.5339871209111379E-02 -8.5322148076951057E-02 -8.5304480058813248E-02 +-8.5286866667603128E-02 -8.5269307416700996E-02 -8.5251801819963988E-02 -8.5234349391730316E-02 -8.5216949646820958E-02 +-8.5199602100542629E-02 -8.5182306268690999E-02 -8.5165061667553332E-02 -8.5147867813911399E-02 -8.5130724225043711E-02 +-8.5113630418728936E-02 -8.5096585913248479E-02 -8.5079590227388951E-02 -8.5062642880445544E-02 -8.5045743392224038E-02 +-8.5028891283044153E-02 -8.5012086073741985E-02 -8.4995327285672773E-02 -8.4978614440713890E-02 -8.4961947061266738E-02 +-8.4945324670260669E-02 -8.4928746791154794E-02 -8.4912212947941088E-02 -8.4895722665146389E-02 -8.4879275467836315E-02 +-8.4862870881616925E-02 -8.4846508432637635E-02 -8.4830187647594008E-02 -8.4813908053730402E-02 -8.4797669178842516E-02 +-8.4781470551279908E-02 -8.4765311699949275E-02 -8.4749192154315631E-02 -8.4733111444406914E-02 -8.4717069100814987E-02 +-8.4701064654698802E-02 -8.4685097637787157E-02 -8.4669167582381188E-02 -8.4653274021356625E-02 -8.4637416488166875E-02 +-8.4621594516844992E-02 -8.4605807642007216E-02 -8.4590055398854058E-02 -8.4574337323174389E-02 -8.4558652951346944E-02 +-8.4543001820343133E-02 -8.4527383467729630E-02 -8.4511797431671060E-02 -8.4496243250932218E-02 -8.4480720464880449E-02 +-8.4465228613488583E-02 -8.4449767237337131E-02 -8.4434335877617062E-02 -8.4418934076131574E-02 -8.4403561375299335E-02 +-8.4388217318156600E-02 -8.4372901448359849E-02 -8.4357613310187596E-02 -8.4342352448544114E-02 -8.4327118408960330E-02 +-8.4311910737597362E-02 -8.4296728981248514E-02 -8.4281572687341502E-02 -8.4266441403941461E-02 -8.4251334679752807E-02 +-8.4236252064121692E-02 -8.4221193107038544E-02 -8.4206157359140416E-02 -8.4191144371713350E-02 -8.4176153696694483E-02 +-8.4161184886674789E-02 -8.4146237494901271E-02 -8.4131311075279172E-02 -8.4116405182374579E-02 -8.4101519371416300E-02 +-8.4086653198298694E-02 -8.4071806219583725E-02 -8.4056977992503196E-02 -8.4042168074961218E-02 -8.4027376025536352E-02 +-8.4012601403483891E-02 -8.3997843768738395E-02 -8.3983102681915681E-02 -8.3968377704314853E-02 -8.3953668397921413E-02 +-8.3938974325408672E-02 -8.3924295050140221E-02 -8.3909630136172211E-02 -8.3894979148255749E-02 -8.3880341651838566E-02 +-8.3865717213068319E-02 -8.3851105398793424E-02 -8.3836505776565998E-02 -8.3821917914644314E-02 -8.3807341381994138E-02 +-8.3792775748291998E-02 -8.3778220583926116E-02 -8.3763675459999534E-02 -8.3749139948331955E-02 -8.3734613621461812E-02 +-8.3720096052648366E-02 -8.3705586815874033E-02 -8.3691085485846195E-02 -8.3676591637999939E-02 -8.3662104848499397E-02 +-8.3647624694240350E-02 -8.3633150752852062E-02 -8.3618682602699682E-02 -8.3604219822886086E-02 -8.3589761993253769E-02 +-8.3575308694387285E-02 -8.3560859507615451E-02 -8.3546414015012574E-02 -8.3531971799401222E-02 -8.3517532444354517E-02 +-8.3503095534196964E-02 -8.3488660654007923E-02 -8.3474227389622319E-02 -8.3459795327633798E-02 -8.3445364055395890E-02 +-8.3430933161024415E-02 -8.3416502233399456E-02 -8.3402070862167110E-02 -8.3387638637741554E-02 -8.3373205151307292E-02 +-8.3358769994820711E-02 -8.3344332761012260E-02 -8.3329893043388475E-02 -8.3315450436233437E-02 -8.3301004534611464E-02 +-8.3286554934368387E-02 -8.3272101232133855E-02 -8.3257643025323014E-02 -8.3243179912138379E-02 -8.3228711491572072E-02 +-8.3214237363407217E-02 -8.3199757128220364E-02 -8.3185270387382867E-02 -8.3170776743063279E-02 -8.3156275798228277E-02 +-8.3141767156645882E-02 -8.3127250422886045E-02 -8.3112725202323282E-02 -8.3098191101137961E-02 -8.3083647726318724E-02 +-8.3069094685663633E-02 -8.3054531587782560E-02 -8.3039958042098586E-02 -8.3025373658850155E-02 -8.3010778049092307E-02 +-8.2996170824699261E-02 -8.2981551598365413E-02 -8.2966919983607529E-02 -8.2952275594766436E-02 -8.2937618047008527E-02 +-8.2922946956328236E-02 -8.2908261939548783E-02 -8.2893562614324554E-02 -8.2878848599142504E-02 -8.2864119513324355E-02 +-8.2849374977027823E-02 -8.2834614611248220E-02 -8.2819838037820726E-02 -8.2805044879421738E-02 -8.2790234759570272E-02 +-8.2775407302630208E-02 -8.2760562133811652E-02 -8.2745698879172311E-02 -8.2730817165620030E-02 -8.2715916620913293E-02 +-8.2700996873663807E-02 -8.2686057553337397E-02 -8.2671098290256470E-02 -8.2656118715600510E-02 -8.2641118461408952E-02 +-8.2626097160581849E-02 -8.2611054446881715E-02 -8.2595989954935292E-02 -8.2580903320234905E-02 -8.2565794179140062E-02 +-8.2550662168879615E-02 -8.2535506927551960E-02 -8.2520328094128154E-02 -8.2505125308452359E-02 -8.2489898211243681E-02 +-8.2474646444098174E-02 -8.2459369649489439E-02 -8.2444067470770974E-02 -8.2428739552177360E-02 -8.2413385538825643E-02 +-8.2398005076717046E-02 -8.2382597812738503E-02 -8.2367163394663434E-02 -8.2351701471154254E-02 -8.2336211691763597E-02 +-8.2320693706934789E-02 -8.2305147168004564E-02 -8.2289571727204067E-02 -8.2273967037659684E-02 -8.2258332753395780E-02 +-8.2242668529334664E-02 -8.2226974021298901E-02 -8.2211248886012597E-02 -8.2195492781102594E-02 -8.2179705365099873E-02 +-8.2163886297441591E-02 -8.2148035238470973E-02 -8.2132151849440324E-02 -8.2116235792511580E-02 -8.2100286730757380E-02 +-8.2084304328163368E-02 -8.2068288249628599E-02 -8.2052238160967308E-02 -8.2036153728910349E-02 -8.2020034621106006E-02 +-8.2003880506121882E-02 -8.1987691053445916E-02 -8.1971465933487822E-02 -8.1955204817580285E-02 -8.1938907377980055E-02 +-8.1922573287869532E-02 -8.1906202221358068E-02 -8.1889793853482731E-02 -8.1873347860210430E-02 -8.1856863918438105E-02 +-8.1840341705995218E-02 -8.1823780901643259E-02 -8.1807181185079000E-02 -8.1790542236934244E-02 -8.1773863738777569E-02 +-8.1757145373115431E-02 -8.1740386823393393E-02 -8.1723587773997533E-02 -8.1706747910255229E-02 -8.1689866918436535E-02 +-8.1672944485755239E-02 -8.1655980300370551E-02 -8.1638974051387411E-02 -8.1621925428858363E-02 -8.1604834123783929E-02 +-8.1587699828114771E-02 -8.1570522234751724E-02 -8.1553301037548070E-02 -8.1536035931309619E-02 -8.1518726611796030E-02 +-8.1501372775722572E-02 -8.1483974120760388E-02 -8.1466530345538288E-02 -8.1449041149642909E-02 -8.1431506233620776E-02 +-8.1413925298978868E-02 -8.1396298048185670E-02 -8.1378624184672260E-02 -8.1360903412833516E-02 -8.1343135438028680E-02 +-8.1325319966583057E-02 -8.1307456705788414E-02 -8.1289545363904578E-02 -8.1271585650159711E-02 -8.1253577274751923E-02 +-8.1235519948850171E-02 -8.1217413384595011E-02 -8.1199257295099539E-02 -8.1181051394450671E-02 -8.1162795397709972E-02 +-8.1144489020914437E-02 -8.1126131981077654E-02 -8.1107723996190553E-02 -8.1089264785222728E-02 -8.1070754068122641E-02 +-8.1052191565819304E-02 -8.1033577000222831E-02 -8.1014910094225179E-02 -8.0996190571701487E-02 -8.0977418157510431E-02 +-8.0958592577495644E-02 -8.0939713558486087E-02 -8.0920780828297512E-02 -8.0901794115732450E-02 -8.0882753150582243E-02 +-8.0863657663626395E-02 -8.0844507386635012E-02 -8.0825302052368458E-02 -8.0806041394578573E-02 -8.0786725148009747E-02 +-8.0767353048399160E-02 -8.0747924832478085E-02 -8.0728440237972543E-02 -8.0708899003604020E-02 -8.0689300869089875E-02 +-8.0669645575145277E-02 -8.0649932863482515E-02 -8.0630162476812803E-02 -8.0610334158846386E-02 -8.0590447654294073E-02 +-8.0570502708866815E-02 -8.0550499069277720E-02 -8.0530436483241610E-02 -8.0510314699476615E-02 -8.0490133467704311E-02 +-8.0469892538650972E-02 -8.0449591664047512E-02 -8.0429230596630846E-02 -8.0408809090144362E-02 -8.0388326899338364E-02 +-8.0367783779970919E-02 -8.0347179488808748E-02 -8.0326513783627554E-02 -8.0305786423212525E-02 -8.0284997167359526E-02 +-8.0264145776875018E-02 -8.0243232013577484E-02 -8.0222255640297502E-02 -8.0201216420878282E-02 -8.0180114120176449E-02 +-8.0158948504062910E-02 -8.0137719339423027E-02 -8.0116426394157281E-02 -8.0095069437181837E-02 -8.0073648238429357E-02 +-8.0052162568849422E-02 -8.0030612200408677E-02 -8.0008996906092186E-02 -7.9987316459902980E-02 -7.9965570636863423E-02 +-7.9943759213015608E-02 -7.9921881965421299E-02 -7.9899938672162898E-02 -7.9877929112344190E-02 -7.9855853066090124E-02 +-7.9833710314547834E-02 -7.9811500639886873E-02 -7.9789223825299918E-02 -7.9766879655003134E-02 -7.9744467914236339E-02 +-7.9721988389264170E-02 -7.9699440867375224E-02 -7.9676825136884177E-02 -7.9654140987130972E-02 -7.9631388208481577E-02 +-7.9608566592328608E-02 -7.9585675931091657E-02 -7.9562716018217128E-02 -7.9539686648179703E-02 -7.9516587616481699E-02 +-7.9493418719654138E-02 -7.9470179755256845E-02 -7.9446870521878418E-02 -7.9423490819137535E-02 -7.9400040447682368E-02 +-7.9376519209191587E-02 -7.9352926906374313E-02 -7.9329263342970399E-02 -7.9305528323751040E-02 -7.9281721654518938E-02 +-7.9257843142108722E-02 -7.9233892594386721E-02 -7.9209869820252479E-02 -7.9185774629637176E-02 -7.9161606833505802E-02 +-7.9137366243856144E-02 -7.9113052673719764E-02 -7.9088665937161906E-02 -7.9064205849281713E-02 -7.9039672226212512E-02 +-7.9015064885122541E-02 -7.8990383644214082E-02 -7.8965628322724912E-02 -7.8940798740927715E-02 -7.8915894720130580E-02 +-7.8890916082677121E-02 -7.8865862651946575E-02 -7.8840734252354230E-02 -7.8815530709351656E-02 -7.8790251849426063E-02 +-7.8764897500101960E-02 -7.8739467489939721E-02 -7.8713961648536807E-02 -7.8688379806527514E-02 -7.8662721795583104E-02 +-7.8636987448411924E-02 -7.8611176598759810E-02 -7.8585289081409590E-02 -7.8559324732181926E-02 -7.8533283387934846E-02 +-7.8507164886564271E-02 -7.8480969067003692E-02 -7.8454695769224397E-02 -7.8428344834235608E-02 -7.8401916104084743E-02 +-7.8375409421857084E-02 -7.8348824631675640E-02 -7.8322161578702296E-02 -7.8295420109136205E-02 -7.8268600070215674E-02 +-7.8241701310216197E-02 -7.8214723678452391E-02 -7.8187667025276450E-02 -7.8160531202078928E-02 -7.8133316061289176E-02 +-7.8106021456373756E-02 -7.8078647241838064E-02 -7.8051193273225711E-02 -7.8023659407117904E-02 -7.7996045501134509E-02 +-7.7968351413933101E-02 -7.7940577005209163E-02 -7.7912722135696319E-02 -7.7884786667165903E-02 -7.7856770462427075E-02 +-7.7828673385326577E-02 -7.7800495300748770E-02 -7.7772236074615420E-02 -7.7743895573885988E-02 -7.7715473666556845E-02 +-7.7686970221661752E-02 -7.7658385109271394E-02 -7.7629718200493122E-02 -7.7600969367471559E-02 -7.7572138483387496E-02 +-7.7543225422458423E-02 -7.7514230059937905E-02 -7.7485152272115818E-02 -7.7455991936317720E-02 -7.7426748930905467E-02 +-7.7397423135275853E-02 -7.7368014429861381E-02 -7.7338522696129772E-02 -7.7308947816583526E-02 -7.7279289674760193E-02 +-7.7249548155231301E-02 -7.7219723143603425E-02 -7.7189814526516423E-02 -7.7159822191644495E-02 -7.7129746027695331E-02 +-7.7099585924409658E-02 -7.7069341772561514E-02 -7.7039013463957640E-02 -7.7008600891437157E-02 -7.6978103948871307E-02 +-7.6947522531163631E-02 -7.6916856534248915E-02 -7.6886105855093367E-02 -7.6855270391694208E-02 -7.6824350043079193E-02 +-7.6793344709306571E-02 -7.6762254291464521E-02 -7.6731078691670909E-02 -7.6699817813072960E-02 -7.6668471559846560E-02 +-7.6637039837196760E-02 -7.6605522551356151E-02 -7.6573919609586052E-02 -7.6542230920174092E-02 -7.6510456392436171E-02 +-7.6478595936714105E-02 -7.6446649464376154E-02 -7.6414616887816561E-02 -7.6382498120454959E-02 -7.6350293076736159E-02 +-7.6318001672129321E-02 -7.6285623823127979E-02 -7.6253159447249225E-02 -7.6220608463033385E-02 -7.6187970790044052E-02 +-7.6155246348866515E-02 -7.6122435061108412E-02 -7.6089536849398592E-02 -7.6056551637386852E-02 -7.6023479349743392E-02 +-7.5990319912158336E-02 -7.5957073251341295E-02 -7.5923739295020831E-02 -7.5890317971943524E-02 -7.5856809211874474E-02 +-7.5823212945595492E-02 -7.5789529104905523E-02 -7.5755757622619685E-02 -7.5721898432568893E-02 -7.5687951469598752E-02 +-7.5653916669570137E-02 -7.5619793969357488E-02 -7.5585583306848600E-02 -7.5551284620944334E-02 -7.5516897851557852E-02 +-7.5482422939613575E-02 -7.5447859827047339E-02 -7.5413208456805450E-02 -7.5378468772843488E-02 -7.5343640720126823E-02 +-7.5308724244629033E-02 -7.5273719293331612E-02 -7.5238625814223678E-02 -7.5203443756300545E-02 -7.5168173069563554E-02 +-7.5132813705019466E-02 -7.5097365614679598E-02 -7.5061828751559229E-02 -7.5026203069676736E-02 -7.4990488524053323E-02 +-7.4954685070711860E-02 -7.4918792666676379E-02 -7.4882811269971525E-02 -7.4846740839621298E-02 -7.4810581335649107E-02 +-7.4774332719076464E-02 -7.4737994951922487E-02 -7.4701567997202789E-02 -7.4665051818929323E-02 -7.4628446382109345E-02 +-7.4591751652744329E-02 -7.4554967597829730E-02 -7.4518094185353850E-02 -7.4481131384297128E-02 -7.4444079164631777E-02 +-7.4406937497320080E-02 -7.4369706354314294E-02 -7.4332385708555951E-02 -7.4294975533974100E-02 -7.4257475805485779E-02 +-7.4219886498994220E-02 -7.4182207591388452E-02 -7.4144439060542078E-02 -7.4106580885312842E-02 -7.4068633045541871E-02 +-7.4030595522052281E-02 -7.3992468296648517E-02 -7.3954251352115766E-02 -7.3915944672218611E-02 -7.3877548241700744E-02 +-7.3839062046283335E-02 -7.3800486072664734E-02 -7.3761820308519285E-02 -7.3723064742496555E-02 -7.3684219364220260E-02 +-7.3645284164287367E-02 -7.3606259134267174E-02 -7.3567144266700635E-02 -7.3527939555099120E-02 -7.3488644993943211E-02 +-7.3449260578682452E-02 -7.3409786305734026E-02 -7.3370222172481167E-02 -7.3330568177273528E-02 -7.3290824319425019E-02 +-7.3250990599213084E-02 -7.3211067017878481E-02 -7.3171053577623282E-02 -7.3130950281610124E-02 -7.3090757133961237E-02 +-7.3050474139758112E-02 -7.3010101305039307E-02 -7.2969638636800130E-02 -7.2929086142991484E-02 -7.2888443832518829E-02 +-7.2847711715240959E-02 -7.2806889801969213E-02 -7.2765978104466111E-02 -7.2724976635444402E-02 -7.2683885408566545E-02 +-7.2642704438442340E-02 -7.2601433740629287E-02 -7.2560073331630212E-02 -7.2518623228893270E-02 -7.2477083450810192E-02 +-7.2435454016715167E-02 -7.2393734946884072E-02 -7.2351926262532965E-02 -7.2310027985817329E-02 -7.2268040139830445E-02 +-7.2225962748603101E-02 -7.2183795837101217E-02 -7.2141539431226018E-02 -7.2099193557811581E-02 -7.2056758244624708E-02 +-7.2014233520363291E-02 -7.1971619414655144E-02 -7.1928915958056852E-02 -7.1886123182052647E-02 -7.1843241119053117E-02 +-7.1800269802393846E-02 -7.1757209266334970E-02 -7.1714059546058639E-02 -7.1670820677669167E-02 -7.1627492698190798E-02 +-7.1584075645567069E-02 -7.1540569558659214E-02 -7.1496974477245248E-02 -7.1453290442018383E-02 -7.1409517494585933E-02 +-7.1365655677468054E-02 -7.1321705034096530E-02 -7.1277665608813420E-02 -7.1233537446869569E-02 -7.1189320594423927E-02 +-7.1145015098541486E-02 -7.1100621007192638E-02 -7.1056138369251426E-02 -7.1011567234494602E-02 -7.0966907653599934E-02 +-7.0922159678145080E-02 -7.0877323360606190E-02 -7.0832398754356984E-02 -7.0787385913666803E-02 -7.0742284893699256E-02 +-7.0697095750511627E-02 -7.0651818541052944E-02 -7.0606453323162302E-02 -7.0561000155568307E-02 -7.0515459097887173E-02 +-7.0469830210621406E-02 -7.0424113555158485E-02 -7.0378309193769695E-02 -7.0332417189608157E-02 -7.0286437606707802E-02 +-7.0240370509982400E-02 -7.0194215965222989E-02 -7.0147974039097588E-02 -7.0101644799149238E-02 -7.0055228313794862E-02 +-7.0008724652323329E-02 -6.9962133884894279E-02 -6.9915456082537103E-02 -6.9868691317148651E-02 -6.9821839661492718E-02 +-6.9774901189197810E-02 -6.9727875974755757E-02 -6.9680764093520892E-02 -6.9633565621707832E-02 -6.9586280636390552E-02 +-6.9538909215500211E-02 -6.9491451437824467E-02 -6.9443907383005196E-02 -6.9396277131537912E-02 -6.9348560764769251E-02 +-6.9300758364896062E-02 -6.9252870014963802E-02 -6.9204895798864866E-02 -6.9156835801337205E-02 -6.9108690107962695E-02 +-6.9060458805165606E-02 -6.9012141980211064E-02 -6.8963739721203385E-02 -6.8915252117084935E-02 -6.8866679257633803E-02 +-6.8818021233463283E-02 -6.8769278136018977E-02 -6.8720450057578708E-02 -6.8671537091249277E-02 -6.8622539330966723E-02 +-6.8573456871492952E-02 -6.8524289808415309E-02 -6.8475038238144659E-02 -6.8425702257913543E-02 -6.8376281965774791E-02 +-6.8326777460599786E-02 -6.8277188842077133E-02 -6.8227516210710534E-02 -6.8177759667817528E-02 -6.8127919315527627E-02 +-6.8077995256780877E-02 -6.8027987595325967E-02 -6.7977896435718665E-02 -6.7927721883320441E-02 -6.7877464044296357E-02 +-6.7827123025613376E-02 -6.7776698935039376E-02 -6.7726191881140554E-02 -6.7675601973280319E-02 -6.7624929321617538E-02 +-6.7574174037104293E-02 -6.7523336231485126E-02 -6.7472416017294756E-02 -6.7421413507856104E-02 -6.7370328817279196E-02 +-6.7319162060458917E-02 -6.7267913353073930E-02 -6.7216582811584116E-02 -6.7165170553229361E-02 -6.7113676696027594E-02 +-6.7062101358773427E-02 -6.7010444661035951E-02 -6.6958706723157124E-02 -6.6906887666249928E-02 -6.6854987612196978E-02 +-6.6803006683648303E-02 -6.6750945004019735E-02 -6.6698802697491108E-02 -6.6646579889004645E-02 -6.6594276704262712E-02 +-6.6541893269726982E-02 -6.6489429712615095E-02 -6.6436886160900335E-02 -6.6384262743309302E-02 -6.6331559589319536E-02 +-6.6278776829158614E-02 -6.6225914593801657E-02 -6.6172973014969827E-02 -6.6119952225128453E-02 -6.6066852357485092E-02 +-6.6013673545987778E-02 -6.5960415925323104E-02 -6.5907079630914439E-02 -6.5853664798920117E-02 -6.5800171566231219E-02 +-6.5746600070470410E-02 -6.5692950449989448E-02 -6.5639222843867362E-02 -6.5585417391908901E-02 -6.5531534234642599E-02 +-6.5477573513318427E-02 -6.5423535369906652E-02 -6.5369419947095109E-02 -6.5315227388288211E-02 -6.5260957837604022E-02 +-6.5206611439873344E-02 -6.5152188340637060E-02 -6.5097688686144600E-02 -6.5043112623351926E-02 -6.4988460299919670E-02 +-6.4933731864210947E-02 -6.4878927465289726E-02 -6.4824047252918918E-02 -6.4769091377557986E-02 -6.4714059990361561E-02 +-6.4658953243177067E-02 -6.4603771288542985E-02 -6.4548514279686872E-02 -6.4493182370523441E-02 -6.4437775715652290E-02 +-6.4382294470356372E-02 -6.4326738790599594E-02 -6.4271108833025198E-02 -6.4215404754953728E-02 -6.4159626714380621E-02 +-6.4103774869974914E-02 -6.4047849381076577E-02 -6.3991850407694770E-02 -6.3935778110506200E-02 -6.3879632650852447E-02 +-6.3823414190738531E-02 -6.3767122892830458E-02 -6.3710758920453456E-02 -6.3654322437589922E-02 -6.3597813608877438E-02 +-6.3541232599606548E-02 -6.3484579575718875E-02 -6.3427854703804867E-02 -6.3371058151102305E-02 -6.3314190085493591E-02 +-6.3257250675504056E-02 -6.3200240090299856E-02 -6.3143158499686006E-02 -6.3086006074103904E-02 -6.3028782984629897E-02 +-6.2971489402972647E-02 -6.2914125501471366E-02 -6.2856691453093708E-02 -6.2799187431433728E-02 -6.2741613610709401E-02 +-6.2683970165761174E-02 -6.2626257272049304E-02 -6.2568475105652277E-02 -6.2510623843264057E-02 -6.2452703662192854E-02 +-6.2394714740358195E-02 -6.2336657256288987E-02 -6.2278531389122108E-02 -6.2220337318599196E-02 -6.2162075225065436E-02 +-6.2103745289466869E-02 -6.2045347693348685E-02 -6.1986882618852726E-02 -6.1928350248715493E-02 -6.1869750766266191E-02 +-6.1811084355424213E-02 -6.1752351200697331E-02 -6.1693551487179470E-02 -6.1634685400548284E-02 -6.1575753127063641E-02 +-6.1516754853564712E-02 -6.1457690767468084E-02 -6.1398561056766013E-02 -6.1339365910023667E-02 -6.1280105516377185E-02 +-6.1220780065531763E-02 -6.1161389747758928E-02 -6.1101934753894714E-02 -6.1042415275337727E-02 -6.0982831504046181E-02 +-6.0923183632536716E-02 -6.0863471853881010E-02 -6.0803696361705011E-02 -6.0743857350185351E-02 -6.0683955014048163E-02 +-6.0623989548566258E-02 -6.0563961149557151E-02 -6.0503870013381089E-02 -6.0443716336938402E-02 -6.0383500317667267E-02 +-6.0323222153542098E-02 -6.0262882043070801E-02 -6.0202480185292451E-02 -6.0142016779775549E-02 -6.0081492026615363E-02 +-6.0020906126431905E-02 -5.9960259280367759E-02 -5.9899551690085449E-02 -5.9838783557765778E-02 -5.9777955086105221E-02 +-5.9717066478313402E-02 -5.9656117938111555E-02 -5.9595109669729959E-02 -5.9534041877905224E-02 -5.9472914767878735E-02 +-5.9411728545393866E-02 -5.9350483416694196E-02 -5.9289179588520736E-02 -5.9227817268109981E-02 -5.9166396663191637E-02 +-5.9104917981986103E-02 -5.9043381433202591E-02 -5.8981787226036336E-02 -5.8920135570166794E-02 -5.8858426675755200E-02 +-5.8796660753441851E-02 -5.8734838014344724E-02 -5.8672958670056320E-02 -5.8611022932641671E-02 -5.8549031014636557E-02 +-5.8486983129044122E-02 -5.8424879489333545E-02 -5.8362720309437295E-02 -5.8300505803748771E-02 -5.8238236187120401E-02 +-5.8175911674860852E-02 -5.8113532482733044E-02 -5.8051098826951579E-02 -5.7988610924180624E-02 -5.7926068991531590E-02 +-5.7863473246560597E-02 -5.7800823907266367E-02 -5.7738121192087967E-02 -5.7675365319902153E-02 -5.7612556510021187E-02 +-5.7549694982190869E-02 -5.7486780956587512E-02 -5.7423814653816165E-02 -5.7360796294907979E-02 -5.7297726101318197E-02 +-5.7234604294923129E-02 -5.7171431098018907E-02 -5.7108206733317846E-02 -5.7044931423947121E-02 -5.6981605393446016E-02 +-5.6918228865763351E-02 -5.6854802065255727E-02 -5.6791325216684480E-02 -5.6727798545213801E-02 -5.6664222276408424E-02 +-5.6600596636230592E-02 -5.6536921851038716E-02 -5.6473198147583913E-02 -5.6409425753008793E-02 -5.6345604894843859E-02 +-5.6281735801006358E-02 -5.6217818699796827E-02 -5.6153853819897487E-02 -5.6089841390369592E-02 -5.6025781640650953E-02 +-5.5961674800553557E-02 -5.5897521100261589E-02 -5.5833320770328529E-02 -5.5769074041674860E-02 -5.5704781145586080E-02 +-5.5640442313710008E-02 -5.5576057778054230E-02 -5.5511627770984118E-02 -5.5447152525220103E-02 -5.5382632273835677E-02 +-5.5318067250254212E-02 -5.5253457688247479E-02 -5.5188803821932954E-02 -5.5124105885771116E-02 -5.5059364114563164E-02 +-5.4994578743448867E-02 -5.4929750007904142E-02 -5.4864878143738152E-02 -5.4799963387091671E-02 -5.4735005974433940E-02 +-5.4670006142560811E-02 -5.4604964128592004E-02 -5.4539880169968920E-02 -5.4474754504451946E-02 -5.4409587370118459E-02 +-5.4344379005359905E-02 -5.4279129648880049E-02 -5.4213839539691770E-02 -5.4148508917115278E-02 -5.4083138020775377E-02 +-5.4017727090599113E-02 -5.3952276366813545E-02 -5.3886786089943017E-02 -5.3821256500806894E-02 -5.3755687840517180E-02 +-5.3690080350476038E-02 -5.3624434272373171E-02 -5.3558749848184019E-02 -5.3493027320166489E-02 -5.3427266930859231E-02 +-5.3361468923078886E-02 -5.3295633539917592E-02 -5.3229761024740752E-02 -5.3163851621184588E-02 -5.3097905573153477E-02 +-5.3031923124817949E-02 -5.2965904520611694E-02 -5.2899850005229780E-02 -5.2833759823625565E-02 -5.2767634221008927E-02 +-5.2701473442842969E-02 -5.2635277734842667E-02 -5.2569047342971457E-02 -5.2502782513439490E-02 -5.2436483492700747E-02 +-5.2370150527450809E-02 -5.2303783864624476E-02 -5.2237383751393127E-02 -5.2170950435162337E-02 -5.2104484163569754E-02 +-5.2037985184482195E-02 -5.1971453745993490E-02 -5.1904890096422095E-02 -5.1838294484308184E-02 -5.1771667158411992E-02 +-5.1705008367710581E-02 -5.1638318361396096E-02 -5.1571597388872570E-02 -5.1504845699754415E-02 -5.1438063543863100E-02 +-5.1371251171225082E-02 -5.1304408832069645E-02 -5.1237536776826034E-02 -5.1170635256121040E-02 -5.1103704520776734E-02 +-5.1036744821808235E-02 -5.0969756410420654E-02 -5.0902739538007259E-02 -5.0835694456146489E-02 -5.0768621416600233E-02 +-5.0701520671310632E-02 -5.0634392472397989E-02 -5.0567237072158586E-02 -5.0500054723061537E-02 -5.0432845677747161E-02 +-5.0365610189023982E-02 -5.0298348509866510E-02 -5.0231060893412706E-02 -5.0163747592961730E-02 -5.0096408861971170E-02 +-5.0029044954054858E-02 -4.9961656122980591E-02 -4.9894242622667076E-02 -4.9826804707182391E-02 -4.9759342630740472E-02 +-4.9691856647699699E-02 -4.9624347012559876E-02 -4.9556813979959806E-02 -4.9489257804675196E-02 -4.9421678741615870E-02 +-4.9354077045823348E-02 -4.9286452972468933E-02 -4.9218806776850463E-02 -4.9151138714390384E-02 -4.9083449040633324E-02 +-4.9015738011243662E-02 -4.8948005882002640E-02 -4.8880252908806529E-02 -4.8812479347664035E-02 -4.8744685454693598E-02 +-4.8676871486121105E-02 -4.8609037698277895E-02 -4.8541184347597535E-02 -4.8473311690613946E-02 -4.8405419983958912E-02 +-4.8337509484359428E-02 -4.8269580448635628E-02 -4.8201633133697956E-02 -4.8133667796545029E-02 -4.8065684694261257E-02 +-4.7997684084014045E-02 -4.7929666223051844E-02 -4.7861631368701398E-02 -4.7793579778365437E-02 -4.7725511709520475E-02 +-4.7657427419713828E-02 -4.7589327166561925E-02 -4.7521211207747091E-02 -4.7453079801015999E-02 -4.7384933204176589E-02 +-4.7316771675096014E-02 -4.7248595471697991E-02 -4.7180404851960601E-02 -4.7112200073913681E-02 -4.7043981395636765E-02 +-4.6975749075256104E-02 -4.6907503370942960E-02 -4.6839244540910589E-02 -4.6770972843412223E-02 -4.6702688536738472E-02 +-4.6634391879215038E-02 -4.6566083129200422E-02 -4.6497762545083067E-02 -4.6429430385279559E-02 -4.6361086908231847E-02 +-4.6292732372404860E-02 -4.6224367036284519E-02 -4.6155991158374730E-02 -4.6087604997195532E-02 -4.6019208811280368E-02 +-4.5950802859174071E-02 -4.5882387399429750E-02 -4.5813962690607425E-02 -4.5745528991270684E-02 -4.5677086559985189E-02 +-4.5608635655315671E-02 -4.5540176535823443E-02 -4.5471709460064812E-02 -4.5403234686587808E-02 -4.5334752473930588E-02 +-4.5266263080618596E-02 -4.5197766765162024E-02 -4.5129263786054134E-02 -4.5060754401768287E-02 -4.4992238870755770E-02 +-4.4923717451443822E-02 -4.4855190402232396E-02 -4.4786657981492631E-02 -4.4718120447564222E-02 -4.4649578058752880E-02 +-4.4581031073328239E-02 -4.4512479749521563E-02 -4.4443924345522953E-02 -4.4375365119479530E-02 -4.4306802329492780E-02 +-4.4238236233616487E-02 -4.4169667089854023E-02 -4.4101095156156310E-02 -4.4032520690419255E-02 -4.3963943950481789E-02 +-4.3895365194123098E-02 -4.3826784679060642E-02 -4.3758202662947721E-02 -4.3689619403370988E-02 -4.3621035157848369E-02 +-4.3552450183826655E-02 -4.3483864738679136E-02 -4.3415279079703481E-02 -4.3346693464118957E-02 -4.3278108149064916E-02 +-4.3209523391597615E-02 -4.3140939448688687E-02 -4.3072356577222068E-02 -4.3003775033992483E-02 -4.2935195075702613E-02 +-4.2866616958961032E-02 -4.2798040940279787E-02 -4.2729467276072221E-02 -4.2660896222650582E-02 -4.2592328036224050E-02 +-4.2523762972895882E-02 -4.2455201288661808E-02 -4.2386643239407003E-02 -4.2318089080904703E-02 -4.2249539068813131E-02 +-4.2180993458673703E-02 -4.2112452505908581E-02 -4.2043916465818364E-02 -4.1975385593580279E-02 -4.1906860144245203E-02 +-4.1838340372735879E-02 -4.1769826533844708E-02 -4.1701318882231130E-02 -4.1632817672419963E-02 -4.1564323158798329E-02 +-4.1495835595614268E-02 -4.1427355236974120E-02 -4.1358882336840208E-02 -4.1290417149028660E-02 -4.1221959927207334E-02 +-4.1153510924893541E-02 -4.1085070395451673E-02 -4.1016638592091072E-02 -4.0948215767864019E-02 -4.0879802175663116E-02 +-4.0811398068219450E-02 -4.0743003698100196E-02 -4.0674619317706516E-02 -4.0606245179271250E-02 -4.0537881534856816E-02 +-4.0469528636352989E-02 -4.0401186735474562E-02 -4.0332856083759652E-02 -4.0264536932566722E-02 -4.0196229533073266E-02 +-4.0127934136272927E-02 -4.0059650992973803E-02 -3.9991380353795999E-02 -3.9923122469169584E-02 -3.9854877589332413E-02 +-3.9786645964327932E-02 -3.9718427844003160E-02 -3.9650223478006105E-02 -3.9582033115784468E-02 -3.9513857006582449E-02 +-3.9445695399439547E-02 -3.9377548543187611E-02 -3.9309416686449390E-02 -3.9241300077636036E-02 -3.9173198964945061E-02 +-3.9105113596358064E-02 -3.9037044219639022E-02 -3.8968991082331650E-02 -3.8900954431757583E-02 -3.8832934515014454E-02 +-3.8764931578973268E-02 -3.8696945870276875E-02 -3.8628977635337264E-02 -3.8561027120334122E-02 -3.8493094571212264E-02 +-3.8425180233679718E-02 -3.8357284353205727E-02 -3.8289407175018379E-02 -3.8221548944102818E-02 -3.8153709905199257E-02 +-3.8085890302800511E-02 -3.8018090381150310E-02 -3.7950310384240932E-02 -3.7882550555811467E-02 -3.7814811139345636E-02 +-3.7747092378069419E-02 -3.7679394514949664E-02 -3.7611717792691464E-02 -3.7544062453736572E-02 -3.7476428740260907E-02 +-3.7408816894172955E-02 -3.7341227157111342E-02 -3.7273659770443404E-02 -3.7206114975262466E-02 -3.7138593012386291E-02 +-3.7071094122354958E-02 -3.7003618545428912E-02 -3.6936166521586801E-02 -3.6868738290523673E-02 -3.6801334091648916E-02 +-3.6733954164084127E-02 -3.6666598746661470E-02 -3.6599268077921410E-02 -3.6531962396110819E-02 -3.6464681939180975E-02 +-3.6397426944785781E-02 -3.6330197650279533E-02 -3.6262994292715234E-02 -3.6195817108842267E-02 -3.6128666335105093E-02 +-3.6061542207640539E-02 -3.5994444962276433E-02 -3.5927374834529388E-02 -3.5860332059603053E-02 -3.5793316872385961E-02 +-3.5726329507449903E-02 -3.5659370199047843E-02 -3.5592439181111817E-02 -3.5525536687251461E-02 -3.5458662950751819E-02 +-3.5391818204571407E-02 -3.5325002681340645E-02 -3.5258216613359622E-02 -3.5191460232596262E-02 -3.5124733770684799E-02 +-3.5058037458923268E-02 -3.4991371528272412E-02 -3.4924736209353026E-02 -3.4858131732444807E-02 -3.4791558327483992E-02 +-3.4725016224061746E-02 -3.4658505651422367E-02 -3.4592026838461153E-02 -3.4525580013722995E-02 -3.4459165405400137E-02 +-3.4392783241330716E-02 -3.4326433748996500E-02 -3.4260117155521679E-02 -3.4193833687670358E-02 -3.4127583571845345E-02 +-3.4061367034086076E-02 -3.3995184300066844E-02 -3.3929035595094886E-02 -3.3862921144109041E-02 -3.3796841171677382E-02 +-3.3730795901995826E-02 -3.3664785558886377E-02 -3.3598810365795019E-02 -3.3532870545790357E-02 -3.3466966321561716E-02 +-3.3401097915417177E-02 -3.3335265549282241E-02 -3.3269469444697740E-02 -3.3203709822818325E-02 -3.3137986904410638E-02 +-3.3072300909851512E-02 -3.3006652059126396E-02 -3.2941040571827611E-02 -3.2875466667152735E-02 -3.2809930563902488E-02 +-3.2744432480479604E-02 -3.2678972634886748E-02 -3.2613551244725016E-02 -3.2548168527192098E-02 -3.2482824699080856E-02 +-3.2417519976777297E-02 -3.2352254576259169E-02 -3.2287028713094322E-02 -3.2221842602438891E-02 -3.2156696459035704E-02 +-3.2091590497212837E-02 -3.2026524930881463E-02 -3.1961499973534847E-02 -3.1896515838246348E-02 -3.1831572737667797E-02 +-3.1766670884027993E-02 -3.1701810489131232E-02 -3.1636991764355325E-02 -3.1572214920650182E-02 -3.1507480168536370E-02 +-3.1442787718103452E-02 -3.1378137779008157E-02 -3.1313530560473077E-02 -3.1248966271285074E-02 -3.1184445119793576E-02 +-3.1119967313909112E-02 -3.1055533061101842E-02 -3.0991142568399618E-02 -3.0926796042387152E-02 -3.0862493689203643E-02 +-3.0798235714542026E-02 -3.0734022323646751E-02 -3.0669853721312815E-02 -3.0605730111883913E-02 -3.0541651699251115E-02 +-3.0477618686851227E-02 -3.0413631277665425E-02 -3.0349689674217573E-02 -3.0285794078572913E-02 -3.0221944692336699E-02 +-3.0158141716652213E-02 -3.0094385352200045E-02 -3.0030675799195806E-02 -2.9967013257389426E-02 -2.9903397926063235E-02 +-2.9839830004030673E-02 -2.9776309689634774E-02 -2.9712837180746868E-02 -2.9649412674765060E-02 -2.9586036368612845E-02 +-2.9522708458737501E-02 -2.9459429141109158E-02 -2.9396198611218949E-02 -2.9333017064077656E-02 -2.9269884694214571E-02 +-2.9206801695675900E-02 -2.9143768262023424E-02 -2.9080784586333227E-02 -2.9017850861194176E-02 -2.8954967278706688E-02 +-2.8892134030481208E-02 -2.8829351307637183E-02 -2.8766619300801346E-02 -2.8703938200106666E-02 -2.8641308195190750E-02 +-2.8578729475194818E-02 -2.8516202228762194E-02 -2.8453726644037045E-02 -2.8391302908662985E-02 -2.8328931209782009E-02 +-2.8266611734032967E-02 -2.8204344667550309E-02 -2.8142130195963046E-02 -2.8079968504393066E-02 -2.8017859777454260E-02 +-2.7955804199251089E-02 -2.7893801953377172E-02 -2.7831853222914326E-02 -2.7769958190431234E-02 -2.7708117037982059E-02 +-2.7646329947105339E-02 -2.7584597098822890E-02 -2.7522918673638298E-02 -2.7461294851535818E-02 -2.7399725811979483E-02 +-2.7338211733911280E-02 -2.7276752795750557E-02 -2.7215349175392509E-02 -2.7154001050207127E-02 -2.7092708597037898E-02 +-2.7031471992200785E-02 -2.6970291411483039E-02 -2.6909167030141921E-02 -2.6848099022903624E-02 -2.6787087563962350E-02 +-2.6726132826978770E-02 -2.6665234985079216E-02 -2.6604394210854448E-02 -2.6543610676358492E-02 -2.6482884553107572E-02 +-2.6422216012079145E-02 -2.6361605223710512E-02 -2.6301052357898060E-02 -2.6240557583995950E-02 -2.6180121070815021E-02 +-2.6119742986622001E-02 -2.6059423499138049E-02 -2.5999162775538105E-02 -2.5938960982449473E-02 -2.5878818285951021E-02 +-2.5818734851572128E-02 -2.5758710844291492E-02 -2.5698746428536284E-02 -2.5638841768180997E-02 -2.5578997026546629E-02 +-2.5519212366399466E-02 -2.5459487949950066E-02 -2.5399823938852598E-02 -2.5340220494203532E-02 -2.5280677776540708E-02 +-2.5221195945842496E-02 -2.5161775161526807E-02 -2.5102415582450004E-02 -2.5043117366906099E-02 -2.4983880672625716E-02 +-2.4924705656775285E-02 -2.4865592475955902E-02 -2.4806541286202580E-02 -2.4747552242983313E-02 -2.4688625501198130E-02 +-2.4629761215178122E-02 -2.4570959538684652E-02 -2.4512220624908505E-02 -2.4453544626468871E-02 -2.4394931695412566E-02 +-2.4336381983213039E-02 -2.4277895640769806E-02 -2.4219472818407247E-02 -2.4161113665873854E-02 -2.4102818332341555E-02 +-2.4044586966404796E-02 -2.3986419716079514E-02 -2.3928316728802624E-02 -2.3870278151431060E-02 -2.3812304130240915E-02 +-2.3754394810926664E-02 -2.3696550338600603E-02 -2.3638770857791664E-02 -2.3581056512444843E-02 -2.3523407445920609E-02 +-2.3465823800993667E-02 -2.3408305719852775E-02 -2.3350853344099469E-02 -2.3293466814747678E-02 -2.3236146272222806E-02 +-2.3178891856361086E-02 -2.3121703706408762E-02 -2.3064581961021451E-02 -2.3007526758263397E-02 -2.2950538235606846E-02 +-2.2893616529931153E-02 -2.2836761777522366E-02 -2.2779974114072277E-02 -2.2723253674677892E-02 -2.2666600593840843E-02 +-2.2610015005466451E-02 -2.2553497042863357E-02 -2.2497046838742679E-02 -2.2440664525217455E-02 -2.2384350233802110E-02 +-2.2328104095411506E-02 -2.2271926240360767E-02 -2.2215816798364200E-02 -2.2159775898535079E-02 -2.2103803669384803E-02 +-2.2047900238822450E-02 -2.1992065734154045E-02 -2.1936300282082134E-02 -2.1880604008705055E-02 -2.1824977039516524E-02 +-2.1769419499404932E-02 -2.1713931512653013E-02 -2.1658513202936963E-02 -2.1603164693326266E-02 -2.1547886106282915E-02 +-2.1492677563660995E-02 -2.1437539186706062E-02 -2.1382471096054758E-02 -2.1327473411734372E-02 -2.1272546253162099E-02 +-2.1217689739144684E-02 -2.1162903987877985E-02 -2.1108189116946532E-02 -2.1053545243322810E-02 -2.0998972483367153E-02 +-2.0944470952827029E-02 -2.0890040766836617E-02 -2.0835682039916554E-02 -2.0781394885973307E-02 -2.0727179418298734E-02 +-2.0673035749569964E-02 -2.0618963991848611E-02 -2.0564964256580505E-02 -2.0511036654595454E-02 -2.0457181296106585E-02 +-2.0403398290710160E-02 -2.0349687747385142E-02 -2.0296049774492859E-02 -2.0242484479776460E-02 -2.0188991970360753E-02 +-2.0135572352751954E-02 -2.0082225732837029E-02 -2.0028952215883612E-02 -1.9975751906539479E-02 -1.9922624908832540E-02 +-1.9869571326170142E-02 -1.9816591261339039E-02 -1.9763684816505041E-02 -1.9710852093212595E-02 -1.9658093192384658E-02 +-1.9605408214322328E-02 -1.9552797258704589E-02 -1.9500260424588068E-02 -1.9447797810406738E-02 -1.9395409513971781E-02 +-1.9343095632471108E-02 -1.9290856262469475E-02 -1.9238691499907857E-02 -1.9186601440103566E-02 -1.9134586177749803E-02 +-1.9082645806915592E-02 -1.9030780421045522E-02 -1.8978990112959563E-02 -1.8927274974852807E-02 -1.8875635098295492E-02 +-1.8824070574232549E-02 -1.8772581492983730E-02 -1.8721167944243132E-02 -1.8669830017079336E-02 -1.8618567799935166E-02 +-1.8567381380627350E-02 -1.8516270846346747E-02 -1.8465236283657930E-02 -1.8414277778499296E-02 -1.8363395416182714E-02 +-1.8312589281393551E-02 -1.8261859458190727E-02 -1.8211206030006286E-02 -1.8160629079645628E-02 -1.8110128689287179E-02 +-1.8059704940482573E-02 -1.8009357914156403E-02 -1.7959087690606272E-02 -1.7908894349502647E-02 -1.7858777969888891E-02 +-1.7808738630181276E-02 -1.7758776408168822E-02 -1.7708891381013340E-02 -1.7659083625249532E-02 -1.7609353216784755E-02 +-1.7559700230899235E-02 -1.7510124742245954E-02 -1.7460626824850719E-02 -1.7411206552112153E-02 -1.7361863996801754E-02 +-1.7312599231063864E-02 -1.7263412326415782E-02 -1.7214303353747882E-02 -1.7165272383323413E-02 -1.7116319484778885E-02 +-1.7067444727123852E-02 -1.7018648178741227E-02 -1.6969929907387191E-02 -1.6921289980191382E-02 -1.6872728463656936E-02 +-1.6824245423660653E-02 -1.6775840925453023E-02 -1.6727515033658408E-02 -1.6679267812275200E-02 -1.6631099324675814E-02 +-1.6583009633607041E-02 -1.6534998801189919E-02 -1.6487066888920127E-02 -1.6439213957668071E-02 -1.6391440067678949E-02 +-1.6343745278573085E-02 -1.6296129649345958E-02 -1.6248593238368515E-02 -1.6201136103387220E-02 -1.6153758301524487E-02 +-1.6106459889278564E-02 -1.6059240922524112E-02 -1.6012101456512023E-02 -1.5965041545870001E-02 -1.5918061244602634E-02 +-1.5871160606091606E-02 -1.5824339683096031E-02 -1.5777598527752620E-02 -1.5730937191575974E-02 -1.5684355725458992E-02 +-1.5637854179672821E-02 -1.5591432603867502E-02 -1.5545091047071932E-02 -1.5498829557694422E-02 -1.5452648183522865E-02 +-1.5406546971724954E-02 -1.5360525968848751E-02 -1.5314585220822729E-02 -1.5268724772956392E-02 -1.5222944669940269E-02 +-1.5177244955846519E-02 -1.5131625674129127E-02 -1.5086086867624388E-02 -1.5040628578551188E-02 -1.4995250848511291E-02 +-1.4949953718489886E-02 -1.4904737228855861E-02 -1.4859601419362160E-02 -1.4814546329146245E-02 -1.4769571996730476E-02 +-1.4724678460022509E-02 -1.4679865756315724E-02 -1.4635133922289569E-02 -1.4590482994010112E-02 -1.4545913006930306E-02 +-1.4501423995890661E-02 -1.4457015995119452E-02 -1.4412689038233253E-02 -1.4368443158237437E-02 -1.4324278387526684E-02 +-1.4280194757885275E-02 -1.4236192300487699E-02 -1.4192271045899079E-02 -1.4148431024075783E-02 -1.4104672264365712E-02 +-1.4060994795508975E-02 -1.4017398645638352E-02 -1.3973883842279725E-02 -1.3930450412352729E-02 -1.3887098382171163E-02 +-1.3843827777443625E-02 -1.3800638623273949E-02 -1.3757530944161878E-02 -1.3714504764003446E-02 -1.3671560106091741E-02 +-1.3628696993117240E-02 -1.3585915447168626E-02 -1.3543215489733118E-02 -1.3500597141697242E-02 -1.3458060423347342E-02 +-1.3415605354370233E-02 -1.3373231953853660E-02 -1.3330940240287050E-02 -1.3288730231562147E-02 -1.3246601944973416E-02 +-1.3204555397219001E-02 -1.3162590604400979E-02 -1.3120707582026369E-02 -1.3078906345007441E-02 -1.3037186907662665E-02 +-1.2995549283717166E-02 -1.2953993486303437E-02 -1.2912519527962053E-02 -1.2871127420642284E-02 -1.2829817175702871E-02 +-1.2788588803912532E-02 -1.2747442315450920E-02 -1.2706377719909031E-02 -1.2665395026290141E-02 -1.2624494243010429E-02 +-1.2583675377899593E-02 -1.2542938438201775E-02 -1.2502283430576154E-02 -1.2461710361097717E-02 -1.2421219235257991E-02 +-1.2380810057965793E-02 -1.2340482833547916E-02 -1.2300237565750114E-02 -1.2260074257737527E-02 -1.2219992912095747E-02 +-1.2179993530831450E-02 -1.2140076115373164E-02 -1.2100240666572120E-02 -1.2060487184703029E-02 -1.2020815669464859E-02 +-1.1981226119981659E-02 -1.1941718534803313E-02 -1.1902292911906504E-02 -1.1862949248695310E-02 -1.1823687542002257E-02 +-1.1784507788089038E-02 -1.1745409982647276E-02 -1.1706394120799539E-02 -1.1667460197100103E-02 -1.1628608205535755E-02 +-1.1589838139526779E-02 -1.1551149991927700E-02 -1.1512543755028212E-02 -1.1474019420554087E-02 -1.1435576979667987E-02 +-1.1397216422970391E-02 -1.1358937740500497E-02 -1.1320740921737101E-02 -1.1282625955599505E-02 -1.1244592830448470E-02 +-1.1206641534087031E-02 -1.1168772053761522E-02 -1.1130984376162473E-02 -1.1093278487425487E-02 -1.1055654373132254E-02 +-1.1018112018311455E-02 -1.0980651407439691E-02 -1.0943272524442512E-02 -1.0905975352695262E-02 -1.0868759875024144E-02 +-1.0831626073707148E-02 -1.0794573930474987E-02 -1.0757603426512182E-02 -1.0720714542457925E-02 -1.0683907258407141E-02 +-1.0647181553911490E-02 -1.0610537407980311E-02 -1.0573974799081667E-02 -1.0537493705143378E-02 -1.0501094103553960E-02 +-1.0464775971163718E-02 -1.0428539284285776E-02 -1.0392384018697009E-02 -1.0356310149639236E-02 -1.0320317651820085E-02 +-1.0284406499414193E-02 -1.0248576666064164E-02 -1.0212828124881656E-02 -1.0177160848448441E-02 -1.0141574808817467E-02 +-1.0106069977513909E-02 -1.0070646325536321E-02 -1.0035303823357584E-02 -1.0000042440926140E-02 -9.9648621476669755E-03 +-9.9297629124827352E-03 -9.8947447037548656E-03 -9.8598074893447019E-03 -9.8249512365945237E-03 -9.7901759123287455E-03 +-9.7554814828549937E-03 -9.7208679139652501E-03 -9.6863351709369373E-03 -9.6518832185341422E-03 -9.6175120210086323E-03 +-9.5832215421010874E-03 -9.5490117450422306E-03 -9.5148825925539544E-03 -9.4808340468505031E-03 -9.4468660696395961E-03 +-9.4129786221236467E-03 -9.3791716650009020E-03 -9.3454451584665914E-03 -9.3117990622141756E-03 -9.2782333354364498E-03 +-9.2447479368267717E-03 -9.2113428245802712E-03 -9.1780179563950379E-03 -9.1447732894732563E-03 -9.1116087805225010E-03 +-9.0785243857569257E-03 -9.0455200608984248E-03 -9.0125957611779054E-03 -8.9797514413365014E-03 -8.9469870556267723E-03 +-8.9143025578139762E-03 -8.8816979011772535E-03 -8.8491730385109237E-03 -8.8167279221257021E-03 -8.7843625038499049E-03 +-8.7520767350307924E-03 -8.7198705665357430E-03 -8.6877439487535683E-03 -8.6556968315957480E-03 -8.6237291644976795E-03 +-8.5918408964200128E-03 -8.5600319758498671E-03 -8.5283023508021666E-03 -8.4966519688208370E-03 -8.4650807769802057E-03 +-8.4335887218862041E-03 -8.4021757496777240E-03 -8.3708418060278490E-03 -8.3395868361452706E-03 -8.3084107847754517E-03 +-8.2773135962020700E-03 -8.2462952142482501E-03 -8.2153555822779209E-03 -8.1844946431971228E-03 -8.1537123394553428E-03 +-8.1230086130468643E-03 -8.0923834055120179E-03 -8.0618366579386681E-03 -8.0313683109634118E-03 -8.0009783047729714E-03 +-7.9706665791055859E-03 -7.9404330732523454E-03 -7.9102777260584879E-03 -7.8802004759248260E-03 -7.8502012608090872E-03 +-7.8202800182272745E-03 -7.7904366852550935E-03 -7.7606711985291846E-03 -7.7309834942486805E-03 -7.7013735081764602E-03 +-7.6718411756405720E-03 -7.6423864315356320E-03 -7.6130092103241917E-03 -7.5837094460381727E-03 -7.5544870722802047E-03 +-7.5253420222250803E-03 -7.4962742286211349E-03 -7.4672836237916511E-03 -7.4383701396362927E-03 -7.4095337076324746E-03 +-7.3807742588368180E-03 -7.3520917238865677E-03 -7.3234860330010166E-03 -7.2949571159828929E-03 -7.2665049022198639E-03 +-7.2381293206858627E-03 -7.2098302999426527E-03 -7.1816077681411501E-03 -7.1534616530229576E-03 -7.1253918819217301E-03 +-7.0973983817646854E-03 -7.0694810790740328E-03 -7.0416398999683990E-03 -7.0138747701643314E-03 -6.9861856149777213E-03 +-6.9585723593253001E-03 -6.9310349277260626E-03 -6.9035732443027869E-03 -6.8761872327834442E-03 -6.8488768165027233E-03 +-6.8216419184034729E-03 -6.7944824610382129E-03 -6.7673983665706063E-03 -6.7403895567768957E-03 -6.7134559530474701E-03 +-6.6865974763883132E-03 -6.6598140474224618E-03 -6.6331055863915770E-03 -6.6064720131573870E-03 -6.5799132472031917E-03 +-6.5534292076353824E-03 -6.5270198131849493E-03 -6.5006849822089475E-03 -6.4744246326920787E-03 -6.4482386822481350E-03 +-6.4221270481215429E-03 -6.3960896471889021E-03 -6.3701263959604435E-03 -6.3442372105816189E-03 -6.3184220068345856E-03 +-6.2926807001397458E-03 -6.2670132055572658E-03 -6.2414194377886038E-03 -6.2158993111780681E-03 -6.1904527397143279E-03 +-6.1650796370319580E-03 -6.1397799164129791E-03 -6.1145534907883978E-03 -6.0894002727397527E-03 -6.0643201745006507E-03 +-6.0393131079583507E-03 -6.0143789846552366E-03 -5.9895177157904570E-03 -5.9647292122214125E-03 -5.9400133844653745E-03 +-5.9153701427009679E-03 -5.8907993967697988E-03 -5.8663010561779694E-03 -5.8418750300976386E-03 -5.8175212273686647E-03 +-5.7932395565000530E-03 -5.7690299256716298E-03 -5.7448922427355206E-03 -5.7208264152178272E-03 -5.6968323503201008E-03 +-5.6729099549209941E-03 -5.6490591355777562E-03 -5.6252797985279100E-03 -5.6015718496907627E-03 -5.5779351946690084E-03 +-5.5543697387503040E-03 -5.5308753869088697E-03 -5.5074520438070824E-03 -5.4840996137970107E-03 -5.4608180009220681E-03 +-5.4376071089185839E-03 -5.4144668412173811E-03 -5.3913971009453580E-03 -5.3683977909271480E-03 -5.3454688136866397E-03 +-5.3226100714486076E-03 -5.2998214661403274E-03 -5.2771028993931594E-03 -5.2544542725441292E-03 -5.2318754866375718E-03 +-5.2093664424267072E-03 -5.1869270403752717E-03 -5.1645571806590651E-03 -5.1422567631676528E-03 -5.1200256875058850E-03 +-5.0978638529955624E-03 -5.0757711586770097E-03 -5.0537475033107142E-03 -5.0317927853789426E-03 -5.0099069030873173E-03 +-4.9880897543664680E-03 -4.9663412368736448E-03 -4.9446612479943077E-03 -4.9230496848437699E-03 -4.9015064442688040E-03 +-4.8800314228492677E-03 -4.8586245168997155E-03 -4.8372856224710411E-03 -4.8160146353520587E-03 -4.7948114510711678E-03 +-4.7736759648979400E-03 -4.7526080718447699E-03 -4.7316076666685030E-03 -4.7106746438720258E-03 -4.6898088977059219E-03 +-4.6690103221700826E-03 -4.6482788110153543E-03 -4.6276142577451329E-03 -4.6070165556170396E-03 -4.5864855976444777E-03 +-4.5660212765983492E-03 -4.5456234850086031E-03 -4.5252921151659039E-03 -4.5050270591232905E-03 -4.4848282086977437E-03 +-4.4646954554718515E-03 -4.4446286907954529E-03 -4.4246278057872334E-03 -4.4046926913363848E-03 -4.3848232381042233E-03 +-4.3650193365258510E-03 -4.3452808768117256E-03 -4.3256077489493604E-03 -4.3059998427049271E-03 -4.2864570476248724E-03 +-4.2669792530375802E-03 -4.2475663480550018E-03 -4.2282182215742613E-03 -4.2089347622793257E-03 -4.1897158586426050E-03 +-4.1705613989266111E-03 -4.1514712711855821E-03 -4.1324453632671032E-03 -4.1134835628137637E-03 -4.0945857572647721E-03 +-4.0757518338575879E-03 -4.0569816796295604E-03 -4.0382751814195747E-03 -4.0196322258696498E-03 -4.0010526994266058E-03 +-3.9825364883436772E-03 -3.9640834786821427E-03 -3.9456935563129793E-03 -3.9273666069184468E-03 -3.9091025159937766E-03 +-3.8909011688487518E-03 -3.8727624506093641E-03 -3.8546862462194558E-03 -3.8366724404422974E-03 -3.8187209178622691E-03 +-3.8008315628864689E-03 -3.7830042597463368E-03 -3.7652388924992795E-03 -3.7475353450303027E-03 -3.7298935010536493E-03 +-3.7123132441144015E-03 -3.6947944575901120E-03 -3.6773370246924474E-03 -3.6599408284687784E-03 -3.6426057518038350E-03 +-3.6253316774212951E-03 -3.6081184878854478E-03 -3.5909660656027686E-03 -3.5738742928235821E-03 -3.5568430516436326E-03 +-3.5398722240057552E-03 -3.5229616917014481E-03 -3.5061113363725146E-03 -3.4893210395126753E-03 -3.4725906824691686E-03 +-3.4559201464443791E-03 -3.4393093124974435E-03 -3.4227580615458666E-03 -3.4062662743671221E-03 -3.3898338316002822E-03 +-3.3734606137475892E-03 -3.3571465011761107E-03 -3.3408913741193075E-03 -3.3246951126786541E-03 -3.3085575968252409E-03 +-3.2924787064013759E-03 -3.2764583211221869E-03 -3.2604963205772248E-03 -3.2445925842320513E-03 -3.2287469914298603E-03 +-3.2129594213930477E-03 -3.1972297532248122E-03 -3.1815578659107695E-03 -3.1659436383205211E-03 -3.1503869492092544E-03 +-3.1348876772193308E-03 -3.1194457008818935E-03 -3.1040608986184033E-03 -3.0887331487422808E-03 -3.0734623294604666E-03 +-3.0582483188749828E-03 -3.0430909949845605E-03 -3.0279902356861754E-03 -3.0129459187766424E-03 -2.9979579219542073E-03 +-2.9830261228200872E-03 -2.9681503988800741E-03 -2.9533306275460829E-03 -2.9385666861377465E-03 -2.9238584518839544E-03 +-2.9092058019244442E-03 -2.8946086133113448E-03 -2.8800667630107489E-03 -2.8655801279042835E-03 -2.8511485847906499E-03 +-2.8367720103871885E-03 -2.8224502813314380E-03 -2.8081832741826845E-03 -2.7939708654235048E-03 -2.7798129314613351E-03 +-2.7657093486300041E-03 -2.7516599931912819E-03 -2.7376647413364227E-03 -2.7237234691877030E-03 -2.7098360527999720E-03 +-2.6960023681621673E-03 -2.6822222911988911E-03 -2.6684956977718905E-03 -2.6548224636816250E-03 -2.6412024646687874E-03 +-2.6276355764158284E-03 -2.6141216745484718E-03 -2.6006606346372532E-03 -2.5872523321990421E-03 -2.5738966426985289E-03 +-2.5605934415497840E-03 -2.5473426041177343E-03 -2.5341440057196963E-03 -2.5209975216268707E-03 -2.5079030270658714E-03 +-2.4948603972201932E-03 -2.4818695072317547E-03 -2.4689302322023596E-03 -2.4560424471952221E-03 -2.4432060272364443E-03 +-2.4304208473165186E-03 -2.4176867823918003E-03 -2.4050037073860262E-03 -2.3923714971917590E-03 -2.3797900266718996E-03 +-2.3672591706611593E-03 -2.3547788039675185E-03 -2.3423488013737314E-03 -2.3299690376387709E-03 -2.3176393874993163E-03 +-2.3053597256711966E-03 -2.2931299268508887E-03 -2.2809498657169343E-03 -2.2688194169314417E-03 -2.2567384551415073E-03 +-2.2447068549806847E-03 -2.2327244910704397E-03 -2.2207912380215696E-03 -2.2089069704356898E-03 -2.1970715629066337E-03 +-2.1852848900219125E-03 -2.1735468263641582E-03 -2.1618572465125318E-03 -2.1502160250441715E-03 -2.1386230365356188E-03 +-2.1270781555642318E-03 -2.1155812567096193E-03 -2.1041322145550442E-03 -2.0927309036888561E-03 -2.0813771987058839E-03 +-2.0700709742088614E-03 -2.0588121048098237E-03 -2.0476004651315055E-03 -2.0364359298087617E-03 -2.0253183734899377E-03 +-2.0142476708382802E-03 -2.0032236965333212E-03 -1.9922463252722705E-03 -1.9813154317713817E-03 -1.9704308907673705E-03 +-1.9595925770187462E-03 -1.9488003653072108E-03 -1.9380541304390444E-03 -1.9273537472464370E-03 -1.9166990905888880E-03 +-1.9060900353545360E-03 -1.8955264564615442E-03 -1.8850082288594343E-03 -1.8745352275304601E-03 -1.8641073274909259E-03 +-1.8537244037925586E-03 -1.8433863315238279E-03 -1.8330929858113040E-03 -1.8228442418209718E-03 -1.8126399747595725E-03 +-1.8024800598759358E-03 -1.7923643724622850E-03 -1.7822927878555835E-03 -1.7722651814388306E-03 -1.7622814286423847E-03 +-1.7523414049452643E-03 -1.7424449858764676E-03 -1.7325920470162640E-03 -1.7227824639974988E-03 -1.7130161125068866E-03 +-1.7032928682863015E-03 -1.6936126071340656E-03 -1.6839752049062431E-03 -1.6743805375179042E-03 -1.6648284809444172E-03 +-1.6553189112227093E-03 -1.6458517044525489E-03 -1.6364267367978019E-03 -1.6270438844877043E-03 -1.6177030238181060E-03 +-1.6084040311527392E-03 -1.5991467829244565E-03 -1.5899311556364926E-03 -1.5807570258637024E-03 -1.5716242702537898E-03 +-1.5625327655285628E-03 -1.5534823884851402E-03 -1.5444730159972109E-03 -1.5355045250162289E-03 -1.5265767925726477E-03 +-1.5176896957771408E-03 -1.5088431118218028E-03 -1.5000369179813569E-03 -1.4912709916143740E-03 -1.4825452101644623E-03 +-1.4738594511614629E-03 -1.4652135922226476E-03 -1.4566075110538986E-03 -1.4480410854509082E-03 -1.4395141933003430E-03 +-1.4310267125810306E-03 -1.4225785213651282E-03 -1.4141694978192861E-03 -1.4057995202058260E-03 -1.3974684668838805E-03 +-1.3891762163105706E-03 -1.3809226470421424E-03 -1.3727076377351194E-03 -1.3645310671474456E-03 -1.3563928141396310E-03 +-1.3482927576758705E-03 -1.3402307768251953E-03 -1.3322067507625793E-03 -1.3242205587700880E-03 -1.3162720802379656E-03 +-1.3083611946657725E-03 -1.3004877816634865E-03 -1.2926517209526044E-03 -1.2848528923672532E-03 -1.2770911758552819E-03 +-1.2693664514793490E-03 -1.2616785994180222E-03 -1.2540274999668533E-03 -1.2464130335394636E-03 -1.2388350806686161E-03 +-1.2312935220072862E-03 -1.2237882383297322E-03 -1.2163191105325573E-03 -1.2088860196357606E-03 -1.2014888467837979E-03 +-1.1941274732466380E-03 -1.1868017804207822E-03 -1.1795116498303346E-03 -1.1722569631280213E-03 -1.1650376020962221E-03 +-1.1578534486480089E-03 -1.1507043848281507E-03 -1.1435902928141491E-03 -1.1365110549172400E-03 -1.1294665535834130E-03 +-1.1224566713944051E-03 -1.1154812910687088E-03 -1.1085402954625673E-03 -1.1016335675709625E-03 -1.0947609905286033E-03 +-1.0879224476109052E-03 -1.0811178222349745E-03 -1.0743469979605754E-03 -1.0676098584910996E-03 -1.0609062876745345E-03 +-1.0542361695044153E-03 -1.0475993881207829E-03 -1.0409958278111405E-03 -1.0344253730113857E-03 -1.0278879083067648E-03 +-1.0213833184327982E-03 -1.0149114882762236E-03 -1.0084723028759113E-03 -1.0020656474237942E-03 -9.9569140726578202E-04 +-9.8934946790267390E-04 -9.8303971499107720E-04 -9.7676203434429059E-04 -9.7051631193322528E-04 -9.6430243388728103E-04 +-9.5812028649524996E-04 -9.5196975620619152E-04 -9.4585072963032060E-04 -9.3976309353987618E-04 -9.3370673486999490E-04 +-9.2768154071958030E-04 -9.2168739835215988E-04 -9.1572419519674161E-04 -9.0979181884866928E-04 -9.0389015707047010E-04 +-8.9801909779268759E-04 -8.9217852911473042E-04 -8.8636833930570398E-04 -8.8058841680523298E-04 -8.7483865022428301E-04 +-8.6911892834598905E-04 -8.6342914012646195E-04 -8.5776917469559868E-04 -8.5213892135788236E-04 -8.4653826959319182E-04 +-8.4096710905758564E-04 -8.3542532958409818E-04 -8.2991282118352171E-04 -8.2442947404518549E-04 -8.1897517853773234E-04 +-8.1354982520989347E-04 -8.0815330479124274E-04 -8.0278550819296881E-04 -7.9744632650862379E-04 -7.9213565101487918E-04 +-7.8685337317226458E-04 -7.8159938462591858E-04 -7.7637357720631748E-04 -7.7117584293001033E-04 -7.6600607400034411E-04 +-7.6086416280818630E-04 -7.5575000193264146E-04 -7.5066348414176579E-04 -7.4560450239326574E-04 -7.4057294983521211E-04 +-7.3556871980672977E-04 -7.3059170583868757E-04 -7.2564180165439712E-04 -7.2071890117028495E-04 -7.1582289849657127E-04 +-7.1095368793795102E-04 -7.0611116399424965E-04 -7.0129522136109645E-04 -6.9650575493057881E-04 -6.9174265979189415E-04 +-6.8700583123199933E-04 -6.8229516473625391E-04 -6.7761055598906017E-04 -6.7295190087449379E-04 -6.6831909547693507E-04 +-6.6371203608169092E-04 -6.5913061917561319E-04 -6.5457474144771757E-04 -6.5004429978978145E-04 -6.4553919129696274E-04 +-6.4105931326838576E-04 -6.3660456320774274E-04 -6.3217483882388361E-04 -6.2777003803139101E-04 -6.2339005895117330E-04 +-6.1903479991102974E-04 -6.1470415944622173E-04 -6.1039803630003769E-04 -6.0611632942435582E-04 -6.0185893798019171E-04 +-5.9762576133825574E-04 -5.9341669907949431E-04 -5.8923165099562878E-04 -5.8507051708969369E-04 -5.8093319757656291E-04 +-5.7681959288347811E-04 -5.7272960365056813E-04 -5.6866313073136168E-04 -5.6462007519330064E-04 -5.6060033831824882E-04 +-5.5660382160298120E-04 -5.5263042675969228E-04 -5.4868005571647859E-04 -5.4475261061782629E-04 -5.4084799382509720E-04 +-5.3696610791699527E-04 -5.3310685569004442E-04 -5.2927014015905340E-04 -5.2545586455757622E-04 -5.2166393233836744E-04 +-5.1789424717383552E-04 -5.1414671295649066E-04 -5.1042123379937878E-04 -5.0671771403652940E-04 -5.0303605822337892E-04 +-4.9937617113719930E-04 -4.9573795777752168E-04 -4.9212132336655455E-04 -4.8852617334959334E-04 -4.8495241339542588E-04 +-4.8139994939673959E-04 -4.7786868747052029E-04 -4.7435853395843527E-04 -4.7086939542723247E-04 -4.6740117866911633E-04 +-4.6395379070212766E-04 -4.6052713877051913E-04 -4.5712113034512207E-04 -4.5373567312370655E-04 -4.5037067503134572E-04 +-4.4702604422076832E-04 -4.4370168907270510E-04 -4.4039751819623373E-04 -4.3711344042912003E-04 -4.3384936483815344E-04 +-4.3060520071947124E-04 -4.2738085759888881E-04 -4.2417624523221828E-04 -4.2099127360558394E-04 -4.1782585293572881E-04 +-4.1467989367032653E-04 -4.1155330648828071E-04 -4.0844600230001665E-04 -4.0535789224777850E-04 -4.0228888770590997E-04 +-3.9923890028114228E-04 -3.9620784181286641E-04 -3.9319562437340936E-04 -3.9020216026829568E-04 -3.8722736203651749E-04 +-3.8427114245078662E-04 -3.8133341451779176E-04 -3.7841409147844503E-04 -3.7551308680812569E-04 -3.7263031421692103E-04 +-3.6976568764985907E-04 -3.6691912128713848E-04 -3.6409052954435511E-04 -3.6127982707271971E-04 -3.5848692875927645E-04 +-3.5571174972711268E-04 -3.5295420533556213E-04 -3.5021421118041355E-04 -3.4749168309410131E-04 -3.4478653714589995E-04 +-3.4209868964211348E-04 -3.3942805712625600E-04 -3.3677455637923102E-04 -3.3413810441950634E-04 -3.3151861850328054E-04 +-3.2891601612465180E-04 -3.2633021501577407E-04 -3.2376113314701370E-04 -3.2120868872710179E-04 -3.1867280020327993E-04 +-3.1615338626143821E-04 -3.1365036582625916E-04 -3.1116365806134499E-04 -3.0869318236934713E-04 -3.0623885839209126E-04 +-3.0380060601069427E-04 -3.0137834534568135E-04 -2.9897199675709297E-04 -2.9658148084459388E-04 -2.9420671844756986E-04 +-2.9184763064522872E-04 -2.8950413875669060E-04 -2.8717616434107454E-04 -2.8486362919758336E-04 -2.8256645536558242E-04 +-2.8028456512467313E-04 -2.7801788099476334E-04 -2.7576632573613293E-04 -2.7352982234949509E-04 -2.7130829407605311E-04 +-2.6910166439755189E-04 -2.6690985703632842E-04 -2.6473279595535143E-04 -2.6257040535826573E-04 -2.6042260968942293E-04 +-2.5828933363391426E-04 -2.5617050211759588E-04 -2.5406604030711323E-04 -2.5197587360991492E-04 -2.4989992767427012E-04 +-2.4783812838927470E-04 -2.4579040188485852E-04 -2.4375667453178536E-04 -2.4173687294164802E-04 -2.3973092396686231E-04 +-2.3773875470065468E-04 -2.3576029247704517E-04 -2.3379546487082778E-04 -2.3184419969754687E-04 -2.2990642501346541E-04 +-2.2798206911553543E-04 -2.2607106054135911E-04 -2.2417332806914735E-04 -2.2228880071767642E-04 -2.2041740774623577E-04 +-2.1855907865457703E-04 -2.1671374318285461E-04 -2.1488133131156544E-04 -2.1306177326148098E-04 -2.1125499949358064E-04 +-2.0946094070897609E-04 -2.0767952784883138E-04 -2.0591069209428483E-04 -2.0415436486636185E-04 -2.0241047782588320E-04 +-2.0067896287337392E-04 -1.9895975214896276E-04 -1.9725277803228226E-04 -1.9555797314236320E-04 -1.9387527033752337E-04 +-1.9220460271525503E-04 -1.9054590361210742E-04 -1.8889910660356541E-04 -1.8726414550392383E-04 -1.8564095436615841E-04 +-1.8402946748179448E-04 -1.8242961938076649E-04 -1.8084134483128153E-04 -1.7926457883967294E-04 -1.7769925665025107E-04 +-1.7614531374515440E-04 -1.7460268584419027E-04 -1.7307130890467751E-04 -1.7155111912128330E-04 -1.7004205292585510E-04 +-1.6854404698725005E-04 -1.6705703821116223E-04 -1.6558096373994220E-04 -1.6411576095241758E-04 -1.6266136746370528E-04 +-1.6121772112502575E-04 -1.5978476002350634E-04 -1.5836242248198868E-04 -1.5695064705882606E-04 -1.5554937254768196E-04 +-1.5415853797732130E-04 -1.5277808261140278E-04 -1.5140794594826093E-04 -1.5004806772069102E-04 -1.4869838789572794E-04 +-1.4735884667442037E-04 -1.4602938449160353E-04 -1.4470994201566702E-04 -1.4340046014832072E-04 -1.4210088002435540E-04 +-1.4081114301140189E-04 -1.3953119070968454E-04 -1.3826096495177289E-04 -1.3700040780233115E-04 -1.3574946155786051E-04 +-1.3450806874644219E-04 -1.3327617212747424E-04 -1.3205371469140732E-04 -1.3084063965947441E-04 -1.2963689048342081E-04 +-1.2844241084522746E-04 -1.2725714465683304E-04 -1.2608103605985226E-04 -1.2491402942529039E-04 -1.2375606935325690E-04 +-1.2260710067267164E-04 -1.2146706844097246E-04 -1.2033591794381626E-04 -1.1921359469477982E-04 -1.1810004443505367E-04 +-1.1699521313313690E-04 -1.1589904698452670E-04 -1.1481149241140483E-04 -1.1373249606232163E-04 -1.1266200481187674E-04 +-1.1159996576039692E-04 -1.1054632623361112E-04 -1.0950103378232131E-04 -1.0846403618207201E-04 -1.0743528143281593E-04 +-1.0641471775857651E-04 -1.0540229360710849E-04 -1.0439795764955458E-04 -1.0340165878009937E-04 -1.0241334611562060E-04 +-1.0143296899533852E-04 -1.0046047698045991E-04 -9.9495819853822305E-05 -9.8538947619532876E-05 -9.7589810502605870E-05 +-9.6648358948597652E-05 -9.5714543623237028E-05 -9.4788315412055158E-05 -9.3869625420011507E-05 -9.2958424971116836E-05 +-9.2054665608054618E-05 -9.1158299091798119E-05 -9.0269277401227435E-05 -8.9387552732740616E-05 -8.8513077499864813E-05 +-8.7645804332863597E-05 -8.6785686078341657E-05 -8.5932675798847834E-05 -8.5086726772474536E-05 -8.4247792492455240E-05 +-8.3415826666759121E-05 -8.2590783217683357E-05 -8.1772616281443333E-05 -8.0961280207759705E-05 -8.0156729559443493E-05 +-7.9358919111978198E-05 -7.8567803853100398E-05 -7.7783338982377294E-05 -7.7005479910781537E-05 -7.6234182260265191E-05 +-7.5469401863329199E-05 -7.4711094762592409E-05 -7.3959217210357476E-05 -7.3213725668174631E-05 -7.2474576806402511E-05 +-7.1741727503767911E-05 -7.1015134846922809E-05 -7.0294756129998906E-05 -6.9580548854159801E-05 -6.8872470727152042E-05 +-6.8170479662852548E-05 -6.7474533780815350E-05 -6.6784591405815003E-05 -6.6100611067388930E-05 -6.5422551499376235E-05 +-6.4750371639456271E-05 -6.4084030628683948E-05 -6.3423487811022823E-05 -6.2768702732877090E-05 -6.2119635142621283E-05 +-6.1476244990126905E-05 -6.0838492426289350E-05 -6.0206337802550200E-05 -5.9579741670419985E-05 -5.8958664780997110E-05 +-5.8343068084486257E-05 -5.7732912729714388E-05 -5.7128160063644785E-05 -5.6528771630889357E-05 -5.5934709173218932E-05 +-5.5345934629072418E-05 -5.4762410133063445E-05 -5.4184098015485412E-05 -5.3610960801815004E-05 -5.3042961212213954E-05 +-5.2480062161028826E-05 -5.1922226756289129E-05 -5.1369418299204257E-05 -5.0821600283658217E-05 -5.0278736395702787E-05 +-4.9740790513049458E-05 -4.9207726704559164E-05 -4.8679509229730838E-05 -4.8156102538188563E-05 -4.7637471269166545E-05 +-4.7123580250993260E-05 -4.6614394500573340E-05 -4.6109879222868815E-05 -4.5609999810378155E-05 -4.5114721842614113E-05 +-4.4624011085580565E-05 -4.4137833491246793E-05 -4.3656155197021850E-05 -4.3178942525226187E-05 -4.2706161982562699E-05 +-4.2237780259586375E-05 -4.1773764230172026E-05 -4.1314080950981701E-05 -4.0858697660929706E-05 -4.0407581780647191E-05 +-3.9960700911944943E-05 -3.9518022837275294E-05 -3.9079515519192618E-05 -3.8645147099812583E-05 -3.8214885900270463E-05 +-3.7788700420177856E-05 -3.7366559337078649E-05 -3.6948431505903836E-05 -3.6534285958424759E-05 -3.6124091902705703E-05 +-3.5717818722555501E-05 -3.5315435976977579E-05 -3.4916913399619133E-05 -3.4522220898219766E-05 -3.4131328554058501E-05 +-3.3744206621399841E-05 -3.3360825526939470E-05 -3.2981155869248079E-05 -3.2605168418215101E-05 -3.2232834114491052E-05 +-3.1864124068929032E-05 -3.1499009562025350E-05 -3.1137462043359516E-05 -3.0779453131032958E-05 -3.0424954611107280E-05 +-3.0073938437041429E-05 -2.9726376729128372E-05 -2.9382241773930690E-05 -2.9041506023715526E-05 -2.8704142095888802E-05 +-2.8370122772428855E-05 -2.8039420999318920E-05 -2.7712009885979468E-05 -2.7387862704699494E-05 -2.7066952890067346E-05 +-2.6749254038400712E-05 -2.6434739907176226E-05 -2.6123384414458172E-05 -2.5815161638326990E-05 -2.5510045816307018E-05 +-2.5208011344793225E-05 -2.4909032778478491E-05 -2.4613084829779129E-05 -2.4320142368260899E-05 -2.4030180420063823E-05 +-2.3743174167327156E-05 -2.3459098947613266E-05 -2.3177930253331623E-05 -2.2899643731162029E-05 -2.2624215181477687E-05 +-2.2351620557767570E-05 -2.2081835966058815E-05 -2.1814837664338482E-05 -2.1550602061975068E-05 -2.1289105719139645E-05 +-2.1030325346226987E-05 -2.0774237803275835E-05 -2.0520820099389521E-05 -2.0270049392156036E-05 -2.0021902987067650E-05 +-1.9776358336940892E-05 -1.9533393041335773E-05 -1.9292984845975158E-05 -1.9055111642163772E-05 -1.8819751466207187E-05 +-1.8586882498830649E-05 -1.8356483064597782E-05 -1.8128531631329061E-05 -1.7903006809520397E-05 -1.7679887351761593E-05 +-1.7459152152154692E-05 -1.7240780245732221E-05 -1.7024750807875580E-05 -1.6811043153733451E-05 -1.6599636737639877E-05 +-1.6390511152532851E-05 -1.6183646129372486E-05 -1.5979021536559564E-05 -1.5776617379354094E-05 -1.5576413799293741E-05 +-1.5378391073612744E-05 -1.5182529614660476E-05 -1.4988809969320735E-05 -1.4797212818430468E-05 -1.4607718976199387E-05 +-1.4420309389629168E-05 -1.4234965137933248E-05 -1.4051667431956653E-05 -1.3870397613596031E-05 -1.3691137155220004E-05 +-1.3513867659089785E-05 -1.3338570856780031E-05 -1.3165228608599934E-05 -1.2993822903014684E-05 -1.2824335856067303E-05 +-1.2656749710800619E-05 -1.2491046836679747E-05 -1.2327209729014973E-05 -1.2165221008384783E-05 -1.2005063420059514E-05 +-1.1846719833425319E-05 -1.1690173241408527E-05 -1.1535406759900472E-05 -1.1382403627182794E-05 -1.1231147203353055E-05 +-1.1081620969751117E-05 -1.0933808528385677E-05 -1.0787693601361574E-05 -1.0643260030307424E-05 -1.0500491775803923E-05 +-1.0359372916812666E-05 -1.0219887650105405E-05 -1.0082020289694103E-05 -9.9457552662612926E-06 -9.8110771265914088E-06 +-9.6779705330023099E-06 -9.5464202627777726E-06 -9.4164112076004336E-06 -9.2879283729854640E-06 -9.1609568777149189E-06 +-9.0354819532726661E-06 -8.9114889432802285E-06 -8.7889633029330484E-06 -8.6678905984376980E-06 -8.5482565064497528E-06 +-8.4300468135123550E-06 -8.3132474154956261E-06 -8.1978443170368106E-06 -8.0838236309811818E-06 -7.9711715778237774E-06 +-7.8598744851519658E-06 -7.7499187870888247E-06 -7.6412910237372339E-06 -7.5339778406250462E-06 -7.4279659881509605E-06 +-7.3232423210312269E-06 -7.2197937977474076E-06 -7.1176074799949223E-06 -7.0166705321324560E-06 -6.9169702206324236E-06 +-6.8184939135322343E-06 -6.7212290798866074E-06 -6.6251632892207959E-06 -6.5302842109847233E-06 -6.4365796140082191E-06 +-6.3440373659571697E-06 -6.2526454327906558E-06 -6.1623918782191580E-06 -6.0732648631637366E-06 -5.9852526452163222E-06 +-5.8983435781009547E-06 -5.8125261111361455E-06 -5.7277887886983304E-06 -5.6441202496863016E-06 -5.5615092269868487E-06 +-5.4799445469414257E-06 -5.3994151288140039E-06 -5.3199099842598920E-06 -5.2414182167959242E-06 -5.1639290212715773E-06 +-5.0874316833413793E-06 -5.0119155789384107E-06 -4.9373701737490190E-06 -4.8637850226887005E-06 -4.7911497693791897E-06 +-4.7194541456267284E-06 -4.6486879709016058E-06 -4.5788411518188496E-06 -4.5099036816202144E-06 -4.4418656396573689E-06 +-4.3747171908764052E-06 -4.3084485853034992E-06 -4.2430501575319608E-06 -4.1785123262105147E-06 -4.1148255935328455E-06 +-4.0519805447284924E-06 -3.9899678475550555E-06 -3.9287782517916543E-06 -3.8684025887338123E-06 -3.8088317706895904E-06 +-3.7500567904771269E-06 -3.6920687209234889E-06 -3.6348587143649362E-06 -3.5784180021484825E-06 -3.5227378941349385E-06 +-3.4678097782032377E-06 -3.4136251197562373E-06 -3.3601754612278924E-06 -3.3074524215918162E-06 -3.2554476958713488E-06 +-3.2041530546509422E-06 -3.1535603435890619E-06 -3.1036614829325251E-06 -3.0544484670322424E-06 -3.0059133638604738E-06 +-2.9580483145295358E-06 -2.9108455328119642E-06 -2.8642973046621877E-06 -2.8183959877396816E-06 -2.7731340109335922E-06 +-2.7285038738889231E-06 -2.6844981465341722E-06 -2.6411094686105211E-06 -2.5983305492025581E-06 -2.5561541662704823E-06 +-2.5145731661839208E-06 -2.4735804632572129E-06 -2.4331690392863258E-06 -2.3933319430872431E-06 -2.3540622900359852E-06 +-2.3153532616101946E-06 -2.2771981049322401E-06 -2.2395901323139713E-06 -2.2025227208030367E-06 -2.1659893117307764E-06 +-2.1299834102617583E-06 -2.0944985849448839E-06 -2.0595284672661106E-06 -2.0250667512028378E-06 -1.9911071927798329E-06 +-1.9576436096268728E-06 -1.9246698805379561E-06 -1.8921799450321966E-06 -1.8601678029163275E-06 -1.8286275138488741E-06 +-1.7975531969059996E-06 -1.7669390301489559E-06 -1.7367792501932653E-06 -1.7070681517795197E-06 -1.6778000873458705E-06 +-1.6489694666022150E-06 -1.6205707561060320E-06 -1.5925984788399397E-06 -1.5650472137909154E-06 -1.5379115955312292E-06 +-1.5111863138010641E-06 -1.4848661130928604E-06 -1.4589457922373532E-06 -1.4334202039913134E-06 -1.4082842546270250E-06 +-1.3835329035234795E-06 -1.3591611627592617E-06 -1.3351640967072170E-06 -1.3115368216307898E-06 -1.2882745052821471E-06 +-1.2653723665019969E-06 -1.2428256748211806E-06 -1.2206297500639776E-06 -1.1987799619531845E-06 -1.1772717297169206E-06 +-1.1561005216972023E-06 -1.1352618549602551E-06 -1.1147512949086017E-06 -1.0945644548948982E-06 -1.0746969958375304E-06 +-1.0551446258379873E-06 -1.0359030997999879E-06 -1.0169682190503917E-06 -9.9833583096186626E-07 -9.8000182857734168E-07 +-9.6196215023623408E-07 -9.4421277920244498E-07 -9.2674974329415197E-07 -9.0956911451536462E-07 -8.9266700868927275E-07 +-8.7603958509338589E-07 -8.5968304609644435E-07 -8.4359363679712741E-07 -8.2776764466455292E-07 -8.1220139918055844E-07 +-7.9689127148378122E-07 -7.8183367401553188E-07 -7.6702506016745246E-07 -7.5246192393098560E-07 -7.3814079954862044E-07 +-7.2405826116694774E-07 -7.1021092249151396E-07 -6.9659543644345996E-07 -6.8320849481797228E-07 -6.7004682794452609E-07 +-6.5710720434892888E-07 -6.4438643041716577E-07 -6.3188135006103576E-07 -6.1958884438560714E-07 -6.0750583135844950E-07 +-5.9562926548068614E-07 -5.8395613745983413E-07 -5.7248347388444565E-07 -5.6120833690055789E-07 -5.5012782388993205E-07 +-5.3923906715009626E-07 -5.2853923357618486E-07 -5.1802552434458222E-07 -5.0769517459834841E-07 -4.9754545313446651E-07 +-4.8757366209285807E-07 -4.7777713664721498E-07 -4.6815324469761621E-07 -4.5869938656493852E-07 -4.4941299468705898E-07 +-4.4029153331685023E-07 -4.3133249822196710E-07 -4.2253341638641766E-07 -4.1389184571392360E-07 -4.0540537473306512E-07 +-3.9707162230421279E-07 -3.8888823732823940E-07 -3.8085289845701224E-07 -3.7296331380567013E-07 -3.6521722066666783E-07 +-3.5761238522560729E-07 -3.5014660227883224E-07 -3.4281769495280449E-07 -3.3562351442524217E-07 -3.2856193964802522E-07 +-3.2163087707187298E-07 -3.1482826037277947E-07 -3.0815205018020514E-07 -3.0160023380703970E-07 -2.9517082498130544E-07 +-2.8886186357962305E-07 -2.8267141536242541E-07 -2.7659757171091931E-07 -2.7063844936579068E-07 -2.6479219016765184E-07 +-2.5905696079923120E-07 -2.5343095252929599E-07 -2.4791238095830698E-07 -2.4249948576580915E-07 -2.3719053045954085E-07 +-2.3198380212627603E-07 -2.2687761118437736E-07 -2.2187029113807313E-07 -2.1696019833344628E-07 -2.1214571171613071E-07 +-2.0742523259071761E-07 -2.0279718438186365E-07 -1.9826001239709717E-07 -1.9381218359132137E-07 -1.8945218633300948E-07 +-1.8517853017208553E-07 -1.8098974560949321E-07 -1.7688438386844030E-07 -1.7286101666732224E-07 -1.6891823599431610E-07 +-1.6505465388364317E-07 -1.6126890219349465E-07 -1.5755963238561657E-07 -1.5392551530654939E-07 -1.5036524097052078E-07 +-1.4687751834398008E-07 -1.4346107513177776E-07 -1.4011465756498202E-07 -1.3683703019032626E-07 -1.3362697566128545E-07 +-1.3048329453077591E-07 -1.2740480504547323E-07 -1.2439034294174421E-07 -1.2143876124318577E-07 -1.1854893005977189E-07 +-1.1571973638859448E-07 -1.1295008391620131E-07 -1.1023889282252250E-07 -1.0758509958637966E-07 -1.0498765679257398E-07 +-1.0244553294054859E-07 -9.9957712254617576E-08 -9.7523194495758413E-08 -9.5140994774962470E-08 -9.2810143368136465E-08 +-9.0529685532551014E-08 -8.8298681324830210E-08 -8.6116205420476622E-08 -8.3981346934926526E-08 -8.1893209246128843E-08 +-7.9850909818643889E-08 -7.7853580029253185E-08 -7.5900364994078206E-08 -7.3990423397199877E-08 -7.2122927320772995E-08 +-7.0297062076631134E-08 -6.8512026039374909E-08 -6.6767030480937639E-08 -6.5061299406623356E-08 -6.3394069392610072E-08 +-6.1764589424912585E-08 -6.0172120739799254E-08 -5.8615936665655611E-08 -5.7095322466288844E-08 -5.5609575185668232E-08 +-5.4158003494092912E-08 -5.2739927535782698E-08 -5.1354678777884905E-08 -5.0001599860890249E-08 -4.8680044450452284E-08 +-4.7389377090603547E-08 -4.6128973058362049E-08 -4.4898218219721107E-08 -4.3696508887016866E-08 -4.2523251677666288E-08 +-4.1377863374269020E-08 -4.0259770786066967E-08 -3.9168410611754315E-08 -3.8103229303632033E-08 -3.7063682933099222E-08 +-3.6049237057475236E-08 -3.5059366588146109E-08 -3.4093555660027092E-08 -3.3151297502336412E-08 -3.2232094310671320E-08 +-3.1335457120381672E-08 -3.0460905681232412E-08 -2.9607968333348684E-08 -2.8776181884437208E-08 -2.7965091488275843E-08 +-2.7174250524464936E-08 -2.6403220479433945E-08 -2.5651570828695001E-08 -2.4918878920337700E-08 -2.4204729859757024E-08 +-2.3508716395608155E-08 -2.2830438806980280E-08 -2.2169504791782719E-08 -2.1525529356336437E-08 -2.0898134706162785E-08 +-2.0286950137963759E-08 -1.9691611932785078E-08 -1.9111763250356165E-08 -1.8547054024598712E-08 -1.7997140860297394E-08 +-1.7461686930925026E-08 -1.6940361877615125E-08 -1.6432841709274332E-08 -1.5938808703827760E-08 -1.5457951310589597E-08 +-1.4989964053751850E-08 -1.4534547436984050E-08 -1.4091407849136022E-08 -1.3660257471037079E-08 -1.3240814183383865E-08 +-1.2832801475709421E-08 -1.2435948356426451E-08 -1.2049989263937083E-08 -1.1674663978801952E-08 -1.1309717536960970E-08 +-1.0954900143998810E-08 -1.0609967090447161E-08 -1.0274678668116856E-08 -9.9488000874520765E-09 -9.6321013958994613E-09 +-9.3243573972846418E-09 -9.0253475721887284E-09 -8.7348559993174260E-09 -8.4526712778552194E-09 -8.1785864507974878E-09 +-7.9123989292527276E-09 -7.6539104177078555E-09 -7.4029268402489369E-09 -7.1592582677299979E-09 -6.9227188458825181E-09 +-6.6931267243582264E-09 -6.4703039866976928E-09 -6.2540765812174337E-09 -6.0442742528080316E-09 -5.8407304756359874E-09 +-5.6432823867418510E-09 -5.4517707205272118E-09 -5.2660397441233029E-09 -5.0859371936337308E-09 -4.9113142112440631E-09 +-4.7420252831908572E-09 -4.5779281785828538E-09 -4.4188838890669371E-09 -4.2647565693316218E-09 -4.1154134784407246E-09 +-3.9707249219898013E-09 -3.8305641950783628E-09 -3.6948075260902518E-09 -3.5633340212751354E-09 -3.4360256101238048E-09 +-3.3127669915300206E-09 -3.1934455807317812E-09 -3.0779514570245970E-09 -2.9661773122398595E-09 -2.8580183999808796E-09 +-2.7533724856096129E-09 -2.6521397969767813E-09 -2.5542229758884263E-09 -2.4595270303015850E-09 -2.3679592872422246E-09 +-2.2794293464381624E-09 -2.1938490346600368E-09 -2.1111323607632438E-09 -2.0311954714238463E-09 -1.9539566075614547E-09 +-1.8793360614421084E-09 -1.8072561344541806E-09 -1.7376410955504234E-09 -1.6704171403491970E-09 -1.6055123508880424E-09 +-1.5428566560226708E-09 -1.4823817924646077E-09 -1.4240212664506169E-09 -1.3677103160371425E-09 -1.3133858740129786E-09 +-1.2609865314234594E-09 -1.2104525016994246E-09 -1.1617255853842830E-09 -1.1147491354524999E-09 -1.0694680232129017E-09 +-1.0258286047901495E-09 -9.8377868817781876E-10 -9.4326750085654906E-10 -9.0424565797070743E-10 -8.6666513105708376E-10 +-8.3047921731916735E-10 -7.9564250944053160E-10 -7.6211086593096148E-10 -7.2984138199890943E-10 -6.9879236094397354E-10 +-6.6892328606303664E-10 -6.4019479306383106E-10 -6.1256864297963725E-10 -5.8600769557893823E-10 -5.6047588326379689E-10 +-5.3593818545084868E-10 -5.1236060342875190E-10 -4.8971013568604017E-10 -4.6795475370330382E-10 -4.4706337820368550E-10 +-4.2700585585572026E-10 -4.0775293642254650E-10 -3.8927625035160451E-10 -3.7154828679891635E-10 -3.5454237208212518E-10 +-3.3823264855647656E-10 -3.2259405390797982E-10 -3.0760230085800903E-10 -2.9323385727365428E-10 -2.7946592667816077E-10 +-2.6627642915583768E-10 -2.5364398264585037E-10 -2.4154788461935045E-10 -2.2996809413444247E-10 -2.1888521426351169E-10 +-2.0828047488748834E-10 -1.9813571585165323E-10 -1.8843337047764118E-10 -1.7915644942632107E-10 -1.7028852490628779E-10 +-1.6181371522272946E-10 -1.5371666966148436E-10 -1.4598255370312590E-10 -1.3859703456197451E-10 -1.3154626704496155E-10 +-1.2481687972531671E-10 -1.1839596142609057E-10 -1.1227104800856639E-10 -1.0643010946065593E-10 -1.0086153728041361E-10 +-9.5554132149850854E-11 -9.0497091894266982E-11 -8.5679999722361075E-11 -8.1092812742429622E-11 -7.6725850749995225E-11 +-7.2569785282257302E-11 -6.8615628934795700E-11 -6.4854724936003125E-11 -6.1278736974763994E-11 -5.7879639276938999E-11 +-5.4649706926261565E-11 -5.1581506425290706E-11 -4.8667886492112752E-11 -4.5901969088524059E-11 -4.3277140675471955E-11 +-4.0787043691575047E-11 -3.8425568250586577E-11 -3.6186844053708230E-11 -3.4065232512706143E-11 -3.2055319079824056E-11 +-3.0151905780532546E-11 -2.8350003945196225E-11 -2.6644827135786485E-11 -2.5031784263808708E-11 -2.3506472895658960E-11 +-2.2064672741667274E-11 -2.0702339325129957E-11 -1.9415597827675810E-11 -1.8200737107356128E-11 -1.7054203885890992E-11 +-1.5972597101549879E-11 -1.4952662424185914E-11 -1.3991286928989271E-11 -1.3085493925567264E-11 -1.2232437939002716E-11 +-1.1429399839586105E-11 -1.0673782117959979E-11 -9.9631043024578596E-12 -9.2949985154629632E-12 -8.6672051656557225E-12 +-8.0775687730616000E-12 -7.5240339238546199E-12 -7.0046413519141047E-12 -6.5175241441758167E-12 -6.0609040668607097E-12 +-5.6330880097077947E-12 -5.2324645453794849E-12 -4.8575006012507195E-12 -4.5067382408350141E-12 -4.1787915521428783E-12 +-3.8723436403097683E-12 -3.5861437218727912E-12 -3.3190043181167595E-12 -3.0697985449516457E-12 -2.8374574968249614E-12 +-2.6209677222133216E-12 -2.4193687882787123E-12 -2.2317509323153254E-12 -2.0572527976536141E-12 -1.8950592517282769E-12 +-1.7443992840571312E-12 -1.6045439819175269E-12 -1.4748045815467142E-12 -1.3545305927319370E-12 -1.2431079946950924E-12 +-1.1399575012158817E-12 -1.0445328929758975E-12 -9.5631941514463493E-13 -8.7483223826644918E-13 -7.9961498054547427E-13 +-7.3023828966310350E-13 -6.6629848229997172E-13 -6.0741623957145635E-13 -5.5323535662250191E-13 -5.0342154466402788E-13 +-4.5766128376942546E-13 -4.1566072478546995E-13 -3.7714463874761949E-13 -3.4185541222488702E-13 -3.0955208705445901E-13 +-2.8000944296084634E-13 -2.5301712158864376E-13 -2.2837879051197377E-13 -2.0591134581728477E-13 -1.8544415188948922E-13 +-1.6681831706436063E-13 -1.4988600384270575E-13 -1.3450977239406065E-13 -1.2056195610954238E-13 -1.0792406799500569E-13 +-9.6486236726793351E-14 -8.6146671223156019E-14 -7.6811152614803742E-14 -6.8392552528088046E-14 -6.0810376623933759E-14 +-5.3990332364906282E-14 -4.7863920011644570E-14 -4.2368045878369108E-14 -3.7444656905232212E-14 -3.3040395632951612E-14 +-2.9106274692429883E-14 -2.5597369948920003E-14 -2.2472531466744044E-14 -1.9694111486608109E-14 -1.7227708633175453E-14 +-1.5041927595762190E-14 -1.3108153549802392E-14 -1.1400340611088645E-14 -9.8948136387293649E-15 -8.5700827262733605E-15 +-7.4066697435314764E-15 -6.3869463142759133E-15 -5.4949826372161070E-15 -4.7164065794345629E-15 -4.0382724928175686E-15 +-3.4489392249297170E-15 -2.9379568162601882E-15 -2.4959613958089830E-15 -2.1145778065842513E-15 -1.7863295117453982E-15 +-1.5045553508517244E-15 -1.2633327339617138E-15 -1.0574068791744128E-15 -8.8212571661152655E-16 -7.3338009880721586E-16 +-6.0754897400273365E-16 -5.0144919493559872E-16 -4.1228965136896984E-16 -3.3762942982717554E-16 -2.7533971878940770E-16 +-2.2356919194679704E-16 -1.8071261605006952E-16 -1.4538244336777077E-16 -1.1638316184051860E-16 -9.2688188657390727E-17 +-7.3419105198724052E-17 -5.7827043088117311E-17 -4.5276042478193657E-17 -3.5228214662865287E-17 -2.7230551666860221E-17 +-2.0903235614735774E-17 -1.5929310430387086E-17 -1.2045587768266719E-17 -9.0346680335034392E-18 -6.7179659144437936E-18 +-4.9496380326808589E-18 -3.6113181174766012E-18 -2.6075725389877753E-18 -1.8619960934845696E-18 -1.3138746296934185E-18 +-9.1534744465324943E-19 -6.2900836647700016E-19 -4.2589008686406826E-19 -2.8378161510286899E-19 -1.8583370491137961E-19 +-1.1941176335294446E-19 -7.5160095095250666E-20 -4.6245373611852008E-20 -2.7750972020718722E-20 -1.6197238883664982E-20 +-9.1659775367657711E-21 -5.0102907841607671E-21 -2.6335957860391244E-21 -1.3240067516425943E-21 -6.3243598535370992E-22 +-2.8468763847328358E-22 -1.1952424047074969E-22 -4.6185114529319070E-23 -1.6139864915454378E-23 -4.9813532386835407E-24 +-1.3134103391970392E-24 -2.8177664103889677E-25 -4.5610504183900817E-26 -4.9083664747149533E-27 -2.7702677466016771E-28 +-4.8148324440257693E-30 -4.7125192509738767E-33 0.0000000000000000E+00 \ No newline at end of file diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/confs/std-fcc/POSCAR b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/confs/std-fcc/POSCAR new file mode 100755 index 00000000..2b9f10d0 --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/confs/std-fcc/POSCAR @@ -0,0 +1,17 @@ +Al4 + 1.0000000000000000 + 4.00 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 4.00 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 4.00 + Al + 4 +Direct + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.5000000000000000 0.5000000000000000 + 0.5000000000000000 0.0000000000000000 0.5000000000000000 + 0.5000000000000000 0.5000000000000000 0.0000000000000000 + + 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/global_local_debug.json b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/global_local_debug.json new file mode 100755 index 00000000..2e2e5187 --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/global_local_debug.json @@ -0,0 +1,7 @@ +{ + "context_type": "Local", + "batch_type": "Shell", + "local_root": "./", + "remote_root": "./", + "run_command": "lmp -in in.lammps" +} diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/param_joint.json b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/param_joint.json new file mode 100755 index 00000000..19dc129d --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/param_joint.json @@ -0,0 +1,24 @@ +{ + "structures": ["confs/std-fcc"], + "interaction": { + "type": "eam_alloy", + "model": "Al.eam.alloy", + "type_map": {"Al": 0} + }, + "relaxation": { + "cal_setting": {"etol": 0, + "ftol": 1e-10, + "maxiter": 5000, + "maximal": 500000} + }, + "properties": [ + { + "type": "elastic", + "skip": false, + "norm_deform": 1e-2, + "shear_deform": 1e-2, + "cal_setting": {"etol": 0, + "ftol": 1e-10} + } + ] +} diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/param_props.json b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/param_props.json new file mode 100755 index 00000000..a10234ee --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/param_props.json @@ -0,0 +1,18 @@ +{ + "structures": ["confs/std-*"], + "interaction": { + "type": "eam_alloy", + "model": "Al.eam.alloy", + "type_map": {"Al": 0} + }, + "properties": [ + { + "type": "elastic", + "skip": false, + "norm_deform": 1e-2, + "shear_deform": 1e-2, + "cal_setting": {"etol": 0, + "ftol": 1e-10} + } + ] +} diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/param_relax.json b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/param_relax.json new file mode 100755 index 00000000..93680ffd --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.2_local/param_relax.json @@ -0,0 +1,14 @@ +{ + "structures": ["confs/std-*"], + "interaction": { + "type": "eam_alloy", + "model": "Al.eam.alloy", + "type_map": {"Al": 0} + }, + "relaxation": { + "cal_setting": {"etol": 0, + "ftol": 1e-10, + "maxiter": 5000, + "maximal": 500000} + } +} diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/confs/std-bcc/POSCAR b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/confs/std-bcc/POSCAR new file mode 100755 index 00000000..97240a37 --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/confs/std-bcc/POSCAR @@ -0,0 +1,13 @@ +Mo2 + 1.0000000000000000 + 3.1623672675177916 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 3.1623672675177916 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.1623672675177916 + Mo + 2 +Direct + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.5000000000000000 0.5000000000000000 0.5000000000000000 + + 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/frozen_model.pb b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/frozen_model.pb new file mode 100755 index 00000000..2adc962a Binary files /dev/null and b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/frozen_model.pb differ diff --git a/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/global_hpc.json b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/global_hpc.json new file mode 100755 index 00000000..6fadb39b --- /dev/null +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/global_hpc.json @@ -0,0 +1,27 @@ +{ + "run_command":"mpirun -np 4 lmp -in in.lammps", + "context_type": "Local", + "machine":{ + "batch_type": "Slurm", + "context_type": "Local", + "local_root" : "./", + "remote_root": "./", + "clean_asynchronously": true + }, + "resources":{ + "number_node": 1, + "cpu_per_node": 4, + "gpu_per_node": 0, + "group_size": 1, + "module_list": ["deepmd-kit/3.1.0/cpu_binary_release"], + "custom_flags": [ + "#SBATCH --partition=xlong", + "#SBATCH --ntasks=4", + "#SBATCH --ntasks-per-core=1", + "#SBATCH --cpus-per-task=1", + "#SBATCH --mem=10G", + "#SBATCH --nodes=1", + "#SBATCH --time=1-00:00:00" + ] + } +} \ No newline at end of file diff --git a/examples/lammps_demo/param_joint.json b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/param_joint.json old mode 100644 new mode 100755 similarity index 100% rename from examples/lammps_demo/param_joint.json rename to examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/param_joint.json diff --git a/examples/lammps_demo/param_props.json b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/param_props.json old mode 100644 new mode 100755 similarity index 97% rename from examples/lammps_demo/param_props.json rename to examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/param_props.json index 0344a8b7..085075fa --- a/examples/lammps_demo/param_props.json +++ b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/param_props.json @@ -3,7 +3,6 @@ "interaction": { "type": "deepmd", "model": "frozen_model.pb", - "deepmd_version":"2.1.1", "type_map": {"Mo": 0} }, "properties": [ diff --git a/examples/lammps_demo/param_relax.json b/examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/param_relax.json old mode 100644 new mode 100755 similarity index 100% rename from examples/lammps_demo/param_relax.json rename to examples/lammps/lammps_tutorial2_submission_methods/lammps_example2.3_slurm/param_relax.json diff --git a/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/Al.meam b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/Al.meam new file mode 100755 index 00000000..0caa2959 --- /dev/null +++ b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/Al.meam @@ -0,0 +1,9 @@ +re(1,1) = 2.86378 +attrac(1,1) = 0.39558 +repuls(1,1) = 0.09806 +Cmin(1,1,1) = 1.00769 +Cmax(1,1,1) = 2.31407 +# +rc = 5.0 +delr = 0.1 +augt1 = 1 \ No newline at end of file diff --git a/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/confs/std-fcc/POSCAR b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/confs/std-fcc/POSCAR new file mode 100755 index 00000000..2b9f10d0 --- /dev/null +++ b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/confs/std-fcc/POSCAR @@ -0,0 +1,17 @@ +Al4 + 1.0000000000000000 + 4.00 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 4.00 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 4.00 + Al + 4 +Direct + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.5000000000000000 0.5000000000000000 + 0.5000000000000000 0.0000000000000000 0.5000000000000000 + 0.5000000000000000 0.5000000000000000 0.0000000000000000 + + 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 diff --git a/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/global_local_debug.json b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/global_local_debug.json new file mode 100755 index 00000000..2e2e5187 --- /dev/null +++ b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/global_local_debug.json @@ -0,0 +1,7 @@ +{ + "context_type": "Local", + "batch_type": "Shell", + "local_root": "./", + "remote_root": "./", + "run_command": "lmp -in in.lammps" +} diff --git a/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/library.meam b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/library.meam new file mode 100755 index 00000000..df1888a8 --- /dev/null +++ b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/library.meam @@ -0,0 +1,8 @@ +# References: +# elt lat z ielement atwt +# alpha b0 b1 b2 b3 alat esub asub +# t0 t1 t2 t3 rozero ibar +# +'Al' 'fcc' 12. 13 26.9815 + 4.68604 1.56205 5.39270 5.29601 -1.00047 4.05000 3.35999 1.06859 +1.0 -1.54917 -1.28508 10.01041 1.0 0 \ No newline at end of file diff --git a/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/param_props_meam.json b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/param_props_meam.json new file mode 100755 index 00000000..c5a94ccd --- /dev/null +++ b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/param_props_meam.json @@ -0,0 +1,85 @@ +{ + "structures": ["confs/std-*"], + "interaction": { + "type": "meam", + "model": ["library.meam", "Al.meam"], + "type_map": {"Al": 0} + }, + "properties": [ + { + "type": "eos", + "skip": false, + "vol_start": 0.6, + "vol_end": 1.4, + "vol_step": 0.4, + "cal_setting": {"etol": 0, + "ftol": 1e-10} + }, + { + "type": "cohesive", + "latt_start": 0.6, + "latt_end": 1.4, + "latt_step": 0.1 + }, + { + "type": "decohesive", + "min_slab_size": 15, + "max_vacuum_size": 10, + "vacuum_size_step": 2, + "miller_index": [0, 0, 1] + + }, + { + "type": "finite_t_latt", + "supercell_size": [2, 2, 2], + "cal_setting": { + "temperature": [200, 400, 600, 800], + "equi_step": 20000, + "N_every": 100, + "N_repeat": 10, + "N_freq": 2000, + "ave_step": 20000, + "timestep": 0.001, + "tdamp": 0.1, + "pdamp": 1.0} + }, + { + "type": "elastic", + "skip": false, + "norm_deform": 1e-2, + "shear_deform": 1e-2, + "cal_setting": {"etol": 0, + "ftol": 1e-10} + }, + { + "type": "surface", + "skip": true, + "min_slab_size": 10, + "min_vacuum_size":11, + "max_miller": 2, + "cal_type": "static" + }, + { + "type": "interstitial", + "skip": true, + "supercell": [2, 2, 2], + "insert_ele": ["Al"] + }, + { + "type": "vacancy", + "skip": true, + "supercell": [2, 2, 2] + }, + { + "type": "gamma", + "skip": true, + "plane_miller": [1,1,1], + "slip_direction": [1,1,-2], + "supercell_size": [2,2,100], + "vacuum_size": 15, + "add_fix": ["true","true","false"], + "n_steps": 10 + } + ] +} + diff --git a/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/param_relax_meam.json b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/param_relax_meam.json new file mode 100755 index 00000000..78e31676 --- /dev/null +++ b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/param_relax_meam.json @@ -0,0 +1,16 @@ +{ + "structures": ["confs/std-*"], + "interaction": { + "type": "meam", + "model": ["library.meam", "Al.meam"], + "type_map": {"Al": 0} + }, + "relaxation": { + "cal_setting": { + "etol": 0, + "ftol": 1e-10, + "maxiter": 5000, + "maximal": 500000 + } + } +} diff --git a/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/support_potentials.txt b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/support_potentials.txt new file mode 100755 index 00000000..6555bb47 --- /dev/null +++ b/examples/lammps/lammps_tutorial3_potentials_and_properties/lammps_example3.1_potentials_and_properties/support_potentials.txt @@ -0,0 +1 @@ +# LAMMPS_INTER_TYPE = ['deepmd', 'eam_alloy', 'meam', 'eam_fs', 'meam_spline', 'snap', 'gap', 'rann', 'mace'] \ No newline at end of file diff --git a/examples/lammps_demo/global_hpc.json b/examples/lammps_demo/global_hpc.json deleted file mode 100644 index cdaee1f1..00000000 --- a/examples/lammps_demo/global_hpc.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "apex_image_name":"zhuoyli/apex_arm64", - "lammps_image_name": "zhuoyli/apex_arm64", - "run_command":"lmp -in in.lammps", - "group_size": 2, - "batch_type": "Slurm", - "context_type": "SSHContext", - "local_root" : "./", - "remote_root": "/hpc/home/hku/zyl/Downloads/remote_tasks", - "remote_host": "***.**.**.**", - "remote_username": "USERNAME", - "remote_password": "PASSWD", - "port": 22, - "resources":{ - "number_node": 1, - "cpu_per_node": 4, - "gpu_per_node": 0, - "queue_name": "apex_test", - "group_size": 1, - "module_list": ["deepmd-kit/2.1.0/cpu_binary_release"], - "custom_flags": [ - "#SBATCH --partition=xlong", - "#SBATCH --ntasks=4", - "#SBATCH --mem=10G", - "#SBATCH --nodes=1", - "#SBATCH --time=1-00:00:00" - ] - } -} diff --git a/examples/lammps_demo/machine_hpc.json b/examples/lammps_demo/machine_hpc.json deleted file mode 100644 index 4a004582..00000000 --- a/examples/lammps_demo/machine_hpc.json +++ /dev/null @@ -1,31 +0,0 @@ -{ -"machine": { - "batch_type": "Slurm", - "context_type": "SSHContext", - "local_root" : "./", - "remote_root": "/hpc/home/hku/zyl/Downloads/remote_tasks", - "remote_profile":{ - "hostname": "***.**.**.**", - "username": "USERNAME", - "password": "PASSWD", - "port": 22, - "timeout": 10 - } -}, -"resources":{ - "number_node": 1, - "cpu_per_node": 4, - "gpu_per_node": 0, - "queue_name": "apex_test", - "group_size": 1, - "module_list": ["deepmd-kit/2.1.0/cpu_binary_release"], - "custom_flags": [ - "#SBATCH --partition=xlong", - "#SBATCH --ntasks=1", - "#SBATCH --mem=10G", - "#SBATCH --nodes=1", - "#SBATCH --time=1-00:00:00" - ] -}, -"run_command": "lmp -i in.lammps -v restart 0" -} diff --git a/examples/rss/HEA/rss.json b/examples/rss/HEA/rss.json new file mode 100644 index 00000000..ea986433 --- /dev/null +++ b/examples/rss/HEA/rss.json @@ -0,0 +1,58 @@ +{ + "parent_lattice": { + "type": "B2", + "a": "auto", + "supercell": "auto" + }, + "composition_tolerance": 0.001, + "supercell_shape": "near_cubic", + "maxmium_nums_atoms": 1000, + "compositions": { + "corner": { + "Co": 0.2, + "Cr": 0.2, + "Fe": 0.2, + "Mn": 0.2, + "Ni": 0.2 + }, + "body": { + "Co": 0.2, + "Cr": 0.2, + "Fe": 0.2, + "Mn": 0.2, + "Ni": 0.2 + } + }, + "sro_targets": { + "shell0": { + "Co-Co": 0.0, + "Co-Cr": 0.0, + "Co-Fe": 0.0, + "Co-Mn": 0.0, + "Co-Ni": 0.0, + "Cr-Cr": 0.0, + "Cr-Fe": 0.0, + "Cr-Mn": 0.0, + "Cr-Ni": 0.0, + "Fe-Fe": 0.0, + "Fe-Mn": 0.0, + "Fe-Ni": 0.0, + "Mn-Mn": 0.0, + "Mn-Ni": 0.0, + "Ni-Ni": 0.0 + } + }, + "shell_cutoffs": [2.8], + "shell_weights": [1.0], + "max_steps": 40000, + "temperature": 0.10, + "num_configs": 500, + "interval": 50, + "show_progress": true, + "patience": null, + "metadata": true, + "seed": 21, + "tol": 0.001, + "allow_vacancies": false, + "output_structure": "./RSS_HEA" +} diff --git a/examples/rss/HEO/rss.json b/examples/rss/HEO/rss.json new file mode 100644 index 00000000..dcb0abe0 --- /dev/null +++ b/examples/rss/HEO/rss.json @@ -0,0 +1,49 @@ +{ + "parent_structure": "parent/POSCAR", + "compositions": { + "cation": { + "Mg": 0.2, + "Co": 0.2, + "Cr": 0.2, + "Fe": 0.2, + "Mn": 0.2 + }, + "anion": { + "O": 1.0 + } + }, + "sro_targets": { + "shell0": { + "Mg-Mg": 0.0, + "Mg-Co": 0.0, + "Mg-Cr": 0.0, + "Mg-Fe": 0.0, + "Mg-Mn": 0.0, + "Co-Co": 0.0, + "Co-Cr": 0.0, + "Co-Fe": 0.0, + "Co-Mn": 0.0, + "Cr-Cr": 0.0, + "Cr-Fe": 0.0, + "Cr-Mn": 0.0, + "Fe-Fe": 0.0, + "Fe-Mn": 0.0, + "Mn-Mn": 0.0, + "O-O": 0.0 + } + }, + "supercell": [5, 5, 5], + "shell_cutoffs": [3.5], + "shell_weights": [1.0], + "max_steps": 400000, + "temperature": 0.10, + "num_configs": 3, + "interval": 50, + "show_progress": true, + "patience": null, + "metadata": true, + "seed": 21, + "tol": 0.001, + "allow_vacancies": false, + "output_structure": "./RSS_HEO" +} diff --git a/examples/rss/README.md b/examples/rss/README.md new file mode 100644 index 00000000..35a4cafa --- /dev/null +++ b/examples/rss/README.md @@ -0,0 +1,255 @@ +# RSS Examples (HEA and HEO) + +This folder provides examples for generating random solid +solution (RSS) structures with: + +- HEA example: `examples/rss/HEA/` +- HEO example: `examples/rss/HEO/` + +Both examples are driven by `apex rss `. + +## Quick Start + +Run HEA: + +```bash +apex rss examples/rss/HEA/rss.json +``` + +Run HEO: + +```bash +apex rss examples/rss/HEO/rss.json +``` + +Generated structures are written to the output location configured in each +`rss.json` as separate `conf_###/POSCAR` folders under the configured output +root (for example `RSS_HEA/conf_001/POSCAR` or `RSS_HEO/conf_001/POSCAR`). + +If `metadata` is enabled, an additional `rss_metadata.json` is generated in +the same output directory. + +## Example Folder Layout + +```text +examples/rss/ +├── README.md +├── HEA/ +│ ├── rss.json +│ ├── parent/ +│ └── RSS_HEA/(Target folder) +├── HEO/ +│ ├── rss.json +│ ├── parent/ +│ └── RSS_HEO/(Target folder) +``` + +## Full `rss.json` Key Reference + +The following keys are supported by the current implementation in +`apex/rss.py` and `apex/core/lib/rss.py`. + +### 1) Structure Input + +1. `parent_structure` +- Type: `string` +- Meaning: Relative path (from the `rss.json` directory) to a parent structure, + typically POSCAR. +- Notes: Provide either `parent_structure` or `parent_lattice`. + +2. `parent_lattice` +- Type: `object` +- Meaning: Build the parent structure directly in code (without POSCAR). +- Supported sub-keys: + - `type`: one of `fcc` / `bcc` / `sc` / `hcp` / `diamond` / `B2` / `L12` / `L10` + - `element`: initial element symbol, default `Ni` + - `a`: lattice parameter, default `3.6`; use `"auto"` for supported + parent lattices + - `supercell`: internal pre-expansion, e.g. `[5, 5, 5]`; use `"auto"` for + supported parent lattices + +For `B2`, `L12`, and `L10`, `rss.py` can also infer the ordered prototype species +labels from the composition blocks and fill in `a` / `supercell` when they are +set to `"auto"`. This is useful when you want to drive RSS from sublattice +fractions without hand-tuning the parent lattice first. + +3. `composition_tolerance` +- Type: `float`, default `0.005` +- Meaning: Accuracy target for automatic supercell generation. Smaller values + request a larger cell that better resolves small composition fractions. + +4. `supercell_shape` +- Type: `string`, default `"near_cubic"` +- Values: `"near_cubic"` / `"xy_equal_z_free"` +- Meaning: Shape preference for automatic supercell generation. Use + `"xy_equal_z_free"` when the in-plane shape should be preserved, such as + gamma surface or slab workflows. + +5. `maxmium_nums_atoms` +- Type: `int`, optional +- Meaning: Maximum number of atoms allowed in the automatically generated + parent-lattice supercell. If the composition tolerance would require a + larger cell, RSS chooses the best composition approximation within this + atom budget. +- Notes: `maximum_num_atoms` and `maximum_nums_atoms` are accepted aliases. + +6. `supercell` +- Type: `array[int, int, int]` +- Meaning: Expand the loaded/built parent structure after loading/building. +- Notes: If both `parent_lattice.supercell` and top-level `supercell` are set, + both expansions are applied. + +7. `output_structure` +- Type: `string` +- Meaning: Output root directory (relative to `rss.json`), default `RSS`. +- Notes: Each generated configuration is written to its own `conf_###` + directory and the structure file inside is always named `POSCAR`. + +### 2) Composition and Sublattice + +8. `compositions` +- Type: `object` +- Meaning: Species fractions on each sublattice; each sublattice must sum to + `1.0`. +- Modes: + - Single-sublattice: `{"all": {...}}` + - Multi-sublattice: e.g. `{"cation": {...}, "anion": {...}}` + +RSS rounds sublattice fractions to the nearest integer site counts while keeping +the total number of sites conserved. If the requested fractions are only +approximately realizable for the chosen supercell, the runner emits a warning +and proceeds with the nearest valid integerized assignment. + +For an A/B/O-type sublattice system, define three composition blocks such as +`A`, `B`, and `O`. Put the tunable species on `A` and `B`, and keep `O` fixed +to `1.0` when oxygen should remain fully occupied. + +Example: + +```json +{ + "compositions": { + "A": { + "Mg": 0.5, + "Co": 0.5 + }, + "B": { + "Cr": 0.5, + "Fe": 0.5 + }, + "O": { + "O": 1.0 + } + } +} +``` + +9. `sublattices` (optional) +- Type: `array[object]` +- Meaning: Explicit site-index mapping for each sublattice. +- Item format: + - `name`: sublattice name (must match keys in `compositions`) + - `site_indices`: integer list +- Notes: If omitted and top-level `supercell` is provided, the runner tries + automatic assignment. + +10. `allow_vacancies` +- Type: `bool`, default `false` +- Meaning: Allow vacancy-like species aliases (`vac`, `vacancy`, `x`, `none`), + internally mapped to `X`. + +### 3) SRO Targets + +11. `sro_targets` (optional) +- Type: `object` +- Meaning: Warren-Cowley SRO target values. +- Format: + - top-level keys: `shell0`, `shell1`, ... (or `0`, `1`, ...) + - each shell contains pair targets, e.g. `"Co-Ni": 0.0` +- Notes: If omitted, all pair targets default to `0.0` for all shells, which means generate a random solid solution as closely as the sampler allows. + +12. `shell_cutoffs` +- Type: `array[float]` +- Meaning: Neighbor-shell cutoffs (ascending, positive). +- Notes: + - If omitted, a default first-shell cutoff is inferred from structure. + +13. `shell_weights` (optional) +- Type: `array[float]` +- Meaning: Weight of each shell in the objective function. +- Notes: Length must match `shell_cutoffs`; defaults to all `1.0`. + +### 4) Sampling and Convergence Control + +14. `max_steps` +- Type: `int`, default `20000` +- Meaning: Maximum Monte Carlo swap attempts. + +15. `temperature` +- Type: `float`, default `0.05` +- Meaning: Metropolis temperature parameter. + +16. `tol` +- Type: `float`, default `1e-3` +- Meaning: Numerical tolerance and near-target criterion. + +17. `patience` +- Type: `int | null`, default `null` +- Meaning: Early-stop patience. +- Notes: `null` disables early stopping. + +18. `seed` (optional) +- Type: `int` +- Meaning: Random seed for reproducibility. + +19. `show_progress` +- Type: `bool`, default `true` +- Meaning: Show tqdm progress bar and live gap metrics. + +### 5) Multi-Configuration Output + +20. `num_configs` +- Type: `int`, default `1` +- Meaning: Number of structures to output, useful when generating multiple + configurations for averaging. + +21. `interval` +- Type: `int`, default `100` +- Meaning: Checkpoint interval (in MC steps) used to update the hash-table cache of the lowest-RMS unique configurations for multi-configuration output. + +22. `metadata` +- Type: `bool`, default `true` +- Meaning: Write `rss_metadata.json`. + +## Minimal HEA-Style Example (No POSCAR) + +```json +{ + "parent_lattice": { + "type": "B2", + "a": "auto", + "supercell": "auto" + }, + "composition_tolerance": 0.001, + "supercell_shape": "near_cubic", + "maxmium_nums_atoms": 128, + "compositions": { + "corner": { + "Co": 0.2, + "Cr": 0.2, + "Fe": 0.2, + "Mn": 0.2, + "Ni": 0.2 + }, + "body": { + "Co": 0.2, + "Cr": 0.2, + "Fe": 0.2, + "Mn": 0.2, + "Ni": 0.2 + } + }, + "shell_cutoffs": [2.8], + "output_structure": "./RSS_HEA" +} +``` diff --git a/examples/vasp/confs/std-bcc/POSCAR b/examples/vasp/confs/std-bcc/POSCAR new file mode 100755 index 00000000..97240a37 --- /dev/null +++ b/examples/vasp/confs/std-bcc/POSCAR @@ -0,0 +1,13 @@ +Mo2 + 1.0000000000000000 + 3.1623672675177916 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 3.1623672675177916 -0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.1623672675177916 + Mo + 2 +Direct + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.5000000000000000 0.5000000000000000 0.5000000000000000 + + 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 diff --git a/examples/vasp_demo/confs/std-fcc/POSCAR b/examples/vasp/confs/std-fcc/POSCAR old mode 100644 new mode 100755 similarity index 100% rename from examples/vasp_demo/confs/std-fcc/POSCAR rename to examples/vasp/confs/std-fcc/POSCAR diff --git a/examples/vasp_demo/global_bohrium.json b/examples/vasp/global_bohrium.json old mode 100644 new mode 100755 similarity index 100% rename from examples/vasp_demo/global_bohrium.json rename to examples/vasp/global_bohrium.json diff --git a/examples/vasp_demo/param_joint.json b/examples/vasp/param_joint.json old mode 100644 new mode 100755 similarity index 100% rename from examples/vasp_demo/param_joint.json rename to examples/vasp/param_joint.json diff --git a/examples/vasp_demo/param_props.json b/examples/vasp/param_props.json old mode 100644 new mode 100755 similarity index 100% rename from examples/vasp_demo/param_props.json rename to examples/vasp/param_props.json diff --git a/examples/vasp_demo/param_relax.json b/examples/vasp/param_relax.json old mode 100644 new mode 100755 similarity index 100% rename from examples/vasp_demo/param_relax.json rename to examples/vasp/param_relax.json diff --git a/examples/vasp/vasp_input/INCAR b/examples/vasp/vasp_input/INCAR new file mode 100755 index 00000000..c19c5652 --- /dev/null +++ b/examples/vasp/vasp_input/INCAR @@ -0,0 +1,23 @@ +ALGO = Normal +EDIFF = 1e-06 +EDIFFG = -0.01 +ENCUT = 400 +IBRION = 2 +ICHARG = 2 +ISIF = 3 +ISMEAR = 1 +ISTART = 0 +KGAMMA = False +KSPACING = 0.1 +LCHARG = False +LREAL = False +LWAVE = False +NELM = 100 +NELMDL = -5 +NELMIN = 6 +NPAR = 4 +NSW = 0 +PREC = Accurate +PSTRESS = 0.0 +SIGMA = 0.1 +SYSTEM = Mo_hcp diff --git a/examples/vasp_demo/vasp_input/POTCAR.Mo b/examples/vasp/vasp_input/POTCAR.Mo old mode 100644 new mode 100755 similarity index 100% rename from examples/vasp_demo/vasp_input/POTCAR.Mo rename to examples/vasp/vasp_input/POTCAR.Mo diff --git a/setup.py b/setup.py index 1af93b18..9c79818a 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="apex-flow", - version="1.2.17", + version="1.3.0", author="Zhuoyuan Li, Tongqi Wen", author_email="zhuoyli@outlook.com", description="Alloy Properties EXplorer using simulations", @@ -20,6 +20,7 @@ 'pymatgen-analysis-defects>=2023.8.22', "dpdata==0.2.17", "dpdispatcher", + "monty", "phonopy", "plotly", "dash", @@ -34,7 +35,7 @@ "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Operating System :: OS Independent", ], - python_requires='>=3.10', + python_requires='>=3.10,<3.13', entry_points={'console_scripts': [ 'apex = apex.__main__:main', ]} diff --git a/tests/confs/std-fcc/POSCAR b/tests/confs/std-fcc/POSCAR new file mode 100644 index 00000000..5eb349b2 --- /dev/null +++ b/tests/confs/std-fcc/POSCAR @@ -0,0 +1,9 @@ +Al1 +1.0 +0.000000 2.025000 2.025000 +2.025000 0.000000 2.025000 +2.025000 2.025000 0.000000 +Al +1 +direct +0.000000 0.000000 0.000000 Al diff --git a/tests/test_DecohesionEnergy.py b/tests/test_DecohesionEnergy.py deleted file mode 100644 index 701c144a..00000000 --- a/tests/test_DecohesionEnergy.py +++ /dev/null @@ -1,147 +0,0 @@ -import glob -import os -import shutil -import sys -import unittest - -from monty.serialization import loadfn -from pymatgen.core import Structure -from pymatgen.core.surface import SlabGenerator -from pymatgen.io.vasp import Incar - -from apex.core.property.DecohesionEnergy import DecohesionEnergy -import numpy as np - -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) -__package__ = "tests" - - -class TestDecohesionEnergy(unittest.TestCase): - def setUp(self): - _jdata = { - "structures": ["confs/mp-141"], - "interaction": { - "type": "vasp", - "incar": "vasp_input/INCAR.rlx", - "potcar_prefix": ".", - "potcars": {"Yb": "vasp_input/POTCAR"}, - }, - "properties": [ - { - "type": "DecohesionEnergy", - "min_slab_size": 15, - "max_vacuum_size": 10, - "vacuum_size_step": 5, - "miller_index": [0, 0, 1], - "cal_type": "static" - } - ], - } - - self.equi_path = "confs/mp-141/relaxation/relax_task" - self.source_path = "equi/vasp" - self.target_path = "confs/mp-141/DecohesionEnergy_00" - if not os.path.exists(self.equi_path): - os.makedirs(self.equi_path) - - self.confs = _jdata["structures"] - self.inter_param = _jdata["interaction"] - self.prop_param = _jdata["properties"] - - self.DecohesionEnergy = DecohesionEnergy(_jdata["properties"][0]) - - def tearDown(self): - if os.path.exists(os.path.abspath(os.path.join(self.equi_path, ".."))): - shutil.rmtree(os.path.abspath(os.path.join(self.equi_path, ".."))) - if os.path.exists(self.equi_path): - shutil.rmtree(self.equi_path) - if os.path.exists(self.target_path): - shutil.rmtree(self.target_path) - - def test_task_type(self): - self.assertEqual("DecohesionEnergy", self.DecohesionEnergy.task_type()) - - def test_task_param(self): - self.assertEqual(self.prop_param[0], self.DecohesionEnergy.task_param()) - - def test_make_confs_0(self): - if not os.path.exists(os.path.join(self.equi_path, "CONTCAR")): - with self.assertRaises(RuntimeError): - self.DecohesionEnergy.make_confs(self.target_path, self.equi_path) - shutil.copy( - os.path.join(self.source_path, "mp-141.vasp"), - os.path.join(self.equi_path, "CONTCAR"), - ) - task_list = self.DecohesionEnergy.make_confs(self.target_path, self.equi_path) - self.assertEqual(len(task_list), 3) - dfm_dirs = glob.glob(os.path.join(self.target_path, "task.*")) - - incar0 = Incar.from_file(os.path.join("vasp_input", "INCAR.rlx")) - incar0["ISIF"] = 2 - incar0["NSW"] = 0 - - self.assertEqual( - os.path.realpath(os.path.join(self.equi_path, "CONTCAR")), - os.path.realpath(os.path.join(self.target_path, "POSCAR")), - ) - ref_st = Structure.from_file(os.path.join(self.target_path, "POSCAR")) - dfm_dirs.sort() - num = 0 - for ii in dfm_dirs: - st_file = os.path.join(ii, "POSCAR") - self.assertTrue(os.path.isfile(st_file)) - st1_file = os.path.join(ii, "POSCAR.tmp") - self.assertTrue(os.path.isfile(st1_file)) - st1 = Structure.from_file(st1_file) - decohesion_energy_json_file = os.path.join(ii, "decohesion_energy.json") - decohesion_energy_json = loadfn(decohesion_energy_json_file) - sl = self.__gen_slab_pmg( - ref_st, - tuple(decohesion_energy_json["miller_index"]), - self.prop_param[0]["min_slab_size"], - self.prop_param[0]["vacuum_size_step"] * num, - ) - num += 1 - # slb = sl.get_slab() - st2 = Structure(sl.lattice, sl.species, sl.frac_coords) - self.assertEqual(len(st1), len(st2)) - - def __gen_slab_pmg(self, structure: Structure, - plane_miller, slab_size, vacuum_size) -> Structure: - - # Generate slab via Pymatgen - slabGen = SlabGenerator(structure, miller_index=plane_miller, - min_slab_size=slab_size, min_vacuum_size=0, - center_slab=True, in_unit_planes=False, - lll_reduce=True, reorient_lattice=False, - primitive=False) - slabs_pmg = slabGen.get_slabs(ftol=0.001) - slab = [s for s in slabs_pmg if s.miller_index == plane_miller][0] - # If a transform matrix is passed, reorient the slab - order = zip(slab.frac_coords, slab.species) - c_order = sorted(order, key=lambda x: x[0][2]) - sorted_frac_coords = [] - sorted_species = [] - for (frac_coord, species) in c_order: - sorted_frac_coords.append(frac_coord) - sorted_species.append(species) - # add vacuum layer to the slab with height unit of angstrom - a, b, c = slab.lattice.matrix - slab_height = slab.lattice.matrix[2][2] - if slab_height >= 0: - self.is_flip = False - elong_scale = 1 + (vacuum_size / slab_height) - else: - self.is_flip = True - elong_scale = 1 + (-vacuum_size / slab_height) - new_lattice = [a, b, elong_scale * c] - new_frac_coords = [] - for ii in range(len(sorted_frac_coords)): - coord = sorted_frac_coords[ii].copy() - coord[2] = coord[2] / elong_scale - new_frac_coords.append(coord) - slab_new = Structure(lattice=np.array(new_lattice), - coords=new_frac_coords, species=sorted_species) - - return slab_new - diff --git a/tests/test_abacus_property.py b/tests/test_abacus_property.py index 5f195c97..178c9d4d 100644 --- a/tests/test_abacus_property.py +++ b/tests/test_abacus_property.py @@ -14,6 +14,7 @@ from apex.core.property.Elastic import Elastic from apex.core.property.EOS import EOS from apex.core.property.Gamma import Gamma +from apex.core.property.GammaSurface import GammaSurface from apex.core.property.Interstitial import Interstitial from apex.core.property.Surface import Surface from apex.core.property.Vacancy import Vacancy @@ -24,6 +25,8 @@ class TestABACUS(unittest.TestCase): def setUp(self): + self._cwd = os.getcwd() + os.chdir(os.path.abspath(os.path.dirname(__file__))) self.jdata = { "structures": ["confs/fcc-Al"], "interaction": { @@ -78,8 +81,11 @@ def tearDown(self): shutil.rmtree("confs/fcc-Al/interstitial_00") if os.path.exists("confs/fcc-Al/surface_00"): shutil.rmtree("confs/fcc-Al/surface_00") + os.chdir(self._cwd) if os.path.exists("confs/fcc-Al/gamma_00"): shutil.rmtree("confs/fcc-Al/gamma_00") + if os.path.exists("confs/fcc-Al/gamma_surface_00"): + shutil.rmtree("confs/fcc-Al/gamma_surface_00") def test_make_property(self): property = {"type": "eos", "vol_start": 0.85, "vol_end": 1.15, "vol_step": 0.01} @@ -270,6 +276,35 @@ def test_make_property_gamma(self): self.assertTrue(os.path.isfile(os.path.join(ii, "STRU"))) self.assertTrue(os.path.isfile(os.path.join(ii, "miller.json"))) + def test_make_property_gamma_surface(self): + property = { + "type": "gamma_surface", + "plane_miller": [0, 0, 1], + "slip_direction": [1, 0, 0], + "supercell_size": [1, 1, 8], + "vacuum_size": 10, + "add_fix": ["true", "true", "false"], + "n_steps_x": 2, + "n_steps_y": 1, + } + work_path = os.path.join(self.conf_path, "gamma_surface_00") + gamma_surface = GammaSurface(property, self.inter_param) + gamma_surface.make_confs(work_path, self.equi_path, refine=False) + + dfm_dirs = glob.glob(os.path.join(work_path, "task.*")) + self.assertEqual( + len(dfm_dirs), + (gamma_surface.n_steps_x + 1) * (gamma_surface.n_steps_y + 1), + ) + self.assertEqual( + os.path.realpath(os.path.join(work_path, "STRU")), + os.path.realpath(os.path.join(self.equi_path, "OUT.ABACUS", "STRU_ION_D")), + ) + for ii in dfm_dirs: + self.assertTrue(os.path.isfile(os.path.join(ii, "STRU"))) + self.assertTrue(os.path.isfile(os.path.join(ii, "miller.json"))) + self.assertTrue(os.path.isfile(os.path.join(ii, "displacement.json"))) + def test_make_property_refine(self): property = {"type": "eos", "vol_start": 0.85, "vol_end": 1.15, "vol_step": 0.01} pwd = os.getcwd() diff --git a/tests/test_account_cli.py b/tests/test_account_cli.py new file mode 100644 index 00000000..13c5b6a7 --- /dev/null +++ b/tests/test_account_cli.py @@ -0,0 +1,22 @@ +import sys +import unittest +from unittest.mock import patch + +from apex.main import parse_args + + +class TestAccountCliParser(unittest.TestCase): + def test_account_parser(self): + argv = [ + "apex", "account", + "--email", "demo@example.com", + "--program-id", "1234", + "--show" + ] + with patch.object(sys, "argv", argv): + _, args = parse_args() + + self.assertEqual(args.cmd, "account") + self.assertEqual(args.email, "demo@example.com") + self.assertEqual(args.program_id, 1234) + self.assertTrue(args.show) diff --git a/tests/test_account_config.py b/tests/test_account_config.py new file mode 100644 index 00000000..1e7ce6c6 --- /dev/null +++ b/tests/test_account_config.py @@ -0,0 +1,106 @@ +import json +import os +import tempfile +import unittest +from unittest.mock import patch + +from apex.account import ( + BOHRIUM_WORKFLOWS_HOST, + merge_bohrium_defaults, +) +from apex.utils import load_config_file + + +class TestAccountConfig(unittest.TestCase): + def test_merge_bohrium_defaults_for_bohrium_config_file(self): + with patch.dict(os.environ, {"APEX_ACCOUNT_FILE": "/tmp/does-not-exist.json"}): + merged = merge_bohrium_defaults( + {"scass_type": "c8_m31_1 * NVIDIA T4"}, + config_file="global_bohrium.json" + ) + self.assertEqual(merged["dflow_host"], BOHRIUM_WORKFLOWS_HOST) + self.assertEqual(merged["k8s_api_server"], BOHRIUM_WORKFLOWS_HOST) + self.assertEqual(merged["batch_type"], "Bohrium") + self.assertEqual(merged["context_type"], "Bohrium") + self.assertEqual(merged["scass_type"], "c8_m31_1 * NVIDIA T4") + + def test_json_overrides_account_defaults(self): + with tempfile.TemporaryDirectory() as tmpdir: + account_file = os.path.join(tmpdir, "account.json") + with open(account_file, "w", encoding="utf-8") as fp: + json.dump({ + "email": "saved@example.com", + "password": "saved_password", + "program_id": 1111, + "apex_image_name": "saved/apex:image" + }, fp) + + with patch.dict(os.environ, {"APEX_ACCOUNT_FILE": account_file}): + merged = merge_bohrium_defaults( + { + "email": "override@example.com", + "apex_image_name": "override/apex:image", + "scass_type": "c32_m64_cpu" + }, + config_file="global_bohrium.json" + ) + + self.assertEqual(merged["email"], "override@example.com") + self.assertEqual(merged["password"], "saved_password") + self.assertEqual(merged["program_id"], 1111) + self.assertEqual(merged["apex_image_name"], "override/apex:image") + self.assertEqual(merged["scass_type"], "c32_m64_cpu") + + def test_do_not_inject_bohrium_defaults_for_local_context(self): + with tempfile.TemporaryDirectory() as tmpdir: + account_file = os.path.join(tmpdir, "account.json") + with open(account_file, "w", encoding="utf-8") as fp: + json.dump({ + "email": "saved@example.com", + "password": "saved_password", + "program_id": 1111 + }, fp) + + with patch.dict(os.environ, {"APEX_ACCOUNT_FILE": account_file}): + merged = merge_bohrium_defaults( + {"context_type": "Local", "batch_type": "Shell"}, + config_file="global_local_debug.json" + ) + + self.assertEqual(merged["context_type"], "Local") + self.assertEqual(merged["batch_type"], "Shell") + self.assertNotIn("dflow_host", merged) + self.assertNotIn("email", merged) + + def test_load_config_file_uses_account_defaults(self): + with tempfile.TemporaryDirectory() as tmpdir: + account_file = os.path.join(tmpdir, "account.json") + config_file = os.path.join(tmpdir, "global_bohrium.json") + with open(account_file, "w", encoding="utf-8") as fp: + json.dump({ + "email": "saved@example.com", + "password": "saved_password", + "program_id": 1111 + }, fp) + with open(config_file, "w", encoding="utf-8") as fp: + json.dump({"scass_type": "c8_m31_1 * NVIDIA T4"}, fp) + + with patch.dict(os.environ, {"APEX_ACCOUNT_FILE": account_file}): + merged = load_config_file(config_file) + + self.assertEqual(merged["email"], "saved@example.com") + self.assertEqual(merged["program_id"], 1111) + self.assertEqual(merged["dflow_host"], BOHRIUM_WORKFLOWS_HOST) + self.assertEqual(merged["scass_type"], "c8_m31_1 * NVIDIA T4") + + def test_ignore_broken_account_file(self): + with tempfile.TemporaryDirectory() as tmpdir: + account_file = os.path.join(tmpdir, "account.json") + with open(account_file, "w", encoding="utf-8") as fp: + fp.write("{invalid-json") + with patch.dict(os.environ, {"APEX_ACCOUNT_FILE": account_file}): + merged = merge_bohrium_defaults( + {"scass_type": "c8_m31_1 * NVIDIA T4"}, + config_file="global_bohrium.json" + ) + self.assertEqual(merged["dflow_host"], BOHRIUM_WORKFLOWS_HOST) diff --git a/tests/test_annealing.py b/tests/test_annealing.py new file mode 100644 index 00000000..b3f98928 --- /dev/null +++ b/tests/test_annealing.py @@ -0,0 +1,328 @@ +import os +import shutil +import tempfile +import unittest +from pathlib import Path + +import pytest +from monty.serialization import loadfn + +from apex.core.calculator.lib import lammps_utils +from apex.core.property.Annealing import Annealing + + +TEST_CONTCAR = os.path.join( + os.path.dirname(__file__), "equi", "lammps", "hcp-Ti-CONTCAR" +) +TYPE_MAP = {"Ti": 0} +PARAM = {"type": "deepmd"} + + +def dummy_interaction(param): + return "pair_style dummy\npair_coeff * * dummy Ti\n" + + +def make_equi_dir(tmp_path): + equi_dir = tmp_path / "relax_task" + equi_dir.mkdir() + shutil.copy(TEST_CONTCAR, equi_dir / "CONTCAR") + return equi_dir + + +def test_annealing_default_parameter_parsing(): + prop = Annealing({"type": "annealing"}) + + assert prop.task_type() == "annealing" + assert prop.start_temp == 300.0 + assert prop.target_temp == 800.0 + assert prop.end_temp == 300.0 + assert prop.equi_step == 10000 + assert prop.ramp_step == 20000 + assert prop.hold_step == 0 + assert prop.cool_step == 20000 + assert prop.thermostat == "nose_hoover" + assert prop.ensemble == "npt" + assert prop.supercell_size == [2, 2, 2] + + task_param = prop.task_param() + assert task_param["cal_type"] == "annealing" + assert task_param["cal_setting"]["rdf_bins"] == 200 + assert task_param["cal_setting"]["timestep"] == 0.002 + + +def test_annealing_custom_cal_setting_override(): + prop = Annealing( + { + "type": "annealing", + "supercell_size": [3, 2, 1], + "cal_setting": { + "start_temp": 250, + "target_temp": [600, 900], + "end_temp": 350, + "equi_step": 12, + "ramp_step": 34, + "hold_step": 56, + "cool_step": 78, + "thermostat": "langevin", + "ensemble": "nve", + "tdamp": "tdamp_var", + "pdamp": "pdamp_var", + "velocity_seed": 2468, + "dump_step": 111, + "timestep": 0.004, + "rdf_bins": 42, + "rdf_cutoff": 6.5, + "rdf_interval": 9, + }, + } + ) + + task_param = prop.task_param() + assert prop.target_temp == 600.0 + assert task_param["supercell_size"] == [3, 2, 1] + assert task_param["cal_setting"]["target_temp"] == 600.0 + assert task_param["cal_setting"]["thermostat"] == "langevin" + assert task_param["cal_setting"]["ensemble"] == "nve" + assert task_param["cal_setting"]["tdamp"] == "tdamp_var" + assert task_param["cal_setting"]["pdamp"] == "pdamp_var" + assert task_param["cal_setting"]["dump_step"] == 111 + + +def test_annealing_make_confs_writes_task_files_and_variables(tmp_path): + equi_dir = make_equi_dir(tmp_path) + work_dir = tmp_path / "annealing" + prop = Annealing( + { + "type": "annealing", + "supercell_size": [2, 3, 4], + "cal_setting": { + "start_temp": 300, + "target_temp": [700, 900], + "end_temp": 400, + "equi_step": 10, + "ramp_step": 20, + "hold_step": 30, + "cool_step": 40, + "tdamp": 0.5, + "pdamp": 5.0, + "velocity_seed": 13579, + "dump_step": 25, + "timestep": 0.001, + "rdf_bins": 64, + "rdf_cutoff": 8.0, + "rdf_interval": 5, + }, + } + ) + + task_list = prop.make_confs(str(work_dir), str(equi_dir)) + + assert len(task_list) == 2 + first_task = work_dir / "task.000000" + second_task = work_dir / "task.000001" + assert first_task.as_posix() in task_list + assert (first_task / "POSCAR").is_file() + assert (first_task / "Annealing.json").is_file() + assert (first_task / "variable_Annealing.in").is_file() + + first_meta = loadfn(first_task / "Annealing.json") + second_meta = loadfn(second_task / "Annealing.json") + assert first_meta == { + "start_temp": 300.0, + "target_temp": 700.0, + "end_temp": 400.0, + "supercell_size": [2, 3, 4], + } + assert second_meta["target_temp"] == 900.0 + + variable_text = (first_task / "variable_Annealing.in").read_text() + assert "variable nx equal 2" in variable_text + assert "variable ny equal 3" in variable_text + assert "variable nz equal 4" in variable_text + assert "variable start_temp equal 300.00" in variable_text + assert "variable target_temp equal 700.00" in variable_text + assert "variable end_temp equal 400.00" in variable_text + assert "variable equi_step equal 10" in variable_text + assert "variable ramp_step equal 20" in variable_text + assert "variable hold_step equal 30" in variable_text + assert "variable cool_step equal 40" in variable_text + assert "variable rdf_bins equal 64" in variable_text + assert "variable rdf_cutoff equal 8.0" in variable_text + assert "variable rdf_interval equal 5" in variable_text + assert "variable tdamp equal 0.5" in variable_text + assert "variable pdamp equal 5.0" in variable_text + assert "variable velocity_seed equal 13579" in variable_text + assert "variable dump_step equal 25" in variable_text + + +def test_annealing_supercell_length_derives_replication_and_task_param(tmp_path): + equi_dir = make_equi_dir(tmp_path) + work_dir = tmp_path / "annealing_length" + prop = Annealing( + { + "type": "annealing", + "supercell_length": [6.0, 6.0, 8.0], + "cal_setting": {"target_temp": 600}, + } + ) + + task_list = prop.make_confs(str(work_dir), str(equi_dir)) + task_param = prop.task_param() + + assert len(task_list) == 1 + assert prop.supercell_size == [3, 3, 2] + assert task_param["supercell_length"] == [6.0, 6.0, 8.0] + variable_text = (work_dir / "task.000000" / "variable_Annealing.in").read_text() + assert "variable nx equal 3" in variable_text + assert "variable ny equal 3" in variable_text + assert "variable nz equal 2" in variable_text + + +def test_annealing_rate_controls_derive_ramp_and_cool_steps(tmp_path): + equi_dir = make_equi_dir(tmp_path) + work_dir = tmp_path / "annealing_rates" + prop = Annealing( + { + "type": "annealing", + "cal_setting": { + "start_temp": 300, + "target_temp": [500, 700], + "end_temp": 400, + "ramp_rate": 100, + "cool_rate": [50, 100], + "ramp_step": 999, + "cool_step": 888, + "timestep": 1.0, + }, + } + ) + + task_list = prop.make_confs(str(work_dir), str(equi_dir)) + + first_variable = (work_dir / "task.000000" / "variable_Annealing.in").read_text() + second_variable = (work_dir / "task.000001" / "variable_Annealing.in").read_text() + assert len(task_list) == 2 + assert "variable ramp_step equal 2000" in first_variable + assert "variable cool_step equal 2000" in first_variable + assert "variable ramp_step equal 4000" in second_variable + assert "variable cool_step equal 3000" in second_variable + + +def test_annealing_rate_fallback_and_missing_relaxation_error(tmp_path): + equi_dir = make_equi_dir(tmp_path) + work_dir = tmp_path / "annealing_bad_rates" + prop = Annealing( + { + "type": "annealing", + "cal_setting": { + "target_temp": [500], + "ramp_rate": "not-a-number", + "cool_rate": "not-a-number", + "ramp_step": 77, + "cool_step": 88, + }, + } + ) + + prop.make_confs(str(work_dir), str(equi_dir)) + variable_text = (work_dir / "task.000000" / "variable_Annealing.in").read_text() + assert "variable ramp_step equal 77" in variable_text + assert "variable cool_step equal 88" in variable_text + + with pytest.raises(RuntimeError, match="please finish relaxation before annealing"): + prop.make_confs(str(tmp_path / "missing_work"), str(tmp_path / "missing_equi")) + + +def test_annealing_compute_lower_returns_task_notes(tmp_path): + prop = Annealing({"type": "annealing"}) + + res_data, ptr_data = prop._compute_lower( + str(tmp_path / "result.json"), + [str(tmp_path / "task.000000"), str(tmp_path / "task.000001")], + {}, + ) + + assert ptr_data == str(tmp_path) + "\n" + assert res_data["task.000000"]["task"] == "task.000000" + assert "inspect log.lammps" in res_data["task.000001"]["note"] + + +def test_annealing_lammps_input_contains_all_md_stages_and_outputs(): + prop = Annealing( + { + "type": "annealing", + "cal_setting": { + "start_temp": 300, + "target_temp": 800, + "end_temp": 350, + "equi_step": 10, + "ramp_step": 20, + "hold_step": 30, + "cool_step": 40, + "thermostat": "nose_hoover", + "ensemble": "npt", + "tdamp": "tdamp_var", + "pdamp": "pdamp_var", + "velocity_seed": 123, + "dump_step": 50, + "rdf_interval": 5, + }, + } + ) + + script = lammps_utils.make_lammps_annealing( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + PARAM, + prop.task_param()["cal_setting"], + ) + + assert "fix 1 all npt temp ${start_temp} ${start_temp} tdamp_var" in script + assert "fix 1 all npt temp ${start_temp} ${target_temp} tdamp_var" in script + assert ( + 'if "${hold_step} > 0" then "fix 1 all nvt temp ${target_temp} ' + '${target_temp} tdamp_var" "run ${hold_step}" "unfix 1"' + ) in script + assert "fix 1 all npt temp ${target_temp} ${end_temp} tdamp_var" in script + assert "run ${equi_step}" in script + assert "run ${ramp_step}" in script + assert "run ${cool_step}" in script + assert "compute myRDF all rdf ${rdf_bins} cutoff ${rdf_cutoff}" in script + assert "file rdf_ramp.dat mode vector" in script + assert "file rdf_cool.dat mode vector" in script + assert "file heating_interval.dat" in script + assert "file cooling_interval.dat" in script + assert "dump.anneal_ramp" in script + assert "dump.anneal_cool" in script + + +class TestAnnealingCoverage(unittest.TestCase): + def test_annealing_default_parameter_parsing(self): + test_annealing_default_parameter_parsing() + + def test_annealing_custom_cal_setting_override(self): + test_annealing_custom_cal_setting_override() + + def test_annealing_make_confs_writes_task_files_and_variables(self): + with tempfile.TemporaryDirectory() as tmp: + test_annealing_make_confs_writes_task_files_and_variables(Path(tmp)) + + def test_annealing_supercell_length_derives_replication_and_task_param(self): + with tempfile.TemporaryDirectory() as tmp: + test_annealing_supercell_length_derives_replication_and_task_param(Path(tmp)) + + def test_annealing_rate_controls_derive_ramp_and_cool_steps(self): + with tempfile.TemporaryDirectory() as tmp: + test_annealing_rate_controls_derive_ramp_and_cool_steps(Path(tmp)) + + def test_annealing_rate_fallback_and_missing_relaxation_error(self): + with tempfile.TemporaryDirectory() as tmp: + test_annealing_rate_fallback_and_missing_relaxation_error(Path(tmp)) + + def test_annealing_compute_lower_returns_task_notes(self): + with tempfile.TemporaryDirectory() as tmp: + test_annealing_compute_lower_returns_task_notes(Path(tmp)) + + def test_annealing_lammps_input_contains_all_md_stages_and_outputs(self): + test_annealing_lammps_input_contains_all_md_stages_and_outputs() diff --git a/tests/test_cohesive.py b/tests/test_cohesive.py new file mode 100644 index 00000000..c4d1fe1e --- /dev/null +++ b/tests/test_cohesive.py @@ -0,0 +1,170 @@ +import glob +import os +import shutil +import sys +import unittest + +import json +import numpy as np +from apex.core.property.Cohesive import Cohesive + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +__package__ = "tests" + +# Optional import: reporter stack depends on pandas/plotly, which may not be present +try: + from apex.reporter.property_report import CohesiveReport # type: ignore + _HAS_REPORT_DEPS = True +except Exception: + CohesiveReport = None # type: ignore + _HAS_REPORT_DEPS = False + +class TestCohesive(unittest.TestCase): + def setUp(self): + _jdata = { + "structures": ["confs/std-fcc"], + "interaction": { + "type": "vasp", + "incar": "vasp_input/INCAR.rlx", + "potcar_prefix": ".", + "potcars": {"Li": "vasp_input/POTCAR"}, + }, + "properties": [ + { + "type": "cohesive", + "skip": False, + "latt_start": 0.8, + "latt_end": 1.2, + "latt_step": 0.01, + "latt_abs": False, + "cal_setting": { + "relax_pos": False, + "relax_shape": False, + "relax_vol": False, + "overwrite_interaction": { + "type": "deepmd", + "model": "lammps_input/frozen_model.pb", + "type_map": {"Al": 0}, + }, + }, + } + ], + } + + self.equi_path = "confs/std-fcc/relaxation/relax_task" + self.source_path = "equi/vasp" + self.target_path = "confs/std-fcc/cohesive_00" + if not os.path.exists(self.equi_path): + os.makedirs(self.equi_path) + + self.confs = _jdata["structures"] + self.inter_param = _jdata["interaction"] + self.prop_param = _jdata["properties"] + + self.cohesive = Cohesive(_jdata["properties"][0]) + + def tearDown(self): + if os.path.exists(self.equi_path): + shutil.rmtree(self.equi_path) + if os.path.exists(self.target_path): + shutil.rmtree(self.target_path) + + def test_task_type(self): + self.assertEqual("cohesive", self.cohesive.task_type()) + + def test_task_param(self): + self.assertEqual(self.prop_param[0], self.cohesive.task_param()) + + def test_make_confs_0(self): + # Expect failure when equilibrium structure is missing + if not os.path.exists(os.path.join(self.equi_path, "CONTCAR")): + with self.assertRaises(RuntimeError): + self.cohesive.make_confs(self.target_path, self.equi_path) + + # Provide equilibrium structure and generate tasks + shutil.copy( + os.path.join(self.source_path, "CONTCAR"), + os.path.join(self.equi_path, "CONTCAR"), + ) + tasks = self.cohesive.make_confs(self.target_path, self.equi_path) + dfm_dirs = sorted(glob.glob(os.path.join(self.target_path, "task.*"))) + # compare absolute paths to avoid rel/abs mismatches + abs_dfm = [os.path.realpath(p) for p in dfm_dirs] + abs_tasks = [os.path.realpath(p) for p in tasks] + self.assertEqual(abs_dfm, abs_tasks) + + # Expect 41 tasks from 0.8 to 1.2 inclusive with step 0.01 + self.assertEqual(len(dfm_dirs), 41) + + for ii in dfm_dirs: + self.assertTrue(os.path.isfile(os.path.join(ii, "POSCAR"))) + cohesive_json_file = os.path.join(ii, "cohesive.json") + self.assertTrue(os.path.isfile(cohesive_json_file)) + with open(cohesive_json_file, "r") as fp: + cohesive_json = json.load(fp) + self.assertEqual( + os.path.realpath(os.path.join(ii, "POSCAR.orig")), + os.path.realpath(os.path.join(self.equi_path, "CONTCAR")), + ) + + # Parse POSCAR directly to obtain |a| and compare with logged lattice + with open(os.path.join(ii, "POSCAR"), "r") as f: + lines = f.readlines() + scale = float(lines[1].strip()) + cell = np.array([[float(x) for x in line.split()] for line in lines[2:5]]) * scale + a_len = np.linalg.norm(cell, axis=1)[0] + self.assertAlmostEqual(cohesive_json["lattice"], a_len, places=6) + + def test_make_confs_1(self): + self.cohesive.reprod = True + shutil.copy( + os.path.join(self.source_path, "CONTCAR"), + os.path.join(self.equi_path, "CONTCAR"), + ) + with self.assertRaises(RuntimeError): + self.cohesive.make_confs(self.target_path, self.equi_path) + +@unittest.skipUnless(_HAS_REPORT_DEPS, "report dependencies not available") +class TestCohesiveReport(unittest.TestCase): + def setUp(self): + self.res_data = { + "3.5": {"total_energy": -3.0, "cohesive_energy": -5.0}, + "3.6": {"total_energy": -3.2, "cohesive_energy": -5.2}, + "3.7": {"total_energy": -3.5, "cohesive_energy": -5.5}, + "3.8": {"total_energy": -3.8, "cohesive_energy": -5.8}, + "3.9": {"total_energy": -3.6, "cohesive_energy": -5.6}, + "4.0": {"total_energy": -3.4, "cohesive_energy": -5.4}, + } + + self.formatted_data = {} + for k, v in self.res_data.items(): + if isinstance(v, dict) and "cohesive_energy" in v: + self.formatted_data[k] = v["cohesive_energy"] + else: + self.formatted_data[k] = v + + def test_plotly_graph(self): + traces, layout = CohesiveReport.plotly_graph(self.res_data, "test_material") + + self.assertEqual(len(traces), 2) + self.assertEqual(traces[0].name, "test_material") + self.assertEqual(traces[0].mode, "lines+markers") + + cohesive_values = list(self.formatted_data.values()) + self.assertEqual(list(traces[0].y), cohesive_values) + + self.assertEqual(layout.title.text, "Cohesive Energy") + self.assertIn("Scaled Lattice Parameter", layout.xaxis.title.text) + self.assertIn("Cohesive Energy", layout.yaxis.title.text) + + def test_dash_table(self): + table, df = CohesiveReport.dash_table(self.res_data) + + self.assertEqual(len(df), len(self.formatted_data)) + self.assertEqual(len(df.columns), 3) + + self.assertIn("Scaled Lattice Parameter (a/a0)", df.columns) + self.assertIn("Total Energy (eV/atom)", df.columns) + self.assertIn("Cohesive Energy (eV/atom)", df.columns) + + self.assertEqual(len(table.data), len(self.formatted_data)) diff --git a/tests/test_decohesive.py b/tests/test_decohesive.py new file mode 100644 index 00000000..09b755c8 --- /dev/null +++ b/tests/test_decohesive.py @@ -0,0 +1,183 @@ +import glob +import os +import shutil +import sys +import unittest + +import numpy as np +from monty.serialization import loadfn +from pymatgen.core import Structure +from pymatgen.core.surface import SlabGenerator + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +__package__ = "tests" + +from apex.core.property.Decohesive import Decohesive +from apex.reporter.property_report import DecohesiveReport + +class TestDecohesive(unittest.TestCase): + def setUp(self): + base_param = { + "structures": ["confs/std-fcc"], + "interaction": { + "type": "vasp", + "incar": "vasp_input/INCAR.rlx", + "potcar_prefix": ".", + "potcars": {"Li": "vasp_input/POTCAR"}, + }, + "properties": [ + { + "type": "decohesive", + "min_slab_size": 15, + "max_vacuum_size": 10, + "vacuum_size_step": 5, + "miller_index": [0, 0, 1], + "cal_type": "static", + } + ], + } + + self.equi_path = "confs/std-fcc/relaxation/relax_task" + self.source_path = "equi/vasp" + self.target_path = "confs/std-fcc/decohesive_00" + if not os.path.exists(self.equi_path): + os.makedirs(self.equi_path) + + self.confs = base_param["structures"] + self.inter_param = base_param["interaction"] + self.prop_param = base_param["properties"] + self.decohesive = Decohesive(self.prop_param[0]) + + def tearDown(self): + if os.path.exists(self.equi_path): + shutil.rmtree(self.equi_path) + if os.path.exists(self.target_path): + shutil.rmtree(self.target_path) + + def test_task_type(self): + self.assertEqual("decohesive", self.decohesive.task_type()) + + def test_task_param(self): + self.assertEqual(self.prop_param[0], self.decohesive.task_param()) + + def test_make_confs_0(self): + if not os.path.exists(os.path.join(self.equi_path, "CONTCAR")): + with self.assertRaises(RuntimeError): + self.decohesive.make_confs(self.target_path, self.equi_path) + shutil.copy( + os.path.join(self.source_path, "CONTCAR"), + os.path.join(self.equi_path, "CONTCAR"), + ) + task_list = self.decohesive.make_confs(self.target_path, self.equi_path) + self.assertEqual(len(task_list), 3) + + dfm_dirs = glob.glob(os.path.join(self.target_path, "task.*")) + + self.assertEqual( + os.path.realpath(os.path.join(self.equi_path, "CONTCAR")), + os.path.realpath(os.path.join(self.target_path, "POSCAR")), + ) + + ref_st = Structure.from_file(os.path.join(self.target_path, "POSCAR")) + dfm_dirs.sort() + num = 0 + for ii in dfm_dirs: + st_file = os.path.join(ii, "POSCAR") + self.assertTrue(os.path.isfile(st_file)) + st1_file = os.path.join(ii, "POSCAR.tmp") + self.assertTrue(os.path.isfile(st1_file)) + st1 = Structure.from_file(st1_file) + decohesive_json_file = os.path.join(ii, "decohesive.json") + decohesive_json = loadfn(decohesive_json_file) + sl = self.__gen_slab_pmg( + ref_st, + tuple(decohesive_json["miller_index"]), + self.prop_param[0]["min_slab_size"], + self.prop_param[0]["vacuum_size_step"] * num, + ) + num += 1 + # slb = sl.get_slab() + st2 = Structure(sl.lattice, sl.species, sl.frac_coords) + self.assertEqual(len(st1), len(st2)) + + def __gen_slab_pmg(self, structure: Structure, + plane_miller, slab_size, vacuum_size) -> Structure: + + # Generate slab via Pymatgen + slabGen = SlabGenerator(structure, miller_index=plane_miller, + min_slab_size=slab_size, min_vacuum_size=0, + center_slab=True, in_unit_planes=False, + lll_reduce=True, reorient_lattice=False, + primitive=False) + slabs_pmg = slabGen.get_slabs(ftol=0.001) + slab = [s for s in slabs_pmg if s.miller_index == plane_miller][0] + # If a transform matrix is passed, reorient the slab + order = zip(slab.frac_coords, slab.species) + c_order = sorted(order, key=lambda x: x[0][2]) + sorted_frac_coords = [] + sorted_species = [] + for (frac_coord, species) in c_order: + sorted_frac_coords.append(frac_coord) + sorted_species.append(species) + # add vacuum layer to the slab with height unit of angstrom + a_vec, b_vec, c_vec = slab.lattice.matrix + slab_height = abs(c_vec[2]) + elong_scale = 1 + (abs(vacuum_size) / slab_height) + new_lattice = [a_vec, b_vec, elong_scale * c_vec] + new_frac_coords = [] + for frac in sorted_frac_coords: + coord = frac.copy() + coord[2] = coord[2] / elong_scale + new_frac_coords.append(coord) + slab_new = Structure( + lattice=np.array(new_lattice), coords=new_frac_coords, species=sorted_species + ) + + return slab_new + +class TestDecohesiveReport(unittest.TestCase): + def setUp(self): + self.res_data = { + "0_task.000000": [0, 1, 2e9], + "5_task.000000": [5, 6, 7e9], + "10_task.000000": [10, 11, 12e9], + } + + # Sort once to mirror DecohesiveReport behavior + sorted_vals = sorted(self.res_data.values(), key=lambda x: float(x[0])) + self.sorted_vacuum = [float(v[0]) for v in sorted_vals] + self.sorted_energy = [float(v[1]) for v in sorted_vals] + self.sorted_stress_gpa = [float(v[2]) / 1e9 for v in sorted_vals] + + def test_plotly_graph(self): + traces, layout = DecohesiveReport.plotly_graph(self.res_data, "test_material") + + self.assertEqual(len(traces), 2) + self.assertEqual(traces[0].name, "test_material Decohesion Energy") + self.assertEqual(traces[0].mode, "lines+markers") + + self.assertEqual(list(traces[0].x), self.sorted_vacuum) + self.assertEqual(list(traces[0].y), self.sorted_energy) + self.assertEqual(list(traces[1].y), self.sorted_stress_gpa) + + self.assertEqual(layout.title.text, "Decohesion Energy and Stress") + self.assertIn("Separation Distance (A)", layout.xaxis.title.text) + self.assertIn("Decohesion Energy", layout.yaxis.title.text) + self.assertIn("Decohesion Stress", layout.yaxis2.title.text) + + def test_dash_table(self): + table, df = DecohesiveReport.dash_table(self.res_data) + + self.assertEqual(len(df), len(self.res_data)) + self.assertEqual(len(df.columns), 3) + + self.assertIn("Separation Distance (A)", df.columns) + self.assertIn("Decohesion Energy (J/m^2)", df.columns) + self.assertIn("Decohesion Stress (GPa)", df.columns) + + # Rows should be sorted by vacuum distance + self.assertEqual( + list(map(float, df["Separation Distance (A)"].tolist())), + [float(v) for v in self.sorted_vacuum], + ) + diff --git a/tests/test_finitetelastic.py b/tests/test_finitetelastic.py new file mode 100644 index 00000000..a315954d --- /dev/null +++ b/tests/test_finitetelastic.py @@ -0,0 +1,575 @@ +import os +import shutil +import sys +import tempfile +import unittest +from pathlib import Path + +import numpy as np +import pytest +from monty.serialization import dumpfn, loadfn + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +__package__ = "tests" + +from apex.core.property.FiniteTelastic import ( + EQUI_RESTART, + FiniteTelastic, + _block_average, + _compute_pair_delta, + _deform_include, + _derive_moduli_from_voigt_gpa, + _fit_elastic_tensor_bar, + _format_temperature, + _read_stress_timeseries, + _voigt_strain, + _voigt_strain_tensor, + normalize_strain_components, +) +from apex.reporter.DashReportApp import DashReportApp, return_prop_class, return_prop_type +from apex.reporter.property_report import FiniteTelasticReport + +TEST_DIR = os.path.dirname(__file__) + + +class TestFiniteTelasticHelpers(unittest.TestCase): + def test_component_normalization(self): + self.assertEqual(normalize_strain_components(["xx", "yy", "xy"]), [0, 1, 5]) + + def test_stress_parser(self): + with tempfile.TemporaryDirectory() as tmp: + with open(os.path.join(tmp, "stress_timeseries.txt"), "w") as fp: + fp.write("# step pxx pyy pzz pxy pxz pyz\n") + fp.write("0 1 2 3 4 5 6\n") + fp.write("\n") + fp.write("100 7 8 9 10 11 12\n") + data = _read_stress_timeseries(tmp) + self.assertEqual(sorted(data), [0, 100]) + np.testing.assert_allclose(data[0], [[1, 4, 5], [4, 2, 6], [5, 6, 3]]) + + def test_sign_unit_conversion_from_pair_delta(self): + with tempfile.TemporaryDirectory() as tmp: + ref = os.path.join(tmp, "ref") + strained = os.path.join(tmp, "strained") + os.makedirs(ref) + os.makedirs(strained) + with open(os.path.join(ref, "stress_timeseries.txt"), "w") as fp: + fp.write("# step pxx pyy pzz pxy pxz pyz\n") + fp.write("0 100 0 0 0 0 0\n") + with open(os.path.join(strained, "stress_timeseries.txt"), "w") as fp: + fp.write("# step pxx pyy pzz pxy pxz pyz\n") + fp.write("0 90 0 0 0 0 0\n") + mean, stderr, block_means, n_samples, warnings = _compute_pair_delta(ref, strained, 10) + self.assertEqual(n_samples, 1) + self.assertEqual(warnings, []) + self.assertEqual(mean[0, 0], 10.0) + self.assertEqual(stderr[0, 0], 0.0) + self.assertEqual(block_means.shape[0], 1) + + def test_block_average(self): + values = np.array([1.0, 2.0, 3.0, 4.0]) + block_means, stderr = _block_average(values, 2) + np.testing.assert_allclose(block_means, [1.5, 3.5]) + self.assertAlmostEqual(stderr, 1.0) + + def test_least_squares_tensor_fitting(self): + c_known = np.array( + [ + [100, 10, 10, 0, 0, 0], + [10, 110, 10, 0, 0, 0], + [10, 10, 120, 0, 0, 0], + [0, 0, 0, 50, 0, 0], + [0, 0, 0, 0, 60, 0], + [0, 0, 0, 0, 0, 70], + ], + dtype=float, + ) + strain_rows = [] + for component in range(6): + strain_rows.append(_voigt_strain(component, 0.001)) + strain_rows.append(_voigt_strain(component, -0.001)) + strain_rows = np.asarray(strain_rows) + stress_rows = strain_rows @ c_known.T + c_raw, c_sym, rank = _fit_elastic_tensor_bar(strain_rows, stress_rows) + self.assertEqual(rank, 6) + np.testing.assert_allclose(c_raw, c_known, atol=1e-10) + np.testing.assert_allclose(c_sym, c_known, atol=1e-10) + + def test_shear_convention(self): + tensor = _voigt_strain_tensor(5, 0.002) + self.assertEqual(tensor[0, 1], 0.001) + self.assertEqual(tensor[1, 0], 0.001) + voigt = _voigt_strain(5, 0.002) + self.assertEqual(voigt[5], 0.002) + + def test_derive_moduli_accepts_voigt_matrix(self): + c_voigt = np.array( + [ + [100, 50, 50, 0, 0, 0], + [50, 100, 50, 0, 0, 0], + [50, 50, 100, 0, 0, 0], + [0, 0, 0, 25, 0, 0], + [0, 0, 0, 0, 25, 0], + [0, 0, 0, 0, 0, 25], + ], + dtype=float, + ) + bulk, shear, young, poisson = _derive_moduli_from_voigt_gpa(c_voigt) + self.assertAlmostEqual(bulk, 200.0 / 3.0) + self.assertAlmostEqual(shear, 25.0) + self.assertGreater(young, 0.0) + self.assertGreater(poisson, 0.0) + + +class TestFiniteTelasticProperty(unittest.TestCase): + def setUp(self): + self.equi_path = os.path.join(TEST_DIR, "confs/hcp-Ti/relaxation/relax_task") + self.source_path = os.path.join(TEST_DIR, "equi/lammps") + self.target_path = os.path.join(TEST_DIR, "confs/hcp-Ti/finite_t_elastic_00") + os.makedirs(self.equi_path, exist_ok=True) + self.parameter = { + "type": "finite_t_elastic", + "supercell_size": [2, 2, 2], + "cal_setting": { + "temperature": [300], + "strain": 0.001, + "strain_components": ["xx", "xy"], + "equi_step": 10, + "response_step": 10, + }, + } + + def tearDown(self): + if os.path.exists(os.path.abspath(os.path.join(self.equi_path, ".."))): + shutil.rmtree(os.path.abspath(os.path.join(self.equi_path, ".."))) + if os.path.exists(self.target_path): + shutil.rmtree(self.target_path) + + def test_make_confs_generates_equi_and_paired_tasks(self): + prop = FiniteTelastic(self.parameter, {"type": "meam_spline"}) + shutil.copy( + os.path.join(self.source_path, "hcp-Ti-CONTCAR"), + os.path.join(self.equi_path, "CONTCAR"), + ) + task_list = prop.make_confs(self.target_path, self.equi_path) + self.assertEqual(len(task_list), 9) + self.assertTrue(os.path.isfile(os.path.join(task_list[0], "FiniteTelastic.json"))) + self.assertTrue(os.path.isfile(os.path.join(task_list[0], "variable_FiniteTelastic.in"))) + self.assertTrue(os.path.isfile(os.path.join(task_list[1], "deform_FiniteTelastic.in"))) + self.assertFalse(os.path.exists(os.path.join(task_list[0], "POSCAR.tmp"))) + response_meta = loadfn(os.path.join(task_list[1], "FiniteTelastic.json")) + self.assertEqual(response_meta["restart_source"], "finite_t_elastic.equi.restart") + + def test_rejects_vasp(self): + with self.assertRaises(TypeError): + FiniteTelastic({"type": "finite_t_elastic"}, {"type": "vasp"}) + + +class TestFiniteTelasticReport(unittest.TestCase): + def test_reporter_registered_for_numbered_property_name(self): + self.assertEqual(return_prop_type("finite_t_elastic_00"), "finite_t_elastic") + self.assertIs(return_prop_class("finite_t_elastic"), FiniteTelasticReport) + + def test_reporter_builds_graph_and_table(self): + res_data = { + "temperatures": { + "300": { + "B": 70.0, + "G": 30.0, + "E": 80.0, + "u": 0.3, + "rank": 6, + "number_of_paired_responses": 12, + "elastic_tensor": [ + [1.0 if ii == jj else 0.0 for jj in range(6)] + for ii in range(6) + ], + } + } + } + + traces, layout = FiniteTelasticReport.plotly_graph(res_data, "test") + table, df = FiniteTelasticReport.dash_table(res_data) + + self.assertGreaterEqual(len(traces), 3) + self.assertEqual(layout.title.text, "Finite-Temperature Elastic Constants") + self.assertIn("C11 (GPa)", df.columns) + self.assertEqual(table.data[0]["Temperature (K)"], 300) + + def test_dash_report_uses_pattern_matching_clipboard_ids(self): + datasets = { + "work": { + "conf": { + "finite_t_elastic_00": { + "result": { + "temperatures": { + "300": { + "B": 70.0, + "G": 30.0, + "E": 80.0, + "u": 0.3, + "elastic_tensor": [ + [1.0 if ii == jj else 0.0 for jj in range(6)] + for ii in range(6) + ], + } + } + } + } + } + } + } + app = DashReportApp(datasets) + table_container = app.update_table("finite_t_elastic_00", "conf") + table_div = table_container.children[0] + clipboard = table_div.children[1] + table = table_div.children[2] + + self.assertEqual(clipboard.id, {"type": "clip", "index": 0}) + self.assertEqual(table.id, {"type": "table", "index": 0}) + self.assertIn("Temperature (K)", app.csv_copy(1, table.data)) + + +def make_tmp_equi_dir(tmp_path): + equi_dir = tmp_path / "relax_task" + equi_dir.mkdir() + shutil.copy(os.path.join(TEST_DIR, "equi/lammps/hcp-Ti-CONTCAR"), equi_dir / "CONTCAR") + return equi_dir + + +def test_finite_t_elastic_generates_metadata_and_include_files(tmp_path): + equi_dir = make_tmp_equi_dir(tmp_path) + work_dir = tmp_path / "finite_t_elastic" + prop = FiniteTelastic( + { + "type": "finite_t_elastic", + "supercell_size": [1, 2, 3], + "cal_setting": { + "temperature": [300], + "strain": 0.002, + "strain_components": ["xx"], + "equi_step": 11, + "response_step": 22, + "stress_output_every": 3, + "timestep": 0.004, + "tdamp": 0.5, + "pdamp": 5.0, + "seed": 2468, + "n_blocks": 4, + }, + }, + {"type": "lammps"}, + ) + + task_list = prop.make_confs(str(work_dir), str(equi_dir)) + + assert len(task_list) == 5 + roles = [ + loadfn(work_dir / f"task.{idx:06d}" / "FiniteTelastic.json")["role"] + for idx in range(5) + ] + assert roles == ["equi", "reference", "strained", "reference", "strained"] + + equi_meta = loadfn(work_dir / "task.000000" / "FiniteTelastic.json") + ref_meta = loadfn(work_dir / "task.000001" / "FiniteTelastic.json") + strained_meta = loadfn(work_dir / "task.000002" / "FiniteTelastic.json") + + assert equi_meta["property"] == "finite_t_elastic" + assert equi_meta["role"] == "equi" + assert equi_meta["strain_label"] == "none" + assert equi_meta["restart_source"] is None + assert equi_meta["supercell_size"] == [1, 2, 3] + assert equi_meta["equi_step"] == 11 + assert equi_meta["response_step"] == 22 + assert equi_meta["stress_output_every"] == 3 + assert equi_meta["langevin_seed"] == 2468 + + assert ref_meta["role"] == "reference" + assert ref_meta["is_reference"] is True + assert ref_meta["pair_id"] == "T300_c0_m" + assert ref_meta["strain_component"] == 0 + assert ref_meta["strain_value"] == 0.0 + assert ref_meta["restart_source"] == EQUI_RESTART + + assert strained_meta["role"] == "strained" + assert strained_meta["is_reference"] is False + assert strained_meta["pair_id"] == "T300_c0_m" + assert strained_meta["strain_component"] == 0 + assert strained_meta["strain_value"] == -0.002 + assert strained_meta["restart_source"] == EQUI_RESTART + + variable_text = (work_dir / "task.000002" / "variable_FiniteTelastic.in").read_text() + assert "variable role string strained" in variable_text + assert "variable temperature equal 300" in variable_text + assert "variable nx equal 1" in variable_text + assert "variable ny equal 2" in variable_text + assert "variable nz equal 3" in variable_text + assert "variable timestep equal 0.004" in variable_text + assert "variable tdamp equal 0.5" in variable_text + assert "variable pdamp equal 5" in variable_text + assert "variable seed equal 2468" in variable_text + assert "variable equi_step equal 11" in variable_text + assert "variable response_step equal 22" in variable_text + assert "variable stress_output_every equal 3" in variable_text + assert "variable strain equal -0.002" in variable_text + assert f"variable restart_source string {EQUI_RESTART}" in variable_text + + reference_deform = (work_dir / "task.000001" / "deform_FiniteTelastic.in").read_text() + strained_deform = (work_dir / "task.000002" / "deform_FiniteTelastic.in").read_text() + output_text = (work_dir / "task.000002" / "output_FiniteTelastic.in").read_text() + assert "no strain deformation" in reference_deform + assert "variable scale_x equal 1.0+${strain}" in strained_deform + assert "change_box all x scale ${scale_x} remap units box" in strained_deform + assert "fix stress_out all ave/time ${stress_output_every}" in output_text + assert "file stress_timeseries.txt" in output_text + + +def test_finite_t_elastic_defaults_task_type_and_scalar_temperature(tmp_path): + equi_dir = make_tmp_equi_dir(tmp_path) + work_dir = tmp_path / "finite_t_elastic_scalar" + prop = FiniteTelastic( + { + "cal_setting": { + "temperature": 350, + "strain_components": ["xy"], + "equi_step": 1, + "response_step": 1, + } + }, + {"type": "lammps"}, + ) + + task_list = prop.make_confs(str(work_dir), str(equi_dir)) + + assert prop.task_type() == "finite_t_elastic" + assert prop.task_param()["cal_type"] == "finite_t_elastic" + assert prop._temperatures() == [350.0] + assert len(task_list) == 5 + strained_meta = loadfn(work_dir / "task.000002" / "FiniteTelastic.json") + assert strained_meta["pair_id"] == "T350_c5_m" + assert strained_meta["strain_label"] == "xy" + + +@pytest.mark.parametrize( + ("component", "expected"), + [ + (1, "change_box all y scale ${scale_y} remap units box"), + (2, "change_box all z scale ${scale_z} remap units box"), + (3, "change_box all yz delta ${d_yz} remap units box"), + (4, "change_box all xz delta ${d_xz} remap units box"), + (5, "change_box all xy delta ${d_xy} remap units box"), + ], +) +def test_finite_t_elastic_deform_include_components(component, expected): + assert expected in _deform_include(component, 0.001) + + +def test_finite_t_elastic_helper_error_paths(tmp_path): + prop = FiniteTelastic({"type": "finite_t_elastic"}, {"type": "lammps"}) + + with pytest.raises(RuntimeError, match="missing FiniteTelastic.json"): + prop._load_task_records([str(tmp_path / "missing_task")]) + + bad_meta_task = tmp_path / "bad_meta" + bad_meta_task.mkdir() + dumpfn({"property": "other"}, bad_meta_task / "FiniteTelastic.json") + with pytest.raises(RuntimeError, match="unexpected property metadata"): + prop._load_task_records([str(bad_meta_task)]) + + with pytest.raises(RuntimeError, match="missing pair_id"): + prop._paired_records([{"task_dir": "task", "metadata": {"role": "reference"}}]) + + with pytest.raises(RuntimeError, match="invalid FiniteTelastic role"): + prop._paired_records( + [{"task_dir": "task", "metadata": {"role": "bad", "pair_id": "p0"}}] + ) + + duplicate_records = [ + {"task_dir": "task0", "metadata": {"role": "reference", "pair_id": "p0"}}, + {"task_dir": "task1", "metadata": {"role": "reference", "pair_id": "p0"}}, + ] + with pytest.raises(RuntimeError, match="duplicate reference task"): + prop._paired_records(duplicate_records) + + with pytest.raises(RuntimeError, match="missing strained task"): + prop._paired_records( + [{"task_dir": "task0", "metadata": {"role": "reference", "pair_id": "p0"}}] + ) + + with pytest.raises(RuntimeError, match="missing reference task"): + prop._paired_records( + [{"task_dir": "task0", "metadata": {"role": "strained", "pair_id": "p0"}}] + ) + + empty_stress_task = tmp_path / "empty_stress" + empty_stress_task.mkdir() + (empty_stress_task / "stress_timeseries.txt").write_text("# only comments\n") + with pytest.raises(RuntimeError, match="empty or unparsable"): + _read_stress_timeseries(str(empty_stress_task)) + + with pytest.raises(RuntimeError, match="cannot block-average"): + _block_average([], 2) + + with pytest.raises(ValueError, match="unsupported strain component"): + _deform_include(9, 0.001) + + with pytest.raises(RuntimeError, match="strain matrix"): + _fit_elastic_tensor_bar(np.zeros((2, 5)), np.zeros((2, 6))) + + with pytest.raises(RuntimeError, match="stress matrix"): + _fit_elastic_tensor_bar(np.zeros((2, 6)), np.zeros((2, 5))) + + with pytest.raises(RuntimeError, match="insufficient independent"): + _fit_elastic_tensor_bar(np.zeros((2, 6)), np.zeros((2, 6))) + + with pytest.raises(RuntimeError, match="elastic Voigt matrix"): + _derive_moduli_from_voigt_gpa(np.zeros((3, 3))) + + +def write_stress(path, rows): + path.write_text( + "# step pxx pyy pzz pxy pxz pyz\n" + + "\n".join( + f"{step} {pxx} {pyy} {pzz} {pxy} {pxz} {pyz}" + for step, pxx, pyy, pzz, pxy, pxz, pyz in rows + ) + + "\n" + ) + + +def pressure_rows_from_stress(stress_voigt, include_extra=False): + pxx, pyy, pzz, pyz, pxz, pxy = -np.asarray(stress_voigt, dtype=float) + rows = [ + (0, pxx, pyy, pzz, pxy, pxz, pyz), + (100, pxx, pyy, pzz, pxy, pxz, pyz), + ] + if include_extra: + rows.append((200, pxx, pyy, pzz, pxy, pxz, pyz)) + return rows + + +def test_finite_t_elastic_compute_lower_with_synthetic_stress_data(tmp_path): + equi_dir = make_tmp_equi_dir(tmp_path) + work_dir = tmp_path / "finite_t_elastic_compute" + prop = FiniteTelastic( + { + "type": "finite_t_elastic", + "cal_setting": { + "temperature": [300], + "strain": 0.001, + "strain_components": [0, 1, 2, 3, 4, 5], + "n_blocks": 2, + }, + }, + {"type": "lammps"}, + ) + task_list = prop.make_confs(str(work_dir), str(equi_dir)) + c_known_bar = np.diag([10000.0, 11000.0, 12000.0, 5000.0, 6000.0, 7000.0]) + + for task_dir in task_list: + task_path = work_dir / os.path.basename(task_dir) + metadata = loadfn(task_path / "FiniteTelastic.json") + if metadata["role"] == "equi": + continue + if metadata["role"] == "reference": + rows = pressure_rows_from_stress(np.zeros(6), include_extra=True) + else: + strain = _voigt_strain(metadata["strain_component"], metadata["strain_value"]) + stress_voigt = c_known_bar @ strain + rows = pressure_rows_from_stress(stress_voigt) + write_stress(task_path / "stress_timeseries.txt", rows) + + res_data, ptr_data = prop._compute_lower(str(tmp_path / "result.json"), task_list, {}) + + temp_data = res_data["temperatures"]["300"] + assert res_data["property"] == "finite_t_elastic" + assert temp_data["rank"] == 6 + assert temp_data["number_of_paired_responses"] == 12 + np.testing.assert_allclose(temp_data["elastic_tensor"], c_known_bar / 10000.0) + assert "dropped" in temp_data["warnings"][0] + assert "Warnings:" in ptr_data + assert (tmp_path / "result.json").is_file() + + +def test_finite_t_elastic_missing_contcar_raises(tmp_path): + prop = FiniteTelastic({"type": "finite_t_elastic"}, {"type": "lammps"}) + + with pytest.raises(RuntimeError, match="missing CONTCAR"): + prop.make_confs(str(tmp_path / "work"), str(tmp_path / "missing_relax")) + + +def test_finite_t_elastic_invalid_method_and_component_raise(tmp_path): + with pytest.raises(ValueError, match="paired_langevin"): + FiniteTelastic( + {"type": "finite_t_elastic", "cal_setting": {"method": "other"}}, + {"type": "lammps"}, + ) + + with pytest.raises(ValueError, match="unsupported strain component"): + FiniteTelastic( + { + "type": "finite_t_elastic", + "cal_setting": {"strain_components": ["bad-component"]}, + }, + {"type": "lammps"}, + ) + + with pytest.raises(TypeError, match="LAMMPS interactions"): + FiniteTelastic({"type": "finite_t_elastic"}, {"type": "abacus"}) + + with pytest.raises(NotImplementedError, match="refine requires"): + FiniteTelastic({"type": "finite_t_elastic"}, {"type": "lammps"}).make_confs( + str(tmp_path / "unused-finite-t-elastic-refine"), + str(tmp_path / "unused-equi"), + refine=True, + ) + + +def test_format_temperature_for_integer_and_fractional_values(): + assert _format_temperature(300.0) == "300" + assert _format_temperature(300.5) == "300p5" + + +class TestFiniteTelasticCoverage(unittest.TestCase): + def test_finite_t_elastic_generates_metadata_and_include_files(self): + with tempfile.TemporaryDirectory() as tmp: + test_finite_t_elastic_generates_metadata_and_include_files(Path(tmp)) + + def test_finite_t_elastic_defaults_task_type_and_scalar_temperature(self): + with tempfile.TemporaryDirectory() as tmp: + test_finite_t_elastic_defaults_task_type_and_scalar_temperature(Path(tmp)) + + def test_finite_t_elastic_deform_include_components(self): + cases = [ + (1, "change_box all y scale ${scale_y} remap units box"), + (2, "change_box all z scale ${scale_z} remap units box"), + (3, "change_box all yz delta ${d_yz} remap units box"), + (4, "change_box all xz delta ${d_xz} remap units box"), + (5, "change_box all xy delta ${d_xy} remap units box"), + ] + for component, expected in cases: + with self.subTest(component=component): + test_finite_t_elastic_deform_include_components(component, expected) + + def test_finite_t_elastic_helper_error_paths(self): + with tempfile.TemporaryDirectory() as tmp: + test_finite_t_elastic_helper_error_paths(Path(tmp)) + + def test_finite_t_elastic_compute_lower_with_synthetic_stress_data(self): + with tempfile.TemporaryDirectory() as tmp: + test_finite_t_elastic_compute_lower_with_synthetic_stress_data(Path(tmp)) + + def test_finite_t_elastic_missing_contcar_raises(self): + with tempfile.TemporaryDirectory() as tmp: + test_finite_t_elastic_missing_contcar_raises(Path(tmp)) + + def test_finite_t_elastic_invalid_method_and_component_raise(self): + with tempfile.TemporaryDirectory() as tmp: + test_finite_t_elastic_invalid_method_and_component_raise(Path(tmp)) + + def test_format_temperature_for_integer_and_fractional_values(self): + test_format_temperature_for_integer_and_fractional_values() + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_Lat_param_T.py b/tests/test_finitetlatt.py similarity index 63% rename from tests/test_Lat_param_T.py rename to tests/test_finitetlatt.py index f14e725f..2ce8ca2f 100644 --- a/tests/test_Lat_param_T.py +++ b/tests/test_finitetlatt.py @@ -3,20 +3,19 @@ import shutil import sys import unittest -import dpdata -import numpy as np + from monty.serialization import loadfn -from apex.core.property.Lat_param_T import Lat_param_T -from apex.core.calculator.Lammps import Lammps -from apex.core.calculator.lib.lammps_utils import inter_deepmd sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) __package__ = "tests" +from apex.core.property.FiniteTlatt import FiniteTlatt +from apex.core.calculator.Lammps import Lammps + -class Test_Lat_param_T(unittest.TestCase): +class TestFiniteTlatt(unittest.TestCase): def setUp(self): - _jdata = { + base = { "structures": ["confs/hcp-Ti"], "interaction": { "type": "meam_spline", @@ -25,7 +24,7 @@ def setUp(self): }, "properties": [ { - "type": "Lat_param_T", + "type": "finite_t_latt", "supercell_size": [2, 2, 2], "cal_setting":{ "temperature": [400, 600], @@ -41,17 +40,17 @@ def setUp(self): self.equi_path = "confs/hcp-Ti/relaxation/relax_task" self.source_path = "equi/lammps" - self.target_path = "confs/hcp-Ti/Lat_param_T_00" + self.target_path = "confs/hcp-Ti/FiniteTlatt_00" if not os.path.exists(self.equi_path): os.makedirs(self.equi_path) - self.confs = _jdata["structures"] - self.inter_param = _jdata["interaction"] - self.prop_param = _jdata["properties"] + self.confs = base["structures"] + self.inter_param = base["interaction"] + self.prop_param = base["properties"] - self.Lat_param_T = Lat_param_T(_jdata["properties"][0]) - self.Lammps = Lammps( + self.finite = FiniteTlatt(self.prop_param[0]) + self.lammps = Lammps( self.inter_param, os.path.join(self.source_path, "hcp-Ti-CONTCAR") ) @@ -64,15 +63,15 @@ def tearDown(self): shutil.rmtree(self.target_path) def test_task_type(self): - self.assertEqual("Lat_param_T", self.Lat_param_T.task_type()) + self.assertEqual("finite_t_latt", self.finite.task_type()) def test_task_param(self): - self.assertEqual(self.prop_param[0], self.Lat_param_T.task_param()) + self.assertEqual(self.prop_param[0], self.finite.task_param()) def test_make_potential_files(self): cwd = os.getcwd() abs_equi_path = os.path.abspath(self.equi_path) - self.Lammps.make_potential_files(abs_equi_path) + self.lammps.make_potential_files(abs_equi_path) self.assertTrue(os.path.islink(os.path.join(self.equi_path, "Ti.meam.spline"))) self.assertTrue(os.path.isfile(os.path.join(self.equi_path, "inter.json"))) ret = loadfn(os.path.join(self.equi_path, "inter.json")) @@ -82,13 +81,13 @@ def test_make_potential_files(self): def test_make_confs(self): if not os.path.exists(os.path.join(self.equi_path, "CONTCAR")): with self.assertRaises(RuntimeError): - self.Lat_param_T.make_confs(self.target_path, self.equi_path) + self.finite.make_confs(self.target_path, self.equi_path) shutil.copy( os.path.join(self.source_path, "hcp-Ti-CONTCAR"), os.path.join(self.equi_path, "CONTCAR"), ) - task_list = self.Lat_param_T.make_confs(self.target_path, self.equi_path) + task_list = self.finite.make_confs(self.target_path, self.equi_path) self.assertEqual(len(task_list), 2) dfm_dirs = glob.glob(os.path.join(self.target_path, "task.*")) num = 0 @@ -96,21 +95,31 @@ def test_make_confs(self): for ii in dfm_dirs: self.assertTrue(os.path.isfile(os.path.join(ii, "POSCAR"))) - Lat_param_T_json_file = os.path.join(ii, "Lat_param_T.json") - self.assertTrue(os.path.isfile(Lat_param_T_json_file)) - variable_Lat_param_T_file = os.path.join(ii, "variable_Lat_param_T.in") - self.assertTrue(os.path.isfile(variable_Lat_param_T_file)) - with open(variable_Lat_param_T_file, 'r') as file: + self.assertFalse(os.path.exists(os.path.join(ii, "POSCAR.tmp"))) + FiniteTlatt_json_file = os.path.join(ii, "FiniteTlatt.json") + self.assertTrue(os.path.isfile(FiniteTlatt_json_file)) + variable_FiniteTlatt_file = os.path.join(ii, "variable_FiniteTlatt.in") + self.assertTrue(os.path.isfile(variable_FiniteTlatt_file)) + with open(variable_FiniteTlatt_file, 'r') as file: lines = file.readlines() temp = lines[1].strip() self.assertEqual(temp, "variable temperature equal %.2f" % self.prop_param[0]["cal_setting"]["temperature"][num]) num += 1 def test_forward_common_files(self): - fc_files = ["in.lammps", "variable_Lat_param_T.in", "Ti.meam.spline"] - self.assertEqual(self.Lammps.forward_common_files(self.prop_param[0]["type"]), fc_files) + fc_files = ["in.lammps", "variable_FiniteTlatt.in", "Ti.meam.spline"] + self.assertEqual(self.lammps.forward_common_files(self.prop_param[0]["type"]), fc_files) def test_backward_files(self): - backward_files = ["log.lammps", "outlog", "dump.relax", "average_box.txt"] - self.assertEqual(self.Lammps.backward_files(self.prop_param[0]["type"]), backward_files) + backward_files = [ + "log.lammps", + "outlog", + "apex_task_status.json", + ".debug.log", + ".debug.stdout", + ".debug.stderr", + "dump.relax", + "average_box.txt", + ] + self.assertEqual(self.lammps.backward_files(self.prop_param[0]["type"]), backward_files) diff --git a/tests/test_flow.py b/tests/test_flow.py new file mode 100644 index 00000000..c04009de --- /dev/null +++ b/tests/test_flow.py @@ -0,0 +1,481 @@ +import os +import tempfile +import unittest +from pathlib import Path +from types import SimpleNamespace + +import pytest + +from apex import flow + + +class FakeTemplate: + def __init__(self, **kwargs): + self.kwargs = kwargs + + +class FakeIO: + def __init__(self, parameters=None, artifacts=None): + self.parameters = parameters or {} + self.artifacts = artifacts or {} + + +class FakeNode: + def __init__(self, name, template, parameters=None, artifacts=None, key=None, **kwargs): + self.name = name + self.template = template + self.key = key + self.inputs = FakeIO(parameters=parameters, artifacts=artifacts) + self.outputs = FakeIO(artifacts={"output_all": f"out-{key or name}"}) + self.kwargs = kwargs + + +class FakeWorkflow: + instances = [] + + def __init__(self, name, labels=None): + self.name = name + self.labels = labels + self.id = f"id-{name}" + self.uid = f"uid-{name}" + self.added = [] + self.submitted = False + self.terminated = False + FakeWorkflow.instances.append(self) + + def add(self, item): + self.added.append(item) + + def submit(self): + self.submitted = True + + def terminate(self): + self.terminated = True + + +class FakeStepInfo: + def __init__(self, by_id=None, by_parent=None): + self.by_id = by_id or {} + self.by_parent = by_parent or {} + + def get_step(self, id=None, parent_id=None, **kwargs): + if id is not None: + value = self.by_id.get(id, []) + elif parent_id is not None: + value = self.by_parent.get(parent_id, []) + else: + value = [] + return value if isinstance(value, list) else [value] + + +def make_generator(**kwargs): + defaults = { + "make_image": "make-img", + "run_image": "run-img", + "post_image": "post-img", + "run_command": "run-cmd", + "calculator": "lammps", + "run_op": object, + "group_size": 2, + "pool_size": 3, + "executor": "executor", + "upload_python_packages": ["pkg"], + } + defaults.update(kwargs) + return flow.FlowGenerator(**defaults) + + +def patch_dflow_builders(monkeypatch): + FakeWorkflow.instances.clear() + monkeypatch.setattr(flow, "Workflow", FakeWorkflow) + monkeypatch.setattr(flow, "Step", FakeNode) + monkeypatch.setattr(flow, "Task", FakeNode) + monkeypatch.setattr(flow, "RelaxationFlow", lambda **kwargs: FakeTemplate(**kwargs)) + monkeypatch.setattr(flow, "SimplePropertySteps", lambda **kwargs: FakeTemplate(**kwargs)) + monkeypatch.setattr(flow, "upload_artifact", lambda path: f"uploaded:{path}") + + +def make_structure_dirs(tmp_path): + conf_a = tmp_path / "conf A" + conf_b = tmp_path / "conf_B" + conf_a.mkdir() + conf_b.mkdir() + return conf_a, conf_b + + +def clean_flow_key(path): + return str(path).replace("/", "-").replace(" ", "-").replace("_", "-").lower() + + +def props_parameter(pattern, **extra): + data = { + "structures": [str(pattern)], + "interaction": {"type": "deepmd", "model": "frozen.pb"}, + "properties": [ + {"type": "eos", "suffix": "01"}, + {"type": "elastic", "skip": True}, + {"type": "vacancy", "reproduce": True}, + {"type": "surface", "req_calc": False}, + ], + } + data.update(extra) + return data + + +def test_flow_static_helpers_and_failure_formatting(): + assert flow.FlowGenerator.regulate_name(" APEX_Run.01_ ") == "apex-run-01" + assert flow.FlowGenerator._sanitize_log_name(" bad/name!* ") == "bad-name" + assert flow.FlowGenerator._sanitize_log_name("!!!") == "failed-step" + assert flow.FlowGenerator._is_missing_artifact_error( + RuntimeError("the artifact does not exist in the storage") + ) + assert flow.FlowGenerator._is_transient_download_error(RuntimeError("SSL timeout")) + assert not flow.FlowGenerator._is_transient_download_error(RuntimeError("bad input")) + assert flow.FlowGenerator._safe_get({"a": 1}, "a") == 1 + assert flow.FlowGenerator._safe_get(SimpleNamespace(a=2), "a") == 2 + + formatted = flow.FlowGenerator._format_step_failure( + { + "phase": "Failed", + "message": "child 'abc' failed", + "displayName": "PropsMake", + }, + "fallback", + main_log_path=["log-a", "log-b"], + diagnostic_artifacts=["debug-artifact"], + ) + assert "fallback" in formatted + assert "phase: Failed" in formatted + assert "main_logs: log-a, log-b" in formatted + assert "failed_artifacts: debug-artifact" in formatted + assert "raw_step:" in formatted + + assert flow.FlowGenerator._failed_child_ids_from_step( + {"message": "child 'a' failed", "outboundNodes": ["b"]} + ) == ["a", "b"] + + +def test_download_artifact_with_retry_retries_transient_and_stops_on_missing(monkeypatch): + calls = [] + + def fake_download(artifact, path): + calls.append((artifact, path)) + if len(calls) == 1: + raise RuntimeError("network timeout") + return "downloaded" + + monkeypatch.setattr(flow, "download_artifact", fake_download) + monkeypatch.setattr(flow.time, "sleep", lambda delay: None) + + assert flow.FlowGenerator._download_artifact_with_retry("a", "p", retries=2, delay=0) == "downloaded" + assert len(calls) == 2 + + monkeypatch.setattr( + flow, + "download_artifact", + lambda artifact, path: (_ for _ in ()).throw( + RuntimeError("the artifact does not exist in the storage") + ), + ) + with pytest.raises(RuntimeError, match="without retry"): + flow.FlowGenerator._download_artifact_with_retry("a", "p", retries=3, delay=0) + + +def test_step_artifact_lookup_and_main_log_download_from_child(tmp_path, monkeypatch): + generator = make_generator(debug_mode=True) + generator.download_path = str(tmp_path) + + parent = { + "id": "parent", + "displayName": "parent step", + "outputs": {"artifacts": {}}, + } + child = { + "id": "child", + "phase": "Failed", + "displayName": "PropsMake", + "outputs": {"artifacts": {"main-logs": "main-log-artifact"}}, + } + step_info = FakeStepInfo(by_parent={"parent": [child]}) + downloads = [] + + def fake_download(artifact, path, retries=3, delay=10): + downloads.append((artifact, path)) + return path + + monkeypatch.setattr(flow.FlowGenerator, "_download_artifact_with_retry", staticmethod(fake_download)) + + path, error = generator._download_step_main_logs(parent, "property/step", step_info) + + assert error is None + assert path.endswith(os.path.join("main-logs", "property", "step", "PropsMake")) + assert downloads[0][0] == "main-log-artifact" + + no_path, no_error = generator._download_step_main_logs({"outputs": {"artifacts": {}}}, "missing") + assert no_path is None + assert "main-logs artifact not found" in no_error + + +def test_diagnostic_artifact_downloads_only_allowed_debug_artifacts(tmp_path, monkeypatch): + generator = make_generator(debug_mode=True) + generator.download_path = str(tmp_path) + step = { + "id": "step", + "displayName": "PropsPost", + "outputs": { + "artifacts": { + "retrieve_path": "retrieve-art", + "main-logs": "main-log", + "dflow_internal": "skip", + "unrelated": "skip", + } + }, + } + downloads = [] + + def fake_download(artifact, path, retries=3, delay=10): + downloads.append((artifact, path)) + return path + + monkeypatch.setattr(flow.FlowGenerator, "_download_artifact_with_retry", staticmethod(fake_download)) + + paths = generator._download_step_diagnostic_artifacts(step, "prop-key") + + assert len(paths) == 1 + assert downloads[0][0] == "retrieve-art" + assert paths[0].endswith(os.path.join("failed-artifacts", "prop-key", "PropsPost", "retrieve_path")) + + +def test_set_relax_flows_and_tasks_expand_globs_and_skip_finished(tmp_path, monkeypatch): + patch_dflow_builders(monkeypatch) + conf_a, conf_b = make_structure_dirs(tmp_path) + generator = make_generator() + relax_param = { + "structures": [str(tmp_path / "conf*")], + "relaxation": {"cal_type": "relaxation"}, + "skip_finished_structures": [str(conf_b)], + } + + flows, flow_keys = generator._set_relax_flows("artifact", relax_param) + tasks, task_keys = generator._set_relax_tasks("artifact", relax_param) + + assert flow_keys == [ + f"relaxcal-{clean_flow_key(conf_a)}", + f"relaxcal-{clean_flow_key(conf_b)}", + ] + assert len(flows) == 2 + assert flows[0].inputs.parameters["parameter"]["structures"] == [str(conf_a)] + assert flows[0].template.kwargs["make_image"] == "make-img" + + assert task_keys == [flow_keys[0]] + assert len(tasks) == 1 + assert tasks[0].inputs.parameters["flow_id"] == str(conf_a) + + skipped, skipped_keys = generator._set_relax_tasks( + "artifact", + {"structures": [str(tmp_path / "conf*")], "relaxation": {"req_calc": False}}, + ) + assert skipped == [] + assert skipped_keys == [] + + +def test_set_props_flow_expands_properties_skips_and_removes_existing_dir(tmp_path, monkeypatch): + patch_dflow_builders(monkeypatch) + conf_a, conf_b = make_structure_dirs(tmp_path) + existing = conf_a / "eos_01" + existing.mkdir() + (existing / "old.txt").write_text("old") + parameter = props_parameter( + tmp_path / "conf*", + skip_finished_properties=[(str(conf_b), "eos_01")], + ) + generator = make_generator() + + steps, keys = generator._set_props_flow("artifact", parameter) + + assert len(steps) == 3 + assert len(keys) == 3 + assert not existing.exists() + assert steps[0].inputs.parameters["path_to_prop"].endswith("eos_01") + assert steps[0].inputs.parameters["prop_param"]["type"] == "eos" + assert steps[0].inputs.parameters["inter_param"] == parameter["interaction"] + assert steps[0].inputs.parameters["do_refine"] is False + assert steps[1].inputs.parameters["path_to_prop"].endswith("vacancy_reprod") + assert all("elastic" not in key and "surface" not in key for key in keys) + + +def test_set_props_tasks_uses_relax_output_or_pre_relaxed_base_and_errors(tmp_path, monkeypatch): + patch_dflow_builders(monkeypatch) + conf_a, conf_b = make_structure_dirs(tmp_path) + generator = make_generator() + relax_task = FakeNode( + name="relax-a", + template=FakeTemplate(), + parameters={"flow_id": str(conf_a)}, + key="relax-a", + ) + relax_task.outputs.artifacts["output_all"] = "relaxed-artifact-a" + parameter = props_parameter( + tmp_path / "conf*", + properties=[{"type": "eos", "suffix": "01"}], + skip_finished_properties=[(str(conf_b), "eos_01")], + ) + + tasks, keys = generator._set_props_tasks( + [relax_task], + parameter, + base_work_artifact="base-artifact", + pre_relaxed=[str(conf_b)], + ) + + assert len(tasks) == 1 + assert keys == [f"propertycal-{clean_flow_key(conf_a)}-eos-01"] + assert tasks[0].inputs.artifacts["input_work_path"] == "relaxed-artifact-a" + + with pytest.raises(RuntimeError, match="No relaxation task or pre-relaxed result"): + generator._set_props_tasks([], parameter, base_work_artifact="base", pre_relaxed=[]) + + +def test_submit_relax_props_and_joint_submit_only_paths(tmp_path, monkeypatch): + patch_dflow_builders(monkeypatch) + conf_a, _ = make_structure_dirs(tmp_path) + generator = make_generator() + relax_param = {"structures": [str(tmp_path / "conf*")], "relaxation": {"cal_type": "relaxation"}} + props_param = props_parameter(tmp_path / "conf*", properties=[{"type": "eos", "suffix": "01"}]) + (tmp_path / "download relax").mkdir() + (tmp_path / "download-props").mkdir() + (tmp_path / "download-joint").mkdir() + (tmp_path / "download-empty").mkdir() + + relax_id = generator.submit_relax( + str(tmp_path), + str(tmp_path / "download relax"), + relax_param, + submit_only=True, + name="My Flow", + labels={"kind": "relax"}, + ) + assert relax_id == "id-My Flow-relax" + assert FakeWorkflow.instances[-1].submitted is True + assert FakeWorkflow.instances[-1].labels == {"kind": "relax"} + assert (tmp_path / "download relax" / ".workflow.log").read_text().split("\t")[0] == relax_id + + props_id = generator.submit_props( + str(tmp_path), + str(tmp_path / "download-props"), + props_param, + submit_only=True, + ) + assert props_id.endswith("-props") + assert FakeWorkflow.instances[-1].added + + joint_id = generator.submit_joint( + str(tmp_path), + str(tmp_path / "download-joint"), + relax_param, + props_param, + submit_only=True, + ) + assert joint_id.endswith("-joint") + assert len(FakeWorkflow.instances[-1].added) == 2 + + empty_relax = { + "structures": [str(conf_a)], + "relaxation": {"req_calc": False}, + } + empty_props = props_parameter( + conf_a, + properties=[{"type": "eos", "suffix": "01"}], + skip_finished_properties=[(str(conf_a), "eos_01")], + pre_relaxed_structures=[str(conf_a)], + ) + with pytest.raises(RuntimeError, match="No joint workflow tasks to submit"): + generator.submit_joint( + str(tmp_path), + str(tmp_path / "download-empty"), + empty_relax, + empty_props, + submit_only=True, + ) + + +def test_terminate_workflow_and_raise_if_failed(): + generator = make_generator() + generator.workflow = FakeWorkflow("wf") + assert "workflow terminated" in generator._terminate_workflow_after_relax_failure() + assert generator.workflow.terminated is True + + class CompletedWorkflow: + def terminate(self): + raise RuntimeError("cannot shutdown a completed workflow") + + generator.workflow = CompletedWorkflow() + assert "workflow already completed" in generator._terminate_workflow_after_relax_failure() + + class BrokenWorkflow: + def terminate(self): + raise RuntimeError("permission denied") + + generator.workflow = BrokenWorkflow() + assert "failed to terminate" in generator._terminate_workflow_after_relax_failure() + + with pytest.raises(RuntimeError, match="Property workflow failed with 1 failed step"): + generator._raise_if_failed(["detail"], "Property workflow") + + +class TestFlowCoverage(unittest.TestCase): + def run_with_tmp_and_monkeypatch(self, func): + monkeypatch = pytest.MonkeyPatch() + try: + with tempfile.TemporaryDirectory() as tmp: + return func(Path(tmp), monkeypatch) + finally: + monkeypatch.undo() + + def run_with_monkeypatch(self, func): + monkeypatch = pytest.MonkeyPatch() + try: + return func(monkeypatch) + finally: + monkeypatch.undo() + + def test_flow_static_helpers_and_failure_formatting(self): + test_flow_static_helpers_and_failure_formatting() + + def test_download_artifact_with_retry_retries_transient_and_stops_on_missing(self): + self.run_with_monkeypatch( + test_download_artifact_with_retry_retries_transient_and_stops_on_missing + ) + + def test_step_artifact_lookup_and_main_log_download_from_child(self): + self.run_with_tmp_and_monkeypatch( + test_step_artifact_lookup_and_main_log_download_from_child + ) + + def test_diagnostic_artifact_downloads_only_allowed_debug_artifacts(self): + self.run_with_tmp_and_monkeypatch( + test_diagnostic_artifact_downloads_only_allowed_debug_artifacts + ) + + def test_set_relax_flows_and_tasks_expand_globs_and_skip_finished(self): + self.run_with_tmp_and_monkeypatch( + test_set_relax_flows_and_tasks_expand_globs_and_skip_finished + ) + + def test_set_props_flow_expands_properties_skips_and_removes_existing_dir(self): + self.run_with_tmp_and_monkeypatch( + test_set_props_flow_expands_properties_skips_and_removes_existing_dir + ) + + def test_set_props_tasks_uses_relax_output_or_pre_relaxed_base_and_errors(self): + self.run_with_tmp_and_monkeypatch( + test_set_props_tasks_uses_relax_output_or_pre_relaxed_base_and_errors + ) + + def test_submit_relax_props_and_joint_submit_only_paths(self): + self.run_with_tmp_and_monkeypatch( + test_submit_relax_props_and_joint_submit_only_paths + ) + + def test_terminate_workflow_and_raise_if_failed(self): + test_terminate_workflow_and_raise_if_failed() diff --git a/tests/test_gamma_surface.py b/tests/test_gamma_surface.py new file mode 100644 index 00000000..4e302c58 --- /dev/null +++ b/tests/test_gamma_surface.py @@ -0,0 +1,351 @@ +import glob +import os +import shutil +import sys +import tempfile +import unittest +from pathlib import Path + +import numpy as np +import pytest +from monty.serialization import dumpfn, loadfn + +from apex.core.calculator.Lammps import Lammps +from apex.core.property.GammaSurface import GammaSurface + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +__package__ = "tests" + + +class TestGammaSurface(unittest.TestCase): + def setUp(self): + self._cwd = os.getcwd() + os.chdir(os.path.abspath(os.path.dirname(__file__))) + + self.equi_path = "confs/hp-Mo/relaxation/relax_task" + self.source_path = "equi/vasp" + self.target_path = "confs/hp-Mo/gamma_surface_00" + + if not os.path.exists(self.equi_path): + os.makedirs(self.equi_path) + if not os.path.exists(self.target_path): + os.makedirs(self.target_path) + + self.prop_param = { + "type": "gamma_surface", + "plane_miller": [0, 0, 1], + "slip_direction": [1, 0, 0], + "supercell_size": [1, 1, 8], + "vacuum_size": 10, + "add_fix": ["true", "true", "false"], + "n_steps_x": 2, + "n_steps_y": 1, + } + self.gamma_surface = GammaSurface(self.prop_param) + + def tearDown(self): + if os.path.exists(self.equi_path): + shutil.rmtree(self.equi_path) + if os.path.exists(self.target_path): + shutil.rmtree(self.target_path) + os.chdir(self._cwd) + + def test_task_type(self): + self.assertEqual("gamma_surface", self.gamma_surface.task_type()) + + def test_task_param(self): + self.assertEqual(self.prop_param, self.gamma_surface.task_param()) + + def test_make_confs_bcc(self): + if not os.path.exists(os.path.join(self.equi_path, "CONTCAR")): + with self.assertRaises(RuntimeError): + self.gamma_surface.make_confs(self.target_path, self.equi_path) + + shutil.copy( + os.path.join(self.source_path, "CONTCAR_Mo_bcc"), + os.path.join(self.equi_path, "CONTCAR"), + ) + task_list = self.gamma_surface.make_confs(self.target_path, self.equi_path) + dfm_dirs = glob.glob(os.path.join(self.target_path, "task.*")) + self.assertEqual(len(dfm_dirs), (self.gamma_surface.n_steps_x + 1) * (self.gamma_surface.n_steps_y + 1)) + self.assertEqual(len(task_list), len(dfm_dirs)) + + pairs = set() + for ii in sorted(dfm_dirs): + self.assertTrue(os.path.isfile(os.path.join(ii, "POSCAR"))) + self.assertTrue(os.path.isfile(os.path.join(ii, "miller.json"))) + self.assertTrue(os.path.isfile(os.path.join(ii, "displacement.json"))) + disp = loadfn(os.path.join(ii, "displacement.json")) + pairs.add((disp["frac_x"], disp["frac_y"])) + + self.assertIn((0.0, 0.0), pairs) + self.assertIn((1.0, 1.0), pairs) + + def test_legacy_n_steps_aliases_to_n_steps_x(self): + prop = GammaSurface( + { + "type": "gamma_surface", + "plane_miller": [0, 0, 1], + "slip_direction": [1, 0, 0], + "n_steps": 3, + } + ) + + self.assertEqual(prop.n_steps_x, 3) + self.assertEqual(prop.n_steps, 3) + self.assertEqual(prop.task_param()["n_steps_x"], 3) + + +class TestGammaSurfaceLammps(unittest.TestCase): + def setUp(self): + root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) + self.source_poscar = os.path.join(root, "tests/equi/lammps/Al-fcc.vasp") + self.model = os.path.join(root, "tests/lammps_input/frozen_model.pb") + self.tempdir = tempfile.TemporaryDirectory(prefix="gamma_surface_lammps_", dir="/tmp") + self.task_dir = os.path.join(self.tempdir.name, "gamma_surface_00", "task.000000") + os.makedirs(self.task_dir, exist_ok=True) + shutil.copy(self.source_poscar, os.path.join(self.task_dir, "POSCAR")) + + self.inter_param = { + "type": "deepmd", + "model": self.model, + "type_map": {"Al": 0}, + } + self.calc = Lammps(self.inter_param, self.source_poscar) + + def tearDown(self): + self.tempdir.cleanup() + + def test_make_input_file(self): + prop = GammaSurface( + { + "type": "gamma_surface", + "plane_miller": [0, 0, 1], + "slip_direction": [1, 0, 0], + "supercell_size": [1, 1, 5], + "vacuum_size": 10, + "add_fix": ["true", "true", "false"], + "n_steps_x": 2, + "n_steps_y": 2, + }, + self.inter_param, + ) + + self.calc.make_potential_files(self.task_dir) + cwd = os.getcwd() + os.chdir(self.task_dir) + try: + self.calc.make_input_file( + self.task_dir, prop.task_type(), prop.task_param() + ) + finally: + os.chdir(cwd) + + common_input = os.path.join(self.tempdir.name, "gamma_surface_00", "in.lammps") + task_input = os.path.join(self.task_dir, "in.lammps") + + self.assertTrue(os.path.isfile(common_input)) + self.assertTrue(os.path.islink(task_input)) + with open(common_input, "r") as fp: + contents = fp.read() + + self.assertIn("read_data conf.lmp", contents) + self.assertIn("pair_style deepmd", contents) + self.assertIn("pair_coeff * * Al", contents) + self.assertIn("fix 1 all setforce 0 0 NULL", contents) + self.assertLess( + contents.index("min_style cg"), + contents.index("fix 1 all setforce 0 0 NULL"), + ) + self.assertLess( + contents.index("fix 1 all setforce 0 0 NULL"), + contents.index("minimize"), + ) + + def test_missing_add_fix_falls_back_to_generic_relaxation(self): + prop = GammaSurface( + { + "type": "gamma_surface", + "init_from_suffix": "00", + "output_suffix": "01", + }, + self.inter_param, + ) + + self.calc.make_potential_files(self.task_dir) + cwd = os.getcwd() + os.chdir(self.task_dir) + try: + self.calc.make_input_file(self.task_dir, prop.task_type(), prop.task_param()) + finally: + os.chdir(cwd) + + common_input = os.path.join(self.tempdir.name, "gamma_surface_00", "in.lammps") + with open(common_input, "r") as fp: + contents = fp.read() + + self.assertIn("min_style cg", contents) + self.assertIn("minimize", contents) + self.assertNotIn("fix 1 all setforce", contents) + + +def test_gamma_surface_reproduce_defaults_to_static_calculation(): + prop = GammaSurface({"type": "gamma_surface", "reproduce": True}) + + assert prop.reprod is True + assert prop.cal_type == "static" + assert prop.init_from_suffix == "00" + assert prop.cal_setting == { + "relax_pos": False, + "relax_shape": False, + "relax_vol": False, + } + + +def test_gamma_surface_default_cal_setting_fills_missing_values(): + prop = GammaSurface( + { + "type": "gamma_surface", + "plane_miller": [0, 0, 1], + "slip_direction": [1, 0, 0], + "cal_setting": {"relax_pos": False}, + }, + {"type": "lammps"}, + ) + + assert prop.cal_type == "relaxation" + assert prop.cal_setting == { + "relax_pos": False, + "relax_shape": False, + "relax_vol": False, + } + assert prop.supercell_size == (1, 1, 5) + assert prop.vacuum_size == 0 + assert prop.add_fix == ["true", "true", "false"] + + +def test_gamma_surface_resolve_equilibrium_structure_for_vasp_and_abacus(monkeypatch): + vasp_prop = GammaSurface({"type": "gamma_surface"}, {"type": "vasp"}) + assert vasp_prop._resolve_equilibrium_structure("/work/relax") == ( + "/work/relax/CONTCAR", + "POSCAR", + ) + + monkeypatch.setattr( + "apex.core.property.GammaSurface.abacus_utils.final_stru", + lambda path: "STRU_ION_D", + ) + abacus_prop = GammaSurface({"type": "gamma_surface"}, {"type": "abacus"}) + assert abacus_prop._resolve_equilibrium_structure("/work/relax") == ( + "/work/relax/STRU_ION_D", + "STRU", + ) + + +def test_gamma_surface_resolve_slip_length_numeric_vector_and_invalid(): + prop = GammaSurface({"type": "gamma_surface"}) + resolve = prop._GammaSurface__resolve_slip_length + + assert resolve(2, 3.0, 4.0, 5.0) == 6.0 + assert resolve([1, 1, 0], 3.0, 4.0, 5.0) == pytest.approx(5.0) + with pytest.raises(RuntimeError, match="Only int"): + resolve("bad", 3.0, 4.0, 5.0) + + +def test_gamma_surface_post_process_injects_lammps_setforce(tmp_path): + task = tmp_path / "task.000000" + task.mkdir() + in_lammps = task / "in.lammps" + in_lammps.write_text( + "clear\n" + "min_style cg\n" + "delete this line\n" + "variable N equal count(all)\n" + ) + prop = GammaSurface( + { + "type": "gamma_surface", + "plane_miller": [0, 0, 1], + "slip_direction": [1, 0, 0], + "add_fix": ["true", "false", "true"], + }, + {"type": "lammps"}, + ) + + prop.post_process([str(task)]) + + text = in_lammps.read_text() + assert "fix 1 all setforce 0 NULL 0" in text + + +def test_gamma_surface_compute_lower_with_synthetic_results(tmp_path): + prop_dir = tmp_path / "conf" / "gamma_surface_00" + task0 = prop_dir / "task.000000" + task1 = prop_dir / "task.000001" + equi_dir = tmp_path / "conf" / "relaxation" / "relax_task" + task0.mkdir(parents=True) + task1.mkdir(parents=True) + equi_dir.mkdir(parents=True) + + cell = np.eye(3).tolist() + dumpfn({"energies": [-2.0], "atom_numbs": [2]}, equi_dir / "result.json") + for task, energy, frac_x, frac_y in [ + (task0, -2.0, 0.0, 0.0), + (task1, -1.5, 0.5, 1.0), + ]: + dumpfn({"energies": [energy], "atom_numbs": [2], "cells": [cell]}, task / "result_task.json") + dumpfn([0, 0, 1], task / "miller.json") + dumpfn({"frac_x": frac_x, "frac_y": frac_y}, task / "displacement.json") + dumpfn(2.0, task0 / "slip_length_x.json") + dumpfn(3.0, task0 / "slip_length_y.json") + + prop = GammaSurface( + { + "type": "gamma_surface", + "plane_miller": [0, 0, 1], + "slip_direction": [1, 0, 0], + } + ) + res_data, ptr_data = prop._compute_lower( + str(prop_dir / "result.json"), + [str(task1), str(task0)], + {}, + ) + + assert "Stacking_Fault_E" in ptr_data + assert res_data["0.000000,0.000000"] == [0.0, 0.0, 0.0, -1.0, -1.0] + assert res_data["0.500000,1.000000"][0:2] == [1.0, 3.0] + assert res_data["0.500000,1.000000"][2] == pytest.approx(8.01088285) + assert (prop_dir / "result.json").is_file() + + +class TestGammaSurfaceCoverage(unittest.TestCase): + def test_gamma_surface_reproduce_defaults_to_static_calculation(self): + test_gamma_surface_reproduce_defaults_to_static_calculation() + + def test_gamma_surface_default_cal_setting_fills_missing_values(self): + test_gamma_surface_default_cal_setting_fills_missing_values() + + def test_gamma_surface_resolve_equilibrium_structure_for_vasp_and_abacus(self): + monkeypatch = pytest.MonkeyPatch() + try: + test_gamma_surface_resolve_equilibrium_structure_for_vasp_and_abacus( + monkeypatch + ) + finally: + monkeypatch.undo() + + def test_gamma_surface_resolve_slip_length_numeric_vector_and_invalid(self): + test_gamma_surface_resolve_slip_length_numeric_vector_and_invalid() + + def test_gamma_surface_post_process_injects_lammps_setforce(self): + with tempfile.TemporaryDirectory() as tmp: + test_gamma_surface_post_process_injects_lammps_setforce(Path(tmp)) + + def test_gamma_surface_compute_lower_with_synthetic_results(self): + with tempfile.TemporaryDirectory() as tmp: + test_gamma_surface_compute_lower_with_synthetic_results(Path(tmp)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_gruneisen.py b/tests/test_gruneisen.py new file mode 100644 index 00000000..cf92165f --- /dev/null +++ b/tests/test_gruneisen.py @@ -0,0 +1,872 @@ +import glob +import os +import shutil +import subprocess +import tempfile +import unittest +from pathlib import Path +import json +from unittest.mock import patch + +import dpdata +import pytest +import yaml + +from monty.serialization import dumpfn, loadfn + +from apex.core.calculator.Lammps import Lammps +from apex.core.lib.mfp_eosfit import fit_birch_murnaghan +from apex.core.property.Gruneisen import Gruneisen +from apex.core.property.Phonon import Phonon + + +def valid_gruneisen_params(**overrides): + params = { + "type": "gruneisen", + "volume_strains": [-0.02, 0.0, 0.02], + "temperatures": [10, 50, 100], + } + params.update(overrides) + return params + + +@pytest.mark.parametrize( + ("overrides", "message"), + [ + ({"temperatures": []}, "temperatures must contain"), + ({"alpha_mode": "bad"}, "alpha_mode"), + ({"bulk_modulus_source": "input"}, "bulk_modulus_source"), + ({"eos_model": "murnaghan"}, "eos_model"), + ({"approach": "bad"}, "approach"), + ({"cal_setting": {"relax_pos": False}}, "relax_pos"), + ({"cal_setting": {"relax_shape": True}}, "relax_shape"), + ({"cal_setting": {"relax_vol": True}}, "relax_vol"), + ({"volume_strains": [0.0, -0.02, 0.02]}, "strictly increasing"), + ({"volume_strains": [-0.02, 0.0, 0.0, 0.02]}, "duplicates"), + ({"temperatures": [50, 10]}, "temperatures must be strictly increasing"), + ({"volume_strains": [-0.02, 0.0, 0.03]}, "symmetric"), + ], +) +def test_gruneisen_validation_rejects_low_cost_invalid_options(overrides, message): + with pytest.raises(ValueError, match=message): + Gruneisen(valid_gruneisen_params(**overrides)) + + +class TestGruneisenValidationCoverage(unittest.TestCase): + def test_gruneisen_validation_rejects_low_cost_invalid_options(self): + cases = [ + ({"temperatures": []}, "temperatures must contain"), + ({"alpha_mode": "bad"}, "alpha_mode"), + ({"bulk_modulus_source": "input"}, "bulk_modulus_source"), + ({"eos_model": "murnaghan"}, "eos_model"), + ({"approach": "bad"}, "approach"), + ({"cal_setting": {"relax_pos": False}}, "relax_pos"), + ({"cal_setting": {"relax_shape": True}}, "relax_shape"), + ({"cal_setting": {"relax_vol": True}}, "relax_vol"), + ({"volume_strains": [0.0, -0.02, 0.02]}, "strictly increasing"), + ({"volume_strains": [-0.02, 0.0, 0.0, 0.02]}, "duplicates"), + ({"temperatures": [50, 10]}, "temperatures must be strictly increasing"), + ({"volume_strains": [-0.02, 0.0, 0.03]}, "symmetric"), + ] + for overrides, message in cases: + with self.subTest(overrides=overrides): + test_gruneisen_validation_rejects_low_cost_invalid_options( + overrides, message + ) + + +class TestGruneisen(unittest.TestCase): + def setUp(self): + tests_dir = Path(__file__).resolve().parent + self.source_path = tests_dir / "equi" / "vasp" / "CONTCAR" + self.abacus_source_path = tests_dir / "equi" / "abacus" + self.tmpdir = tempfile.TemporaryDirectory(prefix="apex-gruneisen-test-") + self.work_root = Path(self.tmpdir.name) + self.equi_path = self.work_root / "relaxation" / "relax_task" + self.abacus_equi_path = self.work_root / "relaxation_abacus" / "relax_task" + self.target_path = self.work_root / "gruneisen_00" + self.equi_path.mkdir(parents=True, exist_ok=True) + self.abacus_equi_path.mkdir(parents=True, exist_ok=True) + + self.prop_param = { + "type": "gruneisen", + "volume_strains": [-0.02, 0.0, 0.02], + "temperatures": [10, 50, 100], + } + self.gruneisen = Gruneisen(dict(self.prop_param)) + + def tearDown(self): + self.tmpdir.cleanup() + + def test_task_type(self): + self.assertEqual("gruneisen", self.gruneisen.task_type()) + + def test_task_param_defaults(self): + task_param = self.gruneisen.task_param() + self.assertEqual(task_param["alpha_mode"], "sign_only") + self.assertEqual(task_param["bulk_modulus_source"], "eos_fit") + self.assertEqual(task_param["eos_model"], "birch_murnaghan") + self.assertEqual(task_param["BAND_POINTS"], 51) + self.assertEqual(task_param["supercell_size"], [2, 2, 2]) + self.assertEqual(task_param["approach"], "linear") + self.assertEqual(task_param["PRIMITIVE_AXES"], "P") + + def test_validation_rejects_invalid_schema(self): + with self.assertRaises(ValueError): + Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.02, 0.02], + "temperatures": [10, 50], + } + ) + with self.assertRaises(ValueError): + Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.02, 0.01, 0.02], + "temperatures": [10, 50], + } + ) + with self.assertRaises(ValueError): + Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.02, 0.0, 0.02], + "temperatures": [0, 50], + } + ) + + def test_make_confs_generates_volume_tasks(self): + with self.assertRaises(RuntimeError): + self.gruneisen.make_confs(str(self.target_path), str(self.equi_path)) + + shutil.copy(self.source_path, self.equi_path / "CONTCAR") + def fake_check_call(command, shell): + self.assertTrue(shell) + self.assertTrue(command.startswith(Phonon.phonopy_setup_command("-d"))) + Path("SPOSCAR").write_text(Path("POSCAR").read_text()) + Path("phonopy_disp.yaml").write_text("displacements: []\n") + + with patch("apex.core.property.Gruneisen.subprocess.check_call", side_effect=fake_check_call): + task_list = self.gruneisen.make_confs(str(self.target_path), str(self.equi_path)) + task_dirs = glob.glob(str(self.target_path / "task.*")) + self.assertEqual(len(task_dirs), 3) + self.assertEqual(len(task_list), 3) + self.assertTrue((self.target_path / "volume_points.json").is_file()) + + for task_dir, strain in zip(sorted(task_dirs), self.prop_param["volume_strains"]): + self.assertTrue((Path(task_dir) / "POSCAR").is_file()) + self.assertTrue((Path(task_dir) / "POSCAR.orig").exists()) + self.assertTrue((Path(task_dir) / "POSCAR-unitcell").is_file()) + self.assertTrue((Path(task_dir) / "SPOSCAR").is_file()) + self.assertTrue((Path(task_dir) / "volume.json").is_file()) + volume_data = loadfn(Path(task_dir) / "volume.json") + self.assertAlmostEqual(volume_data["strain"], strain) + self.assertGreater(volume_data["volume"], 0.0) + self.assertGreater(volume_data["volume_per_atom"], 0.0) + self.assertTrue((Path(task_dir) / "band.conf").is_file()) + + self.assertTrue((self.target_path / "band_path.json").is_file()) + + def test_make_confs_generates_vasp_displacement_volume_manifest_and_tasks(self): + gruneisen = Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.01, 0.0, 0.01], + "temperatures": [300], + "approach": "displacement", + "supercell_size": [2, 2, 2], + }, + inter_param={"type": "vasp"}, + ) + shutil.copy(self.source_path, self.equi_path / "CONTCAR") + + def fake_check_call(command, shell): + self.assertTrue(shell) + self.assertTrue(command.startswith(Phonon.phonopy_setup_command("-d"))) + Path("phonopy_disp.yaml").write_text("displacements: []\n") + Path("POSCAR-001").write_text(Path("POSCAR").read_text()) + Path("POSCAR-002").write_text(Path("POSCAR").read_text()) + + with patch("apex.core.property.Gruneisen.subprocess.check_call", side_effect=fake_check_call): + task_list = gruneisen.make_confs(str(self.target_path), str(self.equi_path)) + + task_dirs = sorted(self.target_path.glob("task.*")) + self.assertEqual(len(task_list), 9) + self.assertEqual(len(task_dirs), 9) + manifest = loadfn(self.target_path / "vasp_gruneisen_tasks.json") + self.assertEqual(len(manifest["volume_points"]), 3) + self.assertEqual(manifest["volume_points"][0]["reference_task"], "task.000000") + self.assertEqual(manifest["volume_points"][0]["displacement_tasks"], ["task.000001", "task.000002"]) + + helper_dir = self.target_path / "volume.000000" + self.assertTrue((helper_dir / "POSCAR").is_file()) + self.assertTrue((helper_dir / "POSCAR-unitcell").is_file()) + self.assertTrue((helper_dir / "phonopy_disp.yaml").is_file()) + self.assertTrue((helper_dir / "band.conf").is_file()) + + reference_task = self.target_path / "task.000000" + displacement_task = self.target_path / "task.000001" + self.assertTrue((reference_task / "POSCAR").exists()) + self.assertTrue((reference_task / "POSCAR-unitcell").exists()) + self.assertEqual(loadfn(reference_task / "gruneisen_task.json")["role"], "reference") + self.assertEqual(loadfn(displacement_task / "gruneisen_task.json")["role"], "displacement") + + def test_vasp_ensure_mesh_yaml_builds_force_constants_from_vasprun(self): + gruneisen = Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.01, 0.0, 0.01], + "temperatures": [300], + "supercell_size": [1, 1, 1], + }, + inter_param={"type": "vasp"}, + ) + task_dir = self.work_root / "vasp_mesh" / "task.000000" + task_dir.mkdir(parents=True) + (task_dir / "vasprun.xml").write_text("\n") + (task_dir / "band.conf").write_text("MESH = 1 1 1\n") + (task_dir / "POSCAR-unitcell").write_text(self.source_path.read_text()) + calls = [] + + def fake_check_call(command, shell): + self.assertTrue(shell) + calls.append(command) + if command == Phonon.phonopy_setup_command("--fc vasprun.xml"): + (task_dir / "FORCE_CONSTANTS").write_text("fake force constants\n") + elif "POSCAR-unitcell" in command: + (task_dir / "mesh.yaml").write_text( + yaml.safe_dump( + { + "phonon": [ + { + "q-position": [0.0, 0.0, 0.0], + "weight": 1, + "band": [{"frequency": 1.0}], + } + ] + }, + sort_keys=False, + ) + ) + else: + raise AssertionError(f"unexpected command: {command}") + + cwd = os.getcwd() + try: + with patch("apex.core.property.Gruneisen.subprocess.check_call", side_effect=fake_check_call): + gruneisen._ensure_mesh_yaml(str(task_dir)) + finally: + os.chdir(cwd) + + self.assertTrue((task_dir / "FORCE_CONSTANTS").is_file()) + self.assertTrue((task_dir / "mesh.yaml").is_file()) + self.assertEqual(calls[0], Phonon.phonopy_setup_command("--fc vasprun.xml")) + self.assertIn("-c POSCAR-unitcell", calls[1]) + self.assertIn("--nomeshsym", calls[1]) + + def test_sign_only_compute_lower_from_vasp_displacement_manifest(self): + gruneisen = Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.01, 0.0, 0.01], + "temperatures": [100, 300], + "alpha_mode": "sign_only", + "approach": "displacement", + }, + inter_param={"type": "vasp"}, + ) + work_dir = self.work_root / "gruneisen_vasp_displacement_compute" + task_dirs = self._write_synthetic_vasp_displacement_gruneisen_layout(work_dir) + calls = [] + + def fake_check_call(command, shell): + self.assertTrue(shell) + calls.append((Path.cwd().name, command)) + if command.startswith(Phonon.phonopy_setup_command("-f")): + Path("FORCE_SETS").write_text("fake force sets\n") + elif command.startswith(Phonon.phonopy_setup_command("--dim=")) and "--writefc" in command: + Path("FORCE_CONSTANTS").write_text("fake force constants\n") + elif command.startswith("phonopy --dim="): + strain = loadfn("volume.json")["strain"] + if strain < 0: + frequencies = [4.2, 8.4] + elif strain > 0: + frequencies = [4.0, 8.0] + else: + frequencies = [4.1, 8.2] + Path("band.yaml").write_text("phonon: []\n") + Path("mesh.yaml").write_text( + yaml.safe_dump( + { + "phonon": [ + { + "q-position": [0.0, 0.0, 0.0], + "weight": 1, + "band": [{"frequency": freq} for freq in frequencies], + } + ] + }, + sort_keys=False, + ) + ) + else: + raise AssertionError(f"unexpected command: {command}") + + def fake_run(command, stdout, stderr, text): + self.assertEqual(command, ["phonopy-bandplot", "--gnuplot", "band.yaml"]) + stdout.write("0 0\n") + return subprocess.CompletedProcess(command, 1, stderr="bandplot warning") + + with patch("apex.core.property.Gruneisen.subprocess.check_call", side_effect=fake_check_call), \ + patch("apex.core.property.Gruneisen.subprocess.run", side_effect=fake_run): + result, ptr = gruneisen._compute_lower(str(work_dir / "result.json"), task_dirs, []) + + self.assertEqual(result["thermal_expansion"]["sign"], ["positive", "positive"]) + self.assertEqual(result["gruneisen"]["qpoint_count"], 1) + self.assertEqual( + len([cmd for _, cmd in calls if cmd.startswith(Phonon.phonopy_setup_command("-f"))]), + 3, + ) + self.assertTrue((work_dir / "volume.000000" / "mesh.yaml").is_file()) + self.assertTrue((work_dir / "volume.000001" / "band.dat").is_file()) + self.assertIn("Temperature(K) SumGammaCv Sign", ptr) + + def test_make_confs_generates_abacus_volume_manifest_and_tasks(self): + gruneisen = Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.01, 0.0, 0.01], + "temperatures": [300], + "supercell_size": [2, 2, 2], + }, + inter_param={ + "type": "abacus", + "incar": "abacus_input/INPUT", + "potcar_prefix": "abacus_input", + "potcars": {"Al": "Al_ONCV_PBE-1.0.upf"}, + "orb_files": {"Al": "Al_gga_9au_100Ry_4s4p1d.orb"}, + }, + ) + self._prepare_abacus_relax_fixture() + + def fake_check_call(command, shell): + self.assertTrue(shell) + self.assertEqual(command, Phonon.phonopy_setup_command("setting.conf --abacus -d")) + source = Path("STRU").read_text() + Path("phonopy_disp.yaml").write_text("displacements: []\n") + Path("STRU-001").write_text(source) + Path("STRU-002").write_text(source) + + with patch("apex.core.property.Gruneisen.subprocess.check_call", side_effect=fake_check_call): + task_list = gruneisen.make_confs(str(self.target_path), str(self.abacus_equi_path)) + + task_dirs = sorted(self.target_path.glob("task.*")) + self.assertEqual(len(task_list), 9) + self.assertEqual(len(task_dirs), 9) + manifest = loadfn(self.target_path / "abacus_gruneisen_tasks.json") + self.assertEqual(len(manifest["volume_points"]), 3) + self.assertEqual(manifest["volume_points"][0]["reference_task"], "task.000000") + self.assertEqual(manifest["volume_points"][0]["displacement_tasks"], ["task.000001", "task.000002"]) + self.assertEqual(manifest["volume_points"][1]["reference_task"], "task.000003") + self.assertTrue((self.target_path / "band_path.json").is_file()) + + helper_dir = self.target_path / "volume.000000" + self.assertTrue((helper_dir / "STRU").is_file()) + self.assertTrue((helper_dir / "POSCAR").is_file()) + self.assertTrue((helper_dir / "volume.json").is_file()) + self.assertTrue((helper_dir / "phonopy_disp.yaml").is_file()) + self.assertTrue((helper_dir / "band.conf").is_file()) + + reference_task = self.target_path / "task.000000" + displacement_task = self.target_path / "task.000001" + self.assertTrue((reference_task / "STRU").exists()) + self.assertTrue((reference_task / "POSCAR").is_file()) + self.assertTrue((reference_task / "gruneisen_task.json").is_file()) + self.assertEqual(loadfn(reference_task / "gruneisen_task.json")["role"], "reference") + self.assertEqual(loadfn(displacement_task / "gruneisen_task.json")["role"], "displacement") + + def test_sign_only_compute_lower_from_abacus_manifest(self): + gruneisen = Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.01, 0.0, 0.01], + "temperatures": [100, 300], + "alpha_mode": "sign_only", + }, + inter_param={"type": "abacus"}, + ) + work_dir = self.work_root / "gruneisen_abacus_compute" + task_dirs = self._write_synthetic_abacus_gruneisen_layout(work_dir) + calls = [] + + def fake_check_call(command, shell): + self.assertTrue(shell) + calls.append((Path.cwd().name, command)) + if command.startswith(Phonon.phonopy_setup_command("-f")): + Path("FORCE_SETS").write_text("fake force sets\n") + elif command == Phonon.phonopy_setup_command("phonopy_disp.yaml --writefc"): + Path("FORCE_CONSTANTS").write_text("fake force constants\n") + elif command == "phonopy band.conf": + strain = loadfn("volume.json")["strain"] + if strain < 0: + frequencies = [4.2, 8.4] + elif strain > 0: + frequencies = [4.0, 8.0] + else: + frequencies = [4.1, 8.2] + Path("band.yaml").write_text("phonon: []\n") + Path("mesh.yaml").write_text( + yaml.safe_dump( + { + "phonon": [ + { + "q-position": [0.0, 0.0, 0.0], + "weight": 1, + "band": [{"frequency": freq} for freq in frequencies], + } + ] + }, + sort_keys=False, + ) + ) + else: + raise AssertionError(f"unexpected command: {command}") + + def fake_run(command, stdout, stderr, text): + self.assertEqual(command, ["phonopy-bandplot", "--gnuplot", "band.yaml"]) + stdout.write("0 0\n") + return subprocess.CompletedProcess(command, 1, stderr="bandplot warning") + + with patch("apex.core.property.Gruneisen.subprocess.check_call", side_effect=fake_check_call), \ + patch("apex.core.property.Gruneisen.subprocess.run", side_effect=fake_run): + result, ptr = gruneisen._compute_lower(str(work_dir / "result.json"), task_dirs, []) + + self.assertEqual(result["thermal_expansion"]["alpha_mode"], "sign_only") + self.assertEqual(result["thermal_expansion"]["sign"], ["positive", "positive"]) + self.assertEqual(result["gruneisen"]["qpoint_count"], 1) + self.assertEqual(result["gruneisen"]["mode_count"], 2) + self.assertEqual( + len([cmd for _, cmd in calls if cmd.startswith(Phonon.phonopy_setup_command("-f"))]), + 3, + ) + self.assertEqual( + len([ + cmd + for _, cmd in calls + if cmd == Phonon.phonopy_setup_command("phonopy_disp.yaml --writefc") + ]), + 3, + ) + self.assertEqual(len([cmd for _, cmd in calls if cmd == "phonopy band.conf"]), 3) + self.assertTrue((work_dir / "volume.000000" / "mesh.yaml").is_file()) + self.assertTrue((work_dir / "volume.000001" / "band.dat").is_file()) + self.assertTrue("Temperature(K) SumGammaCv Sign" in ptr) + + def test_post_process_prepares_phonon_run_inputs_for_lammps(self): + deepmd_gruneisen = Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.02, 0.0, 0.02], + "temperatures": [10, 50, 100], + "supercell_size": [2, 2, 2], + "lammps_run_command": "/root/.dp1s/bin/lmp -in in.lammps", + "phonolammps_run_command": "phonolammps {input_file} -c {poscar} --dim {dim_x} {dim_y} {dim_z}", + }, + inter_param={ + "type": "deepmd", + "model": "frozen_model.pth", + "type_map": {"Cu": 0, "O": 1}, + "deepmd_version": "3.1.1", + }, + ) + task_dir = self.work_root / "gruneisen_post" / "task.000000" + task_dir.mkdir(parents=True, exist_ok=True) + (task_dir / "in.lammps").write_text( + "clear\npair_style deepmd frozen_model.pth\npair_coeff * * Cu O\nrun 0\n" + ) + (task_dir / "conf.lmp").write_text("LAMMPS data\n") + (task_dir / "POSCAR").write_text(self.source_path.read_text()) + + deepmd_gruneisen.post_process([str(task_dir)]) + + rewritten = (task_dir / "in.lammps").read_text() + self.assertIn("plugin load libdeepmd_lmp.so", rewritten) + self.assertIn("pair_style deepmd frozen_model.pth", rewritten) + self.assertNotIn("run 0", rewritten) + self.assertTrue((task_dir / "in.relax.lammps").is_file()) + self.assertTrue((task_dir / "type_map.json").is_file()) + self.assertTrue((task_dir / "convert_relax_dump_to_poscar.py").is_file()) + self.assertEqual((task_dir / "run_command").read_text(), "bash run_gruneisen_task.sh") + run_script = (task_dir / "run_gruneisen_task.sh").read_text() + self.assertIn("/root/.dp1s/bin/lmp -in in.relax.lammps", run_script) + self.assertIn("python3 convert_relax_dump_to_poscar.py dump.relax POSCAR.relaxed type_map.json", run_script) + self.assertIn("phonolammps in.lammps -c POSCAR --dim 2 2 2", run_script) + self.assertIn("cp POSCAR.relaxed POSCAR", run_script) + + def test_lammps_backward_files_for_gruneisen(self): + lammps = Lammps( + { + "type": "deepmd", + "model": "lammps_input/frozen_model.pb", + "deepmd_version": "1.1.0", + "type_map": {"Al": 0}, + }, + str(self.source_path), + ) + self.assertEqual( + lammps.backward_files("gruneisen"), + [ + "log.lammps", + "outlog", + "apex_task_status.json", + ".debug.log", + ".debug.stdout", + ".debug.stderr", + "dump.relax", + "FORCE_CONSTANTS", + "mesh.yaml", + "band.yaml", + "phonopy.yaml", + ], + ) + + def test_sign_only_compute_lower_from_synthetic_mesh(self): + gruneisen = Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.01, 0.0, 0.01], + "temperatures": [100, 300], + "alpha_mode": "sign_only", + } + ) + work_dir = self.work_root / "gruneisen_compute" + work_dir.mkdir(parents=True, exist_ok=True) + task_dirs = [] + synthetic = [ + (-0.01, 99.0, [[4.2, 8.4]]), + (0.0, 100.0, [[4.1, 8.2]]), + (0.01, 101.0, [[4.0, 8.0]]), + ] + for task_id, (strain, volume, frequencies) in enumerate(synthetic): + task_dir = work_dir / f"task.{task_id:06d}" + task_dir.mkdir(parents=True, exist_ok=True) + (task_dir / "volume.json").write_text( + json.dumps( + { + "strain": strain, + "scale": 1.0, + "volume": volume, + "volume_per_atom": volume / 4.0, + "reference_volume": 100.0, + "reference_volume_per_atom": 25.0, + } + ) + ) + mesh = { + "phonon": [ + { + "q-position": [0.0, 0.0, 0.0], + "weight": 1, + "band": [{"frequency": freq} for freq in frequencies[0]], + } + ] + } + (task_dir / "mesh.yaml").write_text(yaml.safe_dump(mesh, sort_keys=False)) + task_dirs.append(str(task_dir)) + + output_file = work_dir / "result.json" + result, ptr = gruneisen._compute_lower(str(output_file), task_dirs, []) + self.assertEqual(result["thermal_expansion"]["alpha_mode"], "sign_only") + self.assertEqual(result["thermal_expansion"]["sign"], ["positive", "positive"]) + self.assertEqual(result["gruneisen"]["qpoint_count"], 1) + self.assertEqual(result["gruneisen"]["mode_count"], 2) + self.assertEqual(result["bulk_modulus"], None) + self.assertEqual(len(result["mode_gruneisen"]), 1) + self.assertEqual(len(result["mode_gruneisen"][0]["gamma"]), 2) + self.assertEqual(result["mode_gruneisen"][0]["weight"], 1) + self.assertEqual(result["mode_gruneisen"][0]["omega_ref"], [4.1, 8.2]) + self.assertIn("100.0", result["mode_heat_capacity"][0]["cv"]) + self.assertIn("300.0", result["mode_heat_capacity"][0]["cv"]) + self.assertEqual(len(result["mode_heat_capacity"][0]["cv"]["100.0"]), 2) + self.assertEqual(len(result["mode_contributions"][0]["gamma_cv"]["300.0"]), 2) + self.assertEqual(len(result["contribution_summary"]), 2) + self.assertGreater(result["contribution_summary"][0]["positive_sum"], 0.0) + self.assertEqual(result["contribution_summary"][0]["negative_sum"], 0.0) + self.assertAlmostEqual( + result["contribution_summary"][0]["net_sum"], + result["thermal_expansion"]["sum_gamma_cv"][0], + ) + self.assertTrue("Temperature(K) SumGammaCv Sign" in ptr) + self.assertTrue("# contribution summary" in ptr) + + def test_full_compute_lower_fits_bulk_modulus_and_alpha(self): + gruneisen = Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.01, 0.0, 0.01], + "temperatures": [100, 300], + "alpha_mode": "full", + } + ) + work_dir = self.work_root / "gruneisen_full" + task_dirs, result_paths = self._write_synthetic_gruneisen_tasks( + work_dir, + [ + (-0.01, 99.0, [[4.2, 8.4]], -4.0 + 0.01 * (24.75 - 25.0) ** 2), + (0.0, 100.0, [[4.1, 8.2]], -4.0), + (0.01, 101.0, [[4.0, 8.0]], -4.0 + 0.01 * (25.25 - 25.0) ** 2), + ], + weight=2, + ) + + output_file = work_dir / "result.json" + result, ptr = gruneisen._compute_lower(str(output_file), task_dirs, result_paths) + + self.assertEqual(result["thermal_expansion"]["alpha_mode"], "full") + self.assertGreater(result["bulk_modulus"]["K_T_GPa"], 0.0) + self.assertEqual(result["bulk_modulus"]["fit_variant"], "fixed_bp") + self.assertEqual(result["thermal_expansion"]["qpoint_weight_sum"], 2) + self.assertEqual(len(result["thermal_expansion"]["alpha"]), 2) + raw = result["thermal_expansion"]["sum_gamma_cv"][0] + per_cell = result["thermal_expansion"]["sum_gamma_cv_per_cell"][0] + self.assertAlmostEqual(per_cell, raw / 2.0) + expected_alpha = per_cell / ( + result["thermal_expansion"]["reference_volume_for_alpha"] + * result["bulk_modulus"]["K_T_eV_per_A3"] + ) + self.assertAlmostEqual(result["thermal_expansion"]["alpha"][0], expected_alpha) + self.assertIn("bulk modulus", ptr) + self.assertIn("Alpha(K^-1)", ptr) + + def test_full_compute_lower_rejects_non_positive_bulk_modulus(self): + gruneisen = Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.01, 0.0, 0.01], + "temperatures": [300], + "alpha_mode": "full", + } + ) + work_dir = self.work_root / "gruneisen_bad_bulk" + task_dirs, result_paths = self._write_synthetic_gruneisen_tasks( + work_dir, + [ + (-0.01, 99.0, [[4.2, 8.4]], -4.0 - 0.01 * (24.75 - 25.0) ** 2), + (0.0, 100.0, [[4.1, 8.2]], -4.0), + (0.01, 101.0, [[4.0, 8.0]], -4.0 - 0.01 * (25.25 - 25.0) ** 2), + ], + ) + + with self.assertRaisesRegex(ValueError, "positive fitted bulk modulus"): + gruneisen._compute_lower(str(work_dir / "result.json"), task_dirs, result_paths) + + def test_full_compute_lower_requires_task_results(self): + gruneisen = Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.01, 0.0, 0.01], + "temperatures": [300], + "alpha_mode": "full", + } + ) + work_dir = self.work_root / "gruneisen_missing_result" + task_dirs, _ = self._write_synthetic_gruneisen_tasks( + work_dir, + [ + (-0.01, 99.0, [[4.2, 8.4]], -4.0), + (0.0, 100.0, [[4.1, 8.2]], -4.0), + (0.01, 101.0, [[4.0, 8.0]], -4.0), + ], + ) + + with self.assertRaisesRegex(ValueError, "result_task.json"): + gruneisen._compute_lower(str(work_dir / "result.json"), task_dirs, []) + + def test_primitive_compute_lower_requires_poscar_unitcell(self): + gruneisen = Gruneisen( + { + "type": "gruneisen", + "volume_strains": [-0.01, 0.0, 0.01], + "temperatures": [300], + "primitive": True, + } + ) + work_dir = self.work_root / "gruneisen_missing_unitcell" + task_dirs, _ = self._write_synthetic_gruneisen_tasks( + work_dir, + [ + (-0.01, 99.0, [[4.2, 8.4]], -4.0), + (0.0, 100.0, [[4.1, 8.2]], -4.0), + (0.01, 101.0, [[4.0, 8.0]], -4.0), + ], + ) + + with self.assertRaisesRegex(FileNotFoundError, "POSCAR-unitcell is required"): + gruneisen._compute_lower(str(work_dir / "result.json"), task_dirs, []) + + def test_fit_birch_murnaghan_helper_is_side_effect_free(self): + fit = fit_birch_murnaghan( + [24.75, 25.0, 25.25], + [ + -4.0 + 0.01 * (24.75 - 25.0) ** 2, + -4.0, + -4.0 + 0.01 * (25.25 - 25.0) ** 2, + ], + fixed_bp=4.0, + ) + self.assertGreater(fit["K_T_GPa"], 0.0) + self.assertEqual(fit["fit_variant"], "fixed_bp") + self.assertEqual(fit["model"], "birch_murnaghan") + + def test_mode_heat_capacity_is_stable_for_large_x(self): + cv = Gruneisen._mode_heat_capacity(frequency_thz=500.0, temperature=1.0) + self.assertEqual(cv, 0.0) + + def _write_synthetic_gruneisen_tasks(self, work_dir, synthetic, weight=1): + work_dir.mkdir(parents=True, exist_ok=True) + task_dirs = [] + result_paths = [] + for task_id, (strain, volume, frequencies, energy_per_atom) in enumerate(synthetic): + task_dir = work_dir / f"task.{task_id:06d}" + task_dir.mkdir(parents=True, exist_ok=True) + (task_dir / "volume.json").write_text( + json.dumps( + { + "strain": strain, + "scale": 1.0, + "volume": volume, + "volume_per_atom": volume / 4.0, + "reference_volume": 100.0, + "reference_volume_per_atom": 25.0, + } + ) + ) + mesh = { + "phonon": [ + { + "q-position": [0.0, 0.0, 0.0], + "weight": weight, + "band": [{"frequency": freq} for freq in frequencies[0]], + } + ] + } + (task_dir / "mesh.yaml").write_text(yaml.safe_dump(mesh, sort_keys=False)) + result_path = task_dir / "result_task.json" + result_path.write_text( + json.dumps( + { + "energies": [energy_per_atom * 4.0], + "atom_numbs": [4], + } + ) + ) + task_dirs.append(str(task_dir)) + result_paths.append(str(result_path)) + return task_dirs, result_paths + + def _prepare_abacus_relax_fixture(self): + out_dir = self.abacus_equi_path / "OUT.ABACUS" + out_dir.mkdir(parents=True, exist_ok=True) + shutil.copy(self.abacus_source_path / "INPUT", self.abacus_equi_path / "INPUT") + shutil.copy(self.abacus_source_path / "STRU", self.abacus_equi_path / "STRU") + shutil.copy( + self.abacus_source_path / "running_cell-relax.log", + out_dir / "running_cell-relax.log", + ) + shutil.copy(self.abacus_source_path / "STRU_ION_D", out_dir / "STRU_ION_D") + + def _write_synthetic_abacus_gruneisen_layout(self, work_dir: Path): + work_dir.mkdir(parents=True, exist_ok=True) + manifest = {"volume_points": []} + task_dirs = [] + source_stru = self.abacus_source_path / "STRU_ION_D" + for volume_index, strain in enumerate([-0.01, 0.0, 0.01]): + helper_dir = work_dir / f"volume.{volume_index:06d}" + helper_dir.mkdir(parents=True, exist_ok=True) + shutil.copy(source_stru, helper_dir / "STRU") + dpdata.System(str(helper_dir / "STRU"), fmt="stru").to("vasp/poscar", str(helper_dir / "POSCAR")) + (helper_dir / "phonopy_disp.yaml").write_text("displacements: []\n") + (helper_dir / "band.conf").write_text("MESH = 1 1 1\nFORCE_CONSTANTS = READ\n") + (helper_dir / "volume.json").write_text( + json.dumps( + { + "strain": strain, + "scale": 1.0, + "volume": 100.0 + strain * 100.0, + "volume_per_atom": 25.0 + strain * 25.0, + "reference_volume": 100.0, + "reference_volume_per_atom": 25.0, + } + ) + ) + reference_task = work_dir / f"task.{volume_index * 3:06d}" + reference_task.mkdir(parents=True, exist_ok=True) + displacement_tasks = [] + for offset in [1, 2]: + task_dir = work_dir / f"task.{volume_index * 3 + offset:06d}" + out_dir = task_dir / "OUT.ABACUS" + out_dir.mkdir(parents=True, exist_ok=True) + (out_dir / "running_scf.log").write_text("SEE INFORMATION IN\n") + task_dirs.append(str(task_dir)) + displacement_tasks.append(task_dir.name) + task_dirs.append(str(reference_task)) + manifest["volume_points"].append( + { + "volume_index": volume_index, + "helper_dir": helper_dir.name, + "reference_task": reference_task.name, + "displacement_tasks": displacement_tasks, + "strain": strain, + } + ) + dumpfn(manifest, work_dir / "abacus_gruneisen_tasks.json", indent=4) + task_dirs.sort() + return task_dirs + + def _write_synthetic_vasp_displacement_gruneisen_layout(self, work_dir: Path): + work_dir.mkdir(parents=True, exist_ok=True) + manifest = {"volume_points": []} + task_dirs = [] + poscar_text = self.source_path.read_text() + for volume_index, strain in enumerate([-0.01, 0.0, 0.01]): + helper_dir = work_dir / f"volume.{volume_index:06d}" + helper_dir.mkdir(parents=True, exist_ok=True) + (helper_dir / "POSCAR-unitcell").write_text(poscar_text) + (helper_dir / "phonopy_disp.yaml").write_text("displacements: []\n") + (helper_dir / "band.conf").write_text("MESH = 1 1 1\nFORCE_CONSTANTS = READ\n") + (helper_dir / "volume.json").write_text( + json.dumps( + { + "strain": strain, + "scale": 1.0, + "volume": 100.0 + strain * 100.0, + "volume_per_atom": 25.0 + strain * 25.0, + "reference_volume": 100.0, + "reference_volume_per_atom": 25.0, + } + ) + ) + reference_task = work_dir / f"task.{volume_index * 3:06d}" + reference_task.mkdir(parents=True, exist_ok=True) + displacement_tasks = [] + for offset in [1, 2]: + task_dir = work_dir / f"task.{volume_index * 3 + offset:06d}" + task_dir.mkdir(parents=True, exist_ok=True) + (task_dir / "vasprun.xml").write_text("\n") + task_dirs.append(str(task_dir)) + displacement_tasks.append(task_dir.name) + task_dirs.append(str(reference_task)) + manifest["volume_points"].append( + { + "volume_index": volume_index, + "helper_dir": helper_dir.name, + "reference_task": reference_task.name, + "displacement_tasks": displacement_tasks, + "strain": strain, + } + ) + dumpfn(manifest, work_dir / "vasp_gruneisen_tasks.json", indent=4) + task_dirs.sort() + return task_dirs diff --git a/tests/test_gui_cli.py b/tests/test_gui_cli.py new file mode 100644 index 00000000..c47bd14c --- /dev/null +++ b/tests/test_gui_cli.py @@ -0,0 +1,41 @@ +import sys +import unittest +from unittest.mock import patch + +from apex.main import parse_args + + +class TestGuiCliParser(unittest.TestCase): + def test_gui_defaults(self): + with patch.object(sys, "argv", ["apex", "gui"]): + _, args = parse_args() + + self.assertEqual(args.cmd, "gui") + self.assertEqual(args.host, "127.0.0.1") + self.assertEqual(args.port, 8060) + self.assertFalse(args.no_browser) + + def test_gui_custom_options(self): + argv = ["apex", "gui", "-H", "0.0.0.0", "-p", "9001", "--no-browser"] + with patch.object(sys, "argv", argv): + _, args = parse_args() + + self.assertEqual(args.cmd, "gui") + self.assertEqual(args.host, "0.0.0.0") + self.assertEqual(args.port, 9001) + self.assertTrue(args.no_browser) + + def test_report_no_browser_option(self): + with patch.object(sys, "argv", ["apex", "report", "--no-browser"]): + _, args = parse_args() + + self.assertEqual(args.cmd, "report") + self.assertTrue(args.no_browser) + + def test_report_custom_host_port(self): + with patch.object(sys, "argv", ["apex", "report", "-H", "0.0.0.0", "-p", "8071"]): + _, args = parse_args() + + self.assertEqual(args.cmd, "report") + self.assertEqual(args.host, "0.0.0.0") + self.assertEqual(args.port, 8071) diff --git a/tests/test_gui_submit_builder.py b/tests/test_gui_submit_builder.py new file mode 100644 index 00000000..7d271674 --- /dev/null +++ b/tests/test_gui_submit_builder.py @@ -0,0 +1,886 @@ +import base64 +import io +import json +import os +import tempfile +import unittest +import zipfile +from unittest import mock + +import apex.gui as gui_module +from apex.gui import ( + DEFAULT_REPORT_PORT, + BLOCKED_INLINE_COMMANDS, + RETRIEVE_RUNNING_MESSAGE, + _advanced_report_args, + _autodetect_interaction_rows, + _build_param_payload, + _build_submit_shell_command, + _cleanup_reset_logs, + _ensure_default_interaction_files, + _extract_property_types, + _extract_potcar_rows, + _find_param_fallback_file, + _is_retrieve_feedback, + _is_param_fallback_filename, + _parse_extra_elements, + _interaction_editor_label, + _interaction_table_columns_for_profile, + _interaction_table_rows_from_template, + _interaction_type_options_for_profile, + _list_structure_path_options, + _list_workdir_file_options, + _load_account_state, + _load_profile_param_template, + _param_controls_from_text, + _patch_param_payload, + _parse_retrieve_progress_from_log, + _parse_submit_payloads, + _read_latest_workflow_id, + _render_account_summary, + _finalize_retrieve_status, + _retrieve_state_is_active, + _run_finalize_pipeline, + _save_uploaded_files, + _save_account_overwrite, + _strip_parenthetical_suffix, + _summarize_conf_progress, + _summarize_step_progress, + _workflow_progress_percent, +) + + +class TestGuiSubmitBuilder(unittest.TestCase): + def test_build_param_payload_sets_interaction_and_req_calc(self): + payload = _build_param_payload( + profile="lammps", + selected_structures=["confs/std-fcc"], + with_relax=False, + selected_properties=["elastic", "eos"], + interaction_type="eam_alloy", + interaction_model="my_model.eam", + element_slots=["Al", "Ni", "", ""], + ) + + self.assertNotIn("relaxation", payload) + self.assertEqual(payload["structures"], ["confs/std-fcc"]) + self.assertEqual(payload["interaction"]["type"], "eam_alloy") + self.assertEqual(payload["interaction"]["model"], "my_model.eam") + self.assertEqual(payload["interaction"]["type_map"], "auto") + + req_calc = { + item["type"]: item.get("req_calc") + for item in payload.get("properties", []) + if isinstance(item, dict) and "type" in item + } + self.assertTrue(req_calc.get("elastic")) + self.assertTrue(req_calc.get("eos")) + if "vacancy" in req_calc: + self.assertFalse(req_calc["vacancy"]) + + def test_build_param_payload_default_element_and_model(self): + payload = _build_param_payload( + profile="lammps", + selected_structures=["confs/std-bcc"], + with_relax=True, + selected_properties=[], + interaction_type="deepmd", + interaction_model="", + element_slots=["", "", "", ""], + ) + + self.assertIn("relaxation", payload) + self.assertEqual(payload["interaction"]["type"], "deepmd") + self.assertNotIn("model", payload["interaction"]) + self.assertEqual(payload["interaction"]["type_map"], "auto") + + def test_patch_param_payload_updates_structures_without_resetting_manual_edits(self): + template = _load_profile_param_template("lammps") + current = { + "structures": ["old/conf"], + "relaxation": {"cal_setting": {"custom_relax": True}}, + "properties": [{"type": "eos", "req_calc": True, "custom": 123}], + "interaction": {"type": "eam_alloy", "model": "manual.eam", "type_map": "auto"}, + "manual_top_level": {"keep": True}, + } + + payload = _patch_param_payload( + current_text=json.dumps(current), + triggered_id="submit-structures", + profile="lammps", + template=template, + relax_check=["relax"], + properties_check=["eos"], + structures_value=["RSS_HEA/conf_*"], + interaction_type="eam_alloy", + interaction_model="new.eam", + interaction_incar="", + interaction_rows=[], + ) + + self.assertEqual(payload["structures"], ["RSS_HEA/conf_*"]) + self.assertEqual(payload["properties"], current["properties"]) + self.assertEqual(payload["interaction"], current["interaction"]) + self.assertEqual(payload["manual_top_level"], {"keep": True}) + + def test_patch_param_payload_updates_properties_without_resetting_interaction(self): + template = _load_profile_param_template("lammps") + current = { + "structures": ["confs/std-bcc"], + "properties": [{"type": "eos", "req_calc": False, "custom": 123}], + "interaction": {"type": "eam_alloy", "model": "manual.eam", "type_map": "auto"}, + } + + payload = _patch_param_payload( + current_text=json.dumps(current), + triggered_id="submit-properties-check", + profile="lammps", + template=template, + relax_check=[], + properties_check=["eos"], + structures_value=["ignored/conf"], + interaction_type="deepmd", + interaction_model="ignored.pb", + interaction_incar="", + interaction_rows=[], + ) + + self.assertEqual(payload["structures"], ["confs/std-bcc"]) + self.assertEqual(payload["interaction"], current["interaction"]) + self.assertEqual(payload["properties"][0]["type"], "eos") + self.assertTrue(payload["properties"][0]["req_calc"]) + self.assertEqual(payload["properties"][0]["custom"], 123) + + def test_patch_param_payload_updates_interaction_without_resetting_other_blocks(self): + template = _load_profile_param_template("lammps") + current = { + "structures": ["confs/std-bcc"], + "relaxation": {"cal_setting": {"custom_relax": True}}, + "properties": [{"type": "elastic", "req_calc": True, "custom": "keep"}], + "interaction": {"type": "eam_alloy", "model": "old.eam", "type_map": "auto"}, + } + + payload = _patch_param_payload( + current_text=json.dumps(current), + triggered_id="submit-interaction-model", + profile="lammps", + template=template, + relax_check=["relax"], + properties_check=["eos"], + structures_value=["ignored/conf"], + interaction_type="deepmd", + interaction_model="model.pb", + interaction_incar="", + interaction_rows=[], + ) + + self.assertEqual(payload["structures"], current["structures"]) + self.assertEqual(payload["relaxation"], current["relaxation"]) + self.assertEqual(payload["properties"], current["properties"]) + self.assertEqual(payload["interaction"]["type"], "deepmd") + self.assertEqual(payload["interaction"]["model"], "model.pb") + self.assertEqual(payload["interaction"]["type_map"], "auto") + + def test_parse_extra_elements(self): + parsed = _parse_extra_elements("Cu, Ni Fe;Cr\nMn") + self.assertEqual(parsed, ["Cu", "Ni", "Fe", "Cr", "Mn"]) + + def test_list_workdir_file_options_recurses_and_keeps_current(self): + with tempfile.TemporaryDirectory() as tmpdir: + os.makedirs(os.path.join(tmpdir, "models"), exist_ok=True) + with open(os.path.join(tmpdir, "models", "Ni.eam.alloy"), "w", encoding="utf-8") as f: + f.write("eam") + options = _list_workdir_file_options(tmpdir, "missing.pb") + values = [item["value"] for item in options] + self.assertIn("models/Ni.eam.alloy", values) + self.assertEqual(values[0], "missing.pb") + + def test_gui_submit_command_uses_background_runner_module(self): + with tempfile.TemporaryDirectory() as tmpdir: + meta_path = os.path.join(tmpdir, ".apex-submit-group.json") + shell_cmd, display_cmd = _build_submit_shell_command(meta_path, tmpdir) + + self.assertIn("apex.gui_background submit-group", shell_cmd) + self.assertIn("apex.gui_background submit-group", display_cmd) + self.assertIn(".apex-submit-group.json", shell_cmd) + self.assertIn(".apex-submit.status", shell_cmd) + self.assertNotIn("python -c", shell_cmd) + self.assertNotIn("python -c", display_cmd) + + def test_list_structure_path_options_returns_structure_dirs(self): + with tempfile.TemporaryDirectory() as tmpdir: + os.makedirs(os.path.join(tmpdir, "confs", "std-bcc"), exist_ok=True) + with open(os.path.join(tmpdir, "confs", "std-bcc", "POSCAR"), "w", encoding="utf-8") as f: + f.write("POSCAR") + options = _list_structure_path_options(tmpdir, ["confs/std-*"]) + values = [item["value"] for item in options] + self.assertIn("confs/std-bcc", values) + self.assertEqual(values[0], "confs/std-*") + + def test_list_structure_path_options_adds_numbered_wildcard_group(self): + with tempfile.TemporaryDirectory() as tmpdir: + for name in ["conf_001", "conf_002"]: + conf_dir = os.path.join(tmpdir, "RSS_HEA", name) + os.makedirs(conf_dir, exist_ok=True) + with open(os.path.join(conf_dir, "POSCAR"), "w", encoding="utf-8") as f: + f.write("POSCAR") + single_dir = os.path.join(tmpdir, "other", "case_001") + os.makedirs(single_dir, exist_ok=True) + with open(os.path.join(single_dir, "POSCAR"), "w", encoding="utf-8") as f: + f.write("POSCAR") + + options = _list_structure_path_options(tmpdir) + values = [item["value"] for item in options] + + self.assertIn("RSS_HEA/conf_*", values) + self.assertIn("RSS_HEA/conf_001", values) + self.assertIn("RSS_HEA/conf_002", values) + self.assertNotIn("other/case_*", values) + + def test_build_param_payload_ignores_manual_elements_for_auto_type_map(self): + payload = _build_param_payload( + profile="lammps", + selected_structures=["confs/std-hcp"], + with_relax=True, + selected_properties=[], + interaction_type="eam_alloy", + interaction_model="x", + element_slots=["Al", "Ni", "Al", "Cu", "Ni"], + ) + self.assertEqual(payload["interaction"]["type_map"], "auto") + + def test_profile_templates_have_different_property_options(self): + lammps = _extract_property_types(_load_profile_param_template("lammps")) + vasp = _extract_property_types(_load_profile_param_template("vasp")) + abacus = _extract_property_types(_load_profile_param_template("abacus")) + + self.assertIn("cohesive", lammps) + self.assertNotIn("cohesive", vasp) + self.assertIn("phonon", vasp) + self.assertIn("phonon", abacus) + self.assertNotIn("phonon", lammps) + self.assertIn("gamma_surface", lammps) + self.assertIn("gamma_surface", vasp) + self.assertIn("gamma_surface", abacus) + + def test_lammps_interaction_types_exclude_vasp_abacus(self): + options = [item["value"] for item in _interaction_type_options_for_profile("lammps", "meam")] + self.assertNotIn("vasp", options) + self.assertNotIn("abacus", options) + self.assertIn("meam", options) + + def test_profile_template_merges_param_interaction(self): + vasp_template = _load_profile_param_template("vasp") + self.assertEqual(vasp_template["interaction"]["type"], "vasp") + self.assertIn("potcars", vasp_template["interaction"]) + self.assertIn("incar", vasp_template["interaction"]) + pot_rows = _extract_potcar_rows(vasp_template) + self.assertTrue(pot_rows and "(to be change)" not in pot_rows[0][1]) + + def test_abacus_interaction_supports_orb_files(self): + abacus_template = _load_profile_param_template("abacus") + rows = _interaction_table_rows_from_template("abacus", abacus_template) + payload = _build_param_payload( + profile="abacus", + selected_structures=["confs/fcc-Al"], + with_relax=True, + selected_properties=[], + interaction_type="abacus", + interaction_model="", + element_slots=[], + interaction_incar="abacus_input/INPUT(defaule value)", + interaction_rows=rows, + base_template=abacus_template, + ) + self.assertIn("input", payload["interaction"]) + self.assertNotIn("incar", payload["interaction"]) + self.assertIn("orb_files", payload["interaction"]) + self.assertIn("potcars", payload["interaction"]) + + def test_autodetect_interaction_rows_for_vasp_uses_poscar_order_and_suffix(self): + vasp_template = _load_profile_param_template("vasp") + poscar_text = "Test\n1.0\n1 0 0\n0 1 0\n0 0 1\nMo Al\n1 1\nDirect\n0 0 0\n0.5 0.5 0.5\n" + with tempfile.TemporaryDirectory() as tmpdir: + os.makedirs(os.path.join(tmpdir, "confs", "std-bcc"), exist_ok=True) + os.makedirs(os.path.join(tmpdir, "vasp_input"), exist_ok=True) + with open(os.path.join(tmpdir, "confs", "std-bcc", "POSCAR"), "w", encoding="utf-8") as f: + f.write(poscar_text) + with open(os.path.join(tmpdir, "vasp_input", "POTCAR.Mo"), "w", encoding="utf-8") as f: + f.write("Mo") + rows = _autodetect_interaction_rows("vasp", tmpdir, ["confs/std-bcc"], vasp_template) + self.assertEqual(rows[0]["element"], "Mo") + self.assertEqual(rows[0]["potcar"], "POTCAR.Mo") + self.assertEqual(rows[1]["element"], "Al") + self.assertIn("请提交对应元素的POTCAR", rows[1]["potcar"]) + + def test_autodetect_interaction_rows_for_abacus_uses_prefix(self): + abacus_template = _load_profile_param_template("abacus") + poscar_text = "Test\n1.0\n1 0 0\n0 1 0\n0 0 1\nAl H\n1 1\nDirect\n0 0 0\n0.5 0.5 0.5\n" + with tempfile.TemporaryDirectory() as tmpdir: + os.makedirs(os.path.join(tmpdir, "confs", "std-bcc"), exist_ok=True) + os.makedirs(os.path.join(tmpdir, "abacus_input"), exist_ok=True) + with open(os.path.join(tmpdir, "confs", "std-bcc", "POSCAR"), "w", encoding="utf-8") as f: + f.write(poscar_text) + with open(os.path.join(tmpdir, "abacus_input", "Al_ONCV_PBE.upf"), "w", encoding="utf-8") as f: + f.write("Al") + with open(os.path.join(tmpdir, "abacus_input", "Al_gga_9au.orb"), "w", encoding="utf-8") as f: + f.write("Al") + rows = _autodetect_interaction_rows("abacus", tmpdir, ["confs/std-bcc"], abacus_template) + self.assertEqual(rows[0]["element"], "Al") + self.assertEqual(rows[0]["potcar"], "Al_ONCV_PBE.upf") + self.assertEqual(rows[0]["orb_file"], "Al_gga_9au.orb") + self.assertEqual(rows[1]["element"], "H") + self.assertIn("请提交对应元素的POTCAR", rows[1]["potcar"]) + self.assertIn("请提交对应元素的ORB", rows[1]["orb_file"]) + + def test_interaction_table_columns_profile_specific(self): + lammps_cols = _interaction_table_columns_for_profile("lammps") + abacus_cols = _interaction_table_columns_for_profile("abacus") + self.assertEqual(len(lammps_cols), 2) + self.assertEqual(len(abacus_cols), 3) + + def test_strip_parenthetical_suffix(self): + cleaned = _strip_parenthetical_suffix("POTCAR.Mo (to be change)") + self.assertEqual(cleaned, "POTCAR.Mo") + + def test_ensure_default_interaction_files_for_vasp(self): + payload = { + "interaction": { + "type": "vasp", + "incar": "vasp_input/INCAR (use default value)", + "potcars": {"Mo": "POTCAR.Mo (to be change)"}, + } + } + with tempfile.TemporaryDirectory() as tmpdir: + cwd = os.getcwd() + os.chdir(tmpdir) + try: + created = _ensure_default_interaction_files("vasp", payload) + self.assertIn("vasp_input/INCAR", created) + self.assertTrue(os.path.isfile("vasp_input/INCAR")) + finally: + os.chdir(cwd) + + def test_ensure_default_interaction_files_writes_editor_content(self): + payload = { + "interaction": { + "type": "abacus", + "input": "abacus_input/INPUT(defaule value)", + } + } + custom_content = "INPUT_PARAMETERS\ncustom_key custom_value\n" + with tempfile.TemporaryDirectory() as tmpdir: + cwd = os.getcwd() + os.chdir(tmpdir) + try: + created = _ensure_default_interaction_files("abacus", payload, incar_content=custom_content) + self.assertIn("abacus_input/INPUT", created) + with open("abacus_input/INPUT", "r", encoding="utf-8") as f: + content = f.read() + self.assertEqual(content, custom_content) + finally: + os.chdir(cwd) + + def test_interaction_editor_label(self): + self.assertEqual(_interaction_editor_label("vasp"), "INCAR 编辑区") + self.assertEqual(_interaction_editor_label("abacus"), "INPUT 编辑区") + + def test_account_overwrite_hides_password_in_summary(self): + with tempfile.TemporaryDirectory() as tmpdir: + account_path = os.path.join(tmpdir, "account.json") + feedback, account_state = _save_account_overwrite( + email="user@example.com", + password="secret-password", + program_id_text="1234", + account_path=account_path, + ) + self.assertTrue(feedback["ok"]) + self.assertEqual(account_state["email"], "user@example.com") + self.assertEqual(account_state["program_id"], "1234") + self.assertTrue(account_state["password_set"]) + + summary = _render_account_summary(account_state) + self.assertIn("Email: user@example.com", summary) + self.assertIn("Program ID: 1234", summary) + self.assertIn("Password: 已设置", summary) + self.assertNotIn("secret-password", summary) + + with open(account_path, "r", encoding="utf-8") as f: + on_disk = json.load(f) + self.assertEqual(on_disk["password"], "secret-password") + + def test_account_overwrite_requires_integer_program_id(self): + with tempfile.TemporaryDirectory() as tmpdir: + account_path = os.path.join(tmpdir, "account.json") + feedback, account_state = _save_account_overwrite( + email="user@example.com", + password="", + program_id_text="12ab", + account_path=account_path, + ) + self.assertFalse(feedback["ok"]) + self.assertIn("program_id", feedback["message"]) + self.assertEqual(account_state["email"], "") + self.assertEqual(account_state["program_id"], "") + + def test_load_account_state_from_missing_file(self): + with tempfile.TemporaryDirectory() as tmpdir: + account_path = os.path.join(tmpdir, "account.json") + state = _load_account_state(account_path) + self.assertEqual(state["email"], "") + self.assertEqual(state["program_id"], "") + self.assertFalse(state["password_set"]) + + def test_read_latest_workflow_id(self): + with tempfile.TemporaryDirectory() as tmpdir: + with open(os.path.join(tmpdir, ".workflow.log"), "w", encoding="utf-8") as f: + f.write("wf-old\tsubmit\t2026-01-01T00:00:00\t/tmp/old\n") + f.write("wf-new\tretrieve\t2026-01-01T00:00:01\t/tmp/new\twf-uid-new\n") + self.assertEqual(_read_latest_workflow_id(tmpdir), "wf-new") + + def test_advanced_report_is_allowed_and_gets_separate_port(self): + self.assertNotIn("report", BLOCKED_INLINE_COMMANDS) + args = _advanced_report_args(["report", "-c", "global.json", "-w", "."]) + + self.assertIn("--no-browser", args) + self.assertEqual(args[-2:], ["--port", str(DEFAULT_REPORT_PORT)]) + + def test_advanced_report_keeps_explicit_port(self): + args = _advanced_report_args(["report", "-c", "global.json", "--port", "8090"]) + + self.assertIn("--no-browser", args) + self.assertEqual(args.count("--port"), 1) + self.assertIn("8090", args) + + def test_finalize_pipeline_retrieves_then_runs_local_archive_and_report(self): + with tempfile.TemporaryDirectory() as tmpdir: + commands = [] + + def fake_run_apex_command(arguments, cwd=None): + commands.append(arguments) + self.assertEqual(cwd, tmpdir) + if arguments[0] == "retrieve": + return {"ok": True, "message": "retrieved"} + return {"ok": False, "message": "unexpected command"} + + def fake_run_archive_and_report_pipeline(workdir, global_file, param_file): + self.assertEqual(workdir, tmpdir) + self.assertEqual(global_file, "global.json") + self.assertEqual(param_file, "param.json") + return {"ok": True, "message": "Local archive + report completed. all_result.json: test. report started"} + + with mock.patch.object(gui_module, "_run_apex_command", side_effect=fake_run_apex_command), \ + mock.patch.object(gui_module, "_run_archive_and_report_pipeline", side_effect=fake_run_archive_and_report_pipeline): + feedback = _run_finalize_pipeline( + workdir=tmpdir, + workflow_id="wf-new", + global_file="global.json", + ) + + self.assertTrue(feedback["ok"]) + self.assertEqual(commands, [["retrieve", "-i", "wf-new", "-w", tmpdir, "-c", "global.json"]]) + self.assertIn("Retrieve + local archive + report completed", feedback["message"]) + + def test_finalize_retrieve_status_reports_running_message(self): + with tempfile.TemporaryDirectory() as tmpdir: + state = { + "workdir": tmpdir, + "global_file": "global.json", + "retrieve": { + "status": "running", + "workdir": tmpdir, + "global_file": "global.json", + "status_file": os.path.join(tmpdir, ".apex-retrieve.status"), + "log_file": os.path.join(tmpdir, "apex-retrieve.log"), + }, + } + + value, label, animated, text, next_state, feedback = _finalize_retrieve_status(state) + + self.assertEqual(value, 5) + self.assertEqual(label, "Retrieving") + self.assertTrue(animated) + self.assertEqual(text, RETRIEVE_RUNNING_MESSAGE) + self.assertEqual(next_state["status"], "running") + self.assertIs(feedback, gui_module.dash.no_update) + + def test_retrieve_state_is_active_until_status_file_has_result(self): + with tempfile.TemporaryDirectory() as tmpdir: + status_file = os.path.join(tmpdir, ".apex-retrieve.status") + state = { + "status": "running", + "status_file": status_file, + } + + self.assertTrue(_retrieve_state_is_active(state)) + with open(status_file, "w", encoding="utf-8") as f: + f.write("") + self.assertTrue(_retrieve_state_is_active(state)) + with open(status_file, "w", encoding="utf-8") as f: + f.write("0") + self.assertFalse(_retrieve_state_is_active(state)) + + def test_finalize_retrieve_status_auto_detects_log_progress(self): + with tempfile.TemporaryDirectory() as tmpdir: + log_path = os.path.join(tmpdir, "apex-retrieve.log") + with open(log_path, "w", encoding="utf-8") as f: + f.write( + "Retrieving 971 workflow results guitest-joint-pzcq4 to /tmp/work\n" + "Retrieving result 123/971: propertycal-rss-hea-conf-084-eos-00\n" + ) + state = { + "workdir": tmpdir, + "workflow_id": "guitest-joint-pzcq4", + } + + value, label, animated, text, next_state, feedback = _finalize_retrieve_status(state) + + self.assertEqual(value, 13) + self.assertEqual(label, "13%") + self.assertTrue(animated) + self.assertIn("123/971", text) + self.assertEqual(next_state, state) + self.assertIs(feedback, gui_module.dash.no_update) + + def test_finalize_retrieve_status_auto_detects_long_log_progress(self): + with tempfile.TemporaryDirectory() as tmpdir: + log_path = os.path.join(tmpdir, "apex-retrieve.log") + with open(log_path, "w", encoding="utf-8") as f: + f.write("Retrieving 971 workflow results guitest-joint-pzcq4 to /tmp/work\n") + for index in range(300): + f.write(f"noise line {index}\n") + f.write("Retrieving result 123/971: propertycal-rss-hea-conf-084-eos-00\n") + state = { + "workdir": tmpdir, + "workflow_id": "guitest-joint-pzcq4", + } + + value, label, animated, text, next_state, feedback = _finalize_retrieve_status(state) + + self.assertEqual(value, 13) + self.assertEqual(label, "13%") + self.assertTrue(animated) + self.assertIn("123/971", text) + self.assertEqual(next_state, state) + self.assertIs(feedback, gui_module.dash.no_update) + + def test_finalize_retrieve_status_ignores_mismatched_log_progress(self): + with tempfile.TemporaryDirectory() as tmpdir: + log_path = os.path.join(tmpdir, "apex-retrieve.log") + with open(log_path, "w", encoding="utf-8") as f: + f.write( + "Retrieving 971 workflow results guitest-joint-pzcq4 to /tmp/work\n" + "Retrieving result 123/971: propertycal-rss-hea-conf-084-eos-00\n" + ) + state = { + "workdir": tmpdir, + "workflow_id": "guitest-joint-other", + } + + value, label, animated, text, next_state, feedback = _finalize_retrieve_status(state) + + self.assertEqual(value, 0) + self.assertEqual(label, "0%") + self.assertFalse(animated) + self.assertEqual(text, "Retrieve 未运行") + self.assertEqual(next_state, {}) + self.assertIs(feedback, gui_module.dash.no_update) + + def test_finalize_retrieve_status_starts_report_after_success(self): + with tempfile.TemporaryDirectory() as tmpdir: + status_file = os.path.join(tmpdir, ".apex-retrieve.status") + with open(status_file, "w", encoding="utf-8") as f: + f.write("0") + state = { + "workdir": tmpdir, + "global_file": "global.json", + "retrieve": { + "status": "running", + "workdir": tmpdir, + "global_file": "global.json", + "param_file": "param.json", + "pending_report": True, + "status_file": status_file, + "log_file": os.path.join(tmpdir, "apex-retrieve.log"), + "command": "apex retrieve", + }, + } + + with mock.patch.object( + gui_module, + "_run_archive_and_report_pipeline", + return_value={"ok": True, "message": "Local archive + report completed. all_result.json: test. report started"}, + ): + value, label, animated, text, next_state, feedback = _finalize_retrieve_status(state) + + self.assertEqual(value, 100) + self.assertEqual(label, "100%") + self.assertFalse(animated) + self.assertEqual(text, ["Retrieve finished; report started."]) + self.assertEqual(next_state.get("status"), "done") + self.assertEqual(next_state.get("workdir"), tmpdir) + self.assertEqual(next_state.get("completed_text"), ["Retrieve finished; report started."]) + self.assertIn("Retrieve + local archive + report completed", feedback["message"]) + + def test_finalize_retrieve_status_marks_done_without_report_when_not_requested(self): + with tempfile.TemporaryDirectory() as tmpdir: + status_file = os.path.join(tmpdir, ".apex-retrieve.status") + with open(status_file, "w", encoding="utf-8") as f: + f.write("0") + state = { + "workdir": tmpdir, + "global_file": "global.json", + "retrieve": { + "status": "running", + "workdir": tmpdir, + "global_file": "global.json", + "param_file": "param.json", + "pending_report": False, + "status_file": status_file, + "log_file": os.path.join(tmpdir, "apex-retrieve.log"), + }, + } + + with mock.patch.object(gui_module, "_run_archive_and_report_pipeline") as mocked_pipeline: + value, label, animated, text, next_state, feedback = _finalize_retrieve_status(state) + + self.assertEqual(value, 100) + self.assertEqual(label, "Done") + self.assertFalse(animated) + self.assertEqual(text, "Retrieve finished.") + self.assertEqual(next_state.get("status"), "done") + self.assertIs(feedback, gui_module.dash.no_update) + mocked_pipeline.assert_not_called() + + def test_submit_status_file_is_not_treated_as_retrieve_feedback(self): + self.assertFalse( + _is_retrieve_feedback( + { + "operation": "submit", + "status_file": "/tmp/.apex-submit.status", + } + ) + ) + self.assertFalse(_is_retrieve_feedback({"status_file": "/tmp/.apex-submit.status"})) + self.assertTrue( + _is_retrieve_feedback( + { + "operation": "retrieve", + "status_file": "/tmp/.apex-retrieve.status", + } + ) + ) + + def test_parse_retrieve_progress_from_log(self): + progress = _parse_retrieve_progress_from_log( + "Retrieving 4 workflow results wf-001 to /tmp/work\n" + "Retrieving result 1/4: relaxcal-conf-001\n" + "Retrieving result 2/4: propertycal-conf-001-eos-00\n" + ) + + self.assertEqual(progress, (50, "50%", f"{RETRIEVE_RUNNING_MESSAGE} 2/4: propertycal-conf-001-eos-00")) + + def test_parse_submit_payloads_rejects_dot_in_structures(self): + global_text = json.dumps({}) + param_text = json.dumps({"structures": ["."], "interaction": {"type": "eam_alloy"}}) + _global_payload, _param_payload, feedback = _parse_submit_payloads(global_text, param_text) + self.assertIn("dflow does not allow '.' in `structures`", feedback["message"]) + self.assertIn("parameter[0].structures[0] = .", feedback["message"]) + + def test_cleanup_reset_logs_removes_requested_files_only(self): + with tempfile.TemporaryDirectory() as tmpdir: + for name in ["dpdispatcher.log", ".workflow.log", "apex.log", "keep.log"]: + with open(os.path.join(tmpdir, name), "w", encoding="utf-8") as f: + f.write("x") + removed = _cleanup_reset_logs(tmpdir) + self.assertEqual(removed, ["dpdispatcher.log", ".workflow.log", "apex.log"]) + self.assertFalse(os.path.exists(os.path.join(tmpdir, "dpdispatcher.log"))) + self.assertFalse(os.path.exists(os.path.join(tmpdir, ".workflow.log"))) + self.assertFalse(os.path.exists(os.path.join(tmpdir, "apex.log"))) + self.assertTrue(os.path.exists(os.path.join(tmpdir, "keep.log"))) + + def test_save_uploaded_files_writes_to_workdir(self): + payload = base64.b64encode(b"MODEL DATA\n").decode("ascii") + with tempfile.TemporaryDirectory() as tmpdir: + saved = _save_uploaded_files([f"data:application/octet-stream;base64,{payload}"], ["model.pb"], tmpdir) + self.assertEqual(saved, ["confs/model.pb"]) + with open(os.path.join(tmpdir, "confs", "model.pb"), "rb") as f: + self.assertEqual(f.read(), b"MODEL DATA\n") + + def test_save_uploaded_files_to_workdir_root(self): + payload = base64.b64encode(b"INPUT\n").decode("ascii") + with tempfile.TemporaryDirectory() as tmpdir: + saved = _save_uploaded_files( + [f"data:text/plain;base64,{payload}"], + ["global.json"], + tmpdir, + target_subdir="", + ) + self.assertEqual(saved, ["global.json"]) + with open(os.path.join(tmpdir, "global.json"), "rb") as f: + self.assertEqual(f.read(), b"INPUT\n") + + def test_find_param_fallback_prefers_uploaded_param_star_json(self): + with tempfile.TemporaryDirectory() as tmpdir: + with open(os.path.join(tmpdir, "param_old.json"), "w", encoding="utf-8") as f: + f.write('{"old": true}\n') + with open(os.path.join(tmpdir, "param_joint.json"), "w", encoding="utf-8") as f: + f.write('{"joint": true}\n') + + param_file, param_text = _find_param_fallback_file( + tmpdir, + preferred_files=["param_joint.json"], + ) + + self.assertEqual(param_file, "param_joint.json") + self.assertEqual(param_text, '{"joint": true}\n') + + def test_find_param_fallback_accepts_any_json_with_param_in_name(self): + with tempfile.TemporaryDirectory() as tmpdir: + with open(os.path.join(tmpdir, "param.json"), "w", encoding="utf-8") as f: + f.write("{}") + + self.assertEqual(_find_param_fallback_file(tmpdir), ("param.json", "{}")) + self.assertTrue(_is_param_fallback_filename("param.json")) + self.assertTrue(_is_param_fallback_filename("param_joint.json")) + self.assertTrue(_is_param_fallback_filename("my_param.json")) + self.assertFalse(_is_param_fallback_filename("global.json")) + + def test_param_controls_from_text_syncs_form_defaults(self): + payload = { + "structures": ["RSS_HEA/conf_*"], + "relaxation": {"cal_setting": {}}, + "properties": [ + {"type": "eos", "req_calc": True}, + {"type": "elastic", "req_calc": False}, + {"type": "phonon"}, + ], + "interaction": { + "type": "deepmd", + "model": ["frozen_model.pb", "other.pb"], + "type_map": "auto", + }, + } + with tempfile.TemporaryDirectory() as tmpdir: + controls = _param_controls_from_text(json.dumps(payload), "lammps", tmpdir) + + self.assertEqual(controls["structures_value"], ["RSS_HEA/conf_*"]) + self.assertEqual(controls["relax_value"], ["relax"]) + self.assertEqual( + [item["value"] for item in controls["property_options"]], + ["eos", "elastic", "phonon"], + ) + self.assertEqual(controls["property_value"], ["eos", "phonon"]) + self.assertEqual(controls["interaction_type"], "deepmd") + self.assertEqual(controls["interaction_model"], "frozen_model.pb, other.pb") + + def test_save_uploaded_files_creates_confs_and_nested_paths(self): + payload = base64.b64encode(b"POSCAR\n").decode("ascii") + with tempfile.TemporaryDirectory() as tmpdir: + saved = _save_uploaded_files( + [f"data:text/plain;base64,{payload}"], + ["std-bcc/POSCAR"], + tmpdir, + ) + self.assertEqual(saved, ["confs/std-bcc/POSCAR"]) + with open(os.path.join(tmpdir, "confs", "std-bcc", "POSCAR"), "rb") as f: + self.assertEqual(f.read(), b"POSCAR\n") + + def test_save_uploaded_files_rejects_path_filenames(self): + payload = base64.b64encode(b"bad").decode("ascii") + with tempfile.TemporaryDirectory() as tmpdir: + with self.assertRaises(ValueError): + _save_uploaded_files(f"data:text/plain;base64,{payload}", "../bad.txt", tmpdir) + + def test_save_uploaded_files_extracts_zip_folder(self): + stream = io.BytesIO() + with zipfile.ZipFile(stream, mode="w") as zf: + zf.writestr("my-folder/POSCAR", "POSCAR\n") + zf.writestr("my-folder/sub/INPUT", "INPUT\n") + payload = base64.b64encode(stream.getvalue()).decode("ascii") + + with tempfile.TemporaryDirectory() as tmpdir: + saved = _save_uploaded_files( + [f"data:application/zip;base64,{payload}"], + ["my-folder.zip"], + tmpdir, + ) + self.assertIn("confs/my-folder/POSCAR", saved) + self.assertIn("confs/my-folder/sub/INPUT", saved) + with open(os.path.join(tmpdir, "confs", "my-folder", "POSCAR"), "rb") as f: + self.assertEqual(f.read(), b"POSCAR\n") + + def test_save_uploaded_files_rejects_unsafe_zip_member(self): + stream = io.BytesIO() + with zipfile.ZipFile(stream, mode="w") as zf: + zf.writestr("../escape.txt", "bad") + payload = base64.b64encode(stream.getvalue()).decode("ascii") + + with tempfile.TemporaryDirectory() as tmpdir: + with self.assertRaises(ValueError): + _save_uploaded_files( + [f"data:application/zip;base64,{payload}"], + ["bad.zip"], + tmpdir, + ) + + def test_summarize_step_progress(self): + steps = [ + {"type": "Pod", "phase": "Pending"}, + {"type": "Pod", "phase": "Running"}, + {"type": "Pod", "phase": "Succeeded"}, + {"type": "Pod", "phase": "Skipped"}, + {"type": "StepGroup", "phase": "Running"}, + ] + summary = _summarize_step_progress(steps) + self.assertEqual(summary["total"], 4) + self.assertEqual(summary["running"], 2) + self.assertEqual(summary["finished"], 2) + + def test_workflow_progress_percent_from_argo_progress(self): + self.assertEqual(_workflow_progress_percent("850/1942"), 44) + self.assertEqual(_workflow_progress_percent("Progress: 1 / 4"), 25) + self.assertEqual(_workflow_progress_percent(""), 0) + + def test_summarize_conf_progress_groups_property_tasks_by_conf(self): + steps = [ + { + "key": "relaxcal-rss-hea-conf-001", + "phase": "Succeeded", + "inputs": {"parameters": {"flow_id": {"value": "RSS_HEA/conf_001"}}}, + }, + { + "key": "propertycal-rss-hea-conf-001-eos-00", + "phase": "Succeeded", + "inputs": { + "parameters": { + "path_to_prop": {"value": "RSS_HEA/conf_001/eos_00"}, + } + }, + }, + { + "key": "relaxcal-rss-hea-conf-002", + "phase": "Succeeded", + "inputs": {"parameters": {"flow_id": {"value": "RSS_HEA/conf_002"}}}, + }, + { + "key": "propertycal-rss-hea-conf-002-eos-00", + "phase": "Running", + "inputs": { + "parameters": { + "path_to_prop": {"value": "RSS_HEA/conf_002/eos_00"}, + } + }, + }, + ] + + summary = _summarize_conf_progress(steps) + + self.assertEqual(summary["conf_total"], 2) + self.assertEqual(summary["conf_finished"], 1) + self.assertEqual(summary["conf_running"], 1) + self.assertEqual(summary["conf_failed"], 0) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_lammps.py b/tests/test_lammps.py index 16a76ae9..abd9d856 100644 --- a/tests/test_lammps.py +++ b/tests/test_lammps.py @@ -10,6 +10,7 @@ from monty.serialization import dumpfn, loadfn from apex.core.calculator.Lammps import Lammps +from apex.core.calculator.lib import lammps_utils from apex.core.calculator.lib.lammps_utils import inter_deepmd #from .context import make_kspacing_kpoints, setUpModule @@ -57,6 +58,15 @@ def setUp(self): self.inter_param, os.path.join(self.source_path, "Al-fcc.vasp") ) + def _make_lammps_eval_input(self): + self.Lammps.set_model_param() + return lammps_utils.make_lammps_eval( + "conf.lmp", + self.Lammps.type_map, + self.Lammps.inter_func, + self.Lammps.model_param, + ) + def tearDown(self): if os.path.exists("confs/std-fcc/relaxation"): shutil.rmtree("confs/std-fcc/relaxation") @@ -96,11 +106,25 @@ def test_make_input_file(self): self.assertTrue(os.path.isfile(os.path.join(abs_equi_path, "conf.lmp"))) self.assertTrue(os.path.islink(os.path.join(abs_equi_path, "in.lammps"))) self.assertTrue(os.path.isfile(os.path.join(abs_equi_path, "task.json"))) + with open(os.path.join(abs_equi_path, "in.lammps"), "r") as fp: + contents = fp.read() + self.assertIn("variable N equal count(all)", contents) + self.assertNotIn("variable N equal step", contents) + def test_forward_common_files(self): fc_files = ["in.lammps", "frozen_model.pb"] self.assertEqual(self.Lammps.forward_common_files(), fc_files) def test_backward_files(self): - backward_files = ["log.lammps", "outlog", "dump.relax"] + backward_files = [ + "log.lammps", + "outlog", + "apex_task_status.json", + ".debug.log", + ".debug.stdout", + ".debug.stderr", + "dump.relax", + ] self.assertEqual(self.Lammps.backward_files(), backward_files) + diff --git a/tests/test_lammps_utils.py b/tests/test_lammps_utils.py new file mode 100644 index 00000000..5df8d4de --- /dev/null +++ b/tests/test_lammps_utils.py @@ -0,0 +1,559 @@ +import json +import tempfile +import unittest +from pathlib import Path + +import pytest + +from apex.core.calculator.lib import lammps_utils + + +TYPE_MAP = {"Al": 0} +PARAM = {"type": "deepmd"} + + +def dummy_interaction(param): + return "pair_style dummy\npair_coeff * * dummy Al\n" + + +def assert_common_lammps_setup(script): + assert script.startswith("clear\n") + assert "units" in script + assert "dimension" in script + assert "boundary" in script + assert "atom_style" in script + assert "box tilt large" in script + assert "read_data conf.lmp" in script + assert "mass 1 26.982" in script + assert "neigh_modify every 1 delay 0 check no" in script + assert "pair_style dummy" in script + assert "pair_coeff * * dummy Al" in script + assert "compute mype all pe" in script + assert "thermo_style custom step pe pxx pyy pzz pxy pxz pyz lx ly lz vol c_mype" in script + assert "variable N equal count(all)" in script + assert 'variable E equal "c_mype"' in script + assert "variable Epa equal ${E}/${N}" in script + assert 'print "All done"' in script + assert 'print "Final Stress (xx yy zz xy xz yz) = ${Pxx} ${Pyy} ${Pzz} ${Pxy} ${Pxz} ${Pyz}"' in script + + +def test_element_list_orders_by_lammps_type_id(): + assert lammps_utils.element_list({"O": 1, "Al": 0, "Ti": 2}) == [ + "Al", + "O", + "Ti", + ] + + +def test_make_lammps_eval_static_input_generation(): + script = lammps_utils.make_lammps_eval( + "conf.lmp", TYPE_MAP, dummy_interaction, PARAM + ) + + assert_common_lammps_setup(script) + assert "dump 1 all custom 100 dump.relax id type xs ys zs fx fy fz" in script + assert "run 0" in script + assert "minimize" not in script + assert "fix 1 all box/relax" not in script + assert "variable AA equal (${tmplx}*${tmply})" in script + assert 'print "Final Base area = ${AA}"' in script + + +def test_make_lammps_eval_mace_adds_atom_map_and_newton(): + script = lammps_utils.make_lammps_eval( + "conf.lmp", TYPE_MAP, dummy_interaction, {"type": "mace"} + ) + + assert "atom_modify map yes" in script + assert "newton on" in script + + +@pytest.mark.parametrize( + "builder", + [ + lambda: lammps_utils.make_lammps_equi( + "conf.lmp", TYPE_MAP, dummy_interaction, {"type": "mace"} + ), + lambda: lammps_utils.make_lammps_elastic( + "conf.lmp", TYPE_MAP, dummy_interaction, {"type": "mace"} + ), + lambda: lammps_utils.make_lammps_press_relax( + "conf.lmp", TYPE_MAP, 0.95, dummy_interaction, {"type": "mace"} + ), + ], +) +def test_standard_lammps_builders_mace_add_atom_map_and_newton(builder): + script = builder() + + assert "atom_modify map yes" in script + assert "newton on" in script + + +def test_make_lammps_equi_relaxation_default_change_box(): + script = lammps_utils.make_lammps_equi( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + PARAM, + etol=1e-6, + ftol=1e-8, + maxiter=12, + maxeval=34, + ) + + assert_common_lammps_setup(script) + assert "dump 1 all custom 100 dump.relax id type xs ys zs fx fy fz" in script + assert "min_style cg" in script + assert "fix 1 all box/relax iso 0.0" in script + assert "fix 1 all box/relax aniso 0.0" in script + assert "fix 1 all box/relax tri 0.0" in script + assert script.count("minimize 1.000000e-06 1.000000e-08 12 34") == 3 + assert 'print "Final Base area = ${AA}"' in script + + +def test_make_lammps_equi_without_box_relax_for_fixed_cell_property(): + script = lammps_utils.make_lammps_equi( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + PARAM, + etol=0, + ftol=1e-10, + maxiter=5, + maxeval=6, + change_box=False, + ) + + assert_common_lammps_setup(script) + assert "fix 1 all box/relax" not in script + assert script.count("minimize 0.000000e+00 1.000000e-10 5 6") == 1 + + +def test_make_lammps_equi_new_deepmd_relaxation_uses_large_dump_step(): + script = lammps_utils.make_lammps_equi( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + {"type": "deepmd", "deepmd_version": "2.1.5"}, + prop_type="relaxation", + ) + + assert "dump 1 all custom 100000 dump.relax id type xs ys zs fx fy fz" in script + + +def test_make_lammps_equi_new_deepmd_property_detour_skips_middle_minimizations(): + script = lammps_utils.make_lammps_equi( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + {"type": "deepmd", "deepmd_version": "2.1.5"}, + etol=0, + ftol=1e-10, + maxiter=5, + maxeval=6, + prop_type="elastic", + ) + + assert "fix 1 all box/relax iso 0.0" in script + assert "fix 1 all box/relax aniso 0.0" not in script + assert "fix 1 all box/relax tri 0.0" not in script + assert script.count("minimize 0.000000e+00 1.000000e-10 5 6") == 1 + + +def test_make_lammps_elastic_input_generation(): + script = lammps_utils.make_lammps_elastic( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + PARAM, + etol=1e-7, + ftol=1e-9, + maxiter=11, + maxeval=22, + ) + + assert_common_lammps_setup(script) + assert "dump 1 all custom 100 dump.relax id type xs ys zs fx fy fz" in script + assert "min_style cg" in script + assert "minimize 1.000000e-07 1.000000e-09 11 22" in script + assert "variable AA equal" not in script + assert "Final Base area" not in script + + +def test_make_lammps_press_relax_eos_input_generation(): + script = lammps_utils.make_lammps_press_relax( + "conf.lmp", + TYPE_MAP, + 0.95, + dummy_interaction, + PARAM, + B0=80, + bp=4, + etol=1e-7, + ftol=1e-9, + maxiter=11, + maxeval=22, + ) + + assert "clear\n" in script + assert "variable GPa2bar" in script + assert "variable B0\t\tequal 80.000000" in script + assert "variable bp\t\tequal 4.000000" in script + assert "variable\t xx\t\tequal 0.950000" in script + assert "variable Px\t\tequal ${Px0}*${GPa2bar}" in script + assert "read_data conf.lmp" in script + assert "pair_style dummy" in script + assert "fix 1 all box/relax iso ${Px}" in script + assert "fix 1 all box/relax aniso ${Px}" in script + assert script.count("minimize 1.000000e-07 1.000000e-09 11 22") == 2 + assert 'print "Relax at Press = ${Px} Bar"' in script + assert 'print "Final energy per atoms = ${Epa} eV"' in script + + +def make_finite_t_elastic_input(tmp_path, role): + with open(tmp_path / "FiniteTelastic.json", "w") as fp: + json.dump({"role": role}, fp) + return lammps_utils.make_lammps_FiniteTelastic( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + PARAM, + tmp_path, + ) + + +def test_make_lammps_finite_t_latt_default_cal_setting(): + script = lammps_utils.make_lammps_FiniteTlatt( + "conf.lmp", TYPE_MAP, dummy_interaction, PARAM + ) + + assert "include variable_FiniteTlatt.in" in script + assert "read_data conf.lmp" in script + assert "replicate ${nx} ${ny} ${nz}" in script + assert "pair_style dummy" in script + assert ( + "velocity all create ${temperature} 12345 mom yes rot yes dist gaussian" + in script + ) + assert ( + "fix 1 all npt temp ${temperature} ${temperature} ${tdamp} " + "aniso 0.0 0.0 ${pdamp}" + ) in script + assert "dump 1 all custom 100 dump.relax id type xs ys zs fx fy fz" in script + assert ( + "fix 2 all ave/time ${N_every} ${N_repeat} ${N_freq} v_lx v_ly v_lz " + "ave running file average_box.txt" + ) in script + assert "run ${equi_step}" in script + assert "run ${ave_step}" in script + assert 'print "Final Length (box_x box_y box_z) = ${lx} ${ly} ${lz}"' in script + + +def test_make_lammps_finite_t_latt_adiabatic_ensemble(): + script = lammps_utils.make_lammps_FiniteTlatt( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + PARAM, + {"ensemble": "adiabatic"}, + ) + + assert "fix 1 all nph aniso 1.0 1.0 ${pdamp} drag 1.0" in script + assert "fix 1 all npt temp" not in script + assert "fix 5 all langevin" not in script + + +def test_make_lammps_finite_t_latt_langevin_thermostat(): + script = lammps_utils.make_lammps_FiniteTlatt( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + PARAM, + {"thermostat": "langevin"}, + ) + + assert "fix 1 all nph aniso 1.0 1.0 ${pdamp} drag 1.0" in script + assert "fix 5 all langevin ${temperature} ${temperature} ${tdamp} 12345" in script + assert "fix 1 all npt temp" not in script + + +def test_make_lammps_finite_t_latt_custom_settings(): + script = lammps_utils.make_lammps_FiniteTlatt( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + PARAM, + { + "dump_step": 250, + "tdamp": "0.25", + "pdamp": "2.5", + "velocity_seed": 98765, + }, + ) + + assert ( + "velocity all create ${temperature} 98765 mom yes rot yes dist gaussian" + in script + ) + assert ( + "fix 1 all npt temp ${temperature} ${temperature} 0.25 " + "aniso 0.0 0.0 2.5" + ) in script + assert "dump 1 all custom 250 dump.relax id type xs ys zs fx fy fz" in script + + +def test_make_lammps_finite_t_elastic_equi_role(tmp_path): + script = make_finite_t_elastic_input(tmp_path, "equi") + + assert "clear\ninclude variable_FiniteTelastic.in" in script + assert "read_data conf.lmp" in script + assert "replicate ${nx} ${ny} ${nz}" in script + assert "pair_style dummy" in script + assert "velocity all create ${temperature} ${seed} mom yes rot yes dist gaussian" in script + assert "include output_FiniteTelastic.in" in script + assert ( + "fix 1 all npt temp ${temperature} ${temperature} ${tdamp} " + "aniso 0.0 0.0 ${pdamp}" + ) in script + assert "run ${equi_step}" in script + assert "write_restart ${equi_restart}" in script + assert "read_restart ${restart_source}" not in script + assert "include deform_FiniteTelastic.in" not in script + assert "run ${response_step}" not in script + + +def test_make_lammps_finite_t_elastic_mace_setup(tmp_path): + with open(tmp_path / "FiniteTelastic.json", "w") as fp: + json.dump({"role": "reference"}, fp) + + script = lammps_utils.make_lammps_FiniteTelastic( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + {"type": "mace"}, + tmp_path, + ) + + assert script.count("atom_modify map yes") == 2 + assert script.count("newton on") == 2 + + +@pytest.mark.parametrize("role", ["reference", "strained"]) +def test_make_lammps_finite_t_elastic_response_roles(tmp_path, role): + script = make_finite_t_elastic_input(tmp_path, role) + + assert script.count("clear\ninclude variable_FiniteTelastic.in") == 2 + assert "read_data conf.lmp" in script + assert "read_restart ${restart_source}" in script + assert "write_restart ${equi_restart}" in script + assert "change_box all triclinic" in script + assert "include deform_FiniteTelastic.in" in script + assert "include output_FiniteTelastic.in" in script + assert "fix 1 all nve" in script + assert ( + "fix 2 all langevin ${temperature} ${temperature} ${tdamp} " + "${seed} zero yes" + ) in script + assert "run ${equi_step}" in script + assert "run ${response_step}" in script + assert script.count("pair_style dummy") == 2 + + +def test_make_lammps_finite_t_elastic_invalid_role_raises(tmp_path): + with open(tmp_path / "FiniteTelastic.json", "w") as fp: + json.dump({"role": "bad-role"}, fp) + + with pytest.raises(RuntimeError, match="unsupported FiniteTelastic role bad-role"): + lammps_utils.make_lammps_FiniteTelastic( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + PARAM, + tmp_path, + ) + + +def make_annealing_input(cal_setting): + defaults = { + "dump_step": 500, + "tdamp": "tdamp_var", + "pdamp": "pdamp_var", + "velocity_seed": 24680, + } + defaults.update(cal_setting) + return lammps_utils.make_lammps_annealing( + "conf.lmp", + TYPE_MAP, + dummy_interaction, + PARAM, + defaults, + ) + + +def assert_common_annealing_script(script): + assert "include variable_Annealing.in" in script + assert "read_data conf.lmp" in script + assert "replicate ${nx} ${ny} ${nz}" in script + assert "pair_style dummy" in script + assert "compute myRDF all rdf ${rdf_bins} cutoff ${rdf_cutoff}" in script + assert "run ${equi_step}" in script + assert "run ${ramp_step}" in script + assert "run ${cool_step}" in script + assert ( + 'if "${hold_step} > 0" then "fix 1 all nvt temp ${target_temp} ' + '${target_temp} tdamp_var" "run ${hold_step}" "unfix 1"' + ) in script + assert "dump 1 all custom 500 dump.anneal_ramp id type xs ys zs fx fy fz" in script + assert "dump 2 all custom 500 dump.anneal_cool id type xs ys zs fx fy fz" in script + assert ( + "fix rdf_ramp all ave/time ${rdf_interval} 1 ${rdf_interval} c_myRDF[*] " + "file rdf_ramp.dat mode vector" + ) in script + assert ( + "fix rdf_cool all ave/time ${rdf_interval} 1 ${rdf_interval} c_myRDF[*] " + "file rdf_cool.dat mode vector" + ) in script + assert "file heating_interval.dat" in script + assert "file cooling_interval.dat" in script + assert 'print "All done"' in script + + +def test_make_lammps_annealing_default_nose_hoover_npt(): + script = make_annealing_input({}) + + assert_common_annealing_script(script) + assert "velocity all create ${start_temp} 24680 mom yes rot yes dist gaussian" in script + assert ( + "fix 1 all npt temp ${start_temp} ${start_temp} tdamp_var " + "x 0.0 0.0 pdamp_var y 0.0 0.0 pdamp_var z 0.0 0.0 pdamp_var" + ) in script + assert ( + "fix 1 all npt temp ${start_temp} ${target_temp} tdamp_var " + "x 0.0 0.0 pdamp_var y 0.0 0.0 pdamp_var z 0.0 0.0 pdamp_var" + ) in script + assert ( + "fix 1 all npt temp ${target_temp} ${end_temp} tdamp_var " + "x 0.0 0.0 pdamp_var y 0.0 0.0 pdamp_var z 0.0 0.0 pdamp_var" + ) in script + assert "fix tg all langevin" not in script + + +def test_make_lammps_annealing_nose_hoover_nvt(): + script = make_annealing_input({"ensemble": "nvt"}) + + assert_common_annealing_script(script) + assert "fix 1 all nvt temp ${start_temp} ${start_temp} tdamp_var" in script + assert "fix 1 all nvt temp ${start_temp} ${target_temp} tdamp_var" in script + assert "fix 1 all nvt temp ${target_temp} ${end_temp} tdamp_var" in script + assert "fix 1 all npt temp" not in script + assert "fix tg all langevin" not in script + + +def test_make_lammps_annealing_langevin_nph(): + script = make_annealing_input({"thermostat": "langevin", "ensemble": "nph"}) + + assert_common_annealing_script(script) + assert script.count("fix 1 all nph aniso 0.0 0.0 pdamp_var drag 1.0") == 3 + assert "fix tg all langevin ${start_temp} ${start_temp} tdamp_var 24680" in script + assert "fix tg all langevin ${start_temp} ${target_temp} tdamp_var 24680" in script + assert "fix tg all langevin ${target_temp} ${end_temp} tdamp_var 24680" in script + assert script.count("unfix tg") == 3 + assert "fix 1 all npt temp" not in script + + +def test_make_lammps_annealing_langevin_nve(): + script = make_annealing_input({"thermostat": "langevin", "ensemble": "nve"}) + + assert_common_annealing_script(script) + assert script.count("fix 1 all nve") == 3 + assert "fix 1 all nph" not in script + assert "fix tg all langevin ${start_temp} ${start_temp} tdamp_var 24680" in script + assert "fix tg all langevin ${start_temp} ${target_temp} tdamp_var 24680" in script + assert "fix tg all langevin ${target_temp} ${end_temp} tdamp_var 24680" in script + assert script.count("unfix tg") == 3 + + +class TestLammpsUtils(unittest.TestCase): + def test_element_list_orders_by_lammps_type_id(self): + test_element_list_orders_by_lammps_type_id() + + def test_make_lammps_eval_static_input_generation(self): + test_make_lammps_eval_static_input_generation() + + def test_make_lammps_eval_mace_adds_atom_map_and_newton(self): + test_make_lammps_eval_mace_adds_atom_map_and_newton() + + def test_standard_lammps_builders_mace_add_atom_map_and_newton(self): + builders = [ + lambda: lammps_utils.make_lammps_equi( + "conf.lmp", TYPE_MAP, dummy_interaction, {"type": "mace"} + ), + lambda: lammps_utils.make_lammps_elastic( + "conf.lmp", TYPE_MAP, dummy_interaction, {"type": "mace"} + ), + lambda: lammps_utils.make_lammps_press_relax( + "conf.lmp", TYPE_MAP, 0.95, dummy_interaction, {"type": "mace"} + ), + ] + for builder in builders: + with self.subTest(builder=builder): + test_standard_lammps_builders_mace_add_atom_map_and_newton(builder) + + def test_make_lammps_equi_relaxation_default_change_box(self): + test_make_lammps_equi_relaxation_default_change_box() + + def test_make_lammps_equi_without_box_relax_for_fixed_cell_property(self): + test_make_lammps_equi_without_box_relax_for_fixed_cell_property() + + def test_make_lammps_equi_new_deepmd_relaxation_uses_large_dump_step(self): + test_make_lammps_equi_new_deepmd_relaxation_uses_large_dump_step() + + def test_make_lammps_equi_new_deepmd_property_detour_skips_middle_minimizations(self): + test_make_lammps_equi_new_deepmd_property_detour_skips_middle_minimizations() + + def test_make_lammps_elastic_input_generation(self): + test_make_lammps_elastic_input_generation() + + def test_make_lammps_press_relax_eos_input_generation(self): + test_make_lammps_press_relax_eos_input_generation() + + def test_make_lammps_finite_t_latt_default_cal_setting(self): + test_make_lammps_finite_t_latt_default_cal_setting() + + def test_make_lammps_finite_t_latt_adiabatic_ensemble(self): + test_make_lammps_finite_t_latt_adiabatic_ensemble() + + def test_make_lammps_finite_t_latt_langevin_thermostat(self): + test_make_lammps_finite_t_latt_langevin_thermostat() + + def test_make_lammps_finite_t_latt_custom_settings(self): + test_make_lammps_finite_t_latt_custom_settings() + + def test_make_lammps_finite_t_elastic_equi_role(self): + with tempfile.TemporaryDirectory() as tmp: + test_make_lammps_finite_t_elastic_equi_role(Path(tmp)) + + def test_make_lammps_finite_t_elastic_mace_setup(self): + with tempfile.TemporaryDirectory() as tmp: + test_make_lammps_finite_t_elastic_mace_setup(Path(tmp)) + + def test_make_lammps_finite_t_elastic_response_roles(self): + for role in ["reference", "strained"]: + with self.subTest(role=role), tempfile.TemporaryDirectory() as tmp: + test_make_lammps_finite_t_elastic_response_roles(Path(tmp), role) + + def test_make_lammps_finite_t_elastic_invalid_role_raises(self): + with tempfile.TemporaryDirectory() as tmp: + test_make_lammps_finite_t_elastic_invalid_role_raises(Path(tmp)) + + def test_make_lammps_annealing_default_nose_hoover_npt(self): + test_make_lammps_annealing_default_nose_hoover_npt() + + def test_make_lammps_annealing_nose_hoover_nvt(self): + test_make_lammps_annealing_nose_hoover_nvt() + + def test_make_lammps_annealing_langevin_nph(self): + test_make_lammps_annealing_langevin_nph() + + def test_make_lammps_annealing_langevin_nve(self): + test_make_lammps_annealing_langevin_nve() diff --git a/tests/test_main_workflow_errors.py b/tests/test_main_workflow_errors.py new file mode 100644 index 00000000..f1e568c4 --- /dev/null +++ b/tests/test_main_workflow_errors.py @@ -0,0 +1,305 @@ +import os +import tempfile +import unittest +from unittest import mock + +from apex import main as apex_main + + +class FakeNotFoundError(Exception): + status = 404 + + def __str__(self): + return ( + "(404)\n" + "Reason: Not Found\n" + 'HTTP response body: {"code": "10001", ' + '"msg": "archived workflow guipro-joint-svgzz not found"}' + ) + + +class FakeWorkflow: + def query_keys_of_steps(self): + raise FakeNotFoundError() + + +class FakeWorkflowInfo: + id = "wf-name" + uid = "wf-uid" + + class Status: + phase = "Succeeded" + progress = "1/1" + startedAt = "2026-01-01T00:00:00Z" + finishedAt = "2026-01-01T00:10:00Z" + + class Metadata: + creationTimestamp = "2026-01-01T00:00:00Z" + + status = Status() + metadata = Metadata() + + def get_duration(self): + import datetime + return datetime.timedelta(seconds=600) + + def get_step(self, *args, **kwargs): + return [] + + +class FakeStepInfo: + def get_step(self, parent_id=None, sort_by_generation=False, key=None): + return [] + + +class WorkflowQueryErrorTest(unittest.TestCase): + def test_retrieve_key_filter_includes_joint_relax_tasks(self): + self.assertTrue(apex_main._is_retrievable_result_step_key("relaxcal-rss-hea-conf-001")) + self.assertTrue(apex_main._is_retrievable_result_step_key("propertycal-rss-hea-conf-001-eos-00")) + self.assertTrue(apex_main._is_retrievable_result_step_key("relaxationcal")) + self.assertFalse(apex_main._is_retrievable_result_step_key("relaxmake-rss-hea-conf-001")) + + def test_failure_artifact_retrieval_requires_debug_mode(self): + old_mode = apex_main.config.get("mode") + try: + apex_main.config["mode"] = "default" + self.assertFalse(apex_main._should_retrieve_failure_artifacts(False)) + self.assertTrue(apex_main._should_retrieve_failure_artifacts(True)) + apex_main.config["mode"] = "debug" + self.assertTrue(apex_main._should_retrieve_failure_artifacts(False)) + finally: + apex_main.config["mode"] = old_mode + + def test_formats_dflow_workflow_not_found_error(self): + message = apex_main._format_workflow_query_error( + "guipro-joint-svgzz", + FakeNotFoundError(), + ) + + self.assertIn("Workflow 'guipro-joint-svgzz' was not found", message) + self.assertIn(".workflow.log", message) + self.assertIn("-c config file", message) + + def test_query_keys_exits_without_raw_traceback_for_missing_workflow(self): + with self.assertRaises(SystemExit) as context: + apex_main._query_keys_of_steps_or_exit( + FakeWorkflow(), + "guipro-joint-svgzz", + ) + + self.assertIn( + "Workflow 'guipro-joint-svgzz' was not found", + str(context.exception), + ) + + def test_resolve_workflow_reference_reads_uid_from_latest_record(self): + with tempfile.TemporaryDirectory() as tmpdir: + with open(os.path.join(tmpdir, ".workflow.log"), "w", encoding="utf-8") as fp: + fp.write("wf-old\tsubmit\t2026-01-01T00:00:00\t/tmp/old\n") + fp.write("wf-new\tsubmit\t2026-01-01T00:00:01\t/tmp/new\twf-uid-new\n") + + workflow_id, workflow_uid = apex_main._resolve_workflow_reference(tmpdir) + + self.assertEqual(workflow_id, "wf-new") + self.assertEqual(workflow_uid, "wf-uid-new") + + def test_resolve_workflow_reference_matches_explicit_name_to_uid(self): + with tempfile.TemporaryDirectory() as tmpdir: + with open(os.path.join(tmpdir, ".workflow.log"), "w", encoding="utf-8") as fp: + fp.write("wf-name\tsubmit\t2026-01-01T00:00:01\t/tmp/work\twf-uid\n") + + workflow_id, workflow_uid = apex_main._resolve_workflow_reference( + tmpdir, + workflow_id="wf-name", + ) + + self.assertEqual(workflow_id, "wf-name") + self.assertEqual(workflow_uid, "wf-uid") + + def test_run_with_workflow_fallback_retries_by_uid_after_name_404(self): + workflow_calls = [] + + class FallbackWorkflow: + def __init__(self, id=None, uid=None): + self.id = id + self.uid = uid + + def query(self): + workflow_calls.append((self.id, self.uid)) + if self.uid == "wf-uid": + return FakeWorkflowInfo() + raise FakeNotFoundError() + + with mock.patch("apex.main.Workflow", FallbackWorkflow): + info = apex_main._run_with_workflow_fallback( + "wf-name", + "wf-uid", + lambda wf, _wf_ref, _used_uid: wf.query(), + ) + + self.assertEqual(info.uid, "wf-uid") + self.assertEqual(workflow_calls, [("wf-name", None), (None, "wf-uid")]) + + def test_resolve_cli_workflow_reference_treats_explicit_uuid_as_uid(self): + with tempfile.TemporaryDirectory() as tmpdir: + workflow_id, workflow_uid = apex_main._resolve_cli_workflow_reference( + tmpdir, + workflow_id="cd8239f4-100f-4048-8284-bf53b7e39450", + ) + + self.assertEqual(workflow_id, "") + self.assertEqual(workflow_uid, "cd8239f4-100f-4048-8284-bf53b7e39450") + + def test_resolve_cli_workflow_reference_prefers_explicit_uuid_with_log(self): + with tempfile.TemporaryDirectory() as tmpdir: + with open(os.path.join(tmpdir, ".workflow.log"), "w", encoding="utf-8") as fp: + fp.write( + "wf-name\tsubmit\t2026-01-01T00:00:01\t/tmp/work\t" + "cd8239f4-100f-4048-8284-bf53b7e39450\n" + ) + + workflow_id, workflow_uid = apex_main._resolve_cli_workflow_reference( + tmpdir, + workflow_id="cd8239f4-100f-4048-8284-bf53b7e39450", + ) + + self.assertEqual(workflow_id, "") + self.assertEqual(workflow_uid, "cd8239f4-100f-4048-8284-bf53b7e39450") + + def test_run_with_workflow_fallback_supports_uid_only_lookup(self): + workflow_calls = [] + + class UidOnlyWorkflow: + def __init__(self, id=None, uid=None): + self.id = id + self.uid = uid + + def query(self): + workflow_calls.append((self.id, self.uid)) + return FakeWorkflowInfo() + + with mock.patch("apex.main.Workflow", UidOnlyWorkflow): + info = apex_main._run_with_workflow_fallback( + "", + "cd8239f4-100f-4048-8284-bf53b7e39450", + lambda wf, _wf_ref, _used_uid: wf.query(), + ) + + self.assertEqual(info.uid, "wf-uid") + self.assertEqual(workflow_calls, [(None, "cd8239f4-100f-4048-8284-bf53b7e39450")]) + + def test_download_artifact_does_not_retry_missing_storage_artifact(self): + with mock.patch( + "apex.main.download_artifact", + side_effect=RuntimeError("The artifact does not exist in the storage"), + ) as mocked_download, mock.patch("apex.main.time.sleep") as mocked_sleep: + with self.assertRaises(RuntimeError) as context: + apex_main._download_artifact_with_retry( + artifact="remote-artifact", + path="/tmp/out", + retries=3, + delay=1, + ) + + self.assertIn("without retry", str(context.exception)) + mocked_download.assert_called_once() + mocked_sleep.assert_not_called() + + def test_download_artifact_retries_transient_network_error(self): + with mock.patch( + "apex.main.download_artifact", + side_effect=[RuntimeError("connection broken"), "downloaded"], + ) as mocked_download, mock.patch("apex.main.time.sleep") as mocked_sleep: + result = apex_main._download_artifact_with_retry( + artifact="remote-artifact", + path="/tmp/out", + retries=2, + delay=1, + ) + + self.assertEqual(result, "downloaded") + self.assertEqual(mocked_download.call_count, 2) + mocked_sleep.assert_called_once_with(1) + + def test_retrieve_existing_result_dir_detects_relaxation_output(self): + with tempfile.TemporaryDirectory() as tmpdir: + result_dir = os.path.join(tmpdir, "RSS_HEA", "conf_001", "relaxation") + os.makedirs(result_dir) + with open(os.path.join(result_dir, "result.json"), "w", encoding="utf-8") as fp: + fp.write("{}") + step = { + "inputs": { + "parameters": { + "flow_id": {"value": "RSS_HEA/conf_001"}, + } + } + } + + self.assertEqual( + apex_main._retrieve_existing_result_dir( + step, + "relaxcal-rss-hea-conf-001", + tmpdir, + ), + result_dir, + ) + + def test_retrieve_existing_result_dir_detects_property_output(self): + with tempfile.TemporaryDirectory() as tmpdir: + result_dir = os.path.join(tmpdir, "RSS_HEA", "conf_001", "eos_00") + os.makedirs(result_dir) + with open(os.path.join(result_dir, "result.json"), "w", encoding="utf-8") as fp: + fp.write("{}") + step = { + "inputs": { + "parameters": { + "path_to_prop": {"value": "RSS_HEA/conf_001/eos_00"}, + } + } + } + + self.assertEqual( + apex_main._retrieve_existing_result_dir( + step, + "propertycal-rss-hea-conf-001-eos-00", + tmpdir, + ), + result_dir, + ) + + def test_download_failure_artifacts_skips_existing_target_dir(self): + with tempfile.TemporaryDirectory() as tmpdir: + target_dir = os.path.join( + tmpdir, + ".failed-artifacts", + "relaxcal-rss-hea-conf-001", + "Relaxmake", + "main-logs", + ) + os.makedirs(target_dir) + with open(os.path.join(target_dir, "main.log"), "w", encoding="utf-8") as fp: + fp.write("existing") + step = { + "id": "step-001", + "displayName": "Relaxmake", + "outputs": { + "artifacts": { + "main-logs": "remote-artifact", + } + }, + } + + with mock.patch("apex.main.download_artifact") as mocked_download: + downloaded = apex_main._download_failure_artifacts_for_step( + wf_info=FakeStepInfo(), + root_step=step, + key="relaxcal-rss-hea-conf-001", + work_dir=tmpdir, + ) + + self.assertEqual(downloaded, 0) + mocked_download.assert_not_called() + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_mfp_eosfit.py b/tests/test_mfp_eosfit.py new file mode 100644 index 00000000..c350a52b --- /dev/null +++ b/tests/test_mfp_eosfit.py @@ -0,0 +1,281 @@ +import tempfile +import unittest +from pathlib import Path + +import numpy as np +import pytest + +from apex.core.lib import mfp_eosfit + + +def test_eos_lists_include_expected_models(): + eos_names = mfp_eosfit.get_eos_list() + + assert "birch" in eos_names + assert "murnaghan" in eos_names + assert "BM5" in eos_names + assert "morse_6p" in eos_names + assert mfp_eosfit.__version__() == "1.2.5" + + +@pytest.mark.parametrize( + "model", + [ + mfp_eosfit.murnaghan, + mfp_eosfit.birch, + mfp_eosfit.BM4, + mfp_eosfit.rBM4, + mfp_eosfit.LOG4, + mfp_eosfit.rPT4, + mfp_eosfit.vinet, + mfp_eosfit.universal, + ], +) +def test_four_parameter_eos_models_equal_e0_at_v0(model): + pars = [-3.0, 0.5, 4.0, 10.0] + + assert model(10.0, pars) == pytest.approx(-3.0) + + +def test_birch_residual_is_zero_for_matching_data(): + pars = [-3.0, 0.5, 4.0, 10.0] + volumes = np.array([9.5, 10.0, 10.5]) + energies = mfp_eosfit.birch(volumes, pars) + + np.testing.assert_allclose(mfp_eosfit.res_birch(pars, energies, volumes), 0.0) + + +@pytest.mark.parametrize( + ("model", "residual"), + [ + (mfp_eosfit.murnaghan, mfp_eosfit.res_murnaghan), + (mfp_eosfit.mBM4, mfp_eosfit.res_mBM4), + (mfp_eosfit.BM4, mfp_eosfit.res_BM4), + (mfp_eosfit.rBM4, mfp_eosfit.res_rBM4), + (mfp_eosfit.universal, mfp_eosfit.res_universal), + (mfp_eosfit.LOG4, mfp_eosfit.res_LOG4), + (mfp_eosfit.rPT4, mfp_eosfit.res_rPT4), + (mfp_eosfit.vinet, mfp_eosfit.res_vinet), + (mfp_eosfit.Li4p, mfp_eosfit.res_Li4p), + ], +) +def test_four_parameter_residual_wrappers_zero_for_matching_data(model, residual): + pars = [-3.0, 0.5, 4.0, 10.0] + volumes = np.array([9.5, 10.0, 10.5]) + energies = model(volumes, pars) + + np.testing.assert_allclose(residual(pars, energies, volumes), 0.0) + + +@pytest.mark.parametrize( + "model", + [ + mfp_eosfit.mBM5, + mfp_eosfit.BM5, + mfp_eosfit.rBM5, + mfp_eosfit.LOG5, + mfp_eosfit.rPT5, + ], +) +def test_five_parameter_eos_models_equal_e0_at_v0(model): + pars = [-3.0, 0.5, 4.0, 10.0, 0.01] + + assert model(10.0, pars) == pytest.approx(-3.0) + + +def test_eos_property_calculators_return_expected_shapes(): + pars4 = [-3.0, 0.5, 4.0, 10.0] + pars5 = [-3.0, 0.5, 4.0, 10.0, 0.01] + + assert mfp_eosfit.calc_props_mBM4(pars4)[:4] == pars4 + assert mfp_eosfit.calc_props_BM4(pars4)[:4] == pars4 + assert mfp_eosfit.calc_props_LOG4(pars4)[:4] == pars4 + assert mfp_eosfit.calc_props_vinet(pars4)[:4] == pars4 + assert len(mfp_eosfit.calc_props_SJX_5p(pars5)) == 5 + + +@pytest.mark.parametrize( + ("model", "residual", "pars"), + [ + (mfp_eosfit.morse, mfp_eosfit.res_morse, [-3.0, 0.5, 4.0, 10.0]), + (mfp_eosfit.morse_AB, mfp_eosfit.res_morse_AB, [-3.0, 0.5, 1.0, 10.0]), + (mfp_eosfit.morse_3p, mfp_eosfit.res_morse_3p, [-3.0, 0.5, 10.0]), + (mfp_eosfit.mie, mfp_eosfit.res_mie, [-3.0, 0.5, 4.0, 10.0]), + (mfp_eosfit.mie_simple, mfp_eosfit.res_mie_simple, [-3.0, 0.5, 10.0, 2.0]), + ], +) +def test_other_eos_residual_wrappers_zero_for_matching_data(model, residual, pars): + volumes = np.array([9.5, 10.0, 10.5]) + energies = model(volumes, pars) + + np.testing.assert_allclose(residual(pars, energies, volumes), 0.0) + + +def test_read_ve_and_init_guess_from_data(tmp_path): + ve_file = tmp_path / "ve.dat" + ve_file.write_text("\n9.0 -2.9 extra\n10.0 -3.0\n11.0 -2.9\n") + + volumes, energies = mfp_eosfit.read_ve(str(ve_file)) + guess = mfp_eosfit.init_guess_from_data(volumes, energies) + + assert volumes == [9.0, 10.0, 11.0] + assert energies == [-2.9, -3.0, -2.9] + assert guess[0] == pytest.approx(-3.0) + assert guess[3] == pytest.approx(10.0) + + +def test_read_velp_and_vlp_parse_selected_ranges(tmp_path): + velp_file = tmp_path / "velp.dat" + velp_file.write_text( + "9.0 -2.9 1.0 2.0 3.0 90.0 91.0\n" + "10.0 -3.0 1.1 2.1 3.1 90.1 91.1\n" + "11.0 -2.9 1.2 2.2 3.2 90.2 91.2\n" + ) + vlp_file = tmp_path / "vlp.dat" + vlp_file.write_text( + "9.0 1.0 2.0 3.0 90.0 91.0\n" + "10.0 1.1 2.1 3.1 90.1 91.1\n" + "11.0 1.2 2.2 3.2 90.2 91.2\n" + ) + + vol, eng, cella, cellb, cellc, cellba, cellca = mfp_eosfit.read_velp( + str(velp_file), 2, 3 + ) + vlp_vol, vlp_a, vlp_b, vlp_c, vlp_ba, vlp_ca = mfp_eosfit.read_vlp( + str(vlp_file), 2, 3 + ) + + assert vol == [10.0, 11.0] + assert eng == [-3.0, -2.9] + assert cella == [1.1, 1.2] + assert cellb == [2.1, 2.2] + assert cellc == [3.1, 3.2] + assert cellba == [90.1, 90.2] + assert cellca == [91.1, 91.2] + assert vlp_vol == [9.0, 10.0, 11.0] + assert vlp_a == [1.0, 1.1, 1.2] + assert vlp_b == [2.0, 2.1, 2.2] + assert vlp_c == [3.0, 3.1, 3.2] + assert vlp_ba == [90.0, 90.1, 90.2] + assert vlp_ca == [91.0, 91.1, 91.2] + + +def test_fit_birch_murnaghan_free_and_fixed_bp_with_synthetic_data(): + true_pars = [-3.0, 0.4, 4.0, 10.0] + volumes = np.array([8.8, 9.2, 9.6, 10.0, 10.4, 10.8, 11.2]) + energies = mfp_eosfit.birch(volumes, true_pars) + + free_fit = mfp_eosfit.fit_birch_murnaghan(volumes[::-1], energies[::-1]) + fixed_fit = mfp_eosfit.fit_birch_murnaghan(volumes, energies, fixed_bp=4.0) + + assert free_fit["fit_variant"] == "free_bp" + assert free_fit["used_point_count"] == len(volumes) + assert free_fit["E0_eV"] == pytest.approx(true_pars[0], abs=1e-8) + assert free_fit["B0_eV_per_A3"] == pytest.approx(true_pars[1], rel=1e-7) + assert free_fit["B0_prime"] == pytest.approx(true_pars[2], rel=1e-7) + assert free_fit["V0_A3"] == pytest.approx(true_pars[3], rel=1e-8) + assert free_fit["K_T_GPa"] == pytest.approx(true_pars[1] * mfp_eosfit.eV2GPa) + assert free_fit["residual_sum_squares"] == pytest.approx(0.0, abs=1e-20) + + assert fixed_fit["fit_variant"] == "fixed_bp" + assert fixed_fit["fit_function"] == "birch_fixed_bp" + assert fixed_fit["B0_prime"] == 4.0 + assert fixed_fit["E0_eV"] == pytest.approx(true_pars[0], abs=1e-8) + assert fixed_fit["V0_A3"] == pytest.approx(true_pars[3], rel=1e-8) + + +def test_fit_birch_murnaghan_invalid_inputs_raise(): + with pytest.raises(ValueError, match="same shape"): + mfp_eosfit.fit_birch_murnaghan([1, 2, 3], [1, 2]) + + with pytest.raises(ValueError, match="at least 3"): + mfp_eosfit.fit_birch_murnaghan([1, 2], [1, 2], fixed_bp=4.0) + + with pytest.raises(ValueError, match="at least 4"): + mfp_eosfit.fit_birch_murnaghan([1, 2, 3], [1, 2, 3]) + + with pytest.raises(ValueError, match="positive"): + mfp_eosfit.fit_birch_murnaghan([0, 1, 2], [1, 2, 3], fixed_bp=4.0) + + with pytest.raises(ValueError, match="at least 3"): + mfp_eosfit.init_guess_from_data([1, 2], [1, 2]) + + +class TestMfpEosfitCoverage(unittest.TestCase): + def test_eos_lists_include_expected_models(self): + test_eos_lists_include_expected_models() + + def test_four_parameter_eos_models_equal_e0_at_v0(self): + for model in [ + mfp_eosfit.murnaghan, + mfp_eosfit.birch, + mfp_eosfit.BM4, + mfp_eosfit.rBM4, + mfp_eosfit.LOG4, + mfp_eosfit.rPT4, + mfp_eosfit.vinet, + mfp_eosfit.universal, + ]: + with self.subTest(model=model.__name__): + test_four_parameter_eos_models_equal_e0_at_v0(model) + + def test_birch_residual_is_zero_for_matching_data(self): + test_birch_residual_is_zero_for_matching_data() + + def test_four_parameter_residual_wrappers_zero_for_matching_data(self): + for model, residual in [ + (mfp_eosfit.murnaghan, mfp_eosfit.res_murnaghan), + (mfp_eosfit.mBM4, mfp_eosfit.res_mBM4), + (mfp_eosfit.BM4, mfp_eosfit.res_BM4), + (mfp_eosfit.rBM4, mfp_eosfit.res_rBM4), + (mfp_eosfit.universal, mfp_eosfit.res_universal), + (mfp_eosfit.LOG4, mfp_eosfit.res_LOG4), + (mfp_eosfit.rPT4, mfp_eosfit.res_rPT4), + (mfp_eosfit.vinet, mfp_eosfit.res_vinet), + (mfp_eosfit.Li4p, mfp_eosfit.res_Li4p), + ]: + with self.subTest(model=model.__name__): + test_four_parameter_residual_wrappers_zero_for_matching_data( + model, residual + ) + + def test_five_parameter_eos_models_equal_e0_at_v0(self): + for model in [ + mfp_eosfit.mBM5, + mfp_eosfit.BM5, + mfp_eosfit.rBM5, + mfp_eosfit.LOG5, + mfp_eosfit.rPT5, + ]: + with self.subTest(model=model.__name__): + test_five_parameter_eos_models_equal_e0_at_v0(model) + + def test_eos_property_calculators_return_expected_shapes(self): + test_eos_property_calculators_return_expected_shapes() + + def test_other_eos_residual_wrappers_zero_for_matching_data(self): + for model, residual, pars in [ + (mfp_eosfit.morse, mfp_eosfit.res_morse, [-3.0, 0.5, 4.0, 10.0]), + (mfp_eosfit.morse_AB, mfp_eosfit.res_morse_AB, [-3.0, 0.5, 1.0, 10.0]), + (mfp_eosfit.morse_3p, mfp_eosfit.res_morse_3p, [-3.0, 0.5, 10.0]), + (mfp_eosfit.mie, mfp_eosfit.res_mie, [-3.0, 0.5, 4.0, 10.0]), + (mfp_eosfit.mie_simple, mfp_eosfit.res_mie_simple, [-3.0, 0.5, 10.0, 2.0]), + ]: + with self.subTest(model=model.__name__): + test_other_eos_residual_wrappers_zero_for_matching_data( + model, residual, pars + ) + + def test_read_ve_and_init_guess_from_data(self): + with tempfile.TemporaryDirectory() as tmp: + test_read_ve_and_init_guess_from_data(Path(tmp)) + + def test_read_velp_and_vlp_parse_selected_ranges(self): + with tempfile.TemporaryDirectory() as tmp: + test_read_velp_and_vlp_parse_selected_ranges(Path(tmp)) + + def test_fit_birch_murnaghan_free_and_fixed_bp_with_synthetic_data(self): + test_fit_birch_murnaghan_free_and_fixed_bp_with_synthetic_data() + + def test_fit_birch_murnaghan_invalid_inputs_raise(self): + test_fit_birch_murnaghan_invalid_inputs_raise() diff --git a/tests/test_ops.py b/tests/test_ops.py index 917df34e..e0463e4a 100644 --- a/tests/test_ops.py +++ b/tests/test_ops.py @@ -3,6 +3,7 @@ import os import glob import shutil +import tempfile from pathlib import Path from dflow.python import ( OP, @@ -13,14 +14,129 @@ ) from monty.serialization import loadfn -from apex.op.relaxation_ops import RelaxMake -from apex.op.property_ops import PropsMake -from context import write_poscar +from apex.op.relaxation_ops import RelaxMake, _check_relaxation_outputs +from apex.op.property_ops import PropsMake, _is_failed_task_status +from apex.op.RunLAMMPS import RunLAMMPS +from apex.utils import apex_task_succeeded, all_apex_task_status_succeeded +try: + from context import write_poscar +except ModuleNotFoundError: + from tests.context import write_poscar sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) __package__ = "tests" +class TestTaskStatusHelpers(unittest.TestCase): + def test_failed_status_uses_apex_task_status_fields(self): + self.assertFalse(_is_failed_task_status({ + "state": "succeeded", + "exit_code": 0, + })) + self.assertTrue(_is_failed_task_status({ + "state": "failed", + "reason": "nonzero_exit", + "exit_code": 7, + })) + self.assertTrue(_is_failed_task_status({ + "state": "succeeded", + "exit_code": 7, + })) + + def test_rerun_finished_helpers_match_status_state(self): + with tempfile.TemporaryDirectory() as tmpdir: + work_dir = Path(tmpdir) + task0 = work_dir / "task.000000" + task1 = work_dir / "task.000001" + task0.mkdir() + task1.mkdir() + (task0 / "apex_task_status.json").write_text('{"state": "succeeded", "exit_code": 0}') + (task1 / "apex_task_status.json").write_text('{"state": "failed", "exit_code": 7}') + + self.assertTrue(apex_task_succeeded(task0)) + self.assertFalse(apex_task_succeeded(task1)) + self.assertFalse(all_apex_task_status_succeeded(work_dir)) + + (task1 / "apex_task_status.json").write_text('{"state": "succeeded", "exit_code": 7}') + self.assertTrue(all_apex_task_status_succeeded(work_dir)) + + +class TestRunLAMMPSDebug(unittest.TestCase): + def test_run_lammps_writes_debug_log_on_success(self): + with tempfile.TemporaryDirectory() as tmpdir: + task_dir = Path(tmpdir) + (task_dir / "custom_property.log").write_text("custom log line\n") + (task_dir / "task.json").write_text('{"type": "custom_lammps_property"}') + op = RunLAMMPS() + op.execute(OPIO({ + "input_lammps": task_dir, + "run_command": "python -c 'print(\"ok\")'", + })) + debug_log = task_dir / ".debug.log" + self.assertTrue(debug_log.is_file()) + text = debug_log.read_text() + self.assertIn("## Command", text) + self.assertIn("## Metadata summary", text) + self.assertIn("custom_lammps_property", text) + self.assertIn("custom_property.log", text) + self.assertIn("custom log line", text) + self.assertIn("exit_code=0", text) + self.assertTrue((task_dir / ".debug.stdout").is_file()) + self.assertTrue((task_dir / ".debug.stderr").is_file()) + status = loadfn(task_dir / "apex_task_status.json") + self.assertEqual(status["state"], "succeeded") + self.assertEqual(status["exit_code"], 0) + self.assertEqual(status["reason"], "command_exit_zero") + + def test_run_lammps_writes_failed_status_with_debug_log(self): + with tempfile.TemporaryDirectory() as tmpdir: + task_dir = Path(tmpdir) + op = RunLAMMPS() + op.execute(OPIO({ + "input_lammps": task_dir, + "run_command": "python -c 'import sys; sys.exit(7)'", + })) + self.assertTrue((task_dir / ".debug.log").is_file()) + status = loadfn(task_dir / "apex_task_status.json") + self.assertEqual(status["state"], "failed") + self.assertEqual(status["reason"], "nonzero_exit") + self.assertEqual(status["exit_code"], 7) + self.assertEqual(status["debug_log"], ".debug.log") + + def test_run_lammps_classifies_common_exit_codes(self): + self.assertEqual(RunLAMMPS._classify_exit_code(127)["reason"], "command_not_found") + self.assertEqual(RunLAMMPS._classify_exit_code(137)["reason"], "killed_or_oom") + self.assertEqual(RunLAMMPS._classify_exit_code(143)["reason"], "terminated") + + def test_run_lammps_retries_header_only_failure(self): + with tempfile.TemporaryDirectory() as tmpdir: + task_dir = Path(tmpdir) + script = task_dir / "retry_once.py" + script.write_text( + "from pathlib import Path\n" + "count_file = Path('count.txt')\n" + "count = int(count_file.read_text()) if count_file.exists() else 0\n" + "count_file.write_text(str(count + 1))\n" + "Path('log.lammps').write_text('LAMMPS (29 Aug 2024)\\n')\n" + "Path('outlog').write_text('LAMMPS (29 Aug 2024)\\n')\n" + "if count == 0:\n" + " raise SystemExit(1)\n" + "Path('stress_timeseries.txt').write_text('0 0 0 0 0 0 0\\n')\n" + ) + op = RunLAMMPS() + op.execute(OPIO({ + "input_lammps": task_dir, + "run_command": f"{sys.executable} {script.name}", + })) + + self.assertEqual((task_dir / "count.txt").read_text(), "2") + self.assertTrue((task_dir / "log.lammps.attempt1").is_file()) + status = loadfn(task_dir / "apex_task_status.json") + self.assertEqual(status["state"], "succeeded") + self.assertEqual(status["attempts"], 2) + self.assertEqual(status["retry_reason"], "header_only_lammps_log_after_nonzero_exit") + + class TestMakeRelaxOPs(unittest.TestCase): def setUp(self) -> None: cwd = os.getcwd() @@ -88,8 +204,43 @@ def test_lammps_make_equi(self): self.assertTrue(os.path.exists(self.lammps_dir/'confs/std-bcc/relaxation/relax_task')) self.assertEqual(out['task_paths'], [self.lammps_dir/'confs/std-bcc/relaxation/relax_task']) + def test_check_relaxation_outputs_accepts_complete_task(self): + with tempfile.TemporaryDirectory() as tmpdir: + task_dir = Path(tmpdir) / "conf" / "relaxation" / "relax_task" + task_dir.mkdir(parents=True) + (task_dir / "CONTCAR").write_text("ok") + (task_dir / "result.json").write_text("{}") + + _check_relaxation_outputs([str(Path(tmpdir) / "conf")]) + + def test_check_relaxation_outputs_reports_failed_task_status(self): + with tempfile.TemporaryDirectory() as tmpdir: + task_dir = Path(tmpdir) / "conf" / "relaxation" / "relax_task" + task_dir.mkdir(parents=True) + (task_dir / "apex_task_status.json").write_text( + '{"state": "failed", "reason": "nonzero_exit", "exit_code": 7}' + ) + + with self.assertRaisesRegex(RuntimeError, "apex_task_status.json"): + _check_relaxation_outputs([str(Path(tmpdir) / "conf")]) + + def test_check_relaxation_outputs_reports_missing_contcar(self): + with tempfile.TemporaryDirectory() as tmpdir: + task_dir = Path(tmpdir) / "conf" / "relaxation" / "relax_task" + task_dir.mkdir(parents=True) + + with self.assertRaisesRegex(RuntimeError, "missing CONTCAR"): + _check_relaxation_outputs([str(Path(tmpdir) / "conf")]) + class TestMakePropsOPs(unittest.TestCase): + @staticmethod + def _expected_eos_task_count(prop_param): + vol_start = prop_param["vol_start"] + vol_end = prop_param["vol_end"] + vol_step = prop_param["vol_step"] + return int(round((vol_end - vol_start) / vol_step)) + 1 + def setUp(self) -> None: cwd = os.getcwd() self.path = cwd @@ -119,51 +270,60 @@ def tearDown(self) -> None: def test_vasp_make_props(self): os.chdir(self.vasp_dir) + param = loadfn('param_joint.json') op = PropsMake() out = op.execute( OPIO({ 'input_work_path': self.vasp_dir, 'path_to_prop': 'confs/std-bcc/eos_00', - 'prop_param': loadfn('param_joint.json')['properties'][0], - 'inter_param': loadfn('param_joint.json')['interaction'], + 'prop_param': param['properties'][0], + 'inter_param': param['interaction'], 'do_refine': False })) os.chdir('..') self.assertTrue(os.path.exists(self.vasp_dir/'confs')) self.assertTrue(os.path.exists(self.vasp_dir/'confs/std-bcc/eos_00')) - self.assertEqual(len(out['task_paths']), 2) + self.assertEqual( + len(out['task_paths']), + self._expected_eos_task_count(param['properties'][0]) + ) def test_abacus_make_props(self): os.chdir(self.abacus_dir) + param = loadfn('param_joint.json') op = PropsMake() out = op.execute( OPIO({ 'input_work_path': self.abacus_dir, 'path_to_prop': 'confs/fcc-Al/eos_00', - 'prop_param': loadfn('param_joint.json')['properties'][0], - 'inter_param': loadfn('param_joint.json')['interaction'], + 'prop_param': param['properties'][0], + 'inter_param': param['interaction'], 'do_refine': False })) os.chdir('..') self.assertTrue(os.path.exists(self.abacus_dir/'confs')) self.assertTrue(os.path.exists(self.abacus_dir/'confs/fcc-Al/eos_00')) - self.assertEqual(len(out['task_paths']), 2) + self.assertEqual( + len(out['task_paths']), + self._expected_eos_task_count(param['properties'][0]) + ) def test_lammps_make_props(self): os.chdir('lammps_input') + param = loadfn('param_joint.json') op = PropsMake() out = op.execute( OPIO({ 'input_work_path': self.lammps_dir, 'path_to_prop': 'confs/std-bcc/eos_00', - 'prop_param': loadfn('param_joint.json')['properties'][0], - 'inter_param': loadfn('param_joint.json')['interaction'], + 'prop_param': param['properties'][0], + 'inter_param': param['interaction'], 'do_refine': False })) os.chdir('..') self.assertTrue(os.path.exists(self.lammps_dir/'confs')) self.assertTrue(os.path.exists(self.lammps_dir/'confs/std-bcc/eos_00')) - self.assertEqual(len(out['task_paths']), 2) - - - + self.assertEqual( + len(out['task_paths']), + self._expected_eos_task_count(param['properties'][0]) + ) diff --git a/tests/test_phonon.py b/tests/test_phonon.py index 2fa5c9bd..82e8bc8f 100644 --- a/tests/test_phonon.py +++ b/tests/test_phonon.py @@ -3,6 +3,8 @@ import shutil import sys import unittest +from pathlib import Path +from unittest.mock import patch import dpdata import numpy as np @@ -16,6 +18,7 @@ class TestPhonon(unittest.TestCase): def setUp(self): + tests_dir = Path(__file__).resolve().parent _jdata = { "structures": ["confs/std-bcc"], "interaction": { @@ -28,13 +31,13 @@ def setUp(self): "type": "phonon", "skip": False, "BAND": "0.0000 0.0000 0.5000 0.0000 0.0000 0.0000 0.5000 -0.5000 0.5000 0.25000 0.2500 0.2500 0 0 0", - "supercell_matrix": [2, 2, 2] + "supercell_size": [2, 2, 2] }, ], } self.equi_path = "confs/hp-Mo/relaxation/relax_task" - self.source_path = "equi/vasp" + self.source_path = tests_dir / "equi" / "vasp" self.target_path = "confs/hp-Mo/phonon_00" self.res_data = "output/phonon_00/result.json" self.ptr_data = "output/phonon_00/result.out" @@ -65,13 +68,28 @@ def test_task_type(self): def test_task_param(self): self.assertEqual(self.prop_param[0], self.phonon.task_param()) + self.assertEqual(self.phonon.task_param()["BAND_POINTS"], 51) + self.assertEqual(self.phonon.task_param()["PRIMITIVE_AXES"], "P") + + def test_phonopy_setup_command_prefers_v4_setup_tool(self): + with patch("apex.core.property.Phonon.shutil.which", return_value="/usr/bin/phonopy-init"): + self.assertEqual( + Phonon.phonopy_setup_command("-d --dim='2 2 2' -c POSCAR"), + "phonopy-init -d --dim='2 2 2' -c POSCAR", + ) + + with patch("apex.core.property.Phonon.shutil.which", return_value=None): + self.assertEqual( + Phonon.phonopy_setup_command("-d --dim='2 2 2' -c POSCAR"), + "phonopy -d --dim='2 2 2' -c POSCAR", + ) def test_make_phonon_conf(self): if not os.path.exists(os.path.join(self.equi_path, "CONTCAR")): with self.assertRaises(RuntimeError): self.phonon.make_confs(self.target_path, self.equi_path) shutil.copy( - os.path.join(self.source_path, "CONTCAR_Mo_bcc"), + self.source_path / "CONTCAR_Mo_bcc", os.path.join(self.equi_path, "CONTCAR"), ) task_list = self.phonon.make_confs(self.target_path, self.equi_path) @@ -79,3 +97,26 @@ def test_make_phonon_conf(self): self.assertEqual(len(dfm_dirs), 1) self.assertTrue(os.path.isfile(os.path.join(self.target_path, "phonopy_disp.yaml"))) self.assertTrue(os.path.isfile(os.path.join(self.target_path, "task.000000/band.conf"))) + with open(os.path.join(self.target_path, "task.000000/band.conf")) as fp: + self.assertIn("PRIMITIVE_AXES = P", fp.read()) + + def test_post_process_injects_deepmd_plugin_for_phonon(self): + deepmd_phonon = Phonon( + {"type": "phonon", "supercell_size": [2, 2, 2]}, + inter_param={"type": "deepmd"}, + ) + task_dir = Path("output/phonon_deepmd_post/task.000000") + shutil.rmtree(task_dir.parent, ignore_errors=True) + task_dir.mkdir(parents=True, exist_ok=True) + (task_dir / "in.lammps").write_text( + "clear\npair_style deepmd frozen_model.pth\npair_coeff * * Cu O\nrun 0\n" + ) + + try: + deepmd_phonon.post_process([str(task_dir)]) + rewritten = (task_dir / "in.lammps").read_text() + self.assertIn("plugin load libdeepmd_lmp.so", rewritten) + self.assertIn("pair_style deepmd frozen_model.pth", rewritten) + self.assertNotIn("run 0", rewritten) + finally: + shutil.rmtree(task_dir.parent, ignore_errors=True) diff --git a/tests/test_rss.py b/tests/test_rss.py new file mode 100644 index 00000000..ad331824 --- /dev/null +++ b/tests/test_rss.py @@ -0,0 +1,1052 @@ +import json +import tempfile +import sys +import random +import unittest +import warnings +from pathlib import Path +from collections import Counter +from unittest.mock import patch + +from pymatgen.core import Lattice, Structure +from pymatgen.io.vasp import Poscar + +from apex.core.lib.crys import ( + bcc, + diamond, + fcc, + hcp, + sc, + suggest_supercell, + tetragonal, +) +from apex.core.lib.rss import ( + RSSInputError, + _assign_initial_species, + _build_neighbor_shells, + _build_sublattice_indices, + _compute_warren_cowley_sro, + _default_shell_cutoffs, + _integerize_composition_counts, + _normalize_shell_weights, + _normalize_sro_targets, + _normalize_validate_compositions, + _parse_pair_key, + _pick_swap, + generate_rss, +) +from apex.rss import ( + _auto_assign_sublattices, + rss_from_args, + run_rss_config, +) +from apex.main import parse_args + + +class TestRSS(unittest.TestCase): + def test_parent_lattice_builders_accept_none_placeholder_element(self): + builders = [ + (fcc, {"a": 3.6}), + (bcc, {"a": 3.0}), + (sc, {"a": 3.0}), + (hcp, {"a": 3.0, "c": 4.9}), + (tetragonal, {"a": 3.0, "c": 3.2}), + (diamond, {"a": 3.6}), + ] + for builder, kwargs in builders: + with self.subTest(builder=builder.__name__): + structure = builder(None, **kwargs) + self.assertGreater(len(structure), 0) + + def test_rss_cli_parser(self): + argv = ["apex", "rss", "examples/rss/rss.json"] + with patch.object(sys, "argv", argv): + _, args = parse_args() + + self.assertEqual(args.cmd, "rss") + self.assertEqual(args.rss_json, "examples/rss/rss.json") + + def test_single_sublattice_equimolar_count_conservation(self): + st = fcc("Ni", a=3.6) + st.make_supercell([2, 2, 5]) # 20 sites + + compositions = { + "all": { + "Co": 0.2, + "Cr": 0.2, + "Fe": 0.2, + "Mn": 0.2, + "Ni": 0.2, + } + } + + out, meta = generate_rss( + structure=st, + compositions=compositions, + shell_cutoffs=[2.8], + max_steps=1500, + seed=7, + return_metadata=True, + ) + + counts = Counter(str(site.specie) for site in out.sites) + self.assertEqual(len(out), 20) + self.assertEqual(counts["Co"], 4) + self.assertEqual(counts["Cr"], 4) + self.assertEqual(counts["Fe"], 4) + self.assertEqual(counts["Mn"], 4) + self.assertEqual(counts["Ni"], 4) + + self.assertIn("initial_objective", meta) + self.assertIn("best_objective", meta) + self.assertIn("acceptance_ratio", meta) + + def test_suggest_supercell_respects_maximum_num_atoms(self): + compositions = { + "corner": { + "Al": 0.50287, + "Co": 0.12201, + "Cr": 0.07537, + "Fe": 0.04768, + "Mn": 0.14051, + "Ni": 0.11156, + }, + "body": { + "Al": 0.00103, + "Co": 0.41705, + "Cr": 0.03401, + "Fe": 0.08123, + "Mn": 0.15832, + "Ni": 0.30836, + }, + } + + supercell = suggest_supercell( + "B2", + compositions, + composition_tolerance=0.01, + shape_mode="xy_equal_z_free", + maximum_num_atoms=128, + ) + + self.assertEqual(supercell, [4, 4, 4]) + self.assertLessEqual(2 * supercell[0] * supercell[1] * supercell[2], 128) + + def test_multi_sublattice_oxide_cation_changes_anion_unchanged(self): + st = Structure( + Lattice.cubic(4.2), + ["Na", "O"], + [[0, 0, 0], [0.5, 0.5, 0.5]], + ) + st.make_supercell([2, 2, 2]) + + cation_indices = [i for i, site in enumerate(st.sites) if str(site.specie) == "Na"] + anion_indices = [i for i, site in enumerate(st.sites) if str(site.specie) == "O"] + + out = generate_rss( + structure=st, + compositions={ + "cation": {"Co": 0.5, "Ni": 0.5}, + "anion": {"O": 1.0}, + }, + sublattices=[ + {"name": "cation", "site_indices": cation_indices}, + {"name": "anion", "site_indices": anion_indices}, + ], + shell_cutoffs=[4.3], + max_steps=2000, + seed=11, + ) + + out_species = [str(site.specie) for site in out.sites] + cation_species = [out_species[i] for i in cation_indices] + anion_species = [out_species[i] for i in anion_indices] + + cation_counts = Counter(cation_species) + self.assertEqual(cation_counts["Co"], 4) + self.assertEqual(cation_counts["Ni"], 4) + self.assertTrue(all(sp == "O" for sp in anion_species)) + + def test_reproducibility_with_same_seed(self): + st = bcc("Fe", a=2.85) + st.make_supercell([2, 2, 2]) + + kwargs = { + "structure": st, + "compositions": {"all": {"Co": 0.5, "Ni": 0.5}}, + "shell_cutoffs": [2.6], + "max_steps": 1000, + "seed": 123, + } + + out1 = generate_rss(**kwargs) + out2 = generate_rss(**kwargs) + + sp1 = [str(site.specie) for site in out1.sites] + sp2 = [str(site.specie) for site in out2.sites] + self.assertEqual(sp1, sp2) + + def test_objective_decreases_for_toy_case(self): + st = Structure( + Lattice.orthorhombic(1.0, 10.0, 10.0), + ["Na"], + [[0, 0, 0]], + ) + st.make_supercell([8, 1, 1]) + + _, meta = generate_rss( + structure=st, + compositions={"all": {"Co": 0.5, "Ni": 0.5}}, + sro_targets={ + 0: { + ("Co", "Ni"): -1.0, + ("Co", "Co"): 1.0, + ("Ni", "Ni"): 1.0, + } + }, + shell_cutoffs=[1.1], + max_steps=4000, + temperature=0.03, + seed=9, + return_metadata=True, + ) + + self.assertLess(meta["best_objective"], meta["initial_objective"]) + + def test_invalid_composition_sum_raises(self): + st = bcc("Fe", a=2.85) + st.make_supercell([2, 2, 1]) + + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Co": 0.6, "Ni": 0.5}}, + shell_cutoffs=[2.6], + ) + + def test_incompatible_composition_and_site_count_warns_and_rounds(self): + st = Structure( + Lattice.orthorhombic(1.0, 10.0, 10.0), + ["Na"], + [[0, 0, 0]], + ) + st.make_supercell([7, 1, 1]) + + with self.assertWarns(UserWarning): + out = generate_rss( + structure=st, + compositions={"all": {"Co": 0.5, "Ni": 0.5}}, + shell_cutoffs=[1.1], + max_steps=0, + ) + + counts = Counter(str(site.specie) for site in out.sites) + self.assertEqual(counts["Co"], 4) + self.assertEqual(counts["Ni"], 3) + + def test_num_configs_and_interval_return_multiple_structures(self): + st = fcc("Ni", a=3.6) + st.make_supercell([2, 2, 2]) + + outputs, meta = generate_rss( + structure=st, + compositions={"all": {"Co": 0.5, "Ni": 0.5}}, + shell_cutoffs=[2.8], + max_steps=500, + temperature=0.05, + seed=17, + num_configs=3, + interval=20, + return_metadata=True, + ) + + self.assertIsInstance(outputs, list) + self.assertEqual(len(outputs), 3) + self.assertIn("sampling", meta) + self.assertEqual(meta["sampling"]["num_configs"], 3) + self.assertEqual(meta["sampling"]["interval"], 20) + self.assertEqual(len(meta["sampling"]["sampled_rmses"]), 3) + species_signatures = { + tuple(str(site.specie) for site in structure.sites) + for structure in outputs + } + self.assertEqual(len(species_signatures), len(outputs)) + + def test_num_configs_cache_keeps_best_unique_configs_by_rmse(self): + st = fcc("Ni", a=3.6) + st.make_supercell([2, 2, 1]) + swap_sequence = [(0, 1), (1, 2), (2, 3), (0, 3), (0, 2), (1, 3)] + rmse_sequence = [ + {"rmse": 0.50, "max_abs": 0.50}, + {"rmse": 0.40, "max_abs": 0.40}, + {"rmse": 0.20, "max_abs": 0.20}, + {"rmse": 0.30, "max_abs": 0.30}, + {"rmse": 0.15, "max_abs": 0.15}, + {"rmse": 0.25, "max_abs": 0.25}, + {"rmse": 0.10, "max_abs": 0.10}, + ] + + def deterministic_assign(state_species, indices, counts, rng): + expanded = [] + for species, count in sorted(counts.items()): + expanded.extend([species] * count) + for site_index, species in zip(indices, expanded): + state_species[site_index] = species + + with patch("apex.core.lib.rss._assign_initial_species", side_effect=deterministic_assign): + with patch("apex.core.lib.rss._pick_swap", side_effect=swap_sequence): + with patch("apex.core.lib.rss._compute_warren_cowley_sro", return_value={}): + with patch("apex.core.lib.rss._objective_function", return_value=0.0): + with patch("apex.core.lib.rss._sro_gap_metrics", side_effect=rmse_sequence): + outputs, meta = generate_rss( + structure=st, + compositions={"all": {"Co": 0.5, "Ni": 0.5}}, + shell_cutoffs=[2.8], + max_steps=len(swap_sequence), + interval=1, + num_configs=2, + tol=0.05, + return_metadata=True, + ) + + self.assertEqual(len(outputs), 2) + self.assertEqual(meta["sampling"]["sampled_steps"], [6, 4]) + self.assertEqual(meta["sampling"]["sampled_rmses"], [0.10, 0.15]) + + def test_num_configs_cache_updates_duplicate_config_with_lower_rmse(self): + st = fcc("Ni", a=3.6) + st.make_supercell([2, 2, 1]) + swap_sequence = [(0, 1), (0, 1), (2, 3), (2, 3)] + rmse_sequence = [ + {"rmse": 0.50, "max_abs": 0.50}, + {"rmse": 0.40, "max_abs": 0.40}, + {"rmse": 0.30, "max_abs": 0.30}, + {"rmse": 0.20, "max_abs": 0.20}, + {"rmse": 0.10, "max_abs": 0.10}, + ] + + def deterministic_assign(state_species, indices, counts, rng): + expanded = [] + for species, count in sorted(counts.items()): + expanded.extend([species] * count) + for site_index, species in zip(indices, expanded): + state_species[site_index] = species + + with patch("apex.core.lib.rss._assign_initial_species", side_effect=deterministic_assign): + with patch("apex.core.lib.rss._pick_swap", side_effect=swap_sequence): + with patch("apex.core.lib.rss._compute_warren_cowley_sro", return_value={}): + with patch("apex.core.lib.rss._objective_function", return_value=0.0): + with patch("apex.core.lib.rss._sro_gap_metrics", side_effect=rmse_sequence): + outputs, meta = generate_rss( + structure=st, + compositions={"all": {"Co": 0.5, "Ni": 0.5}}, + shell_cutoffs=[2.8], + max_steps=len(swap_sequence), + interval=1, + num_configs=2, + tol=0.05, + return_metadata=True, + ) + + self.assertEqual(len(outputs), 2) + self.assertEqual(meta["sampling"]["sampled_steps"], [4, -1]) + self.assertEqual(meta["sampling"]["sampled_rmses"], [0.10, 0.50]) + + def test_invalid_structure_type_raises(self): + with self.assertRaises(RSSInputError): + generate_rss( + structure="not-a-structure", + compositions={"all": {"Ni": 1.0}}, + ) + + def test_invalid_sampling_and_thermo_parameters_raise(self): + st = fcc("Ni", a=3.6) + st.make_supercell([2, 1, 1]) + + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + max_steps=-1, + ) + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + temperature=-0.1, + ) + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + num_configs=0, + ) + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + interval=0, + ) + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + patience=0, + ) + + def test_shell_cutoff_and_weight_validation_raises(self): + st = fcc("Ni", a=3.6) + st.make_supercell([2, 1, 1]) + + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + shell_cutoffs=[], + ) + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + shell_cutoffs=[2.0, 1.0], + ) + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + shell_cutoffs=[2.0], + shell_weights=[1.0, 1.0], + ) + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + shell_cutoffs=[2.0], + shell_weights=[-1.0], + ) + + def test_sro_target_validation_raises(self): + st = fcc("Ni", a=3.6) + st.make_supercell([2, 1, 1]) + + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + shell_cutoffs=[2.0], + sro_targets={2: {"Ni-Ni": 0.0}}, + ) + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + shell_cutoffs=[2.0], + sro_targets={0: 1.0}, + ) + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + shell_cutoffs=[2.0], + sro_targets={0: {"bad-pair-key-format-1-2": 0.0}}, + ) + + def test_colon_pair_key_and_shell_string_work(self): + st = fcc("Ni", a=3.6) + st.make_supercell([2, 1, 1]) + + out, meta = generate_rss( + structure=st, + compositions={"all": {"Co": 0.5, "Ni": 0.5}}, + shell_cutoffs=[2.8], + sro_targets={"shell0": {"Co:Ni": 0.0}}, + max_steps=200, + seed=5, + return_metadata=True, + ) + + self.assertEqual(len(out), len(st)) + self.assertIn(("Co", "Ni"), meta["target_sro"][0]) + + def test_multisublattice_requires_sublattices_mapping(self): + st = Structure( + Lattice.cubic(4.2), + ["Na", "O"], + [[0, 0, 0], [0.5, 0.5, 0.5]], + ) + st.make_supercell([2, 1, 1]) + + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"cation": {"Co": 1.0}, "anion": {"O": 1.0}}, + sublattices=None, + shell_cutoffs=[4.3], + ) + + def test_invalid_sublattice_definition_raises(self): + st = Structure( + Lattice.cubic(4.2), + ["Na", "O"], + [[0, 0, 0], [0.5, 0.5, 0.5]], + ) + st.make_supercell([2, 1, 1]) + + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"cation": {"Co": 1.0}, "anion": {"O": 1.0}}, + sublattices=[ + {"name": "cation", "site_indices": [0, 1]}, + {"name": "anion", "site_indices": [1, 2]}, + ], + shell_cutoffs=[4.3], + ) + + def test_allow_vacancies_maps_aliases_to_x(self): + st = bcc("Fe", a=2.85) + st.make_supercell([2, 2, 1]) + + out = generate_rss( + structure=st, + compositions={"all": {"Ni": 0.5, "vac": 0.5}}, + shell_cutoffs=[2.6], + allow_vacancies=True, + seed=2, + max_steps=100, + ) + species = {str(site.specie) for site in out.sites} + self.assertTrue(any(sp.startswith("X") for sp in species)) + + def test_show_progress_without_tqdm_warns(self): + st = bcc("Fe", a=2.85) + st.make_supercell([2, 1, 1]) + + with patch("apex.core.lib.rss.tqdm", None): + with self.assertWarns(UserWarning): + generate_rss( + structure=st, + compositions={"all": {"Fe": 1.0}}, + shell_cutoffs=[2.6], + show_progress=True, + max_steps=10, + ) + + def test_default_sro_targets_and_zero_step_num_configs_are_distinct(self): + st = bcc("Fe", a=2.85) + st.make_supercell([2, 2, 1]) + + with warnings.catch_warnings(): + warnings.simplefilter("ignore", UserWarning) + outputs, meta = generate_rss( + structure=st, + compositions={"all": {"Co": 0.5, "Ni": 0.5}}, + shell_cutoffs=[2.6], + max_steps=0, + seed=19, + num_configs=3, + return_metadata=True, + ) + + self.assertEqual(len(outputs), 3) + self.assertEqual( + set(meta["target_sro"][0]), + {("Co", "Co"), ("Co", "Ni"), ("Ni", "Ni")}, + ) + self.assertTrue( + all(value == 0.0 for value in meta["target_sro"][0].values()) + ) + species_signatures = { + tuple(str(site.specie) for site in structure.sites) + for structure in outputs + } + self.assertEqual(len(species_signatures), len(outputs)) + self.assertEqual(meta["sampling"]["sampled_steps"], [0, 0, 0]) + self.assertEqual(meta["attempted_moves"], 0) + self.assertEqual(meta["accepted_moves"], 0) + + +class TestRSSRunner(unittest.TestCase): + def test_run_rss_config_with_parent_lattice_writes_outputs(self): + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + cfg = { + "parent_lattice": { + "type": "fcc", + "element": "Ni", + "a": 3.6, + "supercell": [2, 1, 1], + }, + "compositions": { + "all": { + "Co": 0.5, + "Ni": 0.5, + } + }, + "shell_cutoffs": [2.8], + "num_configs": 2, + "interval": 10, + "max_steps": 100, + "metadata": True, + "seed": 1, + "output_structure": "RSS", + } + config_path = root / "rss.json" + config_path.write_text(json.dumps(cfg, indent=2)) + + run_rss_config(str(config_path)) + + self.assertTrue((root / "RSS" / "conf_001" / "POSCAR").exists()) + self.assertTrue((root / "RSS" / "conf_002" / "POSCAR").exists()) + self.assertTrue((root / "RSS" / "rss_metadata.json").exists()) + + def test_run_rss_config_with_parent_structure_and_no_metadata(self): + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + parent = fcc("Ni", a=3.6) + parent.make_supercell([2, 1, 1]) + parent_path = root / "parent.vasp" + Poscar(parent).write_file(str(parent_path)) + + cfg = { + "parent_structure": "parent.vasp", + "compositions": {"all": {"Co": 0.5, "Ni": 0.5}}, + "shell_cutoffs": [2.8], + "max_steps": 100, + "metadata": False, + "output_structure": "RSS", + } + config_path = root / "rss.json" + config_path.write_text(json.dumps(cfg, indent=2)) + + run_rss_config(str(config_path)) + + self.assertTrue((root / "RSS" / "conf_001" / "POSCAR").exists()) + self.assertFalse((root / "RSS" / "rss_metadata.json").exists()) + + def test_run_rss_config_auto_assign_and_sublattice_sro_target(self): + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + parent = Structure( + Lattice.cubic(4.2), + ["Na", "O"], + [[0, 0, 0], [0.5, 0.5, 0.5]], + ) + parent_path = root / "parent.vasp" + Poscar(parent).write_file(str(parent_path)) + + cfg = { + "parent_structure": "parent.vasp", + "supercell": [2, 2, 1], + "compositions": { + "cation": {"Mg": 0.5, "Co": 0.5}, + "anion": {"O": 1.0}, + }, + "sro_targets": {"shell0": {"Mg-Mg": 0.0, "Mg-Co": 0.0, "Co-Co": 0.0, "O-O": 0.0}}, + "shell_cutoffs": [4.3], + "max_steps": 100, + "metadata": True, + "output_structure": "RSS", + } + config_path = root / "rss.json" + config_path.write_text(json.dumps(cfg, indent=2)) + + run_rss_config(str(config_path)) + + metadata_path = root / "RSS" / "rss_metadata.json" + self.assertTrue(metadata_path.exists()) + data = json.loads(metadata_path.read_text()) + self.assertIn("0", data["target_sro"]) + self.assertIn("Co-Mg", data["target_sro"]["0"]) + + def test_run_rss_config_parent_lattice_b2_auto_supercell(self): + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + cfg = { + "parent_lattice": { + "type": "B2", + "a": "auto", + "supercell": "auto", + }, + "compositions": { + "corner": { + "Al": 0.25, + "Co": 0.25, + "Cr": 0.25, + "Fe": 0.25, + }, + "body": { + "Al": 0.25, + "Co": 0.25, + "Cr": 0.25, + "Fe": 0.25, + }, + }, + "composition_tolerance": 0.001, + "supercell_shape": "near_cubic", + "maxmium_nums_atoms": 128, + "shell_cutoffs": [4.0], + "num_configs": 1, + "max_steps": 0, + "metadata": True, + "show_progress": False, + "output_structure": "RSS_B2", + } + config_path = root / "rss.json" + config_path.write_text(json.dumps(cfg, indent=2)) + + run_rss_config(str(config_path)) + + self.assertTrue((root / "RSS_B2" / "conf_001" / "POSCAR").exists()) + metadata = json.loads((root / "RSS_B2" / "rss_metadata.json").read_text()) + self.assertIn("composition_ratios", metadata) + self.assertIsNone(metadata["ratio_precision"]) + self.assertAlmostEqual(metadata["composition_ratios"]["corner"]["Al"], 0.25) + self.assertAlmostEqual(metadata["composition_ratios"]["body"]["Co"], 0.25) + + def test_run_rss_config_bcc_auto_supercell_respects_target_atom_counts(self): + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + cfg = { + "parent_lattice": { + "type": "bcc", + "a": "auto", + "supercell": "auto", + }, + "composition_tolerance": 0.01, + "supercell_shape": "near_cubic", + "maximum_num_atoms": 198, + "compositions": { + "all": { + "Ni": 0.21212121212121213, + "Al": 0.24242424242424243, + "Co": 0.2727272727272727, + "Cr": 0.05555555555555555, + "Fe": 0.06565656565656566, + "Mn": 0.15151515151515152, + } + }, + "shell_cutoffs": [2.6], + "max_steps": 0, + "num_configs": 1, + "metadata": True, + "show_progress": False, + "output_structure": "RSS_BCC", + } + config_path = root / "rss.json" + config_path.write_text(json.dumps(cfg, indent=2)) + + run_rss_config(str(config_path)) + + metadata = json.loads((root / "RSS_BCC" / "rss_metadata.json").read_text()) + counts = metadata["composition_counts"]["all"] + self.assertEqual(counts["Ni"], 42) + self.assertEqual(counts["Al"], 48) + self.assertEqual(counts["Co"], 54) + self.assertEqual(counts["Cr"], 11) + self.assertEqual(counts["Fe"], 13) + self.assertEqual(counts["Mn"], 30) + + def test_run_rss_config_rejects_legacy_sro_targets(self): + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + parent = fcc("Ni", a=3.6) + parent.make_supercell([2, 1, 1]) + parent_path = root / "parent.vasp" + Poscar(parent).write_file(str(parent_path)) + + cfg = { + "parent_structure": "parent.vasp", + "compositions": {"all": {"Co": 0.5, "Ni": 0.5}}, + "shell_cutoffs": [2.8], + "sro_targets": { + "cation": {"Co-Ni": 0.0}, + "anion": {"O-O": 0.0}, + }, + "max_steps": 50, + "output_structure": "RSS/POSCAR", + } + config_path = root / "rss.json" + config_path.write_text(json.dumps(cfg, indent=2)) + + with self.assertRaises((ValueError, RSSInputError)): + run_rss_config(str(config_path)) + + def test_run_rss_config_requires_parent_input(self): + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + cfg = { + "compositions": {"all": {"Ni": 1.0}}, + "shell_cutoffs": [2.8], + } + config_path = root / "rss.json" + config_path.write_text(json.dumps(cfg, indent=2)) + + with self.assertRaises(ValueError): + run_rss_config(str(config_path)) + + def test_run_rss_config_invalid_parent_lattice_type_raises(self): + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + cfg = { + "parent_lattice": {"type": "unknown", "element": "Ni", "a": 3.6}, + "compositions": {"all": {"Ni": 1.0}}, + "shell_cutoffs": [2.8], + } + config_path = root / "rss.json" + config_path.write_text(json.dumps(cfg, indent=2)) + + with self.assertRaises(ValueError): + run_rss_config(str(config_path)) + + def test_run_rss_config_missing_file_raises(self): + with self.assertRaises(FileNotFoundError): + run_rss_config("/tmp/this_file_does_not_exist_rss.json") + + def test_rss_from_args_delegates_to_runner(self): + with patch("apex.rss.run_rss_config") as mocked: + rss_from_args("dummy.json") + mocked.assert_called_once_with("dummy.json") + + def test_auto_assign_sublattices_helper_branches(self): + base_parent = Structure(Lattice.cubic(3.0), ["Na", "Cl"], [[0, 0, 0], [0.5, 0.5, 0.5]]) + expanded_parent = base_parent.copy() + expanded_parent.make_supercell([2, 1, 1]) + + self.assertIsNone( + _auto_assign_sublattices( + compositions={"all": {"Na": 1.0}}, + base_parent=base_parent, + expanded_parent=expanded_parent, + ) + ) + + with self.assertRaises(ValueError): + _auto_assign_sublattices( + compositions={}, + base_parent=base_parent, + expanded_parent=expanded_parent, + ) + with self.assertRaises(ValueError): + _auto_assign_sublattices( + compositions={"a": {"Na": 1.0}, "b": {"Cl": 1.0}, "c": {"X": 1.0}}, + base_parent=base_parent, + expanded_parent=expanded_parent, + ) + with self.assertRaises(ValueError): + _auto_assign_sublattices( + compositions={"a": {"Na": 1.0}}, + base_parent=base_parent, + expanded_parent=base_parent, + ) + + invalid_expanded = Structure( + Lattice.cubic(3.0), + ["Na", "Cl", "Na"], + [[0, 0, 0], [0.5, 0.5, 0.5], [0.25, 0.25, 0.25]], + ) + with self.assertRaises(ValueError): + _auto_assign_sublattices( + compositions={"a": {"Na": 1.0}, "b": {"Cl": 1.0}}, + base_parent=base_parent, + expanded_parent=invalid_expanded, + ) + +class TestRSSInternalHelpers(unittest.TestCase): + def test_parse_pair_key_and_invalid_key(self): + self.assertEqual(_parse_pair_key("Ni-Co"), ("Co", "Ni")) + self.assertEqual(_parse_pair_key("Ni:Co"), ("Co", "Ni")) + self.assertEqual(_parse_pair_key(["Ni", "Co"]), ("Co", "Ni")) + with self.assertRaises(RSSInputError): + _parse_pair_key("Ni") + + def test_normalize_validate_compositions_branches(self): + with self.assertRaises(RSSInputError): + _normalize_validate_compositions(compositions=[], tol=1e-3, allow_vacancies=False) + with self.assertRaises(RSSInputError): + _normalize_validate_compositions(compositions={"all": []}, tol=1e-3, allow_vacancies=False) + with self.assertRaises(RSSInputError): + _normalize_validate_compositions(compositions={"all": {"Ni": "x"}}, tol=1e-3, allow_vacancies=False) + with self.assertRaises(RSSInputError): + _normalize_validate_compositions(compositions={"all": {"Ni": -0.1}}, tol=1e-3, allow_vacancies=False) + with self.assertRaises(RSSInputError): + _normalize_validate_compositions(compositions={"all": {"Ni": 0.0}}, tol=1e-3, allow_vacancies=False) + with self.assertRaises(RSSInputError): + _normalize_validate_compositions(compositions={"all": {"vac": 1.0}}, tol=1e-3, allow_vacancies=False) + + def test_build_sublattice_indices_validation_branches(self): + st = bcc("Fe", a=2.85) + st.make_supercell([2, 1, 1]) + + with self.assertRaises(RSSInputError): + _build_sublattice_indices(st, {"all": {"Fe": 1.0}}, sublattices={}) + with self.assertRaises(RSSInputError): + _build_sublattice_indices(st, {"all": {"Fe": 1.0}}, sublattices=[1]) + with self.assertRaises(RSSInputError): + _build_sublattice_indices(st, {"all": {"Fe": 1.0}}, sublattices=[{"name": "all"}]) + with self.assertRaises(RSSInputError): + _build_sublattice_indices( + st, + {"all": {"Fe": 1.0}}, + sublattices=[ + {"name": "all", "site_indices": [0]}, + {"name": "all", "site_indices": [1]}, + ], + ) + with self.assertRaises(RSSInputError): + _build_sublattice_indices( + st, + {"all": {"Fe": 1.0}}, + sublattices=[{"name": "all", "site_indices": []}], + ) + with self.assertRaises(RSSInputError): + _build_sublattice_indices( + st, + {"all": {"Fe": 1.0}}, + sublattices=[{"name": "all", "site_indices": ["a"]}], + ) + with self.assertRaises(RSSInputError): + _build_sublattice_indices( + st, + {"all": {"Fe": 1.0}}, + sublattices=[{"name": "all", "site_indices": [99]}], + ) + with self.assertRaises(RSSInputError): + _build_sublattice_indices( + st, + {"all": {"Fe": 1.0}, "other": {"Co": 1.0}}, + sublattices=[{"name": "all", "site_indices": [0, 1]}], + ) + + def test_integerize_and_cutoff_neighbor_validation_branches(self): + with self.assertWarns(UserWarning): + with self.assertRaises(RSSInputError): + _integerize_composition_counts(1, {"A": 1.0, "B": 1.0}, 1e-6) + + single_site = Structure(Lattice.cubic(3.0), ["Ni"], [[0, 0, 0]]) + with self.assertRaises(RSSInputError): + _default_shell_cutoffs(single_site) + + with self.assertRaises(RSSInputError): + _build_neighbor_shells(single_site, [0.0]) + + def test_assign_initial_species_mismatch_raises(self): + with self.assertRaises(RSSInputError): + _assign_initial_species( + state_species=["Ni", "Ni"], + site_indices=[0, 1], + counts={"Co": 1}, + rng=random.Random(1), + ) + + def test_default_shell_cutoff_skips_zero_distances(self): + st = Structure( + Lattice.cubic(3.0), + ["Ni", "Ni", "Ni"], + [[0, 0, 0], [0, 0, 0], [0.5, 0.5, 0.5]], + ) + cut = _default_shell_cutoffs(st) + self.assertEqual(len(cut), 1) + self.assertGreater(cut[0], 0.0) + + def test_normalize_sro_targets_numeric_shell_key_and_invalid_target_type(self): + pair_keys = [("A", "A")] + normalized = _normalize_sro_targets({"0": {"A-A": 0.1}}, 1, pair_keys) + self.assertIn(("A", "A"), normalized[0]) + + enriched = _normalize_sro_targets({"0": {"A-B": 0.2}}, 1, pair_keys) + self.assertIn(("A", "B"), enriched[0]) + + with self.assertRaisesRegex( + RSSInputError, + r"Configured shell_cutoffs define 1 shell\(s\), so valid keys are: shell0", + ): + _normalize_sro_targets({"shell3": {"A-A": 0.1}}, 1, pair_keys) + + with self.assertRaises(RSSInputError): + _normalize_sro_targets({"shell0": 1.0}, 1, pair_keys) + + with self.assertRaisesRegex( + RSSInputError, + r"expected shell0, shell1, \.\.\. or 0, 1, \.\.\.", + ): + _normalize_sro_targets({"shellA": {"A-A": 0.1}}, 1, pair_keys) + + def test_normalize_shell_weights_valid_values(self): + weights = _normalize_shell_weights([1.0, 2.0], [0.5, 1.5]) + self.assertEqual(weights[0], 0.5) + self.assertEqual(weights[1], 1.5) + + with self.assertRaises(RSSInputError): + _normalize_shell_weights([1.0], [1.0, 2.0]) + with self.assertRaises(RSSInputError): + _normalize_shell_weights([1.0], [-0.1]) + + def test_compute_warren_cowley_handles_missing_species(self): + achieved = _compute_warren_cowley_sro( + species_state=["A", "A"], + shell_pairs={0: [(0, 1)]}, + pair_keys=[("B", "B")], + composition_fractions={"A": 1.0}, + ) + self.assertEqual(achieved[0][("B", "B")], 0.0) + + def test_pick_swap_no_valid_names_and_same_species(self): + self.assertIsNone(_pick_swap(["A"], {"all": [0]}, random.Random(1))) + self.assertIsNone(_pick_swap(["A", "A"], {"all": [0, 1]}, random.Random(1), max_tries=3)) + + def test_generate_rss_no_neighbor_pairs_raises(self): + st = Structure(Lattice.cubic(20.0), ["Ni", "Ni"], [[0, 0, 0], [0.5, 0.5, 0.5]]) + with self.assertRaises(RSSInputError): + generate_rss( + structure=st, + compositions={"all": {"Ni": 1.0}}, + shell_cutoffs=[1.0], + ) + + def test_generate_rss_shell_cutoff_default_and_patience_break(self): + st = bcc("Fe", a=2.85) + st.make_supercell([2, 1, 1]) + + with patch("apex.core.lib.rss._objective_function", return_value=1.0): + _, meta = generate_rss( + structure=st, + compositions={"all": {"Co": 0.5, "Ni": 0.5}}, + shell_cutoffs=None, + max_steps=10, + patience=1, + seed=3, + return_metadata=True, + ) + self.assertEqual(meta["sampling"]["patience"], 1) + + def test_generate_rss_progress_bar_tqdm_branch(self): + st = bcc("Fe", a=2.85) + st.make_supercell([2, 1, 1]) + + class _DummyTqdm: + def __init__(self, *args, **kwargs): + self.updated = 0 + + def set_postfix(self, *args, **kwargs): + return None + + def update(self, n): + self.updated += n + + def close(self): + return None + + with patch("apex.core.lib.rss.tqdm", _DummyTqdm): + out = generate_rss( + structure=st, + compositions={"all": {"Fe": 1.0}}, + shell_cutoffs=[2.6], + show_progress=True, + max_steps=5, + ) + self.assertEqual(len(out), len(st)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_submit_path_validation.py b/tests/test_submit_path_validation.py new file mode 100644 index 00000000..f9efa145 --- /dev/null +++ b/tests/test_submit_path_validation.py @@ -0,0 +1,275 @@ +import unittest +import tempfile +import os +import json + +from apex.submit import ( + validate_submit_paths, + auto_fill_type_map_from_poscar, + pack_upload_dir, +) + + +class TestSubmitPathValidation(unittest.TestCase): + def test_accept_paths_without_dot(self): + params = [ + { + "structures": ["confs/std-*"], + "interaction": {"model": "models/Al_eam_alloy"}, + } + ] + validate_submit_paths(params) + + def test_reject_dot_in_structures(self): + params = [ + { + "structures": ["./confs/std-*"], + "interaction": {"model": "models/Al_eam_alloy"}, + } + ] + with self.assertRaises(RuntimeError) as cm: + validate_submit_paths(params) + self.assertIn("parameter[0].structures[0]", str(cm.exception)) + + def test_allow_dot_in_model_string(self): + params = [ + { + "structures": ["confs/std-*"], + "interaction": {"model": "Al.eam.alloy"}, + } + ] + validate_submit_paths(params) + + def test_allow_dot_in_model_list(self): + params = [ + { + "structures": ["confs/std-*"], + "interaction": {"model": ["Al_eam_alloy", "frozen_model.pb"]}, + } + ] + validate_submit_paths(params) + + def test_auto_fill_type_map_from_poscar(self): + with tempfile.TemporaryDirectory() as tmp: + structure_dir = os.path.join(tmp, "B2_HEA") + os.makedirs(structure_dir, exist_ok=True) + poscar_path = os.path.join(structure_dir, "POSCAR") + with open(poscar_path, "w", encoding="utf-8") as fp: + fp.write( + "Test\n" + "1.0\n" + "1 0 0\n" + "0 1 0\n" + "0 0 1\n" + "Al Co Cr Fe Mn Ni\n" + "1 1 1 1 1 1\n" + "Direct\n" + "0 0 0\n" + "0.1 0.1 0.1\n" + "0.2 0.2 0.2\n" + "0.3 0.3 0.3\n" + "0.4 0.4 0.4\n" + "0.5 0.5 0.5\n" + ) + + param_path = os.path.join(tmp, "param_props_gammasurface.json") + payload = { + "structures": ["B2_HEA"], + "interaction": { + "type": "deepmd", + "model": "../frozen_model.pb", + "type_map": "auto", + }, + } + with open(param_path, "w", encoding="utf-8") as fp: + json.dump(payload, fp, indent=4) + + changed = auto_fill_type_map_from_poscar(payload, param_path) + self.assertTrue(changed) + self.assertEqual( + payload["interaction"]["type_map"], + {"Al": 0, "Co": 1, "Cr": 2, "Fe": 3, "Mn": 4, "Ni": 5}, + ) + + with open(param_path, "r", encoding="utf-8") as fp: + persisted = json.load(fp) + self.assertEqual( + persisted["interaction"]["type_map"], + {"Al": 0, "Co": 1, "Cr": 2, "Fe": 3, "Mn": 4, "Ni": 5}, + ) + + def test_auto_fill_type_map_from_rss_conf_subdir(self): + with tempfile.TemporaryDirectory() as tmp: + structure_dir = os.path.join(tmp, "B2_HEA", "conf_001") + os.makedirs(structure_dir, exist_ok=True) + poscar_path = os.path.join(structure_dir, "POSCAR") + with open(poscar_path, "w", encoding="utf-8") as fp: + fp.write( + "Test\n" + "1.0\n" + "1 0 0\n" + "0 1 0\n" + "0 0 1\n" + "Al Co Cr Fe Mn Ni\n" + "1 1 1 1 1 1\n" + "Direct\n" + "0 0 0\n" + "0.1 0.1 0.1\n" + "0.2 0.2 0.2\n" + "0.3 0.3 0.3\n" + "0.4 0.4 0.4\n" + "0.5 0.5 0.5\n" + ) + + param_path = os.path.join(tmp, "param_props_gammasurface.json") + payload = { + "structures": ["B2_HEA"], + "interaction": { + "type": "deepmd", + "model": "../frozen_model.pb", + "type_map": "auto", + }, + } + with open(param_path, "w", encoding="utf-8") as fp: + json.dump(payload, fp, indent=4) + + changed = auto_fill_type_map_from_poscar(payload, param_path) + self.assertTrue(changed) + self.assertEqual( + payload["interaction"]["type_map"], + {"Al": 0, "Co": 1, "Cr": 2, "Fe": 3, "Mn": 4, "Ni": 5}, + ) + + def test_pack_joint_rejects_all_finished_relax_and_properties(self): + with tempfile.TemporaryDirectory() as work_dir, \ + tempfile.TemporaryDirectory() as upload_dir: + conf_dir = os.path.join(work_dir, "confs", "std-001") + os.makedirs(conf_dir, exist_ok=True) + with open(os.path.join(conf_dir, "POSCAR"), "w", encoding="utf-8") as fp: + fp.write("test\n") + + relax_result = os.path.join(conf_dir, "relaxation", "relax_task") + os.makedirs(relax_result, exist_ok=True) + with open(os.path.join(relax_result, "apex_task_status.json"), "w", encoding="utf-8") as fp: + json.dump({"state": "succeeded", "exit_code": 0}, fp) + + prop_task = os.path.join(conf_dir, "eos_00", "task.000000") + os.makedirs(prop_task, exist_ok=True) + with open(os.path.join(prop_task, "apex_task_status.json"), "w", encoding="utf-8") as fp: + json.dump({"state": "succeeded", "exit_code": 0}, fp) + + relax_param = { + "structures": ["confs/std-*"], + "interaction": { + "type": "lammps", + "rerun_finished": False, + }, + } + prop_param = { + "structures": ["confs/std-*"], + "interaction": {"type": "lammps"}, + "properties": [ + { + "type": "eos", + "skip": False, + "rerun_finished": False, + } + ], + } + + with self.assertRaisesRegex( + RuntimeError, + "All requested joint relaxation and property tasks are already finished", + ): + pack_upload_dir( + work_dir=work_dir, + upload_dir=upload_dir, + relax_param=relax_param, + prop_param=prop_param, + flow_type="joint", + exclude_upload_files=[], + ) + + def test_pack_upload_dir_reports_unmatched_structure_patterns(self): + with tempfile.TemporaryDirectory() as work_dir, \ + tempfile.TemporaryDirectory() as upload_dir: + relax_param = { + "structures": ["confs/missing-*"], + "interaction": {"type": "lammps"}, + } + + with self.assertRaisesRegex(RuntimeError, "No structures matched"): + pack_upload_dir( + work_dir=work_dir, + upload_dir=upload_dir, + relax_param=relax_param, + prop_param=None, + flow_type="relax", + exclude_upload_files=[], + ) + + def test_pack_joint_stages_poscar_when_relaxation_req_calc_false(self): + with tempfile.TemporaryDirectory() as work_dir, \ + tempfile.TemporaryDirectory() as upload_dir: + conf_dir = os.path.join(work_dir, "confs", "std-001") + os.makedirs(conf_dir, exist_ok=True) + with open(os.path.join(conf_dir, "POSCAR"), "w", encoding="utf-8") as fp: + fp.write("raw-poscar\n") + + relax_param = { + "structures": ["confs/std-*"], + "interaction": {"type": "lammps"}, + "relaxation": {"req_calc": False}, + } + prop_param = { + "structures": ["confs/std-*"], + "interaction": {"type": "lammps"}, + "properties": [{"type": "eos", "req_calc": True}], + } + + pack_upload_dir( + work_dir=work_dir, + upload_dir=upload_dir, + relax_param=relax_param, + prop_param=prop_param, + flow_type="joint", + exclude_upload_files=[], + ) + + staged_contcar = os.path.join( + upload_dir, + "confs", + "std-001", + "relaxation", + "relax_task", + "CONTCAR", + ) + self.assertTrue(os.path.isfile(staged_contcar)) + with open(staged_contcar, "r", encoding="utf-8") as fp: + self.assertEqual(fp.read(), "raw-poscar\n") + self.assertEqual(prop_param["pre_relaxed_structures"], ["confs/std-001"]) + + def test_pack_joint_requires_poscar_when_relaxation_req_calc_false(self): + with tempfile.TemporaryDirectory() as work_dir, \ + tempfile.TemporaryDirectory() as upload_dir: + os.makedirs(os.path.join(work_dir, "confs", "std-001"), exist_ok=True) + relax_param = { + "structures": ["confs/std-*"], + "interaction": {"type": "lammps"}, + "relaxation": {"req_calc": False}, + } + prop_param = { + "structures": ["confs/std-*"], + "interaction": {"type": "lammps"}, + "properties": [{"type": "eos", "req_calc": True}], + } + + with self.assertRaisesRegex(RuntimeError, "requires POSCAR"): + pack_upload_dir( + work_dir=work_dir, + upload_dir=upload_dir, + relax_param=relax_param, + prop_param=prop_param, + flow_type="joint", + exclude_upload_files=[], + ) diff --git a/tests/test_vasp.py b/tests/test_vasp.py index 4f67ba8c..365555fa 100644 --- a/tests/test_vasp.py +++ b/tests/test_vasp.py @@ -132,6 +132,36 @@ def test_make_input_file_5(self): self.assertEqual(incar["ISIF"], 6) self.assertEqual(incar["KSPACING"], 0.01) + def test_make_input_file_gruneisen_linear_uses_dfpt_incar(self): + param = { + "type": "gruneisen", + "cal_type": "static", + "approach": "linear", + "cal_setting": { + "relax_pos": True, + "relax_shape": False, + "relax_vol": False, + "encut": 400, + "ediff": 1e-6, + "kspacing": 0.25, + "kgamma": False, + }, + } + shutil.copy( + os.path.join(self.conf_path, "POSCAR"), + os.path.join(self.equi_path, "POSCAR"), + ) + + self.VASP.make_input_file(self.equi_path, "gruneisen", param) + + incar = incar_upper(Incar.from_file(os.path.join(self.equi_path, "INCAR"))) + self.assertEqual(incar["IBRION"], 8) + self.assertEqual(incar["NSW"], 1) + self.assertEqual(incar["ISIF"], 2) + self.assertEqual(incar["ENCUT"], 400) + self.assertEqual(incar["KSPACING"], 0.25) + self.assertFalse(incar["KGAMMA"]) + def test_compute(self): ret = self.VASP.compute(os.path.join(self.conf_path, "relaxation")) self.assertIsNone(ret) @@ -160,3 +190,7 @@ def compare_dict(dict1, dict2): def test_backward_files(self): backward_files = ["OUTCAR", "outlog", "CONTCAR", "OSZICAR", "XDATCAR"] self.assertEqual(self.VASP.backward_files(), backward_files) + self.assertEqual( + self.VASP.backward_files("gruneisen"), + ["OUTCAR", "outlog", "CONTCAR", "OSZICAR", "XDATCAR", "vasprun.xml"], + )